- 1. Firebase AuthenticationでのSign in with Appleの削除要件に対するCloud FunctionsとFlutterの実装
- 2. APIKitのエラーを整理する
- 3. FlutterでIOSシュミレーターが作動しない問題。
- 4. 【SwiftUI】モディファイアを条件によって変える
- 5. WWDCのセッションビデオ一覧表の作り方
- 6. 【SwiftUI】入力値チェック
- 7. 【UIKit】画面遷移の方法
- 8. Swift UIで燃費計算アプリを作ってみた!
- 9. Yolov5を独自のデータでトレーニングする
- 10. flutter で iosの実機テストをするまで
- 11. 【SwiftUI】Listをカスタマイズ
- 12. クラウド上で実機スマホをレンタルできるRemote TestKitを触ってみた
- 13. Codableで複数の型を取りうる配列を持つJSONに対応する
- 14. Swift Codableの公式解説をちょっと補足
- 15. SwiftのComputed PropertiesはFunction内でも宣言できる
- 16. Swiftで[String: Any]型の等価性チェックをする
- 17. iOS Simulatorが起動しない時の対処法
- 18. 【Android Java】いまさら聞けないActivityとは?
- 19. 【Xcode】コードスニペットについて
- 20. collectionViewのFallbackでクラッシュ
Firebase AuthenticationでのSign in with Appleの削除要件に対するCloud FunctionsとFlutterの実装
こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[もぐめっと](https://mogmet.com)です。
![IMB_I6Cq1q.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/87b7c585-c4c4-1e04-42b5-337089d9e511.gif)
趣味はスノボです。まだまだ初心者ですが最近ルックバックかっこインディーという新しい技ができました。あまりにも嬉しかったのでつい動画にしてしまいました。本日は**Sign in with Apple**を用いているときに、アカウント削除機能を実装しないとレビューが通らなくなるようになってしまったので、Firebaseを使ったプロジェクトでどう実装すればいいかの共有をします。
https://developer.apple.com/jp/news/?id=12m75xbj
#
APIKitのエラーを整理する
[APIKit](https://github.com/ishkawa/APIKit)ではどのようなエラーが定義されていて、それらがどういうときにスローされるかを整理します。
APIKitでAPIClientを実装するときに、エラーハンドリング周りをどう実装するかを考える際の参考になるかと思います。
# 前提とサンプルコード
APIKitが提供しているデフォルトの実装、つまりURLSessionAdapterを使用することを前提としています。本記事執筆時点では、APIKitでは以下3つのエラーを定義しています。
– RequestError
– ResponseError
– SessionTaskErrorHTTP通信処理の起点となる`send(_:callbackQueue:handler:)`メソッドを実行してエラーになると、`handler`にはSessionTaskErrorが渡されます。なのでRequestErrorとResponseErrorはSessionTaskErrorに内包される形になります。
エラーのパターンを整理すると、こんな感じの
FlutterでIOSシュミレーターが作動しない問題。
久々に修正しようとflutterを立ち上げてiosシュミレーターを開こうとしたら、デバッグコンソールに下記エラーが出て立ち上がらなくなっていました。
“`
Running “flutter pub get” in hogehoge…
The current Dart SDK version is 2.17.0-182.0.dev.Because flutter_hooks 0.18.5+1 requires SDK version >=2.17.0 <3.0.0 and no versions of flutter_hooks match >0.18.5+1 <0.19.0, flutter_hooks ^0.18.5+1 is forbidden. So, because hoge depends on flutter_hooks ^0.18.5+1, version solving failed. pub get failed (1; So, because hoge depends on flutter_hooks ^0.18.5+1, version solving
【SwiftUI】モディファイアを条件によって変える
# はじめに
今回作成するサンプルはindexが3の倍数の場合にpaddingを付けるというものです。
いい案が思いつかなかったので、サンプルとしてはわかりにくいかも知れないです笑
完成形はこのような形になります。
![simulator_screenshot_606CF1B6-853E-400A-A0E9-684FC1AD1D5F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bf77a33d-5135-04f5-70df-b79683d393b4.png)# やり方
Viewを拡張してif文で条件分岐します。
“`swift
import SwiftUIstruct ContentView: View {
var body: some View {
List {
ForEach(0..<30) { index in Text("テキスト \(index)")
WWDCのセッションビデオ一覧表の作り方
こちら [[WWDC22]セッションビデオ一覧 – Qiita](https://qiita.com/YokohamaHori/items/a67dcc89463ea9e7bcb0) でWWDC22のセッションビデオの一覧表をMarkdown形式で作成した手順になります。
もっとスマートな方法をとりたかったのですが、あまり時間をかけたくなかったので、最短の調査で完成する方法にしました。(やっつけ仕事なので、後で思い出せるようにメモしておきます)
# やりたいこと
WWDCのセッションビデオを曜日ごとに一覧表示したい。
## フォーマット
“`swift
# Tuesday| 項番 | タイトル(URLリンク付き) | メモ |
| — | — | — |
| 1 | [Add accessibility to your Unity games](https://developer.apple.com/videos/play/wwdc2022/10151/) |
“`## WWDCのセッション一覧
[Sessions – WWDC22 – Appl
【SwiftUI】入力値チェック
# はじめに
入力フォームに値が入力された時にボタンをクリックできる実装について説明していきます。
それに加え、ボタンの色を変化させる方法について初めて知ったのでメモとして残しておきます!
テキストフォーム、ボタンの作成方法についてはここでは説明しませんので悪しからず。# 環境
Xcode 13.4.1
Swift 5.6.1
MacOS 12.4# 入力値チェック
## 書き方
“` swift:
.disabled(変数名.isEmpty)
“`
`.isEmpty`により文字列が空かどうかをbool値として扱う。
この値がtrueならばクリック不可となり、falseならばクリック可能となる。## ボタンの色を変える
三項演算子を用いることでif文のように処理を分けることが可能である。
これによりViewの挙動を容易に変化できる。`bool値 ? trueの場合 : falseの場合`
入力フィールドに文字列が書かれていない時、ボタンの背景色はグレーで文字の色は黒。文字が入力された時、背景色は青色で文字の色は白になるようにする。
“`swift
.
【UIKit】画面遷移の方法
# StoryBoardで遷移
Controlを押しながらButtonをViewControllerにドラッグします。
![スクリーンショット 2022-07-04 19.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/565859a0-9ec4-33d8-c1ac-f57d0a542b7d.png)
Action Segueの中から遷移方法を選択します
![スクリーンショット 2022-07-04 19.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e586f636-b928-0c18-fdff-08adb73bb5dd.png)# コードで遷移
「Cocoa Touch Class」を選択して「Next」を押します。
![スクリーンショット 2022-07-04 20.19.33.png](https://qiita-image-store.s3.ap-nor
Swift UIで燃費計算アプリを作ってみた!
SwiftUIを学び始めて1ヶ月くらいたったので勉強がてらアプリを作ってみることにしました。
作成した流れと学習できたポイントなどをまとめていきたいと思います。
Swift学習や「SwiftUIでアプリ開発する時ってこんな感じなんだなぁ」と思ってもらえると幸いです。
# アプリの概要
:::note info
燃費計算アプリ
:::![9E2A9659-F96B-4450-B19D-46587704343E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2264957/3bf4d5d2-b739-36a1-c13c-366b1dd952f3.png)
機能
+ 走行距離と給油量を入れると燃費を表示
:::note info
式:走行距離(km) ÷ 給油量(ℓ) = 燃費(km/ℓ)
:::+ 距離と燃費、ガソリン単価を入れると必要な料金を表示
:::note info
式:走行距離(km) ÷ 燃費(km/ℓ) × 単価(円) = 料金(円)
:::以上2つの機
Yolov5を独自のデータでトレーニングする
# 独自の物体検出モデルがほしい
![スクリーンショット 2022-07-03 13.56.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/9259ee0a-303d-ed25-f115-dff16e94aa5e.png)
# 物体検出モデルYolov5をかんたんにトレーニングできる
自分で用意したデータを学習させることで、好きな物体を検出できます。# 手順
### データを用意する
データは
**・画像
・画像に対応するアノテーション・テキスト・ファイル**を画像フォルダとテキスト・フォルダに分けて、同じ名前で用意します。
例えば、image1.jpgに対応するimage1.txtというアノテーション・テキスト・ファイルを作ります。アノテーション・テキスト・ファイルには、オブジェクトごとに1行ずつ、以下を記述します。
“`
class x_center y_center width height
“`ボックス座標は、正規化されたxywh形式(0〜1)で
flutter で iosの実機テストをするまで
## 実機テストの手順
“`shell
$ flutter clean$ flutter build ios
“`次のコマンドで利用可能なデバイス一覧を確認する。
“`shell
$ flutter devicesiPhone 13 Pro (mobile) • A15A87AB-EE19-477A-8823-1371F4FF61D4 • ios • iOS 15.5 19F77
macOS (desktop) • macos • darwin-x64 • macOS 12.4 21F79 darwin-x64
Chrome (web) • chrome • web-javascript • Google Chrome 102.0.5005.115
“`ここで、`A15A87AB-EE19-477A-8823-1371F4FF61D4`が実機テスト可能なiphoneのデバイスIDとなる。
次のコマンドを実行することで実機にイ
【SwiftUI】Listをカスタマイズ
# はじめに
SwiftUIでTableViewと同じような見た目を作成するにはListを使用する必要があります。
しかし、Listでは変更できない項目が多く存在します。
おそらくListはUITableViewで作成されているので、UITableViewの設定が反映されます。それを使用して、公式のAPIでは提供されていない機能を実装します
# 背景色を変更
“`swift
import SwiftUIstruct ContentView: View {
init() {
UITableView.appearance().backgroundColor = .red
}
var body: some View {
List {
ForEach(0..<10) { _ in Text("テキスト") } } .listStyle(.grouped) } } ``` # 区切り線の色を変更 ```swi
クラウド上で実機スマホをレンタルできるRemote TestKitを触ってみた
この記事は、Qiita Engineer Festa 2022 [Remote TestKitを使ってレビューを書こう!](https://qiita.com/official-events/f0e8b25feb05af6326b3)の参加記事です。
https://qiita.com/official-events/f0e8b25feb05af6326b3
## はじめに
クラウド上で実機のスマートフォンをレンタルできるサービスがあると知って、面白そうだったので触ってみました。
また、Androidのスマホは多種多様なものが多く、Webの開発でも実際にどう見えてるのかを検証してみたいときに便利かもと思い、触ってみました。なお、僕はネイティブアプリの開発経験はないので、Web開発の面での内容になります。
(上記のQiita Engineer Festa 2022のイベントで、Remote TestKitのトライアルができます! → [参加方法・流れ – Remote TestKitを使ってレビューを書こう! – Qiita](https://qiita.com/offici
Codableで複数の型を取りうる配列を持つJSONに対応する
とあるAPIのレスポンスをデコードする処理を書いていて、以下のように配列の中の型が複数あるケースに対応する必要がありました。
“`json
{
“products”: [
{
“id”: 1,
“type”: “FOO”,
“foo”: “foofoo”,
“bar”: “barbar”
},
{
“id”: 2,
“type”: “BAZ”,
“baz”: “bazbaz”,
“qux”: “quxqux”
}
],
“next”: “xxxxxxx”
}
“``id`と`type`のように、一部共通のプロパティも持っていて、これらを抽象的な型でまとめて表現したいというモチベーションもありました。
参考になる(というかほぼそのまま使える)コードをStackOverflowで見つけてなんとか実現
Swift Codableの公式解説をちょっと補足
Codableについての公式の解説記事はこちらですが、JSONの具体例がなかったり読んでるだけだと若干わかりづらいところがあったので、自分なりに補足をつけてみたいと思います。主にCodingKeys周りを見ていきます。
https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types
# 具体的なJSONで理解する
解説記事のコードをまとめるとこんな感じです。デコード部分に絞ってます。“`swift
struct Coordinate {
var latitude: Double
var longitude: Double
var elevation: Doubleenum CodingKeys: String, CodingKey {
case latitude
case longitude
case addition
SwiftのComputed PropertiesはFunction内でも宣言できる
SwiftのComputed PropertiesはFunction内でも宣言できます。
“`swift
struct State {
var foo = “foo”
}var state = State()
func testComputedProp() {
var result: Bool { // ここにComputed Propertiesが宣言できる!
someLogic(str: state.foo)
}
print(result)
state.foo = “bar”
print(result)
}func someLogic(str: String) -> Bool {
return str == “bar”
}testComputedProp()
// 以下の順で出力される
// false
// true
“`限定的な具体例になっちゃいますが、、
TCAのReducerを実装してるときに、同じデータ取得のコードをあちこちに書いていました。“`swi
Swiftで[String: Any]型の等価性チェックをする
Swiftで以下のコードはコンパイルエラーになります。
Any型がEquatableに準拠していないというのが理由です。“`swift
let dict1: [String: Any] = [“foo”: “bar”]
let dict2: [String: Any] = [“foo”: “bar”]
print(dict1 == dict2) // Protocol ‘Any’ as a type cannot conform to ‘Equatable’
“`そこで、以下のように[String: Any]をNSDictionaryにキャストして比較します。
こうするとコンパイルすることができ、結果は`true`になります。“`swift
let dict1: [String: Any] = [“foo”: “bar”]
let dict2: [String: Any] = [“foo”: “bar”]
print(dict1 as NSDictionary == dict2 as NSDictionary) // true
“`
iOS Simulatorが起動しない時の対処法
最近、Flutterアプリの実行をする際に溜まったキャッシュなどでiOS Simulatorが起動しなくなることが頻発したので、その対処法を残します!
まだまだ浅学で少し誤った情報があるかもしれないので、その点を考慮して読み進めてもらえると幸いです?# 対処法
以下の手順で試していくと、解決します!
手順を試す→iOS Simulatorの動作確認、の流れで動作確認失敗した時に
以下の手順を進めていきましょう?
1. iOS Simulator関連の削除
1. coreSimulator/casheの削除
1. DerivedDataの削除
1. iOS DeviceSupportの削除
1. Library/Cachesの削除## 1. iOS Simulator関連の削除
iOS Simulatorの表面的なキャッシュを削除します。
“`zsh
# シミュレーターの一覧表示
xcrun simctl list devices# 使えないシミュレーターを削除
xcrun simctl delete unavailable# キャッシュの削除
xcrun –kill
【Android Java】いまさら聞けないActivityとは?
## はじめに
Android Javaって何?という初学者向けの記事になります。
アンドロイド特有の`Activity`についての内容です。仕事でAndroid Javaを使って修正、開発をしています。
業務に携わってから約半年が経ちました。Android Javaを使うにあたって、学んだことをアプトプットしようと思い記事にしました。
エンジニアになって1年の未熟者なので暖かい目で見ていただけると助かります。
## あなたは誰?
> 現職:SESエンジニア(歴1年)
前職:営業
年齢:27歳
使用言語:Java, Android Java, C++
工程:テスト、実装(設計もやってみたい…)
好きなこと:サウナ/登山/ダーツ/ピアノ/酒/運動全般
もくもく会主催:[新宿もくもく会](https://shinjuku-realize0707.connpass.com/)## Acyivityとは
簡単に言うと`Activity`とは、スマホでいう**一つの画面全体**のことを言います。
【Xcode】コードスニペットについて# はじめに
コードスニペットとは?
正確かはわかりませんが私の認識では、「何度も使うコードを定型文として登録する」みたいな感じで思っています。今回はSwiftUIでダークモードを検知する事ができるコードを登録します
`@Environment(\.colorScheme) var colorScheme`これ毎回忘れて必ずググっちゃうんです笑
# やり方
登録したいコードを選択します。
![スクリーンショット 2022-07-02 16.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a0947b81-5fae-9cfa-c2da-75e86f310cd7.png)選択したコードの上で右クリックします。
「Create Code Snippet」を選択します。
![スクリーンショット 2022-07-02 16.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745
collectionViewのFallbackでクラッシュ
# きっかけ
tableViewで
“`tableViewController.swift
if hoge {
return UITableViewCell()
}
“`
このようにFallbackしていて、同様にcollectionViewにも
“`collectionViewController.swift
if hoge {
return UICollectionViewCell()
}
“`
としていたらクラッシュしてしまった。【クラッシュログ】
“`
Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘the cell returned from
– collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier
– cells must be retrieved by calling
– dequeueReusableCellWithReuseId