「OS」の版間の差分

提供:senooken JP Wiki
(App resources About app resources)
 
(同じ利用者による、間の23版が非表示)
17行目: 17行目:
  ipconfig getifaddr en0
  ipconfig getifaddr en0


== iOS ==
=== Develop ===
 
==== About ====
 
===== Version =====
 
====== Java ======
[https://senooken.jp/post/2020/05/18/4055/ Androidで使用可能なJavaのバージョン一覧 – senooken JP]
 
最初に調査結果のバージョンの対応一覧を以下に掲載する。
{| class="wikitable"
|+Android APIとJavaのバージョンの対応
!Date
!Android version
!Android API level
!Java version
|-
|2008-09-23
|1.0-1.1
|01-02
|1.4?
|-
|2009-04-27
|1.5-2.2
|03-08
|5?
|-
|2010-12-06
|2.3-4.3
|09-18
|6?
|-
|2013-10-31
|4.4-6.0
|19-23
|7
|-
|2016-08-22
|7.0-
|24-
|8
|}
Android 4.4が安定しているという話を聞くので,だいたい''APIレベル19のJava 7が使用可能''と考えてよさそうだ。
 
====== Google Play ======
[https://support.google.com/googleplay/android-developer/answer/11926878 Google Play アプリの対象 API レベルに関する要件 - Play Console ヘルプ]
 
Google Playでの公開条件がけっこうころころ変わる。
 
2025-08-31: Android 14 (APIレベル34) 以上を対象にしないと公開されない。
 
対象APIレベル (targetSdkVersion) を指定する。
 
minSdkVersionは関係ない模様。
 
==== Build ====
 
===== Could not find method jcenter() for arguments [] on repository container of type org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler. =====
Could not find method jcenter() for arguments [] on repository container of type org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler.
ビルド時にこういうエラーが出る。
 
build.gradleの内容。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply plugin: "com.github.ben-manes.versions"
apply plugin: 'kotlin'
apply plugin: 'kotlin-android-extensions'
buildscript {
    ext.kotlin_version = '1.5.21'
    repositories {
        mavenCentral()
        jcenter()
        google()
        maven {
            url '<nowiki>https://maven.fabric.io/public'</nowiki>
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.3.1'
        classpath 'com.google.gms:google-services:4.3.14'
        classpath "com.github.ben-manes:gradle-versions-plugin:0.25.0"
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "io.realm:realm-gradle-plugin:10.9.0"// Crashlytics plugin
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}
repositories {
    mavenCentral()
}
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}
compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
[https://codingtechroom.com/question/how-to-resolve-jcenter-error-gradle How to Resolve the 'Could Not Find Method jcenter() for Arguments []' Error in Gradle - CodingTechRoom]
 
jcenter()をmavenCentral()に置換するか除去すればいい。
 
===== Connection timed out: getsockopt. If you are behind an HTTP proxy, please configure the proxy settings either in IDE or Gradle. =====
[https://m32006400n.xsrv.jp/infrastructure/android-1108/ Android Studioでプロキシ設定を行う方法【初心者向けガイド】]
 
プロキシー設定の問題の模様。
 
[File]-[Settings]-[Appearance & Behavior]-[System Settings]-[HTTP Proxy]
 
* ◎ Manual proxy configuration
* Host name:
* Port number:
 
他に、gradleの設定も必要。というより、こちらが重要。
 
gradele.propertiesに以下を追加する。
      systemProp.http.proxyHost=proxy.example.com
      systemProp.http.proxyPort=8080
      systemProp.http.proxyUser=your_username
      systemProp.http.proxyPassword=your_password
      systemProp.https.proxyHost=proxy.example.com
      systemProp.https.proxyPort=8080
      systemProp.https.proxyUser=your_username
      systemProp.https.proxyPassword=your_password
httpのほうはいらないと思う。
 
===== Could not find com.github.ben-manes:gradle-versions-plugin:0.25.0. =====
buildscript.repositories内の以下の記載を削除。
        maven {
            url '<nowiki>https://maven.fabric.io/public'</nowiki>
        }
加えて、repositoriesにgradlePluginPortal()を追加。
diff --git a/build.gradle b/build.gradle
index 86baf4a..6f7bdc3 100755
--- a/build.gradle
+++ b/build.gradle
@@ -7,11 +7,8 @@ buildscript {
      ext.kotlin_version = '1.5.21'
      repositories {
          mavenCentral()
-        jcenter()
          google()
-        maven {
-            url '<nowiki>https://maven.fabric.io/public'</nowiki>
-        }
+        gradlePluginPortal()
      }
      dependencies {
 
===== Unable to load class 'org.gradle.util.WrapUtil' org.gradle.util.WrapUtil Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) =====
Unable to load class 'org.gradle.util.WrapUtil'
org.gradle.util.WrapUtil
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)
The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
Stop Gradle build processes (requires restart)
Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.
In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.
ごちゃごちゃやっている間にキャッシュが競合した模様。
 
File → Invalidate Caches... → Invalidate and Restart をクリックで解消。
 
===== Your build is currently configured to use incompatible Java 21.0.8 and Gradle 7.4. Cannot sync the project. =====
Your build is currently configured to use incompatible Java 21.0.8 and Gradle 7.4. Cannot sync the project.
We recommend upgrading to Gradle version 9.0-milestone-1.
The minimum compatible Gradle version is 8.5.
The maximum compatible Gradle JVM version is 17.
Possible solutions:
  - Upgrade to Gradle 9.0-milestone-1 and re-sync
  - Upgrade to Gradle 8.5 and re-sync
使用しているjavaとgradleのバージョンがあっていないとこの警告が出る。
 
[https://docs.gradle.org/current/userguide/compatibility.html#java Compatibility Matrix]
 
gradle 7.4発表直後のjava 18を使う。
 
Android ビルドの Java バージョン  |  Android Studio  |  Android Developers
 
[Android Studio])> [Settings] > [Build, Execution, Deployment] > [Build Tools] > [Gradle]
 
[JDKをダウンロードする] を選んで11を選ぶ。インストールにしばらく時間がかかるので、プログレスをみておく。
 
===== プロジェクトのJavaのバージョンの固定 =====
https://grok.com/share/c2hhcmQtMw%3D%3D_b63418af-e286-4d16-a192-57a5039e46d2
 
.idea/gradle.xmlにJavaのバージョン指定がある。これもVCSで管理したらいい。
 
===== Could not find io.realm:android-adapters:4.0.0. =====
FAILURE: Build completed with 7 failures.
1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:dataBindingMergeDependencyArtifactsDebug'.
> Could not resolve all files for configuration ':app:debugCompileClasspath'.
    > Could not find io.realm:android-adapters:4.0.0.
      Required by:
          project :app
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
==============================================================================
app/build.gradleを以下修正。
//    implementation 'io.realm:android-adapters:4.0.0'
 
===== superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner (in unnamed module @0x511f749a) cannot access class com.sun.tools.javac.tree.TreeScanner (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module @0x511f749a =====
Execution failed for task ':app:compileDebugJavaWithJavac'.
> superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner (in unnamed module @0x511f749a) cannot access class com.sun.tools.javac.tree.TreeScanner (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module @0x511f749a
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at <nowiki>https://help.gradle.org</nowiki>
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
See <nowiki>https://docs.gradle.org/7.4/userguide/command_line_interface.html#sec:command_line_warnings</nowiki>
Ask Gemini
ButterKnifeがjava 17+に未対応。java 11まで対応しているらしい。java 11にする。これで解決した。
 
===== SDKバージョン変更 =====
https://grok.com/share/c2hhcmQtMw%3D%3D_d3a9ac04-95f9-484e-a28a-a8e965d73e82
 
app/build.gradleでsdkのバージョンを指定する。変更したら、Sync Nowを選んで、Gradleに同期が必要。これをしないとビルドに反映されない。
 
[Run]-[Run app] が無効な時は、インストール可能な状態になっていない。
 
===== The application could not be installed. Installation failed due to: 'Error code: 'UNKNOWN', message='Unknown failure: 'cmd: Failure calling service package: Broken pipe (32)<nowiki>'''</nowiki> List of apks: [0] 'app\build\intermediates\apk\debug\app-debug.apk' =====
https://grok.com/share/c2hhcmQtMw%3D%3D_8aef266a-57f7-4bc9-a729-9c28ce71fb8a
adb kill-server
adb start-server
ADBがインストールされているか確認: Android Studioインストール時に自動で入るはずですが、コマンドが「認識されない」場合は、Android SDKのplatform-toolsフォルダをPATHに追加(例: AppData\Local\Android\Sdk\platform-tools)。
 
一旦上記コマンドでadbサーバーを再起動すると解決するかもしれない。
 
===== バージョン番号 =====
[https://developer.android.com/studio/publish/versioning?hl=ja アプリのバージョニング  |  Android Studio  |  Android Developers]
 
build.gradleのdefaultConfigのversionCode/versionNameで指定する模様。
    android {
      namespace 'com.example.testapp'
      compileSdk 33
      defaultConfig {
          applicationId "com.example.testapp"
          minSdk 24
          targetSdk 33
          versionCode 1
          versionName "1.0"
          ...
      }
      ...
    }
    ...
versionNameはユーザーに表示用。versionCodeは内部用。
 
プロジェクトによっては、app/src/main/AndroidManifest.xmlに記載した利する模様。昔やアプリ内の表示用にはこれだったのかも。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="<nowiki>http://schemas.android.com/apk/res/android</nowiki>"
    xmlns:tools="<nowiki>http://schemas.android.com/tools</nowiki>"
    android:testOnly="false"
    android:versionCode="502010"
    android:versionName="5.2.1">
```
書式は以下の通り。
- versionName: メジャー番号.マイナー番号.パッチ番号。プラットフォーム変更など大きな変更はメジャー番号、機能更新はマイナー番号、軽微な修正はパッチ番号、をそれぞれ更新。
- versionCode: 502010
  - 5: メジャー番号。2桁以上になるなら先頭に追加。
  - 02: マイナー番号。2桁。
  - 01: パッチ番号。2桁。
  - 0: 増分用番号。1桁。google play consoleでアップロードミスなどした時用。
 
===== Unsupported class file major version 65 =====
[https://qiita.com/hollage0214/items/32975aa6b115fd317672 Gradleでビルドすると'Task :resolveMainClassName FAILED'で失敗する #Java - Qiita]
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':app'.
> Could not open cp_proj generic class cache for build file 'C:\Users\20165\project\sfcc-djmob-Android\app\build.gradle' (C:\Users\20165\.gradle\caches\8.0\scripts\ep3ykkf9780jtyl1zxsvmzjzx).
    > BUG! exception in phase 'semantic analysis' in source unit '_BuildScript_' Unsupported class file major version 65
JVMのバージョンが新しすぎて、対応していないとのkと。
 
65-44で使用しているjavaのバージョンになる。
 
古いjavaを使うしかない。
 
===== Build Type 'debug' contains custom BuildConfig fields, but the feature is disabled. =====
[https://www.gesource.jp/weblog/?p=8995 「Build Type ‘debug’ contains custom BuildConfig fields」エラーの対策 – 山本隆の開発日誌]
A problem occurred configuring project ':app'.
> com.android.builder.errors.EvalIssueException: Build Type 'debug' contains custom BuildConfig fields, but the feature is disabled.
Android Gradle Plugin (AGP) 8 以降では、buildConfig機能がデフォルトで無効になっています。
 
つまり、カスタムBuildConfigフィールドを使用すると、エラーが発生します。
 
例えば、以下のように<code>build.gradle (Module: app)</code>にbuildConfigFieldを追加している場合、このエラーが発生します。
<android {
    buildTypes {
        debug {
            buildConfigField "String", "API_URL", "\"<nowiki>https://api.example.com</nowiki>\""
        }
    }
}
このエラーを解決するためには、buildConfig機能を有効にする必要があります。
<code>build.gradle (Module: app)</code>を開き、以下の設定を追加してください。
<android {
    buildFeatures {
        buildConfig true
    }
}
 
===== Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner =====
Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner (in unnamed module @0x41a82fc4) cannot access class com.sun.tools.javac.tree.TreeScanner (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module @0x41a82fc4
[https://web.archive.org/web/20230903200350/https://stackoverflow.com/questions/71257962/how-can-i-fix-this-error-with-butterknife-in-android-studio How can I fix this error with ButterKnife in Android Studio? - Stack Overflow]
 
対処方法が2種類。
 
1 JDK 11を使う。
 
2 gradle.propertiesに以下を記載。
org.gradle.jvmargs=-Xmx1920M \
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
2番目の方法がよさそう。
 
===== エラー: 定数式が必要です =====
 
* [https://qiita.com/yato_minagumo/questions/8fb60c7b77d7625ae04c [Q&A] Android studioでswitch文を使うとエラーが出る - Qiita]
* [https://teratail.com/questions/pn092j3f2d9x9t finalで定数宣言しているはずなのに定数式が必要ですとエラーが出る]
* [https://polo-web.com/2025/08/18/android-studio-switch-case-statement-cannot-be-used/ Android Studioでswitchのcase文が使えない問題 – Macな暮らし]
 
エラー: 定数式が必要です
            case R.id.btn1:
こんなビルドエラーが、gradleのバージョンを上げると発生するようになった。
 
gradle 8.0では起きなくて、8.5だと発生する。
 
resのxmlからjavaに変換する際に、以前はfinalついていたのが、途中でつかなくなったのが原因らしい。
 
caseではなく、if文で書き直せばOK。
 
===== エラー: 要素値は定数式である必要があります =====
エラー: 要素値は定数式である必要があります
    @BindView(R.id.title_view)
caseと同じタイプの気がする。
 
* [https://tech.pepabo.com/2024/04/09/delete-butter-knife/#butterknife%E5%89%8A%E9%99%A4%E3%81%AE%E8%83%8C%E6%99%AF%E3%81%A8%E6%B1%BA%E6%96%AD ButterKnifeを minne Android から完全に削除しました - Pepabo Tech Portal]
* [https://developer.android.com/topic/libraries/view-binding?hl=ja#java ビュー バインディング  |  App architecture  |  Android Developers]
 
ButterKnifeという昔リソースの紐づけに使われていたライブラリー。gradleのバージョンアップでfinalが外れたのが原因。view bindとか本体の機能に統合されているので、このタイミングでそちらに移行したほうがいい。
 
対応方針。
 
# app/build.gradleにviewbidingの設定
# idを使っているリソースxmlにlayoutタグを一番外側に追加。
# @bindviewしているところを、bindingを取得してそこからの参照に変更。
 
// ViewBindingに移行するためのXMLの変更例...
// Before
<RelativeLayout xmlns:android="<nowiki>http://schemas.android.com/apk/res/android</nowiki>"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/toolbar">
           
                // 省略...
            </RelativeLayout>
        </ScrollView>
</RelativeLayout>
// After
<layout> ← こちらを追加
    <RelativeLayout xmlns:android="<nowiki>http://schemas.android.com/apk/res/android</nowiki>"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/toolbar">
                // 省略...
            </RelativeLayout>
        </ScrollView>
    </RelativeLayout>
</layout>
 
// ViewBindingに移行するためのXMLの変更例...
// Before
public class ShippingAddressSelectorActivity extends AppCompatActivityActivity {
    private final int mMenuGroupId = 0;
    @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.activity_shipping_address_selector_list)
    RecyclerView shippingAddressesView;
    @BindView(R.id.activity_shipping_address_selector_cautions_about_ordered)
    TextView cautionsTextView;
    @BindView(R.id.activity_shipping_address_selector_progress_bar)
    View progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shipping_address_selector);
        ButterKnife.bind(this);
        toolbar.setTitle(R.string.title_select_shipping_address);
        mShippingAddressesView.setLayoutManager(new LinearLayoutManager(this));
        ShippingAddressAdapter adapter = new ShippingAddressAdapter(this);
        shippingAddressesView.setAdapter(adapter);
        cautionsTextView.setText(R.string.caution_text);
    }
}
// After
public class ShippingAddressSelectorActivity extends AppCompatActivityActivity {
    private final int mMenuGroupId = 0;
    // Binding クラスの定義
    private ActivityShippingAddressSelectorBinding binding;   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_shipping_address_selector);
        binding.toolbar.setTitle(R.string.title_select_shipping_address);
        setSupportActionBar(binding.toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
        binding.activityShippingAddressSelectorList.setLayoutManager(new LinearLayoutManager(this));   
        ShippingAddressAdapter adapter = new ShippingAddressAdapter(this);
        binding.activityShippingAddressSelectorList.setAdapter(adapter);
        binding.activityShippingAddressSelectorCautionsAboutOrdered.setText(R.string.caution_text);
    }
}
<syntaxhighlight lang="diff" line="1">
$ diff -u a.java b.java
--- a.java      2025-10-29 15:55:01.702784800 +0900
+++ b.java      2025-10-29 15:55:21.477947600 +0900
@@ -1,30 +1,25 @@
public class ShippingAddressSelectorActivity extends AppCompatActivityActivity {
    private final int mMenuGroupId = 0;
 
-    @BindView(R.id.toolbar)
-    Toolbar toolbar;
-
-    @BindView(R.id.activity_shipping_address_selector_list)
-    RecyclerView shippingAddressesView;
-
-    @BindView(R.id.activity_shipping_address_selector_cautions_about_ordered)
-    TextView cautionsTextView;
-
-    @BindView(R.id.activity_shipping_address_selector_progress_bar)
-    View progressBar;
+    // Binding クラスの定義
+    private ActivityShippingAddressSelectorBinding binding;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_shipping_address_selector);
-        ButterKnife.bind(this);
 
-        toolbar.setTitle(R.string.title_select_shipping_address);
+        binding = DataBindingUtil.setContentView(this, R.layout.activity_shipping_address_selector);
+
+        binding.toolbar.setTitle(R.string.title_select_shipping_address);
+        setSupportActionBar(binding.toolbar);
+        if (getSupportActionBar() != null) {
+            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+        }
 
-        mShippingAddressesView.setLayoutManager(new LinearLayoutManager(this));
+        binding.activityShippingAddressSelectorList.setLayoutManager(new LinearLayoutManager(this));
 
        ShippingAddressAdapter adapter = new ShippingAddressAdapter(this);
-        shippingAddressesView.setAdapter(adapter);
-        cautionsTextView.setText(R.string.caution_text);
+        binding.activityShippingAddressSelectorList.setAdapter(adapter);
+        binding.activityShippingAddressSelectorCautionsAboutOrdered.setText(R.string.caution_text);
    }
}
</syntaxhighlight>
 
やること自体はシンプル。
 
元ブログのやり方間違っている。
        binding = LayoutStageDetailViewBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
bindingはメンバー変数で持っておく必要がある。
 
onclickとか。
        binding.stageAbout.setOnClickListener((View v) -> {
            onClickContentsOpenBrowser(URLSetting.URL_STAGE_ABOUT, EventTracker.A_stage_up_lp,
                    FbAnalyticsTracker.STAGE_UP_LP);
        });
これでいい。
 
https://grok.com/share/c2hhcmQtMw%3D%3D_466b34c5-6d5a-4958-b1b7-b894a451e4cb
 
Activity以外のVewとかの場合。公式の「フラグメントでビュー バインディングを使用する」を参考にする。
binding = ContainerDpWebviewBinding.inflate(LayoutInflater.from(context), this, true);
これでinflateする。
 
fragmentの場合。
private ResultProfileBinding binding;
@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}
 
===== Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules =====
Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
    > Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10.jar -> jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21.jar -> jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
 
* [https://qiita.com/YuukiYoshida/items/37dd7cea0918fe8a03d6 【Android】JDKの依存関係でビルドエラーとなった場合の対処法 #Kotlin - Qiita]
 
app/build.gradleに追加して除外すればいいとのこと。
configurations.implementation {
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
}
結局、この方法では解決しなくて、以下の方法で解決した。
 
[https://archive.li/thZ0j java - Duplicate class in Kotlin Android - Stack Overflow]
 
app/build.gradle
dependencies {
    constraints {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
            because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
        }
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
            because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
        }
    }
}
 
===== com.android.builder.errors.EvalIssueException: compileSdkVersion is not specified. Please add it to build.gradle =====
A problem occurred configuring project ':app'.
> com.android.builder.errors.EvalIssueException: compileSdkVersion is not specified. Please add it to build.gradle
[https://stackoverflow.com/questions/50530889/gradle-sync-failed-cause-compilesdkversion-is-not-specified android - Gradle sync failed: Cause: compileSdkVersion is not specified - Stack Overflow]
 
app/build.gradleのandroid.compileSdkVersionの記載はSDK33以上では廃止予定とのこと。
  android {
    // compileSdkVersion 33 and above
    defaultConfig {
        compileSdk 33
    }
...
代わりにdefaultConfigに記載するとか。
 
===== targetSdkVersionを34から35に更新 =====
 
* [https://tech.mti.co.jp/entry/ac2025summer/0826 【Android】targetSdkVersionを34から35に更新する - エムティーアイ エンジニアリングブログ]
* [https://tech.mti.co.jp/entry/ac2025summer/0806 Android 15のEdge-to-Edge強制適用でステータスバーのUIが崩れる問題と無効化する方法【解説・設定例付き】 - エムティーアイ エンジニアリングブログ]
* [https://hanzochang.com/articles/26 Android API 35対応でデザインが崩れた!Edge-to-edge表示の対処法 | hanzochang]
* [https://qiita.com/FalconFlat/items/730128eb13afc812d4a5 targetSDK35に移行した時に気をつけたこと #Android - Qiita]
 
Android 15でEdge-to-edgeというステータスバー関係の機能がデフォルトで有効になり、レイアウトが崩れる。
 
無効化が必要。だが、android 15 (sdk 35) の機能が必要で、それのコンパイルは前提。
 
==== App resources ====
 
===== About app resources =====
[https://developer.android.com/guide/topics/resources/providing-resources?hl=ja アプリのリソースの概要  |  App architecture  |  Android Developers]
 
====== 代替リソースの指定 ======
resディレクトリーにvalues-XXみたいな形式で、代替リソースを用意できる。
 
== iOS ==
 
=== Settings ===
 
==== Keyboard ====
[Settings]-[General]-[Keyboards] が設定項目。
 
===== GPS一発切替 =====
[https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13311857568 iPhoneのショートカットについて質問です。位置情報サービス内の「システム... - Yahoo!知恵袋]
 
iPhoneのGPS設定は深い階層にあって、頻繁に切替必要なのに手間がかかる。
 
Shortcutsアプリでショートカットを作成して短縮できる。
 
[Shortcuts]-[All Shortcuts]-[+]-[Open URLs]-[Open]=[prefs:root=Privacy&path=LOCATION/SYSTEM_SERVICES]
 
これで1タップで開ける。
 
[[https://support.apple.com/ja-jp/guide/shortcuts/apd029b36d05/8.0/ios/18.0 iPhoneまたはiPadのウィジェットからショートカットを設定して実行する - Apple サポート (日本)]] を参考に、ウィジェットにしてホーム画面に配置するとどこからでも1タップで開ける。
 
===== Gboard =====
[https://reskill.nikkei.com/article/DGXZQOLM3015B0Q2A830C2000000/?page=4 スマホの日本語入力 目からウロコの楽々ワザとは? | NIKKEIリスキリング]
 
iOS版のGboardはAndroid版と異なり機能が劣る。標準キーボードを使ったほうがいいらしい。
 
===== Space =====
[https://ascii.jp/elem/000/002/006/2006200/ ASCII.jp:iPhoneで常に半角スペースを入力できるようにする方法]
 
* [ALL KEYBOARDS]-[Smart Punctuation]=On: Off推奨。
* [KANA]-[Smart Fullwidth Space]=On: =Off推奨。
 
これで常に半角スペース入力になる。
 
===== 瞬間切替 =====
[https://www.nikkei.com/article/DGXZQOLM304P70Q2A830C2000000/ iPhoneは裏ワザだらけ、英数字と記号を思い通りに入力 スマホ日本語入力再入門(3) - 日本経済新聞]
 
英語キーボードで1文字だけ数字や記号を入力したいことがある。
 
その場合、[数字切替] キーをドラッグしたまま、入力したいキーで離す。すると、数字や記号を1文字だけ入力して、英字モードに戻る。切替の手間が省けて楽。
 
===== Other =====
[https://www.nikkei.com/article/DGXZQOLM304P70Q2A830C2000000/ iPhoneは裏ワザだらけ、英数字と記号を思い通りに入力 スマホ日本語入力再入門(3) - 日本経済新聞]
 
* [ALL KEYBOARDS]-[Auto-Punctuation/自動大文字入力]=On: Off推奨。英語キーボード切替時に先頭が自動で大文字になる機能。英語圏の人なら便利だが非英語圏なら邪魔。
* [ALL KEYBOARDS]-[Auto-Correction]=On: Off推奨。一般的な綴でない場合、誤入力と判断され、変換のデフォルトが修正候補になる。
* [ENGLISH]-["." Shortcut]=On: On推奨。英語キーボードには.がない。これがオンだと、スペースのダブルタップで.を入力できる。
 
=== Network ===
 
==== テザリング ====
出典:
 
* [https://news.mynavi.jp/article/20220329-iphone_why/ iPhoneのテザリングがすぐに途切れてしまいます!? - いまさら聞けないiPhoneのなぜ | マイナビニュース]
* [https://support.apple.com/ja-jp/guide/mac-help/mchl7594e36f/14.0/mac/14.0 iPhoneまたはiPadを使ってMacをインターネットに接続する - Apple サポート (日本)]
 
無通信状態が90秒ほどしばらく続くと省電力設計のため、自動的にオフになる。これが困る。Andriodは自動オフにはならない。
 
いくつか対策がある。
 
# [Personal Hotspot] (インターネット共有) 画面の表示を維持。自動ロックも解除しておく。
# USB/Wi-FiではなくBluetooth経由にする。⇢Bluetooth接続はMontary以上で不能。


=== Settings ===
Bluetooth経由のほうが、範囲が短く、電力消費量も抑えられるので、Bluetoothがよさそう。他にはUSB接続。


==== Keyboard ====
Bluetooth接続はできなくなっているので、画面表示か通信しておくしかない。
[Settings]-[General]-[Keyboards] が設定項目。


===== GPS一発切替 =====
==== Instant Hotspot ====
[https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13311857568 iPhoneのショートカットについて質問です。位置情報サービス内の「システム... - Yahoo!知恵袋]
出典:


iPhoneのGPS設定は深い階層にあって、頻繁に切替必要なのに手間がかかる。
* [https://news.mynavi.jp/article/20230816-iphone_mac/ MacからiPhoneの電話回線を利用できる「インターネット共有」のやり方 - iPhoneユーザーのためのMacのトリセツ | マイナビニュース]
* [https://support.apple.com/ja-jp/HT209459 Instant Hotspot を使ってパスワードを入力せずにインターネット共有で接続する - Apple サポート (日本)]


Shortcutsアプリでショートカットを作成して短縮できる。
Bluetoothでのテザリングはできないものの、類似機能のInstant Hotspotで実現できるらしい。


[Shortcuts]-[All Shortcuts]-[+]-[Open URLs]-[Open]=[prefs:root=Privacy&path=LOCATION/SYSTEM_SERVICES]
いくつか条件がある。


これで1タップで開ける。
* iPhone/iPadでインターネット共有 (Personal Hotspot) 対応。
* 全デバイスで同じApple IDでiCloudにログイン。
* 全デバイスでBluetoothオン。
* Wi-Fiオン.
[Personal Hotspot]-[Allow Others to Join] をオンにしなくても自分だけ接続できるのが利点。逆にいうとこれくらい。Bluetoothをオンにしないといけないぶん、余計な通信処理が入る。使わなくていい。


[[https://support.apple.com/ja-jp/guide/shortcuts/apd029b36d05/8.0/ios/18.0 iPhoneまたはiPadのウィジェットからショートカットを設定して実行する - Apple サポート (日本)]] を参考に、ウィジェットにしてホーム画面に配置するとどこからでも1タップで開ける。
==== Bluetooth ====
出典:  


===== Gboard =====
* [https://discussionsjapan.apple.com/thread/254551558?sortBy=best MacBook Pro(M1)でBlu… - Apple コミュニティ]
[https://reskill.nikkei.com/article/DGXZQOLM3015B0Q2A830C2000000/?page=4 スマホの日本語入力 目からウロコの楽々ワザとは? | NIKKEIリスキリング]
* [https://help.airdroid.com/hc/ja/articles/1260806836369-iOS%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%A8Mac%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%92Bluetooth%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF- iOSデバイスとMacコンピュータをBluetoothで接続する方法は? – エアドロイド・サポート・センター]


iOS版のGboardはAndroid版と異なり機能が劣る。標準キーボードを使ったほうがいいらしい。
MacS v12.1 (Monterey) からiOSでのBluetooth接続が不能になった。


===== Space =====
Wi-FiかUSBで接続する。実務的には困らないはず。
[https://ascii.jp/elem/000/002/006/2006200/ ASCII.jp:iPhoneで常に半角スペースを入力できるようにする方法]


* [ALL KEYBOARDS]-[Smart Punctuation]=On: Off推奨。
==== Saving ====
* [KANA]-[Smart Fullwidth Space]=On: =Off推奨。


これで常に半角スペース入力になる。
===== 1Blocker =====
* [https://www.reddit.com/r/iphone/comments/1dh0z24/low_data_use_browser_for_iphone/ Low data use browser for iPhone : r/iphone]
* [https://note.com/kondofumikazu/n/naadf37a7145d 1Blockerで煩わしい広告とサヨナラ!快適なネットサーフィンを実現する方法|近藤史一]


===== 瞬間切替 =====
Safari向けの広告ブロッカーアプリ。他に280blockerという有料アプリがある。こちらは日本向け。1Blockerはグローバル。基本無料で追加機能は有料。
[https://www.nikkei.com/article/DGXZQOLM304P70Q2A830C2000000/ iPhoneは裏ワザだらけ、英数字と記号を思い通りに入力 スマホ日本語入力再入門(3) - 日本経済新聞]


英語キーボードで1文字だけ数字や記号を入力したいことがある。
通信を節約する方法がいくつかある。


その場合、[数字切替] キーをドラッグしたまま、入力したいキーで離す。すると、数字や記号を1文字だけ入力して、英字モードに戻る。切替の手間が省けて楽。
# Wi-Fiを使う場合、Wi-Fiのアクセスポイントごとの設定で [Low Data Mode] がある。これをオンにすると節約できる。
# SIMの場合、[Cellular Data Options]-[Low Data Mode] がある。[Low Data Mode]=onにすると、自動更新や写真の動機などのバックグラウンドタスクが停止される。
# ブラウザーのコンテンツブロッカー。例えば、1Blocker。メディアを無効にするカスタムルールで、大幅に節約できる。
## [Advanced customize]-[custom rule]-[new rule]
## .+/Block all type resource=off/


===== Other =====
<blockquote>2 番目に、Safari をコンテンツ ブロッカーと一緒に使用することをお勧めします。私は 1Blocker を使用していますが、メディアを無効にするカスタム ルールを作成して、帯域幅を大幅に節約できます。[高度なカスタマイズ]、[カスタム ルール]、[新規ルール] の順に進み、正規表現に.+(ドットとプラス記号はすべての URL に一致します) を入力し、[すべてのタイプのリソースをブロック] をオフに切り替え、画像、フォント、RAW、SVG、メディア、ポップアップをオンに戻します。保存します。これにより、これらの特定のリソース タイプをすべて読み込む要求がグローバルにブロックされ、帯域幅を大幅に節約できます。</blockquote>カスタムルールのメディア無効の効果が大きい。
[https://www.nikkei.com/article/DGXZQOLM304P70Q2A830C2000000/ iPhoneは裏ワザだらけ、英数字と記号を思い通りに入力 スマホ日本語入力再入門(3) - 日本経済新聞]


* [ALL KEYBOARDS]-[Auto-Punctuation/自動大文字入力]=On: Off推奨。英語キーボード切替時に先頭が自動で大文字になる機能。英語圏の人なら便利だが非英語圏なら邪魔。
280blockerが日本の広告に一番詳しい。こちらで広告元ドメインのリストを配布しているようで、これを取り込むとほぼ広告をブロックできるらしい。
* [ALL KEYBOARDS]-[Auto-Correction]=On: Off推奨。一般的な綴でない場合、誤入力と判断され、変換のデフォルトが修正候補になる。
* [ENGLISH]-["." Shortcut]=On: On推奨。英語キーボードには.がない。これがオンだと、スペースのダブルタップで.を入力できる。


=== Network ===
iPhoneで以下のURLの年月の部分を現在にしてダウンロードする。


==== テザリング ====
https://280blocker.net/files/280blocker_1blocker_202310.1blockpkg
出典:


* [https://news.mynavi.jp/article/20220329-iphone_why/ iPhoneのテザリングがすぐに途切れてしまいます!? - いまさら聞けないiPhoneのなぜ | マイナビニュース]
[https://x.com/280blocker/status/1881856052351954949 Xユーザーの280blockerさん: 「弊社にて提供中の1blocker用ファイルについてブログに記載いたしました。」 / X]
* [https://support.apple.com/ja-jp/guide/mac-help/mchl7594e36f/14.0/mac/14.0 iPhoneまたはiPadを使ってMacをインターネットに接続する - Apple サポート (日本)]


無通信状態が90秒ほどしばらく続くと省電力設計のため、自動的にオフになる。これが困る。Andriodは自動オフにはならない。
ただ、1blockerが6.xにバージョンアップして、定義ファイルに更新が入って互換性がなくなった模様。


いくつか対策がある。
280blockerは元々1blockerの5chのスレッドで280番目にレスしたことが始まりだとか。2021年からトビラシステムズに3億円くらいで買収されたらしい。


# [Personal Hotspot] (インターネット共有) 画面の表示を維持。自動ロックも解除しておく。
===== AdGuard =====
# USB/Wi-FiではなくBluetooth経由にする。⇢Bluetooth接続はMontary以上で不能。


Bluetooth経由のほうが、範囲が短く、電力消費量も抑えられるので、Bluetoothがよさそう。他にはUSB接続。
* [https://x.com/ichitaso2/status/1850343437369012290 Xユーザーのいちご🍓₣ƦEEÐØMさん: 「ちなみに、iPhone向けの広告ブロックアプリ280blockerは、もともと5chの1blockerスレで280番目にレスしてフィルターを公開してた人が作ったものだが、トビラシステムズに3億7700万円で買収されている。利害関係なのか広告は貫通するようになったのでAdGuardを個人的に使ってる https://t.co/XEsmTosyq6」 / X]
* [https://www.patreon.com/posts/101221812 【iPhone】 AdGuardを使って無料で広告をブロックする | Patreon]


Bluetooth接続はできなくなっているので、画面表示か通信しておくしかない。
こちらの手順に従ってAdGuardを試す。AdGuardアプリ-[Settings]-[Support]-[Watch video tutorial] をやればよさそう。


==== Instant Hotspot ====
# AdGuardをインストール。
出典:
# [Settings]-[Apps]-[Safari]-[General]-[Extensions]
# AdGuardで始まるスイッチを全部オンにする。
# Safariを開く。
# アドレスバーの左の[aA]など-[Manage Extensions]-AdGuardをオン。
# アドレスバーの左の[aA]など-[AdGuard]-[Always Allow]-[Always Allow on Every Website]


* [https://news.mynavi.jp/article/20230816-iphone_mac/ MacからiPhoneの電話回線を利用できる「インターネット共有」のやり方 - iPhoneユーザーのためのMacのトリセツ | マイナビニュース]
[https://qiita.com/loach/items/950ce46f5e3ab946803a AdGuard DNSで広告除去 #広告ブロック - Qiita]
* [https://support.apple.com/ja-jp/HT209459 Instant Hotspot を使ってパスワードを入力せずにインターネット共有で接続する - Apple サポート (日本)]


Bluetoothでのテザリングはできないものの、類似機能のInstant Hotspotで実現できるらしい。
アプリの他にDNSもある。これを設定するとSafari以外も埋込広告以外をブロックできる。


いくつか条件がある。
「[https://adguard-dns.io/ja/public-dns.html パブリックAdGuard DNSサーバーに接続する方法 | AdGuard DNS]」に手順がある。これのOption2: Configure AdGuard DNS manuallyをやる。


* iPhone/iPadでインターネット共有 (Personal Hotspot) 対応。
# AdGuardのDNSプロファイルをダウンロード
* 全デバイスで同じApple IDでiCloudにログイン。
# [Settings]-[General]-[VPN & Device Management]-[Downloaded profile]-[AdGuard DoH]-[Install] を選ぶ。
* 全デバイスでBluetoothオン。
* Wi-Fiオン.
[Personal Hotspot]-[Allow Others to Join] をオンにしなくても自分だけ接続できるのが利点。逆にいうとこれくらい。Bluetoothをオンにしないといけないぶん、余計な通信処理が入る。使わなくていい。


==== Bluetooth ====
これでWebベースの広告はだいたいブロックされて、動作が軽くなるらしい。
出典:


* [https://discussionsjapan.apple.com/thread/254551558?sortBy=best MacBook Pro(M1)でBlu… - Apple コミュニティ]
===== Safari =====
* [https://help.airdroid.com/hc/ja/articles/1260806836369-iOS%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%A8Mac%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%92Bluetooth%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF- iOSデバイスとMacコンピュータをBluetoothで接続する方法は? – エアドロイド・サポート・センター]
[https://digital-style.jp/a-speed-limit iPhoneの通信量を劇的に節約するコツ10選【ギガ不足を解消】 | デジスタ]


MacS v12.1 (Monterey) からiOSでのBluetooth接続が不能になった。
Safariの設定が重要。


Wi-FiかUSBで接続する。実務的には困らないはず。
[Settings]-[Apps]-[Safari]


==== Saving ====
[Preload Top Hit/トップヒットを事前に読み込む]: これをオフにする。検索時にブックマークから訪問候補を挙げてくれて、さらにバックグラウンドで読み込みも開始する。


===== 1Blocker =====
=== Sound ===
* [https://www.reddit.com/r/iphone/comments/1dh0z24/low_data_use_browser_for_iphone/ Low data use browser for iPhone : r/iphone]
出典: [https://support.apple.com/ja-jp/guide/iphone/iphb71f9b54d/ios iPhoneの音量を調整する - Apple サポート (日本)]
* [https://note.com/kondofumikazu/n/naadf37a7145d 1Blockerで煩わしい広告とサヨナラ!快適なネットサーフィンを実現する方法|近藤史一]


Safari向けの広告ブロッカーアプリ。他に280blockerという有料アプリがある。こちらは日本向け。1Blockerはグローバル。基本無料で追加機能は有料。
音量は左サイドボタンで上下できる。左上のスイッチがマナーモードの切替になっている。消音モードと呼んでいる。


通信を節約する方法がいくつかある。
=== Mail ===


# Wi-Fiを使う場合、Wi-Fiのアクセスポイントごとの設定で [Low Data Mode] がある。これをオンにすると節約できる。
==== 複数アカウント ====
# SIMの場合、[Cellular Data Options]-[Low Data Mode] がある。[Low Data Mode]=onにすると、自動更新や写真の動機などのバックグラウンドタスクが停止される。
[https://xtech.nikkei.com/atcl/nxt/column/18/00088/00082/ 複数アカウントを使いこなす、iPhoneメールアプリの知られざる便利機能 | 日経クロステック(xTECH)]
# ブラウザーのコンテンツブロッカー。例えば、1Blocker。メディアを無効にするカスタムルールで、大幅に節約できる。
 
## [Advanced customize]-[custom rule]-[new rule]
iPhoneのメールアプリは標準のMailを使うのがよいだろう。K-9がないから。複数アカウントにも対応しているが、設定が若干特殊。アプリ設定からではなく、iOS本体の設定から行う。
## .+/Block all type resource=off/


<blockquote>2 番目に、Safari をコンテンツ ブロッカーと一緒に使用することをお勧めします。私は 1Blocker を使用していますが、メディアを無効にするカスタム ルールを作成して、帯域幅を大幅に節約できます。[高度なカスタマイズ]、[カスタム ルール]、[新規ルール] の順に進み、正規表現に.+(ドットとプラス記号はすべての URL に一致します) を入力し、[すべてのタイプのリソースをブロック] をオフに切り替え、画像、フォント、RAW、SVG、メディア、ポップアップをオンに戻します。保存します。これにより、これらの特定のリソース タイプをすべて読み込む要求がグローバルにブロックされ、帯域幅を大幅に節約できます。</blockquote>カスタムルールのメディア無効の効果が大きい。
==== This message is from a sender in your blocked list. ====
自分宛へのメールが、なぜかブロックリストに登録されていて、iOSのMailアプリで開くと自動でTrashに移動されてしまう。必要なメールもごみ箱に強制的に入ってしまい、困る。


280blockerが日本の広告に一番詳しい。こちらで広告元ドメインのリストを配布しているようで、これを取り込むとほぼ広告をブロックできるらしい。
[This message is from a sender in your blocked list.] の警告が表示されている。


iPhoneで以下のURLの年月の部分を現在にしてダウンロードする。
「[https://discussions.apple.com/thread/254871784?sortBy=rank All sent messages marked blocked sender - Apple Community]」で同じ議論がある。


https://280blocker.net/files/280blocker_1blocker_202310.1blockpkg
上記警告文の [Settings] からMailアプリの設定で [Blocked Sender Options] や [Blocked] にブロックリストがあるので、これを解除するといいらしい。


[https://x.com/280blocker/status/1881856052351954949 Xユーザーの280blockerさん: 「弊社にて提供中の1blocker用ファイルについてブログに記載いたしました。」 / X]
電話の受信拒否をすると、同じアドレスがこちらに入る模様。


ただ、1blockerが6.xにバージョンアップして、定義ファイルに更新が入って互換性がなくなった模様。
[Blocked Sender Options] を [Move to Trash] から [Leave in Inbox] にするだけでもいいかもしれない。


280blockerは元々1blockerの5chのスレッドで280番目にレスしたことが始まりだとか。2021年からトビラシステムズに3億円くらいで買収されたらしい。
ただ、特にブロックした覚えのないメールが勝手に登録されていたので、注意が必要。


===== AdGuard =====
=== App ===
いくつか必要なアプリがあるので整理する。


* [https://x.com/ichitaso2/status/1850343437369012290 Xユーザーのいちご🍓₣ƦEEÐØMさん: 「ちなみに、iPhone向けの広告ブロックアプリ280blockerは、もともと5chの1blockerスレで280番目にレスしてフィルターを公開してた人が作ったものだが、トビラシステムズに3億7700万円で買収されている。利害関係なのか広告は貫通するようになったのでAdGuardを個人的に使ってる https://t.co/XEsmTosyq6」 / X]
==== Switcher ====
* [https://www.patreon.com/posts/101221812 【iPhone】 AdGuardを使って無料で広告をブロックする | Patreon]
出典: [https://support.apple.com/ja-jp/guide/iphone/iph1a1f981ad/ios iPhoneで開いているアプリを切り替える - Apple サポート (日本)]


こちらの手順に従ってAdGuardを試す。AdGuardアプリ-[Settings]-[Support]-[Watch video tutorial] をやればよさそう。
アプリスイッチャーという機能で、現在実行中のアプリを変更可能。Androidはホームの上スワイプ、右ボタンだった。iOSはホームのダブルクリック。


# AdGuardをインストール。
==== KeePass ====
# [Settings]-[Apps]-[Safari]-[General]-[Extensions]
パスワード管理アプリ。iOSは別になる。KeePass XCはQtを使っているからビルドできるはずなんだけど。
# AdGuardで始まるスイッチを全部オンにする。
# Safariを開く。
# アドレスバーの左の[aA]など-[Manage Extensions]-AdGuardをオン。
# アドレスバーの左の[aA]など-[AdGuard]-[Always Allow]-[Always Allow on Every Website]


[https://qiita.com/loach/items/950ce46f5e3ab946803a AdGuard DNSで広告除去 #広告ブロック - Qiita]
[https://www.labohyt.net/blog/apple/post-5079 iOS 向けの Keepass クライアントの備忘録 | hyt adversaria]」を見る限り、KeePassiumが良さそう。


アプリの他にDNSもある。これを設定するとSafari以外も埋込広告以外をブロックできる。
==== Camera/Video ====


[https://adguard-dns.io/ja/public-dns.html パブリックAdGuard DNSサーバーに接続する方法 | AdGuard DNS]」に手順がある。これのOption2: Configure AdGuard DNS manuallyをやる。
===== Camera =====
出典: [https://blog.daletto.net/iphone%E3%81%AE%E3%82%AB%E3%83%A1%E3%83%A9%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E5%86%99%E7%9C%9F-%E5%8B%95%E7%94%BB%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%BB%BD%E3%81%8F/ iPhoneのカメラ解像度を変更し写真/動画サイズを軽くする便利技 – 格安SIM初心者教室]


# AdGuardのDNSプロファイルをダウンロード
iPhoneのデフォルトのカメラは解像度が高すぎて写真のファイルサイズがかなり大きい。変更できない。せいぜいインカメラで撮影するくらい。
# [Settings]-[General]-[VPN & Device Management]-[Downloaded profile]-[AdGuard DoH]-[Install] を選ぶ。


これでWebベースの広告はだいたいブロックされて、動作が軽くなるらしい。
LINE Cameraが定番のカメラアプリらしい。こちらは解像度を柔軟に設定できる。


===== Safari =====
[Settings]-[Saving]-[Resolution]-[Medium] に変更。これでデフォルトの半分になる。
[https://digital-style.jp/a-speed-limit iPhoneの通信量を劇的に節約するコツ10選【ギガ不足を解消】 | デジスタ]


Safariの設定が重要。
「[https://blog.daletto.net/iphone%E3%81%AE%E3%82%AB%E3%83%A1%E3%83%A9%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E5%86%99%E7%9C%9F-%E5%8B%95%E7%94%BB%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%BB%BD%E3%81%8F/ iPhoneのカメラ解像度を変更し写真/動画サイズを軽くする便利技 – 格安SIM初心者教室]」はもっと小さい。こちらがいいだろう。


[Settings]-[Apps]-[Safari]
Low Cameraはもっと小さいが、小さすぎて細かい文字が見えなくて困る。調べた。


[Preload Top Hit/トップヒットを事前に読み込む]: これをオフにする。検索時にブックマークから訪問候補を挙げてくれて、さらにバックグラウンドで読み込みも開始する。
[https://good-apps.jp/media/column/7434 2024|無音カメラアプリおすすめランキング11選|無料|高画質 | Good!Apps]」が参考になった。


=== Sound ===
Simple Camがよかった。基本はこの1.2MPか0.3MP。外観だけでいいならLowCameraとか。
出典: [https://support.apple.com/ja-jp/guide/iphone/iphb71f9b54d/ios iPhoneの音量を調整する - Apple サポート (日本)]。
{| class="wikitable"
 
|rank
音量は左サイドボタンで上下できる。左上のスイッチがマナーモードの切替になっている。消音モードと呼んでいる。
|OS
 
|name
=== Mail ===
|url
 
|Free
==== 複数アカウント ====
|level
「[https://xtech.nikkei.com/atcl/nxt/column/18/00088/00082/ 複数アカウントを使いこなす、iPhoneメールアプリの知られざる便利機能 | 日経クロステック(xTECH)]」
|MP
 
|resolution px
iPhoneのメールアプリは標準のMailを使うのがよいだろう。K-9がないから。複数アカウントにも対応しているが、設定が若干特殊。アプリ設定からではなく、iOS本体の設定から行う。
|size KB
 
|square
==== This message is from a sender in your blocked list. ====
|備考
自分宛へのメールが、なぜかブロックリストに登録されていて、iOSのMailアプリで開くと自動でTrashに移動されてしまう。必要なメールもごみ箱に強制的に入ってしまい、困る。
|-
 
|4
[This message is from a sender in your blocked list.] の警告が表示されている。
|iOS
 
|LowCamera
「[https://discussions.apple.com/thread/254871784?sortBy=rank All sent messages marked blocked sender - Apple Community]」で同じ議論がある。
|
 
|
上記警告文の [Settings] からMailアプリの設定で [Blocked Sender Options] や [Blocked] にブロックリストがあるので、これを解除するといいらしい。
|Very Low
 
|0.05
電話の受信拒否をすると、同じアドレスがこちらに入る模様。
|144x144
 
|25
[Blocked Sender Options] を [Move to Trash] から [Leave in Inbox] にするだけでもいいかもしれない。
|x
 
|
ただ、特にブロックした覚えのないメールが勝手に登録されていたので、注意が必要。
|-
 
|4
=== App ===
|iOS
いくつか必要なアプリがあるので整理する。
|LowCamera
 
|
==== Switcher ====
|
出典: [https://support.apple.com/ja-jp/guide/iphone/iph1a1f981ad/ios iPhoneで開いているアプリを切り替える - Apple サポート (日本)]。
|Low
 
|0.1
アプリスイッチャーという機能で、現在実行中のアプリを変更可能。Androidはホームの上スワイプ、右ボタンだった。iOSはホームのダブルクリック。
|360x360
 
|50
==== KeePass ====
|x
パスワード管理アプリ。iOSは別になる。KeePass XCはQtを使っているからビルドできるはずなんだけど。
|
 
|-
「[https://www.labohyt.net/blog/apple/post-5079 iOS 向けの Keepass クライアントの備忘録 | hyt adversaria]」を見る限り、KeePassiumが良さそう。
|4
 
|iOS
==== Camera/Video ====
|LowCamera
 
|
===== Camera =====
|
出典: [https://blog.daletto.net/iphone%E3%81%AE%E3%82%AB%E3%83%A1%E3%83%A9%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E5%86%99%E7%9C%9F-%E5%8B%95%E7%94%BB%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%BB%BD%E3%81%8F/ iPhoneのカメラ解像度を変更し写真/動画サイズを軽くする便利技 – 格安SIM初心者教室]
|Medium
 
|0.2
iPhoneのデフォルトのカメラは解像度が高すぎて写真のファイルサイズがかなり大きい。変更できない。せいぜいインカメラで撮影するくらい。
|480x480
 
|100
LINE Cameraが定番のカメラアプリらしい。こちらは解像度を柔軟に設定できる。
|x
 
|画質が低すぎる。
[Settings]-[Saving]-[Resolution]-[Medium] に変更。これでデフォルトの半分になる。
|-
 
|4
「[https://blog.daletto.net/iphone%E3%81%AE%E3%82%AB%E3%83%A1%E3%83%A9%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E5%86%99%E7%9C%9F-%E5%8B%95%E7%94%BB%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%BB%BD%E3%81%8F/ iPhoneのカメラ解像度を変更し写真/動画サイズを軽くする便利技 – 格安SIM初心者教室]」はもっと小さい。こちらがいいだろう。
 
Low Cameraはもっと小さいが、小さすぎて細かい文字が見えなくて困る。調べた。
 
「[https://good-apps.jp/media/column/7434 2024|無音カメラアプリおすすめランキング11選|無料|高画質 | Good!Apps]」が参考になった。
 
Simple Camがよかった。基本はこの1.2MPか0.3MP。外観だけでいいならLowCameraとか。
{| class="wikitable"
|rank
|OS
|name
|url
|Free
|level
|MP
|resolution px
|size KB
|square
|備考
|-
|4
|iOS
|iOS
|LowCamera
|LINE Camera
|
|
|
|
|Very Low
|Medium
|0.05
|2
|144x144
|1512x1512
|25
|1024
|x
|x
|
|画質をもう少し落としたい。
|-
|-
|4
|2
|iOS
|iOS
|LowCamera
|低画質カメラ
|
|
|
|
|
|
|
|Low
|0.1
|360x360
|50
|x
|
|
| -
|動画のみ。
|-
|-
|4
|3
|iOS
|iOS
|LowCamera
|0.3MPCamera
|
|
|Medium
|0.2
|480x480
|100
|x
|画質が低すぎる。
|-
|4
|iOS
|LINE Camera
|
|
|Medium
|2
|1512x1512
|1024
|x
|画質をもう少し落としたい。
|-
|2
|iOS
|低画質カメラ
|
|
|
|
|
|
| -
|動画のみ。
|-
|3
|iOS
|0.3MPCamera
|
|
|
|
2,100行目: 2,741行目:
* [https://senooken.jp/post/2020/10/24/4684/ UNIX系OSのパッケージの検索サイト「pkgs.org」 – senooken JP]
* [https://senooken.jp/post/2020/10/24/4684/ UNIX系OSのパッケージの検索サイト「pkgs.org」 – senooken JP]
* [https://pkgs.org/ Packages for Linux and Unix - pkgs.org]
* [https://pkgs.org/ Packages for Linux and Unix - pkgs.org]
===== Debian =====
[https://www.debian.org/distrib/archive Debian -- ディストリビューションアーカイブ]
* http://deb.debian.org/debian
* http://security.debian.org/debian-security
* http://archive.debian.org/debian/


===== Ubuntu =====
===== Ubuntu =====
2,162行目: 2,810行目:
[https://senooken.jp/post/2020/05/15/4051/ Debian系パッケージマネージャーAPTの使用方法 – senooken JP]
[https://senooken.jp/post/2020/05/15/4051/ Debian系パッケージマネージャーAPTの使用方法 – senooken JP]


===== リポジトリー =====
{| class="wikitable"
 
|+コマンド一覧
* [https://manpages.debian.org/buster/apt/sources.list.5.en.html sources.list(5) — apt — Debian buster — Debian Manpages]
!目的
!コマンド
|-
|情報
|<code>apt show <package></code>
|-
|利用可能バージョンの確認
|<code>apt show -a <package></code><code>apt list --all-versions <package></code>
|-
|検索
|<code>apt search <regex></code>
|-
|インストール
|<code>sudo apt install <package></code><code>sudo apt reinstall <package></code><code>sudo apt builde-dep <package></code>
|-
|更新
|<code>sudo apt update</code><code>sudo apt upgrade</code><code>sudo apt full-upgrade</code><code>sudo apt install <package></code>
|-
|削除
|<code>sudo apt remove <package></code><code>sudo apt purge <package></code><code>sudo apt autoremove</code><code>sudo apt clean</code><code>sudo apt autoclean</code>
|-
|インストール済みパッケージの確認
|<code>apt list --installed</code><code><nowiki>dpkg -l | grep '^.i'</nowiki></code><code>apt-mark showmanual</code><code>apt-mark showauto</code>
|-
|パッケージ中身の一覧
|<code>dpkg -L <package></code>
|-
|ファイルの該当パッケージの確認
|<code>dpkg -S <file></code>
|-
|依存関係の確認
|<code><nowiki>apt show <package> | grep Depends</nowiki></code><code>apt depends <package></code><code>apt rdepends <package></code>
|-
|パッケージの自動・手動フラグの指定
|<code>apt-mark auto <package></code><code>apt-mark manual <package></code>
|-
|パッケージのhold
|<code>apt-mark hold <package></code><code>apt-mark unhold <package></code><code>apt-mark showhold</code>
|-
|リポジトリーの追加・削除・編集
|<code>sudo add-apt-repository <repository></code><code>sudo add-apt-repository -r <repository></code><code>sudo apt edit-sources</code>
|-
|パッケージの操作履歴の確認
|<code>cat /var/log/apt/history.log</code>
|}
===== リポジトリー =====
 
* [https://manpages.debian.org/buster/apt/sources.list.5.en.html sources.list(5) — apt — Debian buster — Debian Manpages]
* [https://manpages.debian.org/buster/software-properties-common/add-apt-repository.1.en.html add-apt-repository(1) — software-properties-common — Debian buster — Debian Manpages]
* [https://manpages.debian.org/buster/software-properties-common/add-apt-repository.1.en.html add-apt-repository(1) — software-properties-common — Debian buster — Debian Manpages]
* [https://manpages.debian.org/buster/apt/apt.8.en.html apt(8) — apt — Debian buster — Debian Manpages]
* [https://manpages.debian.org/buster/apt/apt.8.en.html apt(8) — apt — Debian buster — Debian Manpages]
2,222行目: 2,917行目:
* suite:
* suite:
** <name>: コードネーム。メインパッケージ。
** <name>: コードネーム。メインパッケージ。
** <name>-security: たぶん保安関係。文書に記載なし。
** <name>-updates: 主なバグ修正更新。
** <name>-updates: 主なバグ修正更新。
** <name>-backports: テストされていない最新更新。
** <name>-backports: テストされていない最新更新。
** <name>-security: たぶん保安関係。文書に記載なし。
* component: main, contrib, non-free, non-free-firmware
* component: main, contrib, non-free, non-free-firmware
** restricted: 不自由ソフト。
** restricted: 不自由ソフト。
** universe: コミュニティー保守パッケージ。
** universe: コミュニティー保守パッケージ。
** multiverse: コミュニティ保守不自由ソフト。
** multiverse: コミュニティ保守不自由ソフト。
 
 
  deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] <nowiki>http://deb.debian.org/debian</nowiki> trixie main contrib non-free non-free-firmware
  deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] <nowiki>http://deb.debian.org/debian</nowiki> trixie main contrib non-free non-free-firmware
  deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] <nowiki>http://deb.debian.org/debian</nowiki> trixie-updates main contrib non-free non-free-firmware
  deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] <nowiki>http://deb.debian.org/debian</nowiki> trixie-updates main contrib non-free non-free-firmware
  deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] <nowiki>http://deb.debian.org/debian-security</nowiki> trixie-security main contrib non-free non-free-firmware
  deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] <nowiki>http://deb.debian.org/debian-security</nowiki> trixie-security main contrib non-free non-free-firmware
 
 
  Types: deb
  Types: deb
  URIs: <nowiki>http://deb.debian.org/debian</nowiki>
  URIs: <nowiki>http://deb.debian.org/debian</nowiki>
  Suites: trixie trixie-updates
  Suites: trixie trixie-updates
  Components: main contrib non-free non-free-firmware
  Components: main contrib non-free non-free-firmware
  Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
  Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
  Types: deb
  Types: deb
  URIs: <nowiki>http://deb.debian.org/debian-security</nowiki>
  URIs: <nowiki>http://deb.debian.org/debian-security</nowiki>
  Suites: trixie-security
  Suites: trixie-security
  Components: main contrib non-free non-free-firmware
  Components: main contrib non-free non-free-firmware
  Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
  Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
 
 
====== add-apt-repository ======
====== add-apt-repository ======
[https://manpages.debian.org/buster/software-properties-common/add-apt-repository.1.en.html add-apt-repository(1) — software-properties-common — Debian buster — Debian Manpages]
[https://manpages.debian.org/buster/software-properties-common/add-apt-repository.1.en.html add-apt-repository(1) — software-properties-common — Debian buster — Debian Manpages]
  add-apt-repository [OPTIONS] REPOSITORY
  add-apt-repository [OPTIONS] REPOSITORY
3種類の記法が許容されている。
3種類の記法が許容されている。
 
 
# sources.listのdeb行
# sources.listのdeb行
# ppa:<user>/<ppa-name>
# ppa:<user>/<ppa-name>
# distoribution component指定
# distoribution component指定
 
https://grok.com/share/c2hhcmQtMw%3D%3D_16ab69f8-fae4-46b8-9f20-81a98ec20376
CODENAME=$(lsb_release -sc)
sudo add-apt-repository "deb <nowiki>http://old-releases.ubuntu.com/ubuntu</nowiki> $CODENAME main universe multiverse" -y && \
sudo add-apt-repository "deb <nowiki>http://old-releases.ubuntu.com/ubuntu</nowiki> $CODENAME-updates main universe multiverse" -y && \
sudo add-apt-repository "deb <nowiki>http://old-releases.ubuntu.com/ubuntu</nowiki> $CODENAME-security main universe multiverse" -y
Ubuntuなら上記で古いパッケージも取れる。
 
dockerで使う場合、lsb_releaseやadd-apt-repositoryはコマンドがそもそもないので、使わない方法での対応が必要。
# RUN sh -c '\
#    CODENAME=$(sed -n "/^VERSION_CODENAME/s/^.*=//p" /etc/os-release) && \
#    echo "deb <nowiki>http://archive.debian.org/debian-security</nowiki> $CODENAME main" >>/etc/apt/sources.list && \
#    echo "deb <nowiki>http://archive.debian.org/debian-security</nowiki> $CODENAME-security main  " >>/etc/apt/sources.list && \
#    echo "deb <nowiki>http://archive.debian.org/debian-security</nowiki> $CODENAME-updates main  " >>/etc/apt/sources.list'
 
RUN sed -i 's|<nowiki>http://deb.debian.org/debian|http://archive.debian.org/debian|g'</nowiki> /etc/apt/sources.list && \
    sed -i 's|<nowiki>http://security.debian.org/debian-security|http://archive.debian.org/debian-security|g'</nowiki> /etc/apt/sources.list && \
 
====== GPG error ======
https://grok.com/share/c2hhcmQtMw%3D%3D_4925c047-4ca3-4612-a86a-93085596ac62
 
[https://qiita.com/hikaruna/items/1c455bbf122871fce7ae Debian apt update GPG error #Docker - Qiita]
 
FROM php:7.0.33-apacheなど古めのphp+apcheを使うとDebianも古くてapt updateがうまくいかない。
0.560 Get:4 <nowiki>http://archive.debian.org/debian</nowiki> stretch Release [118 kB]
0.819 Err:5 <nowiki>http://archive.debian.org/debian</nowiki> stretch-updates Release
0.819  404  Not Found [IP: 10.0.0.28 8080]
0.831 Get:6 <nowiki>http://archive.debian.org/debian</nowiki> stretch Release.gpg [3177 B]
0.898 Ign:6 <nowiki>http://archive.debian.org/debian</nowiki> stretch Release.gpg
0.900 Reading package lists...
0.905 W: GPG error: <nowiki>http://archive.debian.org/debian-security</nowiki> stretch/updates InRelease: The following signatures were invalid: EXPKEYSIG AA8E81B4331F7F50 Debian Security Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 112695A0E562B32A
0.905 E: The repository '<nowiki>http://archive.debian.org/debian-security</nowiki> stretch/updates InRelease' is not signed.
0.905 E: The repository '<nowiki>http://archive.debian.org/debian</nowiki> stretch-updates Release' does not have a Release file.
0.905 W: GPG error: <nowiki>http://archive.debian.org/debian</nowiki> stretch Release: The following signatures were invalid: EXPKEYSIG 04EE7237B7D453EC Debian Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> EXPKEYSIG EF0F382A1A7B6500 Debian Stable Release Key (9/stretch) <debian-release@lists.debian.org> The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY 0E98404D386FA1D9
0.905 E: The repository '<nowiki>http://archive.debian.org/debian</nowiki> stretch Release' is not signed.
gpg errorがでている。これはまずい。
 
[https://qiita.com/hikaruna/items/1c455bbf122871fce7ae Debian apt update GPG error #Docker - Qiita]
FROM php:7.0.33-apache
RUN sed -i 's|deb.debian.org/debian|archive.debian.org/debian|g' /etc/apt/sources.list && \
    sed -i 's|security.debian.org/debian-security|archive.debian.org/debian-security|g' /etc/apt/sources.list
RUN apt-get update \
    ; apt-get install -y --allow-unauthenticated debian-archive-keyring
RUN apt update ; apt install -y unzip
こんな感じでリポジトリーを古いものにして、鍵をインストールしたら解決した。意味がよくわからない。
 
いや、単にこれでもいけた。
FROM php:7.0.33-apache
RUN sed -i -e 's|deb.debian.org/|archive.debian.org/|g' \
    -e 's|security.debian.org/|archive.debian.org/|g' /etc/apt/sources.list
RUN apt-get update ; apt-get install -y --allow-unauthenticated unzip


https://grok.com/share/c2hhcmQtMw%3D%3D_16ab69f8-fae4-46b8-9f20-81a98ec20376
  FROM php:7.4.33-apache
  CODENAME=$(lsb_release -sc)
  RUN apt update ; apt install -y unzip
sudo add-apt-repository "deb <nowiki>http://old-releases.ubuntu.com/ubuntu</nowiki> $CODENAME main universe multiverse" -y && \
  sudo add-apt-repository "deb <nowiki>http://old-releases.ubuntu.com/ubuntu</nowiki> $CODENAME-updates main universe multiverse" -y && \
sudo add-apt-repository "deb <nowiki>http://old-releases.ubuntu.com/ubuntu</nowiki> $CODENAME-security main universe multiverse" -y
Ubuntuなら上記で古いパッケージも取れる。
[[Category:IT]]
[[Category:IT]]

2025年10月30日 (木) 11:21時点における最新版

パソコンのOSごとの記録。

Android

古い端末でのSSLエラー

古いAndroidスマホで2021年9月以降、一部サイトが閲覧不能に - PC Watch

2021年9月以降に、Let's Encryptの方針変更でhttpsのサイトが昔のWebブラウザーだと開けないらしい。

ただし、Firefoxは証明書を独自にしているから問題ない。Firefoxを使えば開ける。

https://chatgpt.com/share/68101902-3ebc-800b-858d-30adbf3789f0

python3 -m http.server

これでHTTPサーバーを立てて、http://ip:8000でHTTP経由でファイル転送できる。

macのIPは以下で確認できる。

ipconfig getifaddr en0

Develop

About

Version
Java

Androidで使用可能なJavaのバージョン一覧 – senooken JP

最初に調査結果のバージョンの対応一覧を以下に掲載する。

Android APIとJavaのバージョンの対応
Date Android version Android API level Java version
2008-09-23 1.0-1.1 01-02 1.4?
2009-04-27 1.5-2.2 03-08 5?
2010-12-06 2.3-4.3 09-18 6?
2013-10-31 4.4-6.0 19-23 7
2016-08-22 7.0- 24- 8

Android 4.4が安定しているという話を聞くので,だいたいAPIレベル19のJava 7が使用可能と考えてよさそうだ。

Google Play

Google Play アプリの対象 API レベルに関する要件 - Play Console ヘルプ

Google Playでの公開条件がけっこうころころ変わる。

2025-08-31: Android 14 (APIレベル34) 以上を対象にしないと公開されない。

対象APIレベル (targetSdkVersion) を指定する。

minSdkVersionは関係ない模様。

Build

Could not find method jcenter() for arguments [] on repository container of type org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler.
Could not find method jcenter() for arguments [] on repository container of type org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler.

ビルド時にこういうエラーが出る。

build.gradleの内容。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply plugin: "com.github.ben-manes.versions"
apply plugin: 'kotlin'
apply plugin: 'kotlin-android-extensions'

buildscript {
    ext.kotlin_version = '1.5.21'
    repositories {
        mavenCentral()
        jcenter()
        google()
        maven {
            url 'https://maven.fabric.io/public'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.3.1'
        classpath 'com.google.gms:google-services:4.3.14'
        classpath "com.github.ben-manes:gradle-versions-plugin:0.25.0"
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "io.realm:realm-gradle-plugin:10.9.0"// Crashlytics plugin

    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}


repositories {
    mavenCentral()
}
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}
compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

How to Resolve the 'Could Not Find Method jcenter() for Arguments [' Error in Gradle - CodingTechRoom]

jcenter()をmavenCentral()に置換するか除去すればいい。

Connection timed out: getsockopt. If you are behind an HTTP proxy, please configure the proxy settings either in IDE or Gradle.

Android Studioでプロキシ設定を行う方法【初心者向けガイド】

プロキシー設定の問題の模様。

[File]-[Settings]-[Appearance & Behavior]-[System Settings]-[HTTP Proxy]

  • ◎ Manual proxy configuration
  • Host name:
  • Port number:

他に、gradleの設定も必要。というより、こちらが重要。

gradele.propertiesに以下を追加する。

      systemProp.http.proxyHost=proxy.example.com
      systemProp.http.proxyPort=8080
      systemProp.http.proxyUser=your_username
      systemProp.http.proxyPassword=your_password
      systemProp.https.proxyHost=proxy.example.com
      systemProp.https.proxyPort=8080
      systemProp.https.proxyUser=your_username
      systemProp.https.proxyPassword=your_password

httpのほうはいらないと思う。

Could not find com.github.ben-manes:gradle-versions-plugin:0.25.0.

buildscript.repositories内の以下の記載を削除。

        maven {
            url 'https://maven.fabric.io/public'
        }

加えて、repositoriesにgradlePluginPortal()を追加。

diff --git a/build.gradle b/build.gradle
index 86baf4a..6f7bdc3 100755
--- a/build.gradle
+++ b/build.gradle
@@ -7,11 +7,8 @@ buildscript {
     ext.kotlin_version = '1.5.21'
     repositories {
         mavenCentral()
-        jcenter()
         google()
-        maven {
-            url 'https://maven.fabric.io/public'
-        }
+        gradlePluginPortal()
     }
     dependencies {
Unable to load class 'org.gradle.util.WrapUtil' org.gradle.util.WrapUtil Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Unable to load class 'org.gradle.util.WrapUtil'
org.gradle.util.WrapUtil

Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)

Re-download dependencies and sync project (requires network)
The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.

Stop Gradle build processes (requires restart)
Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.

In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

ごちゃごちゃやっている間にキャッシュが競合した模様。

File → Invalidate Caches... → Invalidate and Restart をクリックで解消。

Your build is currently configured to use incompatible Java 21.0.8 and Gradle 7.4. Cannot sync the project.
Your build is currently configured to use incompatible Java 21.0.8 and Gradle 7.4. Cannot sync the project.

We recommend upgrading to Gradle version 9.0-milestone-1.

The minimum compatible Gradle version is 8.5.

The maximum compatible Gradle JVM version is 17.

Possible solutions:
 - Upgrade to Gradle 9.0-milestone-1 and re-sync
 - Upgrade to Gradle 8.5 and re-sync

使用しているjavaとgradleのバージョンがあっていないとこの警告が出る。

Compatibility Matrix

gradle 7.4発表直後のjava 18を使う。

Android ビルドの Java バージョン  |  Android Studio  |  Android Developers

[Android Studio])> [Settings] > [Build, Execution, Deployment] > [Build Tools] > [Gradle]

[JDKをダウンロードする] を選んで11を選ぶ。インストールにしばらく時間がかかるので、プログレスをみておく。

プロジェクトのJavaのバージョンの固定

https://grok.com/share/c2hhcmQtMw%3D%3D_b63418af-e286-4d16-a192-57a5039e46d2

.idea/gradle.xmlにJavaのバージョン指定がある。これもVCSで管理したらいい。

Could not find io.realm:android-adapters:4.0.0.
FAILURE: Build completed with 7 failures.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:dataBindingMergeDependencyArtifactsDebug'.
> Could not resolve all files for configuration ':app:debugCompileClasspath'.
   > Could not find io.realm:android-adapters:4.0.0.
     Required by:
         project :app

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
==============================================================================

app/build.gradleを以下修正。

//    implementation 'io.realm:android-adapters:4.0.0'
superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner (in unnamed module @0x511f749a) cannot access class com.sun.tools.javac.tree.TreeScanner (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module @0x511f749a
Execution failed for task ':app:compileDebugJavaWithJavac'.
> superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner (in unnamed module @0x511f749a) cannot access class com.sun.tools.javac.tree.TreeScanner (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module @0x511f749a

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.4/userguide/command_line_interface.html#sec:command_line_warnings
Ask Gemini

ButterKnifeがjava 17+に未対応。java 11まで対応しているらしい。java 11にする。これで解決した。

SDKバージョン変更

https://grok.com/share/c2hhcmQtMw%3D%3D_d3a9ac04-95f9-484e-a28a-a8e965d73e82

app/build.gradleでsdkのバージョンを指定する。変更したら、Sync Nowを選んで、Gradleに同期が必要。これをしないとビルドに反映されない。

[Run]-[Run app] が無効な時は、インストール可能な状態になっていない。

The application could not be installed. Installation failed due to: 'Error code: 'UNKNOWN', message='Unknown failure: 'cmd: Failure calling service package: Broken pipe (32)''' List of apks: [0] 'app\build\intermediates\apk\debug\app-debug.apk'

https://grok.com/share/c2hhcmQtMw%3D%3D_8aef266a-57f7-4bc9-a729-9c28ce71fb8a

adb kill-server
adb start-server

ADBがインストールされているか確認: Android Studioインストール時に自動で入るはずですが、コマンドが「認識されない」場合は、Android SDKのplatform-toolsフォルダをPATHに追加(例: AppData\Local\Android\Sdk\platform-tools)。

一旦上記コマンドでadbサーバーを再起動すると解決するかもしれない。

バージョン番号

アプリのバージョニング  |  Android Studio  |  Android Developers

build.gradleのdefaultConfigのversionCode/versionNameで指定する模様。

    android {
      namespace 'com.example.testapp'
      compileSdk 33

      defaultConfig {
          applicationId "com.example.testapp"
          minSdk 24
          targetSdk 33
          versionCode 1
          versionName "1.0"
          ...
      }
      ...
    }
    ...

versionNameはユーザーに表示用。versionCodeは内部用。

プロジェクトによっては、app/src/main/AndroidManifest.xmlに記載した利する模様。昔やアプリ内の表示用にはこれだったのかも。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:testOnly="false"
    android:versionCode="502010"
    android:versionName="5.2.1">
```

書式は以下の通り。

- versionName: メジャー番号.マイナー番号.パッチ番号。プラットフォーム変更など大きな変更はメジャー番号、機能更新はマイナー番号、軽微な修正はパッチ番号、をそれぞれ更新。
- versionCode: 502010
  - 5: メジャー番号。2桁以上になるなら先頭に追加。
  - 02: マイナー番号。2桁。
  - 01: パッチ番号。2桁。
  - 0: 増分用番号。1桁。google play consoleでアップロードミスなどした時用。
Unsupported class file major version 65

Gradleでビルドすると'Task :resolveMainClassName FAILED'で失敗する #Java - Qiita

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Could not open cp_proj generic class cache for build file 'C:\Users\20165\project\sfcc-djmob-Android\app\build.gradle' (C:\Users\20165\.gradle\caches\8.0\scripts\ep3ykkf9780jtyl1zxsvmzjzx).
   > BUG! exception in phase 'semantic analysis' in source unit '_BuildScript_' Unsupported class file major version 65

JVMのバージョンが新しすぎて、対応していないとのkと。

65-44で使用しているjavaのバージョンになる。

古いjavaを使うしかない。

Build Type 'debug' contains custom BuildConfig fields, but the feature is disabled.

「Build Type ‘debug’ contains custom BuildConfig fields」エラーの対策 – 山本隆の開発日誌

A problem occurred configuring project ':app'.
> com.android.builder.errors.EvalIssueException: Build Type 'debug' contains custom BuildConfig fields, but the feature is disabled.

Android Gradle Plugin (AGP) 8 以降では、buildConfig機能がデフォルトで無効になっています。

つまり、カスタムBuildConfigフィールドを使用すると、エラーが発生します。

例えば、以下のようにbuild.gradle (Module: app)にbuildConfigFieldを追加している場合、このエラーが発生します。

<android {
    buildTypes {
        debug {
            buildConfigField "String", "API_URL", "\"https://api.example.com\""
        }
    }
}

このエラーを解決するためには、buildConfig機能を有効にする必要があります。 build.gradle (Module: app)を開き、以下の設定を追加してください。

<android {
    buildFeatures {
        buildConfig true
    }
}
Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner
Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner (in unnamed module @0x41a82fc4) cannot access class com.sun.tools.javac.tree.TreeScanner (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module @0x41a82fc4

How can I fix this error with ButterKnife in Android Studio? - Stack Overflow

対処方法が2種類。

1 JDK 11を使う。

2 gradle.propertiesに以下を記載。

org.gradle.jvmargs=-Xmx1920M \
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED

2番目の方法がよさそう。

エラー: 定数式が必要です
エラー: 定数式が必要です
            case R.id.btn1:

こんなビルドエラーが、gradleのバージョンを上げると発生するようになった。

gradle 8.0では起きなくて、8.5だと発生する。

resのxmlからjavaに変換する際に、以前はfinalついていたのが、途中でつかなくなったのが原因らしい。

caseではなく、if文で書き直せばOK。

エラー: 要素値は定数式である必要があります
エラー: 要素値は定数式である必要があります
    @BindView(R.id.title_view)

caseと同じタイプの気がする。

ButterKnifeという昔リソースの紐づけに使われていたライブラリー。gradleのバージョンアップでfinalが外れたのが原因。view bindとか本体の機能に統合されているので、このタイミングでそちらに移行したほうがいい。

対応方針。

  1. app/build.gradleにviewbidingの設定
  2. idを使っているリソースxmlにlayoutタグを一番外側に追加。
  3. @bindviewしているところを、bindingを取得してそこからの参照に変更。
// ViewBindingに移行するためのXMLの変更例...

// Before

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/toolbar">
            
                // 省略...

            </RelativeLayout>
        </ScrollView>
</RelativeLayout>

// After

<layout> ← こちらを追加

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/toolbar">

                // 省略...

            </RelativeLayout>
        </ScrollView>
    </RelativeLayout>
</layout>
// ViewBindingに移行するためのXMLの変更例...

// Before
public class ShippingAddressSelectorActivity extends AppCompatActivityActivity {
    private final int mMenuGroupId = 0;

    @BindView(R.id.toolbar)
    Toolbar toolbar;

    @BindView(R.id.activity_shipping_address_selector_list)
    RecyclerView shippingAddressesView;

    @BindView(R.id.activity_shipping_address_selector_cautions_about_ordered)
    TextView cautionsTextView;

    @BindView(R.id.activity_shipping_address_selector_progress_bar)
    View progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shipping_address_selector);
        ButterKnife.bind(this);

        toolbar.setTitle(R.string.title_select_shipping_address);

        mShippingAddressesView.setLayoutManager(new LinearLayoutManager(this));

        ShippingAddressAdapter adapter = new ShippingAddressAdapter(this);
        shippingAddressesView.setAdapter(adapter);
        cautionsTextView.setText(R.string.caution_text);
    }
}

// After
public class ShippingAddressSelectorActivity extends AppCompatActivityActivity {
    private final int mMenuGroupId = 0;

    // Binding クラスの定義
    private ActivityShippingAddressSelectorBinding binding;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.setContentView(this, R.layout.activity_shipping_address_selector);

        binding.toolbar.setTitle(R.string.title_select_shipping_address);
        setSupportActionBar(binding.toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }

        binding.activityShippingAddressSelectorList.setLayoutManager(new LinearLayoutManager(this));    

        ShippingAddressAdapter adapter = new ShippingAddressAdapter(this);
        binding.activityShippingAddressSelectorList.setAdapter(adapter);
        binding.activityShippingAddressSelectorCautionsAboutOrdered.setText(R.string.caution_text);
    }
}
$ diff -u a.java b.java
--- a.java      2025-10-29 15:55:01.702784800 +0900
+++ b.java      2025-10-29 15:55:21.477947600 +0900
@@ -1,30 +1,25 @@
 public class ShippingAddressSelectorActivity extends AppCompatActivityActivity {
     private final int mMenuGroupId = 0;

-    @BindView(R.id.toolbar)
-    Toolbar toolbar;
-
-    @BindView(R.id.activity_shipping_address_selector_list)
-    RecyclerView shippingAddressesView;
-
-    @BindView(R.id.activity_shipping_address_selector_cautions_about_ordered)
-    TextView cautionsTextView;
-
-    @BindView(R.id.activity_shipping_address_selector_progress_bar)
-    View progressBar;
+    // Binding クラスの定義
+    private ActivityShippingAddressSelectorBinding binding;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_shipping_address_selector);
-        ButterKnife.bind(this);

-        toolbar.setTitle(R.string.title_select_shipping_address);
+        binding = DataBindingUtil.setContentView(this, R.layout.activity_shipping_address_selector);
+
+        binding.toolbar.setTitle(R.string.title_select_shipping_address);
+        setSupportActionBar(binding.toolbar);
+        if (getSupportActionBar() != null) {
+            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+        }

-        mShippingAddressesView.setLayoutManager(new LinearLayoutManager(this));
+        binding.activityShippingAddressSelectorList.setLayoutManager(new LinearLayoutManager(this));

         ShippingAddressAdapter adapter = new ShippingAddressAdapter(this);
-        shippingAddressesView.setAdapter(adapter);
-        cautionsTextView.setText(R.string.caution_text);
+        binding.activityShippingAddressSelectorList.setAdapter(adapter);
+        binding.activityShippingAddressSelectorCautionsAboutOrdered.setText(R.string.caution_text);
     }
 }

やること自体はシンプル。

元ブログのやり方間違っている。

        binding = LayoutStageDetailViewBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

bindingはメンバー変数で持っておく必要がある。

onclickとか。

        binding.stageAbout.setOnClickListener((View v) -> {
            onClickContentsOpenBrowser(URLSetting.URL_STAGE_ABOUT, EventTracker.A_stage_up_lp,
                    FbAnalyticsTracker.STAGE_UP_LP);
        });

これでいい。

https://grok.com/share/c2hhcmQtMw%3D%3D_466b34c5-6d5a-4958-b1b7-b894a451e4cb

Activity以外のVewとかの場合。公式の「フラグメントでビュー バインディングを使用する」を参考にする。

binding = ContainerDpWebviewBinding.inflate(LayoutInflater.from(context), this, true);

これでinflateする。

fragmentの場合。

private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}
Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules
Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
   > Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10.jar -> jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21.jar -> jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)

app/build.gradleに追加して除外すればいいとのこと。

configurations.implementation {
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
}

結局、この方法では解決しなくて、以下の方法で解決した。

java - Duplicate class in Kotlin Android - Stack Overflow

app/build.gradle

dependencies {
    constraints {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
            because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
        }
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
            because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
        }
    }
}
com.android.builder.errors.EvalIssueException: compileSdkVersion is not specified. Please add it to build.gradle
A problem occurred configuring project ':app'.
> com.android.builder.errors.EvalIssueException: compileSdkVersion is not specified. Please add it to build.gradle

