Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ: Crystal言語作者がRubyを愛する理由、TypeScript 4.6リリースほか(20220309後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙏

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

🔗Ruby

🔗 strings-truncation: 長い文字列を...で省略(Ruby Weeklyより)

piotrmurach/strings-truncation - GitHub


つっつきボイス:「エンコーディングにUTF-8のほかにEUC-JPも使えるというのは今どき珍しいかも」「Rubyのtrみたいなものかと思ったら、長い文字列の後半を省略記号...にするんですね」「truncationの機能にはいくつかありますけど、これはRailsのtruncateメソッドに近いかな」

参考: EUC-JP - Wikipedia

「しかも日本語などの全角文字も1文字が半角文字2つ分という形で指定できるらしい↓」「なるほど、これがやりたかったのかも」

# 同リポジトリより
strings.truncate("おはようございます", 8)
# => "おはよ…"

🔗 Crystal言語の作者のひとりがRubyを愛する理由(Ruby Weeklyより)


つっつきボイス:「記事を書いたAry BorenszweigさんはCrystal言語の作者のひとりだそうです」「この記事はequalityがお題ですね: Rubyの==のデフォルトが常識的で使いやすいなど」「Crystal言語でRubyと同じにしたかった部分を解説してますね、読みやすくてよさそう👍」「この記事も翻訳したいです」

crystal-lang/crystal - GitHub

「この記事はシリーズものみたい」「全部で7回なんですね↓」「これも翻訳したいです」

「シリーズ記事にもありますけど、改めてRubyのブロックは設計がいいなと思います」「構文としてのブロックは1個までという制限をつけたのがうまいですよね」「もしブロックを複数渡せるようにしていたらカオスになる未来しか今となっては想像できない」


別人ですが、Aryさんの記事を見ていて、RubyistからElixirの人になったDave Thomasさんをちょっと連想しました↓。

参考: Dave Thomas (programmer) - Wikipedia

🔗 システム内のRubyをモジュラーパッケージでインストールする(Ruby Weeklyより)


つっつきボイス:「システムのRubyを、コンパイルとかせずにパッケージでインストールしようという記事のようですね」「dnfって何だろうと思ったらCentOSのパッケージマネージャ(yumの後継の)でした↓」「へ〜こんなの出てるんですね」「Red Had系のLinuxを使わなくなって久しい」「Debian系のaptか、せいぜいAlpineのapkぐらいしか使ってないかも」「Amazon Linuxを使っているのでyumは使う」「使う使う」

参考: 【dnf】コマンド(基礎編)――ソフトウェア(パッケージ)をインストールする:Linux基本コマンドTips(368) - @IT
参考: 【yum】コマンド(基礎編)――ソフトウェア(パッケージ)をインストールする/アンインストールする:Linux基本コマンドTips(42) - @IT

「Amazon Linuxのyumはいつdnfに変わるんでしょうね?」「Amazon Linuxは今v2だから、次のv3の安定版あたりかな〜」

🔗 Amazon Linux Extras

「ところで、Amazon Linux Extrasに用意されているパッケージは何気に進化を繰り返していて優秀: Dockerも常に新しくなっているし、Emacsも入ってるし」

参考: Amazon Linux - Amazon Elastic Compute Cloud -- Amazon Linux Extras
参考: Emacs - Wikipedia

「たまにAmazon Linux Extrasのパッケージをチェックすると、ちょくちょく増えたり入れ替わったりしているので楽しい↓」「ちゃんと管理されているんですね」「tomcatという文字見えた😆」「GIMPやSquidまで入ってる」「MATEやfirecracker、nginxやPostgreSQLやGo言語なんかも入っていていろいろ助かります👍」「Rubyのバージョンはもっと新しくして欲しいけど」「リストの連番に空きがあるのはパッケージが削除された部分」「なるほど歯抜けの部分がありますね」

参考: Apache Tomcat - Wikipedia
参考: GIMP - Wikipedia
参考: Squid (ソフトウェア) - Wikipedia
参考: MATE (デスクトップ環境) - Wikipedia

firecracker-microvm/firecracker - GitHub

🔗 RubyやRailsでお気に入りのツールは?(Ruby Weeklyより)

つっつきボイス:「Shopifyのツイッターで"RubyやRailsを使うときにどんなツールが好き?"という問いかけにいっぱいレスがついていました」「いきなりruby/debug来ましたね」「よくみたら@st0012さんだ」「ruby/debugは触り心地最高👍」

「自分はbrakemanかな〜」「brakemanも優秀かつちゃんとメンテされていますね👍」

presidentbeef/brakeman - GitHub

🔗DB

🔗 trigramによるPostgreSQL全文検索を最適化する(Ruby Weeklyより)


つっつきボイス:「この記事で紹介されているtrigramという手法は、全文検索の分野でよく使われますね: 記事では"hello"{" h"," he","hel","ell","llo","lo "}のように分解していますが、何文字ずつに分解するかも含めていくつか戦略があります」「3文字だからtrigramなんですね」

参考: PostgreSQL 13.1文書 F.31. pg_trgm

F.31.1. トライグラム(またはトリグラフ)の概念
トライグラムは文字列から3つの連続する文字を取り出したグループです。 共有するトライグラムの個数を数えることで、2つの文字列の類似度を測定することができます。 この単純な考えが、多くの自然言語における単語の類似度を測定する際に非常に効率的であることが判明しています。
注記
pg_trgmは、文字列からトライグラムを抽出する時に単語以外の文字(英数字以外)を無視します。 文字列内に含まれるトライグラム集合を決める際、文字列の前に2つの空白、後に1つの空白が付いているものとみなされます。 例えば、「cat」という文字列のトライグラム集合は、「c」、「ca」、「cat」、「at」です。 「foo|bar」という文字列のトライグラム集合は、「f」、「fo」、「foo」、「oo」、「b」、「ba」、「bar」、「ar」です。
F.31. pg_trgmより

2文字のはbigramと言うそうです↓。汎用的にはn-gramなんですね。

参考: bigramとは バイグラム: - IT用語辞典バイナリ

「trigramの特徴は言語を選ばないこと」「この原理ならたしかに漢字でも何でも使えそうですね」「MeCabのような品詞分解や単語分かち書きが不要になります」「英語や韓国語はスペース区切りだけど、日本語のような言語は単語を区切るところから始めないといけなくなる」「もちろんtrigramの戦略が要件や言語に合ってこそですね」

参考: MeCab - Wikipedia

「記事を見ていて、昔にMySQLでSennaとかをコンパイルしたことを思い出しました」「そうそう、ありましたねSenna」「これも昔にNamazuという全文検索エンジンを使ったことがあります(trigramかどうかはわかりませんが)」

参考: MySQLを通じた全文検索エンジンSenna/groongaの利用について
参考: Namazu - Wikipedia

🔗クラウド/コンテナ/インフラ/Serverless

🔗 OAuth2とOpenID Connect

元記事: Why you probably don't need OAuth2 / OpenID Connect!


つっつきボイス:「OAuth2とOpenID Connectがおそらく不要な理由か🤔」「OAuth2とOpenID Connectは違うものなんでしょうか?」「同じではなかったと思います: OAuth2の上にOpenID Connectが追加されたんだったかな」「こんなことも書かれている↓」「OAuth2は認証ではありません、アクセストークンはセッションではありません、たしかに」「OAuth2をファーストパーティなアカウント登録&ログイン手段として使うとつらくなるともあるけど、OAuth2プロバイダを立ち上げるのでもなければ通常は外部サービスを使いますね」

OAuth2 is not Authentication. Access tokens are not sessions.
同記事より

「記事長いですね」「眺めた感じでは、IDの管理方法は事前によく考えておこうということでしょうね: たとえばOAuth2にすればユーザー管理は不要になるけど、その代わり将来自分たちでアカウントを管理しようとしたときにOAuth2だけでできないことが増えて困ったりすることは考えられる」「なるほど」「今はメールアドレスとパスワードによる認証に加えてOAuth2での認証も選べるようにすることも可能です」「たしかによく見かけますね」

参考: OAuth2.0の流れをまとめてみる

「認証周りでつらいことがあって書いた記事なのかも: ちゃんと読んでみるとよさそう👍」

🔗 その他インフラ


つっつきボイス:「今まで無制限じゃなかったのかと驚いた人も社内でいましたね」「さすが太っ腹」「無制限っていい響き」

🔗JavaScript

🔗 TypeScript 4.6がリリース


つっつきボイス:「社内でも喜びの声が聞こえてきました」「TypeScript 4.6で何がよくなったんだろう?」

「お〜、super()より前にコードを書けるようになったらしい↓」「今までできなかったんですか」「super()の前にコードを書けない言語はそこそこありますね: たしかJavaではメソッドの先頭にしか書けなかった覚えがあります」「たしかそうですね: 自分はsuper()の前に何か書いた記憶がまったくないです」「普通は継承してから何か書きますよね」

// 同記事より
class Base {
    // ...
}

class Derived extends Base {
    someProperty = true;

    constructor() {
        // error!
        // have to call 'super()' first because it needs to initialize 'someProperty'.
        doSomeStuff();
        super();
    }
}

参考: java - コンストラクタの this() super()はなぜ先頭にしか記述出来ないか - スタック・オーバーフロー

「Javaでsuper()を先頭でしか呼べないのは、初期化やデータ構造やメモリアロケーションで不都合があるからなのかも」「Javaのsuper()はオブジェクトを生成するし、最終的にJavaのバイトコードにまで遡るから厄介そうですよね」「super()に対応するバイトコード命令があるんですか?」「そうそう、コンストラクタを呼び出すとか何かをしてたと思います」「とにかくTypeScriptではそうした制約を回避できるようにしたようですね」「TypeScriptはJavaScriptへのトランスパイラだから、JSの世界でやりようがあるのかも🤔」

「へ〜、TypeScriptってこういうunion型も書けるのね↓」「GraphQLにもありますし、最近union型が流行っている感ありますね」

// 同記事より
type Action =
    | { kind: "NumberContents", payload: number }
    | { kind: "StringContents", payload: string };

function processAction(action: Action) {
    if (action.kind === "NumberContents") {
        // `action.payload` is a number here.
        let num = action.payload * 2
        // ...
    }
    else if (action.kind === "StringContents") {
        // `action.payload` is a string here.
        const str = action.payload.trim();
        // ...
    }
}

参考: Unions - The Rust Reference
参考: union - Kotlin Programming Language
参考: PHP 8の正式版が登場、JITやunion型を実装 - Computerworldニュース:Computerworld

「unionというとついC言語伝統のunion(共用体)を思い出す」「そうそう、今もunionと聞いて一瞬脳が止まっちゃいました😆」「わかる」「SQLのUNIONを思い浮かべる人もいるでしょうね」「そして最近は上のようなunion型もあると」「3つのうちどれを思い浮かべるか人によって違いそう」「SQLかな(きっぱり)」

参考: 共用体 - Wikipedia
参考: SELECT文を統合する「UNION」:SQL実践講座(9) - @IT


「話がそれますけど、最近TailwindやDart Sassのバイナリ版が出てRailsでも採用されているみたいに↓、TypeScriptもバイナリ版のトランスパイラを出してtypescript-railsみたいなgemがリリースされたらいいなとちょっとだけ思いました」「それあったら使いたいかも」

Rails 7: importmap-rails + tailwindcss-railsでnode.jsが不要な理由

Rails 7: dartsass-rails gemはNode.jsなしで使える

「TypeScriptの単体バイナリ版トランスパイラは原理的には可能だと思いますけど、TypeScriptが動くところには必ずJavaScriptの実行環境がありますし、TypeScriptのコードはwebpackみたいなバンドラーで他のライブラリと一緒に使うことが多いので、TypeScriptのバイナリ版を作るモチベーションとしては弱いかもしれませんね」「それもそうなんですよね...StimulusのライブラリがTypeScriptで書かれているのをGitHubでちょくちょく見かけるので、RailsでもNode.jsなしでStimulusのコードをTypeScriptで書けたらいいなと思ったのでした😅」「素のTypeScriptを書きたい人がどのぐらいいるかでしょうね」

🔗言語/ツール/OS/CPU

🔗 Make(旧Integromat): ZapierやIFTTTのオルタナツール

参考: Integromat(インテグロマット)とは?使い方・料金を徹底解説! | ノーコードデータベース|NoCode DB


つっつきボイス:「ZapierやIFTTTのオルタナだそうです」「コードを書かずにサービスを連携して自動化できる感じですか」「Zapierはちょっと使ってた」「Makeはオペレーション1000個/月までユーザー数制限なしだけどステップ数は2までか...」「Zapierの無料プランはステップ数無制限なので相当作り込める」「Makeはノンエンジニアをターゲットにしていそうな感じですね」「プログラマーはIFTTTを使っていて、Zapierはノンエンジニアが使っていることが多い印象あるかな」

参考: Zapier | The easiest way to automate your work
参考: IFTTT | Every thing works better together

「どのツールでもいいんですが、この種の自動化ツールは使ってみるといろいろ便利👍」「ですね」「使ったことがない人は一度触ってみるといいと思います」


後編は以上です。

バックナンバー(2022年度第1四半期)

週刊Railsウォッチ: 英国政府サイトで使われるRailsアプリ、pg-oscとPercona Toolkitほか(20220308前編)

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。