OmniAICreator/Qiita-1.07M huggingface dataset:
macOSのJDK17インストール方法

# はじめに
macOSにおけるJDK17のインストール方法について記載いたします。JDK17は2023年現在において最新のJava SEのLTS版となってます。Homebrewからインストールする方法もあるようですが、設定手順が多そうだったのでOracle公式のダウンロードページからインストーラーをダウンロードしてインストールする方法を採用しました。あらかじめご了承ください。

# 環境
|項目|情報|
| ---- | ---- |
|OS|macOS Ventura 13.1|
|プロセッサ|1.6 GHz デュアルコアIntel Core i5|

# JDK17のインストール方法
## Oracle公式ページへアクセス
[Oracle公式のJDKダウンロードページ](https://www.oracle.com/java/technologies/downloads/#jdk17-mac)

## JDK17のタブをクリック
![oracle_jdk_downloadpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/c8ea6607-0a90-b74c-b87e-c22c060d738d.png)

## インストーラをダウンロード
macOSのタブからインストーラをダウンロードしてください。
おおよそApple SiliconのMacは"Arm 64"、Intelは"x64"を選択すれば良いと思います。
心配であればターミナルから以下のコマンドで確認できます。(以下はIntelの場合)
```
$ uname -m
x86_64
```
tar.gzのインストーラーもあるようですが、以降の手順はdmgのインストーラーを選択した場合の手順となります。
私の環境はIntelなので"x64 DMG Installer"を選択しました。
![oracle_jdk_jdk17_downloadpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/26620aef-0cc7-83dc-3e05-71fb04b1f374.png)

## インストーラーの実行
Finder上でダウンロードされたdmgファイルをダブルクリックしてJDKのインストールを開始します。

### pkgファイルのダブルクリック
![jdk17_installer_pkg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/f355e2d9-fb38-9cd3-adc9-8111f16ae1d9.png)

### 「続ける」をクリック
![jdk17_installe_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/cd9d87c4-07fd-03a3-2756-ee7b4783c4ac.png)

### 「インストール」をクリック
![jdk17_installe_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/56a01b7a-0e17-c718-523d-1a2426addc54.png)

### Touch IDかパスワードでインストールを許可
![jdk17_installe_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/acce3fe8-2d98-0987-d66c-cdb985daa3b5.png)

### 正常にインストールが完了したことを確認し、「閉じる」をクリック
![jdk17_installe_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/62778058-2ef1-7c26-8402-5a205532ce2e.png)

### インストーラーのファイルをどうするか聞かれるので任意の方法をクリック
![jdk17_installe_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639284/22bf5005-7961-5c84-53c9-6a3bacd74ab1.png)

## JDK17がインストールされたことを確認
ターミナルから以下のコマンドを実行し、JDK17がインストールされたことを確認してください。
```
$ java -version
java version "17.0.6" 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)
```
また以下のコマンドでも確認できます。
```
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    17.0.6 (x86_64) "Oracle Corporation" - "Java SE 17.0.6" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
```
以上となります。
DynamoDB テーブル設計 ベストプラクティス

# 概要

DynamoDB のテーブル設計についてベストプラクティスが公式で紹介されているがわかりづらいので解釈入れてメモ。
なお、以下ではパーティションキーをPK、ソートキーをSKと記載する。


# ソートキーでバージョンコントロール

SK で履歴が判るようにする。
参考: [ソートキーを使用してデータを整理するためのベストプラクティス - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-sort-keys.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/1d458a70-02c4-12dd-da91-23d3b47b2096.png)


# スパースインデックス

値が欠けているレコードは除外してインデックスを作れる。これがスパースインデックス。
関係ないレコードを除外できるので高速なクエリが可能。
参考: [スパースインデックスの利用 - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-indexes-general-sparse-indexes.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/d439faca-4bc8-e430-f527-bba9cc9a0e36.png)
上記テーブルで `Award` のカラムを PK にして GSI を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/41f7752e-f976-b92a-69aa-67120eb02504.png)


# 集計値を同じテーブル内に

同じテーブルで管理することでコンセプトをテーブル単位に管理でき、プロビジョニングしている環境に相乗りできる。
参考: [マテリアライズされた集計クエリでグローバルセカンダリインデックスを使用する - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-gsi-aggregation.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/9b705c48-e125-36ef-d790-82c02ca4ff3e.png)


# GSI の多目的利用

Sort Key を用途名にすることで、１つの GSI を多目的に利用できる。
（GSI は 20 しか張れないが、この技でそれを超えた用途を適えることができる。）
参考: [グローバルセカンダリインデックスの多重定義 - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-gsi-overloading.html)

※以下、Partition Key を PK, Sort Key を SK と記す。

GSI の PK として「Sort Key」を、GSI の SK として「Attribute 1」(Data) を指定。

1. `PK="Employee_Name" and SK=ユーザ名` ⇒ 特定ユーザに紐つくデータ抽出
1. `PK="Warehouse_01"` (Warehouse ID) ⇒ 特定倉庫で働く全ユーザ名、employee ID 抽出
1. `PK="HR_confidential" and SK="2008-11-08"` (勤務開始日=Start) ⇒ 指定期間に雇用した employee ID 取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/bd62d398-937f-869d-255f-35f006a28079.png)


# シャーディング

ランダム値を PK にすることで分散させて高速に目的のレコードを抽出。
参考: [選択テーブルクエリでグローバルセカンダリインデックス書き込みシャーディングを使用する - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-indexes-gsi-sharding.html)

0～N のランダム値を PK に持つ GSI を作り、0～N を並列でデータ取得する。
CRITICAL な特定日付範囲の情報を高速に取得可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/1ce22791-dec8-1bc4-0829-e6107b8c2dc8.png)


# 時系列データ

日付ごとにテーブルを分け、頻繁にアクセスする当日のデータに集中できるようにする。
古いデータはもはや書き込まれないので、プロビジョニングされた書き込み容量を小さい値 (1 WCU など) に減らすことが可能。削除することも可能。

参考: [DynamoDB で時系列データを処理するベストプラクティス。 - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-time-series.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/857a245a-fac3-82a7-7743-3ee6a190e294.png)


# 多対多

GSIを使うことで多対多は簡単にできる。
参考: [多対多の関係を管理するためのベストプラクティス - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/a4cb5572-37f4-0a1b-6c49-1ee70f7f12fa.png)
[Windows]バッチファイルで設定ファイルのリストを1行ずつ読みだしてコマンドを実行するFORループ

たまにWindows用のバッチファイルを書くのですが、**設定ファイルにファイルリストを書いて、それを1行ずつ読み込みながら何らかのコマンドを実行するforループ**の作り方を毎回探して苦労するので、自分用にまとめます。

# 仕様
- 設定用ファイルにデータのリストを書きます。
- そのリストを1行ずつ読み込みながら何らかのコマンドを実行します
- 設定用ファイルにある # から始まる行はコメント行とみなして飛ばします。

# バッチファイル

```text:mybatch.config
file01.txt
file02.txt
file03.txt
```

下記のバッチファイル中にある ```echo %%I```の部分を任意のコマンドに置き換えればいろいろできます。

```DOS:mybatch.bat
@echo off

set datalist=mybatch.config
setlocal EnableDelayedExpansion

for /F %%I in (%datalist%) do (
    set itemp=%%I
    if not "!itemp:~0,1!"=="#" (
        echo %%I
    )
)

pause
```

実行すると以下のように出力されます。

```console:結果
file01.txt
file02.txt
file03.txt
```

# 主な解説（覚書）

- ```for /F %%I in (%datalist%) do```でdatalistに指定したファイルの中身をforeachできる。ファイルではなくリテラル指定の場合、```for %%I in (file01.txt, file02.txt, file03.txt) do```のようにも書ける。
- 環境変数```%XXXX%```からsubstringするには、```%XXXX:~m,n%``` と書く。m番目(0開始)からn文字分抜き出す。mだけだとラストまで抜き出す。
- ループ用変数名はアルファベット1文字で```%%I```のように使う。アルファベット1文字は慣習ではなく仕様。
- ループ用変数をsubstringできない。なので一旦環境変数に再設定してからsubstringする。しかし、環境変数は実行時に1回しか評価されないので、そのままだと変数に何も設定されていない。よって遅延評価を有効にする（```setlocal EnabledDelayedExpansion```）。遅延評価される変数は ```%XXXX%```ではなく```!XXXX!```で参照する。


# 大変参考になる記事

https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9

# おまけ：日時をファイル名やフォルダ名に付与したい時の文字列生成

