-
RubyとSinatraで作る!自作リンク短縮アプリの作り方
Rubyのスキルを磨くのにぴったりな小さなプロジェクトをお探しなら、ここがまさにうってつけの場所です。 今回は、リンク短縮アプリを一緒に作っていきましょう。 リンク短縮アプリとは? きっと一度は見たことがあるはずです。 次のような「短縮リンク」のことです。 https://t.co/eKBRm2tTUF このURLにアクセスすると、元のURLへ自動的にリダイレクトされます。 では、これはどうやって実現しているのでしょうか? 仕組みはシンプルで、URLの一部になっているコード(例では eKBRm2tTUF)を、データベース上で元のURLと紐付けているだけです。 概念は簡単ですが、いくつか考慮
-
Atomエディター徹底活用ガイド:Ruby開発者必見のプラグイン・ショートカット・スニペット
Ruby開発にAtomエディターを使っているなら、生産性を高めるプラグイン(Atomでは「パッケージ」と呼ばれます)の存在をご存じかもしれません。 しかし、Atomのパッケージリポジトリには数千ものパッケージが公開されており、どれを選べばよいのか迷ってしまうことも多いはずです。 結局、どれを使えばいいのでしょうか? さらに言えば、作業スピードを上げるために覚えておきたいキーボードショートカットにはどんなものがあるのでしょうか? この記事では、AtomユーザーのRuby開発者が知っておくべき厳選パッケージ、便利なショートカット、スニペット活用術を詳しく解説します。 おすすめのAtomパッケージ
-
【Ruby】プレフィックスツリー(トライ)の実装方法と活用例を徹底解説
プレフィックスツリー(別名:トライ/Trie)は、単語のリストを効率的に整理し、特定の接頭辞(プレフィックス)で始まる単語を高速に検索できるデータ構造です。 例えば、「ca」という2文字で始まる単語をすべて探したい場合、「cat」や「cape」といった候補を瞬時に見つけることができます。 まずは下の図をご覧ください。 これがプレフィックスツリーです。 ルート(*)から、単語の終端を示すマーク済みノード(e や t など)へと枝を辿っていくことで、1つずつ単語を読み取ることができます。 この記事では、Rubyで独自のプレフィックスツリーを実装する方法と、それを活用して問題を解く方法を詳しく解説
-
Rubyはあなたからエラーを隠している!?知っておきたい例外の落とし穴
Rubyは、一部のエラーや例外を意図的に隠すことがあります。 これには便利な側面もあります。たとえば Kernel#loop メソッドにブロックを渡して使う場合、StopIteration 例外が発生すると loop はそこで終了します。 しかし、それ以外の場面では、この仕様がデバッグ作業を一気に難しくしてしまうこともあるのです。 具体的な例を見ていきましょう。 隠される例外その1:Comparableモジュールと「<=>」メソッド 最初の例は、Comparable モジュールと <=> メソッドに関するものです。 以下がそのコードです: class MyObjec
-
Rubyのnilとは?知っておくべきすべてのことを徹底解説
nil…… それは一体何なのでしょうか? 実は、nilはRubyの特別なオブジェクトで、「空」や「値が存在しない」状態を表すために使われます。また、nilは「falsy(偽と評価される)」な値でもあり、条件分岐の中ではfalseと同じように振る舞います。 ここで重要なポイント: nilオブジェクトはシステム内にたった1つしか存在せず、そのobject_idは4(64ビット版のRubyでは8)です。これこそが、nilが特別な存在である理由の1つです。 nil.object_id # 4 それでは、さらに深く掘り下げていきましょう! nilはどこからやってくるのか? 多くのメソッドは、結果とし
-
Ruby文字列メソッド完全ガイド|実例付きで徹底解説
文字列(String)とは、文字が連なったシーケンスのことです。 Rubyでは文字列もオブジェクトなので、文字列を操作するための便利なメソッドが数多く用意されています。 この記事では、実務で役立つRubyの文字列メソッドを、コード例とともにわかりやすく解説します! 目次 1. 文字列の長さを取得する方法 2. 文字列が空かどうかを判定する方法 3. 文字列補間(インターポレーション)とは? 4. 部分文字列を取り出す方法 5. 文字列に別の文字列が含まれるか調べる方法 6. 文字列のパディング(埋め合わせ)方法 7. 大文字小文字を無視して文字列を比較する 8. 文字列のトリムと余白の削除方
-
Rubyで実践する関数型プログラミング完全ガイド ― 純粋関数・イミュータブルデータ・カリー化の基本
Rubyを書いていると、「関数型プログラミング」という言葉を目にする機会が増えてきます。しかし、実際にどんなものなのか、自分のコードに取り入れるべきなのか、疑問に感じている方も多いのではないでしょうか。 関数型プログラミングとは、具体的に何を指すのか? オブジェクト指向プログラミング(OOP)とは何が違うのか? Rubyでも関数型的な書き方を採用すべきなのか? この記事では、これらの疑問にわかりやすく答えながら、Rubyで今日から使える関数型プログラミングの考え方とテクニックを解説します。 関数型プログラミングとは? 関数型プログラミングは一時的な流行や難しい専門用語ではなく、長い歴史を持
-
Rubyのシンボルとは?仕組みと使い方をわかりやすく解説
Rubyのシンボルは、次のように書きます。 :testing シンボルを変数の一種だと勘違いする人がいますが、シンボルは変数とはまったく関係ありません。 むしろシンボルは文字列に近い存在です。 では、Rubyにおけるシンボルと文字列の違いは何なのでしょうか? 一言でいえば、文字列は「データ」を扱うためのもので、シンボルは「識別子(名前)」として使われるものです。 これが両者の最大の違いです。シンボルは単なる別種の文字列ではなく、まったく異なる目的を持っています。 シンボルを使うべき場面 シンボルの最も一般的な用途は、メソッド名やインスタンス変数名を表すことです。 例: attr_read
-
RubyでC拡張機能を書く方法(ステップバイステップガイド)
C拡張機能を書くことで、C言語からRubyと直接やり取りできるようになります。 特定の重要なメソッドをCの速度で最適化したい場合や、CライブラリとRubyの間にインターフェースを構築したい場合に非常に役立ちます。 なお、代替手段としてFFIモジュールを利用する方法もあります。 それでは、C拡張機能の書き方を見ていきましょう! はじめてのC拡張機能 まず、extconf.rbというファイルを作成し、以下の内容を記述します。 require mkmf create_header create_makefile foobar 次にruby extconf.rbを実行すると、いくつかのファイル(
-
Ruby開発者のための時間計算量とBig O記法 徹底解説ガイド
時間計算量は、コンピュータサイエンスの中でも最も興味深い概念のひとつです。しかも、特別な学位がなくても十分に理解できます。 この概念が面白いのは、あるアルゴリズムやプログラムがなぜ遅いのかを見抜き、どうすれば高速化できるのかを明確にしてくれる点にあります。 もちろん、自分が書いたコードにもすぐに応用できます。 さらに、教科書に載っているような高度なアルゴリズムだけではなく、日常的に書くコードにも役立つのがポイントです。本記事の後半で実際に確認していきます。 まずは、「遅い」と「速い」の定義から整理しましょう。 「遅い」と「速い」の定義 100万個の数字を150ミリ秒(ms)でソートするのは、果
-
TCMallocを使ってRubyのメモリ割り当てをプロファイリングする方法
Rubyでは、メモリの割り当てはどのように行われているのでしょうか? Rubyは「ページ(page)」と呼ばれる塊単位でメモリを確保し、新しく生成されたオブジェクトはこのページの中に格納されていきます。 しかし、 ページがいっぱいになると、さらなるメモリが必要になります。 そのときRubyは、malloc関数を使ってオペレーティングシステム(OS)に追加のメモリを要求します。 このmalloc関数はOS標準で提供されているものですが、代替となる実装に差し替えることも可能です。 その代表的な実装のひとつが、Google製のTCMallocです。 TCMallocは「gperftools(Goog
-
Rubyでメモリリークを作成する方法|実例コードで仕組みを理解する
メモリリークの「見つけ方」を解説した記事は数多く存在します。 しかし、逆に「作り方」についてはどうでしょうか? 意図的にメモリリークを作ってみることは、Rubyにおけるメモリリークがどのような挙動を示すのかを理解するための良い演習になると考えています。 それでは、いくつかの具体例を見ていきましょう。 シンプルなメモリリーク 最も簡単なメモリリークの作り方は、配列に新しいオブジェクトを追加し続けることです。 以下のようなコードです: a = [] b = {} loop { sleep(1) 10_000.times { a << abc } puts GC.stat(b)[
-
【Ruby】デコレータデザインパターンでクラスを変更せずにオブジェクトを拡張する方法
デコレータ(Decorator)デザインパターンとは、どのようなものなのでしょうか? また、このパターンをRubyのプロジェクトではどのように活用すればよいのでしょうか? デコレータデザインパターンを利用すると、クラスそのものを変更することなく、オブジェクトに新しい機能を追加して拡張することができます。 それでは、具体的な例を見ていきましょう! ログ出力とパフォーマンス計測の実装例 この例では、rest-clientのようなGemを使ってHTTPリクエストを送信します。 コードは次のようになります。 require restclient data = RestClient.get(www.
-
【Ruby】ストラテジーデザインパターンの使い方を実装例つきでわかりやすく解説
Rubyにおけるストラテジーパターン(Strategy Pattern)について解説します。 このデザインパターンを使うと、メソッドの中核となるアルゴリズムを柔軟に入れ替えられるようになります。 具体的には、アルゴリズムを実装したクラスを引数として渡すことで、そのロジックをクラス内にハードコーディングせずに済む、という仕組みです。 ここでいう「アルゴリズム」とは、難しいコンピュータサイエンスの理論のことではありません。何らかの結果を得るために一連の手順に従って処理を行う、ありふれたコード全般を指します。 ストラテジーパターンはいつ使うべきか そもそも、このパターンはどんな問題を解決してくれるの
-
【保存版】「凝集度」と「結合度」でRubyコードはここまで変わる!基本のOOP原則を実例で解説
オブジェクト指向設計において最も重要な原則のひとつが、凝集度(Cohesion)と結合度(Coupling)です。この2つの概念を理解すると、コードベース内のすべてのクラスを特定のレンズを通して評価できるようになり、クラス設計の堅牢さや改善すべき箇所が明確に見えてきます。 凝集度と結合度とは何か? 凝集度とは、クラス内にあるメソッド同士の関係性を表す概念です。各メソッドが同じインスタンス変数や引数を使い、共通の目的に向かって協力し合っているか?それとも、メソッドごとに役割がバラバラで、互いに無関係に感じられるでしょうか? 結合度とは、あるクラスが他のクラスにどれほど依存しているか、システムの他
-
Rubyでシングルトンパターンを実装する方法と、多くの場面で避けるべき理由
インスタンスを1つしか持たせられないクラスを作りたいと思ったことはありませんか? はい?いいえ?あるいは…? 実は、それこそがシングルトンパターンの正体です。 このパターン自体に問題があるわけではありません。 しかし、悪い設計への言い訳として安易に使われがちなため、「アンチパターン」と呼ぶ開発者も少なくありません。 まずはコード例を見ながら、その仕組みを学んでいきましょう。 シングルトンパターンのコード例 シングルトンパターンの基本的な考え方は、クラスのインスタンスを1つだけに制限することです。 実装方法は次の2ステップです: newメソッドをprivateにして外部からの生成を防ぐ クラス
-
Rubyのnilとは?なぜnilを使うのか、その理由をわかりやすく解説
ある日、友人とRubyのコードについて話していたとき、「メソッドの戻り値」というテーマが話題に上がりました。 そして当然のように、nilの話も登場します。 その日の夜、ベッドに入って眠りにつこうとしていたとき、ふと「そもそも、なぜ私たちはnilを使うのだろう?」と考え始めました。 これは良い記事のネタになると思い、翌日にこの記事を書くことにしました。この記事を通じて、何か新しい発見や学びがあると嬉しいです! 戻り値と期待される動作について selectのようなメソッドを呼び出すと、必ず配列(Array)が返ってきます。 たとえ何も選択する要素がなくても、です。 例: [1,2,3].sele
-
なぜクラスを作るのか?抽象化の重要性と良いクラス設計の基本
前回の記事「なぜnilを使うのか」に続き、普段当たり前と思って使っているものについても、同じ問いを立ててみるのは良いアイデアではないでしょうか。 例えば… 巨大で醜いコードの塊を1つ作るのではなく、なぜ私たちはクラスを使うのでしょうか? 基本的なレベルで言えば、コードとデータを論理的な単位に整理するためにクラスを使います。しかし、それだけではありません。 クラスを使うと、抽象化(abstraction)を作り出せるのです。 抽象化とは何か? 実は、私たちは毎日、毎分、抽象化を利用しています。 今この記事を書いているキーボードは、次のようなもので構成されています。 ケーブル Cherry MX
-
Rubyのメソッド引数を徹底解説!4つの引数タイプの違いと正しい使い分け
ある読者から「キーワード引数はいつ使うべきか」という意見を求めるメールをいただいたことがあります。 せっかくなので、その回答をRubyのメソッド引数についての完全な記事としてまとめ、多くの方に役立ててもらうことにしました。 Rubyはメソッド引数に関して非常に柔軟な言語です。 あらゆる種類の引数が揃っています。 標準的な必須引数から、デフォルト値を持つオプション引数、さらにはキーワード(名前付き)引数まで様々です。 この記事では、これらの引数タイプの違いと、状況に応じてどれを使うべきかを学ぶことができます。 適切な引数を使い分けることで、コードはより読みやすく、扱いやすいものになります。 迷っ
-
Rubyの演算子を徹底解説!知っておくべき全種類と実践的な使い方
Rubyには、他の言語では見られないような興味深い演算子が数多く用意されています。 たとえば、以下のようなものです。 宇宙船演算子(<=>) 剰余代入演算子(%=) 三重等号(===)演算子 大なり(>)・小なり(<) 不等号(!=) しかし、意外と知られていないのが、これらの演算子の多くが実はRubyのメソッドだという点です。 つまりどういうことかというと… 演算子の動作を上書きして、自分のクラスに独自の振る舞いを定義できるのです。 たとえば==を定義すれば、「同じクラスの2つのオブジェクトをどのように比較するか」をRubyに教えることができます。 それでは、いく