なんとかするから、なんとかなる

エンジニア関係のことを書きます

TabViewでTabControlが更新されない

SwiftUIでTabViewでTabControlが更新されない

たぶん僕くらいだと思いますが、自戒を込めて。

現象

SwiftUIでTabViewを作成したのですが、ページスワイプしてもTabControlが更新されなくて困りました。

こんなコードを書いていました。

import SwiftUI

struct test: View {
    @State private var selection = 0

    var body: some View {
        TabView(selection: $selection) {
            Group {
                Text("First View")
                Text("Second View")
            }
        }
        .tabViewStyle(.page)
    }
}

解決方法

tagをつけましょう。

画面がスワイプできてしまうので、うまくいっていると思い込んでいました。

import SwiftUI

struct test: View {
    @State private var selection = 0

    var body: some View {
        TabView(selection: $selection) {
            Group {
                Text("First View").tag(0)
                Text("Second View").tag(1)
            }
        }
        .tabViewStyle(.page)
    }
}

きっと僕しかはまらない。

TabViewのTabControlが見えないので表示できるようにする

TabViewのTabControlが見えないので表示できるようにする

SwiftUIで背景が白のときTabControlが見えません(バグでは?) 見えないと他タブがあることに気がつけないので、色をつけました。

結論

Initのタイミングで色を指定してあげる

UIPageControl.appearance().currentPageIndicatorTintColor = .black
UIPageControl.appearance().pageIndicatorTintColor = .lightGray

結果こんな感じに

サンプルコード全体

import SwiftUI

struct test: View {
    @State private var selection = 0
    
    init() {
        UIPageControl.appearance().currentPageIndicatorTintColor = .black
        UIPageControl.appearance().pageIndicatorTintColor = .lightGray
    }
    
    var body: some View {
        TabView(selection: $selection) {
            Text("First View").tag(0)
            Text("Second View").tag(1)
        }
        .tabViewStyle(.page)
    }
}

#Preview {
    test()
}

SwiftUI簡単に作れていいですが、もう少し発展して欲しいです。StoryBoardの方が歴史があるので、そのうち追いつくと思いますが。

TabViewで最初に開くタブをコントロールする

TabViewで最初に開くページをコントロールする

TabViewをModalで開いているのですが、経路によって最初のタブを分けたいことがありました。 少し調べても方法が見つからなかったので、まとめておきます。

結論

  1. TabViewを含むページをinitするタイミングで、Tab番号を渡す。
  2. OnAppearのタイミングでTabを変更する。
import SwiftUI

struct test: View {
    @State private var selection = 0
    let initPage: Int
    
    init(selected: Int) {
        self.initPage = selected
    }
    
    var body: some View {
        TabView(selection: $selection) {
            Text("First View").tag(0)
            Text("Second View").tag(1)
        }
        .tabViewStyle(.page)
        .onAppear(){
            self.selection = self.initPage
        }
    }
}

#Preview {
    test(selected: 0) // 親Viewでこんな感じで値を渡す
}

調べてわかったこと

InitでTab番号を指定しても、Viewが生成されていないので無視されます。 こんなコード

    @State private var selection = 0
    
    init(selected: Int) {
        self. selection = selected
    }

他にも親の要素をBindingしておく方法もあるっぽいですが。 私がBindingがまだよくわかっていません。

ButtonStyleを維持しつつ、ボタンのサイズを変える

ButtonStyleを維持しつつ、ボタンのサイズを変える

SwiftUIにてButtonStyleを維持しつつボタンのサイズを変える方法です。 Button自体の.frameを変更しても、選択範囲が広がるだけで塗り潰しが効かなかったのでまとめます。

結論、内部のTextの.frameを変更する

コード

struct test: View {
    var body: some View {
        Button{
            // 何かする
        } label: {
            Text("Before Button")
        }
        .buttonStyle(.borderedProminent)

        Button {
            // 何かする
        } label: {
            Text("After Button")
                .frame(width: 256, height: 64)
        }
        .buttonStyle(.borderedProminent)
    }
}

