tanihito’s blog

デジタル・新規事業開発・健康など、興味のあることについてつらつらと書いてきます。

Java開発環境の設定

自分のJava開発環境についてまとめました。もっといいツールが見つかれば更新します。

Tomcat

$ wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-6/v6.0.33/bin/apache-tomcat-6.0.33.tar.gz
$ tar xzvf apache-tomcat-6.0.33.tar.gz
$ mkdir -p /usr/local/app/apache-tomcat-6.0.33
$ ln -snf /usr/local/app/apache-tomcat-6.0.33 /usr/local/app/tomcat

Eclipse

設定
  • メニューの英語化
    • eclipse.iniに以下の2行を追加
-Duser.language=en
-Duser.country=US
  • 行番号の表示
    • Preferences -> General -> Editors -> TextEditors -> Show line numbers
  • どこで「;」「{」「}」を押しても行末にいれてくれる
    • Preferences -> Java -> Editor -> Typing -> Automatically insert at correct position -> Semicolons, Braces
  • 保存時にimportを修正
    • Preferences -> Java -> Editor -> Save Actions -> Organize imports
  • 改行コード
    • Preferences -> General -> Workspace -> New text file line delimiter
  • 文字コード
    • Preferences -> General -> Workspace -> Text file encoding
  • 自動でリフレッシュ
    • Preferences -> General -> Workspace -> Refresh On Access

Pythonの文字列の話

エキスパートPythonプログラミング読書会19に参加して、Unicodeの話を聞いてきました。自分が理解できた範囲でメモしておきます。decode(), encode(), io.open()を使いこなせるようになれば、UnicodeErrorに困ることも減るのでは、と感じました。

文字列にはstr型 (バイト文字列) とunicode型 (ユニコード文字列) の2種類がある。

>>> type('こんにちは')
<type 'str'>
>>> type(u'こんにちは')
<type 'unicode'>

str型の文字列は思い通りの文字列処理ができない。unicode型を使うべき。

>>> len('こんにちは')
15
>>> len(u'こんにちは')
5

str型→unicode型には、decode()を、unicode型→str型にはencode()を使う。

>>> u = 'こんにちは'.decode('utf-8')
>>> type(u)
<type 'unicode'>
>>> s = u'こんにちは'.encode('utf-8')
>>> type(s)
<type 'str'>

decode()とencode()を間違えるとエラーになる。

>>> 'こんにちは'.encode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
>>> u'こんにちは'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128) 

unicode型の内部表現にはUTF-16UTF-32がある。sys.maxunicodeが65536ならUTF-16、1114111ならUTF-32

>>> import sys
>>> sys.maxunicode
1114111

str型とunicode型の変換でデフォルトで使用されるエンコーディングはascii。

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> u = 'こんにちは'.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

デフォルトエンコーディングを変更できるが、問題の原因を見つけにくくなるのでやらない

>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> sys.getdefaultencoding()
'utf-8'
>>> u = 'こんにちは'.decode()
>>> type(u)
<type 'unicode'>

io.open()を使うと、unicode型で読み書きできる。

>>> f = open('foo.txt')
>>> line = f.readline()
>>> type(line)
<type 'str'>
>>> import io
>>> f = io.open('foo.txt')
>>> line = f.readline()
>>> type(line)
<type 'unicode'>

Python3では文字列がunicode型にまとめられ、文字列処理が簡単になった。しかし、まだPython3に対応していないライブラリも多い。どのライブラリが対応しているかはPython 3 Support on PyPIから確認できる。

Gow + NYAOS + ckw-mod でコマンドプロンプトをLinuxのように使う

