2005-04-30

Javascript のみで動くアプリケーション

職場で、プログラマではない人々が使うような、ちょっとしたツールを作ろうとすると、



アプリケーションサーバ用にマシンを用意しない

インストールとバージョンアップが簡単



という制限があります。しょっちゅう、バグが見付かるので、再インストール無しで動かせるように、JavaScript で書いたページを共有フォルダに置いてあります。なんと原始的な。JavaScript だけで Migemo を作ろうとしているのも、ちょっとした検索ツールを作ろうとしているからです。



で、そんな愚痴を書こうとして気づいたのですが、Google Desktop や SpamBayes のように、ローカルで HTTP を喋るプロセスを動かせばいいじゃん、と。プログラム本体は Python で書いておいて、ネットワーク上にファイルとして保存しておく。各ユーザはHTTPサーバを起動するプログラムだけインストールしてもらって、リクエストハンドラはファイルから読み込んで eval() するとか、やりかたはいくらでもありそうだ。



そもそも共有フォルダにプログラムを置いとけばいいじゃん。



とまあ、自分のアホさ加減に気づいた、週末でした。



Javascript のみで動くアプリケーション

職場で、プログラマではない人々が使うような、ちょっとしたツールを作ろうとすると、



アプリケーションサーバ用にマシンを用意しない

インストールとバージョンアップが簡単



という制限があります。しょっちゅう、バグが見付かるので、再インストール無しで動かせるように、JavaScript で書いたページを共有フォルダに置いてあります。なんと原始的な。JavaScript だけで Migemo を作ろうとしているのも、ちょっとした検索ツールを作ろうとしているからです。



で、そんな愚痴を書こうとして気づいたのですが、Google Desktop や SpamBayes のように、ローカルで HTTP を喋るプロセスを動かせばいいじゃん、と。プログラム本体は Python で書いておいて、ネットワーク上にファイルとして保存しておく。各ユーザはHTTPサーバを起動するプログラムだけインストールしてもらって、リクエストハンドラはファイルから読み込んで eval() するとか、やりかたはいくらでもありそうだ。



そもそも共有フォルダにプログラムを置いとけばいいじゃん。



とまあ、自分のアホさ加減に気づいた、週末でした。



2005-04-24

Mozilla の document.load() は 4096 バイトまで?

FireFox で かな漢字変換用の辞書を読み込んだのですが、うまくいかない。 document.implementation.createDocument(...).load(url) で大きめのファイルを読み込もうとすると、4096 バイトでちょんぎられてるっぽい。XUL/Migemo では、もっと大きいファイルを読めてる。JavaScript だけでは、きついか。



2005-04-18

JavaScript で同期的に XML ファイルを読み込む

Migemo を JavaScript で動かそうとしているわけですが、ファイルを読み込むことができないというのは、なかなか面倒です。Mozilla では document.implementation.createDocument() で作ったオブジェクトの load() メソッドで、XML ファイルにアクセスできます。onload にコールバックを指定するという方法で、ファイル読み取り後の処理を指定します。



で、これだと、同期的に扱えないじゃんと、悩んでいたら、FAQT にサンプルがありました。




var xmlDocument = document.implementation.createDocument('',
'dummy-root', null);
xmlDocument.async = false;


パラメータを指定するだけ。ふーむ。



2005-04-11

落語のCD と DVD

ずーっと前から、ウィッシュリストに入れてあった、落語の CD と DVD を買いました。

桂 枝雀 落語大全 第一集特選!! 米朝 落語全集 第二集。知ったかぶりしてもしょうがないので、面白かった、とだけ書いておきます。iPod とか、そういうのを買ってしまいそう。



JavaScript/Migemo

興味 (趣味ではない) と実益を兼ねて JavaScript で Migemo を作ろうと試みました。FireFox でのみ確認。














