2009-04-01から1ヶ月間の記事一覧
Ruby 10年前にRubyといえば7月の誕生石のことか 5.5ポイント活字のことでした でも今はGoogleを30頁めくっても 妻に誕生石をプレゼントすることはできません 宝石店のSEO対策は 日本人の作った言語セットの前では無力なのです この点PerlのLarryさんは巧妙に…
(追記:2010/7/10) Rubyだけで画像を生成する方法を用意しました Rubyでスキャニメーションを作ろう! - hp12c 「ギャロップ!! (しかけえほん)」に触発されて ScanAnimationというサイトを作りました サイトでは馬が走る絵とカンガルーが跳ねる写真と 文字…
本屋にいったら「ギャロップ!! (しかけえほん)」という 絵本がありました 表紙に窓があって中に馬の絵が描かれています ページを開いていくとその馬が突然走り出しました よく見るとページの開閉に連動して スリット入りのマスクが絵に対して動いて 動画を形…
さてこれらの演算子を使って 何かしたいですね... いいのを思いつきました ある小説を元にしたオブジェクトから 基本単語からなるオブジェクトを差し引けば その小説にユニークな単語が抽出できるかもしれません Version27 class WordDictionary def select(…
さてGUIで出力も魅力的なものになりました もうやり残すことはなさそうです 当初単なる制御構造であったスクリプトが WordDictionaryという立派なクラスになりました これで将来このクラスを拡張したり このクラスをベースにしたアプリケーションを作れます …
っと その前に... アウトプットのしょぼさに 今さらながら気が付いてしまいました wdic = WordDictionary.new(ARGF) p wdic.top_by_frequency(20) #> [["the", 16077], ["of", 9823], ["and", 7482], ["to", 7098], ["in", 4456], ["a", 3841], ["that", 316…
Version20 ここまで来たらもう一歩 小説データは元々ネットにあるんですから いちいちファイルにダウンロードしないで 直接ネットから取れたらうれしいです open-uriライブラリというのを使うと httpに簡単にアクセスできるようになります require "open-uri…
Version17 次にVersion07で示したような 最長ワードトップ30を出力するメソッド top_by_lengthも定義しましょう class WordDictionary def top_by_length(nth, &blk) list = take_by_key(nth, lambda { |key| -key.length }, &blk) list.map { |word, freq| …
でも待ってください そこまで汎用性がある汎用性があるって言うのなら... クラスにでもしたらどうですか? それならArrayクラスにも迷惑は掛かりませんし なるほどいい考えかもしれません ではテキストファイルを受け取ると 英単語頻度辞書を生成するWordDic…
さてもう改良点はないでしょうか スクリプト全体をもう一度みてみましょう module Enumerable def take_by(nth) sort_by { |elem| yield elem }.take(nth) end end class Hash def top_by_value(nth, &blk) take_by_value(nth, opt(false), &blk) end def bo…
なかなかいいですね さてこれでもう完成でしょうか... いいえ! 問題が発生しました! 先のコードはDRY原則に反します!! DRY原則 「DON'T REPEAT YOURSELF!」*1 達人プログラマは言いました 「お前は二人も要らないよ!」 あるいは 「愚鈍なる君の二度手間…
更に欲が出てきました このtake_byというメソッドを 配列でも使いたくなりました 実は先のsort_byというメソッドはHashクラスにも Arrayクラスにも定義されていません それが定義されているのはEnumerableというモジュールです モジュールというのはクラスの…
先のスクリプトにわたしは何の不満もありません でもリファクタリングはクセになります 3行目のsortのブロックが 気になる人には気になります p DICTIONARY.sort { |a, b| b[1] <=> a[1] }[0...30] Version04 少し直しましょう WORDS = ARGF.read.downcase.s…
10行程度のスクリプトで目的を達成できました 前置きばかりが長かったこの連載も これで終えられます でも... わたしはどうも気に入りません 先のコードは分かりにくいというか Rubyっぽくないというか... もう一度スクリプトを見てみます dic = Hash.new(0)…
さてこれまでに得た知識を基礎として 目的のRubyスクリプトを作ります 最初にベースとなるコードを提示して これを少しずつ改良していきながらRubyを学びます まずは手元にRubyで処理できる 英文小説のテキストファイルを用意します 以下のサイトがよさそう…
Rubyはユーザフレンドリです Rubyにおいてオブジェクト指向はその基本的設計思想です Ruby設計者まつもとゆきひろさん(愛称Matz)は その思想を頑なに守りながら 一方でプログラマーの負担を最小化するために ユーザインタフェースをよりフレンドリなものにし…
クラスはオブジェクトの母であってクラスの子であるオブジェクトです こういう表現は「クレタ人は嘘つきである」と言った クレタ人のセリフに聞こえるでしょう*1 でもわたしはクレタ人ではありません Rubyワールドにおいてこの表題は事実なのです 先に「オブ…
Rubyのブロックは仮装オブジェクトです 次にRubyのブロックを説明します 手続き型言語同様 Rubyもifやwhileなどの制御構造をサポートしており メソッド定義式の中でこれらを使うことができます*1 def hello(name) if name.length > 10 name.squeeze! else na…
これから説明するのは次の4つの項目です Rubyはオブジェクト指向です Rubyのブロックは仮装オブジェクトです クラスはオブジェクトの母であってクラスの子であるオブジェクトです Rubyはユーザフレンドリです 1. Rubyはオブジェクト指向です 依然として現在…
ー2020年ー インターネットにおけるワード枯渇問題が深刻化している この10年で紙ベースのドキュメントから ビットドキュメントへの移行が急速に進行し 現在では新刊書籍の90%は書店に置かれることなく ネット上の大規模ストレージに直接格納されるようにな…