OmniAICreator/Qiita-1.07M huggingface dataset:
ROS(1)から呼ぶPythonはどこ？

## TL;DR

pyenvを入れていれば、pyenvのpython。すなわち、`which python`で取得されるpythonパス。
(基本的にpyenv入れないと僕は何もできないので、pyenv入っていない人はごめんなさい)

## 根拠をゆえ！()

```bash
$ rosrun mediapipe_ros app.py
[ERROR:0@0.785] global /io/opencv/modules/videoio/src/cap.cpp (164) open VIDEOIO(CV_IMAGES): raised OpenCV exception:

OpenCV(4.6.0) /io/opencv/modules/videoio/src/cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): /home/yuki/workspace/lidar_data/DATA_AOYAMA-suiyoubi/walk-senpai.mkv in function 'icvExtractPattern'


Downloading model to /home/yonelab/.pyenv/versions/3.9.0/lib/python3.9/site-packages/mediapipe/modules/objectron/object_detection_ssd_mobilenetv2_oidv4_fp16.tflite
Downloading model to /home/yonelab/.pyenv/versions/3.9.0/lib/python3.9/site-packages/mediapipe/modules/objectron/object_detection_3d_sneakers.tflite
INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
```

↑は、mediapipeのposeをpublishするパッケージをビルドした後、実行したときのエラーです。エラー内容は、動画ファイルを置き忘れていることによるものですが、大事なのはtfliteが保存される場所です。

```bash
Downloading model to /home/yonelab/.pyenv/versions/3.9.0/lib/python3.9/site-packages/mediapipe/modules/objectron/object_detection_ssd_mobilenetv2_oidv4_fp16.tflite
Downloading model to /home/yonelab/.pyenv/versions/3.9.0/lib/python3.9/site-packages/mediapipe/modules/objectron/object_detection_3d_sneakers.tflite
```
もちろん、これの前に、`$ pyenv global 3.9.0`を実行しています。

次に、`$ pyenv global 3.8.6`をしてみると、

```bash
$ rosrun mediapipe_ros app.py
[ERROR:0@0.638] global /io/opencv/modules/videoio/src/cap.cpp (164) open VIDEOIO(CV_IMAGES): raised OpenCV exception:

OpenCV(4.6.0) /io/opencv/modules/videoio/src/cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): /home/yuki/workspace/lidar_data/DATA_AOYAMA-suiyoubi/walk-senpai.mkv in function 'icvExtractPattern'


Downloading model to /home/yonelab/.pyenv/versions/3.8.6/lib/python3.8/site-packages/mediapipe/modules/objectron/object_detection_ssd_mobilenetv2_oidv4_fp16.tflite
Downloading model to /home/yonelab/.pyenv/versions/3.8.6/lib/python3.8/site-packages/mediapipe/modules/objectron/object_detection_3d_sneakers.tflite
INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
```

Downloadしているパスが、3.8.6の方になっています。

これらのことから、pyenvで指定しているpythonが呼ばれていると推測されます。



## まとめ
自分の暫定的な考えです。間違っているかもしれません。その時は、追記します。
間違っていることがわかったら教えてていただけると幸いです。
【vscodeの設定 setting.json】長いソースをスクロールしている時に「今どこを見ているのか」わかるようにする

vscodeのsetting.jsonに以下を追加すると
長〜いソースコードをスクロールしているときにも
今どこを触っているのか、がわかるように
画面上部に関数名などをスティッキーしてくれる。

```
"editor.stickyScroll.enabled": true
```

何階層かの限界はあるみたいだけどとても便利なのでメモ。

---

最低限の設定にとどめる時の参考
```
{
  "workbench.colorTheme": "Default Dark+",
  "markdown-preview-github-styles.colorTheme": "light",
  "window.zoomLevel": 2,
  "editor.stickyScroll.enabled": true
}
```
VSCodeの共通設定は必要最低限にしておくと便利。
（各プロジェクトごとに設定は.vscode/settings.jsonに記載する）
IBM match 360を使って名寄せをやってみる 

　最近このツールを使って名寄せみたいなことができないかどうか聞かれて調べたので備忘録として書いておきます。
使ったツールは
　IBM match 360, https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.5.x?topic=services-match-360-watson
と言うツールでIBM Cloudにアカウントがあれば無料で試すことができます。
（ただしクレジットカードの登録がないアカウントは試せないようです）
ここでご存知の方はいいかと思いますがあえて名寄せとは何かと書いておくと　”複数のデータベースのなかから、氏名や住所、電話番号などの情報を手がかりにして、同一人物のデータがどこにあるかなどをまとめる作業のことをいいます。
例えば会社のウェブなどで簡単なアンケートを取りました。一方で自社の製品を使っている顧客のリストがあるとします。今回アンケートに答えてくれた人と既に顧客リストにある人をマッチングして集めたいな、検索したいな、と言う時に使っているようです。
やることは
1. IBM Cloudでサービスをオーダー
2. データを準備、登録
3. Match 360を設定してマッチング
-----------------------------

1. IBM Cloudでサービスをオーダー
IBM Cloudにアカウントがない場合は最初に登録を行います。登録はこちらから行います。
https://cloud.ibm.com/registration
次にポータル画面でMatch 360をオーダーすることになります。
カタログで"Match 360"を検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/516c242b-9e3d-988e-33a5-f3b687c12c5c.png)
現状無料のライトプランしかないですがこれでオーダーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/81123499-b544-51b0-5e43-85d7f58db708.png)
サービスができたら"Launch in Cloud Pak for Data"をクリックするとmatch 360が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/97f3e395-bc50-e7a7-c73b-992e31cdc822.png)
こちらがMatch360の画面です。



2. データを準備、登録
　今回作成したデータはこちらのサイトでダミーデータを作成しました。
https://testdata.userlocal.jp/
作成したデータをもとに幾つかの項目を削除した簡易データを作成しました。具体的には
（住所が都道府県名だけ、生年月日やクレジットカードなどの詳細情報なし）
dummy.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/971f58f7-5803-7070-6600-a89e89a176d9.png)
dummyx.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/f1e815f1-845e-6c77-ab69-1114e891ac95.png)

3. Match 360を設定してマッチング
 上記で作成したデータをMatch 360に入れてみましょう。
データのセットアップを選択して右側のメニューでcsvデータをアップロードしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/87543d9b-0127-b1bb-c2ba-e7d1dd1bc4b8.png)

データを入れたら資産プロパティーのマッチング、データのマッピング、データモデルの公開、データの公開をします。
手順はこちらのハンズオンを参考にするといいでしょう。
https://dataplatform.cloud.ibm.com/docs/content/wsj/mdm/end-to-end-tutorial.html

次にマッチングの設定をします。どの項目でマッチングするかを設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/00be7d46-1a6a-93a9-f6a6-d3c18a82382e.png)
これには少し時間がかかります。（でも500件のデータで1分内でした）
マッチングが終わったらデータ検索で検索します。例えば斉藤弘子さんで検索すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/1797331f-07e7-ef2d-bbce-d34724c2aa32.png)
dummy, dummyXの両方にデータがありました。
アンケートを答えてくれた斉藤さんは顧客データにあった斉藤さんと同一人物だとわかりました。
ARC151回答メモ


0.はじめに
　最近毎週レギュラーが開催されるようになり、みるみるランクが下がるように・・・。
　１問必解を目指しています。

1.A - Equal Hamming Distances
　久々に2時間フルに取り組みましたが、回答できませんでした。
　その後リベンジし、AC頂きました。

　回答の考え方
　　１）すべて０の文字列と比較した場合の
　　　　S列とT列それぞれのハミング数を取得
　　　１-１）SとTのハミング数が同じ→ALL0が正解
　　　１-２）SとTのハミング数を足すと奇数→解なし(-1)
　　　１-３）２へ
　　２）S列T列を右（添え字ｊ）からチェックしていく
　　　　回答文字列”Ans”の初期値はALL”0”
　　　２-１）S[j]==T[j]の時
　　　　Continue
　　　２-２）Sのハミング数が大きくかつ、S[j]が”1”の時
　　　　Ans[j]に1をセット
　　　　Sのハミング数から1を引き、Tのハミング数に1を足す
　　　２-３）Tのハミング数が大きい場合かつ、T[j]が1の時
　　　　Ans[j]に1をセット
　　　　Tのハミング数から1を引き、Sのハミング数に1を足す
　　　２-４）SとTのハミング数が同じ場合ループ終了
　　　　　　そうでない場合は、ｊ+1
　　３）Ansを連結して表示。

