SwiftUI、SwiftData の公式チュートリアルってすごく良いですね
参考にしながら、まずは、Todo リスト的なものを作ってみました。
Landmarks というサンプルコードのタブに追加してみました。

Android の「Jetpack Compose + ストレージ的な何か」で作るより、簡単に直感的に作れるような気がしています。
もっと上手にプログラミングできるよう日々精進していこうと思います。
SwiftUI、SwiftData の公式チュートリアルってすごく良いですね
参考にしながら、まずは、Todo リスト的なものを作ってみました。
Landmarks というサンプルコードのタブに追加してみました。

Android の「Jetpack Compose + ストレージ的な何か」で作るより、簡単に直感的に作れるような気がしています。
もっと上手にプログラミングできるよう日々精進していこうと思います。
Xcode の Preview がクラッシュしっぱなし。

ストレージまわりの話ではないかと思いながらしらべる。
xcrun simctl -—set previews delete all
👉 Preview keeps crashing | Apple Developer Forums
👉 SwiftUIのプレビューが動かなくなった時の対処方法 #SwiftUI - Qiita
まずは、見てみますか。
#!/bin/bash
cd ~/Library/Logs/DiagnosticReports
file=$(ls XCPreview* | head -1)
open $file
何か起こったらログ確認大事。
いろいろありそうです。
このシミュレータですが、通常のシミュレータとは別でXcodeが持っています。しかしストレージ管理のデベロッパ欄には表示されない上に自動で削除されません。私の環境ではiOS14.1のシミュレータなども残っていました。
👉 【SwiftUI】PreviewのSimulator残留 | thwork
cd ~/Library/Developer/Xcode/UserData/Previews/Simulator\ Devices/
find . -name com.apple.suggestions.plist -exec plutil -replace SuggestionsAppLibraryEnabled -bool NO {} ";"
👉 [Tips]Xcode13.1のSwiftUIのpreviewでCPU使用率が高くなるのをSpotlightを止めて回避する(iOS15) #iOS - Qiita
- Restart the computer and re-run xcrun simctl --set previews delete all
- Delete stored Preview data directly. This data is stored in ~/Library/Developer/Xcode/UserData/Previews.
👉 Use Realm with SwiftUI Previews — Realm
xcrun simctl --set previews delete unavailable | all
👉 SwiftUI Previews - Disk space issue | Apple Developer Forums
Save space by
1. xcrun simctl delete unavailable
2. xcrun simctl erase all
3. Delete /Users/username/Library/Developer/CoreSimulator folder.
👉 swiftui - Xcode 13 UI Previews folder takes too much space - Stack Overflow
コマンドラインツールから help を確認する。
❯ xcrun simctl help
usage: simctl [--set <path>] [--profiles <path>] <subcommand> ...
simctl help [subcommand]
Command line utility to control the Simulator
For subcommands that require a <device> argument, you may specify a device UDID
or the special "booted" string which will cause simctl to pick a booted device.
If multiple devices are booted when the "booted" device is selected, simctl
will choose one of them.
Subcommands:
addmedia Add photos, live photos, videos, or contacts to the library of a device.
boot Boot a device or device pair.
clone Clone an existing device.
create Create a new device.
delete Delete specified devices, unavailable devices, or all devices.
diagnose Collect diagnostic information and logs.
erase Erase a device's contents and settings.
get_app_container Print the path of the installed app's container
getenv Print an environment variable from a running device.
help Prints the usage for a given subcommand.
icloud_sync Trigger iCloud sync on a device.
install Install an app on a device.
install_app_data Install an xcappdata package to a device, replacing the current contents of the container.
io Set up a device IO operation.
keychain Manipulate a device's keychain
launch Launch an application by identifier on a device.
list List available devices, device types, runtimes, or device pairs.
location Control a device's simulated location
logverbose enable or disable verbose logging for a device
openurl Open a URL in a device.
pair Create a new watch and phone pair.
pair_activate Set a given pair as active.
pbcopy Copy standard input onto the device pasteboard.
pbpaste Print the contents of the device's pasteboard to standard output.
pbsync Sync the pasteboard content from one pasteboard to another.
privacy Grant, revoke, or reset privacy and permissions
push Send a simulated push notification
rename Rename a device.
runtime Perform operations on runtimes
shutdown Shutdown a device.
spawn Spawn a process by executing a given executable on a device.
status_bar Set or clear status bar overrides
terminate Terminate an application by identifier on a device.
ui Get or Set UI options
uninstall Uninstall an app from a device.
unpair Unpair a watch and phone pair.
upgrade Upgrade a device to a newer runtime.
❯ xcrun simctl help delete
Delete specified devices, unavailable devices, or all devices.
Usage: simctl delete <device> [... <device n>] | unavailable | all
Specifying unavailable will delete devices that are not supported by the current Xcode SDK.
❯ xcrun simctl list devices
== Devices ==
-- iOS 17.0 --
iPhone SE (3rd generation) (EE4D7500-5439-4D41-AD42-6028F649FA44) (Shutdown)
iPhone 15 (984F204F-2D4E-4E56-8EEE-D11C46EDD9C2) (Shutdown)
iPhone 15 Plus (C1349C55-57AC-4E47-9EF3-71A848E24A4E) (Shutdown)
iPhone 15 Pro (04DC04FF-87DB-4EB6-91D8-C8CB4CF10015) (Shutdown)
iPhone 15 Pro Max (5DC11544-4C3E-4852-8899-3D9E0844519B) (Shutdown)
iPad Air (5th generation) (906B44B3-B298-4CF1-A5FB-0B4D43277636) (Shutdown)
iPad (10th generation) (3804C1FA-6306-4CB7-98E0-D24CAFA70537) (Shutdown)
iPad mini (6th generation) (351ED4C6-2DF3-4F1F-A29A-6D44483D9A95) (Shutdown)
iPad Pro (11-inch) (4th generation) (96D48442-96AA-421A-BBA6-6F45EE8ECDBE) (Shutdown)
iPad Pro (12.9-inch) (6th generation) (0B527419-DE2A-4146-93C4-55540B624C5C) (Shutdown)
❯ xcrun simctl --set previews list devices
Using Previews Device Set: '/Users/mao/Library/Developer/Xcode/UserData/Previews/Simulator Devices'
== Devices ==
-- iOS 17.0 --
iPhone 15 Pro (676858D4-35E8-4841-91F4-17804B3E7565) (Shutdown)
覚えておくべきは、
Preview は、シュミレータ単独と別枠でシュミレータを使っている。
ということ。
Preview と シュミレーターに関連する問題は多そうです。
私の場合スッキリ対応した方法としては、以下を Xcode を一旦終了して実行。
xcrun simctl --set previews delete all
rm -rf ~/Library/Developer/Xcode/UserData/Previews
rm -rf ~/Library/Developer/CoreSimulator/Caches
👉 How to clear/reset SwiftUI Preview Caches?
Behavors に入れときますか、消した previews に関しては自動で作成されると思って良さそう。

