OmniAICreator/Qiita-1.07M huggingface dataset:
macOSでパスワードとハッシュ値(MCF)を生成する

# 概要

- Ansible等のプロビジョニングツールでLinuxのユーザの作成を行う際に、強固なパスワードとそのハッシュ値が必要になることがある
- 以下にmacOS Venturaでパスワードとハッシュ値の生成を行う手順をまとめた

# パスワードの生成

```bash
# パスワードジェネレータのインストール
$ brew install pwgen

# -c: 少なくとも１つの大文字を含める
# -n: 少なくとも１つの数字を含める
# -s: ランダム性の高いパスワードを生成する
# -B: 曖昧な文字列(例えば0とO)を含めない
# 16: 生成するパスワードの文字数
# 1: 生成するパスワードの数
$ pwgen -c -n -s -B 16 1
vhhH7AuEUjnbwsqr

# -y: 記号を含める
$ pwgen -c -n -s -y -B 16 1
bF('LFiJ3U%T)`>h
```

# ハッシュ値の生成

- Linuxでは、MCF(Modular Crypt Format)という形式でパスワードが保存されている
- MCFは`$ident$salt$hashed`の形式
    - `ident`: アルゴリズムの識別子。`1`はMD5、`5`はSHA-256、`6`SHA-512を表す
    - `salt`: 生成されたランダムなソルト
    - `hashed`: ソルトとパスワードを組み合わせてハッシュ化されたパスワード
- 今回はこの形式でSHA-512のハッシュ値を生成する方法についてまとめる

```bash
# パスワードの生成
$ pwgen -c -n -s -B 16 1
HNogpasjJ7YPhU3N

# ソルトの生成
$ pwgen -c -n -s -B 8 1
wmi3rAXY

# macOSにデフォルトでインストールされているのはOpenSSLからフォークされて開発されているLibreSSL
$ openssl version
LibreSSL 3.3.6

# -6 オプション、つまりSHA-512でハッシュ化するオプションが用意されていないことが分かる
# バージョンが古いからなのか、OpenSSLとはオプションが違うからなのかは調査していない
$ openssl passwd -6 -salt=wmi3rAXY HNogpasjJ7YPhU3N
unknown option '-6'
usage: passwd [-1 | -apr1 | -crypt] [-in file] [-noverify] [-quiet]
    [-reverse] [-salt string] [-stdin] [-table] [password]

 -1                 Use MD5 based BSD password algorithm 1
 -apr1              Use apr1 algorithm (Apache variant of BSD algorithm)
 -crypt             Use crypt algorithm (default)
 -in file           Read passwords from specified file
 -noverify          Do not verify password
 -quiet             Do not output warnings
 -reverse           Reverse table columns (requires -table)
 -salt string       Use specified salt
 -stdin             Read passwords from stdin
 -table             Output cleartext and hashed passwords (tab separated)

# 参照先の確認
$ which openssl
/usr/bin/openssl

# HomebrewでOpenSSLをインストール
$ brew install openssl

# opensslコマンドの実行時にHomebrewでインストールしたOpenSSLを参照するようにする
# 設定を永続化したい場合はシェルの設定ファイルに記述する(~/.zshrc等)
$ export PATH=/usr/local/opt/openssl@3/bin:$PATH

# LibreSSLからOpenSSLに変更された
$ openssl version
OpenSSL 3.1.0 14 Mar 2023 (Library: OpenSSL 3.1.0 14 Mar 2023)

# 参照先もHomebrewでインストールしたOpenSSLに変更されている
$ which openssl
/usr/local/opt/openssl@3/bin/openssl

# MCFのSHA-512のハッシュ値が生成できた
$ openssl passwd -6 -salt=wmi3rAXY HNogpasjJ7YPhU3N
$6$wmi3rAXY$tnfg9MoWyFM0epIaatCQMmFxTksnkXVU7Ep3fmRnrTuBcU3Sm9eq5cuiKpGECjvdhfVblWR7TU.FsnbCvW3tc.
```
【Colab】【Python】画像を64ピクセルに変換する

# 事前準備
1. Google Cola で実行環境を整える
※ [Colaboratory へようこそ - Colaboratory - Google](https://colab.research.google.com/?hl=ja "Colaboratory")

2. マイドライブにキャプチャの格納場所を作成しておく。
例）MyDrive/サンプルキャプチャ
※PCにダウンロードする場合は不要です。

3. 下記コードをコピー＆ペーストして実行する。
4. [ファイル選択]でリサイズしたい画像を選択する。

# サンプルコード（マイドライブに保存する場合）
```Python:python
# ファイルアップロード
from google.colab import files
import datetime
from PIL import Image # Pillowライブラリをインポート

uploaded = files.upload()

# アップロードしたファイルの名前を取得
file_name = list(uploaded.keys())[0]

# 入力ファイル名と出力ファイル名を設定
input_file_name = file_name

# 年月日時間を含む出力ファイル名を作成
current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
output_file_name = "image_64_" + current_time + ".png"

# 画像ファイルを読み込みます。
img = Image.open(input_file_name)

# 画像をリサイズして、64ピクセルに変換します。
img_resized = img.resize((64, 64))

# Google Driveにファイルを保存
from google.colab import drive
drive.mount('/content/drive')

output_folder = "/content/drive/MyDrive/AIサンプルキャプチャ"
output_path = output_folder + "/" + output_file_name
img_resized.save(output_path, "PNG")

# ダウンロードせずに完了メッセージを表示
print("ファイルを保存しました:", output_path)

```

# サンプルコード（PCにダウンロードする場合）
```Python:python
# ファイルアップロード
from google.colab import files
from PIL import Image
import datetime

uploaded = files.upload()

# アップロードしたファイルの名前を取得
file_name = list(uploaded.keys())[0]

# 入力ファイル名と出力ファイル名を設定
input_file_name = file_name

# 年月日時間を含む出力ファイル名を作成
current_time = datetime.datetime.now().strftime("%Y_%m%d_%H%M%S")
output_file_name = "image_64_" + current_time + ".png"

# 画像ファイルを読み込みます。
img = Image.open(input_file_name)

# 画像をリサイズして、64ピクセルに変換します。
img_resized = img.resize((64, 64))

# ファイルを保存
img_resized.save(output_file_name, "PNG")

# ファイルをダウンロード
from google.colab import files
files.download(output_file_name)