android - Gradle sync failed: Cause: compileSdkVersion is not specified - Stack Overflow

app/build.gradleのandroid.compileSdkVersionの記載はSDK33以上では廃止予定とのこと。

 android {
   // compileSdkVersion 33 and above
    defaultConfig {
        compileSdk 33
    }
...

代わりにdefaultConfigに記載するとか。

targetSdkVersionを34から35に更新

Android 15でEdge-to-edgeというステータスバー関係の機能がデフォルトで有効になり、レイアウトが崩れる。

無効化が必要。だが、android 15 (sdk 35) の機能が必要で、それのコンパイルは前提。

App resources

About app resources

アプリのリソースの概要  |  App architecture  |  Android Developers

代替リソースの指定

resディレクトリーにvalues-XXみたいな形式で、代替リソースを用意できる。

iOS

Settings

Keyboard

[Settings]-[General]-[Keyboards] が設定項目。

GPS一発切替

iPhoneのショートカットについて質問です。位置情報サービス内の「システム... - Yahoo!知恵袋

iPhoneのGPS設定は深い階層にあって、頻繁に切替必要なのに手間がかかる。

Shortcutsアプリでショートカットを作成して短縮できる。

[Shortcuts]-[All Shortcuts]-[+]-[Open URLs]-[Open]=[prefs:root=Privacy&path=LOCATION/SYSTEM_SERVICES]

これで1タップで開ける。

[iPhoneまたはiPadのウィジェットからショートカットを設定して実行する - Apple サポート (日本)] を参考に、ウィジェットにしてホーム画面に配置するとどこからでも1タップで開ける。

Gboard

スマホの日本語入力 目からウロコの楽々ワザとは? | NIKKEIリスキリング

iOS版のGboardはAndroid版と異なり機能が劣る。標準キーボードを使ったほうがいいらしい。

Space

ASCII.jp:iPhoneで常に半角スペースを入力できるようにする方法

  • [ALL KEYBOARDS]-[Smart Punctuation]=On: Off推奨。
  • [KANA]-[Smart Fullwidth Space]=On: =Off推奨。

これで常に半角スペース入力になる。

瞬間切替

iPhoneは裏ワザだらけ、英数字と記号を思い通りに入力 スマホ日本語入力再入門(3) - 日本経済新聞

英語キーボードで1文字だけ数字や記号を入力したいことがある。

その場合、[数字切替] キーをドラッグしたまま、入力したいキーで離す。すると、数字や記号を1文字だけ入力して、英字モードに戻る。切替の手間が省けて楽。

Other

iPhoneは裏ワザだらけ、英数字と記号を思い通りに入力 スマホ日本語入力再入門(3) - 日本経済新聞

  • [ALL KEYBOARDS]-[Auto-Punctuation/自動大文字入力]=On: Off推奨。英語キーボード切替時に先頭が自動で大文字になる機能。英語圏の人なら便利だが非英語圏なら邪魔。
  • [ALL KEYBOARDS]-[Auto-Correction]=On: Off推奨。一般的な綴でない場合、誤入力と判断され、変換のデフォルトが修正候補になる。
  • [ENGLISH]-["." Shortcut]=On: On推奨。英語キーボードには.がない。これがオンだと、スペースのダブルタップで.を入力できる。

Network

テザリング

出典:

無通信状態が90秒ほどしばらく続くと省電力設計のため、自動的にオフになる。これが困る。Andriodは自動オフにはならない。

いくつか対策がある。

  1. [Personal Hotspot] (インターネット共有) 画面の表示を維持。自動ロックも解除しておく。
  2. USB/Wi-FiではなくBluetooth経由にする。⇢Bluetooth接続はMontary以上で不能。

Bluetooth経由のほうが、範囲が短く、電力消費量も抑えられるので、Bluetoothがよさそう。他にはUSB接続。

Bluetooth接続はできなくなっているので、画面表示か通信しておくしかない。

Instant Hotspot

出典:

Bluetoothでのテザリングはできないものの、類似機能のInstant Hotspotで実現できるらしい。

いくつか条件がある。

  • iPhone/iPadでインターネット共有 (Personal Hotspot) 対応。
  • 全デバイスで同じApple IDでiCloudにログイン。
  • 全デバイスでBluetoothオン。
  • Wi-Fiオン.

[Personal Hotspot]-[Allow Others to Join] をオンにしなくても自分だけ接続できるのが利点。逆にいうとこれくらい。Bluetoothをオンにしないといけないぶん、余計な通信処理が入る。使わなくていい。

Bluetooth

出典:

MacS v12.1 (Monterey) からiOSでのBluetooth接続が不能になった。

Wi-FiかUSBで接続する。実務的には困らないはず。

Saving

1Blocker

Safari向けの広告ブロッカーアプリ。他に280blockerという有料アプリがある。こちらは日本向け。1Blockerはグローバル。基本無料で追加機能は有料。

通信を節約する方法がいくつかある。

  1. Wi-Fiを使う場合、Wi-Fiのアクセスポイントごとの設定で [Low Data Mode] がある。これをオンにすると節約できる。
  2. SIMの場合、[Cellular Data Options]-[Low Data Mode] がある。[Low Data Mode]=onにすると、自動更新や写真の動機などのバックグラウンドタスクが停止される。
  3. ブラウザーのコンテンツブロッカー。例えば、1Blocker。メディアを無効にするカスタムルールで、大幅に節約できる。
    1. [Advanced customize]-[custom rule]-[new rule]
    2. .+/Block all type resource=off/

2 番目に、Safari をコンテンツ ブロッカーと一緒に使用することをお勧めします。私は 1Blocker を使用していますが、メディアを無効にするカスタム ルールを作成して、帯域幅を大幅に節約できます。[高度なカスタマイズ]、[カスタム ルール]、[新規ルール] の順に進み、正規表現に.+(ドットとプラス記号はすべての URL に一致します) を入力し、[すべてのタイプのリソースをブロック] をオフに切り替え、画像、フォント、RAW、SVG、メディア、ポップアップをオンに戻します。保存します。これにより、これらの特定のリソース タイプをすべて読み込む要求がグローバルにブロックされ、帯域幅を大幅に節約できます。

カスタムルールのメディア無効の効果が大きい。

280blockerが日本の広告に一番詳しい。こちらで広告元ドメインのリストを配布しているようで、これを取り込むとほぼ広告をブロックできるらしい。

iPhoneで以下のURLの年月の部分を現在にしてダウンロードする。

https://280blocker.net/files/280blocker_1blocker_202310.1blockpkg

Xユーザーの280blockerさん: 「弊社にて提供中の1blocker用ファイルについてブログに記載いたしました。」 / X

ただ、1blockerが6.xにバージョンアップして、定義ファイルに更新が入って互換性がなくなった模様。

280blockerは元々1blockerの5chのスレッドで280番目にレスしたことが始まりだとか。2021年からトビラシステムズに3億円くらいで買収されたらしい。

AdGuard

こちらの手順に従ってAdGuardを試す。AdGuardアプリ-[Settings]-[Support]-[Watch video tutorial] をやればよさそう。

  1. AdGuardをインストール。
  2. [Settings]-[Apps]-[Safari]-[General]-[Extensions]
  3. AdGuardで始まるスイッチを全部オンにする。
  4. Safariを開く。
  5. アドレスバーの左の[aA]など-[Manage Extensions]-AdGuardをオン。
  6. アドレスバーの左の[aA]など-[AdGuard]-[Always Allow]-[Always Allow on Every Website]

AdGuard DNSで広告除去 #広告ブロック - Qiita

アプリの他にDNSもある。これを設定するとSafari以外も埋込広告以外をブロックできる。

パブリックAdGuard DNSサーバーに接続する方法 | AdGuard DNS」に手順がある。これのOption2: Configure AdGuard DNS manuallyをやる。

  1. AdGuardのDNSプロファイルをダウンロード
  2. [Settings]-[General]-[VPN & Device Management]-[Downloaded profile]-[AdGuard DoH]-[Install] を選ぶ。

これでWebベースの広告はだいたいブロックされて、動作が軽くなるらしい。

Safari

iPhoneの通信量を劇的に節約するコツ10選【ギガ不足を解消】 | デジスタ

Safariの設定が重要。

[Settings]-[Apps]-[Safari]

[Preload Top Hit/トップヒットを事前に読み込む]: これをオフにする。検索時にブックマークから訪問候補を挙げてくれて、さらにバックグラウンドで読み込みも開始する。

Sound

出典: iPhoneの音量を調整する - Apple サポート (日本)

音量は左サイドボタンで上下できる。左上のスイッチがマナーモードの切替になっている。消音モードと呼んでいる。

Mail

複数アカウント

複数アカウントを使いこなす、iPhoneメールアプリの知られざる便利機能 | 日経クロステック(xTECH)

iPhoneのメールアプリは標準のMailを使うのがよいだろう。K-9がないから。複数アカウントにも対応しているが、設定が若干特殊。アプリ設定からではなく、iOS本体の設定から行う。

This message is from a sender in your blocked list.

自分宛へのメールが、なぜかブロックリストに登録されていて、iOSのMailアプリで開くと自動でTrashに移動されてしまう。必要なメールもごみ箱に強制的に入ってしまい、困る。

[This message is from a sender in your blocked list.] の警告が表示されている。

All sent messages marked blocked sender - Apple Community」で同じ議論がある。

上記警告文の [Settings] からMailアプリの設定で [Blocked Sender Options] や [Blocked] にブロックリストがあるので、これを解除するといいらしい。

電話の受信拒否をすると、同じアドレスがこちらに入る模様。

[Blocked Sender Options] を [Move to Trash] から [Leave in Inbox] にするだけでもいいかもしれない。

ただ、特にブロックした覚えのないメールが勝手に登録されていたので、注意が必要。

App

いくつか必要なアプリがあるので整理する。

Switcher

出典: iPhoneで開いているアプリを切り替える - Apple サポート (日本)

アプリスイッチャーという機能で、現在実行中のアプリを変更可能。Androidはホームの上スワイプ、右ボタンだった。iOSはホームのダブルクリック。

KeePass

パスワード管理アプリ。iOSは別になる。KeePass XCはQtを使っているからビルドできるはずなんだけど。

iOS 向けの Keepass クライアントの備忘録 | hyt adversaria」を見る限り、KeePassiumが良さそう。

Camera/Video

Camera

出典: iPhoneのカメラ解像度を変更し写真/動画サイズを軽くする便利技 – 格安SIM初心者教室

iPhoneのデフォルトのカメラは解像度が高すぎて写真のファイルサイズがかなり大きい。変更できない。せいぜいインカメラで撮影するくらい。

LINE Cameraが定番のカメラアプリらしい。こちらは解像度を柔軟に設定できる。

[Settings]-[Saving]-[Resolution]-[Medium] に変更。これでデフォルトの半分になる。

iPhoneのカメラ解像度を変更し写真/動画サイズを軽くする便利技 – 格安SIM初心者教室」はもっと小さい。こちらがいいだろう。

Low Cameraはもっと小さいが、小さすぎて細かい文字が見えなくて困る。調べた。

2024|無音カメラアプリおすすめランキング11選|無料|高画質 | Good!Apps」が参考になった。

Simple Camがよかった。基本はこの1.2MPか0.3MP。外観だけでいいならLowCameraとか。

rank OS name url Free level MP resolution px size KB square 備考
4 iOS LowCamera Very Low 0.05 144x144 25 x
4 iOS LowCamera Low 0.1 360x360 50 x
4 iOS LowCamera Medium 0.2 480x480 100 x 画質が低すぎる。
4 iOS LINE Camera Medium 2 1512x1512 1024 x 画質をもう少し落としたい。
2 iOS 低画質カメラ - 動画のみ。
3 iOS 0.3MPCamera 480x640 - いまいち。正方形がない。
3 iOS 0.3MPCamera 240x320 - いまいち。正方形がない。
3 iOS 0.3MPCamera 120x160 - いまいち。正方形がない。
3 iOS default Photo 12 3024x4032 2300 x
3 iOS default Photo 9 3024x3024 2600 x
3 iOS Capera Max 12 3024x4032 2300 - 正方形がない。
3 iOS Capera FullHD 1920x1080 -
3 iOS Capera HD 1280x720 -
3 iOS Capera VGA 640x720 -
3 iOS Capera CIF 352x288 -
3 iOS Lo-Fi Cam https://apps.apple.com/bz/app/lo-fi-cam/id1607751695 192x144 - 正方形がない。
3 iOS Lo-Fi Cam https://apps.apple.com/bz/app/lo-fi-cam/id1607751695 352x288 - 正方形がない。
3 iOS Lo-Fi Cam https://apps.apple.com/bz/app/lo-fi-cam/id1607751695 480x360 - 正方形がない。
3 iOS Lo-Fi Cam https://apps.apple.com/bz/app/lo-fi-cam/id1607751695 640x480 - 正方形がない。
3 iOS Lo-Fi Cam https://apps.apple.com/bz/app/lo-fi-cam/id1607751695 960x540 - 正方形がない。
3 iOS Lo-Fi Cam https://apps.apple.com/bz/app/lo-fi-cam/id1607751695 1280x720 - 正方形がない。
5 iOS Simple Cam 0.3 480x480 100 x 必要な範囲を網羅できている。
5 iOS Simple Cam 1.2 960x960 200 x 必要な範囲を網羅できている。
5 iOS Simple Cam 1.9 1200x1200 300 x 必要な範囲を網羅できている。
5 iOS Simple Cam 5 1936x1936 800 x 必要な範囲を網羅できている。
5 iOS Simple Cam 8 2448x2448 1500 x 必要な範囲を網羅できている。
5 iOS Simple Cam 12 x 必要な範囲を網羅できている。
3 iOS MiraCamera 9 3024x3024 2700 x いまいち。
3 iOS Foodie standard 3 1920x1920 1600 x いまいち。
3 iOS SODA standard 3 1920x1920 1800 x いまいち。
2 iOS Pro Camera - x
1 iOS Q Camera x -
1 iOS AutoCam x -
2 iOS SkyCamera 0.8 750x1000 -
2 iOS StageCamHD 1280x720 x
2 iOS StageCamHD 1920x1080 x
2 iOS StageCamHD 3024x3024 x
2 iOS StageCamHD 2592x1936 x
2 iOS StageCamHD 3264x2448 x
2 iOS BeautyPlus x
Video

標準のカメラアプリで正方形の動画の撮影方法。photoで正方形にして、撮影ボタン長押しで正方形で動画撮影可能。右にスライドでモードロックとのこと。

カメラアプリの設定で、 [Preserve Settings]-[Creative Controls] でデフォルト正方形を維持できる。

Record Square Format Videos on iPhone with These Apps

動画撮影アプリのおすすめ人気ランキング【2024年】 | マイベスト

正方形の動画撮影アプリ。

Clips

Apple純正の動画作成ソフト。

Favorite

写真も動画も基本はFILTISTでOK。ただし、ズーム不能なので、ズーム時だけ別アプリを使う。

  • LISTIST=動画・写真=720x720ズームなし。
  • MONOV=動画720x720ズーム。
  • Simple Cam=写真ズーム。

通常はLISTISTで動画も写真も撮影。ズームが必要な場合だけ、MONOV/Simple Cam。

ズーム用を1アプリで対応できればよかったのだが、うまいのがない。LINE Cameraが近かったのだけど、動画が最大30 s。惜しかった。しかたない。

LINE Camera

正方形で写真と動画に対応。サイズも大きすぎない。ズームも対応。ただし、動画は30 sまで。これが惜しい。

QR

Ref: QRコードで開いたWEBサイトの履歴がiPhoneで残らない問題、これで解決 | マイナビニュース.

QRコードを読み取ると、QRコードリーダーアプリ内ブラウザーで開けれて、Safariの履歴に残らない。開いた後に、右下でSafariで開き直すと、タブで開き直せる。基本はすぐ開き直したほうがいい。

いや、標準のQRコードリーダーで開いた後に、Safariで開き直すと、状態が違うのか、吉野家のレシートアンケートなどはエラーになる。サードパーティーアプリを使ったほうがいい。

QRコードアプリおすすめ2選&ランキングTOP10 無料・人気のアプリを編集部が厳選!【2024年】 | iPhone/Androidアプリ - Appliv

QRQRがいい。

Other

エクスプレスカード

エクスプレスカード(Face ID等なしで利用する)|Apple PayのPASMO

[Wallet]-任意のカード-[Card Details]-[Express Transit]

ここがOnだと本体をかざすだけで、アプリを起動することなく決済可能。

1枚しか設定できない。

iPhoneの電池が切れても一定時間は使用可能。

近接センサー

通話中に、耳を話すと、勝手に画面ロックになったり、画面操作中に強制的に真っ黒になってまともに操作できない。

IPhoneの上部中心に近接センサーがあって、これで制御されているらしい。

[Settings]-[Accessibility]-[Touch]-[Prevent Lock to End Call]=trueに変更する。これで電源ボタンを押しても通話は中断しない。

これでましになった気がする。

着信拒否

iPhoneで着信拒否やメール拒否

着信拒否している場合、着信が入らず、ツーツーとなる。模様。転送やアナウンスがない。それがポイント。

Windows

Other

IME

MS IMEでIMEのオン/オフの切り替え快適化 – senooken JP

右下IMEアイコンを右クリック-[設定]-[キーとタッチのカスタマイズ]‐[キーの割り当て]

  • [各キー/キーの組み合わせに好みの機能を割り当てます]=オン
  • 無変換キー=IME-オフ
  • 変換キー=IME-オン

高速スタートアップ

出典:

電源オフにしているのに、バッテリーが何故か減っている。原因は [高速スタートアップ] とのこと。

[コントロールパネル]-[ハードウェアとサウンド]-[電源オプション]-[電源ボタンの動作を選択する]-[現在利用可能ではない設定を変更します]-[シャットダウン設定]-[高速スタートアップを有効にする (推奨)] をオフにする。

勝手にスリープする

システムがすぐにスリープしてしまうのは、「システム無人スリープタイムアウト(System unattended sleep timeout)」機能が働いているためだと考えられる。これは、システムがWOL(Wake On LAN)や何らかのイベントなどで、自発的にスリープから起動した場合、そのまま何も操作せずに放っておくと、一定時間後にまた自動的にスリープ状態に移行するための機能である。

 システム無人スリープのタイムアウトを設定する項目を有効化するには、コマンドプロンプトで以下のpowercfgコマンドを実行すればよい。再起動などは必要なく、[電源オプション]にタイムアウトを設定する項目が表示される。

powercfg -attributes SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 -ATTRIB_HIDE

これだとダメ。

一応元に戻す。

powercfg -attributes SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 +ATTRIB_HIDE

Windows10で勝手にスリープになる現象を防ぐための対処法 | TechMemo

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\238C9FA8-0AAD-41ED-83F4-97BE242C8F20\7bc4a2f9-d8fc-4469-b07b-33eb785aaca0

このレジストリーの値を0から2に変更する。

システム無人スリープタイムアウトが表示されるので0にするとなくなる。らしい。

そのほか、ディスプレイの電源を切るのはやはりだめ。パソコンの省エネ機能が働いて、処理が止まる。

Startup

Microsoft TeamsなどOSの起動時に勝手に自動起動するアプリがある。制御する方法がいくつかある。

[設定]-[アプリ]-[スタートアップ] で制御できる。大半はこれで制御できる。

ほかに、Explorerのshell:startupか%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupにショートカットがあると、それでも自動起動する。

録音

Windows10で録音がしたい!ボイスレコーダーを使用した音声の録音方法を解説

プレインストールのボイスレコーダーで録音できる。

Theme

Ref: デスクトップのテーマを変更する方法<Windows 11>|サポート|dynabook(ダイナブック公式).

OSのテーマでデフォルトのライト・ダークが決まる。

[スタート]-[設定]-[個人用設定]

Hardware

Keyboard

Ref: FMV Q&A - [Windows 11 キーを押し続けたときに、同じ文字が連続して入力される速度を調整する方法を教えてください。 - FMVサポート : 富士通パソコン].

[コントロールパネル]-[キーボード]-[速度]

  • 文字の入力
    • 表示までの待ち時間 (デフォルト3/4)=4/4

Mouse

[コントロールパネル]-[マウス]

  • ポインター オプション
    • ポインターの速度を選択する (デフォルト=左から6 (6/11))
    • ☑ポインターを自動的に既定のボタンの上に移動する。
    • ☑Ctrlキーを押すとポインターの位置を表示する。

コントロール パネル\すべてのコントロール パネル項目\コンピューターの簡単操作センター\マウスを使いやすくします

  • マウスポインター

Explorer

表示

[ファイル]-[オプション]-[フォルダーオプション]-[表示]

  • ファイルおよびフォルダー
    • ☑チェックボックスを使用して項目を選択する。
    • ファイルとフォルダーの表示
      • ☑隠しファイル、隠しフォルダー、および隠しドライブを表示する。
      • □登録されている拡張子は表示しない

WSL

http_proxy

[Linux 用 Windows サブシステム設定]-[ネットワーク]-[オート プロキシが有効]=オンだと、wslやubuntu上でhttp_proxy/HTTP_PROXYの環境変数が自動的に設定される。

混乱するのでオフでいいと思う。

Mac

Application

Applications

Macの実行ファイルは.appファイル。これは/Applicationsに配置されている。Laucnhpadはこのディレクトリー内を表示している模様。

Uninstall

Mac でアプリをアンインストールする - Apple サポート (日本)

いくつか方法がある。

App Storeからインストールしたアプリの場合、Launchpadを開いて該当アプリを表示して、ドラッグすると左上に×ボタンが表示されるので、これをクリックするとアンインストールになる。

AppStore以外の場合、Finderから該当ファイルを削除する。/Applicationsか$HOME/Applicationsを開いて該当アプリ.appを削除する。

System

スリープの無効化

【Macユーザー必見】iMac・MacBookをスリープさせない方法

長時間コマンドの実行などで、パソコンをスリープにしたくないことがある。以下の設定を変更することで対応できる模様。

  • [System settings]
    • [Lock Screen]: [Start Screen Saver when inactive]=false: これでスリープ無効?
    • [Battery]-[Options]: Prevent automatic sleeping on power adapter when the display is off=true これでパソコンの蓋を閉じてもスリープにならない。

これらでもダメなら、素直にYouTube動画をループ再生するとかで、稼働を継続させる。

他に、caffeinate -iコマンドの実行がある。

caffeinate -iを実行すると、C-cで中断するまでずっとスリープを抑止するらしい。

Mouse

マウスポインター速度 macデフォルト4/10。

DiscreteScroll

Macのマウスホイールのスクロールは加速度に応じる。高速に動かすと移動量が増える。指が疲れる。

加速度を無視して、Windows同様に一定量の移動にしてくれるのが、DiscreteScroll。

lanchctl

Macでシステム起動時の処理を管理する仕組み。Mac OS 10.10以上で導入されている。

GUIなど、システムグローバルで環境変数を反映させたい場合、ここに登録する必要がある。

plistファイルを作成して、それをlanchctl loadして登録になる。unloadで解除になる。

  • plistのファイルのパスは、主に以下2通り。
    • /Library/LaunchAgents/*****.plist : システム全体で有効になる。
    • ~/Library/LaunchAgents/*****.plist : ログインユーザのみで有効になる。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
  <key>Label</key>
  <string>setenv.M2_HOME</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>setenv</string>
    <string>M2_HOME</string>
    <string>/usr/local/Cellar/maven31/3.1.1/libexec</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>ServiceIPC</key>
  <false/>
</dict>
</plist>

上記のような形式。

配置したら、コマンドで即座に反映できる。

launchctl load ~/Library/LaunchAgents/SSLKEYLOGFILE.plist 

値を修正した場合、一度unloadしてからloadする。

Finder

拡張子の表示

https://support.apple.com/ja-jp/guide/mac-help/mchlp2304/mac

  1. MacのFinder  で、「Finder」>「設定」と選択してから、「詳細」をクリックします。
  2. 「すべてのファイル名拡張子を表示」を選択するか選択を解除します。

Screenshot

場所の変更

https://support.apple.com/ja-jp/guide/mac-help/mh26782/mac

起動中の [オプション] で選べる。

保存形式の変更

https://www.pc-koubou.jp/magazine/76550

defaults write com.apple.screencapture type jpg

戻すとき。

defaults write com.apple.screencapture type png

IME

¥と\

Macだと¥キーを入力すると¥が入力される。この文字を使うことはほぼなくて、バックスラッシュを入力したい。option-¥で入力できるが面倒。設定で変更できる。

  1. [システム設定]-[キーボード]-[入力ソース]-[編集]
  2. [日本語]
    1. ☑️英字
    2. ["¥"キーで入力する文字]=\
  3. [ABC]-[-]で削除する。

[ABC]の削除がポイント。ただ、これをするとcontrol-3で絵文字が出る問題がある。ABCは戻した方がいいかも。

絵文字を表示

【Mac】Control+3で顔文字リストが表示されるショートカットキーを変更する方法

キーボードの入力ソースが日本語だとこの問題が起こる。

他のショートカットキーの割り当てで無効にできるとの情報があったが、Mac 15.3.1では無効にならず。諦める。

Google日本語入力のアンインストール

【助かった】MacでGoogle日本語入力を完全にアンインストールする方法

  1. [System settings]-[Keyboard]-[Text input]-[Input Sources]-[Edit] を選ぶ。
  2. Google日本語入力の項目を選んで[-]を選ぶ。
  3. Finderで[Application]ディレクトリーを開いて[Google日本語入力]を削除する。
変換Enter 2回

Mac日本語入力、エンター2回でなく1回で変換する方法 | iSchool合同会社

MacのIMEは変換後確定にEnter2回必要。これが面倒。1回にすることができる。

[システム設定]-[キーボード]-[入力ソース]-[編集]-[日本語]-[☑️Windows風のキー操作]

これで1回で済む。

ライブ変換オフ

Macの「ライブ変換」機能をOFFにする方法 – Easytouse

デフォルトでライブ変換で自動変換してくれる。が、これが期待と違うことがあってイライラするのでオフにする。

[システム設定]-[キーボード]-[入力ソース]-[編集]-[日本語]-[▫️ライブ変換]

これでオフにすればOK。

追加辞書

Macの追加辞書に読み込むためのテキストファイルを作成する - Apple サポート (日本)

単語の読み,単語,品詞,,,メモ)

要素 説明
単語の読み 単語の読みをひらがなで入力します。長さは32文字以下にする必要があります。

単語にASCIIカンマやスペースを含める場合は、単語を引用符(“”)で囲みます。

単語にASCII引用符(")を入力する場合は、単語を1バイトの引用符で囲み、1バイトの引用符の周囲に連続する2つの1バイトの引用符を入力します。

単語 目的の変換結果を入力します。1つの単語の長さは64文字以下にする必要があります。単語には、Unicodeコンソーシアムで定義されている文字と記号であれば、どれでも使用できます。
品詞 次のいずれかの品詞を指定します:
  • 普通名詞
  • サ変名詞
  • 人名
  • 地名
  • 形容詞
  • 副詞
  • 接尾語
  • 動詞
  • その他すべての品詞
メモ メモはオプションです。メモの前には2つのASCIIカンマ(,,)を入力します。メモはユーザ辞書には登録されません。

これで登録する。登録手順。

  1. [設定]-[キーボード]-[テキスト入力]-[入力ソース]-[編集]
  2. [日本語-ローマ字入力]-[追加辞書]
  3. ここにドラッグ・ドロップするか、右クリック-[辞書をインストール] を選ぶ。

入力ソースの追加辞書の部分がグレーにな… - Apple コミュニティ

登録方法に癖がある。

  1. 辞書ファイルの拡張子はtxt
  2. 品詞の指定が重要。基本は普通名詞。

Keybind

https://support.apple.com/ja-jp/102650

キー 内容
option-command-電源

option-command-メディア取り出しキー

スリープ
C-command-q ロック
fn

Mac でファンクションキーを使う方法 - Apple サポート (日本)

F1-F12キーはデフォルトではMac専用機能の割り当てになっている。

fnキーとの同時押しでFn自体の機能になる。デフォルトでFnにしたい場合、設定で変更する。

[システム設定]-[キーボード]-[キーボードショートカット]-[ファンクションキー]-[F1、F2などのキーを標準のファンクションキーとして使用]=on

Keychain

Macのキーチェーンアクセスとは?

https://support.apple.com/ja-jp/guide/keychain-access/kyca1083/mac

「macOS」で「キーチェーンアクセス」を使う--パスワードを見つけて変更するには

https://japan.zdnet.com/article/35190535/

dockのkeychainアプリでMacのパスワードマネージャー。KeePassXCと似たようなことができる。OS標準だから安全・安心?

Passwords

Apple、今秋リリース予定のiPhoneとMacに新しいパスワードアプリ搭載

https://news.mynavi.jp/techplus/article/20240613-2964379/

2024年秋に [Passwords] という新しいOSアプリが登場。従来のKeychainをベースに、WiFiパスワードなど一元管理のためのアプリの模様。

こちらを使うのが良さそう。

[システム設定]-[パスワード] からアクセスする模様。

Touch ID

MacでTouch IDを使用する - Apple サポート (日本)

Touch IDを使うことで、指紋認証を利用できる。

[System settings]-[Touch IDとパスワード]-[Touch ID]-[指紋を追加]

Finder

Trashのサイドバー・ブックマーク表示

Macのゴミ箱 (Trash) の扱いが特殊。実態は、~/.Trashにある。ただ、HOMEディレクトリーで、C-<で隠しファイル表示にしてもFinderから表示できない。なので、ドラッグドロップでサイドバーにブックマーク表示もできない。Finderから直接アクセスできないのが使いにくい。

サイドバーに表示する方法があった (How do I get Trash to show in a finder window sidebar? : r/MacOS)。

Trashを開いた後に、[File]-[Add to Sidebar] を選ぶ。これだけ。

フォルダーを先頭表示

【Mac Info】Finderのファイル操作術をさらに極めるカスタマイズ20選 〜Macのキホン Vol.2 - PC Watch

Finderの設定でフォルダー・ディレクトリーを常に先頭にソート表示する設定がある。

[Settings]-[Advanced]-[Keep folders on top] の以下の2項目をオンにする。

  • In windows when sorting by name
  • On Desktop

検索場所のデフォルトを現在フォルダーに変更

【Mac Info】Finderのファイル操作術をさらに極めるカスタマイズ20選 〜Macのキホン Vol.2 - PC Watch

[Settings]-[Advanced]-[When performing a search]=[Search the Current Folder] にする。

ツールバーアプリ

ツールバーへのアプリ登録

Finderのツールバーにアプリを登録できる。よく使うアプリはここに配置すると時短になる。

appファイルをCommandの同時押しドラッグ・ドロップで配置できる。削除は同じくCommand同時押しのドラッグ・ドロップで画面外。

右クリックメニューのクイックアクションがわりで使える。

右クリックでファイルを新規作成

デフォルトでこれはできない。

いくつか方法があるが、Automatorにtouchコマンドを登録するのが一番簡単そう。

[Launchpad]-[Automator]-[Quick Action]-[Choose]

Workflow receives current=files or folders

[Library]-[Run Shell Script]

touch "$1/f.txt"

[File]-[Save]

Save quick action as: New file

[Save]

この方法はいまいち。ファイルかディレクトリーを右クリック必要。

うまい方法を発見。「Finder ファイル作成 - Apple コミュニティ」にあるように、スクリプトエディターでAppleScriptをアプリケーション形式 (.app) で保存して、Command推しながらドロップでFinderのツールバーにランチャーを登録できる。右クリックではないが、やりたいことを簡単に実現できる。これがいい。

上記のAppleScriptは構文エラーで動作しなかったので、「AppleScript|Finderで右クリックから新規ファイルを作成する - mogmo .NET」を参考に修正した。

1 以下の内容のNewFile.scptを作成する。

tell application "Finder"
	set theFile to (insertion location as text) & "Untitled.txt"
	set touchScript to "touch " & quoted form of (POSIX path of theFile)
	do shell script touchScript
end tell

2 [Launchpad]-[Script Editor] を起動してNewFile.scptを開く。

3 [File]-[Export]-[File Format]=[Application]-[Save] を選ぶ。

4 作成されたNewFile.appをFinderのツールバーにCommandキー同時押しでドラッグ・ドロップ。

5. 新規ファイルを作成したい場合に、ツールバーのNewFile.appをクリックする。

Terminal

Add Service to Finder Toolbar? - Apple Community

現在フォルダーを端末で開きたいことがよくある。ツールバーアプリにするといい。

Terminal.scptなどの名前で以下のファイルを用意する。

tell application "Finder"
    set myWin to window 1
    set thePath to (quoted form of POSIX path of (target of myWin as alias))
    tell application "Terminal"
        activate
        tell window 1
            do script "cd " & thePath
        end tell
    end tell
end tell

Script Editorで開いてappにエクスポートして登録する。

Developer

Automator

Macの自動化のツール。

格納場所

【Mac】Finderの右クリックで任意のファイル(txt,xlsx,docx,pptx等)を作成する方法 - 自由気ままに書いちゃおう

~/Library/Servicesに格納される。

AppleScript

WindowsのWSH相当。1993年の昔からある。

Script Editorでappファイルなどに変換できたりする。Macの自動化で重要なスクリプト言語。

CommandLineTools

/Library/Developer/CommandLineTools/のあたりにgitなどのOS標準の開発ツール類がある。

他に、/Applications/Xcode.app にもあったりする。

Package Manager

Homebrew

Homebrew — The Missing Package Manager for macOS (or Linux)

Install
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

これで/optにインストールされる。

最後にstdinに表示される以下のコマンドを実行してPATHを追加する。

    echo >> /Users/z.ken.senoo/.bash_profile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/z.ken.senoo/.bash_profile
    eval "$(/opt/homebrew/bin/brew shellenv)"

Other

破損App

Macで"壊れているため開けません"の古いappを開く #Mac - Qiita

xattr -rc /Applications/LegacyAwesome.app

これで属性を除去して解決することが多い。

Terminalが予期しない理由で終了しました

MAC「Terminalが予期しない理由で終了しました」のポップが出てターミナルが起動できない #Mac - Qiita

[~/Saved Application State/com.apple.Terminal.savedState] を改名したら起動できた。詳細不明。

画像の一括リサイズ

https://chatgpt.com/share/6810e6d6-b388-800b-8d38-2beda0da7552

  1. プレビューアプリでまとめて開いて、サムネイルを全選択。
  2. [Tool]-[Adjust size]

これで一括リサイズできる。

Photos

iPhoneとMacで共通の写真管理アプリ。クラウドで共有される。

ファイル取得

https://chatgpt.com/share/680b7873-4f00-800b-9049-03648eb29aef

使い方に癖がある。画像はExportで取得しないとファイルとして取得できない。

複数画像のPDFへの統合

いくつか方法がある。

  1. Previewアプリでまとめて開いて、Printで印刷画面でPDFに保存する。
  2. Finderで対象ファイルを選択-[右クリック]-[Quick actions]-[Create PDF]。

2番目のQuick actionsが一番簡単。

画像の同期

[Sharing]-[Shared Albums] に共有用のアルバムを作って、そちらに画像をドラッグ・ドロップで設定する。すると、iPhoneのPhotosでもこれらの画像にアクセス可能になる模様。

これが画像の同期手っ取り早い。

UNIX

Other

cron

About

UNIX系OSのジョブ管理ツール。タスクの定期実行を可能にする。

cronの名前は時間を意味するギリシア語chronosに由来する。

指定した時間に1回だけ実行するなら、atがある。電子メールの送信などで役立つ。

Format

cronの動作はcrontab (cron table) ファイルで指定する。

以下の形式になっている。

# ┌───────────── 分(0〜59)
# │ ┌───────────── 時(0〜23)
# │ │ ┌───────────── 日(1〜31)
# │ │ │ ┌───────────── 月(1〜12)JAN-DEC
# │ │ │ │ ┌───────────── 曜日(0〜6〈日〜土〉、一部のシステムでは7も日曜日) SUN-SAT
# │ │ │ │ │
# │ │ │ │ │
# * * * * * [予約するコマンド]

日時部分はいくつか指定方法がある。

    • すべて。
  • /n: nごとに実行 (*/5)。
  • ,: 複数の時間間隔を指定 (1,2,3)
  • -: 範囲。
  • %: コマンド内の%はエスケープされていないと改行文字に変換され、標準入力としてコマンドに渡される。

