ちなみに

火曜日の空は僕を押しつぶした。

ruby

Re: Enumerable#mins_by

http://ujihisa.nowa.jp/entry/67a15ef440 Experiment require 'benchmark' module Enumerable def my_mins_by(&block) min = min_by(&block) select {|e| e == min } end def uj_mins_by(&b) memo = [] memo_value = 1/0.0 each do |e| value = yield e if …

マジックコメント流し込み

TermtterをRuby1.9対応にするために、こういうのを書いてみた。 Dir['**/*.rb'].each do |f| File.open(f, 'r+') do |io| buf = io.readlines unless /coding:/ =~ buf[0] io.rewind buf.unshift "# -*- coding: utf-8 -*-\n\n" io.write buf end end end す…

Re: Re: Re: Object-oriented negation operators

http://ujihisa.nowa.jp/entry/1801356369 すべてがメッセージ呼び出しと解釈した場合の解の1つ module OOnize def not; !self end def and(other) self && other end def or(other) self || other end def then(other) !self || other end end [ TrueClass…

Re: Object-oriented negation operators

http://ujihisa.nowa.jp/entry/62365f7d52どうせならここまでしたい感じ module OOnize def not; !self end def and(other) self && other end def or(other) self || other end end class TrueClass include OOnize end class FalseClass include OOnize en…

test/unitコピーSimpletestを書きました

http://gist.github.com/39915 minitestへの抵抗という名目で、練習のために書いてみました。ポイントは、 inheritedを使ってサブクラスを覚えておく method_addedを使って、それぞれのサブクラスが持つテストを覚えておく 最初に定義したassertを使って、他…

dRubyを使用したコードのテスト方法

研究でdRubyを使っているのですが、そのとき詰まったのがテストの方法で、しばらく悩んでしまった 今回は僕の使っている方法を書き残しておこうと思う ちなみに、RSpecの使用を前提としている 通信をおこなわない場合 まずは、通信を行わない場合について考…

Hashで任意キーに対応する値の合計

が、したかったので、以下のメソッドを書いたけど、実は組み込みで出来たかもしれない説。 class Hash def summation(*keys) keys.inject(0) do |sum, key| sum += self[key] end end end 以下のように使う h = { :a => 1, :b => 2, :c => 100 } p h.summati…

非同期ブームに乗って非同期mapを考えてみた

