鹿児島Linux勉強会-第03回-に参加

7/25(金)に鹿児島らぐの鹿児島Linux勉強会に行ってきました.

今回は鹿児島中央駅前のよかプラザでの開催でした.
IMG_20140725_173144
#カタカナでリナックスというのを見るとこないだのLinuxConのスタッフTシャツを思い出します :)

今回はATND での集まりが悪くもしかしたら2人での開催になりそうと思っていたのですが,始まってみると6人でした.
今回は前半はLinux読書会でLinux標準教科書の輪読,後半は発表で私は以下のよな発表を行いました.

その他Vimネタ,Seti@homeネタが披露されました.

自分の発表は最後にしてもらって(スライド完成してなかったorz)
終了時間見ながら発表したのですが,共同購入をしていたRaspberryPi B+ の受渡し時間を考慮してなくて終了後適当なベンチで受け渡しとなってしまいましたorz

IMG_20140723_233409

終了後は有志(4人)で魚とか食べて

IMG_20140725_211837IMG_20140725_213943IMG_20140725_215719IMG_20140725_215823IMG_20140726_002543

その後漫画喫茶に泊まりました.公共交通機関欲しいです
#この日は公共交通機関があっても乗れなかった気はしますが><

IMG_20140726_0314405vD2ZXwC---1

2007年と現在のOSMの比較が出来るSITE

Twitter の #osmjp ハッシュタグで以下の書き込みを見かけました.

2007年のOSMデータといまのデータ。ヨコに並べるとまさに隔世の感、あります。 http://t.co/7OWoJSh1eI #osmjp

— nyampire (@nyampire)

July 26, 2014

九州の辺りをみると真っ白><
Screenshot from 2014-07-30 06:49:31
“OSM Then And Now” http://mvexel.github.io/thenandnow/#8/32.697/130.897

OSM を知ったのは2006年頃だったのですが,当時はこんな感じでデータのインポートもトレースも出来ず基本GPSロガーを使ってマッピングするしか無い頃でした.
これは無理だ><って感じでなかなか手を出してなかったんですが数年でかなり埋まってすごいなと思ったもんでした.もちろん今の時点でもまだまだ建物の情報やPOIも少ないのですが建物は衛星写真や基板地図情報のトレースも出来ますし,スマホが普及してPOIの入力もお手軽に出来るようになって編集方法もすごくお手軽になってます.

そのうち自分のやっている入力方法もまとめてみたいところです.

RaspberryPi の新モデル「RaspberryPi B+」到着

注文

Adarfuit

Raspberry Pi Model B+ 512MB RAM ID: 1914 – $39.95 : Adafruit Industries, Unique & fun DIY electronics and kits
発売日の7/14 に一番安い FIRST-CLASS PACKAGE INTERNATIONAL SERVICE ($12.05) で注文.7/22到着.
台数制限があって1度に注文できるのは1台までだった.

$39.95 + $12.05 = $52.00

RSオンライン(日本)

発売日にRS品版でカートに入れると出てきたが注文できなかった.7/16から正式に注文できるようになった.しかし,イギリスから発送で4営業日掛かるとのこと.日本在庫だと次の日に届くのだけど….
RS-jp だと現在販売しておりませんとなるな

8000円以上注文で送料無料.3台以上で送料無料になる.今回は共同購入として6台注文.
7/16注文.7/22に伝票番号(佐川)がメールで届き,7/23に到着.
恐らく3連休がなければその分早く届いた.

\3,940 + 税 = \4,255.20

外観

外箱,取扱説明書,コネクタの色などが少しずつ違う.

Element14

IMG_20140722_185800IMG_20140722_185837IMG_20140722_185858IMG_20140722_193037IMG_20140722_193055IMG_20140722_194758IMG_20140723_003627IMG_20140723_003640IMG_20140723_003715

RS

IMG_20140723_233300IMG_20140723_233409IMG_20140723_233427IMG_20140723_233434IMG_20140723_233443IMG_20140723_233508IMG_20140723_233517IMG_20140723_233535IMG_20140723_233548

