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

週刊Railsウォッチ: 中高生国際Rubyプログラミングコンテスト2022、W3Cの分散型識別子仕様が勧告にほか(20220726後編)

こんにちは、hachi8833です。


つっつきボイス:「熱と衝撃が両方加わるとヤバそう」「そういえば自動車にノートPC置きっぱなしにしてた😅」「それヤバいですやん」

週刊Railsウォッチについて

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

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

🔗Ruby

🔗 Strftimeslikethese.com: ruby.wasmで動くstrftimeフォーマットサイト(Ruby Weeklyより)

つっつきボイス:「日時の具体例からstrftimeフォーマットを得られるのは普通な感じだけど、それをruby.wasmでやっているのが面白いですね」「wasmってWebAssemblyのことなんですね」「バックエンドなしですって」「ブラウザコンソールでWasmバイナリを見ると10.4MBか」

ruby/ruby.wasm - GitHub

参考: WebAssembly - Wikipedia

Ruby: strftimeでよく使うテンプレート

🔗 HTMLProofer: HTML検証ツール(Ruby Weeklyより)

gjtorikian/html-proofer - GitHub

# 同リポジトリより
require 'html-proofer'
require 'html/pipeline'
require 'find'

# make an out dir
Dir.mkdir("out") unless File.exist?("out")

pipeline = HTML::Pipeline.new [
  HTML::Pipeline::MarkdownFilter,
  HTML::Pipeline::TableOfContentsFilter
], gfm: true

# iterate over files, and generate HTML from Markdown
Find.find("./docs") do |path|
  if File.extname(path) == ".md"
    contents = File.read(path)
    result = pipeline.call(contents)

    File.open("out/#{path.split("/").pop.sub('.md', '.html')}", 'w') { |file| file.write(result[:output].to_s) }
  end
end

# test your out dir!
HTMLProofer.check_directory("./out").run

つっつきボイス:「lintみたいなものかなと思ったらHTMLチェッカーのようですね」「このツールに定義されている項目をチェックするみたい」「HTMLの検証は専用のツールが他にいろいろありますけどね(W3Cのバリデータはそれほど頻繁には更新されていませんが)」「このhtml-prooferがRuboCopのcopのようにチェック項目を追加可能になってたらよさそう」「ちなみに現代では静的なHTMLを出力してそのままブラウザで表示するサイトが減ってJavaScriptなどで動的にコンテンツを更新することが多いので、静的なHTMLを出力して終わることはほぼありませんけどね」「このツールはWebサイトのチェックとかもできるみたい: 思ったより賢そう👍」

参考: The W3C Markup Validation Service

公開後にお便りをいただきました。

🔗 RubyとOpenSSL

つっつきボイス:「macOS 11 Arm64環境でRubyのビルドがOpenSSLで失敗したというissueです」「OpenSSLの1系最新バージョンの1.1.1qでビルドがこけるようになってたんですね」

その後修正されていました↓。

参考: Fix macOS 11 build by mx-psi · Pull Request #428 · DataDog/omnibus-software

// config/patches/openssl/openssl-1.1.1q-include-string.patch#L9
// (略)
 #include <stdio.h>
+#include <string.h>
 #include <openssl/x509.h>
 #include <openssl/x509v3.h>
 #include <openssl/pem.h>
# config/software/openssl.rb#L158
  # on 1.1 we have to path after running config
  if version.start_with? "1.1."
    if aix?
      # This enables omnibus to use 'makedepend'
      # from fileset 'X11.adt.imake' (AIX install media)
      env["PATH"] = "/usr/lpp/X11/bin:#{ENV["PATH"]}"
      patch_env = env.dup
      patch_env["PATH"] = "/opt/freeware/bin:#{env["PATH"]}"
      patch source: "openssl-1.1.1d-do-not-build-docs.patch", env: patch_env
    else
      patch source: "openssl-1.1.1d-do-not-build-docs.patch", env: env
    end

+   if mac_os_x?
+     patch source: "openssl-1.1.1q-include-string.patch", env: env
+   end
  end

🔗 その他Ruby

「この中高生国際Rubyプログラミングコンテスト、今年で12回目なんですね」「12年も継続しているのは偉大」「このコンテストに最初に出場した中高生の世代は、もう就職してエンジニアになっていたり、できる人ならシニアエンジニアになっていてもおかしくないですよね」

「考えてみたら自分もRails使って10年超えてる」「ぼくもでした」「今思えば最初にRailsを使った理由はノリ一発だったな〜」