最近はWindowsで開発することが多いのですが、Windowsコマンドプロンプトは使いにくくてイライラします。かといって、Cygwinを入れるのも面倒だし…。そこで、Windowsで手軽にLinux風シェルを使う方法を紹介します。

  1. Gowをダウンロードし、実行
  2. ckw-mod-0.9.0-d2.zipをダウンロードし、解凍
  3. nyaos-3.0.0_1-win.zipをダウンロードし、解凍
  4. nyaos-3.0.0_1-winディレクトリをckw-mod-0.9.0-d2ディレクトリに移動
  5. ckw.cfgを編集
    • 「Ckw*exec: cmd.exe」→「Ckw*exec: nyaos-3.0.0_1-win\nyaos.exe」
  6. フォントなどの追加設定
    • ckw.cfg
      • 「Ckw*font: MS Gothic」→「Ckw*font: Consolas
      • 「Ckw*fontSize: 12」→「Ckw*fontSize: 14」
    • _nya
      • 「option prompt $e[31;40;1m[$w]$_$$ $e[37;1m」→「option prompt $e[31;40;1m[$p]$_$$ $e[37;1m」

これで、Linuxコマンドや補完の使えるシェルの完成です。ckw.exeを実行してみてください。

PyCon JP 2011 に行ってきました

自分が見たセッションの内容をまとめました。その他のセッションについては、aodagさんの資料まとめやnokunoさんの内容まとめをみてください。

Keynote

  • パッケージング
    • 今のパッケージングは複雑なので、新しくpysetupを作っている。Python3.3またはdistutils2で使える。詳細はPEP376
  • pysetupの特徴
    • パッケージのアンインストール可能
    • setup.pyに加えて、setup.cfgを書く
    • データファイルの管理
      • 現状
import os.path
here = os.path.dirname(__file__)
pic = open(os.path.jpoin(here, 'pic.jpg'))
      • pysetup
# データファイルの場所はsetup.cfgとsysconfig.cfgに記述しておく
from packageing.database import get_file
pic = get_file('MyProject', 'pic,jpg')
  • バージョンのつけ方
    • PEP386に準拠するべき
    • 1.1 < 1.2a1 < 1.2 < 1.3.dev2 < 1.3 < 1.3.2
  • Python3
    • Python3.0にはバグがあるから使わない。Python3.3から使いましょう。

C APIへの誘い

Asynchronous Python Programming

  • Blocking I/O
    • スレッド:GILがあるので普通は使わない
    • プロセス:スレッドよりもプロセスを使う
  • Non-Blocking I/O
    • コルーチン:greenletなど
    • Events (select/epoll):Twistedなど
  • 結論
    • 様々な手法を組み合わせて使おう。
    • CeleryTwistedが便利だよ。

Python と MongoDB でWEB開発

PyQtではじめるGUIプログラミング

  • Qtの特徴
    • 読み方は「キュート」
    • SIGNAL/SLOTを使い、イベントを結び付けてプログラミングする
  • アプリケーション作成の流れ
    1. コンセプトを決める:重要と思う点を列挙する
    2. コンセプトに基づいてGUIをデザインする:紙と鉛筆を使う。
    3. GUIコンポーネントを積み重ねて構成する:Webページをtableタグでデザインするのと似ている。
    4. コンポーネントの親子関係を図にする
    5. コンポーネントの相互作用を図にする
    6. 図を見ながらプログラミング!
  • 開発ツール
    • Qt Assistant:ドキュメントをローカルで読める。
    • Qt Designer:GUI作成ツール。上級者向け。
  • 次のステップへ
    • 日本語書籍はあまりない
    • Qtはドキュメントが充実しているので読もう

Pythonで1万台のiPhoneを管理する

Pythonによる日本語自然言語処理

Tuning Python Code

High Performance PythonというEuroPython 2011の資料が分かりやすい。

モニタリングツール

まずはモニタリングツールを使い、Disk I/Oなどのボトルネックを調べる。

$ strace -c python -c "print 'hello'"
プロファイラ

CPUがボトルネックだと分かった場合はプロファイラを使い、コードの中のボトルネックを調べる。PythonレベルとCレベル、両方のプロファイラに慣れておくとよい。
Pythonレベル (cProfile)

$ python -m cProfile myapp.py

Cレベル (perf)

$ perf record python myscript.py
$ perf report

可視化ツール (Run Snake Run)

$ python -m cProfile -o callgrind.out myapp.py
$ runsnake callgrind.out
高速化
  • 正しいアルゴリズムとデータ構造を選択する
    • dict, tuple, list, deque, heapq, ...
  • 実行するバイトコードを減らす
    • ループの代わりに組み込み関数を使う
    • functools, itertools, collections, heapq, bisect,...
  • 辞書の読み込みを減らす
    • グローバル関数をローカル関数に移す
X = 1
def foo():
    """グローバル変数Xを直接参照。遅い。"""
    for _ in xrange(100):
        X

def bar():
    """1度ローカル変数xに代入し、ローカル変数を参照。早い。"""
    x = X
    for _ in xrange(100):
        x
  • 循環参照をなくす
    • 不要になった循環参照を切る。
def foo():
    """循環参照。GCの際に遅くなる。"""
    for _ in xrange(1000000):
        x = []
        y = [x]
        x.append(y)

def bar():
    """不要になった循環参照を切る。"""
    for _ in xrange(1000000):
        x = []
        y = [x]
        x.append(y)
        del x[:]

その他

感想

ランチやコーヒーブレイクなどの交流機会があり、多くの人と話せました。一番嬉しかったのはエキPy著者のTarekに会えたことです。さすが「出会い系Python」ですね!1人で参加したのでどうなるか心配でしたが、とても楽しめました。
それと、懇親会でTシャツを頂きました、ありがとうございます!

反省点
  • 名刺を作る:初対面の人と話すときには、やっぱり名刺が便利。
  • Macを買う:今回のMac率は約80%(当社比)。やっぱりプログラマーMacなのかな。

TOEICを600点から900点に上げるための英語勉強法

最近やっとTOEICで900点を超えることができました。記念に私の英語勉強方法をメモしておきます。

600点以下のとき

勉強すれば点数は上がります。どうやって勉強するか分からん!という人は『TOEICテスト900点・TOEFLテスト250点への王道』を読んでみてください。基本的な勉強方法は載っていますし、英語に対するモチベーションも上がります。

600〜800点のとき

リーディングについては、とにかく単語を覚えましょう。その際、私は『必ず覚えられるTOEFLテスト英単語3400』という単語帳を使っていました。この本では単語1つ1つにゴロ・語源・例文などがついており、記憶しやすいように工夫されています。また、「短期大量」という記憶のメカニズムに基づいた暗記方法も紹介されているため、暗記全般に役立ちます。TOEFLを対象にしていますが、TOEFLが解ければTOEICも解けるので問題ありません。

リスニングで一番おすすめの教材はESL Podcastです。日本語は一切ありませんが、簡単な単語で内容を説明してくれるので理解できます。これを会話が完全に分かるまで何度も聞いていました。また、・1回のリスニングが適度に長い・リスニングのボリュームが多い・内容が面白いという点で以下の教材も良かったです。

800〜900点のとき

英語を勉強するのではなく、英語で勉強する段階だと思います。多読・多聴してできるだけ多くの英語に触れましょう。

リーディング能力を高めるためには、英語の本を買って読んでいました。最初はつらいですが3冊目あたりからすらすら読めるようになります。本の内容はなんでもいいので、自分の興味ある本(日本語で書かれていたら読みたい本)にしてください。私が面白いと思った本を一応挙げておきます。

  • 59 Seconds:どうすれば幸せになれるのか?正しいストレス対処法は?などの疑問に科学的にこたえた本。
  • Presentation Zen:聴衆の記憶に残るプレゼンテーションをする方法。

リスニングは、TEDでプレゼンを見たり、超字幕で『You've Got Mail』などの映画を見たりしました。同じ動画を分かるまで何回も見て、シャドーイングするのが大事だと思います。