hagio.org - 日記

Powered by PENS


Index

2009: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2010: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2011: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2012: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2013: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2014: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2015: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2016: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)(2)
2017: 1月(1)(2) 2月(1)(2) 3月(1)(2) 4月(1)(2) 5月(1)(2) 6月(1)(2) 7月(1)(2) 8月(1)(2) 9月(1)(2) 10月(1)(2) 11月(1)(2) 12月(1)

今月のアルバム [ 投稿 | 編集 ]


編集

June 2010

Jun 28 (Mon)

22:12

今日の Python : 簡単な TCP サーバ (tcp_server.py)

#!/usr/bin/env python import socket sock = socket.socket() sock.bind(('', 55555)) sock.listen(5) while 1: print "Waiting for a client connection..." try: csock, addr = sock.accept() print "Connected by %s:%d" % addr while True: buf = csock.recv(1024) if not buf: print "Disconnected." break print "Received : %s" % buf csock.close() except KeyboardInterrupt: break sock.close()

と、TCP クライアント (tcp_client.py)

#!/usr/bin/env python import socket, sys if len(sys.argv) < 2: print "Usage: %s host" % sys.argv[0] sys.exit(0) sock = socket.socket() addr = (sys.argv[1], 55555) sock.connect(addr) print "Connected to %s:%d" % addr while True: buf = raw_input("> ") if buf == "q": break sock.send(buf) sock.close()

例外処理をまだ全然わかってないので、何もやれてないが。

試しに実行してみる。サーバを実行しといて、クライアントで以下のように実行すると、

$ ./tcp_client.py 192.168.1.1 Connected to 192.168.1.1:55555 > test data > 123 > q

サーバではこう見える。

$ ./tcp_server.py Waiting for a client connection... Connected by 192.168.1.10:56924 Received : test data Received : 123 Disconnected. Waiting for a client connection...

ついでに tcpdump も。

# tcpdump -i eth0 -n port 55555 22:15:35.765651 IP 192.168.1.10.56938 > 192.168.1.1.55555: S 14582339:14582339(0) win 65535 <mss 1460,nop,wscale 3,nop,nop,timestamp 715795058 0,sackOK,eol> 22:15:35.765729 IP 192.168.1.1.55555 > 192.168.1.10.56938: S 629574479:629574479(0) ack 14582340 win 5792 <mss 1460,sackOK,timestamp 2858966014 715795058,nop,wscale 7> 22:15:35.765883 IP 192.168.1.10.56938 > 192.168.1.1.55555: . ack 1 win 65535 <nop,nop,timestamp 715795058 2858966014> 22:15:38.106585 IP 192.168.1.10.56938 > 192.168.1.1.55555: P 1:10(9) ack 1 win 65535 <nop,nop,timestamp 715795082 2858966014> 22:15:38.106630 IP 192.168.1.1.55555 > 192.168.1.10.56938: . ack 10 win 46 <nop,nop,timestamp 2858968355 715795082> 22:15:39.067619 IP 192.168.1.10.56938 > 192.168.1.1.55555: P 10:13(3) ack 1 win 65535 <nop,nop,timestamp 715795091 2858968355> 22:15:39.067659 IP 192.168.1.1.55555 > 192.168.1.10.56938: . ack 13 win 46 <nop,nop,timestamp 2858969316 715795091> 22:15:39.971635 IP 192.168.1.10.56938 > 192.168.1.1.55555: F 13:13(0) ack 1 win 65535 <nop,nop,timestamp 715795100 2858969316> 22:15:39.971759 IP 192.168.1.1.55555 > 192.168.1.10.56938: F 1:1(0) ack 14 win 46 <nop,nop,timestamp 2858970220 715795100> 22:15:39.972260 IP 192.168.1.10.56938 > 192.168.1.1.55555: . ack 2 win 65535 <nop,nop,timestamp 715795100 2858970220>

自分でこういうの作ってみると、なぜか FIN パケットが 3 個飛んだりとか、RST パケットが飛んだりとか、 意外とキレイな tcpdump が取れなくてソケットプログラミングの難しさがわかる。 意図していた上記の tcpdump が取れるまでに 2 時間かかってしまった。 先にクライアント側で close() して、サーバ側で recv() の返り値で判定するってのがミソだろうか。 そうすると TIME_WAIT 状態のソケットもできない。

