React: もっと気軽に useReducer を使う
January 15, 2023
これまで useReducer をほとんど使ってきませんでした。理由は useState だけで特に問題にならなかったのと、useReducer は使いづらいイメージがあったためです。
...これまで useReducer をほとんど使ってきませんでした。理由は useState だけで特に問題にならなかったのと、useReducer は使いづらいイメージがあったためです。
...角川ソフィア文庫から出版されている「民主主義」を年末年始の空いた時間に読んだ。
第二次世界大戦に敗戦直後の日本において、民主主義の普及のために当時の文部省が刊行した中高生向けの教科書がもとになっている。本書はその復刻版だ。この本は 2018 年の 10 月に出版され、出版当時に購入し読了した。
...友人がストレングスファインダーをやったようで、その結果について雑談する機会があった。今後は実施料金が値上げするとのことで、せっかくなので私も実施してみた。
...私は、あとでまた読み返したいような記事に出会ったとき、とりあえずブックマークに突っ込んでおいたり、タブを開きっぱなしにしておいたりします。
特に、隙間時間にスマホで読んだものの、時間を置いてもう一度しっかり読み直したいからタブを開いたままにする、というのが多いです。そんなこんなでタブの数が 100 個以上になったこともありました。
...久々に再読。自分用の勉強メモ。
英語に文型があるのは、英語が配置のことばだからです。
日本語では「は」や「を」が、文中で名詞がどんな働きをしているのかを示しています。だから文中で場所を入れ替えても文の意味は変わりません。
...久々に再読。自分用の勉強メモ。
Unit 1: Present continuous (I am doing)
Unit 6: Past continuous (I was doing)
Unit 7: Present perfect 1 (I have done)
...注意:本記事の内容はあくまで参考だけとし、実際には行わないでください。
何を思ったか久々に English Grammar in Use(英文法の本です)を読み返していたときのこと。
...ローカルの Supabase のマイグレーションをリセットするのは簡単で supabase db reset
を実行するだけです。
一方で実際に稼働しているリモートのデータベースのマイグレーションをリセットするコマンドは用意されていません。
...Flutter でプロジェクトを新規作成するときに --org
で組織名を指定することができます。
flutter create --org app.hello my_app
ここで指定しない場合は com.example
で作成されます。
プロジェクト生成時の組織名が Android での Application ID、iOS での Bundle ID として設定されます。
...少し前に PMP の 3 年間の資格期限を迎え、資格を更新しました。ということで次の 3 年間後の更新時に必要となる 60 PDU を取得していきます。
備忘録として今回実施した内容をもとに PDU 取得から登録の流れについて手順を整理します。
...今年もやってきました。CISA 資格保持者の年末恒例行事である CPE 取得。
備忘録として CPE 取得から登録の流れについて手順を整理します。
ISACA のこちらのページに CPE 取得方法がまとめられています。
...Flutter にて、個別に try/catch
されなかったエラーをアプリのルートでまとめてハンドリングする方法です。
これで未ハンドリングエラーを捕捉することができます。
...次の要件があるとする。
「ユーザーのネットワーク接続状態を監視しておき、インターネット未接続状態であればスナックバーでそのことを通知する。」
まず単純に共通の親ウィジェット・処理を持たせるのであれば、以下のように MaterialApp.router()
を囲むウィジェットを定義すれば実現できる。
Sentry の無料(Developer)プランでは Slack を連携させることはできず、利用するには有料プランにする必要があると案内されています。
しかし無料プランの場合でも Slack と連携させる方法は残されていて、よく紹介されるのが「Webhook + バックエンド」を組み合わせた方法です。
...掲題、以前は色々と手間のかかった作業のようなのですが、いまは GCP のダッシュボードからポチポチするだけで完了する簡単なものです。すでに同内容をまとめてくださる方がいますが、自分用の備忘録としてあらためて本記事にまとめておきます。
...本記事は Node.js 環境を想定して記載しています。
GCP の Firebase Functions では {structuredData: true}
を指定することで簡単に構造化ログを出力することができます。
import * as functions from 'firebase-functions';
functions.logger.error('Something happened!', { structuredData: true });
しかしこれは firebase-functions ライブラリの機能であるため、残念ながら GCP エコシステムのほかのサービスでは利用できません。
...プロジェクトのルートに .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);",
" }",
" }",
"}"
]
}
}
Supabase(= PostgreSQL)では RLS(Row Level Security)機能を用いてポリシーを作成することでアクセス制御が可能です。
ユーザの認証を Supabase Auth で行っている場合、ポリシーの中で Auth の情報にアクセスすることで、ユーザに応じた細かなアクセス制御が可能となります。
...時間がかかっているものの開発は徐々に進んでいる様子です。あなたがこの記事を見るころには解決しているかもしれませんね。
次の条件に該当する場合、こちらの ISSUE が解消されるまでは Flutter で Supabase の採用を見送ったほうが賢明かもしれません。
...*ところどころ説明口調で書いてはいますが、内容は個人用の備忘録です。
友人のウェブサイトのお手伝いをしているのですが、あるとき少しバズってアクセスが集中した結果、アクセスしようとするとブラウザに以下のエラーが表示される事態になっていた様子。
...決済を行うシステムの場合、次のような仕様は珍しくないでしょう。
このデータを RDB で保持する方法を考える際に悩みました。
...以下の本を読んだ。記憶しておきたいところについてメモを残しておく。
各章では、以下の構成でアンチパターンを解説していきます。
...以下の本を読んだ。記憶しておきたいところについてメモを残しておく。
本書といえば以下の図で有名な本。
...以下の本を読んだ。記憶しておきたいところについてメモを残しておく。
ずっと前から読もうと思っていた本だったが、ようやく手に取った。さすがに今となっては掲載内容はほとんど見聞きしたことがあった。しかし踏み込んだ詳細については知らなかった、あるいはこれまで進んで知ろうともしていなかった部分が多く、勉強になった。2010 年に出版された本であることから、現在主流な技術からは1歩昔の内容になってはいる。例えば HTML5 や HTTP/2 は本書よりも後に利用可能となった技術。しかしながら本書は Web 概論の説明を目的としたものであり、内容を理解するにあたって技術の新旧は特に問題にはならない。
...実現したい機能があって、自作パッケージでも作ろうかと調べていたときのメモです。
構想していた機能を実現するためにはメタデータとリフレクションを使用する必要がありました。
...フロントエンドから、バックエンドなどの外部にリクエストを飛ばしてデータの取得や更新をする際に、以下のような考慮事項がありました。
ライブラリを使っていれば裏側で解決してくれている可能性もありますが、自前でも実装できるようになっておくと素敵ですね。
...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 には実装を持たせることができますが、ここではインターフェース定義としてだけ利用します。)
...この記事では以下の手順を記載します。
(なおデプロイするアプリの例として TypeScript & Express.js を使用していますがここはほとんど関係ありません。)
...例えば TypeScript で次のようなユーザ名を意味するバリューオブジェクトを作成したとします。
class UserName {
public readonly value: string;
public constructor(value: string) {
// ユーザ名は 3 文字以上でなければいけない
if (value.length < 3) {
throw new Error();
}
this.value = value;
}
}
printUserName 関数には、次のように引数を渡すことができます。
...React は DI という考え方が存在しないライブラリとなっています。
DI できなくとも jest のモック関数の機能を使えばテストに困ることもほとんどありません。
そうはいっても DI 可能な Hooks・コンポーネントにしたい場合は、以下のようにすれば実現可能です。
...