# 完了メッセージを表示
print("ファイルを保存しました:", output_file_name)
```


:::note warn
PIL（Python Imaging Library）は、現在Pillowとして活発に開発が続いているフォークです。Pillowは様々な画像形式をサポートしています。以下に、Pillowでサポートされている主な画像形式と、サポートされていない画像形式を示します。

サポートされている画像形式:

1. BMP（ビットマップ）
2. GIF（Graphics Interchange Format）
3. JPEG（Joint Photographic Experts Group）
4. JPEG 2000
5. PNG（Portable Network Graphics）
6. PPM（Portable Pixmap）
7. TIFF（Tagged Image File Format）
8. WebP

※これらは、Pillowで一般的に使われる画像形式の一部ですが、他にも多くの形式がサポートされています。

一部の特殊な画像形式や独自の形式は、Pillowではサポートされていません。サポートされていない形式の一部を以下に示します。

1. RAW（デジタルカメラの生データ）
2. PSD（Adobe Photoshop）
3. AI（Adobe Illustrator）
4. INDD（Adobe InDesign）

ただし、これらの形式に対応するサードパーティ製のライブラリやツールが存在する場合があります。また、サポートされていない形式を扱う必要がある場合は、それらを別の形式に変換する方法も検討できます。

Pillowのサポートしている画像形式の詳細は、公式ドキュメント（https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html ）で確認できます。ただし、Pillowのバージョンによっては、サポートされている形式が異なる場合がありますので、お使いのバージョンに応じて確認してください。

:::
:::note warn
"from google.colab import files"はスクリプトの先頭で一度だけインポートすれば十分です。
以降のセルで再度インポートする必要はありません。
:::
ChatGPTはクリエイティブを学習するのか？広告グランプリ20年分のキャッチコピーを学習させてみた。

実はこの内容は他のところで記事として書いていたのですが、反応がなく、プログラマーの皆さんの意見が聞きたくて投稿しました！
ご意見くださると嬉しいです。

考えたきっかけ
いま、流行っているChatGPTを活用した内容として、クリエイティブをどこまで学習できるか知りたくて、比較的文字なら学習しやすいと考え、
ChatGPTに過去の広告グランプリの受賞作品を学習したらどうなるかをやってみました。

やり方
広告宣伝会議のAWARDでは、毎年のグランプリ作品を掲載しているのでその内容を羅列し、法則性を学習、考えさせて、「ヨーグルト」のキャチコピーを出させてみました。対象はGPT-4です。

まず、初めに学習
そのまま、真似されると困るので21年の内容以外は黒で塗りつぶしています
まずは、ChatGPTに覚えてもらうために、宣伝会議で2000年代の受賞作品を全部書き出し、内容と法則性を理解させます。
![1681231520906-d6E5CdWz5t.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/5165fb7e-70db-b9cb-c63f-97198e705be3.png)



法則性までは理解できた！
ChatGPTはOKと回答しましたので、法則性をヒアリング
過去の受賞作品には、①簡潔さ、②インパクト、③クリエイティブ④商品やサービスの特徴の強調といった法則があることを知りました。
![1681231681456-iI42tkpDlH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/54460c1d-c126-3956-aff0-45e1fbeab26b.png)



理解したはずなのに微妙なキャッチコピー
法則性がわかったところで、彼は既に受賞作品と同等のスキルを持っているはずです。その為、ヨーグルトを元に売れるコピーライトを作ってもらうようにお願いしました。改善できるようにフィードバックをお伝えして、再度提案をしてもらうように伝えています。
なかなか、微妙な内容ですね
うーん微妙・・・なんか、バラバラで統一感がないので、再度改善案を出します。ターゲットを決めました。
![1681231815375-WfwL67Sqc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/ed91c38b-84c5-a61c-33d3-3a7ce2ddf494.png)



ターゲットを決定したら「ヨーグルト」のゴリ押し
そこで、売れるためにはファミリー層がいいだろうということでファミリー層向けにお願い！
![1681232015048-fjLkOkofHL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/50a4aaeb-52a7-2023-7b85-b600dcf58e4e.png)
やたらヨーグルトをゴリ押ししてきます。
これでは、更に買う気がなくなるので、何を理由に決めているのか？ということで「変数」を聞くことにしました。

実はキャッチコピーを考えるために５個の方向性を決める必要性があった
![1681232198768-OGSlvMACgH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/905c1f36-0187-5575-e71f-f6cfee850395.png)
AIの考え方が可視化されました！
これをみると、①ターゲット②商品の特徴③ブランドの個性④差別化⑤感情の５つで考える必要性があると理解

ターゲットは決めたけど、まだヨーグルトのゴリ押しは変わらず・・・
変数がわかったところで以下の内容で変数を決めてみました。

![1681232373429-zrNSgvcfhx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/44f52c79-19c2-eb54-6563-cfa04408357a.png)
すごい微妙です！こんなにヨーグルト推しされても困ります。
お金の話が出すぎて、何か感情に来ないと思ったので、健康に振り切ってもらう表現に変えてもらいます。

ヨーグルトを使わずにお願いしたら少し良くなってきた
そこで、ヨーグルトという名前を使わずに健康をイメージさせる内容にお願いです。

![1681232543913-71vE4bPwOY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/eef46e42-f9ac-4220-44bc-283a0fe6bcf2.png)
この４番目の言葉、自分としては刺さってきました
「小さなカップ、大きな幸せを運ぶ」という表現が自分としては後少しという感じがしました。
そこで、この方向性で他に数個出してもらうことをお願い

10個出してもらって、かなり精度が上がってきた！
![1681232720840-6FF9HMfWZm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/7935225e-96e2-d85a-960b-5e47eadc9505.png)
これは、かなり良いぞ！
10個出した中で良いと思ったのが３つほどあったのでその内容から、更に感情に訴える内容でお願いすることにしました。

感情に訴えるようにお願いしたら、文章が長くなってしまった
![1681232731521-KPIWp6N72C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332147/5e9739c0-7492-1418-345f-315a8b99c313.png)
良いのかもですが、すっきり来ないのでもう少し短くすることに
抽出して出してもらったものが、感情を表現していただけなので、もう少し惜しいということで短くして欲しいとお願いしました。

短くしてビビットという表現をしたら伝わった！

ビビットが何かわからないけど伝えてみたらうまく行った！
短くして欲しいとお願いし、感情的に刺さる表現を無理やりビビットという表現でお願いしたら、かなり良くなりました。私としては及第点の表現です。（私はコピーライターではないですが・・・）

AIでは、一流のコピーライターになるには結構道のりがいるかも・・・
最終的には納得できるコピーができましたが、結論として、AIでもかなり良いクリエイティブな表現はできそうですが、これがグランプリの内容を学習させたからなのか微妙な結論になりました。

一流のコピーライターも何度も案を出して、良いものを出すということもあるからかもですが、自分としてはChatGPTの使い方の勉強にもなったのでよかったです！
apkの署名を削除する方法

みなさん、こんにちは。
kokadaです。

以前、間違えてリリース用のモジュールにDebug版の署名をつけてしまったapkから署名を削除することがありました。
自分の記録のためにも書いていこうと思います。

# やりかた

apkファイルから署名を削除すること自体は推奨されていません。
やる場合は問題ないことを確認してから行ってください。

署名の情報は、以下の三つです。
これらを削除することで、署名を削除できます。
- META-INF/MANIFEST.MF
- META-INF/CERT.RSA
- META-INF/CERT.SF

削除するコマンドは以下
```bash
$ zip -d app.apk "META-INF/*"
```

これで、削除できます。
削除したあとは再度署名を行ってください。
DB(MySQL)でランキング順に並べる

# DB(MySQL)でランキング順に並べる方法と注意点
## はじめに
DBを勉強しておりアウトプットとして記事を書きます !
間違った表現をしてたら、ご指摘して頂けると嬉しいです。
## ランキング順に並べる方法
* RANK関数などを使わずに順位を取得する方法として、順位をつけるデータを一旦順位をつける順番（昇順または降順）にすべて取得して、それをFetchなどの方法で番号をつけていくという方法もありますが、ここではSQLのSELECTステートメントのみで取得する方法で実装する。
* **NG例**
DBに「rank」というようなカラムを追加しそこに直接、現在のランキングを挿入し
~~~ 
select * from (ソートするテーブル名) order by rank; 
~~~
のようなSQLでソートする。
この場合の問題点はランキングが変動したときに再度、直接rankカラムにランキングを挿入する手間がかかる。
現時点でのランキングを参照するだけの場合であれば問題ないかもしれないが、ランキングは常に更新され、いつ見ても最新のランキングを参照できるほうが良い。

* **GOOD例**
ランキングを相対的ではなく絶対的に管理する。
「*rank*」ではなく「*sales*」のような絶対数を入れるカラムにする。
その「*sales*」の絶対数をソートする。
~~~
select * from (ソートするテーブル名) order by sales desc;
~~~
このように絶対的な情報でソートすると、ランキングに変動があっても対応できる。
【Github】Github Proの学生申請が通らない時 （GitHub Copilot）

@SNQ-2001さんの[記事](https://qiita.com/SNQ-2001/items/796dc5e794ac3f57a945)を参考に、Github Copilotを無料で使うためのGithub Proの申請(リンクは[こちら](https://education.github.com/pack/offers)) を行いました。しかし、写真を取り直したり、英訳をキレイに書いたり、GithubのProfileを全部埋めたりと色々試しましたが、Rejectされてしまいなかなか通りませんでした。その時の対処法です。

## 対処法
スマホのGoogle翻訳アプリを使い、学生証を撮影し英訳します。そして、@SNQ-2001さんの記事では手書きで英訳して学生証と一緒に写真を取っていましたが、手書きの部分を空白にしておき、Google翻訳アプリで撮影した英訳された学生証写真を空白の部分に貼り付けて提出します。

これで自分は一発で通りました。（手書きでは字が汚くて認識できなかったからかもしれません。。。）

## 注意
おそらく、GitHubのプロフィールに自分の名前(英語)や大学を入力しておく必要があると思います。
JavaScriptにおけるモジュールとWebpack

## JavaScriptにおける「モジュール」の定義
モジュール(module)とは「変数や関数をまとめたもの」で, JavaScriptにおいては1つのモジュールは1つのjsファイルに対応します. 

一つの大きなjsファイルにあらゆる機能を書くのではなく, モジュール化を行なって小規模なjsファイルの組み合わせとして表現することにより, コードの可読性が増したり変数や関数名の衝突を防ぐことができたりなどの様々な恩恵が受けられます. 

<img width="300" alt="モジュール" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690288/a1d0cc39-6a4d-bc88-a82d-f6752412fc06.png">


## importとrequireの違い
importとrequireはどちらもモジュールの読み込み方法を表しています. 
importはブラウザ上で動作するES6のモジュールシステムであり, requireはNode.jsの環境で動作するCommonJSのモジュールシステムという違いがあります. 

### importについて
モジュール側では関数やクラスを定義する際に先頭に`export`を付けることで, 他のファイルから取り込めるようになります. 
```javascript: module.js
export const hello = () => {
    console.log('hello');
}
```

下記のように`import`とそのファイルへのパスを指定することでモジュールが取り込まれ, モジュールで定義された関数やクラスを扱うことができます. 
```javascript: main.js
import { hello } from './module';

hello();
```

### requireについて
先頭に`module.exports`を付けることで, 他のファイルから取り込めるようになります. 
```javascript: module.js
module.exports = () => {
    console.log('hello');
}
```

ある変数を定義しそこで`require`を用いることで, モジュールで定義された関数やクラスを用いることができます. 
```javascript: main.js
const hello = require('./module');
hello();
```

## Webpackが行なっていること
Webpackは「モジュールバンドラ」の一種です. 
ここで言うバンドル(bundle)とは, 複数のモジュールを一つのファイルにまとめあげることを意味します. 
一つのファイルにまとめあげることは, リクエストの回数を減少させることができ表示時間の短縮やトラフィックの軽減などのメリットがあります. 


WebpackはES6でもCommonJSでも動作するモジュールバンドラであり, 下の例のようまとめたい複数のモジュール(module1.js, module2.js)　をインポートすることで, エントリポイントとなるファイル(main.js)を生成してくれます. 
HTMLでは`script`タグでこのバンドルされたファイルを読み込むことになります. 
```javascript: module1.js
export const hello = () => {
    console.log('hello');
}
```

```javascript: module2.js
export const bye = () => {
    console.log('bye');
}
```

```javascript: main.js
import { hello } from './module1';
import { bye } from './module2';

