OmniAICreator/Qiita-1.07M huggingface dataset:
ターミナルエミュレータ Tera Term v5 のインストール

Tera Term は Windows 用の無料のターミナルエミュレータソフトウェアです。遠隔にあるサーバへのTelnet、SSHなどを介したリモート接続、周辺機器やセンサとのシリアル通信に使用されます。

## Tera Term を使う目的
Tera Term は以下のような用途で使われます。

### リモートサーバーへのアクセス
Tera Term v5 は SSHのrsa-sha2（RSA/SHA2）をサポートし、セキュアなアクセスが可能です。ssh-rsa が無効化されている Amazon Linux 2023 に接続できます。

### シリアル通信
Tera Term はシリアルポートを介してデバイスとの通信を可能にし、組み込みシステムのデバッグやプログラムのアップロード/ダウンロードなどに使用されます。

### 作業の自動化
Tera Term マクロを使って、VT 端末へのオートログインなどの機能を実現することができます。 

## Tera Term v5のシステム要件
Tera Term v5 は 以下の環境で動作します。

オペレーティングシステム： Windows 7, 8, 10, 11

ここでは Tera Term ポータブル版 v5.1 を例にして Windows 11 へのインストール方法を紹介します。

## Tera Term のインストール方法
### ダウンロード
窓の杜の Tera Term の紹介ページにアクセスし、Tera Term ポータブル版（v5系統）を「**窓の杜からダウンロード**」します。
[https://forest.watch.impress.co.jp/library/software/utf8teraterm/](https://forest.watch.impress.co.jp/library/software/utf8teraterm/)

![03_officialsite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/bf78f4eb-1477-7b2f-72d9-1545173b8731.png)

### 展開先フォルダの作成
ポータブル版をインストールするフォルダを作成します。ここでは例として **C:\ProgramFiles** というフォルダを新規作成します。

![11_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/81c701cc-2da5-e367-ea85-6e7f97143822.png)

### ファイルの展開
ダウンロードした ZIP ファイルの中にある **teraterm-5.1** のフォルダを **C:\ProgramFiles** にコピーします。

![15_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/ca308726-f901-005e-4de5-82da64e2ca67.png)

以上でインストール作業は終了です。

## 初回起動時の設定
TeraTerm を使う時は **C:\ProgramFiles\teraterm-5.1\ttermpro.exe** を実行します。

![21_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/c19391f0-da61-3741-9160-749475549dfe.png)

接続先選択画面が表示されたら、「**Cancel**」をクリックします。

![23_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/ab09a1e9-3c1a-09c7-4bd9-9b58744e2d02.png)

メニューから、「**Setup**」>「**General**」をクリックします。

![25_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/c05c0363-a98e-1f90-1695-40b53e96b556.png)

全般設定画面が表示されたら、「**LanguageUI**」>「**Japanese.lng**」を選択します。

![27_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/8121bcab-e216-7750-9f23-bab46fe0077d.png)

「**OK**」をクリックします。

![29_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/4c2acbaa-f206-f6b1-3fb9-2720bfd51f8f.png)

メニューから、「**設定**」>「**設定の保存**」をクリックします。

![33_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/91d946ce-6fa2-ff49-ef70-ad8d6c143bb7.png)

設定の保存画面が表示されたら、「**保存**」をクリックします。

![35_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/483fc7d1-2979-0574-72b2-36d81e523cf0.png)

確認画面が表示されたら、「**はい**」をクリックします。

![37_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/fbc1c1ea-18f5-4813-8aea-31e2977a4a1b.png)

これで日本語化作業の完了です。
【rails】Rspecおける基本事項まとめ

# 事前準備

1.下記のgithubより Gemfileに追加するコードを確認し、
gemfileに記述する。
```
# Run against this stable release
group :development, :test do
  gem 'rspec-rails', '~> 6.1.0'
end
```

https://github.com/rspec/rspec-rails?tab=readme-ov-file#installation

2.bundle installコマンドにて上記のgemライブラリをインストールする。

3.docker-compose run web bundle exec rails g rspec:installにてrspecを実行するためのファイルを作成する。

→ railsファイル直下に``spec > spec_helper.rb``が生成される。

4.docker-compose exec web bundle exec ra
ils g rspec:model Model名
にてModelにおけるテスト用のファイルを生成する。

5.rails_practice % docker-compose exec web bundle exec rails g rspec:controller コントローラー名
にてcontrollerにおけるテスト用のファイルを生成する。

# Modelにおけるテスト
### テスト実行コマンド

```
docker-compose exec web bundle exec rspec ./spec/models/

## rspecコマンドの後にディレクトリ名を記載
```

### テスト構文
```test.rb
describe '#age' do  # テストするメソッド名を記載
    context '20年前の生年月日の場合' do　　　#どのような条件下でテストを行うかを記載
      let(:user) { User.new(birthday: Time.zone.now - 20.years) }

      it '年齢が20歳であること' do　　　　　　　# 最終的に正しい状態をテスト
        expect(user.age).to eq 20
      end
    end
  end
```
無料枠のe2-microでWEBサーバー立ててもロードバランサー使うとお金かかるから気を付けて

## 発生した問題
GCPの永年無料枠を使ってe2-microでWEBサーバーを立て、HTTPS接続できるサイトとして公開したところ、毎日約90円のNetworking料を請求されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254014/70f59cf2-d116-312e-8ba2-31d0af6f5d96.png)

なお、HTTPS接続にするにあたって以下の記事を参考に、ロードバランサーを用いました。
https://zenn.dev/knockknock/articles/10aa24fde47c45

## 原因
ロードバランサーを使うことで、SSL証明書は無料で取得できますが、おそらくロードバランサー自体に料金がかかります。
※もしかしたら、ロードバランサーに固定IPを割り当てる部分で料金がかかってるのかも。この辺りの厳密な切り分けまでは出来てないです。

## 対策
そのため、以下のことを実施しました。

1. ロードバランサー削除
2. 固定IPの解放
3. インスタンスグループの削除
4. DNSレコードのIPをロードバランサーからe2-microに向き先変更
5. let's encriptの導入

1から4まではGCPのコンソールから簡単にできます。

5のlet's encriptの導入は、下記の記事を参考に実施しました。
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04-ja

## 結果
そしたら、無事ネットワーキングの請求がなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254014/ae24cfd0-4b54-d806-e39d-ed8dfbfd5893.png)


これで、HTTPS接続できるWEBサービスが無料で公開できます。
ABC337回答メモ

# 0.はじめに
　全体的に易しめの問題だった気がする337回でした。
　とはいえ、A~Cは順調に解いたもののDでケアレスミスで大停滞。
　3回もWAをだしてスコアを落としました。
　とはいえ、なんとか、レートは±0で持ちこたえました。

　Ｅは時間のない中強引にチャレンジしたものの玉砕。
　その後解説を見ながらなんとか解けました。
　Ｆは解説見ないでも行けそうと取り組みましたが
　最初の印象より複雑で、解説を見ても解き方は
　あってる気がしますが、実装力が追い付かない感じです・・・。


# 1.A - Scoreboard
　因縁の高橋君対青木君シリーズ。
　入力したXとYを集計し
　最後に判定して結果を出力してAC。

　https://atcoder.jp/contests/abc337/submissions/49436976


# 2.B - Extended ABC
　B問題と高をくくってとりかかったところ、意外と実装が難しいことに気づきました。
　結局、結構複雑な実装をする羽目になりました。

　【実装】
 　　前準備として、文字列を先頭から読み、文字と連続する文字数のタプルを
　　 リストSLに格納する。（よく考えたら文字数は不要でした・・・）
　　例）AAABBBCCCCCCC
  　　→SL=[("A",3),("B",3),("C",7)]
    以下、SLの長さ毎に場合分け
    len(SL)が4以上の時
    　拡張 ABC 文字列の条件下ではSLは最大3組までなので、Noを出力して終了
    len(SL)が3の時
    　SL[0][0]="A"＆SL[1][0]="B"＆SL[2][0]="C"を満たせばYesを
      満たさなければNoを出力して終了
    len(SL)が2の時
    　SL[0][0]とSL[1][0]が、AB、AC、BCの組の場合Yesを
      満たさなければNoを出力して終了
    len(SL)が1の時
    　S内はABCしかないという条件下では、必ず拡張 ABC 文字列の条件を
      満たすのでYesを出力して終了

　力技でACを頂きました。

　https://atcoder.jp/contests/abc337/submissions/49450281


# 3.C - Lining Up 2
　問題文を読み解くのに手間取りましたが、実装自体は
　それほど難しくない問題。

