OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel6】レコードの存在判定

## 問題
レコードに値があるか判別したい

## 解決方法
exists()を使う

## 例
```BudgetController.php
if(Auth::user()->budget()->exists()) {
    // if文の中身
}
```

## 参考サイト

https://qiita.com/___yusuke49/items/07e585ed27f7dc4ddbb4
【Laravel6】最も古い1件取得

## 問題
「最も古い1件取得」をしたい

## 解決方法
```
例
Model::orderBy('created_at', 'DESC')->orderBy('id', 'DESC')->first();

$date = Auth::user()->budget()->orderBy('created_at', 'ASC')->orderBy('id', 'ASC')->value('date');
```

##　参考サイト

https://zenn.dev/isao_e_dev/articles/64fab5ff2b120b
RDS のStorage-config-upgrade ステータスについて

# 先に説論
- 急いてるときはストレージの更新設定を有効にしない
- 時間に余裕があれば設定を有効にする

# 前提
- 今回はRDS for MySQL の内容です
- Aurora MySQL はまた別な挙動をする可能性があります

# 今回の経緯
- 検証目的でDB インスタンスを作る必要がありそのときの内容です
- 構成
    - プライマリ、レプリカの2 台構成
    - DB インスタンスタイプ: db.m5.2xlarge
    - ストレージ: gp2(330GiB)
    - DB エンジン: MySQL 5.7.44
- リードレプリカを作る際に、下記画像のような項目があり、この設定を有効にするとめちゃくちゃストレージの設定に時間がかかります
    - デフォルト値はチェックが入っていません
    - ![スクリーンショット 2024-04-17 20.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551379/f1e0ff0b-57b3-8154-c323-93d67999b63c.png)
- 今回ステータスが利用可能になるまで、大体18 時間程度かかりました

# aws サポートに質問してみる
- 上記の画像の設定をするとRDS API がリクエストされているため、時間がかかっているとのこと
- この設定を有効/無効 にした際の挙動も質問してみるが、OS やファイルシステムについては情報非公開で回答が難しいとの返信
    - 歯切れが悪いですね...
- あわせて、急ぎの場合は現在作成中のレプリカDB を削除し、上記画像の設定にチェックを入れずに再作成するのが良いと回答

# まとめ
- 冒頭にも書きましたが、DB インスタンスの作成を急ぐときはチェックを入れない、時間に余裕があるときはチェックを入れるのが良さそうです
- 今回は検証環境だったので良いですが、本番環境の場合設定の有効/無効 でパフォーマンスに影響が出るとまずいので、aws の公式ドキュメントに記載するか情報を公開いただきたいですね
    - 今後のアップデートに期待です
【Vidnoz】俺の代わりに知らんおっさんに自己紹介してもらうことにする

## 自己紹介が苦手

こんにちは。
シーランド公爵のぬのがわです。

4月は自己紹介のシーズンですね。

前に出て何か話すからには、なんか面白いことを言わないといけないかと思うのですが、とてもシャイなので、非常に憂鬱です。

ん？　面白いことをいう必要はない？

**俺は高校時代、ＳＳＨ（スーパーサイエンスハイスクール）とやらでやってきた陽気なアメリカ人に、前に出てしゃべるからにはひとつくらい面白いことをかませと思いこまされてしまいました。**

すっごく（身振り）スピーチが上手な人で、俺もそうなりたいと思った結果、ド陰キャなのに前に出てはしゃべり、時々滑り倒す悲しい公爵になってしまったわけですが。

ジッサイ面白いかはともかくとして、冗談はよい武器になります。

もちろん、そぐわない場もあります。でも、なんか笑わせて場を和ませることができればかなり話を聞いてもらえるラインが下がる。
むしろ、シャイな人間にこそおすすめです。

……。

あいたたた……。緊張でおなかが……。

AIが発展する今なら、AI技術の紹介というていで知らんおっさんにしてもらえんじゃないのか？

# Vidnozを使ってみる

そんなうまい話があるのかな。せいぜいが小鳥が飛び回る映像を作ってもらって編集でもするかと思ったんですが、もうあった。

むしろおっさんのほうが近かった（それっぽくしゃべって動くだけのほうが、たくさんサービスがあった）。

AI動画生成サービスをいくつか見て回ったのですが、無料かつ商用可能で真面目そうなものがVidnozでしたので、Vidnozを使ってみることにしました。

https://jp.vidnoz.com/

Googleアカウントとの連携で動かせます。
クレジットカード登録は不要。不要！（うれしい）
そして、なにより、ありがてぇことに、商用利用可能です。

適当にテンプレートを選んで、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/088f4ea3-2832-d605-4f82-fbecc4f2236c.png)

おじさんを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/6f167354-442c-c780-ec8b-78107ef490bd.png)

するともう大体できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/48d6d6ae-4ee5-94ff-8f58-4311b148e64a.png)

あとは音声読み上げにテキストを入れてやれば、あっというまに自己紹介動画の完成です。

（デフォルトで英語ですが、日本語がよければ日本語スピーカーもあります。
ちょっと発音がところどころ不自然ではありますが、まじめさを保っています。）

だいぶ自棄になっていて、最初はAIに無意味なビデオを作ってもらって、それをいろいろと自分で編集する気でいたのですが、まったく別のツールをいじりませんでした。

動画は出力しておいて、前に出たら再生してあげましょう。あとは知らんおっさんがなんとかしてくれます。

ちょ～～～、楽。すっごい楽。

俺はインターネットなどに素顔をさらすと即座に拡散されて取り返しのつかないことになると思い込んでいる平成生まれ陰キャなので知らないおっさんにこだわりましたが、アバターをアップロードしたり、音声クローニングをしたりもできるようです。

俺は嫌だ。どうせなら美少女になりてぇんだ。

現在では1日に変換できるのは3分とかそんくらいって感じですが、自己紹介なら間にあうかと思います。

結構リッチに機能を使わせてくれてますが、そのうち無料枠が縮小されたりするかもしれないし、使えるうちにおっさんに頼っておくといいと思います。

パワポを使える人は使えると思います。マニュアル見なくてもいけるわ。

なんとなく読み上げは英語のほうが流暢なので、あえて英語でやってもいいかもしれませんね。
国際的でよいと思います。

訳？　ChatGPTにでも翻訳してもらおうぜー。

スピーチが苦手だったら、むしろ、AIおっさんにしゃべってもらう。
もしも自己紹介の場がラフ寄りで、プレゼンにパソコンが使えそうなら、ﾁｮｯﾄよい戦略だと思います。

かしこ。

https://www.youtube.com/watch?v=ToJD5r2SmwI
ReactでPopperButtonを作成する。

## 成果物

![Apr-19-2024 18-01-59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/0c4d5ec4-02f9-86b4-5c3a-65e33a2db2e5.gif)

## ソースコード
```tsx:src/components/PopperButton.tsx
import React from 'react';
import Button from '@material-ui/core/Button';
import Popper from '@material-ui/core/Popper';
import Paper from '@material-ui/core/Paper';
import { makeStyles } from '@material-ui/core/styles';

const useStyles = makeStyles((theme) => ({
  paper: {
    border: '1px solid',
    display: 'flex',
    flexDirection: 'column',
    padding: theme.spacing(1),
    backgroundColor: theme.palette.background.paper,
  },
}));

const PopperButton = () => {
  const classes = useStyles();
  const [anchorEl, setAnchorEl] = React.useState<HTMLButtonElement | null>(null);
  const [open, setOpen] = React.useState(false);

  const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
    setAnchorEl(anchorEl ? null : event.currentTarget);
    setOpen((prev) => !prev);
  };

  return (
    <div>
      <Button variant="contained" color="primary" onClick={handleClick}>
        Popper Button
      </Button>
      <Popper open={open} anchorEl={anchorEl} placement="bottom" transition>
        {() => (
          <Paper className={classes.paper}>
            <Button >List1</Button>
            <Button >List2</Button>
            <Button >List3</Button>
            <Button >List4</Button>
          </Paper>
        )}
      </Popper>
    </div>
  );
};

export default PopperButton;


```
[Google API Client Libraries] APIを使用してRead timed out(java.net.SocketTimeoutException)が発生した場合の対処方法

Google Sheets APIを使用していて「Read time out」のエラーが発生しました。

```conf
Exception in thread "main" java.net.SocketTimeoutException: Read timed out
	at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:278)
	at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:304)
	at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
	at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
	at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1099)

```

スプレットシートのデータ量が膨大になってしまったのが原因です。
time outを変えずになんとかロジックで逃げようとしましたが、
限界を迎えたのでtime outを変えることにしました。