hello();
bye();
```

`create-react-app`で作成されたアプリはWebpackをベースとしたビルドシステムを使用していたり, Next.jsの内部でWebpackが用いられていたりと, 広い領域でWebpackは用いられています. 

## おわりに
今回はWeb開発においてちらほら見かけるWebpackとはなんぞや？と言うことで, その概要について調べました. 
実際にシステムを作りパフォーマンスチューニングを行う際などに, この知識が少しでも役立てば良いなと思いました. 

## 参考文献
- [chatGPT](https://chat.openai.com/chat)
- [jsのimportとrequireの違い](https://qiita.com/minato-naka/items/39ecc285d1e37226a283)
- [webpackとは？](https://qiita.com/minato-naka/items/0db285f4a3ba5adb6498)
【AWS】Amazon SESでメール受信ができない問題の解決方法

# はじめに
Amazon SESを利用している環境で、メールを受信できないということがあありました。
本記事ではメール受信できていない原因と解決方法を記載していきます。

# 原因について
結論として、受信できていないメールアドレスがサプレッションリストに登録されていたことがわかりました。
メール送信に失敗したために無効な宛先となったことで、自動的にサプレッションリストにメールアドレスが登録されメールが送信できなくなったみたいです。

Amazon SESのコンソール画面では、下記のようにサプレッションリストにメールアドレスが登録されていることが確認できます。
![20230416_AWS_SES_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/07f5fa27-886a-549f-8610-46d75a6d87da.png)

下記は公式ドキュメントを一部の内容を抜粋したものです。
>Amazon SES では、メーリングリストや定期購読のリスト、E メール抑制といった独自のリストを管理できます。送信者の評価を維持するために、SES では、無効な受信者への送信を防止し、送信者の評価を傷つけないようにする、アカウントレベルおよび設定セットレベルの抑制を提供しています。バウンスした E メールや苦情に対するもう 1 つの手段として、SES では、サブスクリプション管理を通じて、すべての送信メールにサブスクライブ解除リンクを自動的に追加できます。

>アカウントレベルのサプレッションリストに含まれているアドレスにメッセージを送信しようとすると、SES はメッセージを受け付けますが、送信はしません。

+ Amazon SESでは、バウンスメールや苦情と判断されたメールは自動的にサプレッションリストに登録される
+ サプレッションリストに含まれているメールアドレスにメールを送信しても、SESはメッセージを受け付けるが、送信はされない

# 対応について
サプレッションリストから対象のメールアドレスを削除することにより、メールを受信することができました。
![20230416_AWS_SES_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/c0ec6af6-e5a7-1e81-d0db-94715ea6e701.png)

# さいごに
バウンスメールや苦情と判断されたメールが自動的にサプレッションリストに追加されるということを知らなかったので、今回のことで知ることができて良かったです。
メールを受信できていない時の切り分けして、サプレッションリストにメールアドレスが追加されているかを確認することも一つの手かもしれないですね。

# 参考URL
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/lists-and-subscriptions.html

https://docs.aws.amazon.com/ja_jp/ses/latest/dg/sending-email-suppression-list.html

https://blog.denet.co.jp/amazon-ses-suppression/
pythonの文字列操作の計算量

pythonの文字列操作のうち、連結、先頭要素の削除、最後の要素の削除について計算量を検証してみました。
これらの操作の計算量が$O(n)$であることを検証します。

## きっかけ
ABC298 D問題にて、$N$回のループのなかで長さが$O(N)$の文字列の連結(一文字追加)を行なうと、TLEとなりました。
文字列の代わりに`collections.deque`を使うと制限時間に間に合いました。

https://atcoder.jp/contests/abc298/tasks/abc298_d

今回の検証前は、pythonの文字列は双方向リスト的なもので実装されており、先頭と最後に一文字加える操作では$O(1)$でできるのではないかというイメージを持っていました(事実とは異なります)。

## pythonの文字列はイミュータブル
pythonの文字列はイミュータブルであり、文字列オブジェクトに対して他の文字列との連結や要素の削除を行うことはできません。
> オブジェクトが mutable かどうかはその型によって決まります。例えば、数値型、文字列型とタプル型のインスタンスは immutable で、dict や list は mutable です。

https://docs.python.org/ja/3/reference/datamodel.html

代わりに、別の文字列との連結結果や、要素を削除した文字列を別のオブジェクトとして生成して返す機能が実装されています。
普段`+`演算子やスライスで行う文字列操作は、実は丸々コピーしてから渡されています。
従って、次のようなことが言えそうです。

|操作|計算量|
|-|-|
|連結|$O(N＋M)$|
|先頭・最後の要素の削除|　$O(N)$|

ただし、元の文字列の長さを$N$、連結する文字列の長さを$M$としています。

上の問題では、長さ$O(N)$の文字列への連結が$N$回起こり、全体で計算量が$O(N^2)$となることで制限時間オーバーとなった模様です。
連結や先頭・最後の要素へのアクセスが頻繁に起きる場合は、双方向キューやリストなどのデータ構造を使うことを検討すべきでしょう。

リストを使う場合は文字列の`join`メソッドで連結できます。
```python
str_list = ["abc", "ABC", "123"]
print("".join(str_list)) # abcABC123
```
`join`の計算量はリストの長さに比例するはずですが、リスト末尾への要素の追加は$O(1)$のはずです。

## 検証してみる
ここで終わってもいいのですが、[「推測するな、計測せよ」という格言](http://users.ece.utexas.edu/~adnan/pike.html)にしたがって、せっかくなので計測してみます。

`matplotlib`を使って、文字列の連結、先頭要素の削除、最後の要素の削除にかかる時間を可視化してみました。
- それぞれの文字列長において、かかった時間は100回の平均をとっています。
- 連結する文字列は1文字にしました。
- 先頭要素と最後の要素の削除にはスライスを使っています。

```python
import matplotlib.pyplot as plt
import numpy as np
import time


length = [n*10**5 for n in range(10)]

concat_time = []
delete_first_time = []
delete_last_time = []

for l in length:
    string = "a"*l

    # 連結
    t = []
    for _ in range(100):
        start = time.perf_counter()
        _tmp = string + "a"
        t.append(time.perf_counter() - start)
    concat_time.append(np.mean(t))

    # 先頭の削除
    t = []
    for _ in range(100):
        start = time.perf_counter()
        _tmp = string[1:]
        t.append(time.perf_counter() - start)
    delete_first_time.append(np.mean(t))

    # 最後の要素の削除
    t = []
    for _ in range(100):
        start = time.perf_counter()
        _tmp = string[:-1]
        t.append(time.perf_counter() - start)
    delete_last_time.append(np.mean(t))

