プログラミングをプログラミングすること。
Rubyにおけるメタプログラミングの例
class Person attr_accessor :name, :age end
Rubyではattr_accessorを用いてインスタンス変数をアクセスするメソッド(ここではnameとage)を生成できる。
こんにちは。フォースタートアップス株式会社、エンジニアの石田です。 前回の記事では「主にバックエンドのエンジニアをしています。」と自己紹介しましたが、今はバックエンドとフロントエンド両方を担当しています。 特に直近数ヶ月はフロントエンド(React/Next + TypeScript)ばかりやっています。ですが、私が一番好きな言語はRubyですので、今回も前回と同じくRubyの話をしたいと思います。 今回の内容はRubyの基礎知識+豆知識的な内容になります。後半になるにつれて認知度が低く、マニアック度が高くなる気がします。お付き合いください。 ゲッター/セッターメソッド Rubyで頻繁に使うa…
「メタプログラミングRuby 第2版」はRubyをより深く使いこなすための素晴らしい本ですが、理解を深めるには実際にコードを書いてみることが不可欠です。読者向けの練習問題集がGitHub - kinoppyd/reading-metaprogramming-rubyに公開されているので、手を動かしながらメタプログラミングの理解を深めることができました。ぜひ、Rubyのメタプログラミングについて理解を深めたい方は練習問題を試してみてください! メタプログラミングRuby 第2版とは メタプログラミングRuby 第2版で学べること メタプロの練習問題集の reading-metaprogrammi…
Railsチュートリアルの第11章を進めていきます。 第11章(アカウントの有効化) 第11章(アカウントの有効化) AccountActivationsリソース AccountActivationsデータモデル AccountActivationsのbeforeアクション アカウント有効化のメール送信 メーラー メーラーのテスト assert_matchについて アカウント有効化 メタプログラミング、sendメソッド editアクション ユーザー有効化のテスト 第11章ー演習ー 11.1.1 11.1.2 11.2.1 11.2.2 11.2.3 11.2.4 11.3.1 11.3.2 1…
sendと_send_ sendメソッドとは レシーバーが持っているメソッドを、文字列(またはシンボル)で指定して呼び出すことができる。 Object#send (Ruby 3.1 リファレンスマニュアル) class Foo def bar? true end def send(*args) false end end foo = Foo.new foo.send(:bar?) # => false foo.__send__(:bar?) # => true sendとの使い分け sendは様々なクラスで使い回されているため、sendの本来の挙動を使用したい場合に_send_を使用する。 定…
Scala 3でコンパイル時計算がいろいろ便利になっていそうなので, 練習として拡張可能レコード(extensible record)を実装してみた. 前回はmatch typesで型レベルの操作のみでいろいろできたから, 今回もそういうつもりでやろうと思ったものの, けっきょくマクロが必要で, Scala 3のマクロの練習という感じになった. Scala 3のマクロはScala 2からはだいぶ変わっていて, かなり便利になっていることがわかった.
またか. またなのか. 何回目だ. ということで, ラムダ計算のインタプリタの実装としては4回目くらい*1, コンパイル時計算でやるものとしても3回目くらいになってしまうけど, ラムダ計算の処理系をまた書いてしまった.今回の目的は, Scala 3にはmatch typesという機能があり, これだけでチューリング完全なのではないか, というのを検証するため. また, 文字列リテラル型を操作する型レベル関数が3.1.2-RC1にきていて, これを使えば構文解析器だって書ける. *1:OCamlのサブセットとかJavaのサブセットとか他の言語も含めるともっと多い
ドメイン特化言語(DSL: Domain-Specific Language) 問題領域に特化した言語を意味する 特定の作業の遂行や問題の解決に特化して設計されたコンピュータ言語。 Railsでは、Validations・ActiveRecord・Rake・RSpecなど幅広く使われている。 汎用語(GPL: General Purpose Language) ← DSLの反意語 通常は多種多様な問題に対応できるものを意味する Rubyで簡単なDSLを書いてみる DSL定義ファイル def pay(souvenir) puts "結果: #{souvenir}" if yield end lo…
どうも hkrblog です. 最近やたらと寒いですね..... 今日はpythonのメタプログラミング入門と題して本当に触りの部分、 クラスを動的に作って、インスタンス生成して、メソッド呼び出すくらいのものです. (やっぱりpythonだとコード短いし、パパパッて感じで書けてしまう感じがして ブログとかに載せやすいからついついpython関連の記事になってしまう....w) 実際このコードは2, 3か月前に書いたものです... まずはコードを載せてしまいます. class Student: def __init__(self, student_id, name): self.student_…
新しい言語をさわったらとりあえずラムダ計算のインタプリタを実装するよね! Scalaでふつうにラムダ計算のインタプリタを実装するのはあまりに簡単*1なので, 型レベルでやってみた.まじめな話をしておくと, C++のテンプレートがチューリング完全なのは有名な話だけど, Scalaではどうなのか気になった. 以前C++のテンプレートでラムダ計算のインタプリタを実装したのと同様のことができるか思考実験してみると, だいたいできそうに思えたのでやってみた. *1:ケースクラスの公式ドキュメントに途中まで実装が書いてあるレベル
推定市場年収 545万円/年 ~ 801万円/年 おすすめ度(5段階評価) ★★★★☆ Rubyの年収 年収傾向については、一般的には他の一部の言語に比べるとやや低めです Rubyは読みやすくて書きやすいため、プログラミング初心者にもお勧めです。 しかし、Rubyは人気のある言語ではありますが、他の言語と比べると需要と供給のバランスがやや偏っている場合があります。つまり、Rubyの開発者は多くいる一方で、求人数がそれに対して少ない場合があります。 また、一部の企業は、Rubyよりもより新しい技術スタックや言語を好む場合があります。そのため、Rubyのプロジェクトに対する支出や給与が他の技術に比…
はじめに ◆この記事は何か Railsのソースコードリーディングをしているとよく見かける以下の1文 extend ActiveSupport::Concern 実際に Rails7.1.3.2 のリポジトリで grep すると235ファイルヒットすることからも ActiveSupport::Concern モジュールは Rails で非常によく使われているモジュールであることがわかる 今回はそんな ActiveSupport::Concern モジュールについて、使い方を確認した上でモジュールの中身を紐解いていく ◆対象は誰か Rails やその他 gem のソースコードリーディングに挑戦しよ…
ソフトウェアプロダクトライン開発とは ソフトウェアプロダクトライン開発(SPLE:Software Product Line Engineering。ソフトウェア製品系列開発)は、複数の類似した製品群(プロダクトライン)の開発についての開発手法・テクニックです。プロダクトラインで共有する資産を効果的に運用して、プロダクトラインの価値を高めたり、開発生産性を高めたりすることを目指します。ここでいうプロダクトラインは次のようなものです。 仕向け地ごとといった複数のバリエーションのグループ 異なるグレード群のグループ SPLEは、複数の製品で共有する共通資産をソフトウェアプラットフォームとして開発し…
こんにちは。LLM STUDIO 機械学習エンジニアの宮脇(@catshun_)です。 本記事では最近注目を集めている AI ソフトウェアエンジニアに関するプロダクトについてざっくりと紹介します。 社内勉強会に向けたキャッチアップ資料として作成しており、加筆修正する可能性がありますが、本記事を読んだ方の議論のネタ程度になってくれれば幸いです。
Prolog について Prolog について調査します。以下はChatGPTでいろいろ聞いてみたことの答えです。Prolog の本はあまり見つからないのでこの情報は役立ちます。 プログラミング言語 Prolog の詳しい仕様を教えてください Prolog(Programming in Logic)は、論理プログラミング言語の一種であり、特に人工知能や知識表現などの分野で広く使用されています。以下に Prolog の主な特徴や仕様をいくつか挙げてみましょう。 論理プログラミングの基盤: Prolog は論理プログラミングの基本原理に基づいています。これは、プログラムが事実と規則の集合で構成され…
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方作者:Sandi Metz技術評論社Amazon 大変参考になったので記事にした。 sasamuku.hatenablog.com メタプログラミングRuby 第2版 メタプログラミングRuby 第2版作者:Paolo PerrottaオライリージャパンAmazon 大変参考になったので記事にした。 sasamuku.hatenablog.com ChatGPT vs. 未来のない仕事をする人たち Ch…
ゆるコンピューターラジオを聴いていて(40時間Lispを勉強したら信者になれる?)、Lisp面白そうだなと思ったものの、違う言語を今からやる気力は無いので、僕がよく使っているRubyとの比較でいろいろ聞いてみました。 面白そう・・。 かなり前に勉強してみた関数型言語の特徴もLispくらいコードとデータの区別のないコードを常用することを念頭におけば自然な制約かもしれない・・と、少しだけ思いました。 ちなみに、もう少し複雑な例として挙げてもらったLispLikeクラスの例は、Rubyの標準クラスの標準的な振る舞いで同じことができるので、特にLispの強みを示す例としては適切でないかもしれませんが、…
ユーザー側からの入力を簡易プログラミング言語みたいにしたいと思うことがたまにあったので、DSLの作成方法を聞いてみました。 Rubyの場合は、特定のオブジェクトをレシーバーとしつつ、そのオブジェクトのコンテキストでブロック内のコードを実行させるinstamce_evalを使うことが、この手法の肝になりそうです。 ユーザーに実行して欲しくないコードを実行できないようにするには、method_missingが呼ばれたときに、そのメソッドが予め定義したホワイトリストに入っていないときはブロックを実行しないようにすることで実現できます。 長年知りたかったことが分かってすっきりしました。 Kotlinの…
はじめに メタプログラミングは、プログラムが自身を操作したり変更したりすることを指します。 この辺りは知識としてあったんですが、実装で触れる機会も特にありませんでした。 業務でmethod_missingを使用する場面があって、「おお!これがメタプログラミングか!!」となったので、忘れないように書いていきます。 メタプログラミングとは メタプログラミングは、プログラムが自身の振る舞いや構造を操作するプロセスらしい。 method_missing メソッドとは method_missingは、Rubyの特別なメソッドの一つです。 method_missingを見た時に、「魔法やん!」って思ってい…
RubyXLでExcelを操作する際のExcelのスタイル情報の保持のされ方、利用方法について詳しく聞きました。 文書の容量節約のために、スタイル情報が階層的に、値とは別に管理されていることが分かりました。その分、実際、スタイルを追加したり変更したりはややこしくなりますね。 必要に応じてここで教わったことを参照したいと思います。 RubyXLを用いて、Excel文書を扱いたいと思っています。 RubyXLが内部的に保持するワークシートやセル、書式情報のフォーマットの概要と使用例を教えてください。 スタイルの種類や管理方法について詳しく教えてください。 特定のセルに対し、新しいスタイルを一部の値…
こんにちは。SmartHRでプロダクトエンジニア(PdE)をしているsoul ( @ex_SOUL ) です。 先日、第3回SmartHR LT大会が開催されましたのでイベントの内容を紹介します。 SmartHR LT大会について DevRel主導のもと、有志のプロダクトエンジニアが集まって企画・運営している社内イベントです。 プロダクトエンジニアの中から11名の登壇者を集い5分間のLightning Talks(LT)を行います。 登壇者はプロダクトエンジニア(PdE)に限定していますが、当日は職種によらず社員であれば聴講可能です。 配信もしており、現地参加が難しい社員でもリモートで楽しめる…
こんにちは、YOUTRUSTの今井(YOUTRUST/X)です。 今回は私が最近読んでいる「メタプログラミングRuby第2版」の感想と実際にYOUTRUSTでメタプログラミングが使われている箇所の紹介をしようと思います。 メタプログラミングとは メタプログラミングとは、コードを記述するコードを記述することである。 書籍の導入でメタプログラミングについて、上記のような説明がされています。 具体例として、Active Recordでもメタプログラミングが使用されています。 class Movie < ActiveRecord::Base end 上記のようにActiveRecord::Baseのサ…
コマンドラインのパースがしたいぞ 昔はコマンドライン(CLI)アプリを作ることが多くて,色々コマンドラインを解析するためのライブラリを作ったり探したりしていたのだけれど,久しぶりにコマンドラインで動作するアプリを作る際に,コマンドライン解析してくれるの何か無いかなと探したのでメモ. Cysharp/ConsoleAppFramework: Micro-framework for console applications to building CLI tools/Daemon/Batch for .NET, C#. (github.com) dotnet/command-line-api: C…
本稿は Yorick Peterse 氏によって書かれた次の記事の日本語翻訳です。著者に翻訳の許可を得て公開しています。 yorickpeterse.com また本稿は DeepL Pro を使って下訳したものに手を加えています。日本語翻訳の不具合または誤訳については Yorick Peterse 氏ではなく、本稿のコメント欄にお願いします。 ここから本文です。 GitLab 社で働くのはどのようなものだったか 私は2015年10月に GitLab 社に入社し、6年あまり働いて2021年12月に退社しました。 前に GitLab 社を辞めて Inko に取り組んでいることは書きましたが、201…
今日は不正な正規表現で異常終了する不具合修正、String#initialize の不具合修正、T_IMEMO 型オブジェクトのための実装を専用のソースファイルに分離するリファクタリングなどがありました。 [183c574d54] Nobuyoshi Nakada 2024-02-22 13:05:04 UTC tool/lib/envutil.rb の EnvUtil.capture_global_values で警告の設定をバックアップする時に対象のカテゴリに performance を追加しています。 [88431c47ba] tomoya ishida 2024-02-22 13:16…