トラブル?

RaspberryPi B でアダプタ経由で動作するmicroSDで起動しなかった
3枚試して2枚NG

  • NG
    ノーブランド 1GB(XMBC)
    Panasonic 1GB(opencocon v8a)
  • OK
    ADATA 16GB(NOOBS Rasbian)

ちなみにNG のCard を再度RaspberryPi B に挿してみると起動した.
Panasonic の1GB の opencocon はdd しなおしてみたけどダメだった.
症状は電源投入時に PWR / ACT 共に点灯 -> ACT消灯.HDMI の画面は反応なし.

相性が厳しくなってる?

#初め試した2枚が連続でダメだったので初期不良かと焦った><

基板ネジ径の変更

IMG_20140724_012554IMG_20140724_012402

B ではM3 のネジが使えていたが,B+ には使えなかった.
確認してみると2.9mm -> 2.75mm に変更になっていた.穴を広げるかM2.5を利用.

raspi-config 20131216-1 簡易説明

raspi-config 20131216-1 簡易説明

前書いたのが古くなっているのでざっと書いてみました.
B+ も出たしそろそろ新しいバージョンが出そうな気がするけど….

┌──────────────────────────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────────────────────────┐
│ Setup Options                                                                                                         │
│                                                                                                                       │
│    1 Expand Filesystem              Ensures that all of the SD card storage is available to the OS                    │
│    2 Change User Password           Change password for the default user (pi)                                         │
│    3 Enable Boot to Desktop/Scratch Choose whether to boot into a desktop environment, Scratch, or the command-line   │
│    4 Internationalisation Options   Set up language and regional settings to match your location                      │
│    5 Enable Camera                  Enable this Pi to work with the Raspberry Pi Camera                               │
│    6 Add to Rastrack                Add this Pi to the online Raspberry Pi Map (Rastrack)                             │
│    7 Overclock                      Configure overclocking for your Pi                                                │
│    8 Advanced Options               Configure advanced settings                                                       │
│    9 About raspi-config             Information about this configuration tool                                         │
│                                                                                                                       │
│                                                                                                                       │
│                                  <Select>                                  <Finish>                                   │
│                                                                                                                       │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

1 Expand Filesystem

2GB より大きな容量の SD Card を利用した場合 2GB しか利用できないので前領域が利用できるように領域確保します.
NOOBS を使って Rasbian を導入した場合は NOOBS が自動的に面倒を見てくれるので利用する必要はありません.

2 Change User Password

パスワードの変更が出来ます.

3 Enable Boot to Desktop/Scratch Choose whether to boot into a desktop environment, Scratch, or the command-line

起動時にデスクトップ,Scratch,コマンドラインのどれかで起動できるように設定します.規定値はコマンドラインです.

Console Text console, requiring login (default)

テキストコンソールを起動するよう設定します(規定値)

Desktop Log in as user ‘pi’ at the graphical desktop

pi ユーザでデスクトップ環境を自動起動するよう設定します.

Scratch Start the Scratch programming environment upon boot

スクラッチを起動するよう設定します.

4 Internationalisation Options

国際化関連の設定メニューです.

I1 Change Locale

ロケールの設定を行います.日本語は ja_JP.UTF-8 です.
コンソールをメインに使う場合は標準では日本語が表示できないので en_US.UTF-8 にしたほうがいいかもしれません.コンソールで日本語を表示するには後述の fbterm の使い方を参照してください.

コマンドラインで以下のコマンドでも設定可能です.(Debianでの設定方法)
$ sudo dpkg-reconfigure locales

I2 Change Timezone

タイムゾーンの変更が出来ます.
日本時間にする場合は, Asia->Tokyo を選択します.

コマンドラインで以下のコマンドでも設定可能です.(Debianでの設定方法)
$ sudo dpkg-reconfigure tzdata

I3 Change Keyboard Layout

キーボードのキーマップを変更出来ます.
コマンドラインで以下のコマンドでも設定可能です.(Debianでの設定方法)
$ sudo dpkg-reconfigure keyboard-configuration