plt.plot(length, concat_time, label="concat")
plt.plot(length, delete_first_time, label="delete first")
plt.plot(length, delete_last_time, label="delete last")
plt.xlabel("string length")
plt.ylabel("compute time [s]")
plt.legend()
plt.show()
```

実行環境は以下の通りです。
- MacBook Pro (13-inch, M1, 2020)
- Python 3.10.5

実行して得られたプロットを次に示します。

![python_string_complexity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703745/8c512cf8-2384-35af-00d5-c66af7c4c77f.png)

`concat`、`delete first`、`delete last`がそれぞれ連結、最初の要素の削除、最後の要素の削除に対応します。
見ての通り、連結・削除する文字列長が1であるのにもかかわらず、全ての操作において元の文字列長に比例する時間がかかっていることがわかります。

## 結論
pythonで比較的長い文字列の連結やスライスが必要になったら、リストや双方向キューなどのデータ構造を検討しましょう。

## 参考
- [Python 言語リファレンス » 3. データモデル](https://docs.python.org/ja/3/reference/datamodel.html)
- [Pythonistaなら知っておきたい計算量のはなし](https://qiita.com/Hironsan/items/68161ee16b1c9d7b25fb)
- [Pythonでの長い文字列の連結は遅い](https://nixeneko.hatenablog.com/entry/2021/07/29/143621)
文学部卒社会人が大学院で人工知能研究に挑戦〜5日目〜


本日は以下の授業でした。どちらの授業についても初回のため、オリエンテーション的な位置付けでした。ポイントかいつまんで紹介します。
※初学者ゆえ、誤りあるかもしれませんがご了承ください

## 講義内容
●数理科学（入門）
・入力データ（説明変数）＝ベクトル→機械学習モデル→出力データ（目的変数）＝ベクトル
⇨つまり機械学習モデルとは一般に 「ベクトルを入力し、ベクトルを得る」関数ということ
・機械学習モデルにおいて、入力ベクトルから出力ベクトルを得る計算過程で よく使われるのが行列計算
・機械学習モデルの出力も100%完璧にはできないため確率により記述される推測統計学の手法を用いれば、事象の起こりうる確率を推測可能
・統計的分布から確率を求めるためには積分
・教師あり学習で精度を上げるのに用いられるのが積分
・数理の知識についてはWebなどで品質の悪いコンテンツが横行しているので出所をしっかり意識する必要があるとのこと
・先生よりおすすめいただいた初学者向け学習コンテンツをご紹介します
[Chainer Tutorial](https://tutorials.chainer.org/ja/)
[@IT「AI・機械学習の数学入門 ― 中学・高校数学のキホンから学べる」](https://atmarkit.itmedia.co.jp/ait/subtop/features/di/mathematics_index.html)
※文系初学者に対しここまで初歩から教えてもらえるのはとてもありがたいです。これまでなんか数学が必要なのはわかるのですが、それぞれが何に使われるのかもいまいちピンときてませんでした。

●機械学習（演習）※２コマ
・機械学習以前のコンピュータの仕組みやLinuxコマンドの演習
・仕組みを理解していると大きなモデルの運用や共同利用など今後の研究がスムーズになるとのこと
・Linux自体は非常に教材が多くあるので学習もしやすいとのことです。おすすめのリンクを紹介します
[Linux入門講座](https://eng-entrance.com/category/linux)

## 本日の学習内容＆時間
予習：30分
授業：270分
自習：120分
-　スマートシティにおけるAIの活用についての調査
-　所属研究室での研究内容検討

計：420分（約7時間）


明日は休みだけど、、、はやくもついていけてるか怪しいから勉強せねば。。。
それでは！
DB2DBA: ChatGPTにDB管理者をやらせてみた

# 概要
目的に応じたサンプルSQL・コマンドの例示のレベルであれば当たり前にできそうなので、より抽象度の高い問題として、各種DB障害に対する解決策を提示させてみます。

GPT-4を利用しており、シンプルに一問一答の形で検証しています。

# ChatGPTへの質問と回答
## ケース1. アクティブログ・フルへの対処
### 質問
Db2のテーブルを更新するSQLがSQL0964Cのメッセージと共に異常終了しました。異常終了したSQLは以下のようなものです。

```sql
DELETE FROM TABLE01 WHERE CREATED_TIMESTAMP < ?
```

この問題に対するワークアラウンドと、恒久的な対応を検討してください。


### 回答
SQL0964Cエラーは、トランザクションログがいっぱいになった場合に発生します。この問題に対処するために、次のワークアラウンドと恒久的な対応策を提案します。

ワークアラウンド:

1. トランザクションログを確認し、不要なトランザクションが終了していない場合は終了させます。
1. DELETE文の範囲を狭めて、より少ない行を一度に削除します。これにより、トランザクションログに記録されるデータ量が削減されます。

    例:
```sql
DELETE FROM TABLE01 WHERE CREATED_TIMESTAMP < ? FETCH FIRST 1000 ROWS ONLY
```

1. 上記の範囲を狭めたDELETE文を繰り返し実行し、全ての対象データが削除されるまで続けます。

恒久的な対応:

1. トランザクションログのサイズを増やすことを検討してください。これにより、より多くのデータがトランザクションログに格納できます。
1. テーブルのパーティション化を検討してください。これにより、削除操作が特定のパーティションに限定され、トランザクションログへの負荷が軽減されます。
1. データのアーカイブ戦略を検討してください。定期的に古いデータをアーカイブし、本番環境から削除することで、トランザクションログの負荷を軽減できます。

これらのワークアラウンドと恒久的な対応策を検討し、適切なものを適用することで、SQL0964Cエラーを回避できます。

### 感想
手順の番号として同じ数字が繰り返されていますが、ChatGPTからの出力のままです。

何がワークアラウンドで何が恒久的な対応かはケースバイケースの部分もありますが、概ね妥当な回答が返ってきました。ただし、テーブルのパーティション化は効果がないはずです。ワークアラウンド1つ目は方向性としては合っていますが、もっと具体的でDb2に適した回答が欲しいですね。

最早当然ですが、Db2特有の`FETCH FIRST n ROWS ONLY`の構文には対応できています。

## ケース2. データベースの復旧
### 質問
あなたはECサイトのデータベース管理者です。ある日、リリースしたバッチプログラムのバグにより、商品マスタテーブルの一部のレコードが誤って削除されてしまいました。

サービスのダウンタイムを伴う対応はビジネスサイドから許可されていません。しかし、幸いにも削除されたレコードは少数であり、そのIDは特定できています。また、データベースは前日の夜間にバックアップが取得されています。データベースにはDb2が利用されています。

以上の状況で、削除されたレコードを復元するために最適と思われる手順を検討してください。

### 回答
削除されたレコードを復元するために、以下の手順を検討してみました。この手順は、サービスのダウンタイムを最小限に抑えつつ、削除されたレコードを復元することができると考えられます。

1. 前日の夜間バックアップから、バックアップされたデータベースを別の環境にリストアします。これにより、復元作業が本番環境に影響を与えることなく行えます。

1. リストアした環境のデータベースから、削除されたレコードのIDに該当するレコードを抽出します。これには、以下のようなSQLクエリを使用できます。

```sql
SELECT * FROM 商品マスタテーブル WHERE 商品ID IN (削除された商品ID1, 削除された商品ID2, ...);
```

1. 抽出したレコードをCSVファイルやSQLスクリプトなどの形式でエクスポートします。
1. エクスポートしたデータを本番環境のデータベースにインポートします。Db2では、IMPORTコマンドやLOADコマンドを使用してデータをインポートできます。以下は、IMPORTコマンドを使用した例です。

```sql
IMPORT FROM '/path/to/exported_data.csv' OF DEL INSERT INTO 商品マスタテーブル;
```

もしくは、LOADコマンドを使用した例です。

```sql
LOAD FROM '/path/to/exported_data.csv' OF DEL INSERT INTO 商品マスタテーブル;
```

1. インポートが完了したら、本番環境のデータベースで削除されたレコードが復元されていることを確認します。
1. 問題が解決したら、リストアした環境は削除しておきましょう。

この手順により、サービスのダウンタイムを伴わずに、削除されたレコードを復元することができると考えられます。ただし、手順を実行する前に、現在のデータベースとバックアップの状況を確認し、適切な対応を検討してください。

### 感想
RESTOREコマンドやEXPORTコマンドの例示がなかったり、サービスを停止させてしまうLOADコマンドが候補に入っているものの、こちらも概ね状況を踏まえた手順が返ってきました。結果の確認やリストア環境削除についてもケアしてくれているのは素晴らしいですね。


# まとめ
回答を全面的に信頼することはできないものの、状況に応じた障害対応手順を返してくれることが確認出来ました。誤りを指摘して訂正させれば、典型的な障害パターンにはすぐにでも活用できそうです。
【HackpackCTF 2023】Cat Me if You Can

# 概要

HackPackCTFに参加しました。
自身のチームは381チーム中67位でした。（Top17％ほど？）

クリプトやバイナリ系が弱いと分かったので、もっと頑張ります！
あとWebも。~~全部じゃん~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523062/f307c08f-0f1e-ec38-d942-2ce93c62cd8a.png)

# Cat Me if You Can

> There's a flag hiding in plain sight, Our cat has been trying to get it for a while now, but it keeps escaping him at the last moment. Can you help him out? Author: Chika

僕の大好きなBash × Miscの問題です。

アプローチとしては、Catが使えなくなってしまったので、Catを自作してやる必要があります。

```
┌──(ayato㉿AyatoDesktop)-[~]
└─$ nc cha.hackpack.club 41708
bash-5.1$ ls
flag.txt
bash-5.1$ cat flag.txt
hissssss
cat: flag.txt
bash-5.1$ cat *
hissssss
cat: flag.txt
```

BashでCatを再実装するには以下のようなコマンドでできます。

```bash
alias cat='while IFS= read -r line || [[ -n $line ]]; do echo "$line"; done < '
```

それではやってみましょう。

```
bash-5.1$ alias cat='while IFS= read -r line || [[ -n $line ]]; do echo "$line"; done < '
bash: alias: command not found
```

Aliasが使えないようなので直接読み込ませます。

```
bash-5.1$ while IFS= read -r line || [[ -n $line ]]; do echo "$line"; done < flag.txt
flag{(^._.^)_m3ow_me0w_(^._.^)}
```

# まとめ

とても面白い問題でした！
やっぱりBashは楽しい。
RVCで変換した音声のスペクトルを変換前と比較する

## モチベーション
RVC(Retrieval-based Voice Conversion)のボイチェン技術が凄いため、どのようにしたら変換していない声と変換しているの声を見分けられるのかということが気になったため。
## 免責
音声解析は素人なので、全く的外れなことを言っているかもしれません。

## 内容
- 肉声と,肉声をRVCを用いて変換した音声のそれぞれのスペクトルを比較する。
- Voicevoxを用いて,ずんだもんで同じ文章の音声を出力し、それを変換し、肉声から変換した場合との差異を取る。

使用した文章は
https://github.com/mmorise/rohan4600/blob/main/%E6%9C%97%E8%AA%AD%E8%80%85%E7%94%A8_html/10_SHORT800_1.html
こちらの2001を使用します。

また、RVCの学習に使用した音声データは
https://zunko.jp/multimodal_dev/login.php
マルチモーダルデータベースさんの九州そらのnormalボイスを使用させていただきました。
## 変換設定
肉声の変換
- ピッチ抽出アルゴリズム(选择音高提取算法):harvest
- 変調:+12
ずんだもんボイスの変換
- ピッチ抽出アルゴリズム(选择音高提取算法):harvest
- 変調:±0

### 変換前のスペクトル
※最大値を使用して,大きさは正規化してあります。
![record_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323424/2b795a7e-c2d2-3cfb-99bf-82a5417386fb.png)

105Hz付近に1次ピーク,その後倍音で2次,3次ピークとなっており,また2次ピークから順々に強度が弱くなっている。

### RVCで変換した音声のスペクトル
※1オクターブ上げているため,それぞれのピークの周波数は2倍となっています。
![record_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323424/7797dd51-d463-7a45-1d22-79754c8468c6.png)

肉声のスペクトルと異なり,1次ピークが最も大きく,倍音ではない280Hz付近にピークが出現している。また、倍音である400Hz付近のピークは変換元のスペクトルより強度が弱い結果となった。

### ずんだもん(normal)を用いて,同じ文章を出力させた際のスペクトル

![record_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323424/915ef9e2-1581-6e14-b9ff-ef0db8cc366b.png)

肉声の場合のスペクトルとは異なり,ピーク周波数の周りにおいても強度が強くでている。1次ピークと2次ピークが確認される。

### ずんだもん(normal)で出力した音声を,RVCで変換した音声のスペクトル

![record_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323424/f656842f-894e-7172-e0f9-f0f685c295e8.png)

肉声から変換した場合と同様に1次ピークのみが支配的で,2次ピークの強度は1次ピークと比較して弱くなる結果となった。

## 結論
RVCで変換した音声では,変換元のスペクトルの形状は保たれる傾向にあるが,2次ピーク以降の強度は変換元と比較して弱くなる傾向が見られた。
また,肉声からの変換だけではなくvoicevoxで出力した音声においても同様の傾向が見られるため,RVC起因によるものだと考えられる。

## 参考文献
https://heartstat.net/2022/03/21/python_calc_fft/
【Android】端末の言語を取得する方法   (忘却録)

端末の言語を取得する必要があり、どうだっけ？
と調べたので、忘却録です。

今回は``ja_JP``の形で取得する必要がありました。


````　Util.kt
 Locale.getDefault()
````

こちらで日本語端末であればja_JPを返却してくれました。
Microsoft Storeで学生アカウント用のソフトを入れるには（備忘録）

# 前置き
確か昔は、Microsoft Storeに学校アカウントでログインすることで、その学校が配布しているようなソフトがインストールできたのですが、確かwindows11にしたときにできなくなったんですね。
そのときは別の方法で入れました。
そして学年が上がった今、サブスクリプションやセキュリティーキーがなんやかんやと言われて使えなくなりました。このソフトですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/03d7c1ef-7d22-b4ae-7fa2-41d1e0ae591c.png)

なので一回アンインストールして入れ直そうとしたのですが、インストール方法を忘れており苦労したので、備忘録です。

# 入れ方
[学生向けマイクロソフトストア](https://educationstore.microsoft.com/ja-jp/store/private-store)
のリンクを踏んでリンクに跳びます。それだけです。

# 雑談

跳んだあとログインすると、`教育機関向け Microsoft Store は 2023 年の第 1 四半期に終了する予定です。`とか出てきて超絶ビビると思います。ってかもう

https://learn.microsoft.com/ja-jp/lifecycle/announcements/microsoft-store-for-business-education-retiring

この公式記事に書いてありますが、2023/3/31は既に過ぎ去っているので何故か残っています。※理由は後述

https://forest.watch.impress.co.jp/docs/news/1470189.html

このニュースでも同じこと言っていて、代替策として「Windows Package Manager」（WinGet）や「Microsoft Intune」の活用を提案しているらしいのですが、うちの学校はまだやってなさそうなので、この公式記事を

https://learn.microsoft.com/ja-jp/microsoft-store/microsoft-store-for-business-overview

参考にさっさとやってほしいですね。まぁこの記事でやっている通り、

https://learn.microsoft.com/ja-jp/microsoft-store/microsoft-store-for-business-overview

廃止が延期になったそうです。

ちなみにリンクはここ

https://learn.microsoft.com/ja-jp/microsoft-store/distribute-apps-from-your-private-store

から見つけました。なお、私が[ビジネス向け](https://businessstore.microsoft.com/)に跳ぶと学生向けに強制的に飛ばされました。

てか廃止を延期したというならほんと警告失くしてほしいですね。ビビるので。

なお私はここから使わないのにMicrosoft Education入れてます。いつの間にか仕様が変わって544円/ユーザーとか書いてありますが、どうせ学校持ちなのでアンインストールはしません。

# 最後に
私は来年もこの記事を読むので、「成績はどうだった？」と書き置きしておくことにしましょう。

<font>$\huge{おい私、成績はどうだった？？}$</font>
IBM Cloud Pak for Data データリネージュ、デモ動画

IBM Cloud Pak for Data におけるデータカタログ機能（Watson Knowkedge Catalog）のオプションである、Manta Automated Data Lineage のデモ動画です。

テーブルからテーブルへのデータの来歴（Lineage（リネージュ））のみならず、行単位でもその来歴を追うことができるため、開発時の影響分析、データ分析の際のデータの出処の確認などに最適です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/IBM?src=hash&amp;ref_src=twsrc%5Etfw">#IBM</a> のデータリネージュのデモ動画です。<a href="https://twitter.com/hashtag/%E6%97%A5%E6%9C%ACIBM?src=hash&amp;ref_src=twsrc%5Etfw">#日本IBM</a>　<a href="https://twitter.com/hashtag/DataOps?src=hash&amp;ref_src=twsrc%5Etfw">#DataOps</a> <a href="https://twitter.com/hashtag/CP4D?src=hash&amp;ref_src=twsrc%5Etfw">#CP4D</a> <a href="https://twitter.com/hashtag/WatsonKnowledgeCatalog?src=hash&amp;ref_src=twsrc%5Etfw">#WatsonKnowledgeCatalog</a> <a href="https://twitter.com/hashtag/WKC?src=hash&amp;ref_src=twsrc%5Etfw">#WKC</a> <a href="https://twitter.com/hashtag/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#データカタログ</a> <a href="https://twitter.com/hashtag/MANTA?src=hash&amp;ref_src=twsrc%5Etfw">#MANTA</a> <a href="https://twitter.com/hashtag/DataLineage?src=hash&amp;ref_src=twsrc%5Etfw">#DataLineage</a> <a href="https://twitter.com/hashtag/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A5?src=hash&amp;ref_src=twsrc%5Etfw">#データリネージュ</a> <a href="https://t.co/HA3jdQtOOK">https://t.co/HA3jdQtOOK</a> <a href="https://t.co/FYFKepS7qR">pic.twitter.com/FYFKepS7qR</a></p>&mdash; ぼうさん / 外資IT魔法戦士 / Shumpei Kubo (@_bou_3) <a href="https://twitter.com/_bou_3/status/1646776162599997443?ref_src=twsrc%5Etfw">April 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Ruby】GitHubからGemをインストールする方法

## Gemfileを使用する
`Gemfile`に以下のように記述します。
```Gemfile:Gemfile
  gem "Gem名", git: "git@github.com:ユーザー名/リポジトリ名.git"