```java
private static HttpRequestInitializer setHttpTimeout(HttpRequestInitializer requestInitializer) {
    return new HttpRequestInitializer() {
        @Override
        public void initialize(HttpRequest httpRequest) throws IOException {
            requestInitializer.initialize(httpRequest);
            httpRequest.setConnectTimeout(5 * 60000);
            httpRequest.setReadTimeout(5 * 60000);
        }
    };
}
```

HttpRequestInitializerを取得しているところに追加してください。

スプレットシートAPIの場合は
[⧉[Google Sheets API] JavaでスプレットシートのメニューとAPIを関連づけてみた(2.2. Sheetsインスタンスの取得)](https://qiita.com/doran/items/2f6f8932b994fbd1a170#22-sheetsインスタンスの取得)
を参照ください。
スプレットシートAPIでなくとも同じです。

```java
public static Spreadsheets getSpreadsheets() throws IOException, GeneralSecurityException {
    InputStream input = new FileInputStream("/** サービスアカウントキーのファイルパス */");
    GoogleCredentials credential = ServiceAccountCredentials.fromStream(input).createScoped(Arrays.asList(SheetsScopes.SPREADSHEETS));

    HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = GsonFactory.getDefaultInstance();

    //ここを変更
    HttpRequestInitializer httpRequestInitializer = setHttpTimeout(new HttpCredentialsAdapter(credential));
//   HttpRequestInitializer httpRequestInitializer = new HttpCredentialsAdapter(credential);

    Sheets service = new Sheets.Builder(transport,jsonFactory,httpRequestInitializer).build();
    
    return service.spreadsheets();
}
```

なお、設定可能なタイムアウトは下記2つです。

ConnectTimeout
サーバーへ接続要求を送信し、接続確立のレスポンスを受け取るまで待機する時間

ReadTimeout
サーバーへの接続確立後、実行したAPIのレスポンスを受け取るまで待機する時間
<br>

おしまい。。
NAP: キャンプ設計

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/57ee1169-e632-5b53-364a-82d4b91438e1.png)


# Lambda (7d)

■ やること洗い出す
- [x] Javaの環境構築 
  - JDKをインストール
  - Javaがインストールできていれば以下のコマンドを実行したときにバージョンが表示される
  - Javaのエディタ：
      - eclipse
      - IntelliJ IDEA Community版
        https://www.jetbrains.com/ja-jp/idea/download/?section=mac
        

```
java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/3f017dd2-957c-ae9c-a8dd-91cfd07d2aff.png)



- [x] Hello World実行できる（動作確認）
- [x] Lambda上で動く、Javaコードを実装する

AWSのJavaのサンプルコード説明
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-samples.html


### 4. Mavenのインストール
 Apache Mavenをダウンロードしてインストールし、環境変数を設定します。
 プロジェクトのセットアップ
#### 1. Mavenプロジェクトの作成
IntelliJ IDEAを開いて、新しいプロジェクトを作成します。

「Create New Project」を選択し、「Maven」を選んで「Next」をクリック。
「GroupId」と「ArtifactId」を入力してプロジェクトを設定。
「Finish」をクリックしてプロジェクトを作成。
#### 2. 必要な依存関係の追加
pom.xmlに以下の依存関係を追加します。

```xml
Copy code
<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-events</artifactId>
        <version>3.10.0</version>
    </dependency>
</dependencies>
```
3. Lambda関数の作成
src/main/javaに新しいJavaクラスを作成し、Lambda関数として実装します。例えば、簡単なHello World関数は以下のようになります。

```java
Copy code
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class Handler implements RequestHandler<Object, String> {
    public String handleRequest(Object input, Context context) {
        return "Hello from Lambda!";
    }
}
```

- [ ] AWS CLIでLambdaを作成する  

Mavenをbrewでインストールする
```
brew install maven
mvn -v
```



- [x] jarファイルを作成して、AWSのSAMを利用してAWS上にデプロイする

ビルド方法
```
mvn clean install
```

デプロイ方法
```
aws lambda create-function --function-name MyJavaFunction \
--zip-file fileb://target/SampleJava-1.0-SNAPSHOT.jar --handler example.Handler \
--runtime java11 --role arn:aws:iam::xxxx:role/xxx --profile xxxx
```

- [x] 動作確認: JavaのコードがLambdaで動作することを確認する
------------------------------------------------------
- [ ] API Gatewayを作成する
- [ ] API Gateway経由でLambdaを呼び出して「Hello World」が返ってくることを確認する (curl コマンド)
Anaconda Powershell Promptの環境構築する手順

### 前提条件
・　m2 Mac
・　Anaconda Navigator (インストール済み)　
　　インストールしてない場合はこちら参照

   
https://qiita.com/hatinyan/items/f2486a022e2920817909

   ---------------------------------------


## 手順

## 1.Powershellをインストール

・ターミナルを開きます。
・以下のコマンドを実行します。
```
brew install powershell
```

## 2.Anaconda Powershell Promptを起動

・Anaconda Navigatorを開きます。
・左側のナビゲーションパネルで「Environments」を選択します。
・右側のリストから、Anaconda Powershell Promptを使用する環境を選択します。
・「Launch」ボタンをクリックします。

## 3.モジュールをインストール
・Anaconda Powershell Promptが開きます。
・以下のコマンドを実行して、必要なモジュールをインストールします。
```Install-Module -Name PowerShellGet -Scope CurrentUser
Register-PSRepository -Name PSGallery -Source https://gallery.powershellgallery.com/api/v2/
Install-Module -Name poshpaste -Scope CurrentUser
```
## 4.設定の更新
・以下をのコマンドを実行して設定を更新します。

```
Set-PSExecutionPolicy Unrestricted -Scope CurrentUser
Set-Alias psl "powershell.exe -ExecutionPolicy Unrestricted"
```

## 5.確認
・以下のコマンドを実行して、powershellが正しい動作していることを確認します。

```
Get-Module -Name poshpaste
```

:::note warn
### 注意事項
・　```Set-PSExecutionPolicy Unrestricted``` コマンドを実行すると、セキュリティリスクが高まります。必要なモジュールをインストールしたら、元のポリシーに戻すことをお勧めします。
・Anaconda Powershell Promptは、Anaconda Navigatorから起動する必要があります。直接ターミナルから起動することはできません。

:::
Git初心者 学んだコマンド一覧

Gitの勉強をして学んだコマンドをおいていきます。
初心者の解釈なので間違っていたら教えていだけると嬉しいです！

【add】
コマンド：git add　ファイル名
内容：ファイル追加の指示

【commit】
コマンド：git commit -m “コメント”
内容：変更点のコメントを添える指示

【push】
コマンド：git push origin master
内容：リモートリポジトリ(ここではorijginという名前で登録)にアップロード

【pull】
コマンド：git pull origin master
内容：リモートリポジトリからファイルをダウンロード

【status】
コマンド：git status
内容：自分が変更したファイルのファイル名を表示、
addの未(赤色)/済(緑色)の確認が可能

【diff】
コマンド：git diff
内容：ファイルの変更内容を把握

【log】
コマンド：git log
内容：コミット履歴を確認

コマンド：git log　-p
内容：コミット履歴の内容を確認
MacでAnacondaの環境構築する手順

``` 1.miniforgeを使う```

手順:

miniforgeは、M1/M2 Mac用の軽量版なAnacondaディストリビューションです。Anacondaよりも軽量で起動が早いため、M2 Mac上でAnaconda環境を構築するのに最適です。
```手順```
1\.miniforgeは、GitHubリポジトリ
 https://github.com/conda-forge/miniforge

   M1/M2用インストーラ（Miniforge3-MacOSX-     arm64)をダウンロードします。
2\.ダウンロードしたインストーラをダブルクリックして実行します。
3\.インストーラの指示に従って、Anacondaをインストールします。
4\.ターミナルを開き、以下のコマンドを実行して、miniforgeをインストールします。

~~~
bash -c "$(curl -fsSL https://starship.sh/install.sh)"
~~~

5\.以下のコマンドを実行して、Pythonのバージョンを指定して仮想環境を作成・有効化します。
```
conda create -n myenv python=3.10
conda activate myenv
```

6\.以下のコマンドを実行して、必要なライブラリをインストールします。
```
conda install numpy pandas matplotlib
```

7.以下のコマンドを実行して、condaが認識されているかを確認します。
```
canda info
```

``` 2.Anacondaを使う ```

Anacondaは、Pythonと様々な科学計算ライブラリをまとめてインストールできるディストリビューションです。miniforgeよりも多くのライブラリーがプリインストールされていますが、miniforgeよりも重く、起動が遅くなります。

手順：


1. miniforgeのGitHubリポジトリ([無効な URL を削除しました]、M1/M2用のインストーラ（Miniforge3-MacOSX-arm64）をダウンロードします。
2.ダウンロードしたインストーラをダブルクリックして実行します。
3.インストーラの指示に従って、Anacondaをインストールします。
4.ターミナルを開き、以下のコマンドを実行して、miniforgeをインストールします。

```
anaconda navigator
```

5.Anaconda Navigatorで左側のメニューから「Environments」を選択します。
6.「Create Environment」をクリックして、新しい仮想環境を作成します。
7.仮想環境の名前を「myenv」に設定し、Pythonのバージョンを「3.10」に設定します。
8.「Create」をクリックして、仮想環境を作成します。
9.Anaconda Navigatorで、作成した仮想環境を選択します。
10.「Packages」タブをクリックして、必要なライブラリをインストールします。

---------------------------------------
Q,どちらの方法を選択するかは、以下の点に応じて判断すると良いでしょう?
A,
・必要なライブラリ: miniforgeには、Anacondaよりも多くのライブラリがプリインストールされていません。必要なライブラリがminiforgeにプリインストールされていない場合は、Anacondaの方が良いかもしれません。
・起動速度: miniforgeは、Anacondaよりも軽量で起動が速いです。起動速度が重要であれば、miniforgeの方が良いかもしれません。
・使いやすさ: Anaconda Navigatorは、仮想環境の作成やライブラリのインストールなどの操作をGUIで行うことができるため、初心者にとって使いやすいです。GUIでの操作に慣れていない場合は、Anacondaの方が良いかもしれません。

個人的にはminiforgeがおすすめです。


:::note warn
注意事項

・上記の手順は、M2 Mac上でAnaconda環境を構築するための基本的な手順です。詳細については、Anacondaの公式ドキュメントを参照してください。 https://docs.anaconda.com/
・Anacondaをインストールする前に、Macのシステム要件を確認してください。 https://www.anaconda.com/download


:::
gitのエラー Your local changes to the following files would be overwritten by merge: 	が出たときの対処方法

# 初めに
gitでpullしようと思っていたときに
```エラー文
error: Your localchanges to the following files would be overwritten by merge:
	~
