Ruby

RubyKaigi 2022 に行ってきた

RubyKaigi が3年ぶりにオフラインで開催されたので行ってきた。 希望者は出張扱いで行けるので前泊後泊で4泊5日の出張だった。 勤務先がスポンサーになってる RubyKaigi は初。ブースも出してたんでときどきブース番もした。 フルリモートで家に閉じこも…

Fiddle で Ruby から C ライブラリを使う

rkremap を作ってるとき、最初は FFI を使ったんだけど、そういや Fiddle だと Ruby 標準だからそっちの方がいいかな…と思って Fiddle で作り直した。 ということで忘れないうちに Fiddle についてまとめておく。 Fiddle Fiddle を使うと Ruby から C のライ…

rkremap: キーボードデバイスの自動検出

https://blog.tmtms.net/entry/202201/rkremap の続き。 blog.tmtms.net Rkremap.new 時に引数でキーボードデバイスファイルを指定しないといけなかったんだけど、USB や Bluetooth キーボードとかデバイスファイル名がわからない場合に調べるのが面倒なので…

Linux用キーリマッパー rkremap を作った

11月から仕事で Mac を使うようになって2ヶ月ちょっとたつけど、いまだにショートカットキーが Ctrl キーではなく Command キーであることに慣れない。 慣れないのは仕事以外で普段使ってる Linux と異なるからだと思うんだけど、普通に考えて Mac のショー…

ruby-mysql

これはMySQLアドベントカレンダーとRubyアドベントカレンダーの12日目の記事です。 qiita.com qiita.com ruby-mysql は Ruby だけで書かれた MySQL 用のクライアントライブラリです。 今は Ruby から MySQL を使う場合は普通は mysql2 を使うだろうから、た…

Ruby の Socket.tcp を知った

Ruby で TCP のクライアントとしてサーバーに接続するには TCPSocket.open(TCPSocket.new)を使うもんだと思ってたんだけど、最近 Socket.tcp というのもあることを知った。 どうやら 1.9.2 で追加されたらしい。10年以上も気づかなかった…。サーバー側の Soc…

Ruby Net::SMTP

Ruby Net::SMTP これは 富士通クラウドテクノロジーズ Advent Calendar 2020 と FUJITSU Advent Calendar 2020の 5日目の記事です。 会社のアドベントカレンダーですが、記事の内容は会社とは関係ありません。 nagano.rb #6 で発表したネタです。 SMTP SMTP …

mrubyudf : C を書かずに Ruby だけで MySQL の UDF を作る

昨日はmrubyでMySQLのUDFを作ってみたんだけど、関数毎にCのプログラムを書くのがめんどくさいので、簡単なツールを作ってみた。 github.com 詳しくは README 参照。 fib.rb と fib.spec をこんな感じで作っておいて、 fib.rb LONG_LONG_MAX = 9223372036854…

RubyでMySQLのUDFを作る

昨日はCでMySQLのUDFを作ってみたんだけど、今日はRubyで作ってみる。Rubyと言ってもmrubyだけど。 mrubyは5年ぶりくらいに使ってみたんだけど、相変わらずドキュメントが少なくてなかなかつらい…。 まず mruby のビルド。MySQLのUDFは共有ライブラリにしな…

Puma と Sequel

最近仕事でまた Ruby を使い始めて、簡単な Web API を Grape + Sequel で作ったりした。 SQLで書きたいクエリが分かってる場合は、Sequel の方が ActiveRecord よりも簡単に使えて良い。 レイヤー的には Arel と同じような感じなのかな。Arel 使ったことが…

Rack アプリでクライアントのIPアドレスを取得する

Rack アプリで、クライアントのIPアドレスを取得する方法を調べてみたのでメモ。 どうやら Rack::Request#ip を使えばいいらしいので Rack アプリはこんな感じで。 [config.ru] class HogeApp def call(env) req = Rack::Request.new(env) [200, {}, [ "req.…

Grape

簡単な API サーバーを Ruby で作ろうと思って Rails じゃ大げさすぎるし Sinatra かなーと思ってたら Grape というのがあったので試してみてる。 自分用のメモなので、ちゃんと知りたい人は https://github.com/ruby-grape/grape/blob/master/README.md を…

Ruby 2.7 の変更点 - 2.7.0 リリース!

Ruby 2.7 アドベントカレンダーの25日目の記事です。 qiita.com 12/25 に Ruby 2.7.0 がリリースされました! 2.7.0-rc2 との NEWS の差分を見てみます。 warning 抑止オプション Numbered parameter #method, #instance_method が refinement 対応 Range#=…

Ruby 2.7 の変更点 - StringScanner / open-uri / CSV

Ruby 2.7 アドベントカレンダーの24日目の記事です。 qiita.com StringScanner とか CSV は Ruby の標準ライブラリだけど本体の外で開発されているやつで、NEWSを見ても詳しくは書いてなかったので、調べてみました。 StringScanner fixed anchor モード ope…

Ruby 2.7 の変更点 - Symbol / UnboundMethod / OptionParser

Ruby 2.7 アドベントカレンダーの23日目の記事です。 qiita.com Symbol Symbol#start_with? / #end_with? 追加 UnboundMethod UnboundMethod#bind_call 追加 OptionParser Did you mean? Symbol Symbol#start_with? / #end_with? 追加 Symbol に start_with?…

Ruby 2.7 の変更点 - 2.7.0-rc2

Ruby 2.7 アドベントカレンダーの22日目の記事です。 qiita.com 12/21 に 2.7.0-rc2 が出たので rc1 との NEWS の差分を見てみました。 Array#minmax 追加 Range#minmax 追加 Proc#ruby2_keywords 追加 Array#minmax 追加 2.6 では Array#minmax は Enumerab…