Jun 27 (Sun)

17:57

ちょいと東府中で用事を済ませたあと、時間があったので、ふらっと東京競馬場に初めて行ってみた。 今日は府中ではレースがないようで馬が見れず残念だったが、ちょうど阪神で GI の宝塚記念があるらしく、 多くの人でにぎわっていた。意外と家族連れとかも多いのね。せっかくだし競馬も初体験してみましたよ。

結果は、ガチガチにも関わらず惨敗…。「名前がカッコいいやつ」と「一番人気」で選んだのだけど、 ナカヤマフェスタは絶対ないな、と思ってたオレは競馬の才能無さそう (だって名前が…)。 今度行くときはブレインが必要やな (頼むよ>Nコレ)。 でも、たったこれだけの金額でもレースに興奮できたのが楽しかったっス。 たぶん、1,000 円くらいまでで、もしかしたら当たるかも、という期待を胸にドキドキするくらいが一番面白いんじゃないかな。 それ以上かけると、ドキドキがハラハラになっちゃってハズすと腹立つでしょ。

追記:今月のアルバムが、酒に競馬に、ダメ人間化しとる。。
べっ、別に常習的じゃないんだからねっ!! 競馬は初めてだし、酒は週一しか飲まないんだからねっ!!

00:30

うお、これ会社用に欲しい!! 普通のホッチキスって、シュレッダーにかける前に針を外すのが面倒なんだよね。 ハンディタイプ出たら買ってみよう。

Jun 26 (Sat)

16:05

Salyu の『MAIDEN VOYAGE』が名盤すぎる件。

もともと 2 曲目の『イナヅマ』を気に入って最近このアルバムをよく聞いてたんだけど、 どうしてもアルバムの終盤の曲は再生回数が少なくなるというもの。 だもんで『LIBERTY』はそれほど意識していなかったんだが、 ふとこれすごい名曲ということに今さら気がついた。

アルバムの中盤もいい曲ばかりで飽きさせない。

しかし、YouTube とかにあるこういう動画にリンクしてもいいのかね? まぁ、PV なら流してナンボだと思うけど。実際、オレは YouTube で視聴して 気に入ったら買うこともあるし。。と、ただ正当化しているに過ぎないが。

Jun 25 (Fri)

07:52

ふげあ。

わりと細い歩道で、前に自分の歩く速度よりも微妙に遅い人がいたときの 抜くか抜かないかの葛藤といったらもう。

Jun 24 (Thu)

23:55

Linux でいうところのプロセスの "D 状態" というのは、Mac では "U 状態" のようだ。Uninterruptible wait.
Finder が固まっちまった状態での ps 情報。

USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND kaz 94 8.1 2.0 3034620 85924 ?? U 8 610 13:06.66 /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder

Cmd+Opt+Esc で強制終了したら (Uninterruptible のクセに kill は効くのか??)、 今度は "E 状態" で止まってる。Exit 中ということらしい。こうなると kill も効かない。

USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND kaz 94 0.0 0.0 0 0 ?? E 8 610 0:00.00 (Finder)

Finder を開こうとすると、"アプリケーション Finder.app を開けません。-10810" というエラーが出る。

う〜ん、どうしたらいいんだ?? Linux なら、これはリブートしか無いな、とかわかるわけだが Mac は全然わからん。 Mac 歴 15 年くらいってのに、Linux の方が詳しくなってしまったというのはなんだか悲しくもあるな。

open で直接叩いてみると、LSOpenURLsWithRole() でエラーとなっていることがわかる。

kuro:~ kaz$ open /System/Library/CoreServices/Finder.app/ LSOpenURLsWithRole() failed with error -10810 for the file /System/Library/CoreServices/Finder.app.

Launch Services Reference を見ると、どうやら unknown error とのことで、はい終了、という感じですか。 どうせシャットダウンしてもフリーズするだろうし、おとなしく強制リブートですかね。。 サーバでもないのに uptime が 16 日くらいになってるから、たまには落としてあげますかね。疲れたのかと。

kuro:~ kaz$ uptime 1:08 up 16 days, 1:16, 2 users, load averages: 0.27 0.21 0.22

