Selenium for Python のインストール

Arch Linux

$ sudo pacman -S python-pip
$ sudo pip install -U selenium

Windows

Python をインストールし、コマンドプロンプト

> pip install -U selenium

mikutterの手動インストール (Arch Linux)

まずは公式リポジトリからRubyRubyGemsをインストール。

$ sudo pacman -S ruby rubygems

次にGTK2のRubyバインディングであるRuby/GTK2をインストール。

$ sudo gem install gtk2
(sudo pacman -S ruby-gtk2でも可能?(未確認))

その後、以下のAURパッケージをmakepkg -spacman -Uでインストール。

yaourtならyaourt mikutterで依存パッケージも全部インストールしてくれる?(未確認)

Linux用Waltopペンタブドライバ

Waltop 社製のチップを搭載したペンタブレット(日本ではプリンストン社の販売しているペンタブレットが該当します)は次のような動作モードを持っています。

HID 準拠モード 読取分解能が制限されたり、一部の機能が使用できない
HID 非準拠モード 本来の読取分解能が発揮でき、全ての機能が使用出来る

Linux に標準で同梱されているドライバは HID 準拠モードで動作するため、一部の Waltop タブレットでは性能が低下してしまいます。 本ドライバは HID 非準拠モードで動作するため、タブレット本来の性能が発揮出来ます(ただし、体感できるほどの違いはありません)。

目次

対応タブレット

以下のタブレットに対応しています。デバイスIDはlsusbコマンドで確認出来ます。

バイスID製品名対応機能
172f:0022 Adesso CyberPad  
172f:0024 ?  
172f:0025 ?  
172f:0026 ?  
172f:0027 Genius G-Note 7000  
172f:0028 ?  
172f:0030 ?  
172f:0031 Waltop Slim Tablet 12.1"
プリンストン PTB-ST12
Adesso CyberTablet Z12
 
172f:0032 Waltop Slim Tablet 5.8"
Genius G-Pen F350
 
172f:0033 ?  
172f:0034 Waltop Slim Tablet 12.1"
Genisu G-Pen F610
Aiptek 600U SlimTablet
Odys Multi Graphic Board 12
Medion Design USB Graphic Pad MD85637/P82012
 
172f:0035 ?  
172f:0036 ?  
172f:0037 Waltop Q Pad
Aiptek Hyperpen Mini
Trust Flex Design Tablet
Medion MD 86190
 
172f:0038 Geninus G-Pen F509  
172f:0039 ?  
172f:0046 Waltop Mars BR Tablet
プリンストン PTB-STRP1
[Ver.0.0.7で対応]
4000LPI
2048レベルの筆圧
172f:0047 Waltop Mars A Tablet
Medion MD86635/P82018
4000LPI
172f:0051 ?  
172f:0052 Yiynova MSP19 4000LPI(未確認)
172f:0053 ?  
172f:0054 ?  
172f:0055 ?  
172f:0056 ?  
172f:0058 ?  
172f:0500 Waltop Media Tablet 14.1"
Genius G-Pen M712
Aiptek 14000U
4000LPI(未確認)
172f:0501 Waltop Media Tablet 10.6"
Genius G-Pen M609
SilverCrest GTA2000/DT53600
4000LPI(未確認)
172f:0502 Waltop Sirius Tablet
プリンストン PTB-S1BK
4000LPI
1024レベルの筆圧
傾き検知
エクスプレスキー
タッチパッド
172f:0503 Waltop Venus S Tablet
プリンストン PTB-S2S
[Ver.0.0.7で対応]
4000LPI
2048レベルの筆圧
傾き検知
172f:0509 Waltop Vega Tablet
プリンストン PTB-S3BK
[Ver.0.0.6で対応]
5080LPI
2048レベルの筆圧
傾き検知
エクスプレスキー
ナビゲーションホイール

使用方法

依存パッケージ

本ドライバを使用するには予め以下のパッケージをインストールしておく必要があります(同梱のubuntu-install.shを使用する場合、これらのパッケージは自動でインストールされます)。

Ubuntuを使用している場合

Ubuntuを使用している場合、同梱のインストールスクリプトを使用することで、依存パッケージの導入・ビルド・インストールを自動で行うことが出来ます。

$ tar xf waltop-x.x.x.tar.gz
$ cd waltop-x.x.x
$ ./ubuntu-install.sh