- 日付は、単純に```"/"```を空文字に置き換えて取得する。
- 時刻は、単純に```%time%```で取得すると、```" 9:06:31.33"```のように、先頭に空白が入ってしまう為、一旦空白を0に置換し、その後、```":"```を空文字に置換、最後に先頭6文字を抽出している。
- 最後に、それらの文字列を結合してフォルダ名を作り、なければフォルダを作成する。

```
SET yyyyMMdd=%date:/=%
SET hhmmss=%time: =0%
SET hhmmss=%hhmmss::=%
SET hhmmss=%hhmmss:~0,6%
SET backupfolder=backup%yyyyMMdd%_%hhmmss%
if not exist %backupfolder% mkdir %backupfolder%
```
AWS ECS + Rails + MySQL(Aurora) – 同じセキュリティグループに ECサービスとRDSを作成して RailsからDBアクセス可能にする

# 概要

同じセキュリティグループ同士は無条件に全てのトラフィックが許可されるので、ECSサービスもRDSも同じセキュリティグループに作成することでRailsからDBへのアクセスを可能にする

# Rails

scaffoldなどでDBアクセスが発生するページを作成しておく

```
rails generate scaffold users name:string
```

Productionでのデバッグ用に一時的に画面からエラー確認できるようにしておくと便利かもしれない

`rails-docker/config/environments/production.rb`

```rb
Rails.application.configure do
  config.consider_all_requests_local       = true
```

# VPCの作成

パブリックサブネット2個
プライベートサブネット0個

でVPCを作成する

<img width="861" alt="image" src="https://user-images.githubusercontent.com/13635059/217437456-510b8f4a-f489-49c2-8749-e87a71c92425.png">

他の設定は

- 「VPCなど」
- DNS ホスト名を有効化
-  DNS 解決を有効化

# セキュリティグループの設定

自分がWebからアクセスできるように、今作成したVPCのセキュリティグループで、マイIPに対してHTTPアクセスを許可する

<img width="1420" alt="image" src="https://user-images.githubusercontent.com/13635059/217438105-8b48911c-75bd-4a07-8659-8debe4e1880b.png">

# RDSでデータベースを作成

- 最初に作成したVPCを選択する
- ユーザー名・パスワードを設定する
- パブリックアクセスありに設定する

