技術的備忘録

基本自分用備忘録

Dart まとめ2

関数

  • 返り値の型を先頭に記述する
  • 引数のリストを { } で囲むことで、名前付き引数を定義できる
    • 名前付き引数は呼び出し時に指定されてなくてもいい(オプショナル)
    • 名前付き引数の名前指定は必須
    • 普通の引数は名前指定できない
    • 名前付き引数のみデフォルト値が設定できる
void fuinction(int a, { int b, int c }, int d = 4) {
}

function(1, b: 2, c: 3);

高階関数

第一級関数をサポートしているプログラミング言語において少なくとも以下のうち1つを満たす関数である。 ・関数(手続き)を引数に取る ・関数を返す

ja.wikipedia.org

  • ※要確認

www.cresc.co.jp

宣言

  • final

    • 再代入不可能な変数
    • 参照先は変更できる
  • const

    • 再代入も参照先の変更もできない
    • FlutterではconstのWidgetは再描画されない

getter/setter

int _a = 0;

int get a => _a;

int set a(num) {
  _a = num;
}

class

class Sample {
  // フィールドの初期化短縮形
  const Sample (
    this.a,
    this.b
  )

  final int a;
  final int b;
}

final sample = Sample(a: 1, b: 2);

constructor

  • フィールドの初期化は短縮形を使用できる
  • finalなフィールドを初期化するときは Initializer を使う
  • フィールドがすべてfinalなら const をコンストラクタに使用できる

factory

Mixin

Null

  • ?.
    • 対象がNullではない場合メソッド呼び出し
  • ??
    • ?? の左側がNullじゃないならそっち、 ?? の左側がNullなら右側を返す
    • 三項演算子が簡単に記述できる感じ
  • ??=
    • 左辺がNullのときだけ右辺の値を代入する

カスケード演算子

  • ..
  • 同じオブジェクトに対して連続で複数の処理をする

Stream

  • 非同期に更新される複数の値を監視する

www.cresc.co.jp

async/await

  • async関数の返り値は通常の返り値をFutureでラップしたもの
await for
  • Streamの取り出し

Dart 基本構文まとめ

基本データ型

int a = 77;
double b = 77.7;
String c = 'abcdefg';
bool d = true;
// 型推論
var e = 77; // number
// 配列
List a = [ 1, 2, 3, 4 ];
// 値が重複できない配列
Set b = { 1, 2, 3, 4 };
// key value
Map c = { 'a': 1, 'b': 2, 'c': 3 };

print(a);
// [1, 2, 3, 4]
print(b);
// {1, 2, 3, 4}
print(b.toList());
// [1, 2, 3, 4]
print(c);
// {a: 1, b: 2, c: 3}
print(c['b']);
// 2

定数

  • final、constを使う
  • 違いはよく分かってない

qiita.com

jpsepower.sakura.ne.jp

final a = 77;
// a = 777; はエラー
const b = 77;
// b = 777; はエラー

// 定数の配列
List c = const [1, 2, 3];
// ↓はエラー
List d = final [1, 2, 3];

制御

var list = [ 1, 2, 3, 4 ];
list.forEach((v) { print(v); });
// 1 2 3 4

var set = { 1, 2, 3, 4 };
set.forEach((v) { print(v); });
// 1 2 3 4

var map = { 'a': 1, 'b': 2, 'c': 3 };
map.forEach((key, value) { print('$key $value'); });
// a 1  b 2  c 3


for (var i = 0; i < 4; i++) {
  print(i);
}
// 0 1 2 3


for (var i in list) {
  print(i);
}
// 1 2 3 4

for ( var v in map.values) {
  print(v);
}
// 1 2 3

var n = 0;
while (true) {
  if (n == 3) {
    break;
  } else {
    print(n);
    n++;
  }
}
// 0 1 2

var m = 0;
do {
  m++;
  print(m);
} while (m <= 3);
// 1 2 3 4