こうしてましたが。

👉 【macOS】IDE で 矢印 (カーソルキー) を使うと キーボード ホームポジション がずれる件
⌘英かな を卒業して、Karabiner-Elements を使います。
👉 Karabiner-Elementsの本家が「英数/かな」の切り替えに対応したみたい #karabiner-Elements - Qiita
👉 「macOS カーソル強制バインディングのすすめ」の最近の様子 - ちなみに
Simple Modifications
↓
For All Devices
↓
caps_lock
↓
left_control

👉 Karabiner-Elements complex_modifications rules
Complex Modifications
↓
Add rule
↓
Import more rules from the Internet (Open a web browser)
↓
Seearch

👉 [ US ]左右のコマンドキー(⌘)を、単独で押したときは 英数・かな キー として扱う(左⌘は 英数、右⌘は かな)

👉 Ctrl+p/Ctrl+n to arrow up/down
👉 Map ctrl+b/ctrl+f to left/right arrow
設定保存先は、~/.config/karabiner/karabiner.json 。
思ったより長い。
{
"global": {
"ask_for_confirmation_before_quitting": true,
"check_for_updates_on_startup": true,
"show_in_menu_bar": true,
"show_profile_name_in_menu_bar": false,
"unsafe_ui": false
},
"profiles": [
{
"complex_modifications": {
"parameters": {
"basic.simultaneous_threshold_milliseconds": 50,
"basic.to_delayed_action_delay_milliseconds": 500,
"basic.to_if_alone_timeout_milliseconds": 1000,
"basic.to_if_held_down_threshold_milliseconds": 500,
"mouse_motion_to_scroll.speed": 100
},
"rules": [
{
"description": "[ US ]左右のコマンドキー(⌘)を、単独で押したときは 英数・かな キー として扱う(左⌘は 英数、右⌘は かな)",
"manipulators": [
{
"description": " LEFT COMMAND → EISUU ",
"from": {
"key_code": "left_command",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_command"
}
],
"to_if_alone": [
{
"key_code": "japanese_eisuu"
}
],
"type": "basic"
},
{
"description": " RIGHT COMMAND → KANA ",
"from": {
"key_code": "right_command",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "right_command"
}
],
"to_if_alone": [
{
"key_code": "japanese_kana"
}
],
"type": "basic"
}
]
},
{
"description": "Ctrl+p/Ctrl+n to arrow up/down",
"manipulators": [
{
"from": {
"key_code": "p",
"modifiers": {
"mandatory": [
"control"
]
}
},
"to": [
{
"key_code": "up_arrow"
}
],
"type": "basic"
},
{
"from": {
"key_code": "n",
"modifiers": {
"mandatory": [
"control"
]
}
},
"to": [
{
"key_code": "down_arrow"
}
],
"type": "basic"
}
]
},
{
"description": "Map ctrl+b/ctrl+f to left/right arrow",
"manipulators": [
{
"from": {
"key_code": "b",
"modifiers": {
"mandatory": [
"control"
]
}
},
"to": [
{
"key_code": "left_arrow"
}
],
"type": "basic"
},
{
"from": {
"key_code": "f",
"modifiers": {
"mandatory": [
"control"
]
}
},
"to": [
{
"key_code": "right_arrow"
}
],
"type": "basic"
}
]
}
]
},
"devices": [
{
"disable_built_in_keyboard_if_exists": false,
"fn_function_keys": [],
"identifiers": {
"is_keyboard": true,
"is_pointing_device": false,
"product_id": 0,
"vendor_id": 0
},
"ignore": false,
"manipulate_caps_lock_led": true,
"simple_modifications": [],
"treat_as_built_in_keyboard": false
},
{
"disable_built_in_keyboard_if_exists": false,
"fn_function_keys": [],
"identifiers": {
"is_keyboard": false,
"is_pointing_device": true,
"product_id": 0,
"vendor_id": 0
},
"ignore": true,
"manipulate_caps_lock_led": false,
"simple_modifications": [],
"treat_as_built_in_keyboard": false
}
],
"fn_function_keys": [
{
"from": {
"key_code": "f1"
},
"to": [
{
"consumer_key_code": "display_brightness_decrement"
}
]
},
{
"from": {
"key_code": "f2"
},
"to": [
{
"consumer_key_code": "display_brightness_increment"
}
]
},
{
"from": {
"key_code": "f3"
},
"to": [
{
"apple_vendor_keyboard_key_code": "mission_control"
}
]
},
{
"from": {
"key_code": "f4"
},
"to": [
{
"apple_vendor_keyboard_key_code": "spotlight"
}
]
},
{
"from": {
"key_code": "f5"
},
"to": [
{
"consumer_key_code": "dictation"
}
]
},
{
"from": {
"key_code": "f6"
},
"to": [
{
"key_code": "f6"
}
]
},
{
"from": {
"key_code": "f7"
},
"to": [
{
"consumer_key_code": "rewind"
}
]
},
{
"from": {
"key_code": "f8"
},
"to": [
{
"consumer_key_code": "play_or_pause"
}
]
},
{
"from": {
"key_code": "f9"
},
"to": [
{
"consumer_key_code": "fast_forward"
}
]
},
{
"from": {
"key_code": "f10"
},
"to": [
{
"consumer_key_code": "mute"
}
]
},
{
"from": {
"key_code": "f11"
},
"to": [
{
"consumer_key_code": "volume_decrement"
}
]
},
{
"from": {
"key_code": "f12"
},
"to": [
{
"consumer_key_code": "volume_increment"
}
]
}
],
"name": "Default profile",
"parameters": {
"delay_milliseconds_before_open_device": 1000
},
"selected": true,
"simple_modifications": [
{
"from": {
"key_code": "caps_lock"
},
"to": [
{
"key_code": "left_control"
}
]
}
],
"virtual_hid_keyboard": {
"country_code": 0,
"indicate_sticky_modifier_keys_state": true,
"mouse_key_xy_scale": 100
}
}
]
}
ありがとう、⌘英かな。
しかし、Karabiner-Elements の検索見づらいな。
AppCleaner はドラッグするだけでそのアプリと関連ファイルをまとめて一括削除してくれる人気定番アプリです。
最近、アプリのアンインストール時に連続でパーミッション関連のダイアログが開くの何なのか、と。


