2014年1月19日

BluetoothLowEnergy(BLE)の勉強 - その2 - Linux+BlueZでBLE通信内容確認(1)

前回のエントリで、BlueZのgatttoolを使ってBluetooth Low Energy(BLEデバイス)との通信を試みました。今回はその出力の詳細を確認していきます。

primaryの出力
BLEデバイスに対してgatttoolの"primary"コマンドで以下の出力が得られました。
  [CON][44:13:19:02:F8:A9][LE]> primary
  [CON][44:13:19:02:F8:A9][LE]>
  attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
  attr handle: 0x0008, end grp handle: 0x000a uuid: 00001803-0000-1000-8000-00805f9b34fb
  attr handle: 0x000b, end grp handle: 0x000d uuid: 00001802-0000-1000-8000-00805f9b34fb
  attr handle: 0x000e, end grp handle: 0x0010 uuid: 00001804-0000-1000-8000-00805f9b34fb
  attr handle: 0x0011, end grp handle: 0xffff uuid: 0000180f-0000-1000-8000-00805f9b34fb
まずはこれについて見ていきます。

そもそも、"primary"とは何か?というところからです。これはBLEの肝となっているGATT/ATTに関わる内容になります。GATTは"Generic Attribute Profile"、ATTは"Attribute Protocol"です。(私もまだ勉強中ですが)BLEは基本的にAttributeの読み出し・書き込みを行うことで実現される技術であり、『Attributeにアクセスするための通信プロトコルがATT』『ATT上でどのようなAttributeを構成するかを規定したプロファイルがGATT』という位置付けになります。
Attributeには複数の種別があり、各AttributeにはUUIDが割り当てられています。上記出力では、BLEデバイス(ぶるタグ)が保持するAttributeの内、"Primary Service"のAttributeを取得・ダンプした結果になります。
# ATT/GATTを含めBluetooth規格はBluetooth SIGのサイトで仕様書を確認できます

では、実際の出力結果からもう少し詳細を見ていきます。

primaryの1エントリ(uuid: 00001800-0000-1000-8000-00805f9b34fb)
primaryの出力結果が複数行(エントリ)ありましたが、最初のエントリについて細かく見ていきます。
  attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
最初に注目するのはuuidです。"00001800-0000-1000-8000-00805f9b34fb"となっています。この値はBluetooth SIGによる"Generic Access"のサービス用に規定されたUUIDです。
# Bluetooth SIGのサイトで、採択番号を参照することができます(リンク

少し話がそれますが、上記リンク先では "Generic Access"サービスのUUIDとして "0x1800" と記述されていますが、対応関係について簡単に記載おきます。UUIDは128ビットの値ですが、Bluetoothの基幹IDとして "0000XXXX-0000-1000-8000-00805F9B34FB" が設定されており、XXXXの16ビット部分のみで128ビットのUUIDを表すようになっています。

primaryの残りの部分ですが、attr handleとend grp handleはAttributeに対するハンドルのグループを指定してます。この例では、0x0001自体がこのPrimary Service(Generic Accessサービス)のハンドルで、0x0007までがこのサービスのハンドルということを示しています。

では、primaryの出力結果を眺めてみる
最初のエントリを含め、全体のエントリの出力結果を見てみると以下のようになります。
各UUIDに対応するサービスを出すと、BLEデバイスが提供するサービスが見えてきました。
  handle 0x0001 - 0x0007 : Generic Access Service (0x1800)
  handle 0x0008 - 0x000a : Link Loss Service (0x1803)
  handle 0x000b - 0x000d : Immediate Alert Service (0x1802)
  handle 0x000e - 0x0010 : Tx Power Service (0x1804)
  handle 0x0011 - 0xffff : Battery Service (0x180f)

今日はここまで。
次回は、Characteristicsに関しても見ていきたいと思います。


2014年1月12日

BluetoothLowEnergy(BLE)の勉強 - その1 - Linux+BlueZでBLE通信を試す

Bluetooth Low Energey (BLE) の個人勉強用に、LinuxでBLE通信を試してみました。
その手順等について以下記載します。

環境
ThinkPad X201上のGentooLinux環境で試しました。Linuxカーネルは3.10.17、BlueZ(Bluetoothスタック)は4.101をインストールしています。
ThinkPad X201はBLE対応(Bluetooth Ver4.0以降)のホストを搭載していないので、USBドングル(Princeton PTM-UBT7)を接続しました。通信相手となるBLEデバイスには、iPhone対応しているふるタグ(Logitec LBT-MPVRU01BK)を使います。

