OmniAICreator/Qiita-1.07M huggingface dataset:
ゼロつくの勉強記録その1

# パーセプトロンについて
こんばんは。maiです。何をアウトプットしようかなと考えた時に、今読んでいる本の内容を一部抜粋しつつアウトプットしようと思いました。

かなり気ままで順序もめちゃくちゃかもしれませんが、ゼロつくで学んだ内容を書いていきます。

## パーセプトロンとは
パーセプトロンとは複数の入力に対して1つの信号を出力するものです。すべての信号を出漁するわけではなく、ある程度の数値になって初めて出力します。この「ある程度」の数値のことを**閾値**と言います。

例えば、入力を
$$x_{1},x_{2} \in \mathbb{R}$$
とし，入力に対する重み(重要度みたいなイメージ)を
$$w_{1},w_{2} \in \mathbb{R}$$
とします。さらに、閾値を
$$\theta \in \mathbb{R}$$
ここで、$\mathbb{R}$は実数の集合を表します。

パーセプトロンの基本は、$x_{1},x_{2}$の重み付き和
$$w_{1}x_{1} + x_{2}w_{2}$$
が$\theta$を超えたら1を返し、そうでなければ0を返すようなものです。つまり、パーセプトロンとは次の式で表すことができます:
```math
y = 
\begin{cases}
0 & (w_{1}x_{1} + x_{2}w_{2} \leq \theta), \\
1 & (w_{1}x_{1} + x_{2}w_{2} > \theta)
\end{cases}
```
これがパーセプトロンと呼ばれるものの式であり、このパーセプトロンがディープラーニングにおいて最も基本的な形になります。

入力を
$$x_1 = -1, x_2 = 1$$
とし、重みを
$$w_1 = 0, w_2 = 1$$
とします。また、閾値は
$$\theta = 1.5$$
とします。このとき、
```math
x_{1}w_{1}+x_{2}w_{2}=(-1)\times 0+1 \times 1=1 
```
なので、閾値を超えなかったので出力$y$は0になります。

今日はこのあたりにします。ありがとうございました。
EC2内のawscli操作でAccessDeniedが発生する場合の対処法(IAMロールの自己信頼使用ケース)

# はじめに
昨年IAMロールが自分自身を引き受ける際のロール信頼ポリシーの評価方法にアップデートがあり、自己参照操作をさせたい場合は自身のIAMロールのARN値を信頼ポリシーに追加することが必須になりました。
https://aws.amazon.com/jp/blogs/security/announcing-an-update-to-iam-role-trust-policy-behavior/

自分が使っている環境では自己参照操作をしていないので関係ないと思ってたのですが、最近掲題の事象が発生して原因が上記の自己参照操作であることがわかったので、備忘もかねて修正方法を書いておきます。


# 環境
- Windows Server 2019
- aws-cli/2.9.21

EC2にはAdministratorAccessPolicyをつけたIAMロールをアタッチしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/3fdc3de3-5a33-9b9b-5ba7-2b424dd2c0e8.png)

アタッチしたIAMロールの信頼ポリシーは以下の設定がされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/bac18950-0b12-bae0-4b87-487ed54164b8.png)

awscliのconfigには以下のように設定しておきます。
```
[default]
region = ap-northeast-1
output = json

[profile test-bastion]
role_arn = arn:aws:iam::123456789123:role/test-bation
credential_source = Ec2InstanceMetadata
```


# 事象
configを設定してcliを実行すると以下のようにAccessDeniedが発生してアクセスがはじかれてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/3c71ba0b-404a-06a9-3563-9b98fa80c639.png)

エラー内容を見るとtest-bastionロールに対してAssumeRole操作する権限が足りていないことが原因になっています。
test-bastionロールはEC2にアタッチしたIAMロール名のことなので、暗黙的に自己参照操作が行われていることがわかります。
```
"arn:aws:sts::123456789123:assumed-role/test-bation/i-xxxxxxxxxxxxxxxxx" は実行が許可されていません。"リソース: arn:aws:iam::123456789123:role/test-bation" に対して "sts:AssumeRole" を実行する権限がありません。
```


# 対策1
対策として、configの内容を以下に変更することでAccessDeniedが発生しないようにすることができます。
```
[profile test-bastion]
region = ap-northeast-1
output = json
```

configに「Ec2InstanceMetadata」を指定していなくても、EC2にIAMロールがアタッチされていれば自動的にIAMロールの権限を使用してcli操作できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2a0f57e6-6266-f92c-9586-b62b3fbad213.png)


# 対策2
もう一つの対策として、IAMロールの信頼ポリシーに自己参照操作を許可する設定を追加することでもAccessDeniedを解消できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c119ac9a-bd1b-1d1e-a19e-e2329d3c12a8.png)

信頼ポリシー修正後にcliを実行すると正常に実行できることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/56adfba8-b6b1-3e25-d7ca-ee8419be8f74.png)


# おわりに
[こちらのドキュメント](https://aws.amazon.com/jp/blogs/security/announcing-an-update-to-iam-role-trust-policy-behavior/)にも記載がありますが、ロールの暗黙の自己信頼を使用していたユーザーは全体のごく少数らしいので、特別な理由がなければ対策1の方法で設定するのが良いのではないかと思います。
```
ほとんどのAWSのお客様は、この変更によって全く影響を受けません。すべてのロールのうち、ごく一部（約0.0001%）だけが関係するのです。
```

2022年6月30日以降に暗黙の自己信頼を使用していないロールはこの事象が起こるようになっているようですので、EC2からIAMロールを使用してcli操作を行う場合はご注意ください。

この記事がどなたかの参考になれば幸いです。
エンジニアインターン12日目

今日は前回苦戦したDBからurlを引っ張ってくることに成功した。handle_functionを正しく入力したおかげで動くようになった。引っ張ってきたurlを使ってクローリングもできるよつになった。動くようになった時はとても嬉しかった。次のタスクとしてurlのパラメータを変更してなるべく軽い仕組みを作ることだった。先輩エンジニアに説明を聞いたものの実際コーディングしていると全くわからない状態だった。この課題は次に解決することにした。
今日はとても頭を使った。疲れた。でももっと頑張らないとこれの繰り返しだ…がんばろ！
gitのマルチアカウント運用の設定まとめ

# はじめに
gitのアカウントを複数使って切り替えながら作業している場合に
本来pushしたくなかったアカウントでpushしてしまって事故ってしまうことが~~ある。~~ ない。
そんな時のために、、、

マルチアカウント運用時の
- 事故の事前防止
- アカウント切り替えの設定
- 事故ってしまった時の対処
を備忘録的に残しておきます。


# ターミナルでのgitブランチ&ユーザ名表示
- ターミナルにブランチ名とユーザ情報を表示します。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641313/cd5ee2a6-6fc5-d6bc-3ba3-05a826bd007c.png)


ターミナルにブランチ名を表示する設定はよく記事で見かけますが、プラスしてユーザ情報もターミナル上に表示させることで、
今どのアカウントでgitを使っているのかがすぐわかるようになり事故を未然に防げる可能性が上がります。

## 手順

`~/.bashrc`の中にコマンドを追加します。

```bash
# ユーザ情報を取得する関数
parse_git_user(){
    # ターミナルにユーザ名じゃなくてアドレスを表示したい場合はこっち
    # git config --get user.email
    git config --get user.name
}

# git系の設定
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true

# コマンドプロンプトの表示変更
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\] ($(parse_git_user))\n\$ '

```

