Notes
This is @codehex's personal note. Candid thoughts any technical stacks and other interesting things.
Join code-hex workspace on Slack. から入れる。自分の学習した内容だったり、メモ、何かしらのスニペットを雑に投稿するための Slack を運営していた。
Slack へ投稿しておくことで、後で自分が見返したくなった時に検索機能を利用して情報を引っ張ってくるのにとても便利だった。また他人のツイートに関して、その URL を投稿しておくことでオリジナルが削除されても、スナップショットとしても残るので便利だった。
しかし 2022 年 9 月 1 日から Slack のフリープランの内容が改定されることになった。フリープランの変更に関するよくある質問によると、ワークスペースにある 90 日が経過したメッセージやファイルのデータは全て非表示になり、有料プランへアップグレードしなければアクセスできなくなってしまう。 これでは今まで投稿したコンテンツを見返せなくなってしまうため、Discord への移行を決めた。
ここではどう移行したかその内容を記録をする。
Cloudflare Workers では Module Worker Syntax と Service Worker Syntax の2つの記述方式が存在している。 Service Worker Syntax を利用している場合、環境変数はすべてグローバル変数として利用可能になる。
この方法はデバッグ目的とかで使える多分便利な技である。
addEventListener('fetch', (event: FetchEvent) => { // @ts-ignore console.log({ ...global }) event.respondWith(new Response("Hello, World!!")) })
コードを読んで分かる通り、グローバルで扱えるものすべて
global
変数に格納されている。これは@cloudflare/workers-types
にも定義されていないため@ts-ignore
する必要がある。実行した結果はこんな感じになる。
One-liner for running queries against CSV files with SQLite という記事で紹介されていた、ワンライナーを使って CSV ファイルに対して SQL クエリを実行する方法。
$ sqlite3 :memory: -cmd '.mode csv' -cmd '.import taxi.csv taxi' \ 'SELECT passenger_count, COUNT(*), AVG(total_amount) FROM taxi GROUP BY passenger_count'
ソース元に記述されてる通り、taxi.csv を GitHub からダウンロードして試すことができる。7z で圧縮されていて解凍する必要がある。
SQLite は通常ストレージディスク(SSD とか)上に保存して利用するのが一般的だが、SQLite 側で用意されている特別なファイル名
:memory:
を指定して開くことでデータをインメモリで扱うことができる。これについては SQLite の In-Memory Databases 1 のページで紹介されている。taxi.csv の中身はこんな感じの CSV ファイル。
Footnotes
-
これは virtual table API を利用して実現されているらしい。この API は全文検索でも利用されているっぽい。 ↩
-
Gitのおすすめエイリアス5選を読んで自分も幾つか晒してみようと思った。
シンプルなコミットログとグラフを表示する
git l
l = log --graph --decorate --pretty=oneline --abbrev-commit
git log
を利用するとコミットログからメッセージだったり、誰がコミットしたのか読めるけど殺風景だし、あまりどのブランチがどうマージされたのか理解しずらい。単純なコミットメッセージとブランチの関係性をパッと知りたい時によく利用している。こんな感じで表示される。
先日面白い記事を読んだ。The Y combinator in Go with generics である。
一番最初目に入ってきたのは難解なジェネリクスのコードである。
type Func[T, U any] func(T) U type TagFunc[T, U any] func(Func[T, U]) Func[T, U] type CombinatorFunc[T, U any] func(CombinatorFunc[T, U]) Func[T, U] func Y[T, U any](f TagFunc[T, U]) Func[T, U] { return func(self CombinatorFunc[T, U]) Func[T, U] { return f(func(n T) U { return self(self)(n) }) }(func(self CombinatorFunc[T, U]) Func[T, U] { return f(func(n T) U { return self(self)(n) }) }) }
このコードを読み解くために、Y コンビネータ1というものを理解する必要がある。そのためには前提となる無名関数を利用した処理を行うコードを理解しておくとよりわかりやすくなる。なぜならこの Y コンビネータは再帰を用いた無名関数呼び出しを行うことでループ処理を実現する機構として利用できるからである。
Footnotes
-
Y コンビネータは不動点演算子とも呼ばれる。Google で素直に「Y コンビネータ」で検索すると Hacker News の会社情報ばかり出てくるため、「Y コンビネータ 関数」だったり「不動点演算子」で検索すると良い。 ↩
-
ドメインを取得後にそれを使ったメールアドレスで送信できるようになったが、受信先でそのメールが迷惑フォルダへ分類されることがある。
会社では Google Domain でドメインを取得後、Google Workspace を利用してメールを送信できるようになった。DNS の管理は Cloud DNS を利用していて、その設定は Terraform を用いて管理している。
当初の設定はシンプルなものであった。
- DNS ゾーンを設定
- 設定したゾーンに対して MX レコードを設定
resource "google_dns_managed_zone" "example_com_domain" { name = "example-com" dns_name = "example.com." } # https://support.google.com/a/answer/9222085 resource "google_dns_record_set" "example_com_email" { name = google_dns_managed_zone.example_com_domain.dns_name type = "MX" ttl = 300 managed_zone = google_dns_managed_zone.example_com_domain.name rrdatas = [ "1 aspmx.l.google.com.", "5 alt1.aspmx.l.google.com.", "5 alt2.aspmx.l.google.com.", "10 alt3.aspmx.l.google.com.", "10 alt4.aspmx.l.google.com.", ] }
これだけで取得したドメインを利用したアドレスでメールの送信ができる。しかし受信先の Gmail 上では次のような警告が表示されていた。
これは Gmail 側で行われる認証ロジックによって、ドメインを取得した本人(もしくは法人)から送信されているメールかどうか判断できなかった場合に表示される。
本記事では Terraform で管理された Cloud DNS を例にメールの信頼性をどう向上させたのかを紹介していく。
これはコードブロックプレビュー
print "Hello, world"
これは
Preview
のテストです。 What's preview?本当に不思議な改行! 😄
今日会社ではじめて「RACI」という言葉を知った。
会社では呼び名が分からなかったのでずっと「ラッシー」と呼んでいたが、本当は「レイシー」と呼ぶらしい。RACI matrix と呼ぶっぽい。
これはプロジェクトや社内での何かしらの工程での役割分担を matrix を使って明確描写するビジネスツールとのこと。
タスクを 4 種類の参加者の責任型に分割し、各参加者には異なる役割が割り当てられる。そしてそれぞれの役割は下記のように決まっている。