「10周年記念サイトもあった↓」「出場者が審査員になっていてもおかしくないと思ったら、もう審査員になっている方もいるんですね」

参考: 中高生国際Rubyプログラミングコンテスト in Mitaka 10周年記念サイト | 中高生国際Rubyプログラミングコンテスト in Mitaka

以下は最優秀賞最年少受賞者(第10回コンテスト審査員)山内奏人さんへのインタビュー動画です↓。

🔗DB

🔗 MongoDB 6.0にアップグレードする理由


つっつきボイス:「MongoDBが6.0になったそうです」「MongoDBしばらく触ってないな〜」「仕事先で使われてます」「ちゃんとアップデートされてます?」「それがさっぱりでして😅」「MongoDBのデータはたいてい大きく育っているだろうから面倒を見るのも大変そうですね」「そうなんです...」

mongodb/mongo - GitHub


以下は元記事の見出しです。

  1. 時系列データのサポート拡充
  2. イベントドリブンアーキテクチャの構築方法が改善
  3. 豊富なクエリでより深い洞察を得られる
  4. 演算子を追加して作業を削減($maxN$minN$lastN、配列の$sortArrayなど)
  5. 操作の弾力性が向上
  6. データのセキュリティや効率的な操作の拡充
  7. シームレスなデータ同期で検索エクスペリエンスがスムーズに

🔗 設計・セキュリティ

🔗 W3Cの分散型識別子仕様が勧告に(Publickeyより)


つっつきボイス:「以前からW3Cが議論していた分散型識別子(DID)がRecommendationになったんですね↓: 以前W3Cのドラフト資料を見たことがあります」

参考: Decentralized Identifiers (DIDs) v1.0がW3C勧告に到達 -- W3C
参考: Decentralized Identifiers (DIDs) v1.0 -- W3C

「いわゆるDIDは、外部に依存せずにIDを発行・管理できるようにする技術: たとえば政府が発行する通常のIDは、政府の一存で無効になる可能性もあるし、国によっては政情が不安定な可能性もあります」「企業が発行・管理する場合も同様ですね」「記事にもあるように、この話題はワクチン接種の証明書や医療情報をはじめ多くの分野にまたがります」「あ、たしかに」

参考: DID(分散型ID) – 中央集権的な管理主体に依存しないアイデンティティ
参考: IdM実験室: ワクチン接種証明のVerifiable Credentialsを覗いてみる

「これにはいろんな技術や問題が関連しますが、免許証を例に話すと、たとえば地方公安委員会のような発行主体(issuer)が発行する免許証を所有者(owner/holder)が持っていて、それを警察官(verifier)が検証するときに、所有者が持っている免許証を警察官がどのようにして発行主体がたしかに発行したものだと信頼するか、という信頼モデルの問題などがあります」「この場合、警察官が地方公安委員会を信頼している必要があるわけですね」「その他に情報の用途や期間などを限定したいというニーズもあります」「なるほど」

「接種証明書のSmart Health CardにはW3CのVerifiable Credentialsが使われています↓」「へ〜」「AppleのHealthKitもSmart Health Card標準を仕様にしていて、たとえば健康情報がどこに取り込まれたかをアプリで取得したり、情報をアプリに渡してよいかどうかをユーザーに確認したりできます」

参考: よくある質問:接種証明書の記載内容について|デジタル庁
参考: Verifiable Credentials Data Model v1.1 -- W3C
参考: HealthKit | Apple Developer Documentation

DIDはVerifiable Credentialsなどのコンポーネントになるそうです↓。

Decentralized Identifiers are a component of larger systems, such as the Verifiable Credentials ecosystem [VC-DATA-MODEL], which influenced the design goals for this specification. The design goals for Decentralized Identifiers are summarized here.
1.2 Design Goals -- Decentralized Identifiers (DIDs) v1.0より

「これがW3Cの仕様にあるDIDのサンプル↓: ちなみに、こういうものにはDNSのセキュリティも関連してきます」「たしかに識別子を確認するときに参照するDNSが汚染されていたら台無しですね」「この方面を本格的にやろうとすると相当いろんなものが関連してくるんですよ」

{
  "@context": [
    "https://www.w3.org/ns/did/v1",
    "https://w3id.org/security/suites/ed25519-2020/v1"
  ]
  "id": "did:example:123456789abcdefghi",
  "authentication": [{

    "id": "did:example:123456789abcdefghi#keys-1",
    "type": "Ed25519VerificationKey2020",
    "controller": "did:example:123456789abcdefghi",
    "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
  }]
}