　【実装】
　　・準備として、リストを読み、キーにA[i]、値にi(+1)を持つ
  　　辞書Dを作成し、変数sに-1の位置(i+1)を保持する。
      →Dはkeyの次に並んでいる人をValueにセットした辞書
　　・リストansにsをセット
 　 ・以下をN-1回実施
   　 ・sにD[s]をセット
      ・sをansに追加
    ・ansを出力して終了
 　　
　https://atcoder.jp/contests/abc337/submissions/49458474

# 4.D - Cheating Gomoku Narabe
　一目見てスキップしようと思いましたが、そのあとの問題も
　大変そうだったのであきらめて挑戦。
　斜めの判定が無いのが救いでした。

　【考え方】
 　　・各行列毎に以下のチェックを行う
   　　・先頭から.とoの数を数えてそれぞれ変数cpとcoにセット
   　　・cpとcoの合計がKと一致した場合
     　　→cp個の.をoに変えればK個連続したoを作れる事になる
       　・ansにansとcpの小さい方をセット
    　・ただし、途中にxが出てきたら、cpとcoを0にクリア
      ・また、cpとcoの合計がKと一致した点から、K個前が
      　.だったらcpから、oだったらcoから1をマイナス。
       　(尺取法的に参照していく)
 　　・最後にansを出力して終了

　理屈は早めに分かったのですが、”cpとcoの合計がKと一致した点からK個前”の　
　計算が間違っていたのに気づかず無駄に3回ほど提出を繰り返してしまいました・・・。
  
　https://atcoder.jp/contests/abc337/submissions/49499207

以上
paiza.ioでelixir その280

# 概要
paiza.ioでelixirやってみた。
persistent_termやってみた。

# サンプルコード

```


:persistent_term.get()
|> IO.inspect

:persistent_term.get() 
|> length()
|> IO.inspect

#:persistent_term.get(:foo)

:persistent_term.put({MyApp, "feeling"}, "good")
|> IO.inspect

:persistent_term.put({MyApp, "language"}, "Japanese")
|> IO.inspect

:persistent_term.get({MyApp, "feeling"})
|> IO.inspect

:persistent_term.get({MyApp, "language"})
|> IO.inspect




```

# 実行結果

```
[
  logger_proxy: {:logger_proxy, #PID<0.68.0>,
   #Reference<0.1797668008.2074738689.62567>}
]
1
:ok
:ok
"good"
"Japanese"
```

# 成果物

https://paiza.io/projects/KpStyK77YqR_dz99S1tbNg

以上。
plunkerでshadertoy sandbox その 6

# 概要
plunkerでshadertoyのglsl動かしてみた。

# 参考にしたページ

https://www.shadertoy.com/view/DsVSDR

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/eafb6d74-5070-901a-ee1f-57ba04c3e6d6.png)


# サンプルコード

```
precision mediump float;
uniform vec2 iResolution;
uniform float iGlobalTime;
uniform float iChannelTime[4];

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 n, 
			q, 
			p = (fragCoord - iResolution.xy * 0.5) / iResolution.y;
    float d = dot(p, p), 
			S = 9.0, 
			a = 0.0, 
			j = 0.0;
    for (float i = 0.0; i < 30.0; i++) 
		{
        mat2 m = mat2(cos(5.0), -sin(5.0), sin(5.0), cos(5.0));
        p *= m; 
				n *= m;
        q = p * S + iGlobalTime * 4.0 + sin(iGlobalTime * 4.0 - d * 6.0) * 0.8 + j + n;
        a += dot(cos(q) / S, vec2(0.2));
        n -= sin(q);
        S *= 1.2;
        j += 1.0;
    }
    fragColor = (a + 0.2) * vec4(4.0, 2.0, 1.0, 0.0) + a + a - d;
}

void main() {
	vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
	mainImage(color, gl_FragCoord.xy);
	color.w = 1.0;
	gl_FragColor = color;
}

```

# 成果物

https://embed.plnkr.co/plunk/PwYzWDRr32toNR6l


以上。
PICAXE（ピカクス） リンク集

## PICAXEリンク集

### PICAXE本家
PICAXE オフィシャルサイト
https://picaxe.com/

### PICAXE購入
秋月電子通商 PICAXE　ページ
https://akizukidenshi.com/catalog/c/cpicaxe
ロボショップ株式会社
https://jp.robotshop.com/collections/revolution-education-en

### 有志サイト
wikipedia
https://en.wikipedia.org/wiki/PICAXE

ラジコン飛行機の製作ブログ
https://kurosawa.e-rc.jp/

剣菱P　ぐだロボ
http://somtec.blog5.fc2.com/blog-category-3.html

電気の迷宮
http://eleclabyrinth.blog.fc2.com/blog-category-5.html

ＰＩＣＡＸＥで始めよう！
https://qiita.com/akbrobot/items/4f376bcc56a3c660f694

PICAXE（ピカクス）を使ってみる
http://radiopench.blog96.fc2.com/blog-category-28.html

airvariable
https://airvariable.asablo.jp/blog/cat/picaxe/

hiro0719jpのブログ
https://ameblo.jp/hiro0719jp/entry-11729139560.html

アキバ通いと旅
http://vabenecosi.blog.fc2.com/blog-category-8.html

PICAXE
https://blogtag.ameba.jp/news/PICAXE

ニコニコ大百科
https://dic.nicovideo.jp/a/picaxe

電子工作 ＆ マイコン･プログラミング資料集
https://www9.gunma-ct.ac.jp/staff/mame/CSA/

## PICAXE関連の投稿
PICAXE（ピカクス）でLチカ
https://qiita.com/masashi_214/items/5495503bf6bd82c1980b
PICAXE 最初に調べた事
https://qiita.com/masashi_214/items/d1acb1ecdc32de5a1698
PICAXEで鉄道模型の在線検出と信号機の制御
https://qiita.com/masashi_214/items/c728814df4f7a2453112
PICAXE（ピカクス）のポート設定
https://qiita.com/masashi_214/items/e5d5e1b9817aed754f52
PICAXE（ピカクス） リンク集
https://qiita.com/masashi_214/items/8b630b2c60ddb466b1ac
PICAXE（ピカクス）のpwm設定
https://qiita.com/masashi_214/items/f92e52837a9fa902879f
PICAXEでPWMを使用した調光機能を使って蛍を作る
https://qiita.com/masashi_214/items/0231a75ae0c77c2be206
【FastAPI】idをuuidで設定するときは型定義に気をつけたい

# 概要

FastAPIで遊んでいたときDBから情報を取得できなくなってしまったので、内容を共有しておきたい。
原因を明確にできてはいないが、対応策はあるためご容赦いただきたい。

# 流れ

APIを作成しているとき、ブログのid(uuid)をエンドポイントにしている。

```python
# router/blog.py
@router.get("/blog/{blog_id}", response_model=schema.Blog)
async def read_blog(blog_id: UUID, db: AsyncSession = Depends(get_db)):
    """個別のブログを取得する"""
    blog = await blog_crud.get_blog_by_id(db, blog_id)
    if blog is None:
        raise HTTPException(status_code=404, detail="Blog not found")
    return blog
```

`read_blog`ではUUIDを受け取っている。
受け取ったUUIDをもとにデータベースへ検索をかけている

```text
mysql> select * from blog;
+--------------------------------------+-------+---------+---------------------+
| id                                   | title | content | createdAt           |
+--------------------------------------+-------+---------+---------------------+
| 51048962-e046-4626-88a7-4d936c381e62 | fuga  | ??????  | 2024-01-21 09:02:21 |
| ecde0849-980a-4932-a9ef-52443ad7a740 | piyo  | ??????  | 2024-01-21 09:02:26 |
+--------------------------------------+-------+---------+---------------------+
```

```python
# cruds/blog.py
async def get_blog_by_id(db: AsyncSession, blog_id: UUID) -> blog_model.Blog | None:
    """ブログを取得する。"""
    result: Result = await db.execute(select(blog_model.Blog).filter(blog_model.Blog.id == blog_id))
    return result.scalars().first()
```

個別のエンドポイントへアクセスしても、データベースに登録されているid(UUID)なのに情報を取得できなくなってしまった🤔
全件の場合は正しく取得できている。

```json
[
  {
    "title": "fuga",
    "content": "ブログの内容",
    "id": "51048962-e046-4626-88a7-4d936c381e62",
    "createdAt": "2024-01-21T09:02:21"
  },
  {
    "title": "piyo",
    "content": "ブログの内容",
    "id": "ecde0849-980a-4932-a9ef-52443ad7a740",
    "createdAt": "2024-01-21T09:02:26"
  }
]
```

ログをよく見ると出力されたSQLクエリのパラメータで、UUIDがハイフンなしの形式で表示されている。