BLEデバイスのスキャン
コマンドラインでhcitoolを使ってスキャンします。
  $ hcitool lescan
以下のような出力が続き、LBT-MPVRU01BKが見つかりました。
  44:13:19:02:F8:A9 LBT-VRU01
  44:13:19:02:F8:A9 (unknown)
LBT-MPVRU01BKのBluetoothアドレスは、44:13:19:02:F8:A9ということがわかります。

デバイスへのアクセス
見つかったアドレスに対して、gatttoolを使ってアクセスしてみます。"-I"オプションをつけることでインタラクティブに通信操作を行うことができます。(太字の部分が実際に入力した箇所です)
  $ gatttool -i hci0 -b 44:13:19:02:F8:A9 -I
  [   ][44:13:19:02:F8:A9][LE]> connect
  [CON][44:13:19:02:F8:A9][LE]> primary
  [CON][44:13:19:02:F8:A9][LE]>
  attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
  attr handle: 0x0008, end grp handle: 0x000a uuid: 00001803-0000-1000-8000-00805f9b34fb
  attr handle: 0x000b, end grp handle: 0x000d uuid: 00001802-0000-1000-8000-00805f9b34fb
  attr handle: 0x000e, end grp handle: 0x0010 uuid: 00001804-0000-1000-8000-00805f9b34fb
  attr handle: 0x0011, end grp handle: 0xffff uuid: 0000180f-0000-1000-8000-00805f9b34fb
  [CON][44:13:19:02:F8:A9][LE]> characteristics
  [CON][44:13:19:02:F8:A9][LE]>
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0009, char properties: 0x0a, char value handle: 0x000a, uuid: 00002a06-0000-1000-8000-00805f9b34fb
handle: 0x000c, char properties: 0x04, char value handle: 0x000d, uuid: 00002a06-0000-1000-8000-00805f9b34fb
handle: 0x000f, char properties: 0x02, char value handle: 0x0010, uuid: 00002a07-0000-1000-8000-00805f9b34fb
handle: 0x0012, char properties: 0x02, char value handle: 0x0013, uuid: 00002a19-0000-1000-8000-00805f9b34fb
handle: 0x0014, char properties: 0x02, char value handle: 0x0015, uuid: 00002a1a-0000-1000-8000-00805f9b34fb
handle: 0x0016, char properties: 0x12, char value handle: 0x0017, uuid: 00002a1b-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a3a-0000-1000-8000-00805f9b34fb
  [CON][44:13:19:02:F8:A9][LE]> char-write-cmd 0x000d 02
  [CON][44:13:19:02:F8:A9][LE]> char-write-cmd 0x000d 01

最後の2つのコマンドで、実際にBLEデバイス(LBT-MPVRU01BK)に対する通信操作を行うことができました。
"char-write-cmd 0x000d 02"でLBT-MPVRU01BKからメロディが流れます。
また、"char-write-cmd 0x000d 01"でLBT-MPVRU01BKのLEDが点滅します。

gatttoolでの操作および出力がBLEの肝になるような雰囲気ですが、これらについては後日記載したいと思います。

参考ページ
スキャンや通信に関しては、以下のページを参考にしました。(ほぼそのままです…)
http://i-miss-erin.blogspot.jp/2010/12/gatttool-in-bluez-over-bredr.html


2013年8月9日

QEMUのゲストOSでアンダースコアが入力できない問題への対応(Gentoo Linux)

Gentoo LinuxでQEMU-1.4.2を利用しているが、ゲストOSでアンダースコア '_' が入力できない。
Googleで調べてみるとVirtの設定ファイルを記述する方法が記載されている(リンク)が、私の環境ではVirtは導入していないので別の方法を取りたい。この問題に対するQEMU修正のパッチがあった(リンク)ので、このパッチを利用してQEMUをビルドしなおす方法をとる。

