Ruby

最近のyard パーフェクトRuby Advent Calendar 2日目

このエントリは パーフェクトRuby Advent Calendar の2日目のエントリです。 1日目のエントリはパーフェクトRuby Advent Calendar 2013(1日目) - すがブロです。 yard diff いきなりですが、パーフェクトRubyで知った最高に便利なコマンドは yard diff です…

DataMapperでOptimisticLock(楽観ロック)を利用する

dm-core-1.2.0の話です。 DataMapperでOptimisticLock(楽観ロック)を実現するプラグインはいくつか検索でヒットするのですが、古すぎて利用できなかったり、UPDATE文のWHERE句に条件が入るのではなく、プログラム側で判断しているためアトミック性がなかった…

DataMapperのdm-migrationsのマイグレーションファイルの通し番号は重複していても問題ない

dm-migrations-1.2.0の話です。 dm-railsで次のようにdm-migrationsのマイグレーションファイルを生成すると、001から始まる通し番号のマイグレーションファイルが作成されます。 $ bundle exec rails generate migration create_users invoke data_mapper c…

DataMapperで比較的高速にidだけ取得する

dm-core-1.2.0の話です。 現在の検索条件でidだけ取得したい、、10000件くらい。って要望、よくあると思う。:fieldsで指定しても、モデルのインスタンスを作るため、sqlを直接実行した時にはかなわなかったりする。 なので、DataMapper::Collectionに次のよ…

DataMapperとMySQLの組み合わせでDDLにコメントを含める

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…

DataMapperでinに空の配列が渡された時になんとか空のコレクションを返す

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…

DataMapperのクエリチェインが使えない(場合の)話

dm-core-1.2.0の話です。 DataMapperのクエリチェイン(正式名称しらない。。)は特定の条件下(DataMapper::Collection#union(|, +))で利用できない理由と、回避策を調べた。 長いです。 class User include DataMapper::Resource property :id, Serial proper…

DataMapperでinner joinする

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…

DataMapper-1.2.0 + Kaminiari-0.14.1 でORをつかうクエリのtotal_countが動かない

具体的には次の部分が動かない 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…

dm-constraints(v1.2.0)のREADMEの日本語訳

試しに訳してみた。 訳は適当なので間違ってるところもあると思う。 原文: https://github.com/datamapper/dm-constraints/blob/v1.2.0/README.rdoc dm-constraints DataMapperのアソシエーションに外部キー制約を追加するプラグインです。 現在はPostgreSQL…

DataMapperでTwoWaySQLを簡単に使うためのdm-twowaysqlってのを作ってみた。

RailsでDataMapperを使っている人て少ないと思う。Railsを使う場合は大抵新規プロジェクトだから。 でも、世の中そんな簡単じゃなくて、既に動いているDBをRailsで触る必要だってある。例えば次のようなDB。 主キーが文字列だったり日付 複合主キー 主キーの…

遅延初期化する attr_reader を追加するモジュール(改良)

すっきりさせてみた。 # 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_…

遅延初期化する attr_reader を追加するモジュール

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…

nokogiri習作 antのビルドファイルの概要を出力

出力結果 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.…

文字化けしたUTF8の変換

よくある\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…

書き捨てコードのmake(rake)

ちょっと試したいコードを書くときに毎回コンパイラを呼ぶのは面倒。Makefileを書くのも面倒。 てなわけでRakeの習作。ソースコードにフラグを書き込んでおけば、それを利用してコンパイルしてくれる。 ソース Rakefile #==================================…

Y Combinator

なんかはやっているらしい。でも一週間遅れだから乗り遅れ気味。書き換えネタ。 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…

第1回 RHGの逆襲

とりあえず、参加した記録をエントリとして残す。

無限ストリーム

無限ストリーム?遅延ストリーム?のどっちなんだろ?gaucheのリファレンスマニュアルを見ながら実装。 これを使えばrubyでも簡単にSICP 3.5章の問題が解ける!かも。 cycleが解りづらい。構文を定義できないから仕方ないのだけれど、LazyStream::Cons.newの…

SICP ex.4.21

気分転換にやってみたけど、あまり面白くなかった。 # 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…

ElGamal暗号とRSA暗号とRSA署名

(僕と同じ大学の|これらを実装しなければならない)人、どうぞ。遅くて実用性はありませんが、ご自由にお使いください。 ライブラリ配置 |-+ $RUBYLIBが通ってるディレクトリ |-- publickeycryptosystem.rb |-+ publickeycryptosystem |--elgamal.rb |--rsa.r…

ElGamal暗号

レポートで鍵の生成、暗号化、復号を行うスクリプト書いた。1024bit長の鍵を生成するのに、PentiumM 1GHzで3時間くらい回してるけど、ぜんぜん終わらない件について。。 一応条件に1024bit長の鍵を生成することが含まれてるけど、どうしよう。もう書き直す気…

MTASC用

最近rubyをさわっていないのでリハビリ。newproject.rb #================================================== # newproject.rb # require 'pathname' require 'fileutils' # project name input print "Input project name: " project_name = STDIN.readlin…

マイクロストリップ線路のインピーダンス その2

式とか間違っていたので再掲。インピーダンスの計算式が間違っていた。。 # # 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これがすでに固定で、 スト…

Verbal Arithmetic (#128)

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…

rescueは継続?

2chのRubyについて Part 27の135,136,154に対する意見もう、2週間も前の事に意見するのもあれだけど、自分の頭の中を整理するのもかねて書きます。(※僕は135本人じゃないです。)たぶん、136、154は「継続=call/cc」と考えているからここで書き込まれている…