Ruby

【Ruby 3.0 Advent Calendar 2020】Ruby3.0でRubyで実装されたメソッドたち【3日目】

はじめに Ruby 3.0 Advent Calendar 2020 3日目の記事になります。昨日は、【Ruby 3.0 Advent Calendar 2020】Ruby3.0に投げたPull Request【2日目】です。gamelinks007.hatenablog.com今日はRuby 2.7から対応されている一部メソッドがRubyで実装されている…

【Ruby 3.0 Advent Calendar 2020】Ruby3.0に投げたPull Request【2日目】

はじめに Ruby 3.0 Advent Calendar 2020 2日目の記事になります。昨日は、【Ruby 3.0 Advent Calendar 2020】Ruby に右代入がやってくる【1日目】です。 secret-garden.hatenablog.com右代入、このまま何事もなく入るといいなぁ……この記事では、僕が投げたP…

社会人になってからプログラマーになった話

はじめに 少し前にFediverseのTLで「別業種とかからプログラマーになった話があるとよさそう」と盛り上がってた。 僕自身は社会人になってからプログラマーとして仕事してるので、その辺の経験とか経緯を記事にしてみると需要がありそうかなと思い、書いてみ…

JavaScriptのexportとimportっぽいものをRubyで書いてみた

はじめに とある勉強会で以前聞いた「JavaScriptのimportとexportみたいなのがRubyで出来ないか?」という話をもとにRubyでやってみた記事です。 実際のコード module Klass @@klasses = {} def export(*klasses) klasses.each{ @@klasses[_1.to_s.to_sym] =…

Ractor超入門

はじめに この記事はRuby3で導入される並列・並行処理のための新機能Ractorに興味のある方向けの記事になります。 簡単なRactorを使ったサンプルコードを解説しつつ、理解を深めることができるように書いてみました(ほとんど未来の僕へ向けた記事になってい…

Rubyで型宣言っぽくコードを書けるようにしてみた

結論 以下のようなコードが動くようになります。 n = int 42 # => 42が代入される f = int 4.2 # => TypeError! やったこと 以下のようにKernelモジュールにモンキーパッチします module Kernel module_function def int(var = 0) if var.is_a?(Integer) var…

Ractorで複数のオブジェクトを渡せるようにしてみた

結論 Ractorで以下のコードを動くようにしてみました。 r = Ractor.new do v1, v2 = Ractor.recv puts v1 puts v2 puts v1.class puts v2.class end r.send(1, 2) r.take # => 1 # => 2 # => Integer # => Integer Ractorって? Ruby3で導入される並行・並列…

CRubyのFloatクラスの結構なメソッドをbuiltinで書き直してみた

はじめに Hamada.rbでCRubyのFloatクラスをbuiltinで書き直してみた記事です。どちらかといえば作業ログな内容です。 builtinとは? 過去にいくつか記事にしているので詳細はそちらを見て頂ければと思いますgamelinks007.hatenablog.com gamelinks007.hatena…

ruby-type-profilerを試してみた

はじめに この記事はHamada.rbでruby-type-profilerを試した時のアレコレをまとめたものです。 使用している環境としては WSL2(Ubuntu 18.04) で使用したRubyはruby 3.0.0dev (2020-09-07T04:29:42Z master 17a27060a7) [x86_64-linux]です。 ruby-type-prof…

Ruby2.7ではRubyで実装されたメソッドは挙動が以前と違う話

Ruby Issue Tracking System で見つけたチケットのバグを調べたときのあれこれをまとめたものです。ちなみに、調べたチケットはこれbugs.ruby-lang.org簡単に言うとruby-profでコードの挙動を追うと意図したものと異なっているみたい 挙動が違う箇所 Ruby 2.…

Rubyのbuiltinを複数のファイルでサポートできるようにした

結論 builtinで複数のRubyコードを使うことができるようになる話。ようはRubyでRubyを高速化するのがよりやりやすくなる話。以前書いたこの記事をもっと深堀りしたものなので、もっとソフトな話を読みたい方はこちらを読んでいただければと思います。gamelin…

Kernel#iterator?で警告を出す

結論 ブロックを渡されているかどうかをチェックして真偽値を返すKernel#iterator?をdeprecatedにしようぜという話 Kernel#iterator? Kernel#iterator?はブロックが渡されているかどうかをチェックできるメソッドです。 def check if iterator? puts "Block …

続・るりまの開発環境をDockerで作ってみた

はじめに 昨日書いた記事の続編です。gamelinks007.hatenablog.comDockerを使い、るりまの開発環境(+プレビュー環境)を作ってみました。 環境構築 以下のDockerfileをまず作成します。 FROM ruby:latest WORKDIR /home COPY ./ ./ RUN gem install bundler:1…

るりまのビルド環境をDockerで作ってみた

結論 以下のDockerfileでビルド環境はできる FROM ruby:latest WORKDIR /home COPY ./ ./ RUN gem install bundler:1.17.2 bitclust-core bitclust-dev refe2 rack きっかけ 今日参加したTama.rbでるりまのビルド環境が構築し辛いという話を聞いたのがきっか…

RubyでRubyを実装する時の罠

結論 複数のクラスを実装しているRuby内部のCコードでbuiltinをいくつか組み合わせるとビルドできなくなる。 RubyでRubyを実装する 最近のRubyは「Ruby自体をRubyで実装することで高速化できる」という場面がある。その辺の詳しいことは以前記事にまとめたの…

Ruby 2.7でのSEGVの件

結論 Ruby 2.7で以下のコードがSEGVする。 p **1 以下のコミットでmasterでは修正済み。github.comただ、まだバックポートはされていない模様。ちなみにバグ報告のチケットとしてはこちらbugs.ruby-lang.org Ruby 2.7でのSEGV Ruby 2.7では以下のコードでSEG…

RubyでRubyを高速化できるかもしれない話

結論 RubyでRubyを高速化できるかもしれない話です。 半分は調べた内容のメモ用で書いてます。 どういうこと? 現在開発中のRubyでは一部の実装をRubyで書くことができるようになっています。(ちなみに、Ruby 2.7ではいくつかのメソッドがRuby(とC)で実装さ…

RubyのナンパラでSEGV

結論 Ruby 2.7ではこのコードでSEGVする模様(WSL2 上の Ubuntu 18.04で確認) [1, 2, 3, 4].map{ _1 **3 } やりたかったこと Ruby 2.7から導入された numbered parameter を使って配列内の数値を3乗したものを作ろうとした。 が、SEGVが起きてしまった。 sh@M…

Hamada.rbがそろそろ一周年迎える話

Hamada.rbがそろそろ一周年を迎えるので、やりはじめたきっかけとかまとめとこうと思い、つらつらと書いてみました。 Hamada.rbって? 島根県浜田市にある地域.rbです。多分、島根県西部では唯一の地域.rb。 hamadarb.connpass.com また島根県西部のIT系コミ…

TIL:CRuby 右代入でのアレコレ

右代入 masterに現在導入されているシンタックスで、その名の通り左から右へと値を代入することができる。例えばこんな感じのコードが書ける。 :hoge => temp # temp に:hoge が代入される Railsなどでメソッドチェーンがかなり長くなった時とかに便利そうと…

Array#both_endの使いどころを考える

はじめに Array#minimaxというメソッドがRuby 2.4から導入されていて、そのメソッドの実装を読んでいた時に思いついたArray#both_endメソッドの実用例についてつらつらと書いてみた記事。 なので、実際にRubyにそういうメソッドがあるわけではない。 実装 /*…

Rubyにパッチを投げてきたアレコレ

はじめに この記事は俺GW頑張ったというGWアドベントカレンダーの5月1日の記事です。 プログラミング言語Rubyにテストの修正やbuiltin対応などでパッチを投げてきた時の知見などを振りかえってみたかったので書いてみた。 やったこと テスト修正関連 そもそ…

RubyのFloat(arg, exception: true)をbuiltinで再実装してみた

はじめに この記事は以前書いた以下の記事で紹介したbuiltinを使ってFloat(arg, exception: true)というメソッドを再定義してみた記事になります。 gamelinks007.hatenablog.com やっていることは前回の記事とおおよそ同じです。前回と異なる点は、特定のク…

Ruby(とC)でRubyを実装してみた(builtinで遊んでみた)

はじめに タイトルにもあるようにRubyのbuiltin(正式名称を知らないので呼び出し方法から拝借)というものを使ってRuby自体をRuby(とC)で実装してみた話です。 内容としてはRuby自体の実装に興味のある方向けの話になります。 builtinって? builtinとはRub…

一年間で作ってきたリポジトリをさかのぼる

はじめに この記事は、俺今年頑張ったAdvent Calendar 2019 の13日目の記事です。 タイトル通り、一年間で作ってきたリポジトリを振り返っていこうと思います。なお、GitHubで公開しているもののみに限定しています。 リポジトリ数 今年一年で作ったリポジト…

C++で作るRuby拡張

はじめに この記事は「Ruby Advent Calendar 2019」の8日目の記事です。 C++でのRuby拡張実装について、つらつらと書いている記事になります。 内容としてはTataraというRubyで型を使えるライブラリを作ってみたで紹介した自作Ruby拡張を作るにあたって得たC…

Hanami向けにBlumaのラッパーgemを作った

HanamiというRubyのWebフレームワーク向けにBlumaってCSSライブラリのラッパーgemを作ってみた github.com 使い方は簡単で、Gemfileにhenami-blumaを追加するだけ。 あとは、<%= stylesheet 'bluma' %>のように使いたいテンプレートで呼び出すだけ 実装にあ…

Ruby Hack Challenge Holiday #2 に参加してきた!

はじめに たまたま東京に行っているときだったので、Ruby Hack Challenge Holiday というRuby自体のコードをHackしてみようというイベントに参加してきた! connpass.com Ruby Hack Challenge Holidayって? Rubyのコミッター(Ruby自体の開発をされている人…

Mastodonのmaster追従ができなかったので修正した話

はじめに この記事は、さくらのクラウドでスタートアップスクリプトを使用してMastodonインスタンスを設置した人向けのTipsです knowledge.sakura.ad.jp 経緯 いつものようにmaster追従しようと思い、やっていたらエラーを吐かれたのが事の発端 どうもGLIBCX…

AmazonDashボタンでMastodonインスタンスを爆破できるようにした

はじめに AmazonDashボタンで「にゃーん」って呟けるようにしたときのアレコレをもとに、Mastodonインスタンスをスナック感覚で爆破できないか試したものになります gamelinks007.hatenablog.com なお、記事を参考にして実際に爆破するかは自己責任にてお願…