http://www.cs.tuat.ac.jp/index.cgi?mode=each_html&each_no=71
なんとも恥ずかしい書かれ方である.多分,指導教員の先生が書いてくれたんだろう.何喋るか.
RubyKaigi2007 CFP ですが、延長も考えてたんですが、駆け込みが多かったので延長はなしの方向で。
もし卒修論などで忙しいとかあって、2月初旬に出したい! って人が居れば、先にご連絡ください。応相談です。ネタによる。
しかし,今回も「あっ!」という人が居て凄い良い感じ.これは行くね,俺は.
http://pc10.2ch.net/test/read.cgi/tech/1164885714/668 ちゃんと全角スペースにしてるんだなぁ.
RubyKaigi 2007,プレゼンテーション応募してね.概要は後で〜...,でも,タイトルによっては可能かも.要するに何をやるかわかるものなら.審査でわかれば可能.それによって判断しますから.
うーん,正月にLingrのプロトコルを調べたのと比べて,いろいろ変わってるっぽいなぁ.素直にAPI使うかー.
Rubyは十分higher orderなので(と某hagya先生が言っていた),関数型は受けないってこたないんじゃなかろうか.硬派な(?)関数型言語はとっつきにくいってのはあるだろうけど.
rubykaigi2007 cfp をどこで宣伝するのが効果的なんだろう,と思ってみたけど,思い浮かばず.
そういえば,牧野先生のスーパーコンピューティングの将来の未読が大変たまっていた(夏から全然見ていなかったので)のをたまたま発見(あるキーワードでぐぐったら見つけた)したので,先日2,3日かけて読みふけってしまった.ほんとうに一日中.
なんか,もうね.自分が今お仕事でやらせてもらっている話に絶望しちゃって大変だった.まぁ,どちらかというとそっち方面に行かないように話をもっていくのがいいのかなぁ,という気がする.ちょっとだけ.
いやはや,しかし何時も思っていますが,世の中には凄い人が沢山居るものです.一度お話を聞いてみたいなぁ.
まつもとさんにコミットされてしまったけれど、tool/parser.rb だけじゃなくて、tool/compile.rb にも同じ問題があります。その辺は以前から知っていたんだけど、コミットしていなかった(最初は JRuby の連中に教えてもらった)。コミットたまってるんだよなぁ。ううむ。
NaCl@秋葉原に初めて行った。ベルが無いので入りづらかった。
おかげさまでだいぶ風邪は治った気がします。
すげーー。
風邪がきつくて、熱でぼーっとしてしまう。しょうがないので、Ruby で STM を実装してみた。1 クラス限定、ネスト考慮なし。
require 'thread' module STM def stm_initialize @__stm_lock__ = Mutex.new @__stm_version__ = 0 @__stm_log__ = nil end def atomic committed = false m = @__stm_lock__ Thread.current[:__stm_log__] ||= {} until committed version = @__stm_version__ log = Thread.current[:__stm_log__][self.__id__] = {} yield m.synchronize{ if @__stm_version__ == version log.each{|k, v| instance_variable_set("@#{k}", v) } Thread.current[:__stm_log__][self.__id__] = nil @__stm_version__ = version.succ committed = true else # p :retry end } end end def self.included klass def klass.atomic_attr *args args.each{|arg| sym = arg.to_sym self.module_eval %Q{ def #{arg} if Thread.current[:__stm_log__][self.__id__] Thread.current[:__stm_log__][self.__id__][#{sym.inspect}] || @#{sym} else @#{sym} end end def #{arg}=(v) if Thread.current[:__stm_log__][self.__id__] Thread.current[:__stm_log__][self.__id__][#{sym.inspect}] = v else @#{sym} = v end end } } end end end class AtomicClass def initialize stm_initialize @a = 0 end include STM atomic_attr :a end class SynchronizeClass def initialize @a = 0 @m = Mutex.new end attr_accessor :a def atomic @m.synchronize{ yield } end end def test klass max = 10000 x = klass.new t = Thread.new{ max.times{ x.atomic{ x.a += 1 } } } max.times{ x.atomic{ x.a += 1 } } t.join end require 'benchmark' include Benchmark bm{|b| b.report{ test AtomicClass } b.report{ test SynchronizeClass } }
まぁ、どう考えても今の Ruby には必要ないよな。使い方も難しい。atomic の中で副作用のあること(入出力)とかやっちゃうと、目もあてられない。
まぁ、要するにろっくふりーなわけです。多分。
ある region において、transaction の対象にしたいものは、多分だいたい決まっているので、ある特定のオブジェクト限定にするのは、それなりにりーずなぶるだと思う。んだけど、聞かない気がするな。研究する価値も無いって? それとも知らないだけか。もし無かったら、提案してみよう。
... つーか、オブジェクトだとメモリじゃないじゃん。オブジェクトを対象にすると何ていうんだろうな。これなら必ずありそうだよな。
先日の Intel のセミナーで HTM をサポートするって言ってたよなー、と思いながら、検索をかけてみらたら http://journal.mycom.co.jp/articles/2007/01/08/micro2/001.html がひっかかった。いやー、大変よくまとまっています。しかし、例が DB の Transaction そのまんまってのは、誤解を生むんではなかろうか。
この機構は、ll/sc の ll bit や投機実行で利用する reorder buffer(あれ、投機実行時のメモリの格納先って、違ったっけ。違うような気がするな。どこだったっけ>大和君、とか名指しで聞いてみる)、よりも高級(広範囲で利用可能)で、コンパイラ屋さんとか、ライブラリ屋さんがほしがっている TM 機構よりも低レベルなわけですな。このギャップをどう埋めるんだろう。
なお、他のプロセサにより書き換えが起こっていなくても、キャッシュラインがスワップアウトされるとマークビットがリセットされてしまうので、本当に書き換えが起こった場合と区別が付かないが、その場合には、STMに戻って、ソフトウェアでデータの値を比較して書き換えの有無をチェックする。
おお、STM は、ちゃんとやらないといけないのか。
たまには研究っぽいことも書いておかないと、赤黒木も知らないような素人に思われてしまうようなので、書いておこう。
... 人の読んでるだけだから、やっぱり全然素人と変わらない気がしてきた orz 赤黒木も、存在は知っているけどアルゴリズムはもう忘れてしまっているので、やっぱり素人です、ごめんなさい。balanced tree って作ったこと無いんだよな。
なんというか、転職も考えたくなるものです。
私の所属は創造情報というところなんですが、メールのヘッダとかで、創造情報助手の〜、って書くんですよ。そこを typo って、想像上助手の〜 と書いてしまうことが多い。やっぱり仮想就職だったのか。
前も書いたような気がするな、このネタ。
熱でどーしょーもなくつらいときに限って仕事が沢山。うううう。寝たい。でも、今週末もRubyKaigiミーティングだから休めない。日曜日は寝るぞ。
これ?>http://www.atdot.net/~ko1/diary/200607.html#d25
Googleの金田さんにご講演していただきました。大変興味深い内容でした。あれを一人でやるんだから、凄すぎるよなぁ。
Freenode#ruby-lang で、お前語彙増やせよ、といわれた orz
職場の下のほうで情報爆発なんとか、ってのがやってたので行ってみた。偉い先生方が勢ぞろいだった。こそこそとポスターを眺める。上田先生直々に LMNtal のお話を伺う。とてもプログラミングがしやすい、ということでしたが、はてさて。そういえば、住井さんにスルーされた。しょぼん。まぁ、わからないよね、顔とか。
全部面白そうだったけど、なかなか話が聞けず。うーん、積極性が足りない。
この日記にはエントリにタイトルをつけていない。というのは、日記なんぞにいちいちタイトルをつけるか、という理念による。というわけで、この日記は人様に見せる風体をなしていないということです。ただ、もしタイトルをつけるのなら、これは「Googleのレベル」とでも付けるんだろうなぁ。
Google さんからイベントのお知らせを頂きました。有難いことです。が、なんかたくさんメールアドレスがついて Cc してるんですけど。そーかー、あの人のところにも話が行ってるのねー、などと、いろいろ想像できて楽しい(妄想はしない)のですが、これはかなりありえない。Google さんでも、やっぱり中の人にはこういう人もいるのねー。
てゆーか、Googleさんに教えたのは職場の名刺にしか書いていないメールアドレスだよ。うーむ。
しかし、なるほど、こういうところに声かけまくってるんだな、という勉強にはなった。
このイベント自体は公開なんだか非公開なんだかわからんな。文面には招待、とあるが、案内サイトは認証ないしな。学生さんに勧めていいのかわからない。聞いてみるか。返信するとき、このCc アドレス全部に返信したら顰蹙だろうなぁ。
rubyco さんの日記のあれは、釣りだったんだろうか。釣られた? 釣られた?
プログラミングは難しいものであるのはその通りで、それを改善していくのもわれわれの仕事だけど、あんまり簡単になっちゃうと仕事がなくなっちゃうなぁ、なんて。
熱でぼーっとしている。
なんか、どーーっと寝てしまった。
明日、こんなことをするので、興味のある方はご参加ください。
第6回仮想化実装技術勉強会 日時: 2007年1月23日 (火) 18:30 〜 場所: 秋葉原ダイビル13F 東大秋葉原拠点 大会議室 (http://www.i.u-tokyo.ac.jp/map/index.shtml#aki 定員 40 名) 題目: 「単一システムイメージを提供するためVMMと、AMD-Vを対象とする軽量VMM」 講演者: グーグル株式会社 金田憲二氏 講演概要: 我々は、Virtual multiprocessorとTiny VMMという2つの仮想マシンモニタを 設計・実装した。 Virtual multiprocessorは、クラスタ上に共有メモリ型マルチプロセッサマシ ンを仮想的に構築する。この機能によって、クラスタを非常に簡便に利用するこ とが可能となる。例えば、共有メモリ型マルチプロセッサマシン用の並列アプリ ケーションを、無変更のままクラスタ上で実行することが可能になる。さらに、 マルチプロセッサをサポートする OS (例えはばLinux)を、少量の変更で仮想マシンにインストールすることが できる。我々は、8 台の物理マシン上に仮想的に 8-way のマルチプロセッサマ シンを構築した。そして、その仮想マシン上で互いに独立な粗粒度タスクを並列 に実行し、その実行時間を測定した。この実験の結果は、我々のアプローチで現 実的な性能を達成できることを示している。 Tiny VMMは、AMD64のもつ仮想化支援機能を利用した仮想マシンモニタであ る。設計・実装をシンプルにする事で、教育や研究のための基盤として利用可能 にすることを目標としている。約3000行のCプログラムで、簡単なプログラムを 仮想マシン上で実行できた。
同じ内容で話は聞いたんだけど、すげー面白かったですよ。とても小規模な勉強会なので、とても質問がしやすい感じです。
こういうのの案内ってどこに出すのがいいのかなぁ。
なんか 2ch でまたてきとーなことを言われているな。
http://pc10.2ch.net/test/read.cgi/tech/1164885714/508
508 :デフォルトの名無しさん :2007/01/20(土) 11:54:17 >>506 JRubyはじまったな Yなんとか涙目
な、涙目なんかじゃな...うぅっ。
JVM は Sun からオープンソースで公開された(る? よく知らない)んだから、VMの性能で勝てるわけが無いわけですよ。つぎ込んでいる人材(人数や優秀さ)が違う。ライブラリも充実してるし、並列実行もサポートしている。唯一足りないのは Ruby を自然に表現するVMモデル。
ふむ、Ruby用にモディファイしたら最強だな。うーん、やってみたい。でも、JVMのソース読むだけで大変そうだ。誰か完全解説書いてくれないかな。
ちなみに、Olaとはchatで何度かいろいろと議論しました。多分、今度共同研究します。主に職場の政治的理由で。
http://pc10.2ch.net/test/read.cgi/tech/1164885714/513
まぁ彼らは前からバイトコードな人達だったわけだし、設計上最適化の余地があって、それをしてきたわけじゃまいか。
別に JRuby の連中は前からバイトコードじゃないと思ったんだけど、違うのかなあ。JRuby にJavaコンパイラ作ってる人たちがかんでるってのは聞いたことないし。今度聞いてみよう。
それよりも、昨日、初めて就職活動イベントに行って来ましたよ。主な目的は、まぁまつもとx鵜飼両氏を見に行くためだったんですが。
ちょっと遅れていったら立ち見ですよ。この俺を立たせやがってこれだけの人数を集める両氏は、やはりすごいです。まつもとさんのトークは言い訳が目立っていて聞く人の心をつかむ、いつもどおり素晴らしいものでした。
一言感想を言うとすれば、全然OSSと関係なくて、達人プログラマーやJoelとかで読んだような話だなーと思った感じ当たり前のことを権威のある人たちがきちんということで、世の中を良くしていくんだな、ということを再認識しました。
ところで、まつもとさんが心に残る素晴らしい言葉を言っていました。「嘘をつかない」。... いや、まつもとさんに言わせれば、「そのときはそう思ってたんだよ」ということなんだろう。
いや、ほんと、当たり前のことを権威のある人が言い続けることは大事だと思うし、それを当たり前と思わない人がたくさん居ることも今日のイベントを見ていてよくわかったので、やっぱりすごいなーと思うわけです。
当たり前じゃないことって、世の中にあんまり無いしね。
私は、どうも「当たり前」のことは当たり前だろうと思って言わないことが多いのです。何かに気づいたりしたとき、「これは当たり前だろう」と思って、よく私は口を噤むんです。でも、ほかの人がそれについて声に出して言うと、周りは「おー」と言うんです。で、議論が進む。お追従かなとも思っていたんだけど、何度もあるので、これはどうも口に出さない私が違うんだなぁ、という感じです。口に出すこと重要ですね。「おいしい」とか「いいね」とか、「ありがとう」も、きちんと口に出さないと通じないわけですよね。うん。
当たり前のことを当たり前に言う、大事ですね。教育ってそういうところもあるんでしょうね。
で、折角有楽町まで出てきたので就職活動してみる。任期が切れたら無職なので、就職活動はしないといけないわけです。
Googleのブースには、以前会社説明してくれた方がいたので挨拶。金田さんも居たけどほかの人の対応していたので挨拶はなしで。いいなぁ、Google。粗品はくれなかった。
フロアを回っていると、いろんな企業から声がかかる(手当たり次第、とにかくかけていた)。いくつかの企業でRubyの話を振ってみたけど、乗ってくれた人は居なかったなぁ。少し話しを聞いてみたけど、あんまり私の活躍できる職種はなさそう。
あと、なるべく「人事の人」に、技術の話を聞くってことをやってみた(どんな技術者がほしいんですか、って感じで)。やっぱり、ちょっとでも突っ込んだことに答えられた人は居なかったな。あ、東京エレクトロンの人は、もしかしたらよくわかっていたのかもしれない(私が質問が下手でうまく確認できなかった)。
なかなか新鮮な体験だった。企業の中のことを聞くというのは、ほとんど機会が無いので。
そういえば、エンジニアの人も、技術の詳細はあんまり教えてくれなかったな。そりゃそうか。ウェブアプリケーションの開発者の人に、キャリアパス的にJavaやC#しか使わない会社の方針があるのでRubyなんかは使わない(使えない)(個人的にはツールとして使っているらしい)という話を聞いた。
有楽町から秋葉原まで、歩こうと思って、神田まで行ったところで麻婆豆腐専門店(?)というのがあったので入った。3時くらい。たまにはいいね。1年に一度くらい。
atdot.net のメールサーバが「ディスクがいっぱい」と言って、またつながらなくなる。しょうがないので、svn リポジトリをほかのパーティションに移す。
須藤さんに誘われて、vincent(ヴァンサンと読むそうだ)さんの歓迎会に出席。武藤さんに初めてお会いする。ちょっとNaHiさんに似ていた。
いろいろ興味ぶかい話を聞くことができ、新宿見学ができた。
帰ってみると、またメールサーバがエラー出している。/var/spool の容量は大丈夫なはずなのになぁ、と思って調べてみると、inode数がいっぱいだったという罠 orz
犯人は rgrey だった。IPアドレスのデータベースに「ファイル名」を利用しているんだが、こいつが10万アドレス(要するに10万ファイル)ほどになっており、1GBの /var の inode がいっぱいになっていた。とりあえず全部消した。rm * で消せないので悩んだ。
rubyとdbm で rgrey 書き直そうかな。面倒そうだよなぁ。今だったら taRgrey かなぁ。
で、日記を久々にたくさん書いてみた。
明日は立石さんインタビュー。Wii やりたい。
そういえば、atdot.net をそろそろ次のマシンに変えようかなぁ(256MBメモリはつらい)と思っていたけど http://h50146.www5.hp.com/products/servers/proliant/campaign/proliant_50off.html を見て、次も ProLiant にしようと決意してしまった。
お、そういえば Java はブロック中のローカル変数の再定義(ブロックで、外のブロックのローカル変数を新しくローカル変数として導入する)のは駄目なのね。これは明快だな。やっぱ、エラーにするべきだな。
class SC { public static void main(String args[]) { int i = 0; if (true) { i = 1; int i = 2; i = 3; } System.out.println("" + i); } } #=> sc.java:5: i は main(java.lang.String[]) で定義されています。 int i = 2; ^ エラー 1 個
しかし、それは do |a; b| ... end を許せばいいだけで、var なんてやっぱり要らないなぁ。
外側を明示的に参照するなんてどうかな。
a = 1 iter do a = 2 outer.a = 3 end p a #=> 3
いや杉。
西尾さんちが大変なことに。ドメイン更新忘れた?
「好きです」も、きちんと口に出すとムフフなことになるかも♪
わたしの使ってる postgrey ってやつは Berkeley-DB だったんですが、atdotはqmailで運用しているんでしたっけ?(postgreyはpostfix用)
ご心配をおかけしました。更新を忘れてもしばらくは他の人に取られないそうな。まぁあのドメインを取りたい人はあまりいないと思うけども。
わざわざお越しいただきありがとうございました。またよろしくです。
ささださんはGoogleには行かないんですか?
いやー、取ってくれるなら行きたいんですが。
:= みたいな、何かよくわからんもの導入するよりは、var foo のほうがいいな。
しかし、
foo = 1 var foo = 2
ってやったら、どうなるのかさっぱりわからん。エラー出すべきなんだろうな。JavaScript は動くらしいが...。
iter |; foo| end
だけじゃ駄目な理由ってなんでしたっけ?
メールサーバがとてもやばい。
C++ だと、
int main(){ int i = 0; if (1) { i = 1; int i = 2; i = 3; } printf("%d\n", i); }
また JavaScript と違う。これはこれで気持ち悪い。
え、エラー出すべきなの?2番目のfooで1番目の「外のfoo」が隠されている状態になると思ったよ。
JavaScriptで、
function test() { var foo = "a"; function inner() { foo = "b"; var foo = "c"; } inner(); return foo; } document.write(test());
とか。って、こういう挙動のことを言ってるのかな。これすげー気持ち悪いんだけど。
トラックバック>http://www.nishiohirokazu.org/blog/2007/01/pythonjavascript.html
うーん、おいらも普通に自然な挙動に思えるのですが・・・
どれの挙動が自然? 少なくとも、C++とJavaScriptは異なっているので。
なんというか。やっぱり研究って全然外に出てないよな。よろしくない。俺でもわかるようなすげー簡単なことだったりすることが、全然理解されていなかったり、知られていなかったりする。
ああ、社会人失格。
gccint-4.1.1.chm を作成。誰かこれ日本語に訳してくんないかな。
SPE Runtime Management Library - http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/771EC60D862C5857872571A8006A206B/$file/libspe_v1.2.pdf
おーー。
http://staff.aist.go.jp/toru-nakata/sotsuron.html
大変よくまとまっていてすばらしい。自問自答している内容がいろいろ書いてある。工学的、とくに情報よりではないところでギャップがあるんだけれど。そして、ますます考えて、よくわからなくなる。
ところで、
「どうか真相を暴いてください。それだけが私の望みです」(前原圭一)
を見て唖然としたのは俺だけだろうか。
さて、修士論文を書いている学生さんに教えるべきだろうか。12月だったら間違いなく教えていた。あと10日の学生さんにこれを見せるのはどうなんだろう。見せないで、エッセンスだけ伝える方針で。
http://www.microsoft.com/japan/msdn/community/askexperts/ C#の偉い人のインタビュー。意外と突っ込んだ内容で面白かった。LINQは宣言的なので、PLINQという並列化プロジェクトをやっているって話が興味深かった。LINQにはそういう思惑もあったのか。なるほどー。
.NET に STM を入れるって、想像ができん。実際、どうなっていくんだろう。とりあえずプロセッサ待ちではないのか。
どんどん宣言的にしていきたい、という話が印象的だった。
http://itpro.nikkeibp.co.jp/a/it/plwatch/watch0112/watch_23.shtml
大体同意。
コンピュータの仮想マシン化もコンピュータ教育の表層化をもたらしている。
ここがよくわからんかった。
しかし、自分が体系的な思考・研究プロセスをぜんぜん持っていないことに、恐怖を感じる。うぅ。
血の気が引いてしまった。本当に、ご迷惑おかけしました orz
VMの上だけいじってアセンブラとかOSをやらないってことじゃないかな > 表層化
いや、VMの上ではOSもアセンブラ知識も必要ですから!
VMの上だと、プロセッサとの協調設計とかしないじゃん、とゆー崇高なツッコミなんでは?
そこまで言うのなら、VM上で効率的に動作させるための何か、とかいろいろ研究分野が広がっている現在にそぐわないと思いますよ。
もっと下のレイヤの電気回路やデバイスなどのレベルまで含めて体系化しましょうよ、ってことではないでしょうか。
ActiveRecord で、同じユーザ名(ここでは ko1)を許さないようにするには、transaction を使って select すればいいらしい。
2.times{|i| User.transaction{ raise "account duplication" if User.find_cond(:first, "name" => "ko1") user = User.new user.name = 'ko1' p user.save } }
なんとなく、DB のトランザクションってロックするってイメージがあんまりなかったけど、AR の場合はロックになっちゃうらしい。
http://www.rubyist.net/~matz/20070110.html#p06
何の注釈もつけずに map/reduce って言葉を使うのは、なんとも乱暴な気がするけれど(Ruby には map はあるし、reduce も inject があるし、みたいな)。
しかし、何度か書いたけど、今似たようなことを仕事でやっている。やってみてちょびっとわかったのは、結局メモリのほうがボトルネックになっちゃって、まずい。2 core でこれなんだから、100 core くらい乗せると、もう駄目駄目でしょう。やっぱり、そんなに単純じゃない。
じゃぁどうすればいいかっていうと、多分コンパイラががんばったりOSががんばったりしないといけないのではなかろうか。とりあえず、今の延長じゃむりぽ。
つ validates_uniqueness_of :name
トランザクションを使ってるってことは、実際には複数のモデルをまとめて save するとか、そのへんかもしれませんが。
あ、的外れだったかも。書き込み時点の一意性を DB 側で制約をかけたりせずに保証したいってことですかね?
リファレンスを読んでも、何がどう uniqueness を保障するのかわかりませんでした。もし、同じ名前を突っ込んだらどうなる? 例外?
まあ、あの文章の主要な対象は最上さんなんで。 で、やっぱりRuby(っポイ言語)でのmap/reduceは難しいんですね。 そう簡単だったらいいなあって思ったんですけど、甘くないのか。
いや、100coreでやったことないからわかんないっすけどね。メモリローカリティを高くするための何らかの仕組みは要ると思います。ライブラリに全部吸収できるのが一番いいんですが(それが Fortress なので、Ruby でできないことは無いのかもしれません)。最近は、全部インライン展開できるような、プログラムを全部解析できるような言語仕様がいいなぁ、と思っています。でも、リフレクションは無いとつらそうだなぁ、とか。その辺のバランスが取れた、最適化しやすい言語を、ちょこっとだけ考えています。
そこでNiagaraですよ。使ってみませんか?
もちろん使いたいですねぇ。
では、中の人に相談する方向で。東大なら受け皿はある、と
基本的にやってることはささださんのコードと一緒です。uniq制約をつけたカラムで select して、ヒットしなけりゃ OK ということで。ロックをかけてるかどうかはちょっと失念。すみません。
で、例で言えばすでに name が "ko1" なレコードがある場合にさらに name が "ko1" なモデルをsaveしようとする場合、
さらに、AR::Base#errors で validation してみた結果のエラー詳細がとれます。
http://swikis.ddo.jp/umejava/38 が面白そうで、職場からも近い(地図上で見ると 0 m離れている)ので、申し込もうと思ったら、梅澤さんにメールが届かなかった(failureとなって返ってきた)ので断念。別の新年会もあるそうなので、そっちに行くことにした。大変楽しそうなので、メールを弾かれなさそうな人はぜひ行ってみるといいんじゃないかと思います。というか、行ってレポートして。
肩が痛い。
東京に戻ってきた。
http://www.amazon.co.jp/o/ASIN/4798111112/
うう、高い。が、買うか。人として。
買って来ちゃった。ついでにWrite Great Code vol.2 も。
るるりんが 2ch の補足が止まっていた(URLが変わっていた?)ので、見てなかったんだけど、http://pc10.2ch.net/test/read.cgi/tech/1164885714/372 に吹いてしまった。
げんしけん9巻をなぜか1500円くらいで購入。楽しかった。
ゼルダ楽しすぎて沢山やってしまった。すみませんすみません。
明日は職場に避難しよう。
TRV とか TVM とか、なんか別のものに見える。
eban さんからは、YA に別の意味を探せば、と言われた。何がいいかな。
Exerb って、Ruby と分離しちゃったほうがいいんじゃねぇかなぁ。
YARV Ain't Ruby VM (じゃ、なんなんだ)
YAT 安心! Ruby VM
分離って具体的には? (スクリプト+スクリプトエンジンなんでもOKというような意味?)
You Are Ruby V
ああ、わかった。requireをGemみたいに後から変えるようにすりゃいいわけだからか。
いや、そうじゃなくて。Exerb の本質は PE 弄るツール(そして、おまけの Ruby 関係ファイルまとめ機能)だと思ってるんだけど、それは Ruby とは無関係なものなんじゃないかと思うわけです。なので、PE 弄るツール(PE 弄ってファイルまとめるツール)として独立させて、Exerb はそれのフロントエンドにするのが良いのではないか、と。そうすると、Ruby に限らないで使えるようになるわけで。
親プロセスで作ったスレッドを fork 後の子スレッドが pthread_join したらどうなるのか。
#include <pthread.h> #include <stdio.h> void *func(void *p) { sleep(10); } main(){ pthread_t tid; pthread_create(&tid, 0, func, 0); if (fork()) { /* parent */ //printf("parent/join: %d\n", pthread_join(tid, 0)); sleep(10); } else { /* child */ printf("child/join: %d\n", pthread_join(tid, 0)); } }
Darwin Kernel Version 8.8.0 だとブロックしっぱなし。Linux 2.6.17-1.2174_FC5 だとスグに 0 (成功)を返した。そして cygwin は ESRCH。cygwin が一番正しいという。
久々にさっぱりわからないバグが。
やっとわかった。けどどうやって解決したもんだか、わからない。
http://www.atdot.net/fp_store/b2febj.file/graph.png
Mac OS X on PPC での速度向上比。
svn リポジトリでストレスが溜まっているのでツールを作る日。
ということでツールを作る。
mklog.rb
#!/usr/bin/ruby CMD = ARGV.shift || "svn" DIFFARG = ARGV.shift || "--diff-cmd=diff -x '-wpu'" MSG = ARGV.shift || '' files = [] file = nil `#{CMD} diff #{DIFFARG}`.each{|line| case line when /@@.+@@\s+((\w+)|(?:\w+\s+(\w+)))\(/ func = $2 || $3 files << "#{file} (#{func})" when /\+\+\+ (.+)\t\(.+\)/ file = $1 files << $1 end puts line } #"%Y-%m-%d(%a) %H:%M:%S %Z" # "%a %b %e %H:%M:%S %Y" puts "#{Time.now.strftime('%a %b %e %H:%M:%S %Y')} Koichi Sasada <ko1 at atdot dot net>" puts files.sort.each{|file| puts "\t* #{file} : #{MSG}" puts }
cs-save.rb
#!/usr/bin/ruby require 'tempfile' require 'fileutils' TMPDIR = "z:/" EDITOR ='cmd /c "C:\app\uty\Hidemaru\Hidemaru.exe %A"' CHANGESDIR = './changes' ############################################# def list system("ls -la changes/") end ############################################# name = ARGV.shift || (list; exit) file = File.join(CHANGESDIR, name) # check override if FileTest.exist? file puts "Already exist: #{file}" puts list exit end ############################################# # collect data diff = `svn diff` info = `svn info` status = `svn status` ############################################# # make cs data tf = Tempfile.open('cs-save', TMPDIR) tf.puts <<EOS__ =================================================================== [info] #{info} [status] #{status} [diff] #{diff} EOS__ tf.close time = File.mtime(tf.path) system(EDITOR.sub(/%A/, tf.path)) if File.mtime(tf.path) == time puts "Please write a comment." exit end ############################################# # prepare save directory FileUtils.mkdir(CHANGESDIR) unless FileTest.exist? CHANGESDIR ############################################# # write file open(file, 'w'){|f| tf.open f.puts tf.read } ############################################# # revert current system("svn revert -R .")
cs-commit.rb
#!/usr/bin/ruby EDITOR = 'cmd /c "C:\app\uty\Hidemaru\Hidemaru.exe %A"' ENV['TMP'] = 'z:/' ### # require 'tempfile' file = ARGV[0] || raise body = ARGF.read ### # parse log log = '' open('ChangeLog', 'r'){|f| raise "Write a ChangeLog entry" unless /ko1/ =~ f.gets while line = f.gets break if /^[^\s]/ =~ line next if /^\s*$/ =~ line log << line.strip << "\n" end } ### # prepare edit file tf = Tempfile.open(file) tf.puts log tf.puts body tf.close ### # time = File.mtime(tf.path) system(EDITOR.sub(/%A/, tf.path)) if File.mtime(tf.path) == time raise "not editted" end ### # open(file, 'w'){|f| f.puts File.read(tf.path) }
俺の環境にべったり。
http://en.wikipedia.org/wiki/YARV
誰がこんなに詳しく編集しているんだ...。
if (value) return 0;
は
if (value) { return 0; }
と書いて欲しい。
前から考えていたけれど、send/funcallの最適化をしたい。でも、sendって再定義される可能性がある(ネットワーク系とか)から、ちょっと嫌な気もするんだよな。
やるならどうやるだろ。まぁ、なんとかなる? 作るのはそんなに難しく無さそうだしな。スタックトレースで __send__ とか出なくても怒る人はいないよね? ね?
対応するメソッドは send, __send__, __send, funcall, __send! か。無駄に多いよなぁ。
そういえば、WiiもDSも、飯を食いながらはやりづらいなぁ。
思うんだけど、send(strval)の場合にスタックトレースにsend, *strvalと出るのと、いきなり*strvalと出るのではずいぶんデバッグとかしにくくなるんじゃないかな?
げげ、まじっすか。
良く考えたら慣れだけかも。呼び先のメソッドがsendから呼ばれることを前提にトレースを読めば見えないsendがあるってことでOK。
飯を食いながらでもやりやすいゲーム機ってあるんですか?
PC。
エンジン(違
あけましておめでとうございます。
昨年度は大変お世話になりました。本年度もどうぞよろしくお願いします。
2007年元旦 笹田耕一
去年の大晦日はずっとコミット準備だった。
今年はコミットから始まった。
やっと、YARV をマージしました。もう Yet Another では無いようです。
イトーヨーカドーで Wii が買えた(抽選)。とりあえず、はじめての〜 とゼルダを購入。前者のミニゲーム、面白かったけど、もうちょっと数があったほうがよかったなぁ。
ゼルダは凄い。
で、だめもとでトイザラスを覗いたら、DSが沢山売ってた。黒は無かったが、ネイビーがふつーに買えた。すげぇ。家族が欲しいと言った脳トレと、俺のやりたいFF3を買った。
脳トレ、色を声に出して言うやつが40代だった。
FF3、泣きそうになるほど良い。
オス?あっ。ユウか :p
Rubyのメスってどんなのだろうw
つ ジェンダー論 という感じではありますが、入学志望者急増の予感がします。 (これは行きます,俺が高校生だったら…)