あなたの知ってるRubyGemsTips で LT してきた

あなたの知ってるRubyGemsTips で LT してきました。 LT よかったよー、と言ってもらえたのでよかったよかった。 printf デバッグが捗る gem をつくった話 2年ぐらい前に binding-debug という gem をつくったんですが、最近いろいろと機能拡張したのでそれ…

JavaScript で全角スペースはホワイトスペースとして扱われる

JavaScript で全角スペースを書いた場合、ホワイトスペースとして扱われます。知らなかった…。 なので次のように全角スペースが含まれているコードでも実行する事ができます。 if ( true ) { console.log("hoge"); } うーん…便利…なのか? 参照 【JavaScript…

Ruby でクラス名と同名のメソッドを定義する

Ruby ではクラスと同じ名前のメソッドを定義する事ができます。 class X end def X(a = nil) "X(#{a})" end # 何もつけなかった場合はクラスを参照 p X # => X # メソッドぽい呼び出しであればメソッドを参照 p X() # => "X()" p X 42 # => "X(42)" この手の…

Ruby の private メソッドを特定のコンテキストで public にする

Ruby では次のように private メソッドにすると『レシーバをつけたメソッド呼び出し』ができません。 class X private def value 42 end end x = X.new # error: private method `value' called for #<X:0x00007fabe905fa40> (NoMethodError) x.value こういうときに refinements </x:0x00007fabe905fa40>…

Ruby で任意の定数を参照した際に警告が出るようにする

Ruby で任意の定数を参照した際に警告が出るようにしたい場合、 Module#deprecate_constant を利用することができます。 class X Hoge = 42 end # no warning X::Hoge # X::Hoge を参照すると警告を出すようにする X.deprecate_constant :Hoge # warning: co…

Omotesando.rb #54 で『ActiveRecord のコードを読んでみる』をしてきた

Omotesando.rb #54 で LT してきました。 今回は「コードの読み方」というテーマだったせいかいつもよりもめっちゃ人が集まっていましたねー。人が多いけど懇親会でぼっちだったワイ やっぱり「コードの読み方」っていうのは初心者から上級者まで興味がある…

irb で実行結果を pp で出力する