結果こんな感じ

Azure Networkについて

はじめに

Azure資格勉強用にまとめていたノートの内容を復習も兼ねて出力。

2022年当初あたりにまとめた内容であり、それ以降変更があるかもしれません。

また勘違い、覚え違いをしているかもしれません。気になる場合は公式Docsを参照してみてください。

Azure Network とは

Azure Global NetworkはAzureのバックボーンとリージョンを指す。

PublicではなくPrivate Networkを指す

ExpressRouteはこのGlobal Networkに繋ぐ。

Regionは3つ以上のデータセンターで構成されている(Avairability Zone)

VNETとSubnet

VNETは少なくとも1つのSubnetを持つ

VNETは一番大きな括りで、その中をSubnetが分ける(CIDR表記を用いる

SubnetはDHCPの役割をもち、リソースに対してIPを割り当てる

Network Security Group(NSG)でアクセスコントロールをおこなう。NSGはSubnetに紐づく

VNETとVM

VMは複数のNetwork Interface Card(NIC)を持つことができ、複数のSubnetに属することができる。

VNETのIPアドレス予約

VNET とでは規定で一部アドレスが予約されており利用することができない

※ x は任意の数値

例えば、10.0.0.0/28 の場合、10.0.0.0~10.0.0.15 の16アドレス存在するが、上の4つのアドレスは利用できない。

VNETアドレスのを分けるベストプラクティス

IETFによる、用途に合わせて次の3つ分けると良い。

  • 10.0.0.0 ~ 10.255.255.255 ( 10/8)
  • 172.16.0.0 ~ 172.31.255.255 (172.16/12)
  • 192.168.0.0 ~ 192.168.255.255 (192.168/16)

VNETのセキュリティオプション

一部VNETに関連づけられるセキュリティオプションには専用のSubnetが必要になる

など

Subnet

VNETを分割する役割

VPN Gateway、Private Endpoint, Firewall, Application Gateway, Bastion Host これらには専用のSubnetが必要

VNETは必ず1つ以上のSubnetを持つ

VNETの"Address Space"はVNET全体のアドレス空間であるのに対して、Subnetはサブネットを定義する

公開用とテスト用などセキュリティルールの異なるもの、それぞれでサブネットを切り出してセキュリティルールを割り当てる(NSG

何も設定しないで、同じVNETにVMを2つ以上デプロイすると互いに通信できる

-> VNET内は同じネットワーク、Subnetが異なっていてもNSGが無い、またはNSGがデフォルトの設定では通信可能

Network Security Group (NSG)

SubnetやNICに対して、Inbound・Outboundのセキュリティルールを設定することができる。

VMNICに対してはNSGを設定するが、各AzureサービスではVNETサービスタグを利用する。

Firewallに似ているが、SourceとDestinationに対するAllow・Denyといった簡単なルールしか定義できない。

NSGを増やし過ぎると管理が大変になる。

デフォルトルール

  • Inbound : VNET内、Azure LBからのみ許可
  • Outbound: VNET内、Internateへのみ許可

Application Security Group(ASG)

VM(NIC)を論理的にグルーピングして、グループに対してNSGによるセキュリティ設定ができる。

ASGは同一リージョン、同一VNETのリソースのみグルーピングできる

VNET Peering

VNET同士をダイレクトに繋ぐことができる

繋げたVNET間の通信は全て、Azure バックボーンを通る

In/Outの2方向で課金されるので注意

推移性が成り立たないため、A->B, B->CでPeeringを設定しても、A->Cの通信はできない。A->Cを明示的にPeeringする必要がある。

リージョンをまたぐGlobal VNET Peeringもある

VPN Gateway

VNET同士を繋ぐためのもう1つの方法

パブリックインターネットを経由する

課金は高くなりそう

VNET Peeringと比べると帯域が狭い

すでにExpress RouteやSite2SiteのVPNがあるとVPNを増やせない( 1VNET 1 VPN GW

半年でAzure資格7冠を達成した

はじめに

約半年かけて、Azure 資格を7つ取得できたので所感をまとめる。

背景

ブログの投稿の通り、元々iOSアプリ開発をしていたが、機会があってAzureでPaaSサービスやデータウェアハウス基盤構築に携わることに。 過去2020年にAZ-204に2度挑戦したが、あえなく惨敗。そのまま寝かしておいたが、次第に知識の足りなさから不安やストレスを感じる。 一念発起して、Azure 資格取得に邁進することになった。

取得した資格(時系列順)

  • (2021/12/21) AZ-204: Developing Solutions for Microsoft Azure
  • (2022/02/01) DP-203: Data Engineering on Microsoft Azure
  • (2022/03/12) AZ-104: Microsoft Azure Administrator
  • (2022/04/09) AZ-700: Designing and Implementing Microsoft Azure Networking Solutions
  • (2022/04/26) AZ-500: Microsoft Azure Security Technologies
  • (2022/05/02) DP-100: Designing and Implementing a Data Science Solution on Azure
  • (2022/05/14) AZ-305: Designing Microsoft Azure Infrastructure Solutions

主観的難易度

AZ-204, AZ-104 > AZ-700 > AZ305 > AZ-500, DP203, > DP100

元々アプリ開発をしていたり、データウェアハウスに携わることがあったので、DP系は比較的簡単でした。 AZ-204, AZ-104はこれからAzureに触れますという人にとって1つの登竜門になると思いました。ここをしっかりと勉強すれば、AZ-305やAZ-700は問題がわかります。

勉強方法

テストのための勉強ができないタイプなので、愚直にMS Learnをやり切りました。 そのあとMeasureUpの公式模試を使って勉強しました。

MS Learnはレベル13の真ん中くらいになりました。

取得してみて

元々、2ヶ月に1つづつ取得し、今年の10月にDP100を除く資格を取得する予定だった。 当時はAZ-303, AZ-304が現役だったので、一年かけて取れればいいと思っていた。しかし、途中AZ-305にリプレースされてしまい、受ける試験が減ってしまったので急遽DP-100を追加しました。 実際にやってみて、AZ-204, AZ-104, AZ-700の取得までが一番つらかった。 特にAZ-104は元々iOSなどアプリ系だったため、クラウド独自のルールや仕組み、特にネットワーク系や苦手意識しかなかったので、大変でした この3つが取れてからは、知識の深掘り、肉付けしていけばなんとかなった。

実際、AZ-305まで取得してみての感想としては、Azureわからんです。 知っている内容は増えたが実践してみるとわからないことが増えそう。ただし、わからないことが分かるようになった。 総評としては、取得してよかったです。

これからどうするのか

少しペースを落として、あと2つAzure 資格試験を取ります。 - AI-102: Designing and Implementing a Microsoft Azure AI Solution - AZ-400: Designing and Implementing Microsoft DevOps Solutions

AI-102はアプリSaaSなのでとっつきやすい。AZ-400は三つ星なので持っているとカッコ良さそうだからです。 そして、6月から始まる更新ラッシュに備えます笑

これに並行して、最近ご無沙汰だったコーディング力を取り戻すために、AtCoder ”水色”にチャレンジしてみます。 LeetCodeのLearnでアルゴリズムをひとつづつドリルのように解き、週末などでAtCoderに参加予定。 年内で”緑色”になれたら、ご褒美にその時最新のiPhone買いたい。

今回は一つの節目で昇降デスク買いました。詳細は別記事で。

info.plistの内容をDebug, Releaseで変更する

TL;DR

①Info.plist にはパラメータとして設定する

②実態はBuild Configurationにて記載する

実際に設定する

Build Configurationの設定

[Project]->[Add UserDenined Settings]を選択 f:id:hopita:20200112111909p:plain

任意のプロパティ名を設定 f:id:hopita:20200112111842p:plain

info.plistの設定

最後にinfo.plistに先ほどのプロパティを$(プロパティ名)のフォーマットで入力 f:id:hopita:20200112111918p:plain