　上記を実装するも、本番の時には、１）の処理でハミング数を配列にして　
　セットしたりと迷走し、正しい答えが導き出せず。

　数日後、落ち着いて実装＆テストしたところすんなりクリアできました・・・。

　https://atcoder.jp/contests/arc151/submissions/35803815
実行可能ファイルのハッシュチェック

## ハッシュ値の出力

```
Get-FileHash ./*.exe | % {$_.Hash +" " + $_.Path } > a.txt
```

## ハッシュ値の検査

```
Import-Csv a.txt -Header Hash,Path -Delimiter " " | %{ $_.Path + ": " + ((Get-FileHash $_.Path).Hash -eq $_.Hash) }
```
Modeler 18.4の拡張ノードでエラーが発生しても、標準出力がメッセージに表示される

とても細かい機能改善なのですが、実はかなりうれしい機能なのでご紹介します。

Modeler 18.3までは以下のようなスクリプトの場合、「import aaa」でエラーが起きると「print("hello")」の出力を得ることができませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/75c8475a-aab7-8112-647e-a0b06f4447bf.png)

```python:エラーが起きる
print("hello")
import aaa
```

Modeler 18.3の結果では、print("hello")の出力がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/24a685a6-1fbe-522e-e91f-7b83b27c0752.png)

Modeler 18.4の結果では、print("hello")の出力があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0f8b8388-c62e-a067-d786-d6c1cdca52e1.png)

これによって、エラーが起きる前の変数の値などを標準出力にはいて、確認することが可能になりました。

* テスト環境
    * Modeler 18.4
    * Windows 11 64bit
セキュリティ ロール　設定手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/79c1b1b2-e8e9-de06-f655-ea9797221445.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/5921825b-3eb8-6f65-3247-c13140b578c7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/7df90c66-212a-bf89-47b0-6244047d0f1c.png)
フィールド セキュリティ　設定手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/430082d0-4746-9017-66c6-009a354aa4c2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/ab0d413a-6738-9f84-2d8e-4429f19ad4e0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/5c2b2d90-0cad-3150-4c8e-ddeed94fbe81.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/c2a14533-5a6b-0dc8-966d-8685c38464a0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/62679d9f-454b-7f70-774c-a40734069935.png)
plunkerでjwt その2


# 概要
plunkerでjwtを検証してみた。
jsrsasignを使ってみた。

# 検証したjwt
- 出所
wikiペディア

- 全体
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

- タイプ
HS256

- キー
secretkey

- ヘッダー
{
"alg": "HS256",
"typ": "JWT"
}

- ペイロード
{
"loggedInAs": "admin",
"iat": 1422779638
}

- シグニチャー
gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

# サンプルコード

```

var out = document.getElementById('out');

function run() {
  var sJWT = KJUR.jws.JWS.sign(null, '{"alg":"HS256","typ":"JWT"}', '{"loggedInAs":"admin","iat":1422779638}', {"utf8": "secretkey"});
  out.value = sJWT;

}

```

# 実行結果

```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
```

# 成果物


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


以上。
maya python select child joints

```python
def list_all_children(nodes):
    """Fast, but slow when nesting is very deep."""
    
    result = set()
    children = set(cmds.listRelatives(nodes, fullPath=True) or [])
    while children:
        result.update(children)
        children = set(cmds.listRelatives(children, fullPath=True) or []) - result
        
    return list(result)

sel = cmds.ls(sl=True)
children = list_all_children(sel[0])
cmds.select(children)
```
ESP32とESP32でのUDP通信

## はじめに
ESP32同士でUDP通信を行いたい。

### 実装
送信側のコンソールで, 入力したメッセージを受信側に表示する

・送信側
```udp_sender.py
import ubinascii as ub
from usocket import socket, AF_INET, SOCK_DGRAM

HOST = '192.168.100.213'
PORT = 8086
# ADDRESS = "127.0.0.1" # 自分に送信

s = socket(AF_INET, SOCK_DGRAM)
# ブロードキャストする場合は、ADDRESSを
# ブロードキャスト用に設定して、以下のコメントを外す
# s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

while True:
    msg = input('> ')
    # 送信
    s.sendto( ub.hexlify(msg), (HOST, PORT))
    print(f"done")

s.close()
```


・受信側
```udp_res.py
import ubinascii as ub
from usockBet import socket, AF_INET, SOCK_DGRAM

PORT = 8086

# ソケットを用意
s = socket(AF_INET, SOCK_DGRAM)
# バインドしておく
s.bind(('0.0.0.0', PORT))

while True:
    # 受信
    msg, address = s.recvfrom(1024)
    print(f"message: {ub.unhexlify(msg)}\nfrom: {address}")

s.close()
```

ポイント
1.microPythonを使っている場合, ライブラリ名の先頭に'u'が付くのを使うのを推奨されている
2.binary
Duh... SHA<u8> returns what?

`SHA<u64>`, let's for the purpose of this example say the `u64` is set as the integer `256`.
This hash function will always return a `hexadecimal` of `length 256 bits`.

Likewise for SHA512 and so on.

Rookie mistake...
First off, have a skim through
https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf

Furthermore, what is SHA-1 going to return? A single base16 bit? Have fun decoding that.

The key to understanding this, is to know that a hash is in binary and the hex string is just an encoding of that.
【Laravel】SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'　が出た時の解決方法

【Laravel】SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'　が出た時の解決方法


解決方法：
新しいデータベースuserを作ろう！

❶rootユーザーでmysqlに入る↓

ユーザー作成：
```MariaDB [(none)]> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';```

権限付与：
```MariaDB [(none)]> GRANT ALL ON *.* TO "sample_user"@"localhost";```

❷新しく作ったユーザーでmysqlに入る↓
データベース作成：
```CREATE DATABASE newdatabase;```

❸.envを修正

❹完了！
Markdown初心者の私がよく使っている記載方法(メモ)

Wiki的なものをMarkdownで作ってみようと思い書いてみたところ「便利なのか？」となってしまったのでメモです。
もっとなにか便利なものがあると思う・・・

# 「#」で見出し
「#」や「##」で見出しはよく作ります。
これは特に問題なく使えます。

# 「-」でリスト
これも問題なく、いつも「・」を使っているのを変えるだけで違和感なしです。

# 2連空白で改行
言い方はよく知りませんが、空白を2回打つことで改行されます。
他には空白行を入れるなどありますが、コード側が空白多くなってしまい見にくいという理由からこちらを採用しました。

# 「*」で太文字
「_」でも可能ですが、「*」を採用しました。理由はありませんが、気付いたら使っていたので。

# \<details>、\<summary>で開閉リスト
項目ごとに内容を分けたいのと、やたら長くなるのを防止するため採用しています。VSCodeと相性悪いのかコード側の可読性がよろしくないので不満です・・・


一旦今使っているのはこれぐらいです。
VSCodeからAtomに乗り換えを検討中です。
他にもおすすめエディタやMarkdownの書き方のコツあれば教えてください。
sendgrid DKIM,SPF設定とメールが届かない場合の対応

# メールが届かない理由を探る

sendgridにログイン
-> Suppressions
-> Blocks

をクリック

```
550-5.7.26 This message does not pass authentication checks (SPF and DKIM both
```

SPFとDKIMの両方が設定されてないよとのこと。
では設定しましょう。

# はじめに

SPFもDKIMもsendgridで指定されたCNAMEを設定するだけで、自動的に反映される


SendGridにログインし
->Settings
->Sender Authentication

を開きAuthenticate Your Domainをクリック

1.otherhost を選択し
which dns host に webサーバーのIPアドレスを入力

2.YES を選択
（HTNLメール等を利用した場合にsengridのサブドメインから独自ドメインに置き換えられて見栄えがよくなる。）

今回利用したいドメインを入力

hoge.com
(オプションはデフォルトのまま)

Install DNS Recordsで、すべてのCNAMEをコピペしていく
時間が経過していないとエラーが出る場合があるので、設定後何分か待ってから次に進む。

`OK`


# テスト

sendgridAPIを利用しメールを送信。
このとき、hoge@gmail.comへ直接メールを送信すること。

