ハイライト 2023-03-03

Articles

uxdesign.cc

  • Author: Megan C.
  • Full Title: Is Offset Pagination Dead? Why Cursor Pagination Is Taking Over

Offsetページネーションに一昔前までかなり慣れていたけど、これからは基本的にはCursorページネーションを意識しておいた方が良さそう。そしてOffsetページネーションってパフォーマンス悪いってことに気づいていないことに気づいた。Cursorページネーションするときには、Cursorを何にするか、という設計が大事。


stackoverflow.blog

  • Author: Chelsea Troy
  • Full Title: Stop Saying “Technical Debt”

「技術負債」と漠然と言うのではなく、もっと具体的なスコープに絞り込まないと誤解を生みやすいというような話。例えば保守作業と機能開発に割り振られている時間の比率などを計測すると良さそうだ、など。

Books

learning.oreilly.com

  • Full Title: Introduction

Staff Engineerの3つの柱

  1. 俯瞰力(Big-picture thinking)
  2. プロジェクトへの実行力(Execution)
  3. 他のエンジニアの成長促進(Leveling up)

Tweets

Domain Modeling Made Functionalはバイブルとなりつつある

ハイライト 2023-02-22

Articles

shopify.engineering

  • Author: John DeWyze
  • Full Title: The 25 Percent Rule for Tackling Technical Debt

技術負債を以下の4つのカテゴリに分ける。業務の25%は技術負債にあてられるようにして、それぞれ以下の比率でハンドリングすると良さそうだとのこと。

  • Yearly Debt -> 5%
  • Monthly Debt -> 5%
  • Weekly Debt -> 10%
  • Daily Debt -> 10%

www.jointaro.com

Performance Improvement Plan というのを初めて聞いた。PIPといえば認可におけるPolicy Information Pointが思い浮かびます😅 パフォーマンスが出ていない人との関わり方は難しい問題ですね。

Tweets

トレードオフですよね。このあたりをさくっと議論できる環境にいるとやりやすいイメージ。


空気を感じたときには「I'll get out of your hair」使えるようになるぞ。

ハイライト2023-02-15

Articles

aws.amazon.com

EventBridge Pipesを使ったアーキテクチャのパターンをわかりやすく解説してくれている。

  • Content filter pattern
  • Message translator pattern
  • Normalizer pattern
  • Claim check pattern

Books

learning.oreilly.com

  • Author: Scott Wlaschin
  • Full Title: Domain Modeling Made Functional

  • Long Running Workflows

    • Sagaパターンの解説
  • Functions, Functions, Everywhere
    • 関数型の思考について

For example, say that we have a large program that is assembled from smaller pieces.

• In an object-oriented approach, these pieces would be classes and objects.

• In a functional approach, these pieces would be functions.

Or say that we need to parameterize some aspect of the program, or we want to reduce coupling between components.

• In an object-oriented approach, we would use interfaces and dependency injection.

• In a functional approach, we would parameterize with functions.

Or let’s say that we want to follow the “don’t repeat yourself” principle and reuse code between many components.

• In an object-oriented approach, we might use inheritance or a technique like the Decorator pattern.

• In a functional approach, we put all the reusable code into functions and glue them together using composition.


GraphQLのProduction Readyな設計のプラクティスがよくまとまっている本。

Tweets

They want buttoned-up types who can keep secrets.

秘密を漏らさない口の堅いタイプを欲している

buttoned-up/down な表現は初めて知った。

ハイライト 2023-02-08

Articles

collabnix.com

AIからは解をもらうというより、探すためのヒントをもらうっていうのはその通りだなと。なので結局ある程度のスキルは必要だとは思う。


deno.com

There are many benefits to moving the work a browser does to render a website to the server:

Performance is higher with the server because the HTML is already generated and ready to be displayed when the page is loaded.

Compatibility is higher with server-side rendering because, again, the HTML is generated on the server, so it is not dependent on the end browser.

Complexity is lower because the server does most of the work of generating the HTML so can often be implemented with a simpler and smaller codebase.

フロントエンドエンジニアとしてカバーすべき範囲は広くなってきた感じはする。Backbone.jsだったりAngular.jsのころは本当にフロントエンドのことだけ考えたりしてましたから。


blog.codecentric.de

  • Author: Julian Arz
  • Full Title: Compile Once, Run Anywhere With WebAssembly and WASI

WASMでビジネスロジックをフロントエンドも含めてポータブルにするというのは次世代感がある。


github.com

ベストプラクティスありすぎだけど、Arrange, Act & Assert (AAA) は布教したい派。


jasonformat.com

Islands Architectureは結局のところmicro-frontendsのことかと思ったんだけど、micro-frontendsはどうやらHTMLに限った話では無いらしい。