```

`bundle install`します。
```:ターミナル
$ bundle install
```

`group`, `platform`, `require`オプションが使用できます。
リポジトリには`.gemspec`ファイルが含まれている必要があります。

## `gem install`する
以下のコマンドを実行することでインストールできます。
```:ターミナル
$ gem install specific_install
$ gem specific_install -l 'https://github.com/ユーザー名/リポジトリ名'
```
VSCodeで文法的に正しいHTMLを書く

## 拝啓

最近ちょっとしたアクセシビリティに関わるテストを行っていた。テストなので文法的に正しいHTMLを書く必要があった。その昔はどの要素の子供にどの要素を入れてはいけないかということがある程度覚えられていたのだが、私が怪しくなってきたことと世の中が複雑になってきたことで、やはり計算機に教えてもらったほうが良いような気がしてきた。

ということで、VSCodeでHTMLをチェックしてくれるものを探してみたので、その時の記録である。

## 比較したもの

* [HTMLHint](https://marketplace.visualstudio.com/items?itemName=HTMLHint.vscode-htmlhint)
* [W3C Validation](https://marketplace.visualstudio.com/items?itemName=Umoxfo.vscode-w3cvalidation)
* [W3C Web Validator](https://marketplace.visualstudio.com/items?itemName=CelianRiboulet.webvalidator)

## テストコード

下記のコードでテストを行った。

``` HTML5
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Simple HTML validation check</title>
</head>

<body>
    <ul>
        <li>Hello</li>
        <ul>
            <li>Good morning</li>
        </ul>
    </ul>
</body>