1.hoge@hoge.com に送信
2.hoge@gmail.com への転送

となっているとsoftfailになる。


送信完了したら

gmailからメッセージのソースを表示して

---
DKIM:	PASS（ドメイン: twikon.club）詳細xxx4553694-e1ff-xx38=gmail.com@em9689.twiko

---

てな感じの表記があればOK!
Linode のネットワーク使用量と消費について理解する 

# Linodeとは

Linodeについてはこちらを参照。

https://qiita.com/isss802/items/5313c7a6da1d9ed50a38


# Linodeのネットワーク使用量について

クラウドを利用するにあたり、インスタンス費用そのものは比較的予測しやすいですが、ネットワークの転送費用に関しては予測が難しいものです。


Linode はネットワーク転送費用の考え方を、シンプルかつ、予測がしやすいように考えられており、それが全体コストを分かりやすくしています。

Linodeでは無料のアウトバウンド転送量をインスタンス、オブジェクトストレージに含んでいます。

契約サービスで利用できるネットワーク転送量は契約内でプールとして使えるのも大きな特徴です。プールについては記事の後半で説明します。

Linodeのネットワーク使用量は、インバウンドとアウトバウンドのネットワーク転送に分類されます。

インバウンド転送量は無料となり、アウトバウンド転送量には通信料がかかります。

各インスタンスにはインスタンス費用内に無料のアウトバウンド転送量が割り振られており、この範囲内の転送量であれば追加費用がかかることはありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/5fdbfffd-e14e-9db3-c521-a2b41f5f6886.png)

オブジェクトストレージにも同様に無料のアウトバウンド転送量が含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/3b9ee1d4-384e-9dd2-13c6-ee02d05ac369.png)

詳細な金額については以下を参照ください。

https://www.linode.com/pricing/



# Linodeのネットワーク転送料がかかる箇所について

アウトバウンドの転送量がかかる箇所について、以下の構成図にまとめてみました。

LinodeではPrivate IP同士、VLAN内でやり取りされる通信トラフィックについてはアウトバウンドでも無料です。

アウトバウンドで課金対象となる部分は、Public IPが利用されているアウトバウンドの通信トラフィックとオブジェクトストレージからのアウトバウンド通信トラフィックです。

インスタンス同士でもPublic IPにて通信をやり取りする場合には、アウトバウンドの課金対象となります。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/8de242de-c66f-9a9b-0eaa-a6c33c541b21.png">

:::note warn
Object Storageへの通信は同一リージョン内でもPublic IPを利用するため、課金が発生します。
:::


詳細に関しては、以下の記事を参照ください。

https://qiita.com/isss802/items/20906f2bbf8c6a433d5a

https://www.linode.com/docs/guides/network-transfer/


# アカウント内での無料の通信トラフィック量の計算の仕方

インスタンスとオブジェクトストレージに付与されている無料のアウトバウンド転送量に対する課金は、各インスタンス毎に計算されるわけではありません。

各インスタンスとオブジェクトストレージに含まれる無料のアウトバウンド転送量はアカウント内でプールされて消費されます。

現在の消費量については、Linode Cloud Managerの画面下部「You have used 0.04% of your Monthly Network Transfer Pool.」から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/fc9aaf6d-a890-def8-0315-4d499766559e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/18b047e2-d436-5cfe-dcc9-96fdff31801d.png)

私の環境では、複数のインスタンスとObject Storageが存在するため、45TBの無料枠があり、大幅なトラフィック増加でもあまり心配せず運用しています。

# アウトバウンドのネットワーク転送量を監視する

上記のようにLinode Cloud Managerから確認ができますが、定期的に確認するのには手間がかかります。

Linodeでは、無料のアウトバウンドの転送量が80%、90%、100%消費された際に、アカウントのメールアドレスに自動的に通知を行います。

連絡先については以下を参照ください。

https://www.linode.com/docs/guides/accounts-and-passwords/#email-addresses-and-contact-information

また、Linode CLIを利用することにより、使用量をリアルタイムで監視に組み込むことも可能です。

```
linode-cli account transfer

┌───────┬──────┬──────────┐
│ quota │ used │ billable │
├───────┼──────┼──────────┤
│ 45545 │ 18   │ 0        │
└───────┴──────┴──────────┘
```

JSON形式のアウトプットも可能です。

```
linode-cli account transfer --json | jq

[
  {
    "used": 18,
    "quota": 45545,
    "billable": 0
  }
]
```

CLIのインストール方法については以下を参照ください。

https://qiita.com/isss802/items/0b1be79031ee16ced521

# まとめ

Linodeでは予測の難しいネットワークのコストをなるべく予測がしやすい価格モデルとなっています。

ぜひこの低コストで利用できるLinodeを活用し、様々なユースケースで利用してみてください。

## 関連記事

アカマイ・テクノロジーズ合同会社ではQiitaでLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai
DjangoでのToDo管理アプリ作成

【概要】
Webアプリの基礎となるCRUDを実装したToDo管理アプリを、Djangoを使って作成しました。
ローカル環境で誰でも動かすことができるので、ぜひいろいろ試してみてください。

【画面一覧】
・ToDo一覧画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919458/4cdb7dcd-9a4d-3a44-2587-3503443a8580.png)

・ToDo詳細画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919458/98452e4d-67b5-91df-35b6-45cd6b2dfa03.png)

・ToDo作成画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919458/b102f636-45b8-fc95-e315-cd310f1a8fe0.png)

・ToDo編集画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919458/876f65ba-45b1-5aa8-49dc-8b282f65f80f.png)

・ToDo削除画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919458/d12f4ff3-0c07-696d-361d-49e79cc65486.png)


