メモ
- 証明書の期限が切れる場合は、更新するのではなく新しい証明書を作成するみたい
struct MessageError: Swift.Error & CustomStringConvertible {
— おもちメタル (@omochimetaru) 2022年11月5日
var description: String
}
struct MessageError: Swift.Error & CustomStringConvertible { var description: String }
let error = MessageError(description: "hoge") print(error.localizedDescription) print(error.description)
The operation couldn’t be completed. (iOSEngineerCodeCheck.MessageError error 1.) hoge
私は
— treastrain / Tanaka.R (@treastrain) 2022年11月5日
extension String: LocalizedError {
public var errorDescription: String? { self }
}
とどこかに書いて、
throw "エラーだよ"
としています(extension 自体がリリースに入り込まないように #\if DEBUG で囲むなど) https://t.co/wq4WZjuRC2
String+LocalizedError.swift
を作成#if DEBUG extension String: LocalizedError { public var errorDescription: String? { self } } #endif
private func someFunction() throws { throw "エラーだよ" } do { try someFunction() } catch { print(error.localizedDescription) // エラーだよ }
GitHubは同様のDependabotというサービスを買収したものを公式サービスとして提供していますね。ただDependabotはSwiftの対応がもう一つなのでSwiftにはRenovateがいいですね。
— kishikawa katsumi (@k_katsumi) May 22, 2021
pod init
がエラーとなる問題のとりあえずの回避策
# Uncomment the next line to define a global platform for your project # platform :ios, '9.0' target 'GitHubPlayground' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for GitHubPlayground pod 'SDWebImageSwiftUI', '1.3.3' end
renovate.json
を作成
RenovateをiOSアプリ開発に導入してみた - dely tech blog 1つのPRでまとめて更新してほしいものをpackageNamesでまとめています。 また、バージョンを更新したくない場合、"enabled": falseを設定することでPRが生成されなくなります(e.g. SwiftLint)
{ "packageRules": [ { "groupName": "SDWebImage", "managers": [ "cocoapods" ], "packageNames": [ "SDWebImageSwiftUI", ] } ] }
NSSavePanel
等で前回選択したパスが保存されている場所は以下の通り。
/Users/ユーザ名/Library/Preferences/jp.co.ikeh.Hoge.plist
NSUserDefaults
でキーを指定する。
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"NSNavLastRootDirectory"]; [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"NSNavLastCurrentDirectory"]; [[NSUserDefaults standardUserDefaults] synchronize]; NSSavePanel *savePanel = [NSSavePanel savePanel];
Skip Install
をYesにする必要がある。developer.apple.com The Skip Install build setting is set to YES in your Build Settings pane. Skip Install (SKIP_INSTALL) must be set to YES for static libraries and NO for applications as shown in Figure 3. See SKIP_INSTALL for more information about it.
FileManager.SearchPathDirectory | Detail | Paths |
---|---|---|
applicationDirectory | Supported applications (/Applications). | /Users/hogeuser/Applications |
demoApplicationDirectory | Unsupported applications and demonstration versions. | /Users/hogeuser/Applications/Demos |
developerApplicationDirectory | Developer applications (/Developer/Applications). | /Users/hogeuser/Developer/Applications |
adminApplicationDirectory | System and network administration applications. | /Users/hogeuser/Applications/Utilities |
libraryDirectory | Various user-visible documentation, support, and configuration files (/Library). | /Users/hogeuser/Library |
developerDirectory | Developer resources (/Developer). | /Users/hogeuser/Developer |
userDirectory | User home directories (/Users). | (nil) |
documentationDirectory | Documentation. | /Users/hogeuser/Library/Documentation |
documentDirectory | Document directory. | /Users/hogeuser/Documents |
coreServiceDirectory | Core services (System/Library/CoreServices). | (nil) |
autosavedInformationDirectory | The user’s autosaved documents (Library/Autosave Information). | /Users/hogeuser/Library/Autosave Information |
desktopDirectory | The user’s desktop directory. | /Users/hogeuser/Desktop |
cachesDirectory | Discardable cache files (Library/Caches). | /Users/hogeuser/Library/Caches |
applicationSupportDirectory | Application support files (Library/Application Support). | /Users/hogeuser/Library/Application Support |
downloadsDirectory | The user’s downloads directory. | /Users/hogeuser/Downloads |
inputMethodsDirectory | Input Methods (Library/Input Methods). | /Users/hogeuser/Library/Input Methods |
moviesDirectory | The user’s Movies directory (~/Movies). | /Users/hogeuser/Movies |
musicDirectory | The user’s Music directory (~/Music). | /Users/hogeuser/Music |
picturesDirectory | The user’s Pictures directory (~/Pictures). | /Users/hogeuser/Pictures |
printerDescriptionDirectory | The system’s PPDs directory (Library/Printers/PPDs). | (nil) |
sharedPublicDirectory | The user’s Public sharing directory (~/Public). | /Users/hogeuser/Public |
preferencePanesDirectory | The PreferencePanes directory for use with System Preferences (Library/PreferencePanes). | /Users/hogeuser/Library/PreferencePanes |
applicationScriptsDirectory | The user scripts folder for the calling application (~/Library/Application Scripts/<code-signing-id>. | /Users/hogeuser/Library/Application Scripts/com.apple.dt.Xcode.PlaygroundStub-macosx |
itemReplacementDirectory | The constant used to create a temporary directory. | (nil) |
allApplicationsDirectory | All directories where applications can be stored. | /Users/hogeuser/Applications /Users/hogeuser/Applications/Utilities /Users/hogeuser/Developer/Applications /Users/hogeuser/Applications/Demos |
allLibrariesDirectory | All directories where resources can be stored. | /Users/hogeuser/Library /Users/hogeuser/Developer |
trashDirectory | The trash directory. | /Users/hogeuser/.Trash |
import Cocoa struct Directory { var directory: FileManager.SearchPathDirectory var name: String var detail: String var commonDirectoryURLs: [URL] { let urls = FileManager.default.urls(for: directory, in: .userDomainMask) return urls } var descriptionForMarkdown: String { var message = "|\(name)|\(detail)" let urls = self.commonDirectoryURLs if urls.isEmpty { message += "|(nil)" } for (index, url) in urls.enumerated() { if index == 0 { message += "|\(url.path)" } else { message += "<br>\(url.path)" } } message += "|" return message } } extension Directory { // ref: [FileManager\.SearchPathDirectory](https://developer.apple.com/documentation/foundation/filemanager/searchpathdirectory) // 2022/07/14 static let allDirectories = [ Directory(directory: .applicationDirectory, name: "applicationDirectory", detail: "Supported applications (/Applications)."), Directory(directory: .demoApplicationDirectory, name: "demoApplicationDirectory", detail: "Unsupported applications and demonstration versions."), Directory(directory: .developerApplicationDirectory, name: "developerApplicationDirectory", detail: "Developer applications (/Developer/Applications)."), Directory(directory: .adminApplicationDirectory, name: "adminApplicationDirectory", detail: "System and network administration applications."), Directory(directory: .libraryDirectory, name: "libraryDirectory", detail: "Various user-visible documentation, support, and configuration files (/Library)."), Directory(directory: .developerDirectory, name: "developerDirectory", detail: "Developer resources (/Developer)."), Directory(directory: .userDirectory, name: "userDirectory", detail: "User home directories (/Users)."), Directory(directory: .documentationDirectory, name: "documentationDirectory", detail: "Documentation."), Directory(directory: .documentDirectory, name: "documentDirectory", detail: "Document directory."), Directory(directory: .coreServiceDirectory, name: "coreServiceDirectory", detail: "Core services (System/Library/CoreServices)."), Directory(directory: .autosavedInformationDirectory, name: "autosavedInformationDirectory", detail: "The user’s autosaved documents (Library/Autosave Information)."), Directory(directory: .desktopDirectory, name: "desktopDirectory", detail: "The user’s desktop directory."), Directory(directory: .cachesDirectory, name: "cachesDirectory", detail: "Discardable cache files (Library/Caches)."), Directory(directory: .applicationSupportDirectory, name: "applicationSupportDirectory", detail: "Application support files (Library/Application Support)."), Directory(directory: .downloadsDirectory, name: "downloadsDirectory", detail: "The user’s downloads directory."), Directory(directory: .inputMethodsDirectory, name: "inputMethodsDirectory", detail: "Input Methods (Library/Input Methods)."), Directory(directory: .moviesDirectory, name: "moviesDirectory", detail: "The user’s Movies directory (~/Movies)."), Directory(directory: .musicDirectory, name: "musicDirectory", detail: "The user’s Music directory (~/Music)."), Directory(directory: .picturesDirectory, name: "picturesDirectory", detail: "The user’s Pictures directory (~/Pictures)."), Directory(directory: .printerDescriptionDirectory, name: "printerDescriptionDirectory", detail: "The system’s PPDs directory (Library/Printers/PPDs)."), Directory(directory: .sharedPublicDirectory, name: "sharedPublicDirectory", detail: "The user’s Public sharing directory (~/Public)."), Directory(directory: .preferencePanesDirectory, name: "preferencePanesDirectory", detail: "The PreferencePanes directory for use with System Preferences (Library/PreferencePanes)."), Directory(directory: .applicationScriptsDirectory, name: "applicationScriptsDirectory", detail: "The user scripts folder for the calling application (~/Library/Application Scripts/<code-signing-id>."), Directory(directory: .itemReplacementDirectory, name: "itemReplacementDirectory", detail: "The constant used to create a temporary directory."), Directory(directory: .allApplicationsDirectory, name: "allApplicationsDirectory", detail: "All directories where applications can be stored."), Directory(directory: .allLibrariesDirectory, name: "allLibrariesDirectory", detail: "All directories where resources can be stored."), Directory(directory: .trashDirectory, name: "trashDirectory", detail: "The trash directory."), ] } print(""" |FileManager.SearchPathDirectory|Detail|Paths| |---|---|---| """) for directory in Directory.allDirectories { print(directory.descriptionForMarkdown) }
# Standard for x in 1 2 3 do echo $x done # 1 line for x in 1 2 3; do echo $x; done
.PHONY: test test: @for x in 1 2 3;\ do\ echo $$x;\ done
# Standard if true; then echo "hello" else echo "goodbye" fi # 1 line if true; then echo "hello"; else echo "goodbye"; fi
.PHONY: test test: if true; then\ echo "hello";\ else\ echo "goodbye";\ fi
What's the difference between colorWithSRGBRed vs colorWithDeviceRed vs colorWithCalibratedRed
struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .previewDevice("iPhone 8") ContentView() .previewDevice("iPad Pro (9.7-inch)") } }
iPhone 4s
が指定する対象文字列xcrun simctl list devicetypes == Device Types == iPhone 4s (com.apple.CoreSimulator.SimDeviceType.iPhone-4s) iPhone 5 (com.apple.CoreSimulator.SimDeviceType.iPhone-5) iPhone 5s (com.apple.CoreSimulator.SimDeviceType.iPhone-5s) iPhone 6 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus) iPhone 6 (com.apple.CoreSimulator.SimDeviceType.iPhone-6) iPhone 6s (com.apple.CoreSimulator.SimDeviceType.iPhone-6s) iPhone 6s Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus) ...
@IBAction func buttonTapped(_ sender: Any) { let event = Event(level: .warning) event.environment = "develop" event.message = SentryMessage(formatted: "Sentry Message \(12)") event.extra = ["at": "\(#function),\(#line)"] SentrySDK.capture(event: event) do { try doSomething() } catch { SentrySDK.capture(error: error) return } SentrySDK.capture(message: "Task Completed!") } func doSomething() throws { throw NSError(domain: "さんごさんご", code: -1, userInfo: nil) }
コンソール
を開き、右上にApp Store
と入力し絞り込むCompleted: xxx of 1000
で進捗が確認できる800/1000
から進みが遅くなり、そこから5時間ほどかかった…。https://www.infoq.com/jp/news/2021/08/dark-launches-best-practices/ ダークローンチとは、新しい能力や機能を公的に発表する前に、システムに対する付加的ロードやパフォーマンス上の影響を測定するという、デプロイメント戦略のひとつで、一般的にエンドユーザが感知することはない。
Hi @xxx, You recently used a password to access the repository at (unknown) with git using git/2.30.1 (Apple Git-130). Basic authentication using a password to Git is deprecated and will soon no longer work. Visit https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/
Permission denied (publickey). fatal: Could not read from remote repository.
ssh-add -K ~/.ssh/id_ed25519
~/.zshrc
に記載しておく。
ssh-add -K ~/.ssh/id_ed25519