Jun 22 (Tue)

23:15

ここんとこ発症していた Python 熱は "mod_python is deprecated" 事件により冷め気味ではあるが、 Python ばかりやってもいられないので、ちょうど良かったのかもしれない。 ちょっと最近、新しい趣味を始めようかと思って勉強し始めているのでね。 まだここには書かないけど、おいおい書いていくことになるだろう。何人かにはしゃべったけど。 まだ中学・高校レベルの理論復習中というところ。。

ということで今日はまた Python について。 mod_wsgi を試してみることにしよう。

うちのサーバは CentOS 5 なのだが、デフォルトの状態で yum info mod_wsgi しても見つからないと言われる。 ソースから入れてもいいのだが、RPM での管理に慣れているオレとしては、全部 RPM でやってしまいたい。 こんなときは、EPEL などの 拡張リポジトリを使うといい。まずは、リポジトリのデータをインストール。要は、yum の設定ファイルですな。

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm を取得中 警告: /var/tmp/rpm-xfer.ofLd1g: ヘッダ V3 DSA signature: NOKEY, key ID 217521f6 準備中... ########################################### [100%] 1:epel-release ########################################### [100%] # rpm -ql epel-release /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel.repo /usr/share/doc/epel-release-5 /usr/share/doc/epel-release-5/GPL

でも通常は拡張リポジトリを使いたくないので、設定で disable にしておく。

# vi /etc/yum.repos.d/epel.repo [epel] name=Extra Packages for Enterprise Linux 5 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch failovermethod=priority enabled=0 ←これを 0 にしておく gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL ...

ほんで、yum で mod_wsgi の情報を検索してみる。

# yum info mod_wsgi --enablerepo=epel ... epel 100% |=========================| 3.4 kB 00:00 Available Packages Name : mod_wsgi Arch : i386 Version: 3.2 Release: 1.el5 Size : 69 k Repo : epel Summary: A WSGI interface for Python web applications in Apache Description: The mod_wsgi adapter is an Apache module that provides a WSGI compliant interface for hosting Python based web applications within Apache. The adapter is written completely in C code against the Apache C runtime and for hosting WSGI applications within Apache has a lower overhead than using existing WSGI adapters for mod_python or CGI.

おし、あった。というか事前に確認済みだけど。早速インストール。

# yum install mod_wsgi --enablerepo=epel ... Dependencies Resolved ============================================================================= Package Arch Version Repository Size ============================================================================= Installing: mod_wsgi i386 3.2-1.el5 epel 69 k Transaction Summary ============================================================================= Install 1 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 69 k Is this ok [y/N]: y Downloading Packages: (1/1): mod_wsgi-3.2-1.el5 100% |=========================| 69 kB 00:00 warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 217521f6 Importing GPG key 0x217521F6 "Fedora EPEL " from /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL Is this ok [y/N]: y Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing: mod_wsgi ######################### [1/1] Installed: mod_wsgi.i386 0:3.2-1.el5 Complete!

てな感じでインストール完了。rpm と yum を作った人は偉い。

次に httpd の設定を変更する。とりあえず、mod_python を読み込まないように /etc/httpd/conf.d/python.conf を改名し、 同じディレクトリの wsgi.conf の LoadModule ディレクティブがコメントアウトされているのを解除した。

# cd /etc/httpd/conf.d/ # mv python.conf python.conf.disable # vi wsgi.conf LoadModule wsgi_module modules/mod_wsgi.so ← コメントを外す

httpd に設定を再読み込みさせると、OK とは出るのだが、なぜか Web ページにアクセスできない。 httpd のエラーログを見ると、セグメンテーションフォルトが起きまくってる。。 ということで、httpd を再起動してみると、無事に動作した。

