読者です 読者をやめる 読者になる 読者になる

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」と考えているからここで書き込まれている…

日本 Ruby 会議 2007

http://jp.rubyist.net/RubyKaigi2007/index.rbx/tb/TrackBack 今週はおかげさまで内容の濃い週末を過ごせました。英語のプレゼンテーションを初めて聞いて、内容が全然分からずへこみ気味。英語重要。 一番興味を持ったのはscRUBYtとAP4R。 AP4Rは他の仕事…

Magic Squares (#124)

奇数のみ class OddMagicSquare attr_reader :square, :order def initialize(order) @order = order @square = case when order % 2 == 1 then odd_order else make_square(@order) end end def show @square ? @square.map {|l| l.join(",") }.join("\n") …

Huffman Encoder (#123)

回答 # Ruby Quiz Huffman Encoder #123 module Enumerable def stable_sort_by(&block) i = 0 self.sort_by {|v| [block.call(v), i+=1]} end end class HuffmanEncoder def initialize(data) freq = Hash.new data.split(//).each do |c| freq[c] = 0 unle…

Fizz-Buzz問題

どうしてプログラマに・・・プログラムが書けないのか? ruby版 (1..100).each do |i| print "Fizz" if i % 3 == 0 print "Buzz" if i % 5 == 0 print i if (i % 3 != 0 and i % 5 != 0) puts "" end これで僕も集団から抜け出せました。

[http://d.hatena.ne.jp/nappa_zzz/20070429:title]

こんなもんでよいのかな。 # Ruby Quiz #122 # checking credit card # class CreditCard def initialize(number) @number = number nomalize = number.gsub(/\s/,"") @type = check_type(nomalize) @valid = check_valid(nomalize) end def valid? @valid e…

irbでrequire 'nkf'がfalse

何で?nkfちゃんとインストールされていないの?って思ったら、irbがKconvを読み込んでいて、それのおかげでnkfも読み込まれているからこうなるのか。

OpenStruct の inspectの謎

言語処理系とかでpritty printを作ってる人にとっては、べつに謎でもなんでもないんだろうな。このinspectは組み込みのpメソッドで出力するときに呼ばれるメソッド。OpenStructの場合はこれ。 def inspect str = "#<#{self.class}" Thread.current[InspectKe…

マルチスレッド難しい

アルバイト先からAmazon.co.jp: dRubyによる分散・Webプログラミング: 関 将俊: 本を借りてマルチスレッドのプログラムを久しぶりに書いた。 もうデットロックしまくりで困る。rubyは言語レベルのスレッドだからなのかすべてのスレッドが停止するとデットロ…