Ruby
このエントリは パーフェクトRuby Advent Calendar の2日目のエントリです。 1日目のエントリはパーフェクトRuby Advent Calendar 2013(1日目) - すがブロです。 yard diff いきなりですが、パーフェクトRubyで知った最高に便利なコマンドは yard diff です…
dm-core-1.2.0の話です。 DataMapperでOptimisticLock(楽観ロック)を実現するプラグインはいくつか検索でヒットするのですが、古すぎて利用できなかったり、UPDATE文のWHERE句に条件が入るのではなく、プログラム側で判断しているためアトミック性がなかった…
dm-migrations-1.2.0の話です。 dm-railsで次のようにdm-migrationsのマイグレーションファイルを生成すると、001から始まる通し番号のマイグレーションファイルが作成されます。 $ bundle exec rails generate migration create_users invoke data_mapper c…
dm-core-1.2.0の話です。 現在の検索条件でidだけ取得したい、、10000件くらい。って要望、よくあると思う。:fieldsで指定しても、モデルのインスタンスを作るため、sqlを直接実行した時にはかなわなかったりする。 なので、DataMapper::Collectionに次のよ…
dm-core-1.2.0の話です。 DDLにコメントを含めたい!という要望があったので。 モンキーパッチ # dm-core-1.2.0/lib/dm-core/property.rb # commentを定義可能にする module DataMapper class Property accept_options :comment attr_reader :comment end en…
dm-core-1.2.0の話です。 DataMapperはinの条件に配列を渡すと次のように良い感じで検索してくれる。 class User include DataMapper::Resource property :id, Serial property :name, String end User.all(id: [1, 2, 3]) # SELECT "id", "name" # FROM "us…
dm-core-1.2.0の話です。 DataMapperのクエリチェイン(正式名称しらない。。)は特定の条件下(DataMapper::Collection#union(|, +))で利用できない理由と、回避策を調べた。 長いです。 class User include DataMapper::Resource property :id, Serial proper…
dm-core-1.2.0の話です。 DataMapperでjoinする話が全然検索に引っかからないので。メモ的に class User include DataMapper::Resource property :id, Serial property :name, String has 1, :profile, 'UserProfile' end class UserProfile include DataMap…
具体的には次の部分が動かない https://github.com/amatsuda/kaminari/blob/master/lib/kaminari/models/data_mapper_collection_methods.rb#L12 module Kaminari module DataMapperCollectionMethods def total_count #:nodoc: model.count(query.options.e…
試しに訳してみた。 訳は適当なので間違ってるところもあると思う。 原文: https://github.com/datamapper/dm-constraints/blob/v1.2.0/README.rdoc dm-constraints DataMapperのアソシエーションに外部キー制約を追加するプラグインです。 現在はPostgreSQL…
RailsでDataMapperを使っている人て少ないと思う。Railsを使う場合は大抵新規プロジェクトだから。 でも、世の中そんな簡単じゃなくて、既に動いているDBをRailsで触る必要だってある。例えば次のようなDB。 主キーが文字列だったり日付 複合主キー 主キーの…
すっきりさせてみた。 # add lazy initialization attribute definition module LazyInitializationAttribute def LazyInitializationAttribute.append_features(mod) super def mod.lazy_attr_accesser name, hook=nil, &block attr_writer name lazy_attr_…
module LazyInitializationAttribute def LazyInitializationAttribute.append_features(mod) super mod.const_set("LAZY_INITIALIZE_BLOCK_TABLE", {}) def mod.lazy_attr_accesser name, hook=nil, &block lazy_attr_reader name, hook, &block attr_write…
出力結果 targetとコメントを抽出 ruby buildxmltarget.rb apache-tomcat-6.0.18-src/build.xml build-prepare [] compile [] Compile internal server components Copy static resource files build-only [build-prepare,compile,package] package [] Commo…
Make Purse Light 多分動くと思う。めちゃくちゃ遅い。 # # Make Purse Light def get_hanging(price, base_coins, payment) sum = 500 * payment[3] + 100 * payment[2] + 50 * payment[1] + 10 * payment[0] hanging = sum - price return false if hangin…
先週に続いてACM/ICPC国内予選突破の手引きの問題をRubyでといてみる。 Exploring Caves # # exploringcaves.rb class KarakuriDoll def initialize @x = @y = @farthest_x = @farthest_y = 0 end attr_reader :farthest_x attr_reader :farthest_y def move…
最近仕事ではPHPばかりなのでRubyを使っていないのでACM/ICPC国内予選突破の手引きの問題をRubyでといてみる。 Hanafuda Shuffle Array#[start, length]で一発で解ける件について # 1978 # hanafuda shuffle def shuffle(n,r) deck = (1..n).to_a.reverse r.…
よくある\u30e1みたいに16進になってしまったUTF8の変換 #!/usr/bin/env ruby # -*- mode: ruby; coding: utf-8 -*- require 'optparse' def main prefix = '\u' suffix = '' parser = OptionParser.new parser.banner = "Usage: #{File.basename($0)} [opti…
ちょっと試したいコードを書くときに毎回コンパイラを呼ぶのは面倒。Makefileを書くのも面倒。 てなわけでRakeの習作。ソースコードにフラグを書き込んでおけば、それを利用してコンパイルしてくれる。 ソース Rakefile #==================================…
なんかはやっているらしい。でも一週間遅れだから乗り遅れ気味。書き換えネタ。 Y = lambda do |x| lambda do |procedure| x.call( lambda { |arg| procedure.call(procedure).call(arg) } ) end.call ( lambda do |procedure| x.call( lambda { |arg| proce…
とりあえず、参加した記録をエントリとして残す。
無限ストリーム?遅延ストリーム?のどっちなんだろ?gaucheのリファレンスマニュアルを見ながら実装。 これを使えばrubyでも簡単にSICP 3.5章の問題が解ける!かも。 cycleが解りづらい。構文を定義できないから仕方ないのだけれど、LazyStream::Cons.newの…
気分転換にやってみたけど、あまり面白くなかった。 # ex.4.21.rb =begin a. ((lambda (n) ((lambda (fact) (fact fact n)) (lambda (ft k) (if (= k 1) 1 (* k (ft ft (- k 1))))))) 10) =end lambda {|n| lambda {|fact| fact.call(fact, n) }.call lambda…
(僕と同じ大学の|これらを実装しなければならない)人、どうぞ。遅くて実用性はありませんが、ご自由にお使いください。 ライブラリ配置 |-+ $RUBYLIBが通ってるディレクトリ |-- publickeycryptosystem.rb |-+ publickeycryptosystem |--elgamal.rb |--rsa.r…
レポートで鍵の生成、暗号化、復号を行うスクリプト書いた。1024bit長の鍵を生成するのに、PentiumM 1GHzで3時間くらい回してるけど、ぜんぜん終わらない件について。。 一応条件に1024bit長の鍵を生成することが含まれてるけど、どうしよう。もう書き直す気…
最近rubyをさわっていないのでリハビリ。newproject.rb #================================================== # newproject.rb # require 'pathname' require 'fileutils' # project name input print "Input project name: " project_name = STDIN.readlin…
式とか間違っていたので再掲。インピーダンスの計算式が間違っていた。。 # # anntena.rb # # アンテナ実験用プログラム # # z impedance # a width # b distance # m margin def ms_impedance(a,b,t) a_d = a + (t / Math::PI) * (Math.log(2*b/t) + 1) 60 …
アンテナの話。 ヘリカルアンテナの製作で、VSWR=5とかいう電波が出ないアンテナを作ってしまった。しかたないので急遽テーパマッチングをすることになったのだけど、 誘電体の厚さ: b マイクロストリップ線路のインピーダンス: zこれがすでに固定で、 スト…
class VerbalArithmetic def initialize(expr) parse(expr) analys end attr_reader :factor, :sum, :table private def parse(expr) term = expr.scan(/\w+/) unless expr.count('=') == 1 && (expr.count('+') + 2) == term.length raise AugmentError, "s…
2chのRubyについて Part 27の135,136,154に対する意見もう、2週間も前の事に意見するのもあれだけど、自分の頭の中を整理するのもかねて書きます。(※僕は135本人じゃないです。)たぶん、136、154は「継続=call/cc」と考えているからここで書き込まれている…