カテゴリー別アーカイブ: Linux

Python3の文字列(ユニコード)とバイト列

    文字列str(unicode(point))
decode↑ ↓encode
    バイト列bytes(utf-8, latin-1, cp932, etc...)

HOWTOに載ってるTips

“最も重要なTipsは
ソフトウェア内の処理ではUniucode文字列のみ使用すること、インプットデータを出来るだけ早くデコードすること、そして、アウトプット時のみエンコードを指定すること”

同じHOWTOに載ってるサンプル
入出力時のみエンコードにasciiを指定しています。
また、errorsでsurrogateescapeを指定してasciiでエラーが出た場合はUnicodeの代替用コードに置き換えられ、デコード時にはもとのバイト列に戻るようになっています。

#入力
with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()
 
#処理
# make changes to the string 'data'
 
#出力
with open(fname + '.new', 'w', encoding="ascii", errors="surrogateescape") as f:
    f.write(data)
#バイト列を返す場合
return data.encode(encoding="ascii", errors="surrogateescape")

Pythonのコンパイルに必要なパッケージ

Python 3.3.2

Package Debian CentOS
_bz2 libbz2-dev bzip2-devel
_curses(_curses_panel) libncurses5-dev bzip2-devel
_dbm(_gdbm) libgdbm-dev gdbm-devel
_lzma liblzma-dev xz-devel
_sqlite3 libsqlite3-dev sqlite-devel
_ssl libssl-dev openssl-devel
_tkinter tk-dev tk-devel
readline libreadline-dev readline-devel
zlib zlibc zlib-devel

#!/bin/bash
#For Debian
apt-get install libbz2-dev \
                     libncurses5-dev \
                     libgdbm-dev \
                     liblzma-dev \
                     libsqlite3-dev \
                     libssl-dev \
                     tk-dev \
                     libreadline-dev \
                     zlibc
#!/bin/bash
#For CentOS
yum install bzip2-devel \
                     ncurses-devel \
                     gdbm-devel \
                     xz-devel \
                     sqlite-devel \
                     openssl-devel \
                     tk-devel \
                     readline-devel \
                     zlib-devel

$./configure --prefix="/opt/python3/" --enable-shared
$make
$sudo make install

/etc/ld.so.conf.d/python3.conf
/opt/python3/lib

$sudo ldconfig

dnsmasqのキャッシュDNSサーバ指定とOpenDNS無効化

Ubuntu(13)もしくはLinuxMint(14 Nadia)を利用してる前提です。
手順
1.GUIのネットワークの設定から使用しているインターフェイスを選び、以下を設定を変更する
・DHCPの設定を自動、アドレスのみに変更。
・DNSサーバに使用したいキャッシュDNSサーバのアドレスを入力。
2./etc/resolvconf/resolv.conf.d/tailを直接編集してdnsserver部分をコメントアウトする。(Mintのみ)

調べたこと
1. dnsmasqが動いている。(Mint、ubuntu共通)
2. /etc/resolv.confは各設定をもとに動的に生成されるので直接触らない。(Mint、ubuntu共通)
3. 設定されたキャッシュDNSサーバから応答が無い場合、OpenDNSが使われる(Mintのみ)

1について
dnsmasqのマニュアルをみると、軽量なdhcpクライアント アンド キャッシュDNSサーバです。とありますが
少なくともOSインストール直後の設定ではDNSの再帰的問い合わせもキャッシュもしておらず、単なるforwarderとしてのみ動いてるぽいです。
dnsmasqは/etc/resolv.confやdhcpでもらったキャッシュDNSサーバを順番に試していきます(man dnsmasq)。
なので、dnsmasqの参照先から要らないものを除いて、必要なものを載せることで対応できる。

2について
/etc/resolv.confファイルは以下の手順で動的に生成される。
/etc/resolvconf/resolv.conf.d/headからはじまり、/etc/resolvconf/resolv.conf.d/tailで終わる。
間には最初にインターフェイスに設定されたDNSサーバが動的に設定され、
次(前記が無い場合?)に静的な/etc/resolvconf/resolv.conf.d/baseの設定が使われる(man resolvconf)。

3について
LinuxMintは/etc/resolvconf/resolv.conf.d/tailにOpenDNSを設定している(/etc/resolv.conf)。

dnsmasqを使わない方法もあるけど、どこまで絡んでるのか分からなかったので、そのまま使うようにしました。

備考
DNS hijacked in default installation by OpenDNS
MintのOpenDNSについて、ここではセキュリティ問題を抱えたバグとして報告されています。
コメントにはOpenDNSの役員がデフォルトで使用されるべきではないとも指摘しています。本人かどうかわかんないけど。