</html>
```

UL要素の中に直接ULを入れてはいけない。

## 結果

HTMLHintでは、上記のHTMLはエラーにならない。よって、HTMLとして正しいかどうかを確認するために使うには注意が必要となる。

Web Validatorはちゃんとエラーにしてくれる。

なお、W3C Validationは、私の設定方法が悪いのだろう、正しく動作させることができなかった。

## なぜ正しいHTMLを書くのか

ブラウザはある程度正しくないHTMLでもちゃんと表示してくれる。上記のコードでも問題なく表示されるだろう。なのに正しいHTMLを書こうとしている。それには次のようなメリットがあると私は思っている。

* 機械が理解しやすいHTMLになる
* 検索エンジン対策になるかもしれない
* 翻訳・要約・言い換えなどのサービスで利用しやすくなるかもしれない
* アクセシビリティの向上に案外貢献できる

HTMLは、文書の構造を表そうとしているマークアップ言語である。この構造を正しく表現することで、機械（コンピュータ）は作者の意図を正しく理解することができる。ここまでいけば、検索エンジン対策、翻訳や要約、あるいは音声での読み上げなど、機械が介在するサービスやアプリケーションとは相性が良くなるはずだ。

ということで、文法的に正しいHTMLを書くことのできそうな拡張機能の紹介である。
スーパーマーケット企画でごちゃごちゃ‥ＡＩで救いを

名古屋市スーパーのレジで働く２７歳男性です。
スーパーでは毎月企画ものの予約が多く入ります。
多く予約があるのはありがたいことですが
多すぎるせいでミスが発生します。　
今回はミスの種類でも期限に注目してＡＩを作りました。　　
紙に書いた企画をカメラに見せると期限が表示されるというＡＩです。
https://twitter.com/yawa0910178093/status/1647249842261962753?t=6yYcgV6KxjN9eSY1Iul1Yw&s=19

これをもとに画像を見せると企画運用が表示される
ＡＩを作りお客さまをまたせずミスのないスーパーのサービスカウンターを目指します。
WindowsにiTunesをインストールすることなく、Apple AAC codecを使ってエンコードを行う

今となっては opus を使ったほうがいいじゃないかと思いますが、歴史的なメモ。
* https://qiita.com/keiya/items/70ed223c85e72b6bfdda

# QuickTime コマンドライン環境を作る
Win64を使っていると仮定します

##  CoreAudioToolbox.dll を入手する
https://github.com/AnimMouse/QTFiles/releases

QTfiles64.7z をダウンロードし、ツール一式用のフォルダを作って展開

## qaac.exe を導入する

https://github.com/nu774/qaac/releases

ダウンロードしたファイル中の、x64\ 以下のファイルを、上のDLLと同じフォルダに展開

## コマンド実行環境を確認

> qaac64.exe --formats

を実行し、対応フォーマットの一覧が出れば正常動作しています。

## 手動でエンコードしてみる

コマンドラインオプションはこちら
* https://github.com/nu774/qaac/wiki/Command-Line-Options

たとえばwavファイルを AAC 320kbpsに変換したいのであれば、

> qaac64.exe -V127 -o fuga.aac hoge.wav

# foobar2000を使って、GUIで変換してやる

> winget install  PeterPawlowski.foobar2000

で実行ファイルを導入します。

起動して右のエリアがプレイリストエリアなので、変換元のファイルをD&Dで投入する。

![Clipboard01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/7fab2ce4-087f-846f-6b7d-5365a0d45cca.png)


右クリックして Convert ＞ QuickConvert を選択。


![Clipboard02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/02253c27-a014-2934-bca9-b30d7e5fc7a0.png)

一番上の「AAC(Apple)」を選択します。右クリックのEditで、ビットレート設定画面が出ます。

Convertを押すと、qaac64.exe の場所を聞いてくるので、最初に展開してたフォルダを選んでやればOK


## おまけ：変換後のファイル名を指定するには

右クリック ＞ Convert ＞ ... で変換設定画面に入る。

Destinationをクリックし、「Name format」で変数指定してやる。
- 変数一覧 https://wiki.hydrogenaud.io/index.php?title=Foobar2000:Title_Formatting_Reference#Remapped_metadata_fields

例えば「アルバム名 - ディスク番号 - トラック番号_トラック名」とするなら以下となる。

> %album%-%discnumber%-%tracknumber%_%title%


# おしまい
スーパーのサービスカウンターの問題

名古屋市スーパーマーケットで働く２７歳男性です

自分が働いているスーパーは規模が大きいです。
そのためサービスカウンター内にも多くの問題があります。

その一つとしては高額誤差を出した際の反省書の書き方管理が難しいことです。
僕が働いているスーパーでは高額誤差を出したら反省書を書かないといけません。
反省書は３種ありますのでこの３種が全て管理されていないといけません。
３種ともパソコン上に別々のところに管理させており準備するのも大変です。

なので３つの解決案を考えました
１、ミスをした際に番号をいれる３種の紙が印刷されること。
２、３種の紙を一つの紙にまとめること
３、新たに反省を作成すること

１の解決案は
パソコンのＡＩを利用しミスしたひとやサービスカウンターのひとがＡＩにミスした種類の番号を入れれば３種の紙が自動的に印刷されるということです。
これをすれば３種の紙の出し忘れや
３種を印刷する時間が省かれることになります。

このことを店舗の人間に確認したところ
パソコンの操作方法は不安だがそれをおぼえればはやくなる。
今まで一時間かかっていた管理のじかんが大幅に短縮できる。
書く側も準備に時間がかからないため忘れぬうちに反省がかける
などの意見が多くみられました。
意見を聞いて現実化してみたいという
気持ちが高くなってきているので
今後も勉強をし、現実化に近づけていきたい
基本知識

# シェル，コマンドプロンプト，PowerShellあたり
## シェルとは
シェルとはOSとユーザーを仲立ちする基本的なプログラム

## コマンドプロンプトとは
コマンドプロンプトとは以前のwindowsのOSであるMS-DOSを操作するためのシェルでCUIが基本

現在はエクスプローラーがシェル担っており，GUIで便利

| 操作 | 概要 |
|:-:|:-:|
| dir  | ユーザーディレクトリ（フォルダ） にあるファイル／フォルダを表示別の場所のファイル／フォルダを表示したい場合は「dir c:\」のようにdirコマンド後に半角スペースを入れて引数として表示したいドライブやフォルダを指定  |
|  cd 移動したいディレクトリ名 |  ディレクトリを移動可能 |
|  cd.. |  ディレクトリを一つ戻る |

## PowerShellとは
PowerShell>コマンドプロンプト
PHP SQLServer PDO接続できなくハマッた件

# はじめに
SQLServerにあるテーブルをWeb上で閲覧できるようにしたいため、PHPで実装することになった。
環境は以下の通り。ASP.NETのほうがMSの親和性の恩恵で実装しやすい？と思うけど、私の好みで敢えてPHPを選択。

**環境**

- OS:  Windows Server 2019 Standard
- DB:  SQL Server 2014 Standard
- Web: IIS, PHP Ver8.2.5

ドライバーインストール、phpinfoでドライバ認識確認まで順調で、いざPDO接続のコードを実装してページを読み込んでみたら

**HTTP 500 Error**

この Internal Server Error の解決までをここに綴る。

# PDOエラー処理
PHP公式マニュアルによるとPDOが提供するエラー処理方法は三通り存在し、アプリケーションの開発形態によって使い分けるとのこと。
https://www.php.net/manual/ja/pdo.error-handling.php

今回はVer8.2.5を使用しているから**PDO::ERRMODE_EXCEPTION** モードを指定してエラー処理を実装する。

```PHP
<?php
    $serverName = 'SeverName';
    $database = 'dbName';
    $uid = 'sa';
    $pwd = '####SA##PASSWORD';
    try {
      $conn = new PDO("sqlsrv:server=$serverName;Database = $database", $uid, $pwd);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
      die("Error connecting to SQL Server:{$e}");
    }
?>
```

上記実装し、ページを読み込んだところ以下エラーが表示された。
※以下よりコードSampleを参照
https://www.ipentec.com/document/php-mssql-connect

```
SSL プロバイダー: 信頼されていない機関によって証明書チェーンが発行されました。
```

またしてもTLSエラー、、😓 ※私の投稿はTLSエラーが多いTT

# DSNに"TrustServerCertificate=1"を追加

上記エラーをみると恐らくPHPが証明書ストアのルート証明書を参照できないためかと思われる。強制的にサーバー証明書を信頼させるためには DSNに"TrustServerCertificate"を追加する。
https://www.php.net/manual/ja/ref.pdo-sqlsrv.connection.php

```PHP
<?php
    $serverName = 'SeverName';
    $database = 'dbName';
    $uid = 'sa';
    $pwd = '####SA##PASSWORD';
    try {
      $conn = new PDO("sqlsrv:server=$serverName;Database= $database;TrustServerCertificate=1;", $uid, $pwd);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
      die("Error connecting to SQL Server:{$e}");
    }
?>
```

これで Internal Server Error が解消された😇
【Git】作業中の変更を一時的に保存し、後で復元することができるgit stashコマンドについて

# 概要
* `git pull`しようとしたら、まだ一部作業中だったため、`Changes not staged for commit:`と出てきてしまい、`pull`ができない...そんな時、出てきた変更を上書きせずに残したまま、`pull`する方法を紹介します。

# 前提: `git stash`は一時退避時に使う
* `"Changes not staged for commit"`は、現在の作業ディレクトリ内にあるファイルの変更が、Gitのステージングエリアに追加されていないことを示しています。
* この状態はコミットすることで解決できますが、上書きせずに変更を残しておきたい場合もあると思います。その時に使うのが`git stash`です。
* `git stash`コマンドは、作業中の変更を一時的に保存し、後で復元することができるGitの機能です。

### どんな時に使うの？
* 例えば、「ブランチAで作業中だったけど、ブランチBに移動（or `git pull`等）しなければならなくなった。でも、まだ作業途中だしコミットしたくないんだよなぁ...どうしよう」ってときに、一時退避みたいなイメージで使います。今回は`git pull`するときに一時退避する、というシーンを想定して記載しています。
* 参考：[git stashの使い方！作業をコミットせず一時保存する方法！](https://codelikes.com/git-stash/)

### 他に想定される使用シーン
* ブランチを切り替える前に、作業中の変更を一時的に保存する場合
* 修正が必要なバグが発生した場合に、現在の作業を中断して修正を行い、修正後に作業を再開する場合
* マージやリベースなどの操作中に、作業中の変更を一時的に保存する場合
* 他の人が開発しているブランチに切り替える前に、作業中の変更を一時的に保存する場合

# 実行手順
* 以下コマンドで変更を一時的にstashして保存します。

```terminal
$ git stash push "任意のメッセージ"
```

* ちなみに以前までは`git stash save`コマンドが使われていたましたが、引数なしで実行した場合と`-u`オプションを付けた場合の挙動が異なるため、混乱を招く可能性があるとのことで、非推奨になったらしい。

* 無事に`stash`を作れたら、以下でプルします。

```terminal
$ git pull
```

* `"Changes not staged for commit"`は出てこないはずです。無事にプルできましたね。
* 変更を復元します。次のうちどちらかのコマンドを使用して、保存された変更を復元できます。
    * ①`git stash pop`
    * ②`git stash apply`

### ①git stash pop

```terminal
$ git stash pop
```

* 上記の場合、stashされた変更を復元し、stashエントリを削除します。

### ②git stash apply

```terminal
$ git stash apply
```

* 上記の場合、stashされた変更を復元するだけで、stashエントリは削除されません。

## stashエントリを指定したい場合は？
* 指定して復元したい場合は、念の為、その前にstashの中身をまず確認しましょう。
* 以下でstashエントリのリストを確認できます。

```terminal
$ git stash list
```

* 以下のようにエントリを指定します。

```terminal
$ git stash show stash@{1}
```

* すると、中身が表示されます。間違いない場合は、このエントリのみを指定して復元します。`n`の部分は、復元したいstashエントリの番号に置き換えます。

```terminal
$ git stash apply stash@{n}
```

* この場合も、上述の通り、`git stash pop　stash@{n}`でもOKですが、エントリを残しておきたいのかどうかで判断しましょう。

## stashエントリを削除したい場合は？
* 以下のコマンドを実行すると、`stash@{1}`エントリが削除されます。

```terminal
$ git stash drop stash@{1}
```

* リモートブランチの変更を取得し、現在のブランチにマージします。

```terminal
$ git pull

