NISHIO Hirokazu[Translate]
Hatena2011-12-26
hatena
<body> *1324881140*git checkout -pのユースケース 特にプロトタイプ的なコードを書いている時、将来的にはオプションなどで変更できるようにする予定のモノをコードに直書きで埋め込んだりするよね。簡単なものでは1行だったり、複雑なものだったらモックのクラスだったり。 今回のユースケースは「もうこのモックは必要ないな」と思って削除して、しばらくしてからまだ消しちゃダメだったと気づいたケース。 下記のコードのCODEってところを削除する。 >|python| sIDENTIFIER = "[^-+#: ]+" IDENTIFIER = re.compile(sIDENTIFIER) ENHANCER = re.compile("\+\s*(%s)" % sIDENTIFIER) SUPPRESSOR = re.compile("-\s*(%s)" % sIDENTIFIER) BODY = re.compile(":\s*(%s)" % sIDENTIFIER) CODE = """ +START :OUT_H +OUT_H :OUT_E +OUT_E :OUT_L -SUP_L +OUT_L :OUT_L +OUT_L :SUP_L -SUP_O +SUP_L :OUT_O :SUP_O """ NONE = "NONE" # it always be in environment ||< ハイ消した、保存した。でもまだ消しちゃダメだった!そして消しちゃダメだと気付くまでに他の部分もいろいろ書き換えてしまったのでundoで手軽に戻すわけにはいかない。さあどうする!? >|python| sIDENTIFIER = "[^-+#: ]+" IDENTIFIER = re.compile(sIDENTIFIER) ENHANCER = re.compile("\+\s*(%s)" % sIDENTIFIER) SUPPRESSOR = re.compile("-\s*(%s)" % sIDENTIFIER) BODY = re.compile(":\s*(%s)" % sIDENTIFIER) NONE = "NONE" # it always be in environment ||< もう一度書くとか、古いバージョンを表示してそこからコピペするとか、を解決策として考える人も多いかと思うけど、ここで説明したいのはタイトルにも書かれているgit checkout -p。さっそくやってみよう。 >|diff| --- a/main.py +++ b/main.py @@ -7,12 +7,4 @@ IDENTIFIER = re.compile(sIDENTIFIER) ENHANCER = re.compile("\+\s*(%s)" % sIDENTIFIER) SUPPRESSOR = re.compile("-\s*(%s)" % sIDENTIFIER) BODY = re.compile(":\s*(%s)" % sIDENTIFIER) -CODE = """ -+START :OUT_H -+OUT_H :OUT_E -+OUT_E :OUT_L --SUP_L +OUT_L :OUT_L -+OUT_L :SUP_L --SUP_O +SUP_L :OUT_O :SUP_O -""" NONE = "NONE" # it always be in environment Discard this hunk from worktree [y,n,q,a,d,/,e,?]? ||< このようにhunk(かたまり)ごとに、変更を破棄して前回コミットした状態に戻すかどうかを聞いてくる。戻したいところでyを押して、それ以外ではnを押し、もう戻したいものがなければqを押せばOK。 かたまりが自分の戻したい単位より大きくくっついてて、もっと分割したいなと思ったらsでもっと細かく分割。それでも期待したような分割のされ方をしないならeで行単位でどれを戻してどれを戻さないか指定できる。このあたりのコマンドの説明は?を押せば表示される。 というユースケースにちょうど今コードを書いていて遭遇したので、記録も兼ねてブログに書いておいた。 *1324887163*遺伝子をモチーフにした言語「Genomy」を作りました 最近、3年くらい前に書いた「<a href='http://d.hatena.ne.jp/nishiohirokazu/20090131/1233399693'>そろそろ例のプロジェクトについて言及するか</a>」についてTwitterで言及があったので思い出しました。「条件を満たしたものをすべて呼び出す」という設計思想でプログラムが書けてしまうという点について意外とみんなピンと来ないみたいだからコンセプトプルーフを実装してみようと思っていたんでした。 という訳で作りました。https://github.com/nishio/genomy ** 解説 「遺伝子はタンパク質の設計図」というところまでは教科書などでもよく言及されます。でも、その設計図には「どういう状況になったら作るべきか」「どういう状況では作るべきではないか」という情報も書かれています。 この「作るべきではない」(発現の抑制)がどう実現されているか、ザックリ説明しましょう。体の中にあるタンパク質があると、これがある遺伝子の周辺にへばりつき、その遺伝子からタンパク質を作る過程を邪魔します。これによってその遺伝子からはタンパク質を作ることができなくなります。 つまり、この邪魔をするタンパク質をS、邪魔されるタンパク質をPとすれば、SがないときだけPが作られ、SがあるときにはPが作られないということになります。つまりP := not(S)です。この仕組みを使って論理否定が実装できます。 逆に、あるタンパク質Eは遺伝子の周辺にへばりついて、その遺伝子の発現を高めることができます。あるタンパク質E1があるときにはタンパク質Pがたくさん作られる、そしてタンパク質E2があるときにもタンパク質Pがたくさん作られる、という仕組みにすれば、これはつまりP := E1 or E2です。この仕組みを使って論理和が実装できます。 論理和と論理否定があれば半加算器を実装できますよね!半加算器のサンプル>https://github.com/nishio/genomy/blob/master/sample/half_adder.gnm 生命はこのような仕組みを使って、外部からの刺激に対する応答だとか、複雑な体の構造の構築などをプログラミングしているわけです。 では実際にプログラムを動かしてみましょう。sample/hello.gnmの遺伝子を持った生物を、タンパク質STARTを含んだ環境においてみます。 >|| genomy$ python2.7 main.py -f sample/hello.gnm START 0 START 1 OUT_H 2 OUT_E 3 OUT_L 4 OUT_L SUP_L 5 OUT_O SUP_L SUP_O 6 7 8 9 10 ||< はい、STARTの刺激に応答してHELLOと出力されました。では遺伝子を見てみましょう。 >|| +START :OUT_H +OUT_H :OUT_E +OUT_E :OUT_L -SUP_L +OUT_L :OUT_L +OUT_L :SUP_L -SUP_O +SUP_L :OUT_O :SUP_O ||< STARTの刺激があると、この生物の体内ではOUT_Hが作られ始めます。OUT_Hの刺激でOUT_Eが作られ、OUT_Eの刺激でOUT_Lが作られます。OUT_Lの刺激でOUT_Lを作ると、OUT_Lがずっと作られっぱなしになってしまうので、それを抑制するタンパクSUP_Lを作って抑制しています。このOUT_LとかSUP_Lとかは人間がわかりやすいようにつけただけの識別子で、実際の制御はその頭に付いている+と-と:で決まっています。:で始まる識別子が「作られるタンパク質」で、+と-は、まあご想像通りでしょう。 このコードを読む上で重要なポイントは、行の順序が全く関係ないという点です。行をシャッフルしても挙動が変化しません。それどころか、他の遺伝子を持った生物と混ぜあわせても、文法的には問題ありません。運悪く使っている識別子がかぶってしまうと、予期していない実行フローが発生します。でも、もしかしたらそのフローによってより環境に適応できる個体が生まれるかも知れません。うまくいかなかった個体は子孫を残さずに死ぬことによってデリートされ、うまくいく個体だけが残っていきます。 今回実装した処理系は、さらに進めて行より細かい単位で混ぜたり、突然変異と称して一文字消したり足したり書き換えたりをしても、文法エラーにならないことを意図して実装しています。そこらへんのことをためしてみるのも面白いかも知れませんね。 あとはよりプログラミング言語っぽいチャレンジの方向性としては、数値をどうやってタンパク質で表現するかですかね。すべての値がタンパク質なのでタンパク質指向プログラミングですね(ぇ) </body> <comments> <comment> <username>nowokay</username> <body>イメージ的に、DNAコンピュータみたいですね。</body> <timestamp>1324898011</timestamp> </comment> <comment> <username>shiro</username> <body>「条件が満たされたら発動する」ってのはPrologみたいですが、遺伝子とのアナロジーで変数の扱いってどうなりますかね。<br>言語として変数が使えるように拡張するのは多分できるけれど、現実の遺伝子に対応させて考えるとよくわからないような。<br>でも突然変異が可能になると適当な評価関数作れれば進化させられるのでおもしろそうですね。</body> <timestamp>1324904759</timestamp> </comment> <comment> <username>nishiohirokazu</username> <body>ソースコードを切ったり貼ったり文字を挿入したりしても文法的にvalidなので、あとは適当な評価関数があれば半加算器くらいになら現実的な時間で進化できそうです。<br>変数に関して。今回はモデルを簡単にするために離散的な時間にしていますけども、実際にはタンパク質は作られたあと拡散したり分解されたりして消滅するまでの間、ある程度の時間継続して存在しています。なのでbool値しか書けないexpire付きの値がたくさんあるような状態です。<br>今回のモデルでは分解酵素がとても強くて1ステップですべてのタンパクが分解されるというモデルにしてあるので、half_adder.gnmの中では入力の値を保持し続けるために「タンパクXが存在する時にはタンパクXを作る」というルールが入れてあります。このルールに「タンパクRESET_Xが存在しない時」というサプレッサー項などを付け加えて少しいじればフリップフロップと同じ構造を作ることができます。</body> <timestamp>1324950710</timestamp> </comment> <comment> <username>shiro</username> <body>ああ、変数というのは単に状態を保持する機構という意味ではなくて、コードの塊をパラメタライズするものの方を考えてました。パラメータとか引数とか言った方が良かったですね。「任意のタンパク質X, Y, Zに対して『XとYが発現した時Zを発現させる』という動作をするコード片」というようなコードが書けるのかなあ、ということです。これの有る無しで言語としては質的な差が出てくると思うので (というか、パラメータ無しでチューリング完全にできましたっけ? なんとなく有限状態機械までしかできないような気がするんですがあんまりちゃんと考えてません)。<br><br>なので具体的な疑問としては、(1)DNAのメカニズムとしてパラメタライズに相当するものはあるのかなあ、(2)無いとして、無くても十分に強力な演算力があるのかなあ、というようなことが頭にあったのでした。</body> <timestamp>1324970123</timestamp> </comment> <comment> <username>nishiohirokazu</username> <body>なるほど。共通の処理を関数にまとめるといったたぐいの抽象化のことを指しているという理解で正しいでしょうか?であれば相当するものはないと思います。<br>そもそもその手の抽象化機構が必要になるのは、人間の認知能力の限界があって抽象化しないと理解しきれなくなるです。でも、DNAを使ったコーディングはコードを理解せずに行われるので、抽象化が必要にならなかったわけです。少なくとも人間程度の有限状態機械を実装する上では。<br><br>モジュール単位でのON/OFFに近い機能は必要になったらしくて、ある程度長いDNAをタンパク質に巻きつけて発現不能にしたり、DNAをメチル化して「当分使わない」フラグを立てたりはされていますが、まあパラメトライズとはかなり違いますよね。基本的に全部がグローバルな名前空間に置かれているイメージです。</body> <timestamp>1324977824</timestamp> </comment> <comment> <username>shiro</username> <body>なるほど > 「少なくとも人間程度の有限状態機械を実装する上では」<br><br>抽象化はコードの情報密度を上げるので、変異の影響が大きくなりすぎる可能性もありますしね。遺伝的進化とはあまり相性が良くないかもしれません。<br><br>そうやって実装された有限状態機械がひとつ上のレイヤでチューリング完全な動きをする、っていうのは、まあ、シリコン上の回路で実装された有限状態機械でチューリングマシンがエミュレートできるってのと同じですね。</body> <timestamp>1324979389</timestamp> </comment> </comments>

"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]