タグ

ブックマーク / melborne.github.io (28)

  • 再帰は再帰なんかじゃない!末尾再帰こそが真の再帰なんだ!

    「計算機プログラムの構造と解釈」で末尾再帰というものを知ったので勉強しました。自分の理解を書いてみます。 再帰 再帰呼び出しとはある手続きの中で、再びその手続き自身を呼び出すことと定義される1。でもこの定義は正確じゃない。なぜなら再帰呼び出しは自分自身を呼んでいないからだ。 階乗を考えてみよう。階乗は数学的にこう定義できる。 ふつうRubyで階乗メソッドはこう書く。 factメソッドの中でfactメソッドが呼ばれているので、自分自身が呼ばれているように見える。でもそうじゃない。 最初の引数5を受け取ったfactメソッド(彼をfact5と呼ぼう)は、引数4と共に自分が呼んだfactメソッド(fact4)の結果を待たなきゃならない。なぜならその結果と5をあとで掛けなきゃならないからだ。fact4もfact3もfact2も同じだ。自分が呼んだメソッドの結果を待たなきゃならない。 人間が待ちながら

    InoHiro
    InoHiro 2015/05/26
  • Rubyのtapはメソッドチェーンだけのものじゃない!

    あるインスタンス変数にオブジェクトがセットされているときに、その参照を外しつつ、そのオブジェクトを返すというメソッドが必要になったんだよ。次のような感じだよ。 @name = nil #at initialize def set_name(name) @name = name end def reset_name end set_name('Charlie') # => "Charlie" reset_name # => "Charlie"

    InoHiro
    InoHiro 2015/04/20
    理解に時間がかかった
  • Rubyに存在演算子は存在するの?

    CoffeeScriptには存在演算子(Existential Operator)なるものがあるそうだよ。これは変数が存在するかをチェックするものなんだ。 # coffee charlie = {name:'Charlie', age:50} charlie.age -= 30 if timeMachine? charlie.age # => 50 timeMachine = 'YES' charlie.age -= 30 if timeMachine? charlie.age # => 20 charlie.hobby ?= 'programming' charlie.hobby # => programming # ruby User = Struct.new(:name, :age, :hobby) charlie = User['Charlie', 50] charlie.age

  • Ruby製サードパーティライブラリgemのトレンドを知るには「BestGems.org」がベスト

    ─質問1─ Ruby製サードパーティライブラリ、要はgemで、何が人気なのかってこと、手っ取り早く知りたいんですけど。 ─回答1─ RubyGems.orgのstatsページを見てください。 ─質問2─ えっ?これだけ?この辺は万年上位で固定でしょ。もうちょっと俺の知らないバラエティに富んだものに出会いたいんだけど。俺、Rails用ないし。 ─回答2─ カテゴリー別ならThe Ruby Toolboxがあります。 The Ruby Toolbox - Terminal Coloring ─質問3─ あんた、俺の質問ちゃんと聞いてるの?カテゴリー別なんて言ってないし。それに、ここのカテゴリーってなんか俺的に信用ないんだよね。取りこぼし多いっていうか..。俺のgem出てこないっていうか..。 ─回答3─ GitHubTrendingでここ最近の人気リポジトリが分かります。 Trending

    Ruby製サードパーティライブラリgemのトレンドを知るには「BestGems.org」がベスト
    InoHiro
    InoHiro 2014/08/09
  • Rubyのブロック(クロージャ)はローカル変数をインスタンス変数に変えるマジックだ!

    Ruby クロージャ - ソースコード備忘録を読んで、自分のRubyにおけるブロックと変数の理解が怪しいことがわかった。で、ちょっと普通とは違うアプローチからの整理を試みて、理解できた気がするので書いてみます。誤りを教えてくれればうれしいです。 ローカル変数 プログラムコードはプログラマの意思をインタプリタに伝えるものだ。Rubyではオブジェクトに処理を依頼する形でプログラムを組成するけど、そのとき変数はプログラマが対象のオブジェクトを指し示すためのラベルとして用いられる。すなわち変数はオブジェクト参照ラベルだ。 複数の手続きブロックで構造化される現代のプログラミングにおいては、1つの変数の適用範囲はそれが定義されている手続きブロックに限定されるのが普通だ。 Rubyにおいてメソッド定義はこの手続きブロックを新たに作る。だから以下の例でcounterメソッド内の変数nは未定義となる n =

    InoHiro
    InoHiro 2014/07/13
  • RubyのHashの秘密 その3 - ハッシュテーブルの理解

    同姓同名のいない1億人の日人の中から素早く「山田 太郎」を見つけ出して彼と話をしたい。各人の胸には名札が貼ってあるので、「山田 太郎」の名札の付いた人物を見つけ出せばいい。全国を行脚して片っ端に名札を確認していくという手もあるが、恐ろしく時間が掛かることは想像に難くない。最悪で1億人、平均で5000万人の名札の確認が必要となる。したがって事前に彼ら彼女らをなんらかのかたちに整列させるべきだと認識する。かと言って、こちらが持っている情報は彼ら彼女らの名前(姓と名)しかないから順位付けで整列というのは難しい。そこで姓(苗字)によるグループ化を思いつく。つまり各人の名札を「苗字関数」に通して苗字を得、その苗字のために割り当てられた区域に彼ら彼女らを住まわせるのだ。 def 苗字関数(name) name.split(/\s+/).first end name = "山田 太郎" 苗字関数(na

    InoHiro
    InoHiro 2014/06/29
  • TapがRubyの新たな制御構造の世界を開く

    Object#tapはそのブロックの評価結果を捨てるという風変わりなメソッドです。これは主としてメソッドチェーンにおける途中経過を覗き見るために使われます。 "charlie".upcase.tap{ |s| p s } # => "CHARLIE" .reverse.tap{ |s| p s } # => "EILRAHC" .gsub(/[aeiou]/i,'*') # => "**LR*HC" tapの副作用を使う もっとも、その評価結果を捨てるというユニークな特徴をうまく使えば、もっと面白いことができます。 例えば、ある変数の値を取得した上でその変数の値をリセットしたい場合を考えます。通常は次のように実装するのでしょう。

    InoHiro
    InoHiro 2014/06/26
  • Let It Go for Rubyists

    RailsConf 2014」からのワンシーンです。素敵だなあ。 Let Me Code - Liana Leahy - RailsConf 2014 彼女はRailsエンジニアで、かつてはプロの歌い手さんだったようです。 Liana Leahy (lleahy) on Twitter 感動したので歌詞の日語訳をしてみました。雰囲気が伝わればと。 (追記:2014-5-13) 対訳版を追加しました。 Let Me Code Lyrics 対訳版 PCスクリーンが 白く光る夜 The screen glows white on my laptop tonight (Let Me Code) The snow glows white on the mountain tonight (Let It Go) RSpecは グリーンにならない And my rspec won't go gree

    InoHiro
    InoHiro 2014/05/10
  • Procを制する者がRubyを制す(嘘)

    RubyのProcの説明は巷に溢れているから今更感があるけどここ数回Procを使ったネタを書いていたらProcがかわいくなっちゃってもっとみんなにもProcのこと知ってもらいたいという欲求が生まれてきたからProcについての基的なことを僕なりのやり方でここに書くよ。長いよ。 Rubyの関数(メソッド) Rubyにおいて関数(メソッド)はファーストクラス(オブジェクト)ではありません。つまり文字列や数字や配列などの他のオブジェクトとは異なって、Rubyではそれを直接変数に代入したり、他の関数に渡したりすることはできません。 def square(n) n * n end sq = square # squareメソッドを変数sqに代入してみる # ~> -:1:in `square': wrong number of arguments (0 for 1) (ArgumentError)

    Procを制する者がRubyを制す(嘘)
    InoHiro
    InoHiro 2014/04/29
  • 「単語が目に飛び込んできてすごい速度で文章を..」ってやつをRubyでやると...

    こんな感じかな。 ruby -e 'trap(:INT){print"\e[?25h\e[0;0H";exit(0)};x,y=[`tput lines`,`tput cols`].map{|n|n.to_i/2};print"\e[?25l";ARGF.read.scan(/[\w.]+/).unshift(*%w(3 2 1 0 Go!)).cycle{|w|c=w.size/2;w=w.dup;cw=w[c];w[c]="\e[31m#{cw}\e[0m";print"\e[2J\e[#{x};#{y-c}H",w;sleep(0.3)}' TEXT Hosted by Gifzo TEXT Ruby is a dynamic, open source programming language with a focus on simplicity and productivity.

    InoHiro
    InoHiro 2014/03/01
  • RubyユニバースをGraphvizで視覚化する

    (追記:2014-3-3) Gvizについてのまとめ頁を作りました。 Gvizの目次 - Rubyの世界からGraphvizの世界にこんにちは! 今日Rubyのクラスツリーを手書きでグラフ化している記事を見かけた。 A diagram of the Ruby Core object model - Jerome’s Adventures in Rubyland これを見てそういえばGraphvizのRubyによるラッパーを書いたのに未だRubyのクラスツリーをグラフ化していないことに気付いた。 melborne/Gviz gviz | RubyGems.org | your community gem host そしてRubyをグラフ化するならやっぱりRuby自身に書いてもらうのが一番だと思った。彼女も20才になったことだし。 早々gem install gvizでgvizを入れて次のよう

  • 僕が考えた最速・最小投資でRubyを学ぶ方法またはステマ乙

    そろそろ軽くRubyをやってみたいけどなんか情報多すぎてどこから手を付けたらいいかわからない、リファレンス的なものとか言語論的なものとかコミュニティー的なものとかの情報は結構あるけど、もっとカジュアルでかと言ってどの言語でも使いまわせる的な説明じゃなくRubyらしさが浮き出てるようなもので、しかもちょっとしたCLIツールとかWebアプリとかを作れる程度に理解の手助けをしてくれるものがほしいけど、今の段階で大枚叩きたくないしという人向けに僕がRubyの道案内を致します。 ステップ1(所要時間:0〜10分、投資額:0円) あなたのコンピュータでRuby2系を使えるようにします。 Macなひと => Mavericksをインストールする。 Windowsなひと => RubyInstaller for WindowsRuby2系をインストールする。 Linuxなひと => ご自由に。 ターミナ

    僕が考えた最速・最小投資でRubyを学ぶ方法またはステマ乙
    InoHiro
    InoHiro 2013/12/25
  • Excelデータを最速でWebアプリ(Heroku)にする<del>10</del>9のステップ

    ローカルには映画の視聴記録とかべ歩きのお店評価とか投資履歴とかガラクタコレクションリストとかの自身の活動記録的なデータが溜まります。そしてどういうわけかそれらのデータは大概表計算ソフト「Excel」の上に置かれているのです。その結果、溜めたはいいが有効に活用されない、場合によっては見ることすらしないという事態に陥ります。それらのデータが来的に置かれる場所が「データベース」であり、その活用によりデータ価値が向上するということに誰も異論はないとしても、データはExcelに置かれるのです。 理由は一つ。そう、データベースは敷居が高いのです。 データベースの敷居が下がれば、みんながローカルのデータをもっともっと大量に公開して世の中はもっと便利になるに違いありません。 まあ、実際のところはよくわかりませんが。 そんなわけで… データベースの敷居を下げるべく、CSVデータを簡単にデータベース化する

    InoHiro
    InoHiro 2013/11/12
  • チルダがRubyのヒアドキュメントをもっと良くする

    Rubyのヒアドキュメントは便利です。複数行に渡る整形文章を出力するときに、これを使わない手はありません。 class ATool def self.help lines = <<EOS Instruction of `#{self}` `#{self}` is one of a great tool in the world. This helps you a lot on your daily work. Your life will be changed with `#{self}`!! Everyone knows about `#{self}`. So, You can ask them to learn `#{self}` Just Use `#{self}` from Today! EOS lines end end puts ATool.help # >> Instruct

    InoHiro
    InoHiro 2013/08/13
  • YOUたち!RubyでinjectしちゃいなYO!

    プログラミングの存在価値は処理の自動化です。任意の集合に対して処理を繰り返しその結果を返す、それがプログラムです。つまり集合に対して処理を繰り返す能力が、プログラムの価値を決定付けるのです1。 「手続き型言語」ではループが処理の繰り返しを実現するための重要な手法の一つです。しかしループは、一時変数を用意してプログラマがループの進行を管理しなければならない、という欠点があります。そしてその管理ミスがバグとなります。 「関数型言語」では再帰が処理の繰り返しを実現するための重要な手法の一つです。再帰では再帰の進行はその構造に基づいて自動的になされるので、プログラマがそれを管理する必要はありません。しかしその一方で、処理が多段階に渡る立体的なものとなるので、その動作の理解が平面的なループ処理に比べて難しいという欠点があります。習得には慣れが必要です。 Rubyは、手続き型言語と関数型言語の両方の側

  • 知って得する!55のRubyのトリビアな記法

    Rubyはたのしい言語です。Rubyを触っているとマニュアルにも書いていない「小さな発見」に遭遇することがよくあります。このような「発見」は、プログラムの質や効率の改善には直結しないかもしれません。いや、むしろチームプログラミングでは妨げになる可能性すらあります。しかしその一方で、言語自体が自分の知らない領域を持ち続けていることが、その対象に対する興味を失わせないための大きな要因である、というのもまた疑いのない事実なのです。つまり「発見」はたのしさに直結しているのです。 このブログにおいて「知って得するRubyのトリビアな記法」というタイトルで、今まで3回記事を書きました。 “知って得する21のRubyのトリビアな記法” “第2弾!知って得する12のRubyのトリビアな記法” “第3弾!知って得する12のRubyのトリビアな記法” これらのトリビアには、ネット検索で見つけたもの、Twitt

  • Rubyのcaseを〇〇(言語名)のswitch文だと思っている人たちにぼくから一言ガツンと申し上げたい

    Rubyのcase」を一瞥し「あー要は〇〇(言語名)のswitchね」などと早合点し、その後もその真の価値を知ることなく一生を終えるプログラマが近年跡を絶たない。加えて、「今更条件分岐?RubyはOOPなんだからポリモフィズムじゃね?」とか「HashにProc突っ込んでcallするのがオレ流。」とかうそぶく人たちもまた増加の一途を辿っている。 そんな世の中にあって、ぼくは一言、できればガツンと一言申し上げたい。生まれも育ちもRubyなぼくから、是非ともそんな人たちに「Rubyのcase」について一言申し上げておきたい。 ─ 問題1 ─ 名前name、レベルlevel、ポイントpointの各属性を持った複数のCharacterオブジェクトcharlie, liz, benがある。 class Character < Struct.new(:name, :level, :point) def

    InoHiro
    InoHiro 2013/02/25
  • Rubyを始めたけど今ひとつRubyのオブジェクト指向というものが掴めないという人、ここに来て見て触って!

    Rubyのオブジェクト指向は一貫性があってわかりやすいという評判だけれども、オブジェクトを意識しない便利な手続き的な書き方もできるからそれがRuby来の姿を分かり難くしているという面もあってその辺でRubyを始めたけど今ひとつ質的なものが見えてこない人たちもいるんじゃないかと思う今日此の頃ですが皆さんいかがお過ごしですか? それで随分と前に僕がRubyを始めてそんなに時間が経っていないときに書いたブログの記事があってそのことを思い出して、読み返してみるとRubyのオブジェクトを中心にしたちょっとユニークな説明になっていてまあ書き足りない部分もあるけれどもあの頃の知識でよく書けてるじゃないのなどと自画自賛しつつ、これは先の「Rubyを始めたけど今ひとつ質的なものが見えてこない人たち」の役にも立つのではないかという発想が生まれて、結果ここにその記事群の文体を変えたり間違いを直したり挿絵

    InoHiro
    InoHiro 2013/02/13
  • Rubyを使って「なぜ関数プログラミングは重要か」を読み解く(改定)─ 前編 ─ 但し後編の予定なし

    2年ほど前に書いた記事を電子書籍化して「M’ELBORNE BOOKS」で販売するために全体的な見直しを行なって入稿する段になって、これにはベースとなっている他者の論文があって言ってみればこの記事はそのマッシュアップになっているんだけれども、その著者の許可もなくその表現が全く別物だとしてもその主張のあらすじが残っている限りにおいてこれを販売することが果たしていいことなのかという思考に遅ればせながら陥り、それが仮に法的に問題ないとしてもなんだか一表現者の行為としての妥当性を幾分欠いているという結論に至って販売を思い留まった。かと言って折角書き直したものをこのままお蔵にするのもなんだか寂しいなあという気分も一方であり、まあ原作者の意に反したものでもないだろうからブログの記事なら許してくれるよねもう2年前にも書いちゃってるしという勝手な解釈の下、ここにその記事を公開しましたのでお時間の許すRub

  • Rubyでcalをカラフルに

    世界はすっかりGUIに支配されました。コンピュータといったらWindowシステムのことです。人々を魅了したのはその操作性だけではありません。人々はそのカラフルな世界に魅了されたのです。 確かにCUIの世界には色はありません。辛うじて環境変数LSCOLORSをセットして、色の付いたファイル名を眺めるだけの、暗くて地味な、そしてそれを使う人を孤独にさせる世界です。 しかしそんな世界にTermtterが登場しました。TermtterはANSIカラーを引き連れて、CUIの世界に一条の光を差しました。まるでGB末期に登場したポケモンの如くに!1。 それ以来、僕の中ちまたでは、ターミナルのカラー化が流行しています。 RubyでANSIカラーシーケンスを学ぼう! どこかで誰かが叫ぶ声が聞こえます。 ターミナルにもっと色を! ターミナルにもっと色を! そんなわけで.. calを色付けして出力するCalou

    InoHiro
    InoHiro 2012/12/03