1. パッチファイルの作成
/etc/portage/patches/app-emulation/qemu-1.4.2/qemu-jp106-underscore-fix.patch というファイルで、上記パッチ内容を記述する。

  --- a/ui/x_keymap.c     2013-08-09 07:40:09.530318381 +0900
  +++ b/ui/x_keymap.c     2013-08-09 07:38:27.310309931 +0900
  @@ -94,7 +94,7 @@
    */
  
   static const uint8_t evdev_keycode_to_pc_keycode[61] = {
  -    0,         /*  97 EVDEV - RO   ("Internet" Keyboards) */
  +    0x73,      /*  97 EVDEV - RO   ("Internet" Keyboards) */
       0,         /*  98 EVDEV - KATA (Katakana) */
       0,         /*  99 EVDEV - HIRA (Hiragana) */
       0x79,      /* 100 EVDEV - HENK (Henkan) */


2. PortageでQEMUをビルドしなおす
以下のコマンドでQEMUをビルドしなおす
  # emerge app-emulation/qemu

これで、1.で用意したパッチを当てた上でQEMUがビルドされ直した。
うーん。便利!

2013年4月12日

EPSON EP-805AのUSBディスクリプタ

昨年末にプリンタが壊れたので、新規にEPSONのプリンタ複合機EP-805Aを購入。
Wi-Fiが標準で付いていて便利です。ノートPCのみで(デスクトップのように)PCを固定設置していないため、使う度にUSBケーブル繋ぐ必要が無い。
ただそれだけなんですが、ビックリするほど便利。やはり無線の便利さは実際に使ってみないと分からないです。。。

で、本題ですがUSB接続もできるので、USBディスクリプタを取得してみました。
Linuxのlsusbコマンドで簡単に取れます。
(なぜ取得したというと、「そこにUSBインタフェースがあったから」)



Bus 001 Device 003: ID 04b8:089c Seiko Epson Corp. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x04b8 Seiko Epson Corp.
  idProduct          0x089c 
  bcdDevice            1.00
  iManufacturer           1 EPSON
  iProduct                2 EPSON EP-805A Series
  iSerial                 3 51594C593136303286
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           78
    bNumInterfaces          3
    bConfigurationValue     1
    iConfiguration          4 USB2.0 MFP(Hi-Speed)
    bmAttributes         0xc0
      Self Powered
    MaxPower                2mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              5 EPSON Scanner
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         7 Printer
      bInterfaceSubClass      1 Printer
      bInterfaceProtocol      2 Bidirectional
      iInterface              6 USB2.0 Printer
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x85  EP 5 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
      iInterface              7 USB2.0 Mass Storage
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x07  EP 7 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x88  EP 8 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0001
  Self Powered



2013年3月20日

GCCで定義済みのマクロを調べる

Cコード中でデフォルトで定義されるマクロ (__i386__ 等) を調べたい場合は、以下のコマンドで出力することができる。

  $ gcc -E -dM -xc /dev/null

-Eオプションがプリプロセスで終了するオプション、-dMオプションでプリプロセス終了時に有効だったマクロ定義の出力。

参考までに、私の環境(Gentoo Linux x86_64、gcc-4.6.3)では以下のように出力された。



#define __DBL_MIN_EXP__ (-1021)
#define __UINT_LEAST16_MAX__ 65535
#define __FLT_MIN__ 1.17549435082228750797e-38F
#define __UINT_LEAST8_TYPE__ unsigned char
#define __INTMAX_C(c) c ## L
#define __CHAR_BIT__ 8
#define __UINT8_MAX__ 255
#define __WINT_MAX__ 4294967295U
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __SIZE_MAX__ 18446744073709551615UL
#define __WCHAR_MAX__ 2147483647
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __FLT_EVAL_METHOD__ 0
#define __unix__ 1
#define __x86_64 1
#define __UINT_FAST64_MAX__ 18446744073709551615UL
#define __SIG_ATOMIC_TYPE__ int
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __GNUC_PATCHLEVEL__ 3
#define __UINT_FAST8_MAX__ 255
#define __DEC64_MAX_EXP__ 385
#define __INT8_C(c) c
#define __UINT_LEAST64_MAX__ 18446744073709551615UL
#define __SHRT_MAX__ 32767
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __UINT_LEAST8_MAX__ 255
#define __UINTMAX_TYPE__ long unsigned int
#define __linux 1
#define __DEC32_EPSILON__ 1E-6DF
#define __unix 1
#define __UINT32_MAX__ 4294967295U
#define __LDBL_MAX_EXP__ 16384
#define __WINT_MIN__ 0U
#define __linux__ 1
#define __SCHAR_MAX__ 127
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __INT64_C(c) c ## L
#define __DBL_DIG__ 15
#define _FORTIFY_SOURCE 2
#define __SIZEOF_INT__ 4
#define __SIZEOF_POINTER__ 8
#define __USER_LABEL_PREFIX__
#define __STDC_HOSTED__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __FLT_EPSILON__ 1.19209289550781250000e-7F
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __DEC32_MAX__ 9.999999E96DF
#define __INT32_MAX__ 2147483647
#define __SIZEOF_LONG__ 8
#define __UINT16_C(c) c
#define __DECIMAL_DIG__ 21
#define __gnu_linux__ 1
#define __LDBL_HAS_QUIET_NAN__ 1
#define __GNUC__ 4
#define __MMX__ 1
#define __FLT_HAS_DENORM__ 1
#define __SIZEOF_LONG_DOUBLE__ 16
#define __BIGGEST_ALIGNMENT__ 16
#define __DBL_MAX__ ((double)1.79769313486231570815e+308L)
#define __INT_FAST32_MAX__ 9223372036854775807L
#define __DBL_HAS_INFINITY__ 1
#define __DEC32_MIN_EXP__ (-94)
#define __INT_FAST16_TYPE__ long int
#define __LDBL_HAS_DENORM__ 1
#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
#define __INT_LEAST32_MAX__ 2147483647
#define __DEC32_MIN__ 1E-95DF
#define __DBL_MAX_EXP__ 1024
#define __DEC128_EPSILON__ 1E-33DL
#define __SSE2_MATH__ 1
#define __PTRDIFF_MAX__ 9223372036854775807L
#define __amd64 1
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __SIZEOF_SIZE_T__ 8
#define __SIZEOF_WINT_T__ 4
#define __GCC_HAVE_DWARF2_CFI_ASM 1
#define __GXX_ABI_VERSION 1002
#define __FLT_MIN_EXP__ (-125)
#define __INT_FAST64_TYPE__ long int
#define __DBL_MIN__ ((double)2.22507385850720138309e-308L)
#define __LP64__ 1
#define __DECIMAL_BID_FORMAT__ 1
#define __DEC128_MIN__ 1E-6143DL
#define __REGISTER_PREFIX__
#define __UINT16_MAX__ 65535
#define __DBL_HAS_DENORM__ 1
#define __UINT8_TYPE__ unsigned char
#define __NO_INLINE__ 1
#define __FLT_MANT_DIG__ 24
#define __VERSION__ "4.6.3"
#define __UINT64_C(c) c ## UL
#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __INT32_C(c) c
#define __DEC64_EPSILON__ 1E-15DD
#define __ORDER_PDP_ENDIAN__ 3412
#define __DEC128_MIN_EXP__ (-6142)
#define __INT_FAST32_TYPE__ long int
#define __UINT_LEAST16_TYPE__ short unsigned int
#define unix 1
#define __INT16_MAX__ 32767
#define __SIZE_TYPE__ long unsigned int
#define __UINT64_MAX__ 18446744073709551615UL
#define __INT8_TYPE__ signed char
#define __ELF__ 1
#define __FLT_RADIX__ 2
#define __INT_LEAST16_TYPE__ short int
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define __UINTMAX_C(c) c ## UL
#define __SSE_MATH__ 1
#define __k8 1
#define __SIG_ATOMIC_MAX__ 2147483647
#define __SIZEOF_PTRDIFF_T__ 8
#define __x86_64__ 1
#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
#define __INT_FAST16_MAX__ 9223372036854775807L
#define __UINT_FAST32_MAX__ 18446744073709551615UL
#define __UINT_LEAST64_TYPE__ long unsigned int
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MAX_10_EXP__ 38
#define __LONG_MAX__ 9223372036854775807L
#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
#define __FLT_HAS_INFINITY__ 1
#define __UINT_FAST16_TYPE__ long unsigned int
#define __DEC64_MAX__ 9.999999999999999E384DD
#define __CHAR16_TYPE__ short unsigned int
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __INT_LEAST16_MAX__ 32767
#define __DEC64_MANT_DIG__ 16
#define __INT64_MAX__ 9223372036854775807L
#define __UINT_LEAST32_MAX__ 4294967295U
#define __INT_LEAST64_TYPE__ long int
#define __INT16_TYPE__ short int
#define __INT_LEAST8_TYPE__ signed char
#define __DEC32_MAX_EXP__ 97
#define __INT_FAST8_MAX__ 127
#define __INTPTR_MAX__ 9223372036854775807L
#define linux 1
#define __SSE2__ 1
#define __LDBL_MANT_DIG__ 64
#define __DBL_HAS_QUIET_NAN__ 1
#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
#define __k8__ 1
#define __INTPTR_TYPE__ long int
#define __UINT16_TYPE__ short unsigned int
#define __WCHAR_TYPE__ int
#define __SIZEOF_FLOAT__ 4
#define __UINTPTR_MAX__ 18446744073709551615UL
#define __DEC64_MIN_EXP__ (-382)
#define __INT_FAST64_MAX__ 9223372036854775807L
#define __FLT_DIG__ 6
#define __UINT_FAST64_TYPE__ long unsigned int
#define __INT_MAX__ 2147483647
#define __amd64__ 1
#define __INT64_TYPE__ long int
#define __FLT_MAX_EXP__ 128
#define __ORDER_BIG_ENDIAN__ 4321
#define __DBL_MANT_DIG__ 53
#define __INT_LEAST64_MAX__ 9223372036854775807L
#define __DEC64_MIN__ 1E-383DD
#define __WINT_TYPE__ unsigned int
#define __UINT_LEAST32_TYPE__ unsigned int
#define __SIZEOF_SHORT__ 2
#define __SSE__ 1
#define __LDBL_MIN_EXP__ (-16381)
#define __INT_LEAST8_MAX__ 127
#define __SIZEOF_INT128__ 16
#define __LDBL_MAX_10_EXP__ 4932
#define __DBL_EPSILON__ ((double)2.22044604925031308085e-16L)
#define _LP64 1
#define __UINT8_C(c) c
#define __INT_LEAST32_TYPE__ int
#define __SIZEOF_WCHAR_T__ 4
#define __UINT64_TYPE__ long unsigned int
#define __INT_FAST8_TYPE__ signed char
#define __DBL_DECIMAL_DIG__ 17
#define __DEC_EVAL_METHOD__ 2
#define __UINT32_C(c) c ## U
#define __INTMAX_MAX__ 9223372036854775807L
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
#define __INT8_MAX__ 127
#define __UINT_FAST32_TYPE__ long unsigned int
#define __CHAR32_TYPE__ unsigned int
#define __FLT_MAX__ 3.40282346638528859812e+38F
#define __INT32_TYPE__ int
#define __SIZEOF_DOUBLE__ 8
#define __FLT_MIN_10_EXP__ (-37)
#define __INTMAX_TYPE__ long int
#define __DEC128_MAX_EXP__ 6145
#define __GNUC_MINOR__ 6
#define __UINTMAX_MAX__ 18446744073709551615UL
#define __DEC32_MANT_DIG__ 7
#define __DBL_MAX_10_EXP__ 308
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __INT16_C(c) c
#define __STDC__ 1
#define __PTRDIFF_TYPE__ long int
#define __UINT32_TYPE__ unsigned int
#define __UINTPTR_TYPE__ long unsigned int
#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
#define __DEC128_MANT_DIG__ 34
#define __LDBL_MIN_10_EXP__ (-4931)
#define __SIZEOF_LONG_LONG__ 8
#define __LDBL_DIG__ 18
#define __FLT_DECIMAL_DIG__ 9
#define __UINT_FAST16_MAX__ 18446744073709551615UL
#define __GNUC_GNU_INLINE__ 1
#define __UINT_FAST8_TYPE__ unsigned char

2012年1月11日

Emacsでauto-complete + pycompleteによるPythonの補完 (Gentoo Linux)


Emacsでのpython開発環境を強化しようと思い色々と設定を行っています。
補完機能について色々と試していたが、そこそこな設定ができたので記録を残しておきます。

Emacsでpythonの補完を行う方法は、pythonの思想に反して(?)色々方法があるようです。


  ropemacs
  pysmell
  pycomplete
  ac-python


あまりモジュールの依存が多いものは嫌だったので、pycompleteを使うことにしました。

なお、以下の設定はGentooでの設定に依存したものになります。
(一般的な部分もありますが...)

まず必要なパッケージをインストールします。括弧内に実際にインストールしたバージョンを記載しています。


  # emerge app-editors/emacs       (=app-editors/app-emacs-23.3-r2)
  # emerge app-emacs/pymacs        (=app-emacs/pymacs-0.23-r1)
  # emerge app-emacs/python-mode   (=app-emacs/python-mode-5.2.0)
  # emerge app-emacs/auto-complete (=app-emacs/auto-complete-1.3.1)


また、Gentooのpython-modeではpycompleteがインストールされないためローカル環境に置きます。
python-modeインストール時に取得されたtgzが/usr/portage/distfilesにあるので、
そこから pycomplete.py と pycomplete.el を取り出します。以下のパスに配置しました。


  $HOME/.emacs.d/local-site-lisp/pycomplete.el
  $HOME/.emacs.d/pycomplete/pycomplete.py


続いて、Emacsの設定。$HOME/.emacsに以下を記述します。


  ;; portageでインストールされるelispを読み込む
  (load "/usr/share/emacs/site-lisp/site-gentoo")

  ;; pycomplete.elを保存したディレクトリをload-pathに追加
  (setq load-path (append '("~/.emacs.d/local-site-lisp") load-path))

  ;; auto-completeの設定
  (add-to-list 'ac-dictionary-directories "~/.emacs.d/dict")
  (require 'auto-complete-config)
  (ac-config-default)
  (setq ac-use-menu-map t)  ; 補完ウィンドウでC-p,C-nで候補選択

  ;; pycomplete.pyをpymacsに渡す
  (eval-after-load "pymacs"
    '(add-to-list 'pymacs-load-path "~/.emacs.d/pycomplete"))
  ;; pycompleteをロードする
  (add-hook 'python-mode-hook '(lambda () (require 'pycomplete)))

  ;; auto-completeでpycompleteを渡すための設定
  (defvar ac-source-pycomplete
    '((prefix "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z_][a-zA-Z0-9_]*\\)?\\)" nil 1)
      (candidates . ac-pycomplete-candidates)
      (require . 0)))
  (defun ac-pycomplete-candidates ()
    (pycomplete-get-all-completions (py-symbol-near-point) (py-find-global-imports)))

  ;; auto-completeをpythonでも有効にする
  ;;   (app-emacs/auto-complete-1.3.1ではpython-modeは設定されていない)
  (add-to-list 'ac-modes 'python-mode)
  (defun ac-python-mode-setup ()
    (setq ac-sources (append '(ac-source-pycomplete)
    ac-sources)))
  (add-hook 'python-mode-hook 'ac-python-mode-setup)

  ;; M-hで即座にpycompleteによる補完を行う
  ;;  XXX: ac-complete-pycompleteを利用すると、"sys."等のドット状態で補完ができない
  ;;  XXX: そのため、ac-complete-interactive-pycompleteを定義して呼び出す
  (global-set-key (kbd "M-h") 'ac-complete-interactive-pycomplete)
  (defvar ac-source-pycomplete-interactive
    '((prefix "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z_][a-zA-Z0-9_]*\\)?\\)" nil 1)
      (candidates . ac-pycomplete-candidates)
      (requires . 0)))
  (defun ac-complete-interactive-pycomplete ()
    (interactive)
    (auto-complete '(ac-source-pycomplete-interactive)))


ac-source-pycomplete-interactiveについてですが、関数定義の中身はac-source-pycompleteと一緒です。
ac-complete-interactive-pycompleteからac-source-pycompleteを呼び出すようにすると、
後述のドット(.)で補完を行うことができないため(原因不明)、別の関数で定義しています。

以上の設定で、以下のようにできます。
  "sys.__" とか入力すれば、auto-completeで補完してくれる
  "time." とか入力後、M-hでシンボル一覧が表示される
これでかなりイイ感じです。

以下のサイトを参考にしました。感謝!
[emacs][python] auto-complete と pycomplete で賢い補完
@yosisaさんのつぶやき

2012年1月3日

Googleリーダーのキーボードショートカット

RSSリーダーとしてGoogleリーダーを愛用しています。
よく使うキーボードショートカットは以下です。
  • j  : 次のアイテム
  • k : 前のアイテム
  • s : スターをつける
  • Shift+a : 全て既読にする
なお、日本語入力が無効の状態で無いとキーボードショートカットは効かないです。

個人的Advent Calenderのまとめ

2011年のプログラミング系Advento Calenderの一覧です。(個人的に気になったもの)



また、Advent Calenderの一覧をまとめたサイト

2011年9月18日

USB3.0ハブを調べてみる

USB3.0ハブを入手したので少し調べてみました。
まずは dmesg でどのように認識されているかを確認。USBデバイスが2つ認識されていた。1つはHigh-SpeedのUSBハブ。もう1つはSuper-SpeedのUSBハブ。
前から気になっていたけど、やはりUSB3.0ハブは上記のように内部的に2つのハブが存存在する模様。


    hub 3-0:1.0: state 7 ports 2 chg 0000 evt 0002
    hub 3-0:1.0: port 1, status 0101, change 0001, 12 Mb/s
    hub 3-0:1.0: debounce: port 1: total 100ms stable 100ms status 0x101
    usb 3-1: new high speed USB device number 2 using xhci_hcd
    xhci_hcd 0000:05:00.0: WARN: short transfer on control ep
    usb 3-1: default language 0x0409
    xhci_hcd 0000:05:00.0: WARN: short transfer on control ep
    usb 3-1: udev 2, busnum 3, minor = 257
    usb 3-1: New USB device found, idVendor=2109, idProduct=3431
    usb 3-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
    usb 3-1: Product: USB2.0 Hub
    usb 3-1: usb_probe_device
    usb 3-1: configuration #1 chosen from 1 choice
    usb 3-1: Successful Endpoint Configure command
    usb 3-1: adding 3-1:1.0 (config #1, interface 0)
    hub 3-1:1.0: usb_probe_interface
    hub 3-1:1.0: usb_probe_interface - got id
    hub 3-1:1.0: USB hub found
    xhci_hcd 0000:05:00.0: WARN: short transfer on control ep
    hub 3-1:1.0: 4 ports detected
    hub 3-1:1.0: standalone hub
    hub 3-1:1.0: individual port power switching
    hub 3-1:1.0: individual port over-current protection
    hub 3-1:1.0: Single TT
    hub 3-1:1.0: TT requires at most 32 FS bit times (2664 ns)
    hub 3-1:1.0: Port indicators are supported
    hub 3-1:1.0: power on to power good time: 100ms
    usb 3-1: Successful Endpoint Configure command
    hub 3-1:1.0: local power source is good
    hub 3-1:1.0: enabling power on all ports
    hub 4-0:1.0: state 7 ports 2 chg 0000 evt 0002
    hub 4-0:1.0: port 1, status 0103, change 0001, 5.0 Gb/s
    hub 4-0:1.0: debounce: port 1: total 100ms stable 100ms status 0x103
    usb 4-1: new SuperSpeed USB device number 2 using xhci_hcd
    usb 4-1: skipped 1 descriptor after endpoint
    xhci_hcd 0000:05:00.0: WARN: short transfer on control ep
    usb 4-1: default language 0x0409
    xhci_hcd 0000:05:00.0: WARN: short transfer on control ep
    xhci_hcd 0000:05:00.0: WARN: short transfer on control ep
    usb 4-1: udev 2, busnum 4, minor = 385
    usb 4-1: New USB device found, idVendor=2109, idProduct=0810
    usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    usb 4-1: Product: 4-Port USB 3.0 Hub
    usb 4-1: Manufacturer: VIA Labs, Inc.
    usb 4-1: usb_probe_device
    usb 4-1: configuration #1 chosen from 1 choice
    xhci_hcd 0000:05:00.0: WARN no SS endpoint bMaxBurst
    usb 4-1: Successful Endpoint Configure command
    usb 4-1: adding 4-1:1.0 (config #1, interface 0)
    hub 4-1:1.0: usb_probe_interface
    hub 4-1:1.0: usb_probe_interface - got id
    hub 4-1:1.0: USB hub found
    hub 4-1:1.0: 4 ports detected
    hub 4-1:1.0: standalone hub
    hub 4-1:1.0: individual port power switching
    hub 4-1:1.0: individual port over-current protection
    hub 4-1:1.0: TT requires at most 8 FS bit times (666 ns)
    hub 4-1:1.0: power on to power good time: 2ms
    usb 4-1: Successful Endpoint Configure command
    hub 4-1:1.0: local power source is good
    hub 4-1:1.0: enabling power on all ports
    hub 3-1:1.0: state 7 ports 4 chg 0000 evt 0000
    hub 4-1:1.0: state 7 ports 4 chg 0000 evt 0000


続いてディスクリプタの内容を見てみる。
2つのハブがそれぞれにディスクリプタを持っている。ちなみにUSB3.0ではハブディスクリプタの構造が変更になっているが、High-SpeedのハブはUSB2.0のハブディスクリプタを持っており、Super-SpeedのハブはUSB3.0のハブディスクリプタも持っている。Super-SpeedのハブはContainer IDのディスクリプタもあった。

    Bus 003 Device 002: ID 2109:3431  --> USB2.0ハブ
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               2.00
      bDeviceClass            9 Hub
      bDeviceSubClass         0 Unused
      bDeviceProtocol         1 Single TT
      bMaxPacketSize0        64
      idVendor           0x2109
      idProduct          0x3431
      bcdDevice            2.88
      iManufacturer           0
      iProduct                1 USB2.0 Hub
      iSerial                 0
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           25
        bNumInterfaces          1
        bConfigurationValue     1
        iConfiguration          0
        bmAttributes         0xe0
          Self Powered
          Remote Wakeup
        MaxPower              100mA
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         9 Hub
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0 Full speed (or root) hub
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0001  1x 1 bytes
            bInterval              12
    Hub Descriptor:
      bLength               9
      bDescriptorType      41
      nNbrPorts             4
      wHubCharacteristic 0x00e9
        Per-port power switching
        Per-port overcurrent protection
        TT think time 32 FS bits
        Port indicators
      bPwrOn2PwrGood       50 * 2 milli seconds
      bHubContrCurrent    100 milli Ampere
      DeviceRemovable    0x00
      PortPwrCtrlMask    0xff
     Hub Port Status:
       Port 1: 0000.0100 power
       Port 2: 0000.0100 power
       Port 3: 0000.0100 power
       Port 4: 0000.0100 power
    Device Qualifier (for other device speed):
      bLength                10
      bDescriptorType         6
      bcdUSB               2.00
      bDeviceClass            9 Hub
      bDeviceSubClass         0 Unused
      bDeviceProtocol         0 Full speed (or root) hub
      bMaxPacketSize0        64
      bNumConfigurations      1
    Device Status:     0x0001
      Self Powered

    Bus 004 Device 002: ID 2109:0810
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               3.00
      bDeviceClass            9 Hub
      bDeviceSubClass         0 Unused
      bDeviceProtocol         3
      bMaxPacketSize0         9
      idVendor           0x2109
      idProduct          0x0810
      bcdDevice            3.88
      iManufacturer           1 VIA Labs, Inc.
      iProduct                2 4-Port USB 3.0 Hub
      iSerial                 0
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           31
        bNumInterfaces          1
        bConfigurationValue     1
        iConfiguration          0
        bmAttributes         0xc0
          Self Powered
        MaxPower                2mA
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         9 Hub
          bInterfaceSubClass      0 Unused
          bInterfaceProtocol      0 Full speed (or root) hub
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes           19
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Feedback
            wMaxPacketSize     0x0002  1x 2 bytes
            bInterval              16
            bMaxBurst               0
    Hub Descriptor:
      bLength              12
      bDescriptorType      42
      nNbrPorts             4
      wHubCharacteristic 0x0009
        Per-port power switching
        Per-port overcurrent protection
      bPwrOn2PwrGood        1 * 2 milli seconds
      bHubContrCurrent      8 milli Ampere
      bHubDecLat          0.0 micro seconds
      wHubDelay          4000 nano seconds
      DeviceRemovable    0x00
     Hub Port Status:
       Port 1: 0000.02a0 5Gbps power Rx.Detect
       Port 2: 0000.02a0 5Gbps power Rx.Detect
       Port 3: 0000.02a0 5Gbps power Rx.Detect
       Port 4: 0000.02a0 5Gbps power Rx.Detect
    Binary Object Store Descriptor:
      bLength                 5
      bDescriptorType        15
      wTotalLength           42
      bNumDeviceCaps          3
      USB 2.0 Extension Device Capability:
        bLength                 7
        bDescriptorType        16
        bDevCapabilityType      2
        bmAttributes   0x00000002
          Link Power Management (LPM) Supported
      SuperSpeed USB Device Capability:
        bLength                10
        bDescriptorType        16
        bDevCapabilityType      3
        bmAttributes         0x00
          Latency Tolerance Messages (LTM) Supported
        wSpeedsSupported   0x000e
          Device can operate at Full Speed (12Mbps)
          Device can operate at High Speed (480Mbps)
          Device can operate at SuperSpeed (5Gbps)
        bFunctionalitySupport   0
          Lowest fully-functional device speed is Low Speed (1Mbps)
        bU1DevExitLat           3 micro seconds
        bU2DevExitLat        1255 micro seconds
      Container ID Device Capability:
        bLength                20
        bDescriptorType        16
        bDevCapabilityType      4
        bReserved               0
        ContainerID             {00000000-0000-0000-0000-000000000000}
    Device Status:     0x0001
      Self Powered

ちなみに、確認した環境は…
    ホストPC  :  Gentoo Linux  (kernel 2.6.39-gentoo-r3)
    USBハブ : Buffalo BSH4A04U3BK



2011年4月24日

Gentoo Linuxで python をアップデート (2.6 -> 2.7)

Gentoo LinuxのPortageでPythonが2.6から2.7にアップデートがありました。アップデートしたら見事に(案の定?)トラブったので、僕が対応した方法をメモしておきます。

現象
portageによるpythonのアップデート(python-2.7.1-r1)後、emergeコマンドが一切動作しなくなる。x86-stableパッケージ(x86)を利用しており、python-2.7はSlotでインストールされていた。

解決方法
僕の場合は以下の方法で解決することができました。
まず、eselectでpythonパッケージを2.7に変更する
  $ eselect python list   (python2.7の番号を確認。僕の環境では[1])
  $ eselect python set 1  (確認した番号[1]で設定する)
続いて python-updater コマンドで旧pythonに依存するパッケージの再ビルドを行う
  $ python-updater

これで解決しました。長らく使っていた2.6系はこれで不要に。--depcleanでアンインストール