日本語のキーマップがメニューに出てこない場合は,/etc/default/keyboard を以下のように変更します.

XKBMODEL="jp106"
XKBLAYOUT="jp"

その後以下のコマンドで反映します.
$ sudo /etc/init.d/keyboard-setup restart

5 Enable Camera

RaspberryPi 標準のカメラモジュールを利用できるようにします.USB 経由のカメラなどは Disable のままでOK です.

6 Add to Rastrack

Rastrack (http://rastrack.co.uk) への登録が出来ます.

7 Overclock

オーバークロックが行えます.オーバークロックを行うと RaspberryPi の寿命が縮む可能性があるのに注意してください.また,不安定になる可能性があります.不安定になったら控えめなオーバークロックを試してみてください.
http://elinux.org/RPi_Overclocking に更に解説があります.

8 Advanced Options

A1 Overscan

画面に黒い帯が表示されている場合に改善されます./boot/config.txt で微調整も可能です.(恐らくコンポジット出力のための設定)

A2 Hostname

ホスト名を変更できます.ホスト名は大文字込時を区別しないASCII文字の aからz,数字の 0から9 及びハイフンg利用できます.但しハイフンは先頭と最後には利用できません.

A3 Memory Split

GPU に割り当てるメモリを設定します.16/32/64/128/256MB が指定でき,規定値は128MB です.割り当てたメモリはメインメモリから割り当てられるのでその分メインメモリの割当量が減ります.

A4 SSH

ssh server の有効,無効の設定が出来ます.規定値では有効です.

A5 SPI

SPI の自動読み込みの有効,無効の設定が出来ます.

A6 Audio

オーディオ出力は自動的に切り替わりますが,強制設定が出来ます.

A7 Update

OS のアップデートを行います.
apt-get や aptitude コマンドを実行してもいいです.

9 About raspi-config

このコマンドの説明が表示されます.

OpenStreetMap を使ったマイマップのような uMap を試してみる

を見てuMap を試してみました.

以下のページにアクセスしてマップを作成とするだけです.

試しに書いてみました.
日本語化もされているし簡単に地図も書けるので人にも勧めやすくていいなと思いました.


フルスクリーン表示

埋め込み時に埋め込みコードをそのまま貼り付けるとイギリスとかの辺りが表示されてしまうのですが,地図編集時のURL http://umap.openstreetmap.fr/ja/map/linux02_11213#17/31.57706/-229.44820 の#以降の #17/31.57706/-229.44820 を埋め込むと任意の座標を表示できました.


周りのデータが少なくて寂しかったのでざっと道路沿いの建物をトレースしてみました.
しかしまだまだ寂しいですね><



gist にコマンドラインから貼り付ける

先日コマンドラインからgist に貼り付けられるんだと驚かれたのでちょっと書いておきます.

その時使ったsctipt はこちら.

Debian jessie 以降,Ubuntu 14.04 以降だとパッケージもあります.このパッケージで導入した場合コマンド名は gist ではなく gist-paste になります.

自分で入れる場合は,gem やHomebrew が使えます.

  • apt $ sudo apt-get install gist
  • gem $ sudo gem install gist
  • Homebrew $ brew install gist

※Homebrew が動く環境を持っていないのでこちらは未検証です.

導入後利用する前に,認証を済ませておきます.2要素認証にも対応しています.

$ gist --login
Obtaining OAuth2 access_token from github.
GitHub username: matoken
GitHub password: 
2-factor auth code: 984736

Success! https://github.com/settings/applications

認証が終わったら試してみます.
一番単純な動かし方は貼り付けたいファイルを指定するだけです.これで公開状態で貼り付けられます.

$ gist lingrbot_web.cgi
https://gist.github.com/ed68bd7182ffddee4801

ファイルタイプを指定する場合は面倒ですがファイル名も指定しないと反映されないようです.

$ gist -f ml2lingr.pl -t perl /tmp/ml2lingr.pl
https://gist.github.com/3021d8d064d8a1d29ba9

標準入力も

$ gist
(type a gist. to cancel, when done)
hoge
fuga
https://gist.github.com/3e993a396a7671403f9e

$ echo “hoge” | sha512sum |gist
https://gist.github.com/970e190f97ae67c8e90d

更新も可能です.

$ gist -u 3021d8d064d8a1d29ba9 -f ml2lingr.pl -t perl /tmp/ml2lingr.pl
https://gist.github.com/3021d8d064d8a1d29ba9

しかし,更新などはURL やID を指定しないといけないのでgitでclone しておいて編集後push したほうがお手軽そうです.

その他のpastbin系サービスを使いたい場合いろんなコマンドがあります.最近は pastebinit を使っています.
このコマンドの対応サービスはこんなかんじです.

$ pastebinit -l
Supported pastebins:
- cxg.de
- fpaste.org
- p.defau.lt
- paste.debian.net
- paste.drizzle.org
- paste.kde.org
- paste.openstack.org
- paste.pocoo.org
- paste.pound-python.org
- paste.ubuntu.com
- paste.ubuntu.org.cn
- paste2.org
- pastebin.com
- pastie.org
- pb.daviey.com
- slexy.org
- sprunge.us
- yourpaste.net

ちなみにこのへんのコマンドを使うまではクリップボード操作アプリを使ってました.
$ cat file | xclip とかするとクリップボードにファイルの内容がコピーされるのでこれをブラウザ上のテキストエリアに貼り付けたりしていました.

Lingr の bot を作ってみた

鹿児島らぐLingr room を作ってみたので,そこにML のSubject を流すbot を設置してみました.

こちらにページに作り方が載っています.bot用のAPI があるので楽々です.

bot 登録

以下のページでbot を登録します.

  • “Lingr” http://lingr.com/bot/create

    • Bot id : 任意
    • Callback URL : このURL にroom の内容が飛んできます.その内容から反応したりすることが出来ます.とりあえず最低限HTTP で200 を返すものを用意して指定.

メッセージ受信用のcgi を作成

ひとまず受け答えはしないつもりなのでHTTP 200 を返すだけのScript を用意.

投稿テスト

get だけで投稿できるので試しに投稿してみます,

以下のページで情報が入手できます.

“Lingr” http://lingr.com/developer

bot_verifier は載っていませんが,bot ID とSecret から求められます.
KagolugML_botxxxxxxxxxxxxxxxxxxxxxxxxxxx を結合した文字列をsha1 にかけます.

$ echo -n 'KagolugML_botxxxxxxxxxxxxxxxxxxxxxxxxxxx'|sha1sum 
b3c03556dca8dfffb8c509cb709817044c98ad87  -

この場合 b3c03556dca8dfffb8c509cb709817044c98ad87bot_verifier です.

  • 投稿先のroom : kagolug
  • bot ID : KagolugML_bot
  • bot_verifier : b3c03556dca8dfffb8c509cb709817044c98ad87

以下のようにアクセスしてみるとroom にメッセージが投稿されました,

w3m -dump ‘http://lingr.com/api/room/say?room=kagolug&bot=KagolugML_bot&text=はろーわーるど&bot_verifier=b3c03556dca8dfffb8c509cb709817044c98ad87

メールからLinger に投稿

鹿児島らぐのML だけを登録したメールアドレスを用意.そのアドレスの .forward に以下のSctipt を呼ぶように "|exec /home/mk/bin/ml2lingr.pl" のような感じで設定しておきます,後はメールが届くとこのScriptが呼ばれてRoom に投稿されます.


※bot_verifier はダミーです.

てことでirc のbot とか書くよりずっとお手軽に書けました.
今回は単に投稿するだけですが,cgi でroom のメッセージを解析して反応するとかするとbot らしくなりますね.

gnupgの鍵に新しいメールアドレスを登録

たまにしかやらないのでメモ.

鍵ID 572E53 matoken@kagolug.org を登録します.

$ gpg --edit-key 572E53
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.
com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>

gpg> adduid
Real name: KenichiroMATOHARA
Email address: matoken@kagolug.org
Comment:
You selected this USER-ID:
    "KenichiroMATOHARA <matoken@kagolug.org>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

You need a passphrase to unlock the secret key for
user: "K.I.Matohara <matoken@gmail.com>"   
4096-bit RSA key, ID 572E532C, created 2010-03-17

gpg: gpg-agent is not available in this session
gpg: Invalid passphrase; please try again ...

You need a passphrase to unlock the secret key for
user: "K.I.Matohara <matoken@gmail.com>"   
4096-bit RSA key, ID 572E532C, created 2010-03-17


pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ unknown] (4)  KenichiroMATOHARA <matoken@kagolug.org>

