Rubyはたのしい言語です。Rubyを触っているとマニュアルにも書いていない「小さな発見」に遭遇することがよくあります。このような「発見」は、プログラムの質や効率の改善には直結しないかもしれません。いや、むしろチームプログラミングでは妨げになる可能性すらあります。しかしその一方で、言語自体が自分の知らない領域を持ち続けていることが、その対象に対する興味を失わせないための大きな要因である、というのもまた疑いのない事実なのです。つまり「発見」はたのしさに直結しているのです。 このブログにおいて「知って得するRubyのトリビアな記法」というタイトルで、今まで3回記事を書きました。 “知って得する21のRubyのトリビアな記法” “第2弾!知って得する12のRubyのトリビアな記法” “第3弾!知って得する12のRubyのトリビアな記法” これらのトリビアには、ネット検索で見つけたもの、Twitt
REXMLでできるパースの種類は4種類あるようです tree parsing API・・・DOMのようなもの stream parsing API・・・SAXのようなもの。SAXより速いらしい SAX2-based API・・・SAX2ベースドエーピーアイ Pull parsing API・・・Java SE 6で入ったStAXと似ている。pull型。書き出しはできない模様 http://www.germane-software.com/software/rexml/ http://www.germane-software.com/software/rexml/docs/tutorial.html tree parsing API XPathが使える require "rexml/document" XML = <<EOS <?xml version="1.0" encoding="UTF
6. イテレータ … ブロック付きメソッド 多くの伝統的な言語は,配列の各要素に対する処理の繰り返しなど, 定型的なループを (for 文 や DO 文など) 特定の構文でサポートしてきた。 さらにいくつかの言語はループの定型的な部分を抽象化して自由にプログラミング可能にすることに挑戦してきた。 Ruby はそのような試みのなかでも,広い意味で Alogol 系に属する 1970 年代の CLU に範をとった イテレータ (iterator) をサポートしている。 ここで Ruby の 称賛すべき独創性 は,CLU のイテレータ呼出し構文である for 文の本体を,同じく 1970 年代の成果である Smalltalk のブロックと統合することによって,内部動作としては CLU と同じながら構文としての汎用性を高めた点である。 第2章 で示した例を再び見てみよう。 irb(main):00
さて、前回Rubyの勉強記事を書いてからなななんと約2年程たつわけですが、そんなことはさておき久しぶりに勉強日記をつけてみます。 ある変数が何のクラスであるかを判別する処理を書くときにどう書けばいいのか迷ってます。 Perlで言うところの、 if ( ref $hoge eq 'Foo' ) { } って処理のことです。 で、一応instance_of?ってのを発見。 # hoge変数がハッシュクラスであれば if hoge.instance_of?(Hash) end これでバッチグーだと思ったのですが、二つの点で問題がありました。 まず、instance_of?に渡す引数は定義済みのクラスで無いといけない点。 # Fooクラスが定義されて無いので、 #「uninitialized constant Foo (NameError)」という例外発生 if hoge.instance_of?
Find actively maintained & popular open source software libraries for the Ruby programming languageThe Ruby Toolbox is a catalog of all Rubygems that keeps track of popularity and health metrics to help you choose a reliable library CategoriesTo give you an overview of what open source libraries are available for a given task we group projects for common problems into categories. The catalog itsel
Rubyのデフォルト引数では、他の引数に依存した式を書ける。地味に便利。 [1] pry(main)> def foo(a, b = a * 2) [1] pry(main)* puts b [1] pry(main)* end => nil [2] pry(main)> foo(3) 6 => nil 再帰もかける。デフォルト引数で再帰させてフィボナってみる [3] pry(main)> def fib(n,r = (n <=1 ? n : fib(n-2) + fib(n-1))) [3] pry(main)* r [3] pry(main)* end => nil [4] pry(main)> 11.times do |n| puts "fib(#{n}) => #{fib(n)}" end fib(0) => 0 fib(1) => 1 fib(2) => 1 fib(3) =>
dan sinclairさんのEventMachineの入門記事(PDF)を翻訳しました。 原文はここからダウンロード可能です: http://everburning.com/news/eventmachine-introductions/ (翻訳の公開と画像の利用は本人より許諾済みです) 翻訳・内容の間違い等があればブログコメントやTwitterなどで遠慮無くご指摘ください。 EventMachine入門 Introduction うん、これから何を学ぶことになるのか、この導入のくだりがスタート地点として役に立つと思う。EventMachine とは何だろう。そしてそれは私たちのために何をしてくれるのだろう。さて、最初の部分は簡単だね。EventMachine は Reactor パターン(*1)の高性能な実装さ。 すげえ、いや、ちょっと待て、Reactor パターンって何だ? Wiki
つい先程の話。kanazawa.rbで「Mojoliciousと愉快なPerl」という話をしてきました。 Perlの記事を書いたことはあるけど、Perlについての発表をするのは初めてだったので、いつも以上に緊張した感じです。というか、ようやくプログラムの話ができるようになったという感じでしょうか。 Meetup #2 - Kanazawarb スライド スライドは以下に置いておきました。 Mojoliciousと愉快なPerl 話の内容 スライドにはキーワードだけ書いて、口頭での説明とデモがメインだったので、スライドだけ読んでもちょっと物足りないかもしれません。 発表でも話しましたが、かつてはRubyがPerlから学ぶことが多かったけれど、今はPerlがRubyから学ぶことが多いです。 Rubyの勉強会に参加するのも初めてでしたが、多分、Perlの人がRubyの勉強会に参加するのは、少し先
めもめも。 この記事はRubyもRailsもよくわかっていない人が自分のためのメモとしてだらだら書きました。リファレンスがよくわからなかったので、動かして試してみた感じです。 RSpecは(Railsに限らず)Rubyで動くテストフレームワーク。Railsに最初から入ってるTest::Unitよりも色々と良いらしい……けどそっちも使った事がないので比較はできません。 RubyじゃなくてRailsから利用する視点から俺用にまとめます。 環境 $ ruby -v ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux] $ rails -v Rails 3.2.1
Cucumberを使って、Railsアプリのテストを高い抽象度で書き進めていくために欠かせないのがWebratというライブラリです。前回のCucumber全体像の紹介に引き続き、こちらWebratを紹介します。今回も長いです。 2008-01-27修正 id:amacouさんから指摘を受けまして(と、たぶんsatokoさんも以前おっしゃってた)webrat_steps.rbの生成先パスを修正。 語: ${RAILS_ROOT}/step_definitions 正: ${RAILS_ROOT}/features/step_definitions ありがとうございます。 今回のまとめ Webratすごい 画面遷移を「リンクをクリックする」「ボタンをクリックする」と書ける リンクのアンカーテキストではまだ日本語が使えず。さきほどパッチ送ったので早晩書けるようになるはず。 フォームの入力項目もラ
is a totally awesome idea still being worked on. Check back later.
2013年12月2日更新: 参照されることが多いので Rails 4 の情報を訳注として追記しました。また、Rails 4 に関する情報は、 WEB+DB PRESS Vol.73 が非常に参考になるので、一読をおすすめします。 この文章は Mitch Crowe 氏のブログより 2012年4月14日の記事を翻訳したものです。 The 10 Most Underused ActiveRecord::Relation Methods http://blog.mitchcrowe.com/blog/2012/04/14/10-most-underused-activerecord-relation-methods/ 昨日は ActiveRecord::Relation のコードに膝まで浸かって、使われているのをこれまで全然見たことがない面白いナゲットを思い出させてくれた。この記事で、十分に活用
伴う、というかそれがメインの機能だったりもするわけですが。 少し前、以下の記事でごく単純なOAuthコンシューマの実装を行いました。 OAuthコンシューマの仕組みと実装 〜 Ruby編 - しばそんノート この小さなライブラリの使い方は以下の通りです。 require 'simple-oauth' simple_oauth = SimpleOAuth.new('COMSUMER-KEY', 'COMSUMER-SECRET', 'ACCESS-TOKEN', 'TOKEN-SECRET' ) response = simple_oauth.get('http://example.com/') response = simple_oauth.post('http://example.com/', :foo => 'bar') これで全機能です。*1 getやpostメソッドでは、内部でNe
衝撃を受けたできごと 最近Rubyを勉強しています。 JavaやC#でオブジェクト指向プログラミングの基本はマスターしてるから、Rubyもそのあたりは楽勝〜!・・・と思っていたら、JavaやC#の常識が全く通用しない振る舞いに遭遇してかなり衝撃を受けました。それは、 privateメソッドはサブクラスからも呼び出せる ・・・ということです!!がーん。 たとえば、JavaやC#だと自分のクラス内でprivateメソッドが使われていない場合、不要なメソッドとして削除できます。(リフレクションを使って呼び出される可能性はここでは無視ね) しかし、Rubyでは誰かがサブクラスを作って呼び出している可能性があるので、privateメソッドを削除する場合は注意が必要です。メソッド名を変更する場合も同様ですね。 また、知らずに親クラスと同名のprivateメソッドを定義すると、予期せず親クラスの実装をオ
RubyにはMix-inという制限付き多重継承を行う機能がある。 モジュールがそれを担っているわけだが、Mix-inは他のメジャーな言語では採用されていないので、ライトなRubyユーザはこの考え方には馴染みが無いのではなかろうか。 とかいう俺も、どうにもモジュールは持て余し気味だ。 とりあえず、これがどういうものなのかをきちんと把握することが使いこなすことへの近道だろう。 急がば回れ。 1. モジュールはちょっと前の記事で書いたように、メソッド定義を持ち、クラスにincludeすることで定義を移植することができる。 具体的にどういう仕組みでこれが実現されているのだろうか。 言語パズルのように細かい仕様をツツいたり、実装レベルで説明してもあまり意味はないので、最低限必要なことが理解できるような方向で。 module Fuga def foo p "foo" end end class Hog
Rubyを覚えるときは、「Rubyにはクラスとモジュールというものがある」と考えるより、「Rubyのクラスとモジュールは(ほとんど)同じもの」と考えるほうが分かりやすいんじゃないかなあ、という気がしてきました。 クラスとモジュールの違いは、次の5つくらい。これ以外はいっしょ。 クラスはclass 名前 〜 endで定義する。モジュールはmodule 名前 〜 end で定義する。 クラスは継承できる。モジュールはできない。 クラスはインスタンスを作成(new)できる。モジュールはできない。 モジュールはMixinに使える(include, extendの引数に渡せる)、クラスはMixinに使えない。 クラスはClassクラスのオブジェクト、モジュールはModuleクラスのオブジェクト。 「モジュールはクラスの一種」とか「モジュールは特殊なクラス」と考えるのがいいのではないか。Classクラ
net/httpを使用して、シンプルなPOSTからファイルのアップロードまで試してみました。 まずはシンプルなパターン。 require "net/http" require "uri" uri = URI.parse("http://www.mysample.com/index.php") Net::HTTP.start(uri.host, uri.port){|http| #ヘッダー部 header = { "user-agent" => "Ruby/#{RUBY_VERSION} MyHttpClient" } #ボディ部 body = "id=1&name=name" #送信 response = http.post(uri.path, body, header) } 次に、HTTPRequestのサブクラスであるNet::HTTP::Postを使用したパターン。 require
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く