Please commit your changes or stash them before you merge.
```
と出たのでその解決方法を紹介します。

# 解決方法
エラー文の通りファイルの変更をコミットするかスタッシすると解決できます。
【GCP】Cloud Loggingで10,000件以上のログをダウンロードする方法

# ログエクスプローラーからダウンロードする

こちらは、コンソール上からの作業となります。クエリをいれれるので好きなようにログをフィルタリングできます。但し、こちらからのダウンロードは上限が __10,000__ 件となっています。上限よりもダウンロードしたい場合は次の方法を試してみてください。

# ログを転送する

https://cloud.google.com/logging/docs/routing/overview?hl=ja&_gl=1*6plktk*_ga*MTUwNzE1MTYyOS4xNzAyMzYzMzc2*_ga_WH2QY8WWF5*MTcxMzUxMjE0OS4xMjMuMS4xNzEzNTEyMzA3LjAuMC4w&_ga=2.80342103.-1507151629.1702363376

Cloud Loggingのシンクという機能を利用しましょう。シンクはCloud Logging がログをルーティングする方法を制御します。シンクを使用すると、ログの一部またはすべてをサポートされている宛先に転送できます。

「Cloud Logging バケット」「BigQuery データセット」「Cloud Storage バケット」「Pub/Sub」「Splunk」「Google Cloud プロジェクト」「その他のリソース」

などが宛先に上げられます。無難なのはCloud Storage バケットでしょうか？AWSでいうところのS3のようなものです。

## シンクの注意点

公式にも書いてありますが、保存されるログの対象はシンクが作成された後に生成されたログだけになります。すなわち、シンクの設定が漏れているであったり、過去のログについてなにかしたいときにはシンクからはどうしようもできません。

## 過去のログをさかのぼって保存したい場合

https://tech.pepabo.com/2024/03/27/glouc-logging-copy/

https://cloud.google.com/logging/docs/routing/copy-logs?hl=ja

こちらの記事が一番わかりやすいのでぜひこちらを参考にしてください。簡単に言えばGCPのコマンドラインツールからログをコピーすることができますというだけです。

本記事ではコマンドの抜粋だけ行いますね。

__ログのコピー__
```
$ gcloud logging copy BUCKET_ID storage.googleapis.com/CLOUD_STORAGE_BUCKET_NAME
--location=LOCATION [--log-filter=FILTER] --project=PROJECT_ID
```

:::note info
--log-filterにはログエクスプローラーやシンクで指定するクエリをそのまま入れればokです。
ただ、ログエクスプローラーだと日付の指定はクエリで行っていないですよね。これだけ注意です。期間を指定したい場合はクエリに書き足しましょう！

例) timestamp >= "2024-04-01T15:00:00Z" timestamp <= "2024-04-30T16:00:00Z"
:::

__ログのコピーの進捗表示__
```
$ gcloud logging operations list --location=LOCATION \
--operation-filter=request_type=CopyLogEntries \
--project=PROJECT_ID
```

__ログのコピーのキャンセル__
```
$ gcloud logging operations cancel OPERATION_ID \
--location=LOCATION --project=PROJECT_ID
```
AMD64用のDockerfileをJetson用に書き換える

Jetsonでは、使用しているライブラリがJetPackごとに異なっている。
PCでCUDAを使っている場合と設定が違ってくる。
新規に公開されるアルゴリズムの多くは、PC用の設定となっている。
そこで、PC用のDockerfileをJetson用に書き換える。

以下の記事は検証途上です。
自己責任で参照してください。

## 想定する読者
- Jetson AGX Orin の利用者
- Ubuntu(AMD64) のCUDAを用いて開発されているモジュールをJetson AGX Orinで使いたい人

## 手順
### FROM 行の変更
- Dockerfile のFROM行を読み解く。
```
FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
```

CUDA 11.6 に近い状況でのJetPackのバージョンを確認します。
そのJetPack に対応するpytorchのディスクイメージをNVIDIA で探します。

### NVIDIAでのコンテナの例

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-base/tags

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch/tags

### 探し方
https://catalog.ngc.nvidia.com/containers

例 torch
PyTorch
を選ぶ。
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch

ここで
上部で"Tags"を選ぶ。
l4t-pytorchの組合せを選ぶ。

既にJetpackでL4Tのバージョンが決まっていれば、それに適合するのを選ぶ。
pytorch のバージョンは、元になったAMD64でのDocker Image でのpytorchのバージョンにそろえる。

その結果、Dockerfile のFROM行を書き換える。



### python3 との指定
- python コマンドをpython とだけ入力したときに、システムによってはpython2.7, python2.8 が起動することがあります。
- `python some.py` とするよりは `python3 some.py` とした方が安全です。

### `pip` よりも `python3 -m pip `を使う。
- `pip` コマンドがpython3のシステムに適応してくれるものなのかは、システムの状況によって異なります。
- `python3 -m pip `で指定するほうが安心です。


### JetPackのバージョンアップの影響を評価する
Docker 環境ならば、Jetpack の異なる設定で、同一のプログラムがどのように動作するのかをテストしやすい。
guest環境内で簡単にテストできる内容を増やしていく。
`make test`でテストできるようにtestを増やしていく。
pytest でテストできるように
```
python3 -m pytest test/test*.py
```
を実行するようにMakefileに記載する。

そうすれば、DockerfileのFROM 行の変更、もしくはDockerfile全体の差し替えで、テストを実行できるだろう。

- JetPack6.0 Developers Preview 


## 関連情報
- [【Docker15】Jetson AGX XavierをDockerで環境構築する](https://skmkuma.com/%E3%80%90docker15%E3%80%91jetson-agx-xavier%E3%82%92docker%E3%81%A7%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/)

- [[ROS 2] Jetsonとホストマシンで共通のDockerfileを使うには](https://qiita.com/hijimasa/items/d933c1a21a29b5f6e453)

-----

[setup.py は非推奨になりましたか？](https://packaging.python.org/ja/latest/discussions/setup-py-deprecated/)
[初心者向け]コードレビューを依頼する前にログを見ておこうという話

こんにちは。Kaneyasuです。

昨日[勉強会](https://it-deep-talk.connpass.com/event/315059/)に参加していました。
そこで、フルスキャンしてるSQLがいっぱいあってこの先不安、怖いわーという会話をしていました。

その場では開発チームにSQLをよく知らないというか興味薄い方がいたからそういうことになったのかもね、なんて話していましたが、よく考えたらこれ、SQL以前のログの話な気がしてきました。  
そう思ったら最近別のところでログの必要性を話したのを思い出したのでブログにしてみます。

なお、私はWebシステムのバックエンドの開発が一番多いので、バックエンドのログの観点で書いています。

# コードレビューを依頼する前にログを見ておく

冒頭の話はORマッピングを用いたプログラムだと、意図しない重いSQL・大量のSQLが発行されることがあるという話です。
ORマッピングを使うと必ずそうなるわけではなく、大体は適切なパラメータを指定すればなんとかなります。
とはいえ、適切なパラメータを指定するのは楽ではない作業です。  
熟練開発者は別ですが、大体はコード上だけで調整するのは難しく、ログを使って実際に発行されるSQLを見ながら調整することが必要です。
そういった事情から、コードレビューにおいてはレビュアーがコード上のORマッピングの使い方から出力されるSQLを想像しきるのは厳しいでしょう。
熟練開発者やノウハウの蓄積があるチームならば、危ないのでは？ぐらいの指摘はできるかもしれませんが、コードレビューでSQLの問題を指摘しきるのは難しいと思います。

他にも、ログを見ないとわからないこととしては、「Warning」があります。
画面上では動いているように見えるけど、実際にはログ上にはWarningが出ているということがあります。
良くないシステムでは、エラー出てるけど何もされてないということもあります。
これらは、将来的に大きな問題を引き起こす可能性を示唆する重大なヒントなのですが、これもコードレビューで見つけるのは非常に難しいと思います。

というわけで、個人的にはコードレビューを依頼する前にログを見ておくことはマナーかな・・・と思うには思います。  
でも、それで回り切るとはいえないので、私は単体テストのテストケースにログ確認を入れるようにしています。

例）

- ログにWarningが出ていないか
- ログにErrorが出ていないか
- 不必要なSELECT文が大量に発行されていないか
- 大量のINSERT文が発行されていないか
- 大量のUPDATE文が発行されていないか
- SELECT文の実行計画に問題がないか

最後のはおまけです。
チームでは一応確認するよう指示していますが、個人のテストレベルだと適度なデータがないのと、SQLに対する知識差があるので、あまり期待はしないようにしています。

# ログへの意識を高めてもらうための説明

前項でログを見ることの重要性を述べましたが、私の周りでも人ごとのログへの意識差は大きいです。
意識の差は、保守の経験の有無で大きく変わります。
当然、保守を経験した人の方が意識は高くはなりますが、誰もが保守の経験の機会があるとは限りません。
私は、少しでもログへの意識を高めてもらうために、周囲に以下のような説明をしています。
私はWebシステムのバックエンドの開発が一番多いので、Webシステムで問題が起きた時を例にあげる説明すること多いです。

## ログを見る順番の説明

問題があった時のよくある流れとして、アプリログでエラー発生を確認、Apache・Nginxログでアクセス元・日時を特定。
それを元にヒアリング、ブラウザで同様の操作をして再現、ブラウザのコンソールでエラーを確認、という感じで調査します。

## ログの種類の説明
  - アプリログ
    - Webフレームワークなら、SQLだけ・エラーだけのログも出力できることの説明
    - AWSなら、CloudWatchのメトリクスフィルターを使えば、 エラーの文言をフィルターしてアラートに繋げられることの説明
  - Apache・Nginxログ
    - アクセス内容や、アプリログで出しきれていない情報があり得ることの説明
  - ロードバランサーのログ
    - Apache・Nginxログのログ設定がふよろしくなくて、十分な情報が取れていない場合はこちらを見ます
  - ブラウザのコンソール
    - Webサーバーに何を送ったのか、何が返ってきたのかがわかることの説明
  - OSのログ・DBサーバーのクエリログ
    - 他のログに何も出てない時はこれらを見ることがありますが、初心者の方にはここまで説明はしないです。

# ログの使い分けの説明

ログへの意識はあっても、ログをたくさん出すことに抵抗感を持つ方もいます。
確かにログを出しすぎるとパフォーマンスやストレージコストに影響を及ぼすのは確かです。
そういう方には、取り急ぎログの使い分けを説明するようにしています。  
  
## ログレベル

ログレベルは、ログの重要度を示すものです。
ログレベルによって、出力する内容を変えることができます。
大体のWebフレームワークやログライブラリでサポートされている機能です。  
ログレベルレベルは、ERROR、WARN、INFO、DEBUG、TRACEなどがあります。
ログレベルはシステムの設定で変更できることが多いので、これを使ってログの出力量を調整することができます。
たとえば、INFOを指定すれば、出るログはERROR、WARN、INFOのみになります。
（使用するライブラリやFWによりますが）
開発時は情報を得ることを重視してDEBUGで、本番運用時はコストやパフォーマンスを重要視してINFOにしたりします。

## ログレベルの使い分けの例

好みはあると思いますが、私は以下のように使い分けています。
本番運用でレベルをINFOにすればSQLが出なくなるのでログは少なくなる一方、最低限機能が動いたかどうかやデータの追加・更新・削除がされたかどうかはわかるようにしています。

- INFO
  - 開始・終了ログ
  - 処理の区切り
  - 追加・更新・削除件数
- DEBUG
  - SQL
- TRACE
  - ここは通った、通らなかったレベルのログ

#　最後に

長々とログの重要性を述べてしまいました。
開発作業や開発者への説明のヒントになれば幸いです。

# 宣伝

来月に広島市内でクラウドのお話をするオフラインの勉強会を開くことにしました。
2時間持つよう頑張ります。

https://omoni-cloud.connpass.com/event/315682/
Google Cloud 関係で、wsl2 にした設定

## 初期設定

wslの Ubuntu のファイル変更
```/etc/wsl.conf 追加
[network]
generateResolvConf = false
```
```/etc/resolv.conf 変更
nameserver 8.8.8.8
```

## gcloud CLI のインストール
1. 配布URLを追加する。
パッケージリスト更新を行い、必要なパッケージをインストールする。
```
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates gnupg curl sudo
```
2. gcloud CLI の配布 URI をパッケージ ソースに追加する。
```
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
```
3. パッケージの公開キーをインストールする。
```
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
```
4. gcloud CLI をインストールする。
```
sudo apt-get update && sudo apt-get install google-cloud-cli
```

## gcloud CLIの初期設定
```
gcloud init
```
プロジェクトごとに、configuration を作成しておくことをお勧めする。
場合によっては、同じプロジェクトでも複数のconfigurationを切り替えながら、使う必要があり。

## gcloud の configuration 一覧表示
```
gcloud config configurations list
```
結果の IS_ACTIVE が、True の設定が、現在、有効な設定です。

## gcloud カレント設定の変更
```
gcloud config configurations activate 設定名
```

## ローカルからGCPにプログラムでアクセスする為の認証
```
gcloud auth application-default login
```
認証用のファイルが作成されます。

ブラウザーの無い環境では、--no-launch-browsern を付けることで、認証用のURLが表示されるので、
別環境のブラウザーから認証を実施して、認証コードを入力します。
```
gcloud auth application-default login --no-launch-browsern
```

## python を使用して、認証時にSSLエラーが出る
```
pip install pip-system-certs --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org
```
ITパスポート プロジェクトマネジメント

・プロジェクト
決められた期間の中で、独自の製品やサービスを作り出すなど、特定の目標を達成するための業務

・プロジェクトマネージャ
プロジェクトを管理する人
コスト、スケジュール、スコープなどのバランスを調整する

・プロジェクト憲章
プロジェクトの目標や期待される効果などを盛り込んだもの

・PMBOK（ピンボック）
プロジェクト管理に必要な知識を体系化した文書

・統合マネジメント
他の知識エリアを統合的に調整、管理する
プロジェクトの制約条件である予算や納期、対象範囲などを統合的に調整して管理する分野

・スコープマネジメント
作業範囲を明確にし、必要な作業を洗い出す
成果物スコープ（プロジェクトで作成する成果物）
プロジェクトスコープ（成果物を作成するために必要な作業）

・タイムマネジメント
予定の期間内に完了させるために、スケジュール管理、進捗管理を行う

・資源マネジメント
必要な人的、物的資源を管理する

・リスクマネジメント
想定されるリスクの特定、分析、評価を行い、リスク対応を検討する

・WBS
プロジェクトで実施すべき全ての成果物や作業を洗い出し、階層構造に分割して整理した構成図

・プロジェクトマネジメントオフィス
プロジェクトマネジメントを支援する部署
Python文法まとめ

# はじめに
Pythonの基礎的なことをまとめています。
Google Colabで実行できます。
[Colabの使い方(Python.jp)](https://www.python.jp/train/experience/colab.html "Python.jp 入門講座")

# Hello, World.
定番。
~~~Python:
print('Hello, World.')
~~~
`print()` カッコ内を表示してくれるやつ。関数ともいう。
`''`(シングルクォーテーション)か`""`(ダブルクォーテーション)で囲むと
文字列が表示できる。

#### print関数
計算してみる。
~~~Python:
print('1 + 1 は', 1+1)
~~~

# 変数
~~~Python:
number = 5 # int型
moji = 'Pythonであそぼ' # 文字列
nitaku = True # bool型
~~~
型宣言は必要なし。
文字列型は、一文字もそれ以上も区別しません。
bool型は `True` か `False` と表記します。
#### 変数とは
飲食店でいうと、「1番テーブルの注文」みたいな感じ。
お客さんが入れ替わると、注文の内容が変わる。
変わる値だから、変数。

もしくは、お皿に料理を用意するイメージ。
ラーメンが出来上がってもそのままは持っていけないから、どんぶりに盛りつけます。
チャーハンは平皿に盛るし、
ビールはジョッキに注ぐ。
お皿の形が値の型。
平皿にラーメン注いだらエラーになります。
（※上級者の方はそっと目をつぶってください）

# おわり
お役に立てたら幸いです。
アルゴリズムについて

表題の通り、「アルゴリズム」についてまとめる。

1. 経緯
    1. アルゴリズムを学習しようと思った経緯はコードを書くうえでのパフォーマンスや他者のエンジニアが見やすいコードを書くポイントを学習し、実務に活かしたい想いからである。生成AIがかなり普及し、エンジニアにとっても身近になりつつあるAIが必ずしも正しいとは限らない。エンジニアが開発するにあたり、何がポイントになるのか??
-真っ先に思ったことが「アルゴリズム」である。生成AIはユーザのアウトプットには答えてくれるが、正しさには欠ける場合もある。アルゴリズムがわかれば、生成AIの解答を材料にして、判断や迅速な対応ができる。

以下の章ごとにアルゴリズムについてまとめていく

1. [データ構造](https://qiita.com/takechanel/items/8a80b907f3ee3f93b664)
1. [ソート](https://qiita.com/drafts/0dcd8254d2c49985f54a/edit) →現在は未公開
1. [配列の探索](https://qiita.com/takechanel/items/b209892fb84487e4b39a)
1. 　[グラフの探索]→現在は非公開
1. 　[セキュリティのアルゴリズム](https://qiita.com/takechanel/items/d1d33c3650475da72261)
1. [クラスタリング]→現在は未公開
1. [その他のアルゴリズム]→現在は未公開
リセットCSSでチェックボックスが消えた

## 目的
destyle.cssでリセットしたところ、チェックボックスが見えなくなってしまいました。解決に時間がかかったので、忘備録として残します。

## 結論
`all: revert;`を追加すると表示されました。

```
input {
    all: revert;
}
```

上記を追記すると、要素に対してカスタマイズされたり変更されたりしたすべてのスタイルが取り消されます。これによりブラウザのデフォルトスタイルに戻るため、リセットCSSで消えていたスタイリングが復活しました。

## まとめ

MDNを参考にしました。

https://developer.mozilla.org/ja/docs/Web/CSS/all
Djangoテンプレートからaxiosでデータ取得

非同期でデータ取得する方法はたくさんあると思いますが、そのなかでaxiosを使って取得する方法を調べてみました。
データ取得は汎用ビューのDetailViewを使用します。

urls.py
```python:todo/urls.py
from django.urls import path
from . import views

