OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】fetch時に常にpruneするようにする方法

## `git pull --prune`, `git fetch --prune`

`git pull --prune`や`git fetch --prune`を実行すると削除済みのリモートブランチの追跡ブランチを削除できます。  

```terminal
git pull --prune
```
```terminal
git fetch --prune
```

https://git-scm.com/docs/git-pull#Documentation/git-pull.txt---prune

https://git-scm.com/docs/git-fetch#Documentation/git-fetch.txt---prune

## 常に`--prune`する

`git pull`や`git fetch`の際に常に`prune`するには以下のコマンドを実行してGitの設定を追加します。  

```terminal
git config --global fetch.prune true
```

現在のリポジトリのみに設定するには以下のコマンドを実行します。  

```terminal
git config --local fetch.prune true
```
Anacondaで「Exit code: 1」となった場合の代替案について

# 前提条件
* Windows 10
* Anaconda3-2023.03-1
* Anaconda Navigator 2.4
* Python 3.10.9
* Spyder IDE 5.4.1

Anacondaの公式ドキュメントは下記です。
https://docs.anaconda.com/

# 目的
「Anaconda」のホーム画面から「Spyder」のアイコン下の「Launch」をクリックして、 「Spyder」を起動しようとしたところ、Application launch error「Exit code: 1」が表示された。しかしながら、「Spyder」は起動したい。

![Application launch error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/c9838a81-3455-c675-0dff-1047f90e0d35.png)

根本解決はできなかったが、代替案を見つけたので、以下に示す。

# 代替案
Anaconda3は「C:\anaconda3」にあるとして、話を進める。
代替案は「Spyder」を直接起動することで目的を果たせた。

# 「Spyder」の直接起動方法
```
C:\anaconda3\Scripts\spyder.exe
```

# きっかけ
「Spyder」が起動できず、困りました。似たような状況で困っている人の参考になればと思って書きました。

# 根本解決
下記を参考にAnacondaの全パッケージをアップデートすることで、解決しました。
```
C:\anaconda3\Scripts\conda update --all
```

https://qiita.com/kerobot/items/917dc7027e15f5ff75ac

# 参考資料
https://amzn.to/3WPzxr4
ABC303