![image](https://user-images.githubusercontent.com/13635059/217438468-a69f0966-8d67-49e0-ae65-514e99050967.png)

# Rails のコードでDB設定する

データベース作成が進みエンドポイントが分かったらそれを設定で使う
database.yaml に直接書く例

```yaml
default: &default
  adapter: mysql2
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

production:
  <<: *default
  host: ******.cluster-cgklnrcdw5xr.ap-northeast-1.rds.amazonaws.com
  username: admin
  database: rails_example_production
  password: *****
```

# ECR に Rails のイメージをpushする

よしなに

ちなみに今回使ったDockerfileの例

```dockerfile
FROM ruby:3.1.2

RUN mkdir /api
WORKDIR /api
COPY Gemfile /api/Gemfile
COPY Gemfile.lock /api/Gemfile.lock

# Bundlerの不具合対策(1)
RUN gem update --system
RUN bundle update --bundler

RUN bundle install --jobs=4
COPY . /api

CMD RAILS_LOG_TO_STDOUT=1 RAILS_ENV=production bundle exec rails server -p 80 -b '0.0.0.0'
```

# タスク定義を作る

よしなに

# ECSクラスタの作成

既にある場合はスキップ

# ECSサービスの作成

最初に作ったVPCと同じものを使う
RDSに利用しているものと同じ

![image](https://user-images.githubusercontent.com/13635059/217439754-d63f878b-6ffa-47e3-8829-8b3bf38875bf.png)

ロードバランサ・ターゲットグループもこの例では新しく設定する

<img width="685" alt="image" src="https://user-images.githubusercontent.com/13635059/217440285-e118f569-cf6e-430f-9a85-bf4913823c57.png">


# マイグレーション

一時的にセキュリティグループのインバウンド設定でマイIPからDBポートへのアクセスを許可すれば、localからDBマイグレーションができる

```
 RAILS_ENV=production rails db:create
 RAILS_ENV=production rails db:migrate
```

# ネットワークアクセス

ECSサービスのデプロイが成功したらネットワーキングタブよりURLにアクセスする

<img width="1435" alt="image" src="https://user-images.githubusercontent.com/13635059/217440027-4bc7b593-ff86-44d0-b414-2bb34020469f.png">

`/users` などDBアクセスが発生する画面に移動して表示されれば成功


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
メモ: GCPでWindows監視

概要
====

できるだけ低コストでWindows機の生存監視をしてく、GCP で実現してみたので、方法を備忘録としてメモ。
基本的なアーキは下記：

- 【Windows機】 Task Scheduler にて 30 分に1 回 生存証明用URL にアクセスするように仕込む。
- 【GCP/Firebase Hosting】 生存証明用URL （静的HTML）を用意
- 【GCP/Cloud Monitoring】 前述のURLのアクセスを監視し、1h に1度もアクセスが無い状況になったら決めておいたメアド宛にメール送信

ポイント:
- Task Scheduler なのでWindows再起動しても上げなおしが発生しないし、落ちて動かなくなることもない。コードやアプリの配布やインストールも不要。
- Firebase Hosting なので無料枠の中で URL おける。
- Cloud Monitoring なので無料枠の中で監視ができ、特定メアドへと送信も可能。gmailアカウントがあれば管理者追加も楽。

方法
====

## 1. Firebase

1. Hosting と Cloud Logging を有効にする。
1. プランを Blaze にする。（Cloud Loggingで「指標」を使うため。無料枠内に収まると想定。）
1. [Log Storage](https://console.cloud.google.com/logs/storage?authuser=0) で `_Default` の保存期間を `1 days` に。（念のために課金額を減らしておく。）
1. Hosting のページで Cloud Logging を開始する。

## 2. 生存証明用URL

1. `public/xxxxxx.html` というページ作成。（xxxxxx はランダム文字列。）
1. firebase deploy

## 3. タスク（テスト用）追加

1. Task Scheduler 起動
1. `タスクの作成...`
1. `全般` タブ
    1. `名前`: PC名
1. `トリガー` タブ
    1. `繰り返し間隔`: `1分間`
    1. `継続時間`: `無期限`
1. `操作` タブ
    1. `新規(N)...` ボタン
    1. `操作`: `プログラムの開始`
    1. `プログラム/スクリプト(P)`: `curl`
    1. `引数の追加(オプション)(A)`: `-s "https://プロジェクトID.web.app/xxxxxx.html?PC名"`
    1. `OK` ボタン

## 4. 指標作成

1. [Log Explorer](https://console.cloud.google.com/logs/query) にアクセス。今回のプロジェクトを選択。
1. 下記でログが取れることを確認
   ```
   resource.labels.project_id="プロジェクトID"
   httpRequest.requestUrl=~"https://プロジェクトID.web.app/xxxxxx.html*"
   ```
1. `指標を作成` ボタン
1. `ログの指標の作成` 画面
    1. `指標タイプ`: `Counter`
    1. `ログ指標の名前`: `AccessingGeneric`
    1. `単位`: `1`
    1. `フィルタの作成`:
       ```
       resource.labels.project_id="プロジェクトID"
       httpRequest.requestUrl=~"https://プロジェクトID.web.app/xxxxxx.html*"
       ```
    1. `ラベル`:
        1. `名前`: `pcid`
        1. `種類`: `STRING`
        1. `フィールド名`: `httpRequest.requestUrl`
        1. `正規表現`: `\.html\?(.*)$`
    1. `指標を作成` ボタン

## 5. ポリシー（アラート）作成

1. [ポリシー](https://console.cloud.google.com/monitoring/alerting/policies?authuser=0) にアクセス。今回のプロジェクトを選択。
1. `+ CREATE POLICY` ボタン
    1. `指標の選択` で前述の指標（`AccessingGeneric`）を選択
    1. `ADD FILTER` で `pcid = PC名`
    1. `ローリングウィンドウ`: `5分`
    1. `ローリングウィンドウ関数`: `count`
1. `トリガーの設定`
    1. `Metric absence`
    1. `任意の時系列の違反`
    1. `2分` (この期間不在になったら通知が飛ぶ)
    1. `Absent PC名 for 2min.` （メールに載る文言）
1. `通知と名前`
    1. `通知チャネル`: 自分のメアド
    1. `Notify on incident closure` を ON
    1. `アラートポリシー名`: `Absent PC名`
1. `ポリシーを保存`
Verify signatures with Cosign to improve container reliability 📐

こんにちは。Enabling team の山本です。

今回は Container Image の信頼性向上について書きます。

弊社では、この数年で、サービスが増え、機能が増え、Developer が増え、deploy される Container が日々増えています。

- [SU-PAY 💰](https://su-pay.jp/)
- [Smart Shopping Cart 🛒](https://www.retail-ai.jp/solution/Ssc/)
など

気をつけるのは、
- Base Image に何を使っているか？
- Image は、サービスの正式な CI Pipeline で build/scan されたものか？

Supply Chain を Secure に保つことに気を使うようになりました。

## TL;DR
* Cosign を使えば、本番サービスにデプロイするイメージを検証して、信頼性を向上させることができます。

## Cosign
1.24 から[Cosign](https://github.com/sigstore/cosign) で署名され、Image を検証できるようになるそうです。
署名を検証することにより、Software Supply Chain の Security を向上できます。
今でも、出自がわからない Image を base に build されることはよくあります、、

## 今回の構成
* Cosign
* [Policy Controller](https://github.com/sigstore/policy-controller)（policy-controller）
* Cloud KMS（KMS）
* Google Artifact Registry（GAR）
* Google Kubernetes Engine（GKE）: `1.24.8-gke.2000`

```mermaid
flowchart LR
    Cosign --> GAR
    Cosign --> KMS
    policy-controller --> KMS
    policy-controller --> GAR
    Pod --> GAR
    policy-controller --> Pod
```

## 署名を確認してみる
- 詳しい手順は[こちら](https://github.com/danny-personal/cosign-tutorial)。

失敗
``` 
yamamoto_daisuke@cloudshell:~ (linkerd-sandbox)$ kubectl create deployment nginx \
    --image=nginx \
    -n test
error: failed to create deployment: admission webhook "policy.sigstore.dev" denied the request: validation failed: failed policy: private-signed-images-cip: spec.template.spec.containers[0].image
index.docker.io/library/nginx@sha256:c54fb26749e49dc2df77c6155e8b5f0f78b781b7f0eadd96ecfabdcdfa5b1ec4 signature key validation failed for authority authority-0 for index.docker.io/library/nginx@sha256:c54fb26749e49dc2df77c6155e8b5f0f78b781b7f0eadd96ecfabdcdfa5b1ec4: no matching signatures:
```
成功
```
yamamoto_daisuke@cloudshell:~ (linkerd-sandbox)$ kubectl create deployment nginx \
    --image=${REGION}-docker.pkg.dev/${PROJECT_ID}/${REGISTRY_NAME}/nginx@${SHA} \
    -n test
deployment.apps/nginx created    # Success!!
yamamoto_daisuke@cloudshell:~ (linkerd-sandbox)$
```

## まとめ
署名を検証する方法について書きました。
Software Supply Chain への攻撃が増えている中で、Image の署名検証は重要な要素になってきています。
Cosign に興味がある方は、ぜひ試してみてください。
MacでGifを作成する

# はじめに
Qiitaの記事を書く際に、記事の説明としてgifを載せることがあるのですが、それの手順をいつも忘れてしまうので、記事としてまとめておいて、自分の参考記事としたいと思います。

# 画面収録
画面の収録は`shift+command+5`でスクリーンショットを立ち上げ、
「選択部分を収録」で撮影する範囲を選択し、収録を押下します。
収録し終えたら、再度`shift+command+5`を押下し、ツールバーを表示します。
ツールバーの「画面の収録を停止」を選択し終了します。
動画はデフォルトの設定だと、デスクトップに保存されるはずです。

# 動画編集
おそらく、無駄な部分があると思うので、動画をトリミングします。
※必要ない方はスキップ

`QuickTime Player`で動画を開きます。
（デフォルトの設定だとダブルクリックで開くはず）

編集からトリムを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/162f97b0-d1d9-ac5a-b8e1-04ec3eb4fdaf.png)

好きな時間になるように枠を調整したらトリムを押して、保存します。

# gif化

gif化は下記の記事を参考にしました。

https://qiita.com/mikene_koko/items/b132f1e9afef82d589b3

`ffmpeg`を使うので、インストールしていない方はしてください

```
brew install ffmpeg
```

インストールできたら、下記のコマンドでgif化します
`ffmpeg -i [変換元の動画ファイル] -r [フレームレート] [変換後のgifファイル]`

```
ffmpeg -i ~/Desktop/test.mov -r 30 ~/Desktop/test.gif
```

## 簡単な方法

1.ターミナルで下記を入力
```
ffmpeg -i 
```

2.動画ファイルをターミナルにドラッグアンドドロップ
（これでパスが入力されます）

したみたいな感じになる
```
ffmpeg -i ~/Desktop/test.mov
```

3.後ろにフレームレートを入力
```
-r 30 
```

したみたいな感じになる
```
ffmpeg -i ~/Desktop/test.mov -r 30
```

4.ターミナル上で、2で入力したパスをコピー

したみたいな感じになる
```
ffmpeg -i ~/Desktop/test.mov -r 30 ~/Desktop/test.mov
```

5.3の後ろに貼り付けて、拡張子だけgifにかえる
したみたいな感じになる
```
ffmpeg -i ~/Desktop/test.mov -r 30 ~/Desktop/test.gif
```

# qiitaに貼り付け

コピペで貼り付けられます。

![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/46f9eefd-02d5-7f45-f033-cc6ab8d31038.gif)
Pythonをexe化するDockerImageを使うときにwsl実行がうまくいかなかったので対処した

# 背景
Pythonをexe化する方法としては「Pylnstaller」や「nuitka」があるもよう。
ひとまずこの記事をみながらPythonをexe化してみた。
https://qiita.com/ryoheiszk/items/2ea26594d24304c721e2
そしたらこのようなエラーが発生。

もしかしてwslでDockerは使えないのかと思い、以下コマンド
`wsl docker`を実行してみたところ、案の定できないと言われた。
```
The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

For details about using Docker Desktop with WSL 2, visit:

https://docs.docker.com/go/wsl2/
```

手順を見ると、なにやらUbuntuを入れてDockerDesktopと連携させるひつようがありそう・・・。

ということなので、はじめてやってみる方向けに手順を整理してみました。

# 手順
### 1.コマンドプロンプトを開く
Win+Rでファイル名を指定して実行を開き、`cmd`と入力

### 2.Ubuntuをインストール
コマンドプロンプトで以下入力。
`wsl --install -d Ubuntu-20.04`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/639d2ccb-fcf4-dee6-8d4c-9b31e49651ab.png)

以下のように「Ubuntu 20.04 LTS はインストールされました。」が表示されたら完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/e56a1cc2-4a59-7d66-c747-919936a080ac.png)

自動的にLTSが起動され「Enter new UNIX username:」と指示されるが、無視してOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/dd9d78cf-2abe-43ad-dcd2-f4e7c35e9229.png)

### 3.既定のLinuxディストリビューションを設定
wslコマンドでデフォルト起動するディストリビューションを設定。
現在のディストリビューション一覧は以下コマンドで確認。
`wsl -l -v`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/8b02af34-f0df-5bcb-da01-ccf197b7ffe2.png)

「docker-desktop」に＊マークがついているため、Ubuntu-20.04をデフォルトに変更する。以下のコマンドで可能。
`wsl -s Ubuntu-20.04`

一覧を確認して変更されているかどうか確認するとよい。

### 4.DockerDesktopでWSL2を使う設定に変更
DockerDesktopで設定画面を開きGeneralへ。
「Use the WSL 2 based engine」にチェックボックスが入っていなかったらチェックをいれてApply&restart

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/ba16ea7c-5749-1119-1c28-98953243aa19.png)

次にResouresへ。
「Enable integration with my default WSL distro」にチェックボックスが入っていなかったらチェックをいれる。
そして先ほどインストールしたUbuntuを統合させるため、「Ubuntu-20.04」をONに。
その後同じくApply&restartをして完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/8f20d843-82a2-e84a-461c-a3fbdba80284.png)

### 5.wslでdockerが実行できるか確認
冒頭で実行できなかった`wsl docker`コマンドを実行。
その結果、以下のようにDockerの使い方説明が出てきたら成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/e2f251ab-92d5-0d5a-0264-42eeaaf1ae9a.png)


# Pythonのexe化

冒頭にご紹介したQiitaの記事をそのまま参考にしています。

▼ディレクトリ構成
```
.
├── main.py
└── requirements.txt
```


コマンドプロンプトを開き上記ディレクトリに移動。
その後以下コードをワンライナーで実行。
```
wsl docker run --rm -v "$(pwd):/src/" cdrx/pyinstaller-windows -c \
  "pip install -r requirements.txt && \
  pyinstaller main.py --onedir --onefile --clean && \
  mv dist/main.exe main.exe && \
  rm -rf __pycache__/ build/ dist/ main.spec"
```

元記事で引っ掛かった点としては、「WSLで実行」部分がうまく理解できていなかったため手こずりました。
コードの冒頭で`wsl`をつけた状態で実行するとうまくdocker runしてくれます。

これで気軽なexe化ライフを過ごせそうです・・・！
RedashでAPI経由でcsvダウンロード

CircleCIのスケジュールで定期的にredashからcsvをダウンロードしようとしてちょっとハマりました。

https://redash.io/help/user-guide/integrations-and-api/api

redashのAPIガイドを見ると`/api/queries/<id>/results.csv`に`{"max_age":0}`をPOSTすれば最新情報への更新とダウンロードを同時にできそうに見えたけどできなかった。。。

当初InternalServerErrorが帰ってきたので、redashのバグかと思ったけど色々試して起こっていることを推測できたのでここに記しておきます。

## ポイント: URLを `/results.csv`から `/results`に変えるとエラーにならない
両者の違いは結果がcsvで返るかJSONで返るかなので、後者で実行した場合は結果は当然JSONで返ってきます。

しかし、それで返ってきたJSONはクエリ結果の情報ではなくどうやらJOBの情報っぽい。

APIガイドのrefreshのあたりを見るとrefreshするとJOBが更新されるから、query_result_idが入るのを待て、みたいなことが書いてあるからどうやら更新された結果を取得するにはここにquery_result_idが設定される(=クエリのキャッシュが作られる)のを待つ必要があるらしい。

で、URLに`.csv`がついている場合にエラーになるのはおそらくJOBの情報をcsvに変換する仕組みがないからだと想像します。

ちなみにrefresh APIを実行するにはuser_api_keyが必要ですが、こちらのresults APIへのPOSTはquery_api_keyで実行できます。
なので、このPOST resultsは内部的には単純にrefresh APIを呼び出しているだけでそれをquery_api_keyで可能にするためのエイリアスなんじゃないかと思っています。

つまりスクリプトでredashから最新のcsvを取得しようとしたら、

refresh -> sleep N秒 -> results.csv

という手順を踏む必要があると思われます。

それでも良いんだけど、今回の場合はそこまでリアルタイム性が必要ではないのでクエリのrefreshはredash側でスケジュールして、CircleCIでは結果取得だけを行うことにしました。

## 忘れてたけど使っているRedashのバージョンは8.0です。
この結果にはredashのバージョンも関係すると思います。 
最新版のredashでは別の挙動になるかもしれません。(書いた後に気がついたけど、ドキュメント通り一発でrefreshと結果取得ができる可能性も高い気がしてきました。。。)
macOSのJDKアンインストール方法

# はじめに
[Java公式のサイト](https://www.java.com/ja/download/help/mac_uninstall_java_ja.html)を参考にJDKのアンイストールを試みましたが古いJava用のアンインストール方法だったようで、私のjdk17.0.5はアンインストールできませんでした。[Oracle公式のサイト](https://docs.oracle.com/javase/jp/17/install/installation-jdk-macos.html#GUID-F9183C70-2E96-40F4-9104-F3814A5A331F)の方を参考にしたらできましたので忘れないように残しておきます。
# 環境
|項目|情報|
| ---- | ---- |
|OS|macOS Ventura 13.1|
|プロセッサ|1.6 GHz デュアルコアIntel Core i5|
|JDK|jdk17.0.5|

# アンインストール方法
## jdkのバージョンを確認
```
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    17.0.5 (x86_64) "Oracle Corporation" - "Java SE 17.0.5" /Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
```
## 以下のディレクトリにcdしてインストールされたjdkを確認
```
$ cd /Library/Java/JavaVirtualMachines/
$ ls -la
total 0
drwxr-xr-x  3 root  wheel   96  1 15 21:10 ./
drwxr-xr-x  4 root  wheel  128 12  2 20:37 ../
drwxr-xr-x  3 root  wheel   96  1 14 14:29 jdk-17.0.5.jdk/
```
## 対象のjdkが確認できたらrmコマンドでディレクトリ削除
```
$ sudo rm -fr /Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/
```
root権限が必要なのでパスワードが聞かれます。
## 再度バージョン確認のコマンドを実行し、アンインストールされたことを確認
```
$ /usr/libexec/java_home -V
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

```
以上となります。
mrubyでらじる★らじる設計編

らじる★らじるは2017年よりHLSで配信を行っているので、とりあえずm3u8を拾います。

```ruby
h = HttpRequest.new()
list = h.get("https://radio-stream.nhk.jp/hls/live/2023545/nhkradiruikr1/master48k.m3u8")
```

listをパースしてtsファイルのURLを作りAACファイルを拾い、ファイルに書き込みます。

```ruby
aac = h.get(aacurl)
file = File.new('/tmp/fifo.aac', 'w')
file.write(aac.body)
```

これを連続しておこないfifoファイルのaacをデコーダーで拾って、再生すればできるかも。

リアルタイム配信の場合はリストを更新しながらAACファイルを取得します。聞き逃しの場合は完全なリストが返ってくるので、リスト通りに再生します。

さてできるかな、

仕様はここにありました。

https://www.rfc-editor.org/rfc/rfc8216.txt
FirebaseのAuthentication使い方(flutter)  準備編

# FirebaseのAuthentication機能を使うには…

### 1.まずはログイン画面のUIを作る
使うにしてもその画面がなければお話になりませんよね！
例えば下のURLからログイン画面のテンプレートを用意します。

https://zenn.dev/joo_hashi/articles/fc6914a5d74629

https://www.fluttertemplates.dev/

### 2.Android用Firebaseプロジェクトの作成

https://firebase.google.com/?hl=ja

1.プロジェクトを作成

2.プロジェクトを作成したら以下の画面が出てくるので、Androidアイコンをクリック
![スクリーンショット_20230202_170204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986347/7a266b53-4248-109d-43de-5b77245e9546.png)

### 3.設定していく
・パッケージ名の入力
>Androidパッケージ名の場所はここ
>![スクリーンショット_20230202_170810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986347/0b419924-30cc-8267-c0ed-51d271ba08b5.png)
ニックネーム、署名証明書は書かなくてもOk

・google-services.jsonのダウンロード
>ダウンロードした google-services.json ファイルをAndroid/appに配置する。

・FirebaseSDKの追加
```
classpath 'com.google.gms:google-services:4.3.15'
```
Android/build.gradleのdependenciesの中に追加
![スクリーンショット_20230202_171742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986347/f989b3dd-7df0-3a29-1a60-5021359a6b66.png)

```
apply plugin: 'com.google.gms.google-services'
```
Android/app/build.gradleの中に追加
![スクリーンショット_20230202_172143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986347/79beec1e-ef0b-6363-096a-dc7a1d968a2f.png)

```
implementation platform('com.google.firebase:firebase-bom:31.2.0')
```
Android/app/build.gradleのdependenciesの中に追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986347/63705690-ead6-37ac-05d6-fcec2c83d98c.png)

### 4.FlutterとFirebaseを連携する
1.puv.devでFirebase coreのパッケージを取得

https://pub.dev/

https://pub.dev/packages/firebase_core

2.それをpubspec.yamlに追加してPub Get
![スクリーンショット_20230202_173824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986347/2451d194-6c1a-4051-a002-94685abf2f84.png)

3.main.dartに移動し、コードを追加
```
void main(){
  runApp(const MyApp());
}
```
ここに、
```
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
```
これを追加して、
```
void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}
```
こうする。

:::note warn
うまく動かない場合
ターミナルでflutter cleanを実行
:::
**これで準備は整ったので、次からは実際にコードを書いていきます！**
【Rails】部分テンプレートをアクションごとに挙動を変えたいときはcontroller.action_nameが便利

# どうした？
「表示が同じページは部分テンプレートを使う」
これはどんな教材でも言われている内容です。
よくある例として`new`ページと`edit`ページは`_form.html.erb`というファイルを用意して、`render`メソッドで呼び出すことで、投稿フォームをDRYに保ちます。

ただ、ほとんど同じだけどアクションによって表示の一部を変えたい時ってあると思うんです。
そんな時の対処法をアウトプットします。

# 手順
今回は、`new`ページと`edit`ページに対して`_form.html.erb`というファイルを用意し、ページタイトルをアクションごとに変えるというシーンを考えてみます。

## ビューファイル上で`controller.action_name`での条件分岐をする
`controller.action_name`は、現在のアクション名を返すメソッドです。
これを利用することで、`case`で条件分岐させてアクションごとに表示を変えることができます。

```erb
<% case controller.action_name %>
<% when 'new' %>
  <h1>新規作成</h1>
<% when 'edit' %>
  <h1>編集</h1>
<% end %>
```

## アクションごとにメソッド化してしまう方法
アクションごとにメソッド化することで、コードの可読性が良くなります。
`application_helper.rb`にて、以下のように定義します。

```ruby:application_helper.rb
module ApplicationHelper

  def index?
    controller.action_name == 'index'
  end

  def show?
    controller.action_name == 'show'
  end

  def new?
    controller.action_name == 'new'
  end

  def edit?
    controller.action_name == 'edit'
  end

end
```

これらのメソッドを使用することで、ビューファイル上では以下のように条件分岐することができます。
```erb
<% if new? %>
  <h1>新規作成</h1>
<% elsif edit? %>
  <h1>編集</h1>
<% end %>
```

# おまけ

コントローラ名を取得したいときは
```erb
<%= controller.controller_name %>
```
を使用できます。

# まとめ

こういったメタ感？のあるメソッドはとても便利ですね。
もっと勉強したいと思いました。

# 参考

https://www.orzs.tech/rails-get-controller-and-action-name/
ChatGPT先生と一緒にペアプロしてみた

※オチはありません

## 対象読者
- 独学でプログラミングを勉強している方
- 一人でコードを書くのが不安な方

## 本稿でやること
- ChatGPT先生とペアプロしている様子を公開

## 本稿でやらないこと
- ChatGPTの使い方
- ChatGPTの概要とか話
- オチを作る

## 本題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/0b57e763-897c-5dc1-6d48-10d0824e7cc1.png)

（コードが長いので中略）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/98176058-4c4b-3fa9-9bc8-521da4793ad1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/5fd47014-3839-5999-268b-4bf52434b599.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/e771ad15-682b-f8cd-f67b-d11ee06bb196.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/7645a594-96b8-b96b-c12c-94118caa529c.png)

私が２時間ぐらい掛けて悩んだクソコードを、デバッグ時間含め10分ぐらい会話するだけでめちゃくちゃシンプルにしてくれました！
各処理をワンライナーで書いているので、こんなお願いをしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/3df985ac-08bd-2981-62bf-723b2b0cbc78.png)