アンインストール方法は以下の通りです。

$ cd waltop-x.x.x
$ ./ubuntu-uninstall.sh

ソフトウェアの更新等でLinuxカーネルがアップデートされた場合、一旦ドライバをアンインストールして再インストールする必要があります。

手動ビルド&インストール

ビルド
$ tar xf waltop-x.x.x.tar.gz
$ cd waltop-x.x.x
$ make

ビルドに成功すると waltop.ko というファイルが作成されます。

バージョン 0.0.6 以降は同梱されたX用の設定ファイルを xorg.conf.d へコピーする必要があります。

$ sudo cp 60-waltop.conf /usr/share/X11/xorg.conf.d/

コピー後、一旦再起動して下さい。

インストール

まず Linux のデフォルトドライバ (usbhid) からタブレットを切り離すためのスクリプトを実行します。その後ドライバを insmod します(OS起動時に毎回必要)。

$ cd waltop-x.x.x
$ sudo python3 unbind.py
$ sudo insmod waltop.ko

ドライバがタブレットの認識に成功するとlsusb -tで該当デバイスの Driver が usbhid から waltop になるはずです。

注意事項

  • DKMS には対応していないので、カーネルアップデート後にドライバの再ビルドが必要です。
  • 本ドライバはタブレットの動作モードを HID 非準拠モードに切り替えます。このモードはマシン再起動後も継続されるようです。 再びusbhid ドライバを使用する場合は、タブレットの USB ケーブルを一旦取り外して下さい。
  • Waltop社及びプリンストン社は本ドライバの開発には直接関係していません。本ドライバに関するご意見・ご要望はこちらにお寄せください。

ダウンロード

バージョンファイルサイズ公開日時ライセンス
0.0.7 waltop-0.0.7.tar.gz 10.7KB 2015/07/15 GPL (or later)
0.0.6 waltop-0.0.6.tar.gz 8.9KB 2015/05/07 GPL (or later)
0.0.5c waltop-0.0.5c.tar.gz 7.8KB 2015/03/28 GPL (or later)

 

Linuxのペンタブに関するメモ

最近のLinuxではペンタブをUSBに繋ぐだけで直ぐ使えるようになっています。ただ、ワコム以外のマイナーなペンタブを使用する場合や、必要最小限のパッケージしかインストールしていない環境でペンタブを使用する場合は、ドライバのインストール&設定が必要な場合があります。

ペンタブを使うためにはドライバが「2つ」必要

GIMPやKritaなどX Window System上で動くアプリでペンタブを使うには2つのドライバが必要になります。1つはLinuxカーネル用のドライバ(カーネルモジュールとも言います)、もう1つはX Window System用のドライバです。

Linuxカーネル用のペンタブドライバ

使用するペンタブに対応したカーネルドライバが必要になります。

  • linuxwacom

    ワコムのペンタブドライバを開発しているプロジェクトです。このプロジェクトで開発されたドライバはLinuxカーネルに同梱されています。サポートしているペンタブの一覧はこちら

  • DIGImend

    ワコム以外のペンタブ用ドライバを開発しているプロジェクトです。こちらもLinuxカーネルに同梱されています。サボートしているペンタブはこちらで確認できます。プリンストンのペンタブを幾つかサポートしています。

  • このブログで公開しているドライバ

    Waltop製のチップを使用したペンタブ(プリンストンペンタブレットが該当します)用のドライバです。Linuxカーネルには同梱されておらず、こちらのページからダウンロードする必要があります。Linuxに同梱されたドライバより高い性能を引き出すことが出来ます。

  • 製造元が提供しているドライバ

    上記以外にもメーカーがHPでカーネルドライバを配布している場合があります。

X Window System用のペンタブドライバ

X用のドライバは以下の3つから好きなものを選びます。

  • xf86-input-wacom / xorg-x11-drv-wacom

    wacomという文字が入っていますがワコム以外のペンタブでも使えます。細かな設定が可能なので特に理由がなければこのドライバを推奨します。大抵のシステムでは標準でインストールされています。

  • xf86-input-evdev / xorg-x11-drv-evdev

    様々な入力デバイスに対応した汎用ドライバです。汎用なのでxf86-input-wacomほど細かくカスタマイズできません。X Serverと一緒にインストールされているはずです。詳細はman evdevコマンドで確認できます。

  • WizardPen

    wacomドライバやevdevドライバで動かない時に使っていたのですが、最近では使うことも無くなりました。

