前回のエントリで、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に関しても見ていきたいと思います。
Take It EASY!!
UNIX(BSD, Linux)やUSBやBluetoothやPython, Haskell等のトピックに関して。個人的に興味があることしか書きません。
2014年1月19日
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
その手順等について以下記載します。
環境
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がビルドされ直した。
うーん。便利!
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) */
以下のコマンドで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
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
$ 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の一覧です。(個人的に気になったもの)
- Python Advent Calender 2011 (全部俺)
- 2011 Pythonアドベントカレンダー (Python3)
- PyPy Advent Calender 2011
- Emacs Advent Calender jp: 2011
- Haskell Advent Calender 2011
- カーネル/VM Advent Calender
- Lispギャグ Advent Calender
- Android Advent Calender 2011
- hadoopアドベントカレンダー2011
また、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
まずは 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でアンインストール
現象
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でアンインストール
登録:
投稿 (Atom)