初投稿ですが、atcoder緑目指して反省等を今後不定期でつぶやこうかと思います。本日はABC303( https://atcoder.jp/contests/abc303 )。

# A
特になし。2,3番目のルールを配列にまとめて検索することで、コードの簡略化したくらい。

# B
辞書式配列に一通りの組み合わせを入れたものを用意し、隣り合った場合その数字を削除した。
同じ組ができないように小さいほうの数字がkeyとなるように配列を生成。
最後にそれぞれのkeyの要素数を足し合わせることで隣り合ってない組の総数を求めた。

その他、copyを使って参照元が被らないようにした。

# C
TLEとなり解けず。
操作自体は問題通り行ったが、アイテムの位置座標を二次元配列に格納し、検索を行った結果時間がかかりすぎた。
解説を参考に、x座標をkeyとし、それに対応したy座標を配列として格納した辞書式配列を用意し段階的な検索を行ったところ、問題なく実行できた。

座標など複数をまとめて二次元配列で検索するよりも、辞書式配列を用いて段階的な検索を行う方がより効率的。

# D
WAとなり解けず。
同じ文字の連なりごとにまとめて計算したが、条件によっては最短時間を求められない。
解説を参考に、DPを使ったところ全問正解となった。
各文字ごとの処理方法は4通りあり、前の状態(CapsLockのon/off)と次の状態がそれぞれ2通りずつあり、各遷移によって必要な処理時間を次の状態ごとに求め、最小値を格納する。それを次ループの前状態として流用しDPを行っていく。

問題から複雑だと考え、状態が爆発すると考えDPを選択肢から外してしまっていた。Capslockのon/offの2状態しかないことに着目すれば、n文字目までの遷移はその後の遷移に関与しないことに気づけなかった。

# 反省・感想
結構レート減ったのでモチベ下がりました。特に検索の計算量について把握していればCは解けたのが悔しすぎます。
ただ、C、Dから検索の時間効率やDPの運用法など学ぶ点も多い回だったと思います。特にDPは次回参加時にもう一度チャレンジさせてほしい・・・。
6月も無理ないタイミングで参加したいと思います。

現在レート:781 → 745
laravel10 & chatgpt連携Webアプリ作ってみた。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。

最近色々活用し始めているchatgptに関するAPI活用したアプリを作成してみました。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

macを使用してscode+git環境を作り、
docker-composeを使用して立ち上げるものになります。

必要なソースは以下にまとめてあります。

dockerソース(php8.2ブランチ)

https://github.com/naritomo08/laravel_docker

chatgptAPI連携アプリソース

https://github.com/naritomo08/laravel_gpt_public

## 参考URL

[Elixirをdocker環境で立ち上げてみる。](https://qiita.com/naritomo08/items/fecf4ace7b9ca9078102)
→このサイトを使用してdockerベースを作成しています。

[LaravelとChatGPT APIの強力コラボ！関連データ検索がこれで簡単・効率的になる！](https://blog.capilano-fw.com/?p=11642#i-8)
→本サイトを参考にdocker版を作成してみました。公開ありがとうございます。
　　

## 事前準備

mac+DockerCompose+vscodeでの環境を構築してること。

参考URL２つ目を参考にchatgpt APIキーを入手していること。

## 環境構築手順

### 本リポジトリをクローンする。

```bash
$ git clone -b php8.2 https://github.com/naritomo08/laravel_docker.git laraveldocker
$ cd laraveldocker
$ git clone https://github.com/naritomo08/laravel_gpt_public.git backend
```

後にファイル編集などをして、git通知が煩わしいときは
作成したそれぞれのフォルダで以下のコマンドを入れる。

```bash
 rm -rf .git
```

### APIキーを登録する。

```bash
 vi env.example

OPENAI_API_KEY=
→APIキーを追記する。
```

### 環境構築用のシェルスクリプトを実行する。

```bash
$ chmod u+x build_env.sh && ./build_env.sh
```

### DBデータの初期投入を実施する。

```bash
docker-compose exec laravel_php /bin/bash
cd project
php artisan migrate:fresh --seed
```

### フロントソースビルドの実施

```bash
npm run dev
```

### 各種サイトを確認する。

## サイトURL

### laravel

http://127.0.0.1:8080/article

→検索キーワードにピアノを入力し、GPTによる関連キーワード出力結果とDB入力データが出ること。

### adminer(DB管理ツール)

http://127.0.0.1:8081


* ログイン情報
  - サーバ: laravel_db
  - ユーザ名: laravel
  - パスワード: password
  - データベース: laravel

### mailhog(メールサーバ)

http://127.0.0.1:8025


## コンテナ起動する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose up -d
```

## コンテナ停止する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose stop
```

## コンテナ削除する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose down
```

## 起動中のコンテナに入る

### PHPコンテナ

```bash
$ docker-compose exec laravel_php /bin/bash
```

### DBコンテナ

```bash
$ docker-compose exec laravel_db /bin/bash
```

# おわりに

本アプリを作成したときのノウハウを元にアプリ領域への理解を
深めていきたいと思います。
Mac(M2)でのHomebrewインストール手順

初投稿です。

先月、新しくM2のMac Miniを購入し、PHPを使用できるようにするため環境構築を行なっていた所、Homebrewインストールでエラーが表示されました。（`zsh: command not found: brew`）
今回はM2チップ搭載のMacでのHomebrewインストール手順とM2ならではの躓いた点を紹介したいと思います。もし、Homebrewがインストールできない方は以下の方法を試してみて下さい。

## Homebrewをインストール
まず、Homebrewをインストールするために、下記のHomebrewサイトを開き、記載されている下記のコマンドをコピーします。
[Homebrew](https://brew.sh/index_ja)

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

次にSpotlightからターミナルを開き、コピーしたコマンドを実行します。
コマンドの実行が完了したため、問題なくHomebrewがインストールされているか確認するために、下記のコマンドを実行します。

```java:title
brew -v  
```

インストールが問題ない場合、`Homebrew 4.0.19`という風にHomebrewのバージョンが表示されるところ、エラー:`zsh: command not found: brew`が表示されました。

調べたところ、AppleCPUの場合、ターミナルをRoseetaを使用して開く設定が必要とのことでした。

## ターミナルをRoseetaを使用して開くように設定する
①画面下部に表示されているターミナルを右クリックし、オプションのFinderに表示をクリック

②Finderのターミナルを右クリックし、情報を見るをクリック

③Roseetaを使用して開くにチェックをつける（下記画像参照）
![スクリーンショット 2023-05-27 23.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958368/61dc922b-ccef-0cec-07f0-517120b95db1.png)

以上で設定は完了したため、ターミナルを再起動します。

## 再度Homebrewをインストール

ターミナルを再起動した後、もう一度ターミナルからHomebrewをインストールします。

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

最後に下記コマンドで、Homebrewが正常にインストールできているか確認し、バージョン情報が表示されれば成功です。

```java:title
brew -v  
```

以上がAppleCPUでのHomebrewインストール手順になります。
もし一人でも参考になる方がいれば幸いです。
【Kloudハッカソン #2】いい意味でウザいアプリを作ってW受賞した話

# はじめに
先日行われた「Kloudハッカソン #2」に3人のチームで参加しました。
チーム結成から発表までの開発の流れをここに残しておきます。
技術的なことはあまり書いていません。(もしかしたら後日書くかもしれません)

# チームを組む
先輩から「ハッカソン出て～」とのお誘いをいただき参加を決意。しかしチームを先に集める必要があるようなので、せっかくなら同じクラスの人と出てみたいと思い誘いまくりました。


```text:集まったゆかいななかまたち
Aさん
Bさん
ぼく
```

# 何作るか決める
アイデアってハッカソンで大事ですよね。もしかしたらここが一番重要なのかもしれません。
アイデアが出たときの思考の流れを書いておきます。
テーマは「日常を楽しく」です。
```
日常→毎日してること→プログラミング→プログラミングで楽しくないこと
```
プログラミングで楽しくないことを考えると
- 孤独を感じる
- ビルド(コンパイル)の待ち時間が暇

などが思いつきました。
そこから「エディタと連携してデスクトップ上を動き回る何か」を作ればいいのでは！？となり「エディタと連携してデスクトップ上を動き回る何か」の開発が始まりました。
## 言語＆フレームワークどうしよう
デスクトップアプリを作る上では様々な選択肢があるとは思いますが、テックリードとして僕が教えたりトラブル対応がしやすい & IntelliJ IDEAプラグインと連携しやすいKotlinの[JetBrains/compose-multiplatform](https://github.com/JetBrains/compose-multiplatform)を使用することにしました。(今思えば文献が少ないため悪い選択だったかも)

# キャラを決める
動き回る何かということでキャラクターが欲しいですね。どんなのにしようか考えていると僕がとあるDiscord Botを作ったことを思い出しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357553/4bfdc4b3-361d-2674-9ca3-adbf2d8c3069.png)
これがそのBotです。アイコンには僕が30秒くらいで書いたとてもかわいい謎のキャラがいます。
このキャラを提案したところAさんがよりかわいく書き直してくれました。
この際、走るときに右手と右足の両方が前に出ているのはおかしいのではないかとの指摘を受け、僕は「確かに！！！」と思いました。しかし、かわいいのでそのままになりました。

# 開発開始！
同じクラスにチームメンバーが集まっているので授業後の時間に集まって作る内容を相談し合ったり、KotlinやComposeについて教えていたりしました。というか教えるってやっぱり難しいですね。でも僕が十分に説明できなかったところも積極的に調べたりしてくれたので思った数倍スムーズに開発が進みました。超感謝です。

そして、やっぱり絵は動いたほうがいいよねということでAさんがなんとアニメーションにしてくれました！

![chiiugo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357553/f44f1b0f-c90a-1350-4e03-1e347d740196.gif)

感動ですね。動いています。

ほかにも開発していく中でアイデアはたくさん出てきて、最終的な機能はこんな感じになりました。
- デスクトップ上を動く
- ゲーミングになる(色が変わる)
- セリフを喋る
- ビルド失敗したら爆発
- エディタで入力した文字に反応
- コーディング時間を記録(統計機能)
- アプリを閉じにくくする

動く機能の実装やセリフの考案はBさんがやってくれました。

アプリ名は「**ちぃうご** ～なんかちぃさくてうごいてるやつ～」に決定し、一週間ほど教室やDiscordのVCで話しながら開発を続けました。

# 発表日
ついに発表日。
僕は自然に7時頃目が覚めました。(4時間睡眠)
おはようございますnaotikiさん。
ではここで残りの仕事を見てみましょう。
- 統計機能(進捗無し)
    - コーディング時間記録
    - 一週間ごとの時間のグラフ表示
- パワポ資料(50%くらいしか進んでいない、台本もデモ動画もまだ)

**うわぁぁぁぁぁぁぁぁあああああ！！！！！**
7:14 起床 
↓
10:38 統計機能実装
↓
12:50 資料完成

間に合いました。よくやった僕。

## できたもの
<iframe width="720" height="450" src="https://www.youtube.com/embed/DOHeNfu2HlE" title="Chiiugo Demo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 他のチームの発表を聞いて
どれも自分は思いつかないようなアプリでとてもおもしろかったです。これ欲しい！と思ったアプリが沢山ありました。
## ついに発表！
少しミスした部分もありましたが無事にやりきりました。頂いた指摘はとても参考になりました。
終わった後は参加者のチャットを少し眺めていました。予想以上に好反応を頂きとても嬉しかったです。
## 授賞式
参加者投票賞を頂きました。多くの人に欲しい(?)と思っていただけたと思うととても嬉しかったです。

その後・・・

なんと最優秀賞も頂きました！！
W受賞はさすがに予想外すぎてなかなかコメントも出てきませんでした。


# おわり
やっぱりハッカソンって開発から発表まで全部超楽しいなと思いました。
孤独なプログラマを救うべくこれからも開発していこうと思います。

参加者、運営及び審査員の皆様そしてなによりチームメンバーのAさん、Bさん 本当にお疲れ様でした。

近日ちぃうごは公開する予定です。お楽しみに！

リポジトリ

https://github.com/naotiki/chiiugo

後日作り始めたVSCode拡張

https://github.com/naotiki/chiiugo-vsc-extension
統計検定勉強個人的メモ

# 統計数理
**独立**
・独立な例：A:コインを投げて表の確率、B:さいころを投げて偶数の確率
・独立でない例：袋に1, 2, 3と書かれた玉がある。A→Bの順で球を引く（球は戻さない）。A：Aが偶数を引く確率。B：Bが偶数を引く確率。
```math
A\perp Bなら
\\\
P(A\cap B)=P(A)P(B)
\\\
又、A\perp \overline{B}
\\\
\\\
A\perp B\perp Cなら
\\\
P(A\cap B\cap C)=P(A)P(B)P(C)
```

# 統計数理メモ
**二変数の包含関係①**
```math
P(A\cap B)=P(B)-P(B\cap \overline{A})
```
**二変数の包含関係②**
```math
max\{0, P(A) + P(B) - 1\} \leq P(A\cap B) \leq min\{P(A), P(B)\}
```
A=Bの時が一番でかい。AとBで全部覆えないなら、限界まで離せば0。覆えてしまうなら、限界まで引き離して残ったところが重なってるところ。

**二変数の累積確率分布**
```math
f(x) = \int_{-\infty}^{\infty}f(x, y)dy \\
F(x) = \int_{-\infty}^{x}f(x')dx' \\
F(x, y) = \int_{-\infty}^{x}\int_{-\infty}^{y}f(x', y')dy'dx' \\
F(x) = F(x, y=\infty) = \int_{-\infty}^{x}\int_{-\infty}^{\infty}f(x', y')dy'dx' \\
```
累積確率分布の周辺化は、周辺化したい方の変数をmaxにする。

**共分散**
```math
Cov(X, Y) = \int \int (X -E(X))(Y -E(X))f(X, Y)dxdy \\
= E((X-E(X))(Y-E(Y)) \\
```

**分散**
```math
V(X) =  E((X-E(X))^2)\\
= E(X^2) - E(X)^2 \\
V(X+Y) = V(X) + V(Y) + 2Cov(X, Y)
```

**相関係数**
```math
R(X, Y) =  \frac{Cov(X, Y)}{\sqrt{V(X)V(Y)}}
```

**ポアソン分布**
ある時間の中で平均$\lambda$回発生する事象が、同様の時間のなかで$k$回発生する確率。
電話が平均10分で5回なる場合、10分でk回なる確率は$\lambda=5$のポアソン分布
```math
P(X=k)=\frac{\lambda^ke^k}{k!}
```
期待値は$\lambda$。普通に考えて、平均で$\lambda$回起きるんだから、そうなる。
```math
E[X]=\lambda
```
$e^x=\Sigma_{n=0}^{\infty}\frac{x^n}{n!}$を使う。

分散も$\lambda$

**ガンマ分布**
所与の時間（例$\lambda$年）の間に1回起きることが、実際におきるまでにかかる時間。

**条件付き期待値**
```math
E[X|Y=y] \\
= \int_x x P(X|Y=y) \\
=\int_x x \frac{P(X, Y=y)}{P(Y=y)}
```
又、
```math
E_X[X] =E_Y[E_X[X|Y]]
```
つまり、Xの期待値はY=yの時のXの期待値をyの式で表し、y=E[Y]にしたもの、ということ。

**条件付き分散**
```math
V[X|Y=y] = E[X^2|Y=y] - E[X|Y]^2
```
又、
```math
V_X[X]=E_Y[V[X|Y]]+V_Y[E[X|Y]]
```
つまり、Xの分散はXの分散をyで表したときに、yに期待値を入れたもの足す、Xの期待値をyで表したもののyの分散になる。()

**モーメント法**
原点周りのn次のモーメントは以下になる。
```math
\mu_n=\int x^nP(X=x|\theta)dx \\
n=1, 2, 3, ...
```
つまり原点周りの1次のモーメント($\mu_1$)は期待値である。また、期待値周りのn次のモーメントは以下になる
```math
\mu'_n=\int (x-\mu_1)^nP(X=x|\theta)dx \\
n=1, 2, 3, ...
```
つまり期待値周りの2次のモーメント($\mu'_2$)は分散である。
[Ansible] packageモジュールを利用する際のLinuxディストリビューション違いに伴うパッケージ名の差異問題を回避してみる

Ansibleのpackageモジュール、ディストリビューションに依存しないパッケージインストールが可能になるが、ディストリビューション違いに伴うパッケージ名の差異は吸収してくれないので回避策を考えてみる



```yaml
    - name: install virtualenv
      ansible.builtin.package:
        name: "{{ virtualenv_pkg_name[ansible_distribution] }}"
        state: present
      vars:
        virtualenv_pkg_name:
          CentOS: python-virtualenv
          Ubuntu: python3-virtualenv
```

 - set_fact で`ansible_distribution `を取得
 - `ansible_distribution`の値がKeyになるように辞書を作成
 - 辞書のキー指定に変数を利用してディストリビューションによって返す値が変えられるようになる
macOS上で，homebrew や macportを使わずにgccをインストールしたい．The method to install gcc without homebrew or macport

macOS上で，`homebrew` や `macport`を使わずに`gcc`をインストールしたい．

:::note info
#### 追記（2023-June-18）
ここで述べる方法はIntelプロセッサにしか対応していないらしい．
M1&M2チップに対してはパッチを処方する必要があるらしく，現状そのパッチもプロトタイプしか公開されていないとのことなので，ここでは述べないことにする．
:::


## 1.ミラーサイトでtar.gzファイルをダウンロードする．
ここでは[tsukuba server](http://ftp.tsukuba.wide.ad.jp/software/gcc/ "tsukuba server")からのダウンロードを想定する（多分どこのサーバーでも同じ）．releasesに入り，欲しいバージョンを選択し，tar.gzファイルをダウンロードする．`tar.gzファイル`の保存先はどこでも良いが，アクセスしやすい場所（デスクトップなど）に置くのが良い．

以降は，`gcc-12.2.0.tar.gz`を，`デスクトップ`に保存したとして，インストールの過程を述べる．
`gcc-12.2.0.tar.gz`は展開しておく（ダブルクリックでできる）．

## 2. Terminal上で必要なものをインストールする
### 2.1 Terminalを起動し，`gcc-12.2.0`へ移動する．
```
> cd ~/Desktop/gcc-12.2.0
```
### 2.2 prerequisites のダウンロード
```
> contrib/download_prerequisites
```
うまくいくと，以下のような表示が出る：
```
	gmp-6.2.1.tar.bz2: OK
	mpfr-4.1.0.tar.bz2: OK
	mpc-1.2.1.tar.gz: OK
	isl-0.24.tar.bz2: OK
	All prerequisites downloaded successfully.
```
## 3. gcc のインストール
### 3.1 `build`フォルダを作成し，その中でインストール作業を行わせる：
```
> mkdir build && cd build
```
### 3.2 configure をまわす：
ここでは，gccのディレクトリは`usr/local/gcc`に保存することにする．
場所を変えたい場合は，`prefix=`の値を自身の望む保存先に指定すれば良い．
```
> ../configure --prefix=/usr/local/gcc --enable-languages=all
```

:::note info
#### 追記
Big Sur(Mac OS 11.7.4)で試した場合（というより，CommandLineToolsをインストールしているか否かが問題の気がする），gccのインストールがうまくいかなかった．以下のように`../configure`のオプションを書き換えたらうまくいった：
```
> ../configure --prefix=/usr/local/gcc --enable-languages=all --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
```
:::

### 3.3 make & install
```
> make -j 4
> sudo make install
```
`sudo make install`の代わりに`sudo make install-strip`を試したが，うまくいかなかった．理由はよくわからない．

## 4. CHECK
gccがインストールできているかどうかをしらべる．
Terminalを再起動し，以下のコマンドを叩く：
```
> cd /usr/local/gcc/bin && ls
```
これで`gcc`,`g++`などのUnixコマンドが表示されればヨシ．

## 5. PATHを通す．
`PATH`を通す方法は二通りある．ひとつ目は，自身が使うコマンドだけシンボリックリンクで`/usr/local/bin`にショートカットを置く．ふたつ目は，`/usr/local/gcc/bin`の`PATH`を登録する．
後者の方がまとめてできるので，こちらの方法のみ書く．
### `/usr/local/gcc/bin`の`PATH`を登録する．
ここでは，閲覧者がTerminal 上で`zsh`を用いていることを想定する（そうでなければ多分`bash`）.

1.　`/etc/zshrc`をデスクトップに複製する．
2.　デスクトップ上のzshrcを開き，編集可能にする．
3.　`zshrc`の最後の行に，`export PATH=/usr/local/gcc/bin:$PATH`を追加する．
4.　`/etc/zshrc`（はじめからあるヤツ）を，`/etc/zshrc_original`とかに名前を変えておく．
5.　デスクトップにある`zshrc`を`/etc`に保存する．
6.　Terminal を再起動する．

多分これで終わり．


「いかがだったでしょうか？」
AWS Certified CLF, SAA, SOA, DVA 4冠しました！！

こんにちは。yuzu_juiceです🥂
先日、AWS Developer Associate試験に無事合格できました！
これで、CLF + Associate3冠達成できました！やった！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086592/140073f7-c761-19b3-164f-1b250e8241c8.png)

# 試験を振り返って
## 受けた順番
**CLF->SAA->SOA->DVA**の順番で受験しました。

取得日は、以下の通り。
CLF: 2023年2月
SAA: 2023年2月
SOA: 2023年4月
DVA: 2023年5月

## かかったお金
「できるだけお金をかけずに資格を取る」ことを目標としていたので、どの試験も、公式のサンプル問題と公式の模擬試験を中心に勉強をしました。
そういう観点では、だいぶ安く資格を取れたのではないかと思います。

CLF : AWS Summit Onlineに参加したため、無料で受験できました。
SAA : CLFに受かったときにもらえた半額チケットを使い、8,250円でした。
SOA : SAAに受かったときにもらえた半額チケットを使い、8,250円でした。
DVA : SOAに受かったときにもらえた半額チケットを使い、8,250円でした。

問題集などは一切買っていないため、テキスト代は0円です。

結局CLF+Associate3冠にかかったお金は、**24,750円**となりました。
ただ、問題集を買わずに受験するのはだいぶリスキーなので、問題集は買ったほうが良いと思います。
(実際、どの試験も合格ラインぎりぎりの合格でした…)

## 各試験について
1. CLF
受験者のIT知識レベルにもよりますが、CLFは最初に受けたほうがよいです。
勉強法：問題集やインターネット記事を読んでいて、知らないサービス名を見つけたらひたすらググって理解しました。
感想：AWS(というかクラウド全般)の基本的な考え方が身に付き、その後のクラウド人生の大きな一歩目になるような気がします。

2. SAA
AWS上の主要サービスを一通り触ったことがある、くらいの人が受けるレベル感でした。
勉強法：インターネット上やKindle Unlimitedで無料の問題集やテキストがたくさんある印象です。なので、学習にかかるコストは小さく、学習もしやすいと思います。
感想：SAAを勉強していくうちに、AWS楽しい！！ってなり始めました。

3. SOA
SAAで学んだことをベースに、主にCloud WatchやCloud Trailを重点的に勉強しました。
勉強法：モニタリング系サービスを用いたトラブルシューティングなど、運用側を重点的に勉強しました。
感想：SOAの勉強を通じて、やっとCloud WatchとCloud Trailの違いを理解できた。よかった。

4. DVA
SAAとSOAの知識があれば、DVAはそれほど難しくないと想定の下、一番最後に受験しました。
勉強法：AWS上でCI/CD環境を構築し、Cognitoを使った認証付きアプリの開発をしました。
感想：試験の対象範囲は、私の感覚だとAssociate3種の中で一番狭いと思います。

# 今後
もう正直やり切った感あります（笑）
が、もちろん、12冠を目指してがんばります！

これからも、AWSを楽しみます！
【ポエム】ABC303参加記

# [A - Similar String](https://atcoder.jp/contests/abc303/tasks/abc303_a)

やるだけ
- だが、あんまり早く解けなかった気がする
- こういう問題は条件式まみれになりがちだが、Pythonのin文を使えたのはよかった

# [B - Discord](https://atcoder.jp/contests/abc303/tasks/abc303_b)

実際に横に並んだ実績のある2人を「確実に不仲ではない」リストに入れる
- 全体からその数を引けばよい
- - $ (x,y)$のタプルをkeyにした辞書に入れる。ただし$ x<y $にする
- だが、全体の数$ \frac{N ^ 2 - N}{2} $を求めるのに妙に手こずってしまった

# [C - Dash](https://atcoder.jp/contests/abc303/tasks/abc303_c)

問題文を良く読んでシミュレーションするタイプの問題
- 先入観から、2次元DP？とか勘ぐってしまい、問題を読むことに集中できなかった
- - そのせいで結構な時間をとられてしまった
- ```x,y = 0,0```の書き忘れで1ペナ

# [D - Shift vs. CapsLock](https://atcoder.jp/contests/abc303/tasks/abc303_d)

教科書のようなDP
- 感想だけ
- - 私が書くより明快な解説がネットにあるはずなので
- なんでこんな典型的なものが解けないのかと唸っていた
- 前処理でfilterとmapを間違える凡ミスをかまし時間ロス
- 紙で考察するのって大事だね

# [E - A Gift From the Stars](https://atcoder.jp/contests/abc303/tasks/abc303_e)

解けなかったが、解説をまだ読んでいない
- コンテスト中にした考察をそのまま乗せる
- おそらく間違っているため参考にしてはならない
- - 点$n \in T$について、$k \:= \deg n$（kをnの次数とおく）
- - - $k = 1$ならば、高橋くんの操作前においても$\deg n = 1$である。
- - - $k \ge 3$ならば、高橋くんの操作前においても$\deg n = k$である。また、点$n$は操作前において星の<ruby><rb>中心</rb><rp>(</rp><rt>center</rt><rp>)</rp></ruby>である。
- - よって、$k \ge 3$である$k$-starを消すことができる
- - 消した後には次数が高々2の点が残る
- - - UnionFindで繋がった頂点数を数えれば$2$-starの数が分かる
- - - 消した星と一緒に標準出力に投げる

双方向のグラフの扱いに習熟するべき？
- A~Dにも言えることだが、実装に時間がとられ、本質がよく分からなかった

# 総括
![スクリーンショット 2023-05-27 23.20.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210433/1712a9aa-19a8-e93b-ed62-bc655581b9b1.png)
![スクリーンショット 2023-05-27 23.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210433/49416b25-6a6f-a27e-8dcb-745589bce2f9.png)

たすけて〜〜〜〜という感じ
- 精進あるのみ

# 余談

[Background Phi Colors](https://qiita.com/wraith13/items/5da436536d6a98bd8924)なる拡張機能を入れてみた
- プログラミングしてる感が出てよい
- が、自分の好みに合わない部分がある
- - 選択行と関連するトークンを着色する機能は過剰に感じた
- - デフォルトの「選択部分と同一文書をハイライトする」機能で十分かも
- そのため、backgroundPhiColors.tokenModeをnoneに設定した
- コード中で定義されている変数だけハイライトしてくれる拡張機能があったら欲しい

Blockman - Highlight Nested Code Blocksなる拡張機能を入れてみた
- 作者のLevan Katsadze氏のページを貼っておく
- 見た目は面白かった
- - 必要なのかは分からない
- - が、あまり過剰ではないので残しておく

https://leodevbro.github.io/
【Paiza問題集】標準出力/出力幅を指定して出力

# Paiza問題集
Pythonで回答

## 標準出力/出力幅を指定して出力

### Step01 数値を半角スペース埋めで出力
```Python:Step01
"""
数値を半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step1
"""

# 3桁になるように数値を表示
print(f'{input():>3}')
```

### Step02 数値をゼロ埋めで出力
```Python:Step02
"""
数値をゼロ埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step2
"""

# 3桁になるように数値を表示
print(f'{input():0>3}')
```

### Step03 複数の数値を半角スペース埋めで出力
```Python:Step03
"""
複数の数値を半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step3
"""

# 複数の数値を表示
for i in range(int(input())):
    print(f'{input():>3}')
```

### Step04 数値をMけた半角スペース埋めで出力
```Python:Step04
"""
数値をMけた半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step4
"""

# 数値をM桁で表示
N, M = map(int, input().split(' '))
print(f'{N:>{M}}')
```

### Final問題 【出力幅を指定して出力】N個の数値をMけた半角スペース埋めで出力
```Python:Final問題
"""
【出力幅を指定して出力】N個の数値をMけた半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_boss
"""

# N個の数値とM桁を取得
N, M = map(int, input().split(' '))

# 数値をM桁でN回表示
for i in range(N):
    print(f'{input():>{M}}')
```
rex0220 アプリ集計プラグイン テーブル初期設定

[rex0220 アプリ集計プラグイン](https://qiita.com/rex0220/items/9a6996d46e199c83289d)で、レコード追加時のテーブル初期設定を行います。
また項目の切り替えで、異なるテーブル初期設定を行います。
いろいろな値毎に、テーブルの初期値を変えることができます。

# 概要

テーブル初期値を持つアプリを用意して、レコード追加時にアプリ集計プラグインで取得・設定を行います。
またセット番号の切り替えで、テーブルを再設定します。

![2023-05-27_20h54_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a81a9aa4-728a-1f42-02ec-2982dae9fbf0.png)

# 操作例

![2023-05-27_21h03_41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c9238f5a-8947-4466-7521-302b0c70ae1e.gif)

# テーブルコピー元アプリの作成

アプリを複製して、テーブル初期データを持つレコードを用意します。
![2023-05-27_21h09_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/10dd077e-a4c2-053d-9801-842491c15f70.png)

# アプリ集計プラグイン設定

![2023-05-27_22h44_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f1d8c2f7-8d50-9152-48b7-f9a087a9e172.png)

## 自動・ボタン別設定
「追加：画面表示時」、「編集：自動アプリ集計」をチェックします。

- 追加：画面表示時：　レコード追加画面で集計処理を実施
- 編集：自動アプリ集計：　対象アプリ条件に指定された項目が変更された場合、集計処理を実施

![2023-05-27_22h49_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/141d09e7-bd0a-866a-1412-a39847aca25a.png)


## 対象アプリ条件
![2023-05-27_22h45_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cde02e66-236a-007a-88eb-ee94d1ad4903.png)

## 集計項目
![2023-05-27_22h46_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a1064759-bc60-6403-883d-d01029a5ba12.png)

## テーブル項目
初期設定するテーブルを選択
フィールドコードが同じ場合、「自動設定」で計算式を設定できます。
![2023-05-27_22h47_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7d9e3ccd-25c6-03c2-e91a-601249cff775.png)
[AWS Q&A 365][SNS]AWSのよくある問題の毎日5選 #68

# 1. Amazon SNSにおけるA2Aメッセージングとは何ですか？
Amazon SNSにおけるA2Aメッセージングは、SNSをメッセージングサービスとして使用し、2つ以上のアプリケーション間でメッセージを送信するプロセスを指します。

# 2. Amazon SNSがサポートするA2Aメッセージングの種類は何ですか？
Amazon SNSは、Kinesis Data Firehose配信ストリームへのファンアウト、Lambda関数へのファンアウト、Amazon SQSキューへのファンアウト、HTTP/Sエンドポイントへのファンアウトを含む、さまざまな種類のA2Aメッセージングをサポートしています。

# 3. A2AメッセージングでのKinesis Data Firehose配信ストリームへのファンアウトはどのように機能しますか？
Kinesis Data Firehose配信ストリームへのファンアウトでは、SNSトピックに公開されたメッセージがKinesis Data Firehose配信ストリームに配信されます。そこから、データは変換され、Amazon S3、Amazon Redshift、またはElasticsearchなどの他のシステムにロードされます。

# 4. A2Aメッセージングでモバイルプッシュ通知を送信するプロセスは何ですか？
A2Aメッセージングでは、モバイルアプリを設定し、プッシュ通知のためのプラットフォームエンドポイントを作成し、モバイルプッシュAPIアクションを使用して通知を送信することで、モバイルプッシュ通知を送信することができます。

# 5. Amazon SNSにおけるA2Aメッセージングのベストプラクティスは何ですか？
Amazon SNSにおけるA2Aメッセージングのベストプラクティスには、メッセージが必要な受信者だけに送信されることを確認する、適切なメッセージ形式を使用する、メッセージの配信とエラー率を監視する、などがあります。また、機密データを保護するために暗号化とアクセス制御手段を使用することも推奨されています。
[AWS Q&A 365][SNS]Daily Five Common Questions #68

# 1. What are FIFO topics in Amazon SNS? 
Answer: FIFO topics in Amazon SNS are those topics that provide strict message ordering and deduplication of messages. These topics ensure that the order in which messages are sent is the same order in which they are received by the subscribers. 

# 2. Why is message ordering important in FIFO topics? 
Answer: Message ordering is important in FIFO topics because it ensures that the messages are processed in the order they were sent. This is particularly important for applications that require strict ordering of messages, such as financial applications or stock trading systems. 

# 3. How does Amazon SNS ensure message deduplication in FIFO topics? 
Answer: Amazon SNS ensures message deduplication in FIFO topics by assigning a unique message deduplication ID to each message. This ID is used to identify and discard duplicate messages before they are delivered to subscribers. 

# 4. Can non-FIFO topics provide message ordering and deduplication? 
Answer: No, non-FIFO topics in Amazon SNS do not provide message ordering and deduplication. Only FIFO topics provide strict message ordering and deduplication of messages. 

# 5. What is the difference between message grouping and message filtering in FIFO topics? 
Answer: Message grouping is a feature of FIFO topics that allows messages to be grouped together based on a common attribute. This ensures that messages with the same attribute value are processed in the order they were sent. Message filtering, on the other hand, allows subscribers to filter messages based on a set of attributes. This ensures that subscribers only receive messages that match their filtering criteria.
要素にまとめてstyleを追加、変更

今まで使ってたのは
```js
div.style.color = 'cyan'
div.style.fontSize = '14px'
```
一つずつ ``` div.style ```の続きを変えてたけど
```js
div.setAttribute('style','color:cyan','font-size:14px')
```
``` element.setAttribute ```を使って一括で、cssに近い形でstyleを書ける
```html
<div style = 'color:cyan;font-size:14px'> </div>
```
つまりこうなる


追記
style.cssTextってものがあるらしい
なにそれ便利すぎるでしょ

https://developer.mozilla.org/ja/docs/Web/API/CSSStyleDeclaration/cssText
WSL2 へポートフォワーディングする方法

DOSプロンプトを管理者権限で実行します。

### ホスト側のポートをWSL2側のポートへ転送する設定
```dos
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=[WSL2のIPアドレス]
```

#### その確認

```dos
netsh interface portproxy show all
```

<details>

```dos
netsh interface portproxy show all

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         8080        172.xxx.xxx.xxx 8080
```

</details>

### ポート転送設定を削除する方法

#### ポート転送設定を確認

```dos
netsh interface portproxy show all
```

<details>

```dos
netsh interface portproxy show all

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         8080        172.xxx.xxx.xxx 8080
```

</details>

#### ポート転送設定を削除

```dos
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0
```

#### 削除結果の確認

```dos
netsh interface portproxy show all
```

<details>

```
```

</details>
タグで管理するToDoアプリが完成するまで

# はじめに
こんにちわ、nkitaoと申します。
35歳にして、急に個人開発に目覚めた漫画、ゲーム好きの社内SEです。
この年齢で今から個人開発？？なんて、今さら感がすごくあるのですが、趣味や何かに没頭することに年齢なんて関係ないよね！

個人開発歴は１年未満のほぼ素人ですが、個人開発したもの、していくものを綴っていきたいと思います！

# 作っているもの
[TagToDo（モック）](https://nkita.github.io/todo-tutorial/mock)
![tagtodo_mock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237628/556602a4-cade-144c-4bea-869a1d5817ef.png)
github pagesで開発中のものを公開しています。

## 何ができるのか
* ToDoをTagと一緒に管理するアプリ
* URLさえ知っていればどこでも同じToDoを開ける（未実装、これから）
* スマホ対応のデザイン（未実装、これから）

## なぜ作ろうと思ったのか
前回[ガントチャートツール](https://qiita.com/nkitao/items/cd70fc8f0fbc0983ec69)を作成してみてすごく楽しかったので、別のツールも作りたいと思った。
ToDoアプリも巷にたくさんあふれているけど、Tagと一緒に使いやすいToDoを見つけられなかったので作ってみようと思った！
とにかくじゃんじゃんToDoをつっこんであとからTagで整理できたらいいなぁ。ってね！

あと、Next.jsやchakra-uiも使ってみたいという思いもありました。


## 開発概要
### 言語
* TypeScript 
### ライブラリ
* [Next.js](https://github.com/rsuite/rsuite)
* [Chakra-UI](https://github.com/MaTeMaTuK/gantt-task-react)
大変お世話になったライブラリたちです。
超リスペクトです。

## 最後に

まずはモックを作ってイメージつかんでから、次のステップに進もうと思っていたら
なんだか、満足してしまった。
困った。


Next.js13.4でapp directoryが安定版になったー！
さあ、今のモックも作り直そうかな！！楽しみ！！orz
java Scanner 表示異常

# **Java Scanner Delimiter**
- 異常表示
サンプルコードを引張ってきて実行したらサンプルの結果と違う！
useDelimiterも一度指定すると指定文字以外（デフォルトの区切り文字”　”,”\n”）が解除されてしまう


```java:Scanner.java
public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in).useDelimiter(",|\n");;
        
        System.out.println("何か入力してください。");
        String str = scanner.next();
        System.out.println("入力した文字列は " + str + " です。");
        str = scanner.next();
        System.out.print("入力した文字列は " + str + " です。");
        
        scanner.close();
      	}
}
```

↓System.inしたものをnext()すると何か別の文字を拾ってる？
```java:結果
何か入力してください。
123,456
入力した文字列は 123 です。
入力した文字列は 456
 です。
```
- 修正
System.inしたものを一旦String型インスタンスに格納して再度Scannerをインスタンス
```java:Scanner.java
public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in)
		
        System.out.println("何か入力してください。");
        String str = scanner.nextLine();
        Scanner sc = new Scanner(str).useDelimiter(",|\n");
        str = sc.next();
        System.out.println("入力した文字列は " + str + " です。");
        str = sc.next();
        System.out.println("入力した文字列は " + str + " です。");

        sc.close();
        scanner.close();
      	}
}
```
↓サンプルの結果通りに表示された
```java:結果
何か入力してください。
123,456
入力した文字列は 123 です。
入力した文字列は 456 です。
```

# **その他の区切り文字**
```:区切り文字
abc…    Letters
123…    Digits
\d      Any Digit
\D      Any Non-digit character
.       Any Character
\.      Period
[abc]   Only a, b, or c
[^abc]  Not a, b, nor c
[a-z]   Characters a to z
[0-9]   Numbers 0 to 9
\w      Any Alphanumeric character
\W      Any Non-alphanumeric character
{m}     m Repetitions
{m,n}   m to n Repetitions
*       Zero or more repetitions
+       One or more repetitions
?       Optional character
\s      Any Whitespace
\S      Any Non-whitespace character
^…$     Starts and ends
(…)     Capture Group
(a(bc)) Capture Sub-group
(.*)    Capture all
(ab|cd) Matches ab or cd
```
多いな、、、
sympy で二段階以上の有理化は apart()

以下の式の分母を有理化する

$$
\frac{\sqrt{5} - \sqrt{6} + \sqrt{11}}{\sqrt{5} + \sqrt{6} + \sqrt{11}}
$$

```Python
>>> from sympy import sqrt, apart, var, factor
>>> var('d')  # 以下に使うだけなので，変数名は何でもよい
>>> f = (sqrt(5) - sqrt(6) + sqrt(11)) / (sqrt(5) + sqrt(6) + sqrt(11))
>>> apart(f, d)
-sqrt(30)/5 + sqrt(55)/5
```

$$
\frac{-\sqrt{7} + \sqrt{5} + 2 \sqrt{3} + 2 \sqrt{6}}{\sqrt{7} + \sqrt{5} + 2 \sqrt{3} + 2 \sqrt{6}}
$$

は
$$
-\frac{-9420 - 1526\sqrt{30} - 708\sqrt{70} - 936\sqrt{21} - 924\sqrt{2} + 631\sqrt{35} + 2506\sqrt{15} + 1680\sqrt{42}}{8279}
$$
になります。

いや，一段階だって，色々苦労している人がいるようですが，apart() で一発です。

```Python
>>> f = (3 + sqrt(8)) / (1 - sqrt(5))
>>> factor(apart(f, d))
-(2*sqrt(2) + 3 + 2*sqrt(10) + 3*sqrt(5))/4
```
OpenMPTCProuter経由でのアクセス制限を回避する

# はじめに
OpenMPTCProuterを使用していると、動画配信サイトなどがアクセス制限により利用できない場合があります。OpenMPTCProuterは、回線を集約する終点がVPSとなるため、アクセス先のサーバからはVPSがアクセス元として認識されます。しかし、VPSで使用されるIPアドレスは、一部のGeoLocationサービスによって日本国内ではなく中国や香港などと認識される場合があります。その結果、サービス提供元が海外やVPSからの接続を制限している場合、アクセスが制限されてしまう可能性があります。

# どうすればいいのか
OpenMPTCProuterには、指定した接続先をVPSを経由せずに直接接続する「OMR-Bypass」という機能が用意されています。仕組みとしては、サービス起動時にバイパス対象のドメイン名を名前解決してIPアドレスを保持し、IPアドレスの通信発生時にヒットした場合はVPSへのルーティングを行わず、eth1など指定されたデバイス（未指定の場合はMasterデバイス）へルーティングします。
ほとんどの場合は、OMR-Bypassにアクセス先のドメイン名を登録することで問題が解決します。
しかし、それだけではアクセスできないサイトもありました。
そこで、OMR-Bypassに登録するドメイン名の調査方法を以下に記載します。
＃前提：日本国内のISPを利用していること

# 調査方法
Chrome拡張機能の「[IPvFoo](https://chrome.google.com/webstore/detail/ipvfoo/ecanpcehffngcegjmadlcijfolapggal?hl=ja-JP)」を利用します。
以下のステップで実施します。

1. Chromeで調査対象のサイトを開き、IPvFooで接続されるドメイン名を確認する。
1. OMR-BypassにVPSをバイパスし直接接続するドメイン名を設定する。
1. シークレットウィンドウで動作確認する。

| 名称 | 機能 | 用途 |
| --- | --- | --- |
| IPvFoo | 表示したサイトのドメイン名とIPアドレスを表示する | VPSをバイパスするドメイン名の調査 |
| OMR-Bypss | 指定した条件の接続を、VPS経由ではなく直接接続にする | 直接接続するドメイン名を指定 |

# リスト
パターン1: 代表ドメインをバイパス登録すればOK
パターン2: 代表ドメインに加え、API等のドメインを追加登録する必要あり

| サービス名 | パターン | OMR-Bypassドメイン設定 | 規制されている場合の見え方 | 備考 |
| --- | --- | --- | --- | --- |
| ABEMA | 1 | abema.tv | アベマくんの謝罪画像と「お住いの地域からはご利用になれません」 <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/523d68bd-8d7a-e394-f89a-908e73a516cb.png) |
| Disney+ | 2 | www.disneyplus.com<br>disney.api.edge.bamgrid.com | ぐるぐるアニメーションのまま画面遷移しない <br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/113ef7cf-4fbf-5237-b11d-af6c847ea10b.png) | IPv6が有効の場合、VPS(indigo)からのIPv6経路がないため無応答となる（IPv6の場合、VPSのNextHopで応答なし）|
| Youtube | 1 | www.youtube.com | 特定の動画ページを開くと「この動画は、お住まいの国では公開されていません」<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/dc33f834-c561-710a-d614-e504ee7cf974.png) |


# 備考
・Save & Applyを押下したあと、新しいOMR-Bypass設定が開始するまで、少し時間がかかります。
```
Sat May 27 21:19:33 2023 user.notice omr-bypass: Starting OMR-ByPass...
Sat May 27 21:19:34 2023 user.notice omr-bypass: Restart dnsmasq...
Sat May 27 21:19:34 2023 daemon.info dnsmasq[1]: exiting on receipt of SIGTERM
Sat May 27 21:19:34 2023 user.notice omr-bypass: OMR-ByPass is running
Sat May 27 21:19:34 2023 daemon.info dnsmasq[1]: started, version 2.85 cachesize 150
```

・OpenMPTCProuterでIPv6を有効化している場合、202305現在の安定板ではIPv6アドレスに対するOMR-Bypassが機能しない可能性があります。その場合は、OpenMPTCProuterのIPv6を無効にしてみてください。 IPv6が有効になっているかどうかは、http://test-ipv6.com/ を開いたとき、IPv6アドレスが出ているかどうかでわかります。また、サービスをデュアルスタックで提供しているサイトでは、IPv4では日本だが、IPv6では海外と識別される、といったことも起こります。OpenMPTCProuterの次期リリースでは、IPv6対応のOMR-Bypassになっているはずです。(参考：Some changes for IPv6 support in omr-bypass
 : https://github.com/Ysurac/openmptcprouter-feeds/commit/34c656501698d1787acfc81ae27c9a3cc7005395)

# スクリーンショット
## IPvFoo
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/42dd58f6-b54a-a13d-cf7b-eb0af0c8d95a.png)

## OMR-Bypass
![screencapture-192-168-100-1-cgi-bin-luci-admin-services-omr-bypass-2023-05-27-21_02_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/71b566a3-4f20-3113-e5a6-a1f96cfd2b2d.png)
Evernoteを12年間使ってきたおじさんがNotionをさわってみた

## はじめに

Evernoteを2011年3月18日から使ってきたおじさんが、最近の若造が神とあがめるNotionをさわってみてあれこれ文句をつけてみようという企画。実際には最近「Evernote Web」の挙動がもさもさしているので代替アプリを探す旅。

## Evernoteで普段やっていることを整理

* Todoの管理
    * Inboxというノートブックの一番上にTodoノートがあってそこから関連ノートにリンク
* 会議録、セミナー録（単なるメモ）
* 実験ノート・実験プロトコルの管理
* はてなブックマークの記事を転送（Inboxに転送してすぐに消す）
* RSSから転送（Inboxに転送してすぐに消す）
* FastEverから転送（Inboxに転送してすぐに消す）
* いろいろな文章の下書き
* メモ
* 参照ノート（あとから振り返る前提のノート）

## とりあえずログイン

まず、気づいたこと。白い。絵文字。女子高生みたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/2b9993e5-a856-bcfd-3786-bf11512db8e1.png)

ダークモードにして、絵文字 ~~ノートブック~~ ページ全部消したらだいぶおじさん仕様に。というか、見た目シンプルでええやん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/8a26c205-db86-6bf6-b742-79cd814fde0c.png)

## Evernoteのノートの移行

「設定」>「インポート」からEvernoteを選択すると、Enernoteのデータを構造体を保持したまま一括でNotionにインポートできる。インポートしてみた結果、 **Todoのボックスがすべてドットに変換された状態で共有された。** これはクソ仕様。

## ページの編集

これは文句なし。Evernoteと同じようにマークダウン風の記述ができる。例えば「#」を書いて「スペース」を押せば見出しになるし、「[]」を書いて「スペース」を押せばTodoのボックスになる。ちなみにOneNoteではできない。

## 動作

軽快そのもの。どこからともなく「さようなら、もさもさEvernote。こんにちは、きびきびNotion。」という声が聞こえる。

## 料金

有料プランがEvernoteは月額1100円。Notionは月額1400円くらい。（円相場による）

### 無料でできること

Notionは１人で使うなら、ブロック数に制限なし。２人以上で共有した場合は、コンテンツ容量が1000ブロックに制限される。ちなみにブロックというのは、カーソルをあてたらハイライトされる領域のことらしく、つまりテキストでいうと1行1ブロックみたいな数え方をするらしい。つまり1000行しか書けない。２人以上では実質何もできない。Evernoteは１ノートあたり25MBの制限（文章だけならほぼ無制限）。

Notionは全体の容量が5MB。Evernoteは月間アップロード容量が60MBまで。データ容量はEvernoteが圧勝。

Notionでは、10人とページを共有できる。Evernoteでは、500人とページを共有できる。これもEvernoteが圧勝。

Notionは同期できる端末数が無制限。Evernoteは同期できる端末数が2つ。Notionの圧勝。

### 有料でできるようになること。

Notionは100人とページ共有できるようになる（1000ブロックの制限もなくなる）。Evernoteは1ノート当たりの容量が200MBになる。

Notionは全体の容量が無制限になる。Evernoteは月間アップロード容量が10GBになる。

Evernoteは同期できる端末が無制限になる。

### 感想

１人で使うならNotion、10人以上と共有するならEvernoteが有利というのが色々なところに書いてある。ただ、複数人で使うときだって端末同期はしたいし、Evernoteでその制限が2なのは厳しすぎる。どちらにしても結局課金することになる、、と思っていました。学割を知るまでは。

## 学割

Evernoteは、Personalの学生料金が半額。Notionは、Plusの教員・学生料金が無料。え？無料？それなら、今までの議論は全て無意味になり、Notion一択なんですけど。

データ容量は無制限。100人のゲストと共有ができ、同期できる端末は無制限。そしてきびきび。はい、Notionの圧勝。

### 方法

* 教育機関のメールアドレスでログインする
* サイドバーの一番下の「学割プランを入手する」をクリックする
* パスワードを設定する

## 結論

ということで、Evernoteを2011年3月18日から使ってきたおじさんが、最近の若造が神とあがめるNotionをさわってみてあれこれ文句をつけてみようという企画を行っていたら、学割の存在を知ってEvernoteの有料プランを解約する事態になりましたとさ。　

Notionはいろいろ多機能なオタク心をくすぐるアプリなので、その辺をまとめた記事を書こうかな、うん。
Dart3でfreezedビルドしたとき、変数の型がInvalidTypeとなってしまう問題を解決する

# はじめに

freezedはエンティティクラスやJSONパーサを自動生成するFlutter/Dartプラグインです。

https://pub.dev/packages/freezed

# freezedでコード生成すると変数の型がInvalidTypeとなることがある
このfreezedですが、Dart3以降(Flutter3.10.0以降)で、freezedで生成されるユニオンタイプを変数に持つようなクラスを定義すると、その型がdynamic型として生成されてしまいます。

例えば以下のようなコードでは、変数`page`は`Page`ではなく`InvalidType`という型で生成されます。

```dart
import 'package:freezed_annotation/freezed_annotation.dart';