# service httpd reload httpd を再読み込み中: [ OK ] # tail -f /var/log/httpd/error_log [Tue Jun 22 23:43:16 2010] [notice] child pid 25565 exit signal Segmentation fault (11) [Tue Jun 22 23:43:16 2010] [notice] child pid 25566 exit signal Segmentation fault (11) [Tue Jun 22 23:43:16 2010] [notice] child pid 25567 exit signal Segmentation fault (11) [Tue Jun 22 23:43:16 2010] [notice] child pid 25568 exit signal Segmentation fault (11) [Tue Jun 22 23:43:16 2010] [notice] child pid 25569 exit signal Segmentation fault (11) ... # service httpd restart httpd を停止中: [ OK ] httpd を起動中: [ OK ] # tail -f /var/log/httpd/error_log [Tue Jun 22 23:43:16 2010] [notice] caught SIGTERM, shutting down [Tue Jun 22 23:43:40 2010] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Tue Jun 22 23:43:41 2010] [notice] Digest: generating secret for digest authentication ... [Tue Jun 22 23:43:41 2010] [notice] Digest: done [Tue Jun 22 23:43:41 2010] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations

とりあえず動くかどうかだけのテストをやってみる。WSGIScriptAlias というディレクティブを wsgi.conf に追加し、設定を再読み込みして、テストスクリプトにアクセスしてみる。 テストスクリプトは、公式ページのサンプルに少しだけ手を加えたもの。

# echo "WSGIScriptAlias /lab /path/to/test.wsgi" >> /etc/httpd/conf.d/wsgi.conf # service httpd reload # cat test.wsgi import time def application(environ, start_response): status = '200 OK' output = '<html><body>\n' output += '<p>Hello World!</p>\n' output += '<p>%s</p>' % time.ctime() + '\n' output += '</body></html>' response_headers = [('Content-type', 'text/html'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]

テストスクリプト

ふーむ、いけたが、ステータスやらヘッダやら面倒だぞ。ここから、どうするかだなぁ。 せめて、mod_python.publisher みたいなのはないのか。

Jun 19 (Sat)

00:19

最近 CM で Jamiroquai の『Virtual Insanity』が流れていたので思い出して昔のアルバム聞いているが、 やっぱかっこいいね。曲はもちろんのこと、PV のダンスというか動きもかっこいいし、 リスナーを楽しませる作品としてのクオリティが半端ない。前回のアルバムがちょっとイマイチだっただけに 今後が気になるところではあるが・・・。

YouTube にもたくさんあるので参考まで。個人的にはアルバム『A Funk Odyssey』がオススメ。 高校時代に etsu から借りて以来、たまに思い出しては聞き続けているアルバムである。

Jun 18 (Fri)

22:41

今日は Python ユーザに訃報:

うそやろ・・・オレが使い始めたその日にこれかよ。mod_python はもはや将来性なしってことか。

追記:どうやら、今後は mod_wsgi にシフトしていくらしい。 せっかく mod_python 勉強していたけど、どうせ始めるなら将来性のある方がいいから切り替えるか。 ただ WSGI って少し見かけたことがあるけど HTML にインラインで Python 書けなかったような。。 とりあえず調べてみるか。

07:51

朝から Python : Python Server Pages (略して PSP) を使ってみる (実行 : mod_python.psp)

<% import time %> <html> <head><title>mod_python.psp</title></head> <body> <p>Powered by mod_python.psp</p> <p>現在の時刻:<%= time.ctime() %></p> </body> </html>

ちなみに、.py と .psp でハンドラを分けるには、httpd.conf に以下のように設定する。

<Directory "/path/to/dir"> AddHandler mod_python .py .psp PythonHandler mod_python.publisher | .py PythonHandler mod_python.psp | .psp </Directory>

参考文献:5.1.1 Python*Handlerディレクティブ構文

やべ、会社行かねば。

Jun 17 (Thu)

22:24

今日の Python : ついに mod_python を使う (実行 : mod_python.py)

import time def index(): ret = "<html>\n" ret += "<p>hagio.org powered by mod_python!!!</p>\n" ret += "<p>現在の時刻:%s</p>\n" % time.ctime() ret += "</html>\n" return ret

これで、嫌いだけどつい使ってしまう PHP を淘汰せねば。。 HTML にインラインで Python が書ければ完全に乗り換えられるのだが、果たしてできるのか。調べ中。

追記:mod_python マニュアルのチュートリアルまで読んだ。これ読む限り、残念ながらインラインには書けなさそうだな。

追々記:4.9 psp - Python Server Pages キタコレ

19:58

どうも。花粉症の季節が終わって空気清浄機を止めたら、部屋が犬小屋のにおい hagio です。

