素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

ruby

配列から最小値、最大値を検索する

=begin Reducer 配列等のイテレータから適切な値をスキャンして抜き出すクラス。O(n)である。 Reducer#reduce(iter) iterはempty?とeachメソッドを実装している必要がある。 Reducer#update?(left, right) 抽象メソッドである。 サブクラスでオーバーライド…

ゴミ箱に入れるコマンド

WindowsだとdelコマンドがあるらしいがMacにはない。 javascripter's gist: 177415 — Gist に置いた。 del file1 file2 file_or_directory3のように使う。ファイル名に空白が含まれていても平気。 ファイル名が重なったら、1.foo、2.foo、…という風に数字を…

evalにハッシュを渡せるように

RubyのERB#run、ERB#resultがbindingを受け取るのが気持ち悪いので、ハッシュを受け取れるようにしたらどうか、という話。 def hashing(pair) Class.new { pair.each {|key, value| define_method(key.to_sym) { value} } }.new.instance_eval { binding } e…

今月が何日まであるかを表示する

次の月の一日前のDateTimeオブジェクトのdayメソッドが今月の終わりの日付。 追記:id:udzuraによると、DateTime.new(t.year, t.month, -1)と書けるらしい。このほうがオブジェクトをたくさん作らなくていいのでスマートだ。 #!/usr/bin/env ruby require 'e…

うたウガ歌えるカラオケ

の頃はMacのSafariやFirefoxでも動いてたが、うたウガ|うたウガサービス終了に伴う重要なお知らせにサービスが移動してからIE以外をサポートしなくなった。不便なのでこれを修正する。 sudo ./utauga-proxy.rbして、MacのHTTPプロキシをlocalhost:465にする…

NilClassのnil?を再定義するとRuby(irb)が壊れる

Rubyじゃなくてirbの問題だった。コメント参照。 class NilClass;def nil?;false;end;end して、 nil.hoge とすると、落ちる。 % ruby -v [~] ruby 1.8.7 (2009-04-08 patchlevel 160) [i686-darwin9] % echo $OSTYPE [~] darwin9.0% irb [~] irb(main):001:…

irbでメソッド名をスペルミスしないように

で既出だったよう。 javascripter's gist: 110495 — Gist に書いた。 こんな感じに修正案を提案してくれる。 irb(main):023:0> fuckin_missing Did you mean this? method_missing => nil irb(main):024:0> やってることは単純で、グローバル関数をmethodsで…

RubyでJavaScriptのプロトタイプもどき

prototype - 素人がプログラミングを勉強するブログの続き。RubyユーザがJavaScriptのオブジェクト指向を学ぶ時に使えるかもしれない。 =begin JavaScriptのようなオブジェクトの実装。 JSObject.newがJavaScriptのnew Object()相当であり、プロパティへの代…

はてなダイアリーのデータを定期的にバックアップする

diary_backup/backup.rb #!/usr/bin/env ruby require "rubygems" require "mechanize" require "yaml" config = YAML.load_file("config.yaml") USER_NAME = config["username"] PASSWORD = config["password"] DIR = config["dir"] agent = WWW::Mechanize…

最後に更新されたファイルを調べる

こうすればいい。 require "pathname" Pathname.glob("**/*").sort_by {|f| f.mtime }.last

ブログシステムを作りたい

開発者向けのブログシステムを作りたい。まだデータ構造を考えている状態なので、HTMLに出力する時のエスケープは全くしていない。 index.cgi #!/usr/bin/env ruby require "erb" require "yaml" require "filter" class Entries @@count = 0 def initialize…

マスターキーでパスワードを管理する

マスターキーとドメインからhexdigestを作って、それをパスワードにする。誰かがやっていた気がする。 #!/usr/bin/env ruby require 'yaml' require 'digest/md5' require 'getoptlong' parser = GetoptLong.new parser.set_options( ["-h", "--help", Getop…