app_name = "report"
urlpatterns = [
    ...
    # 通常のリクエスト
    path('todo/detail/<int:pk>', views.TodoDetailView.as_view(), name="detail"),
    
    # こちらが今回実装する非同期によるデータ取得のためのurl設定
    path('api/todo/detail/<int:pk>', views.TodoApiDetailView.as_view(), name="api-detail"),
]
```

views.py
```python:todo/views.py
from django.views.generic import DetailView
from .models import Todo
from django.forms.models import model_to_dict  # 追加
from django.http import JsonResponse  # 追加

# 通常のリクエスト
class TodoDetailView(DetailView):
    model = Todo
    template_name = "todo/detail.html"
    context_object_name = 'todo'

# こちらが今回実装する非同期によるデータ取得
class TodoApiDetailView(DetailView):
    model = Todo

    def get(self, request, *args, **kwargs):
        obj = model_to_dict(self.get_object())
        return JsonResponse(obj)
```

1. `obj = model_to_dict(self.get_object())`
    - オブジェクトをdict形式に変換
    - `from django.forms.models import model_to_dict` が必要
2. `return JsonResponse(obj)`
    - JSON形式でレスポンス
    - `from django.http import JsonResponse` が必要

## テンプレートからデータ取得してみる
テンプレートにCDNを追加
```django:templates/base.html
<html>
    <head>
        ...
 
        <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    </head>
    <body>
        <div class="container">
          {% block content %}{% endblock %}
        </div>
    </body>
