OmniAICreator/Qiita-1.07M huggingface dataset:
RSPecでCSVファイルを検証する

# 背景+まとめ

CSVデータを使って、データ登録・更新を行う機能をRSpecでテストする場合にちょっと工夫が必要だった箇所をメモしてます。
例えば、CSVデータの値で更新されているか？をチェックする場合、更新後のデータの比較にCSVデータ自体を用いることで後の変更が容易な記述にすることができます。

# CSV.table

`CSV.table`が使いやすくて便利だった。

```:users.csv
code,email,gender,status
"001",test@example.com,1,1
"002",test2@example.com,1,2
```
```ruby
file_path = "users.csv"
users_csv_table = CSV.table(file_path)


# 配列で出力
users_csv_table.to_a
=> [[:code, :email, :gender, :status], [1, "test@example.com", 1, 1], [2, "test2@example.com", 1, 2]]

# headerのみ出力
users_csv_table.headers
=> [:code, :email, :gender, :status]

# [:ヘッダー名]で指定したヘッダーの値を出力
users_csv_table[:code]
=> [1, 2]
```

[参考：class CSV::Table](https://docs.ruby-lang.org/ja/latest/class/CSV=3a=3aTable.html)

# CSVデータの自動判別

```ruby
file_path = "users.csv"
CSV.table(file_path, converters: nil)
```

csvの中で"001"などの値があると、CSV.tableの機能でデータ型を自動判別されてしまい、intの1になります。
この対策として、`converters: nil`を指定します。
そうすることで、データ型の自動判別を無効にすることができます。


# enumのテスト

例えば、Userのgender属性がenumで定義されているとしましょう。
```ruby
# User側で以下のように定義されている
# enum gender: { unknown: 0, male: 1, female: 2 }

# user.genderを呼び出すと、id: 1のUserのgenderが1の場合、以下のように出力される。
user = User.find(1)
user.gender
=> male

# _before_type_castをカラム名に付け加えることで数値として出力してくれる。
user.gender_before_type_cast
=> 1
```
[参考:【Rails】Enumを使いこなそう](https://zenn.dev/gottsu/articles/66b3ebe0f9e5a6#%E6%95%B0%E5%80%A4%E3%81%8C%E6%AC%B2%E3%81%97%E3%81%84)
Pythonで「Pythonを対話モードで利用する」の動作を確認してみた

# 概要

Pythonで「Pythonを対話モードで利用する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/ini/index2.html

# 実装

以下のコマンドを実行しました。
```
$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 10*5-3
47
>>> num = 8
>>> price = 500
>>> num * price
4000
>>> help('if')

>>>
```

# まとめ

何かの役に立てばと。
【AWS】24時間稼働Webシステムのユーザ影響を与えないDBメンテナンス手順【Redshift】

## はじめに
2024/08/22更新
speakerdeckに内容を追加しました
https://speakerdeck.com/naonana777/redshiftnosatipasunohuo-yong

24時間稼働しているWebサービスの場合、DBデータの一括置き換えのような時間のかかるデータメンテナンス時にもユーザがデータにアクセスできない状態を避ける必要があります。
これに対応するため、Amazon Redshiftで使えるサーチパスを使用したDBの更新手順の案を記載しました。
この記事では手順の説明のために手動更新のような書き方になっていますが、これら一連の処理をStepFunctionsの各ステップで実装しておけばバッチ処理でも画面影響なくデータ更新を行うことが可能です。

## 使うAWSサービス
・Amazon Redshift

## サーチパスとは
・データベースのテーブルに対してSQLを使ったクエリを発行するとき、スキーマを指定せずクエリを発行するとサーチパスの順番に従ってテーブルを探して最初に見つかったテーブルにクエリが実行されます。
参考：https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_search_path.html

## 更新手順
### 1．通常稼働時設定
・2つのスキーマを用意しておきます
・画面はサーチパスのスキーマの優先度順にテーブルを参照します。テーブルはどちらか一方にしかなくてもアクセスできますが、両方にある場合はより優先度の高いほうのテーブルが参照されます
・基本的に両方のスキーマに同じ定義のテーブルがあることが理想ですが、以下のような条件のテーブルであればどちらか一方にしか定義しないことも良いと思います
#### <一方のスキーマしか定義しなくてよい条件>
→画面からしか更新されないようなデータを管理するテーブル
→削除を伴わない更新が行われるテーブル
→上記の条件に加えてテーブル定義が今後変わらないテーブル

![通常稼働.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/f7839eea-01ed-cbda-15f2-da129e8e4d07.png)


### 2．データメンテナンス①データメンテナンス用スキーマを更新する
・メンテナンス用スキーマのテーブルを更新します
・この時、画面側は同じテーブルがメインスキーマにあればそちらを見るので、メンテナンス作業で仮にメンテナンス用スキーマが空になっても画面に影響はありません
・そのため、画面影響なくデータのメンテナンスができます

![データメンテ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/0618be4a-7d05-2c08-280c-e873d3e82436.png)

### 3．データメンテナンス②Redshiftのサーチパスをメンテナンス用スキーマ優先に変更
・メンテナンス用スキーマからメインスキーマにテーブルのデータを入れ替えますが、その前にサーチパスをメンテナンス用スキーマ優先に変えておきます
・これは入れ替え中にメインスキーマのデータが空になっても画面に影響が出ないようにするためです
・優先度が高いほうのテーブルを見るため、メンテナンス済みのテーブルを優先してみておけば、画面影響なくメインスキーマのデータ入れ替えが可能です

![サーチパス変更１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/5d30dc3c-bd61-0978-80e8-33fbdb0db53a.png)
```
<実行するSQLの例>
(構文)
ALTER USER [ユーザ名] SET search_path TO [スキーマ名];
(例)
ALTER USER USER_A SET search_path TO メンテナンス,メイン;
```
### 4．データメンテナンス③メンテナンス用スキーマからメインスキーマにメンテナンス結果反映
・メンテナンススキーマのメンテナンス済みのテーブルデータをメインスキーマのテーブルに投入します
・投入方法はメンテナンス内容によって異なりますが、前述のようにサーチパスはメンテナンススキーマ優先になっているのでテーブル定義がメンテナンススキーマにあるテーブルであればテーブルのDROPやTRUNCATEを行っても画面に影響はありません

![データ移行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/4996b2a1-bbfc-2f15-76bf-8b52b8b0cfeb.png)


### 5．データメンテナンス④Redshiftのサーチパスをメインスキーマ優先に変更
・メインスキーマへのデータ移行が完了したら、最後にサーチパスをメインスキーマ優先の元の状態に戻します
・これでユーザ影響なくDBメンテナンスができました

![サーチパス変更２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/0cf0e30d-4193-202f-5385-271694a6d744.png)
```
<実行するSQLの例>
(構文)
ALTER USER [ユーザ名] SET search_path TO [スキーマ名];
(例)
ALTER USER USER_A SET search_path TO メイン,メンテナンス;
```

## さいごに
データのメンテナンスは場合によってはユーザ影響を考え、エンジニアが深夜作業を行ったりと負担が大きいです。
しかし、今回のサーチパスを利用したような更新手順のように、手順の工夫をするだけで実現できるユーザ影響もメンテナンス作業者の負担も減らせる作業方法を見つけていきたい。
AtCoder初心者振り返りメモ ABC324

# ABC324の回
##### 参考リンク
https://atcoder.jp/contests/abc324
日本レジストリサービス（JPRS）プログラミングコンテスト2023
（AtCoder Beginner Contest 324）

https://qiita.com/kubochiro/items/5daedd51654a8155bc06
Python zip()関数についてあれこれ

https://qiita.com/hyouchun/items/98b53e9dc8cc0b99e1fe
ABC324をPythonで解いてみたよ。(A～E問題)　

# A-問題
https://atcoder.jp/contests/abc324/tasks/abc324_a

**問題文**
N 個の整数 が与えられます。
これらの値がすべて等しいならば Yes 、そうでなければ No と出力してください。

**ポイント**
setに格納するのがシンプル。
最初から、setを使うことを思いついたがタイピングに時間がかかってしまった。

````Python:A.py
# 2023/10/15 本番解答
# 入力
N = int(input()) 
A = list(map(int,input().split()))
ST = set()
for i in range(N):
    a = A[i]
    ST.add(a)

if len(ST) == 1:
    print("Yes")
else:
    print("No")
````

もっと簡素化して書けることを学んだ
````Python:A2.py
N = int(input()) 
ST = set(map(int,input().split()))

if len(ST) == 1:
    print("Yes")
else:
    print("No")
````

# B-問題
https://atcoder.jp/contests/abc324/tasks/abc324_b

**問題文**
正の整数 N が与えられます。 
N=2x3yを満たす整数x,y が存在するなら Yes 、そうでなければ No と出力してください。

全探索してTLE。単純に割り切れるまで計算するのがシンプルで勉強になりました。

**ポイント**
単純に割り切れるまで計算する

````Python:B.py
# 入力
N = int(input()) 

# 2で割り切れるまで割る
while N % 2 == 0:
    N //= 2

# 3で割り切れるまで割る
while N % 3 == 0:
    N //= 3

if N == 1:
    print("Yes")
else:
    print("No")
````

# C-問題
https://atcoder.jp/contests/abc324/tasks/abc324_c

![324C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547298/5d6f2295-6056-1848-24d5-0028bfe3e8d4.png)

条件を関数でチェックする方針で書いたが、時間内に正解できなかった。
文字長が異なる場合で１文字ずつチェックするアイデアでしっくりするものが浮かばず。
勉強になりました。

**ポイント**
・zip関数を使う　for a , b in zip(A, B):
・リストを改行して出力　print(*ans)

````Python:c.py
# 文字長が同じ場合のチェック関数
def diffchk(A,B):
    diffcnt = 0

    # zip は、2つのリストをペアとしてまとめる関数
    for a , b in zip(A, B):
        if a != b:
            diffcnt += 1
    
    if diffcnt <= 1:
        return True

# 文字長が１つ違いの場合のチェック関数
def strchk(A,B):

    # Aの文字長が長いときは、AとBを入れ替える　Bが必ず長い文字
    if len(A) > len(B):
        A, B = B, A

    j = 0

    # 1文字ずつチェックする
    for i in range(len(A)):
        if A[i] == B[j]:
            j += 1
            continue
        j += 1

        if i + 1 != j:  # 添え字が合わなければ　False
            return False 
        
        if A[i] == B[j]:    # 次の１文字の一致判定
            j += 1
        else:
            return False
    
    return True

# 入力
N,T = map(str,input().split())
N = int(N)  # Nは、整数型

ans = []    # 答えは、リストに格納する

for i in range(1, N + 1):
    S = str(input())

    # 文字長が一致している場合の判定
    if len(S) == len(T):
        if diffchk(S,T):
            ans.append(i)

    # 文字長が１つ文字違いの判定
    elif abs(len(S) - len(T)) == 1:
        if strchk(S,T):
            ans.append(i)

print(len(ans))
print(*ans) # リストを改行で出力
````
iPhone (iOS) に Linux(Shell) 環境を構築してPyenv, Pythonを実行

# はじめに

突如スマホでShellを使いたくなったことはありませんか？
そんな時は `iSH` というアプリをインストールすることによってShell、Linuxの実行環境を利用することができます！

# 概要

`iSH` というアプリは、Alpine仮想環境を利用することができるので、その上で、Pyenv環境を構築してPythonをインストールする。
注意点として、Pythonのビルドに数時間かかるので、時間のある時に作業することをお勧めします。

# 1. App

[iSH](https://apps.apple.com/jp/app/ish-shell/id1436902243) をインストールします。

## 操作の対応

・`Tab` キーは「右矢印に縦線のアイコン」から入力できます
・`Ctrl` を入力するには、「`^`」のアイコンを押し、対象のキーを押すことで実行できます。
・`Esc` を入力するには、「円に左上矢印のアイコン」をタップすると入力できます。
・矢印入力は、「上下左右の矢印のアイコン」をタップたまま、操作したい方向に移動して離すと入力できます。

使いたいコマンドが見つからないものは、以下のように入力することで追加でいます

```bash
apk add <使いたいコマンド>
```

# 2. Pyenv

## 2.1 利用するコマンドを追加

以下を実行して、Pyenvに必要なコマンドを追加します。

```bash
apk add --no-cache git bash build-base libffi-dev openssl-dev bzip2-dev zlib-dev xz-dev readline-dev sqlite-dev tk-dev
apk add linux-headers 
```

## 2.2 Pyenvをクローン

```bash
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src
```

## 2.3 パスに追加

Alpine環境では、`~/.profile` にパスを追加することになっていますが、`~/.ashrc`の方が個人的にわかりやすいので、以下のコマンドで、`~/.ashrc`にパスを追加できるようにファイルを記述します。

```bash
echo "[ -f ~/.ashrc ] && . ~/.ashrc" >> ~/.profile
```

以下のコマンドで、Pyenvのパスを追加します。

```bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.ashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.ashrc
echo 'eval "$(pyenv init -)"' >> ~/.ashrc
```

# 3. Python

かなり時間がかかるので、ここからは時間がある時に実行することをお勧めします。
また、このアプリは端末がスリープになったり、別のアプリにフォーカスを移動すると、一定時間で実行が止まり、最初からになるので、注意してください。

ここでは、Python 3.10.12をインストールします。

```bash
pyenv install --list | grep 3.10.12
pyenv install -v 3.10.12
pyenv global 3.10.12
```

# Reference

https://github.com/pyenv/pyenv/wiki

https://github.com/pyenv/pyenv
ABC324回答メモ

# 0.はじめに
　A~Cは順調でしたが、Dは解き方が分からず飛ばし
　EにとりかかるもTLEが解消できず
　結局Cまで止まりでした。
　レートは+19と微増でした。


# 1.A - Same
　いろいろ方法は考えられましたが、単純にフラグを用意し
　リストの2つ目から、1個前と同じかをチェックしていき
　違ったらフラグを立て、最後にフラグが立ってたらNo
　立ってなかったらYesを出力して終了。

　https://atcoder.jp/contests/abc324/submissions/46524744


# 2.B - 3-smooth Numbers
　Nを割り切れるまで、2で割り、割り切れなくなったら
　割り切れるまで3で割る。
　最後に残ったのが1ならYes、それ以外ならNoを出力して終了。

　https://atcoder.jp/contests/abc324/submissions/46530063


# 3.C - Error Correction
　めんどくさいだけで、考え方は簡単でした。
　Tを読み込み、S毎に以下の判断
　　1)SとTが同じ
　　　同じ場合　回答列に追加
　　　違う場合　↓
　　2)SとTの長さが同じ
　　　同じ場合　SとTの各文字を比較し、差が1つなら回答列に追加
　　　違う場合　↓
　　3)SがTに1文字加えた文字列かチェック(関数)
　　　加えた文字列の場合　回答列に追加
　　　違う場合　↓
　　4)TがSに1文字加えた文字列かチェック
　　　加えた文字列の場合　回答列に追加(関数)
　　関数)S1がS2に1文字加えた文字列かチェック
　　　1)S1とS2の長さを比較し、S1が一文字だけ長い状態でなかったらFalseを返す
　　　2)S1とS2を先頭から一文字ずつ見ていき違う文字があったら
　　　　S1だけ一文字後を見ていく。再度違う文字があったらFalse
　　　　以降違う文字が無ければTrueを返す。