Username for 'https://github.com': github-xxx
Password for 'https://github-xxx@github.com': 
error: unable to unlink old 'xxxxxxx/settings.py': Permission denied
fatal: cannot create directory at 'xxxxx/xxxxxxxx': Permission denied
```

## パーミッションエラーの時は...
* `pull`時に、上記のようなエラーがでてくることがあります。
* これは、ファイルのパーミッションに関するエラーメッセージ。この問題を解決するには、sudoを使用して、管理者権限でgit pullを実行します。管理者権限でコマンドを実行することで、ファイルのパーミッションを変更することができます。

```
$ sudo git pull
```

* 管理者パスワードを求められる場合がありますので、パスワードを入力してください。このコマンドを実行することで、git pullが正常に実行され、ファイルのパーミッションが適切に変更されることが期待できます。


## 備考
* `pull`した後に変更が競合する可能性があるため、`pull`する前に変更をステージングすることが望ましい場合があります。
* `git stash`コマンドは一時的に変更を保存するための機能であるため、複数人での作業を行う場合や、長期間の作業を行う場合には、定期的に変更をコミットして、変更の履歴を残すことが望ましいです。あくまでそういった前提で進めている時の一時退避という使い方が適切でしょう。
GitHubにSSH鍵を追加する

# なぜ書いたか
GitHubからリポジトリを、httpsプロトコルではなくgitプロトコルでクローンしようとしたが、GitHubに以下のメッセージが表示されていた。

”You don't have any public SSH keys in your GitHub account. You can add a new public key, or try cloning this repository via HTTPS. ”

無視してgitプロトコルでクローンを試みたが、できなかった。

上記のメッセージは、GitHubアカウントに公開されたSSH鍵が存在しないため、リポジトリをSSH経由でクローンできないことを示している。
SSH鍵は、GitHubに対して安全な方法で接続するための認証情報であり、GitHubにアクセスするために必要。

よって、解決するには、新しい公開鍵を追加する必要がある。


#### 余談：httpsプロトコルとgitプロトコルの違い
両者とも、gitサーバーに接続するために使用されるプロトコルだが、httpsプロトコルは読み込みのみサポートしているのに対し、gitプロトコルは、読み込みと書き込みの両方をサポートしているという違いがある。
SSHとは接続方法の一つで、ローカルに秘密鍵と公開鍵を予め作り、GitHubに公開鍵を登録しておくことで行える通信方法。


# GitHubにSSH鍵を追加する
## 1.　.sshディレクトリが存在するか確かめる
デフォルトでは、SSH鍵は~/.sshディレクトリに保存される。このディレクトリが存在しない場合は、SSH鍵を生成する前にディレクトリを作成する必要がある。

以下のコマンドで確かめる。
```
ls ~/.ssh
```

もし、.sshディレクトリが存在する場合は、"id_ed25519"というファイルと、"id_ed25519.pub"というファイルがあるはず。

.sshディレクトリが存在しない場合は、以下のコマンドを実行して、ディレクトリを作成する。
```
mkdir ~/.ssh
```

このコマンドで、ホームディレクトリ直下に.sshというディレクトリが作成される。

## 2.　SSH鍵を生成
以下のコマンドを実行
```
ssh-keygen -t ed25519 -C "your_email@example.com"
```

## 3.　公開鍵を確認
~/.ssh/id_ed25519.pubファイルの中身を確認する。
```
cat ~/.ssh/id_ed25519.pub
```
このコマンドで返ってきた文字列が、公開鍵として使用される。これをコピーする。

## 4. 公開鍵をGitHubに追加する
GitHubのサイトにログインし、右上のアカウントアイコンをクリックし、"Settings"を選択。"Settings"ページで、左側のメニューから"SSH and GPG keys"を選択し、"New SSH key"をクリック。"Title"フィールドに任意の名前を入力し、"Key"フィールドに先ほどコピーした公開鍵の内容をペーストする。最後に、"Add SSH key"をクリックして鍵を追加する。

## 5. 鍵が正常に追加されたかどうか確認する
以下のコマンドを実行し、”Hi username! You've successfully authenticated, but GitHub does not provide shell access.”というメッセージが返されたら、成功。
```
ssh -T git@github.com
```
openai api を発行するまでの手順など

# 概要
- openai api を使用するまでの手順
- 及び補足情報




# openai アカウント作成
https://platform.openai.com/signup

- 上記からメールアドレスなどで登録する
- 確認メール
    - 確認メールが送られてくる
    - [ Verify email address ] という link から確認
- 個人情報の登録
    - 氏名、誕生日、電話番号など登録する
    - 電話番号に確認コードが送られてくるので認証する

基本となるアカウント作成は以上で完了




# chatgpt
https://chat.openai.com/

- 登録後 chatGPTが利用可能
- 基本は無料枠のみ
- [ upgrade to plus ] から課金すると、GPT-4が利用できる
    - 後述の API Key の課金とは別の月額課金となる。




# playground
https://platform.openai.com/playground

https://dev.classmethod.jp/articles/openai-playground/

- 提供されている様々な model の試行場所
- 後述のAPI同様に料金が発生する // 最初は無料枠が有る




# apikey
https://platform.openai.com/account/api-keys

- api key 作成
    - [ create new secret key ] を選択
    - [ create secret key ] を選択。 // random に key が決まる
    - 作成された key は控える
    - application などから key を用いてサービスを使用する




# api 利用方法
https://platform.openai.com/docs/introduction
https://platform.openai.com/docs/api-reference
https://platform.openai.com/examples

document, api 使用方法, サンプルコードなどが揃っている。




# example
https://platform.openai.com/docs/api-reference/introduction

- 上記に python の使い方が記述されている
- source 中に必要となる organization code は以下より
    - https://platform.openai.com/account/org-settings
- 以下 pythonでのサンプル

``` bash
pip install openai
```

利用可能 model を列挙する
``` python
organization = "DUMMY_CODE"   // organization code
openapi_api_key = "DUMMY_KEY"  // 作成した api key

import os
import openai
openai.organization = organization
openai.api_key = openapi_api_key
model_list = openai.Model.list()

