Home

React: もっと気軽に useReducer を使う

January 15, 2023

これまで useReducer をほとんど使ってきませんでした。理由は useState だけで特に問題にならなかったのと、useReducer は使いづらいイメージがあったためです。

...

読書メモ:民主主義

January 2, 2023

角川ソフィア文庫から出版されている「民主主義」を年末年始の空いた時間に読んだ。

第二次世界大戦に敗戦直後の日本において、民主主義の普及のために当時の文部省が刊行した中高生向けの教科書がもとになっている。本書はその復刻版だ。この本は 2018 年の 10 月に出版され、出版当時に購入し読了した。

...

2022年末のブックマーク整理

December 30, 2022

私は、あとでまた読み返したいような記事に出会ったとき、とりあえずブックマークに突っ込んでおいたり、タブを開きっぱなしにしておいたりします。

特に、隙間時間にスマホで読んだものの、時間を置いてもう一度しっかり読み直したいからタブを開いたままにする、というのが多いです。そんなこんなでタブの数が 100 個以上になったこともありました。

...

勉強メモ:一億人の英文法

December 25, 2022

久々に再読。自分用の勉強メモ。

英語は配置のことば - P.20 #

英語に文型があるのは、英語が配置のことばだからです。

日本語では「は」や「を」が、文中で名詞がどんな働きをしているのかを示しています。だから文中で場所を入れ替えても文の意味は変わりません。

...

勉強メモ:English Grammar in Use

December 24, 2022

久々に再読。自分用の勉強メモ。

Unit 1: Present continuous (I am doing)

  • You can use the present continuous with today / this week / this year etc.(periods around now):
    • You’re working hard today. (not You work hard today)
    • The company I work for isn’t doing so well this hear.

Unit 6: Past continuous (I was doing)

  • You can say that something happened (past simple) in the middle of something else (past continuous):
    • Matt phoned while we were having dinner.
    • It was raining when I got up.
    • I saw you in the park yesterday. You were sitting on the grass and reading a book.
    • I hurt my back while I was working in the garden.
  • But we use the past simple to say that one thing happened after another:
    • I was walking along the road when I saw Dan. So I stopped, and we talked for a while.
  • Compare:
    • When Karen arrived, we were having dinner. (= we had already started before she arrived)
    • When Karen arrived, we had dinner. (= Karen arrived, and then we had dinner)

Unit 7: Present perfect 1 (I have done)

...

Flutter: アプリの Application ID / Bundle ID を変更する - change_app_package_name

December 20, 2022

Flutter でプロジェクトを新規作成するときに --org で組織名を指定することができます。

flutter create --org app.hello my_app

ここで指定しない場合は com.example で作成されます。

プロジェクト生成時の組織名が Android での Application ID、iOS での Bundle ID として設定されます。

...

PMI:PMP の PDU を取得する - 2022年版

December 17, 2022

少し前に PMP の 3 年間の資格期限を迎え、資格を更新しました。ということで次の 3 年間後の更新時に必要となる 60 PDU を取得していきます。

備忘録として今回実施した内容をもとに PDU 取得から登録の流れについて手順を整理します。

...

ISACA:CISA の CPE を取得する - 2022年版

December 10, 2022

今年もやってきました。CISA 資格保持者の年末恒例行事である CPE 取得。

備忘録として CPE 取得から登録の流れについて手順を整理します。

無料で CPE を取得するなら Webinar と Quiz #

ISACA のこちらのページに CPE 取得方法がまとめられています。

...

Flutter: グローバルなエラーハンドリング

December 8, 2022

Flutter にて、個別に try/catch されなかったエラーをアプリのルートでまとめてハンドリングする方法です。

TL;DR #

これで未ハンドリングエラーを捕捉することができます。

...

Flutter: go_router で共通の親ウィジェット・処理を持たせたい

December 7, 2022

次の要件があるとする。

「ユーザーのネットワーク接続状態を監視しておき、インターネット未接続状態であればスナックバーでそのことを通知する。」

まず単純に共通の親ウィジェット・処理を持たせるのであれば、以下のように MaterialApp.router() を囲むウィジェットを定義すれば実現できる。

...

Sentry の無料プランでも Slack に通知する

December 6, 2022

Sentry の無料(Developer)プランでは Slack を連携させることはできず、利用するには有料プランにする必要があると案内されています。

しかし無料プランの場合でも Slack と連携させる方法は残されていて、よく紹介されるのが「Webhook + バックエンド」を組み合わせた方法です。

...

GCP Cloud Logging でエラーを検知したら Slack に通知する

December 5, 2022

掲題、以前は色々と手間のかかった作業のようなのですが、いまは GCP のダッシュボードからポチポチするだけで完了する簡単なものです。すでに同内容をまとめてくださる方がいますが、自分用の備忘録としてあらためて本記事にまとめておきます。

...

GCP Cloud Run で構造化ロギングする - Node.js

December 4, 2022

本記事は Node.js 環境を想定して記載しています。

GCP の Firebase Functions では {structuredData: true} を指定することで簡単に構造化ログを出力することができます。

import * as functions from 'firebase-functions';

functions.logger.error('Something happened!', { structuredData: true });

しかしこれは firebase-functions ライブラリの機能であるため、残念ながら GCP エコシステムのほかのサービスでは利用できません。

...

VS Code:プロジェクトごとにスニペットを定義する

December 3, 2022

TL;DR #

