タグ

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

  • RubyでアクセスログのようなものをLTSVに変換する

    Rubyでアクセスログからいま話題のLTSV(Labeled Tab-separated Values)を生成しようと考えました。ところが自分はアクセスログを扱った経験がなくそのフォーマットをよく知らないという事実に気付いたのでした(遅い)。一方で、仕様書を読むモチベーションもなく、仕方がないのでアクセスログというものの基礎仕様を以下のように仮定してみることにしました。 1. 1エントリ内の各情報はスペース区切りされている。 2. [ ]または" "で囲まれた情報を含むことができ、その間ではスペースが許容される。 それで、この仕様に基いたアクセスログ(のようなもの)をLTSVフォーマットに変換するために、次の手順を考えました。 1. スペース区切りをタブ区切り(TSV)のアクセスログに変換する。 1-1. [ ]または" "で囲まれた情報内におけるスペースを一旦特殊シンボルに変換する。 1

  • Rubyのモジュール関数を理解しよう!

    RubyのMathモジュールには数学関数が定義されていて、それらは以下のようにモジュール・メソッドとして呼び出す使い方と、クラスにモジュールをインクルードして関数的に呼び出す使い方の、2種類の使い方ができるようになっています。 Math.sqrt 4 # => 2.0 Math.atan2(1, 1) # => 0.785398163397448 include Math sqrt 4 # => 2.0 atan2(1, 1) # => 0.785398163397448

  • 英語圏のオープンソースプロジェクトにおける翻訳ドキュメントの問題点とその解決のための一方策(仕切り直し版)

    (追記:2014-2-26) 自動翻訳機能を追加しました。 翻訳ドキュメント作成支援ツールTogglateで翻訳要らず? 少し前にオープンソースプロジェクトにおける翻訳ドキュメントの作成における問題点とその解決案について記事を書いたんだけど、要は翻訳ドキュメント内に原文をそのセンテンスごとに埋め込んで、原文と訳文の対応付けを保証しつつこれをトグル表示させることで原文が翻訳ドキュメントの表示上の邪魔にならないようにするといったもので、そのときに併せてこれをスクリプトで実現したtogglateというツールも作ってそのツールとgithub向けmarkdownのパーサーであるgithub-markdownを使ってmarkdownによるオリジナルドキュメントからhtmlによる翻訳ドキュメントを生成するプロセスについても解説したんだ。 英語圏のオープンソースプロジェクトにおける翻訳ドキュメントの問題点

    英語圏のオープンソースプロジェクトにおける翻訳ドキュメントの問題点とその解決のための一方策(仕切り直し版)
  • 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」がベスト
  • Rubyのメソッド引数は奥が深い

    Rubyのメソッド引数は、デフォルト値がセットできたり、可変長引数にできたり、キーワード引数を渡せたり、多彩なわけですが。今日、tcoというターミナル出力に色を付けるライブラリのソースを眺めていたら、面白い引数の使い方に出会って。ちょっとこれ問題にしてみようかと。もしかしたら常識かもしれません。 ─ 問題1 ─ 配列を取り最初の3つの要素だけを返すメソッドfirst_threeを定義しなさい。具体的には、以下の挙動になる。 first_three 1 # => [1, nil, nil] first_three [1] # => [1, nil, nil] first_three [1, 2] # => [1, 2, nil] first_three [1, 2, 3, 4, 5] # => [1, 2, 3]

    Rubyのメソッド引数は奥が深い
  • 素晴らしいオープンソースプロジェクトにおける翻訳者たちの憂鬱とその緩和

    素晴らしいプロジェクトには素晴らしいドキュメントが付き物です。この素晴らしいプロジェクトの素晴らしいドキュメントを、我らが素晴らしい母国語で読めたらなんと素晴らしいことかと願う開発者は少なくないでしょう。そしてそこにはその願いを叶える素晴らしい翻訳者たちが多数いるのです。なんと素晴らしい! 素晴らしいプロジェクトには素晴らしいコントリビューターが多数いて素晴らしい新機能が次々と追加されます。そしてその機能の追加の度に素晴らしいドキュメントにはそれらの素晴らしい機能の解説が次々と追加されていくことになります。なるほど素晴らしい! しかしこれがドキュメントの素晴らしい翻訳者たちを苦しめるのです。ほぅ素晴らしい! 彼らを苦しめる最大の要因は、オリジナルと翻訳ドキュメントとの対応関係が保証されていないことに起因します。オリジナルが複数回改訂されたとき、現在の翻訳ドキュメントがどのオリジナルに対応す

  • DRY重患者RubyistのためのNullObjectパターン

    以前私はRubyistはDRY症候群に掛かっているという記事を書いた。 RubyistたちのDRY症候群との戦い 要約するとDRYじゃないコードを見るとRubyistはムズムズするといった内容だ。 前回私が書いた記事の中に、次のようなコードが出てきた。 def run @methods.inject(@obj) do |mem, method| if custom = Filter.filters[method] custom.call(mem) else mem.send method end end end Rubyでパイプライン? これは@methodsに格納したメソッドを@objに対し順次呼び出すが、同名のフィルタがFilter.filtersにあるのならそれをcallする、といったコードである。 あなたが重度のDRY症候群に掛かっているなら、このコードを見てムズムズしているに違い

  • Ruby製WebSocketアプリを最速でHerokuにデプロイする5つのステップ

    テレビ放送が駄目になった」と言われて久しいですがその理由ははっきりしています。それは放送というものがリアルタイム・コンテンツを扱う媒体だからです。リアルタイム・コンテンツはユーザの自由を奪います。ある番組を見るためにユーザはその時間テレビの前に固定化されます。録画放送番組は字義的にはバッファード・コンテンツ1と言えますが、ユーザがそのコントロール権を持っていないつまりその視聴タイミングの制御を製作者側が持っているので、これはリアルタイム・コンテンツなのです。ユーザの唯一の武器はDVDレコーダによる制約の中のローカルバファリングのみです。 現在のWebは主としてバッファード・コンテンツを扱う媒体です。バッファード・コンテンツの世界ではユーザは好きな時間に好きなだけコンテンツを視聴できるという自由が与えられます。コンテンツの製作者側・提供者側にそのタイミングをコントロールする自由はありません

    Ruby製WebSocketアプリを最速でHerokuにデプロイする5つのステップ
  • Rubyのバグだと思ったら自分がバグだった ─ Enumerator解説編 ─

    前の記事に対する回答がどこからも得られなかったので(当り前だ)、記事を書き直して自分で回答・解説してみます(泣) Rubyのバグだと思ったら自分がバグだった ─ Enumerator編 ─ 一見問題無さそうな以下のコードにはバグがあります。 def step(init, step=1) Enumerator.new do |y| loop { y << init; init += step } end end odd = step(1, 2) odd.next # => 1 odd.next # => 3 odd.next # => 5

  • YOUたち!RubyでinjectしちゃいなYO!

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

  • メソッドの使い方もRubyに教えてほしい

    Rubyの世界には「RubyのことはRubyに聞け」という格言があります1。 この格言に従い、早速Arrayクラスがどんなメソッドを持っているかRubyに聞いてみます。irbを使います。 % irb irb> Array.instance_methods(false) => [:inspect, :to_s, :to_a, :to_ary, :frozen?, :==, :eql?, :hash, :[], :[]=, :at, :fetch, :first, :last, :concat, :<<, :push, :pop, :shift, :unshift, :insert, :each, :each_index, :reverse_each, :length, :size, :empty?, :find_index, :index, :rindex, :join, :reverse,

  • ええ、ハッキリ言います。私はRubyのArray#unshiftが嫌いです。

    numbers = [3, 4, 5] numbers.push(6, 7, 8) # => [3, 4, 5, 6, 7, 8] numbers << 9 numbers # => [3, 4, 5, 6, 7, 8, 9]

  • 分別のあるRubyモンキーパッチャーになるために

    Rubyのクラスはオープンです。つまりRubyのユーザが既存のクラスを開いて自由に実装を弄ることができるのです。組み込みクラスとてその例外ではありません。 既存のクラスを開いてメソッドを追加したり再定義したりすることを、業界用語で「モンキーパッチ」といいます。モンキーパッチという語には明らかに批判的・軽蔑的ニュアンスが含まれていますが、多くのRubyistはそれにひるむこと無く良くモンキーパッチします。何しろドアはいつも開いてるんですからねぇ。 るびおのモンキーパッチ モンキーパッチャー「るびお」は、製作中のライブラリで多次元配列の要素に頻繁にアクセスする必要が生じました。これには通常、Array#[]または#atを使って次のようにアクセスします。 irb> arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] irb> arr[1][2] => 6 irb> a

  • 知って得する!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

  • Rubyで配列から要素を1つ取り出す良い方法はありませんか?

    ─ 問題 ─ 次のファイルリストからgemspecファイルだけを抜き出し、それをgemspec変数で、残りをfiles変数でアクセスできるようにする簡単な方法を示しなさい。但し、gemspecのファイル名はプロジェクトによって変わりうることを考慮しなさい。 files = ['Gemfile', 'LICENSE.txt', 'README.md', 'Rakefile', 'bin', 'lib', 'maliq.gemspec', 'pkg', 'spec'] files = ['Gemfile', 'LICENSE.txt', 'README.md', 'Rakefile', 'bin', 'lib', 'maliq.gemspec', 'pkg', 'spec'] gemspec = files.delete('maliq.gemspec') gemspec # => "maliq

  • RubyによるMarkdownをベースにしたEPUB電子書籍の作り方と出版のお知らせ

    「情報革命」とは何でしょうか。それはネットを介した大量情報の流入による社会生活の変化の連続のことです。情報革命の初期に始まる一つの変化は「見る変化」です。情報を最も効率的に処理できる人間の入力デバイスは「目」であり、そのための環境作りがまず構築されるでしょう。 スマートフォンが携帯電話を駆逐したのは、iPhoneのデザインが素晴らしかったからではありません。人々が大量の情報を処理するためには、非効率な「耳」デバイスを置いて、より効率的な「目」デバイスを活用する必要があったからです。 7インチタブレットの新製品投入が相次いでいます。これは何を意味し、何を駆逐するのでしょうか。そのフォルムを見れば答えは明らかでしょう。それはまさに「書籍」なのです。7インチタブレットは「アトムの読書」を「ビットの読書」にすべて置き換えようとしています。 スマートフォンは、話し言葉を文字化して見るためのデバイスと

  • TapがRubyの新たな制御構造の世界を開く

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

  • SinatraはDSLなんかじゃない、Ruby偽装を使ったマインドコントロールだ!

    Sinatraのサイトを開くとSinatraはDSLだと書いてある。 Sinatra is a DSL for quickly creating web applications in Ruby with minimal effort: (SinatraはRubyで手早くWebアプリケーションをつくるためのDSLです) DSLというのはDomain-Specific Language、つまり特定の目的に特化した言語のことだ。確かにSinatraはWebアプリケーションという特定の目的のために作られたものだけれども、それは言語じゃない。 それが言語といえるためにはオブジェクトのように独立していて閉じてなきゃいけない1。でもSinatraは独立も閉じてもなくて、Rubyに寄生することで存在している。 いやSinatraは言語どころか、Rubyの上の専門用語ですらない。 それが用語といえるために

  • Ruby脳が理解するJavaScriptのオブジェクト指向(その3)

    Ruby脳が理解するJavaScriptのオブジェクト指向 」および「Ruby脳が理解するJavaScriptのオブジェクト指向(その2) 」の続きです。 引き続きJavaScriptにおける「Object.create」について学んだので、自分の理解を書いてみます。当然に、間違いが含まれています。ご指摘助かります。 [注意事項!]はっきり言ってRubyはもう全然関係ない記事になっています。記事のタイトルにおける「Ruby脳が」を「僕が」に置換して、納得された上で以下の記事をお楽しみ下さいm(__)m new 演算子問題に対する解決策を考える JavaScriptにおいて同種のオブジェクトを複数生成するには、クラス風記法のコンストラクタ関数とnew演算子の組合せを利用するのが便利だと学びました。その一方で、この特殊コンストラクタはnewを忘れると深刻なバグを生むという問題が指摘されていま