qiita.com

  • Author: Qiita
  • Full Title: React18でuseEffectが2回走っちゃう件

useEffectは2回走っちゃってもちゃんと動くコードを書きましょうねという話。


zenn.dev

  • Author: Zenn
  • Full Title: 私の推しフロントエンドディレクトリ構成と気をつけたいポイント

機能を軸にしてディレクトリ構造を考えるのは自分も好き。「機能の粒度をエンジニアだけで考えない」という観点はとても大事だと共感。


mugi1.hateblo.jp

  • Author: memo_md
  • Full Title: 規模感の違う脱レガシーで必要なこと

一人で隣町まで行っただけなら帰り道も辿れそうだが、みんなで宇宙に行ったら簡単には地球には帰ってこれない。ちゃんと次の惑星に辿り着かないといけない。撤退という選択肢がどこかのタイミングで難しくなってくる。

表題と上の引用がグッとくる。バイブルにしたい内容。


martinfowler.com

  • Author: Martin Fowler
  • Full Title: Modularizing React Applications With Established UI Patterns

AuthorはMartin Fowlerになってるけど、実際はJuntao QIU氏が書いた記事。フロントエンドのアーキテクチャについて非常に勉強になる内容。気になるのは、今後はコンポーネントのそばにデータのfetchを入れていくアーキテクチャになっていきそうだということ(Next.jsで語られているcollocated data fetching)。この点とも合わせて今後注目したい。

beta.nextjs.org

Tweets

overestimateも頭をよぎったりした。さらっとoverstatementだったりunderstatementを使えるようになりたい。

ハイライト 2023-02-01

Articles

qiita.com

実は、「 innerHTML を用いて挿入された script elements は、挿入時にはその内容が実行されない 」ということ自体は 正解 です。 これは W3C にもきちんと記されていることです。