ユーザーはcrontab -eで自分の設定ファイルを編集できる。crontabファイルの直接編集は非推奨で、crontabコマンドでの修正が推奨されている。

ファイルの他に標準入力も受け付ける。

Command
  • 編集: crontab -e
  • 表示: crontab -l
  • 削除: crontab -r

-u: 実行ユーザー指定。

オプションを指定しない場合、引数のファイルの内容のcronを実行する。引数がなければ標準入力。

既存のcrontabの内容を編集したい場合、方法が2種類ある。

  1. crontab -e
  2. (crontab -l ; echo ) | crontab: crontab -lで現在のcrontabの内容が出力されるので、これを加工してcrontabに再度流し込む。
  3. crontab [file]

2の方法は融通が利く。crontab [file] でファイルにcrontabの内容を記載しておいて、これをVCSで管理というのも悪くはない。

Log

/var/log/cron

cron - Verify if crontab works - Ask Ubuntu

デーモン自体の確認は以下。

systemctl status cron
systemctl restart cron

cronへの登録時のコマンドが標準出力を持つ場合、メールでユーザーに内容を送信する。

この挙動が鬱陶しいので、cronへの登録時にログを全て破棄するような設定が奨励されることがある。

>/dev/null 2>&1

crontabのガイドライン #CentOS - Qiita

