- Ruby / Rails関連
週刊Railsウォッチ: 中高生国際Rubyプログラミングコンテスト2022、W3Cの分散型識別子仕様が勧告にほか(20220726後編)
こんにちは、hachi8833です。
/
夏場に注意!「電気火災」 熱や衝撃に弱いリチウムイオン電池が突然発火
\https://t.co/4U8adxnRo3夏場に注意が必要なのが「#電気火災」です。特に気を付けなければいけないのが、スマートフォンなど電子機器に搭載されている「リチウムイオン電池」です。
— TBS NEWS DIG Powered by JNN (@tbsnewsdig) July 20, 2022
つっつきボイス:「熱と衝撃が両方加わるとヤバそう」「そういえば自動車にノートPC置きっぱなしにしてた😅」「それヤバいですやん」
🔗Ruby
🔗 Strftimeslikethese.com: ruby.wasmで動くstrftimeフォーマットサイト(Ruby Weeklyより)
I built something with #ruby and #wasm 👀. Check it out. No backend.https://t.co/sbTn9BMfDJ
— Bruno 🇺🇦 (@bbonamin) May 12, 2022
つっつきボイス:「日時の具体例からstrftime
フォーマットを得られるのは普通な感じだけど、それをruby.wasmでやっているのが面白いですね」「wasmってWebAssemblyのことなんですね」「バックエンドなしですって」「ブラウザコンソールでWasmバイナリを見ると10.4MBか」
🔗 HTMLProofer: HTML検証ツール(Ruby Weeklyより)
# 同リポジトリより
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のHTMLProofer、自分がメンテしているサイトではほぼ毎回使ってます...!! 😭💖#未踏ジュニア のWebサイトでも使っていて、リンク切れや画像のalt属性の設定漏れなどをHTMLProofer + GitHub Actionsで毎回チェックしてます 🤖 ✅
GitHub: https://t.co/Wk8tWpuOns https://t.co/hEG5yjjAjb
— 安川要平/Yohei Yasukawa (@yasulab) July 26, 2022
🔗 RubyとOpenSSL
— Eduardo Hernández (@eduardohgto) July 19, 2022
つっつきボイス:「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
コンテスト作品募集開始についての記事を技術評論社「https://t.co/CDpwOwVj3d」に掲載していただきました。ありがとうございます。#ruby #rubyonrails #ルビコン #IRPC #プログラミング https://t.co/Q0iNIvHND2
— Rubyプログラミングコンテスト (@ruby_mitaka) July 19, 2022
「この中高生国際Rubyプログラミングコンテスト、今年で12回目なんですね」「12年も継続しているのは偉大」「このコンテストに最初に出場した中高生の世代は、もう就職してエンジニアになっていたり、できる人ならシニアエンジニアになっていてもおかしくないですよね」
「考えてみたら自分もRails使って10年超えてる」「ぼくもでした」「今思えば最初にRailsを使った理由はノリ一発だったな〜」
「10周年記念サイトもあった↓」「出場者が審査員になっていてもおかしくないと思ったら、もう審査員になっている方もいるんですね」
参考: 中高生国際Rubyプログラミングコンテスト in Mitaka 10周年記念サイト | 中高生国際Rubyプログラミングコンテスト in Mitaka
以下は最優秀賞最年少受賞者(第10回コンテスト審査員)山内奏人さんへのインタビュー動画です↓。
🔗DB
🔗 MongoDB 6.0にアップグレードする理由
つっつきボイス:「MongoDBが6.0になったそうです」「MongoDBしばらく触ってないな〜」「仕事先で使われてます」「ちゃんとアップデートされてます?」「それがさっぱりでして😅」「MongoDBのデータはたいてい大きく育っているだろうから面倒を見るのも大変そうですね」「そうなんです...」
以下は元記事の見出しです。
- 時系列データのサポート拡充
- イベントドリブンアーキテクチャの構築方法が改善
- 豊富なクエリでより深い洞察を得られる
- 演算子を追加して作業を削減(
$maxN
、$minN
、$lastN
、配列の$sortArray
など) - 操作の弾力性が向上
- データのセキュリティや効率的な操作の拡充
- シームレスなデータ同期で検索エクスペリエンスがスムーズに
🔗 設計・セキュリティ
🔗 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のフリープラン変更
“Slack 初の料金改定とフリープランの内容変更のお知らせ” https://t.co/WqWy1XYSPm
— mattn (@mattn_jp) July 18, 2022
つっつきボイス:「BPS社内Slackでも話題になっていましたね」「フリープランの過去ログ保存が、以前は件数ベース(10,000件、ストレージ5GB)だったのが日数ベース(90日、ストレージ無制限)に変わったのはつらい」「3か月は短い...」
「今までのように使いたい人はDiscordに乗り換えることになるんだろうか」「Discordは仕事で使いたくない気持ちですけど」「同じく」「以前のDiscordは営利利用不可だったけど、現在は法人利用OKになったので仕事でも使えますけどね」「それで最近Discordのユーザーが増えているんですね」
参考: リモートワークでDiscordを導入しました - MicroAd Developers Blog -- 記事はDiscordが商用利用を許可する前のものですが、後に改定されたことがコメントに追記されています。
Discord should be accessible to everyone. That's why we've worked with our community to add requested features such as
- improved keyboard navigation
- adjustable text-to-speech speed
- role color display options for better server readability
+ more @ https://t.co/hOtOvmrQod pic.twitter.com/o1abUz2lRV— Discord (@discord) July 7, 2022
🔗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問題集
I have completed 25 challenges on JSchallenger and received the official JSchallenger Advanced badge 😎
https://t.co/NPoPBTcqss via @kueckelheim
— Ger (@Web3Ger8635) July 18, 2022
つっつきボイス:「これはその名の通りJavaScript問題集ですね: やってみたい人はどうぞ」
参考: JavaScript覚えたかったら「JS Challenger」がオススメ - Qiita
🔗言語/ツール/OS/CPU
🔗 Carbon言語(Publickeyより)
// 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っぽいかも」
今回久しぶりにつっつき会に参加したsakaharaさんによると、C++にはパッケージ管理システムというものはないそうです。
後編は以上です。
バックナンバー(2022年度第3四半期)
週刊Railsウォッチ: RailsConf 2022の動画が公開、マイクロサービスのテスト戦略ほか(20220725前編)
- 20220719 RubyのGCが高速化、RuboCopのストレスを減らす4つの方法、Defensive CSSほか
- 20220711前編 AR::RelationにCTEを利用できるwithメソッドが追加、Propshaftアップグレードガイドほか
- 20220705後編 6月のRubyコア動向、Stack Overflowアンケート結果ほか
- 20220704前編 マイグレーションをStrategyパターンで拡張可能にほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)