後でメンテナンスする人＝私にも嬉しいサポート付き！
このコメントの書き方は参考になる方も多いかもしれませんが、コメントの内容はコードを見れば分かるじゃん！と思ったので、より実務的な意味に修正が必要ですね。
そこまでChatGPTに頼るな、という話ではありますが。

## プログラミングの勉強はGoogle先生とChatGPT先生に質問してみよう！
一応、私の立場（ITスクール講師）としては、あなたが目指している業界の実務経験者にも質問などなど訊いてほしいなー、とは思いますが、なかなかレスポンスが難しいタイミングもあるので、こういったツールはガンガン活用していくと良いです。
最終的なコードレビューは講師にもお願いしてみると、現場で流した血と汗と涙が混じった意見がもらえると思います。
私が教鞭を執るときはより一層、気をつけようと思いました。

### 私信
業界の相談や履歴書の添削をしてほしいという要望を多くいただきますが、そういった相談もChatGPTに投げてみると面白いかもしれません。
私もですが、ChatGPTに相談しても受かるかどうかは時の運・担当者との相性だったり色々な要因があるので確約しかねますが、気は晴れると思います。


## 追記
ChatGPTにこの記事の添削をお願いしたんですが、全体的に評価するのは難しいようです。（「An error occurred. If this issue persists please contact us through our help center at help.openai.com.」システムリソースの問題？）
先程のコードもそうですが、小さい枠組みだとできるみたいなので、質問は具体的に、少しずつ話題を区切ってすると良さそうです。

