Thinkpad x201s にBluetooth module 増設

最近のメインマシンはThinkpad x201s です.これは2台めで中古で買って元のものとニコイチで使っています.良い部品はだいたい移行していたのですが,Bluetooth module は液晶パネルしたとめんどくさいので後回しになっていたのでした.でもXperia Pro でBluetooth テザリングが可能になったので重い腰を上げることに.実際やってみるとあっという間でした.

Thinkpad は保守マニュアルが日本語で公開されているのでとても便利です :)

昔から公開していて,Webでpdfが公開される前はコピーサービスで入手していました.これのおかげで試行錯誤する必要がなくとても助かっています.これもThinkpadを使っている理由の一つです :)

マニュアルを見ると以下の辺りを参考にLCD全面ベゼルを取り外せば良いようですが,ネジキャップを剥がすのとかが面倒です.試しに赤く印をつけた3本だけを外して試すと旧マシンからモジュールの取り出しが出来ました.同様に新マシンも3本だけネジを外して取り付けも出来ました.
Screenshot from 2015-03-28 10:13:07
IMG_20150328_091845IMG_20150328_093620

組み付けた後起動するとさくっと認識.Bluetooth PAN 接続も問題なく行えました.
Screenshot from 2015-03-28 10:11:29

たまにUSBドングルで利用していましたが内臓はスッキリしてていいですね.