gpg> 4
pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
                     trust: ultimate      validity: ultimate  
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ unknown] (4)* KenichiroMATOHARA <matoken@kagolug.org>

gpg> sign
"KenichiroMATOHARA <matoken@kagolug.org>" was already signed by key 572E532C
Nothing to sign with key 572E532C

gpg> list

pub  4096R/572E532C  created: 2010-03-17  expires: never       usage: SC
                     trust: ultimate      validity: ultimate  
This key was revoked on 2014-02-11 by RSA key 572E532C K.I.Matohara <matoken@gmail.com>
sub  2048R/E0FE9E3E  created: 2011-02-23  revoked: 2014-02-11  usage: S
[ultimate] (1). K.I.Matohara <matoken@gmail.com>
[ultimate] (2)  [jpeg image of size 2077]  
[ultimate] (3)  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
[ unknown] (4)* KenichiroMATOHARA <matoken@kagolug.org>

gpg> save

確認

$ gpg --list-keys kagolug
gpg: checking the trustdb     
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:  12  signed:  55  trust: 0-, 0q, 0n, 0m, 0f, 12u
gpg: depth: 1  valid:  55  signed:  52  trust: 55-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2014-07-20
pub   4096R/572E532C 2010-03-17
uid                  K.I.Matohara <matoken@gmail.com>
uid                  [jpeg image of size 2077]
uid                  Kenichiro MATOHARA <matohara@gdnewhat-jp.org>
uid                  KenichiroMATOHARA <matoken@kagolug.org>