　最後に、回答列の長さと
　回答列を出力して終了

　https://atcoder.jp/contests/abc324/submissions/46549253


# 4.D - Square Permutation
　最初取り掛かった際は、平方数全列挙するのは
　時間内に行けると分かりましたが、文字列の組み換えを
　うまくいく方法が思いつかず断念しました。

　コンテスト後、解説を見ると、最初に文字列側を
　ソートした状態として固定し、平方数側を文字列にして
　ソートするとよいことが分かり、そのように実装したら
　ACとなりました。
　この発想の転換はなかなか出てこないなと感心しました。　

　https://atcoder.jp/contests/abc324/submissions/46591411

# 5.E - Joint Two Strings
　Dを飛ばして取り掛かったものの、TLE3つが解消できず
　時間切れとなりました。
　翌日解説やほかの方の解答をみて、だめな部分に気づきました。
　後方一致数を調べる際に、Tを逆から見た文字列を用意していましたが
　なぜか、比較するたびにT[::-1]の文字列を作っていました。
　最初に一回Tの逆文字列を作ったところ、TLEが消えました。

　ちょっとした差に見えましたがTが最長なケースを考えると
　かなりのロスだったのだなと思いました。

　【実装】
　　S_1～S_Nまでの文字列それぞれに対して
　　・Tとの前方から調べた一致数を調べ
　　　一致数毎の文字列数の辞書を作成
　　　辞書:bl(key:一致数、value:対象文字列数)
　　・Tとの後方から調べた一致数を調べ
　　　一致数毎の文字列数の辞書を作成
　　　辞書:al(key:一致数、value:対象文字列数)
　　・alのキーとblのキーを全組み合わせ見ていき
　　　blキー+alキーの値がTの文字数以上であれば
　　　回答変数ansに1を加える
　　・最後にansを出力して終了


　https://atcoder.jp/contests/abc324/submissions/46597589

以上
【Git】connect to host github.com port 22で怒られた場合の対処法

# はじめに
外で仕事をしていたりすると、たまにgitに怒られる場合があります。
まさにタイトルと同じエラーなのですが、毎度解消法を検索するのは手間なので備忘録的に残しておこうと思います。

# portで怒られた場合の解消方法
使用するネットワーク環境によってはport２２を許容していないケースがあるようで、これが原因のようです。
対処法としては[公式ドキュメント](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/using-ssh-over-the-https-port)に記載のある手順で解消が可能です。

まず、原因であるport22に代わるport443で接続できるか確認します。

``` 
$ ssh -T -p 443 git@ssh.github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
```

次にsshディレクトリ内にあるconfigファイルを公式に従って編集します。

```
$ vi ~/.ssh/config

//以下のとおり記載
Host github.com
   User git
   Hostname ssh.github.com
   Port 443
   IdentityFile ~/.ssh/id_rsa
```

最後に正常に接続が可能か確認します。

```
$ ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
```

以上になります。
無事接続ができればエラーは解消しているはずです。

# さいごに
たまにこの手のぱっと見ではよくわからないエラーに遭遇するのがgitあるあるではないでしょうか？
出先で遭遇すると余計にあたふたしそうなので、また似たような事象に遭遇したら記事にまとめておこうと思います。
[研究室向け]自分で何も考えていない人がよくする質問・返答 5選

## 1. Intro
研究室の人たちを見ていると，「はい，はい」と従順に頷いていて，後からその内容について質問されると全く理解していないという場面によく遭遇します．

その人たちの共通点には大抵，「自分で考える」クセがないことがあげられます．

そこで，自分もしくは他人が「本当に自分で一度考えたか」をチェックするために
**<font color=red>✕　自分で何も考えていない人がしてくる質問・返答</font>**
**<font color=green>〇　目指したい質問・返答</font>**
をそれぞれ対に5個挙げてみました.

一言でいうと，
|イメージ|説明 |
| ------------------------- | -------------------------------------------------- |
  | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1294864/b14b6abf-d59a-ff7d-a39d-5126252173cf.png)| <font color=red>✕の発言はアルバイトです.バ畜バレバレです.</font> 
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1294864/a4a6e86b-94f7-2e35-22e0-d9bf082c3019.png)| <font color=green>〇の発言は必ず自分で一度考えるという過程を踏まないと出てこない言葉です.</font> |


(この記事の注意書き)
- 自分で一度考えたか，根拠を持って行動しているかを基準に考えています.
- <font color=red>正しいか，間違っているか，いい結果が出るか出ないかはどうでもいいとしています.</font>
- ✕は事実であり，〇とコメントは私の意見です．〇は人それぞれ改善の仕方があると思いますので適宜変えてください．