Flutter VSCode 環境構築 mac編››

FlutterSDKをインストール

1.公式のmacOSを選択 flutter.dev 2.公式の手順通りにすすめる

$ mkdir ~/development
$ cd ~/development
$ unzip ~/Downloads/flutter_macos_2.2.2-stable.zip

3.bash_profileを編集

$ sudo vi ~/.bash_profile

4.以下の列を追加

export PATH=${HOME}/development/flutter/bin:$PATH

5.ターミナルを終了し、起動し直す

6.flutterコマンドのパスが通っていることを確認

$ which flutter
(以下が表示される)
/Users/{name}/development/flutter/bin/flutter

(update確認)
$ flutter upgrade

AndroidStudioインストール

1.公式からダウンロード developer.android.com 2.インストール

3.AndroidStudio起動

4.AndroidSDKを適当にダウンロード f:id:syoch:20210618220033p:plain

5.flutter doctorコマンドでソフトウェア確認 - Android Licenseに同意

$ flutter doctor --android-licenses
  • 自分の環境では、古いSDKが残っていたので、ライセンス同意コマンドの実行に失敗した
  • 古いSDKとかBuildToolsを一度アンインストールして、再インストール後、ライセンス同意コマンドの実行に成功

  • 不足しているソフトウェアを確認

$ flutter doctor

f:id:syoch:20210618220042p:plain

XCodeインストール

flutter.dev 1.AppStoreからXcodeをインストール

2.ターミナルで以下のコマンドを実行

$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
$ sudo xcodebuild -runFirstLaunch

3.以下のコマンドでライセンスに同意

$ sudo xcodebuild -license
~~~スペース何回か~~~
$ agree

cocoapodsのインストール

guides.cocoapods.org 1.ターミナルで以下のコマンドを実行

$ sudo gem install cocoapods

2.flutter doctorで確認 f:id:syoch:20210618220048p:plain

VSCode

  • 拡張機能の「Flutter」と「Dart」をインストール

    実行確認

  • ターミナルで以下のコマンドを実行していく
  • flutter create my_app
  • cd my_app
  • flutter run
  • 以上の手順でブラウザでの動作が確認できる

AWS VPC

VPC

  • Virtual Private Cloud
  • AWSクラウドのネットワークからユーザー専用の領域を切り出してくれる仮想ネットワーク
    • 論理的に分離されたセクションを作り、ユーザーが定義した仮想ネットワークを構築するサービス
  • VPCのネットワーク内にAWSリソースを配置していく

docs.aws.amazon.com

  • 任意のIPアドレス範囲を選択して仮想ネットワークを構築
  • サブネットの作成、ルートテーブルやネットワークゲートウェイの設定
  • 必要に応じてクラウド内外のネットワーク同士を接続することも可能
  • 接続オプションが複数ある

AWS側ですでに設定されていて、使用できないアドレスもある(.0、.1、.2、.3、.255)

VPCを作成するとサブネットが自動で作成されるため、「1AZ内の1VPC内に1サブネット」という状態が最小単位


AWSアカウント作成時

  • AWSアカウントを作成すると、自動的に各リージョンに1つずつデフォルトVPCとデフォルトサブネットが生成される
    • サイズ/16のVPC
    • 各AZにサイズ/20のデフォルトサブネット
    • インターネットゲートウェイが自動的に作成され、デフォルトVPCに接続される
    • デフォルトのセキュリティグループが作成され、デフォルトVPCに関連付けられる
    • デフォルトのネットワークアクセスコントロールリスト(ACL)が作成され、デフォルトVPCに関連付けられる
    • デフォルトVPCを備えたAWSアカウントにはデフォルトDHCPオプションセットが関連付けられる
    • パブリックとプライベートのDNSホスト名が付与される

VPCウィザードを利用することでVPCを簡単に構成できる