print(model_list)
```




# free trial credit
https://platform.openai.com/account/usage

- 無料使用枠を確認できる.
- また、同画面上から利用状況と料金が確認できる




# bill
https://platform.openai.com/account/billing/overview

- api は従量課金となる
- [ set up paid account ] からクレジットカードを登録する




# 利用制限
https://platform.openai.com/account/billing/limits

- 使いすぎを抑制するため、課金料金の上限を設定できる

# 料金体系
https://openai.com/pricing

https://auto-worker.com/blog/?p=7005#
Flaskのflask db init時に発生するImportErrorの対処

## 概要
Flaskのデータベースを作成する際に、「flask db init」コマンドでImportErrorが発生し、migrationsファイルが作成されなかったため、いろいろ試したことをメモ。

## バージョン
```
flask==1.1.1
flask-sqlalchemy==2.4.3
flask-migrate==2.5.3
flask-login==0.5.0
flask-bcrypt==0.7.1
wtforms==2.3.1
email-validator==1.1.1
```

## 内容
`set FLASK_APP=setup.py`からの`flask db init`時に
```
ImportError: cannot import name 'escape' from 'jinja2'
```
というエラーが発生しました。
調べた所、Flaskのv1系はescapeモジュールが利用できないらしいです。
そのため、`flask==2.2.3`に更新しました。
すると、別のエラーが発生。
```
ModuleNotFoundError: No module named 'flask.ext'
```
こちらは、`flask.ext.sqlalchemy`が古い形で既にサポートされていない為`flask_sqlalchemy`に変更する必要がありました。
次のエラー。
```
AttributeError: module 'time' has no attribute 'clock'
```
`time.clock()`はPython3.6以降では削除されたらしいです。
なので、代わりに`time.perf_counter()`を利用します。
またまたエラー。。。
```
ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security'
```
このエラーに関しては[wergzeugのv2.1.0リリースノート](https://werkzeug.palletsprojects.com/en/2.1.x/changes/#version-2-1-0)によると、`safe_str_cmp`が削除されたため、利用できないとの事でした。
そのため、代替手段として`hmac`を利用しました。
次が最後のエラーです。。。
```
AttributeError: module 'sqlalchemy' has no attribute '__all__'. Did you mean: '__file__'?
```
https://teratail.com/questions/pmg713u6e7onk1 によると、SQLalchemyのv2系で起こるエラーのようで、解決方法としてはv3系にアップグレードするか、v1系にダウングレードするらしいです。
ただ、v1系だと依存関係でエラーが発生してしまう為、`flask-sqlalchemy==3.0.3`に更新しました。

## 最終的なバージョン
```
flask==2.2.3
flask-sqlalchemy==3.0.3
flask-migrate==2.5.3
flask-login==0.5.0
flask-bcrypt==0.7.1
wtforms==2.3.1
email-validator==1.1.1
werkzeug==2.2.3
jinja2==3.0.3
```

だらだら書いたせいで、読みにくくなってしまい申し訳ないですが、一人でもこの記事を見て解決してくれたら嬉しいです。
[AWS Q&A 365][AppSync]AWSのよくある問題の毎日5選 #30

# 1. AWS AppSyncにおけるリアルタイムデータとは何ですか？
回答：AWS AppSyncにおけるリアルタイムデータは、サブスクリプションを通じてリアルタイムの更新やデータの変更を受け取ることができる能力を指します。クライアントはデータ変更に対してサブスクライブし、常にポーリングする必要がなくリアルタイムに更新を受け取ることができます。

# 2. AWS AppSyncにおけるリアルタイムデータはどのように実装できますか？
回答：AWS AppSyncにおけるリアルタイムデータは、GraphQLサブスクリプションを使用して実装することができます。サブスクリプションにより、システム内の定義されたトリガーやイベントに基づいて、クライアントはデータのリアルタイム更新を受け取ることができます。

# 3. AWS AppSyncでリアルタイムデータを使用することの利点は何ですか？
回答：AWS AppSyncでリアルタイムデータを使用することは、レイテンシーの低減、ユーザーエクスペリエンスの向上、効率の向上などの利点があります。リアルタイムに更新を受け取ることができるため、常にポーリングする必要がなく、システム全体のパフォーマンスが向上します。

# 4. AWS AppSyncでのリアルタイムデータの使用例は何ですか？
回答：AWS AppSyncでのリアルタイムデータは、リアルタイムのコラボレーションツール、ライブチャットアプリケーション、リアルタイムモニタリングおよび分析ダッシュボードなど、さまざまな用途に使用することができます。

# 5. AWS AppSyncでリアルタイムデータを監視およびログに記録するにはどうすればよいですか？
回答：AWS AppSyncでリアルタイムデータを監視およびログに記録するには、CloudWatchメトリクスおよびログを使用することができます。CloudWatchメトリクスは、システムのパフォーマンスや使用状況のリアルタイムデータを提供し、CloudWatchログは、システムのイベントや問題の詳細な分析およびトラブルシューティングが可能です。
[AWS Q&A 365][AppSync]Daily Five Common Questions #30

# 1. What is real-time data in AWS AppSync? 
Answer: Real-time data in AWS AppSync refers to the ability to receive real-time updates and changes to data through subscriptions. It allows clients to subscribe to data changes and receive updates in real-time without the need for constant polling. 

# 2. How can real-time data be implemented in AWS AppSync? 
Answer: Real-time data can be implemented in AWS AppSync using GraphQL subscriptions. Subscriptions allow clients to receive real-time updates to data based on defined triggers or events in the system. 

# 3. What are the benefits of using real-time data in AWS AppSync? 
Answer: Using real-time data in AWS AppSync provides several benefits, including reduced latency, improved user experience, and increased efficiency. It allows clients to receive updates in real-time, reducing the need for constant polling and improving the overall performance of the system. 

# 4. What are some use cases for real-time data in AWS AppSync? 
Answer: Real-time data in AWS AppSync can be used in a variety of use cases, such as real-time collaboration tools, live chat applications, and real-time monitoring and analytics dashboards. 

# 5. How can real-time data be monitored and logged in AWS AppSync? 
Answer: Real-time data can be monitored and logged in AWS AppSync using CloudWatch metrics and logs. CloudWatch metrics provide real-time data on system performance and usage, while CloudWatch logs allow for detailed analysis and troubleshooting of system events and issues.
依存関係を解決できません 互換性がありません の解決記録（ASP.NET）

# コントローラーを追加しようとすると、以下のようなエラーが出た。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/91cac171-8c76-236b-9d8f-4e8e97925d86.png)

# 解決した手順
## NuGetパッケージマネージャーからパッケージマネージャーコンソールを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/3ed6eaf3-cd18-af4c-2615-7ce17501ccac.png)

## コマンドを実行し、EntityFrameworkのバージョンを確認する。
```
Get-Package EntityFramework
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/c99cc23a-0406-41ee-1f2b-821fd1ecf9e0.png)

## ソリューションのNuGetパッケージの管理を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/de4d64c8-ee63-e32d-0feb-7c2611bf03b3.png)


## インストール済みからEntityFrameworkを検索する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/e047fc7f-d758-dcbb-fa9d-89d478eb0a87.png)


## パッケージマネージャコンソールからEntityFrameworkの削除を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/9cd0b70f-5d14-8827-bec2-8e54d4687b44.png)


## 参照からEntityFrameworkを検索し、必要なバージョンをインストールし直す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/fb051781-0291-1a17-86d0-c58d0086f6dd.png)


# 注意事項
- この記事では、visual studio 2022を使用しているので、試してみたい方は事前に準備が必要です。

# この記事は誰向けの記事か？
- 試しにASP.NETを始めてみたいと思っている人

# 環境
- OS：Windows10
- [visual studio 2022](https://visualstudio.microsoft.com/ja/vs/)
- [Visual Studio Community Edition](https://visualstudio.microsoft.com/ja/downloads/)

# 本記事における注意事項
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。
【Firebase】GitHub Actionsを使ったFirebase Hostingの自動デプロイ時のRequestError

Github ActionsでFirebase Hostingへ自動デプロイしようとしたところ以下のエラーが出た

```
Run FirebaseExtended/action-hosting-deploy@v0
/home/runner/work/_actions/FirebaseExtended/action-hosting-deploy/v0/bin/action.min.js:3759
                const error = new RequestError(message, status, ***
                              ^

RequestError [HttpError]: Resource not accessible by integration
    at /home/runner/work/_actions/FirebaseExtended/action-hosting-deploy/v0/bin/action.min.js:3759:31
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async createCheck (/home/runner/work/_actions/FirebaseExtended/action-hosting-deploy/v0/bin/action.min.js:5680:17)
    at async run (/home/runner/work/_actions/FirebaseExtended/action-hosting-deploy/v0/bin/action.min.js:11435:14) 
...
以下省略
```

### 対処法
GitHubのリポジトリのSettings→Actions→GeneralのWorkflow permissionsでRead and Write Permissonsを選択する。Allow Github Actions to create and approve pull requestｓも選択する。


参考：https://stackoverflow.com/questions/75514653/firebase-action-hosting-deploy-fails-with-requesterror-resource-not-accessible
コントローラを作成する手順（ASP.NET）

# コントローラーを選択する。
ソリューションエクスプローラ＞Controllers＞追加＞コントローラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/9dc5edcd-bb9b-688b-8fd5-e155e579fcd5.png)

# MVCのコントローラーを選択する。
この記事では、Entity Frameworkを使用した、ビューがあるMVC5コントローラーを選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/95e1a6f0-0d86-d595-959a-a5900c4d1977.png)

# モデルクラスでモデルを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/9a04586a-9425-b745-db23-b58190904bbb.png)

# データ コンテキスト クラスでデータベースを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/0f2aca77-1357-5b7d-af6f-6bdf0694a07d.png)

# コントローラー名を記入し、追加する。
コントローラー名の最後には、Controllerをつけておくこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/696dcddc-c00f-f33a-6056-81b1b6c284c0.png)
**※コントローラーの作成に失敗する場合は、[こちら](https://qiita.com/portfoliokns3/items/e6b67fbbc15fa2ff74ef)のトラブル解決を確認してください。**

# コントローラー（＋ビュー）が作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/50bda8e4-bb7b-1788-c8c4-5eb11a2ca753.png)
コントローラーの中には、Getなどのアクションが準備されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/868c3f0c-81ff-f095-0347-56aef58c55a4.png)

# 注意事項
- この記事では、visual studio 2022を使用しているので、試してみたい方は事前に準備が必要です。
- 関連する記事の一覧は[こちら](https://qiita.com/portfoliokns3/items/7c789b7e1ba40500abbb#%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E6%89%B1%E3%81%A3%E3%81%A6%E3%81%84%E3%81%8D%E3%81%9F%E3%81%84%E4%BA%BA%E5%90%91%E3%81%91%E3%81%AE%E8%A8%98%E4%BA%8B-1)。
※参照先のリンクが切れている場合は、[トップページ](https://qiita.com/portfoliokns3)から確認してください。

# この記事は誰向けの記事か？
- 試しにASP.NETを始めてみたいと思っている人

# 環境
- OS：Windows10
- [visual studio 2022](https://visualstudio.microsoft.com/ja/vs/)
- [Visual Studio Community Edition](https://visualstudio.microsoft.com/ja/downloads/)

# 本記事における注意事項
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。