プログラミングをプログラミングすること。
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:ケースクラスの公式ドキュメントに途中まで実装が書いてあるレベル
プログラミング言語の世界は、1950年代から現代までにわたり驚くべき進化を遂げてきました。科学技術計算からビジネスアプリケーション、そしてウェブやモバイル開発まで、各時代に登場した言語は、それぞれの時代のニーズに応じて進化してきました。本記事では、主要なプログラミング言語について、その開発者、特徴、そして簡単なコード例を交えながらその歴史を振り返ります。これから学び始める方にも、経験豊富なエンジニアにも、新たな発見があるかもしれません。 プログラミング言語概覧 1950〜1960年代 FORTRAN(1957) LISP (1960) COBOL (1960) ALGOL (1960) BAS…
今回の Elixir のお題には、メタプログラミングを選んでみました。 Elixir に限らずメタプログラミングでは、ふだん関数を書くときとは異なるレベルの視点が要求されます。 今回は、関数のように見えるけれど関数でないものをメタプログラミングで表現してみましょう。 例題 例として。 利用者 (User) が、記事 (Article) の読み書き削除の操作を可能かどうか、可否の判定をする仕組みを考えます。 読み書き削除の操作の可否は、次のように定義することにしました。 任意の User は Article を読むことができる User が Article の所有者、もしくはロールが edito…
こんにちは、 クラウド経費開発チーム ・ クラウド債務支払開発チーム の 宮村(みやむー) @miyamura.koyo です! Ruby には default_value_for という gem があります。 これは以下のように属性のデフォルト値を設定できる便利な gem です。 class User < ActiveRecord::Base default_value_for :name, "(no name)" default_value_for :last_seen { Time.now } end u = User.new u.name # => "(no name)" u.last…
Go言語のreflectについて 基本概念 reflect.Typeとreflect.Value 主要な機能 注意点 Go言語のreflectについて Go言語のreflectパッケージは、実行時に変数の型や値に関する情報を動的に操作するためのツールを提供します。 このパッケージを使うことで、プログラムがコンパイル時に決定できない情報を実行時に取得し、操作することができます。 以下に、reflectパッケージの基本的な使い方と主な機能について説明します。 基本概念 reflectパッケージは主に2つの型、reflect.Typeとreflect.Valueを提供します。 reflect.Typ…
はじめに こんにちは、Webエンジニアの駒津です。未経験でおいしい健康に入社してもうすぐで1年半になります。 余談になりますが、去年の8月にバングラデシュ人の女性と結婚して、ムスリム(イスラム教徒)になりました。 今年の3月には1ヶ月間断食(日の出から日没まで食べるのも水を飲むことも出来ない)をするラマダンに初トライして1日も欠かさずに完走しました。 来年もラマダン頑張ります笑 今回はRubyとRailsの便利なtipsを4つ紹介したいと思います。 1つ目 1つ目は、Railsのpresenceメソッドです。 recipe.title.present? ? recipe.title : DEF…
最近、というほど最近でも無いが、UEを使うようになってからC++を使うことが増えた。 元々C++は実務で使っていたのだが、最近その機会が全くと言っていいほど無かった。 UEを使うようになって久しぶりに触ってるが、やはりC++は良い。 まず見た目がかっこいい。 書いたコードがかっこよく見える。 洗練されていて無駄がなく、それでいて最近のC++はモダンさに磨きがかかっていてとても書きやすいし見やすい。 僕が仕事でC++を使っていたのは、バージョンで言うとC++11とか14くらいの時代だった。 恐らく、ちょうどその頃から本格的に”モダン”というのをテーマに改良が行われていて、僕がメタプログラミングの…
はじめに こんにちは!ABEJA でプロダクト開発を行っている森永です。 本日は、 ABEJA Platform のゲートウェイにて利用されている言語、 Elixir Language (以下、Elixir と表記) を紹介できればと思います。 利便性の高い言語である一方、日本語での情報が未だ少なく、こちらの記事が言語の認知を広げる一助になれれば嬉しいなと思っています。 Elixir の概要 Elixir とは? Elixir は、スケーラブルで保守しやすいアプリケーションを構築するために設計された動的な関数型言語で、Jose Valim 氏によって開発されています。その最大の特徴として、低遅…
この記事は ILPostProcessor 入門シリーズの第1回です。 第1回 はじめに + 最小実装 (ここ) 第2回 ILPostProcessor の基本構造 第3回 IL編集の基本 第4回 第5回 はじめに こんにちは。 サイバーエージェントゲームエンターテイメント事業部・SGEコア技術本部(コアテク)の瀬戸です。 このシリーズでは、Unityの ILPostProcessor という API を使った開発テクニックについて、何記事かに分けて紹介していこうと思います。 ILPostProcessor はあまり馴染みがない機能かもしれませんが、有効に活用することで開発の効率化にとても役立…
こんにちはマネージドサービス部 大城です。 飛行機で時間があったので、最近勉強したRuby on Rails チュートリアルの感想を書きます。 私はOpsの仕事をしていて、AWS環境でインフラ屋さんをしながらNew Relic、Datadog、Zabbixとたわむれています。 普段コードを書くことはあまりないのですがRuby on Rails(以下Rails)チュートリアルをやってみました。 Railsとは Railsチュートリアルとは きっかけ 私のRuby歴 学習環境 第1章 から 第3章 まで ざっくりとした内容 感想 Model-View-Controller(MVC) テスト駆動開発…
こんにちは。ロジスティクス開発のかんたろうです。 この記事では、カラリアを支えている多様な同梱の仕組みを、物流管理システム側で統一的に扱えるようにした事例を紹介します。 既存の仕組みを統合するためにRubyのメタプログラミングなどの柔軟性を活用しているので、興味がある方はご一読ください。 カラリアにおける多様な「同梱」 カラリアにはいくつかの同梱の仕組みがあり、それらが最終的にお客様にお届けする物を決定しています。 参考までに、カラリアの香りの定期便で発送されるものをFAQから引用します。 香りの定期便新規ご注文の場合 【香水のアトマイザーをご注文の場合】 ご注文商品のアトマイザー(香水が入っ…
Unreal Engineを触り始めたので調べてみたらなんとC++がUnreal用に独自拡張されている事に気が付きました。 UE4とUnrealC++について | ドクセル 仕組みを見るとC++をC#に近づけましたて感じだし、C#的な使い方で見ておけば良さそう。 てなるとテンプレートもメタプログラミング出来るものじゃなくて、C#のジェネリクス程度ぐらいに思ってよさそう。 C with Classes程度の構文とデザインパターンぐらい分かっていれば前提知識としては十分なレベルだと感じたので難しい事を考える必要はなさそうです。 (STLコンテナを分かってたほうが該当の機能は探しやすいと思うけど) …
「贅沢主義者のグロタンディーク宇宙」でグロタンディーク宇宙の話をしました。贅沢主義か節約主義かは、公理系を設定するときの態度であって、どちらの態度で公理系を設定しても、得られる概念は同じです。ところで、単一のグロタンディーク宇宙ではなくて、宇宙の無限系列を考えることがあります。$`\quad U_0 \in U_1 \in U_2 \in \cdots`$番号を 0 から始めましたが、1 から始めることもあります。番号付け方式の違いはどうでもいい違いです。宇宙の無限系列を、集合論的に解釈したものをラッセル方式〈Russell-style〉の宇宙系列と呼びます。ラッセル方式の宇宙系列は、型理論と…
はじめまして、7月1日にSREとして入社しました霜鳥です。 よく「きりしま」と読み間違えられるのであえて平仮名で表記しています。 前職ではバイトルで知られているディップ株式会社で看護師向けの人材紹介事業「ナースではたらこ」のエンジニア/テックリードとして保守・開発・運用を行っていました。 前職・ディップでのお仕事 京都大学工学部卒業後、2019年に前職のディップにRuby on Railsを扱うバックエンドエンジニアとして入社し、DTダイナミクス(ミスミ)に転職するまでの丸5年間、1つのサービスのグロースに携わってきました。 入社当初のチームは自分を含めて3人のとてもコンパクトなものだったため…
Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜 こんにちは、クラウドハウス労務でバックエンドエンジニアをしているtitti-008です。 本記事では、1日目の@kokuyouwindさんによるセッション、Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜について紹介させていただきます。 セッション概要 @kokuyouwindさんは、LLM(大規模言語モデル)を使ってRBS(型構造)を推測するRBS Gooseというプロジェクトを作成しました。まだ実用段階には至っていない…
Railsチュートリアル 1章 ゼロからデプロイまで やったこと Railsアプリの作成 Git管理 Renderデプロイ 2章 Toyアプリケーション やったこと scaffoldでToyアプリの作成 Userモデル設計 MicroPostモデル設計(ツイートのようなもの) usersリソースをscaffoldで作成 REST micropostsリソースをscaffoldで作成 userとmicropostsを関連づける クラスを継承することで多くの機能をデフォルトで使える Toyアプリのデプロイ 学んだこと scaffoldだけではバリデーションやテスト、レイアウトは作れない 3章 静的…