```bash
2024-01-21 09:22:14 fast-api-1  | 2024-01-21 09:22:14,750 INFO sqlalchemy.engine.Engine [generated in 0.00016s] ('ecde0849980a4932a9ef52443ad7a740',)
2024-01-21 09:22:14 fast-api-1  | 2024-01-21 09:22:14,751 INFO sqlalchemy.engine.Engine ROLLBACK
2024-01-21 09:22:14 fast-api-1  | INFO:     192.168.32.1:47126 - "GET /blog/ecde0849-980a-4932-a9ef-52443ad7a740 HTTP/1.1" 404 Not Found
```

# 解決策

`read_blog`の型を`UUID`ではなく`str`で受け取れば解決する。

```python
@router.get("/blog/{blog_id}", response_model=schema.Blog)
async def read_blog(blog_id: str, db: AsyncSession = Depends(get_db)):
    """
    個別のブログを取得する
    """
    blog = await blog_crud.get_blog_by_id(db, blog_id)
    if blog is None:
        raise HTTPException(status_code=404, detail="Blog not found")
    return blog

async def get_blog_by_id(db: AsyncSession, blog_id: str) -> blog_model.Blog | None:
    """ブログを取得する。"""
    result: Result = await db.execute(select(blog_model.Blog).filter(blog_model.Blog.id == blog_id))
    return result.scalars().first()
```
インタラクティブ問題でpexpectがいい感じだった話

# とあるABC337にて
こんな問題が出てきました。

https://atcoder.jp/contests/abc337/tasks/abc337_e

具体的な問題は実際に見てもらうとして、本題はこれが**インタラクティブ**問題だということです。
つまりコードテストにぶちこむだけでは合ってるかどうかすらわからない。これではペナりまくってしまう。
ですのでテスターをサクッと自作したいと思います

# subprocessを使う
やばい、めんどい、使いたくない。
pipeとかを使えば行けるぽいですが、osレベルの話に関わってくるのでコンテスト中に作成するのは断念

# pexpectを使う
subprocess以外に出てきたいい感じのやつです。
以下[ここ](https://pexpect.readthedocs.io/en/stable/overview.html)からサンプルコード
```python
# This connects to the openbsd ftp site and
# downloads the recursive directory listing.
import pexpect
child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('Name .*: ')
child.sendline('anonymous')
child.expect('Password:')
child.sendline('noah@example.com')
child.expect('ftp> ')
child.sendline('lcd /tmp')
child.expect('ftp> ')
child.sendline('cd pub/OpenBSD')
child.expect('ftp> ')
child.sendline('get README')
child.expect('ftp> ')
child.sendline('bye')
```

単純で使いやすそうです。

そして以下が作ったテスターになります
```python
import random
import pexpect
import time
    
def main(n):
    
    p = pexpect.spawn('python3 e.py')
    x = random.randint(1,n)
    #print("n:",n)
    p.sendline(str(n))
    p.expect("\n")
    m = p.before.decode(encoding='utf-8')
    p.expect("\n")
    m = p.before.decode(encoding='utf-8')
    print("n:",n,"m:",m)
    m = int(m)
    result = ""
    for i in range(m):
        p.expect("\n")
        s = p.before.decode(encoding='utf-8').split()
        #print(f"{i+1}:",s)
        s = list(map(int,s))[1:]
        if x in s:
            result+="1"
        else:
            result+="0"
    p.sendline(result)
    p.expect("\n")
    s = p.before.decode(encoding='utf-8')
    p.expect("\n")
    s = p.before.decode(encoding='utf-8')
    if int(s)!=int(x): #or not(2**m>n and 2**(m-1)<=n):
        print("n:",n)
        print("s:",s)
        print("x:",x)
        time.sleep(9999)


if __name__ == "__main__":
    while True:
        for i in range(2,101):
            main(i)
```

# 注意点
1. どうやらWindowsで動かすのはめんどくさいらしい
    Window上で動かすとどういうわけかエラーを吐く、Linuxなら上手くいくらしいのでWSLで代用

2. 一部の入力は二回連続受け取らないといけないぽい
    なんでだ？まぁこれで上手くいくので別に問題ない
androidAPI返却物受け口のススメ

# はじめに
今回はAndroideでAPIからの返却物を受け取る際の構造で自分が一番良かったなと感じるものを紹介していきます
### 本文
下記を用意した上でRepositoryから渡すのを`Result`のみにすることでエラーの種別によってハンドリングすることが非常に容易になります。
また、UseCaseで無駄なハンドリングをせずに結果を返すだけの機構にできるので可読性も向上します
```kotlin
sealed class Result<out T : Any> {
        data class Success<out T : Any>(val value: T) : Result<T>()
        data class HttpError<out T : Any>(val httpStatusCode: Int) : Result<T>()
}
```
### 最後に
自分が最近エラーハンドリング周りを触ることが増えたので備忘録として紹介してみました
どなたかのお役に立てれば幸いです
マネジメントコンソールにログインするIAMユーザー作成の注意点



# TL;DR 
- マネジメントコンソールへのログインユーザーを作成する場合、Identity Centerで作成する方式がデフォルトかつAWSの推奨（2024年1月現在）
- Identity Center で作成したユーザーのログイン方法（画面）は従来のものと違う
- Web では少し古い情報が残りがちなので、当面、とくにAWS初心者は「IAMユーザーを作成します」を選んでおくのが無難

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092759/6c97f5f4-ee47-7fdb-f6c5-528707a2965b.png)

# はじめに
自分はAWS を触り始めたのが割と最近で、実はマネジメントコンソールへのログインに非常に苦労しました。（去年の8月頃）

問題は割とすぐに解決されました、具体的には以下のような画面からログインする事ができたのですが、知り合いには「知らない画面だ」と言われ、頭に？？が残った状態でした。

その「知らない画面」：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092759/8a2aff39-7798-1d8c-9e98-6349151fffe2.png)

通常の画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092759/aa55dd4f-9ac6-58aa-bd3d-528714d2979d.png)

この件の原因が最近になってようやく分かったので、情報として残したいと思います。
（何番煎じだとしても）

# 原因
どうやら、自分が作成したのはIAMユーザーではなく、Identity Centerのユーザーだったようです。まだまだ初学者レベルなので　Identity Center とはなんぞや、は少しの間放置しようと思いますが、2023年の3月頃にはじまった新サービスのようです。

AWS 的には Identity Center を使った方式が推奨らしく、コンソールへのログインユーザー作成の際も「Identity Centerでユーザーを指定する」が **デフォルト選択** かつ **「推奨」の表示**があり、AWS初学者だった自分は訳もわからずこれを選択してしまった訳です。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092759/6c97f5f4-ee47-7fdb-f6c5-528707a2965b.png)

また、AWSさわり始めてからも、「Identity Centerは AWS Organizationsの使用が前提」という情報をどこかで見て、「企業向けのサービスかな、自分の個人アカウントには関係ないな」と決めつけていたのも問題だったかもしれません。

# Identity Center 
一応、「Identity Center」でユーザーを作成するときのログインまでの流れのメモを残します。

- マネジメントコンソール：IAM > ユーザー > 新規作成

- AWS マネジメントコンソールへのユーザーアクセスを提供する にチェック

- Identity Centerでユーザーを指定する　を選択 > IAM Identity Centerサービスへ移動する

各種ユーザー情報を入力。以下が必須
- ユーザー名
- Eメールアドレス
- 名
- 性
- 表示名

ユーザー作成すると、指定したEメールアドレスに「Invitation to join AWS...」というメールが来る
- メール内の　Accept Invitation をクリックしてパスワードを設定
- メール内の「Your AWS access portal URL:　」のURLからログインする

（下のような画面に遷移する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092759/8a2aff39-7798-1d8c-9e98-6349151fffe2.png)

# 最後に
AWSをさわりたてで IAM って何？ってなっている人がここまで理解するのは無理ってものです。
Identity Center でユーザーを指定する　をデフォルト選択にしたり、「推奨」と表示するのは少しやりすぎじゃないかな。。。と思います。
AWS 金額上限アラートの設定

AWSには機能によって料金体系が異なり、意図しないところで課金され気づいたら、、ということも、、

私も以前、設定した内容を誤り、思った以上の金額請求されたこともあるため、慎重になっていることもあり、金額上限のアラートを設定することにしました

※残念ながら上限超えた際、アラートのみで使用している機能の停止し料金かからなくなるとかではないのであしからず、、


## 手順

#### 1.　アカウント>予算>予算を作成の順でアクセス
![スクリーンショット 2024-01-21 8.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/bc894b8f-6020-5afc-6f99-38d3a876fba2.png)