ただ、全部捨てると失敗時も、いつから失敗しているかの情報も一切わからない。残したほうがいい。

>>/var/log/log_$(date +\%Y\%m\%d).log 2>&1
環境変数

POSIXにあるように、HOME/LOGNAME/PATH/SHELLのみが最低限デフォルト値が用意されていて存在が保証される。

cronの環境変数。

echo '* * * * * env >/tmp/env.log' | crontab

FROM php:7.3.23-apacheのDebian 10の場合。

HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
SHELL=/bin/sh
PWD=/root

PATHはcommand -p getconf PATHを参照していると思われる。

cronに登録したコマンドが動作しない理由の一つがPATH。注意する。crontab内では変数の代入などは独自拡張になる。基本は実行するスクリプトファイルか、最後のコマンド実行部分で自分で設定する。

anacron

システムのcrontab (cronとanacronの違い) #Linux - Qiita

cronの亜種にanacronがある。

  • 遅延実行: サーバーダウンなどでスキップされた処理を、復帰時に実行する。
  • 負荷分散: 最小1日単位のスケジュールしかできない代わりに、自動でサーバーの負荷をみて分散実行してくれる。
guide

crontabのガイドライン #CentOS - Qiita

crontabでの実行開始時間は検討が必要。0分と00:00は他のサブシステムの定期タスクの密集時間のことが多いのでここは避けて5分や10分にずらすのが無難。

