4.30.2011

TopCoder

TopCoderに登録してみる。
http://www.topcoder.com/

英語を読むのにも一苦労。全く勝てる気がしないが・・・

4.29.2011

Pylint configuration file

Pylint コンフィグファイル

eclipse で Pylint の設定をするとき、「—indent-string="○○"」(※○は半角スペース)と設定しても、Pylint 実行時にはスペースの数が2個ではなく1個になってしまう。

そこで、コンフィグファイルを作成しそれを編集して読み込ませることにした。
以下のようなパス検索が行われているようだ。

カレントディレクトリ/pylintrc
・環境変数「PYLINTRC」で定義されているパス
ホームディレクトリ/.pylintrc
・/etc/pylintrc

・config.py(76行目~)

# location of the configuration file ##########################################


def find_pylintrc():
    """search the pylint rc file and return its path if it find it, else None
    """
    # is there a pylint rc file in the current directory ?
    if exists('pylintrc'):
        return abspath('pylintrc')
    if isfile('__init__.py'):
        curdir = abspath(os.getcwd())
        while isfile(join(curdir, '__init__.py')):
            curdir = abspath(join(curdir, '..'))
            if isfile(join(curdir, 'pylintrc')):
                return join(curdir, 'pylintrc')
    if 'PYLINTRC' in os.environ and exists(os.environ['PYLINTRC']):
        pylintrc = os.environ['PYLINTRC']
    else:
        user_home = expanduser('~')
        if user_home == '~' or user_home == '/root':
            pylintrc = ".pylintrc"
        else:
            pylintrc = join(user_home, '.pylintrc')
    if not isfile(pylintrc):
        if isfile('/etc/pylintrc'):
            pylintrc = '/etc/pylintrc'
        else:
            pylintrc = None
    return pylintrc

PYLINTRC = find_pylintrc()

ENV_HELP = '''
The following environment variables are used :                                 
    * PYLINTHOME                                                               
    path to the directory where data of persistent run will be stored. If not
found, it defaults to ~/.pylint.d/ or .pylint.d (in the current working
directory).
    * PYLINTRC                                                                 
    path to the configuration file. If not found, it will use the first        
existent file in ~/.pylintrc, /etc/pylintrc.
''' % globals()

コンフィグファイルの作成には、「pylint --generate-rcfile」を行えばよい。
たとえば、Windowsマシンで Python が Eドライブにある場合、このように作成する。

   1: e:\>mkdir \etc
   2:  
   3: e:\>pylint --generate-rcfile > \etc\pylintrc
   4:  
   5: e:\>

4.25.2011

How to get umask of running process in Solaris

Solaris: 稼働中プロセスの umask 値を取得する

mdbで実現可能。

# mdb –k
> ::pgrep プロセス名
> アドレス::print –t proc_t p_user.u_cmask

プロセスIDから「pid2proc」を使って検索してもよい。
> 0tプロセスID::pid2proc | ::print –t proc_t p_user.u_cmask

proc_t 全部を出力し、OSコマンドの「grep」で抽出することもできる。
> アドレス::print –t proc_t ! grep u_cmask

これらで出力されるのは、いずれも16進数の値。
「umask」などで表示される8進数の形式に直すと、下記の例だと「022」となる。
(0x12 <16進数> = 022 <8進数>)

・実行例
   1: # mdb -k
   2: Loading modules: [ unix krtld genunix specfs dtrace cpu.generic uppc pcplusmp zfs mpt ip hook neti sctp arp usba uhci fctl nca lofs cpc random crypto fcip logindmux ptm ufs sppp nfs ]
   3: > ::pgrep sshd
   4: S    PID   PPID   PGID    SID    UID      FLAGS     ADDR NAME
   5: R    512      1    512    512      0 0x42000000 dff67140 sshd
   6: > dff67140::print -t proc_t p_user.u_cmask
   7: mode_t p_user.u_cmask = 0x12
   8: > 0t512::pid2proc | ::print -t proc_t p_user.u_cmask
   9: mode_t p_user.u_cmask = 0x12
  10: > 0t512::pid2proc | ::print -t proc_t ! grep u_cmask
  11:         mode_t u_cmask = 0x12
  12: > $q
  13:  
  14: #

参考
http://cmynhier.blogspot.com/2006_08_01_archive.html

4.24.2011

mogmail with Python

Python版mogmail