## 疑問
リファクタリングの精度がだいぶ低いように思います。
汚いコードで溢れていたのでリファクタリングをやらせてみたんですが、そのほとんどが使い物になりませんでした。
完璧な精度ではないのは人間っぽいなぁ、なんて変な感心をしましたが業務だと困るので、今後に期待したいですね。

あるいは、必要な情報が少ないために解釈を勘違いしたケースはあるかもしれません。
我々ユーザー側が質問の精度を上げる努力をする必要があるかもしれませんね。
Excelで罫線が表示されない＆セルからはみ出す問題に直面した時

**力が…欲しいか…？？**
Excelがやられたか、だが奴はしょせん表計算ソフト。
印刷物を扱う上では小童も同然よ。（CV. 大塚明夫さんのイメージ）

# Excelで印刷する時のトラブル&対策集
忘備録。たまに複数回印刷するだけで解決する場合もあり。プリンターの印刷かすれ？
前提として、Excelのバージョン違いによる問題、印刷先（DocuWorks Printer）の問題である可能性もあることに注意。
## Case 1: 罫線が一部表示されない
チェックポイント
- ExcelからDocuWorksに印刷する時
該当セル右クリック＞「セルの書式設定」罫線は本当に自分の思い通りに設定されてる？
例：セルの上側だけ罫線が入っていた、見出し行以外のセル（改ページなど一部）は「罫線なし」の設定になっていた
「ページレイアウト」＞「印刷設定」、用紙サイズはあってる？印刷品質は600 dpi（600 dpiに限らず、紙の出力に耐える解像度）？
「ページレイアウト」＞「印刷設定」＞「シート」タブ、「簡易出力」にチェックマーク入ってない？

- DocuWorksから紙に印刷する時
「印刷モード」、標準でだめなら高繊細（文字/線）にしてみたらいいじゃない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1699005/60b9f1ed-abf5-90ea-440d-ef14afd1f1b7.png)

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10172653625

https://www.fujifilm.com/fb/support/mf/dc5_c7776/contents/dc5_c7776_5040.html

Excelにおける一番細い線（点線）は、どう頑張ってもプリンターで出力されないことがある。（プリンターの印刷設定を「濃い目」にすることである程度対処可能。しかし無理なときは無理。）報告書の形式を勝手に変えるわけにもいかないので、無理なら諦める。
推測だが、日報や時報データを全て印刷する場合、一番細い罫線にしないと数字が読めなくなる。一部罫線が表示されないとしても、数字の見やすさを優先して点線を利用しているのではないか？
Docu文書では全ての罫線が表示されているから…許して…

## Case 2: 文字がセルからはみ出す
チェックポイント
- セルの幅を変更できるか
- 折り返し表示ができるか（セルの高さを変更できるか）
- 半角スペースなど、見やすさのための工夫を一部犠牲にできるか
- 表現を変えて、セル内に入力する文字を減らせるか
- 表示タブ＞「標準」ではなく「ページレイアウト」で確認
- 最終的には印刷プレビューで確認
- もっと言えば、Docu文書や紙に印刷した状態で重箱チェック（最終確認）
- 見直せば見直すほどミスが見つかる…なぜ…？？

:::note warn
Excel、印刷専用ソフトじゃないのに無茶させてごめんな。
いつもありがとう。
:::

# 参考文献

https://qiita.com/yosatonet/items/6d8d4377cf6b56d6c7c5

https://qiita.com/7404/items/ce80e1425a413832473e

https://answers.microsoft.com/ja-jp/msoffice/forum/all/excel%e3%81%ae%e7%bd%ab%e7%b7%9a%e3%81%a7%e7%82%b9/67a90c8e-74cb-4296-99ad-2bb36d7fd20d

https://inmylife65.net/quick-solution-excel-line-noprint-3071

https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB/af9e79e7-4691-4cab-8c5b-f778cd1f04b1
GASでHTMLスクレイピング

## 備忘録

Cheerioを使います。

https://github.com/tani/cheeriogs

## サンプル

```js
function myFunction() {

  // ページ取得
  var response = UrlFetchApp.fetch('https://example.com/');
  var content = response.getContentText('utf-8');

  // selector取得
  const $ = Cheerio.load(content);
  $routes = $('div > p');

  // シートに入力
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  $routes.each(function(index, element) {
    ss.getRange(index + 1, 1).setValue($(element).text());
  });
}
```

## 終わり

スクレイピングが禁止されているサイトもあるので規約をちゃんと読もう！
【LeetCode】Binary Searchの公式Tutorialを読んでみた③ [Use Built-in Tools]

## 1. 記事の概要
* LeetCodeのStudy Plan(Binary Search)では、一番最初の問題で公式解説を確認する事ができます。
* 当記事は、その解説を読みながら、自分なりに要点をまとめた備忘録です。

### 1-1. 前回の記事
https://qiita.com/Tim_Leitch_2023/items/939afe27fc0860a51199

## 2. 標準関数を使う
* 言語によって仕様が違いますが、標準で搭載されている標準関数を使うことで、解を求めることも出来ます。

```Python3
# Python3
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # Find the insertion position `idx`.
        idx = bisect.bisect_right(nums, target)

        if idx > 0 and nums[idx - 1] == target:
            return idx - 1
        else:
            return -1
```

```C++
# C++
class Solution {
public:
    int search(vector<int>& nums, int target) {
        // Find the insertion position `idx`.
        int idx = upper_bound(nums.begin(), nums.end(), target) - nums.begin();

        if (idx > 0 && nums[idx - 1] == target) {
            return idx - 1;
        } else {
            return -1;
        }    
    }
};
```