systemd

GNU/Linux向けのシステム管理ソフトウェア。大量のソフトの統合。サーバーソフトウェアの管理で非常に重要。

systemdのメインデーモンの/sbin/systemdは/sbin/initにリンクされていて、既存のSysV initを置換する最初のプロセスとなる。

ssytemd自体は本体の他に4のコンポーネントから構成。

  1. utility
  2. daemon
  3. target: ユニットのグループ化や処理の順序や依存関係の定義。unitの一種。
  4. unit: systemdの管理処理の単位。System V initのサービスに相当。

systemdはsystemdの管理対象となる処理の単位のユニットでシステムを管理する。ユニットは12のタイプがある。

  1. service: デーモンの開始と制御担当。
  2. socket
  3. target
  4. device
  5. mount
  6. automount
  7. timer
  8. swap
  9. path
  10. slice
  11. scope
  12. special

特に重要なのはserviceユニット。

Unit

systemd.unit

ユニットファイルはini形式のテキストファイル。

Unit File Load Path

https://chatgpt.com/c/6753b416-3d48-800b-ae6d-fcb43df956e3

いくつもの検索パスがある。が、基本的にはいかに配置する。

  • system: /etc/systemd/system/
  • $XDG_CONFIG_HOME/systemd/user/ ($XDG_CONFIG_HOMEのデフォルトは~/.config)