</html>
```

```django:todo/detail.html
{% extends "base.html" %}

{% block content %}
<script>
window.onload = function() {
    axios
      .get('/api/todo/detail/1')  // pk:1で仮設定しています
      .then(response => {
        // 成功
        const data = response.data;
        console.log(data);  // json形式になっています
      })
      .catch(error => {
        // エラー
        console.error(error);
      })
      .finally(() => {
        // 最終処理
      });
};
</script>
{% endblock %}
```
host SRV _ldap._tcp エラー参考URL

```
$ sudo host -t SRV _ldap._tcp.example.local
;; communications error to 127.0.0.1#53: connection refused
;; communications error to 127.0.0.1#53: connection refused
;; no servers could be reached
```
https://qiita.com/gkzz/items/5ac6648e87339e1dd883

```
/etc/systemd/resolved.confに追記
今回はGoogle Public DNSを採用した。

$ tail /etc/systemd/resolved.conf
[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=yes
#DNSStubListener=yes
#ReadEtcHosts=yes

#DNS=192.168.1.1
DNS=8.8.8.8 8.8.4.4   ## 追記

gkz@localhost ~ $ cd /etc
gkz@localhost $ ls -la /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Jul 21 13:34 resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

gkz@localhost /etc $ sudo ln -sf ../run/systemd/resolve/resolv.conf resolv.conf
gkz@localhost /etc $ ls -la resolv.conf 
lrwxrwxrwx 1 root root 34 Nov 17 15:19 resolv.conf -> ../run/systemd/resolve/resolv.conf

$ systemctl restart systemd-resolved
$ sudo reboot
```
VSCodeでSSH接続先のDockerにつなぐ

# はじめに

機械学習を行う際に、GPUを積んだPCにリモート接続する機会がありました。
そこで、VSCodeからSSH接続先のDockerに繋ぐ設定をしたので、記録を残しておきます。
イメージはこんな感じです。
![SSH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/28aff5a4-4218-cdfa-c737-aa39dfe7e228.png)

# SSHとは

簡単に説明すると、遠くのコンピューターにアクセスする方法です。
接続先のパソコンに対してコマンドを実行したり、ファイルを転送したりすることができます。

# 環境
接続元：Mac
接続先：Ubuntu 20.04

# 前提
- 接続元（パソコンA）にVSCodeがインストール済み
- 接続先（パソコンB）にDockerコンテナが生成済み

# SSH接続の具体的な方法

### 1. 接続先のOpenSSHを起動
```
$ sudo apt install ssh
```
このコマンドを実行することでSSHサーバーとSSHクライアントをインストールできます。

```
$ service ssh start
```
このコマンドを実行することで、sshサービスが起動します。

```
$ sudo systemctl status ssh
```
を実行して、
```
Active: active (running)
```
となっていれば、OKです。

また、PCが起動した際に自動でサービスが起動するように設定するためには、
```
$ sudo systemctl enable ssh
```
を実行すると設定できます。
設定できているか確認するためには、
```
$ sudo systemctl is-enabled ssh
```
の結果が**enabled**になっていればOKです。

また、逆に自動起動しないように設定するには以下のコマンドで設定可能です。
```
$ sudo systemctl disable ssh
```

### 2. 接続元からSSH接続を確認
```
$ ssh 接続元のユーザーネーム@接続元のIPアドレス
```
でSSH接続ができるか確認してください。
SSH接続が正しくできていることが確認できればOKです。

もし接続できなければ、以下の2点を確認してみてください。

#### 2-1. ネットワーク接続
```
$ ping 接続元のIPアドレス
```
接続元のから上記コマンドを打つことで、接続先までネットワークの経路が正しく設定されているかを確認できます。

#### 2-2. ファイアウォール設定
```
$ sudo ufw allow ssh
```
接続先のPCで上記コマンドを打つことで、ファイアをーるの設定を行うことができます。


# VSCodeで接続先へのSSH接続

### 1. VSCodeの「Remote Development」をインストール

1. VSCodeを起動したら、アクティビティバーから「拡張機能」を選択（ショットーカットキー：Ctrl＋Shift＋X）します
1. 上部のテキストボックスに「Remote Development」と入力し、下図の「Remote Development」をインストールします
![スクリーンショット 2024-04-19 14.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/9f9e26d0-ac43-75ba-9714-8360989e1db7.png)

### 2. SSH接続先を設定→接続
![ssh設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/0773e6d5-dcab-036d-4ceb-051484c899a4.png)

「C:\Users{username}.ssh\config」に新規ファイルを作成し、SSH接続先の設定を書き込みます。

SSH設定ファイルには、以下のように書き込みます。
```
Host ホスト名（任意の名前）
  HostName 接続先のIPアドレス
  User 接続先にログインするユーザ名
  Port サーバがLISTENしているポート番号（デフォルトは22）
```

ファイル保存後、下図の赤枠内にある更新マークをクリック
<img width="300" alt="更新マーク.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/ae137e35-39ac-d2a1-a9a5-609ff689fc16.png">

下図のように、先ほどホスト名として設定した名前が表示されればOKです。
<img width="300" alt="ホスト名.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/6ef99fea-1949-2c31-bde4-f0efb5c92602.png">

次に、ホスト名の右にある矢印マークorファイルマークをクリックします。
「現在のウィンドウでアタッチする」か「新しいウィンドウでアタッチする」の違いなので、どちらでも問題ありません。

クリックすると、ssh接続先にログインします。
その際、パスワードなどの認証情報の入力を求められることがあります。


# コンテナにつなぐ

サーバへのssh接続が完了したので、次はコンテナにつなぎます。

下図の手順でクリックします。
<img width="300" alt="リモート.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/0c9792b0-a031-fc57-58ec-cc2f4f1fc96a.png">

「開発コンテナー」をクリックします。
この時、ログインパスワードを求められる場合があります。
<img width="300" alt="開発コンテナ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/04776b5f-4bde-eb6e-8e80-4a2bcf1e5241.png">

接続したいコンテナの右にある矢印マークorファイルマークをクリックします。
この時も、「現在のウィンドウでアタッチする」か「新しいウィンドウでアタッチする」の違いなので、どちらでも問題ありません。
<img width="300" alt="コンテナ接続.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606166/4330b940-3cdd-3578-ac7b-b1b73500e0c4.png">「

これでコンテナへの接続が完了です。
CodeIgniterについてアウトプットしてみた～概要編～

## はじめに

今使っている人は少ないかもしれませんが...
案件でCodeIgniterを使う機会があったので、簡単ではありますが備忘録も込めて、記事にしました！！！


### CodeIgniterとは　

PHPでWebアプリケーションを作っていく中で、みなさんフレームワークを使うことになると思いますが、その1つになります。
アメリカの会社`EllisLab`が2006年に初版をリリースし、2014年からは`ブリティッシュコロンビア工科大学`が開発を行っています。
2024/04/19現在の最新バージョンは、4.5.1になります。
※githubリポジトリは[こちら](https://github.com/codeigniter4/CodeIgniter4)

### シェア

PHPのフレームワークで言うと現在日本では、新しいプロジェクトにおいてはLaravelを使うことがほとんどだと思います。
ただ、[Kinsta](https://kinsta.com/php-market-share/)によるとCodeIgniterを使ったサイトも多いことがわかるので、世界的に見たらまだまだ使われていそうです :thinking: 

![スクリーンショット 2024-04-19 145742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/17d34820-75e0-e434-1dc6-f006f0552fc1.png)
![スクリーンショット 2024-04-19 145803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/953ab7d9-12db-06ec-b3c9-799e50f4cb18.png)


# 特徴

最後に特徴です。
- MVCモデルを採用
  - Laravelを利用したことがある人であれば、そこまで違和感なく入れると思っています
- 実行速度が高速
  - Laravelと比べて用意されている機能が少ない分、軽量なため速くなります
- Laravelと比べて用意されている機能が少ない
  - 学習コストが低くなります
  - 大規模開発というよりは小規模、中規模に向いていそうです
- エンティティクラスを導入
  - テーブルのレコード単位のビジネスロジックを集約できます
  - Entityについては別の記事で解説予定です
- LaravelのEloquentのようなORMが用意されていない
  - Modelに関しても最初はなかったが、CodeIgniter4から導入されました 
- Laravelのフォームリクエストのようなリクエストをバリデーションするクラスがない
- Laravelのbladeのようなテンプレートエンジンがない
- ドキュメントが不足している＆読みづらい
- コミュニティが活発でない


# おわりに

CodeIgniterについて、簡単に説明しました。
次は、CodeIgniterのEntityクラスに絞って説明していこうと思います:smile:
Windows11の自動で画面がロックされる機能について

# 概要

Windows11には **『PCの前から人が離れたら自動で画面ロック』** のような機能があります。
これによって『時間がかかるRPAなどのバッチ処理』が止まってしまうことがあります。

またプレインストールされているメーカー独自ソフトによっても自動画面ロックがかかることがあります。

いろいろ試行錯誤したので『どこで設定できるか』など、まとめました。

# Windows11標準

## 動的ロック

『アカウント』 ⇒ 『サインインオプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3c96e405-94ff-b015-289d-c13ca43aa2be.png)

『追加の設定』 ⇒ 『動的ロック』。

> その場にいないときにWindowsでデバイスを自動的にロックすることを許可する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c30fd957-6d8a-cc16-28cb-a6211f193343.png)

## プレゼンスセンサー

これについては搭載されたPCに触れたこと無いので、ネットで知ったレベルの情報です…。

https://support.microsoft.com/ja-jp/windows/windows-11%E3%81%A7%E3%81%AE%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%82%B9-%E3%82%BB%E3%83%B3%E3%82%B7%E3%83%B3%E3%82%B0%E8%A8%AD%E5%AE%9A%E3%81%AE%E7%AE%A1%E7%90%86-82285c93-440c-4e15-9081-c9e38c1290bb#:~:text=%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%82%B9%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF&text=%5B%E8%A8%AD%E5%AE%9A%5D%20%3E%20%5BSystem%20%3E,%E3%81%99%E3%82%8B%5D%20%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

# メーカー独自ソフト

## HP

『HP Auto Lock and Awake』という名前のプレインストールソフトによって画面ロックがかかる場合もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ee5f62fa-89e4-85d5-cac7-f14d77aeb276.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bfa39a37-9bff-795b-ce5d-7372bad6e88c.png)

# 蛇足

こうやると自動画面ロック機能を一時的に無効にできる場合あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f4a820ff-e656-a816-0661-4980684da6de.png)

# 参考サイトさん

https://support.microsoft.com/ja-jp/windows/pc-%E3%81%8B%E3%82%89%E9%9B%A2windows-pc-%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B-d0a5f536-74ac-0859-820a-4140dac9fcaf#:~:text=%E3%81%8A%E4%BD%BF%E3%81%84%E3%81%AE%20Windows%2011,%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E3%82%AA%E3%83%B3%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

https://www.youtube.com/watch?v=jA5UU5wKbMw

https://support.hp.com/jp-ja/document/ish_5967129-5911382-16

# バージョン

Microsoft Windows [Version 10.0.22631.3447]
【2024年最新】ISO27001規格改訂に伴う変更点を徹底解説

2022年10月にISO27001（ISMS）規格の改訂がおこなわれました。今回の規格改訂ではISO27001のガイダンス規格とも呼ばれる『附属書A』の内容追加が主な変更点となっています。すでにISO27001を認証している組織は、移行期限である2025年10月31日までに対応できるようにしましょう。

規格の変更点は？
ISO27001:2013の附属書Aには、情報セキュリティリスクを軽減するための114の管理策が記載されています。
これらの管理策の詳細や具体的な例は、既に改訂が行われたISO27002に記載されており、その内容は大幅に変更されています。
ISO27001の改訂は、これらの管理策の変更に伴う附属書Aの改訂となります。

旧規格のISO27002では、A.5～A.18までの14項目からなる114の管理策が設けられていました。
しかし、新規格ではA.5～A.8の4項目に絞り込まれ、93の管理策に変更されています。

具体的な管理策の変更点は

新規　11
統合　24
更新　58
削除　 0
となっています。

114の管理策から93の管理策になったため、減ったように見えますが、新たに11の管理策が追加されたため、実質的には内容が増えています。


https://ninsho-partner.com/

https://cert-next.com/
【node-cli】readline-syncで日本語が文字化けする

## 事象

```node:interactive.js
const readlineSync = require('readline-sync');
let inputString = readlineSync.question(`文字を入力...`);

console.log(inputString)
```

Powershellで`node interactive.js`と実行すると、「inputString」はおろか「文字を入力...」の箇所まで文字化けしてしまう。

inputStringをコード上で日本語と一致比較しようにも、全く機能しなくなる。

## 解決

https://qiita.com/zawazawa5809/items/d6f84cf92a56f47229ed

CtrlPanel>地域>管理>システムロケールの変更>ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用(U) にチェック
Ruby on Railsで作成したアプリをHerokuにデプロイするまでにでたエラー

## 初めに
Railsを使ってWebアプリの開発を進めていましたが、Herokuにデプロイする際につまづいた箇所が何箇所かあったので、備忘録としてこちらにまとめておきます。

デプロイの流れはこちらのページを参考に進めました。

https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#heroku%E3%81%B8%E3%81%AE%E7%99%BB%E9%8C%B2

## つまづき① デプロイ時に必要なパッケージがない問題
### 内容
エラー文はこちらでした。
```
Precompiling assets failed / Error: Cannot find package '@babel/plugin-proposal-private-property-in-object'
```
`@babel/plugin-proposal-private-property-in-object`というパッケージがないようです。

package.jsonには記載がなければ新たにインストールするだけなのですが、しっかりとインストールされているようだったので困りました。

### 解決策
解決のためには`babel.config.js`を修正する必要がありました。

babel.config.jsには以下のように利用しているプラグインを記載している箇所があります。
```babel.config.js
      [
        '@babel/plugin-proposal-private-methods',
        {
          loose: true
        }
      ],
      [
        '@babel/plugin-proposal-private-property-in-object',
        {
          loose: true
        }
      ],
```

この`proposal`の部分を`transform`に変更する必要がありました。
```babel.config.js
      [
        // proposalをtransformに変更
        '@babel/plugin-transform-private-methods',
        {
          loose: true
        }
      ],
      [
        // proposalをtransformに変更
        '@babel/plugin-transform-private-property-in-object',
        {
          loose: true
        }
      ],
```
`babel.config.js`を変更して再度デプロイを行ったところ無事通りました。

こちらの記事を参考にさせていただきました。ありがとうございます。
https://mrradiology.hatenablog.jp/entry/2023/09/29/122815

## つまづき② データベースがない問題
### 内容
無事デプロイが完了したのですが、URLを開くとこんな表示でした。
>We're sorry, but something went wrong.
>If you are the application owner check the logs for more information.`

ログを確認するとどうやらデータベースがないから接続ができないよとのこと。
```
ActiveRecord::ConnectionNotEstablished: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" 
failed: No such file or directory (ActiveRecord::ConnectionNotEstablished)
```

### 解決策
HerokuのResourcesからデータベースのアドオンを追加する必要がありました。
画像の`Find more add-ons`から`Heroku Postgres`を検索し、追加します。

![スクリーンショット 2024-04-19 9.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338946/d0df5b5c-bb48-f836-d6d4-08479405d6f0.png)

データベースへのリンクがHerokuの環境変数に自動的に発行されるので、urlを`database.yml`に追加しましょう。

```database.yml
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
  # この行を追加
  url: <%= ENV['DATABASE_URL'] %>
```

その後、マイグレーションもお忘れなく。

```terminal
heroku run rails db:migrate
```

再度デプロイすると無事、アプリが起動しました。

デプロイしてみると意外と手こずるものですね…
日々精進したいと思います。
【Laravel6】小数点切り捨てて表示したい

## 問題
小数点切り捨てて表示したい

## 解決方法
```
// 小数点第一位を切り捨て = 整数を表示

floor( この中に数字を入れる )
```
を使う

## 参考サイト

https://qiita.com/_naka_no_mura_/items/af1c03a0fc0494b61141
【Photon Fusion】Type xxxx has not been weaved. Has the assembly yyyy been added to NetworkProjectConfig?エラーが発生する

# はじめに
Fusion接続時に以下のエラーが発生しましたので対処方法を記録します。
このエラーは.asmdefを利用している場合に発生するようです。
`Type xxxx has not been weaved. Has the assembly yyyy been added to NetworkProjectConfig?`

# 対処方法
* ツールバー > Fusion > Network Project Configを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/12bf3f94-bc7b-04fe-a4a6-e7fa3f2c8c36.png)