irb で実行結果を pp で出力する手段がいくつかあるのでまとめ。 irb の起動オプションで変更する irb の起動オプションに --inspect pp を追加することで pp の出力になります。 $ irb --inspect pp irb(main):001:0> (1..10).to_h { |it| [it, it] } = > {…

ActiveRecord で実行される sql を確認する

ActiveRecord で実行される sql を確認したい場合、 #to_sql メソッドが利用できます。 # このリレーションでレコードを読み込む場合に実行される SQL を文字列で取得する p Blog.joins(:articles).where(articles: { name: "hoge" }).to_sql # => "SELECT \…

ActiveSupport::TimeWithZone#+ に数値を渡したときの挙動

ActiveSupport::TimeWithZone#+ に値を渡すと『渡した時間を加算した時刻』を返します。 # 現在の時刻 current_time = Time.current pp current_time # => Mon, 06 Jan 2020 20:10:15 JST +09:00 # + 1日 pp current_time + 1.days # => Tue, 07 Jan 2020 20…

Vim 8.2 で Vim script に -> 演算子が追加された

Vim

Vim 8.2 で Vim script に -> 演算子が追加されました。 これは f(x, y) を x->f(y) という風に書くための演算子になります。 例えば echo map(filter(range(1, 10), { -> v:val % 2 == 0 }), { -> v:val * v:val }) というようなネストしている関数呼び出し…

Vim 8.2 で Vim script の辞書のキーの定義が簡略化できるようになった

Vim

Vim script で辞書を定義する場合、次のようにキーを文字列リテラルで定義していました。 let dict = { "one" : 1, "two" : 2, "three" : 3 } echo dict " => {'one': 1, 'two': 2, 'three': 3} Vim 8.2 では上記のような定義を以下のように定義する事ができ…

C++20 で指示付き初期化子を使ったキーワード引数

C++20 で指示付き初期化子が実装されました。 指示付き初期化子はクラスを初期化する時に『任意のメンバ変数』を指定して初期化する事ができます。 struct pos{ int x; int y; int z; }; // .メンバ変数名 = で初期化できる pos p{ .x = 1, .y = 2, .z = 3 }…

Vim 8.2 で Vim script に :const が追加された

Vim

Vim 8.2 で Vim script に :const が追加されました。 これは変数を定義する :let と同じように使用し、定義した変数を不変にします。 例えば const x = 42 は let x = 42 lockvar 1 x と同等になります( lockvar の 1 は depth の指定 これにより const を…

Vim 8.2 で Vim script にヒアドキュメントが追加された

Vim

Vim 8.2 で Vim script でヒアドキュメントがかけるになりました。 使い方は以下の通り " END ~ END の間のテキストを行ごとのリストとして返す let s:text =<< END if cond echo "homu" endif END echo s:text " => [' if cond', ' echo "homu"', ' endif']…

2020年になりました

来年できることは来年やりましょう

2019年 まとめ

今年一年の振り返りです Ruby Ruby にパッチ投げたりチケット立てたりした 今年つくった bugs.ruby のチケット一覧 知り合いのコネで開発者会議に参加させてもらった いつも内容が濃ゆい 勉強会で Ruby の LT しまくった 詳細は後述参照 reline に GitHub Ac…

つよつよパソコンを新しく組み立てた

勢いでつよつよパソコンを新しく組み立てました。 構成は以下の通り。 構成 【CPU】AMD Ryzen 9 3900X BOX \62,443 @最安 【CPUクーラー】Corsair H150i PRO RGB CW-9060031-WW \19,200 @最安 【メモリ】G.Skill F4-3600C16D-32GTZNC [DDR4 PC4-28800 16GB 2…

RSpec の satisfy マッチャを便利に使う

Model のテストなどを書く時に次のように任意のリレーションに対して意図するクエリが追加されているかどうかをテストすることがあると思います。 class User < ActiveRecord::Base # rate 基準で上位10人を絞り込む scope :top10, -> { where(active: true)…

Ruby の remove_method と undef_method の違い

さてさて、せっかくアドベントカレンダーでブログを書き続けているのでどうせならこのまま書き続けていこうかなーと思います。 まあすぐに止まりそうですが。 今回の内容は某所でちょっと話題になっていたので覚書。 remove_method と undef_method の違い r…

Ruby 2.7 がリリース

例年どおり昨日 25日に Ruby 2.7 がリリースされました。 Ruby 2.7.0 リリース Ruby 2.7 の開発はだいぶ追っていたんですが追加された機能もあれば実装されたけど最終的に Revert されてしまった機能もあり割と起伏が激しい印象です。 なんだよ、最終的に Re…

【一人 C++20 Advent Calendar 2019】C++ にコンセプトがやってくる!【25日目】

一人 C++20 Advent Calendar 2019 25日目の記事になります。 C++ にコンセプトがやってくる! ついに C++ にコンセプトがやってきました! C++11 の時代から長かった…。 コンセプトとはテンプレートパラメータに対して任意の制約を指定することができるよう…

【一人 C++20 Advent Calendar 2019】状態を持たないラムダ式がデフォルト構築可能、代入可能となった【24日目】

一人 C++20 Advent Calendar 2019 24日目の記事になります。 状態を持たないラムダ式がデフォルト構築可能、代入可能となった 状態を持たないラムダ式がデフォルト構築可能、代入可能となりました。 次のようにラムダ式の型からオブジェクトを定義することが…

【一人 C++20 Advent Calendar 2019】C++ にモジュールがやってくる!【23日目】

一人 C++20 Advent Calendar 2019 23日目の記事になります。 C++ にモジュールがやってくる! ついに C++ にモジュールがやってきます! モジュールとはヘッダーファイル・インクルードに置き換わる『外部ファイル・実装を取り込む新しい仕組み』になります…

【一人 C++20 Advent Calendar 2019】実装依存の情報をまとめた <version> ヘッダーを追加【22日目】

一人 C++20 Advent Calendar 2019 22日目の記事になります。 実装依存の情報をまとめた ヘッダーを追加 実装依存の情報(実装固有のライブラリバージョンマクロなど)をまとめたヘッダーとして <version> が追加されます。 今まではライブラリごとのヘッダーをインクル</version>…

【一人 C++20 Advent Calendar 2019】範囲ライブラリとして <ranges> が追加される【21日目】

一人 C++20 Advent Calendar 2019 21日目の記事になります。 今回もまだ実装しているコンパイラがないので軽めの内容です。 [範囲ライブラリとして が追加される] 今まではイテレータの組を利用してイテレーションを行っていたのですが、C++20 では新しく <ranges> </ranges>…

【一人 C++20 Advent Calendar 2019】std::result_of が削除される【20日目】

一人 C++20 Advent Calendar 2019 20日目の記事になります。 std::result_of が削除される C++11 で追加され、C++17 で非推奨になっていた std::result_of が削除されます。 変わりに今後は std::invoke_result を使用する事が推奨されます。 #include <type_traits> stru</type_traits>…

【一人 C++20 Advent Calendar 2019】新しいフォーマットライブラリ <format> が追加【19日目】

一人 C++20 Advent Calendar 2019 19日目の記事になります。 新しいフォーマットライブラリ が追加 printf のようなフォーマットを指定して文字列を生成するライブラリが新しく追加されます。 例えば std::format(書式, 引数...) のような形で呼び出し、関数…

【一人 C++20 Advent Calendar 2019】<=> 演算子が追加される【18日目】

一人 C++20 Advent Calendar 2019 18日目の記事になります。 <=> 演算子が追加 C++20 では新しく三方比較演算子(<=>) が追加されます。 宇宙船演算子とも言われてるやつですね。 <=> 演算子は 自分と等しい 自分よりも大きい 自分よりも小さい の 3つの状態…

【一人 C++20 Advent Calendar 2019】typeid が constexpr に対応【17日目】

一人 C++20 Advent Calendar 2019 17日目の記事になります。 typeid が constexpr に対応 昨日書いた dynamic_cast が constexpr に対応したのに合わせて type_id も constexpr に対応しました。 #include <typeinfo> #include <iostream> struct A { virtual void dummy() {} };</iostream></typeinfo>…

【一人 C++20 Advent Calendar 2019】dynamic_cast が constexpr に対応【16日目】

一人 C++20 Advent Calendar 2019 16日目の記事になります。 dynamic_cast が constexpr に対応 dynamic_cast が constexpr に対応しました。 #include <iostream> struct A { virtual void dummy(){} }; struct B : A { constexpr B(int value) : value(value) {} vir</iostream>…