入門GNU Emacs(10章)

emacsのカスタマイズ方法は3つあるが、どの方法でも.emacsが編集される

  1. Customを使う
  2. Optionを使う(裏ではCustomeが実行される)
  3. .emacsを編集する

Customを使う

  1. M-x customize Enter を実行し、Customを起動する
  2. ハイパーリンク(?)を辿って、設定したい項目を編集する
  3. 設定した項目の[State] or ページ上部の共通オプションから変更した内容を反映する

一つ一つリンクを辿るのではなく以下のような方法で直接編集画面にも飛べる

  • M-x customize-option を使って、目的の項目を表示(Tabで自動補完が使える)
  • M-x customize-apropos を使って、正規表現マッチングで設定項目を表示

.emacsを使う

.emacs はスタートアップファイルと呼ばれるもので、以下のようなものが存在する。

名称 役割
.emacs.elc .emacs をバイトコンパイルしたもので直接編集することは出来ない
.emacs.el 正式な名前のスタートアップファイル
.emacs よく使われる名前のスタートアップファイル

Emacs は表の上から順にスタートアップファイルを探し、
最初に見つかったものを読み込んだらそれ以降のファイルは読み込まない。
なので、複数のファイルに散らして設定を行うことはできない。


また、emacs の起動時に "-q" オプションを渡すと、スタートアップファイルを読み込まないで起動する。
.emacs が間違っていて emacs が起動しなくなった時に、.emacsデバッグ・修正出来る。

その他

3章で扱った内容だったが、その時は関係ないかなぁと思ってスルーした「動的略称機能」。
ちゃんと読んでみると補完機能*1だ。

キーバインド 機能
M-/ 編集中のバッファにある文字列から編集中の文字列を補完する

参考サイト

.emacsのサンプル@The very unofficial dotemacs home

入門 GNU Emacs 第3版

入門 GNU Emacs 第3版

*1:とはいえ、編集中のバッファに対する補完だから、モジュールが分かれてる場合は機能しないか

Pythonクックブック(1章)

初めてのPythonを一通り読み終えたので、今度は実践的なコードを読んで勉強してみる。

今の自分に理解できる部分がどれぐらいあるかな。

オブジェクトの型判定

あるオブジェクトがどのクラスのインスタンスかを判定するにはisinstance()を使う。
type()の復帰値とis演算子を使うのはポルモーフィズムを壊すため良くない方法。

type()の復帰値は引数の型を返すので、決まりきった型との比較しか出来ない。
以下の場合は、文字列オブジェクト以外が渡されるとFalseとなる。

type(object) is type('')

isinstance()の場合、サブクラスの場合もちゃんとTrueと返してくれる。

[kobakoba0723@fedora13-intel64 ~]$ cat isstring.py
#!/usr/bin/env python


class SubString(str):
    def __init__(self, string):
        str.__init__(self)
        self.data = string

    def __repr__(self):
        return self.data


def isAString(object):
    return isinstance(object, basestring)


def isExactlyString(object):
    return type(object) is type('')


s = "hoge"
print '%s is a string ? ->' % (s, ), isAString(s)
print '%s is a exactly string ? ->' % (s, ), isExactlyString(s)

instance = SubString("piyo")
print '%s is a string ? ->' % (instance, ), isAString(instance)
print '%s is a exactly string ? ->' % (instance, ), isExactlyString(instance)
[kobakoba0723@fedora13-intel64 ~]$ python isstring.py
hoge is a string ? -> True
hoge is a exactly string ? -> True
piyo is a string ? -> True
piyo is a exactly string ? -> False
[kobakoba0723@fedora13-intel64 ~]$ 

Pythonの型判定に対する一般的な方法はduck typingと呼ばれる方法で、

If it walks like a duck and quacks like a duck, it must be a duck
"アヒルのように歩き、アヒルのようにガーガー鳴くなら十分アヒルだ"

ある型の特徴的な演算が出来るのであれば、同一の型だと見なすってことなのかな。

文字列の連結

小さな文字列をつなげて大きな文字列を作る時には、join()を使うのが良い方法*1
あと、複数の変数の連結時に定数的なテキストをいくつか間に挟みたい時には%演算子を使うのが良い。
いずれの場合も+演算子を使うのはおすすめされていない。

文字列はimmutableなオブジェクトなので、文字列に対する演算は必ず新しい文字列の生成を伴う。
str.join()を使うと、引数として与えたシーケンスをstrで連結した文字列を一度に返してくれるので、
中間文字列の生成を伴わない分処理が早い。
%演算子の場合、処理速度というよりも、色々な書式を変換して結合できたり、桁数の制御が出来ることが利点

join()を使うと1桁程度速度の違いが出る。

[kobakoba0723@fedora13-intel64 ~]$ cat combinestr.py 
#!/usr/bin/env python

import random
import time

list_a = []
list_b = []

for i in range(50):
    list_a.append(chr(random.randint(33, 126)) * 5)
for i in range(50):
    list_b.append(chr(random.randint(33, 126)) * 5)

string1 = ''
string2 = ''
start_time = time.time()
for char in list_a:
    string1 += char
for char in list_b:
    string2 += char
end_time = time.time()
operator_time = end_time - start_time

string1 = ''
string2 = ''
start_time = time.time()
string1 = ''.join(list_a)
string2 = ''.join(list_a)
end_time = time.time()
join_time = end_time - start_time

print '=' * 10
print 'Combine Character in List as String'
print '\toperator: %e, join: %e' % (operator_time, join_time)
print '=' * 10

large_string = ''
start_time = time.time()
large_string = string1 + 'hoge' + string2 + 'piyo'
end_time = time.time()
plus_operator_time = end_time - start_time

large_string = ''
start_time = time.time()
large_string = "%s hoge %s piyo" % (string1, string2)
end_time = time.time()
percent_operator_time = end_time - start_time

print '=' * 10
print 'Combine String'
print '\tplus: %e, percent: %e' % (plus_operator_time, percent_operator_time)
print '=' * 10
[kobakoba0723@fedora13-intel64 ~]$ python combinestr.py 
==========
Combine Character in List as String
	operator: 3.314018e-05, join: 4.053116e-06
==========
==========
Combine String
	plus: 1.907349e-06, percent: 3.099442e-06
==========
[kobakoba0723@fedora13-intel64 ~]$ 

その他

Pythonの評価方法に対するアプローチはEAFPというものらしく、

is's Easy to Ask Forgiveness than Permission.
'ごめんなさいはお願いしますよりも楽'

読み始める前の懸念についていえば、
半分ぐらいは理解できた気がするけど、全く意味が分からないレシピもある。
それに、理解はできるけど使うケースが想定できないってのもいっぱいある。
自分でコードを書くようになると違ってくるんだろうなぁ。

Python クックブック 第2版

Python クックブック 第2版

*1:この方法は、PEP8にもおすすめの方法として載ってた。