## 2. 読者の対象
理系の研究室1年目．もしくは，そのような人を後輩に持つ場合．
概ね中堅以下の大学生向けです．

## 3. 内容
重症順に並べています.

| 状況 |<font color=red>✕ 自分で何も考えていない場合 </font> |<font color=green>〇 一度でも自分で考えている場合  </font>  | コメント|
|---------------------|----------------------------|------------------------|----------------------|
| **指摘されている時**       | <font color=red>はい，はい，おっしゃる通りです． | このような理由で，こうやろうと思っていました.  |言われたままやってるようだと絶対いつか痛い目に遭います．根拠を持って行動しよう．また，後で「なぜ先生や先輩はこのように言うのか？」と疑おう．
| **方針を相談する時**       | <font color=red>今からこれをやればいいですか？ | このように考えたので，このような方針でやっていこうと思うのですがどう思いますか？ |人に判断を仰ぐな.このような姿勢を誰も評価してくれません．自分の意見を持ってから質問しよう．|
| **質問の仕方**  |<font color=red>どうやって解決すればいいですか？ | このような設定で，このようなエラーが出て，これが悪いと思うのですが，なぜエラーが出るのでしょうか？ |"How"しか考えていない人は自分で問題を解決する力が付きません．原因調査をしてから質問しよう．|
| **結果を見せる時** | <font color=red>このような相関が出ました． | このような相関が出たので，これをヒントとしてなぜこうなったかを考えたら，こういう因果関係がありました. |相関や傾向がでたところで研究成果にはならない．|
| **進捗が遅れていて「まだやっていないの？ 」と聞かれた時** | <font color=red>今週はちょっとバイトや授業で忙しくて，データ回すのも時間がかかっていてまだ途中です． | やっていません．今この段階と優先度で，今後こういう手順と日程で行っていく予定です．|言い訳する時間は相手の時間を奪っているだけでただの迷惑．YesかNoかを最初に答え，いつまでにやるのかを答える．|

3つめの「質問の仕方」については先日好評をいただいた記事も参考にしていただければと思います．

https://qiita.com/koki2022/items/b1ece532c9ccdcbb7465

## 3. 相手が「自分で考えているか」を見抜く方法
なぜ？と（相手または自分に）問いかけてその反応を見てみましょう．自分で考えていない人は何も答えられません．

(質問例)
「なぜ」その選択をしたのか？
「なぜ」この手法を使わないといけないのか？
「なぜ」この近似を使わないといけないのか？

## 4. おわりに
### 自分で考えない人は，なぜ自分で考えないのでしょうか？
---
それは，**「自分で考える」とかなり時間を食うから**です.

こう考えると，「自分は頭がよくないから」，「自分で考える癖がないから」というのは，言い訳に聞こえてきませんか．

（当たり前ですが，）仕事の時間週5日×8時間を基準に考えると研究時間は全然足りません.

もしあなたが大してセンスもないのに理系に進んだなら，**時間がかかっても，進捗が出なくて怒られても，自分で考える時間を作らないと成長できない**と思います.Youtuberの効率厨に惑わされてはいけません!!

研究内容に興味がないと，人々はこれをブラックととらえます.
研究内容が面白いと思うと，人々はGWも夏休みも夢中でやっています.

すすんで自分で考えるようにするための近道の一つは，個人的には興味だと思います.

---
もう一つの要因として幼いときの教育も挙げられると思います．
小中高では，「～～の問題には～～しなければなりません」と暗記で言えば評価されます．このような報酬の元，子供は学習していくのですから，「自分で考えること」は「時間の無駄」だと思い省いてしまいます．

しかし，人や本の言うことの暗記は，研究活動や数学では評価0ですので，途端に無能な人と化します．

あと，海外の人はよく個人の主張や，「なぜ？」を頻繁に聞いてくるため，英会話においても無能な人と化します．

凡人が「自分で一度考える」ようになるには，それを初歩的なレベルから意識的にトレーニングしなければならなさそうです．
contentfulでidで指定してコンテンツを取りたい

# はじめに

contentfulでIDを指定して取得するのに時間をとったのでまとめておきます

# 問題

以下のようにAPIを叩きました

```
$ curl 'https://cdn.contentful.com/spaces/f1f2pyxocjn5/entries/content_id_zzzz?content_type=newsApi&access_token=xxxxx' | jq
```

しかしこれではうまく接続することができませんでした

# 解決方法

IDを指定する場合は`sys.id`をクエリでしたいすることで取得できます
パスにIDをいれるというのは間違っていました

```
$ curl 'https://cdn.contentful.com/spaces/f1f2pyxocjn5/entries/content_type=newsApi&access_token=xxxxx&sys.id=content_id_zzzz' | jq
```

# おわりに

contentfulきにいってきました

# 参考

https://www.contentful.com/developers/docs/concepts/links/
インストールしたばかりのSQLServerにログインを作成してもSQL Server認証でログインできない

1. windows認証でログイン
2. オブジェクトエクスプローラーからサーバーを右クリックしてプロパティを開く
3. セキュリティから図の箇所を選択 
4. オブジェクトエクスプローラーからサーバーを右クリックして再起動


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2713217/bef7d59f-9719-f48c-e2ae-08f34a04ad8f.png)

https://learn.microsoft.com/ja-jp/sql/database-engine/configure-windows/change-server-authentication-mode?view=sql-server-ver16
Your configuration does not allow connections to http://www.smarty.net/files/Smarty-2.6.28.zip. See https://getcomposer.org/doc/06-config.md#secure-http for details.

グローバルのフラグをオフにしてみよう

```bash
composer config -g secure-http false
```

https://stackoverflow.com/questions/36151172/secure-http-flag-in-a-composer-json-doesnt-work
【Windows11】CMDの文字コードをUTF-8に設定する方法

## 前書き
本手順は主に開発する際、Shift-jisだと都合が悪い時に行う手順です。
設定する際は自己責任でお願いします。

下記に記述される手順のいずれかを行えばCMDをUTF-8で起動できるようになります。

検証Windows環境：Windows 11 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573259/abc178e8-5f1a-6a0e-11f7-6c47251787ea.png)
## UTF-8設定方法

### 設定方法について
主に２パターンあります。下記のいずれを実行することでCMDをUTF-8に設定できると思われます。
個人的には画面設定からUTF-8に変更することを推奨しております。

Windowsに備わっている機能ということから、最低限の依存関係の変更も同時に行われると思うためCMDからの変更よりかは、安全だと思われます。

### 設定画面からUTF-8に設定する方法
1. Windowsボタンを押して設定画面を起動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573259/f8fc1324-a4a0-39eb-1b68-fb9998b7835c.png)
2.  設定画面のサイドメニューの「時刻と言語」をクリックします
![スクリーンショット 2023-10-15 075043.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573259/8ca89b93-841e-673d-afc1-2fbcd72d4aab.png)
3.　「言語と地域」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573259/29022b0f-b8f4-1d0c-9d5c-a9653d0c6298.png)
4.　関連項目にある「管理用の言語の設定」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573259/6de3892f-a643-630f-2574-cc89eb35bfd2.png)

5. 「システムロケールの変更」を押した後、「ベータ：ワールドワイド言語サポートでUnicode UTF-8を使用」にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573259/1273c305-22e9-f14f-c7a1-284566921e84.png)





### CMDから直接UTF-8に設定する方法
※個人的に推奨はしません。
CHCPコマンドを利用して文字コードをUTF-8に設定する
最もメジャーでポピュラーなやり方で、その他記事に大量にありますが載せておきます。

1. Windows+Rボタンを同時に押してCMDと入力しEnterボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573259/fc2c3ecf-e718-82e4-72c6-f98ec0a16ce4.png)
1. 下記のコードを実行する

```CMD :CMD
chcp 65001
```
パソコンアプリのボタンの位置の覚え方（パソコン初心者にオススメです）

# 

[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)

# 1. PCアプリボタンの位置の覚え方

最初にパソコンアプリを覚えるとき、
ボタンの位置やボタンの図形を覚えるのは大変ですよね。
私も大変でした。(笑)

PCアプリ（ボタンがついてるなら何でも良いですよ）を開き、

PC ボタンがどこっだったっけと思ったら
ある程度この変だったよなぁ〜っと覚えておけば,

思ったボタンにマウスカーソルをもっていき、

少し待つ

すると、ボタンに名前がでてきます。

これで、いろいろなボタンを調べて、
探していけば良いかと思います。

これの利点は、どんな人でも最初の頃は、
本などでWord や Excel などのPCアプリを
学習すると思いますけど、

本などの説明のボタン図形を見たとき、
全く同じボタンの位置にはすぐに持っていけないと思いますが、
ボタンの名前がわかれば、おおまかな位置でボタンを探せていけると思います。

また、いろいろなアプリの操作に慣れてきたら、
初めて扱うアプリでも、そのアプリの元になる知識があれば、
新しい類似のアプリでも、ボタンの位置を覚えやすくなるとおもいます。

この辺かなっと(笑)

たとえば、microsoft Excel は、表計算ソフトです。これの知識があれば、
私が使っているLibre Office Calc などの表計算系統も覚えやすいかと思います。

無理に、ボタンの位置や、ボタンの図形を覚えなくても良いということですね\(^ ^)

さらにいうと、ボタンの名前を忘れても、ボタンのある程度の位置で探していけば、
このボタンの名前だったと思い出す可能性が大きいですよ(笑)

私は、長い間扱わないアプリなどがあったので、
よくボタンの名前を忘れていましたが、
探す方法で思い出して使っていきました

また、初めて見る機能のボタンの機能もボタン名から
「あっ!?もしかしてこんな機能かも？」
と想像できたりして試せていけるかと思います。
以上です。

参考になれば幸いです。

# 
[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)
波の強度が振幅の二乗に比例することの導出