Thinkpad関連でよく利用するお店

  • ThinkFactory IBM Lenovo秋葉原 持込修理 販売 保守パーツ 旧PS/PLAZA WAKAMATSU Thinkpadコーナー
  • 中古 ThinkPad 販売専門店 Be-Stock! 鹿児島県鹿屋市に実店舗がある中古店.通販が主で店舗には余り物は並んでない.言えば出てくる.
  • eBay パーツをよく買う
  • Xperia Pro(MK16a)をBootloader Unlock してみた

    Xperia Pro(MK16a)を持っているのですが,OSが古いし標準アプリも多くてストレージもいっぱいで使いたいアプリもなかなか入れることが出来ません.
    最近はこの端末にMVNOのSIMを刺してモバイルルータ and GPSロガー的に使っていますがbluetooth tethering も使えずWi-Fi tethering だとバッテリの減りも早いです.ということでカスタムROMやCyanogenMod11か12あたりに入れ替えたいのですがブートローダーにロックがかかっているのでまずはこれを解除しないといけません.Test Point を使ったりするのは面倒だなと思っていたのですが,現在は公式でアンロックコードを手に入れることができるのでこちらで行うことに.
    ※保証がきかなくなります.SEUSなどが利用できなくなります.公式アップデートも利用できなくなるそうです.(まあこれからOTAとか来ることはないと思いますが)

    本体の他に以下のものが必要です.ここでは開発環境の説明はしません.

    • Android 開発環境の動作するPC(今回はDebian Jessie)
    • Android 開発環境の中のfastboot コマンド(sdk/platform-tools 以下)
    • USB A-microB ケーブル

    アンロックコードの入手

    アンロックコードは以下のページから入手できます.

    機種を選択して,メールアドレスを入力すると確認メールが届くので,そのメールのURL をクリックするとIMEIの入力画面になって,そこでIMEI を入力することでCodeが入手できます.

    アンロック

    Xperia Pro の電源を切ります.
    USBケーブルはPCのみに接続する
    電源Off 状態からメニューボタンを押しながらUSBケーブルを接続する
    右上側面のHDMIコネクタ横のLEDが青くなるとFastbootモードになっている

    Fastboot モードの時のdmesgはこんな感じでした.

    [78677.917985] usb 1-1.1: new high-speed USB device number 30 using ehci-pci
    [78678.013776] usb 1-1.1: unable to get BOS descriptor
    [78678.025756] usb 1-1.1: New USB device found, idVendor=0fce, idProduct=0dde
    [78678.025764] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [78678.025769] usb 1-1.1: Product: S1Boot Fastboot
    [78678.025774] usb 1-1.1: Manufacturer: Sony Ericsson Mobile Communications AB
    [78678.025778] usb 1-1.1: SerialNumber: CB5A1G45XXXXXX
    

    fastboot devices コマンドで接続を確認します.

    % ./fastboot devices
    CB5A1G45XXXXXX  fastboot
    % ./fastboot -i 0x0fce getvar version
    version: 0.3
    finished. total time: 0.001s
    

    もしここでno permissions fastboot というエラーが出る場合はadb serverを起動しなおしてみるとうまく行くようです.それでもうまく行かない場合root権限で起動し直す(sudo command)とうまく行ったことも.

    % ./fastboot devices
    no permissions  fastboot
    % ./adb kill-server
    % ./adb start-server
    * daemon not running. starting it now on port 5037 *
    * daemon started successfully *
    % ./fastboot devices
    CB5A1G45XXXXXX  fastboot
    

    問題ないようなら以下のコマンドでアンロックコードを指定してアンロックします.

    % ./fastboot -i 0x0fce oem unlock 0xC3BA1080A6XXXXXX
    ...
    (bootloader) Unlock phone requested
    (bootloader) Erasing block 0x00001300
    (bootloader) Erasing block 0x00001400
    (bootloader) Erasing block 0x00001500
    (bootloader) Erasing block 0x00001600
    (bootloader) Erasing block 0x00001700
    (bootloader) Erasing block 0x00001800
    (bootloader) Erasing block 0x00001900
    (bootloader) Erasing block 0x00001a00
    (bootloader) Erasing block 0x00001b00
    (bootloader) Erasing block 0x00001c00
    (bootloader) Erasing block 0x00001d00
    (bootloader) Erasing block 0x00001e00
    (bootloader) Erasing block 0x00001f00
    OKAY [  4.587s]
    finished. total time: 4.587s
    

    これでアンロック完了です.
    次はOSを入れ替えてみます.

    端末で動くTwitterClient Rainbowstream

    確かOSSJで見かけて知ったのだと思うのですが,

    端末上で動作するTwitterのRainbowstreamというソフトウェアを知りました.

    ユーザーストリーム対応で端末上にユーザストリームや検索結果リストなどが表示できます.画像をアスキーアートで表示する機能もあります.

    導入

    pipで入る

    $ sudo apt-get install python-pip python-dev
    $ sudo pip install rainbowstream PySocks Pillow
    

    初回起動時に認証のためブラウザが起動する.認証ご表示されたpinを端末に貼り付ける.認証情報は ~/.rainbow_oauth に保存されるので要らなくなったら消す.
    無くても動くけど無いと設定変更が出来ないので設定ファイルの用意をする.

    % wget https://raw.githubusercontent.com/DTVD/rainbowstream/master/rainbowstream/colorset/config -O /tmp/config
    % mv /tmp/config ~/.rainbow_config.json
    

    GNU Screen のウィンドウ分割モードだと崩れてしまうので,小さめのウィンドウに表示するといい感じです.以下の画像はawesome で端末を2つ表示してRainbowstreamを実行した端末を小さくしているところです.
    20150202_07:02:05-608

    画像のアスキーアート表示は楽しいのですが,一気にログが流れてしまうのでoffにしちゃいました.
    自作のPerl Script で昔作ったものがあるのですが,Rainbowstreamのほうがカラフルで見た目がいい感じです.

    NEXUS5 を落っことしてしまいISAI LGL22 を買った(Linux環境でのroot取得とカメラ無音化)

    Nexus5 をどこかに落っことしてしまい(体調が悪い時で記憶があやふや.桜島港から家の間のどこかに多分落ちている)不便なので代替機を探して中古のISAI LGL22 を入手した.兄弟機で面白みはあまりないが,LTE でmineo が使えるのとUnLock が安価&安易でDocomo の電波も掴みそこそこ安いということで….

    とりあえず初期化してroot 取ってカメラ無音化までした.root 取得の手順は確立されているけれどWindows向けでバッチファイルを叩くものしか見当たらなかったのでLinux 向けにメモ.(WinでもMacでも同じだけど)

    • 初期化
    • OS Update
      TAO で 4.4.2 に.
    • 画面のロックをパスワードに
    • 所有者情報設定
    • mineo 設定
    • 暗号化
      ※充電が80%以上になってから出ないと実行できない.
    • root取得
      isai_rootkit_kk_only.rar を以下から入手して利用した.https://mega.co.nz/#!h5EAmY7K!rrM2jZlCnRGc-EzhPhrxQ8gfPtGAcuv_mPPH8lYo7_M

      sha1sum    0a048c7be86ca64dc755a31a3c3a8d32455a3361
      sha256sum    67b3481f15e5f597e60397b9294074354877cd283ecede5bd8ba171e14392cd2
      

      前準備としてUSBデバッグを有効にしてPCと接続しUSBデバッグを有効にしておく.
      isai_rootkit_kk_only.rar を展開して install.bat を見ながら以下のような感じでコマンドを叩く.
      ※要開発環境.

      cd isai_rootkit_kk_only
      adb wait-for-device
      adb push "files" /data/local/tmp
      adb shell chmod 755 /data/local/tmp/getroot
      adb shell chmod 755 /data/local/tmp/busybox_file
      adb shell chmod 755 /data/local/tmp/install.sh
      adb shell chmod 755 /data/local/tmp/remove_apps_and_bins.sh
      adb pull /system/app/LGDMSClient.odex ./backup/system/app/LGDMSClient.odex
      adb pull /system/app/LGDMSClient.apk ./backup/system/app/LGDMSClient.apk
      adb pull /system/bin/subsystem_ramdump ./backup/system/bin/subsystem_ramdump
      adb pull /system/bin/dumpstate ./backup/system/bin/dumpstate
      adb pull /system/bin/fssamond ./backup/system/bin/fssamond
      adb shell "/data/local/tmp/getroot /data/local/tmp/remove_apps_and_bins.sh"
      adb wait-for-device
      adb shell "/data/local/tmp/getroot /data/local/tmp/install.sh"
      adb wait-for-device
      adb shell "rm /data/local/tmp/getroot"
      adb shell "rm /data/local/tmp/busybox_file"
      adb shell "rm /data/local/tmp/eu.chainfire.supersu-193.apk"
      adb shell "rm /data/local/tmp/remove_apps_and_bins.sh"
      adb shell "rm /data/local/tmp/install.sh"
      adb shell "rm -rf /data/local/tmp/system"
      
    • カメラ無音化
      /system/media/audio/ui/camera_click.ogg と /system/media/audio/ui/VideoRecord.ogg を退避する.

      adb shell
      su
      mount -o remount,rw /system
      cd /system/media/audio/ui/
      mv camera_click.ogg camera_click.ogg-
      mv VideoRecord.ogg VideoRecord.ogg-
      cd
      sync
      mount -o remount,ro /system
      exit
      exit
      

      #起動音と起動後のパスフレーズ入力時のキークリック音も消したいが見当たらず.

    • アプリ入れたり

    ibus-mozc から fcitx-mozc に変更したら JOSM で日本語入力できなくなって困る

    JOSM はマルチプラットホームでLinux/Windows/Mac で動作しますが,以下の話はLinux固有の問題です.

    日本語入力のためのインプットメソッドフレームワークを iBus から fcitx に切り替えたのですが,JOSM で日本語入力ができなくなってしまっていました.Ctrl+Space でトルグするようにしているのですが,他のアプリケーションでは問題ないのにJOSM の場合は無反応で日本語入力ができなくなってしまいました,
    そこで一時的にiBus/fcitx の両方が動作するようにしてJOSM 利用時だけiBus を使うようにしていました.

    この話を #osckansai で(確か)武山さんに話したところ環境変数か何かが足りないのでは?と教えてもらいました.

    少し試したところ XMODIFIERS=”@im=fcitx” を設定するとfcitx でJOSM に日本語入力が出来るようになりました.

    % XMODIFIERS=”@im=fcitx” java -jar ~/bin/josm-tested.jar

    変換候補がウィンドウの下に表示されちゃいますがまあ許容範囲かなと.

    Screenshot from 2014-09-21 13:08:09

    毎回コマンドを打つのもあれなのでこんな感じでショートカットを作成しておきました.
    #何気にこっちのほうが時間掛かったorz
    ##環境変数を指定するには env を付ける.~/, $HOME は使えなかったのでフルパス.

    Kobo で mikutter が起動しなくて困る

    IMG_20140902_071214
    1月ほど前のオープンソースカンファレンス関西1日目にchroot で debian を起動した Kobo やAndroid を入れた Kobo を展示したりしていたのですが,mikutter を起動しておこうと思ったらエラーを吐いて起動しませんでした.
    この時久々に起動したので大量のアップデートを行ったので環境が変わったのでした.デモの前に前もって確認しないとダメですよね….
    エラーはKobo のコンソールを流れてしまい,スクロールバックの方法もよくわからない.ssh 経由で確認したいけれど会場のWi-Fi 経由では無理そうだったのでその時は諦めました.(開発者も居たのに!)

    てことでさっき確認したのでメモ.

    ssh 経由で起動してみるとこんな感じでした.

    $ mikutter --confroot=/tmp/mikutter
    /usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb: line 10
       GLib-GObject-WARNING **:Attempt to add property GtkCellRendererMessage::message-id after class was initialised
    /usr/lib/ruby/vendor_ruby/gettext/text_domain.rb:100:in `=~': incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain.rb:100:in `block in translate_singular_message'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain.rb:99:in `each'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain.rb:99:in `translate_singular_message'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain_manager.rb:104:in `block in translate_singular_message'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain_manager.rb:84:in `block (2 levels) in each_text_domains'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain_manager.rb:83:in `each'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain_manager.rb:83:in `block in each_text_domains'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain_manager.rb:81:in `each'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain_manager.rb:81:in `each_text_domains'
            from /usr/lib/ruby/vendor_ruby/gettext/text_domain_manager.rb:103:in `translate_singular_message'
            from /usr/lib/ruby/vendor_ruby/gettext.rb:118:in `gettext'
            from /usr/share/mikutter/core/plugin/settings/basic_settings.rb:4:in `block in <top (required)>'
            from /usr/share/mikutter/core/plugin.rb:21:in `instance_eval'
            from /usr/share/mikutter/core/plugin.rb:21:in `create'
            from /usr/share/mikutter/core/plugin/settings/basic_settings.rb:3:in `<top (required)>'
            from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
            from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
            from /usr/share/mikutter/core/plugin/settings/settings.rb:4:in `<top (required)>'
            from /usr/share/mikutter/core/miquire_plugin.rb:138:in `load'
            from /usr/share/mikutter/core/miquire_plugin.rb:138:in `load'
            from /usr/share/mikutter/core/miquire_plugin.rb:130:in `block in load'
            from /usr/share/mikutter/core/miquire_plugin.rb:127:in `each'
            from /usr/share/mikutter/core/miquire_plugin.rb:127:in `load'
            from /usr/share/mikutter/core/miquire_plugin.rb:130:in `block in load'
            from /usr/share/mikutter/core/miquire_plugin.rb:127:in `each'
            from /usr/share/mikutter/core/miquire_plugin.rb:127:in `load'
            from /usr/share/mikutter/core/miquire_plugin.rb:97:in `block in load_all'
            from /usr/share/mikutter/core/miquire_plugin.rb:37:in `block in each_spec'
            from /usr/share/mikutter/core/miquire_plugin.rb:32:in `each'
            from /usr/share/mikutter/core/miquire_plugin.rb:32:in `each'
            from /usr/share/mikutter/core/miquire_plugin.rb:35:in `each_spec'
            from /usr/share/mikutter/core/miquire_plugin.rb:95:in `load_all'
            from /usr/share/mikutter/core/boot/load_plugin.rb:7:in `<top (required)>'
            from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
            from /usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
            from /usr/share/mikutter/core/miquire.rb:98:in `miquire_original_require'
            from /usr/share/mikutter/core/miquire.rb:95:in `file_or_directory_require'
            from /usr/share/mikutter/core/miquire.rb:76:in `block in miquire'
            from /usr/share/mikutter/core/miquire.rb:75:in `each'
            from /usr/share/mikutter/core/miquire.rb:75:in `miquire'
            from /usr/share/mikutter/core/miquire.rb:18:in `miquire'
            from /usr/share/mikutter/mikutter.rb:38:in `<main>'
    

    言語環境周りぽいなてことで LANG を確認してみると空

    $ echo $LANG

    LANGja_JP.UTF-8 を設定してあげると動きました.

    $ LANG=ja_JP.UTF-8 mikutter
    /usr/lib/ruby/vendor_ruby/gtk2.rb: line 13
       Gtk-WARNING **:Locale not supported by C library.
            Using the fallback 'C' locale.
    /usr/share/mikutter/core/mui/cairo_cell_renderer_message.rb: line 10
       GLib-GObject-WARNING **:Attempt to add property GtkCellRendererMessage::message-id after class was initialised
    /usr/share/mikutter/core/plugin/display_requirements/display_requirements.rb:5: warning: already initialized constant CACHE_DIR
    /usr/share/mikutter/core/plugin/aspectframe/aspectframe.rb:12: warning: previous definition of CACHE_DIR was here
    /usr/share/mikutter/core/plugin/notify/notify.rb:6: warning: already initialized constant DEFINED_TIME
    /usr/share/mikutter/core/plugin/extract/extract.rb:8: warning: previous definition of DEFINED_TIME was here
    

    とりあえずは起動メニューにこれを設定してあげると良さそうです.

    追記)
    最近は $ LC_ALL=ja_JP.UTF-8 mikutter なのかな?

    chroot 環境で `/dev/null’ が使えなくて困る

    Kobo の chroot 環境で debian を動かしたりしているのでたまにアップデートを行うのですが,実機だと遅いのでPC のchroot 環境で実行したりします
    #アーキテクチャの違いはqemu で吸収. > ユーザーモードエミュレーションqemu を使って Kono on Debian のイメージを Host PC で apt-get とかする | matoken’s meme

    そこで今回 apt-get update 中に以下のようなエラーが発生.

    /bin/sh: 1: cannot create /dev/null: Permission denied

    /dev/null を確認するとぱっと見デバイスは問題なさそうだけど使えない.

    # ls -la /dev/null
    crw-rw-rw- 1 root root 1, 3 Sep 2 02:57 /dev/null
    # echo hoge > /dev/null
    bash: /dev/null: Permission denied

    エラーメッセージで検索するとkinnekoさんのページがヒット.

    あーなるほど!

    chroot 元で確認してみると確かに nodev が.

    % mount |grep rootfs
    /dev/sdc1 on /media/mk/rootfs type ext4 (rw,nosuid,nodev,relatime,data=ordered,uhelper=udisks2)

    dev を付けて remount してみると

    % sudo mount -o remount,dev /dev/sdc1
    % mount |grep rootfs
    /dev/sdc1 on /media/mk/rootfs type ext4 (rw,nosuid,relatime,data=ordered,uhelper=udisks2)

    chroot しなおさなくても使えるようになった.毎回チェックしてるんですかね.

    # echo hoge > /dev/null

    てことで update 出来た :)

    # apt-get install -f

    自分のPCにキーロガーを設定する

    キーロガー.人のPCに仕掛けるのはまずいけど自分の&自分しか使わないPCで試す分には問題ないだろうということで入れてみてます.

    入れているのは以下の logkeys

    導入方法

    DebianやUbuntu だとパッケージがあるので logkeys パッケージを導入するだけ.

    % sudo apt-get install logkeys
    

    初期設定

    /etc/default/logkeys という設定ファイルを設定します.

    ENABLED=1
    LOGFILE=/home/mk/.logkeys/`/bin/date +%Y%m%d-%H%M%S-$$`
    
    # This should be updated according to your hardware
    # Check README.Debian for more info
    DEVICE=/dev/input/event0
    
    • ENABLED : 0 起動しない / 1 起動する
    • LOGFILE : ログファイルの指定
    • DEVICE : キーボードデバイス指定

    自動起動してログファイルの設定,ログするキーボードデバイスの指定をします.
    ログファイルは他の人から読まれないようにパーミッションを設定しておきましょう.ファイル名は試しに

    /home/mk/.logkeys/`/bin/date +%Y%m%d-%H%M%S-$$`
    

    とか書いてみたら行けました.試してみるもんですね.これで起動毎に新しいログファイルが作成されるはずです.
    キーボードデバイスは /proc/bus/input/devices を見たり,実際のデバイスを cat してキー入力してみたりして見つけます.
    詳細は /usr/share/doc/logkeys/README.Debian に書かれています.

    以下の/proc/bus/input/devices では,頭のがkeyboad のようです.

    I: Bus=0011 Vendor=0001 Product=0001 Version=ab54
    N: Name="AT Translated Set 2 keyboard"
    P: Phys=isa0060/serio0/input0
    S: Sysfs=/devices/platform/i8042/serio0/input/input0
    U: Uniq=
    H: Handlers=sysrq kbd event0 
    B: PROP=0
    B: EV=120013
    B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
    B: MSC=10
    B: LED=7
    
    I: Bus=0019 Vendor=0000 Product=0005 Version=0000
    N: Name="Lid Switch"
    P: Phys=PNP0C0D/button/input0
    S: Sysfs=/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input3
    U: Uniq=
    H: Handlers=event2 
    B: PROP=0
    B: EV=21
    B: SW=1
    
    I: Bus=0019 Vendor=0000 Product=0003 Version=0000
    N: Name="Sleep Button"
    P: Phys=PNP0C0E/button/input0
    S: Sysfs=/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input4
    U: Uniq=
    H: Handlers=kbd event3 
    B: PROP=0
    B: EV=3
    B: KEY=4000 0 0
    
    I: Bus=0019 Vendor=0000 Product=0001 Version=0000
    N: Name="Power Button"
    P: Phys=LNXPWRBN/button/input0
    S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input5
    U: Uniq=
    H: Handlers=kbd event4 
    B: PROP=0
    B: EV=3
    B: KEY=10000000000000 0
    
    I: Bus=0010 Vendor=001f Product=0001 Version=0100
    N: Name="PC Speaker"
    P: Phys=isa0061/input0
    S: Sysfs=/devices/platform/pcspkr/input/input6
    U: Uniq=
    H: Handlers=kbd event5 
    B: PROP=0
    B: EV=40001
    B: SND=6
    
    I: Bus=0019 Vendor=17aa Product=5054 Version=4101
    N: Name="ThinkPad Extra Buttons"
    P: Phys=thinkpad_acpi/input0
    S: Sysfs=/devices/platform/thinkpad_acpi/input/input8
    U: Uniq=
    H: Handlers=kbd rfkill event6 
    B: PROP=0
    B: EV=33
    B: KEY=18040000 0 10000000000000 0 1501b00102004 c000000001104000 e000000000000 0
    B: MSC=10
    B: SW=a
    
    I: Bus=0003 Vendor=04f2 Product=b217 Version=0854
    N: Name="Integrated Camera"
    P: Phys=usb-0000:00:1a.0-1.6/button
    S: Sysfs=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/input/input9
    U: Uniq=
    H: Handlers=kbd event7 
    B: PROP=0
    B: EV=3
    B: KEY=100000 0 0 0
    
    I: Bus=0019 Vendor=0000 Product=0006 Version=0000
    N: Name="Video Bus"
    P: Phys=LNXVIDEO/video/input0
    S: Sysfs=/devices/LNXSYSTM:00/device:00/PNP0A08:00/LNXVIDEO:00/input/input10
    U: Uniq=
    H: Handlers=kbd event8 
    B: PROP=0
    B: EV=3
    B: KEY=3e000b00000000 0 0 0
    
    I: Bus=0001 Vendor=14f1 Product=506e Version=0001
    N: Name="HDA Digital PCBeep"
    P: Phys=card0/codec#0/beep0
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/input/input11
    U: Uniq=
    H: Handlers=kbd event9 
    B: PROP=0
    B: EV=40001
    B: SND=6
    
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="HDA Intel PCH HDMI/DP,pcm=8"
    P: Phys=ALSA
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input18
    U: Uniq=
    H: Handlers=event10 
    B: PROP=0
    B: EV=21
    B: SW=140
    
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="HDA Intel PCH HDMI/DP,pcm=7"
    P: Phys=ALSA
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input17
    U: Uniq=
    H: Handlers=event11 
    B: PROP=0
    B: EV=21
    B: SW=140
    
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="HDA Intel PCH HDMI/DP,pcm=3"
    P: Phys=ALSA
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input16
    U: Uniq=
    H: Handlers=event12 
    B: PROP=0
    B: EV=21
    B: SW=140
    
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="HDA Intel PCH Headphone"
    P: Phys=ALSA
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input15
    U: Uniq=
    H: Handlers=event13 
    B: PROP=0
    B: EV=21
    B: SW=4
    
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="HDA Intel PCH Dock Headphone"
    P: Phys=ALSA
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input14
    U: Uniq=
    H: Handlers=event14 
    B: PROP=0
    B: EV=21
    B: SW=4
    
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="HDA Intel PCH Dock Mic"
    P: Phys=ALSA
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input13
    U: Uniq=
    H: Handlers=event15 
    B: PROP=0
    B: EV=21
    B: SW=10
    
    I: Bus=0000 Vendor=0000 Product=0000 Version=0000
    N: Name="HDA Intel PCH Mic"
    P: Phys=ALSA
    S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input12
    U: Uniq=
    H: Handlers=event16 
    B: PROP=0
    B: EV=21
    B: SW=10
    
    I: Bus=0011 Vendor=0002 Product=0007 Version=01b1
    N: Name="SynPS/2 Synaptics TouchPad"
    P: Phys=isa0060/serio1/input0
    S: Sysfs=/devices/platform/i8042/serio1/input/input7
    U: Uniq=
    H: Handlers=mouse0 event17 
    B: PROP=5
    B: EV=b
    B: KEY=e520 10000 0 0 0 0
    B: ABS=660800011000003
    
    I: Bus=0003 Vendor=0000 Product=0000 Version=0004
    N: Name="ACPI Virtual Keyboard Device"
    P: Phys=
    S: Sysfs=/devices/virtual/input/input20
    U: Uniq=
    H: Handlers=sysrq kbd rfkill event18 
    B: PROP=0
    B: EV=3
    B: KEY=ffffffffffffffff ffffffffffffffff ffffffffffffffff fffffffffffffffe
    
    I: Bus=0011 Vendor=0002 Product=000a Version=0000
    N: Name="TPPS/2 IBM TrackPoint"
    P: Phys=synaptics-pt/serio0/input0
    S: Sysfs=/devices/platform/i8042/serio1/serio2/input/input19
    U: Uniq=
    H: Handlers=mouse1 event19 
    B: PROP=0
    B: EV=7
    B: KEY=70000 0 0 0 0
    B: REL=3
    
    I: Bus=0003 Vendor=046d Product=0a29 Version=0111
    N: Name="Logicool Logicool Wireless Headset"
    P: Phys=usb-0000:00:1d.0-1.1/input3
    S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.3/0003:046D:0A29.000A/input/input27
    U: Uniq=000d44b85a7d
    H: Handlers=kbd event1 
    B: PROP=0
    B: EV=1b
    B: KEY=18000 17800000000 8e000000000000 0
    B: ABS=ffffff0000000000
    B: MSC=10
    

    H: Handlers=sysrq kbd event0 から実際のデバイスは /dev/input/event0 なので,これをcat して何かキーボード入力して反応があるか確認します.当たりのようです.

    % sudo cat /dev/input/event0
    �w�S��      �w�S��      �w�S��                  �w�S?�w�S?�w�S?p     a�w�SK
    �w�SK
    �w�SK
    �w�w�S��.�w�S��.�w�S��     a�w�S(�^C
    

    実際に使ってみると当たり前ですが入力したものがログファイルに吐かれています.もちろんパスワードなどもそのまま.
    日本語入力したものなどはローマ字入力なのでローマ字で記録されています.フィルタにかけると読みやすくなりますね.メタ文字も<lctrl>&ltup><down>のような感じで記録されます.
    root で動いているのでユーザを変更しても記録されます.
    デバイスを指定しているので,外付けのキーボードを接続すると記録されません.

    ちなみにプロセスはこんな感じなので色々丸見えですね.

    % ps -ef| grep -i logk
    root      1433     1  0  6月10 ?      00:00:25 /usr/bin/logkeys -s -u -d /dev/input/event0 -o /home/mk/.logkeys/20140610-222504-1004
    

    キーロガーへの対策

    このlogkeys であれば別のキーボードを使えば回避できます.でも全部のデバイスを記録するソフトウェアキーロガーだと回避できません.OS をLiveCD/USB などで別のものを起動してしまえば回避できます.

    ソフトウェアでなく,ハードウェアキーロガーもあります.これはUSB やPS/2 ポートのキーボードの間に取り付けてロギングするものです.OS を変えても回避できません.わかりやすいものはPCの裏を見るだけで何かついてるのですぐわかりますが,キーボードの中やPC 筐体の中に仕込まれると一見しただけではわかりません.
    仕込んだロガーを回収してログを回収する必要があるのですが,無線方式のものだと現地に行かなくても無線経由で回収できるので犯人の追跡も難しいです.

    ちなみにそんなに特殊なものでなく普通にあちこちで売っています.おまけに安価.

    画面を飛ばすものまであります.テンペストを使うよりずっとお手軽で実用的ですね><

    ということで,外の端末ではセンシティブな情報は入力しないくらいしか対策は無さそうです.

    Debian でパッケージ導入時のダイヤログを抑制する

    Debian でmysql-server 等を導入するとパスワード設定ダイヤログが出てくる.
    Screenshot from 2014-05-30 06:20:11
    これを抑制できないか試してみた.

    microHOWTO: Perform an unattended installation of a Debian package

    export DEBIAN_FRONTEND=noninteractive
    apt-get update -q
    apt-get install -q -y -o Dpkg::Options::=”—force-confdef” -o Dpkg::Options::=”—force-confold” apache2 mysql-server

    これを参考に

    % sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server

    でダイヤログ出さずに導入できた.
    でもmysql-server の場合パスワード設定しないと結構まずい.
    即パスワード設定するとか

    % mysqladmin -u root password ‘password’

    daemon止めるとかしないとだと思う.

    % sudo /etc/init.d/mysql stop

    「赤城さんのお風呂タイマー @艦これ」をDebian jessie で試す

    赤城さんのお風呂タイマー @艦これ というソフトを見つけて,Linux でも動作するよと書かれていたので気になっていました.
    これをDebian jessie 環境でビルドしてみました.(が,動作していませんorz)

    ソースコードからビルドすれば、Linux や Mac でも動作することを確認しています。
    

    クリーンな環境でビルドしてないので足りないものもあるかもしれませんが,こんな感じで必要なパッケージを導入します.

    % sudo apt-get install liblua5.1-0-dev libyaml-cpp-dev libboost1.53-dev libopencv-highgui-dev libluabind-dev doxygen xdot libcsnd-dev lua5.2 mercurial build-essential
    

    bitbucket からsource を貰ってきます.

    % hg clone https://bitbucket.org/satofumi/bath_timer
    

    make します.

    % cd bath_timer
    % make
    

    実行ファイルを叩いてみます.

    % bath_timer/bath_timer
    zsh: segmentation fault  bath_timer/bath_timer
    

    orz
    カレントディレクトリで実行したりテーマファイルをコピーしたりしてみましたがうまく行きませんでした><
    テーマはディレクトリ構成とかがよくわからなかったのでWindows のものをCP したりしてみました.

    ということで,とりあえずいつものkoedoyoshidaさんの艦これタイマーに戻ります….

    ちなみに,どうやってブラウザと通信しているんだろうと疑問だったのですが,こちらに解説が.通信しているわけではなくOCR で読み取っているんですね.眼から鱗.