Document Actions
python
Up one levelDocument Actions
Plone2.03も日本語がっ
会社の上司にZopeを紹介してみました。紹介と言っても業務ではなくプライベート の範疇で、ですが。で、Zopeを簡単に強力に使う手段として Plone (ZopeのProduct)を勧めてみました。Ploneで構築されているサイトの例としては 沖縄ITポータル が有名らしいのでついでに実例と 言うことで紹介しました。
ところで、個人的にはPloneもCMFも使ったこともないしよく分からないというのが 実情だったので、紹介しておいて知らないというのもなぁ‥‥ということで Windows版の2.03をインストールして軽くさわってみました。
Windows版、楽でイイですね。やっぱり最初の1ステップは楽な方が人に勧めるのに 抵抗がなくて良いと思います。
それはさておき、とりあえずデフォルトのトップページを日本語にしてみよう、と 思って:
"沖縄ITポータル":http://okiit.okihawk.org/
と書いてみたのですが、リンクになってくれません。しかし、 先日の件 もあり、すぐに ZopeのStructuredTextが腐っ てるんだ!と思いつき、さくっと対応できました。
パッチは ここ のを当てて、修正したpyファイルを手動で再コンパイル。再コンパイルの方法は、 pythonのMLで教えてもらった方法で手軽に(?)行いました:
> cd (ploneインストールフォルダ)\Zope\lib\python\StructuredText > (ploneインストールフォルダ)\python\python.exe --python起動-- >>> import DocumentClass >>> import STletters >>> (Ctrl-Zで終了)
ところで、このコンパイル方法って本当に手軽なのでしょうか?pycが無い場合は自 動的にコンパイルして生成してくれる方法がありそうな気がします。
サーバー生存確認PythonScript
先週からサーバーが頻繁に落ちるため、土日に新しいサーバーを構築しました。ところが新しいサーバーもなにやら調子が良くないらしく、会社から確認した感じでは朝8時~12時の間にWebやSSHの反応が無くなるようです。
そこで、cronで10分おきに記録をとり続けるScriptをPythonで書いてみました。何でもPythonで書いていればそのうち覚えるんじゃないかという目論見もあります。
ということで、以下のコードを書いてみました:
#!/usr/local/bin/python
import os,time
home = "/home/taka/log/ping/"
cmd = "/usr/bin/touch " + home + time.strftime("%Y%m%d-%H%M")
os.system(cmd)
if time.localtime()[4] ということで、以下のコードを書いてみました::
#!/usr/local/bin/python
import os,time
home = "/home/taka/log/ping/"
cmd = "/usr/bin/touch " + home + time.strftime("%Y%m%d-%H%M")
os.system(cmd)
if time.localtime()[4]
- Category(s)
-
python
アクセス数計測
先週辺りから、Worldから自宅サーバーへのアクセスが出来ない現象が多発しています。サーバーのOSを入れ替えてからOSそのものは落ちていないようなのですが、ナゼか外部からアクセスできなくなるようです。試しに定期的に外部にメールを発信するようにしたところ、そのタイミング毎にアクセスが可能になるようで、OSというよりはルータとかを疑った方が良いような気がしてきました。
ところで、今日は何時頃にアクセスできなくなっていたのか、というのを知りたくなったので、apacheのアクセスログを集計してみることにしました。最近pythonで簡単なプログラムを書くのが趣味になりつつあるので、今日もまたpythonで書いてみます。
apacheのログから時間単位のアクセス数を計算:
#!/usr/local/bin/python
import fileinput
import re
date = re.compile("(\d+)/\w+/\d+:(\d+):(\d+):(\d+)")
hour = ""
times = 0
for line in fileinput.input("/var/log/httpd/freia-access.log"):
time = date.search(line)
if time:
groups = time.groups()
group = groups[0]+" "+groups[1]
if hour != group:
print "%s: %s" % (hour, "*"*(times/10))
hour = group
times = 0
times += 1
print "%s: %s" % (hour, "*" *(times / 10))
結果はこんな感じです:
12 00: ************ 12 01: ******************************* 12 02: ********* 12 03: * 12 04: ***** 12 05: *********** 12 06: ********* 12 07: ****** 12 08: *************** 12 10: ******** 12 11: *************** 12 12: 12 13: ************* 12 14: ************************************************ 12 15: ***************************************** 12 16: **************************** 12 17: ****************************** 12 18: ******************** 12 19: ********************** 12 20: *********************** 12 21: ************************** 12 22: **************************** 12 23: ******
‥‥ここまでやってから気づいたのですが、これでは単なるアクセス数集計で、どの辺りでアクセスが途切れているかを知ることは出来ません。だめじゃん。
とりあえず1分単位で集計して途切れタイミングを知ることだけは出来そうですが、会社のサーバーあたりにcron仕掛けて調べる方が現実的ですね。
- Category(s)
- Programming
-
python
アクセス隙間検出
アクセス隙間検出。悔しかったのでリベンジです。
datetimeモジュールとtimeモジュールの間でうまく連携する方法が分からなかったので、かなり泥臭い感じになってしまいました。あとprevtimeとbasetimeの初期化が‥‥。
apacheのログから10分以上アクセスの無い時間帯を検出:
#!/usr/local/bin/python
import fileinput
import re
import time
import datetime
date = re.compile("(\d+/\w+/\d+:\d+:\d+:\d+)")
prevtime = None
basetime = None
for line in fileinput.input("/var/log/httpd/freia-access.log"):
logtime = date.search(line)
if logtime:
ttime = time.mktime(time.strptime(logtime.groups()[0],
"%d/%b/%Y:%H:%M:%S"))
dtime = datetime.datetime.fromtimestamp(ttime)
if not prevtime:
prevtime = dtime
basetime = dtime
if dtime - prevtime < datetime.timedelta(0,600):
if basetime != prevtime:
print "%s while %s" % (basetime, dtime - basetime)
basetime = dtime
prevtime = dtime
結果はこんな感じ:
2004-08-12 00:31:07 while 0:32:59 2004-08-12 01:18:19 while 0:12:00 2004-08-12 03:17:27 while 0:42:16 2004-08-12 04:24:20 while 0:25:58 2004-08-12 04:50:22 while 0:19:45 2004-08-12 05:12:41 while 0:19:16 2004-08-12 05:46:56 while 0:13:45 2004-08-12 06:27:23 while 0:11:36 2004-08-12 06:46:56 while 0:25:55 2004-08-12 07:22:50 while 0:14:44 2004-08-12 07:48:35 while 0:14:38 2004-08-12 08:56:30 while 1:07:35 2004-08-12 10:28:47 while 0:23:49 2004-08-12 12:12:04 while 0:48:02 2004-08-12 13:15:28 while 0:44:42
やった!出来た!(笑)
結果を見ると、朝9時と正午前後あたりに外部からアクセスできていない時間帯があります。未だ原因は分かっていませんが、とりあえず定期的に外部に通信を行うようにして回避してみたいと思います。
- Category(s)
- Programming
-
python
No module named ja
reST表示でZopeがリブートする問題 は解決しました。
原因は、 StructuredText日本語問題 に対応するために、DocumentClass.pyなど修正・コンパイルしたせいか、あるいはweather_pluginを入れるためにentry_bodyを修正したせいか、、、。
解決法としては、エラーメッセージから適当に当たりを付けて、jaモジュールをでっち上げてみました。
エラーメッセージは、以下のようなものがreStructuredTextのレンダリング時にコンソールに表示されていました:
No module named ja Exiting due to error. Use "--traceback" to diagnose. Please report errors to . Include "--traceback" output, Docutils version (0.3.4), Python version (2.3.4), your OS type & version, and the command line used.
最初のうちは Use "--traceback" to diagnose に気を取られていたのですが、どうやってZopeからOptionを指定すればいいのかが分からなかったため、そもそもの問題である No module named ja に着目してみました。docutils/languages 以下を見てみると、en.pyと言うのはあるのですが、ja.pyは見あたらなかったため、とりあえずen.pyをja.pyにコピー&コンパイルしてみたところ、問題が解消されたようです。
ちなみに、コンパイルには以前教えてもらった方法「pythonを起動して import ja などとする」を行いました。pythonのコマンドラインオプションでpycを作る方法よりもお手軽です。
それにしても、インストール当初は何ともなかったのに何が原因でdocutilsが異常動作するようになってしまったのかがわかりません。 象歩Blog によると「Zope で Locale の扱いに問題がある」ようですが、症状発生の原因はやはりよくわかりませんでした。
docutilsのUnitTest
ZAmazonを改造してみる
先日 Zope Weekend 4 で「 ZAmazon というProductを使って‥‥」という話をしたのですが、実際の所 ZAmazon は今(2004/08/16)はそのままでは使えなくなってしまっており、そのまま紹介することは出来ない状態でした。
そこで、使える状態にしたものを公開できればと思いgoogleで引いてみると、micro-8さんが Something Red で書かれている記事 " ZAmazonを使う "," Zamazon Hack for COREBlog " が引っかかり、既に ZAmazon を使いやすいように改造した物を配布して‥‥いたようなのですがリンク切れ(^^; とりあえずpythonやProductの改造練習ということで、自分で手を入れてみることにしました。
[ 清水川改造版ZAmazon ]
まず、 ZAmazonを使う でも書かれていますが、 ZAmazon を手に入れてもそのままでは使えません。引数の数が合っていなかったりしているので、その辺のつじつまを合わせる必要があります。また、AmazonのWebAPIのURLが固定で埋め込まれていたり(URLは時々変わるようです)、アソシエイトIDが埋め込まれていたり(--;; します。そのへんをZope上から設定できるようにQuickHackしてみました。

上記の Amazon License Key と Amazon Associate ID はAmazonで デベロッパー・トークンを申し込む ことで入手することが出来ます。また、サンプルで使うためにここではidを zamazon とします。(タイトルとProxyはオプション)
そして以下のような DTML Document を作成して使います 1
<dtml-var standard_html_header>
<table border=1>
<tr>
<th>Asin</th>
<th>SalesRank</th>
<th>ProductName</th>
<th>URL</th>
<th>Media</th>
<th>OurPrice</th>
<th>ImageUrlMedium</th>
</tr>
<dtml-in expr="zamazon.searchByASIN('4894716658')"
prefix="book"><tr>
<td><dtml-var expr="book_item['Asin']"></td>
<td><dtml-var expr="book_item['SalesRank']"></td>
<td><dtml-var expr="book_item['ProductName']"></td>
<td><a href="<dtml-var
expr="book_item['URL']">">Link</a></td><td><dtml-var
expr="book_item['Media']"></td>
<td><dtml-var expr="book_item['OurPrice']"></td>
<td><img src="<dtml-var expr="book_item['ImageUrlMedium']">" /></td></tr>
</dtml-in>
</table>
<dtml-var standard_html_footer>
これで ASIN=4894716658 に対応した本、 人月の神話 についての情報を引き出すことが出来ます。
searchByASINの部分を以下のように書き換えると:
zamazon.searchByWishlist('3AEH19HYIMCTJ')
自分のWishListを表示 することが出来たりします 2 。
ZAmazon は今のままでもコードさえ書けばたいていのことは出来るのですが、micro-8さんのようにCOREblogで使えるようにするとか、辞書でProductNameを引くなどのコードを書かなくても任意の情報を取得できるようにするとかをしていかないと、一般の人への訴求力はかなり弱いですね。
| [1] | なんか<と書いてもだめなので、とりあえず全角で‥‥ |
| [2] | 少なくとも2004/8/16現在はWishListが表示されます。実験用URLなので‥‥ |
Re: ZAmazonを改造してみる
実は、リンク切れというか、CVSでコミットしたときに自動でアーカイブしなおすのってかっこいいなと思いつつ、CVSを導入しただけで終わっているのでした(^^;
すなおにcronにすべきかもしれません。
Re: ZAmazonを改造してみる
> CVSでコミットしたときに自動でアーカイブしなおすのってかっこいいなと思いつつ
確かに、かっこいいかも。
COREblogなんかでアーカイブを参照すると、あとでアップデートした時などにリンク問題で悩むんですよね(--;;
pyuiをいじってみる
久しぶりのpythonです。今回は pyui をいじってみます。 pyui はGUI系のライブ ラリなので、Xを設定していないFreeBSDではなくWindows上で動かすために、 pythonのインストールから行いました。
- Python日本語環境用インストーラ (python23jp-20030906.exe)
- PyGame (pygame-1.6.win32-py2.3.exe)
- PyOpenGL (PyOpenGL-2.0.1.08.py2.3-numpy23.exe)
- PIL (PIL-1.1.4.win32-py2.3.exe)
- GLUT (glut-3.7.6-bin.zip)
- pyui (pyui095.zip)
GLUT と pyui 以外はインストーラで簡単にインストールすることが出来ました。 GLUT はOpenGLを手抜き利用するためのものらしいですがよく知りません。入手し たパッケージに入っているglut32.dllを\Windows\system32に入れました。
pyui は最新版の1.00があるのですが、間違って0.95を使用しました。0.95のパッ ケージにはWindows専用インストーラは含まれていませんでしたので、展開してコマ ンドラインから以下のコマンドを入力してインストールしました:
c:\pyui95> python setup.py install
準備が整ったので、早速実験です。まずは pyui のサイトにあるサンプルを入力し て、以下の最小のサンプルに行き着きました:
import pyui pyui.init(400,300) pyui.run()
真っ黒なWindowが表示されて、あとはコンソールにFPSが流れていきます。さすがに 意味のあるサンプルにしたいので、もう一行追加:
import pyui pyui.init(400,300) pyui.widgets.Frame(10,10,100,100,"test") pyui.run()
無事Windowが表示されたところで、今日はここまで:
pyui.quit()
- Category(s)
-
python
- Programming
pyuiの練習
今日はpyuiのmenuをいじってみました:
import pyui
pyui.init(800,600)
def onCreate(item):
pyui.widgets.Frame(50,50,100,100,item.text)
menu=pyui.widgets.Menu("create")
menu.addItem("Green", onCreate)
menu.addItem("White", onCreate)
menubar = pyui.widgets.MenuBar()
menubar.addMenu(menu)
pyui.run()
しかし、これではつまらないので、Menuの選択毎に違う挙動をさせてみたいと思います。本来であれば挙動を定義した関数(上記の例ではonCreate)を複数用意してそれぞれのMenuItemに登録するところですが、ここではlambdaを使って1行で書いてみたいと思います:
import pyui
pyui.init(800,600)
menu=pyui.widgets.Menu("create")
menu.addItem("Window" ,lambda item: pyui.widgets.Frame(50,50,100,100,item.text))
menu.addItem("Console",lambda item: pyui.dialogs.Console(100,100,200,100))
pyui.widgets.MenuBar().addMenu(menu)
pyui.run()
なかなかすっきりしました。
実際の所、lambdaの乱用はしない方が賢明なのですが、とりあえずlambdaの練習ということで、もう一歩踏み込んでlambdaを使ってみました:
import pyui
pyui.init(800,600)
pyui.widgets.MenuBar().addMenu((lambda menu=pyui.widgets.Menu("create"): menu.addItem("Window",lambda item: pyui.widgets.Frame(50,50,100,100,item.text)) and menu.addItem("Console",lambda item: pyui.dialogs.Console(100,100,200,100)) and menu)())
pyui.run()
もう読めません(笑)
途中からpyuiは関係なくなってしまいましたが、こんな事も出来る、というのを体験してみたかったと言うことで。 おかげで、既存のpythonのコードを読んでいて時々出てくる and と or を使用したif文の短絡表記方法が理解できました。
やはり習うより慣れろ、という事で、実際にコードを書かないと文法とか表現って身に付かないですね。
- Category(s)
-
python
- Programming