従って、基本は~/.config/systemd/userに配置すればいい。

systemctl

systemctl

systemdとservice managerの制御用のコマンド。状態管理からユニットの登録・削除など基本はこのコマンドとサブコマンドで全部対応する。非常に重要。

systemctl [OPTIONS...] COMMAND [UNIT...]

--userオプションでユーザー扱いしない場合、sudoで管理者権限が必要。

基本的な流れは以下となる。

  1. ユニットファイル (.service) を作成して配置 (/etc/systemd/system or ~/.config/systemd/user)。
  2. systemctl enable [unit] で登録。
  3. systemctl restart [unit] で起動。
Commands

COMMANDは種類ごとに以下を解釈。大量にある。

Unit Commands (Introspection and Modification)

ユニット自体を制御するコマンド。

  • list-units
  • list-automounts
  • list-paths
  • list-sockets
  • list-timers
  • is-active
  • is-failed
  • status
  • show
  • cat
  • help
  • list-dependencies
  • start
  • stop
  • reload
  • restart
  • try-restart
  • reload-or-restart
  • try-reload-or-restart
  • isolate
  • kill
  • clean
  • freeze
  • thaw
  • set-property
  • bind
  • mount-image
  • service-log-level
  • service-log-target
  • reset-failed
  • whoami