* Config > Assemblies To Weave にFusionのアセンブリを参照している.asmdefを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c2fc6a13-8d8b-86cf-647b-da27a0d2119a.png)
BCM338X始めました。

とりあえずカーネルをビルドして実行できるようにしたので、実装方針を考えて見ます。

1. hintsベースで最小限を実装する
2. bhndベースで実装してみる
3. FDTで実装してみる

FreeBSD/mipsのBroadcomサポートは古めのチップのsibaと新目のチップのbcmaをサポートするbhndを作ったんだけど、中途半端で終っています。

Broadcomはsibaという仕組みからbcmaという仕様に変更したのだが、それらを透過に扱える事を目指したものがbhndだった。

現実的には1かな。。。

atheros/ar531xを雛形にしようと思う。

BCM3383(BMIPS4350)とBCM3380(BMIPS4350)で動かす事をめざし、BCM3300などの古いものは対象外。

既存コードを最大限利用する。

BCM3380やBCM3383はBCM6368に近いようだ。

GPLのソースを見てみると、BroadcomのmipsはBCM4(5),BCM6(3),BCM7の3本柱だったみたいだ。BCM33はBCM6系の亜流なので、情報が極めて少ない。

GPLで公開されているソースなどを参考にする。githubに上がってないものもあるので、ダウンロードしてローカルで展開して調べる。