　秋葉原ロボット部の読書会の教科書「量子力学10講」第1講で触れられた前提項目のうち、高校物理の教科書で取り上げられていない内容をメモ書きしたものです。

　波の強度は、波のエネルギーを単位面積、単位時間あたりに換算したものと定義します。定義より、波のエネルギーがわかると波の強度がわかります。
　波のエネルギー、つまり力学的エネルギーは運動エネルギーとポテンシャルエネルギーの総和です。いきなり、波を対象とせず、単振動する物体の力学的エネルギーを求めます。
　質量$\boldsymbol{m}$の物体が、バネ定数$\boldsymbol{k}$のバネにつるされて重力の働く方向に上下に単振動していると考えます。その時の物体の変位を$\boldsymbol{x}$、振幅を$\boldsymbol{A}$、角運動量を$\boldsymbol{ω}$とします。
　バネのポテンシャルエネルギー$\boldsymbol{E_P}$は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/8018b587-60ee-2c94-b8aa-ef1304a744cb.png)
となり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/e7567a83-8f74-f396-7434-d26ea97e4ee6.png)
を代入して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/0830b2a0-4703-5433-150a-81c6a105bff6.png)
となります。
　物体が速度$\boldsymbol{v}$で運動している場合の運動エネルギー$\boldsymbol{E_K}$は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/6c23c4f0-775d-95fb-88bf-00ded82bc0a5.png)
　なので、バネの力学的エネルギー$\boldsymbol{E}$は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/1178a2fa-74c4-c053-a6fc-11424ce139cb.png)
　となります。
　速度$\boldsymbol{v}$は変位$\boldsymbol{x}$を用いて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/a0902680-b6eb-bd2b-034a-2f03c76b38ee.png)
となるので、力学的エネルギーは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/3b49f02f-9341-9979-a8e7-035c044b749e.png)
と変位のみの変数で表すことが可能となります。
　波の状態を考えます。水面波の媒質は水（分子）、弦の振動の媒質は弦で、これらの分子が単振動をしていると考えます。媒質を構成する分子の変位$\boldsymbol{x}$を
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/b1232468-c090-bbac-5e3e-efc04eff2d3c.png)
とすると、媒質中の1分子の力学的エネルギーは$\boldsymbol{ε}$は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/658e034b-ae12-88cc-8894-87101ad13cb9.png)
　ここで、$\boldsymbol{m}$は媒質分子1分子の質量を表してることになります。
　単位体積当たりの分子数を$\boldsymbol{n}$、質量密度$\boldsymbol{ρ}$= $\boldsymbol{nm}$とすると、波のエネルギー密度$\boldsymbol{D_W}$は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/0291470f-9133-9451-42e9-c99fc0642507.png)
となり、波のエネルギー密度$\boldsymbol{D_W}$は、振幅の二乗に比例していることがわかります。このことから、波の強度も振幅の二乗に比例していることがわかります。
Bun + Astro で Image コンポーネントのエラーが出たので修正した

## この記事の概要

Bun を使って Astro で作ったサイトを動かそうとした際、`Image` コンポーネントでエラーが発生しました。

`500 (Internal Server Error)` になってしまったのですが、修正できたのでやり方を記事にしました。

## 環境

| 使っているもの | バージョン |
| --- | --- |
| astro | 3.2.4 |
| bun | 1.0.5 |

## 結論

`package.json` に `trustedDependencies` として `sharp` を追加する。

```json:package.json
{
  "trustedDependencies": [
    "sharp"
  ]
}
```

`node_modules/` と `bun.lockb` を削除する。

```sh
rm -rf node_modules/ bun.lockb
```

依存関係をインストールし直す。

```sh
bun install
```

この状態で再度立ち上げれば、画像が正常に表示されるはずです。

## 何をやっているのか