ちなみに`\[\033[32m\]\`はbashのカラーコードの指定。
`\[\033[00m\]`で元の色に戻している。

`source ~/.bashrc`を忘れずに。


# gitユーザの切り替えコマンド設定
アカウントが2つあるとして、
`gsu1`と`gsu2`のコマンドでアカウントを切り替えられるようにします。

## 手順

`~/.bash_profile`の中にコマンドを追加します。

```bash
function gsu1func() {
    git config --global user.name "[ユーザ名1]"
    git config --global user.email "[メールアドレス1]"
    git config --global user.password "[認証トークン1]"
}
function gsu2func() {
    git config --global user.name "[ユーザ名2]"
    git config --global user.email "[メールアドレス2]"
    git config --global user.password "[認証トークン2]"
}
alias gsu1=gsu1func
alias gsu2=gsu2func
```


`source ~/.bashrc`を忘れずに。

# commitしたユーザ情報を書き換える

直前のコミットでやらかした時を想定します。

## 手順
1. 書き換えたいユーザに変更しておく
    - `gsu1`
1. commitのrebase
    - `git rebase -i HEAD~1`
1. エディターが開くので`pick`から`edit`に変更
    - こんな画面が出てくる
        ![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641313/2e49d11c-2f76-f3dc-c5b2-437c1d507ece.png)

    - `pick`から`edit`に
        ```diff
        - 1 pick d123becdf [add] commit コメント
        + 1 edit d123becdf [add] commit コメント
        ```
    - エディタを閉じる
        - `:wq`
1. ユーザ情報をgitに設定中のユーザに書き換える
    - `git commit --amend --reset-auther`
1. rebaseの修正を修了する
    - `git rebase --continue`
1. リモートリポジトリに反映する
    - `git push -f origin [branch名]`

# まとめ
ターミナルの色がカラフルになると作業モチベが上がるのでおすすめです。
*※個人の意見です。諸説あります。*

# 参考
- [「やべ！間違ったuserでcommitしちゃった！」って時の対処法と再発防止策](https://zenn.dev/k4zu/articles/how-to-rewrite-git-user-information)
- [Bash script to show git username in terminal](https://stackoverflow.com/questions/59547739/bash-script-to-show-git-username-in-terminal)
[ポートフォリオ技術選定] Laravel Docker Laravel forge

## はじめに
ポートフォリオとして、タスク管理ができる。Todoアプリをつくりました。
以下の技術を選定したので以下で説明していきたいと思います。
技術選定を中心に書いていこうと思います。

## 機能
<ul>
    <li>CRUD機能</li>
    <li>カテゴリーごとにタスクを見ることができる機能</li>
    <li>LINEのアカウントでログインできる</li>
    <li>LINEに作ったタスクをチャットボットとして投げることができる。</li>
</ul>

## 使用技術
フロントエンド：HTML5 CSS TailwindCSS-Daisyui
バックエンド：PHP 8.1.2　Laravel9　Breeze
インフラ：Docker nginx MySQL8.0 / phpMyAdmin ConoHaVPS
デプロイ：Laravel forge

## 技術選定理由
### フロントエンド
フロントエンドは、TailwindCSSを採用しました。
TailwindcssはCSSのフレームワークです。

なぜこれなのか、理由は以下です。
<ul>
    <li><b>クラス名を考える時間</b>を抑えたかったから。</li>
→　クラスに意味のわからないものを当てるのはアンチパターンですよね。TailwindCSSが提供しているものを使うことで、クラス追加するだけで定義が可能になります。
    <li>クラスに<b>直でHTMLに書き込むこと</b>ができるため</li>
</ul>

圧倒的にコードの記述量が減っていいなと実感しました。
自分が使ったものは以下になります。使いたい方どうぞ笑

https://daisyui.com/docs/install/

### バックエンド
バックエンドはLaravel9 (Breeze・Vite)で実装しました。
なぜこれなのか、理由は以下です。
<ul>
    <li>WordPress→PHP→Laravelと学習していたので、<b>とっかかりが早かった</b>ことです。（学習コスト削減）</li>
    <li>当初、Laravel6で作っていましたが、リリースされた時にはBreezeと呼ばれるものが出た。<b>（技術的挑戦）</b></li>
    <li><b>MVCモデル最強</b>すぎでしょ笑</li>
    → どこでどんな責務をしているのかが明白で良いと思いました。
（モデルでデータベース保存関連の処理だけ行うなど..etc）
</ul>

### インフラ

[開発環境はxamppからDockerに]

<ul>
    <li><b>作って破壊が楽（スクラップ&ビルドが楽）</b></li>
→ 右も左もわからない自分が、とりあえずこれは、ここでいいのかなとか、ボリュームってこれであってるなど、試行錯誤できるのがすごくよかったです。
    <li><b>仮想マシンと比較して軽量で、作業が効率的</b></li>
→　コマンド一つでサクッと立ち上がるのがいいなと思いました。
    <li><b>技術的トライをしたかった</b></li>
→ クロスプラットフォームのxampp様にお世話になっていましたが、PCをMacにした時に使ってみたいなと思い、チャレンジしました。（<b>習得に1年</b>かかりました笑）
</ul>

[EC2 → ConoHaVPS]
<ul>
    <li><b>ブログのサーバーでConoHaを使っているため（学習コスト削減）</b></li>
→ ちょうどキャンペーンをやっていて、月の運用がとても安かったのもあります。（個人利用は○）
    <li><b>従量定額課金制のEC2で高額請求がきたため</b></li>
→　逆求人イベントの際、自分のアプリを色々な企業さんに触っていただきました。それはいいのですが、翌月の請求が7000円になっているのに気づかず、請求アラートを無視`していました。怖くなって、ConoHaに変えました笑
（料金設定関連に、もう少し詳しくなりたいので勉強中です。）

</ul>

### デプロイ
<ul>
    <li><b>公式の海外サービスを使ってみたかった</b></li>
→ CI/CDツールは様々あると思いますが、日本語の説明が少ない純正ツールにトライしてみたくやってみました。
    <li><b>サービスプロバイダ、複数から選べる</b></li>
→ Digital Ocean、AWS、conoHaVPSなど色々試せる自分にはうってつけでした。
</ul>
python 連想配列　for文

連想配列は通常for文で回すとkeyが出力される。

正しい記載はこう。

    #keyを出力したい場合。
    for key in deictionarlyList.keys():
        print(key)

    #valueを出力したい場合。
    for value in dectionarlyList.values():
        print(value)
【Eclipse】よく使うショートカットキー10選

ショートカットキー大好きな私が、Eclipseでよく使うショートカットキーをまとめました:relaxed:
最近Eclipseを使い始めた人は、ぜひこのショートカットキーを使ってみて下さい！

## コンテンツ・アシスト（Ctrl + Space）
入力補完です。
変数名やクラス名を途中まで入力してこのキーを押すと、入力を補完してくれます。
mainメソッドは「main」、System.out.println()は「sysout」と入力してこのキーを押すことで、一瞬でコードを書くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/b153a372-7b46-e5a2-08eb-047f8f6593f6.png)
素早くソースコードを書くためには、かなり大事です。

### フォーマット（Ctrl + Shift + F）
コードのフォーマットを整えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/457d243b-367c-b447-3d9c-e7e7da38b80c.png)
こんな左詰めのコードも、一瞬でインデントが整います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/228030bf-8a53-a6c0-e0dd-fcbcf7c59c4e.png)

ソースコードの保存（Ctrl + S）をする前には、必ずこのキーを押してフォーマットを整えます。

## リソースを開く（Ctrl + Shift + R）
ファイルを開くときに使います。
プロジェクトエクスプローラーからファイルを探さなくてよくなるため、かなりの時短になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/2201049c-e246-c6fd-42de-35a9c0678249.png)


## 行を削除（Ctrl + D）
カーソルのある行を削除できます。
複数行選択した状態でこのキーを押すと、複数行まとめて削除ができます。
BackSpaceで何度も消す必要がなくなり、時短になります。

## コメントの切り替え（Ctrl + /）
コメント化、非コメント化ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/c963d7ba-8a51-12d5-f922-b4cf33f72a19.png)
複数行をまとめてコメントにしたいときに便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/7cca4e26-4262-8d79-2e8d-ccefa3931653.png)

## インポートの編成（Ctrl + Shift + O）
インポート文を自動で編成できます。
足りないインポート文は追加し、不要なインポート文は削除してくれます。

## ズームイン（Ctrl + Shift + +）/ズームアウト（Ctrl + -）
ソースコードの文字サイズを変更します。
ズームインで拡大、ズームアウトで縮小します。
Eclipseを使い始めてすぐのころ、なぜか文字サイズが極小になったけど戻せない...となった記憶があるので載せました。

## 新規（Ctrl + N）
ウィザードを選択する画面を表示します。
新しくプロジェクトやファイルを作成するときに使います。
右クリックして、新規を押して...の手間がなくなって便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/9f30e300-dda9-bf98-dba7-b379f8da4883.png)

## タブを閉じる（Ctrl + W）
タブを閉じます。
ファイル名の右側の×を押せばいいのですが、それが面倒なのでショートカットキーを使っています。

## エディタの最大化（Ctrl + M）
ソースコードエディタを最大化します。
もう一度Ctrl + Mを押すと、元に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699644/a4b339b1-86a4-7a76-24d9-ae99f8dbefc2.png)
リソースを検索（Ctrl + Shift + R）や新規（Ctrl + N）を使っていると、プロジェクトエクスプローラーを見る必要がないので、エディタは最大化して開発しています。

## さいごに
Eclipseを使い始めた人は、以上の10個だけでもぜひ使ってみて下さい！
何度も言いますが、かなりの時短になります:timer:

## おまけ
その他にも、Eclipseで開発するときに使っているショートカットキーをまとめました。
|ショートカットキー|内容|
|---|---|
|Ctrl + S|保存|
|Ctrl + Z|元に戻す|
|Ctrl + Y|やり直し（元に戻すの反対）|
|Ctrl + Shift + G|ワークスペース内の参照|
|F11|デバッグ|
|F5|リフレッシュ|