#### 2.　テンプレートを選択し、金額を設定します
今回は、テンプレートを使用し月の予算で問題ないので月次コスト予算にします  
細かい期間など決めたい場合はカスタマイズ選んでください

あとは、項目名や初期値を参考に設定金額や、通知時のメールアドレスなどを入力で完了です

![スクリーンショット 2024-01-21 8.36.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/f20cccb3-6544-83b4-a9db-8b69047e8b8a.png)



## 参考記事

https://tipstour.net/aws-budget-alert
DatabricksノートブックのUIからウィジェットを追加できるようになりました

こちらのリリースです。これまではプログラムからしか追加できなかったのですよね。

[Create widgets from the Databricks UI](https://docs.databricks.com/en/release-notes/product/2024/january.html#create-widgets-from-the-databricks-ui)

マニュアルはこちら。

[UI を使用したウィジェットの作成](https://docs.databricks.com/ja/notebooks/widgets.html#create-widget-using-the-ui)

ノートブックメニューから**編集 > ウィジェットの追加**を選択します。
![Screenshot 2024-01-21 at 8.21.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/951783e7-37de-9288-feb0-72b446645841.png)

ダイアログが開きますので、ウィジェットのタイプやパラメータ名を指定して、**ウィジェットを追加**をクリックします。
![Screenshot 2024-01-21 at 8.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e89ee2e1-1eec-d885-6c64-9824be4db0bd.png)

追加されました！
![Screenshot 2024-01-21 at 8.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fdac8bef-5a57-0324-4e5a-b832be57ce72.png)

Python widget APIでウィジェットにアクセスします。

```py
print(dbutils.widgets.get("text_widget"))
```

上のコマンドを実行するとウィジェットの値にアクセスできます。
![Screenshot 2024-01-21 at 8.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ea1a3779-3caa-0792-68eb-caa7ae18fe41.png)

ウィジェットの値を変更すると先ほどのセルが実行され、値が更新されます。
![Screenshot 2024-01-21 at 8.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/99fed0a7-673b-54bf-546d-aabba28ea54a.png)

なお、この挙動はウィジェット右上のギアマークから変更できます。
![Screenshot 2024-01-21 at 8.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71730273-b326-4d33-7d63-4b61f8989145.png)
![Screenshot 2024-01-21 at 8.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5f3aaa0b-373f-e2b1-80a8-44e16101b9bd.png)

ちなみに先日の[LlamaIndexのノートブック](https://qiita.com/taka_yayoi/items/ef62d14a4f7d4874e68c)を少し変えるだけで、ウィジェット経由でやりとりできるようになります。

```py
query_engine = index.as_query_engine()
response = query_engine.query(dbutils.widgets.get("prompt"))
print("回答: ", response)
```
![Screenshot 2024-01-21 at 9.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0e3b6589-3a7d-122e-89e1-aefc0a7f1e53.png)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
アクセス権のない Azure Key Vault のシークレットに何があるか Azure REST API で確認してみた

例えば、アクセスポリシーや RBAC でアクセス権を付与されていない Azure Key Vault があったとします。下記のように、シークレットにアクセスすると「このコンテンツを表示する権限がありません。」と表示される状態です。

![azure-keyvault-secret-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/81455a3e-5c9c-c33d-3e19-24eaa461a854.png)

当然 Azure CLI で下記のように実行すると `AccessDenied` と表示されます。

```bash:bash
$ az keyvault secret list --vault-name mnrlabo
Inner error: {
    "code": "AccessDenied"
}
```

## Azure REST API でシークレットに何があるか確認

`helloworld` というシークレットが 1 つあることが確認できます。また、シークレットの値はアクセス権がないと表示できません。

```bash:bash
$ az rest --url "https://management.azure.com/subscriptions/25695fc8-000-0000-0000-f98a857adbe2/resourceGroups/mnrlabo-rg/providers/Microsoft.KeyVault/vaults/mnrlabo/secrets?api-version=2015-06-01"
{
  "value": [
    {
      "id": "/subscriptions/25695fc8-000-0000-0000-f98a857adbe2/resourceGroups/mnrlabo-rg/providers/Microsoft.KeyVault/vaults/mnrlabo/secrets/helloworld",
      "location": "japaneast",
      "name": "helloworld",
      "properties": {
        "attributes": {
          "created": 1673483266,
          "enabled": true,
          "exp": 7980681854,
          "nbf": 1673481854,
          "updated": 1673483266
        },
        "contentType": "application/x-pkcs12",
        "secretUri": "https://mnrlabo.vault.azure.net/secrets/helloworld",
        "secretUriWithVersion": "https://mnrlabo.vault.azure.net/secrets/helloworld/fceba66c23d24b9a93121bbec3f9ae99"
      },
      "type": "Microsoft.KeyVault/vaults/secrets"
    }
  ]
}
```

## 参考

https://learn.microsoft.com/ja-jp/rest/api/keyvault/keys/get-keys/get-keys?view=rest-keyvault-keys-7.4&tabs=HTTP

https://learn.microsoft.com/ja-jp/rest/api/keyvault/secrets/get-secrets/get-secrets?view=rest-keyvault-secrets-7.4&tabs=HTTP
よさげなアイコンをまとめる

# 概要
CDNから参照できたりできなかったりする、フロントエンドで使えるアイコンを提供しているサービス・ページ・リポジトリ等をメモ。

# 本題
## [Font Awesome](https://fontawesome.com/)

>Font Awesomeとは？
Font Awesomeとは、Webサイトにアイコンフォントを簡単に表示させることができるWebサービスです。
提供されているアイコンフォントは商用利用可能となっていますので、個人開発されているWebサイトやブログに導入できます！
また、Font Awesomeのアイコンフォントはサイズ・色の変更ができるだけでなく、サイズを大きくしても画質が悪くならないといったメリットがあります。
無料版でも利用できるアイコンフォントは多くあるので、まずは本記事を基にお試しいただければと思います。
引用元: https://tech-blog.rakus.co.jp/entry/20220127/fontawesome

## [Boxicons](https://boxicons.com/)
> Boxiconsは、数多く公開されている他のsvgのアイコンフォントと同様にそれを利用するためのcssが同梱され、class指定するだけで簡単にアニメーションさせたり、反転や回転などの画像操作が可能です。合わせて公開されていているアイコンは数多くあります。Boxiconsもその一つで、簡単なcss指定だけで多くのアイコン表示が可能で、かつ商用フリーで利用できます。
引用元: https://stluke7.web.fc2.com/boxicons.html

## [SVG Loaders](https://samherbert.net/svg-loaders/)
実態は見てもらった方が早い。
リポジトリは[こちら](https://github.com/SamHerbert/SVG-Loaders)。

## [Bootstrap Icons](https://icons.getbootstrap.jp/)
> フリー、高品質、オープンソース、そして1,800以上のアイコンを持つアイコンライブラリです。SVGやSVGスプライト、Webフォントなど多様な方法で利用できます。Bootstrapと合わせても、合わせなくても使えます。

Bootstrapにアイコンあるんやね。。。

# さいごに
ほかにも見つけたら追記していきます。
【Docker】GitHubActionsでghcr.ioにマルチプラットフォームビルド

# はじめに
　サービスを開発し、実際に利用するにはサーバにデプロイする必要がある。近年、チーム開発を行うにあたり開発環境を統一するため、Dockerの採用が増加している。そして、それに伴いDockerコンテナを直接デプロイすることがある。
　Dockerコンテナをデプロイするにあたり、Docker imageをDockerHub、AWS ECRなどに公開する必要があるが、今回はghcr.ioにGitHubActionsを用いてデプロイする方法をまとめる。また、M1チップ搭載のMACを考慮し、AMD64とARM64に対応したimageのデプロイを行う。

# Dockerfile
　ghcr.ioにimageを公開するにあたり利用するimageの`Dockerfile`サンプルを以下に示す。
```Dockerfile:Dockerfile
FROM node:18 as modules
COPY ./package*.json /opt/frontend/
WORKDIR /opt/frontend
RUN npm install

FROM node:18 as build
COPY . /opt/frontend
COPY --from-modules /opt/frontend/node_modules /opt/frontend/node_modules
WORKDIR /opt/frontend
RUN npm run build

FROM node:18-alpine
COPY ./package*.json /opt/frontend/
COPY --from=build /opt/frotend/node_modules /opt/frontend/node_modules
COPY --from=build /opt/frontend/.next /opt/frontend/.next
WORKDIR /opt/frontend

CMD ["npm", "run", "start"]
```
　上記したDockerfileはマルチステージビルドを行っている。詳しくは解説しないが、マルチステージビルドにより最終的な実行を行うimageに必要最低限のファイルしか持たせないことで、リソースを削減するなどのメリットがある。

# GitHubActions
　次に、本記事の目的であるマルチプラットフォームビルドを行うGitHubActionsの`workflow`サンプルを以下に示す。
```yaml:.github/workflows/deploy.yml
name: Deploy frontend to ghcr.io

on:
  push:
    branches:
      - main
    paths:
      - ./frontend/**
      - .github/workflows/deploy.yml

jobs:
  deploy:
    runs-on: ubuntu-latest

  　defaults:
    　run:
      　working-directory: ./frontend

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.ACCESS_TOKEN }}

      - name: generate .env
        run: |
          touch .env
          echo "NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL }}" >> .env

      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: ./frontend
          push: true
          tags: |
            ghcr.io/${{ github.repository_owner }}/frontend:latest
            ghcr.io/${{ github.repository_owner }}/frontend:1.0.0
          platforms: linux/amd64,linux/arm64
```
　`branch`や`paths`、`.env`ファイルに記載する内容などの項目は各々の環境に合わせて書き換える必要がある。
　本題であるマルチプラットフォームビルドだが、実装は単純である。まず、Stepsの上から2つ目、`Set up QEMU`の項目でQEMUのセットアップを行う。[QEMU](https://www.qemu.org/)とはオープンソースのプロセッサエミュレータである。そして、`Build and push`の項目、`platforms`で利用するプラットフォームを指定する。今回は`linux/amd64`と`linux/arm64`を指定している。これにより、AMD64のimage作成はAMD64の仮想マシン上で、ARM64のimage作成はARM64の仮想マシン上でbuildを行うことで対応している。実際に作成されたimageをGitHubで確認すると、OS/Archで`linux/amd64`と`linux/arm64`の2つ作成されていることが確認できる。

# まとめ
　本記事ではGitHubActionsを用いてghcr.ioにマルチプラットフォームビルドを行う方法を、サンプルコードを記載しまとめた。詳しいDockerfileの記載方法や、GitHubActionsのworkflow記載方法は公式サイトを確認してほしい。
　では、良いエンジニアライフを。
scikit-learnでAUCを計算する

閾値を適用してAUCを扱いたい場合のメモ。

# 閾値は0.5ではない

sklearnがAUCを算出するときのカットオフ（閾値）は、「デフォルトで0.5」だと思っていたら違った。

例えば、以下のような簡単な例（二値分類）を計算する。

```python
import numpy as np
from sklearn import metrics
y_true = [0, 0, 1, 1]
y_pred = [0.4, 0.3, 0.75, 0.8]
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred, pos_label=1)
print(metrics.auc(fpr, tpr))# 1.0
```

上の例では、当然、ラベル1である確率を出しているので、感度1.0, 特異度1.0でAUCは1.0。
仮に、カットオフを0.5として考えても、当然、AUCは1.0。
```python
y_true = [0, 0, 1, 1]
y_pred = [0.4, 0.3, 0.75, 0.8]
y_pred = [1 if p >= 0.5 else 0 for p in y_pred] # [0,0,1,1] cutoff=0.5
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred, pos_label=1)
print(metrics.auc(fpr, tpr))# 1.0
```

では、次のように、y_pred = [0.5, 0.6, 0.75, 0.8]とするとどうか。
この例では、カットオフを0.5にした場合、感度1.0、特異度0.0であるため、AUCは0.5になる。
```python
y_true = [0, 0, 1, 1]
y_pred = [0.5, 0.6, 0.75, 0.8]
y_pred = [1 if p >= 0.5 else 0 for p in y_pred] # [1,1,1,1]
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred, pos_label=1)
print(metrics.auc(fpr, tpr))# 0.5
```

ところが、閾値で予測結果をラベル化せずに、予測確率をそのまま渡すとどうか。
すると、AUC1.0。
```python
y_true = [0, 0, 1, 1]
y_pred = [0.5, 0.6, 0.75, 0.8]
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred, pos_label=1)
print(metrics.auc(fpr, tpr))# 1.0
```

sklearnは、自動的に最適な閾値でAUCを算出してくれているのか？と頭の中が一瞬混乱するが、しかしこれは当然のことで、scikit-learnのauc関数は、細かく刻んだ閾値ごとにfprとtprを算出して、曲線化面積を計算しているのだから、閾値云々の話ではないわけだ。

ここで、ひとつ疑問が残る。

sklearnが算出してくれたAUCを実現する閾値をどのように求めればよいかがわからない。
作ったモデルを実装するときに、最適な閾値を設定できない問題が発生する。
また、その閾値のときの混同行列がわからないため、感度と特異度も求められない。

ここで、カットオフ0.5で決め打ちしてしまうと、先の例のように、
感度1.0、特異度0.0、なのに、**AUC1.0！？**

ということで、任意の閾値を適用して評価指標を得る際は、「metrics.auc(fpr, tpr)」関数で得られるAUCを達成するための最適な閾値をROCから求めなければならない。
そして、カットオフを決めた後、予測確率をラベル化してから、諸々の評価指標を算出する。

# Youden's index

カットオフを先に計算するためには、Youden's indexが（ユーデンインデックス）よく用いられている。

このように求める。
```python
y_true = [0, 0, 1, 1]
y_pred = [0.5, 0.6, 0.75, 0.8]
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred, pos_label=1)
youden_indices = tpr-fpr
index = np.argmax(tpr - fpr)
youden_cutoff = thresholds[index]
# youden indexで予測確率をクラスラベル化
y_pred = [1 if p >= youden_cutoff else 0 for p in y_pred] # [0,0,1,1]
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()# 評価指標は混同行列からも計算できる
print('youden index',youden_cutoff)# 0.75
print(classification_report(y_true, y_pred))
```

閾値でクラスラベル化してROCを計算すると、ROCカーブが角ばるが、仕方ない。
djangoでチェックボックスで送られきた複数のデータを、まとめて1件ずつレコードに保存する。

## 概要
タイトルだと何をやろうとしているのかわかりづらいかもしれないが、
下記のようなイメージ。

例えば、こんなフォームがあるとする。
```html
<form>
    <input type="checkbox" name="multi" value="data1">
    <input type="checkbox" name="multi" value="data2">
    <input type="checkbox" name="multi" value="data3">
    <input type="checkbox" name="multi" value="data4">
    <button type="submit" value="送信">
<form/>
```

複数にチェックを入れた状態で送信ボタンを押すと、
複数のデータが1件ずつレコードに保存される。

この例だと、仮に全部チェックを入れて送信したとするとDBではこのように保存される
```
id | multi
______________
 1 | data1
______________
 2 | data2
______________
 3 | data3
______________
 4 | data4

```

## 結論 getlistメソッドを使う
POSTで送られてきた配列データを処理するためのgetlistメソッドを使うと実現できる。
このような書き方になる。
```python:views.py
#スケジュール新規登録処理
def add_post(request):

    if request.method == 'POST':
    
        #getlistメソッドで配列の受け取り
        selecteds = request.POST.getlist('multi')

        #ループで回して1件づつDBに保存
        for value in selecteds:
            SchoolSchedule.objects.create(multi=value) 
            
    #処理成功後に移動するページ
    return redirect('/index')
```

以上
月文字に関する些細なこと（問題提起）

## 前書きの前書き

月文字の実装に関心のある方以外には、心からどうでもいい話です。

## 前書き

「月文字」とは何か？についての詳細は、まず以下の記事をお読みください。

https://qiita.com/wataoka/items/261fc12c956a517049d8

https://qiita.com/tan5o/items/e0fa51ecb62619444e10

なお、ここで使用される画像は事前に白黒の2色に変換されていることを仮定しています。**また、記事内ではわかりやすくするために白色を黄色で表現しています。**

## 基本的には簡単

月文字の実装は、基本的には4ピクセル×4ピクセルの領域内の色合いを評価し、最も近い絵文字の月を判断してマッピングすれば、比較的簡単に実現できます。

そう、基本的には。
何の苦労もなく。

ただし、超レアケースを除いて。

## 超レアケース

まず、以下の画像をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/37aa4c84-a7de-f3be-094b-97d4abf9f296.png)

これは「一」の月文字です。
ただし、横棒が正確に表示されていません。

なぜこうなるのかというと、「一」の一部が次のように変換されているからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/0bc919dc-0eea-f0a0-0387-de7ec5ed930c.png)

簡単に言うと、横棒を表す黒要素が黄要素よりも少なく、「🌕」の判定になってしまったということです。

## これはバグなのか？

いいえ、全く。
これは正しく変換された結果であり、全くバグではありません。

ただし、月文字を使用したいユーザーは、変換後の結果が
「文字として読める」という期待を抱いているでしょう。

そのため、このような文字でもしっかりと安定して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/47454921-c07f-cc78-365b-2b12b3033829.png)

のように変換できたらなあ…。と思っています。

## ずらせばいーだろ

こういうパターンがあるため、無理です。
ずらして修正したと思ったら、別の箇所がずれて逆に表示されない現象が発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/6f71ec8c-b53d-0d2b-0ecb-2be7fc4a48c4.png)

## 横の黒要素は「🌑」にすればいーだろ

月文字としては、無駄に横線が太くなる現象につながってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/7d00f730-3868-9f2a-675b-e2e14dbded2c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/74a80e42-1912-3503-170f-8d1a1a4e9d2f.png)