どのカーネルドライバが使用されているか調べる

Linuxでペンタブが使えない場合、まずはlsusbコマンドでシステムに接続されているUSBデバイスを一覧表示します。私の環境では次のような結果が表示されました。

$ lsusb
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 006: ID 172f:0502 Waltop International Corp. Sirius Battery Free Tablet
Bus 001 Device 004: ID 099a:0638 Zippy Technology Corp. Sanwa Supply Inc. Small Keyboard
Bus 001 Device 003: ID 12cf:0181 DEXIN 
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ペンタブがUSBポートにしっかり接続されおり、故障していないなら「それっぽい」表示があるはずです(ペンタブ毎に表示が異なります)。この場合、"Bus 001"の"Device 006"に"Waltop ... Tablet"という表記があることからWALTOP製のペンタブが接続されていることが分かります(ワコム製のペンタブの場合は"Wacom Co., Ltd"等と出力されるようです(未確認))。また、"ID"から、このペンタブのデバイスIDが"172f:0502"であることが分かります。カーネルドライバがどのデバイスIDのペンタブをサポートしているかはこちらで確認出来ます。カーネルのバーションはuname -rで調べられます。

次にlsusb -tで各デバイスにどのカーネルドライバが使われているか確認します。

$ lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
        |__ Port 3: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 4: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 4: Dev 4, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 6: Dev 6, If 0, Class=Human Interface Device, Driver=usbhid, 12M

先程の結果からペンタブが"Bus 001"に"Device 006"として接続されていることが分かっているので、それを基にツリーを辿って行くと、このペンタブには"usbhid"というドライバが使われていることが分かります(ワコムのペンタブの場合は"wacom"というドライバが使われるはずです(未確認))。もし"Driver"に何も表示がなければ、対応するカーネルドライバが無いため使用できません。カーネルをアップデートするか、メーカーのHPにドライバが無いか探して見ましょう。

どのXドライバが使われているか調べる

ペンタブにどのX用ドライバが使われているかは次のコマンドで確認します。

$ grep -i "using input driver" /var/log/Xorg.0.log
[    14.620] (II) Using input driver 'evdev' for 'Power Button'
[    14.646] (II) Using input driver 'evdev' for 'Power Button'
[    14.647] (II) Using input driver 'evdev' for 'Dexin Corp. Flying Wheel Mouse'
[    14.701] (II) Using input driver 'evdev' for 'USB Keyboard'
[    14.702] (II) Using input driver 'evdev' for 'USB Keyboard'
[    14.715] (II) Using input driver 'wacom' for '         WALTOP     Batteryless Tablet '
[    14.771] (II) Using input driver 'evdev' for '         WALTOP     Batteryless Tablet '
[    14.772] (II) Using input driver 'evdev' for '         WALTOP     Batteryless Tablet '
[    14.779] (II) Using input driver 'wacom' for '         WALTOP     Batteryless Tablet  eraser'

WALTOPのペンタブにwacomドライバとevdevドライバが使われていることが分かります。wacomやevdevはカーネルドライバにもXドライバにも存在しますが、ここで表示されるのはXドライバの方です(ややこしい)。あと、よく分からないのですが、1つのデバイスに対して複数のドライバが使われることがあるようです。

もしXのwacomドライバを使用しているのなら次のコマンドでドライバが認識しているペンタブの一覧を表示することが出来ます。

$ xsetwacom --list devices
         WALTOP     Batteryless Tablet  stylus	id: 11	type: STYLUS    
         WALTOP     Batteryless Tablet  eraser	id: 14	type: ERASER 

カーネルは認識しているのにXが認識しない場合

カーネルは認識しているのにXが認識しない、認識しているが意図しないXドライバが使わている場合、Xの設定を変更する必要があります。私の環境(Arch Linux)では、WALTOP製のタブレットwacomドライバ(xf86-input-wacom)を使用する場合、以下の設定が必要でした。例えばWaltop製タブレットにxf86-input-wacomドライバを使用する場合、次のような設定ファイルを作成する必要があります(通常はxf86-input-wacomパッケージをインストールした時点で作成されます)。