【GitHub】
作成したプログラムのレポジトリはこちらになります。
(https://github.com/Kota0925/ToDo)


【ToDoアプリの実行方法】
・自分のPCにリポジトリを複製
1.こちら(https://www.ipentec.com/document/visual-studio-code-setup-git )を手順通り実行
(今回クローンするリポジトリのURLは「https://github.com/Kota0925/ToDo.git 」となります)

・VSコードでターミナル開き、以下のコマンドを入力
1.仮想環境の作成:
「ToDo」ディレクトリで「virtualenv env」を実行
2.仮想環境の実行(Windowsの場合):
「env\Scripts\activate」を実行
3.今回必要なモジュールのインストール:
「pip install -r requirements.txt」を実行
4:サーバーの起動
「src」ディレクトリで「python manage.py runserver」を実行

・ブラウザを開き、ToDoアプリを表示
1.URL「http://127.0.0.1:8000/todo/list/ 」にアクセス
2.ToDoアプリの一覧画面が表示されれば完了
【Docker】docker compose upしたときno configuration file provided: not foundの対処法【Git】

<h2>症状</h2>
Gitに上げたアプリをCloneして環境を再度構築しようとしたとき、下記のエラーが発生しました。
翻訳すると、「構成ファイルが提供されていません: 見つかりません」でした。
Dockercompose.ymlかDockerFileが見つからないと言っているようです。

```terminal:error
docker compose up
no configuration file provided: not found
```

```terminal:構成
Project
  -App
    -src
    -(略)
    -DockerFile
    -ComposeFile.yml
```

<h2>解決策</h2>
実行するディレクトリに、Dockeccompose.ymlやDockerFileがなかったため、見つからないと言われていました。
GitCloneした後に、そのディレクトリに入って実行することで、実行できました。

<h2>参考</h2>

https://ja.stackoverflow.com/questions/86475/docker-compose-up-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC-no-configuration-file-provided-not-found
ABEMA Growth Techはすべてが最高な件

# 1 きっかけ
機械学習エンジニアになりたい。
私はこの夢の実現のために参加したのがこのインターンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1493403/cdc384cc-372c-f1c0-8e1e-9001023cc3d2.png)
>ABEMA Growth Tech ONLINEでは、サイバーエージェントの人気サービス「ABEMA」に対し番組レコメンド機能を制作していただきます。
これまでよりも、さらに難易度がレベルアップしたABEMA Growth Techを実施します。
インターン前半はABEMAの視聴データを題材として、機械学習を用いた番組レコメンド機能を利用可能なAPIとして構築します。
バックエンドはABEMAの現場で実際に利用されているGoやKubernetes等を用いて実践レベルで実装していただきます。
また後半は、皆さんのアイデア力と実装力を用いて、実際にABEMAの機能改善をしていただき、その内容を社員に提案していただく予定です。
そして本インターンでは、全体を通じてエンジニアからの現場レベルでのフィードバックをもらうことで、飛躍的に成長できるチャンスとなっております。

私はこのインターンを通して自分の実力を試したいと思い、頑張っていきました。

# 2.感想
## 1.gcloudとk8sに触れられてよかった。
今まで触れられてこなかったので触れられてよかった。お金出してくれるのでもっとリソース使うべきだった。......
## 2.楽しすぎる
できないところがあったけどすごく楽しかった。もっと学んでいきたい。
## 3.mlのモデル改善
特徴量や時系列でどのようにモデルを改善していていくのか考えていきたい。

## 4. やっぱり機械学習、バックエンド開発が好き
機械学習のモデルやバックエンドの開発に携わることができました。技術に触れていくだけで世界が開けているような感覚、この技術で最高のプロダクトをユーザに届けたいと思いました。
# 6もっと思い出したら書いていくので更新していきます。
ほんとに楽しいので来年も開かれたら参加しましょう！！！
参加したメンバーともメンターの人とももっと話したかったチームでの作業もしたかった
【Laravel】「"storage/logs/laravel.log" could not be opened: failed to open stream: ...」が出た時の対処方法！

storageディレクトリ配下の権限を変更してあげることで、解決できます。
Laravelのプロジェクトのルートディレクトリに移動します。
移動したあと、storageディレクトリの権限を変更します。

```$ chmod -R 777 storage```
【Salesforce】Lightning Knowledgeの有効化について(Lightning Knowledge の設定とカスタマイズ)

# きっかけ

Trailheadの「[Lightning Knowledge の設定とカスタマイズ](https://trailhead.salesforce.com/ja/content/learn/modules/lightning-knowledge-setup-and-customization?trailmix_creator_id=naoyuki0725aizawa&trailmix_slug=challenges)」を進めていたときに、

![スクリーンショット 2022-10-20 11.35.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/a69521a5-2c50-fef3-d3e6-8fbdd57702e1.png)


Lightning Knowledgeが有効化されてない、、、

![スクリーンショット 2022-10-20 11.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/9a7b7ced-5a3f-3f49-f3a5-9d6f45349daa.png)

ナレッジユーザはちゃんとチェックついてるのに？？

以下のヘルプを参考にしても解決できませんでした、、、、

https://help.salesforce.com/s/articleView?id=sf.knowledge_settings.htm&type=5


# 解決方法

このプロジェクトを進めることで解決できました！！！

* [Salesforce ナレッジの設定](https://trailhead.salesforce.com/ja/content/learn/projects/set-up-salesforce-knowledge/configure-salesforce-knowledge?trailmix_creator_id=welcome4&trailmix_slug=certified-service-cloud-consultant-ja)

簡単にまとめると実行したのは以下の
1. プロファイル > システム管理者権限 の下で、Lightning Experience ユーザー を選択します。
1. クイック検索 ボックスに「ログインアクセスポリシー」と入力し、「ログインアクセスポリシー」を選択します。
1. 「管理者は任意のユーザーでログインできます」を有効にします。
1. クイック検索ボックスに「セッションの設定」と入力し、「セッションの設定」 を選択します。
1. Lightning Knowledge の設定フローを開く
1. 推奨設定の「すべて表示」をクリックして、「ナレッジの設定」タイルをクリックします。
1. [開始] をクリックします。
1. Lightning Knowledge の著者に自分自身を選択して完了。

（2、3、4は不要かもしれないです、、、、）

この流れでLightning Knowledgeを有効化できました！

# Trailのハンズオンの解決方法

![スクリーンショット 2022-10-20 14.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/06da3eef-cba9-faee-7a25-276a63a1cffa.png)

オブジェクトマネージャーで「Knowledge」と入力します（日本語設定でもオブジェクト名が英語なので注意！）

あとはハンズオンの手順に沿ってすすめると、、、

![スクリーンショット 2022-10-20 14.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/657bc0ba-4e05-e211-fbae-252ada02f748.png)

クリアになりました！



# 参考

以下のエラーだけどうしても解決できなかったので、新しい環境でやり直しました、、、
これの解決策は未だ模索中です。。。。

![スクリーンショット 2022-10-20 14.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/f7d79ee3-4f63-59a7-bf78-c35bad7f7ab0.png)
Google Cloud FunctionsでFizzBuzzを作成する

# はじめに
近年FaaSが流行しています。
僕も試してみたいと考えていたため、今回FizzBuzz判定APIを作ってみようと思います。

# 完成品
https://github.com/PenguinCabinet/FizzBuzz_Google_Cloud_Functions

# 環境構築
gcloud CLIを使用していますので、インストールしてください。

https://cloud.google.com/sdk/docs/install?hl=ja

念のため、その他のバージョン環境。
```
OS:Windows 11
言語処理系:Python 3.10.5

Google Cloud SDK 400.0.0
bq 2.0.75
core 2022.08.26
gcloud-crc32c 1.0.0
gsutil 5.12
```
# 関数を作成する
まずFizzBuzz判定用の関数をサクッと書いちゃいましょう。
```python 
def CheckFizzBuzz(request):
    data = request.args.to_dict()
    try:
        x = int(data.get('n'))
        if x%15==0:
            return "FizzBuzz"
        elif x%3==0:
            return "Fizz"
        elif x%5==0:
            return "Buzz"
        else:
            return str(x)
    except:
        return "ERROR:n is not number"
```
`request.args.to_dict()`でhttpのクエリパラメータを取得できるようです。
注意として、数字のまま返り値にするとエラーを吐くのでそこだけお気を付けください。(動的言語やっているとこういううっかりミスが)
# デプロイ
```python
gcloud functions deploy check-fizz-buzz --gen2 --region=asia-northeast1 --runtime=python39 --entry-point=CheckFizzBuzz --trigger-http --allow-unauthenticated
```
デフォルトだと認証が必要になるため、不特定多数からアクセスできるようにしたい場合`--allow-unauthenticated`をつけてデプロイします。
リポジトリだとMakefileでやっていますが、Google Cloud用のビルドランナーがあるのでそちらを使うべきだったかも…。
デプロイが完了すると、デプロイ先のURLが表示されます。

# テスト
デプロイ先のURLに書き換え、クエリパラメータをつけて叩いてください。
```
>curl https://check-fizz-buzz-xxxxxxxxxx-an.a.run.app/CheckFizzBuzz?n=15
FizzBuzz
```
できましたね！！

# 終わり
Google Cloud Functionを試すことができました。
Oracle SQL Developerで日付表示の書式を変更する

1.SQL Developerを起動する。
2.メニューから ツール > プリファレンス を選び、ダイアログを開く。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241536/038c0ce7-53a0-60ad-8aba-67b51fc84d5c.jpeg)

3.左の一覧から データベース > NLS を選ぶ。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241536/b188ada7-7565-af2a-3ce9-7792afe2bd61.jpeg)

4.右の一覧から日付書式(RR-MM-DD)を変更する。(YYYY/MM/DD HH24:MI:SS)

5.右下のOKボタンを押す。
お住まいの国では利用できないアイテムです

# 問題

開発中の出来事。

Google Play Consoleにアップした aab(apk)だと 問題なくアイテム購入出来るのに、
ローカルで作成したapkだと `お住まいの国では利用できないアイテムです` と表示され
購入することができない。

# 環境

Unity 2021.3.5
Unity - InAppPurchasing Version 4.5.0
Androidアプリ

※ Unityは関係ないと思われる

# 前提

* Google Play Consoleの クローズドテスト等に aabをアップしている
* 公開している
* テスター登録 → ダウンロードしたアプリで アイテム購入(課金)出来る
* その後 ローカルで作成した apkでは アイテム購入(課金)出来きない

# 解決方法

Google Play Console にて

* 製品版 - 国/地域 - 日本 を設定
* クローズドテスト - 国/地域 - 製品版と同期させる

これだけです。
GoogleDevelopConsoleのメール設定にもよりますが、自分の環境・タイミングでは  30分後くらいに「Your update is live」という同期完了的なメールが来て、無事 ローカル版(アップしてないapk)でも課金できるようになりました。
[Tips] capistranoの設定ファイルにRubocopを適用する

Rubocopではデフォルトで`rb`や`rake`などrubyに関する拡張子に対してフォーマットを行うようになっています。
基本的には[初期設定](https://github.com/rubocop/rubocop/blob/master/config/default.yml)で事足りるのですが、たまに別拡張子で書かれたRubyスクリプトにもRubocopを適用したくなることがあります。
今回自分の場合はcapistranoを使ったスクリプトが`cap`という拡張子で記述されており、そちらにRubocopを適用したかったのです。
その場合、どうするんだろうと少し調べたら下記の記述を`.rubocop.yml`書き足すだけで簡単に`cap`が拡張子のファイルに対してRubocopを動作させることができました。

```diff_yaml:.rubocop.yml
AllCops:
  Include:
    - '**/*.rb'
    - '**/*.builder'
    - '**/*.god'
    - '**/*.rake'
    - '**/*.ru'
    - '**/*.ruby'
    - '**/*.spec'
    - '**/Brewfile'
    - '**/Gemfile'
    - '**/Guardfile'
    - lib/capistrano/**/*.cap
+   - '**/*.cap'
```

特定のファイルはRubocopの対象から除外する、という記述はよく行いますが逆にこれは含めるという記述に関してはあまり書かないのでできるのか不安でした。しかし流石Rubocop、きちんと用意されていて助かります。
【Salesforce】代理ログイン使用後、ログアウトせずに元のログインユーザに戻るよう設定する

 **「代理ログイン」** とは、システム管理者が別のユーザになりきってオペレーションが確認できる便利な機能です。
そんな便利な代理ログインですが、確認作業を終えてログアウトを押すと再度ログインを求められます。これが結構面倒だという声を聞きます。
これは、デフォルトでログアウト後に強制的に再ログインするように設定されているからです。
今回はそんな不便を解消する設定をご紹介します。

#### ご紹介する内容の概要は以下の通りです。
1\. 代理ログインからログアウトすると再度ログインが求められるシナリオ
2\. セッション設定を変更し再ログイン不要にする設定方法

# 1. 代理ログインからログアウトすると再度ログインが求められるシナリオ
代理ログインから元のログインユーザに戻ろうとする場合、以下のイメージの箇所からログアウトします。

![loginout_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920237/c40457f5-0532-390d-1e75-27641152ff37.png)

そうすると、Salesforceのログイン画面が表示され再度ログインを促されます。
これが結構面倒なんです。
![sf_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920237/81d5cb94-4429-9063-0c1a-ce04df5eee86.png)

 **そんな面倒なことをせずとも、元のログインユーザに戻る設定があるので、ご紹介します!!!** 

# 2. セッション設定を変更し再ログイン不要にする設定方法
設定＞セッション設定 を開いて画面にある「ユーザとしてログインしてから再ログインを強制する」をOFFにします。
![relogin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920237/15950671-c34b-901c-19fe-356ab833781d.png)
 **保存ボタンを忘れずに！**
保存ができたら、再度代理ログインしてログアウトしてみてください。代理ログイン前のユーザに戻り作業が再開できます。

投稿は以上です。最後まで読んでいただきありがとうございました。
Fortranのコードをコンパイルできるようにした方法 (おまけ: JupyterLab)

fortranのコードをコンパイルしようとしたら、いろんなエラーがたくさん出てきたので、備忘録として記す。

そしてエラーに対処してたらなぜかターミナルベースのJupyterLabで図の保存ができなくなった(これまたたくさんのエラーを吐いた)ので、デスクトップアプリをダウンロードしてみた。
JupyterLabについてはおまけとして記す。

# 開発元を検証できないため開けない？

まず出てきたのは「"gfortran"は、開発元を検証できないため開けません」というメッセージ。
[こちら](http://ekbo.blogspot.com/2020/01/jagurs-on-catalina-with-hpc-compiler.html)を参考に対処する。

「システム環境設定」の「セキュリティとプライバシー」から手動で許可していく。
""の中身を変えてたくさん出てきたのでちまちまやる。

# コンパイルエラー

~~~
ld: library not found for -lSystem
collect2: error: ld returned 1 exit status
~~~

[こちら](https://qiita.com/Sooh31/items/b0c1592244ff320a1d73)を参考に対処する。

~~~
% brew upgrade gcc
~~~

結構時間がかかる。しかし・・・

~~~
Error: Permission denied @ apply2files - /usr/local/share/ghostscript/9.10/Resource/Font/logo10.pfb
~~~

残念。

# brew doctorで原因を探る

今度は[こちら](https://qiita.com/K-eno/items/b2acde98c8f45b9e51e3)を参考に対処する。

~~~
% brew doctor
Warning: Your Command Line Tools are too outdated.

Warning: The following directories do not exist:
/usr/local/sbin

Warning: Broken symlinks were found. Remove them with `brew cleanup`:
~~~

指示通りやってみる。

~~~
% sudo rm -rf /Library/Developer/CommandLineTools
% sudo xcode-select --install

% sudo mkdir -p /usr/local/sbin
% sudo chown -R [ユーザ名] /usr/local/sbin

% brew cleanup
Error: Permission denied @ apply2files - /usr/local/share/ghostscript/9.10/Resource/Font/logo10.pfb
~~~

同じエラーが出てきた(ここまで[こちら](https://qiita.com/K-eno/items/b2acde98c8f45b9e51e3)と同じ経過)。

~~~
% sudo chown -R [ユーザ名] /usr/local/share/ghostscript/9.10/Resource/Font/
...
~~~

同じようなエラーが出てくるたびにsudo chownをしていく。

~~~
% brew cleanup
~~~

ついに成功。

# gccのupdrageをしたい

~~~
% brew upgrade gcc
Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)!
Please create a new installation in /opt/homebrew using one of the
"Alternative Installs" from:
  https://docs.brew.sh/Installation
You can migrate your previously installed formula list with:
  brew bundle dump
~~~

指示通り[こちら](https://docs.brew.sh/Installation)を参考に対処する。

~~~
% sudo mkdir /opt/homebrew
% sudo chown -R [ユーザ名] /opt/homebrew
% git clone https://github.com/Homebrew/brew
% eval "$(brew shellenv)" 
% brew update --force --quiet
% chmod -R go-w "$(brew --prefix)/share/zsh"
% brew bundle dump
~~~

なんかうまくいかないので、[こちら](https://shiro-changelife.com/error-cannot-install-in-homebrew/)を参考にする。

~~~
% echo $SHELL
/bin/zsh
% emacs ~/.zshrc
~~~

```diff:~/.zshrc
+ export PATH="/opt/homebrew/bin:$PATH"
```

~~~
% source ~/.zshrc
~~~

ちなみに/opt/homebrew/brew/bin/のようになっていたので、brew下のファイルとフォルダをhomebrew下に移動した。

~~~
% brew upgrade gcc
Error: gcc not installed

% brew install gcc
~~~

できた！

# fortranのコンパイル

古い.oファイルを全部消して、コンパイルし直したら成功した！

# おまけ: JupyterLabのデスクトップアプリ

その後ターミナルベースのJupyterLabでsavefigをするとたくさんのエラーを吐くようになった。
少し調べてみるとJupyterLabのデスクトップアプリがあるらしい。
[こちら](https://zenn.dev/ochamikan/articles/b265f50f77dd8b)を参考に、[公式サイト](https://github.com/jupyterlab/jupyterlab-desktop)のDownloadからmacOS Installerをインストールする。
とても簡単にデスクトップアプリが使えるようになり、しかもエラーを吐かなくなった。
Excelでカーソル位置にハイライトをかける

ちょっと面白い動きなのと、事務作業に便利なので書いてみます。
セルを移動すると、行・列にハイライトができるマクロです。

↓仕上がりイメージはこんな感じです。
![Excel1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/846f21a4-3672-7991-2856-f7054c57beb7.jpeg)

毎回手で張り付けるマクロ箇所と、面倒な設定部分をアドインに組み込んでます。

## 条件付き書式の設定を自動化してしまう
アドインに以下のプログラムを貼り付けしてください。
   
    Sub 選択したセルのハイライト()

        Dim rngCellArea As Range
        Dim frmSetting As FormatCondition
    
        Set rngCellArea = Range("A1:ZZ50000")
    
        Set frmSetting = rngCellArea.FormatConditions.Add(Type:=xlExpression, Formula1:="=OR(CELL(""row"")=ROW(), CELL(""col"")=COLUMN())")
        With Selection.FormatConditions(1).Interior
            .Pattern = xlGray8
            .PatternThemeColor = xlThemeColorDark1
            .ColorIndex = xlAutomatic
            .PatternTintAndShade = -0.249946592608417
        End With
        Selection.FormatConditions(1).StopIfTrue = False
    
    End Sub

withとend withの中身をカスタマイズして、使いやすいデザインにしてください。
マクロの記録でお好みの設定を書き出したものを、入れ込んでしまっても大丈夫です。
内容の説明はそんなに難しいものでないし、覚えるほどのものでもないので省略します。

## VBAのWorkbookモジュールに書き込む
![Excel2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/c77ad016-f222-397d-f59f-0f1663b90b97.jpeg)
使用するブックの「ThisWorkbook」モジュールに以下のプログラムを張り付けてください。
カーソル移動したらアクションしてねーって内容です。

    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        ActiveSheet.Calculate
    End Sub

注意点：
Workbookモジュールへの貼り付けはブック毎に行う必要があります。
また、ブック内にマクロを紐づけるので、マクロ有効にして保存しないと動きません。

シートを増やすごとに、最初に書き込んだアドインを実行するだけで、カーソルが移動するようになります。
条件付き書式とシートのマクロをばらすことで、すでに色付けされているセルの設定リセットを回避できます。

遊び程度の簡単なものでごめんなさい。。。
(Neo)vimの標準コマンドの引数に変数を渡したかった

# 問題

以下の `init.vim` のように、変数を定義した場合でも、そのまま記述してしまうと、vimでデフォルトで定義されているコマンドに展開されず、意図した動作にならない

(せめて `echo` も同じ動きにしてくれれば…)

## init.vim

```init.vim
let s:hoge_txt_file_name = "hogehoge.txt"
command! ShowHoge echo s:hoge_txt_file_name
command! ReadHoge e s:hoge_txt_file_name
```

## 結果

そのまま引っ張ってきたわけではないので、 (特にエラーメッセージについては) 一言一句正しい物ではないが、おおむねこのような結果になる

```vimscript
:ShowHoge
> hogehoge.txt
:ReadHoge
> s:hoge_txt_file_name は開けません
```

# 解決方法

vimのコマンドの引数に変数を使用したい場合は `execute` コマンドの引数として、文字列で実行したいコマンドを渡してやれば良い

```init.vim
let s:hoge_txt_file_name = "hogehoge.txt"
" echoは…まぁこのままでもいいです…動くし…
command! ShowHoge echo s:hoge_txt_file_name
" こっちは execute コマンドの引数として、文字列展開&結合した結果を渡すことで、解決可能です
command! ReadHoge execute "e " . s:hoge_txt_file_name
```
QiitaShortShort Proto & Concept 【星新一先生へのオマージュ】(by Slack翻訳のKiara)

むかし、むかし、あるところに


---
星新一先生。尊敬申し上げます

![Screen Shot 2022-10-20 at 13.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/f940ec37-31f6-6e82-8c1f-0df91e1b8cd2.png)

---

QiitaShortShort

- problem
- our solution
- roadmap
- passion for open source

---

みなさんのフィードバック募集
(typeform URL予定)
弱弱弱to弱弱to弱解の法則 (aka イテレーション試行回数至上主義) (QiitaShortShort by Slack翻訳Kiara)

むかしむかし、あるところに。。。


---
弱解はいいよなあ。。
![Screen Shot 2022-10-20 at 13.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/0f453b39-7be6-39ba-f703-f87830618589.png)

---

- the power of weak solution
- reinmann hypo 
    - weaksolution : Y-axis(=imaginary number) +30T, x-axis(=real number) = 0.5 - OK
    - reimann hypo : if Y-axis +- infinity is proven = true
    - this weaksolution is used in physics

- mathematical optimization : cornell U optimization wiki
https://optimization.cbe.cornell.edu/index.php?title=Generalized_Benders_decomposition_(GBD)

![Screen Shot 2022-10-25 at 20.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/7be2679b-abf4-22f2-4403-04bc861de089.png)

- 

つづく(10/25完成予定)
テキストフィールド分析 (Text Field Analysis)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
テキストフィールド解析は、文字データを調べ、そのデータが数値型、日付、時刻、タイムスタンプ、または文字データとしてデータベースに格納できるかどうかを判断します。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::


# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。

# 実行方法
## SQLから実行する場合の例
```SQL
CALL td_analyze (
  'textfieldanalyzer',                     /* 分析手法　*/
  '
  database        = QID;                   /* データベース名 */
  tablename       = Superstore;            /* テーブル名 */
  columns         = Category,Sub_Category; /* カラムリスト */
  outputdatabase  = QID;                   /* 出力データベース名 */
  outputtablename = out_table;             /* 出力テーブル名 */
  '
);
```
### 結果テーブル1 (データの組み合わせパターン)
```SQL:out_table
select * from out_table sample 10;
```
#### 出力結果
|Category|Sub_Category|
|:-|:-|
|Office Supplies|Paper|
|Technology|Accessories|
|Technology|Accessories|
|Furniture|Furnishings|
|Office Supplies|Envelopes|
|Office Supplies|Binders|
|Office Supplies|Paper|
|Furniture|Furnishings|
|Office Supplies|Paper|
|Office Supplies|Binders|

#### 出力結果の説明
出力結果は指定されたカラム値が格納される

### 結果テーブル2 (分析結果レポート)
```SQL:out_table_rpt
select * from out_table_rpt;
```
#### 出力結果
|Column Name|Initial Database Type|Min Max Type|Sample Type|Numeric Test Type|Translatable To Latin|Total Unicode Count|
|:-|:-|:-|:-|:-|:-|:-|
|Category|VARCHAR(128) CHARACTER SET UNICODE|VARCHAR(15) CHARACTER SET UNICODE|VARCHAR(15) CHARACTER SET UNICODE|VARCHAR(15) CHARACTER SET UNICODE|NA|NA|
|Sub_Category|VARCHAR(128) CHARACTER SET UNICODE|VARCHAR(11) CHARACTER SET UNICODE|VARCHAR(11) CHARACTER SET UNICODE|VARCHAR(11) CHARACTER SET UNICODE|NA|NA|

#### 出力結果の説明
|カラム名|データタイプ|説明|
|:-|:-|:-|
|Column Name|VARCHAR(128)|カラム名|
|Initial Database Type|VARCHAR(128)|元データタイプ|
|Min Max Type|VARCHAR(128)|最小/最大値の推定データタイプ|
|Sample Type|VARCHAR(128)|サンプル値の推定データタイプ|
|Numeric Test Type|VARCHAR(128)|数値型の推定データタイプ|
|Translatable To Latin|VARCHAR(20)|LAIN文字に変換可能な文字数|
|Total Unicode Count|VARCHAR(20)|UNICODE文字に変換可能な文字数|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
An error occurred.画面が出た時の対処方法

![WechatIMG11835.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520242/b101abc2-b366-cee4-f6d1-4e60fad7d2bd.jpeg)

An error occurred.画面が出たら、
```nginx -t```
で確認しましょう！！
aws lambda numpy importエラー

aws lambdaでDBにinsertする処理を作成していたのですが、その際pandasが必要でimportしたところ、

```
Function Logs
START RequestId: 00d85ae0-ce8e-4472-91f5-413f21e3bea3 Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': Unable to import required dependencies:
numpy: 

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.9 from "/var/lang/bin/python3.9"
  * The NumPy version is: "1.23.4"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: No module named 'numpy.core._multiarray_umath'

Traceback (most recent call last):END RequestId: 00d85ae0-ce8e-4472-91f5-413f21e3bea3
REPORT RequestId: 00d85ae0-ce8e-4472-91f5-413f21e3bea3	Duration: 1.81 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 37 MB	Init Duration: 118.39 ms
```
このようなエラーが出ました。

結論以下の記事にある内容を実行すれば解決すると思います。
https://pomblue.hatenablog.com/entry/2021/06/08/230146
自分はpython3.9だったので3.9のdocker-imageをpullしました。
```
docker pull amazon/aws-sam-cli-build-image-python3.9
docker run -it -v $(pwd):/var/task amazon/aws-sam-cli-build-image-python3.9:latest
pip install pandas -t ./python
zip -r python.zip ./python
```

おそらくこの問題に直面してる人はレイヤーなどの使い方は分かってると思うのでその辺は割愛します。(調べればすぐ出てきますし。)
自分は上記の記事を見つけるまでとても時間を要したので、少しでも多く同じ問題に直面してる人に届けばいいなと思います。(海外の人とか誰一人として解決できてなかった笑)
今更ながらのJQM


2021年10月7日でjQueryMobileがdeprecated(非推奨)になりましたが、一部のシステムでまだ使用しているため、つまづいたところ書こうと思います。

https://openjsf.org/blog/2021/10/07/deprecation-of-jquery-mobile/

## つまづいたところ
その1\. headタグ内のscriptタグが読み込まれない件
その2\. アンカーリンクがうまく遷移できない件

# その1\. headタグ内のscriptタグが読み込まれない件
### 問題点
通常、headタグにscriptタグを入れると思うのですが
画面遷移した時にどうしてもCSSが当たらない・・。

### 結果
調べたところ、下記に当たりました。

https://weback.net/jqm/2227/

`Ajaxを使うと、ヘッダやフッタなど変更の必要のないものはそのまま残し、書き換えが必要な部分だけを再描画します。`
そうなのか、、 :scream::scream::sweat_drops:

ということで、今回は、<b>bodyタグにscriptタグを埋める</b>こととしました。

# その2\. アンカーリンクがうまく遷移できない件
### 問題点
遷移先ページのidに飛ばしたいのに、飛ばない・・・。

### 結果
調べたところ、下記に当たりました。

https://www.marukin-ad.co.jp/marulog/?p=3232

なるほど、、、 :hushed::hushed::bulb:

ということで今回は下記採用しました。

```
$(function () {
    var headH = $("header").outerHeight();
    var animeSpeed = 500;
    var urlHash = location.hash; //URLのハッシュタグを取得
    if (urlHash) { //ハッシュタグが有る場合
        $("body,html").scrollTop(0);
        setTimeout(function () { //無くてもいいが有ると動作が安定する
            var target = $(urlHash);
            var position = target.offset().top - headH;
            $("body,html").stop().animate({
                scrollTop: position
            }, animeSpeed);
        }, 0);
    }
});
```

## 感想
ずっと他に原因があるのかと試行錯誤していたのですが
まさかJQMがそんな仕様になっているとは・・。

勉強になりました :bow_tone1: 

今回は簡単な原因と結果の記述になりましたが、備忘のために投稿しました。
メモ：Microsoft CBL Mariner イメージで Non-root のユーザとグループを作成する方法

Microsoft [CBL-Mariner](https://microsoft.github.io/CBL-Mariner/docs/)はマイクロソフトが[オープンソースで開発](https://github.com/microsoft/CBL-Mariner/blob/2.0/toolkit/README.md)している Linux ディストリビューションです。このイメージを利用する事で軽量サイズでセキュアなコンテナ・イメージを作成する事ができます。

Mariner のイメージは　root 以外のユーザで稼働させるためには、デフォルトで用意されている `nobody` を利用する事ができます。しかし基本的に nobody は、[こちらに記載](https://wiki.ubuntu.com/nobody)されるように NFS 用として利用するのが好ましいため、別のアカウントを作成して利用するのが推奨されています。

しかし、CBL-Mariner　のイメージは、デフォルトで `useradd` や `groupadd` のコマンドが含まれていないため、そのままではユーザやグループを新規に追加する事ができません。

そこで、本エントリでは新規ユーザとグループの追加方法を紹介します。

具体的には、下記の Dockerfile に記載しているように、`tdnf` と言う Yum と同様の RPM パッケージ管理コマンドを利用して `shadow-utils` を追加します。これにより /usr/sbin に `useradd` や `groupadd` のコマンドが追加されるます。これらのコマンドを利用して別環境 (`Stage 1`) で `/etc/passwd` と `/etc/group` を作成し、作成したファイルだけを、実際の動作環境にコピーします。

これにより、UID=101, GID=101 の `javausers` と言うアカウントでプロセスを起動できるようになります。

```Dockerfile
##################################################################
# Stage 1: Create User and Group
##################################################################
FROM mcr.microsoft.com/cbl-mariner/base/core:2.0 AS CREATE-DEPENDS-FILES

RUN mkdir /staging \
    && mkdir /staging/etc \
    && tdnf install -y  --releasever=2.0 shadow-utils \
    && groupadd --system -g 101 java-app \
    && useradd -u 101 -g java-app --shell /bin/false --home-dir /dev/null --system javausers \
    && tdnf clean all \
   # Copy user/group info to staging
   && cp /etc/passwd /staging/etc/passwd \
   && cp /etc/group /staging/etc/group

##################################################################
# Stage 2: Create Production Image
##################################################################
FROM mcr.microsoft.com/openjdk/jdk:17-distroless

COPY --from=CREATE-DEPENDS-FILES /staging/ / 
USER javausers
WORKDIR /app
ENV LANG='ja_JP.UTF-8' LANGUAGE='ja_JP:ja' LC_ALL='ja_JP.UTF-8'
ENV TZ='Asia/Tokyo'
ENV JAVA_HOME=/app

COPY ./target/hello-sample-0.0.1-SNAPSHOT.jar app.jar

ENTRYPOINT ["java","-Xmx1g","-XX:+UseParallelGC","-XX:MaxRAMPercentage=75","-jar","/app/app.jar"]
EXPOSE 8080 
```
gitで、とあるブランチ内のファイルを、別のブランチに持っていく

```sh
# In source branch...
git stash
git checkout destination_branch

# In destination branch...
git checkout stash@{0} folder/file.txt
git add folder/file.txt
git commit -m '🏃Sync folder/file.txt with destination_branch' || echo "No changes in folder/file.txt"
git push
git checkout source_branch

# Back in source branch...
git stash pop
```
ansible・ansible-playbookコマンドについて

●Ansible
Red Hat社が開発しているオープンソースの構成管理ツール。ソースコードはPython。
ChefやPuppetとは違い、エージェントレスの構成管理ツール。管理対象の機器にエージェントは必要なく、Ansibleを実行する環境からSSHで接続して直接作業を行う。
Ansibleは、実行する環境から設定を行う「プッシュ型」の構成管理ツール。対してChefやPuppetは、設定される側が情報を自ら取得して反映する「プル型」。
Ansibleには、構成管理の他にもアプリケーションの配置を行うデプロイや、複数のシステムの設定を自動化するオーケストレーションの機能がある。

Ansibleのデフォルトの設定ファイルは「/etc/ansible/ansible.cfg」

■Ansibleを構成する要素
・インベントリ（Inventory）
管理対象ノード（Managed nodes）を記述するファイル。デフォルトのインベントリは「/etc/ansible/hosts」。

・モジュール
タスク（実行したい処理の単位）で実行する処理の本体。タスクプラグインやライブラリプラグインとも。
コマンドラインから、もしくはプレイブック（タスクの集合）のタスクで実行。
VMwareの仮想マシンやDockerのコンテナを作成・管理できるモジュールや、CiscoやJuniperなど主要なネットワーク機器の情報を収集・設定できるモジュールも多数用意。

・プレイブック（Playbook）
複数のタスクをPlaybookというファイルにYAML（構造化データの形式）で記述。


●ansibleコマンド
1つのモジュール（タスクで実行する処理の本体）を指定して実行するアドホック（その場限りの）コマンド。

●ansible-playbookコマンド
複数のタスクを記述したファイルであるプレイブック（Playbook）を実行するコマンド。複数の管理対象ノードに一度に多くのタスクを実行できる。

ansibleコマンドとansible-playbookコマンドの書式、主なオプション

■ansible 管理対象ノード　オプション
■ansible-playbook プレイブック　オプション

共通オプション
・-i|—inventory　インベントリの指定
・-u|—user SSSH接続するリモートユーザの指定
・-k|—ask-pass　SSHパスワードを聞く
・-b|—become　権限昇格(sudoなど)してタスクを実行
・-K|—ask-become-pass 権限昇格用のパスワードを聞く
・-C|—check　チェックモード(DryRun)で実行

ansibleのオプション
・-m|—module-name モジュールの指定
・-a|—args　モジュールに対する引数の指定

ansible-playbookのオプション
—syntax-check　playbookの構文チェックのみ実行

※プレイブックの書式
・「- 」でリストを開始し、スペースによるインデント（字下げ）でリスト中のメンバーを揃える。
・各設定は「キー: 値」の形式で記述。

●Ansibleのコマンド実行時には以下の順序で設定オプションが検索され、最初に検出されたものが使用される。
1. 環境変数 ANSIBLE_CONFIG
2. カレントディレクトリの「ansible.cfg」
3. ホームディレクトリの「ansible.cfg」または「.ansible.cfg」
4. 「/etc/ansible/ansible.cfg」
ubuntu 22.04環境にnginx + php-fpmでLaravelアプリケーションを構築

# 概要

サーバにインストールしたUbuntu 22.04環境で本番向けのLaravelアプリケーションを動かします。

nginxはhttpのウェブサーバで、php-fpmとはPHPのCGI（ウェブサーバでスクリプトを実行して、動的コンテンツを生成する仕組み）です。
今回はnginxをウェブサーバとして動かして、php-fpmと連携させることでLaravelのアプリケーションが動作するようにしていきます。

今回は、dockerなどのコンテナは使用せずに、ubuntu上に直接必要なソフトウェアをインストールしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/b1646470-3bd5-9fda-6215-1577ddfba5bc.png)


# 必要なパッケージのインストール

## nginxのインストール

```bash
$ sudo apt update
$ sudo apt install nginx
```

## PHPのインストール

```bash
$ sudo apt update
$ sudo apt install php
```

PHPはデフォルトだと、8.1のバージョンがインストールされます。

```bash
$ php --version
PHP 8.1.2 (cli) (built: Aug  8 2022 07:28:23) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies
```

## PHP-fpmのインストール

```bash
$ sudo apt install php-fpm
```

## composerのインストール

Laravelアプリの構築に必要になります。

```bash
$ curl -sS https://getcomposer.org/installer | php
$ mv ./composer.phar /usr/local/bin/composer
$ composer --version
Composer version 2.4.3 2022-10-14 16:56:41
```

## nodejsのインストール

```bash
$ sudo apt install nodejs npm
$ node --version
v12.22.9
```

# 設定

## nginxとphp-fpmの連携の設定

default.confを修正する

```bash
$ sudo vim /etc/nginx/sites-available/default
```

```config
server {
        listen 80;
        root /app/public;

        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-Content-Type-Options "nosniff";

        index index.php;

        charset utf-8;

        location / {
                try_files $uri $uri/ /index.php$query_string;
        }

        location = /favicon.ico {
                access_log off;
                log_not_found off;
        }

        location = /robots.txt {
                access_log off;
                log_not_found off;
        }

        error_page 404 /index.php;

        location ~ \.php$ {
                fastcgi_pass unix:/run/php/php8.1-fpm.sock;;
                fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
                include fastcgi_params;
        }

        location ~ /\.(?!well-known).* {
                deny all;
        }

}
```

設定変更後はnginxを再起動する

```bash
$ sudo systemctl restart nginx
```

## Laravelアプリを配置する

何らかの方法でサーバにソースを配置してプロジェクトに移動する。

PHPの必要なパッケージをインストール

```bash
$ sudo apt install php-dom php-curl php-mbstring
```

unzipがないとワーニングが出るのでインストール

```bash
$ sudo apt install unzip
```

composerで必要なパッケージをインストール

```bash
$ composer update
```

## viewをビルドする

```bash
$ npm install
$ npm run prod
```

## Laravelのアプリケーションの構築

ドキュメントルートにLaravelのプロジェクトを配置する。
今回の場合は `/app`

```bash
$ sudo mv <prodject> /app
$ cd /app
```

本番用の .envを生成する

```bash
$ sudo cp .env.example .env.prod
$ sudo php artisan key:generate
```

キャッシュを生成する

```bash
$ sudo php artisan config:cache --env=prod
$ sudo php artisan route:cache --env=prod
$ sudo php artisan view:cache --env=prod
```

コピーしたenvファイルを環境に合わせて修正する。

ストレージにnginxのユーザ（www-data）でアクセスできるようにする。

```bash
$ sudo chown www-data:www-data /app
```

# おわり

ユーザの権限など細かいところは端折ってますが、とりあえずここまでやるとnginxとphp-fpmを使ってLaravelのアプリケーションを動かせるようになります。
【React】コンポーネントでkeyを付ける

## keyの役割
keyはコンポーネントの識別に利用される

先頭に要素を追加するときの場合を見てみる
***Japan,America,Chinaのリストがあり、先頭にKoreaを追加する***

* keyがない場合
![keyなし.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/456f2f67-40e9-0212-f507-c9ae8109b9d8.png)

左のリストと右のリストを比較した際、keyがないとすべての要素を変更しなければならなくなってしまう。

* keyがある場合
![keyあり.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/43c45fd6-a582-0847-0823-cee62dc3b234.png)

JapanにJP,AmericaにUS,ChinaにCN,KoreaにKRを持たせた。
そうすると、keyが一致しているところは変更を加えずに、先頭にKoreaを追加することができる。つまり、変更するところはKoreaだけで済む。

## keyにはインデックスを利用しない
keyにインデックスを割り当てるのは良くないことらしい。
Japanに0,Americaに1,Chinaに2,Koreaに3

新たに要素を追加した時、(例えばThai)その要素のkeyが0になってしまう。
つまり、Japan,Thaiともに0がkeyに割り当てられることになる。

詳しくはこちらから
参考：https://wkamuy.hatenablog.com/entry/2021/02/11/094956#%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92Key%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E5%95%8F%E9%A1%8C
テスト駆動開発(TDD)って何?

## はじめに
実務においてテスト駆動開発でシステム設計を行うことがなかったので、学習の一環としてまとめます。
調べる前は、「テストする前にテストコードを書くくらい」といった印象。

## テスト駆動開発とは?

テスト駆動開発（Test-Driven Development）の略称としてTDDと呼ばれています。
テストファーストの思考に基づく開発手法の一つで、ウォータフォールでよくある「設計→実装→テスト」のプロセスではなく、「テスト→実装→リファクタリング」
といった流れを何度も繰り返ししてプロダクトを成長させていくような開発手法です。

テスト駆動開発は、「レッド」「グリーン」「リファクタリング」のステップで構成されています。

>【レッド】実装した機能の要件をもとに失敗するテストコードを書く

テスト駆動開発では「必ず失敗するコードを書く」、つまり、実装したい機能を実現するコードが一切書かれていない場合でも、
その機能のテストコードから書くことが基本になります。
テストツールを使用するとテストが失敗して赤色でエラーが出るためのこの工程をレッドと呼びます。
このステップで、実装したい機能の要件を粒度に分けて、リストアップします。

>【グリーン】どんな方法でも良いので、テストを通るプログラムを作る

テストコードを書いた後に、機能実装を行います。
ここでのポイントは、完璧なコードではなくテスト条件をクリアさせるだけの「最低限」のコードを書くということです。
レッドとグリーンの工程は、リファクタリングの前に数回繰り返すこともあります。

>【リファクタリング】テストが成功する状態を維持しつつ簡潔・明快なコードにする

テストを全て成功させた後に、リファクタリングを行なっていきます。
書いたコードの中で重複しいてるものや不必要なものを削ぎ落として洗練させたものにします。
プログラムの規模が増えた後にリファクタリングを行うと修正ん負担が増えるためグリーンのステップを達成したら、その都度リファクタリングを行うことが理想的です。

また、下記でメリットとデメリットについて挙げさせて頂きます。

### メリット
- 後工程へバグを持ち越しにくい
- システム要件をより深く理解できる
- 開発者が安心してコーディングでき、心理的負担がある
### デメリット
- 仕様が変わるたびにテストコードを書き換える必要が出てくるため、メンテナンスが大変
- 上記により開発時間が膨らんでしまう。特に開発初期段階での負担が大きくなる


## 終わりに
各言語・フレームワークやAWSについての記事は多くありましたが、一つの設計についての記事はあまりなく
今回は自己学習も含めまとめさせて頂きました。

参考になれば幸いです。

## 参考記事
- [テスト駆動開発（TDD）とは？目的や種類、メリット・デメリットまで徹底解説](https://service.shiftinc.jp/column/4654/)
- [テスト駆動開発（TDD）とは？TDDの進め方をステップ毎に解説！](https://www.qbook.jp/column/20181009_713.html)