BCM3380とBCM3383はUARTのアドレスが違い、BCM3380,3383はUARTは2個なのだがBCM3384は3個とちょこちょこいじられている。UARTはソフトさんの命綱なので、あまりいじるべきではない。

BCM3380-3383は1Core/2ThreadですがBCM3384(BMIP5000?)は2Core/4Threadかもしれません。

THOMSONのTCW770(BCM3380)はなんらかの理由でブートのuartとecosのuartが違っているような気がします。ブートは見えないのですが、ecosの出力のuartはここで0xb4e00200だと思います。

![BCM3380_UART.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c17e32f3-0a15-029e-1383-88e7bb7542ed.jpeg)

謎なのがJ305とJ306が両方ともここにつながっています。

おそらくbootは0xb4e00220に出しているような気がします。

spi flashの前半64Kとビルドしたpsimageをつなげて焼くとブートします。

Technicolor TC7200.U(BCM3383)の情報

https://github.com/gilbertfrancois/hardware-hacking-notes/tree/master/Technicolor%20TC7200.U

THOMSONのTCW770(BCM3380)と形状が同じなので、製造元がいっしょと思われます。このモデルはPCIeが一本と二本の基板があるようです。

BCM3383のLinux

https://github.com/jclehner/linux-technicolor-tc7200

おそらくGPLで公開されているソースを元にLinux本家のツリーにパッチを当てたのではないかと思われます。もともとある程度は本家に入っていて、追加したような感じです。

Broadcomが頭がおかしいと思うのはBCM3380とBCM3383でいろいろいじられていることです。ちょこちょこいじるとソフト屋さんが大変だし、バグも多くなる可能性があります。またBCM3383といったりBCM93383といったりBMIP4350といったりなんだかよくわかりません。またBCM3384の後にBCM33843という製品もあったようです。なんでそうなるかな。。。
cos-auditd-loggingのtaintについて

cos-auditd-logging のPod起動数が環境によって違ったので確認してみました。