## ちなみに

一番簡単な対応策は、文字のサイズを大きくするか、太くすることです。
ただし、それでも問題が発生する可能性があります。

そして大切なことは、結局のところ、月文字は貼り付けるプラットフォームの文字制限や、幅制限（改行されない文字数）などがあるため、できるだけ小さい幅で表現する必要があるということです。

## どうでもいいが

もちろん、文字数に制限がなく、全体を簡単に俯瞰できる環境であれば、大きな月文字を作ればいい話です。
しかし、それは単に白黒を🌕🌑に置き換えていることとほぼ同じであり、それが月文字としての美しさを備えているかどうかは疑問です。

### 上の文章が理解できない人用

どちらが（技術的に）美しい？魅力がある？困難だと思う？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/84cd56cd-f044-ace8-e616-7da7305c1654.png)

![moon_art20240121125347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/29f62572-3cb6-7608-2ef5-b2e0764458b8.png)

サイズが大きかったら綺麗に見えるのは当然の話で、それがすごいか？と言われれば別にすごくはない。ということ。
JavaScriptでの部分検索

ES6での部分一致検索機能を作成しました。
配列から検索できるサンプルコードは検索しても見つからなかったので、その型だけここに残します。
大文字、小文字、全角、半角などのバリデーション判定は実装していないので、適宜調整します。
```html:index.html
<input type="search" id="js-search" />
<ul id="js-stock">
  <li>入力してください...</li>
</ul>
```
```js:script.js
const nameArray = [
  'tanaka',
  'yamada',
  'sato',
  'suzuki',
  'tanaka',
  'sato',
  'saito',
  'takahashi',
  'ito',
  'nakamura'
];
const searchInput = document.getElementById('js-search')
const searchItem = document.getElementById('js-stock')

searchInput.addEventListener('input', function () {
  let stockList = '';
  let stockCount = 0;

  nameArray.forEach(function (keyWord) {
    if (keyWord.includes(searchInput.value)) {
      stockList += `<li>'${keyWord}'が見つかりました。</li>`;
      stockCount++;
    }
  });
  while (searchItem.firstChild) {
    searchItem.removeChild(searchItem.firstChild);
  }

  if (stockList === '') {
    searchItem.innerHTML = `'${searchInput.value}'に一致する名前は見つかりませんでした。`;
  } else if (stockCount === nameArray.length) {
    searchItem.innerHTML = `入力してください...`;
  } else {
    searchItem.innerHTML = stockList;
  }
});
```
コピペだけでちゃんと動作する...はず。