[Astro の Images の項](https://docs.astro.build/en/guides/images/#default-image-service)にも記載があるように、pnpm などのパッケージマネージャーを使用する場合、`sharp` という画像処理のライブラリを別途インストールする必要があります。[^sharp]

[^sharp]: [Astro の package.json](https://github.com/withastro/astro/blob/3f231cefed58c46315dda2e99f9d82a2678337d2/packages/astro/package.json#L180) を見るに、`sharp` が `optionalDependencies` だから別途インストールする必要があるのかな？と思っていますが、正確なことは分かっていないので、詳しい人がいたら教えてください :bow: 

ただし、Bun の場合は単に `bun install sharp` を実行するだけでは足りません。

[trusted dependency としてインストール](https://bun.sh/guides/install/trusted)する必要があります。

その上で、一度 `node_modules/` と `bun.lockb` を削除してからインストール → 立ち上げを実行することで、期待する動きになります。

## 調べている最中に出てきた Issue など

https://github.com/oven-sh/bun/issues/5276

`astro.config.js` の `defineConfig` の中で `image: {service: passthroughImageService()}` とするワークアラウンドが紹介されていました。

ただ、このやり方だと Astro の画像処理を使えなくなってしまうのでイマイチです。

[Astro の config.d.ts](https://github.com/withastro/astro/blob/3f231cefed58c46315dda2e99f9d82a2678337d2/packages/astro/config.d.ts) を見るとコメントでそのように書いてあることが確認できます。

---

https://github.com/oven-sh/bun/issues/4549

こちらの Issue を見て解決しました。

コメントでは「`trustedDependencies` を指定しても何も変わらない」と言っている人もいますが、その後のやり取りにあるように、恐らく `node_modules/` と `bun.lockb` の削除忘れかと思います。

`node_modules/` と `bun.lockb` を削除しないままだと、何度 `bun install` をやり直しても変化はありませんでした。

---

最後まで読んでくださってありがとうございます！
[X (Twitter)](https://twitter.com/xrxoxcxox)でも情報を発信しているので、良かったらフォローお願いします！

[Devトーク](https://jobs.qiita.com/employers/qiita-inc/dev_talks/489)でお話してくださる方も募集中です！
【Win11】仮想タッチパッドをシステムトレイから非表示にする方法

Win11で仮想タッチパッドを、システムトレイに表示しないように、設定しようとしたところ、ちょっと迷うところがありました。

そのため、対処方法を記載しておきます。

## 【Win11】仮想タッチパッドをシステムトレイから非表示にする手順


手順1.タスクバーを右クリックし、「タスクバーの設定」をクリック

手順2.「システムトレイアイコン」の中にある「仮想タッチパッド」をオフに変更
　　
　　**※すでに「仮想タッチパッド」がオフになっている場合、一旦オンに変更してから、オフに変更** 

手順3.これでシステムトレイから、「仮想タッチパッド」が表示されなくなります。


## まとめ

「システムトレイアイコン」にある「仮想タッチパッド」の設定が、既にオフになっている場合、
一旦、オンに変更してからオフにするのがポイントです。

少し、迷う人もいるかもしれませんので、書いておきました。

以上です。
focus、blurイベント

`input`タグや`textarea`タグにフォーカスしたとき、なにかのエフェクトを追加したいときは、一般的にCSSで制御するのが基本であるしかし、それだけでは表現できない演出や処理を入れたい場合は、JavaScriptで制御する。

```html
<textarea id="textarea" rows="5" cols="30" ></textarea>
```

```js
let textArea = document.getElementById('textarea');
    
textArea.addEventListener(`focus`, () => {
  textArea.style.background = '#b0b4df47'
});

textArea.addEventListener(`blur`, () => {
  textArea.style.background = '#ffffff'
  if (textArea.value == '') {
    alert('値を入力してください');
  }
});
```

#### 参考
https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent

https://1-notes.com/javascript-focus-event/
go初心者の設定まとめ。インストールから設定、VSコードでの使い方まで

goenvを使うことで開発ごとにgoのバーションを切り替えることができるので、インストールを行う。
```
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
```

GOENV_ROOTの設定を行う。
下記コマンドは、PATHにHOME/.goenv/binを設定しています。
ちなみにbinは実行ファイルなので、このパスを通すことで実行できるようになります。
内部理解や内容整理したい場合には、 vim .zshe で以降の設定を記述しても良い。
```
echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.zshenv
echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.zshenv
```

GO＿ROOTはgoのSDKの場所で、GOPATHは go get でモジュールをダウンロードする時に落とす場所。
バージョン切り替え時にGOPATHも変えないと、色々なバージョンが入ってきてしまうので、goenvを使うと自動で切り替えてくれます。

```
echo 'eval "$(goenv init -)"' >> ~/.zshenv
echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.zshenv
echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.zshenv

```
再起動後インストールする。
```
exec $SHELL
```
-lでバージョンが出てくるので最新をインストールする
```
goenv install -l
goenv global 1.12.0
```
システム全体で使うときは以下実行し、プロジェクトごとに指定したい場合はlocalを使う。
```
goenv global 1.12.0
```

適応バーションの確認
```
goenv rehash
go virsion
```

## vsコード
リセットしてからvsコード左下のgoのバージョン押下後、chooses go environmentで対象バーションを押下
```
exec $SHELL   
```

以下で確認
```
goenv versions
```

## ローカルインポートの設定
以下初期化実行することでimport時のpathを指定できる(モジュールモードはオンに)
```
go mod init [モジュール名]
```
go mod init local/gotradingで、gotradingディレクトリ下のappディレクトり内のhello.goをimportしたい場合はlocal/gotrading/appで使用できる
オープンソース最強日本語対応LLM、RWKV-4-World-JPNtunedをGoogleColabで試す！！


オープンソースの中で日本語最強のRWKVを皆様御存知でしょうか？
RWKV（Raven's World-Knowledge Vectors）は、RNNとTransformerの性能を組み合わせたモデルです。
このモデルは、GPT Transformerのように直接トレーニングでき（並列化可能）、Transformerレベルの言語モデル（LLM）の性能を持っています。
また文字数に入力制限がないところが特徴です。

<aside>
💡 RWKVについて超ざっくり説明するとGPTのオープンソース版で、入力文字数に制限がありません。

</aside>

今回はこのモデルの日本語版がGPT-4、GPT3.5の次の3位になったと下記のツイートに作者が投稿しています。

[https://x.com/BlinkDL_AI/status/1679816885695807489?s=20](https://x.com/BlinkDL_AI/status/1679816885695807489?s=20)

今回はこのモデルが、どんな性能か少し遅いですが見ていこうかなと思います。

**Jupyterで簡単に動かせるノートブックを作ったのでそちらで検証していきたいと思います。**
# 使うもの
- Google Colab
- https://huggingface.co/BlinkDL/rwkv-4-world/blob/main/RWKV-4-World-JPNtuned-7B-v1-20230718-ctx4096.pth (日本語のモデル）
- https://colab.research.google.com/github/umaxiaotian/RWKV-Notebook/blob/main/RWKV_ChatRWKV_WORLD%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E5%B0%82%E7%94%A8.ipynb (簡単に動かせるノートブック)

# BlinkDL/rwkv-4-worldとは

[BlinkDL/rwkv-4-world · Hugging Face](https://huggingface.co/BlinkDL/rwkv-4-world)

rwkv-4-worldは、100以上の世界の言語から学習されたモデルで、そのトレーニングデータは英語が70%、他の多言語が15%、コードが15%で構成されており、

データのソースには、さまざまなソースから収集されたデータが使用されており、「Some_Pile」、「Some_RedPajama」、「Some_OSCAR」、「All_Wikipedia」、「All_ChatGPT_Data_I_can_find」などが含まれています。このモデルはMC4、OSCAR、Wikipediaなどのデータセットでファインチューニングされてるとのことです。

# 検証
### ノートブックのインポート
[RWKV_ChatRWKV_WORLDシリーズ専用.ipynb - Colaboratory (google.com)](https://colab.research.google.com/github/umaxiaotian/RWKV-Notebook/blob/main/RWKV_ChatRWKV_WORLD%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E5%B0%82%E7%94%A8.ipynb)
まずはこちらから、GoogleColabにノートブックをインポートします。

◆下記はリポジトリ
[https://github.com/umaxiaotian/RWKV-Notebook](https://github.com/umaxiaotian/RWKV-Notebook)
### GoogleColabランタイムの設定
デフォルトの設定で行く場合、必ずA100~T4のハイメモリを指定してください。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/706d6778-fc94-72a5-7ee5-7b7f72bea8d6.png)
この設定を選べば、「ランタイム>すべてのセルを実行」で、デフォルトの設定のまま実行できます。
![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/7b7f83a1-6307-6777-0ad9-bba77f6eb6db.png)
# RWKV-Worldの感想
これはすごいです。正直ここまで的確に返してくれるとは思っていませんでした。
さすが日本語LLM3位なだけありますね。
日常会話、とくに対人チャットには支障はなさそうです。
![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/75327bc7-e1ec-220b-524e-2744e07d9727.png)
ただ、コード生成部分ではまだ課題がありそうです。
![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/1df6aa12-e77d-f6d3-74d7-e22852861b11.png)
全然答えてくれていません。
しかし、フリーでここまでできるのはすごいです。コードのデータセット持ってきてファインチューニングすれば答えれるようにもなりますし、期待です。
Web Crypto APIで使われてる暗号化/ハッシュ化アルゴリズムについてまとめてみた

w3cのcryptoAPIを読む機会があったのでついでにまとめてみました
下の画像はサポートしてるアルゴリズムとそのアルゴリズムでできることが表になったものです


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1063605/8e05cdb0-876a-37c1-c5af-d5e98d1a51f4.png)
引用元(https://www.w3.org/TR/WebCryptoAPI/#algorithm-overview)

## Web Crypto APIとは
cryptoは、JavaScriptで利用できるWeb APIの一部で、暗号関連のタスクを実行するためのインターフェースを提供しています。これにより、デベロッパーは安全な方法で情報を暗号化、復号化、署名などの操作を行うことができます。
WebだけでなくNodeやDenoなどのサーバー用ランタイムでも用意されてるAPIです。

## アルゴリズム一覧
### RSA
公開鍵暗号の一つで、データの暗号化やデジタル署名に使用されます。
SSL/TLSの鍵交換などで多く使われてます。

以下の三つのアルゴリズムが当てはまります。
- RSASSA-PKCS1-v1_5  (過去のSSL/TSL)
- RSA-PSS 
- RSA-OAEP
それぞれの違いは分かりやすい解説があったのでリンク
https://qiita.com/kj1/items/aebbb73a034f36d73e40

### ECC
楕円曲線暗号 (Elliptic Curve Cryptography, ECC)
ECCもRSA同様、公開鍵暗号ですが、短い鍵長でもセキュリティレベルを維持できるのが特徴です。
IoTなどのリソース制限のあるデバイスで使用されます。また、ブロックチェーンで使われていることも有名です

以下の二つのアルゴリズムが当てはまります。
- ECDSA 
- ECDH 

ECDSA はデジタル署名、ECDHは鍵交換に使われます

### AES
AES (Advanced Encryption Standard)
ブロック暗号の一つであり、多くのセキュリティ要件に対して標準として採用されています。
SSL/TLSの暗号化にも使われることが多いです。

以下の四つが当てはまります。
- AES-CTR
- AES-CBC
- AES-GCM
- AES-KW

CBCはパディング（平文が固定長のブロックサイズに適合しないときにデータを補完すること）が必要なモード
CTRはパディングを必要としない単純なモード。二度同じ乱数を使うことはできない。同じ乱数を二度使用すると二つの暗号文のXORをとることで2つの平文のXORを使用できてしまう
GCMはCTRモードに追加で、メッセージ認証コード(MAC)の生成も行う方式。MACは高速化や改ざんの対策に使用される
KWは鍵自体を暗号化するためのモード。鍵専用の暗号化モードなので、他のモードとは用途が違うことに注意

参考
https://stackoverflow.com/questions/1220751/how-to-choose-an-aes-encryption-mode-cbc-ecb-ctr-ocb-cfb

### HMAC
HMACはメッセージ認証コード(MAC)の生成を行うアルゴリズムです

### SHA
SHAはハッシュ関数で文字列のハッシュ化を行います。
ハッシュ関数はデータの完全性チェックやパスワードの保存に使用されます
以下のアルゴリズムが当てはまります
- SHA-1
- SHA-256	
- SHA-384	
- SHA-512	

SHA-1は160ビット、SHA-256, SHA-384,SHA-512はそれぞれ256ビット,384ビット,512ビットのハッシュ値を生成します。

### 鍵導出アルゴリズム
鍵導出関数はマスターキーから派生したサブキーを生成するアルゴリズムです。
鍵は長期間にわたって同じものを使用すると、セキュリティリスクが高まります。鍵導出アルゴリズムを使用して、定期的に新しい鍵を生成し、旧鍵を無効にすることができます。

以下の二つが当てはまります
- HKDF
- PBKDF2


HKDFは暗号化キー、認証用の鍵、セキュリティトークンなど、高いセキュリティ要件がある場合に使用されます。
PBKDF2はパスワードベースの鍵派生で使われます。パスワードは通常、人が覚えられる長さで鍵の長さとしては不十分です。PBKDF2はパスワードのような低エントロピー情報をストレッチングする(長さを増やす)ことが特徴です。

## アルゴリズムが可能な使用方法

アルゴリズムによって提供される可能な使用方法は以下の通りです。

- **encrypt**: データを暗号化するためにアルゴリズムを使用します。

- **decrypt**: 暗号化されたデータを復号化するためにアルゴリズムを使用します。

- **sign**: デジタル署名を生成するためにアルゴリズムを使用します。データの完全性と認証を保証するのに役立ちます。

- **verify**: デジタル署名を検証するためにアルゴリズムを使用します。データの正当性を確認します。

- **digest**: ハッシュ関数を使用してデータの固定長のダイジェスト（ハッシュ値）を生成するためにアルゴリズムを使用します。データの一意性を確保するために役立ちます。

- **generateKey**: 新しい鍵を生成するためにアルゴリズムを使用します。鍵の生成はセキュリティの基本です。

- **deriveKey**: 既存の鍵から新しい鍵を派生させるためにアルゴリズムを使用します。鍵の階層化や派生に使用されます。

- **deriveBits**: 鍵からビット列を派生させるためにアルゴリズムを使用します。ビット操作により新しいデータを生成します。

- **importKey**: 外部から鍵を導入し、内部フォーマットに変換するためにアルゴリズムを使用します。外部の鍵を内部で使用可能な形式に変換します。

- **exportKey**: 内部で使用している鍵を外部形式にエクスポートするためにアルゴリズムを使用します。他のシステムやアプリケーションで使用できるようにします。

- **wrapKey**: 鍵を保護し、他の鍵で暗号化するためにアルゴリズムを使用します。鍵をセキュアに転送や保存するために使用されます。

- **unwrapKey**: 暗号化された鍵を復号化し、使用可能な形式に戻すためにアルゴリズムを使用します。暗号化された鍵を元の状態に復元します。



## 終わりに
全ての暗号化/ハッシュ化アルゴリズムを把握するのは現実的ではないので、とりあえずWeb標準で使われているものを見ておくだけでも何か役に立つかもしれないです。
physics パッケージって想像以上に便利やねん

# 1. はじめに

physics パッケージって結局どう便利やねんということでまとめてみました。

\begin{document}の前に\usepackage{physics}を記述することを忘れずに。


# 2. ()、[]、{}など括弧の大きさを調整する(left rightより簡単)

例えば分数全体を()で囲みたい時、

```
 \begin{align}
    (\frac{a}{b})
 \end{align}
```

と書いても、

```math
 \begin{align}
    (\frac{a}{b})
 \end{align}
```

となるだけです。括弧の大きさを変えたければ、

```
 \begin{align}
    \left(\frac{a}{b}\right)
 \end{align}
```

```math
 \begin{align}
    \left(\frac{a}{b}\right)
 \end{align}
```

と\left( \right)で挟めば言い訳ですが、数式が長くなるとコードがごちゃごちゃして見にくくなり、タイプミスに繋がります。
しかし、\qty()コマンドを以下のように使えば、

```
 \begin{align}
   \qty(\frac{a}{b})
 \end{align}
```

```math
 \begin{align}
\left(\frac{a}{b}\right)
 \end{align}
```

と簡単に調整できます。[]で囲みたい場合は\qty[]と記述すれば大丈夫です。また、絶対値やノルムにも対応しています。


# 3. ベクトル表記

```
\vb*{a}
```

と記述することでベクトル表記になります。


# 4.ベクトル解析

```
\grad{a}
\div{a}
\curl{a}
\laplacian{a}
```

と書くと、

```math
 \begin{align}
    &\nabla a\\
    &\nabla \times a\\
    &\nabla ・ a\\
    &\nabla ^{2} a\\
 \end{align}
```

と表示できます。単に$\nabla$だけ表示したい場合は、\gradと記述しましょう。


# 5.微分、偏微分
微分を表示させたい時少し面倒です。dはローマン体、関数などはイタリック体で書きますよね。

```
 \begin{align}
    \frac{{\rm d}y}{{\rm d}x}
 \end{align}
```

このように書けば、

```math
 \begin{align}
    \frac{{\rm d}y}{{\rm d}x}
 \end{align}
```

と表示されます。ですがいちいち{\rm }を書くと{ }が多くて見にくいです。そんな時、\dv{}{}コマンドを使いましょう。

```
 \begin{align}
    \dv{y}{x}
 \end{align}
```

このように書けば、先程と全く同じものが出力されます。
では、

```math
 \begin{align}
    \frac{{\rm d}}{{\rm d}x}
 \end{align}
```

などはどう記述すればいいでしょうか？簡単です、

```
 \begin{align}
    \dv{x}
 \end{align}
```

と書けば大丈夫です。

```math
 \begin{align}
    \frac{{\rm d}^{2}y}{{\rm d}x^{2}}
 \end{align}
```

これはどう書けばいいでしょうか。これは

```
 \begin{align}
    \dv[2]{y}{x}
 \end{align}
```

と書けばいいです。それでは偏微分はどう書きましょう？これは、\dvではなく、\pdvと書けばいいです。
余談ですが、LeTeXを使い始めて半年くらいにこのパッケージの存在を知ってから、手を合わせて感謝こそしたものです。

# 6. 例：2から5の合わせ技
極座標表示のシュレーディンガー方程式はこのように表されました。

```math
 \begin{align}
  -\frac{\hbar}{2m}\left\{ \frac{1}{r} \frac{\partial^{2}}{\partial r^{2}}r+\frac{1}{r^{2}\sin\theta}\frac{\partial}{\partial \theta}\left( \sin\theta \frac{\partial}{\partial \theta}\right) + \frac{1}{r^{2}\sin^{2}\theta} \frac{\partial^{2}}{\partial \phi^{2}} \right\}\phi(r)+V(r)\phi(r)=E\phi(r)
 \end{align}
```

これを表示させるには通常、

```
 \begin{align}
  -\frac{\hbar}{2m}\left\{ \frac{1}{r} \frac{\partial^{2}}{\partial r^{2}}r+\frac{1}{r^{2}\sin\theta}\frac{\partial}{\partial \theta}\left( \sin\theta \frac{\partial}{\partial \theta}\right) + \frac{1}{r^{2}\sin^{2}\theta} \frac{\partial^{2}}{\partial \phi^{2}} \right\}\phi(r)+V(r)\phi(r)=E\phi(r)
 \end{align}
```

と記述しなければなりませんが、physics パッケージを使うと、

```
 \begin{align}
   -\frac{\hbar}{2m}\qty{\frac{1}{r}\pdv[2]{r}r+\frac{1}{r^{2}\sin\theta}\pdv{\theta}\qty(\sin\theta\pdv{\theta})+\frac{1}{r^{2}\sin^{2}\theta}\pdv[2]{\phi}}\phi(\vb*{r})+V(r)\phi(\vb*{r})=E\phi(\vb*{r})
 \end{align}
```

physics パッケージなしの生活は考えられませんね。手を合わせて感謝をする気持ち、分かりますよね。


# 7.量子力学(ブラケット等)
近日公開


# 8.行列
近日公開

# 9.参考資料

https://mirrors.ibiblio.org/CTAN/macros/latex/contrib/physics/physics.pdf
REPL駆動開発、はじめてみませんか。ーーアジャイルの極地的考え方

### REPL駆動開発と完成形のギャップの理解

REPL駆動開発、それは開発の過程で起こるフィードバックループをとっても短くして、すぐに確認を行える開発戦略です！とてもおもしろい。私たちは、ギャップを即座に発見して、すぐに変えてみて結果を見ることができる、何より楽しい開発戦略だと思います。

初めてREPLで開発してみたときは、全然その真価がわかりませんでした。REPLで確認することより、先々起こりうるような不具合を型で制限する、先回りの開発手法ばかりに傾倒していたからです。

生き物としてのプロダクトに目を凝らすこと。池の中に息づく小さな生命や、微細な動きをじっくりと見つめること。

開発フローの中で、大まかなものからスタートして、それを徐々に磨き上げるアプローチを取ることができます。まるで、デッサンをするみたいに大まかなあたりを付けて徐々に磨き上げるアプローチ。プログラミングは変更が効きます、というより頻繁に変更するような無形のものです。

大雑把な場所から、徐々に近づいていくようなアプローチが、きっと好ましい。REPL駆動開発はアジャイル開発の極地みたいなものでしょう。

---

私たちは、頭の中で仮想的にロジックを組み合わせたりします。このロジックをこれに適用して、あの関数はここで使って……。それには限界がある。

**大雑把にまず動くものを作る。** そして、その都度確認しながら完成形にアプローチをしていく。そういう開発戦略が大切です。

大雑把なものからスタートする理由は、ギャップは見てわかりやすいから。頭で想像したものを考えるのではなく、目で見て「あ、これが足りない！」って見てわかる。そういう、目で見てわかるというのは大きな事です。

じっと微生物を観察するみたいなことでも、目で見たらどのぐらいなのか一目でわかってしまう。想像だけじゃない強さが、REPL駆動開発にある。

次に何をすればいいかの手がかりが、目の前にあるのは大きい。

REPL駆動開発の真髄に触れて、効率的で楽しい開発を進めることができます。

まず、そもそも初心者のときに何をやったか思い出すと、「Hello, world!」でしょう。ってことは、目で見える開発って一番わかり易いということ。それを、開発の最初から最後までできるようにしたよ、っていうのがREPL駆動開発。

つまり、REPL駆動開発は「Hello, world!」の延長だ、と言って良いと思う。

初心者でも、階段をのぼるように開発できる！一緒に、clojureでREPL駆動開発に一歩踏み出してみましょ。REPL駆動開発は、常に途上です。だから、どのようにスタートしたって構わない。最初は、データを見ることだけできればよい。

### ギャップの感じ取り方と、解釈

こういうインクリメンタルな開発をするとき、ギャップを感じることは必須になる。どうやって解釈するか？がとても重要だ。

思考や見たものをどうやって行動に移すか。

カエルがどうやって筋肉を使っているかを観察し、考えるみたいに今のシステムを見てみる。

---

人は五感を用いて世界を理解するけれど、プログラミングに於いてはもっぱら資格を使う。見るという行為を徹底するのがREPL駆動開発だ。

REPL駆動開発＝見るということを、ちょっとしっかり考えてみるんだ。

### どうすればいいか

そもそも、プログラムはデータの変換である。どんなものも、入力と出力の関数である。プログラミングや科学の世界においては。いかに不要な複雑性を排除し、シンプルに関数として捉えるかが大切なんだ。

ここで問題がある。関数は目に見えづらいということ。なぜなら、関数は動き・関係だからだ。

たとえば関数内部で2つに分かれる条件分岐が3つあるだけで、全てのシナリオケースは8つになってしまう。全てを直感的に見ることって、人間にとってとても難しいんだ。

また、関数は加えて状態も存在する。不用意に複雑さを追加してしまいがちな、あの悪しき状態。歴史的には仕方なかったのかもしれないけれど。
関数を理解するためには入力・状態・エッジケースの確認がとても重要になる。

1. **状態の確認**: データの状態や変数の現在の値を確認することは、何が起こっているのかを直感的に理解するために不可欠
2. **関数の評価**: 関数の動作を確認するためには、その関数をREPL上で評価してみることが最も効率的
3. **エラーのトレース**: エラーが発生した際には、REPLが詳細なトレース情報を、しっかりと確認する。動作の中でも、最も特異でわかりやすいもの

そもそも、物事を理解するために、特別なケースを見るのはとても重要。これは当たり前だよね、て言うものより、こういう場合はちょっとどうなんだろう？と言うもののほうがわかりやすい。
VSCodeでの PlantUML開発環境 PlantUML画像からコードへジャンプ 背景色は黒で目に優しいテーマを使用

# VSCodeでのPlantUML環境

VSCode拡張機能はPlantUML - Simple Viewerv2.17.6 well-ar

PlantUML - Simple Viewer - Visual Studio Marketplace

https://marketplace.visualstudio.com/items?itemName=well-ar.plantuml

背景黒で目に優しいテーマを使用しています。

画像上で項目名をクリックするとコードの場所に飛んでくれます。
ただし同じ項目名があるとクリックしても１番目に（最初にヒットしたキーワード）飛んでしまいます。

![PlantUML_crt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/1abb26f6-e08c-23a2-3354-10f9125c2320.gif)

↑GIF画像の容量 1.2MB



```PlantUML.puml
@startuml vns

!theme crt-green

[*] -> トップページ : ランディングページ

トップページ -> トップページ : vnsボタンをクリック
vnsページ->トップページ : vnsボタンをクリック
vnsページ->トップページ : ログアウトをクリック
トップページ --> ユーザー登録orログイン : ユーザー登録orログインをクリック
ユーザー登録orログイン -->トップページ : ユーザー登録の中途取り消し\nBACKボタンをクリック

state vnsページ {
    ユーザー登録orログイン --> vnsページ : ログイン成功
    トップページ--> vnsページ : GetStartボタンをクリック(済)
    [*] ---->  ユーザープロフィール : ユーザープロフィールをクリック
    [*] --> マッチング結果 : 決定をクリック
    ユーザープロフィール -> 作品 : 作品をクリック
    ユーザープロフィール -> ユーザープロフィール : 編集をクリック
    ユーザープロフィール --> 作品 : 作品をクリック
    [*]  ---> 作品 : 作品をクリック
    作品 --> 作品 : 作品登録をクリック\n作品検索をクリック
    作品-->マッチング結果 : 決定をクリック
    ユーザープロフィール -> マッチング結果 : 決定をクリック
    マッチング結果 ->マッチング結果 : NEXTボタンをクリック
    [*] -d--> グループ : グループをクリック
    ユーザープロフィール -d-> グループ : グループをクリック

}

@enduml

```


# 使用GIF動画作成ツール

ScreenToGif - 画面を録画し、編集して GIF、ビデオ、またはその他の形式で保存します。
https://www.screentogif.com/



# PlantUMLのテーマギャラリー

Welcome to PlantUML themes Gallery | puml-themes-gallery
https://the-lum.github.io/puml-themes-gallery/

↓使えそうだと思ったテーマ

```
' !theme toy
' !theme vibrant
' !theme _none_
' !theme amiga
' !theme blueprint
' !theme cloudscape-design
' !theme crt-green
' !theme lightgray
' !theme metal
' !theme reddress-darkblue
' !theme reddress-darkgreen
' !theme reddress-darkorange
' !theme reddress-darkred

```



# jsonデータの表示方法

```
@startjson "json"
{
  "firstName": "John",
  "lastName": "Smith"
}
@endjson

```
Appleサポートが終了したMacに新バージョンのMacOSをインストールする方法

OpenCore Legacy Patcher - OCLP (https://dortania.github.io/OpenCore-Legacy-Patcher/) は、macOS の最新バージョンを、macOS の公式サポート対象外の古い Mac にインストールできるようにするオープンソースツールです。

もちろん保証はないと思いますが個人的な使用には全く問題ないと思います。

私の場合は 2016のMacbook Pro 15インチを持っていてスペックも高いしOSの更新できないこと以外には全然問題なく使っています。
最初は MacOS Venturaがインストール出来なくなった時に初めてOCLPについて知って初めてインストールしました。
今回は更新したら起動時にプログレス画面から進まなくなってしまったので**MacOS Sonoma**に最初にインストールした時と同じ様に更新してパソコンが復活したので皆さんに紹介したいと思って書いています。

### インストール方法

USB メモリを使用して OpenCore Legacy Patcher をインストールする手順は、以下のとおりです。

#### 事前準備

- 念の為Macのデータをバックアップしておいた方がいいです。
- 8GB 以上の USB メモリを用意します。

#### OCLPのダウンロード

- OpenCore Legacy Patcher の[**リリースページ**](https://github.com/dortania/OpenCore-Legacy-Patcher/releases)から最新のバージョンの OpenCore Legacy Patcher をダウンロードします。

#### macOSインストーラーの作成

- ダウンロードした OpenCore Legacy Patcher を解凍します
- 解凍したフォルダの中にある「OpenCore Legacy Patcher.app」をダブルクリックします
- Create MacOS Installerボタンでインストーラーを選択します
- 最新バージョンのMacOSをダウンロードできます
- USBメモリを選択してインストーラーの準備を行います。USBメモリに入っていたものが全て削除されるので必要な場合はバクアップしてください。

![スクリーンショット 2023-10-15 0.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206957/e6e84a33-4af9-aefc-63e3-5d97b4230bc5.png)

#### macOSのインストール

- USB メモリをインストールするMacに取り付けてMacを起動します
- 起動時にキーボードの「Option」キーを押しながら起動します
- USB メモリから macOS をインストールします
- インストール後は一度USBメモリからブートを読み取り起動する必要があります

#### OpenCore Legacy Patcher の設定

OpenCore Legacy Patcher をインストールされた後、Macの起動時にOpenCoreの設定画面が表示されます。
表示されない場合は自分で開いてください。

![スクリーンショット 2023-10-15 1.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206957/8cd7e794-670a-2da3-f23a-ed640f60883d.png)

Build and install OpenCoreボタンを押し、Install to diskボタン押して、開いた画面でMacのディスクを選択してEFIをインストールします。これにより、USBドライブなしで起動することが可能になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206957/5de9f7a0-826d-56c2-6160-607f0f12b529.png" width="480" />

#### Post-Install Root Patch

一部のMacの場合はPost-Install Root Patchが必要です。
OpenCore Legacy PatcherのPost-Install Root Patchは、macOSのインストール後に行うパッチ適用プロセスです。これにより、サポートされていないMacでも特定の機能を利用できるようになります。

具体的な手順はOCLPが自動的に検知し推薦してくれます。Start root patchingボタンで設定できます。
パッチャーの設定を必要に応じて変更することも可能です。

#### 注意事項

- OpenCore Legacy Patcher のインストールは、Mac のデータを消去する可能性があります。
- OSまたはOCLPが更新された時動作できなくなる可能性があります。

#### トラブルシューティング

再起動して立ち上がらなくなった場合は電源ボタンを長押しして電源オフにしてから起動時にCommand+Rキーを押しながら立ち上げてリカバリモードに入ります。
ディスクが暗号化されている場合はタイムマシンの設定に進みディスクの暗号化をパスワードを入れて複合化してメイン画面に戻ります。
UtilitiesメニューからTerminalを開いて下記のコマンドでスナップショットを適用します。

ターミナルに移動し、次のように入力してディスクをマウントします

```
mount -uw "/Volumes/Macintosh HD"
```

次に、スナップショットを元に戻します

```
bless --mount "/Volumes/Macintosh HD" --bootefi --last-sealed-snapshot
```

その後、次のように入力します

```
cd "/Volumes/Macintosh HD/Library/Extensions"
```

次に ls と入力すると、たくさんの.kextsが表示されるはずです。

`
注: "HighPoint"で始まる.kextsだけが表示される場合は、これを無視してシステムを再起動できます。他のkextsが見つかった場合は、続行します。
`

HighPointで始まるものを除いてすべてを削除します。削除するには、rm -rf "kextname"と入力します。

その後、再起動します。これで、システムは未パッチのスナップショットに復元され、再度起動できるようになります。

その他の問題については OpenCore Legacy Patcherの公式ページから探してみてください。
https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html
【Julia1.9.2】fill()で嵌った話

# 嵌まったこと
`Julia1.9.2`にて, ```fill()```で作成した配列値を再代入したら, 代入された配列以外の配列の値も変わる.

# 具体的なコード
以下のようなコードを書いて, `Julia1.9.2`で実行した. 
```Julia
res = fill([0, 0], 10)
res[1][1] = 2
```
これを実行すると`res` は以下のようになる想定だ. 
```Julia
res[1] = [2, 0]
res[2] = [0, 0]
res[3] = [0, 0]
...
```
だが, 実際の実行結果は想定通りに***ならない***.
実行した結果は, 実は以下のようになる.
```Julia
res[1] = [2, 0]
res[2] = [2, 0] #なぜかこれも変わる
res[3] = [2, 0] #なぜかこれも変わる
...
```
想定とは違い, 他のインデックスの配列の値まで変わってしまう. 
ちなみに, 以下のコードは想定通りに動く.
```Julia
res = fill([0, 0], 10)
res[1] = [2, 0]
```
これの実行結果は, 
```Julia
res[1] = [2, 0]
res[2] = [0, 0]
res[3] = [0, 0]
```

# 原因
[公式ドキュメント](https://docs.julialang.org/en/v1/base/arrays/#Base.fill)に記載があった.
これに依ると, ```fill()```で作成された値そのものへの変更は, ほかのものにも跳ねるらしい. 
***わかるかそんなの***.

# 対策
[公式ドキュメント](https://docs.julialang.org/en/v1/base/arrays/#Base.fill)に書いてあったが, ***内包表記を使いましょう***とのことだった. 
確かに下記のコードでは, 無事に想定通りの挙動になった.
```Julia
a = [[0, 0] for _ in 1:10]
a[1][1] = 1
#= 実行結果
a[1] = [1, 0]
a[2] = [0, 0]
a[3] = [0, 0]
...
=#
```
MX Keys for Mac (US配列)のキー掃除(備忘録)

年1回はキーボードの掃除をしたいので、やり方を自分のために残しておく。

# 最初に

- キーボードの配列の写真を撮っておく
- 小さめのマイナスドライバー、ダストブロワー（${\rm CO_2}$とかでゴミ飛ばすやつ）を用意しておく

# キートップの外し方

## 普通のキー

ほとんどのキーは1つのパンタグラフからなり、奥側がハサミ、手前側がツメでキートップが固定されている。

1. 奥側にマイナスドライバーを差し込む
1. 手前側を押して抑えながら、奥側のハサミを（左右の力を均等にかけながら）外す
1. 半分外れたキートップを手前側に動かし、ツメを外す

## 特殊なキー

### スペースキー

左右に小さなパンタグラフがあり、それぞれの向きは普通のキーと同じ。
ただし、キートップの外側に針金が入っているので気を付ける。

### 左側のControlキー

唯一ハサミとツメの上下（手前奥）が逆になっている。間違えるとツメが吹っ飛ぶ。

![IMG_2918.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614520/f280b640-ddc8-ec6d-3906-52531c6eafa2.jpeg)


### Caps Lockキー、F13〜F15

左上にLEDの発光部があるが、特に支障はない。

### ESCキー

手前奥方向の幅が狭いため、やや外しにくい。

### その他の修飾キー

普通のキーの構造に加えて、針金が手前側に入っている。奥側から外せば問題ない。
return、左右shiftキーはパンタグラフが2つあるので、左右均等に力をかけて外す。

![IMG_2912.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614520/ed00927c-c944-738a-d5e4-f686ee15b45d.jpeg)
![IMG_2914.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614520/6680fb1d-5397-9923-adaf-92fff48a175a.jpeg)

### ファンクションキー（F1〜F12、F16〜F19、取り出し）、テンキーのenterキー

左側がツメ、右側がハサミになっているので、右側から外す。

# 掃除

ダストブロワー、粘着テープなどでゴミを剥がす。

# 取り付け

ツメ側を引っ掛けるように嵌め込んでから垂直に力をかけ固定する。
針金がある場合は、先に本体側の穴に差し込んでからツメを嵌める。

# 参考

MX Keysで構造はだいたい同じっぽいが、配列によってキーの取り付け向きが異なる可能性があるので要注意。

https://sketch99.blog/2022/11/29/life/pc/5964/

https://www.youtube.com/watch?v=0kBsDQqzuvE
pythonで複雑なリストの数え上げを簡単に行う方法

# はじめに

ここでは、python の collections を用いて、複雑なリストでも簡単に数え上げる方法を紹介します。

https://docs.python.org/3/library/collections.html

## ソースコードと簡単な説明

簡単な例として、people として Aさん、Bさん、Cさん、の３名がいて、1 ~ 5 までの成績がついているようなリストがあったとします。それぞれの数は決まってません。このような情報を整理して、各人がどういう成績を何回取得したかをまとめる方法を紹介します。

``` python:
# Counterは、要素の出現回数をカウントするための特別な辞書のようなデータ構造です。
from collections import Counter

# peopleというリストには、A、B、Cなどの文字が順番に格納されています。
people = ["A", "A", "A", "B", "B", "B", "B", "A", "A", "A", "A", "A", "C", "C", "C"]
# gradeというリストには、各人の成績が順番に格納されています。
grade =  [  1,   3,   2,   3,   4,   2,   2,   3,   4,   4,   3,   3,   3,   4,   5]   

# peopleリストの各要素の出現回数をカウントします。
counter_people = Counter(people)

# 人々の出現回数を表示します。
print("[check people]")
# most_common()は、最も多い要素から順に表示するメソッドです。
for _ in counter_people.most_common():
    print(_)

# peopleとgradeのリストを組み合わせて、ペアのリストを作成します。
pairs = list(zip(people, grade))
# 各ペア(人と成績の組み合わせ)の出現回数をカウントします。
counter_people_grade = Counter(pairs)

# 人と成績のペアの出現回数を表示します。
print("[check people & grade]")
for _ in counter_people_grade.most_common():
    print(_)
```

これを実行すると、

``` text:
[check people]
('A', 8)
('B', 4)
('C', 3)
[check people & grade]
(('A', 3), 4)
(('B', 2), 2)
(('A', 4), 2)
(('A', 1), 1)
(('A', 2), 1)
(('B', 3), 1)
(('B', 4), 1)
(('C', 3), 1)
(('C', 4), 1)
(('C', 5), 1)
```

このような結果が得られます。

_ は、通常、特定の値を無視したいときや、変数名が重要でない場面で使われる慣習的な変数名で、ここでは、改行後にプリントする例を紹介するためだけに使ってます。

## ポイント

使い所のポイントとしては、

``` python:
# peopleとgradeのリストを組み合わせて、ペアのリストを作成します。
pairs = list(zip(people, grade))
# 各ペア(人と成績の組み合わせ)の出現回数をカウントします。
counter_people_grade = Counter(pairs)
```

の部分で、list(zip(x,y))) で、ペアのリストを作成してから、Counter を実行することで、２つのリストを包含した格好で、頻度分布を作成してくれます。
サーバーのSMTP機能にGmailを使う（アプリパスワード取得方法；2023.10.15最新版）

Gmailでアプリパスワードを使ってSMTP送信したいが、コロコロ変わってて最新の入手方法がないのでメモ。

# 手順
1. Googleアカウント設定ページ↓に行く。

https://myaccount.google.com/security

2. 「2段階認証プロセス」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075437/9b047f4d-a88f-13ca-22ae-d659631c816d.png)

3. 一番下まで行って「アプリパスワード」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075437/31f60c54-a34a-2725-f66c-39299e65cae3.png)

4. 適当な名前を打ち込むと、パスワードが表示される（1度しか表示されない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075437/692ba88b-4ac6-4f11-d5a7-3bc96dd8f29d.png)

# セットアップの例（elabftwの場合）

|インデックス|内容|
|---|---|
|Address of the SMTP server|smtp.gmail.com|
|SMTP Port|587|
|SMTP username| （アカウント名@gmail.com）|
|SMTP password| （入手した16桁のアプリパスワード）|
|Sender address| （アカウント名@gmail.com）|
|Verify TLS certificate| Yes|
コマンドプロンプトでスペースを含むファイルパスを処理する場合

先日コマンドプロンプトで処理をしようとした際に、OneDrive上のファイルを読み取ろうとしたところ、以下のエラーが発生した。

ファイルパス（コマンドプロンプト上に入力した内容です）：
C:\Users\ユーザー名\OneDrive - ●●\テストフォルダ\対象ファイル.xlsx

エラーメッセージ：
'C:\Users\ユーザー名\OneDrive'は、内部コマンドまたは外部コマンド、可能なプログラムまたはバッチファイルとして認識されていません

OneDrive上のファイルをCドライブに移してパスを変更したところ、正常に処理は完了しましたが
上記のエラーの原因についても、調べてみました。

調べてみたところ、ファイルパスにスペースが含まれていたことが原因でした。
この場合にエラーを避けるには、ダブルクォーテーションで囲むことで解決できるそうで、以下のファイルパスに変更したところ、OneDrive上のファイルでも正常に処理が完了することができました。

修正後のファイルパス（コマンドプロンプト上に入力した内容です）：
"C:\Users\ユーザー名\OneDrive - ●●\テストフォルダ\対象ファイル.xlsx"
batファイルでpythonを実行

pythonでのツール作成を依頼され作成した際に、exeファイル化が面倒なので、他の実行方法はないかと考えて
batファイルで実行できるようにしました。


以下の文章をメモ帳に入力して、拡張子を.batにして保存する。

cd <目的の.pyファイルまでのパス>
python <.pyファイルの名称>

実行をすると、コマンドプロンプトの画面が表示され、処理が自動で実行されます。
【JavaScript・学習ログ1】JavaScriptの基本操作

# 目次
[1. 記述方法](#1-記述方法)
[2. データの種類](#2-データの種類)
[3. 出力方法](#3-出力方法)
[4. 四則演算](#4-四則演算)
[5. 変数について](#5-変数について)
[6. 定数について](#6-定数について)
[7. よくあるエラーの種類](#7-よくあるエラーの種類)

<font color =gray>参考：侍テラコヤ『JavaScriptの基礎を学ぼう』https://terakoya.sejuku.net/programs/60/chapters
## 1. 記述方法
JavaScriptを実行するには下記のような記述方法がある。

#### ①HTMLファイルの中に記述する
短いコード向け。
```html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meda charset="utf-8">
		<title>JavaScriptの練習</title>
	</head>
	<body>

		<script>
			// ここにコードを記述する
		</script>
	</body>
</html>
```
- 画面の表示前に処理を実行したい場合　⇒headタグ内に書く。
- 画面の表示後に処理を実行したい場合　⇒bodyタグ内に書く。

#### ②JSファイルを作ってHTMLファイルから読み込む
コードが長くなる場合、機能ごとにファイルを分けたい場合向け。
```html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meda charset="utf-8">
		<title>JavaScriptの練習</title>
	</head>
	<body>

		<script src="script.js"></script>
	</body>
</html>
```
①と同じくheadでもbodyでも記述可能。

## 2. データの種類

- 文字列型
- 値型
- 論理型
```javascript
// 文字列
console.log('こんにちは');
console.log('今日はいい天気ですね');
// 数値
console.log(100);
// 論理
console.log(true);
console.log(false);
```
## 3. 出力方法
ブラウザを開いただけではプログラムが正しく実行されているかわからないため、
**コンソール**にデータを出力し、確認する。
![スクリーンショット 2023-10-14 224745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/b90e30a2-59cf-1e5b-c8a8-d94fc247e62a.png)
## 4. 四則演算
| | | | |
|-|-|-|-|
|+|足す|-|引く|
|*|掛ける|/|割る|
|%|余り| | |
```javascript
console.log(45 + 18);
console.log(30 - 12);
console.log(15 * 6);
console.log(30 / 3);
console.log(45 % 8);
```
## 5. 変数について
文字列や数値などのデータを入れる箱のようなもの。
```javascript
// 変数の宣言
let userName;
// 値の代入
userName = '太郎';
// 変数の宣言・値の代入
let userNumber = 8;

// コンソールへの出力
console.log(userName);
console.log(userNumber);
```
再代入する際はletの記述は不要。

#### 命名規則
変数名には<b>キャメルケース（複合語の各単語の先頭を大文字にする記法）</b>を使用する。
letのような予約語は使えないため注意。

## 6. 定数について
再代入ができない変数のこと。予期せぬ動作を妨げるメリットが大きいので、基本的にはlet(変数)ではなくこちらconst(定数)を使う。

## 7. よくあるエラーの種類
|種類|原因|
|-|-|
|構文エラー|記述がJavaScriptのルールに沿っていない|
|参照エラー|変数のスコープ(有効範囲)を無視して参照している|
|型エラー|データ型を勘違いして使用している|
|範囲エラー|データの許容範囲を超えた使い方をしている|
<hr>

（簡易メモ）
1. 記述する方法はコードの簡易さや複雑さで使い分けると◎
1. コンソールにデータを出力する際の記述は **console.log()**。
1. 『変数let』は再代入可能、『定数const』は不可能。