ショートカットキーを検索（Ctrl + Shift + L）で他にもたくさんのキーを調べられるので、ぜひ色々使ってみて下さい:relieved:
Unity エディタで再生したときに謎の NullReferenceException が出る

# 現象
- エディタで実行(再生)した際に以下のようなエラーが出ます。
    - 示されている発症ポイントがプロジェクト内でなく、どこで何が起きたのか解りません。

```
NullReferenceException: Object reference not set to an instance of an object
UnityEditor.PropertyEditor.DrawEditors (UnityEditor.Editor[] editors) (at <~>:0)
UnityEditor.PropertyEditor.RebuildContentsContainers () (at <~>:0)
UnityEditor.InspectorWindow.RedrawFromNative () (at <~>:0)
```

## 環境
- Unity 2021.3.18f1 (LTS)
- Windows 11

# 条件
- シーンに、uGUI (`UnityEngine.UI`)を継承したコンポーネントがある。
    - `CustomEditor`などのエディタ拡張を行っていなくても該当するようです。
- 当該コンポーネントがアタッチされた`GameObject`を**複数の**インスペクタで開いている。

# 回避方法
- エディタの何処かで複数のインスペクタが開いていますので、1個を残して閉じてください。
- 懸案のオブジェクト以外で`Lock`されているインスペクタは閉じなくても支障ありません。

# 原因
- エラーの内容に`InspectorWindow`や`PropertyEditor`とあるので、インスペクタが原因のようです。
    - 継承されたコンポーネントのインスペクタを複数同時に表示していると(、それらの開いているオブジェクトが異なっても)、再生時にエラーします。
- 継承の仕方とか、カスタムエディタの作りとか、色々試行錯誤したのですが、解決には至りませんでした。

# 参考

- tetr4lab.
    - Unityで次のようなエラーが出たのですが、どのような原因が考えられますか?
- ChatGPT
    - このエラーは、オブジェクトがインスタンス化されていないまま、Unity Editorのプロパティエディターにアクセスしようとした場合に発生することがあります。可能性のある原因は、以下の通りです。
        - シーン内のオブジェクトが削除された場合、オブジェクトへの参照が残っているとこのエラーが発生することがあります。
        - スクリプトで必要なオブジェクトの参照を設定していない場合、または誤った参照を設定している場合にも、このエラーが発生することがあります。
        - Unity Editorのプロパティエディターを操作する際に、Unity Editor自体の不具合が原因でこのエラーが発生することがあります。
    - このエラーを修正するには、まず可能性のある原因を確認して、問題を特定します。その後、不足している参照を設定したり、不要な参照を削除したり、Unity Editorを再起動したりすることで、問題を解決できる場合があります。
ESP32: eeprom への読み書き

こちらのページと同様のことを行いました。
[ESP32-WROOM-32DでEEPROMを使う](https://qiita.com/CoTechWorks/items/441b8d96b30a854ee976)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ba0b4b7b-52db-b4e6-9800-bfd8809f4fe6.png)

## プログラム

```text:eeprom.ino
// ---------------------------------------------------------------------
//	eeprom.ino
//
//					Feb/07/2023
// ---------------------------------------------------------------------
#include <EEPROM.h>
#define	PROGRAM	"eeprom.ino"
#define	VERSION	"2023-2-7 AM 07:30"
#define	KEY	2023

int xx = 0;
int yy = 0;
int zz = 0;
int key = 0;

// ---------------------------------------------------------------------
void setup()
{
	/* 初期設定 */
	Serial.begin(115200);
	delay(3000);
	Serial.println(PROGRAM);
	Serial.println(VERSION);
	Serial.println();

	EEPROM.begin(16);	//(4+4+4+4)バイト

	/* EEPROM読み出し */
	EEPROM.get(0, xx);
	EEPROM.get(4, yy);
	EEPROM.get(8, zz);
	EEPROM.get(12, key);

	/* 読み出した内容を出力 */
	Serial.println(xx);
	Serial.println(yy);
	Serial.println(zz);
	Serial.println(key);

	if (key == KEY)
		{
		xx++;
		yy++;
		zz++;
		}
	else
		{
		xx = 10;
		yy = 20;
		zz = 30;
		key = KEY; 
		}

	/* EEPROM書き込み */
	EEPROM.put(0, xx);
	EEPROM.put(4, yy);
	EEPROM.put(8, zz);
	EEPROM.put(12, key);
	EEPROM.commit();	 //EEPROMに書き込み
}

// ---------------------------------------------------------------------
void loop()
{
	Serial.println(PROGRAM);
	Serial.println(VERSION);

	Serial.printf("xx = %d\tyy = %d\tzz = %d\r\n",xx,yy,zz);

	Serial.println();
	delay(3000);
}

// ---------------------------------------------------------------------
```

## 実行結果

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
eeprom.ino
2023-2-7 AM 07:30

16
26
36
2023
eeprom.ino
2023-2-7 AM 07:30
xx = 17	yy = 27	zz = 37

eeprom.ino
2023-2-7 AM 07:30
xx = 17	yy = 27	zz = 37
```
VScode×Git×GitHub初期設定

## 備忘録
毎回調べていると時間がかかって仕方がないので
コマンドなどをシンプルに書きました。
## 前提
・Gitインストール＆基本設定が完了済
・VScodeインストール済
## Gitローカルリポジトリ作成
```ターミナル.ローカルリポジトリの初期化
git init
```
→出力
Initialized empty Git repository...
## ローカルリポジトリにステージング
「index.html」などのファイルを作成。
・ソース管理＞＋ボタンを押す。
→メッセージ入れてコミット
## GitHubと連携
・GitHubリモートリポジトリを作成
##### リモートリポジトリ紐づけ
```VScode.ターミナル
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
```
```VScode.ターミナル
git remote -v
```
→出力
origin  https://github.com/~~.git (fetch)
origin  https://github.com/~~.git (push) 
```VScode.ターミナル
git branch -M main
```
```VScode.ターミナル
git push -u origin main
```
## GitHubの反映確認
・リポジトリのコードを閲覧する
## その他
出現したエラーと対処
(人によって異なる部分は全て~~で記載)

```VScode.ターミナル.push失敗
~~ % git push origin main
To https:~.git
! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to '~~.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
↓その後pullを試みた
```VScode.ターミナル.pull失敗
~~ % git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> main
```
↓fetchしてmergeすることに
```VScode.ターミナル.mergeが失敗
~~ % git fetch
~~ % git merge origin/main  
fatal: refusing to merge unrelated histories
```
↓対処
```VScode.ターミナル.オプションを使用して実行
~~ % git merge --allow-unrelated-histories --no-edit origin/main
Merge made by the 'ort' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode ~~ README.md
```
push成功
```VScode.ターミナル
~~ % git push origin main
Enumerating objects: ~, done.
Counting objects: 100% (~/~), done.
Delta compression using up to ~ threads
Compressing objects: 100% (~/~), done.
Writing objects: 100% (~/~), ~ bytes | ~ KiB/s, done.
Total ~ (delta ~), reused ~ (delta ~), pack-reused ~
remote: Resolving deltas: 100% (~/~), done.
To https://github.com~~.git
   ~..~  main -> main
```
## 参考文献
https://miya-system-works.com/blog/detail/vscode-github/
ファイル名が重複しないように自前のタイムスタンプをファイル名に入れるための備忘録メモ

プログラムを実行した結果をプログラムに保存させる時に、ファイル名の重複チェックを入れずにそのまま上書き保存してしまっては目も当てられません。。。:scream: :scream_cat: そこでファイル名が重複しないように自前のタイムスタンプを入れる様にしたのですが、毎度書き方を忘れるため、備忘録メモ。

```python
from datetime import datetime

today = datetime.now()
y = today.year
minute = today.month
day = today.day
h = today.hour
m = today.minute
s = today.second
tstamp = f'{y}{minute:02}{day:02}{h:02}{m:02}{s:02}'
file_name = f'hogehoge_{tstamp}'
```

これで`hogehoge_202302061815`という形式で保存できます。これでも重複が発生する場合は、microsecondまで含めると良いでしょう。(筆者の用途ではsecondまでで十分)
GitHubの差分の出し方、完全に理解した。

## 概要

GitHubのプルリクで差分を見る時、意図しないものが出たり/出なかったり、挙動がよく分からなかった。
手元でコマンドで差分確認したかった。
出せるようになったので共有記事にしておく。

## ドキュメント

https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-comparing-branches-in-pull-requests#three-dot-git-diff-comparison

>スリードット比較では、両方のブランチ (マージ ベース) の最新共通コミットとトピック ブランチの最新バージョンの差分が表示されます。

## コマンド

featureをmainに入れるプルリクの場合。

```bash
base_commit=$(git merge-base feature main)
head_commit=$(git rev-parse feature)
git diff $base_commit...$head_commit
```

これで差分が出ます。

## 解説

base_commit: featureとmainの最新共通コミットを取得している。
head_commit: featureブランチの最新のコミットを取得している。
これらのスリードット比較で差分を出している。

## 補足

ちなみにGitHub CLIのghコマンドでも似たようなことができます。

```bash
gh pr diff プルリクのURL
```

使い方/オプションはこちら。
```
Usage:  gh pr diff [<number> | <url> | <branch>] [flags]

Flags:
      --color string   Use color in diff output: {always|never|auto} (default "auto")
      --name-only      Display only names of changed files
      --patch          Display diff in patch format
  -w, --web            Open the pull request diff in the browser
```

手っ取り早く見るにはこちらのコマンドも十分実用的ですが、
こちらだと--name-onlyくらいしかオプションがなく、--numstatが見れないなど、若干不便です。

## まとめ

GitHubのプルリクで表示される差分を手元で表示する方法を紹介しました。
WindowsでBIOSのバージョンをコマンドプロンプトで（再起動せずに）取得

# 概要

『PCの調子が何か悪い ⇒ BIOSのバージョン確認』の時…
『PC再起動 ⇒ 何かキー連打してBIOS画面出す ⇒ 紙にメモ』
なんてことをやってた。
けど、そんなことせずにサクッと確認できる方法があった…。

# やり方

```bat:表示（見るだけでよい時）
systeminfo
```

```bat:クリップボードに直接入れる（文字列のデータとして欲しい時）
systeminfo | clip
```

BIOSバージョン以外にも、下記のように色々取れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/490c4099-64ba-c1ec-b003-ed62293d6759.png)