間違ってたら教えてください><

自分の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 筐体の中に仕込まれると一見しただけではわかりません.
仕込んだロガーを回収してログを回収する必要があるのですが,無線方式のものだと現地に行かなくても無線経由で回収できるので犯人の追跡も難しいです.

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

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

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

nkf でbase64 エンコード,デコードしたら結果が違う?

小さなバイナリを受け渡ししたいけれどファイル共有サービスとか使うのも面倒だしbase64 にしてgist に貼ってしまおうと思ったのですが,nkf コマンドでbase64 にエンコードして,確認のためデコードしてみたら違う結果に.

% cat original | nkf -MB > hoge
% cat hoge | nkf -mB > fuga
% diff original fuga           
バイナリーファイル original とfuga は異なります
% ls -l
-rw-r--r--  1 mk   mk       4080  5月 29 20:38 original
-rw-r--r--  1 mk   mk       5422  5月 29 20:52 hoge
-rw-r--r--  1 mk   mk       3999  5月 29 20:52 fuga

Google+ にこのことを書いたら
https://plus.google.com/u/0/103792214056489833385/posts/bbVzNS7RNTR

Masakazu Takahashiさんにコメントをいただきました.

試したところ、デコードのときに入力文字コードを明示的に指定する必要があるようです。

% nkf -mBW hoge > fuga

そんなこんなで、base64のエンコード/デコードだけなら、base64コマンドのほうが確実かも。

ということで,base64 コマンドならGNU Coreutils に含まれているので大抵の環境で使えるしってことでbase64 コマンドで貼り付けました.

% cat jl-bct.bct | xz | base64 | gist-paste

ついでに復元はこんな感じで

% wget -O – https://gist.github.com/matoken/b2041569865a82895082/raw/53b85e9333e3b837d24714a8e529dde69ec788e9/jl-bct.bct.xz.base64 | base64 -d | xzcat > jl-bct.bct