Note: script elements inserted using innerHTML do not execute when they are inserted. (出典: W3C. "2. The Document Object Model". W3C. 2008 年 10 月 6 日. https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0

このあたりは無知。


www.osohq.com

  • Author: osohq.com
  • Full Title: Authorization Patterns in GraphQL

My advice on building authorization in GraphQL applications usually boils down to these rules of thumb:

  1. Build your authorization logic as close to the data as possible, ideally within your GraphQL API.
  2. Custom Directives and Middleware are both neat ways to do this while keeping your authorization logic decoupled from your schema – but only if you only have a single GraphQL API.
  3. API Gateways can work if you need a single solution for multiple GraphQL APIs at once, but they can limit the types of rules you will be able to write.

GraphQLにおける認可のアーキテクチャについてとてもよくまとまっている記事。


logmi.jp

  • Author: ログミーTech
  • Full Title: 「フロントエンドのテストは“不安定さ・壊れやすさ”との戦い」 和田卓人×倉見洋輔×古川陽介が語る、アクセシビリティの重要性

Storycapやreg-cliは初めて知りましたが、これを活用すると脱Chromaticできる?

github.com

アクセシビリティが高い=テスタビリティも高い


www.ex-it-blog.com

確定申告も近いし、支払調書について割とわかってなかった中出てきた記事。


www.geekly.co.jp

「正しそうなことを言うけどわかっていなそうな人」じゃなくて、「ちゃんとコードを書ける人」というところを頑張って維持したい。

DDDとCQRSの話も聞けて非常に面白い。子育てと自己研鑽の両立の難しさの話もとてつもなく共感。

Tweets

一時的なテスト環境とステートフルなサービスのプラクティス。確かにAWS上でやるなら毎回作ったり消したりは現実的じゃない印象。

英語のDo you know〜とDid you know〜の話。ミスパロさん最高です。

SwitchBotのスマートロックを、指紋認証つきのキーパッドと一緒に購入しました。

ちゃんと設置できるか不安はあったものの、特に迷うことなく取り付けることができました。ハブとAPI連携できるという情報も聞いていたので、ついでにハブの方も購入。

IFTTT連携も簡単にできそうだということで、設置後にさっそく検証してみました。IFTTTの「IF」にSwitchBotを選択すると、ロック関連の項目が2個見つかります。

英語、日本語という違いだけでおそらくどちらを選んでもOKです。デバイスに関しては自分のロックのデバイスを選択します(自分の場合「ロックFA」)。

どのようなときにトリガーするか、というところで「ロック状態」が選択できます。選択できる状態は以下4つ:

  • 施錠済み
  • 解錠済み
  • ドアが開けられた
  • ドアが閉められた

今回は解錠のときのAPI連携をしてみました。IFTTTの「THAT」の部分にはとりあえずSlackを設定してみます。

例えばMessageのところに埋め込むこのとできる情報は CreatedAtContentでした。 Content には何が入るのでしょうね?

SwitchBot のアプリの方を覗いてみると、履歴のところで以下のように「どの認証方法で解錠されたか」がわかるようになっています。

「これは期待できる!」と思ってさっそく検証してみたところ

残念ながら {{Content}} には何も値が入っておらず undefined でした。。。

下記ドキュメントを参照しても、そのような情報は現時点では渡って来ることは無さそうですね。

github.com

{
    "eventType": "changeReport",
    "eventVersion": "1",
    "context": {
        "deviceType": "WoLock",
        "deviceMac": DEVICE_MAC_ADDR,
        "lockState": "LOCKED",
        "timeOfSample": 123456789
    }
}

「どの認証方法で解錠されたか」の情報があれば、例えば子どもたちに登録した指紋でフィルタリングしてSlackに通知するようにできそうですね。 例えば留守にしないといけない状況で子どもが先に家に帰ってきたときなど、通知が飛んできてくれたら少し安心できそうです。

今後に期待したいですね。

ということでスマートロックを購入したのでAPI連携の検証をしてみた話でした。

Stripe Checkoutを使ってみたのでTipsを残しておく

Stripeを仕事で使うことになり、いろいろと調べたことを忘れないうちにアウトプットしておこうと思います。尚、これは執筆時点の仕様に関するもので、今後変わる可能性は大いにあります。

2022/02/17更新

とてもありがたいことにStripeの中の人にアドバイスをいただくことができたので、ところどころ記載内容をアップデートしています。

Stripe Checkoutはフロントエンドだけで使える?

一応Stripe CheckoutにはClient-only integrationというものがあります。

stripe.com

ただし、Stripeからも非推奨と言われています。以下の制限が主な理由です。

  • カード支払いのみがサポートされています。
  • Coupons、Discounts、Promotion Codes、Tax Rates の各 API には対応していません。
  • 既存の Customer オブジェクトを使用した 1 回限りの支払いの作成はサポートされていません。
  • 請求前のカードの売上の保留はサポートされていません。
  • 1 回限りの支払いと継続支払いを 1 回の取引で行うことはサポートされていません。
  • Connect プラットフォームは、連結アカウントに代わってこの組み込みを使用することはできません。
  • Stripe Tax はサポートされていません。

全部痛いのですが、特にクーポンが使えないことと、Tax ratesやStripe Taxが使えないのが致命的だったのでClient-only integrationは僕はあきらめました。

使い方については以下が参考になります。

www.youtube.com

Payment Linksについて

フロントエンドだけでどうにかできないかと思い、Payment Linksについても調べてみました。こちらはクーポンやStripe Taxも使えていい感じです。

stripe.com

ただし、Stripe Checkoutで扱える情報以外にも保存しておきたいものがあったため(お客様の会社名とか備考とか)、フロントエンドだけで使うのはどのみちあきらめました。

特に細かい要件が無ければPayment Linksでいろいろと足りそうです。

www.youtube.com

www.youtube.com

Stripe Checkout client-server integration

フロントエンドだけでは無理そうだとなったら、client-server integrationを使います。こちらはサーバーサイドでセッションを作って、もうちょっといろいろとごにょごにょできるようになります。

stripe.com

Stripe Checkoutのページにいい感じに消費税は表示できる?

作りたてのアカウントではいい感じには表示されません。商品に消費税を設定しましょう。手数料が許容できるのであればStripe Taxも検討した方が良いですし、推奨されています。

qiita.com

Dynamic Tax Ratesというものあるのですが、残念ながら日本はまだサポートされていません。

stripe.com

サブスクリプションな商品の場合、途中でプラン変更した場合などの支払いはどうなる?

スタンダードの1年プランみたいなものの2ヶ月目とかでプレミアムプランに切り替えたとき、お金の扱いがどうなるか。あるいはプレミアムからスタンダードに切り替えたときはどうなるのか。

このあたりは「比例配分」の話で、Stripeが「いい感じにやってくれる」仕組みがあります。

stripe.com

qiita.com

サブスクリプションの期間の調整はStripeの管理画面からできる?

サブスクリプションの周期を変えたくなるときが出てくるかもしれません。そんなときはTrial期間をうまく使うみたいです。

stripe.com

Stripe Checkoutで買った商品(サブスク)の支払い方法の変更はどうやってやる?

1度買ったら終わりな商品はあまり関係ないのですが、サブスクリプションだとカードの期限が切れたりします。その場合に支払い方法をどうやって変えれば良いのか。

そこで使うのがCustomer Portalです。

stripe.com

お客様用の専用ページを作って、そこでお客様に自分自身で変更してもらいます。

注意点として、Customer PortalはStripeのテスト環境だと、 管理画面からサクッと見ることができる のですが、これはあくまでプレビュー用&テスト用のものです。

本番用のCustomer PortalのURLはAPIを使って発行する必要があります。セキュリティの観点から、URLの有効期限もシビアなので気をつけましょう。

新しいポータルセッションは 5 分後に期限切れとなります。顧客がその期限内にセッションを使用すると、そのセッションは最新のアクティビティの 1 時間後に期限切れとなります。各ポータルセッションは、最大 2 時間まで有効です。

Stripe Checkoutで申し込んだお客様に飛ぶメールの言語はどうなる?

Stripe Checkoutで商品を購入すると、例えば領収書がメールでお客様に送信されます。このメールの言語はどのように決まるのか。

まず、Checkoutのページには locale を設定することができます。ここで en とすれば英語のページなりますし、 ja にしたら日本語のページです。 auto にすると、ブラウザの言語で自動判定してくれます。

stripe.com

で、Checkoutのページの言語でメールも飛んでくれるかと思うかもしれませんが、そうはなりません。

何も考えずに実装すると、Stripeで設定している「顧客のメール」の「デフォルトの言語」で送信されます。

これをどうにかいい感じに切り替わるようにしたければ、Customerオブジェクトをあらかじめ作って、 preferred_locales を設定する必要があります。

stackoverflow.com

stripe.com

ただし、Checkoutのページから顧客が「キャンセル」した場合にCustomerオブジェクトのゴミが作られちゃう問題などがあるため、よく考慮して実装する必要があります。

2022/02/17追記:

直接この問題とは関係が無いのですが、Customerオブジェクトのデータがたくさんできちゃう問題に対処するには、ゲスト顧客を検討するのが良さそうです。メールアドレス、電話番号、カード番号から、顧客をグルーピングしてくれるいい感じな機能です。

t.co

決済が発生したときにお客様とStripe User双方にメールは飛ぶ?

設定によって飛ばすことができます。注意点として、Stripe User側は、ユーザー毎に設定が必要です(全体設定ではない)

Stripe Userとしてのメール通知設定について

support.stripe.com

お客様に送るメールの設定

stripe.com

テスト環境では自動メールは飛ばない

注意点として、領収書などの自動メールはテスト環境では飛びません。領収書に関してはStripeのダッシュボードから送信できるので特に問題は無いのですが、Stripe Userにどういうメールが飛ぶのかというのが本番でしか確認できないのはちょっとつらいです(特に自分が誰かのためにシステムを作っている場合)。

この場合は本番でしか確認する方法がありません。領収書付きで確認したい場合、日本では最低価格50円のサブスクリプションを作って、実際に決済するしかありません(現時点では。サポートに確認済みです)。自分のクレジットカードを使うのに抵抗があるかもしれませんが、ひとまずあきらめましょう(実はいい方法があれば知りたいです)。

いろいろと事情があるようで、メールのサンプルについてもサポートから開示してもらえなかったので、決済してみてのお楽しみです。

Stripeのメタデータに設定できる量に制限はある?

  • 50 keys(40 characters long)
  • 500 characters long values

Stripeが標準で保存する情報の他に、プラスαで保存したくなる情報があります(会社名とか備考とか)。それにはStripeのメタデータが使えるのですが、これにも一応制限があるので注意が必要です。

stripe.com

priceIdはテスト環境から本番環境に引き継がれる?

Stripeはあらかじめテスト環境と本番環境を用意してくれていて、非常にテストがしやすいDevExになってます。ただ、ちょっとつらかったのが、テスト環境で使っていたものをそのままシームレスに本番環境で使えるわけではない点です。

テスト環境の商品を本番環境にコピーするのはとても簡単です。「本番環境へコピー」というボタンをポチッと押すだけで本番にコピーされます。ただし、このときに priceId などのIDの値は変わります。

ドキュメント に以下のような記載があったので、IDも引き継げるのかと期待したのですが、どうやらこれはPlanIdに特化したもので、基本的にはIDは変わるものとして設計する必要があります。

f:id:kenev:20220214115226p:plain

今は非推奨(?)なPlanに関しては、確かにIDを設定するAPIがあります。

stripe.com

~IDが引き継げるとめちゃくちゃDevExは向上しそうなのですが、このあたりはあきらめてツールを駆使してあまり意識しなくても良いようにしましょう。~

2022/02/17追記:

この問題は検索キーを使うことで解消できるようです。検索キーとpriceIdを関連付けて置くことで、フロント側が意識するキーをテスト環境も本番環境も同じものにしておくことができそうです。

t.co