FizzBuzz

#!/opt/local/bin/ruby1.9 require "erb" print "Content-Type: text/html\n\n" ERB.new(DATA.read).run __END__ <html> <head> <title><%= Time.now %></title> <style type="text/css"> ol { list-style: none; } </style> </head> <body> <ol><% 1.upto(100) {|i| %> <li><%= if (i % 15).zero? "FizzBuzz" elsif (i % 3…</li></ol></body></html>

自分のHTTP_HOSTを返すCGI

CGIが動く環境を作ったので、試してみる。 こういうのはJSONPって言うのかな。 #!/usr/bin/ruby require "cgi" puts "Content-type: text/javascript\n\n" cgi = CGI.new fun_name = cgi["callback"].gsub(/\W+/, "") if fun_name.empty? fun_name = "callba…

再帰的な正規表現

Ruby1.9で使える再帰的な正規表現。 re = /(?<expr>\((?:\g<expr>|foo)\))/ p re =~ "((foo))" 数式にマッチさせようとして/^(?[+\-]?\d+(?:[+\-*\/]\(\g\)|$))/ってしたら駄目だった。むずかしい。</expr></expr>

継続、ジェネレータ

だいたい感覚が掴めた。要するに、計算途中のまま一旦ブロック/関数を終了させて、あとで途中から計算を再開できるようにするための仕組みが、継続。計算するものを残したまま終了させれば、returnの代わりになるし、下のようにすれば、PythonのGeneratorを…

インデントを除去する

インデントを除去する - 素人がプログラミングを勉強するブログの、Ruby版。 ヒアドキュメントを書く時に使える。 class String def unindent gsub(/^\s{#{ scan(/^\s+/).map(&:size).min }}/, '') end end str = <<-EOS.unindent <html> <head> <title>Hello, world</title> </head> <body> <p>Hello, w</p></body></html>…

prototype

+で継承、|でマージ。JavaScriptのprototypeチェインをハッシュで実装したもの。 require 'forwardable' class Prototype include Enumerable extend Forwardable def initialize(obj = {}) @scope = obj.dup @scope["__proto__"] = nil end def []=(name, v…

HTMLをエスケープするメソッド

Rubyist Magazine - あなたの Ruby コードを添削します 【第 1 回】 pukipa.rbを見て、正規表現とハッシュのキーの両方に同じものを書いている点が気になった。 module HTMLUtils ESC = { '&' => '&amp;', '"' => '&quot;', '<' => '&lt;', '>' => '&gt;' } …

文字列を少し間違えた感じに変換する

def fake_string(str) str.split(//).map{|s| rand < 0.3 ? s.tr( 'abcdefghijklmnopqrstuvwxyz', 'odrbafanlibinmeqpnzjvyvxus') : s }.join('') end puts fake_string('digital native') # => "diaitai nojiva" ハッシュテーブルをつくらずString#trを使っ…

Hash#method_missing

h['hoge']はちょっと長いなと思って、JavaScriptみたいに、キーが単純な場合はh.hogeやh.hoge = :valのようにできるようにしてみた。 class Hash def method_missing(name, val=nil) if name[-1] == '=' self[name.to_s[0..-2].to_sym] = val else self[name…

Array#unique

class Array def unique ret = [], done = {} each{|i| unless done.key?(i) done[i] = :done ret.push(i) end } return ret end end Rubyおもしろいなあ。ハッシュのキーにオブジェクトも指定できて、selfがスコープチェインに入ってる。 Array#uniq!みたい…

AutoPagerize for SeaHorseのSITEINFOをJSONに変換するRubyスクリプト

AutoPagerize for SeaHorseをwedata互換形式に変換する - 素人がプログラミングを勉強するブログをRuby使って書き直した。RubyのオブジェクトをJSONにするのライブラリはRuby 用 JSON パーサーを更新、 JSON への変換も追加 - WebOS Goodiesを使っていて、si…