require 'benchmark' module Enumerable def amap map {|e| Thread.new { yield e } }.map(&:value) end end ary = [1, 2, 3, 4, 5] res = {} Benchmark.bm(4) do |x| x.report('map') { res[:map] = ary.map {|e| sleep 1; e } } x.report('amap') { res[:a…

Re:多段特異クラス

(追記:普通にmetametametametaclassとかにすれば良かった。修正は一瞬だけど。)多段特異クラス - チナミニで、汚い実装をさらしていましたが、その後お好み焼きを焼いている間に素晴らしい実装が思いついたので報告いたします。 class Class def method_miss…

多段特異クラス

class Class def super_metaclass(level = 1) class_eval <<-EOS #{"class << self\n" * level} self #{"\nend" * level} EOS end end p Object.super_metaclass(100) #=> #

Railsのrake statsの再現

研究で自分がどれくらいテストを書いているのか、を見える化する為に使っているRakeタスク CODE = FileList['lib/**/*.rb'] SPEC = FileList['spec/**/*.rb'] desc 'Report code-spec ratio' task :stats do code = `wc -l #{CODE}`.split(/ /)[-2] spec = `…

一人ブレストという発想はなかった

(追記) 今こんな感じ http://gist.github.com/35468(12/13:追記)コードが途中で切れてしまっています。はてなのサポートにメールを送ったのですが、土曜日だったので、しばらく直らないかもしれません。=> 自力で回避 一人ブレスト用スクリプト - 日本から世…

「Rubyで作る奇妙なプログラミング言語の世界」開催

みんな、大変だ。あのyhara先生のトークセッションが開催されるらしいぞ!http://www.junkudo.co.jp/newevent/talk-osaka.html 気鋭のRubyist、原悠氏がお送りする「奇妙な言語(Esoteric Language)」の世界。Rubyに関心のある方はもちろん、プログラミング言…

Re: 3つ以上の集合の直積を求めるプログラム

http://d.hatena.ne.jp/youkoso_guest/20081212/1229089595 Python3.0を入ようとしたら、マシン固まりかけたり、python_selectとかいうをまで入れろとか言われて、カッとなったので、回答を書いておく。後悔はたぶんしていない。 alphabets = %w[ A B C ] nu…

Module#define_methodの挙動(タイトルが思いつかなかった)

クラス階層関連-ohai日誌を読んでいて、 def self.included(base) class << base private :new _instance = nil def instance _instance ||= new end end end じゃダメなの?と思ったら、ダメだった。 冷静に考えると当然で、この書き方だとinstanceを呼んだ…

Module#module_eval(class_eval)の落とし穴

Rubyの初級テクニック*1であるModule#module_evalですが、初級者には厳しい落とし穴がありました。 ただし、ローカル変数は module_eval/class_eval の外側のスコープと共有します。文字列が与えられ場合には、定数とクラス変数のスコープは自身のモジュール…

Thread.newとThread.startの違い

基本的に Thread.new と同じですが、 new メソッドと違い initialize メソッドを呼びません。 502 Bad Gateway の意味が分からなくて、initializeを呼んでいる分newの方がオーバーヘッドがでかいんじゃないかと思って、ベンチマークとってみたけど、ほとんど…

WWW::Mechanize入門といえば「きたももんががきたん。」ですよね

ある日、ぽーんと自動メッセージ。「ブクマが増えてるよん」 喜びつつ確かめに行ったら、解説に新規ブクマがどっさりさん。ああああああ、あの解説実は古くて、警告の出る List 使いまくりで好ましくないのです。新しいのに書き直したいと思いつつ幾星霜。 R…

Re: ちょっと前のRubyはとても遅かった

ちょうど倍くらい。これはすごいなぁ。 nowa サービス終了のお知らせ 気になるので僕も試してみた。 $ ruby --version ruby 1.8.7 (2008-05-31 patchlevel 0) [i686-darwin9.2.2]これはひどい。 $ time rake spec INTEGRATION=true (in /Users/tomohiro/al-l…

コンテキストスイッチがかからない

スレッドで詰まった点をメモ。研究のプログラムで、dRubyとスレッドとプロセスが絡んでいるのを書いているのですが、あるプロセスで動いているdRubyサービス上のクラスから、別プロセス上にあるオブジェクのインスタンスメソッドを呼ぶようなスレッドを複数…

Enumerable#inject(init, sym)が格好良すぎる件について

Enumerable#map(sym)とは大違いですね(追記、そんなメソッドはない)renconで、多重かもしれないHashの値をhash[:foo][:bar][:baz]といきなりアクセスして取得しても大丈夫なように、1つ1つ取り出して確認して最後までたどり着ければその値を返すというメ…

あるスレッドを別のスレッドから制御する

たとえば、ループするような処理を走らせているスレッドを、メインスレッドから一時的に停止させたのち、もう一度処理を続行させたいときは、以下のように外部のフラグによって停止させると良い。(というか今の僕にはこれしか思いつかなかった。Queueとか使…

Renconプロジェクトを始めました

http://github.com/Sixeight/rencon/tree/master Rencon is commandline interface of Redmine. Sixeight/rencon · GitHub スクリーンショットはVim上のquickrun(quicklunch)から呼び出したところ(半透明が奇麗に写らなくて凄い色にコマンドラインからRedmi…

ModuleやClassにあるname属性をいま知った

===追記 instance method Module#namename -> String to_s -> String モジュールやクラスの名前を文字列で返します。 このメソッドが返す「モジュール / クラスの名前」とは、より正確には「クラスパス」を指します。クラスパスとは、ネストしているモジュー…

後からメソッドを追加できないクラス定義

新しいるりまを眺めながら書いたネタクラス(修正:addedメソッドは消されない様にした) class Foo def original; end def singleton_method_added(name) unless name == :method_added puts "singleton method #{name} was rejected" (class << self; self …

class_evalとsendのコスト

(修正) 何故かinstance_evalとclass_evalを間違っていたclass_evalとsendはどちらの方がコストが高いのか気になったのでベンチマークを取ってみた。 require 'benchmark' module Foo def self.included(base) base.extend ClassMethods end module ClassMeth…

Moduleのincludeとかextendとか

Moduleのincludeとextendまわりの自分用サンプル 基本 module Foo def self.included(base) base.extend ClassMethods base.__send__ :include, InstanceMethods end module ClassMethods # クラスメソッドの定義 end module InstanceMethods # インスタンス…

ClassMethodsかModuleMethodsか

まずは、下のコードを見てください。 module Foo module ClassMethods [メソッド定義] end extend ClassMethods end 違和感を感じませんか? 僕は感じます。Moduleにextendするのに、何故ClassMethodsなのでしょうか?どう考えてもModuleMethodsだと思うのだ…

RSpecからclass << selfが消えた

僕の最近のコードはRSpecからの影響が強かったのだけれど、今日そのRSpecに良く分からない変更があった。 removed all instances of class removed all instances of class << self · 9e2eb70 · dchelimsky/rspec · GitHub 今までは特異メソッドをclass 基本…

Merbでdm-*がnot foundな件

Merb関連のエントリを読んでいたら触ってみたくなったので、入れてみたのですが・・・ $ sudo gem install merb $ merb-gen app myapp $ cd myapp $ merb Loading init file from /Users/tomohiro/program/merb/myapp/config/init.rb Loading /Users/tomohir…