October 1, 2022
以下の本を読んだ。あとで見返したいところについてメモを残しておく。
第 1 章:オブジェクト指向パラダイム
#
変更の要求に取り組む - P.9
#
要求の変更によって引き起こされる問題に取り組むため、そして機能分解以外の解決策の有無を見極めるために、人間の行動に目を向けてみましょう。とある大学で開催されるセミナーの講師として、あなたが任命されたと考えてください。あなたの講義を聞き終わった学生は、次のセミナーが行われる教室に移動しなければなりませんが、それは各人によってまちまちであると仮定します。そしてあなたは、聴講学生各人に対して次の教室への行き方を教えなければならないとします。
...
September 21, 2022
運用しているウェブサイトについて死活監視をしたく、次のような要件で調べた結果 UptimeRobot がとても良かったので記録しておきます。
- なるべく無料が良い。
- Ping 監視レベルのシンプルなもので良い。複雑な監視は不要。
監視の分野は全く詳しくないため、そもそもどういったワードで調べれば良いか悩みました。
...
September 20, 2022
Lightsail の最も安いプランだと月額 3.50 USD でインスタンスが運用できます。小規模なウェブサイトであればこれで全然運用できるのではないでしょうか。
当然ながら格安な分、サーバのスペックも低めなわけで、特にメモリがなんとも心許ないです。
...
September 13, 2022
インプットフォームを作成する際、React では「制御されたコンポーネント(Controlled Components)」と「非制御コンポーネント(Uncontrolled Components)」という2つの考え方があります。
...
September 12, 2022
Flutter で UUID のパッケージを使っているときに疑問に感じたことがありました。
それがこんな場面です。
import 'package:uuid/uuid.dart';
void main() {
var myId = const Uuid().v4();
/*
myId を使って処理をする
*/
}
ここで思ったことが Uuid()
に const
をつけることができるが、const
はコンパイル時定数のはずだから、コンパイル後の myId
の値は常に同じになってしまうのでは?というものです。
...
September 11, 2022
掲題について、根本的に勘違いしていたので、反省も込めてここにメモ。
検証コード
#
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: const MyWidget1(),
routes: <String, WidgetBuilder>{
'/mywidgeet1': (BuildContext context) => const MyWidget1(),
'/mywidgeet2': (BuildContext context) => const MyWidget2(),
},
);
}
}
/*
MyWidget1
*/
class MyWidget1 extends StatefulWidget {
const MyWidget1({super.key});
@override
State<MyWidget1> createState() => _MyWidgetState1();
}
class _MyWidgetState1 extends State<MyWidget1> {
int myCount1 = 0;
@override
void initState() {
super.initState();
myCount1++;
print('myCount1 was incremented to $myCount1');
}
@override
Widget build(BuildContext context) {
print('MyWidget1 was built');
return TextButton(
onPressed: () => Navigator.of(context).pushNamed("/mywidgeet2"),
child: const Text('Push'),
);
}
}
/*
MyWidget2
*/
class MyWidget2 extends StatefulWidget {
const MyWidget2({super.key});
@override
State<MyWidget2> createState() => _MyWidgetState2();
}
class _MyWidgetState2 extends State<MyWidget2> {
int myCount2 = 0;
@override
void initState() {
super.initState();
myCount2++;
print('myCount2 was incremented to $myCount2');
}
@override
Widget build(BuildContext context) {
print('MyWidget2 was built');
return TextButton(
onPressed: () => Navigator.of(context).pop("/mywidgeet1"),
child: const Text('Pop'),
);
}
}
コンソール出力
#
# 初期表示時
myCount1 was incremented to 1
MyWidget1 was built
# MyWidget1 から myCount2 に push()
myCount2 was incremented to 1
MyWidget2 was built
# MyWidget2 から myCount1 に pop()
(なにも出力されない)
# MyWidget1 から myCount2 に push()
myCount2 was incremented to 1
MyWidget2 was built
# MyWidget2 から myCount1 に pop()
(なにも出力されない)
まとめ
#
Flutter のページ遷移は push() & pop()
でページの上にページを重ねていく形(または重ねたものを上から取り除く形)になります。
...
September 10, 2022
プロップスと Riverpod に関して、ウィジェットがリビルドされるタイミングを整理しました。
TL;DR
#
ウィジェットがリビルドされるタイミングは以下のどれかに該当したとき。
...
September 4, 2022
以下の本を読んだ。あとで見返したいところについてメモを残しておく。
*記事中のコードの言語は Kotlin です。
第 3 章:エンティティ/値オブジェクト
#
プライマリコンストラクタが1つしか実装できない場合 - P.39
#
再構成メソッドは、プロダクトコードではリポジトリ実装クラスで DB の値からインスタンス再構成する場合のみ使用します。
...
September 3, 2022
以下の本を読んだ。あとで見返したいところについてメモを残しておく。
Chapter 1:ドメイン駆動設計とは
#
ドメインモデルとは何か - P.4
#
モデルとは現実の事象あるいは概念を抽象化した概念です。抽象は抽出して象るという言葉のとおり、現実をすべて忠実に再現しません。必要に応じて取捨選択を行います。何を取捨選択するかはドメインによります。
...
September 2, 2022
以下の本を読んだ。あとで見返したいところについてメモを残しておく。
第1章:小さくまとめてわかりやすくする
#
「値」を扱うための専用のクラスを作る - P.32
#
業務アプリケーションで数量を扱うとき、int
のすべての範囲(マイナス 21 億からプラス 21 億)が必要になることはありません。「0 より大きく 100 より小さい」など、もっと狭い範囲の値が業務的に正しい値です。
...
September 1, 2022
以下の本を読んだ。あとで見返したいところについてメモを残しておく。
第 2 章:モデリングから実装まで
#
ドメイン層オブジェクト設計の基本方針 - P.32
#
ドメイン層のオブジェクトを設計する際に、重要な基本方針があります。
...
August 31, 2022
最初は iOS
, Android
, Web
のプラットフォームで開発していたけれど、途中で Web
は不要になった。
不要になったプラットフォームの削除はどうすれば良いの?となったとき…
...
August 30, 2022
本記事に登場するコードの言語は C#
です。
最悪なパターン
#
サービスロケータや DI の話に入る前に、まずは何もできていない状態です。
public class Model
{
private readonly IRepository _repository;
public Model()
{
this._repository = new Repository();
}
}
Model model = new Model();
- 悪い点
- Model クラスの中で Repository を直接インスタンス化している。
- Repository を差し替えることができないので最悪。
サービスロケータ(Serivce Locator)パターン
#
サービスロケータパターンとは要するに以下です。
...
August 28, 2022
インストールからプログラムの実行まで、さくっと試してみましょう。
インストール
#
インストールに関する公式ドキュメントは以下です。公式は rustup
というツールを直接ダウンロードする方法を第一に推奨しているようです。
...
August 26, 2022
リファレンス、ドキュメント、ラーニング
#
マイクロソフト製ということもあり、必要な情報は同社がきっちりと揃えてくれています。
リファレンス、ドキュメント
#
リファレンス、ドキュメントはこちらのページにまとまっています。
...
August 25, 2022
Mac で C# の実行環境を作成したい場合、方法は2つあります。
- A) Visual Studio (for Mac) をインストールする
- B) .NET だけをインストールする
どちらの方法にするかは、使用したいエディタによって決めてしまうと良いでしょう。
...
August 24, 2022
C# の言語の生い立ち
#
始まりは Microsoft .NET という構想
#
2000 年、マイクロソフト社はある構想を打ち出します。それが Microsoft .NET です。
これは、大規模なネットワークサービスを構築するため、腕時計やカーナビといった家電からパソコンや携帯電話に至るまで、あらゆる電子機器をインターネットに接続させるというマイクロソフトの経営戦略でした。
...
August 20, 2022
掲題について、勝手に勘違いしていたので、反省も込めてここにメモ。
要約
#
StateNotifier のステートが更新されたときは………
...
August 18, 2022
ワードプレスの移行というと「All-in-One WP Migration」プラグインが利用されるケースを多く見かけます。ただしこちらのプラグインでは、無料版の場合だと移行元データを移行先にインポートするときの容量に上限が設けられています。(有料版を契約せずとも、無料版のままこの制限を解除する方法もあるようです。)
...
August 12, 2022
たとえば npm でプライベートなパッケージを作成していて、他のリポジトリのアプリがそのパッケージを利用しているとします。
プライベートなパッケージにアクセスするにはアクセストークンが必要です。
...
August 11, 2022
毎回のプルリク後に Assignees を手動でポチポチ設定するのが若干の手間だと感じていたところ、素晴らしい記事に巡り合いました。
現在は、上記の記事から actions/github-script
の最新バージョンが上がっていたり(本記事時点での最新は v6)、そのほか微調整を加えたのが以下です。
...
August 10, 2022
リポジトリで Dependabot を有効化する
#
まずはリポジトリの以下から有効化します。
Insights > Dependency graph > Dependabot > "Enable Dependabot" をクリック
ついつい Settings の方を探してしまいがちだと思いますが、Dependabot は Insights にあることに注意です。
...
August 7, 2022
その前に
#
App Distribution をはじめ、現在 Firebase で提供されているいくつかの機能はもともと Fabric という Twitter 製のサービスだったみたいですね。
Fabric のご案内 - Twitter プラットフォーム
...
August 3, 2022
前半では実際のコードを用いて、依存性の注入・逆転させていく具体例を示します。
後半では、依存性の注入・逆転について言葉で解説します。
コードの具体例
#
言語は Dart です。
...
August 1, 2022
Riverpod を使い始めて間もないころだと、Provider、StateProvider、StateNotifierProvider の違いについて混乱する人もいるのではないでしょうか。
...
July 31, 2022
のっぴきならない事情があってファイルの作成日・更新日を変更したいときは setfile
コマンドが使えます。
setfile -d "12/24/2020 19:00" example.txt
setfile -m "12/24/2020 19:00" example.txt
-d
オプションで作成日を変更、-m
オプションで更新日を変更します。
...
July 25, 2022
GitHub Actions で Flutter の Lint(Analyzer)と Formatter と Test を実行するようにワークフローを作成します。
先に完成したコードを掲載し、その後解説します。
完成したコード
#
ファイルの配置
#
.github/
├ actions/
│ └ action.yaml
└ workflows/
└ main.yaml
.github/actions/action.yaml
#
# This is a "Composite action" or "Composite Run Steps" file.
runs:
using: 'composite'
steps:
- name: 'Setup Flutter'
uses: subosito/flutter-action@v2
with:
flutter-version: '3.x'
channel: 'stable'
cache: true
- name: 'Show Flutter version'
run: flutter --version
shell: bash
- name: 'Install dependencies'
run: flutter pub get
shell: bash
.github/workflows/main.yaml
#
name: 'Static Analysis and Testing'
on:
pull_request:
jobs:
Analyzer:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions
- run: flutter analyze
Formatter:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions
- run: flutter format --output=none --set-exit-if-changed .
Test:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions
- run: flutter test lib
解説
#
上記のワークフローでは Analyzer と Formatter と Test という3つのジョブを実行しています。それぞれ以下の通りです。
...
July 22, 2022
通常の場合 Flutter のテストを実施するには次のコマンドを実行します。
この場合は test/
ディレクトリ配下のテストファイルが実行されます。
The test runner considers any file that ends with _test.dart
to be a test file. If you don’t pass any paths, it will run all the test files in your test/
directory, making it easy to test your entire application at once.
...
July 21, 2022
Flutter プロジェクト新規作成直後の analysis_options.yaml
は下記になっています。実質 include: package:flutter_lints/flutter.yaml
しているだけの状態です。
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
#
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
そして package:flutter_lints/flutter.yaml
は内部で package:lints/recommended.yaml
を import
し、さらにそれが package:lints/core.yaml
を import
しています。
...
July 20, 2022
パッケージとドキュメント
- freezed | Dart Package
- rrousselGit/freezed: Code generation for immutable classes
Freezed とは
#
Code generation for immutable classes
イミュータブルなデータクラスを作成するためのコードジェネレータです。
データクラスを用意しようとすると数十行のコードを書く必要がありますが、それを毎回手書きしていては大変ですし、タイポによるバグも起きかねません。
...