Hello world !

2003 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 09 | 12 |
2005 | 02 | 05 |
2006 | 09 |
2007 | 05 | 08 |
2008 | 05 | 10 |
2009 | 07 |

2003-12-23 Python Tutor

[] Mail for Hina chan

 from poplib import POP3

 def biff(hostname, username, password):
   try:
     pop3 = POP3(hostname)
     pop3.user(username)
     pop3.pass_(password)
     mails,bytes = pop3.stat()
     pop3.quit()
   except:
     mails = -1 # error code
   return int(mails)

notes:

Hina chan wants to make auto-reply email programme.

I picked up subjects for her.

  • recieve mail (poplib)
  • parse mail data(mimetools, mimetype)

She told she wants her email programe to act she lives.

Well, I had small msn/irc chat bot programme before,

but, I am not sure how to computer read email ?

There are alot subjects that I did not study yet.

parse English is seem easier than parse Japaense,

(no need to care morphological parse?)

hmm, ... no idea, I will think how to make spam filter.

 if mail.address in addressbook:
   bot.replyto(mail)
 if mail.is_spam:
   trashbox += mail

2003-12-22 PNG

[] Select based server

 import socket
 import select
 import thread

 def service(server):
  iw = [server]
  ow = []
  data = {}

 while 1:
   (ins, _, exs) = select.select(iw, ow, iw)
   if exs: break
   if ins:
     for i in ins:
       if i == server: # client 接続
         client,addr = server.accept()
         iw.append(client)
       else:
         msg = i.recv(1024)
         if len(msg) == 0: # client切断
           iw.remove(i)
           i.shutdown(1)
         else:
           for j in ins:
             if j != server:
               j.send(msg)
 
 def mian(port):
   server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   server.bind*1
   server.listen(5)
   thread.start_new_thread(service, (server))

同期とかはしてない。適当にメッセージを流すだけのサーバー。

[][]

なんとか簡単な画像出力までたどり着けた。

効率わるいけど、学習用なので解りやすさ重視。


 function png_signature() {
   return pack("C8",  137, 80, 78, 71, 13, 10, 26, 10);
 }
 function png_chunk($type, $data) {
   $chunk = NULL;
   $chunk .= pack("N", sizeof(unpack("C*", $data)));
   $chunk .= $type . $data . pack("N", crc32($type. $data));
   return $chunk;
 }

 // 設定
 $width = 200;
 $height = 20;
 list($red, $green, $blue) = array(255, 0, 0);

 // 画像データ作成
 $data = NULL:
 for ($i = 0; $i < $height; ++$i) {
   $data .= pack("C", 0); // filter = 0
   for ($j = 0; $j < $width; ++$j) {
     $data .= pack("C3", $red, $geen, $blue);
   }
 }
 $data = gzcompress($data); 

 // 出力
header("Content-type: image/png");
 print png_signature();
 print png_chunk("IHDR", pack("NNC5", $width, $height, 8, 2, 0, 0, 0));
 print png_chunk("IDAT", $data);
 print png_chunk("IEND", NULL);
  ?>

*1:socket.gethostname(), port

2003-12-18 wxWindows / wxPython

[TRPG][wxWindows][wxPython]

online TRPG 用途に使える、CHAT system を作ってみる。

LIST

  • CHAT server/client
  • CHAT 上での DICE 機能
  • 黒板機能

開発 iteration

1. wxPython でプロトタイプ作成。

2. wxWindows でサンプル実装。

wxPython から wxWindowsに移植の際に、

Pythonの機能を使っている socket/thread 周りの移植の為

  • wxThread
  • Network classes (wxSocketServer, wxHTTP, wxURL)
  • Stream classes (wxSocketStream ...etc)
  • Interprocess communication (wxServer, wxClient, wxConnection)

について、簡単なサンプルを組む。

wxPython で簡単な共有黒板を作る。

draw関連のプログラムは組んだ事がなかったので、

まずはDCの使い方から学習し始める。(wxPythonで)

 def drawPoint(self, x, y):
   """panelに描画する"""
   dc = wxPaintDC(self.panel)
   dc.SetPen(wxPen("BLACK", 4))
   dc.DrawPoint(x, y)
   self.Refresh(True)
  • FIXME ... リサイズするとクリアされてしまう。
  • TODO ... wxBufferedDC を使う。

2003-12-17 Socket

C言語等にある3項演算子。

 foo = (bar > 10) ? a : b;

便利なので、Pythonでも使える方法はないかなと考えてみた。

 foo = ((bar > 10) and A) or B

これでは、Aが0や空の時に常にBが代入されるのでバグの原因に成り得る。

True=1, False=0 を利用して、bool値をtupleのインデックスとして使う。

 foo = (0, 10)[bar>10]

でも、やっぱり読みにくいコードは避けるべき。

多少冗長でも、直観的で分かりやすいよな。

 if bar > 10:
   foo = A
 else:
   foo = B

----

今更だけど、Chat server を作ってみる。

  • [*] 並列処理の学習。
  • [*] select, poll システムコール。
    • Windowsではsocketのみがselectの管理対象に。
  • [*] python 標準モジュール内のSocket関連のクラスを調査。
    • SocketServer
    • asyncore, asynchat
  • サーバーはスレッドを使わない。select basedの並列処理。

GUIとの連係。

  • クライアント側は、blocking を発生させない。
    • non-blocking
    • 通信部分を別threadにする。

Protocol:

  • 行指向なプロトコルで、
  • 先頭4文字がメッセージ・タイプ、
  • TAB区切りで
  • 以降行末までメッセージが続く。
  • データ部がない場合は、TABを省略してもよい。
  • 行末の改行コードは、\x015 \x012

とりあえずここまで実装する。

 ($type,$data) = /^([A-Z]{4})\t(.+)$/;

HELO ... 接続した時最初に送られるメッセージ

NICK ... 名前の通知

NAME ... 同上

PING ... 接続中なのを確認する為。

PONG ... PINGに対する応答メッセージ

MESG ... 会話データ

QUIT ... 切断

2003-12-11

2003-12-10 The E Language

[][] E言語

Hello world を書く前に、インストール出来るかな。

依存関係を見てみると、1.3.1 以降 1.4.0-rc 以前の JDK が必要らしい。

  • サンプルコードがpython ライクだった。(重要)
  • Smart Contrast
  • Ada, や Eiffel にも影響を受けてそう。
  • Aspect指向の機能を使った制約について調べる。
  • SWT をサポート

debian に J2sdk1.3(blackdown) をインストール

apt line (source.list) に追加

 deb http://www.tux.org/pub/java/debian woody main
 deb http://www.tux.org/pub/java/debian woody non-free
 # apt-get install j2sdk1.3

続きを読む