# cos-auditd-logging
GKEのノードのオペレーティング システムログには、エラー メッセージ、ログイン試行、バイナリ実行など、クラスタとワークロードの状態に関する重要な情報が記録されます。この情報を活用して、問題のデバッグやセキュリティ インシデントの調査が可能となります。cos-auditd-loggingはDaemonSetであり、各ノードごとに一つのPodをデプロイします。デプロイすることにより、GKEノード上のLinuxのAuditdロギングが有効化されます。
・[cos-auditd-logging](https://cloud.google.com/kubernetes-engine/docs/how-to/linux-auditd-logging?hl=ja)

# 事象
クラスタA、クラスタBはノードプールが3つ、それぞれにノードが3つずつ存在し、計9ノード存在します。
計9ノードのため、cos-auditd-loggingも9/9podとなります。
クラスタAでは9/9pod起動しましたが、クラスタBでは3/3podしか起動しませんでした。

# 原因
cos-auditd-loggingのtolerationsが原因でした。
まず、クラスタAとクラスタBに差異はありませんが、
ノードプールの3つの内2つにtaintセットが設定されています。
このtaintセットが設定されていることにより、許可されたワークロード(Pod)のみtaintセットが設定してあるノードプールにPodの配置が可能となります。
その為、クラスタAでは9/9pod起動し、クラスタBでは3/3podしか起動しませんでした。
# 対策
クラスタAのtolerationsにすることで、Taint の key や value を問わず、存在するすべての Taint を持つノードに Pod をスケジュールできる ようになります。

クラスタAとクラスタBのcos-auditd-loggingのtolerationsは以下となります。

**クラスタAのtolerations**
```
     tolerations:
     - effect: NoExecute
       operator: Exists
     - effect: NoSchedule
       operator: Exists
```
**クラスタBのtolerations**
```
     tolerations:
     - effect: NoSchedule
       key: node.alpha.kubernetes.io/ismaster
     - effect: NoExecute
       operator: Exists
     - effect: NoSchedule
       key: sandbox.gke.io/runtime
       operator: Equal
       value: gvisor
```



# 根本原因
cos-auditd-loggingをデプロイする際に[サンプルdeployment](https://github.com/GoogleCloudPlatform/k8s-node-tools/blob/master/os-audit/cos-auditd-logging.yaml)を利用します。
このサンプルをダウンロードする時期が異なり、サンプル自体の内容が更新されていたためでした。

# 終わりに
環境の自動アップグレードやソフトウェアのバージョンアップによる動作の変化同様にサンプルスクリプトも入手する時期により動作が異なる場合もあります。
自身の環境にあっているか再確認し構築を進めていっていただければと思います。
Mac Logicoolのflowを使ってMac間をflowしてると時々マウスが認識しなくなる件

## ことのなりゆき
仕事でMac2台をLogicoolのFlow機能でマウスを行き来する事が多いのですが、多分Wi-Fiやらなにやら飛んでるので時々がmacと別なmacの間で行き来が出来なくなる現象に見舞われたので何か良い方法が無いかな？と思って解決策を編みだしました。

## 現象の確認
[Logicool Option+](https://www.logicool.co.jp/ja-jp/setup/mxsetup/logi-options.html)で設定しているのですが、ちゃんと繋がってはいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359920/b2a65146-82c5-8e3a-c222-aeaa68615f11.png)

## 解決策
でも、この画面間を行き来していると時々マウスの行き来ができなくなり、片方のmacしか動かないので、結局移動先のMacのBuuetoothのOffとOnをしないと解決しなかった、けど面倒くさい。

それで見付けたのが
[【Mac】コマンドラインでBluetoothを制御する(blueutil)](https://qiita.com/Kit-i/items/a7fe0042866fc50130ba)で

HomeBrewを入れた後にblueutilで以下を試しました。

```bash:インストール
brew install blueutil
```

```badh:BluetoothをOff
blueutil -p 0
```
```badh:BluetoothをOn
blueutil -p 1
```
で、問題無くマウスが行き来できることを確認

### commandファイルを作る
shスクリプトを書いて実行すれば？と思い、
```bash:ResetBluetooth.sh
#!/usr/local/bin/bash
/usr/local/bin/blueutil -p 0
/usr/local/bin/blueutil -p 1
```
を書きました。で、これを実行する方法をどうしようか？Autometerつかうか？と思ったのですが、
[Macでバッチ（command）ファイルを作る方法](https://qiita.com/ogsn/items/f15bfa9aeb68d8ecfc67)
と言うのを見付けたので、リネームしました。
```bash:リネーム
mv ResetBluetooth.sh ResetBluetooth.command
```
これを/Applications/フォルダに移動して、Dockへ登録しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359920/3bdc2bb4-e619-416f-1845-6a2cceb2300b.png)
```
$ /Applications/ResetBluetooth.command ; exit;
logout

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[プロセスが完了しました]
```

これでめでたく、flowがうまく行かなくてもすぐ直せるようになりました。（いいのか？）

以上です。
ChatGPT越えの最強AIこと【Claude 3】を試してみた！！なんだこれはすごすぎるぞ！！？？

結果はコチラ。。。

↓

↓

↓

一度も対話できずにアカウントBANされました！！！

![2024-04-19 13.40.22 Claude.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394333/29f63eb3-3246-581f-19f2-dc30af2b3b5c.jpeg)

いかがでしたか？

---

2024/07/12追記

異議申し立て的なことをしたら使えるようになりました。
SSH エラー

```
C:\Users\<Windowsのユーザ名>>ssh <raspberrypiのユーザ名>@raspberrypi
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:XO7io7klbjk5S1ubVThxR6YNnFft29NBOtoUk5TAzmA.
Please contact your system administrator.
Add correct host key in C:\\Users\\<Windowsのユーザ名>/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\<Windowsのユーザ名>/.ssh/known_hosts:28
Host key for raspberrypi has changed and you have requested strict checking.
Host key verification failed.

C:\Users\<Windowsのユーザ名>>ssh-keygen -R raspberrypi
# Host raspberrypi found: line 26
# Host raspberrypi found: line 27
# Host raspberrypi found: line 28
C:\Users\<Windowsのユーザ名>/.ssh/known_hosts updated.
Original contents retained as C:\Users\<Windowsのユーザ名>/.ssh/known_hosts.old
```
既存のフローを修正したいだけだけど...



相変わらずのポンコツぶり。何度やっても保存できませんね。

:::note alert
Too many requests to Graph API. Please try again later. clientRequestId: 654e3441-46d4-4865-be99-e948751e76e7 serviceRequestId: cc4832f2-263b-475e-a020-9672b7cdd5beUpgrade
:::

バグみたい

https://powerusers.microsoft.com/t5/Building-Flows/Too-many-requests-to-Graph-API-Please-try-again-later/td-p/696612


少し待って操作したら...

:::note alert
要求されたリソースは存在しません。 clientRequestId: 1c3f6d82-f9eb-461e-8af0-0ceb7011769e serviceRequestId: 8209d5b9-afa9-4d55-8e11-4a37e1aab637Upgrade
:::

意味が分からん。これ読んで回避方法が分かる人は天才だな。

+ [Microsoft Graph のエラー応答とリソースの種類](https://learn.microsoft.com/ja-jp/graph/errors)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/325fa0a3-8004-dd7a-91e1-dea4f7fcfa8d.png)

# 複製もできませんねぇ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bfa8e573-3f2b-e6e3-a793-210d9875e02a.png)


:::note alert
フローの保存がコード 'DynamicOperationRequestClientFailure' およびメッセージ 'The dynamic operation request to API 'excelonlinebusiness' operation 'GetTable' failed with status code 'NotFound'. This may indicate invalid input parameters. Error response: { "status": 404, "message": "要求されたリソースは存在しません。\r\nclientRequestId: 7553cd5d-f2d1-4042-9075-66e2e967ec91\r\nserviceRequestId: 717a9dc3-27b1-448c-bc57-7af9aef61f76", "error": { "message": "要求されたリソースは存在しません。" }, "source": "excelonline-jw.azconn-jw-001.p.azurewebsites.net" }' で失敗しました。
:::

やっとわかった、使っていたExcelのテーブル名が変わってましたね。上記の複製した時のエラーメッセージの「'GetTable' failed with status code 'NotFound'. 」でもしかしたらと推測できた。

ちょっと、いやいやかなり不親切なエラーメッセージだと思う。

# 資料

+ [Power Automate フロー所有者の退職・異動への備え](https://jpdynamicscrm.github.io/blog/powerautomate/change-flow-owner/)
UE5エラー対応メモ「Error  : Unable to find 'class', 'delegate', 'enum', or 'struct' with name 'xxxxx'」


# Error  : Unable to find 'class', 'delegate', 'enum', or 'struct' with name 'xxxxx'

```
UFUNCTION(BlueprintCallable, Category = "Online|Friends")
static XXXX GetXXXX();
```

XXXXがBlueprintに公開されていないのが原因
Engine側のコードの場合はラップするかEngineの修正が必要。