## 3. 参考ページ
* https://leetcode.com/problems/binary-search/solutions/2794222/binary-search/?envType=study-plan&id=binary-search-i
出力されたSQLログを実行形式に置換整形するマクロ（JScript）

手順
①ログからSQLとパラメータの2行取り出しサクラエディタに貼り付ける。
②マクロ(tool.js)実行するとバインド変数（プレースホルダ）`？`がパラメータに置換される。
```js:ログ（実行前）
1 select A from B where c=? and d in (?,?)
2 [AAA, BBB, CCC]
3
```
```js:ログ（実行結果）
1 select A from B where c='AAA' and d in ('BBB','CCC')
2
3
```
2行目の値は削除され1行目にマージされる。

対象フォーマット
* 1行目：パラメータ「？」を含むSQL。
* 2行目：パラメータの値。前後にブラケット括弧 *[、]* がある、連結はカンマ＋スペースである。
    （？は10個まで対応。不足してればループ回数増やせばいい。）
* 2行目以降は影響なし


---
実行マクロ
```tool.js
//?を引数に置き換えるツール

//描画非表示
SetDrawSwitch(0);

//?にダブルクォート付加
replaceAll('?', '¥'?¥'', 26);

//ループ回数：10回繰り返す
var i = 0;
for(i ; i<10 ; i++){
    //ファイル先頭へ移動し、下へ移動
    GoFileTop();
    Down();

    //先頭から 1個目のカンマorブラケット括弧 まで切り取り
    //検索
        //有効検索オプション
        //4:正規表現
        //16:検索ダイアログ閉じ
        //2048:検索履歴から削除
    var text = SearchNext('^.*?[,[]]]', 2068);

    //検索結果を取得
    text = GetselectedString(text);

    //前後トリム
    var textTrim = text.slice(1, -1);

    //?を置換
    GoFileTop();
    replace('?', textTrim, 26);

    //break処理。ブラケット括弧がなければループ抜ける
    GoFileTop();
    var bracketEnd = SearchNext(']', 2068);
    bracketEnd = GetselectedString(bracketEnd);
    if(bracketEnd == '') break;
};

//画面表示＆再描画
SetDrawSwitch(1);
Redraw(0);
```
通話API（CPaaS）サービスを比較

Skyway、twilio、Zoom、Vonageが提供するAPIの料金や機能について自分用にまとめます。

正確な料金については公式サイトを参照してください。

|   | twilio(GO) | twilio(P2P) | twilio(Group) | SkyWay(CE) | SkyWay(EE) | Zoom(Video SDK) | Vonage(ビデオAPI) |
|---|---|---|---|---|---|---|---|
|基本利用料 |0円 |0円 |0円 |0円 |100,000円|0円|1,300円|
|通信量 |0円 |0.2円 / 1分 |0.5円 / 1分 |0円（接続回数に上限あり） |40円/GB|0.48円 / 1分（10000分までは無料）|0.5円 / 1分|
|用途 |個人開発<br>小・中規模サービス |小・中規模サービス |中・大規模サービス |個人開発<br>小規模サービス |中・大規模サービス|-|- |
|バーチャル背景  |◯ |◯ |◯ |× |× |◯ |? |
|録画機能API    |× |× |◯ |× |Streamを経由して実装可能 |◯（13,400/月） |? |
|文字起・翻訳    |× |× |x |× |x |◯ |? |

※ 1$ = 130円で換算しています

