2011/03/25 04:52:45
計画停電で自宅サーバーがしょっちゅう止まったり、電気代比較してみると、さくらのVPS使ったほうがエコっぽいので移行することにした。
最近楽しく移行作業を始めたわけだが、ちょっと悩んでいたのがwikiをどうするかだ。そもそも自分がなんでwikiを必要としているのかをよくよく考えてみるに(blogに書くまでもないことの)メモまたは備忘録を構造化された文書形式で残しておきたいということかなぁと。
今はHikiを使っているんだが、利用している理由がEmacsのHikiモードがあるというのが一番大きいし、一人でしか使ってないしなぁ。
となると
- 構造化された文書形式
- Emacsのようなエディタで気軽に編集できる
- それが、さくっとhtmlにコンバートできる
- あとで見返せる自分用メモ
を満たせばwikiでなくても構わない。で、Sphinxが候補にあがった。以前SAR Newsの原稿書いた時に使ってたので、使い勝手が非常にいいことは分かっているが、運用どうすっかなと悩んでいたら渋川さんにアドバイスもらった。
さくらのVPSではwikiのかわりにSphinxでいくことにした
2011/03/15 21:05:46
逆アセンブル用のモジュール
ソースコードも200行程度で読みやすそうなので、読んでみようかと。
その前にドキュメント読んだら面白かった。
Rubyで作る奇妙なプログラミング言語でスタックマシンを作ってみた経験が理解において非常に役に立った。
リスト内包標記
>>> def cp(l): return [e for e in l]
...
>>> dis.dis(cp)
1 0 BUILD_LIST 0
3 DUP_TOP
4 STORE_FAST 1 (_[1])
7 LOAD_FAST 0 (l)
10 GET_ITER
>> 11 FOR_ITER 13 (to 27)
14 STORE_FAST 2 (e)
17 LOAD_FAST 1 (_[1])
20 LOAD_FAST 2 (e)
23 LIST_APPEND
24 JUMP_ABSOLUTE 11
>> 27 DELETE_FAST 1 (_[1])
30 RETURN_VALUE
ループで書いてみる
>>> def cp2(l):
... ll = []
... for e in l:
... ll.append(e)
... return ll
...
>>> dis.dis(cp2)
2 0 BUILD_LIST 0
3 STORE_FAST 1 (ll)
3 6 SETUP_LOOP 27 (to 36)
9 LOAD_FAST 0 (l)
12 GET_ITER
>> 13 FOR_ITER 19 (to 35)
16 STORE_FAST 2 (e)
4 19 LOAD_FAST 1 (ll)
22 LOAD_ATTR 0 (append)
25 LOAD_FAST 2 (e)
28 CALL_FUNCTION 1
31 POP_TOP
32 JUMP_ABSOLUTE 13
>> 35 POP_BLOCK
5 >> 36 LOAD_FAST 1 (ll)
39 RETURN_VALUE
参考
2011/02/21 20:53:15
そういえば去年の最終Haskell読書会で、だれかと恋するプログラムの本の話になってYahooの日本語形態素解析API使えば出来んじゃないか?という思考に至ったので、気の向いたときにやっていくことにした。
3-3
function Responder(name) {
this.name = name;
this.response = function (input) {
return input + "ってなに?"
};
}
function Unmo(name) {
this.name = name;
this.responder = new Responder('What');
this.dialogue = function (input) {
return this.responder.response(input);
};
this.responder_name = function () {
return this.responder.name;
};
}
var u = new Unmo('proto');
var input = "あれ";
console.log(u.dialogue(input));
復刊リクエストも動いているようなので復刊されるといいですね。
2011/01/13 21:03:18
Stack Overflow Cloneの一つであるShapadoを職場に導入したので、その時の記憶を元にメモっておく(というわけで、記憶が曖昧なせいで間違っている部分もあるかもしれない)。
サーバーの準備
Fedora14に入れた。Fedora14はcd-romから起動してHDDにインストールしてSELinuxとか色々設定して、まぁそこら辺は普通に。
ShapadoはMongoDBとRoRで動くのでそっちも設定。Ruby関連はgemsを使ってshapadoのREADMEの通りにバージョンに気をつけながらインストールしていく。ライブラリのヘッダーつまり「develが無いdevelが無い」って言われ続けるので丁寧に入れていく。これがいつも面倒だなぁ。
fedora14はmongodbのrpmがあるのでyumで入れる
yum install mongodb-server
chkconfig mongodb on
/etc/init.d/rc.d/mongodb start
これでMongoDBの設定は終り。
shapadoのインストール
職場ではgitriousのソースをgit cloneできないので、GitHubのtar.gzをダウンロードしてきた。
あとはREADMEの通りにやればdevelopmentは動く。ただし、shapado.ymlを編集したらrake bootstrapをしないといけない。これはproductionでも同様。あとprodctionで動かす場合はもうひとつのymlファイル(model.ymlだったかな?)をきちんと設定する。
apacheでshapadoを動かす
developmentは妙に遅いのでproductionで動かしたい(というかそうでないとフラストレーションが溜まる)
ApacheでRoRを動かすにはpassengerを使うとよいらしいので、そうしてみた。これは実に簡単。足りないパッケージも教えてくれるのにプログラムの言いなりでOK
ただ実際に動かしてみると起動せずerror.log見たらメソッドがないらしいので修正した。
これで動いた。ApacheでRoRを動かすのは思ったより簡単だったということが分かったのは収穫
なぜイントラにStack Overflow Cloneが必要か?
An answer is always the stretch of road that's behind you. Only a question can point the way forward.ってのは名言だと思っていて、結局適切な問いを出し続けられるかというのが組織の強みなんだろうなぁと。(既に与えられた)問いに如何にはやく答えられるか?ってのはコスト競争というかそっちのほうに引っ張られて、製薬業みたいな探索なんだか工学なんだかわかんないような学際的な研究企業には本質的な強みでないよな(アウトソースなんていっぱいあるし)と、個人的に思っているし。
実際に、去年メガファーマから来た上司が真っ先に欲しがったシステムがQAシステムで、ノウハウ共有というかそういう文化を醸成したかったらしいんだけど、ITシステムがつくったものが、設計思想とかなんもなくてまぁ残念臭漂う感じで(よくあるパターンですね)、一年くらいでだれも使わなくなってしまったので、これじゃまずかろうと僕の手がちょっと空いたときにStack Overflow Cloneを入れてみたという次第。
自分でも、メールでいろいろ質問したりサジェストしたりしているんだけど、そもそもメールなんてその時に見て良く考えないと相手の言いたいこと理解しないまま二度と見なくなっちゃうし、相手(宛先)を指定しないといけないから、潜在的にそういう情報が有用な人間(Ccに入れるべきとか、未来にその情報が必要になるヒト)にリーチしないので、デメリット多いですな。
ま、そんなわけで春くらいまではShapadoがうまくまわるように少し手をかけてみようかなぁと思っている。
RoRの本を持っていないのでなんか買っておこうかなと思っているのだけど良書ってどれだろうか?
これとかどうですか?
2010/12/29 19:23:16
今年読んで良かった本をビジネス系と技術系で5つずつあげてみる。
ビジネス本は読んだ量の割に心に残るものは少なかったけど内容がいい本は深くて色々考えさせられた。特に「イシューからはじめよ」はピカイチだった。
技術書は前半はPK-PDの本とか読んでいて、後半はプログラミング関係をそこそこ読んだ。Ruby関連の本が面白かったような気がする。エキスパートPythonプログラミングも大きい。
ビジネス本
とんがり
ログをとるのは楽しい
IT業界に限らず、変化が激しい業界では短期的な成果を出すことも、長期的な視野での成果(つまり自分の成長)もきちんと考えることが大切だと思う。
自分で自分を経営しているって感覚が当たり前になるんだろうなと思っている
昨日読み終わったので感想記事を書いてないが、すごく良かった。ピンと来る人にはグイグイ引き込まれる内容。
技術書
5章までと残り。何度か読みなおしてPythonへの理解を深めていくための本
月曜日から金曜日に章が分かれていてメタプログラミングを学んでいく
メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / 2940円 ( 2010-08-28 )
バリバリEmacsを使っているEmacs使いが、作業効率をカイゼンしてさらにバリバリ使うようになるための本
継続やYコンビネータを知るために。独特の形式もまた読んでて楽しい
Scheme手習い
Daniel P. Friedman
オーム社 / 2940円 ( 2010-10-22 )
創薬研究の問題解決の方法論としても参考になることは多い
2010/09/20 09:12:12
コードを記述するコード
evalとか。pythonだとexecか
第二部は「Railsにおけるメタプログラミング」っていう部であまり興味がなかったのでさらっと読み流した。
最後の
メタプログラミングというものなど存在しない。すべてはただのプログラミングじゃ
とこは気に入った。
2010/09/18 16:22:25
クラス定義
特異クラスとか特異メソッドとか
Rubyの話はなんとなくわかったけど、Pythonで考えた場合にいまいち理解が浅い。
DWの連載あとで読もう
2010/09/17 21:48:06
水曜日はブロックの章。
まつもと直伝 プログラミングのオキテ 第5回(2)
ブロックとは,関数1つを採る高階関数を文法的に特別扱いしただけ,とみなすこともできます。
ほうほう、ということはpythonの場合はラムダ式とればいいのか。
章の終りの方の例がDSLで面白そうなのでやってみる。
def event(name,func):
if func():
print "ALERT: %s" % func.__name__()
event("イベントが発生すること", lambda: True)
event("イベントが発生しないこと", lambda: False)
とやってみたが、ラムダ式は複雑なのが書けないのでコードロック渡したい。
デコレータ使えばいいかということでこんな感じにしてみたが_eventで終わる関数を評価するときに、文字列とって関数適用するところで悩んだ。getattrはまぁわかるとしてimport __main__しないと
Traceback (most recent call last):
File "metr3.py", line 24, in <module>
func = getattr(__main__, func_name)
NameError: name '__main__' is not defined
って出てくる理由がわからん。
def event(eventname):
def decfunc(func):
def func_():
if func():
print "ALERT: %s" % eventname
return func_
return decfunc
@event("イベント発生")
def test1_event(): return True
@event("イベントが発生しないこと")
def test2_event(): return False
if __name__ == '__main__':
import __main__
for func_name in [elem for elem in dir() if elem.endswith("_event")]:
func = getattr(__main__, func_name)
func()
2010/09/15 20:15:01
火曜日はメソッドを動的に定義する。Pythonだと__setattr__と__getattribute__を使えばいいが、魔術っぽさを感じる。Rubyは見た目自然じゃないか。
import re
class Ds(object):
def get_cpu_info(self,i):
return 2.16
def get_cpu_price(self,i):
return 150
def get_mouse_info(self,i):
return "dual optical"
def get_mouse_price(self,i):
return 40
# METAPROGRAMMING RUBY
# class computer
# def initialize(computer_id, data_source)
# @id = computer_id
# @data_source = data_source
# data_source.methods.grep(/^get_(.*)_info$/) { Computer.define_compornent $1}
# end
#
# def self.define_component(name)
# define_method(name){
# info = data_source.send "get_#{name}_info", @id
# price = data_source.send "get_#{name}_price", @id
# result = "#{name.capitalize}: #{info} ($#{price})"
# return "* #{result}" if price >= 100
# result
# }
# end
# end
class Computer(object):
def __init__(self,computer_id, data_source):
self.data_source = data_source
self.id = id
for name in [re.search("^get_(.*)_info$",m).group(1) for m in
dir(data_source) if re.search("^get_(.*)_info$",m)]:
self.define_compornent(name)
def define_compornent(self, name):
def define_method():
info = self.data_source.__getattribute__("get_%s_info"%name)(self.id)
price = self.data_source.__getattribute__("get_%s_price"%name)(self.id)
result = "%s: %s ($%s)" % (name.capitalize(), info, price)
if price >= 100:
return "* %s" % result
self.__setattr__(name,define_method)
if __name__ == '__main__':
ds = Ds()
com = Computer(12,ds)
print com.mouse()
print com.cpu()
後半はmethod_missingを使う例だった。perlだとAUTOLOADかとおもってググッてみたら。一覧になってた。
ところで、__getattribute__と__getattr__の違いがわからんという新たな発見をした。
2010/09/14 19:39:23
メタプログラミングRubyを読み始めた。第一部は月曜から金曜にわかれていて、、、、、
まぁ毎日読めってことですな。
というわけで、機能はRubyのオブジェクトモデルに関して読んでいた。
rubyにはancestorsっていうメソッドがあって継承関係を調べることができる。
pythonだとこんな感じか?
def ancestors(ins): return [c.__name__ for c in ins.__class__.mro()]
クラスに関してはPython Types and Objectsが分かりやすかった。
あと、pythonでのメタプログラミングはエキスパートPythonで少し触れられている。