「OS」の版間の差分

提供:senooken JP Wiki
(Saving)
(App resources About app resources)
 
(同じ利用者による、間の92版が非表示)
1行目: 1行目:
パソコンのOSごとの記録。
パソコンのOSごとの記録。
== Android ==
=== 古い端末でのSSLエラー ===
[https://pc.watch.impress.co.jp/docs/news/1287910.html 古い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 ======
[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 ==
== iOS ==
7行目: 664行目:
==== Keyboard ====
==== Keyboard ====
[Settings]-[General]-[Keyboards] が設定項目。
[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 =====
===== Gboard =====
81行目: 751行目:


==== Saving ====
==== Saving ====
[https://www.reddit.com/r/iphone/comments/1dh0z24/low_data_use_browser_for_iphone/ Low data use browser for iPhone : r/iphone]
 
===== 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はグローバル。基本無料で追加機能は有料。


通信を節約する方法がいくつかある。
通信を節約する方法がいくつかある。
91行目: 766行目:
## .+/Block all type resource=off/
## .+/Block all type resource=off/


<blockquote>2 番目に、Safari をコンテンツ ブロッカーと一緒に使用することをお勧めします。私は 1Blocker を使用していますが、メディアを無効にするカスタム ルールを作成して、帯域幅を大幅に節約できます。[高度なカスタマイズ]、[カスタム ルール]、[新規ルール] の順に進み、正規表現に.+(ドットとプラス記号はすべての URL に一致します) を入力し、[すべてのタイプのリソースをブロック] をオフに切り替え、画像、フォント、RAW、SVG、メディア、ポップアップをオンに戻します。保存します。これにより、これらの特定のリソース タイプをすべて読み込む要求がグローバルにブロックされ、帯域幅を大幅に節約できます。</blockquote>
<blockquote>2 番目に、Safari をコンテンツ ブロッカーと一緒に使用することをお勧めします。私は 1Blocker を使用していますが、メディアを無効にするカスタム ルールを作成して、帯域幅を大幅に節約できます。[高度なカスタマイズ]、[カスタム ルール]、[新規ルール] の順に進み、正規表現に.+(ドットとプラス記号はすべての URL に一致します) を入力し、[すべてのタイプのリソースをブロック] をオフに切り替え、画像、フォント、RAW、SVG、メディア、ポップアップをオンに戻します。保存します。これにより、これらの特定のリソース タイプをすべて読み込む要求がグローバルにブロックされ、帯域幅を大幅に節約できます。</blockquote>カスタムルールのメディア無効の効果が大きい。
 
280blockerが日本の広告に一番詳しい。こちらで広告元ドメインのリストを配布しているようで、これを取り込むとほぼ広告をブロックできるらしい。
 
iPhoneで以下のURLの年月の部分を現在にしてダウンロードする。
 
https://280blocker.net/files/280blocker_1blocker_202310.1blockpkg
 
[https://x.com/280blocker/status/1881856052351954949 Xユーザーの280blockerさん: 「弊社にて提供中の1blocker用ファイルについてブログに記載いたしました。」 / X]
 
ただ、1blockerが6.xにバージョンアップして、定義ファイルに更新が入って互換性がなくなった模様。
 
280blockerは元々1blockerの5chのスレッドで280番目にレスしたことが始まりだとか。2021年からトビラシステムズに3億円くらいで買収されたらしい。
 
===== AdGuard =====
 
* [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]
 
こちらの手順に従ってAdGuardを試す。AdGuardアプリ-[Settings]-[Support]-[Watch video tutorial] をやればよさそう。
 
# AdGuardをインストール。
# [Settings]-[Apps]-[Safari]-[General]-[Extensions]
# AdGuardで始まるスイッチを全部オンにする。
# Safariを開く。
# アドレスバーの左の[aA]など-[Manage Extensions]-AdGuardをオン。
# アドレスバーの左の[aA]など-[AdGuard]-[Always Allow]-[Always Allow on Every Website]
 
[https://qiita.com/loach/items/950ce46f5e3ab946803a AdGuard DNSで広告除去 #広告ブロック - Qiita]
 
アプリの他にDNSもある。これを設定するとSafari以外も埋込広告以外をブロックできる。
 
「[https://adguard-dns.io/ja/public-dns.html パブリックAdGuard DNSサーバーに接続する方法 | AdGuard DNS]」に手順がある。これのOption2: Configure AdGuard DNS manuallyをやる。
 
# AdGuardのDNSプロファイルをダウンロード
# [Settings]-[General]-[VPN & Device Management]-[Downloaded profile]-[AdGuard DoH]-[Install] を選ぶ。
 
これでWebベースの広告はだいたいブロックされて、動作が軽くなるらしい。
 
===== Safari =====
[https://digital-style.jp/a-speed-limit iPhoneの通信量を劇的に節約するコツ10選【ギガ不足を解消】 | デジスタ]
 
Safariの設定が重要。
 
[Settings]-[Apps]-[Safari]
 
[Preload Top Hit/トップヒットを事前に読み込む]: これをオフにする。検索時にブックマークから訪問候補を挙げてくれて、さらにバックグラウンドで読み込みも開始する。


=== Sound ===
=== Sound ===
99行目: 820行目:


=== Mail ===
=== Mail ===
==== 複数アカウント ====
「[https://xtech.nikkei.com/atcl/nxt/column/18/00088/00082/ 複数アカウントを使いこなす、iPhoneメールアプリの知られざる便利機能 | 日経クロステック(xTECH)]」
「[https://xtech.nikkei.com/atcl/nxt/column/18/00088/00082/ 複数アカウントを使いこなす、iPhoneメールアプリの知られざる便利機能 | 日経クロステック(xTECH)]」


iPhoneのメールアプリは標準のMailを使うのがよいだろう。K-9がないから。複数アカウントにも対応しているが、設定が若干特殊。アプリ設定からではなく、iOS本体の設定から行う。
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.] の警告が表示されている。
「[https://discussions.apple.com/thread/254871784?sortBy=rank All sent messages marked blocked sender - Apple Community]」で同じ議論がある。
上記警告文の [Settings] からMailアプリの設定で [Blocked Sender Options] や [Blocked] にブロックリストがあるので、これを解除するといいらしい。
電話の受信拒否をすると、同じアドレスがこちらに入る模様。
[Blocked Sender Options] を [Move to Trash] から [Leave in Inbox] にするだけでもいいかもしれない。
ただ、特にブロックした覚えのないメールが勝手に登録されていたので、注意が必要。


=== App ===
=== App ===
677行目: 1,415行目:


QRQRがいい。
QRQRがいい。
=== Other ===
==== エクスプレスカード ====
[https://www.pasmo.co.jp/mp/app/use/express/ エクスプレスカード(Face ID等なしで利用する)|Apple PayのPASMO]
[Wallet]-任意のカード-[Card Details]-[Express Transit]
ここがOnだと本体をかざすだけで、アプリを起動することなく決済可能。
1枚しか設定できない。
iPhoneの電池が切れても一定時間は使用可能。
==== 近接センサー ====
* https://chatgpt.com/share/680ea770-2af4-800b-9bdf-d13c66ce8381
* [https://iphone-shuuri.jp/blog/kawagoe/9938/ iPhoneの近接センサーとは?壊れたらどうする?故障原因と対処法について - スマホ修理ジャパン川越店ブログ]
通話中に、耳を話すと、勝手に画面ロックになったり、画面操作中に強制的に真っ黒になってまともに操作できない。
IPhoneの上部中心に近接センサーがあって、これで制御されているらしい。
[Settings]-[Accessibility]-[Touch]-[Prevent Lock to End Call]=trueに変更する。これで電源ボタンを押しても通話は中断しない。
これでましになった気がする。
==== 着信拒否 ====
[https://iphone.f-tools.net/QandA/Tyakusin-kyohi.html iPhoneで着信拒否やメール拒否]
着信拒否している場合、着信が入らず、ツーツーとなる。模様。転送やアナウンスがない。それがポイント。


== Windows ==
== Windows ==


=== Other ===
=== Other ===
==== IME ====
[https://senooken.jp/post/2016/04/03/2567/ MS IMEでIMEのオン/オフの切り替え快適化 – senooken JP]
右下IMEアイコンを右クリック-[設定]-[キーとタッチのカスタマイズ]‐[キーの割り当て]
* [各キー/キーの組み合わせに好みの機能を割り当てます]=オン
* 無変換キー=IME-オフ
* 変換キー=IME-オン


==== 高速スタートアップ ====
==== 高速スタートアップ ====
735行目: 1,514行目:
Ref: [https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=0111-3165 FMV Q&A - [Windows 11] キーを押し続けたときに、同じ文字が連続して入力される速度を調整する方法を教えてください。 - FMVサポート : 富士通パソコン].
Ref: [https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=0111-3165 FMV Q&A - [Windows 11] キーを押し続けたときに、同じ文字が連続して入力される速度を調整する方法を教えてください。 - FMVサポート : 富士通パソコン].


[コントロールパネル]-[キーボード]
[コントロールパネル]-[キーボード]-[速度]
 
* 文字の入力
** 表示までの待ち時間 (デフォルト3/4)=4/4


==== Mouse ====
==== Mouse ====
750行目: 1,532行目:


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


* ファイルおよびフォルダー
* ファイルおよびフォルダー
757行目: 1,541行目:
*** ☑隠しファイル、隠しフォルダー、および隠しドライブを表示する。
*** ☑隠しファイル、隠しフォルダー、および隠しドライブを表示する。
*** □登録されている拡張子は表示しない
*** □登録されている拡張子は表示しない
=== WSL ===
==== http_proxy ====
[Linux 用 Windows サブシステム設定]-[ネットワーク]-[オート プロキシが有効]=オンだと、wslやubuntu上でhttp_proxy/HTTP_PROXYの環境変数が自動的に設定される。
混乱するのでオフでいいと思う。


== Mac ==
== Mac ==
=== Application ===
==== Applications ====
Macの実行ファイルは.appファイル。これは/Applicationsに配置されている。Laucnhpadはこのディレクトリー内を表示している模様。
==== Uninstall ====
[https://support.apple.com/ja-jp/102610 Mac でアプリをアンインストールする - Apple サポート (日本)]
いくつか方法がある。
App Storeからインストールしたアプリの場合、Launchpadを開いて該当アプリを表示して、ドラッグすると左上に×ボタンが表示されるので、これをクリックするとアンインストールになる。
AppStore以外の場合、Finderから該当ファイルを削除する。/Applicationsか$HOME/Applicationsを開いて該当アプリ.appを削除する。


=== System ===
=== System ===
==== スリープの無効化 ====
[https://recoverit.wondershare.jp/mac-tips/how-to-keep-imac-and-macbook-from-sleeping.html 【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コマンドの実行がある。
* [https://qiita.com/hakuro/items/c2302f1ad83bf3424a1a caffeinateコマンドでMacの自動スリープを抑制する #MacOSX - Qiita]
* [https://qiita.com/yanagih/items/cda860c330f1322909c2 カフェインでMacを眠らせない! #macOS - Qiita]
caffeinate -iを実行すると、C-cで中断するまでずっとスリープを抑止するらしい。


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


==== Applications ====
===== DiscreteScroll =====
Macの実行ファイルは.appファイル。これは/Applicationsに配置されている。Laucnhpadはこのディレクトリー内を表示している模様。
 
* [http://www.neko.ne.jp/%7Efreewing/software/macos_disable_mouse_wheel_scroll_acceleration/#google_vignette Macのマウスホイールの加速度を無効にして Windowsと同じ動きにする方法、macOSのクソな UI動作仕様を修正 (macOSのマウスホイールのスクロールの加速度の動きにはイラついている人が世界中に大勢居ます)]
* [https://github.com/emreyolcu/discrete-scroll GitHub - emreyolcu/discrete-scroll: Fix for macOS's unnecessary scroll wheel acceleration]
 
Macのマウスホイールのスクロールは加速度に応じる。高速に動かすと移動量が増える。指が疲れる。
 
加速度を無視して、Windows同様に一定量の移動にしてくれるのが、DiscreteScroll。


==== lanchctl ====
==== lanchctl ====
809行目: 1,637行目:
  launchctl load ~/Library/LaunchAgents/SSLKEYLOGFILE.plist  
  launchctl load ~/Library/LaunchAgents/SSLKEYLOGFILE.plist  
値を修正した場合、一度unloadしてからloadする。
値を修正した場合、一度unloadしてからloadする。
==== Finder ====
===== 拡張子の表示 =====
https://support.apple.com/ja-jp/guide/mac-help/mchlp2304/mac
# MacのFinder  で、「Finder」>「設定」と選択してから、「詳細」をクリックします。
# 「すべてのファイル名拡張子を表示」を選択するか選択を解除します。
==== 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 ====
===== ¥と\ =====
* [https://qiita.com/minattoo/items/1ce084614246764187c3 Macでバックスラッシュ "\"が打てない時の対処法 #Keyboard - Qiita]
* [https://note.com/nonnonlife/n/n6a2ddb5191bd 【Mac】デフォルトの"¥"キー入力を「\」に変更する方法|NonNonLife]
Macだと¥キーを入力すると¥が入力される。この文字を使うことはほぼなくて、バックスラッシュを入力したい。option-¥で入力できるが面倒。設定で変更できる。
# [システム設定]-[キーボード]-[入力ソース]-[編集]
#[日本語]
##☑️英字
##["¥"キーで入力する文字]=\
# [ABC]-[-]で削除する。
[ABC]の削除がポイント。ただ、これをするとcontrol-3で絵文字が出る問題がある。ABCは戻した方がいいかも。
==== 絵文字を表示 ====
[https://zenn.dev/ctxzz/articles/0bcc4acaa9b1b5 【Mac】Control+3で顔文字リストが表示されるショートカットキーを変更する方法]
キーボードの入力ソースが日本語だとこの問題が起こる。
他のショートカットキーの割り当てで無効にできるとの情報があったが、Mac 15.3.1では無効にならず。諦める。
===== Google日本語入力のアンインストール =====
[https://www.drbuho.com/jp/how-to/uninstall-google-japanese-input-on-mac 【助かった】MacでGoogle日本語入力を完全にアンインストールする方法]
# [System settings]-[Keyboard]-[Text input]-[Input Sources]-[Edit] を選ぶ。
# Google日本語入力の項目を選んで[-]を選ぶ。
# Finderで[Application]ディレクトリーを開いて[Google日本語入力]を削除する。
===== 変換Enter 2回 =====
[https://ischool.co.jp/2019-08-05-japanese-input-in-mac-how-to-convert-at-once-instead-of-twice/ Mac日本語入力、エンター2回でなく1回で変換する方法 | iSchool合同会社]
MacのIMEは変換後確定にEnter2回必要。これが面倒。1回にすることができる。
[システム設定]-[キーボード]-[入力ソース]-[編集]-[日本語]-[☑️Windows風のキー操作]
これで1回で済む。
===== ライブ変換オフ =====
[https://easytouse.jp/2018/01/23/mac-liveconversion-off/#:~:text=%E3%83%A9%E3%82%A4%E3%83%96%E5%A4%89%E6%8F%9B%E3%82%92%E3%82%AA%E3%83%95%E3%81%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86&text=%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%80%8C%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%80%8D%E3%82%92,%E5%A4%89%E6%8F%9B%E3%80%8D%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%A4%96%E3%81%99%E3%80%82 Macの「ライブ変換」機能をOFFにする方法 – Easytouse]
デフォルトでライブ変換で自動変換してくれる。が、これが期待と違うことがあってイライラするのでオフにする。
[システム設定]-[キーボード]-[入力ソース]-[編集]-[日本語]-[▫️ライブ変換]
これでオフにすればOK。
===== 追加辞書 =====
[https://support.apple.com/ja-jp/guide/japanese-input-method/jpim10226/mac Macの追加辞書に読み込むためのテキストファイルを作成する - Apple サポート (日本)]
単語の読み<code>,</code>単語<code>,</code>品詞<code>,</code>(<code>,,</code>メモ)
{| class="wikitable"
! colspan="4" |要素
! colspan="8" |説明
|-
| colspan="4" |単語の読み
| colspan="8" |単語の読みをひらがなで入力します。長さは32文字以下にする必要があります。
単語にASCIIカンマやスペースを含める場合は、単語を引用符(“”)で囲みます。
単語にASCII引用符(")を入力する場合は、単語を1バイトの引用符で囲み、1バイトの引用符の周囲に連続する2つの1バイトの引用符を入力します。
|-
| colspan="4" |単語
| colspan="8" |目的の変換結果を入力します。1つの単語の長さは64文字以下にする必要があります。単語には、Unicodeコンソーシアムで定義されている文字と記号であれば、どれでも使用できます。
|-
| colspan="4" |品詞
| colspan="8" |次のいずれかの[[/support.apple.com/ja-jp/guide/japanese-input-method/jpim10211/6.3/mac/15.0|品詞]]を指定します:
* 普通名詞
* サ変名詞
* 人名
* 地名
* 形容詞
* 副詞
* 接尾語
* 動詞
* その他すべての品詞
|-
| colspan="4" |メモ
| colspan="8" |メモはオプションです。メモの前には2つのASCIIカンマ(<code>,,</code>)を入力します。メモはユーザ辞書には登録されません。
|}
これで登録する。登録手順。
# [設定]-[キーボード]-[テキスト入力]-[入力ソース]-[編集]
# [日本語-ローマ字入力]-[追加辞書]
# ここにドラッグ・ドロップするか、右クリック-[辞書をインストール] を選ぶ。
[https://discussionsjapan.apple.com/content/attachment/b2e76e0d-706b-430c-8902-b489756817ae 入力ソースの追加辞書の部分がグレーにな… - Apple コミュニティ]
登録方法に癖がある。
# 辞書ファイルの拡張子はtxt
# 品詞の指定が重要。基本は普通名詞。
==== Keybind ====
https://support.apple.com/ja-jp/102650
{| class="wikitable"
|+
!
!キー
!内容
!
|-
|
|option-command-電源
option-command-メディア取り出しキー
|スリープ
|
|-
|
|C-command-q
|ロック
|
|-
|
|
|
|
|}
===== fn =====
[https://support.apple.com/ja-jp/102439 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 ====
[https://support.apple.com/ja-jp/guide/mac-help/mchl16fbf90a/mac MacでTouch IDを使用する - Apple サポート (日本)]
Touch IDを使うことで、指紋認証を利用できる。
[System settings]-[Touch IDとパスワード]-[Touch ID]-[指紋を追加]
=== Finder ===
==== Trashのサイドバー・ブックマーク表示 ====
Macのゴミ箱 (Trash) の扱いが特殊。実態は、~/.Trashにある。ただ、HOMEディレクトリーで、C-<で隠しファイル表示にしてもFinderから表示できない。なので、ドラッグドロップでサイドバーにブックマーク表示もできない。Finderから直接アクセスできないのが使いにくい。
サイドバーに表示する方法があった ([https://www.reddit.com/r/MacOS/comments/16g8dgc/how_do_i_get_trash_to_show_in_a_finder_window/ How do I get Trash to show in a finder window sidebar? : r/MacOS])。
Trashを開いた後に、[File]-[Add to Sidebar] を選ぶ。これだけ。
==== フォルダーを先頭表示 ====
[https://pc.watch.impress.co.jp/docs/column/macinfo/1339186.html 【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
==== 検索場所のデフォルトを現在フォルダーに変更 ====
[https://pc.watch.impress.co.jp/docs/column/macinfo/1339186.html 【Mac Info】Finderのファイル操作術をさらに極めるカスタマイズ20選 〜Macのキホン Vol.2 - PC Watch]
[Settings]-[Advanced]-[When performing a search]=[Search the Current Folder] にする。
==== ツールバーアプリ ====
===== ツールバーへのアプリ登録 =====
* [https://pc.watch.impress.co.jp/docs/column/macinfo/1339186.html 【Mac Info】Finderのファイル操作術をさらに極めるカスタマイズ20選 〜Macのキホン Vol.2 - PC Watch]
* [https://www.maxi-design.jp/blog/2771/ Mac Finderのツールバーにアプリを登録する方法 - MAXI design Blog]
Finderのツールバーにアプリを登録できる。よく使うアプリはここに配置すると時短になる。
appファイルをCommandの同時押しドラッグ・ドロップで配置できる。削除は同じくCommand同時押しのドラッグ・ドロップで画面外。
右クリックメニューのクイックアクションがわりで使える。
===== 右クリックでファイルを新規作成 =====
* https://chatgpt.com/c/6775258d-a874-800b-9472-1f7095f28b95
* [https://qiita.com/sugasaki/items/d52c33ea8ad6b74c052e Mac > 右クリックでテキストファイル作成 #Mac - Qiita]
* [https://j-wort.hatenadiary.org/entries/2012/12/23 Mac OSXで右クリックで新規ファイルを作成]
* [https://itips.krsw.biz/macos-how-to-create-new-text-from-right-click-menu/ 【簡単】Macで右クリックからテキストを新規作成する方法 - ITips]
* [https://qiita.com/ai-tora/items/f71b01b7796716bc33f0 macOSでFinderの右クリックから新規テキストファイルを作成する #Mac - Qiita]
デフォルトでこれはできない。
いくつか方法があるが、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]
この方法はいまいち。ファイルかディレクトリーを右クリック必要。
* [https://weekly.ascii.jp/elem/000/002/618/2618034/ OS Xで右クリックからテキストファイルを新規作成するには?|Mac - 週刊アスキー]
* [https://www.guri2o1667.work/entry/2024/04/14/%E3%80%90Mac%E3%80%91Finder%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%EF%BC%88txt%2Cxlsx%2Cdocx%2Cpptx%E7%AD%89%EF%BC%89 【Mac】Finderの右クリックで任意のファイル(txt,xlsx,docx,pptx等)を作成する方法 - 自由気ままに書いちゃおう]
うまい方法を発見。「[https://discussionsjapan.apple.com/thread/10109192?sortBy=rank Finder ファイル作成 - Apple コミュニティ]」にあるように、スクリプトエディターでAppleScriptをアプリケーション形式 (.app) で保存して、Command推しながらドロップでFinderのツールバーにランチャーを登録できる。右クリックではないが、やりたいことを簡単に実現できる。これがいい。
上記のAppleScriptは構文エラーで動作しなかったので、「[https://mogmo811.hatenablog.com/entry/2020/08/15/091020 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 =====
[https://discussions.apple.com/thread/251250987?sortBy=rank Add Service to Finder Toolbar? - Apple Community]
現在フォルダーを端末で開きたいことがよくある。ツールバーアプリにするといい。
Terminal.scptなどの名前で以下のファイルを用意する。<syntaxhighlight lang="applescript">
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
</syntaxhighlight>Script Editorで開いてappにエクスポートして登録する。
=== Developer ===
==== Automator ====
Macの自動化のツール。
===== 格納場所 =====
[https://www.guri2o1667.work/entry/2024/04/14/%E3%80%90Mac%E3%80%91Finder%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%EF%BC%88txt%2Cxlsx%2Cdocx%2Cpptx%E7%AD%89%EF%BC%89 【Mac】Finderの右クリックで任意のファイル(txt,xlsx,docx,pptx等)を作成する方法 - 自由気ままに書いちゃおう]
~/Library/Servicesに格納される。
==== AppleScript ====
* [https://qiita.com/satosystems/items/8fff5b2313ecd6f81af3 初めての Apple Script #AppleScript - Qiita]
* [https://support.apple.com/ja-jp/guide/script-editor/welcome/mac Mac用スクリプトエディタユーザガイド - Apple サポート (日本)]
* [https://www.script-factory.net/monologue/AppleScriptIntroduction/index.xhtml Script factory : AppleScript ことはじめ]
WindowsのWSH相当。1993年の昔からある。
Script Editorでappファイルなどに変換できたりする。Macの自動化で重要なスクリプト言語。
==== CommandLineTools ====
/Library/Developer/CommandLineTools/のあたりにgitなどのOS標準の開発ツール類がある。
他に、/Applications/Xcode.app にもあったりする。
=== Package Manager ===
==== Homebrew ====
[https://brew.sh/ Homebrew — The Missing Package Manager for macOS (or Linux)]
===== Install =====
/bin/bash -c "$(curl -fsSL <nowiki>https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh</nowiki>)"
これで/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 ====
[https://qiita.com/quattro_4/items/f5b56c1897c0cc235c0f Macで"壊れているため開けません"の古いappを開く #Mac - Qiita]
xattr -rc /Applications/LegacyAwesome.app
これで属性を除去して解決することが多い。
==== Terminalが予期しない理由で終了しました ====
[https://qiita.com/koma3/items/5df98663463571a14272 MAC「Terminalが予期しない理由で終了しました」のポップが出てターミナルが起動できない #Mac - Qiita]
[~/Saved Application State/com.apple.Terminal.savedState] を改名したら起動できた。詳細不明。
==== 画像の一括リサイズ ====
https://chatgpt.com/share/6810e6d6-b388-800b-8d38-2beda0da7552
# プレビューアプリでまとめて開いて、サムネイルを全選択。
# [Tool]-[Adjust size]
これで一括リサイズできる。
==== Photos ====
iPhoneとMacで共通の写真管理アプリ。クラウドで共有される。
===== ファイル取得 =====
https://chatgpt.com/share/680b7873-4f00-800b-9049-03648eb29aef
使い方に癖がある。画像はExportで取得しないとファイルとして取得できない。
===== 複数画像のPDFへの統合 =====
* [https://pdf.wondershare.jp/pdf-trim/combine-images-in-pdf-on-mac.html Macで複数の画像をまとめてPDFにする無料方法]
* [https://support.apple.com/ja-jp/guide/mac-help/mchl21ac2368/mac MacでファイルをPDFに結合する - Apple サポート (日本)]
いくつか方法がある。
# Previewアプリでまとめて開いて、Printで印刷画面でPDFに保存する。
# Finderで対象ファイルを選択-[右クリック]-[Quick actions]-[Create PDF]。
2番目のQuick actionsが一番簡単。
===== 画像の同期 =====
[Sharing]-[Shared Albums] に共有用のアルバムを作って、そちらに画像をドラッグ・ドロップで設定する。すると、iPhoneのPhotosでもこれらの画像にアクセス可能になる模様。
これが画像の同期手っ取り早い。


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


== VM ==
=== systemd ===


=== UTM ===
* [https://systemd.io/ System and Service Manager]
* [https://www.freedesktop.org/software/systemd/man/systemd systemd]


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


===== Capture =====
systemdのメインデーモンの/sbin/systemdは/sbin/initにリンクされていて、既存のSysV initを置換する最初のプロセスとなる。
[https://docs.getutm.app/basics/controls/ Controls | UTM Documentation]


デフォルトだと、Control-Tabなど、一部のMac本体のホットキーが有効になっている。例えば、Windows側でc-tabを入力できなくて困る。
ssytemd自体は本体の他に4のコンポーネントから構成。


4番のボタンまたは、control-optionで、カーソルとキーボードをVMでキャプチャーする。これで入力可能になる。
# utility
# daemon
# target: ユニットのグループ化や処理の順序や依存関係の定義。unitの一種。
# unit: systemdの管理処理の単位。System V initのサービスに相当。


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


==== Network ====
# service: デーモンの開始と制御担当。
docker network ls
# socket
上記コマンドでコンテナーごとのネットワーク識別子を確認できる。コンテナー同士で同一ネットワークにするには、片方のservices.networks:でこのネットワーク識別子を指定する。
# target
# device
# mount
# automount
# timer
# swap
# path
# slice
# scope
# special


==== Compose ====
特に重要なのはserviceユニット。
phpのアプリサーバー、DBサーバーを一つのイメージで作ることもできるが、別のイメージにして連動させることもできる。別のイメージ・コンテナーにしたほうが、管理しやすい模様。


docker composeで複数のイメージ・コンテナーを一体に管理できる。その際に、特有の事項がある。
==== Unit ====
[https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html systemd.unit]


[https://qiita.com/b-coffin/items/8103583efe3767b6748e PHPのPDOをDockerコンテナ内で使おうとしたところ、"No such file or directory" エラーが発生した話 #docker-compose - Qiita]
ユニットファイルはini形式のテキストファイル。


docker composeで一体管理しているコンテナー群は、同一ネットワークに参加する。ホスト名はservice名になる。したがって、例えばアプリサーバーからDBサーバーへのアクセス時には、ホスト名に注意する。
===== Unit File Load Path =====
https://chatgpt.com/c/6753b416-3d48-800b-ae6d-fcb43df956e3


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


===== PHP =====
* system: /etc/systemd/system/
Ref: [https://hub.docker.com/_/php php - Official Image | Docker Hub].
* $XDG_CONFIG_HOME/systemd/user/ ($XDG_CONFIG_HOMEのデフォルトは~/.config)


Dockerの公式PHPイメージを使う場合、いくつかPHP関係のライブラリーや拡張モジュールをインストール・設定するための専用コマンドが用意されている。
従って、基本は~/.config/systemd/userに配置すればいい。
RUN pecl install memcached-3.2.0 \
&& docker-php-ext-enable memcached
peclの拡張機能インストール時はバージョン指定が推奨される。


====== docker-php-ext-install ======
==== systemctl ====
[https://tech.quartetcom.co.jp/2024/03/12/docker-php-extension/ Docker で PHP 拡張モジュールをインストールする | QUARTETCOM TECH BLOG]
[https://www.freedesktop.org/software/systemd/man/latest/systemctl.html systemctl]


PHP拡張モジュールのインストールと設定を行うヘルパーコマンドが用意されている。--helpで対象拡張モジュール一覧を確認できる。
systemdとservice managerの制御用のコマンド。状態管理からユニットの登録・削除など基本はこのコマンドとサブコマンドで全部対応する。非常に重要。
  $ docker run php:latest docker-php-ext-install --help
  <code>systemctl</code> [OPTIONS...] COMMAND [UNIT...]
--userオプションでユーザー扱いしない場合、sudoで管理者権限が必要。
# .....
Possible values for ext-name:
bcmath bz2 calendar ctype curl dba dl_test dom enchant exif ffi fileinfo filter ftp gd gettext gmp hash iconv imap intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell random readline reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer xml xmlreader xmlwriter xsl zend_test zip
# .....
PECL以外は一通り使用可能。


====== error ======
基本的な流れは以下となる。
docker-php-ext-installでインストールする際には、必要な依存関係もセットで指定しないとエラーが出る。
FROM php:7.3.23-apache
RUN apt update
RUN docker-php-ext-install pdo_mysql
RUN apt install -y libbz2-dev && docker-php-ext-install bz2
RUN apt install -y libpng-dev && docker-php-ext-install gd
RUN apt install -y libzip-dev && docker-php-ext-install zip
RUN apt install -y ssl-cert && a2enmod rewrite ssl && a2ensite default-ssl
COPY --from=composer /usr/bin/composer /usr/bin/composer
ヘッダーのあるlib*-devもセットでインストールしておく。


===== phpmyadmin =====
# ユニットファイル (.service) を作成して配置 (/etc/systemd/system or ~/.config/systemd/user)。
Ref: [https://hub.docker.com/_/phpmyadmin?tab=description phpmyadmin - Official Image | Docker Hub].
# systemctl enable [unit] で登録。
# systemctl restart [unit] で起動。


以下のdocker-compose.ymlを格納しておいて、networksのところをつなげたいやつにあわせる。<syntaxhighlight lang="yaml">
===== Commands =====
services:
COMMANDは種類ごとに以下を解釈。大量にある。
  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_ARBITARY=1
    networks:
      - development_default
        # - wordpress_default
networks:
  wordpress_default:
    external: true
  development_default:
    external: false
</syntaxhighlight>特に重要な環境変数。


* <code>PMA_ARBITRARY</code> - when set to 1 connection to the arbitrary server will be allowed
====== Unit Commands (Introspection and Modification) ======
* PMA_HOST: デフォルトはdb。servicesがdb以外なら指定必要。
ユニット自体を制御するコマンド。
* PMA_USER/PMA_PASSWORD=phpmyadminのデフォルトユーザー。これを指定しておくと、自動ログインする。


===== MySQL =====
* 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


====== import ======
重要なもの。
Ref: [https://stackoverflow.com/questions/43880026/import-data-sql-mysql-docker-container Import data.sql MySQL Docker Container - Stack Overflow].
docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
上記のようなコマンドで取り込む。


==== Error ====
* 情報
** status: ユニットの情報を表示。動作確認。稼働やエラーの確認などができる。問題があったらまずこれで確認。
** list-units: systemdのメモリー内に存在 (実行中・ロード済み) するユニットを一覧。
**
* 操作
** restart: 手動再起動。
** start: 手動起動。
** stop: 手動停止。
* 設定
** reload: ユニットにユニット固有の設定のリロードを指令する。apache2の場合httpd.conf。
** daemon-reload: ユニットの設定をリロードする。apacheの場合apache.service。


===== connect ENOENT \\.\pipe\errorReporter =====
====== Unit File Commands ======
https://github.com/docker/for-win/issues/14080


再起動で直るらしい?
* list-unit-files
* enable
* disable
* reenable
* preset
* preset-all
* is-enabled
* mask
* unmask
* link
* revert
* add-wants
* edit
* get-default
* set-default


インストール時のアカウントの権限があるので、アカウント権限がある状態で再インストールするとOK。
ユニットファイルの操作。


===== `version` is obsolete =====
* list-unit-files: システムにインストール済みの全ユニットファイルを一覧。list-unitsと異なり、読み込んでいないものも表示する。ユニットファイルの存在と有効・無効状態の確認に使う。あまり使わないと思う [https://chatgpt.com/c/6753b416-3d48-800b-ae6d-fcb43df956e3<nowiki>]。</nowiki>
[https://zenn.dev/harpseal/articles/8dc2602ffe3365 【docker compose】警告`version` is obsoleteの解決法]
* enable: ユニットを有効にする。設定ファイルの場所からシンボリックリンクを作成する。
$ docker compose up
* disable: ユニットを無効にする。シンボリックリンクを削除。
time="2024-07-02T09:54:45+09:00" level=warning msg="C:\\Users\\senoo_0901\\project\\main\\GASProj\\docker\\docker-compose.yml: `version` is obsolete"
docker compose v2からversion指令は廃止になった。単純に削除すればいい。


==== Other ====


===== RUN/CMD/ENTRYPOINTの違い =====
* 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


* [https://www.guri2o1667.work/entry/2021/06/08/%E3%80%90Docker%E3%80%91Dockerfile%E3%81%A7%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8BRUN%E3%81%A8CMD%E3%81%A8ENTRYPOINT%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 【Docker】Dockerfileで記述するRUNとCMDとENTRYPOINTの違いについて - 自由気ままに書いちゃおう]
====== System Commands ======
* [https://docs.docker.com/reference/dockerfile/ Dockerfile reference | Docker Docs]


Dockerfileでコマンドを実行する指令が複数ある。違いを整理する。
* is-system-running
* default
* rescue
* emergency
* halt
* poweroff
* reboot
* kexec
* soft-reboot
* exit
* switch-root
* sleep
* suspend
* hibernate
* hybrid-sleep
* suspend-then-hibernate


* RUN: イメージ作成時=docker build字に実行。ソフトウェアのパッケージインストール、ファイルコピー変更などを行う。
特に便利なもの。
* CMD: コンテナ開始時=docker start、作成時=docker run時に実行される。docker run時のコマンドのデフォルト値。引数があればそちら優先。VolumeのバインドはRUN後になるのでCMD/ENTRYPOINTで行う必要がある。
* ENTRYPOINT:  コンテナ開始時=docker start、作成時=docker run時に実行される。docker run時に強制実行。上書き不能。ただし、CMDや実行時に引数を後ろに追加できる。
CMD/ENTRYPOINTはDockerfile内でそれぞれ1回しか指定できない。一番最後の指定で上書きされる。


「The shell form of <code>ENTRYPOINT</code> prevents any <code>CMD</code> command line arguments from being used.」とあるように、 ENTRYPOINTとCMDを併用する場合、exec形式で指定しないとCMDが無視される。
* poweroff: 電源をオフにできる。


「[https://forums.docker.com/t/how-to-combine-cmd-and-entrypoint/132517 How to combine CMD and ENTRYPOINT - Open Source Projects / Compose - Docker Community Forums]」
===== Options =====
オプションも大量にある。


ENTRYPOINTにコマンドを追記したい場合、entrypoint.shのようなスクリプトを実行する形にして、スクリプト内で引数処理するのがいいらしい。
* -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


===== 権限設定 =====
特に重要なオプション
[https://web.gnusocial.jp/post/2023/04/02/5760/ Apache HTTP Serverの/var/wwwの権限設定 | GNU social JP Web]


[https://devops.stackexchange.com/questions/8872/why-does-chown-not-work-in-run-command-in-docker Why does chown not work in RUN command in Docker? - DevOps Stack Exchange]
* --user: ユーザーとしてservice managerを呼び出す。このオプションを指定することでユーザー権限でsystemdを使える。
* --system: システムとして実行。デフォルト。


バインドボリュームする場合、RUNの後にバインドされるからCMDで設定が必要。
==== systemd-system.conf ====
[https://www.freedesktop.org/software/systemd/man/latest/systemd-system.conf.html systemd-system.conf]


[https://helpxlog.com/no-entrypoint-and-cmd-in-dockerfile/ DockerfileにENTRYPOINTもCMDも無い?? | へるぷログ]
systemdの設定ファイルとその格納場所。


CMD/ENTRYPOINTを指定しない場合、元イメージのCMD/ENTRYPOINTが実行される模様。apacheだとapache2-foregroundコマンド。
システムとユーザーとで参照するファイル・場所が異なる。


[https://qiita.com/oskamathis/items/6ef1e9765616a9315deb docker-composeでコンテナの初回起動時に特定の処理を行う方法 #Docker - Qiita]
* システム: 以下の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)


初回起動時に処理をする方法もあるが、一時ファイルを生成するなどするもの。権限設定は毎回実行してもOKなものなので、毎回実行する。
特に、ユーザーの~/.config/systemdが重要。ユーザーが自由にできる。


[https://github.com/docker-library/php/issues/1142 umask for non-root users not as expected · Issue #1142 · docker-library/php]
==== user ====


/root/.bashrcにumaskを指定する。これがないと、コマンドラインでdocker exec -i で実行した際デフォルトのumask 022でのファイル生成になり、この作業コマンドでログが発生したら、サーバープロセスから追記できない。
* https://chatgpt.com/c/6753b416-3d48-800b-ae6d-fcb43df956e3
FROM php:7.3.23-apache
* [https://pyopyopyo.hatenablog.com/entry/2021/04/30/233755 ユーザー権限で systemd のサービスを稼働させる方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -]
RUN apt update && apt install -y \
* [https://zenn.dev/haccht/articles/e6f08dfed26976 CentOS7のsystemdでuserインスタンスを起動する]
      ssl-cert
* [https://penpen-dev.com/blog/rental-node/ レンタルサーバーでNode.jsアプリを永続化する]
RUN docker-php-ext-install pdo_mysql
RUN a2enmod rewrite ssl
RUN a2ensite default-ssl
COPY --from=composer /usr/bin/composer /usr/bin/composer
ENV BASH_ENV /root/.bashrc
RUN usermod -aG www-data root \
      && echo "umask 002" >>/root/.bashrc
CMD chgrp -R www-data /var/www && chmod 2775 /var/www \
      && find /var/www -type d -exec chmod 2775 {} \; \
      && find /var/www -type f -exec chmod 0664 {} \; \
      && apache2-foreground
[https://stackoverflow.com/questions/39953327/is-it-possible-to-set-the-default-command-when-the-docker-exec-command-is-run dockerfile - Is it possible to set the default command when the `docker exec` command is run on an already running container? - Stack Overflow]


docker exec実行時は、デフォルト実行されるコマンドはない。[[https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html Bash Startup Files (Bash Reference Manual)]] にあるように、BASH_ENVに指定したファイルを非対話実行でも読み込むのでこれを指定して、常にbash -cで実行する。
基本はOS管理なのでroot権限で動作する。が、ユーザー別に登録したりもできる。
そのポイントを整理する。


あるいは、BASH_ENVを指定せずに、bash -c 'umask 002; 'で実行する。
# ~/.config/systemd/user/*.serviceにユニットファイルを配置。
# systemctlコマンドには常に--userオプションを指定する。
# systemctl --user enable [service]
# systemctl --user restart [service]


* [https://stackoverflow.com/questions/69233642/why-is-umask-setting-in-dockerfile-not-working docker - Why is umask setting in dockerfile not working? - Stack Overflow]
なお、ユーザーユニットは、ユーザーがログイン中のみ有効。ログアウト中も稼働させるには、lingerでの登録が必要。
* [https://qiita.com/sotoiwa/items/0a78e392fad1cadb50b0 Libertyコンテナでumaskを変える #Docker - Qiita]


他に上記にあるように、ENTRYPOINTでumaskを指定する方法がある。が、これは関係ない気がする。chomd 2775 /var/wwwでスティッキーを指定しているから、後続の作成時は自動で2775になっているはずだから。
このlingerでの登録が対応していないことが共用サーバーには多い。


===== docker runとexec =====
その場合はしかたないので、cronで終了していたら再起動するコマンドを登録する。
[https://www.memotansu.jp/docker/852/ docker runとdocker execの違いの解説 | めもたんす]
pgrep -f "node index.js" > /dev/null || (cd index.jsがあるパス && node index.js)


run: イメージ作成・実行。
== Other ==


exec: 起動中のイメージで実行。
=== General ===


===== Japanese input/日本語入力 =====
==== Username ====
[https://senooken.jp/post/2021/05/06/5343/ パソコンのユーザー名の形式は [A-Za-z0-9._-] で最低8文字まで可能 – senooken JP]


* [https://superuser.com/questions/1551967/what-does-locale-gen-generate-in-linux What does locale-gen generate in Linux? - Super User]
* 使用可能文字: <code>[A-Za-z0-9._-]</code> の正規表現 (ただし,先頭は<code>-</code>以外)。
* [https://qiita.com/kazuyoshikakihara/items/0cf74c11d273b0064c83 Dockerではコンテナのlocaleの再確認を #Docker - Qiita]
* 文字数: 最低8文字まで可能。9文字以上は実装依存。


OSに日本語のロケールが入っていないのが原因。
=== 辞書 ===
IMEの辞書登録の駆使で作業効率が大幅に変わる。


Debian系の場合。
頻出単語を入力しておくと良い。
## For Japanese input.
RUN apt install -y locales
RUN (rm /etc/locale.gen && sed '/# ja_JP.UTF-8 UTF-8/s/# //' >/etc/locale.gen) </etc/locale.gen
RUN locale-gen
ENV LANG=ja_JP.UTF-8
/etc/locale.genのファイルの修正が必要。


これで日本語が使用可能になる。
* 個人情報
 
** 住所
===== cron =====
** 氏名
[https://stackoverflow.com/questions/37458287/how-to-run-a-cron-job-inside-a-docker-container How to run a cron job inside a docker container? - Stack Overflow]
** 電話番号
** メールアドレス
*人名
**同僚などよく連絡する人の苗字は登録しておくと楽かも。
* 挨拶
** ありがとうございました。
** よろしくお願いします。
** ご確認お願いします。
* 数字
** 上付き
** 下付き
** 丸付き
{| class="wikitable"
|'''じゅうしょ'''
|
|-
|'''しめい'''
|
|-
|'''でんわ'''
|333-4444-4444
|-
|'''でんわ'''
|111111111111
|-
|'''めあど'''
|
|-
|'''めーる'''
|
|}
{| class="wikitable"
|'''あり'''
|'''ありがとうございました。'''
|'''普通名詞'''
|-
|あり
|ありがとうございます。
|普通名詞
|-
|おね
|お願いします。
|普通名詞
|-
|ごか
|ご確認お願いします。
|普通名詞
|-
|ごた
|ご対応ありがとうございました。
|普通名詞
|-
|ごた
|ご対応ありがとうございます。
|普通名詞
|-
|よろ
|よろしくお願いします。
|普通名詞
|}


Docker内でcronを実行する方法がいくつかある。
## For cron.
RUN apt install -y cron
RUN (crontab -l ; echo '* * * * * /usr/local/bin/php /var/www/artisan schedule:run >/dev/null 2>&1') | crontab
CMD cron # CMDは最後の1個しか有効じゃないので、最後にまとめて指定することに注意する。
動作確認
crontab -l  # crontabの確認
pgrep cron  # cronプロセスの確認
== Other ==


=== RDP ===
=== RDP ===
1,157行目: 2,506行目:


それ以外は良好。
それ以外は良好。
=== Clipboard ===
==== Windows ====
Windows 10からWin-vでクリップボードマネージャーが起動する。
==== Hotkey ====
[https://nishikiout.net/entry/2023/01/30/221157 【Maccy】MacでもWin+Vが使いたいんじゃぁ!! ~ Macでクリップボード履歴を使えるようにしてくれるユーティリティ - Nishiki-Hub]
MacとWindowsでクリップボードマネージャーのホットキーを共通化。
C-Cがいいと思う。CopyやClipboardのCだから。いや、C-C/C-M-CはMacの開発者ツールのショートカットキーだからだめ。
M-Cがいいと思う。
==== CopyQ ====
===== Hotkey =====
[https://github.com/hluk/CopyQ/issues/508 Keyboard shortcut to access copyq? · Issue #508 · hluk/CopyQ]
[https://github.com/hluk/CopyQ/wiki/FAQ#how-to-open-application-window-or-tray-menu-using-shortcut 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 ===
=== Keybind ===
1,352行目: 2,733行目:
キーの違いで、Windows/Macで共有と独立部分がある?
キーの違いで、Windows/Macで共有と独立部分がある?


=== Package manager ===
==== パッケージ ====
===== pkgs.org =====
* [https://senooken.jp/post/2020/10/24/4684/ UNIX系OSのパッケージの検索サイト「pkgs.org」 – senooken JP]
* [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 =====
* [https://packages.ubuntu.com/ Ubuntu – Ubuntu パッケージ検索]
* [http://archive.ubuntu.com/ Index of /]
* [https://old-releases.ubuntu.com/releases/ Index of /releases]
# See <nowiki>http://help.ubuntu.com/community/UpgradeNotes</nowiki> 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: <nowiki>http://archive.ubuntu.com/ubuntu/</nowiki>
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: <nowiki>http://security.ubuntu.com/ubuntu/</nowiki>
Suites: noble-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
以下のURIがある模様。
* http://archive.ubuntu.com/ubuntu/: メイン。保守対応バージョン。
* http://security.ubuntu.com/ubuntu/: 保安関係。
* http://old-releases.ubuntu.com/ubuntu: 過去アーカイブ。
過去アーカイブを参照するようにする。
==== APT ====
[https://senooken.jp/post/2020/05/15/4051/ Debian系パッケージマネージャーAPTの使用方法 – senooken JP]
{| class="wikitable"
|+コマンド一覧
!目的
!コマンド
|-
|情報
|<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/apt/apt.8.en.html apt(8) — apt — Debian buster — Debian Manpages]
aptの参照元のリポジトリーのリスト。以下の2か所。
* /etc/apt/sources.list
* /etc/apt/sources.list.d/
直接テキストエディターで編集も可能だが、操作用の専用コマンドadd-apt-repositoryがある。
sudo add-apt-repository 'deb <nowiki>http://myserver/path/to/repo</nowiki> 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で編集可能 ([https://manpages.debian.org/buster/sensible-utils/select-editor.1.en.html 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] <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-security</nowiki> trixie-security main contrib non-free non-free-firmware
Types: deb
URIs: <nowiki>http://deb.debian.org/debian</nowiki>
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: <nowiki>http://deb.debian.org/debian-security</nowiki>
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
====== 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]
add-apt-repository [OPTIONS] REPOSITORY
3種類の記法が許容されている。
# sources.listのdeb行
# ppa:<user>/<ppa-name>
# 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
FROM php:7.4.33-apache
RUN apt update ; apt install -y unzip
[[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