Ruby

 Computer >> コンピューター >  >> プログラミング >> Ruby
  1. Honeybadger Gem v3の新機能徹底解説

    要約だけ知りたい方は、CHANGELOGをご覧ください。 このたび、Rubyで発生した例外をレポートするためのgemの最新メジャーアップデートをリリースしました。前回のv2は設定戦略を一新する完全な書き直しでしたが、今回のv3では破壊的変更を最小限に抑えつつ、機能面と使いやすさの両方で大幅な改善を行っています。内容が盛りだくさんなので、早速見ていきましょう。 プレーンなRubyモード Railsの世界では、gemをインストールすれば自動的にアプリケーションと統合されるのが一般的です。多くのgemは独自のRailtieを提供し、Railsの初期化時に自らのコードを実行します。 Honey

  2. RubyにおけるUnicode正規化の基本と4つの正規化形式の使い分け

    先日、Rubyの文字列メソッドの多くを特定のUnicode文字でテストし、予期しない動作をするかどうかを検証する記事を公開しました。その結果、実に多くのメソッドが予想外の挙動を示しました。 この記事への批判のひとつが「正規化されていない文字列を使ってテストしている」というものでした。正直に言えば、当時の私はUnicode正規化についてあまり深く理解していませんでした。おそらく、同様に曖昧なままのRubyistは少なくないでしょう。 正規化を活用すれば、私のテストで予期しない挙動を見せたUnicode文字列の多くを、Rubyの文字列メソッドと問題なく協調動作する文字列へと変換できます。ただし

  3. Rubyistのためのメモ化(Memoization)ガイド:基本の書き方から落とし穴まで

    今日は、私が特にお気に入りのパフォーマンス改善テクニックのひとつについてお話しします。この手法は手軽に小さなパフォーマンス向上を積み重ねられます。ただし、ごく稀に——本当にごく稀にですが——アプリケーションを瓦礫の山に変えてしまうこともあります。 その名は「メモ化(memoization)」。いかにも難しそうなコンピュータサイエンス用語ですが、やっていることは非常にシンプルです。メソッドが呼ばれるたびに同じ処理を実行するのではなく、初回の戻り値を変数に保存しておき、2回目以降はその保存された値を使い回すだけです。 擬似コードで書くと次のようになります。 def my_method @

  4. Rubyでモジュールをネストするときに避けるべき落とし穴

    Rubyでは、モジュール(やクラス)をネストして定義するのが一般的です。ActiveRecord::RecordNotFound のようなコードはあまりにもよく目にするため、深く考えることもほとんどないでしょう。しかし、Rubyのネストの実装やRailsのオートロードシステムには、コードを予期せぬ形で壊してしまう罠がいくつか潜んでいます。この記事では、それらの罠の原因と回避方法を解説します。 定数とは何か? この記事のテーマはモジュールですが、その理解にはまず「定数」について知る必要があります。多くのプログラミング言語では、定数は次のように小さなデータを格納するために使われるだけです。

  5. Rubyプログラムを正しく終了する方法 ── exit・abort・at_exitの基本と終了ステータス

    開発者の私たちは、プログラムを「動かす」ことに時間を費やすあまり、そのプログラムがどのように「終了する」かを見落としがちです。しかし、終了処理は非常に重要です。プログラムが適切に終了できれば、運用や管理が格段に楽になり、標準的なDevOpsツールともスムーズに連携できるようになります。 Rubyにはプログラムを終了させるための方法がいくつかあります。以下に代表的な例を示します。本記事ではそれぞれの詳細を解説し、あなたのアプリを「行儀の良いUnix市民」にするための活用方法を紹介していきます。 # メソッドを呼び出して終了する exit exit! abort(She cannot take a

  6. Rubyの#freezeを使うべきタイミングとは?Railsの実例で学ぶ不変性とパフォーマンス改善

    近年、Rubyのコードで#freezeを目にする機会がぐっと増えました。しかし、そのfreezeがなぜ使われているのか、理由まで明確に説明できる方は意外と少ないかもしれません。この記事では、開発者が変数をfreezeする最も一般的な理由を解説します。それぞれの理由を具体的に示すため、Railsのコードベースや人気のオープンソースプロジェクトから実際のコード例を抜粋して紹介します。 不変(イミュータブル)な定数を作る Rubyでは、実は定数もミュータブル(変更可能)です。やや紛らわしい仕様ですが、コード自体はシンプルで理解しやすいでしょう。ここでは文字列の定数を作成し、そこへ別の文字列を追加して

  7. Rubyでその場で列挙子(Enumerator)を作成する方法

    Rubyでは、コレクションを列挙子(Enumerator)として扱うことで、#map や #reduce といったお気に入りのメソッドを、余計なコードを一切書かずに利用できます。これがかなり便利なんです。 昔ながらのやり方では、列挙子を定義するのが少々面倒でした。新しいクラスを作り、Enumerable モジュールを include し、さらに #each メソッドを定義する必要があったのです。 ところがRuby 1.9以降、もっと軽量な方法でその場(オンザフライ)で列挙子を定義できるようになりました。早速見ていきましょう。 Enumeratorクラスのご紹介 Enumerator クラスを使

  8. シングルページアプリを捨ててTurbolinksを使う?Rails開発者のためのPJAX活用ガイド

    Turbolinks――おそらくRails界で最も忌み嫌われている言葉のひとつでしょう。 試したことがある方も多いはずです。新規プロジェクトや既存アプリにTurbolinksを組み込んだ途端、アプリは奇妙で不可解なバグを連発するようになりました。幸い、解決策は簡単でした。Turbolinksをオフにすればよかったのです。 ……しかし、上手に使いこなしている企業も存在します。Honeybadgerでも実際に使いこなしています。そして、私たちは天才ではありません。 その答えはあまりにシンプルなので、あえて取り上げるのを躊躇するほどです。とはいえ、Ruby NationやMadison+Rubyでこ

  9. JekyllでH2見出しからサブナビゲーションを自動生成する方法

    Jekyllを使ってドキュメントサイトを再構築しています。ドキュメントページはかなり大きくなりがちなため、トップレベルのナビゲーションに加えて、何らかのサブナビゲーションが必要になります。 この記事では、投稿やページ内の見出しからサブナビゲーションリンクを自動生成できる、シンプルなJekyllプラグインの作り方を解説します。 概要 このプロジェクトは、以下のタスクに分解して考えることができます。 サイト上のすべてのページに対して実行される、Jekyllジェネレーターを作成する。 見出し情報を抽出できるよう、ジェネレーターにページの事前レンダリング(プリレンダリング)の方法を実装す

  10. Jekyllで実現する多階層サブナビゲーションの作成方法

    前回の記事では、Jekyllページ内の各H2見出しからサブナビゲーションのリンクを生成する方法をご紹介しました。今回はその基礎をさらに発展させ、H3やH4などの見出しに基づいて、任意の階層を持つサブナビゲーションを追加する方法を解説します。 概要 このプロジェクトは、大きく分けて以下のステップで構成されています。 まず、Nokogiriを使って、H2タグの「内部」に相当する位置にあるH3タグで定義されたセクションを抽出します 続いて、再帰的なテンプレートを作成するテクニックを活用し、任意の階層のサブナビゲーションをレンダリングします 始める前に、一点だけ整理しておきましょう。ここで

  11. RubyのRefinement(リファインメント)とレキシカルスコープを理解する

    Refinement(リファインメント)を使ったことがない方にとっては、その挙動は意外に映るかもしれません。Refinementはモンキーパッチ(monkey patching)の置き換え手段として導入された機能なので、ActiveSupportのhoursメソッドのような拡張を実装できると期待するのが自然でしょう。ところが、次のコードを実行しても、期待どおりには動きません。module TimeExtension refine Integer do def hours self * 60 # 分に変換 end end end class MyFramew

  12. RubyのRefinementsは本当に遅いのか?ベンチマークで徹底検証してみた

    「Ruby refinements」をGoogleで検索すると、経緯を知らないまま読むと、refinements(リファインメント)は「遅い機能だ」という印象を持ってしまうかもしれません。 実際、当初提案されていた仕様では、refinementsは確かに遅くなるはずでした。インタプリタによるメソッド探索などの最適化が不可能になってしまうためです。 しかし、現在のRubyに実装されているrefinementsは、当初の提案よりも制限された形になっています。そこで本記事では、現代のRubyにおけるrefinementsの実性能を知るために、一連のベンチマークを実行してみました。 TL;DR(

  13. Ruby正規表現で条件分岐を使う方法 ― Onigmoエンジンの条件式を徹底解説

    2013年にリリースされたRuby 2.0の数多くの新機能の中で、私が最も注目していなかったのは、新しい正規表現エンジン「Onigmo」でした。正規表現はどの言語でも同じもの――Rubyがどう実装しているかを気にする必要はあるのでしょうか?ところが実際には、Onigmoには便利な仕掛けがいくつも隠されており、そのひとつが正規表現の中で条件分岐を使えるという機能です。この記事では、正規表現の条件式について詳しく掘り下げながら、Ruby実装ならではのクラスや、その制限を回避するためのテクニックまで解説していきます。それでは始めましょう!グループとキャプチャの基本正規表現の条件式を理解するには、まず

  14. 知っておくと便利!Ruby正規表現のクールなトリック集

    昨日は正規表現の条件分岐について取り上げましたが、今日はその流れで、Rubyの正規表現で実現できるちょっとしたクールなテクニックをいくつかご紹介します。 正規表現で文字列を分割する 文字列を特定の区切り文字で分割するのは、おそらく誰もがよく使う操作でしょう。 one,two.split(,) # => [one, two] しかし、splitには正規表現を渡すこともできるのです。 # `,` と `-` を区切り文字として使用 one,two-three.split(/,|-/) # => [one, two, three] # 米ドルはカンマを桁区切りに、 # ユーロはス

  15. Rubyのselfを徹底解説!場面別の挙動と初心者のつまずきポイント

    Rubyを書いているなら、必ず意識することになるのがselfです。経験を積んだRubyistであれば、コードを読み書きするときにselfが常に頭の片隅にある感覚を持っているはずです。 しかし、Rubyの経験が浅い人にとっては、selfは謎だらけの存在です。常に変化しているのに、コード上には明示的に現れません。「知っているのが前提」とされているからです。 実は、初心者がつまずく問題の多くは、selfへの理解不足が原因です。インスタンス変数が「消えた」ように感じたり、mixinでどのデータが見えているのか分からなくなったりしたことはありませんか?それは、その文脈におけるselfを理解していなかった

  16. Rubyはプログラムをどのように解釈して実行するのか?トークン化からバイトコードまで徹底解説

    使っているツールへの理解が深まるほど、開発者としての判断力は向上します。特にパフォーマンスの問題をデバッグする際には、Rubyがプログラムを実行するときに内部で何をしているのかを理解しておくと非常に役立ちます。 この記事では、ごくシンプルなプログラムがトークン化され、字句解析され、構文解析され、最後にバイトコードへコンパイルされるまでの道のりを追いかけていきます。Rubyが標準で提供しているツールを使いながら、インタプリタの動作を一段階ずつ覗き見てみましょう。 ご安心ください。エキスパートでなくても読み進められる内容です。技術マニュアルというよりも、ガイド付きツアーのような感覚でお楽しみくださ

  17. Rubyのスプラット演算子(*と**)で配列を自在に構築・分解する方法

    Rubyの魅力のひとつは、その機能の奥深さにあります。普段何気なく使っている演算子でも、少し掘り下げてみると、その実力のごく一部しか使いこなせていなかったことに気づくことがあります。地味ながら強力なスプラット演算子(* と **)は、まさにその好例です。 スプラットを「可変長引数(キャッチオール)」として使ったことはあるかもしれませんが、多くの人はそこで止まってしまいます。実際には、もっと多彩な使い方ができるのです。 def go(x, *args) puts args.inspect end go(a, b, c) 新しいキーワード引数の構文を使う場合は、ダブルスプラットを次の

  18. RubyのEnumerableを自在に分割する!slice_before・slice_after・slice_whenの使い方

    今回はslice_before、slice_when、slice_afterについて解説します。これらは、配列などのEnumerable(列挙可能なオブジェクト)に含まれる要素を、任意の条件に基づいてグループ化したいときに非常に便利なメソッドです。 Array#sliceをご存じの方も多いでしょう。インデックスの範囲を指定して、配列の一部を取り出すことができます。 a = [a, b, c] a.slice(1, 2) # => [b, c] これは便利ですが、Enumerableには使えません。というのも、Enumerableにはインデックスが存在しないからです。 一方、slic

  19. Rubyクラス変数の罠――字句スコープが引き起こす予期せぬ挙動

    Rubyのクラス変数(@@variable)は紛らわしいことで有名です。熟練したRuby開発者であっても、その挙動を直感的に理解するのは容易ではありません。最もわかりやすい例が、継承に関するものです。 class Fruit @@kind = nil def self.kind @@kind end end class Apple < Fruit @@kind = apple end Apple.kind # => apple Fruit.kind # => apple 子クラスでkindを変更すると、なんと親クラスの値まで変わってしまう

  20. rbtraceで実行中のRubyプロセスをリアルタイムにトレース・解析する方法

    実行中のプロセスで発生するすべてのメソッド呼び出しをリアルタイムに記録できることをご存知でしょうか。さらに驚くことに、稼働中のプロセス内部へコードを注入して実行させることさえ可能です。これらを実現してくれるのが、rbtraceというgemの魔法です。 rbtraceの構成要素 rbtrace gemは、大きく2つの部分から構成されています。 ライブラリ部分:トレースしたいコードに組み込んで使用します コマンドラインユーティリティ:トレースデータの照会や表示に使用します 基本例:シンプルなスクリプトをトレースする まずは簡単な例から見ていきましょう。トレース対象となるコードは非常にシ

Total 621 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:29/32  20-コンピューター/Page Goto:1 23 24 25 26 27 28 29 30 31 32