VPCウィザードを利用しない作成手順

  1. VPC作成(CIDRの設定)
  2. サブネットを作成
  3. インターネット経路を設定(インターネットゲートウェイ
  4. VPCへのトラフィック許可の設定(ネットワークACL

サブネット

  • VPC内に複数設置できる
  • 1つのAZを指定して配置する(AZをまたがって配置することはできない)
  • パブリックとプライベートが存在する
  • 1つのVPC内の作成上限は200個
  • VPCのCIDRの範囲内でCIDRを指定する
  • CIDRが付与されネットワークレンジが決まる

パブリックサブネット

プライベートサブネット

  • インターネットゲートウェイへのルートがない
  • インターネットに接続するためにはパブリックサブネットに、NATゲートウェイを作成する

VPCの外部接続

パブリックサブネットからVPCの外側にあるリソースと通信するには、 パブリックのAWSネットワークか、エンドポイントを利用する

インターネット経路の設定

  • ルートテーブルとCIDRアドレスでルーティングを設定する
    • ルートテーブルでパケットの行き先を設定
    • VPC内はCIDRアドレスでルーティングを行う

インターネットゲートウェイ

  • マネジメント型
  • VPCと1対1で紐付いて、インターネットに公開する

EgressOnlyインターネットゲートウェイ

DHCPオプションセット

  • デフォルトで1つ作成される
  • 名前解決をVPC内でする

Elastic IPアドレス

エンドポイント

  • VPC外のサービスと接続する際に使用する

NATゲートウェイ

  • プライベートサブネットのインターネット接続を可能にする

ピアリング接続

ネットワークACL

セキュリティグループ

TRANSIT GATEWEY

  • 多数のVPCの接続を管理する

サブネットマスク・サブネット

IPアドレス

  • インターネットに接続している機器の住所に当たる数値
  • IPv4は32ビット
  • グローバルIPとプライベートIPがある
  • ICANNが発行していてNICに割り当てられている
- 10進数
255.255.255.0

- 2進数(0で埋めて8桁にする)
11111111.11111111.11111111.00000000

サブネットマスク

  • ネットワーク部とホスト部の境を示すアドレス

ネットワークアドレス

10進数
- IPアドレス
192.168.1.20
- サブネットマスク
255.255.240.0

2進数
- IPアドレス
11000000 10101000 00000001 00010100
- サブネットマスク
11111111 11111111 11110000 00000000

11111111 11111111 1111    0000 00000000
|<=ネットワーク部=>|  |<=  ホスト部  =>|

- ネットワークアドレス
2進数
11000000 10101000 00000000 00000000
10進数
192.168.0.0

サブネット

  • ネットワーク内のネットワーク
  • サブネットマスクによってグループ化されたアドレスの範囲内

サブネットマスクIPアドレス

サブネットマスク サブネットあたりのIPアドレス
/16 65536
/18 16384
/20 4096
/22 1025
/24 256
/26 64
/28 16

AWS IAM

IAM

  • AWSサービスやリソースへのアクセスを管理する
  • AWSのユーザーとグループを作成、管理し、アクセス権を使用してAWSリソースへのアクセスを許可、拒否する

IAMポリシー

IAMユーザー

  • IAMポリシーを付与されたユーザー
  • rootアカウント
    • AWSアカウント作成時に作成される
    • rootユーザーのみ実施できる権限がある
    • 普段は使わないほうがいい
  • 管理者ユーザー
    • 管理者権限の許可が付与されたIAMユーザー
    • IAMを操作できる
  • パワーユーザー
    • IAM以外のすべてのAWSサービスにフルアクセスできる
    • IAMの操作はできない

IAMグループ

  • グループとして権限をまとめて設定された単位のこと

IAMロール

  • AWSWSリソースに対するアクセス権限のこと

IAM権限ベストプラクティス

  • AWS アカウントのルートユーザー アクセスキーをロックする
  • 個々の IAM ユーザーを作成する
  • IAM ユーザーへのアクセス許可を割り当てるためにグループを使います
  • 最小限の特権を認める
  • AWS 管理ポリシーを使用したアクセス許可の使用開始
  • インラインポリシーではなくカスタマー管理ポリシーを使用する
  • アクセスレベルを使用して、IAM アクセス許可を確認する
  • ユーザーのために強度の高いパスワードポリシーを設定する
  • MFA の有効化
  • Amazon EC2 インスタンスで実行するアプリケーションに対し、ロールを使用する
  • ロールを使用してアクセス許可を委任する
  • アクセスキーを共有しない
  • 認証情報を定期的にローテーションする
  • 不要な認証情報の削除
  • 追加セキュリティに対するポリシー条件を使用する
  • AWS アカウントのアクティビティの監視

docs.aws.amazon.com

IAM設計

  • 少数利用はIAMユーザー
  • 組織利用はIAMグループ

IAMポリシー

  • AWSリソースにアクセスするための権限設定
  • AWSが用意してくれているものがめちゃくちゃある
  • AWSが用意しているポリシーを組み合わせて自作のポリシーが作成できる
    • EC2フルアクセスとS3フルアクセスをまとめたポリシーとか
  • IAMユーザー、IAMロール、IAMグループに紐付ける

IAMロール

  • AWSリソースやユーザーに付与するもの
  • 実態はIAMポリシーの集合
  • EC2にS3へのアクセス権を持ったロールを付与することで、EC2からS3へ保存処理
  • EC2やLambdaに付与して、「それらが他AWSリソースに対してできることを増やす」みたいな使い方が多いらしい
  • 監査人などに一時的な権限を移譲するときにも使う
    • アカウントAでロールを作成し、アカウントBでロールARNを指定して権限を移譲する
    • JSON形式でポリシー指定

アクセスアナライザー

  • AWSリソースに紐付いているポリシーを検査し、管理者として"意図せぬ公開設定がされていないか"を検出および可視化してくれる機能
  • 新規または更新されたポリシーを継続的に監視
  • 付与されたアクセス許可を数学的なロジックや推論を使用して分析
  • アクセス制御状況のインパクトを集約、可視化
  • 利用されているアカウントの外側からの意図しないアクセスからリソースが保護されていることが確認できる

AWS Organizations

  • 複数のAWSアカウントをまとめて管理する
    • IAMはアカウント内のユーザーを管理

AWS 概要

仕組み

  • インフラ/システム機能をオンライン上で、AWSから提供されているサービスを組み合わせて構築する

アンマネージド型

  • スケーリング、耐障害性、可用性を利用者側で設定し管理する
  • 設定が柔軟に可能
  • 管理する手間がかかる
  • EC2とか

マネージド型

  • スケーリング、耐障害性、可用性はAWS側で管理されている
  • 管理に時間を割かなくていい
  • 設定が限定的
  • Route53とか

リージョン

AZ

クラウド

  • 仮想化されたインフラ
  • 物理的なインフラの構成を隠して仮想化された単位に分けたり、統合したりして利用させる技術
  • 物理的なインフラに仮想化ソフトウェアを設定して、実質的な機能をユーザーに切り分けて提供する
  • 各ユーザーは個別のサーバーのように利用できる

サーバーの仮想化

  • 1台の物理サーバ上に複数のOSを動作させる
  • ハイパーバイザ型、VMware型、コンテナ方式

ストレージの仮想化

  • 複数のストレージを仮想的に統合して、1つの大きなストレージプールを構成する
  • ブロックレベル仮想化、ファイルレベル仮想化

ネットワークの仮想化

  • 新たな仮想ネットワークの構築や制御を、ソフトウェアにより動的に実施する技術
  • SDN、VLAN

デスクトップの仮想化

  • サーバ上においたPC環境のデスクトップ画面を遠隔地にある接続端末に転送する技術
  • 仮想PC方式、ブレードPC方式