redmineをインストールしてみた

普通に入れたら結構めんどくさかった。RoRのバージョンとかRubyのバージョンなんかをshapado用に上げてあったのでダウングレードしたりバージョン合わせないといけないのが辛い。Fedoraにも足りないパッケージがあったり(mysqlとか)したので、昼食後のダレた時間を有効に使うつもりが、動かすだけで午後を使いきって夕方近くまで格闘する羽目になった。がっくりだ。

結局このアーティクルの通りにインストールした。

あとsqlも追加して実行しておいた。

grant all privileges on redmine.* to 'user_redmine'@'localhost';

まぁそんなすさんだ心のうちを昨日twitterに放出したら浄化された(トゥイートロンダリング)ので 早速、今朝出社してBitNamiからダウンロードしてインストールしたらさくっと入ったので、こっちを最初からチョイスしておいたほうが良かったかもと思った。

それから、エントリ書いてる最中に助言を頂いた。ありがとうございます。今思いなおすとRoRダウングレードかぁと思っていたのは実際にはmysqlの権限のエラーだった気がする。というわけで、ちょっとすっきりした。

早速自分のプロジェクト(独りプロジェクトなので気楽)で使っているが、思った以上に快適ではまる。自分の仕事はドライなので普通に使えるんだけど、ウェットのプロジェクトにアプライする場合にはチケットの種類をどういう風にわけるかとサブプロジェクトを何に対応させるべきかねぇとかそんなことを悩み始めている。

そもそも、創薬現場にITSがないのはおかしいだろう?っていう持論を展開しているので、実証するのは楽しいですね。

ProductName Redmineによるタスクマネジメント実践技法
小川 明彦
翔泳社 / 3444円 ( 2010-10-13 )


さくらのVPSにWiki入れるかどうか迷った結果Sphinxでいいことになった

計画停電で自宅サーバーがしょっちゅう止まったり、電気代比較してみると、さくらのVPS使ったほうがエコっぽいので移行することにした。

最近楽しく移行作業を始めたわけだが、ちょっと悩んでいたのがwikiをどうするかだ。そもそも自分がなんでwikiを必要としているのかをよくよく考えてみるに(blogに書くまでもないことの)メモまたは備忘録を構造化された文書形式で残しておきたいということかなぁと。

今はHikiを使っているんだが、利用している理由がEmacsのHikiモードがあるというのが一番大きいし、一人でしか使ってないしなぁ。

となると

  • 構造化された文書形式
  • Emacsのようなエディタで気軽に編集できる
  • それが、さくっとhtmlにコンバートできる
  • あとで見返せる自分用メモ

を満たせばwikiでなくても構わない。で、Sphinxが候補にあがった。以前SAR Newsの原稿書いた時に使ってたので、使い勝手が非常にいいことは分かっているが、運用どうすっかなと悩んでいたら渋川さんにアドバイスもらった

さくらのVPSではwikiのかわりにSphinxでいくことにした

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


Pythonのdisモジュール

逆アセンブル用のモジュール

ソースコードも200行程度で読みやすそうなので、読んでみようかと。

その前にドキュメント読んだら面白かった。

Rubyで作る奇妙なプログラミング言語でスタックマシンを作ってみた経験が理解において非常に役に立った。

ProductName Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ / ?円 ( 2008-12-20 )


リスト内包標記

>>> 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

参考

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


恋するプログラムをJavascriptで書いていくことにした

そういえば去年の最終Haskell読書会で、だれかと恋するプログラムの本の話になってYahooの日本語形態素解析API使えば出来んじゃないか?という思考に至ったので、気の向いたときにやっていくことにした。

ProductName 恋するプログラム―Rubyでつくる人工無脳
秋山 智俊
毎日コミュニケーションズ / ?円 ( 2005-04 )


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));

復刊リクエストも動いているようなので復刊されるといいですね。

Shapado導入メモ

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の本を持っていないのでなんか買っておこうかなと思っているのだけど良書ってどれだろうか?

ProductName RailsによるアジャイルWebアプリケーション開発
Sam Ruby
オーム社 / 4410円 ( 2009-12 )


これとかどうですか?

2010年に読んだ本

今年読んで良かった本をビジネス系と技術系で5つずつあげてみる。

ビジネス本は読んだ量の割に心に残るものは少なかったけど内容がいい本は深くて色々考えさせられた。特に「イシューからはじめよ」はピカイチだった。

技術書は前半はPK-PDの本とか読んでいて、後半はプログラミング関係をそこそこ読んだ。Ruby関連の本が面白かったような気がする。エキスパートPythonプログラミングも大きい。

ビジネス本

とんがり

ProductName 小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice)
ジェイソン・フリード
早川書房 / ?円 ( 2010-02-25 )


ログをとるのは楽しい

IT業界に限らず、変化が激しい業界では短期的な成果を出すことも、長期的な視野での成果(つまり自分の成長)もきちんと考えることが大切だと思う。

自分で自分を経営しているって感覚が当たり前になるんだろうなと思っている

ProductName 経営の教科書―社長が押さえておくべき30の基礎科目
新 将命
ダイヤモンド社 / 1680円 ( 2009-12-11 )


昨日読み終わったので感想記事を書いてないが、すごく良かった。ピンと来る人にはグイグイ引き込まれる内容。

ProductName イシューからはじめよ―知的生産の「シンプルな本質」
安宅和人
英治出版 / 1890円 ( 2010-11-24 )


技術書

5章まで残り。何度か読みなおしてPythonへの理解を深めていくための本

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


月曜日から金曜日に章が分かれていてメタプログラミングを学んでいく

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / 2940円 ( 2010-08-28 )


バリバリEmacsを使っているEmacs使いが、作業効率をカイゼンしてさらにバリバリ使うようになるための本

継続やYコンビネータを知るために。独特の形式もまた読んでて楽しい

ProductName Scheme手習い
Daniel P. Friedman
オーム社 / 2940円 ( 2010-10-22 )


創薬研究の問題解決の方法論としても参考になることは多い

ProductName Redmineによるタスクマネジメント実践技法
小川 明彦
翔泳社 / 3444円 ( 2010-10-13 )


メタプログラミングRuby 金曜日

コードを記述するコード

evalとか。pythonだとexecか

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

第二部は「Railsにおけるメタプログラミング」っていう部であまり興味がなかったのでさらっと読み流した。

最後の

メタプログラミングというものなど存在しない。すべてはただのプログラミングじゃ

とこは気に入った。

メタプログラミングRuby 木曜日

クラス定義

特異クラスとか特異メソッドとか

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

Rubyの話はなんとなくわかったけど、Pythonで考えた場合にいまいち理解が浅い。

DWの連載あとで読もう

メタプログラミングRuby 水曜日

水曜日はブロックの章。

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

まつもと直伝 プログラミングのオキテ 第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()

メタプログラミングRuby 火曜日

火曜日はメソッドを動的に定義する。Pythonだと__setattr__と__getattribute__を使えばいいが、魔術っぽさを感じる。Rubyは見た目自然じゃないか。

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

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__の違いがわからんという新たな発見をした。