- 1. RxSwift における subscribeOn と observeOn の違い
- 2. テストについて学習してみた
- 3. 【iOS】Fastlaneのincrement_build_numberがビルドナンバーを取れずにエラーになる際の対処法
- 4. tableView画面クラッシュ
- 5. iPhone画面サイズ、ピクセル数早見表
- 6. [iOS]XcodeのUIButtonを接続した時に、IBOutletになるか、IBActionになるかの条件
- 7. iOS 14:クリップボードにアクセスする前にその内容の種別を検知
- 8. retina端末で画像アップロードする時のリサイズで注意するところ
- 9. Grand Central Dispatch (GCD) の理解を深める
- 10. Google Maps で吹き出しが表示されない
- 11. 勢いでMacbook買ってから初めてのiPhoneアプリをリリースするまでのメモ
- 12. アプリで取り扱っている画像(UIImage)を端末に保存する
- 13. Xib で View を生成する時に知っておくといいこと
- 14. [アプリ開発]DKImageViewControllerで写真共有アプリ作ってみた
- 15. 【入門】iOS アプリ開発 #8【スペシャルターゲット・得点表示】
- 16. CryptoKit を使って ECDSA を用いた署名を実装する
- 17. Swift基礎文法書に付箋を貼ってみた
- 18. 【IOU】 Object Detection の性能指標【I/U】
- 19. [Swift]ColorをRGBで指定する
- 20. セグメンテーションモデル(DeepLabV3)の結果をCore ML Helpersでラベルごとに振り分ける。
RxSwift における subscribeOn と observeOn の違い
RxSwift などで処理をつなげて書いていると、ここはメインスレッドで、ここはバックグランドスレッドでなどと、処理によってスレッドを切り替えたい場合があるかと思います。そんな時は、`Observable` のプロパティとして提供されている `subscribeOn` または、`observeOn` を使用することでスレッドを切り替えて処理を実行することができます。今回はそんな `subscribeOn` と `observeOn` の違いについて簡単にまとめていこうかと思います。
### その前に Scheduler
RxSwift では Observable や subscribe の処理をどのスレッドでどのよう(直列・並列)に処理をさばくかを決定する役割を `Scheduler` と呼びます。これについては後で触れますが、RxSwift を使用し、マルチスレッドで処理
テストについて学習してみた
#自動テストについて学んだこと
現在、自動テストについて学習しているので学習したことをまとめていきます。#これから
“`swift:
“`
【iOS】Fastlaneのincrement_build_numberがビルドナンバーを取れずにエラーになる際の対処法
結論から言うと、**プロジェクトディレクトリの中に複数のプロジェクトファイルが存在しているとエラーになります。余計なプロジェクトファイルを消せば解決します。**
以下は経緯。
—————————————
プロジェクトのビルドナンバーをインクリメントしたいときに便利なのが、Fastlane Actionの[increment_build_number](https://docs.fastlane.tools/actions/increment_build_number/)ですが、なぜか自分の環境だけ、以下の様なエラーが出ました。
“`
-> % bundle exec fastlane run increment_build_number
[✔] ?
[16:22:33]: ————————————
[16:22:33]: — Step: increment_build_number —
[16:22:33]: —————————–
tableView画面クラッシュ
tableViewの画面がクラッシュする
【エラー】
Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.【対応】
テーブルビューのリロード部分
self.rankingTableView.reloadData()
をDispatchQueue.main.async {
self.rankingTableView.reloadData()
}と囲むとクラッシュしなくなりました。
【参考】
swift初心者がiOS13対応でメインスレッド以外でUI更新をしてクラッシュさせてしまった話
https://qiita.com/rymiyamoto/items/7ace750172b84a2ff809https://www.it-swarm.dev/ja/ios/gtレイアウトエンジンへの変更は、メインスレッドからアクセスした後、バックグラウンドスレッドから実
iPhone画面サイズ、ピクセル数早見表
|機種名|ハードウェア名|有機ELディスプレイ対応|画面サイズ|CSSピクセル|デバイスピクセル|デバイスピクセル比|アスペクト比|発売初期搭載iOS|最終対応iOS|発売年|メモ|
|:–|:–|:–|:–|:–|:–|:–|:–|:–|:–|:–|:–|
|iPhone3G|iPhone1,2||3.5|320×480|320×480|1|2:3|iPhoneOS2.0|iOS4.2.1|2008/7/11|
|iPhone3GS|iPhone2,1||3.5|320×480|320×480|1|2:3|iPhoneOS3.0|iOS6.1.6|2009/6/26|
|iPhone4|iPhone3,1、iPhone3,2、iPhone3,3||3.5|320×480|640×960|2|2:3|iOS4.0|iOS7.1.2|2010/6/24|
|iPhone4s|iPhone4,1||3.5|320×480|640×960|2|2:3|iOS5.0|iOS9.3.5|2011/10/14|
|iPhone5|iPhone5,1、iPhone5,2||4
[iOS]XcodeのUIButtonを接続した時に、IBOutletになるか、IBActionになるかの条件
超小ネタ
前から疑問だったんですが、UIStoryboardからUIButtonをUIViewControllerなどに接続した時viewDidLoadより上に持ってきたらIBOutlet
![スクリーンショット 2020-09-11 12.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20784/30bf5f57-7984-2e90-33d4-6efee24495e5.png)viewDidLoadより下に持ってきたらIBAction
![スクリーンショット 2020-09-11 12.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20784/d0eeb12b-027b-e75a-2a99-3ebc4193007e.png)がデフォルトで表示される模様。
viewDidLoadがない場合はIBOutletになりましたUIViewの場合
awakeFromNibより上に持ってきたら
iOS 14:クリップボードにアクセスする前にその内容の種別を検知
iOS 14では、アプリがユーザーのクリップボードのコンテンツにアクセスするたびに、画面上部に警告が表示されます。
アプリがクリップボードのコンテンツにアクセスするのは、その中のコンテンツに気になる点があるかどうか知りたい場合があるためです。
この `UIPasteboard.general` の `detectPatterns` 機能を利用すると、クリップボードのコンテンツが次のカテゴリのいずれかに該当するかどうか検出することができます。
– 数字 `.number`
– URL `.probableWebURL`
– ウェブ検索クエリー `.probableWebSearch``detectPatterns` がコンテンツのタイプを判断できない時はいつも `.probableWebSea
retina端末で画像アップロードする時のリサイズで注意するところ
iOS端末で、よく写真ををリサイズして、アップロードしたいことがある。
ただ、ちょっと注意しないと、Retina対応で画像が設定されたサイズで生成されないことがある。
これはUIGraphicsBeginImageContextWithOptions()メソットでscaleパラメーターで、期待されるサイズにならない場合があるほで、気をつけないといけない。
ここでは、scale 1.0を設定した実装で、実際リサイズしたいサイズでファイルが生成されるが確認される。“`swift:UIImage+extension.swift
func resizeWithStorage(toWidth: CGFloat) -> UIImage {
let scale = toWidth / self.size.width
let toHeight = self.size.height * scale
let newSize = CGSize(width: toWidth, height: toHeight)
let rect
Grand Central Dispatch (GCD) の理解を深める
### GCD とは?
macOS、iOS、watchOS、tvOS のマルチコアハードウェアでの並列実行タスクをするために提供されている言語機能で、開発者は `DispatchQueue` を使用してスレッドでの処理を管理することができます。また、GCD の Queue は追加されたタスクの順番ごとに処理を実行する FIFO(First In First Out) の性質を持っています。
### 一旦用語をまとめる
#### Process(プロセス)
アプリケーションの実行インスタンスであり、専用の仮想メモリ空間およびシステムのリソースが割り当てられる。また、プロセス内には複数のスレッドが含まれる。
#### Thread(スレッド)
プロセスが実行する処理などを格納した箱のようなもの。
#### Task(タスク)
スレッドに格納される具体的な処理の単位。
#### Queue(キュー)
アプリケーションに含まれるスレッドを管理するための高レベルな API で、Thread の作成・管理の役割を担っている。また、実際に処理される時にはシステムが効率的なタスクの
Google Maps で吹き出しが表示されない
## 要件
Google Maps 上のマーカーをタップした際に吹き出しを表示してください。
## Google さんの教え
それ **info window** でできるよ。
https://developers.google.com/maps/documentation/ios-sdk/marker#add_an_info_window`title` or `snippet` のどちらかを設定すれば、マーカーをタップした際に吹き出し( **info window** )が表示されるようです。
どちらも `null` もしくは空文字の場合は吹き出しは表示されません。“`swift
let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let marker = GMSMarker(position: position)
marker.title = “London”
marker.snippet = “Population: 8,174,100”
marker.map = map
勢いでMacbook買ってから初めてのiPhoneアプリをリリースするまでのメモ
# はじめに
3月にMacbookProを購入し、独学でプログラミング(Swift)を学習し、8月に初めてのiOSアプリをリリースしました!
今回はアプリリリースまでにどうプログラミングを勉強したのか、どういう教材でアプリ開発を学んだのかを紹介します!# リリースしたアプリ
思いっきり宣伝ですがこちらからダウンロードできます↓
https://apps.apple.com/jp/app/prophecy-%E4%BA%88%E8%A8%80%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF/id1528918453記念すべき初のアプリは【手品アプリ】です!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620431/37ee5273-a6df-07b5-5f2e-9cde983777fc.png)
iPhoneでお客さんが選んだカードを当てる簡単なマジックです!
実演動画はYouTubeに載せています↓
https://www.youtube.com/w
アプリで取り扱っている画像(UIImage)を端末に保存する
UIImageViewに表示したりするのに使っている画像(UIImage)を端末のアルバムに保存したかったのでやり方を調べました。
まず、Info.plistの`
`の中に`NSPhotoLibraryAddUsageDescription`があるか確認します。なかったら以下のように追加します。パーミッション要求時の文言は、アプリの内容に応じて指定します。 “`
NSPhotoLibraryAddUsageDescription
パーミッション要求時の文言
“`そしたら、画像を保存しようとしているところで以下のような処理を実行します。
“`swift
func save(image: UIImage) {
// パーミッションを確認
PHPhotoLibrary.requestAuthorization { status in
guard status == .authorized else {
// 権限がない
return
Xib で View を生成する時に知っておくといいこと
先日、うっかり `ViewClass` で指定した `Xib` で作成したカスタムビューのプロパティにアクセスし下記のように Error を出してしまいました。初心者の頃はよく分からずググったものコピペ なりで回避していましたが、そもそも何故これが Error になるのかを今回は紹介したいと思います。
“`swift
override func viewDidLoad() {
super.viewDidLoad()
hogeView.label.text = “hogehoge”
}
// Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
“`## Xib で View を生成する方法
Xib で View を生成する方法は、大きく分けて `View Class` と `File’s Owner` を指定する2通りの方法があります。
### View Class
![image.pn
[アプリ開発]DKImageViewControllerで写真共有アプリ作ってみた
![5568440d5934344ad6f605910ee9f3e1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679429/bb260802-cf93-1d92-fa30-5e030f525cf2.gif)
![464b0ad207bdce4da56f3c8461957761.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679429/afed0470-5448-a561-735c-e59b7cd8ab14.gif)#作った経緯
初めて作ったファッションアプリが途中でできなかったので、なんかCollectionView使ってやりたいなーって思いましてインスタみたいな写真共有アプリ作ろうと決心して開発しました!
参考にしたアプリは`tabiori`さんです
>https://tabiori.com/とりあえず作ってみた!
![スクリーンショット 2020-08-23 14.58.10.png](https:/
【入門】iOS アプリ開発 #8【スペシャルターゲット・得点表示】
# はじめに
今回はスペシャルターゲット(くだもの類)、パックマンがそれを食べた時やゴーストを噛み付いた時の得点表示を作成していく。
イメージ図は下記の通り。スペシャルターゲット(サクランボ表示)と、それをパックマンが食べると得点が表示される。
![Image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678332/ccec0087-7ddb-a262-c4ae-662ad6389fae.png)
# 仕様書
まずはスペシャルターゲットの仕様の確認。
![Image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678332/996dbef8-f014-0308-a8bf-6c6f267cc4eb.png)
表示されている間にパックマンが食べると、得点が2秒だけ表示される(仕様にはないが実機確認)。
続いてパックマンがゴーストを噛み付いた時の得点表示の仕様は以下の通り。
![Image51.p
CryptoKit を使って ECDSA を用いた署名を実装する
ECDSAでJWTによる電子署名を作成することがあったのでメモ :pencil:
## ECDSAとは
* [楕円曲線暗号 – Wikipedia](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7) の一つ> 楕円曲線暗号(だえんきょくせんあんごう、Elliptic Curve Cryptography、ECC)とは、 [楕円曲線](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A) 上の [離散対数問題](https://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E5%AF%BE%E6%95%B0%E5%95%8F%E9%A1%8C) (EC-DLP) の困難性を安全性の根拠とする [暗号](https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7)。
* 暗号化と復号とで異なる2つの鍵を使
Swift基礎文法書に付箋を貼ってみた
#Swiftの基礎文法書の復習
Swiftの基礎が学べる良書である[「絶対に挫折しない iPhoneアプリ開発「超」入門 第8版 【Xcode 11 & iOS 13】 完全対応」](https://www.sbcr.jp/product/4815604622/)を読み返しながら、開発していて**注意すべきところ**や**知らなかったところ**に付箋を貼ってみました。## for文
知らなかったのですが、forの後に続くのは**定数**らしいです。以下、コード例です。
“`swift:
for 定数 in 範囲 {
処理
}
“`一見、範囲の値の回数だけ値が変わっているように見えるので変数ではないかと思っていたのですがどうやら違うみたいです。
>for文で使われている定数nは、for文が一度実行されるたびに寿命が切れて、メモリ上から消去され、そして次の文を実行する際に再度同名の定数nが新たに宣言されて・・・・・##プロックとスコープ
以下のコードで{}で囲われたところを**ブロック**と呼びます。
“`swift:プロック
var count = 0
【IOU】 Object Detection の性能指標【I/U】
ユニオン交差 Intersection Over Union (IOU) が一般的なようです。
![iou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/edde1efc-834f-c528-8d71-202ac6106399.png)**IOU = 正解boxと予測boxの重なりあう領域 / 正解boxと予測boxの重なり合っている部分と重なり合っていない部分の和**
つまり、IOUが100%であれば、完璧に正解と予測が一致しているということです。
CreateMLの正解率は、このIOUが50%を越えているもの(50%重なっているもの)を正解とみなして%表示しています。
I/U 50%
87%というのは50%領域が重なっているケースが87%あったということです。
もう一つの指標、varied I/Uというのは、閾値を50%〜95%まで変化させた時の平均正解率。
これが低いと、重なっている部分はあるものの、重なる領域は狭い、ということになります(もちろん50%閾値の正解
[Swift]ColorをRGBで指定する
## はじめに
SwiftでcolorをRGBで指定する方法を説明します。## Swiftでのcolor指定
まず通常の指定方法は“`swift:ViewController.swift
sampleView.backgroundColor = .bluesampleView.backgroundColor = UIColor(red: 0.1, green: 0.5, blue: 1.0, alpha: 1.0)
sampleView.backgroundColor = UIColor(red: 30/255, green: 144/255, blue: 255/255, alpha: 1.0)
“`下に載せている記事が参考になるかと思いますが、SwiftでRGB指定しようとすると全ての値を255で割って分数表記にしないといけないため、若干めんどくさいです。
@shu26 さんのQiita
https://qiita.com/shu26/items/bc0a8a06019b24d799d4そこで、RGBの値をそのまま利用するためのextensionを作成しま
セグメンテーションモデル(DeepLabV3)の結果をCore ML Helpersでラベルごとに振り分ける。
アップルの公式配布DeepLabV3のCore ML モデルは、(512,512)のML Multi Arrayを出力します。
各ピクセルは0~14のラベル値です。0,’background’背景
1,’aeroplane’飛行機
2,’bicycle’自転車
3,’bird’鳥
4,’boat’ボート
5,’bottle’ボトル
6,’bus’バス
7,’car’車
8,’cat’猫
9,’chair’椅子
10,’cow’牛
11,’diningtable’テーブル
12,’dog’犬
13,’horse’馬
14,’motorbike’バイク
15,’person’人
16,’pottedplant’鉢植え
17,’sheep’羊
18,’sofa’ソファ
19,’train’電車
20,’tv’テレビ出力結果をマスク画像として使いたい場合、ピクセルのラベル値を判別する必要があります。
[Core ML Helpers](https://qiita.com/john-rocky/items/bfa631aba3e7aabc2a66)でラベル値によって判別してマスク画像にで