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で開いているのですが、経路によって最初のタブを分けたいことがありました。 少し調べても方法が見つからなかったので、まとめておきます。
結論
- TabViewを含むページをinitするタイミングで、Tab番号を渡す。
- 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.x.x.0 : Networkアドレス
- x.x.x.1 : デフォルトゲートウェイ
- x.x.x.2, x.x.x.3 : Azure DNSのマップ用に予約済み
- x.x.x.255 : ブロードキャスト用
※ 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が必要になる
- Firewall
- Bastion Host
など
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のセキュリティルールを設定することができる。
VMのNICに対しては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]を選択
任意のプロパティ名を設定
info.plistの設定
最後にinfo.plistに先ほどのプロパティを$(プロパティ名)のフォーマットで入力