XUL/Migemo があるだろうっていう話なのですが、ごもっともです。ソースファイルを見つけられなくて、自分でてきとうに作り始めました。そしたら、あるんですよね。Mac OS X だったら、Library/Application Support/Fire Fox/Profiles/xxx.default//Extensions/{01F8DAE3-FCF4-43D6-80EA-1223B2A9F025}/chrome/xulmigemo.jar ってファイルがあります。これが、実は zip ファイルで、解凍したら、JavaScript のソースがでてきました。がーん。



2005-04-04

WyPy を読む -- lambda の置き換え

ひきつづき、WyPy 読み。lambda とか reduce を読むのが苦手なので、手続きっぽく書き換えました。おそらくは等価なコードは、以下のとおり。




#!/usr/bin/python

import re

import os

import cgi



d = os.listdir('.')

h = '<a href=wy?'



# BEFORE:

#p,e,g,s=tuple(map(cgi.parse().get,'pegs'))

#

# AFTER:

p = cgi.parse().get('p')

e = cgi.parse().get('e')

g = cgi.parse().get('g')

s = cgi.parse().get('s')



# BEFORE:

#f=lambda s:reduce(lambda s,(r,q): re.sub('(?m)'+r,q,s), (('\r',''),('([A-Z][a-z]+){2,}',lambda m:('%s'+h+'e=%s>?</a>',h+'g=%s>%s</a>')[m.group(0) in d]%((m.group(0),)*2)),('^{{$','<ul>'),('^# ','<li>'),('^}}$','</ul>'),('(http:[^<>"\s]+)',h[:-3]+r'\1>\1</a>'),('\n\n','<p>')),s)

#

# AFTER:



def findAndReplace(string, (pattern, repl)):

return re.sub('(?m)'+pattern, repl, string)



def replaceWikiWordWithLink(m):

if m.group(0) in d:

template = h+'g=%s>%s</a>'

else:

template = '%s'+h+'e=%s>?</a>'

return template % ((m.group(0),)*2)



def filter(s):

"""

s = findAndReplace(s, ('\r',''))

s = findAndReplace(s, ('([A-Z][a-z]+){2,}', replaceWikiWordWithLink))

s = findAndReplace(s, ('^{{$','<ul>'))

...

"""

return reduce(findAndReplace,

(('\r',''),

('([A-Z][a-z]+){2,}', replaceWikiWordWithLink),

('^{{$','<ul>'),

('^# ','<li>'),

('^}}$','</ul>'),

('(http:[^<>"\s]+)',h[:-3]+r'\1>\1</a>'),

('\n\n','<p>')),

s)





# BEFORE:

#o,g=lambda y:(y in d and cgi.escape(open(y).read()))or'',(g or p and[open(p[0].strip('./'),'w').write(s[0])or p[0]]or[0])[0]

# AFTER:



def o(y):

if y in d:

return cgi.escape(open(y).read())

else:

return ''



if g:

g = g[0]

elif p:

open(p[0].strip('./') ,'w').write(s[0])

g = p[0]

else:

g = 0





# BEFORE:

#print'Content-Type:text/html\n\n'+(s and', '.join([f(n)for

#n in d if s[0]in o(n)])or'')+(e and'<form action=wy?p=%s method=POST><textarea\

# name=s rows=8 cols=50>%s</textarea><input type=submit></form>'%(e[0],o(e[0]))

#or'')+(g and'<h1>%ss=%s>%s</a>,%se=%s>edit</a></h1>'%(h,g,g,h,g)+f(o(g))or'')

#

# AFTER:



print 'Content-Type:text/html\n\n'



if s:

print ', '.join([filter(n) for n in d if s[0]in o(n)])

else:

print ''



if e:

print '<form action=wypy.cgi?p=%s method=POST>' % e[0]

print '<textarea name=s rows=8 cols=50>%s</textarea>'% o(e[0])

print '<input type=submit>'

print '</form>'



if g:

print '<h1>%ss=%s>%s</a>,%se=%s>edit</a></h1>'%(h,g,g,h,g)

print filter(o(g))



WyPy を読む - ブール演算

11行の Python スクリプトで実装された Wiki「WyPy」を読んでみました。えげつない。Python コードとは思えないくらい、implicit に動作しています。インデントが無いし。



まず、困ったのが↓これです。




print '...'+(s and', '.join([f(n)for n in d if s[0]in o(n)]) or '')+'...'


知っている人は知っている (トートロジー) のでしょうけれど、私はちゃんと分かっていませんでした。というわけで、マニュアルを調べました。5.10 Boolean operations のところに、ちゃんと載っています。以下、意訳。




  • Python の論理演算は None, 数値の0、空のシーケンスを偽として扱います。その他の値は真。

  • 式「x and y」は、最初に x を評価する。x が偽なら、x の評価値が返される。そうでなければ、y が評価され、y の評価値が返される。

  • 式「x or y」は、最初に x を評価する。x が真なら x の評価値が返される。そうでなければ、y が評価され、y の評価値が返される。

  • 最後に評価された値が返される。True / False に強引に置き換えたりしない。



ふむふむ。「最後に評価された値が返される」っていうのがポイントですね。ちょっと試してみましょう。




>>> "Spam" and "Ham"
'Ham'
>>> "Spam" or "Ham"
'Spam'
>>> "" and "Spam"
''
>>> "" or "Spam"
'Spam'


あー、なるほど。では、最初のコードに戻りましょう。




print (s and', '.join([f(n)for n in d if s[0]in o(n)]) or '')


というコードは、以下のように書き換えることができるわけです。




if s:
result = ', '.join([f(n) for n in d if s[0]in o(n)])
if result:
print result
else:
print ''
else:
print s


変数 s には、常に文字列が入っているとすると、s が偽になるのは '' のときです。また、この処理は HTML のコンテンツを書き出している部分なので、「print ''」というのは、事実上、何もしないのと同じです。というわけで、




if s:
', '.join([f(n) for n in d if s[0]in o(n)])


と書き換えることができます。ふーむ。



2005-04-02

<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478420440/addicted2inde-22">エリヤフ・ゴールドラット「チェンジ・ザ・ルール」</a>

原題は "Necessary But Not Sufficient"。ERP の導入は、必要だけれど十分ではない、と。評価尺度、つまりルールを変えなければ、利益にはつながらない。そんな小説。



p.174 「[...] 新しいテクノロジーの導入プロセスの中で、ルールを規定するのを怠ったらどうなるだろうか。いまだに昔ながらのルールに基づいて行動しているとしたら? 以前の古い限界がいまだに存在することを前提としたルールだ」「その場合、ルール自らが限界を課すことになると思う」


p.142 顧客からのオーダーはある、資材もある、作業員の手は空いている。それでも作業を開始しない。... 『いったい、いつ解雇を言い渡されるのか』


たとえば、製品の組み立てをする部署があったとする。



組み立てには1台あたり5時間かかる

1週間後に出荷するべき製品の資材が手元にある

明日に出荷するべき製品の資材が 2 時間後に到着する

もしかすると突発的に緊急の組み立て要請があるかも



こういう状況で、2時間何もしないで待てるかどうか。そういうオプションを検証できるかどうか。



考えられる評価尺度方法として



p.278 <スループット・ダラー・デイズ> <インベントリー・ダラー・デイズ> を基準に評価


というのがある。(製品の価格) x (遅れ日数)。



p.36 こちらのサポートセンターでは、質問を受けてから回答するまでの時間を回答時間として記録している。そっちでは、質問から回答をもらって最終的に問題が解決するまでの時間というわけか。


後者のほうが、よさげ。ただし、いかにして「価格」を決めるのかが問題です。対象となる製品の価格でいいのか、システム全体なのか、それとも過去未来の購買を含めるのか。