そういえば昨日の夜、姉と色々話をした。
この国には何もかもあります。でも、希望だけがない。
みたいな話。というか、既に「何もかもある」状態は終わってる。そう遠くない将来、私達の国はもっと「貧乏人は死ね」と声高に言うヒトタチが現れるだろう。もう何もかも遅すぎる。
ということで、lib/以下も反映させた。でもまだゴミ掃除とかimg/の整理とか生成システムのlast one hopのことを考えてないから、再構築が終わったとは言えない。last one hopはどうするのが一番いいのかなあ。PygeonはCLIとウェブでプレビューとポストができるから、そんくらいのものは用意しないとダメだろうし。やっぱエントリポイントみたいなのをウェブにおいてそれを叩くしかないのかな。
そうそう、あるサービスを終了させる時(特にそれがコミュニティを伴い、1ステップが1日サイクルの時)、猶予期間が1ヶ月というのは長すぎるようだ。半月が一番よさそうかな。
html2markdownとmarkdown3.pyについて書くこと。
忘れてた。
を追加した。
html2markdownとmarkdown3.pyについて書くこと。T氏の例の奴をlibraryにあげるか検討。
html2markdownについて。今回の再構築で古いhtmlを全部一旦markdown形式に変換してから再度markdownからhtmlに変換した。
html2markdown.pyはCGIでも試せるhtml2textとcodefu.orgのhtml2markdownがあったが、後者を使用してhtml → markdownにした。その後、markdown.pyもfreewisdom.orgのmarkdown.pyと、ここの反応がないからActiveStateの人が書いたmarkdown2.pyがあって、これも後者(Pygeonでも後者を使用してる)を使用して、更にBlueStoleのPython実装(手元のファイル名ではmarkdown3.py。これはPygeonで使っているものと別物)で変換した。BlueStoleから比べると、定義リストの中に複数段落とかリストを入れられるようになってるけど、RTToolに相当するものを探してないからTableはサポートしてない。まあwids.netではTable使ってないから、とりあえず。
ほんで、今はLocal(markdown) → Local Server(html) → Server(html)の左側の→を進めてるとこ。
[alpha@colinux]-[01:10 AM]-[~/public_html/wieve]#3
::: python wieve.py -s
? output/a.html
U shelf/index.txt
N shelf/test/
出力がsvnだよ!というとことろで今日は終わり。右側はもうxmlrpc+BASIC認証でいいやという気分になってる。Pythonだとxmlrpcはメソッドバインディングなので、扱うのが楽すぎる。
そういえばTwistedの人達が書いたNevowにはComet実装が付いてるらしい。見る気も起きないけど*1。
というか、Googleインデックスの速度はやいよ。
いつもいつもいつも必要な時はBASIC認証のやり方を忘れてるので、ついカッとなって書いた。
#!/usr/bin/env python
# encoding: utf-8
HTACCESS = '''
<Files *>
AuthName Authentication
AuthType Basic
AuthUserFile %s
Require valid-user
</Files>
'''
def htaccess(htpasswdpath):
return HTACCESS % htpasswdpath
def htpasswd(username, passwd):
import md5
import time
import crypt
salt = md5.new(time.ctime()).hexdigest()[0:2]
return ':'.join([username, crypt.crypt(passwd, salt)])
if __name__ == '__main__':
import os
import sys
from getpass import getpass
if not len(sys.argv) == 3:
usage = 'usage: %s username passwd_file'
print usage % sys.argv[0]
else:
passwd = getpass('Basic Auth Password: ')
rpasswd = getpass('Retype Basic Auth Password: ')
if passwd == rpasswd:
def _write(path, s):
fh = open(path, 'w')
fh.write(s)
fh.close()
username, passwd_file = sys.argv[1], sys.argv[2]
passwd_path = os.path.expanduser(passwd_file)
_write('.htaccess', htaccess(passwd_path))
_write(passwd_path, htpasswd(username, passwd))
else:
print '\nPasswords unmatched, abort.'
sys.exit(1)
これをpreviewしてたらbin/pygeonの割りと腐った仕様発見。投稿後の日記ファイルをキャッシュとして持って次回分と比較して新規を切り出してるので、投稿後に日記ファイルの前の部分を編集すると比較がうまくいかなくてファイル全文章をポストしようとする。
うーん、修正……とか思って確認してたらsvnにbin/pygeonが入ってないという衝撃の事実発覚。とりあえずcommit。
1, 嘘。ちょっとは興味ある。
pythonをしていると、
optlst = 'remoteuser remotepass remotehost remotepath'.split()
remotelst = _getremotelist(*[self.options[o] for o in optlst])
なぜかこういうコードが邪悪に見えてしまう。
愚直にこちらのほうがいいんじゃないか。
remotelst = _getremotelist(
self.options['remoteuser'],
self.options['remotepath'],
self.options['remotehost'],
self.options['remotepath'],
)
悩ましい。そういえば、lst = 'a b c d'.split()
という書き方は、rubyのary = %w(a b c d)
から来ているなあとふと思う。'
は右小指の1打鍵で済むんだけど、それでもめんどい。,
もあるしなあ。
上にあった、
remotelst = _getremotelist(*[self.options[o] for o in optlst])
でmarkdown3.pyが脚注を生成してくれやがったので、pre
とcode
の中では生成しないようにする。
ところで(BTW)、今日はじめて知ったがpythonではこういうことが許されるらしい。代入があった時点でスコープが決定され、代入のない変数はスコープの上へ上へと問い合わせられる、ということだろうか。なにはともあれ、黒魔術的だ。
[alpha@colinux]-[10:16 PM]-[~/public_html/wieve]#0
::: python
Python 2.5 (release25-maint, Dec 9 2006, 14:35:53)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-20)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def a(): return x+2
...
>>> x = 2
>>> a()
4
自分で読んでおいてなんだけど、こういうことが出てくる文書がトップからリンクされてるPyJUGはどうなんだ。
ちなみにrubyだとこうなる。
[alpha@colinux]-[10:26 PM]-[~/public_html/wieve]#1
::: irb1.8
irb(main):001:0> def a(); return x+2; end
=> nil
irb(main):002:0> x = 2
=> 2
irb(main):003:0> a()
NameError: undefined local variable or method `x' for main:Object
from (irb):1:in `a'
from (irb):3
from :0
あー、何となくわかった気がする。そういえば読み漁っていた時にどっかで見たような記憶もあった。
今日仕事で書いた雑用コード。battery included
万歳。
import email
msg = email.message_from_file(open('original.txt'))
for index, part in enumerate(msg.walk()):
if part.get_content_type() == 'image/jpeg':
fh = open(str(index) + '.jpg', 'w')
fh.write(part.get_payload(decode=1))
fh.close()
残り1週間を切りました。そのままばさっと止めてもいいんだけど、演じるなら最後まで演じきりましょう。ということで、閉鎖記念CGなどをちょこちょこと。
もちろん、こんな行動に意味などない。
踊るんだ。踊り続けるんだ。何故踊るかなんて考えちゃいけない。意味なんてもともとないんだ。