プロジェクトのルートに .vscode/ フォルダを作成し、そのなかに拡張子 .code-snippets でファイルを作成します。以下は例です。

.vscode/fizzbuzz.code-snippets

{
  "Snippet for Fizz Buzz": {
    "scope": "javascript",
    "prefix": "fizzbuzz",
    "description": "Fizz Buzz Function Statement",
    "body": [
      "function fizzBuzz(endAt) {",
      "  for (i = 0; i < endAt; i++) {",
      "    if (i % 15 === 0) {",
      "      console.log('FizzBuzz');",
      "    } else if (i % 3 === 0) {",
      "      console.log('Fizz');",
      "    } else if (i % 5 === 0) {",
      "      console.log('Buzz');",
      "    } else {",
      "      console.log(i);",
      "    }",
      "  }",
      "}"
    ]
  }
}

VSCode Snippet

...

Supabase の RLS(Row Level Security)でカスタムトークン(JWT)を使用する

November 27, 2022

Supabase(= PostgreSQL)では RLS(Row Level Security)機能を用いてポリシーを作成することでアクセス制御が可能です。

ユーザの認証を Supabase Auth で行っている場合、ポリシーの中で Auth の情報にアクセスすることで、ユーザに応じた細かなアクセス制御が可能となります。

...

AWS Lightsail: WordPress にアクセス過多で 504 エラー

November 20, 2022

*ところどころ説明口調で書いてはいますが、内容は個人用の備忘録です。

友人のウェブサイトのお手伝いをしているのですが、あるとき少しバズってアクセスが集中した結果、アクセスしようとするとブラウザに以下のエラーが表示される事態になっていた様子。

...

RDB: 外部キーの循環参照(相互参照)はありなのか - circular foreign key reference

November 18, 2022

決済を行うシステムの場合、次のような仕様は珍しくないでしょう。

  • 顧客は 0 枚以上のクレジットカードを登録する。
  • 顧客が 1 枚以上のクレジットカードを登録している場合は、デフォルトで使用する1枚を指定する。

このデータを RDB で保持する方法を考える際に悩みました。

...

読書メモ:Webを支える技術

November 12, 2022

以下の本を読んだ。記憶しておきたいところについてメモを残しておく。

ずっと前から読もうと思っていた本だったが、ようやく手に取った。さすがに今となっては掲載内容はほとんど見聞きしたことがあった。しかし踏み込んだ詳細については知らなかった、あるいはこれまで進んで知ろうともしていなかった部分が多く、勉強になった。2010 年に出版された本であることから、現在主流な技術からは1歩昔の内容になってはいる。例えば HTML5 や HTTP/2 は本書よりも後に利用可能となった技術。しかしながら本書は Web 概論の説明を目的としたものであり、内容を理解するにあたって技術の新旧は特に問題にはならない。

...

API リクエストをキャッシュする

November 2, 2022

フロントエンドから、バックエンドなどの外部にリクエストを飛ばしてデータの取得や更新をする際に、以下のような考慮事項がありました。

  • 万が一短時間に繰り返し実行された場合も1度だけリクエストを飛ばすようにする。
  • 必要に応じてレスポンスの結果を一定時間キャッシュしておき、その間は外部と通信せずキャッシュから返すようにする。

ライブラリを使っていれば裏側で解決してくれている可能性もありますが、自前でも実装できるようになっておくと素敵ですね。

...

TypeScript:DI コンテナ使用時に抽象クラス(abstract class)をインターフェースとして利用する

November 1, 2022

TypeScript でインターフェースを定義したい場合、interface キーワードあるいは type キーワードを使用することがほとんどだと思います。

// interface で定義
interface IUserRepository {
  findById(id: string): Promise<UserEntity>;
}

// type で定義
type IUserRepository = {
  findById(id: string): Promise<UserEntity>;
};

// 実装
class UserRepository implements IUserRepository {
  findById(id: string): Promise<UserEntity> {}
}

他方、あまり見かけない書き方かもしれませんが、abstract class をインターフェース定義のように使用することも可能です。(abstract class には実装を持たせることができますが、ここではインターフェース定義としてだけ利用します。)

...

GCP: Cloud Run にデプロイする(TypeScript & Express.js の例)

October 31, 2022

この記事では以下の手順を記載します。

  1. アプリを作成する
  2. Dockerfile を作成する
  3. Artifact Registry にリポジトリを作成する
  4. コンテナイメージをビルドする
  5. コンテナイメージを Artifact Registry に push する
  6. コンテナイメージを Artifact Registry から Cloud Run にデプロイする

(なおデプロイするアプリの例として TypeScript & Express.js を使用していますがここはほとんど関係ありません。)

...

TypeScript: 公称型のクラスを作成する

October 30, 2022

TypeScript のクラスは構造的部分型 #

例えば TypeScript で次のようなユーザ名を意味するバリューオブジェクトを作成したとします。

class UserName {
  public readonly value: string;

  public constructor(value: string) {
    // ユーザ名は 3 文字以上でなければいけない
    if (value.length < 3) {
      throw new Error();
    }
    this.value = value;
  }
}

printUserName 関数には、次のように引数を渡すことができます。

...

React: Hooks & Component で DI(依存性注入)

October 15, 2022

React は DI という考え方が存在しないライブラリとなっています。

DI できなくとも jest のモック関数の機能を使えばテストに困ることもほとんどありません。

そうはいっても DI 可能な Hooks・コンポーネントにしたい場合は、以下のようにすれば実現可能です。

...