part 'test.freezed.dart';

// WidgetTypeのユニオンタイプPageを変数にもつクラス
// 変数pageはPageではなくInvalidTypeという型で生成される
@freezed
class SinglePage with _$SinglePage {
  factory SinglePage(Page page) = _SinglePage;
}

@freezed
class WidgetType with _$WidgetType {
  const factory WidgetType.page() = Page;
}
```

# 解決方法
[analyzer](https://pub.dev/packages/analyzer)のバージョンを5.12.0までダウングレードすることがとりあえずのワークアラウンドとなるようです。

`pubspec.yaml`で、以下のようanalyzerのバージョンをオーバーライドします。

```yaml
dependency_overrides:
  analyzer: 5.12.0
```

# 参考文献
https://github.com/rrousselGit/freezed/issues/916
Linux：バックグランド実行とssh切断後に実行する方法

こんにちは
自分用にメモ
# 1, バックグランド実行のやり方
実行したいコマンドの末尾にアンパサンド`&`をつける
例えば、abc.pyをバックグランドで実行したいときは
```
$ python3 abc.py &
```
これで、abc.pyを裏で実行しながら、次のコマンドを打てる

# 2, 実行状況の確認方法
アクティブなジョブの一覧を表示する`jobs`コマンドで確認できる
```
$ jobs
[1]+  Running                 python3 abc.py &
```


<br>プロセスの状態を表示する`ps`コマンドでも確認できる
`a`と`x`オプションを付けると、全ての端末の実行中のプロセスが表示される
```
$ ps ax
```
実行中のプロセスが多い時は、`grep`コマンドで検索
```
$ ps ax | grep 確認したいコマンド
```
# 3, 切り替えたいとき
バックグランドからフォアグランドへ切り替えたい時は、`fg`（foreground）コマンドを使う
このとき、`jobs`コマンド実行時に左に表示される`JOBSPEC`の数字を指定する（ここでは１）
```
$ fg 1
```
フォアグラウンドから、再度バックグランドへ戻したい時は、`ctrl + z`で、一度ジョブを停止させた後に、`bg`（background）コマンドを使用する
`JOBSPEC`の数字を指定する点は`fg`と同じ
```
$ bg 1
```
# 4, ssh切断後も処理を続ける方法
sshの接続を切った後も、処理が実行され続けるようにする場合は、`nohup`コマンドを使用する
```
$ nohup 実行したいコマンド &
```
`nohup`コマンドでは、実行時の標準出力および標準エラー出力が`nohup.out`というファイルに保存される
<br>
LLMをチューニングする代表的な手法まとめ

## はじめに
この記事は「流行りの文章生成AIを自社/自分向けにチューニングしたいけど、何から調べればいいのか分からない！」という方向けの内容です。

ChatGPTをはじめとした大規模言語モデルが続々と発表されており、非常に優れたアウトプットが得られるようになりました。こういった中、自社/自分の環境特有の資料や内容にどうチューニングするかがより大事になってきていると思います。この記事では現時点 (2023/05/27) で主要なモデルチューニングの方法についてまとめたいと思います。

## チューニング手法

現在代表的なチューニング手法として、主に2つのライブラリを使った方法が挙げられます。

### LangChain

[LangChain](https://python.langchain.com/en/latest/getting_started/getting_started.html)はLLMを拡張するライブラリで、LLMを用いたアプリケーション開発の支援を目的として作られています。この中のloaders機能を用いることで、LLMを拡張することができます。

![スクリーンショット 2023-05-27 001002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542065/d3f73146-ed43-888e-878d-018e21f4bd97.png "LangChainを使ったLLMの応答フロー")

具体的にどのようなことを行っているかというフローをまとめたものが上の図となっています。  
まず読ませたい情報をまとめたcsvやPDFなどのファイルをLangChainに与えることで、その言葉のembeddingのDBを構築します。その後、LLMにユーザが質問をしたとき、LLMはDBを参照しながら回答を作成します。  
この手法のメリットとして、

- 手元でDBを作るため、LLMもローカルに落としたもので利用する場合は与えた追加情報が外部に漏れることがない
- 生成AIとKnowledge baseの併用のような形になるので、追加した内部情報に関する情報が欲しい時など的確なアウトプットが得やすい

のような点が挙げられます。  
実装例などは以下の記事が詳しく書かれていました。

https://pub.towardsai.net/finetuning-local-large-language-models-on-your-data-using-langchain-9229da66ad9b

### PEFT (Parameter-Efficient Fine-Tuning)

PEFTはFine-Tuningのためのライブラリです。説明は[Hugging Face](https://huggingface.co/docs/peft/index)のページに書かれており、翻訳すると以下の通りとなっています。

> PEFT (Parameter-Efficient Fine-Tuning (PEFT)) は、モデルのすべてのパラメーターを微調整することなく、事前トレーニングされた言語モデル (PLM) をさまざまなダウンストリーム アプリケーションに効率的に適応させるためのライブラリです。大規模な PLM の微調整には法外なコストがかかるため、PEFT メソッドは少数の (追加の) モデル パラメーターのみを微調整し、計算コストとストレージ コストを大幅に削減します。

PEFTで使える各Fine-Tuning手法の詳しい説明は[BrainPadさんのページ](https://blog.brainpad.co.jp/entry/2023/05/22/153000)に詳しく書かれているのでここでは省略しますが、LoRAと呼ばれる手法が使われることが多いようです。  
実装例は以下の記事で詳しく書かれていました。

https://note.com/npaka/n/n932b4c0a2230

## おわりに

現時点で一般的な2つの手法をまとめました。ただ、調べている間にもMicrosoftからGuidanceというLangChainの対抗馬となるものが出たりなど、分野の進歩が非常に早いため、あっという間に古い情報になってしまうんだろうなと思っています。ぜひLLMのチューニングの取っ掛かりとして読んでいただければ幸いです。
NestJS + GraphQL Federation + Code First の構成で Subgraph を提供するサービスでスキーマエラー

# エラー発生状況

以下の URL に NestJS で Federation を構成する際のサンプルが記載されているので参考にして、Subgraph を提供するプロジェクトを構築し実行するとエラーが発生した。

https://docs.nestjs.com/graphql/federation

# エラー内容

以下のようなエラーが発生した。エラー内容としては GraphQL のスキーマが正しくないとなっている。

```text
/your-project-path/node_modules/@apollo/federation-internals/src/error.ts:66
    super(
    ^
GraphQLError: The schema is not a valid GraphQL schema.. Caused by:
Invalid definition for directive "@tag": "@tag" should have locations FIELD_DEFINITION, OBJECT, INTERFACE, UNION, ARGUMENT_DEFINITION, SCALAR, ENUM, ENUM_VALUE, INPUT_OBJECT, INPUT_FIELD_DEFINITION, but found (non-subset) FIELD_DEFINITION, OBJECT, INTERFACE, UNION, ARGUMENT_DEFINITION, SCALAR, ENUM, ENUM_VALUE, INPUT_OBJECT, INPUT_FIELD_DEFINITION, SCHEMA
    at new AggregateGraphQLError (/your-project-path/node_modules/@apollo/federation-internals/src/error.ts:66:5)
    at aggregateError (/your-project-path/node_modules/@apollo/federation-internals/src/error.ts:87:10)
    at ErrGraphQLValidationFailed (/your-project-path/node_modules/@apollo/federation-internals/src/definitions.ts:61:17)
    at buildSchemaFromAST (/your-project-path/node_modules/@apollo/federation-internals/src/buildSchema.ts:173:37)
    at buildSubgraph (/your-project-path/node_modules/@apollo/federation-internals/src/federation.ts:1250:27)
    at buildSubgraphSchema (/your-project-path/node_modules/@apollo/subgraph/src/buildSubgraphSchema.ts:60:33)
    at GraphQLFederationFactory.generateSchemaFromCodeFirst (/your-project-path/node_modules/@nestjs/graphql/dist/federation/graphql-federation.factory.js:69:32)
    at GraphQLFederationFactory.generateSchema (/your-project-path/node_modules/@nestjs/graphql/dist/federation/graphql-federation.factory.js:31:22)
    at GraphQLModule.onModuleInit (/your-project-path/node_modules/@nestjs/graphql/dist/graphql.module.js:103:27)
    at callModuleInitHook (/your-project-path/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9)
```

# 修正方法

`app.module.ts` に以下の GraphQL のスキーマを自動生成する（Code First）設定が記載されているが、デフォルトでは federation のバージョンが 1 となるため、これを 2 に変更するとスキーマエラーが解消した。

```typescript
// (省略)
autoSchemaFile: {
  federation: 2, // <- デフォルトが Federation バージョン = 1 となっている
  path: './schema.graphql',
},
// (省略)
```
Git Hub　commit の修正方法

はじめに
日々の勉強をアウトプットしていきたいと考えております。自分なりの理解した表現でアウトプットしていくので、初学者のため、誤りもあるかと思います。その際はご指摘頂けると幸いです。

誤った情報をpushしてしまった場合の修正方法
revert:間違えてpushしたcommitを取り消すことができます。commitは削除するのではなく、「指定するcommitを取り消すためのcommit」を追加で行います。

revertはcommitされた変更と逆になる変更を追加することで、commitを取り消します。

revertを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/beb91efc-aa19-bfb4-5fbd-d880c7694576.png)
１：Git HubDesktopの「History」タブをクリックする。
２：編集したいcommitを右クリックすると、選択肢が出現します。選択肢の一番上の「Revert Changes in Commit」をクリックする。
３：「Push　origin」をクリックする。
４：pushが終了したリモートリポジトリを確認する。ブラウザでコードを確認すると、ヘッダーが戻っているかを確認する。
SmashingをUbuntuで起動させる

# 概要

Dashingの後継であるSmashingをUbuntuで起動させるまでに、いろいろとエラーを解消しながら行いました。
その記録です。

# 環境

* Ubuntu22.04
* ruby 3.0.2
* Smashing 1.3.6


# インストールの大まかな手順

1. Ubuntuのセットアップ
1. rubyのインストール
1. OpenSSLのインストール
1. NodeJSのインストール
1. Smashingのインストール

基本的に以下の公式ページに手順が書いてあります。
[Installation](https://github.com/Smashing/smashing/wiki/Installation)

## rubyのインストール

```bash
sudo apt-get install ruby-full
```

## OpenSSLのインストール

```bash
apt install build-essential libssl-dev
```

## NodeJSのインストール

JavascriptのRuntimeが必要なためインストールします。
こちらは公式ページの手順には書いてなかったのですが、Issueにありました。

https://github.com/Smashing/smashing/issues/82#issuecomment-323004468

```bash
apt-get install nodejs
```

## Smashingのインストール

```bash
# Install bundler
gem install bundler
# Install smashing
gem install smashing
# Create a new project
smashing new my-project
# Change Directory into the project
cd my-project
# Install the bundle of project specific gems
bundle
# Start the example dashboard!
smashing start
```

以上です。
【情報セキュリティ】数学基礎

# はじめに																					
大学で情報セキュリティの講義を受講している者です。
セキュリティに絡む知識（特に数学）のボリュームが大きいのでQiita投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。

# 数学基礎
これは調べればいくらでも出てくる内容だが...
あまりにも講義内で数学用語が多く特に覚えて損ないかなと思った項目をピックアップしてく


## 整数 Z
数のこと
負の数でも正の数でもなんでもいい


## 自然数 N
正の整数
負の数は自然数ではない
>**``1,2,3,4‥‥‥``**


## 有理数 Q
分数で表せる数のこと
>**``a,b``が整数である場合の分数``a/b``**

**循環する**無限小数も有理数
>**``1/3など``**


## 無理数
**循環しない**無限小数
円周率などが無理数


## 実数 R
有理数、無理数ひっくるめて実数


## gcd
**最大公約数**
``16,24``の最大公約数は``8``
これを``gcd``で表すと
>**``gcd(16,24) = 8``**


## ユークリッド互除法
２つの自然数の最大公約数を求める方法
``n>=m``の法則による自然数``n,m``がある
``n``を``m``で割り余りを``r``とする
**nとmの最大公約数はmとrの最大公約数と正しい**

>**``(n>=m)``**
**``n = 366``**
**``m = 12``**
**``366 % 12 = 6``**
よって
**``gcd(366,12) = 6``**


## 素数
**割り切れない**もの
>**``11``**
**``13``**
など


## mod
**割った余り**を表す
``a``を``m``で割った余りを表す表示は
>**``a mod m``**

mod〇は「〇で割るよ」とイメージする


## ≡（合同、イコール）
2つの整数をぞれぞれ割り**余りが等しいとき**に表す

7を3で割った余り
4を3で割った余り
それぞれ余りが1で等しい
>**``7≡4（mod3）``**
**``7と4は3で割った時の余りが等しい``**


## 逆元
- ##### 8≡1 (mod7) について考える
8 ÷ 7 = 1余り1
1 ÷ 7 = 0余り1 （1の中に7は入らない、よって0と余りが1となる）
お題の「8」は``4 × 2``と表示できる
つまり``4 * 2≡1 (mod7)``と表すことができる
**この「2」を``mod7における4の逆元``と言うことができる**
**また``4（mod7）の逆元``は「2」であるとも言える**

- ##### 逆元とは wikipedia参照
>逆元 （ぎゃくげん、英: inverse element）とは、数学（とくに抽象代数学）において、数の加法に対する反数や乗法に関する逆数の概念の一般化で、直観的には与えられた元に結合してその効果を「打ち消す」効果を持つ元のことである。

元ってなんだ？となったが直近で使用してなかったのでひとまず置いとく
なんとなくだが``逆元 ≒ 逆数``で理解を進める
githubでpushした際にユーザー名・パスワードを毎回要求されないようにする方法

# 概要
MacBookを新調し、自分のgithubアカウントでpushしようとした時に以下の情報を毎回要求される。

- username(githubアカウントのユーザー名)
- password(githubのトークン)

※2021年8月13日からパスワード認証が廃止され、トークン認証が必要になった。

備忘録として解決方法を記載する。

# 原因
HTTPSでリポジトリをクローンしていたため。


↓以下の公式ドキュメントにも記載されている。

https://docs.github.com/ja/get-started/getting-started-with-git/why-is-git-always-asking-for-my-password

以下のコマンドでHTTPS通信を使用していないかをチェックする。
```
git remote -v
```

以下のように **https://github.com** で始まっているため、毎回ユーザー名とパスワードを要求されてしまう。
```
origin  https://github.com/<アカウント名>/<リポジトリ名>.git (fetch)
origin  https://github.com/<アカウント名>/<リポジトリ名>.git (push)
```

# 解決方法

以下の形式に変更する。
```
https://<アカウント名>:<トークン>@github.com/<アカウント名>/<リポジトリ名>.git
```

変更をした後、以下コマンドを叩く。
叩いた後に再度git remote -vを叩いて以下の形式で登録されていればOK。
```
git remote set-url origin https://<アカウント名>:<トークン>@github.com/<アカウント名>/<リポジトリ名>.git
```

一度pushを行い、ユーザー名とパスワードが要求されなければ、成功している。
githubアカウントを仕事用・プライベート用で簡単に切り替える方法

# 概要
備忘録としてgithubアカウントを仕事用・プライベート用で分けるにはどうすれば良いかという記事を
書きます。

**環境**
- M2 macbook Air(Ventura 13.2.1)

# 修正する場所
.zshrcを開く。
開いた後に下記を追加する。
追加した後は.zshrcを閉じる。またターミナルも再起動する。

```
function gitMain() {
  git config --global user.name "<仕事用のgitのアカウント名>"
  git config --global user.email "<仕事用のメールアドレス>"
  git config --list
}

function gitSub() {
  git config --global user.name "<プライベート用のgitのアカウント名>"
  git config --global user.email "<プライベート用のメールアドレス>"
  git config --list
}
```

それぞれ関数を設定した後にターミナルでそれぞれのコマンドを叩くと、切り替えることができる。
- gitMain
- gitSub

# 補足(.zshrcが無い場合)
.zshrcの場所はホームディレクトリを参照する。
もし.zshrcが無い場合はホームディレクトリで以下コマンドを叩き、作成する。

```
touch ~/.zshrc
```

Finderを開いた後、メニューバーの「ホーム」をクリック。
「command + shift + .」 で作成されたかどうかを確認する。
【Docker】RSpecでAjaxのテストを実行するには

## 環境
ruby 3.2.1
Rails 6.1.7.3
Docker version 23.0.5, build bc4487a

## Gemfile

```ruby:Gemfile
group :development, :test do
  gem 'rspec-rails'
end

group :test do
  gem 'capybara', '>= 3.26'
  gem 'selenium-webdriver', '4.8.3'
  gem 'webdrivers'
end
```

## spec/rails_helper.rb
```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :selenium_chrome_headless
    Selenium::WebDriver.logger.ignore :capabilities
  end
end

Capybara.register_driver :selenium_chrome_headless do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new


  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1400,1400')


  driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :selenium_chrome_headless
```
## Dockerfile
```docker:Dockerfile
#chromeドライバーをインストール
RUN apt-get update && apt-get install -y unzip && \
    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable
```

以上の設定を追加することで、docker-composeでrspecを実行した時にAjaxのテストが通るようになります。

## 参考
[Rails + Selenium + DockerでSystemSpecの環境構築](https://qiita.com/ngron/items/f61b8635b4d67f666d75)
[【rails】Docker環境でSystemSpecの導入の仕方。](https://eiji-hb.hatenablog.com/entry/2019/12/18/194357)
ue4.27と最新andorid(ver11)でARcoreを動かす

# いや動かねえ
(大前提としてandoridのパッケージ化ができる状態にしてください)
こんにちは。単刀直入に言うARテンプレートとか色々弄っても動きませんよね。ar start session関数を呼んでも反応ないですよね。

## 結論 aemv7のサポートを切ってarm64を有効化
プロジェクト設定→android→下へスクロールしてビルド
の中にある arm64とopenGLを有効にしてそれ以外無効にしてください。それでいけます。

# どうやってスキャンするの
データアセットをつくって start ar session関数を呼ぶだけで許可画面が出て画面が映ります
エラーが出ている場合は get ar session status関数の構造をbreakし中のstringをprintすればいいと思います
OpenAIの文字起こしWhisperのオプション指定方法。あんまりサンプル落ちてなかったので。


以下、指定方法


```python:sample.py
transcript = openai.Audio.transcribe(model="whisper-1",
                                     file=audio_file,
                                     response_format="text",
                                     temperature=0.2,
                                     language="ja",
                                     prompt="This is a transcription of the live broadcast of a European bicycle race.")
#json, text, srt, verbose_json, or vtt.
print(transcript)
```


[公式api](https://platform.openai.com/docs/api-reference/audio#audio/create-prompt)



（参考）
OpenAIの文字起こしWhisper。試したらすごかった。
https://note.com/santarou/n/nbc43e3d8349e
`rbenv install 2.5.1`が失敗する

# TL;DR

この2行を実行すればいい

> ➜  export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
> ➜  CPPFLAGS=-DUSE_FFI_CLOSURE_ALLOC rbenv install 2.5.1  

```
➜  export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
➜  CPPFLAGS=-DUSE_FFI_CLOSURE_ALLOC rbenv install 2.5.1                                  
To follow progress, use 'tail -f /var/folders/t0/m8gzjl_n0cl7gmf8pg27fw380000gn/T/ruby-build.20230527180427.6250.log' or pass --verbose
Downloading ruby-2.5.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2
Installing ruby-2.5.1...

WARNING: ruby-2.5.1 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

ruby-build: using readline from homebrew
ruby-build: using libyaml from homebrew
Installed ruby-2.5.1 to /Users/ricky/.rbenv/versions/2.5.1

```

# 背景

数年前のRubyを活用したパッケージを利用したく、ver.2.5.xのRubyをインストールする必要があった。

過去に3.x系のRubyのビルドに苦労したが、どうやらv2.5.x系はまた違う苦労が待っていたようだ

https://qiita.com/coolandsmartrr/items/b50c4e780838f1c902eb