#### 参考
[JavaScriptの文字列マッチングまとめ(indexOf, lastIndexOf)](https://qiita.com/aqril_1132/items/9f69575bfbcf24bdf7b5)
[JavaScript　removeChildメソッドの使い方：既存の子要素を削除する方法](https://tech.mychma.com/javascript-removechild/1670/)
PostgreSQL® 16によるパフォーマンスの向上

<font color="Grey">*[Enhanced performance with PostgreSQL® 16](https://aiven.io/blog/enhanced-performance-with-postgresql-16)の翻訳です。*</font>

2024年1月18日

# PostgreSQL® 16によるパフォーマンスの向上

Aiven for PostgreSQL®はメジャーバージョン16をサポートします。主な改善点と新バージョンの入手方法をご覧ください。

Aiven for PostgreSQL®の多くのお客様は、革新の最前線に立ち、開発者の生産性を高め、作業を効率化する最新のデータベース機能を利用できるようにしたいと考えています。これをサポートするため、AivenはPostgreSQL®バージョン16の提供を開始しました。新バージョンは、パフォーマンスを最適化し、監視とセキュリティを改善する一連の機能強化が施されています。これらの新機能は、ワークロード管理をより効率的かつセキュアにし、開発者のエクスペリエンスの向上にも貢献します。


## リリースハイライト


### より優れたクエリプランニングと最適化されたバルクロードによるパフォーマンスの向上


このリリースでは、問い合わせプランナの最適化、`FULL`結合と`RIGHT`結合の[並列化の導入](https://www.postgresql.org/docs/16/parallel-query.html)、`DISTINCT`句または`ORDER BY`句を持つ[集約関数](https://www.postgresql.org/docs/16/functions-aggregate.html)の最適化された計画、`SELECT DISTINCT`問い合わせのインクリメンタルソート、より効率的なウィンドウ関数の実行が組み込まれています。RIGHT` と `OUTER` の "アンチジョイン" が改良され、欠落行の識別が容易になった。さらに、一括ロードが最適化され、単一操作と同時操作の両方で `COPY` のパフォーマンスが最大 300% 向上した。今回の更新では、`libpq` クライアントに [ロードバランシング](https://www.postgresql.org/docs/16/libpq-connect.html#LIBPQ-CONNECT-LOAD-BALANCE-HOSTS) が導入され、バキューム戦略が最適化された。また、文字列処理、配列操作、サブトランザクション検索において、`SIMD` による CPU アクセラレーションが顕著に改善された。


### レプリケーションの強化


PostgreSQL 16では、クラスタノード間のシームレスなデータ交換のためのレプリケーションが強化され、高可用性、スケーラビリティ、ディザスタリカバリが向上しました。性能の向上には、サブスクライバの並列トランザクションとB-treeインデックスの効率の向上が含まれます。


### 開発者エクスペリエンスの向上


このリリースでは、[SQL/JSON](https://www.postgresql.org/docs/16/functions-json.html) 構文に `JSON_ARRAY()`、`JSON_ARRAYAGG()`、`IS JSON` が追加され、開発者の使い勝手が向上しました。注目すべき機能として、アンダースコアを 1000 単位の区切り文字に使用したり、10 進数以外の整数リテラルを使用したりできるようになった。今回の更新では、`psql` にパラメータ付きクエリ用の `bind` が導入され、デフォルトの ICU サポートでテキストの照合順序が改善された。


### モニタリングの改善


PostgreSQL 16では、監視機能が追加され、性能チューニングが強化されました。pg_stat_io`の導入は、アクセスパターンの詳細な解析のための重要なI/O指標を提供します。pg_stat_all_tables`ビューでは、新しいタイムスタンプ属性 `last_seq_scan` が最後のテーブルスキャンの時刻を記録します。同様に、`pg_stat_all_indexes`では、最後のインデックススキャンの時刻を示す `last_idx_scan` 列が追加されました。パラメータ化された文の入力値を自動的にログに記録することで、`auto_explain`の可読性が向上しました。さらに、PostgreSQL 16では、`pg_stat_statements`と`pg_stat_activity`の問い合わせ追跡アルゴリズムが改良され、精度が向上しました。


### セキュリティとアクセス制御の強化


このリリースでは、洗練されたアクセス制御によりセキュリティが強化された。このリリースでは、`require_auth` を追加して正確なクライアントサーバ認証を実現し、`sslrootcert="system"` を追加して SSL/TLS セキュリティを強化した。Kerberos 認証の委譲をサポートすることで、 `postgres_fdw` や `dblink` のような拡張モジュールの安全な接続を保証する。


## PostgreSQL® 16 を始めよう


今すぐPostgreSQL 16にアップグレードして新機能を利用しましょう。


すでにAiven for PostgreSQLをお使いの場合は、[インプレースアップグレード](https://aiven.io/blog/postgresql-major-version-in-place-upgrades-supported-on-aiven)を実行して最新バージョンに移行することができます。また、アップグレードするデータベースのフォーク上で簡単にアップグレードをテストすることもできます。


まだAiven for PostgreSQLをご利用でない場合は、[サインアップはこちら](https://console.aiven.io/signup)から無料トライアルをご利用ください。
【UE5】ApplicationScaleを変更して全体のWidgetのサイズを変更

Unreal Engineでウィジェットの表示サイズを変えるDPIスケールがありますが、
選択式で変更したかったのでApplicationScaleをいじる方法を試します。

## ApplicationScale
ProjectSettingにApplicationScaleという項目を変更すると全体のWidgetの大きさが変わるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680670/7a3c2cef-8de1-13d7-2d72-23a4375c4ca3.png)

## 変更する関数
以下の関数を作成します。
```cpp:UTestObject.h
class PROJECTNAME_API UTestObject : public UObject
{
	GENERATED_BODY()

	UFUNCTION(BlueprintCallable, Category = "Test")
	static void SetApplicationScale(float NewValue);
};
```

```cpp:UTestObject.cpp
#include "Engine/UserInterfaceSettings.h"

void UTestObject::SetApplicationScale(float NewValue) {
	UUserInterfaceSettings* UISettings = GetMutableDefault<UUserInterfaceSettings>(UUserInterfaceSettings::StaticClass());
	if (UISettings) {
		UISettings->ApplicationScale = NewValue;
	}
	return;
}
```
## 使用例
ボタンのクリックイベント作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680670/5f923083-2929-265b-e908-3765fbe7398c.png)

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680670/d86bdea5-f6d0-bde0-b8c9-0bb5053b9213.gif)

## 結果
・実行時にApplicationScale経由でウィジェットサイズを変えられます。
・ProjectSettingを実行時に変更して大丈夫なのか分かりませんが、一応パッケージ化しても動いてました。


## 
**バージョン：UE5.2.1**
Go言語のdatabase/sqlパッケージはデータベースドライバーをどのようにして読み込んでいるのか

# 本題
Go言語のdatabase/sqlパッケージがデータベースドライバーをどのようにして読み込み、利用しているか気になったので調べてみました。
## サンプルコード
```go
import (
	"database/sql"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

// ...

db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
	panic(err)
}
```
引用) https://github.com/go-sql-driver/mysql

mysqlの場合はこんな感じで読み込むのですが、`database/sql.Open`関数の第一引数には"mysql"という文字列しか渡されていなく、ドライバーの実装は渡されていないんですよね。

`database/sql.Open`関数の実装を見てみましょう。
```go
func Open(driverName, dataSourceName string) (*DB, error) {
	driversMu.RLock()
	driveri, ok := drivers[driverName]
	driversMu.RUnlock()
	if !ok {
		return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
	}

	if driverCtx, ok := driveri.(driver.DriverContext); ok {
		connector, err := driverCtx.OpenConnector(dataSourceName)
		if err != nil {
			return nil, err
		}
		return OpenDB(connector), nil
	}

	return OpenDB(dsnConnector{dsn: dataSourceName, driver: driveri}), nil
}
```
https://cs.opensource.google/go/go/+/refs/tags/go1.21.6:src/database/sql/sql.go;l=813-830;drc=894d24d617bb72d6e1bed7b143f9f7a0ac16b844

どうやら`drivers`というmapに実装が詰まっていそうです
下のコードがdriversの定義です。

```go
var (
    ...
    drivers = make(map[string]driver.Driver)
)
```
https://cs.opensource.google/go/go/+/refs/tags/go1.21.6:src/database/sql/sql.go;l=33-36;drc=894d24d617bb72d6e1bed7b143f9f7a0ac16b844


driversに実装を詰め込むにはRegister関数を使います。
```go
// Register makes a database driver available by the provided name.
// If Register is called twice with the same name or if driver is nil,
// it panics.
func Register(name string, driver driver.Driver) {
	driversMu.Lock()
	defer driversMu.Unlock()
	if driver == nil {
		panic("sql: Register driver is nil")
	}
	if _, dup := drivers[name]; dup {
		panic("sql: Register called twice for driver " + name)
	}
	drivers[name] = driver
}
```
https://cs.opensource.google/go/go/+/refs/tags/go1.21.6:src/database/sql/sql.go;l=41-54;drc=894d24d617bb72d6e1bed7b143f9f7a0ac16b844


ですので、
    1. Register関数で実装をdriversに詰める
    2. Openメソッドでdriversから実装を取り出す
という段階を踏む必要があるのですが、サンプルコードではRegister関数を明示的に呼び出していないにも関わらず、問題なく動作します。

これ実はRegister関数をドライバーパッケージ側からinit時に呼んでいるんです。

　　
以下はドライバーパッケージ側の実装です。

MySQL(go-sql-driver/mysql)
```go
// This variable can be replaced with -ldflags like below:
// go build "-ldflags=-X github.com/go-sql-driver/mysql.driverName=custom"
var driverName = "mysql"

func init() {
	if driverName != "" {
		sql.Register(driverName, &MySQLDriver{})
	}
}
```

https://github.com/go-sql-driver/mysql/blob/c48c0e7da17e8fc06133e431ce7c10e7a3e94f06/driver.go#L90-L98

PostgreSQL(lib/pq)
```go
func init() {
	sql.Register("postgres", &Driver{})
}

```

https://github.com/lib/pq/blob/3d613208bca2e74f2a20e04126ed30bcb5c4cc27/conn.go#L60-L62

このように、ドライバーパッケージは内部でinit関数を利用してRegisterを呼び出すことで、ユーザーがドライバーを簡単に利用できるように親切に設計されています。
インフラ転身1年目の自己紹介

## 自己紹介
地方のSIer企業に勤めております。業界4年目の `shigesdesk` と申します。
早速ですが、2024年1月1日 に入籍しました。

今年の元旦は **一粒万倍日・天赦日** が重なる開運日でしたが、干支のねずみなどを指す **甲子の日** (きのえねのひ) も重なっており、何かを始めるには縁起の良い日とのことだったため、Qiita の初投稿に至りました。

:::note info
**記事投稿キャンペーン**
1/1〜1/31 の期間でちょうど以下キャンペーンがやっているみたい…！
:::

https://qiita.com/official-events/ac786747ac38f76996a0

**▼ 一部引用**
>テーマは「2024年!初アウトプットをしよう」です。
>ぜひ気軽に今年初の記事投稿をして、良い1年のスタートダッシュを切りましょう！

## Qiita開始目的
下記3点を目的として今後発信します。
**1\. ナレッジ化**：日頃直面する課題をナレッジベースとして遡りやすくするため
**2\. 知識の定着**：記事作成は正確なアウトプットが求められるため
**3\. 人脈の拡大**：記事が自身の成果物として他の人の信頼を創出するため

## 略歴
2020年に未経験向けの研修制度が整うSIer企業へ転職後、現在は AWS・GCP のクラウド環境をベースとしたSRE業務を行っております。
|   年 | 月 |   概要     | スキル |
|:-----:|:---:|------------|-|
| 2019 | 3 | 英語専攻、翻訳や簿記など好奇心のままに着手 |-|
|      | 4 | 保険代理店に入社後、生命保険の営業職として従事  |Salesforce |
| 2020 | 8 | IT企業に転職後、3か月間の基礎研修を実施 <br>右記を利用したWebアプリの作成を成果物とする|Linux <br>Java <br>SQL <br>Tomcat|
|      | 12| AIアノテーション、プロセス監視    | AWS       |
| 2021 | 3 | 課題管理ツールの改修・運用   | Jira       |
| 2022 | 4| 社内ツールの管理・運用改善   | Jira <br>その他|
| 2023 | 11| AWS・GCPのサービス運用   | AWS <br>GCP|
| 2024 | 1| 現在同業務に従事   |- |


## 取得資格
IT企業に入社後、手当たり次第着手したためスキルにバラつきがありますが、昨年末に案件参画後からはインフラ領域を体系的に学習中です。
- **IPA**
    - ITパスポート (IP)
- **ベンダー**
    - LPIC Level 1
    - AWS Certified Cloud Practitioner (CLF)
    - AWS Certified Solutions Architect – Associate (SAA)
    - AWS Certified Developer – Associate (DVA)
    - Oracle Certified Java Programmer, Silver SE 11
    - Oracle Master Bronze DBA
    - VBA エキスパート ベーシック
- **その他**
    - TOEIC 765
    - 実用英語技能検定 準1級 (英検)
    - 秘書技能検定 準1級 (秘書検定)
    - 日商簿記、FP技能士、無線技術者ほか

## 最後に
クラウドを主とするエンジニアへのジョブチェンジに伴い、2024年は下記資格を取得します。
- **サーバー**
    - LPIC Level 2
    - LPIC Level 3
- **ネットワーク**
    - CCNA
- **クラウド**
    - AWS Certified Security – Specialty (SCS)
    - AWS Certified Solutions Architect – Professional (SAP)
    - AWS Certified DevOps Engineer – Professional (DOP)

学習を通して直面した課題については記事で供養できるよう努めます。
これからよろしくお願いします！

## 初投稿で役に立った記事
- [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
- [Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)
文系大学生が卒論をGit管理した話

沢山書き直したい。差分を確認したい。頑張った履歴を数値で残したい。Gitを実践的に利用して学びたい。

そんな思いから始まり、卒論提出までGitで管理しながらやりとげました。
これから論文をGitを使って管理しようと考えている人たちにこの記事が届いてほしいです。(特に、縦書きの人に)

## 構成
下記ツールを使いました。
エディタ : VSCode
ファイル形式 : mdファイル
gitストレージ : GitHub (private)
gitGUIアプリ : SourceTree
資料管理 : Notion
<br>

### ファイル形式
提出形式が縦書き指定ということもありwordで使われるdocx形式が理想でしたが、gitHubでも閲覧・編集を可能にするためmd形式に落ち着きました。

SourceTreeではdocxファイルの差分も閲覧できるので、GitHubでの閲覧編集を考えていない場合はおススメです。バイナリファイルに対応してくれているsourcetree開発者に感謝!!

md形式なら論文に必須な「注釈、見出し、ルビ」にも対応しているので非常に書きやすかった。
以上のことから、スマホでも編集したいなら、mdがおすすめです。
<br>

### エディタ
#### VScode

`
shift + ctrl + v
`
上記プレビューショートカットは必須。

また、プラグインをいくつか入れましたが、最終的に残ったのは2つでした。
- [Markdown All in One](URL "https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one") （htmlタグをプレビューで認識させるなど）
- [Custom MD PDF](URL "https://marketplace.visualstudio.com/items?itemName=Deadpoulpe.custom-md-pdf") （PDFにしてくれる。推敲用に利用）

#### GitHub
スマホやタブレットでの編集に利用。（PC持ち歩いたから結局使わなかったけどね）
issueをtodoリストとしても使える （Notionつかったから使わなかったけどね）

<br>

### Git

https://fromatom.hatenablog.com/entry/2014/02/09/001136

ブランチは、上記ブログ記事を参考に2つ作成して、一つを作業用(dev)、もう一つを先生に見せた後の節目用(release)と分けて利用。 
<br>
```:コメントルール
○○章○○節　 新規 or 加筆 or 修正  (詳細情報)
<利用例>
第二章 第一節 新規 (「涙」に関する描写整理)
全体 修正 (見出し後、空行追加)

※変更箇所の情報を優先すると、後で振り返り易いです。
```

:::note warn
※リポジトリはパブリックだめ！　絶対！
マイナンバーカード情報を公開するのと同じくらいの行為
:::

## 苦悩・改善
提出の度に、mdからwordにコピペが必要だった
コピペ時にルビ振り直し、一字下げ、\<br>の改行置換といった無駄な作業が発生する。
手作業で見落としが発生しやすく、提出稿で何度か微妙な差分が生じてしまう。

なにより時間の無駄！

## 良かったこと
- 行単位のコミットがすごく便利。コミットのタイミングを考えなくていい。
- コンフリクト防止に、作業前のプル・こまめなコミットが大切だと学んだ。
　プルの重要性が身をしてみて感じる。
- wordではできない任意のタイミングで変更履歴のコミット
- 変更履歴に名前が付けられる (同じくwordではできない)
- 一年近く掛ける長期プロジェクトだからこそ、コミット数という実績が励みになる。

### 結論
スマホで編集しないなら、docx形式で十分。というかむしろ推奨！　
コピペはヒューマンエラー起こすし、時間の無駄。

習うより慣れよ
DeepLがえぐすぎた

# DeepLがえぐすぎた

## 1. 導入

この記事では、FortigateのREST API機能の実装における問題に直面し、その解決過程でDeepLがすごいことに気づいた話を紹介する。

## 2. 問題の説明

最近、FortigateのREST API機能を活用したプロジェクトに取り組んでいたが、インターネット上で有用な情報はほとんど見つからなかった。公式のドキュメントやデータシートも不足しており、解決策が見つからない状況であった。

## 3. 解決策の発見

しかし、あるブログ記事を通じて71ページに及ぶ英語のPDFドキュメントを発見した。
その記事がこちら

「FortiGateをREST APIで管理する」
https://blog.aimless.jp/archives/2017-04-01-manageing-fortigate-by-rest-api/

記事の一部を抜粋

「FortiOSがREST APIに対応していることに気が付いたので試してみました。
参考：https://www.tuncaybas.com/FOS_JSON_REST_API_523.pdf
ドキュメントやフォーラムを見る限りだと2年前くらいにリリースされたv5.2.3からREST APIに対応していたみたいです。2年前に知りたかった。公式サイトにドキュメントが見当たらないので、開発者専用の機能なのかもしれません。」

PDFで71ページ、全て英語で書かれているごついリファレンスが出てくる。これがこれが唯一の参照資料となり困惑する。

## 4. DeepLの利用経験

DeepLの存在を思い出し、試しに使用することにした。最初はPDFの「Introduction」部分をコピペして翻訳を始めたが、すぐにファイルを直接アップロードできることに気づいた。71ページもある文書の翻訳は困難だろうと考えていたが、試しにアップロードすると、見事に翻訳が完了した。そして、それをダウンロードする。

## 5. DeepLの機能の分析

特に驚いたのは、DeepLがPDF内の画像からテキストを読み取ったこと、71ページも処理できたこと。
自分の先入観と無知からそう考えていただけなのは間違いないが。

## 6. 結論と応用可能性

この経験から、DeepLは単なる文章の翻訳ツール以上のものであると実感した。技術文書だけでなく、論文や他の専門的な文書でも同様のアプローチが可能である。これにより、言語の障壁が大きく低減し、情報収集の幅が広がることが期待できる。

## 7. 締めくくり

この記事が同じような状況に直面している方々の一助となれば幸い。DeepLの活用方法やFortigateのAPIについてのさらなる情報交換や質問があれば、ぜひコメント欄で共有してほしい。ありがとうございます。
【🍣】文字コードにまつわるエトセトラ【🍺】

## はじめに
調べては忘れるを繰り返す彼ら(文字コード)のエトセトラについて
備忘録＆アウトプットのため書き記します。

## COLLATION(照合順序)
- utf8mb4_general_ciとかはCOLLATION(照合順序)の一種
- COLLATIONはどの文字とどの文字を同一に扱うかといった決まり事
- ソート時の文字ごとの重みが照合順序によって変わり、順番も変わる。
- 日本語を扱う際によく使用される照合順序はこの3つが多い。
    - utf8mb4_general_ci …英字の大文字小文字を区別しない。ほかは区別する。
    - utf8mb4_unicode_ci …英字の大文字小文字を区別しないし、半角全角も、ひらがなカタカナも区別しない
    - utf8mb4_bin …全部区別する。文字コードがすべて。
- MySQL8.0 ではutf8mb4 のデフォルトの照合順序が utf8mb4_general_ci から utf8mb4_0900_as_ci に変更になった。
[参考記事](https://zenn.dev/zoeponta/articles/090c68ba820a24)


## UTFとUnicode
わかりやすくざっくりまとめられている[こちらの記事](https://qiita.com/omiita/items/50814037af2fd8b2b21e)をさらに粗くまとめてみた。
・Unicode世界中の文字とそれに対する　数字を紐付けたデータベースみたいなイメージ
・Unicodeには【あ→3041】,【a→0061】みたいな感じで各文字にコード(コードポイント)が紐づいている
・UTF-8はこれらのコードポイントをパソコンに理解させるために符号に変換する役割を果たす(Unicodeのコードポイントをそのままパソコンに理解させるよりもUTF-8などによる符号を使う方がバイト削減できる。らしい)

## utf8とutf8mb4とutf8mb3
- `utf8mb3`は1文字で3バイト、`utf8mb4`は4バイトの文字を表現できる。
- `utf8mb3`では1文字で4バイトを超えるような文字(🍣や🍺、`𠮷`など)が同じものとして扱われてしまう(寿司ビール問題という美味しそうな名前がついている)。
- `utf8mb3`は公式からも非推奨と言われており、`utf8mb4`が推奨されている。
- MySQLに`utf8`というcahrsetがあるがこれは`utf8mb3`が使われるので注意(`utf8`は`utf8mb3`のエイリアスらしい)。
Pythonで「もっと幸せになれと無限に表示するプログラム」を実装してみた

# 概要

Pythonで「もっと幸せになれと無限に表示するプログラム」を実装してみました。
Python3だと数字に上限がないようなので、ずっとカウントアップできます。

# 実装

以下のファイルを作成してみました。
```motto_shiawase_ni_nare.py
i=0
while True:
    print(str(i)+":もっと幸せになれ")
    i = i + 1
```

以下のコマンドを実行しました。途中経過を表示します。
一日くらい実行してみましたが、うちのPCだと38億回くらい実行できました。
```
$ python3 motto_shiawase_ni_nare.py
0:もっと幸せになれ
...
3895432525:もっと幸せになれ
...
```

# まとめ

何かの役に立てばと。