/etc/X11/xorg.conf.d/10-wacom.conf
/usr/share/X11/xorg.conf.d/50-wacom.conf Section "InputClass" Identifier "Waltop class" MatchProduct "WALTOP" MatchIsTablet "on" MatchDevicePath "/dev/input/event*" Driver "wacom" EndSection

さらに詳しい情報はArch Wiki等を参照して下さい。

ペンタブでカーソル移動はできるのに筆圧が効かない場合

筆圧を利用するのに特別な設定が必要なアプリがあります。

  • GIMP

    メニューの"編集">"入力デバイスの設定"で筆圧を有効にしたいデバイスを選択し、
    "モード"を"スクリーン"か"ウィンドウ"のどちらかに設定

  • Krita

    設定の必要なし

  • MyPaint

    設定の必要なし

  • AzPainter / AzDrawing

    設定の必要なし

特定の要素だけインデントしないJSONエンコーダー (Python3)

自分だけかもしれないが、ちょっとした自作プログラムでデータ編集用にリストビューやツリービュー的な GUI が必要だが面倒臭いので作りたくない場合、

  1. プログラムを実行
  2. JSON 形式でデータを出力
  3. テキストエディタJSONファイルを編集
  4. プログラムで 3 のデータを読み込んで何らかの処理を行う

というのをやる。

自分は Python でプログラムを書くので Python オブジェクトを json.dump() でJSON 形式にエンコードして保存する。しかしこのメソッドは「全ての要素をインデントする」か「全ての要素をインデントしない」かのどちらかしか選べない。インデント無しだと当然見辛いが、全てインデントされているのもちょっと見辛いし編集しにくかったりする。

個人的には

  • 特定の要素だけインデントしない
  • ネストが深さn以上ならインデントしない
  • 子要素がn個以下の要素はインデントしない

などの設定が出来ると嬉しい。

ちょっと調べてみたけれど、このような設定の出来る prettyprinter は見つからなかった。ただ、 PythonJSON エンコーダーを拡張することで、特定のオブジェクトだけインデント無しに出来る方法はあるようだ。

Can I implement custom indentation for pretty-printing in Python’s JSON module? - Stack Overflow

次のPythonスクリプトは上記URLの一番下の回答コードをPython3で動くように微修正したもの。

# from http://stackoverflow.com/questions/13249415/can-i-implement-custom-indentation-for-pretty-printing-in-python-s-json-module

import json
import uuid

class NoIndent(object):
	def __init__(self, value):
		self.value = value

class NoIndentEncoder(json.JSONEncoder):
	def __init__(self, *args, **kwargs):
		super(NoIndentEncoder, self).__init__(*args, **kwargs)
		self.kwargs = dict(kwargs)
		del self.kwargs['indent']
		self._replacement_map = {}

	def default(self, o):
		if isinstance(o, NoIndent):
			key = uuid.uuid4().hex
			self._replacement_map[key] = json.dumps(o.value, **self.kwargs)
			return "@@%s@@" % (key,)
		else:
			return super(NoIndentEncoder, self).default(o)

	def encode(self, o):
		result = super(NoIndentEncoder, self).encode(o)
		for k, v in self._replacement_map.items():
			result = result.replace('"@@%s@@"' % (k,), v)
		return result

Python デフォルトの JSON エンコーダーを使ってインデント 4 でエンコードすると全ての要素がインデントされる

obj = {"a": 1, "b": [1, 2, 3], "c":{"A": [1, 2, [3, 4, 5]], "B": "XYZ", "C": 3}}
print(json.dumps(obj, sort_keys=True, indent=4))

---------- 結果 ----------
{
    "a": 1,
    "b": [
        1,
        2,
        3
    ],
    "c": {
        "A": [
            1,
            2,
            [
                3,
                4,
                5
            ]
        ],
        "B": "XYZ",
        "C": 3
    }
}

インデントしたくない要素を先ほど定義した NoIndent クラスのオブジェクトにし、 JSON エンコーダーに NoIndentEncoder クラスを指定すると次のようになる。

obj = {"a": 1, "b": [1, 2, 3], "c": NoIndent({"A": [1, 2, [3, 4, 5]], "B": "XYZ", "C": 3})}
print(json.dumps(obj, sort_keys=True, indent=4, cls=NoIndentEncoder))

---------- 結果 ----------
{
    "a": 1,
    "b": [
        1,
        2,
        3
    ],
    "c": {"A": [1, 2, [3, 4, 5]], "B": "XYZ", "C": 3}
}