- [WebRTC Go の完全無料化（2021.10.13〜）](https://cloudapi.kddi-web.com/news/latest/video-free-webrtc-go-one-year-update)
- [WebRTCの音声・ビデオ通話を録画・翻訳可能に、NTT Comのクラウドサービス](https://it.impress.co.jp/articles/-/17334)
- [@skyway-sdk/core](https://www.npmjs.com/package/@skyway-sdk/core/v/0.2.0-beta.3)


## 料金へのリンク

- [twilio](https://www.twilio.com/ja/video/pricing)
- [SkyWay](https://skyway.ntt.com/ja/pricing/)
- [Zoom(Video SDK)](https://blog.zoom.us/ja/bring-industry-leading-video-to-your-application-with-zooms-video-sdk/)
- [Vonage](https://www.vonagebusiness.jp/communications-apis/video/pricing/)

## 感想

サービスの料金や機能でみるとtwilioかzoomのどちらかでいいのではと思います。

twilioであればCPaasとしての機能が充実しており、twilioで完結できるのがいいですね。ただ業績をみると大きい赤字が続いているので、そこは懸念かなと思います。

Zoomはリアル翻訳などの最新機能を組み込めるのが強みではないかと思います。通話のAPIとしては十分すぎる機能ですが、SMSなどを送りたいとなった場合、twilioなどの他サービスを使うことになるため、開発者の負担はtwilio単体よりは増えるかもしれません。

SkyWayはtwilio、zoomの次の選択肢かなと思います。NTTの安心感はありますが、料金、機能面で劣っている印象です。

Vonageは料金だけしか見れいないのですが、twilioのようなCPaasかと思います。後発？ということもあり、twilioより洗練されたAPIが提供されているのではないかと勝手に思っています。（ドキュメント等は読んでおらず推測です）

## ドキュメントへのリンク

- [Zoom(Video SDK)](https://marketplace.zoom.us/docs/sdk/video/developer-accounts/)
ChatGPTはとりあえず相談に乗ってくれる先輩。月20ドルは安い？

## はじめに

今話題のChatGPTですが、2月1日に有料版のプランが発表されましたね。

https://openai.com/blog/chatgpt-plus/

> The new subscription plan, ChatGPT Plus, will be available for $20/month, and subscribers will receive a number of benefits:
> 
> - General access to ChatGPT, even during peak times
> - Faster response times
> - Priority access to new features and improvements
> 
> ChatGPT Plus is available to customers in the United States, and we will begin the process of inviting people from our waitlist over the coming weeks. We plan to expand access and support to additional countries and regions soon.

月額20ドルで米国でサービス開始。ウェイトリストに沿って提供開始し、その後順次世界中に対象を広げていくとのこと。

無料のバージョンも引き続き利用できますが、しばらくは混雑して使えない時間もありそうですね。

一方でGoogleも Bard という対抗馬を発表し、盛り上がってきました。

## ChatGPTって使えるの？

各所で色んなことが言われていますが、個人的には非常に気に入っています。
様々な使われ方がインターネットで紹介されてますが、もっと気軽に「自分はこう使ってますよ。」というのを書いていこうと思います。

### ChatGPTでプログラマは不要になるか？

どうなんでしょうね？
プログラマが行う作業を、いい意味でも悪い意味でも省力化してくれるのではないかと思います。
コピペのコードが厄介なように、使う人と条件を選ぶ感じですかね？
非公開の情報をインプットしないよう気を付けましょう。

15分程度触っただけなので評価は避けますが、試しに何個かお願いして作成したプログラムは「動く」ものもあれば、「動かない」ものもありました。

「動く」というのはエラー無く実行できるという意味で、実行結果は残念ながら不十分なものでした。
「動かない」というのは文字通り実行時にエラーが発生して動かない感じでした。

ただChatGPTの出す回答にフィードバックすることで会話を通して回答の精度を上げられるので、話題によっては非常に有用かなぁという印象です。

特に「こんなことやりたいけどやり方がわからん。」というものについては、実際に着手する時のとっかかりを提供してくれるのでうれしいです。（どうせその後に自分で手を動かして検証していくので。）

AIを使うスキル（質問のスキル）というのが新しい時代に求められそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/a40ee61f-cf53-7d0b-6571-b0b27cd4bc2a.png)

### 正解は期待しないが、手掛かりが欲しい時に便利

上でも書きましたが、「こんなことやりたいけどやり方がわからん。」ということがあった場合、Googleで調べるよりもChatGPTと会話した方が迅速に期待した回答が得られます。

特に最近業務でAWSを触る必要に迫られており、お勉強をしながら業務を進めていくわけですが、「あんなことできるのか？」「こんなことできるのか？」といった疑問がたくさん出てきます。

これまではキーワードでGoogleを検索してみたり、マニュアルをつまみ食いして理解できず、あきらめて最初から読んだりしていたものの、ChatGPTに聞いてみると行動の手掛かりを与えてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/1a94280d-f566-725e-ce9d-93a3fe7116a5.png)

## とりあえずしばらくの間 ChatGPTに期待すること

回答の内容は正しいこともあれば間違っていることもあります。
なので、正解を求めて利用するのはよした方がいいと思います。

「物知りだけと時々適当なことをいう先輩だと思って相談してみる」のが良いのかもしれません。
会話する中で一つの仮説を提供してくれるので迅速にアクションに移れますし、仕事がだいぶ効率化すると思います。

当然、業務上の具体的な情報とか機密情報は入力してはダメです。あくまで一般的な内容で。
検索エンジンを使うときの様に検索用「キーワード」を設計する必要はありませんが、わかり易く自分の「要望・要件」を伝えるスキルは必要になってくる気もします。

今は面白くていろいろと使っていますが、そのうち飽きるかもしれない。ただ、
世話になっている先輩に時々昼飯をごちそうすると考えると。。。10ドル/月ぐらが嬉しいかな。

## まとめ

現在、DXという言葉が至る所で聞かれます。

個人的にDXという言葉自体には何の価値も魅力も感じませんが、行動やプロセスが変革した結果として、業務プロセスの組み換えや仕事の定義が変わり、顧客価値の創出・提供にリソースを割り充てられるようになれば、会社の競争力も高まり結果的に他人からDXと呼ばれるのかなぁと思っています。

状況に振り回されているうちはいくら高尚な言葉を並べ立てていてもダメで、状況をコントロールできるようになることを目指すべきかと。

主観としては、まじめな人・組織ほど己の不足を痛感し「あれもこれも」と自分たちを追い込んでしまいがちに見えます。
創出した時間が重要なのではなく、限られた時間を使って何を「しない」かを考えてみたいと思います。

努力が足りないのではなく、努力を向ける方向性を疑った方がいい。と思わせてくれる力がテクノロジーにはあり、それを駆使していくのが「DX」だといいなぁと思ってます。

取って付けのようですが、RPAも同じかなと思っています。

## 追記（2023-02-13）

もう少し利用方法について深堀してみました。

https://qiita.com/ParakeetOnTheHead/items/5f4b8828fa66ae113429
PHPでハイフン（マイナス）に似た文字を統一する

必要に応じて配列は増減させること

```php
str_replace([
    "\u{02D7}",
    "\u{1173}",
    "\u{1B78}",
    "\u{2010}",
    "\u{2011}",
    "\u{2012}",
    "\u{2013}",
    "\u{2014}",
    "\u{2015}",
    "\u{2043}",
    "\u{207B}",
    "\u{2212}",
    "\u{25AC}",
    "\u{2500}",
    "\u{2501}",
    "\u{2796}",
    "\u{30FC}",
    "\u{3161}",
    "\u{FE58}",
    "\u{FE63}",
    "\u{FF0D}",
    "\u{FF70}",
    "\u{10110}",
    "\u{10191}",
], '-', $value);
```
Kinesis FirehoseからS3転送時の日付プレフィックスの設定

# はじめに
Kinesis FirehoseからS3へのデータ転送時に、明示的に日付の設定を行わない場合、本日日で**yyyy/mm/dd/hh**の形式なる。
Athenaなどで転送したS3プレフィックス配下に対してSQLを実行する際に、利用しやすい日付パーティションで活用できるよう、Kinesis Firehose側で日付プレフィックスの設定を行う。

# 設定方法
* S3 バケットプレフィックスへ以下の設定をすることで、本日日の**yyyy-MM-dd形式**のプレフィックスで転送できる
* また、日付以外にも**firehose1**のようなプレフィックスの指定も可能である
```
firehose1/!{timestamp:yyyy-MM-dd}/
```
* Kinesis Firehose側の設定
![スクリーンショット 2023-02-08 11.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/26d67165-d61d-96af-4f2b-f44241f33450.png)

* S3へ**yyyy-MM-dd形式**で転送されていることを確認
![スクリーンショット 2023-02-08 11.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/53db2af8-692b-3f62-42e1-3d4a4c269f21.png)


* 以下の設定では、**yyyy/MM/dd形式**でプレフィックスへ転送できる
```
firehose1/!{timestamp:yyyy}/!{timestamp:MM}/!{timestamp:dd}
```

* S3へ**yyyy/MM/dd形式**で転送されていることを確認
![スクリーンショット 2023-02-08 11.38.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/997cee8b-02b0-9e12-0441-4cee5271ff35.png)

* エラーログも同様に設定できる
![スクリーンショット 2023-02-08 11.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/33c587c0-ce26-a6d1-1638-c8f83cde8270.png)
【#web3】プロテウス効果ってなあぁぁあああに?(迫真)

# ( ﾉД`)ｼｸｼｸ…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2081812/234eaacd-2ef3-4f68-f802-6e12d6868699.png)

まぁこんなサジェストは置いといて、QiitaでWeb3関連の記事をあさっていたことろプロテウス効果という単語が気になったので調べてみました。

## ネットあるある(?)

狭義ではVRC、広義ではどう森まで含むメタバースではほとんどの人がオリジナルのアバター、すなわちゲーム内での分身を作っているわけです。そのアバターを使うことによって得られる心理効果を指すようです。

またこのように解説されていました。

<blockquote>
オンラインアバターという自己表現手段が最近生まれたものなので、研究されるようになってまだ日が浅い心理学現象である。
しかし、自己効力感（Self-efficacy）とメタ認知（Metacognition）との相互作用という意味では類似のものは古くから指摘されている。
ビジネスの場合は例えば高いスーツを着て自分に自信を持つのはこの現象に近い。
また、アメリカテキサス大学のダニエル・S・ハマーメッシュ教授は「見た目と年収」の関連性を研究し、相関関係があることを指摘している。

[【プロテウス効果（心理学用語）】- miraimanagement.co.jp](https://www.miraimanagement.co.jp/mmedia/personneltraining-keyword/%E3%80%90%E3%83%97%E3%83%AD%E3%83%86%E3%82%A6%E3%82%B9%E5%8A%B9%E6%9E%9C%EF%BC%88%E5%BF%83%E7%90%86%E5%AD%A6%E7%94%A8%E8%AA%9E%EF%BC%89%E3%80%91#:~:text=%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AA%E3%81%A9%E3%81%AE%E4%BB%AE%E6%83%B3,%E5%A4%89%E8%BA%AB%E5%8A%B9%E6%9E%9C%E3%81%A8%E3%82%82%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82)    より引用
</blockquote>

なんかこうバ美肉と同じようなスタンスを個人的に感じます。

ただ上記の指摘や画像のサジェストのように悪い影響も懸念されているようで...まぁ新技術でもあるのでまぁ致し方なしですね(;^_^A

でもこんな評判を覆せるよう私も開発をがんばります。

短いですがこれで失礼...
ABC287-D解説物語/AtCoder

sの先頭のx文字とtの字数に足りない分はsの後ろの文字から取ってきてマッチできるか的な問題

愚直に、sの先頭何文字までならマッチできるか？とsの後ろ何文字までならマッチできるか？を計算して？数えて？

で最後の出力の時に、t文字数 分ループ回してさっき数えか計算した奴を元にイェスノー振り分けて終わり
VSCodeでPylanceのreportPrivateImportUsageを無視する

Pylanceのtype-checkingモードはとても便利なのですが、意図しない`reportPrivateImportUsage`の警告を出してきます。たとえば、

```python
from dask import array as da

da.from_array(...)  # <- 警告!
```

とかです。この場合`dask`が`__all__`を定義していないためです。

## 解決策

ファイルのどこかに

```python
# pyright: reportPrivateImportUsage=false
```

を書けばOK。
[Windows]任意のフォルダへbatファイルをフォルダごとコピーしコピー先でbatファイルを再実行するbatファイル

# はじめに
不特定多数のwindows端末へスクリプトファイル群やパッチを配布するために、
ファイル群をファイルサーバーなどに格納しローカルへのコピーと処理実行を1ファイルで実現したい事がありbatファイルを作成してみた。

# 処理概要
①変数'DEST_DIR'にコピーしたいディレクトリへのパスをセット
　例ではc:\workとする
②batファイルを実行したフォルダへ移動
③'DEST_DIR'に定義したパスが存在しない場合、batファイルを実行したフォルダを'DEST_DIR'へコピー
④③で'DEST_DIR'へコピーしたフォルダでbatファイルが実行されていない場合、コピーしたフォルダでbatファイルを再実行
⑤実際に実行したい処理をMAIN節以降に記述

# batファイル全文
~~~vb:batファイル全文
rem batファイルの実行フォルダが%DEST_DIR%以外の場合、batファイルの実行フォルダを%DEST_DIR%にコピーしbatを再実行
rem batファイルの実行フォルダが%DEST_DIR%の場合、MAIN節の処理を実行

rem -環境変数解説-
rem DEST_DIR -> フォルダのコピー先フォルダのパスを指定。(任意)
rem THIS_PATH -> 本batファイルのパスが設定される。
rem FOLDER_NAME -> 本batファイルが格納されているフォルダ名が設定される。
rem BAT_NAME -> 本batファイルのファイル名が設定される。
rem WORK_DIR -> batファイルコピー先フォルダのパスが格納される。DEST_DIR\FOLDER_NAME=WORK_DIRとなる。
rem BAT_FULLPATH -> batファイルコピー先のフルパスが格納される。WORK_DIR\BAT_NAME=BAT_FULLPATHとなる。

rem =====================================================================================
rem set DEST_DIRにコピー先のフォルダのパス、MAIN節にメインの処理内容を記載し使用してください。
rem =====================================================================================

rem ローカルの作業フォルダ(batを含むフォルダのコピー先)を%DEST_DIR%に定義
 set DEST_DIR=C:\work

rem batファイルのカレントディレクトリ名を%FOLDER_NAME%に定義
 setlocal
 set THIS_PATH=%~dp0
 for %%1 in ("%THIS_PATH:~0,-1%") do set FOLDER_NAME=%%~nx1

rem batファイル名を%BAT_NAME%に定義
 set BAT_NAME=%~nx0

rem batファイルを再実行するフォルダ%DEST_DIR%\%FOLDER_NAME%を%WORK_DIR%に定義
 set WORK_DIR=%DEST_DIR%\%FOLDER_NAME%

rem batファイルのフルパス%WORK_DIR%\%BAT_NAME%を%BAT_FULLPATH%に定義
 set BAT_FULLPATH=%WORK_DIR%\%BAT_NAME%

rem batファイルが格納されたフォルダへ移動
 pushd %THIS_PATH%


rem %WORK_DIR%が存在しない場合、%DEST_DIR%へ%THIS_PATH%をコピー
 if not exist "%WORK_DIR%\" (
	xcopy /i /e /y "%THIS_PATH%" "%WORK_DIR%"
 )

rem batファイルの実行フォルダを確認し、%WORK_DIR%でbatが実行されていない場合、%BAT_FULLPATH%を再実行
 if "%THIS_PATH%" neq "%WORK_DIR%\" (
	powershell start-process %BAT_FULLPATH%
	goto exit
 ) else if "%THIS_PATH%" equ "%WORK_DIR%\" (
	goto MAIN
 )


:MAIN
rem =====================================================================================
rem 以下メイン処理を記述
rem =====================================================================================


:exit
exit
~~~

# 終わりに
主にps1ファイルをbatファイルから実行させたい場合に使用している。
配布、処理させたい内容が変わった場合に修正する必要があるのは以下の2点。
①コピー先のフォルダ指定
 set DEST_DIR=C:\work

②MAIN節以降の記述
rex0220 プレースホルダプラグイン

kintone 編集画面で、項目の入力欄に説明を表示するプラグインです。
説明文の色指定等で、分かりやすく表示します。

主な特徴
・プレースホルダの色・イタリック・ボールド指定
・３ヶ国語対応
・PC・モバイル対応

対象項目タイプ
・文字列（１行）
・文字列（複数行）
・リンク
・数値

# 画面表示例

- blue, italic, bold 設定
![2023-02-08_10h53_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/732e6fe2-bcd4-cf16-800b-4e24b7f628a9.png)
![2023-02-08_11h06_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b78ab39d-86d6-4454-ca89-2553e1637c95.png)

- orange, bold 設定
![2023-02-08_10h55_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a79210fb-1778-52cb-f397-ef2e7a9b30ea.png)
![2023-02-08_11h07_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9abb7687-c75e-8b25-aab9-d4f3f8f767d2.png)

- default 設定
![2023-02-08_11h08_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9d1d58f4-e34d-41f0-8c69-b6f2b4c79abb.png)
![2023-02-08_11h08_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1997de6e-7fdf-6142-f803-e677df718a88.png)

- モバイル表示
![2023-02-08_11h11_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2f4c6647-3f1a-b622-c940-015d1c9e2d79.png)

# プラグインの設定

- 基本設定
    - プレビュー：　プレースホルダのプレビュー表示
    - 色：　色指定
    - スタイル：　イタリック指定
    - ボールド：　太字指定
![2023-02-08_11h14_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/69931e1b-0ac9-6ec8-ee05-58e69add7c90.png)

- 項目
    - NOTE：プラグイン設定についてのメモ等
    - プラグイン有効
    - フィルタ：　表示する項目を絞り込み
    - プラグイン設定のダウンロード
    - プラグイン設定のアップロード
    - メッセージ：　プレースホルダに表示する説明文
    - 英語：　英語表記の説明文
    - 日本語：　日本語表記の説明文
    - 中国語：　中国語表記の説明文
    - 運用環境に反映
![2023-02-08_11h15_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0e862be3-fa99-1a14-cc33-37e460f72ec5.png)

# 注意事項
- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
コンテナイメージから中に入る

コンテナイメージからコンテナを立ち上げて、
そのまま中に入って、bashコマンドを使用して中身を確認できます。

ディレクトリ構造の確認などに使えます。
```
docker container run -it <image名> bash
```
中に入れました。
```bash:コンテナ内
root@n5sp8fo4noa2:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```
Wordpressでリビジョン機能を無効化する

# 1. はじめに

## 1.1. 対象
- Wordpressでリビジョンを無効化したい人
- テーマ開発をしている人

## 1.2. 経緯
- wp-configで設定するパターンは検索にヒットするものの、functionsで設定するパターンがヒットしなかった
- プラグインがあるなら、フックでどうにかできるはず...とコアファイルを探したら方法を発見したので、忘備録も兼ねて


# 2.1. 本題

## 2.1. functions.phpで設定する

:::note info
**POINT**
1. `wp_revisions_to_keep` フックでフィルタする
2. リビジョンの最大保持件数を 戻り値に設定する
:::


### 2.1.1. あらゆる投稿でリビジョンを保存しない

```php:functions.php
add_filter("wp_revisions_to_keep", "disable_all_revisions");
function disable_all_revisions() {
  return 0;
}

```


### 2.1.2.特定の条件でだけリビジョンを保存する

```php:functions.php
add_filter("wp_revisions_to_keep", "disable_revisions", 10, 2);
function filter_function_name(int $num, WP_Post $post) {
  // 投稿タイプが「hoge」の投稿は最新5件までリビジョンを保存する
  if ($post->post_type === "hoge") {
    return 5;
  }
  // それ以外は無効化する
  return 0;
}
```


## 2.2. wp-config.phpで設定する

:::note info
**POINT**
1. WP_POST_REVISIONS をdefineする
2. wp-setting.php のrequireより前でdefineする
:::


### 2.2.1. 完全に無効化する場合

```php:wp-config.php
define("WP_POST_REVISIONS", false);
```

### 2.2.2. 最大件数を設定する場合

```php:wp-config.php
// 最大3件までに限定する
define("WP_POST_REVISIONS", 3);
```



## 3. 参考
- [wp_revisions_to_keep | フック | WordPress 開発者リソース](https://developer.wordpress.org/reference/hooks/wp_revisions_to_keep/)
- [WordPressのリビジョン機能の使い方と最適化のコツ](https://kinsta.com/jp/blog/wordpress-revisions/)
docker loginできないエラーの解決メモ(docker-credentials-passの初期化)

今後万が一再発したときにすぐ情報を見つけたいのでここにメモ。


# 1. エラー概要
docker login時に「error storing credentials…password store is empty」というエラーが返ってくる。初見。

## エラーメッセージ
```bash
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: masatoemata
Password:
Error saving credentials: error storing credentials - err: exit status 1, out: `error storing credentials - err: exit status 1, out: `pass not initialized: exit status 1: Error: password store is empty. Try "pass init".``
```


# 2. 解決した方法
Github Issueに従って解決
https://github.com/docker/docker-credential-helpers/issues/102
↑文章形式なのでコマンドで残す

```bash
wget https://github.com/docker/docker-credential-helpers/releases/download/v0.6.0/docker-credential-pass-v0.6.0-amd64.tar.gz
tar -xf docker-credential-pass-v0.6.0-amd64.tar.gz
rm docker-credential-pass-v0.6.0-amd64.tar.gz
mv docker-credential-pass /usr/bin
sudo mv docker-credential-pass /usr/bin
docker-credential-pass version
sudo apt install gpg pass
gpg --generate-key
pass init 1EXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX28
pass insert docker-credential-helpers/docker-pass-initialized-check
pass show docker-credential-helpers/docker-pass-initialized-check
docker-credential-pass list
nano ~/.docker/config.json  #  "credsStore": "pass"  に書き換え
docker login
```


# 3 環境
```bash
$ lsb_release -a
LSB Version:    core-11.1.0ubuntu4-noarch:security-11.1.0ubuntu4-noarch
Distributor ID:    Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:    22.04
Codename:    jammy

$ docker -v
Docker version 23.0.0, build e92dd87
```