・mogmail.py

   1: # Copyright (c) 2011 Mog Project. All rights reserved.
   2: import poplib
   3: import email
   4: from email.header import make_header
   5: from email.header import decode_header
   6: from email.utils import parsedate_tz
   7: from email.utils import mktime_tz
   8: import time
   9:  
  10: POP3_SERVER = 'POP3-Server'
  11: POP3_PORT = 110
  12: POP3_USERNAME = 'UserName'
  13: POP3_PASSWORD = 'Password'
  14: LIST_COUNT = 5
  15:  
  16: def main():
  17:   pop3 = poplib.POP3(POP3_SERVER, POP3_PORT)
  18:   pop3.apop(POP3_USERNAME, POP3_PASSWORD)
  19:  
  20:   for p in pop3.list()[1][:-1 - LIST_COUNT:-1]:
  21:     msg_no = p.split(' ')[0]
  22:     msg = email.message_from_string('\n'.join(pop3.retr(msg_no)[1]))
  23:  
  24:     f = lambda str: unicode(make_header(decode_header(msg[str])))
  25:  
  26:     try:
  27:       print time.strftime('[%m/%d %H:%M]',
  28:           time.localtime(mktime_tz(parsedate_tz(f('Date'))))),
  29:       print '%s\n  %s' % (
  30:           f('From').replace('"', ''), f('Subject'))
  31:     except:
  32:       print '*** Error ***'
  33:  
  34: if __name__ == '__main__':
  35:   main()

POP3サーバ名および認証情報はハードコーディング。

 

[2011/10/12]
改良版はこちら:
http://mogproject.blogspot.com/2011/10/mogmail-with-python-version-11.html

4.21.2011

POP3 client using Python

Python版POP3クライアント

O'REILLY『初めてのPython 第3版』をおよそ半分くらい読んだところ。
以前C++で書いたPOP3メールのヘッダ情報を出力するプログラムを、Pythonで作ってみる。

・mogmail.py(作成途中)

   1: import poplib, email
   2:  
   3: pop3 = poplib.POP3('POP3-Server')
   4: pop3.apop('UserName', 'Password')
   5:  
   6: for p in pop3.list()[1][:-6:-1]:
   7:   msg_no = p.split(' ')[0]
   8:   msg = email.message_from_string('\n'.join(pop3.retr(msg_no)[1]))
   9:  
  10:   f = lambda str: unicode(
  11:       email.Header.make_header(email.Header.decode_header(msg[str])))
  12:  
  13:   try:
  14:     print '%s\n  %s' % (f('From'), f('Subject'))
  15:   except: pass

嫉妬する程美しい言語だ!(コードが汚いのはご勘弁・・・)
ただ、たまにBase64のデコードに失敗するのはなぜだろう。

Pythonは、今世紀のプログラミング言語の最高傑作たりえるか?

(2011/4/24)改良版 ⇒ http://mogproject.blogspot.com/2011/04/pythonmogmail.html

4.18.2011

Keyboard layout changes by left Alt + Shift

Windows: 左Alt+Shiftでキーボード配列が変わる

Windows Vistaマシンで Eclipseを使ってたら、突然キーボード入力が英語キーボード配列になってしまった。

OS側のショートカット(左Alt+Shift)で入力言語が切り替わったのが原因。

英語キーボードを使わないなら、コントロールパネルから「地域と言語のオプション」
-「キーボードと言語」-「テキスト サービスと入力言語」-「詳細なキー設定」で
入力言語のホット キーを無効にしておけば良い。

4.16.2011

How to setup PyDev with Eclipse

PyDev with Eclipse のセットアップ

Pythonの勉強は始めたばかりだが、これは面白い。
現在最も完成されたスクリプト言語であり、(日本では時間がかかるだろうが)今後の主流となっていくのであろう。
環境を整える。

IDEランキング
http://stackoverflow.com/questions/81584/what-ide-to-use-for-python

Eclipseのダウンロード・セットアップ
今回は Eclipse Classic 3.6.2 を導入
http://www.eclipse.org/downloads/

PyDevのインストール・セットアップ手順
http://www.brainchild.co.jp/blog/develop/2010/08/python-eclipse1.html

4.11.2011

stdint.h: build error C4005

stdint.h: ビルドエラー C4005

VC++ 2010 で <stdint.h> をインクルードすると警告が出る。
http://connect.microsoft.com/VisualStudio/feedback/details/621653/including-stdint-after-intsafe-generates-warnings

回避方法

   1: #ifdef _MSC_VER  // This check can be removed if you only build for Windows.
   2: #pragma warning (push)
   3: #pragma warning (disable : 4005)
   4: #include <intsafe.h>
   5: #include <stdint.h>
   6: #pragma warning (pop)
   7: #endif  // _MSC_VER

4.07.2011

Python powered

pythonのtelnetlibを使うと、TCP通信を細かくコントロールでき、
TeraTermマクロのようなことも可能となる。
http://www.python.jp/doc/2.4/lib/module-telnetlib.html

開発・メンテの効率化のため、棋譜などのファイルI/O部分、およびN/W通信部分は
全て Pythonで書き直すことに決定。

コア部分はC++。コンポーネント統合(?)についてはこれから勉強。
将棋プログラムの話。