Ruby 2.7 の変更点 - Time / Date

Ruby 2.7 アドベントカレンダーの21日目の記事です。 qiita.com Time Time#inspect : 形式変更 Time#ceil / Time#floor 追加 Date Date.jisx0301, Date#jisx0301 : 令和対応 Time Time#inspect : 形式変更 Time#inspect が小数点以下の秒数を返すようになり…

Ruby 2.7 の変更点 - GC / Method / NilClass / TrueClass / FalseClass / Proc / RubyVM

Ruby 2.7 アドベントカレンダーの20日目の記事です。 qiita.com GC.compact 追加 Method#inspect : 出力が詳しく NilClass#to_s / TrueClass#to_s / FalseClass#to_s : 同じオブジェクトを返す Proc#to_s 形式変更 RubyVM.resolve_feature_path が $LOAD_PAT…

Ruby 2.7 の変更点 - Encoding / Fiber / FrozenError

Ruby 2.7 アドベントカレンダーの19日目の記事です。 qiita.com Encoding::CESU_8 追加 Fiber#raise 追加 FrozenError#receiver 追加 Encoding::CESU_8 追加 自分は知らなかったのですが、Unicode の文字エンコーディングに UTF-8 の亜種で CESU-8 というの…

Ruby 2.7 の変更点 - 2.7.0-rc1

Ruby 2.7 アドベントカレンダーの18日目の記事です。 qiita.com 12/17 に Ruby 2.7.0-rc1 が出たので、2.7.0-preview3 との違いを見てみます。 パターンマッチングで例外 Regexp#match? に nil を渡してもOK パターンマッチングで例外 preview3 時点では cas…

Ruby 2.7 の変更点 - Module

Ruby 2.7 アドベントカレンダーの17日目の記事です。 qiita.com Module Module#ruby2_keywords 追加 Module#autoload? : inherit 引数追加 Module#const_source_location 追加 Module#name が同じオブジェクトを返す Module Module#ruby2_keywords 追加 3日…

Ruby 2.7 の変更点 - Integer / Complex / Comparable

Ruby 2.7 アドベントカレンダーの16日目の記事です。 qiita.com Integer Integer#[] : 引数に範囲指定 Complex Complex#<=> 追加 Comparable Comparable#clamp : 引数に Range 指定 Integer Integer#[] : 引数に範囲指定 Integer#[] は二進数で指定したビッ…

Ruby 2.7 の変更点 - Dir / File / IO / Pathname

Ruby 2.7 アドベントカレンダーの15日目の記事です。 qiita.com Dir Dir.glob / Dir.[] : NUL文字を含むとエラー File File.extname : 「.」で終わる文字列が「.」を返す IO IO.set_encoding_by_bom 追加 Pathname Pathname.glob : 引数追加 Pathname 関数 :…

Ruby 2.7 の変更点 - Array / Enumerable / Enumerator

Ruby 2.7 アドベントカレンダーの14日目の記事です。 qiita.com Array Array#intersection 追加 Enumerable Enumerable#filter_map 追加 Enumerable#tally 追加 Enumerator Enumerator.produce 追加 Enumerator::Lazy#eager 追加 Enumerator::Yielder#to_pro…

Ruby 2.7 の変更点 - irb

Ruby 2.7 アドベントカレンダーの13日目の記事です。 qiita.com irb irb がめっちゃ便利になりました。 まずは Ruby 2.7.0-preview3 リリース の中の動画を見るのが良いでしょう。 readline 互換の pure Ruby ライブラリ reline が標準ライブラリとして加わ…

Ruby 2.7 の変更点 - rescue 節の優先度 / 特異クラス内定義の yield

Ruby 2.7 アドベントカレンダーの12日目の記事です。 qiita.com rescue 節の優先度 代入文で後置 rescue を使用した時に多重代入の時だけ突飛な動きをしてましたが、 a = raise rescue 123 a #=> 123 a = raise rescue [123, 456] a #=> [123, 456] a = b = …

Ruby 2.7 の変更点 - Unicode 12.1 / $SAFE と汚染オブジェクト

Ruby 2.7 アドベントカレンダーの11日目の記事です。 qiita.com Unicode 12.1 Unicode 12.1 に対応しました(2.6.3 から対応してます)。 Ruby 2.6.2 p "㋿".unicode_normalize(:nfkd) #=> "\u32FF" Ruby 2.7 p "㋿".unicode_normalize(:nfkd) #=> "令和" $SAF…

Ruby 2.7 の変更点 - コメント行を挟んだメソッド呼び出し / ヒアドキュメント

Ruby 2.7 アドベントカレンダーの10日目の記事です。 qiita.com コメント行を挟んだメソッド呼び出し メソッド呼び出し時には . の前後に改行することができます。 "hoge". upcase "hoge" .upcase ですが、その間にコメント行を挟むとエラーになっていました…

Ruby 2.7 の変更点 - 「...」で全引数渡し

Ruby 2.7 アドベントカレンダーの9日目の記事です。 qiita.com 「...」で全引数渡し メソッド内から別のメソッドを呼び出す際に、... で今のメソッドに渡された引数そのまま渡すことができるようになりました。 ブロックも含めてすべて渡されます。 def hoge…

Ruby 2.7 の変更点 - self でのプライベートメソッド呼び出し

Ruby 2.7 アドベントカレンダーの8日目の記事です。 qiita.com self でのプライベートメソッド呼び出し プライベートメソッドは、obj.hoge の形式で呼び出そうとしたら普通はエラーになるのですが、self.hoge の場合はエラーにならなくなりました。 class A …