“AppCleaner.app” would like to access data from other apps.
Keeping app data separate makes it easier to manage your privacy and security.
最終的には、完全にアンインストール出来ません。
👉 AppCleaner drag and drop not working : macapps
👉 AppCleaner で削除できません。 - Apple コミュニティ
なので、いちいち、手動で Finder から該当ファイルやディレクトリを削除していましたが。
「アプリ管理」で許可しておけば良さそうです。
設定
↓
プライバシーとセキュリティ
↓
アプリ管理

ここで、アプリをアンインストールするアプリを許可しておけばいいようです。
macOS Ventura で追加された機能のようです。
Mac で 「メモ」 を iCloud 経由で iPhone と連携しながら使っていますが。
ブラウザからフツーにコピペすると、リンクやフォントのいわゆる「書式」がついてきてうざい。
プレーンなテキストだけでいいのに。
「ペーストしてスタイルを合わせる」 てのがあるが、

まずは、キーボードショートカットが 複雑過ぎ。
または、この機能を「⌘ + V」などのキーボードショートカットに置き換える方法もあるけども。
そもそも書式ごとコピーすること自体いらなくね?
どうせ、編集していくうちに壊れていくし。
これでいいんです。高評価アプリです。

👉 Pure Paste on the Mac App Store
フツーにコピペしても書式は無視されます。
設定は、ログイン時起動 (Launch at login) と自動で書式削除 (Automatically clear formatthing) を ON にしておくだけでいいです。

ここに書いてあるように、キーボードショートカットを使うことで例外的に書式付きでもコピーもできます。
ほんと簡単でいいです、これ。
アプリごとに、自動で機能を無効化したり、

リンクだけ残したり、前後の空白は除去したりもできます。

本当に使える無料アプリです。