参考: draft-mayrhofer-did-dns-05 - The Decentralized Identifier (DID) in the DNS

「これらに関連しているのが自己主権型アイデンティティ(SSI: Self-Sovereign Identity)という用語なので、詳しく知りたいならこの用語で検索すると追いかけやすいと思います」

参考: 自己主権型アイデンティティとは?|個人情報管理の新たな姿|ブログ|NRIセキュア

つっつきの後で、自己主権型アイデンティティに関するおすすめの書籍を教えてもらいました↓。

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

🔗 熱波でデータセンターがダウン


つっつきボイス:「ヨーロッパの熱波ヤバい...」「山火事も相当規模が大きかったらしい」

🔗 Slackのフリープラン変更


つっつきボイス:「BPS社内Slackでも話題になっていましたね」「フリープランの過去ログ保存が、以前は件数ベース(10,000件、ストレージ5GB)だったのが日数ベース(90日、ストレージ無制限)に変わったのはつらい」「3か月は短い...」

「今までのように使いたい人はDiscordに乗り換えることになるんだろうか」「Discordは仕事で使いたくない気持ちですけど」「同じく」「以前のDiscordは営利利用不可だったけど、現在は法人利用OKになったので仕事でも使えますけどね」「それで最近Discordのユーザーが増えているんですね」

参考: リモートワークでDiscordを導入しました - MicroAd Developers Blog -- 記事はDiscordが商用利用を許可する前のものですが、後に改定されたことがコメントに追記されています。

🔗JavaScript

🔗 Node.jsのマルチスレッド入門


つっつきボイス:「AppSignalの記事です」「Nodeでワーカースレッドを使うには--experimental-workerを指定する必要があるのか↓」

# 同記事より
$ node app.js --experimental-worker

「コード自体はPromiseを使って普通にやれるようですね↓」

// 同記事
const { Worker } = require("worker_threads");

function doSomethingCPUIntensive(name) {
  return new Promise((resolve, reject) => {
    const worker = new Worker("./sub.js", { workerData: { name } });

    worker.on("message", resolve);
    worker.on("error", reject);
    worker.on("exit", (code) => {
      if (code !== 0) {
        reject(new Error(`stopped with exit code ${code}`));
      }
    });
  });
}

(async () => {
  try {
    const result = await doSomethingCPUIntensive("John");
    console.log("Parent: ", result);
  } catch (err) {
    console.log(err);
  }
})();

🔗 JSchallenger: JavaScript問題集


つっつきボイス:「これはその名の通りJavaScript問題集ですね: やってみたい人はどうぞ」

参考: JavaScript覚えたかったら「JS Challenger」がオススメ - Qiita

🔗言語/ツール/OS/CPU

🔗 Carbon言語(Publickeyより)

carbon-language/carbon-lang - GitHub

// https://github.com/carbon-language/carbon-lang/blob/trunk/docs/images/snippets.md より
// C++ code used in both Carbon and C++:
struct Circle {
  float r;
};

// Carbon exposing a function for C++:
package Geometry api;
import Cpp library "circle.h";
import Math;

fn PrintTotalArea(circles: Slice(Cpp.Circle)) {
  var area: f32 = 0;
  for (c: Cpp.Circle in circles) {
    area += Math.Pi * c.r * c.r;
  }
  Print("Total area: {0}", area);
}

// C++ calling Carbon:
#include <vector>
#include "circle.h"
#include "geometry.carbon.h"

auto main(int argc, char** argv) -> int {
  std::vector<Circle> circles = {{1.0}, {2.0}};
  // Carbon's `Slice` supports implicit construction from `std::vector`,
  // similar to `std::span`.
  Geometry::PrintTotalArea(circles);
  return 0;
}

つっつきボイス:「技術的負債で改良が困難ってつらそう」「Carbonという名前、昔のCarbon APIあたりを思い出してしまう↓」「C++との相互運用性を重視しているのか」「どことなくSwiftっぽいかも」

参考: Carbon - Wikipedia

今回久しぶりにつっつき会に参加したsakaharaさんによると、C++にはパッケージ管理システムというものはないそうです。


後編は以上です。

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

週刊Railsウォッチ: RailsConf 2022の動画が公開、マイクロサービスのテスト戦略ほか(20220725前編)

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

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

Ruby Weekly

Publickey

publickey_banner_captured


CONTACT

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