重要なもの。

  • 情報
    • status: ユニットの情報を表示。動作確認。稼働やエラーの確認などができる。問題があったらまずこれで確認。
    • list-units: systemdのメモリー内に存在 (実行中・ロード済み) するユニットを一覧。
  • 操作
    • restart: 手動再起動。
    • start: 手動起動。
    • stop: 手動停止。
  • 設定
    • reload: ユニットにユニット固有の設定のリロードを指令する。apache2の場合httpd.conf。
    • daemon-reload: ユニットの設定をリロードする。apacheの場合apache.service。
Unit File Commands
  • list-unit-files
  • enable
  • disable
  • reenable
  • preset
  • preset-all
  • is-enabled
  • mask
  • unmask
  • link
  • revert
  • add-wants
  • edit
  • get-default
  • set-default

ユニットファイルの操作。

  • list-unit-files: システムにインストール済みの全ユニットファイルを一覧。list-unitsと異なり、読み込んでいないものも表示する。ユニットファイルの存在と有効・無効状態の確認に使う。あまり使わないと思う [https://chatgpt.com/c/6753b416-3d48-800b-ae6d-fcb43df956e3]。
  • enable: ユニットを有効にする。設定ファイルの場所からシンボリックリンクを作成する。
  • disable: ユニットを無効にする。シンボリックリンクを削除。


  • Machne Commands
    • list-machines
  • Job Commands
    • list-jobs
    • cancel
  • Environment Commands
    • show-environment
    • set-environment
    • unset-environment
    • import-environment
  • Manager State Commands
    • daemon-reload
    • daemon-reexec
    • log-level
    • log-target
    • service-watchdogs
System Commands
  • is-system-running
  • default
  • rescue
  • emergency
  • halt
  • poweroff
  • reboot
  • kexec
  • soft-reboot
  • exit
  • switch-root
  • sleep
  • suspend
  • hibernate
  • hybrid-sleep
  • suspend-then-hibernate

特に便利なもの。

  • poweroff: 電源をオフにできる。
Options

オプションも大量にある。

  • -t, --type=
  • --state=
  • -p, --property=
  • -P
  • -a, --all
  • -r, --recursive
  • --reverse
  • --after
  • --before
  • --with-dependencies
  • -l, --full
  • --value
  • --show-types
  • --job-mode=
  • -T, --show-transaction
  • --fail
  • --check-inhibitors=
  • -i
  • --dry-run
  • -q, --quiet
  • --no-warn
  • --no-block
  • --wait
  • --user
  • --system
  • --failed
  • --no-wall
  • --global
  • --no-reload
  • --no-ask-password
  • --kill-whm
  • --kill-value=
  • -s, --signal=
  • --what=
  • -f, --force
  • --message=
  • --now
  • --root=
  • --image=
  • --image-policy=
  • --runtime
  • --preset-mode=
  • -n, --lines=
  • -o, --output=
  • --firmware-setup
  • --boot-loader-menu=
  • --boot-loader-entry=
  • -reboot-argument=
  • --plain
  • --timestep=
  • --mkdir
  • --marked
  • --read-only
  • --drop-in=
  • --when
  • --stdin
  • -H, --host=
  • -M, --machine=
  • -C, --capsule=
  • --no-pager
  • --legend=
  • -h, --help
  • --version

特に重要なオプション

  • --user: ユーザーとしてservice managerを呼び出す。このオプションを指定することでユーザー権限でsystemdを使える。
  • --system: システムとして実行。デフォルト。

systemd-system.conf

systemd-system.conf

systemdの設定ファイルとその格納場所。

システムとユーザーとで参照するファイル・場所が異なる。

  • システム: 以下のsystem.confとsystem.conf.d/*.confをこの優先順位で解釈。
    • /etc/systemd
    • /run/systemd
    • /usr/lib/systemd
  • ユーザー: ホームディレクトリー、システムの優先順位でuser.confとuser.conf.d/*.conf。
    • ~/.config/systemd
    • システムのディレクトリー (/etc/systemd /run/systemd /usr/lib/systemd)

特に、ユーザーの~/.config/systemdが重要。ユーザーが自由にできる。

user

基本はOS管理なのでroot権限で動作する。が、ユーザー別に登録したりもできる。 そのポイントを整理する。

  1. ~/.config/systemd/user/*.serviceにユニットファイルを配置。
  2. systemctlコマンドには常に--userオプションを指定する。
  3. systemctl --user enable [service]
  4. systemctl --user restart [service]

なお、ユーザーユニットは、ユーザーがログイン中のみ有効。ログアウト中も稼働させるには、lingerでの登録が必要。

このlingerでの登録が対応していないことが共用サーバーには多い。

その場合はしかたないので、cronで終了していたら再起動するコマンドを登録する。

pgrep -f "node index.js" > /dev/null || (cd index.jsがあるパス && node index.js)

Other

General

Username

パソコンのユーザー名の形式は [A-Za-z0-9._- で最低8文字まで可能 – senooken JP]

  • 使用可能文字: [A-Za-z0-9._-] の正規表現 (ただし,先頭は-以外)。
  • 文字数: 最低8文字まで可能。9文字以上は実装依存。

辞書

IMEの辞書登録の駆使で作業効率が大幅に変わる。

頻出単語を入力しておくと良い。

  • 個人情報
    • 住所
    • 氏名
    • 電話番号
    • メールアドレス
  • 人名
    • 同僚などよく連絡する人の苗字は登録しておくと楽かも。
  • 挨拶
    • ありがとうございました。
    • よろしくお願いします。
    • ご確認お願いします。
  • 数字
    • 上付き
    • 下付き
    • 丸付き
じゅうしょ
しめい
でんわ 333-4444-4444
でんわ 111111111111
めあど
めーる
あり ありがとうございました。 普通名詞
あり ありがとうございます。 普通名詞
おね お願いします。 普通名詞
ごか ご確認お願いします。 普通名詞
ごた ご対応ありがとうございました。 普通名詞
ごた ご対応ありがとうございます。 普通名詞
よろ よろしくお願いします。 普通名詞


RDP

VNCとの違い

* https://www.routerhosting.com/rdp-vs-vnc-remote-desktop-comparison/

* https://superuser.com/questions/32495/whats-the-difference-between-rdp-vs-vnc

* https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97

* https://ja.wikipedia.org/wiki/Virtual_Network_Computing

* https://ja.wikipedia.org/wiki/Remote_Desktop_Protocol

RDPは意味を送受信している、VNCは画像を送受信している。扱うデータ量・負荷が違う。

教育だとか、サポートなどではVNCが有利。普段の使用ではRDPのほうが有利。

リモートデスクトップ

https://www.tmp1024.com/articles/solve-black-screen-when-ubuntu-remote-desktop

Ubuntu 19.10でのWindows 10からのリモートデスクトップの手順を整理する。

まずxrdp (0.9.9-1) をインストールする。

sudo apt install xrdp

その後、Ubuntuはサインアウト・ログアウトする。

Windows 10のリモートデスクトップ (mstsc.exe) を実行して、Ubuntuのホスト名やIPアドレスで接続する。

RDPでのログインユーザーが既にログイン済みだと画面が真っ黒になるらしい。

[リモートデスクトップでアクセスしたら真っ黒の画面が表示される問題の解決 \| 人と情報](https://www.tmp1024.com/articles/solve-black-screen-when-ubuntu-remote-desktop)

そのほか、ログイン時に認証ダイアログが毎回表示される。これはどうにかしたい。

それ以外は良好。

Clipboard

Windows

Windows 10からWin-vでクリップボードマネージャーが起動する。

Hotkey

【Maccy】MacでもWin+Vが使いたいんじゃぁ!! ~ Macでクリップボード履歴を使えるようにしてくれるユーティリティ - Nishiki-Hub

MacとWindowsでクリップボードマネージャーのホットキーを共通化。

C-Cがいいと思う。CopyやClipboardのCだから。いや、C-C/C-M-CはMacの開発者ツールのショートカットキーだからだめ。

M-Cがいいと思う。

CopyQ

Hotkey

Keyboard shortcut to access copyq? · Issue #508 · hluk/CopyQ

FAQ · hluk/CopyQ Wiki

  • [File]-[Commands](F6)
  • [Add]-[Show/hide main window]-[OK]
  • [Global Shortcut] の隣のキーを選びショートカットキーを登録-[OK]
Notes/Tag

クリップボードの内容に説明をつけることができる。Note/Tagの2種類がある。

単にタイトルをつけるだけなら、NotesでOK。Tagは分類用。

[右クリック]-[Edit Notes] でNotesを追加・編集できる。

Keybind

App Menu

いわゆる右クリックのコンテキストメニュー。これをショートカットキーで実現する方法一応ある。

Macの場合。「Macの右クリック - Apple サポート (日本)」にあるように、Control-左クリックか、2本指クリック。

上記にあるように、F12でもできるらしい。ただし事前設定が必要。

[System]-[Accessibility]-[Pointer Control]-[Alternate pointer actions]=[on] にする。これでF12で開ける。右側のオプションボタンで変更もできる。

Key code

Mac

Ref: macos - Where can I find a list of Mac virtual key codes? - Stack Overflow.

以下のコマンドで一覧を確認できる (Mac v14.2.1、MacBook Air (M1, 2020)、 JIS配列)。

grep 'kVK_.*=' /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h

一覧。

  kVK_ANSI_A                    = 0x00,
  kVK_ANSI_S                    = 0x01,
  kVK_ANSI_D                    = 0x02,
  kVK_ANSI_F                    = 0x03,
  kVK_ANSI_H                    = 0x04,
  kVK_ANSI_G                    = 0x05,
  kVK_ANSI_Z                    = 0x06,
  kVK_ANSI_X                    = 0x07,
  kVK_ANSI_C                    = 0x08,
  kVK_ANSI_V                    = 0x09,
  kVK_ANSI_B                    = 0x0B,
  kVK_ANSI_Q                    = 0x0C,
  kVK_ANSI_W                    = 0x0D,
  kVK_ANSI_E                    = 0x0E,
  kVK_ANSI_R                    = 0x0F,
  kVK_ANSI_Y                    = 0x10,
  kVK_ANSI_T                    = 0x11,
  kVK_ANSI_1                    = 0x12,
  kVK_ANSI_2                    = 0x13,
  kVK_ANSI_3                    = 0x14,
  kVK_ANSI_4                    = 0x15,
  kVK_ANSI_6                    = 0x16,
  kVK_ANSI_5                    = 0x17,
  kVK_ANSI_Equal                = 0x18,
  kVK_ANSI_9                    = 0x19,
  kVK_ANSI_7                    = 0x1A,
  kVK_ANSI_Minus                = 0x1B,
  kVK_ANSI_8                    = 0x1C,
  kVK_ANSI_0                    = 0x1D,
  kVK_ANSI_RightBracket         = 0x1E,
  kVK_ANSI_O                    = 0x1F,
  kVK_ANSI_U                    = 0x20,
  kVK_ANSI_LeftBracket          = 0x21,
  kVK_ANSI_I                    = 0x22,
  kVK_ANSI_P                    = 0x23,
  kVK_ANSI_L                    = 0x25,
  kVK_ANSI_J                    = 0x26,
  kVK_ANSI_Quote                = 0x27,
  kVK_ANSI_K                    = 0x28,
  kVK_ANSI_Semicolon            = 0x29,
  kVK_ANSI_Backslash            = 0x2A,
  kVK_ANSI_Comma                = 0x2B,
  kVK_ANSI_Slash                = 0x2C,
  kVK_ANSI_N                    = 0x2D,
  kVK_ANSI_M                    = 0x2E,
  kVK_ANSI_Period               = 0x2F,
  kVK_ANSI_Grave                = 0x32,
  kVK_ANSI_KeypadDecimal        = 0x41,
  kVK_ANSI_KeypadMultiply       = 0x43,
  kVK_ANSI_KeypadPlus           = 0x45,
  kVK_ANSI_KeypadClear          = 0x47,
  kVK_ANSI_KeypadDivide         = 0x4B,
  kVK_ANSI_KeypadEnter          = 0x4C,
  kVK_ANSI_KeypadMinus          = 0x4E,
  kVK_ANSI_KeypadEquals         = 0x51,
  kVK_ANSI_Keypad0              = 0x52,
  kVK_ANSI_Keypad1              = 0x53,
  kVK_ANSI_Keypad2              = 0x54,
  kVK_ANSI_Keypad3              = 0x55,
  kVK_ANSI_Keypad4              = 0x56,
  kVK_ANSI_Keypad5              = 0x57,
  kVK_ANSI_Keypad6              = 0x58,
  kVK_ANSI_Keypad7              = 0x59,
  kVK_ANSI_Keypad8              = 0x5B,
  kVK_ANSI_Keypad9              = 0x5C
  kVK_Return                    = 0x24,
  kVK_Tab                       = 0x30,
  kVK_Space                     = 0x31,
  kVK_Delete                    = 0x33,
  kVK_Escape                    = 0x35,
  kVK_Command                   = 0x37,
  kVK_Shift                     = 0x38,
  kVK_CapsLock                  = 0x39,
  kVK_Option                    = 0x3A,
  kVK_Control                   = 0x3B,
  kVK_RightCommand              = 0x36,
  kVK_RightShift                = 0x3C,
  kVK_RightOption               = 0x3D,
  kVK_RightControl              = 0x3E,
  kVK_Function                  = 0x3F,
  kVK_F17                       = 0x40,
  kVK_VolumeUp                  = 0x48,
  kVK_VolumeDown                = 0x49,
  kVK_Mute                      = 0x4A,
  kVK_F18                       = 0x4F,
  kVK_F19                       = 0x50,
  kVK_F20                       = 0x5A,
  kVK_F5                        = 0x60,
  kVK_F6                        = 0x61,
  kVK_F7                        = 0x62,
  kVK_F3                        = 0x63,
  kVK_F8                        = 0x64,
  kVK_F9                        = 0x65,
  kVK_F11                       = 0x67,
  kVK_F13                       = 0x69,
  kVK_F16                       = 0x6A,
  kVK_F14                       = 0x6B,
  kVK_F10                       = 0x6D,
  kVK_F12                       = 0x6F,
  kVK_F15                       = 0x71,
  kVK_Help                      = 0x72,
  kVK_Home                      = 0x73,
  kVK_PageUp                    = 0x74,
  kVK_ForwardDelete             = 0x75,
  kVK_F4                        = 0x76,
  kVK_End                       = 0x77,
  kVK_F2                        = 0x78,
  kVK_PageDown                  = 0x79,
  kVK_F1                        = 0x7A,
  kVK_LeftArrow                 = 0x7B,
  kVK_RightArrow                = 0x7C,
  kVK_DownArrow                 = 0x7D,
  kVK_UpArrow                   = 0x7E
  kVK_ISO_Section               = 0x0A
  kVK_JIS_Yen                   = 0x5D,
  kVK_JIS_Underscore            = 0x5E,
  kVK_JIS_KeypadComma           = 0x5F,
  kVK_JIS_Eisu                  = 0x66,
  kVK_JIS_Kana                  = 0x68

Keyhac

About

Mac版はmac_portブランチ。

Mac

Mac版は英語サイト (craftware - Keyhac) からじゃないとダウンロードできないので注意する。

マニュアル: keyhac: User Manual

またWindowsと異なり、exeファイルと同じ場所のconfig.pyを読み込んだりはしてくれない。

$HOME/Library/Application Support/Keyhac/に配置する必要がある。

また、そもそもキーコード自体が異なるので、一部は専用に作る必要がある。

Base

config.py内にconfigure(keymap)関数を定義して、この中で設定を記述していく。

引数のkeymapにはKeymapオブジェクトが渡されるのでこれを操作することで設定する。

    keymap_global = keymap.defineWindowKeymap()

Keymap.defineWindowKeymapでWindowKeymapオブジェクトを返す。このオブジェクトに対してグローバルキーマップを定義していく。

これが基本。

基本的に全部文字列。キーコードを指定する部分は数値も可能だが、10進数の文字列にしておいたほうがいい。

Modifier

keymap.defineModifierで、Shift/Ctrlのように同時押しに意味のあるキー (modifier) を追加できる。

スペースの左右のキーにShift/Ctrl相当の機能をもたせる上で非常に重要。

# ユーザモディファイアキーの定義
keymap.defineModifier( 235, "User0" )

上記の例では235のキーコードにU0のモディファイアキーを設定している。U0はUser0の短縮表記。ただし、Windows専用。短縮表記は使わない方がいい。

Policy
  • スペースの左右のキー (Windows=変換/無変換、Mac=英数/かな) をモディファイアキーに追加。
  • LSS/RSSと表記 (Left Side Space/Right Side Space)
  • Ctrl/Cmd=CCと表記。
  • SpaceはCtrlのワンショットモディファイア。
  • LSS=Shift、RSS=U0、Space=CC。

hjklのVimのキー移動を定義したいから、RSSはU0。これは確定。

U0の操作にShiftを組み合わせたいことがあるからLSS=Shiftがいい。

キーの違いで、Windows/Macで共有と独立部分がある?

Package manager

パッケージ

pkgs.org
Debian

Debian -- ディストリビューションアーカイブ

Ubuntu
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

## Ubuntu distribution repository
##
## The following settings can be adjusted to configure which packages to use from Ubuntu.
## Mirror your choices (except for URIs and Suites) in the security section below to
## ensure timely security updates.
##
## Types: Append deb-src to enable the fetching of source package.
## URIs: A URL to the repository (you may add multiple URLs)
## Suites: The following additional suites can be configured
##   <name>-updates   - Major bug fix updates produced after the final release of the
##                      distribution.
##   <name>-backports - software from this repository may not have been tested as
##                      extensively as that contained in the main release, although it includes
##                      newer versions of some applications which may provide useful features.
##                      Also, please note that software in backports WILL NOT receive any review
##                      or updates from the Ubuntu security team.
## Components: Aside from main, the following components can be added to the list
##   restricted  - Software that may not be under a free license, or protected by patents.
##   universe    - Community maintained packages. Software in this repository receives maintenance
##                 from volunteers in the Ubuntu community, or a 10 year security maintenance
##                 commitment from Canonical when an Ubuntu Pro subscription is attached.
##   multiverse  - Community maintained of restricted. Software from this repository is
##                 ENTIRELY UNSUPPORTED by the Ubuntu team, and may not be under a free
##                 licence. Please satisfy yourself as to your rights to use the software.
##                 Also, please note that software in multiverse WILL NOT receive any
##                 review or updates from the Ubuntu security team.
##
## See the sources.list(5) manual page for further settings.
Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

## Ubuntu security updates. Aside from URIs and Suites,
## this should mirror your choices in the previous section.
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

以下のURIがある模様。

過去アーカイブを参照するようにする。

APT

Debian系パッケージマネージャーAPTの使用方法 – senooken JP

コマンド一覧
目的 コマンド
情報 apt show <package>
利用可能バージョンの確認 apt show -a <package>apt list --all-versions <package>
検索 apt search <regex>
インストール sudo apt install <package>sudo apt reinstall <package>sudo apt builde-dep <package>
更新 sudo apt updatesudo apt upgradesudo apt full-upgradesudo apt install <package>
削除 sudo apt remove <package>sudo apt purge <package>sudo apt autoremovesudo apt cleansudo apt autoclean
インストール済みパッケージの確認 apt list --installeddpkg -l | grep '^.i'apt-mark showmanualapt-mark showauto
パッケージ中身の一覧 dpkg -L <package>
ファイルの該当パッケージの確認 dpkg -S <file>
依存関係の確認 apt show <package> | grep Dependsapt depends <package>apt rdepends <package>
パッケージの自動・手動フラグの指定 apt-mark auto <package>apt-mark manual <package>
パッケージのhold apt-mark hold <package>apt-mark unhold <package>apt-mark showhold
リポジトリーの追加・削除・編集 sudo add-apt-repository <repository>sudo add-apt-repository -r <repository>sudo apt edit-sources
パッケージの操作履歴の確認 cat /var/log/apt/history.log
リポジトリー

aptの参照元のリポジトリーのリスト。以下の2か所。

  • /etc/apt/sources.list
  • /etc/apt/sources.list.d/

直接テキストエディターで編集も可能だが、操作用の専用コマンドadd-apt-repositoryがある。

sudo add-apt-repository 'deb http://myserver/path/to/repo stable myrepo'
sudo add-apt-repository -r ppa:user/repository

-r --removeで該当リポジトリーを削除。ただ、既存のリポジトリーの確認が必要なので、自動化用。

他に、apt edit-sorucesコマンドがある。これを使うと、nano/viなどの選ばれたテキストエディターで構文チェックしながらsources.listを編集。引数を指定したら、sources.list.d以下を編集。visudoのapt版。

編集時はapt edit-sourcesを使うとよさそう。

edit-sourcesで選択したテキストエディターはsudo select-editorか~/.selected_editrで編集可能 (select-editor(1) — sensible-utils — Debian buster — Debian Manpages)。

sources.list

/etc/apt/sources.list.dディレクトリーには追加のリストを配置する。拡張子は.listか.sourcesで、それぞれの拡張子ごとに、ファイル形式が異なる。

.list one-line-style format

.listの拡張子には、昔ながらの1行形式を指定する。

deb [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]
deb-src [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]

.sources deb822-style format

.sourcesの拡張子には、Debianのメタデータファイルで使われる構文を使う。

     Types: deb deb-src
     URIs: uri
     Suites: suite
     Components: [component1] [component2] [...]
     option1: value1
     option2: value2
  • deb: debian archive, distribution/componentを参照。
  • deb-src: ソースコードを参照。
  • uri: 配布元を指定。
  • suite: stable, testing, codename (buster/bullseyeなど)。uriのサブディレクトリー正確なパス (終端/)。そうでなければ、componentを指定。
  • component: main, contrib, non-free, non-free-firmware

ただ、Ubuntuの場合、独自拡張が入っていて、suiteとcomponentは以下も追加。

  • suite:
    • <name>-updates: 主なバグ修正更新。
    • <name>-backports: テストされていないが便利な機能。
  • components:
    • restricted: 不自由ソフト。
    • universe: コミュニティー保守パッケージ。
    • multiverse: コミュニティ保守不自由ソフト。

suiteとcomponentsを整理する。

  • suite:
    • <name>: コードネーム。メインパッケージ。
    • <name>-security: たぶん保安関係。文書に記載なし。
    • <name>-updates: 主なバグ修正更新。
    • <name>-backports: テストされていない最新更新。
  • component: main, contrib, non-free, non-free-firmware
    • restricted: 不自由ソフト。
    • universe: コミュニティー保守パッケージ。
    • multiverse: コミュニティ保守不自由ソフト。

deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] http://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] http://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] http://deb.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://deb.debian.org/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
add-apt-repository

add-apt-repository(1) — software-properties-common — Debian buster — Debian Manpages

add-apt-repository [OPTIONS] REPOSITORY

3種類の記法が許容されている。

  1. sources.listのdeb行
  2. ppa:<user>/<ppa-name>
  3. distoribution component指定

https://grok.com/share/c2hhcmQtMw%3D%3D_16ab69f8-fae4-46b8-9f20-81a98ec20376

CODENAME=$(lsb_release -sc)
sudo add-apt-repository "deb http://old-releases.ubuntu.com/ubuntu $CODENAME main universe multiverse" -y && \
sudo add-apt-repository "deb http://old-releases.ubuntu.com/ubuntu $CODENAME-updates main universe multiverse" -y && \
sudo add-apt-repository "deb http://old-releases.ubuntu.com/ubuntu $CODENAME-security main universe multiverse" -y

Ubuntuなら上記で古いパッケージも取れる。

dockerで使う場合、lsb_releaseやadd-apt-repositoryはコマンドがそもそもないので、使わない方法での対応が必要。

# RUN sh -c '\
#     CODENAME=$(sed -n "/^VERSION_CODENAME/s/^.*=//p" /etc/os-release) && \
#     echo "deb http://archive.debian.org/debian-security $CODENAME main" >>/etc/apt/sources.list && \
#     echo "deb http://archive.debian.org/debian-security $CODENAME-security main  " >>/etc/apt/sources.list && \
#     echo "deb http://archive.debian.org/debian-security $CODENAME-updates main  " >>/etc/apt/sources.list'
RUN sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \ 
    sed -i 's|http://security.debian.org/debian-security|http://archive.debian.org/debian-security|g' /etc/apt/sources.list && \ 
GPG error

https://grok.com/share/c2hhcmQtMw%3D%3D_4925c047-4ca3-4612-a86a-93085596ac62

Debian apt update GPG error #Docker - Qiita

FROM php:7.0.33-apacheなど古めのphp+apcheを使うとDebianも古くてapt updateがうまくいかない。

0.560 Get:4 http://archive.debian.org/debian stretch Release [118 kB]
0.819 Err:5 http://archive.debian.org/debian stretch-updates Release
0.819   404  Not Found [IP: 10.0.0.28 8080]
0.831 Get:6 http://archive.debian.org/debian stretch Release.gpg [3177 B]
0.898 Ign:6 http://archive.debian.org/debian stretch Release.gpg
0.900 Reading package lists...
0.905 W: GPG error: http://archive.debian.org/debian-security stretch/updates InRelease: The following signatures were invalid: EXPKEYSIG AA8E81B4331F7F50 Debian Security Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 112695A0E562B32A
0.905 E: The repository 'http://archive.debian.org/debian-security stretch/updates InRelease' is not signed.
0.905 E: The repository 'http://archive.debian.org/debian stretch-updates Release' does not have a Release file.
0.905 W: GPG error: http://archive.debian.org/debian stretch Release: The following signatures were invalid: EXPKEYSIG 04EE7237B7D453EC Debian Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> EXPKEYSIG EF0F382A1A7B6500 Debian Stable Release Key (9/stretch) <debian-release@lists.debian.org> The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY 0E98404D386FA1D9
0.905 E: The repository 'http://archive.debian.org/debian stretch Release' is not signed.

gpg errorがでている。これはまずい。

Debian apt update GPG error #Docker - Qiita

FROM php:7.0.33-apache

RUN sed -i 's|deb.debian.org/debian|archive.debian.org/debian|g' /etc/apt/sources.list && \
    sed -i 's|security.debian.org/debian-security|archive.debian.org/debian-security|g' /etc/apt/sources.list
RUN apt-get update \
    ; apt-get install -y --allow-unauthenticated debian-archive-keyring
RUN apt update ; apt install -y unzip

こんな感じでリポジトリーを古いものにして、鍵をインストールしたら解決した。意味がよくわからない。

いや、単にこれでもいけた。

FROM php:7.0.33-apache

RUN sed -i -e 's|deb.debian.org/|archive.debian.org/|g' \
    -e 's|security.debian.org/|archive.debian.org/|g' /etc/apt/sources.list
RUN apt-get update ; apt-get install -y --allow-unauthenticated unzip
FROM php:7.4.33-apache
RUN apt update ; apt install -y unzip