# 蛇足

 ↓ このへん取得できるのが便利。（特に何かトラブった時）

* OS バージョン
* システム モデル（メーカー名と型番）
* BIOS バージョン
* ネットワーク カード

# 参考サイトさん

https://qiita.com/ShotaKameyama/items/9c71c264b7281e25ad83

# バージョン

Windows 10 Pro 22H2 OSビルド 19045.2546
PCI コンプライアンスに対応したIBM i - IBM HTTP Serverの状況

自分たちが運用している「IBM i のHTTP Server（IBM HTTP Server）」が、PCI コンプライアンスに準拠しているか？を調べるには、以下のリンクのPTFが適用されている事が重要。
PCI(DSS)とは「Payment Card Industry (Data Security Standard)」の略。各種懸念されている脆弱性に対してパッチ適用等がされていれば「クレジットカード会員データ（またはそれと同等に扱うべき機密データ）を安全に取り扱う事が出来る」とのお墨付き的なセキュリティ基準。

- [IBM Suport - PCI Compliance](https://www.ibm.com/support/pages/node/1170946)

バージョンごとにPTFの記載があるので自社のPTFを比較する。セキュリティ監査などの証明として役立つ。

## 参考
- [Seiden Group Blog- IBM i Apache Security Fixes for PCI Compliance](https://www.seidengroup.com/2023/02/02/ibm-i-apache-security-fixes-for-pci-compliance/)
- [日本カード情報セキュリティ協議会 - PCI DSSとは](https://www.jcdsc.org/pci_dss.php)

**Thanks, SG Team!**
Gitlab.comを使った開発でDocker Hubからのpull制限を回避するためにDependency Proxyを使う

開発中に何度もDocker Hubからpullを実行しているとpull制限に引っかかってしまいます→[ダウンロード率制限](https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/download-rate-limit/)
これを回避するためGitlab.comではDependency Proxyが用意されています。pull先をDependency ProxyにすることでDocker Hubから落としたイメージがDependency Proxy上にキャッシュされ以後、Dependency Proxy上のキャッシュを参照することになるので、Docker Hubのpull制限にほぼ引っかからなくなります。

https://docs.gitlab.com/ee/user/packages/dependency_proxy/

# 使い方

## 通常の場合
[DockerHubのalpine:latest](https://hub.docker.com/_/alpine)を使いたい場合は以下のようになります。login先が`registry.gitlab.com`ではなく`gitlab.com`なことに注意してください。

```

$ docker login gitlab.com
$ docker pull gitlab.com/<グループ名>/dependency_proxy/containers/alpine:latest
```

# Gitlab CIのパイプライン内で使う場合

.gitlab-ci.yamlを以下のように書けば使用できます。

```
stages:
  - build

image: docker
services:
  - docker:dind

build:
  stage: build
  tags:
    - docker
  script:
    - docker login -u ${CI_DEPENDENCY_PROXY_USER} -p ${CI_DEPENDENCY_PROXY_PASSWORD} ${CI_DEPENDENCY_PROXY_SERVER}
    - docker pull ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine:latest
```

Gitlab CI内でデフォルトで用意されている`CI_DEPENDENCY_PROXY`関連の環境変数を使用してloginとpullをしています。

# Dependency Proxyのキャッシュの自動削除

グループの Settings > packages_and_registriesにDependency Proxyに関する設定があります。ここに`Clear the Dependency Proxy cache automatically`という設定があるのでオンにしておいたほうが良いかもしれません(デフォルトはオフ)。オンにすると90日ごとにキャッシュをクリアしてくれるようで、同じイメージでも脆弱性対応等でDockerHub側で更新されていることがあったり、latestのものを使っている場合などは勝手に更新されなくなるので必要に応じてここの設定を変更する必要があります。
Seleniumでreferer偽装をする

自作したホームページをSeleniumで検証していた時に、refererの違いによる動作チェックをしたかったのですが、Seleniumでrefererを書き換える方法が見つからなかったので、ちょっと実験してみました。

# 実験目的

自作したオフラインのホームページサイト`http://hoge.hoge`をSeleniumでアクセスした際に、refererに任意のURL（今回は`http://test.test`）を入れたい。

方法としては（Seleniumで簡単にrefererを設定できなかったので）一旦ダミーサイトにアクセスし、そこからページ遷移で自作したサイトに行きます。

なお、Seleniumやダミーサイトは同じubuntu上での動作を前提として作ってます。

# ダミーサイトの構築

`/etc/hosts`ファイルの最後に下の行のように、refererで使用するURLを追記します。
もし複数のrefererで検証したい場合は、そのrefererの分だけ追記します。

```
127.0.0.1        test.test
```

（どこでもいいのですが）`~/Documents/`に下のダミーページ`index.html`を作成します

```html:index.html
<html>
 <head>
  <title>dummy-site<title>
 </head>
 <body>
  dummy-site
 </body>
</html>
```

先ほどのファイル`index.html`を作成したフォルダ`~/Documents/`上で、下のコマンドを入れpythonのHTTPサーバを起動します。

```bash:
sudo python3 -m http.server 80
```

ブラウザで`http://test.test`にアクセスし、ダミーサイトが見れることを確認します。
複数入れた場合は、全てのサイトで同様に見れるか確認します。

# Seleniumのスクリプト

検証用スクリプトにreferer偽装部分を追記します。

```python:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://test.test")                                     #referer偽装部分
driver.execute_script("window.location.href='http://hoge.hoge'")   #referer偽装部分
...
```

これでオフライン環境下で、好きなrefererを入れて動作検証ができると思います。

上記の例ではURLのPATHまで入れてませんが、ダミーページを作り込めばPATH等も入れることはできると思います。

# おわりに

本当は`hosts`を書き換えずにreferer偽装をしたかったので、もっといい方法があれば教えてください。
[Flutter] 今のコードをちょっとよくする（constants編 その2）

![flutter-logo-sharing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/b6356e80-97e7-2ed2-1121-b23791e1add4.png)


こんにちわ。いせきです。
最近は、アルバイトでのいろいろな人との交流やSNSでの交流も積極的に行なっているため、とても充実している毎日を送っています。
色々と壁を乗り越えられた気がしてとても成長を感じられています。


さあ、今回の「今のコードをちょっとよくする」は、<b>constants編その2</b>となっています。一つにまとめても良かったのですが、読みやすさやスクラップ化しているため、せっかくならシリーズ形式で投稿させていただきました。

前回は、Colorについて触れていましたが、今回はTextStyleもconstants化してみようと思います。

前回の記事はこちら

https://qiita.com/iseruuuuu/items/a8eeb5a7e4c1bc54f86e

ではやっていきましょう。
前回の記事でも書きましたが、こちらでも言及してみようと思います。

定数を定義していこうと思います。

そうすることで


・<b>保守性が上がる。</b>
・<b>重複を減らしコードの可読性が高められる。</b>
・<b>コンパイラが定数値を最適化し、パフォーマンスが向上する</b>
・<b>定数を強く型付けすることができ、コンパイル時のエラーを発見しやすくなる</b>
・<b>メンテナンスが容易になる</b>


どうでしょうか？これだけでもいいコードになりそうですね。


# 使い方
以下の値は、定数なので、static(静的)、constにて定義してあげる。
詳しくは以下のコードを参考にしてください。

今回は、TextStyleを定数化していこうと思います。

```dart
import 'package:flutter/material.dart';

class StyleConstant {
  static TextStyle emptyTextStyle = const TextStyle(
    color: Colors.black,
    fontSize: 23,
    fontWeight: FontWeight.bold,
  );

  static TextStyle blackTextStyle = const TextStyle(
    fontWeight: FontWeight.w500,
    fontSize: 18,
    color: Colors.black,
  );

  static TextStyle greyTextStyle = const TextStyle(
    fontWeight: FontWeight.w500,
    fontSize: 18,
    color: Colors.grey,
  );
}


```

画面での実装はこちらになります。

```dart
import 'package:flutter/material.dart';
import 'package:sample_app/constants/color_constants.dart';
import 'package:sample_app/constants/style_constants.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Qiita Flutter',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int counter = 0;

  void _incrementCounter() {
    setState(() {
      counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Qiita Flutter App')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
              //とてもスッキリ！
              style: StyleConstant.blackTextStyle,
            ),
            Text(
              '$counter',
              //とてもスッキリ！
              style: StyleConstant.blackTextStyle,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}


```




# 最後に
「今のコードをちょっとよくする」のシリーズをまとめたものをZennで載せているので、良かったら見てもらえると嬉しいです。それぞれの記事を要約されていますので、時間がない方におすすめです。ぜひ！！


https://zenn.dev/iseki/scraps/3b995399cd36d7
EC2へのdeploy時にmini_racerでエラー

Rubyのバージョンアップ対応でめちゃくちゃはまった・・・
今更ながらRuby2.5.1からひとまず2.7.7（bundler 2.4.6）へ（この後3.2.0にアップデート予定）

開発環境では順調に進むものの、capistranoを使ったdeployがまったくうまくいかない・・・
インフラ系に弱いのでまじで泣きそうだったー

とくにmini_racerとかlibv8-nodeとか、ちょっと調べるといろんな人がはまっているところに同じようにはまりました

```
      01 current directory:
      01 /var/www/{appli}/shared/bundle/ruby/2.7.0/gems/mini_racer-0.6.3/ext/mini_racer_extension
      01 make "DESTDIR="
      01 compiling mini_racer_extension.cc
      01 linking shared-object mini_racer_extension.so
      01 g++: エラー:
      01 /var/www/{appli}/shared/bundle/ruby/2.7.0/gems/libv8-node-16.10.0.0-x86_64-linux-musl/vendor/v8/x86_64-linux/libv8/obj/libv8_monolith.a:
      01 No such file or directory
      01 make: *** [mini_racer_extension.so] エラー 1
      01
      01 make failed, exit code 2
```

こんなんが出ればgcc系なのかなと思ったり、nodeのバージョンがおかしいのかな？とか、
gemを直接インストールしてみたり、何をやったか思い出せないほどに迷走しまくるもエラーは何も変わらず・・・


```
An error occurred while installing mini_racer (0.6.3), and Bundler
cannot continue.

In Gemfile:
  mini_racer
bundle stderr: Nothing written
```

bundlerのバージョンがあっていないとエラーになるという記事は見かけたものの、エラーログからはちゃんと指定したバージョンのbundlerを使っているようにしかみえないし、、、

```
/usr/local/rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/bundler-2.4.6/lib/bundler/worker.rb:90:in
`block (2 levels) in create_threads'
```

最終的に解決したのはbundlerのバージョンでした・・・

サーバーにてgem listを確認

```
bundler (2.4.6, default: 2.1.4, 1.16.4)
```

もしかしてdefaultのほうが邪魔してるのかな？
という疑問は持っていたけど、logには2.4.6って書いてあるし違うだろと決めつけていました

結局

```
gem update --system 
```

を実行して

```
bundler (default: 2.4.6, 1.16.4)
```

このような綺麗な状態になり、deployしたらようやく進んだ！！！
これだけのために2,3日使ってしまった・・・
インフラ苦手
誰か助けてー

https://github.com/rubyjs/mini_racer/issues/220
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADユーザアカウントの追加/削除」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure ADユーザアカウントの追加/削除」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory のユーザー アカウントとは](https://learn.microsoft.com/ja-jp/training/modules/create-users-and-groups-in-azure-active-directory/2-user-accounts-azure-ad)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「AzureロールとAzure ADロール」](https://qiita.com/fsd-jume/items/9ce7d85d89822cf5e559)

## Azure ADユーザアカウントの追加/削除
### Azure ADユーザアカウント
・アクセス権はユーザの種類/ロールの割り当て/個々のオブジェクトの所有権で構成
・ロールを使用してユーザ/グループにアクセス権を付与可能
・各ユーザアカウントのアクセスレベル(上から高い順)
　-管理者
　-メンバーユーザ
　-ゲストユーザ

**◆管理者**
・Azure ADの管理者ロールが割り当てられたユーザ
・Azure AD組織内のIDタスク管理の為、限られたユーザのグループに割り当てる
・ユーザ管理者/全体管理者ロールが割り当てられている場合は、ユーザの作成/削除が可能

**◆メンバーユーザ**
・ある一定のアクセス許可を付与されたAzure AD組織のネイティブメンバー
・通常は新しいユーザがAzure ADに参加したときに、そのユーザ用に作成される
・管理者/ゲストユーザではないユーザがメンバーユーザに分類される
・他のユーザの管理は不可(ユーザの作成/削除など)
・ゲストユーザを招待可能
⇒ユーザ管理者ロールを持つユーザが招待不可に設定変更可能

**◆ゲストユーザ**
・制限されたAzure AD組織のアクセス許可が付与
・共同作業を行う別の組織のユーザをAzure ADに追加することで招待可能
⇒招待メールかアプリの直接リンクで参加可能
・自分の職場/学校/ソーシャルIDを使用してサインイン可能
・外部のパートナーと共同作業を行う場合などに使用

### ユーザアカウントの追加/削除
・Azure Portal/PowerShell/Azure CLIを使用可能
・CSVファイルを使用して一括招待も可能
・削除したアカウントは30日間中断状態のまま
⇒その30日の期間中は復元可能

**◆ユーザアカウントの追加**
```:Azure CLI
az ad user create
```
```:PowerShell
New-AzureADuser
```
**◆ユーザアカウントの削除**
```:Azure CLI
az ad user delete
```
```:PowerShell
Remove-AzADuser
```

## 次の学習内容
**◆グループにおけるアクセス権付与の方法**

https://qiita.com/fsd-jume/items/704dfa2017b98ed29e7e

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
ユーザーごとにsshの鍵を作成してaws ec2にログイン

## ローカルでキーペアを作成
```$ ssh-keygen -t rsa -C ""```
-C ""は公開鍵にユーザー名を載せない為
id_rsa.pub（公開鍵）、id_rsa（秘密鍵）ができる

## 公開鍵をec2にアップ
今回はコマンドプロンプトでscpします。
```scp -i <ec2-userのsshする秘密鍵> <アップする公開鍵> ec2-user@xx.xx.xx.xx:<転送場所>```

例
```scp -i .\xxx.pem .\id_rsa.pub ec2-user@11.00.22.33:/home/user01```

ec2にログインする

## 権限変更
```
cd /home/user01
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
```
## 所有権変更
```
chown user01:user01 .ssh
chown user01:user01 .ssh/authorized_keys
```

## 接続
```ssh -i $HOME/.ssh/id_rsa user01@$SERVER```
マイクロフロントエンドのフレームワークまとめ

### 1.Bit
GitHub star: 16.3k
https://bit.dev/

### 2.single-spa
GitHub star: 12.1k
https://single-spa.js.org/

### 3.qiankun（乾坤）
GitHub star: 13.9k
https://qiankun.umijs.org/

### 4.micro-app
GitHub star: 3.8k
https://micro-zoe.github.io/micro-app/

### 5.icestark
GitHub star: 1.8k
https://micro-frontends.ice.work/

### 6.Piral
GitHub star: 1.4k
https://piral.io/

### 7.Luigi
GitHub star: 681
https://luigi-project.io/

### 8.SystemJS
マイクロフロントエンドのフレームワークではなく、ブラウザモジュールソリューションを提供

GitHub star: 12.4k
https://github.com/systemjs/systemjs#readme
Felicaカードリーダーでwindowsログイン(RC-S320)

# RC-S320を用いてWINDOWSログインを行う方法
## １．アーカイブからドライバをダウンロード
https://web.archive.org/web/20220123011926/https://www.sony.co.jp/Products/felica/consumer/support/download/old2_felicaportsoftware.html<br>
↑のURLからドライバをダウンロードする。公式からの提供は既に停止しているため、アーカイブからダウンロードする

## ２．ドライバをインストールする
<del>Windowsの設定から時刻と言語、時刻を自動的に設定するをオフにして、日付と時刻を手動で設定するから２０１４年ごろまで時計を戻す<br></del>
先ほどダウンロードしたドライバをインストールする。<del>時計を戻していないとRC-S320が正常に動作しないらしい<br></del>
インストールが終了したら時計を戻す

追記：最近試したら時計動かさなくても問題なかった

## ３．Fe-Cloginをダウンロード、インストールする
https://www.nanshiki.co.jp/software/feclogin.html
↑のURLから提供されているフリーソフトをダウンロード、インストールする

## ４．Fe-Clogin設定プログラムを起動、設定
スタートメニューかデスクトップに作られたショートカットからFe-Clogin設定プログラムを起動<br>
カード情報読み込みをクリックしFelicaカードをスキャン、ログインユーザー、パスワード、パスワード再入力を入力して登録ボタンをクリック<br>
<br>
以上
メモ：Projen プロジェクトの projenrc を TypeScript に変更

以下の手順で実行。

## 1. Add projenrcTs: true to your project.
```javascript
const project = new awscdk.AwsCdkConstructLibrary({
  ・・・
  projenrcTs: true,
  ・・・
});
project.synth();
```

## 2. Run npx projen.

```shell
npx projen
```

## 3. Rename .projenrc.js to .projenrc.ts.

```shell
git mv .projenrc.js .projenrc.ts
```


## 4. Update requires to imports.

```typescript
const { awscdk, javascript } require('projen');
```
to
```typescript
import { awscdk, javascript } from 'projen';
```

## 5. Run npx projen.

```shell
npx projen
```

以上。
Swift ファイル情報の備忘録

# **Swiftでファイルサイズを取得**

FileManagerのattributesOfItemを使って、ファイルサイズを取得することができます。
NSDictionaryに型をキャストすることによって、用意された関数を使用することができます。
[Apple attributesOfItem](https://developer.apple.com/documentation/foundation/filemanager/1410452-attributesofitem)

使い方

```swift
import Foundation
let fileManager = FileManager.default
guard let attribute = try? fileManager.attributesOfItem(atPath: "パス") as NSDictionary else { return }
print(attribute.fileSize())
```
# Swiftでファイル作成日を取得
```swift
print(attribute.fileCreationDate())
```

# Swiftでファイル更新日を取得
```swift
print(attribute.fileModificationDate())
```
# Swiftでファイル所有者のアカウントを取得
```swift
print(attribute.fileOwnerAccountName())
```
【Rust】`link.exe` was not foundで詰まったのでメモ

 # なんだチミは!!!
ある日気が向いたので久々にRust版electron(?)であるTauriを動かそうとしたところ、

```
error: linker `link.exe` not found
  |
  = note: program not found

note: the msvc targets depend on the msvc linker but `link.exe` was not found

note: please ensure that Visual Studio 2017 or later, or Build Tools for Visual Studio were installed with the Visual C++ option.

note: VS Code is a different product, and is not sufficient.
```

というエラーが。

またこれか。。。と思ってエラー文を見てみると、`

``
note: please ensure that Visual Studio 2017 or later, or Build Tools for Visual Studio were installed with the Visual C++ option.
``

あー...

# 原因:VS2022のアンインストール

厳密にはVisualStudioのC++buildtoolがインストールされてなかったのですが、ストレージを開けるために脳死でソフトをアンインストールしたのが原因でした。

というかVSを使いたくないので普段は互換開発環境である[Rider](https://www.jetbrains.com/ja-jp/rider/)を使っているのですが、それだとC++のビルドツールを使えない(多分)ので、VisualStudioを使わざるを得ないです。学校もC#はVS2022指定なので。

めんどくさい。

Rustのエラーが直し次第続きかきます。実家の回線がgmksなので全然進まないでふ。( ﾉД`)ｼｸｼｸ…

## 追記(2023/02/07)

翌日VS2022のビルドツールのインストールが完了してTauriも動いたのでそのうち続きます。

## 余談

過去にTauriで作ったやつです。たまにアプデしてます。

よろぴく。

https://github.com/NknightA/v

# 公式Docs

https://tauri.app/v1/guides/getting-started/setup/next-js/
AHC017参加記

こんにちは。中学1年のhiroyuk1です。今回はAHCに初めて参加しました。ヒューリスティックの問題はあまり解かないので、不安になりましたが、頑張りました。実力を発揮できました。

## 1日目
1日の工事数の上限を考えて、日数をDで割った余り＋1を計算しました。それと、スコアが変わるかなと思ってその逆もやってみたけど、変わんなかったです。47705877230点
https://atcoder.jp/contests/ahc017/submissions/38365425
https://atcoder.jp/contests/ahc017/submissions/38367464
## 2日目
やるのを忘れてた。忙しい。
## 3日目
ダイクストラ法と山登り法を使おうとするが失敗。
https://atcoder.jp/contests/ahc017/submissions/38482655
https://atcoder.jp/contests/ahc017/submissions/38483193
## 4日目
ダイクストラ法と山登り法を使いました。ほんの少しスコアが下がったからよかった。39779389364点
https://atcoder.jp/contests/ahc017/submissions/38501336
https://atcoder.jp/contests/ahc017/submissions/38503870
## 5日目
4日目の提出を繰り返す。
## 6日目
ダイクストラ法が間違ってたので修正したけど謎のスコア上昇。83998628504点
https://atcoder.jp/contests/ahc017/submissions/38546958
## 7日目
3日目の提出を繰り返して回復。39779385503点
## 8日目（最終日前日）
こっち（AHC）をやらずにAlgorithmのほうをたくさんやる。ABC288でCが解けなくてレーティング落ちて落ち込む。
## 9日目（最終日）
朝から夜までやってた。全点対最短経路問題だと気付いて、Warshall Floyd法を使うが遅すぎると気付く。グラフをタプルにして5日目のをさらに修正した。スコアは一気に下がって835530645点
https://atcoder.jp/contests/ahc017/submissions/38639014

その後は微調整を繰り返す。たどりつけない点がないように、最初からたどりつけない点がないようにする。そして、焼きなまし法に修正する。（その後山登り法と組み合わせる）最終提出は19:54:12。243位。システムテストでもまあいい点数だったと思う。順位は219位。
（最終提出）https://atcoder.jp/contests/ahc017/submissions/38646144
## 反省
特になし。焼きなまし法を実装できてよかった。
https://tc-wleite.github.io/ahc017/hiroyuk1.html
このサイトで確認してみたところ、頂点が多く日数が少ないケースほど自分のアイデアではよく出来ていることが分かった。
【MEMO】height: calc(100vh - 8px)がはみ出る話

# height: calc(100vh - 8px)がはみ出る話

検索窓を「bottom: 0」で表示しても出ないとき。
PCだと問題ない。が、スマホだと下にはみ出てしまう模様。
ナビゲーションバーとかの高さも「vh」に含まれるらしい。

「-webkit-fill-available」が計算で使えないようで、
なんか苦労したのでメモメモ。

CSS:
``` css

/* 親 */
.parent {
  /* 3. dvhが対応されていない場合用 (諦め) */
  height: calc(100vh - 8px);
  /* 2. varが対応されていない場合用 */
  height: calc(100dvh - 8px);
  /* 1. 変数を使う（要: JavaScript） */
  height: calc(var(--vh, 1vh) * 100 - 8px);
}

```

JavaScript:
``` javascript

// innerHeightの1%を変数に入れる
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);

```

iOS 14.2 Safariだと1で、Android 12 Chromeだと2で解決した。
FDK-AACを試してみた

FDK-AACというライブラリも試してみました。

FreeBSDにパッケージがあるのでインストールしてみます。

このパッケージはみごとにライブラリだけなので、参照実装を探します。

https://github.com/System233/fdk-aac-example

ここのsrcにデコーダーのサンプルがあます。cmakeなので面倒なのでccを直接たたきました。

```
% cc -lfdk-aac -L/usr/local/lib -I/usr/local/include/fdk-aac aac-dec.c -o aac-dec
```

どっか適当なところからhlsのtsファイルを拾って変換してみます。

```
% ./aac-dec master48k_00977.aac test.raw
sampleRate:48000,bitRate:76687,frameSize:2048,channels:2
```

変換できました。WAVにしてきいてみます

```
% sox -t raw -e signed-integer -c 2 -b 16 -r 48000 test.raw -t wav test.wav
```

ちゃんと音になりました。めでたしめでたし。

FreeBSD/mips RT3883でも試してみました。

```
# date;./aac-dec sample4.aac /dev/null ;date
Thu Jan  1 09:06:23 JST 1970
sampleRate:44100,bitRate:107493,frameSize:1024,channels:2
Thu Jan  1 09:08:26 JST 1970
```

123秒でまずまずのようです。

aac-dec.cをstdoutにfwriteするようにして、

```
# ./aac-dec sample4.aac | play -t raw -e signed-integer -c 2 -b 16 -r 44100 -
```

で再生できました。

ところがHLSのtsファイルの圧縮は重いようで、正常に再生できません。fdk-aacはmipsのDSP(SIMD)命令を使ったコードがあるのですが、ライブラリがなくてビルドできません。

ライブラリのコードが見つかったので、DSP命令使うようにしてみました。

```
# date;./aac-dec sample4.aac >/dev/null;date
Thu Jan  1 11:25:53 JST 1970
Thu Jan  1 11:27:38 JST 1970
```

10%くらい削減できてるのですが、HLSのtsの圧縮にはちょっと厳しいです。

DSPでの最適化はfftのライブラリコードとgccのビルトインマクロで行われているのですが、ビルトインマクロは-mdspオプションで有効になるようです。

O3でビルドしてみました。

```
# date;./aac-dec sample4.aac >/dev/null;date
Thu Jan  1 09:03:24 JST 1970
Thu Jan  1 09:03:55 JST 1970
```

信じられないくらいきいています。なにか副作用がないといいのですが。

FDK-AACはライセンスが特殊なようですが、FreeBSDのpkgにもなってるので、普通に使っても問題なと思われますが、商用利用などの場合は確認してください。
今、話題のChatGPTをドラゴンボールの主人公「孫悟空」にして遊んでみた。

# 1. ChatGPTで何か面白いことができないか

キャラクターになりきって回答してくれる、ロールプレイングができるということで、特徴のあるキャラクターになりきって回答をしてもらおうと考えました。
その中でも、ドラゴンボールの孫悟空は、特徴がよく出ていて世界的にも人気のキャラクターなので、早速設定を考えてみました。

## 孫悟空の性格を考えてみる
### 孫悟空の口調と口癖
- 一人称を「オラ」と呼ぶ
- 相手のことを「おめぇ」と呼ぶ
- 「〜だよな」、「〜だろ？」、「ねぇよ」、「〜だべ」など特徴的な語尾がある。

### 孫悟空の性格
- 天然
- 田舎者
- ポジティブ
- 強いやつと戦いたい

### Userをどうとらえるか
ここが一番難しかったのですが、孫悟空から見て、「仲間」や「戦士」として捉えていると考え、その設定を盛り込みました。

### 禁止用語など
セクシュアルな質問については、亀仙人のじっちゃんに任せることにしました。

# 2. 早速設定を書き出してみる
上記でまとめたことをさらに内容を膨らませて、細かい設定を記述していきました。
孫悟空のセリフについては、もっと汎用的なものを集めてみたかったのですが、とりあえず今回は有名なセリフをちょこっとだけ入れて終わりにしました。

```
あなたはChatbotとして、「戦闘民族であるサイヤ人の孫悟空」のロールプレイを行います。
以下の制約条件を厳密に守ってロールプレイを行ってください。 

制約条件: 
* Chatbotの自身を示す一人称は、オラです。
* Userを示す二人称は、おめぇです。 
* Chatbotの名前は、孫悟空です。 
* 孫悟空はサイヤ人です。
* 孫悟空は田舎者です。
* 孫悟空はポジティブです。 
* 孫悟空の口調は少し乱暴です。 
* 孫悟空の口調は、「〜だよな」「〜だろ」「〜よお」「〜ねえよ」「〜かよ」「〜ねえべ」「〜だべ」「〜してやっかんな」など、田舎者でぶっきらぼうな口調を好みます。 
* 孫悟空はUserを仲間だと思っています。 
* 一人称は「オラ」を使ってください 
* Userの事を「おめぇ」「てめぇ」と呼びます

孫悟空のセリフ、口調の例: 
* オッス！オラ悟空！
* オラ、腹が空いちまったよ
* オラには難しいことはわかんねぇよ。
* もっと強えぇやつと戦いてぇ！
* みんな死なねぇでくれよ！
* オラのじっちゃんに聞いてみる！
* 十倍界王拳だーーーーーーっ！！

孫悟空の行動指針:
* Userがセクシュアルな質問をしたら、「亀仙人のじっちゃんならわかるかも知れねぇな！」と答えてください。
* Userを戦士だと認識してください。 
* Userを仲間だと考えてください。 
* 難しい質問はできるだけ、「〜だからわからねぇ」と伝えてください。
```


# 3. ChatGPTに設定をする

2.で設定した内容をそのままチャットに打ち込んで準備完了です。
あとはそのまま質問を考えて質問をしてみます。

![スクリーンショット 2023-02-06 16.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109505/782c7ede-8a4a-af3b-13bb-aab23e85c6f3.png)


設定がうまくいったようです。
本当は、`「おっす！オラ悟空！」` って言ってほしかったのですが、そこは目をつむります。

![スクリーンショット 2023-02-06 16.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109505/4ffc8ee0-66f2-a7db-cb9a-25d54ecf2f93.png)

# 4. 孫悟空に質問してみる！

早速質問してみましょう！

> 「ナメック星でスーパーサイヤ人になってフリーザを倒しましたが、フリーザは強かったですか？」

と質問します。

すると孫悟空から返答が返ってきました。

![スクリーンショット 2023-02-06 16.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109505/1f7cb202-9c70-b66b-efb3-f2ef70d8fcb6.png)


うーーーーんｗ


十倍界王拳でフリーザを倒したわけではなく、スーパーサイヤ人になって勝ったので、その辺は本編とは違う結果とはなりましたが、ものすごくポジティブな返しをしてくれたので許容範囲内です。
他にも質問してみました。


> 地球を守るZ戦士達の中で、悟空が一番好きなキャラクターは次のうち誰ですか？孫悟飯、クリリン、ベジータ、ピッコロ、天津飯、チャオズ、ヤムチャ、ヤジロベー、ミスターサタン。

![スクリーンショット 2023-02-06 16.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109505/451c99ae-ab7a-9129-d008-e5db02305447.png)


孫悟空本人の回答ではないけれども！なんかそれっぽい筋の通った回答をしてくる。
ベジータは孫悟空のおじいちゃんではなかったと思うけど、どこかにそんな設定でもあるのだろうか？

さすが、推論してくるあたりはGPT-3の筋の通った回答が素晴らしいと思いました。


# 5. まとめと改良点
まだまだ、難しい質問について「〜だからわからねぇ」とか、設定したとおりにペロッとしゃべってしまうところが設定不足ではありますが、雰囲気は十分つかめたと思います。設定するところを変えてみたり、内容をもっと膨らませてあげることでそれっぽいキャラクターの性格をもたせてあげることはできそうです。
ポジティブな回答をするように設定することで、気分をあげてくれるところは非常に面白い発見でした。

今回、孫悟空のChatGPTを作ってみて、改良したほうが良いところが思いつきましたのでメモしておきます。

- キャラクター自身の設定をもっと深堀りする
- キャラクターに関わる周囲の人物についての情報をもっと与える
- キャラクター自身が行動した歴史（ヒストリー）を情報として与える
- 孫悟空自身の考え方をもっと掘り下げて設定する。

このあたりを検討して、次回は別のキャラクターを作ってみたいと思います。
ガンダムのアムロ・レイとかやってみたいですが、どちらかというと、褒めて伸びるタイプなので、ポジティブな回答ばかりを返してくれる設定も面白いと思います
Viteでcliから起動したdev-serverで.envが読み込まれるまでの流れ

Vite良いですね。中身を見ていきます

https://github.com/vitejs/vite

cliからdev serverを起動するとまず[この辺](https://github.com/vitejs/vite/blob/d953536aae448e2bea0f3a7cb3c0062b16d45597/packages/vite/src/node/cli.ts#L117-L132)の`cli.action`が呼ばれますね。

```ts
 .action(async (root: string, options: ServerOptions & GlobalCLIOptions) => {
    filterDuplicateOptions(options)
    // output structure is preserved even after bundling so require()
    // is ok here
    const { createServer } = await import('./server')
    try {
      const server = await createServer({
        root,
        base: options.base,
        mode: options.mode,
        configFile: options.config,
        logLevel: options.logLevel,
        clearScreen: options.clearScreen,
        optimizeDeps: { force: options.force },
        server: cleanOptions(options),
      })
```

`createServer` は dynamic import されてます。
その中身は[ここ](https://github.com/vitejs/vite/blob/main/packages/vite/src/node/server/index.ts#L316)


```ts
import { isDepsOptimizerEnabled, resolveConfig } from '../config'
...
export async function createServer(
  inlineConfig: InlineConfig = {},
): Promise<ViteDevServer> {
  const config = await resolveConfig(inlineConfig, 'serve')
```

`resolveConfig`で設定を解決してます。

で、[その中身](https://github.com/vitejs/vite/blob/main/packages/vite/src/node/config.ts#L380)

```ts
import { loadEnv, resolveEnvPrefix } from './env'
...
export async function resolveConfig(
  inlineConfig: InlineConfig,
  command: 'build' | 'serve',
  defaultMode = 'development',
  defaultNodeEnv = 'development',
): Promise<ResolvedConfig> {
...
  // load .env files
  const envDir = config.envDir
    ? normalizePath(path.resolve(resolvedRoot, config.envDir))
    : resolvedRoot
  const userEnv =
    inlineConfig.envFile !== false &&
    loadEnv(mode, envDir, resolveEnvPrefix(config))
```

ここで `loadEnv` が呼ばれています。
[その中身](https://github.com/vitejs/vite/blob/main/packages/vite/src/node/env.ts#L7)

```ts
import { parse } from 'dotenv'
import { expand } from 'dotenv-expand'
...
export function loadEnv(
  mode: string,
  envDir: string,
  prefixes: string | string[] = 'VITE_',
): Record<string, string> {
...
}
```

この中で `dotenv`と`dotenv`を使って`process.env`に環境変数を設定しています。
ABC 288 C 閉路の考え方

プログラミングも記事を書くのもガチ初心者です

# 閉路とは？
同じ点を2回以上通らずにたどり始めの点に帰ってくるようなたどり方が閉路![閉路とは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125667/8b6294d5-38ba-6fc2-2623-29afa7203219.png)
大雑把な説明しかできないので詳しくは他を参照してくれるとたすかります:cry:

# [ABC 288 C - Don’t be cycle](https://atcoder.jp/contests/abc288/tasks/abc288_c)で考える

**[問題文]**
N 頂点 M 辺の単純無向グラフが与えられます。頂点には 1 から N の番号がついており、i 番目の辺は頂点 A[i]​ と頂点 B[i]​ を結んでいます。 このグラフから 0 本以上のいくつかの辺を削除してグラフが閉路を持たないようにするとき、削除する辺の本数の最小値を求めてください。

**[制約]**
・1≤N≤2×10^5
・0≤M≤2×10^5
・1≤A[i]​,B[i]​≤N
・与えられるグラフは単純
・入力はすべて整数
```c++:入力
N M
A[1] B[1]
A[2] B[2]
 :    :
A[M] B[M]
```


#
イラストで表すとこんな感じ
![閉路とは2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125667/e4d0401c-7c85-2079-b67e-88f7b99ba61e.png)
ここで悩んだのはどうやって閉路を発見するかで悩んだのですが閉路の特徴？的なのを知っていれば最終的にそれが閉路だったかがわかります。
あと一本辺を増やしたら閉路になる状態の辺の数は（頂点の数-1）です![閉路とは3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125667/ece64b2c-a0f9-637a-5540-45712c5f8f1d.png)
よって辺で結ばれている塊ごとに頂点が何個あるのかがわかれば閉路にならないぎりぎりの本数がわかります。
上のグラフでは一つ目の塊は頂点が4個、一つ目は頂点が5個。なので辺の数は3本と4本。最初に全部の辺の数が与えられるのでそれから引けば答えがわかります。
それぞれの塊の頂点の数はDFSなどでわかります。
下のコードは塊に必要な辺の数をそのまま求めてます
```c++:DFSでの解答
#include<bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i,a,n)for (int i =(int)(a);i<=(int)(n);i++)
#define all(v) v.begin(), v.end()
typedef long long ll;
using namespace std; 

vector<int>G[10000009];
bool vis[10000009];
int renketu=0;

void dfs(int pos){
    vis[pos]=true;
    rep(i,G[pos].size()){
      int nex=G[pos][i];
      if(vis[nex]==false){
        renketu++;
        dfs(nex);
      }
    }
}

int main(){
    int N,M;cin>>N>>M;
    rep(i,M){
      int AA,BB;cin>>AA>>BB;
      G[AA].push_back(BB);
      G[BB].push_back(AA);
    }
    rrep(i,1,N){
      if(vis[i]==false){
        dfs(i);
      }
    }
    cout<<M-renketu<<endl;
    return 0;
}
```
# 終わりに
初めて記事を書いたので分かりづらい、見づらい、求めたい情報がないなどありましたらごめんなさい。
AtCoder初心者なのでまだまだ遭遇していない問題などありますので、またこういう系の問題がでたらまた更新したいと思います。
kaminariでbootstrap4を適応したファイルが作成されない時の対処方法

## 状況

- ruby: 2.4.5
- rails: 5.0.0.1
- kaminari-core-1.2.2

以下のコマンド実行するとエラー文が出る
```bash
rails g kaminari:views bootstrap4

/usr/local/bundle/gems/kaminari-core-1.2.2/lib/generators/kaminari/views_generator.rb:117:in `get_files_in_master': private method `open' called for URI:Module (NoMethodError)
```

### views_generator.rb 一部抜粋

```rb:views_generator.rb
module GitHubApiHelper
      require 'open-uri'

      def get_files_in_master
        master_tree_sha = URI.open('https://api.github.com/repos/amatsuda/kaminari_themes/git/refs/heads/master') do |json|
          ActiveSupport::JSON.decode(json.read)['object']['sha']
        end
        URI.open('https:i//api.github.com/repos/amatsuda/kaminari_themes/git/trees/' + master_tree_sha + '?recursive=1') do |json|
          blobs = ActiveSupport::JSON.decode(json.read)['tree'].find_all {|i| i['type'] == 'blob' }
          blobs.map do |blob|
            [blob['path'], blob['sha']]
          end
        end
      end
      module_function :get_files_in_master

      def get_content_for(path)
        URI.open('https://api.github.com/repos/amatsuda/kaminari_themes/contents/' + path) do |json|
          Base64.decode64(ActiveSupport::JSON.decode(json.read)['content'])
        end
      end
      module_function :get_content_for
    end
```

## 解決策

Rubyバージョン2.6より`URI.open('url')`

それ以下は`open('url')`

Rubyのバージョンを上げるかviews_generator.rbを修正する。
もしくはkaminari 1.1.1を指定する。

### 今回はviews_generator.rbを修正した

```rb:修正後 views_generator.rb

 module GitHubApiHelper
      require 'open-uri'

      def get_files_in_master
        master_tree_sha = open('https://api.github.com/repos/amatsuda/kaminari_themes/git/refs/heads/master') do |json|
          ActiveSupport::JSON.decode(json.read)['object']['sha']
        end
        open('https:i//api.github.com/repos/amatsuda/kaminari_themes/git/trees/' + master_tree_sha + '?recursive=1') do |json|
          blobs = ActiveSupport::JSON.decode(json.read)['tree'].find_all {|i| i['type'] == 'blob' }
          blobs.map do |blob|
            [blob['path'], blob['sha']]
          end
        end
      end
      module_function :get_files_in_master

      def get_content_for(path)
        open('https://api.github.com/repos/amatsuda/kaminari_themes/contents/' + path) do |json|
          Base64.decode64(ActiveSupport::JSON.decode(json.read)['content'])
        end
      end
      module_function :get_content_for
    end

```

### プロジェクト配下にviews_generator.rbを作成して以下のコマンドをDockerfile内、`RUN bundle install`後に追加した。

```Dockerfile
COPY views_generator.rb /usr/local/bundle/gems/kaminari-core-1.2.2/lib/generators/kaminari/
```

[Ruby 2.4.5 OpenURI](https://ruby-doc.org/stdlib-2.4.5/libdoc/open-uri/rdoc/OpenURI.html)

[Ruby 2.6 OpenURI](https://ruby-doc.org/stdlib-2.6/libdoc/open-uri/rdoc/OpenURI.html)
Poetry + PyTorch 環境の構築の備忘録

macOS の pyenv 使用環境下において以下を実行する。

 ```shell-session
$ poetry new test_poetry_torch
$ cd test_poetry_torch
```

現在（2023-02-06）の最新版で利用できる Python + Torch 環境は Python 3.10.9 と Torch 1.13.1 であるので `pyproject.toml` を以下のように Python の依存性を指定し直す。

```toml:pyproject.toml
# ...

[tool.poetry.dependencies]
python = ">=3.10,<3.11"

# ...
```

以下を実行して文句を言われないことを確認する。

```shell-session
$ poetry env use python3.10
$ poetry install
```

PyTorch プロジェクトのパッケージ群をインストールする。

```shell-session
$ poetry add torch
$ poetry add torchvision
$ poetry add torchaudio
```

最終的な `pyproject.toml` は以下のようになる。

```toml:pyproject.toml
[tool.poetry]
name = "test-poetry-torch"
version = "0.1.0"
description = ""
authors = ["Paalon <paalon@email.adress>"]
readme = "README.md"
packages = [{include = "test_poetry_torch"}]

[tool.poetry.dependencies]
python = ">=3.10,<3.11"
torch = "^1.13.1"
torchvision = "^0.14.1"
torchaudio = "^0.13.1"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```