今日は Mac ユーザーに朗報:

これ知らんかって、いつも "この Mac" が選択されてしまって「毎回そんなグローバルに検索せんわい!!」と イライラしていただけに、救世主的な設定である。できれば、"ファイル名" をデフォルトにする設定も欲しいところだが。。。

そもそもデフォルト値なんて、開発者の押しつけなんだから、よほど危険でもない限りは変更できるようにしておくのが ユーザビリティってもんである。さらに言えば、そのソフトウェアや機能が使われるかどうかは、 デフォルト設定によって決まると言っても過言ではない。デフォルト設定がクソなために普及しなかったと思われる ソフトウェアもあるくらいだ (screen とか screen とか:hagio 談)。 そんなわけで、変更できるからと言って適当に設定しておくのもよろしくないのである。 ユーザの 9 割はデフォルト派だと考えなければならない。

Jun 16 (Wed)

21:21

どうも。桑田がなんて歌っているのか聞き取れません hagio です。サンシャインしかわかりません。

今日も懲りずに Python:スレッド化した grep (pygrep.py)

#!/usr/bin/env python import sys, re, threading class Grep(threading.Thread): def __init__(self, regex, files): threading.Thread.__init__(self) self.regex = regex self.files = files def run(self): for path in self.files: f = open(path, "r") row = 1 for line in f: if self.regex.search(line): print "%s:%d:%s" % (path, row, line), row += 1 f.close() # リストを最大 num 個に分割し、その分割したリストからなるリストを返す def split_list(list, num): l = len(list) size = l / num + (l % num > 0) return [ list[i:i+size] for i in range(0, l, size) ] if __name__ == "__main__": if len(sys.argv) > 2: regex = re.compile(sys.argv[1]) for files in split_list(sys.argv[2:], 4): g = Grep(regex, files) g.start() else: print "Usage: %s PATTERN FILES.." % sys.argv[0] sys.exit(0)

CPU がクアッドコアなので、4 スレッド化してシングルスレッド版との速度比較をやってみた。

$ time find . -name "*.c" | xargs ~/lab/Python/grep.py "Linus Torvalds" > /dev/null real 0m5.466s user 0m5.238s sys 0m0.229s $ time find . -name "*.c" | xargs ~/lab/Python/pygrep.py "Linus Torvalds" > /dev/null real 0m8.877s user 0m8.160s sys 0m1.652s

うっそ、遅くなっとるやん・・・ガックシ。何かやり方が悪いのだろうか?
ちなみに、GNU grep はこんだけ速い。-P 4 でドーピングすると鬼。

$ time find . -name "*.c" | xargs grep -Hn "Linus Torvalds" > /dev/null real 0m0.531s user 0m0.402s sys 0m0.159s $ time find . -name "*.c" | xargs -P 4 grep -Hn "Linus Torvalds" > /dev/null real 0m0.303s user 0m0.386s sys 0m0.171s

20:33

Python の細かい挙動調査:

>>> (2 > 1) True >>> a = (2 > 1) >>> a True >>> a += (2 > 1) >>> a 2 >>> a = b = 1 >>> a, b (1, 1) >>> a = (b = 1) File "", line 1 a = (b = 1) ^ SyntaxError: invalid syntax

ふむ。

01:25

今日の Python : とりあえず grep -Hn
スレッド化する予定。

[hagio@lab Python]$ cat grep.py #!/usr/bin/env python import sys, re def grep(reg, path): f = open(path, "r") row = 1 for line in f: if reg.search(line): print "%s:%d:%s" % (path, row, line), row += 1 f.close() if __name__ == "__main__": if len(sys.argv) > 2: reg = re.compile(sys.argv[1]) for path in sys.argv[2:]: grep(reg, path) else: print "Usage: %s PATTERN FILES.." % sys.argv[0] sys.exit(0) [hagio@lab Python]$ ./grep.py if grep.py grep.py:8: if reg.search(line): grep.py:13:if __name__ == "__main__": grep.py:14: if len(sys.argv) > 2: [hagio@lab Python]$ grep -Hn if grep.py grep.py:8: if reg.search(line): grep.py:13:if __name__ == "__main__": grep.py:14: if len(sys.argv) > 2:

6 月(1) へ


↑戻る