OmniAICreator/Qiita-1.07M huggingface dataset:
javaでコンテナ作るときに気を付けるべきこと

# paper mc の 1.21.1はシグナルを認識してくれるらしい
実際に試しました。
...シグナルからコマンド飛ばすコード書いたけど、rmしました。

※この記事は数行で終わります

# javaはsignalを認識できない
signalとは`Ctrl+C`などを押したときにシステム側が反応し、ソフトウェアに割込み処理を行わせるものです。
### dockerでは
コンテナ終了時に内部アプリケーション(コンテナ内のpid1)にシグナルを発報します。10秒間（デフォルト）応答がなければ強制終了します。

# つまり
javaアプリケーションに対しては最初から強制終了を行うか、シグナルを文字列に変えてコマンドとして送るかとか考えないといけないのです。

終



#### 補足
ここまでの成り行きを説明します。
1. マイクラサーバー立てたるかー
1. docker使お
1. 起動時にシェルスクリプトでバックアップ取るか
1. あれ？正常に終了できないしログも出ない
1. pid1問題があるのか
1. 軽量init使いたくないなめんどそ
1. webguiによるマネージャ...めんどくさそ
1. `exec`コマンドを知る（すべての元凶）
1. おお、ログが出てきた！
1. 完成や！おまいらは入れ
1. (１か月後）
1. プラグイン更新するからサーバー閉じるか
1. 終わったから起動するか
1. 友「縦もん消えてんだが」
1. え？　うせやろ

その後、原因を究明した結果が以上のこととなります。
なお、`ctrl+c`では終了処理が行われてたので、これは`ctrl+c`が押されたことを認識し、`signal`が発報されたことを認識してないと結論付けました。

##### その後
軽量initでも解決しなさそうと思ったので、自作することにしました

[minecraft]pid2 <=> [ここを作る]pid1 <=> [Docker]

できたら報告します。

## 参考
https://qiita.com/tanakanata7190/items/07aa3f1c2c157d5b4227

https://qiita.com/nekobake/items/8cf1d049eb0bfb202142
ChatGPT4：ノーコードでPythonデータ可視化 -データ前処理-

以下のようなデータの前処理は、ChatGPT（Code interpreter）にお願いすると楽ですよぉ。

![IMG_1977.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/1bc5fffd-17dd-211a-57ca-f8728a5a9aec.jpeg)
　　　　↓↓↓↓↓↓
![IMG_1975.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/8fa071e8-d334-ef12-8b79-15aed8628e14.jpeg)



## 実施したデータの前処理

このデータは仮想データです。
![IMG_1977.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/a3273ef0-8154-ed18-e1ba-5645acdd7ccc.jpeg)

数値（int, float）、16進数、カテゴリーが混在しています。欠損値（NaN）もありますね。

このデータで、以下の前処理を行いました。口頭（テキスト）指示だけ。。。これだけで？と拍子抜けしました。「〇〇して」と伝えているだけですが、詳しくは実行例をみてください。

- 16進数のデータ列を10進数に変換
- データの70%以上がNaNの列は削除
- カテゴリーデータの列をラベルエンコーディング（0,1,2…）

### 実行例

https://chat.openai.com/share/c9117f4d-5df5-4997-8516-b5dc4ca9dc96


## 最後に

例えば、以下のように一度にあれもこれも指示をすると、Chatくんは一部の処理し忘れちゃうことがありますので、ひとつづつ前処理して ➡︎ データ確認… したほうがよさそうです。

データの70%以上がNaNの列は削除し、データが16進数の列があればすべての列を10進数に、NaNデータがあるデータ行は削除して、データフレームを書き出して下さい。

それにしても、これは楽やぁ😂。全然 手間かかりません。

　

※ 欠損値の削除は、慎重にならないといけない時もありますね。「欠損値の補完」は以下の記事の最後の方で触れてます。

https://note.com/hima2b4/n/n046a3e743f4d
SECCON 電脳会議 2023 参加してみた(Workshopのみ)

## はじめに
前々から参加してみたかったSECCON(CTFじゃなくWorkshop)に参加したのでどんな感じであったかをフィードバック

今回は通常の来場とWorkshopでOffSecに参加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529251/40e11e3c-a6d3-d6fd-c337-e4e1d4c54538.png)

そのうちCTFにも参加したい、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529251/512ab4b2-8ff6-77b4-c756-37ac17bcfbe5.png)

カプセルCTFも実施したが全く解けず、、、


## 本題
### 参加の流れ

下記のページから事前登録

https://event.seccon.jp/

（来年度はまた別のものになるかもしれない)

Workshopは事前登録&抽選形式だった

事前登録を済ませたら、あとは抽選発表を待つ、、、

抽選発表は下記のような形で届いた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529251/26724d13-8165-ee8a-c65b-056fab81065b.png)

## 当日

事前登録ページに一般来場チケットというものがあるのでそのQRで受け付けをした


ちょっとWorkshopには早い時間に到着したので誰でも参加可能なカプセルCTFというものをやっていたが難しかった、、、


なお、OffSecワークショップについてはTryHarder精神でとりあえず4つのサーバを攻略するような形であった

>・WEBサイトから情報を探す(URIの特徴から1と3がある=>2にアクセス)
・Windowsサーバ(ldapsearchを使う)
・あと一つ、なんだったっけ
・FTP設定ミス&クレデンシャルダンプ
　→これがハッシュダンプ中に終わった

 
 一問も解けなかったので不完全燃焼、、、

:::note info
上記OffSecワークショップで紹介されたDiscord URL

https://discord.gg/WsEWX6CZ
色々な情報共有など行われているみたい
OffSecを一緒に頑張りたい人たちが集まっている
:::


 ## おわりに
 Workshop終了後、数年ぶりにHackTheBoxとTryHackMeで憂さ晴らししてみたら、アクティブマシンでルートフラグまで取れた!
 
アクティブマシンを攻略できるまでにやったことを忘れないうちに後日記事を書きます！

追記：下記が今までペンテスト系で勉強してきたことの記事になります。

https://qiita.com/eguchi7309/items/82b0530639406d08d86e
【eclipse】改修したソースを一括でエクスポートする

改修した複数のソースをフォルダ構成ごと改修物として共有フォルダへ保存しておく必要があり、当初はフォルダを手動で作成し、一つずつ改修したソースをエクスポートしていたがとても大変！！
きっと改修物を一気にフォルダ構成ごとエクスポート出来る機能があるはずと思い調査

----------------------------------------------------------------------------------
# 改修ソース一括エクスポート手順
　ローカルプロジェクトをリポジトリと同期を取った後、差分として表示された改修物を抽出する
 
　<b>１．リポジトリと同期をとる</b>
　　　プロジェクト右クリック → 「チーム」 → 「リポジトリと同期」
　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3299892/15b88ba5-4d61-7f49-49db-e51e12115d9b.png" width=90%>

　<b>２．すべて抽出を行う</b>
　　　同期化ビューのプロジェクト右クリック → 「すべて抽出」 → 保存先を指定
　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3299892/763d789f-3561-600a-4ed6-132fa166e55a.png" width=60%>

　　　ディレクトリ構成ごと改修物が保存され、抽出ファイルの一覧テキストも付いてくる
　　　　<保存された改修物>
　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3299892/ef9e897a-436d-1257-0022-7b0e631d85b1.png" width=90%>

　　　　<付随された一覧ファイル>
　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3299892/b9628473-be54-3d9a-4669-101dba814f44.png" width=90%>
じゃぁmysqlの0.1は誤差がないの？

定期的に発生するプログラミング言語の浮動小数点型の話

https://qiita.com/higashi_nc/items/9a5ea00415a008f06843

2進数で表現できない値がくると演算誤差が生じる。それは知っておいて損はない。一番やっかいなのはそれが可視化し辛いということ。

例えばmysqlではこんな感じで一見は0.1が表現できてるように見える。


```
MariaDB [(none)]> select 0.1 + 0.2;
+-----------+
| 0.1 + 0.2 |
+-----------+
|       0.3 |
+-----------+
1 row in set (0.000 sec)
```

ただ、これだと誤差があっても画面に表示する文字列化の際に丸められてるだけかも知れない（エクセルもそういう仕様）。

完全一致しているかどうかを比較してみよう。

```
MariaDB [(none)]> select 0.1 + 0.2 = 0.3;
+-----------------+
| 0.1 + 0.2 = 0.3 |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.000 sec)
```

確かに一致している。いやこれでも「たまたま誤差が同じ数だけずれる」ことで一致しているだけかも知れない。

型を明示してくれるまで0.1が2進数か10進数かは分かりづらい。

mysqlのレファレンスを見ると、`0.1`のような 小数点つきの数値リテラルは「正確値」と呼ぶらしい。
そして正確値とは「整数とDECIMAL」とある。
https://dev.mysql.com/doc/refman/8.0/ja/number-literals.html

ただし初見は分かりづらい。DECIMALといってもじゃぁ少数何桁までをカバーしているのか？先輩エンジニアなら「数値リテラル入れたら、型を確認するのが常識でしょうが！」と言いそう。あれ？mysqlの型ってどうやって確認したらいいんだっけ？type_ofみたいな関数ってありましたっけ？探してもないですね。

mysqlでリテラルの型をみる解決策はこれ。

```
MariaDB [mysql]> set @a:=0.1;
Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]> drop temporary table if exists foo;
Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]> create temporary table foo select @a;
Query OK, 1 row affected (0.001 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [mysql]> desc foo;
+-------+----------------+------+-----+---------+-------+
| Field | Type           | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| @a    | decimal(65,38) | YES  |     | NULL    |       |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.001 sec)
```

変数を1回テーブルに変換して、そのテーブル定義を表示することで型がわかる。マジですかというくらい面倒。
mysqlを0.1と書くと `decimal(65,38) ` になる。結構長いことmysql使ってたけど知らなかったっす。

create table することで型を確認するというのは公式リファレンスでも書かれてる。まじですか。
https://dev.mysql.com/doc/refman/8.0/ja/type-conversion.html

ということで、0.1の内部表現は、初心者泣かせな上にベテランでも言語を通じての常識などない。
【eclipse】ローカルプロジェクトをSVNプロジェクトへ切替た際のエラー事象および解決方法

・ローカルプロジェクトのbranchをSVNのtrunkへ切り替えた際にエラーが発生した
・ローカルプロジェクトの表示はtrunkと表示されたが、中身はbranchの状態のまま

----------------------------------------------------------------------------------
# 事象
　<b>エラー発生時の操作</b>
　　・プロジェクトをbranchからSVNのtrunkへ切替
　　・切替た際の状態：ローカルプロジェクトのbrunch
   　　　　　　　　　　　（新規作成したlibフォルダとそのフォルダ内にjarがある状態）
　　　　　　　　　　　SVNのtrunk
   　　　　　　　　　　　（brunchで作成したlibフォルダは存在していない状態）

　　branchからtrunkへ切替た際、trunkにはlibフォルダが存在していないため削除されると想定していたが削除することが出来ず切替失敗となった

　<b>エラーメッセージ</b>
　　<INS>svn:E204899:Cannot delete file '対象のファイルバス\xxx.jar'</INS>

　<b>エラー時のイメージ</b>
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3299892/03e79d19-aa66-17ef-da2d-4e82c2155ca4.png" width=90%>


# 解決方法
　ローカルプロジェクト表示をbranchへ戻した上で、プロジェクトのクリーアップを実施
　その後、再度プロジェクトの切替を実施し問題なく動作した事を確認済

　プロジェクト右クリック → 「チーム」 → 「クリーンアップ」
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3299892/4ecc93e8-4161-3660-1f71-8bbaea18bae7.png" width=90%>
Tiptap の bold extension で strong タグの代わりに b タグを使う

ただの備忘録

[Tiptap](https://tiptap.dev/) では [`@tiptap/extension-bold`](https://tiptap.dev/docs/editor/api/marks/bold) を使うことで Bold な文字列に対応することができる。

しかしデフォルトでは全てが `strong` タグに変換されてしまう。

> The extension will generate the corresponding \<strong\> HTML tags when reading contents of the Editor instance. All text marked bold, regardless of the method will be normalized to \<strong\> HTML tags.

`strong` タグは強い重要性を示すものであり、ただの画面上の強調スタイル以上の意味を持つことになる。

自分のユースケースでは相応しくないと感じたので、別のタグで出力したくなった。

## extension を extend する

オプションでタグを別のものに変更したりできてもよさそうなものだがそういったオプションはなかった。

ソースコードを見るとそんな難しいものでもなさそうなのでプルリクを投げることも考えたのだが、マージ待ったりするのも面倒臭い...

https://github.com/ueberdosis/tiptap/blob/5aa90518818d9877f3502d9c09fd90c651b730e7/packages/extension-bold/src/bold.ts

と思い自前で extension 書くかぁと迷っていたところ、[`extend`](https://tiptap.dev/docs/editor/guide/custom-extensions#extend-existing-attributes) できるような設計になっていることを発見した。実に良き

なので、こんな感じで extend してあげれば出力されるタグを任意のものに置き換えることができた。

```ts
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
import { Bold } from '@tiptap/extension-bold';

const BtagBold = Bold.extend({
  renderHTML: ({ HTMLAttributes }) => {
    return ['b', HTMLAttributes, 0];
  },
});
const extensions = [
  StarterKit.configure({
    bold: false,
  }),
  BtagBold,
];

const Tiptap: React.FC = () => {
  const editor = useEditor({
    extensions,
    content,
  });
  ......
```

上記では [StarterKit](https://tiptap.dev/docs/editor/api/extensions/starter-kit) を使っているので、そちらの `bold` オプションをオフにしておく。

また、`HTMLAttributes` 周りの `mergeAttributes` とかをサボっているので、必要な場合はいい感じに調整する必要がある。

## 参考
- `strong` タグの仕様
    - https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-strong-element
- `b` タグの仕様
    - https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-b-element
- [stackoverflow: What's the difference between <b> and <strong>, <i> and <em>?](https://stackoverflow.com/questions/271743/whats-the-difference-between-b-and-strong-i-and-em)

ちゃんと使い分けていきたい
WebBluetooth APIを用いたBLE通信で21文字以上のデータをPCから送れなかったことに関するメモ

# 結論
- 2024/01/08現在において、writeValueメソッドならびにwriteValueWithoutResponseメソッドを用いて20byte以上のデータを送信できない。
- [chromiumへのバグ報告](https://bugs.chromium.org/p/chromium/issues/detail?id=1073311&fbclid=IwAR1APy0bcv5_ZtGPUnHtw6IhKZ49McJaPn6AZvA79XEechQbDkLagS45Q9c)を確認する限りだと修正はされていない。

# 気付いたきっかけなど

事象に気づいた際の情報をまとめます。

## 概要

- Chromeフロントエンドからmicro:bitに50文字程度の文字列を連続送信するコードを書こうとしたときに事象に気づいた
- AndroidアプリのBLEScannerからmicro:bitのCharaに文字列データを送った際には正常に受信できていた。BLEScannerは下記からインストール可能

https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner&hl=en&gl=US&pli=1

## 詳細

こちらにまとめました。ざっくりと内容を要約すると

- フロントエンドとmicro:bitを通信しようとしたときに21文字以上送れなかった。
- 文字数を変更して検証したところ、20文字は送信できたけど21文字以上はだめだった。
- 端末に搭載されているBLEはそれぞれBLE 5.1以上あった
- PCはWindows 11 Homeで、micro:bitはV2.21

https://ja.stackoverflow.com/questions/98270/webbluetooth-api%e3%81%ab%e3%81%a621%e6%96%87%e5%ad%97%e4%bb%a5%e4%b8%8a%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92microbit%e3%81%b8%e9%80%81%e4%bf%a1%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84?fbclid=IwAR32eWev22r8IGptBVIlGLViGwZwDIudIHys-2W3fuJcGzhHe0YWQtk0lEo

## その他備考

- writeValueメソッドに関してはすでに非推奨となっており、そもそも使用が推奨されていない。

https://developer.mozilla.org/en-US/docs/Web/API/BluetoothRemoteGATTCharacteristic/writeValue

- [詳細欄のスタック・オーバーフロー](https://ja.stackoverflow.com/questions/98270/webbluetooth-api%e3%81%ab%e3%81%a621%e6%96%87%e5%ad%97%e4%bb%a5%e4%b8%8a%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92microbit%e3%81%b8%e9%80%81%e4%bf%a1%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84?fbclid=IwAR32eWev22r8IGptBVIlGLViGwZwDIudIHys-2W3fuJcGzhHe0YWQtk0lEo)でも記述したが、PCもmicro:bitもBLE　5.0以上対応なため、データの送信量としてはBLE 4.0の２オクテット(16byte)の成約には引っかからない。また、BLEScannerではデータ送信できているため、受信側のmicro:bitは正常に動作している。
BLE仕様の詳細はこちら。「MTU」や「Maximum Transmission Unit」というワードで検索すると早いかも。

    - [BLE 5.1](https://www.bluetooth.com/bluetooth-resources/bluetooth-core-specification-v5-1-feature-overview/)
    - [BLE 4.0](https://www.bluetooth.com/specifications/specs/core-specification-4-0/)


## その他資料

- 20 byte MTU for web-bluetooth on Windows Chrome?
https://stackoverflow.com/questions/61353788/20-byte-mtu-for-web-bluetooth-on-windows-chrome?fbclid=IwAR10nRiN_V-eAUy-XLrWyk-DCbCzUtSB3IL40oDUwE3FKuCGehbHbjrXoFE
vscode-leetcodeのCookieログイン

- [LeetCodeのVSCodeプラグイン](https://marketplace.visualstudio.com/items?itemName=LeetCode.vscode-leetcode)を使うと、VSCodeでLeetCodeの問題が解ける。
- が、現状id&passのログインができないようだ。
- Cookieログインを使う。
    - ログインボタンから、Leetcode: Cookieを選択。
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609640/25c17f0d-15ce-6279-6112-5e4b3a95b5e3.png)
    - 開発者ツールのApplicationタブ>Storage>CookiesでleetcodeのCookieを確認できる
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609640/9c84ead3-7231-fb9e-7c74-32f0c99d3e4e.png)
     - このうちNameが```LEETCODE_SESSION```, ```csrftoken```となっているものだけを、以下のような形式で入力窓に入力する。
         - ```LEETCODE_SESSION=value;csrftoken=value```

- https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-564757098
データ関連の情報収集

自分向けデータに関する情報まとめです。

随時追記します。


# ファイル形式（ストレージ）
## 列指向
Apache Parquet（アパッチ・パーケット）
https://parquet.apache.org/


## 行指向
Apache Avro（アパッチ・アブロ）
https://avro.apache.org/

## 他
Protocol Buffers（プロトコル・バッファ）
https://protobuf.dev/

# データフォーマット（インメモリ）
## 列指向
Apache Arrow（アパッチ・アロー）
https://arrow.apache.org/

## 行指向


# データ型とIFの定義
Apache Thrift（アパッチ・スリフト）
https://thrift.apache.org/

OpenAPI Specification（オープン・エーピーアイ）/Swagger （スワッガー）
https://swagger.io/specification/

GraphQL （グラフキューエル）
https://graphql.org/

WSDL

# メタデータ管理・データカタログ
Apache Atlas（アパッチ・アトラス）
https://atlas.apache.org/

OpenMetadata（オープンメタデータ）
https://open-metadata.org/

DataHub（データハブ）
https://datahubproject.io/


# ETL・ワークフロー・パイプライン・ルーティングなど
Apache Nifi（アパッチ・ナイファイ）
https://nifi.apache.org/

Apache AirFlow（アパッチ・エアーフロー）
https://airflow.apache.org/

Apache Beam（アパッチ・ビーム）
https://beam.apache.org/

Apache Camel（アパッチ・キャメル）
https://camel.apache.org/



# メッセージングシステム
Apache Kafka（アパッチ・カフカ）
https://kafka.apache.org/

Apache Kafka Streams
https://kafka.apache.org/documentation/streams/

Apache Samza（アパッチ・？）
https://samza.apache.org/

Apache Storm（アパッチ・ストーム）
https://storm.apache.org/

Apache Pulsar（アパッチ・パルサー）
https://pulsar.apache.org/

Apache Flink（アパッチ・フリンク）
https://flink.apache.org/



# 分散処理システム(ストレージ)
Apache Hadoop（アパッチ・ハドゥープ）
https://hadoop.apache.org/

Apache Hive（アパッチ・ハイブ）
https://hive.apache.org/

Apache Sqoop（アパッチ・？）
https://sqoop.apache.org/

Apache Ranger（アパッチ・レンジャー）
https://ranger.apache.org/

Apache Sentry（アパッチ・セントリー）
https://sentry.apache.org/



# 分散処理システム(インメモリ)
Apache Spark
https://spark.apache.org/

Apache Spark Streaming
https://spark.apache.org/docs/latest/streaming-programming-guide.html



# 分散型SQLクエリエンジン
Apache Drill（アパッチ・ドリル）
https://drill.apache.org/



# 分散型ログ収集
Apache Flume（アパッチ・フルーム）
https://flume.apache.org/



# 分散型分析エンジン
Apache Kylin（アパッチ・キーリン）
https://kylin.apache.org/

------------
ラズパイでもtodo txt cli導入できた

# ラズパイに導入する方法

WSLかどっかから（もちろんgithub siteでもOK）

- todo.sh
- todo.cfg
- todo_completion

もってきて、ホームディレクトリにコピーする。

私の場合は、tフラグをつかいたかったので、.todo.actions.dというディレクトリーの中にfutureTasksというファイルがはいったものもコピーした。

あとは [ここ](https://github.com/todotxt/todo.txt-cli/wiki/Quick-Start-Guide)をみてください.

```
chmod +x todo.sh
```

.bashrcのどっかに`source todo_completion`と書き込んでください。


```
cd .todo.actions.d
chmod +x futureTasks
```

これでいけるはずです。それではハッピーラズパイライフを
VSCodeで、Spaceでインデントする

# 内容
VScodeでコードを選択中に`Tab`を押すとインデントされるのですが、
それを`Space`でもできたら便利だろうということ

# 方針
VSCodeのショートカットキーは設定で簡単に変えられるようなので、設定だけでどうにかなるであろう

# 完成品
```json:keybindings.json
[
    {
        "key": "space",
        "command": "editor.action.indentLines",
        "when":"editorHasSelection && editorTextFocus && !editorReadonly"
    },
    {
        "key": "shift+space",
        "command": "editor.action.outdentLines",
        "when":"editorHasSelection && editorTextFocus && !editorReadonly"
    }
]
```

## 動作
コードを読めばほぼ自明な気がしますが一応
1. コードを選択中に`space`を押す → 選択範囲にインデントが1追加
1. コードを選択中に`shift+space`を押す → 選択範囲のインデントが1削除
## 設定方法
1. `Ctrl+Shift+P`で開くウインドウから、`Open Keyboard Shortcuts (JSON)`を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1773714/256ef4b8-c0ad-052a-8ec5-71df2a270cc3.png)
2. `keybindings.json`が出てくるので、そこを上記コードで置き換える[^1]

[^1]: 既存コードがある場合は置き換えではなく、中身の追記をしてください
[Python][Julia]Project euler9 (プロジェクトオイラー9)


#### Project euler Ploblem 9 (プロジェクトオイラー9)
[Special Pythagorean Triplet](https://projecteuler.net/problem=9)

備忘のために残しておく。


## 問題
#### 問題文 (意訳)
ピタゴラスの三つ組数は　3つの自然数のセットであり、a<b<cの場合、
```math
\begin{align}
a^2 + b^2 &= c^2 \ \\
\end{align}
```
となる。
a + b + c = 1000　となるピタゴラスの三つ組数は一つ存在する。
積abcを求めよ。

#### 原文
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
```math
\begin{align}
a^2 + b^2 &= c^2 \ \\
\end{align}
```
For example, 
```math
\begin{align}
3^2 + 4^2 = 9 + 16 = 25 =  5^2 .
\end{align}
``` 
There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.

## 解答
#### 答え
<b>31875000</b>

#### 解答の方針
式変形して、cを消去してから、a,bの成り立つ組を求める。

```math
\begin{align}
a^2 + b^2 &= c^2 \ \\
a + b + c &= 1000 \\
\end{align}
```
なので、
```math
(a + b)^2 = (1000 - c)^2 \ \\
```
となって、式変形すると
```math
\begin{align}
a^2 + b^2 + 2ab&= 10^6 - 2000c + c^2 \ \\
0 &= - ab - 1000×(1000- a - b) + 5×10^5  \\
0 &= ab - 1000×(a + b) + 5×10^5  \\

\end{align}
```
この式が成り立つa,bを探し、a×b×(1000-a-b)を計算する。

#### Pythonのコード
```Python: Python Ploblem9
def formula(a, b):
    return a*b-1000*(a + b)+500000

def seek_ans():
    ans = 1
    for a in range(1,1000):
        for b in range(a + 1, 1000):
            if formula(a, b) == 0:
                ans = a * b * (1000 - (a + b))
                break
        else: continue
        break
    return ans

print(seek_ans())
```

#### Juliaのコード
```Julia: Julia Ploblem9
function formula(a, b)
    return a*b-1000*(a + b)+500000
end

function seek_ans()
    ans = 1
    flg = false
    for a in range(1,1000)
        for b in range(a + 1, 1000)
            if formula(a, b) == 0
                ans = a * b * (1000 - (a + b))
                flg = true
                break
            end
        end
        if flg
            return ans
        end
    end
end
print(seek_ans())
```
railsAPIをaxiosで叩いた時のエラーの取得について

## はじめに
RailsのAPIからデータを取得する際に、axiosを使用してエラーが発生した場合、レスポンスを取得することができずに困った

## 問題点
Railsでエラーが発生した場合、通常はstatusコードとmessageをレスポンスボディとして返すので取得の仕方を変えないといけなかった

### 例えば

``` ruby
if user.save
  render json: { status: 200, data: user }
else
  render  status: :unprocessable_entity, json:{ messages: user.errors.full_messages }
end
```
この場合、フロントでaxiosを使用してAPIを呼び出すと、エラーが発生した場合、以下のようなエラーが発生する

``` JavaScript
axios
  .post(process.env.API_URL + '/api/v1/users/signup')
  .then((res) => {
    console.log(res)
  })
  .catch((e) => {
    console.log(e)
  })
```
出力
```
Error: Request failed with status code 422
    at createError (createError.js?2d83:16)
    at settle (settle.js?467f:17)
    at XMLHttpRequest.handleLoad (xhr.js?b50d:69)
```

このエラーは、axiosがエラーが発生した場合、レスポンスbodyをe.responseオブジェクトとして返す
e.responseオブジェクトは、エラーが発生した場合、statusコードとmessageのみを返、messagesなどの詳細なエラー情報を取得することができない

## 対処法
この問題を解決するには、フロントでaxiosのcatch()メソッドの引数にresponseオブジェクトを渡して、response.dataオブジェクトからエラー情報を取得

``` JavaScript
axios
  .post(process.env.API_URL + '/api/v1/users/signup')
  .then((res) => {
    console.log(res)
  })
  .catch((e) => {
    console.log(e.response.data.messages)
  })
```
出力
```
["Email has already been taken.", "Password is too short."]
```
この方法で、エラーが発生した場合でも、詳細なエラー情報を取得することができる
Github上の最新OSSプロジェクトを自動で紹介するアプリを作った


Github上では日々多くのOSS（オープンソースソフトウェア）が生まれていますが、それらをフォローし続けるのは全ての人ができることはありません。また昨今では英語は無論、中国語のOSSプロジェクトも勢いを伸ばしてきています。そういった**言語の壁**を超えた情報提供が為されることを含め、そういった**OSSプロジェクトの見つけにくさ・分かりにくさ等の問題**を緩和させることをゴールに作られたのが、今回ご紹介する「[Open Source DB（オープンソースデータベース）](https://shortener.work/s/opensourcedb3)」です。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666436/ebb10250-613a-54f5-84d8-f5690ab3d0fb.png)
> 「AutoGPT」を紹介するページより。（Open Source DB）
WSLではsudo rebootしてはいけない

- WSL2のUbuntuで```sudo reboot```した。
- PowerShellから```wsl -l```などのコマンドを打っても反応しなくなった。
- コントロールパネル>プログラム>プログラムと機能>Windowsの機能の有効化または無効化 をチェックすると、Linux用Windowsサブシステムのチェックボックスが消えている。。。
- チェックボックスを入れ直し、再起動するとWSLが復活した！
- WSLを再起動したい場合は、PowerShellから```wsl --shutdown```を行う
[TypeScript]never型とは

# never型とは
「値をもたない」を意味する特殊な型。
never型は、通常、関数が正常に終了しないことを示す型です。
以下がサンプルコードです。
```ts
type Exclude<T, U> = T extends U ? never : T;

type Foo = Exclude<string | number | boolean, boolean> // string | number
```
このコードは、継承した U 型と一致する型を T 型の中から除外する型定義です。
ここでは、「type foo」の中で宣言された「Exclude」の第二引数に、「boolean」型が渡されているため、Foo 型は 「string | number」となります。

# never型が多く使われる場面
never 型は主に、以下のように使われることが多い。

### エラーのスロー（throwError関数）
```ts
function throwError(): never {
  throw new Error();
}
```
このthrowError関数は、常にエラーをスローして例外的な状態に移行することが期待されます。
このような関数は、戻り値がないため、never型を返します。これにより、コンパイラはこの関数が例外をスローすることを理解し、他の部分でこの関数を呼び出す際には注意が必要であることを示唆します。

### 無限ループ（forever関数）

```ts
function forever(): never {
  while (true) {} // 無限ループ
}
```

このforever関数は、条件が常に真であるため、終了しない無限ループを含んでいます。
このような関数もまた、正常に終了しないため、never型を返します。この型情報を使うことで、コンパイラはこの関数が終了しないことを理解し、他のコードとの統合や実行フローの解析において役立ちます。

また、以下のように存在しないことが保証される型を表現することもできる。
```ts
// 与えられた型 T が null または undefined の場合に never 型を返し、それ以外の場合には T 型を返す型エイリアス
type NonNullable<T> = T extends null | undefined ? never : T;
```
このコードでは、引数Tの中身が、「null」または「undefined」の場合に、「never」型を返し、それ以外であれば、引数の型を定義するコードです。
null, undefinedの場合に、never型を適用させることで、**存在しないことが保証される**ことを定義するために、never型を使用します。


## 最後に
他にも色々な記事を書いているので、よければ読んでいってください、、、

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
音声による感情分析に使えるサービス(2023年版)

感情分析をやりたいので調査しました。
リアルタイムに分析してフィードバックをしたいため、まずは処理が比較的軽そうな、音声による分析に絞りました。


# iMotions Voice Analysis
- https://imotions.com/products/imotions-lab/modules/voice-analysis/

- 感情検出（怒り、幸福、悲しみ、中立）や感情の価値（興奮、支配、価値）などのデータを提供します。
- 声の基本的な特徴（ピッチ、音量、話す速度、イントネーション）を含むメトリクスを提供し、話者の年齢や性別の推定も可能です。
- このiMotionsという会社は、他にも視線トラッキングや呼吸測定なども提供しているようです。
- 価格は、年間払いで、基本料3,000ユーロ＋音声解析3,000ユーロ。


# Vokaturi
- https://vokaturi.com/

- リアルタイムおよび事後分析に対応し、オフラインでの動作が可能です。
- カスタムクラスの測定にも対応し、高度な音声分析技術とカスタムディープニューラルネットワークを組み合わせています。
- 価格は、OSS版は無料(精度67%・3層ネットワーク)、ニューラルネットワーク版は要問合せ。

- OSS版はSDKやCとPythonによるサンプルコードあり。バッチ版とリアルタイム版。
    - https://developers.vokaturi.com/getting-started/overview


# Empath (株式会社Empath)
- https://webempath.com/
- https://webempath.net/lp-jpn/ (日本語サイト)
- https://webempath.net/lp-eng/ (英語サイト)

- 声の物理的特性（ピッチ、トーン、スピード、パワー）を分析して感情を識別します。
- Empathは怒り、喜び、悲しみ、落ち着き、活力などの感情を検出でき、Web APIを通じて開発者が使えるようになっています​​。
- 「言葉」ではなく、「声」の状態から感情を解析するので、言語を選ばずに、分析結果を出すことが出来るとのこと。
- WebAPIがあり、JavaScriptのサンプルコードがある
- 価格は要問合せのため、不明


# まとめ
音声から感情分析するサービスを3つ紹介しました。
無料で試せるものもあるので、後でやってみようと思います。
AthenaでSQLによるデータ抽出

## はじめに
前回の記事でAthenaにSQLを記載してテーブルを作成する方法を
記載しましたが、今回はデータを抽出する方法を記載します。

https://qiita.com/Masayanf/items/8db0f3fb7947789eb2fb

EXCELのPowerQueryを使用しておりPowerQueryはコードを書かなくてもよいのですが、なんとなくSQLでデータの抽出結果がイメージしやすかったです。

## SELECT FROM WHERE LIMIT
ただ、単にデータを抽出する処理です。

```diff_SQL
SELECT 
   *
FROM データベース名.テーブル名
WHERE フィールド名='1'
LIMIT 100
```

- [x] **[SELECT]** はフィールド名を指定する。
- [ ] ＊はすべてのフィールドを指す。
- [ ] 特定のフィールドを抽出する場合は＊の代わりにフィールド名を指定する
- [x] **[FROM]** はどのテーブルから抽出するのかを指定する。
- [ ] データベース名から記載が必要
- [x] **[WHERE]** は抽出条件を指定する
- [ ] String型のフィールドの場合は数値との比較であっても数値をシングルクォーテーションで囲む
- [x] **[LIMIT]** は出力する件数を指定する
- [ ] 初見のテーブルの場合は必ずといってLIMITを付ける

## 集計関数
行数のカウント、フィールドに対して最大値最小値、合計などを取る関数のことを指します。

```diff_SQL
SELECT
    SUM(数値フィールド) as "金額"
    ,COUNT(DISTINCT 文字列フィールド) as "カウント"
FROM データベース名.テーブル名
```
- [x] **[COUNT]** は行数を返す。
- [ ] [COUNT(*)]は全行数を返す。
- [ ] [COUNT(フィールド名)]はフィールドの内NULLで無い行数を返す
- [x] **[MAX]** は最大値を返す。
- [x] **[MIN]** は最小値を返す。
- [x] **[SUM]** は合計を返す。
- [x] **[DISTINCT]** は重複を除外した数を返す。

## GROUP BY
集計関数による集計をフィールド毎に行えます。

```diff_SQL
SELECT
    集計フィールド, sum(数値フィールド) as "金額"
FROM データベース名.テーブル名
GROUP BY 集計フィールド
ORDER BY 並替フィールド
```
- [x] **[GROUP BY]** は集計フィールド毎に集計が可能
- [ ] 行数はGROUP BYの対象分に減る
- [ ] 集計対象項目以外をSELECTする場合、そのフィールドには集計関数が付く必要がある
- [x] **[ORDER BY]** で並び替えが可能
- [ ] ASCで昇順、DESCで降順

## HAVING
集計結果に関して条件を付ける操作です。

```diff_SQL
SELECT 
    年月, SUM(数値フィールド) as "金額"
FROM データベース名.テーブル名
GROUP BY 年月
HAVING SUM(数値フィールド>=1000000
ORDER BY 年月 ASC
```
- [x] **[HAVING]** はGROPU BYでの集計結果に対して条件を付ける
- [ ] WHEREとは異なる

## SQLの実行順
SQLの実行順序は下記のとおりになります。
SELECTからの記載順ではないです。

|NO|構文|内容 |
|---|---|---|
|1 |**FROM**|テーブルを読込む|
|2 |**WHERE**|読込んだ内容にテーブルに条件で絞り込む |
|3 |**GROUP BY** |絞り込んだ結果から集計を行う|
|4 |**HAVING**|集計した結果に条件を付けて絞り込む|
|5 |**SELECT**|フィールドが選択される|
|6 |**ORDER BY**|並び替えが行われる|
|7 |**LIMIT**|指定した行数が抽出される|

最後までお読みいただきありがとうございます。
【ChatGPT有＋DALL-E3】こんなの、あり？　絵文字や顔文字で？


　どうも、カーブミラーです。

　今回は、こんなので？という話です。絵文字や顔文字だけで、描画できてしまうのです。信じられんでしょう？

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
あしからず。
:::

　というわけで、
　　超簡単な描画方法です。

　これは、
　　某コミュニティの
　　　ひとりの方が
　　　　教えてくださいました。

　その方は、
　　Midjourney V6で
　　　♥だけで描画していました。

　DALL-E3で
　　「♥。描画」
　　　で、試しにやったら
![DALL·E 2024-01-08 10.48.07 - A beautiful, serene landscape painting in the style of traditional Japanese art. The scene features a tranquil lake surrounded by cherry blossom trees.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/7eb7ab2a-a499-ae1f-33b5-3fc87a610581.png)

　「🐈‍⬛。描画」（黒猫）だと
![DALL·E 2024-01-08 08.31.59 - A charming and detailed illustration of a black cat in a fantasy garden. The cat has bright green eyes and a sleek, shiny coat. It's sitting gracefull.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/07abeef3-1dcd-536a-cd1b-01ae019f3991.png)

　「🐾。描画」（足跡）だと
![DALL·E 2024-01-08 10.51.29 - A playful and heartwarming illustration featuring a variety of animal paw prints leading through a beautiful natural landscape. The scene includes a m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/94cd2a20-ed32-d835-0482-a36fb6da00c1.png)

　「:⁠-⁠D。描画」（笑い）だと
![DALL·E 2024-01-08 10.51.23 - A vibrant and joyful illustration depicting a scene of celebration and happiness. The image is filled with smiling faces of people from diverse backgr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/957623db-be94-4bbd-5a08-c1b44eca6984.png)

　「(=^･^=)。描画」だと
![DALL·E 2024-01-08 10.52.55 - A cute and playful illustration of a cartoon cat. The cat has a fluffy appearance with large, expressive eyes and a mischievous grin. It is depicted i.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/07db1f82-cc56-8f8e-911f-8a5d56a6a549.png)

***
　絵文字や顔文字での描画で
　　いいものができたら、
　　　それをベースにすれば
　　　　いい作品ができるかも。

　やり方は、
　　ずっと書いてきましたから
　　　毎回読んでくださる方は
　　　　わかるかと思います。

　とりあえず、
　　前回の記事の
　　　リンクを貼っておきます。
[【ChatGPT有＋DALL-E3】で描画される画像をSEED値で固定化。](https://qiita.com/kabumira/items/7eb861576ac1c36dea34)

　これで
　　みなさんの
　　　作品作成の糧に
　　　　なれば幸いです。

　今回は、ここまで。
mysql8.0をいれるときに勉強になったメモ

![スクリーンショット 2024-01-06 18.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627182/8230512b-bf5a-1bf4-dec9-2e19ea81b6a3.png)

sql5.7が先にはいっていてsql8.0をhomebrewでインストールした際に
progateのサイトで初めてmysqlをインストールした際に
パスを指定する文がでてこなかったのでパスについて少し勉強した履歴。

~/.zshrc とはそもそもなにか
~/とはホームディレクトリのことで　その先のzshrcというファイルということ

source ~/.zshrcとは
zshrcにexportで環境変数を新たに定義したあとその変更を確定させるために
使うコマンドのこと

画像はvi コマンドにてzshrcの中身をみてみた結果である。
下の方にmysql@5.7のパスがあるのがわかるから
ここをmysql8.0のパスにすればいいのか？

https://tech.kurojica.com/archives/26262/

いい記事を発見
```
brew --prefix mysql
```
でmysqlのインストールされたパスがわかるっぽい

![スクリーンショット 2024-01-06 18.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627182/b0ee6c0d-99ed-8fae-13fa-1474d73dc6e7.png)

/usr/local/opt/mysql
にあるっぽいからこれを環境変数に追加？

![スクリーンショット 2024-01-06 18.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627182/b5b0bb37-dd7f-ad07-451e-ca5961bf2865.png)

環境変数の変更とsourceで決定した後
viエディタで確認するとzshrcファイルに書き込まれていたのでmysqlのバージョンを確認すると
8.0に変わってることがわかった！

ただdbeaverのほうで接続しようとすると
```
Access denied for user 'root'@'localhost' (using password: NO)
```
と出たので
調べるとアクセス拒否エラーということで
rootユーザの権限が設定されていないとこのようなエラーがでるとのこと

なぜこのようにrootユーザなどの話がでてくるかというと
このあたりを設定しないと簡単に乗っ取りができるとのこと
なのでそうさせないためにもrootユーザのパスワード設定をするべきとのこと。

```
mysql_secure_installation
```
を実行して初期設定を行う

https://rin-ka.net/mysql8-init/

https://weblabo.oscasierra.net/mysql-57-init-setup/

このあたりを参照

![スクリーンショット 2024-01-06 18.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627182/3b259b86-d1f8-1966-b787-4168f9e3c13c.png)

設定を完了してAll done!を確認した後
```
mysql.server restart
```
して再起動した後DBeaverを再起動したらmysql8.2がはいった！
![スクリーンショット 2024-01-06 18.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627182/8051423a-051c-eca1-0d86-b383eff68714.png)

と思いきやなぜか5.7が使われてるっぽい・・
わからない・・
SPA（React、Angular、Vue.js ）の特徴

React、Angular、Vue.jsはすべて人気のあるJavaScriptフレームワークやライブラリであり、どれが一番良いかはプロジェクトのニーズや開発者の好みに依存します。以下は、各フレームワークの特徴の概要です。

React:

Facebookが開発したライブラリであり、仮想DOMを使用してパフォーマンスを向上させることができます。
コンポーネントベースのアーキテクチャを採用し、柔軟性があります。
ライブラリ単体で、他のライブラリやフレームワークと組み合わせやすい。
Angular:

Googleが開発したフレームワークで、完全なMVC（モデル・ビュー・コントローラー）アーキテクチャを採用しています。
依存性注入やTypeScriptの使用など、強力な機能が組み込まれています。
大規模なアプリケーション開発に適しています。
Vue.js:

小規模から中規模のプロジェクトに適している、シンプルで柔軟なライブラリです。
ドキュメントがわかりやすく、学習コストが比較的低いです。
他のライブラリや既存のプロジェクトに組み込みやすい。
どのフレームワークやライブラリが最適かは、プロジェクトの規模、要件、チームのスキルセットによって異なります。Reactは柔軟性があり、コミュニティが大きいです。Angularは大規模なアプリケーションに適しており、TypeScriptの利用が可能です。Vue.jsはシンプルで学習しやすいため、小規模プロジェクトや初心者にも適しています。
SQLメモ

# SELECT

## LIKE句

完全一致と部分一致

### 完全一致

```
SELECT カラム名 FROM テーブル名 WHERE カラム名 LIKE '検索文字';
```

検索文字と完全に一致したデータのみ表示される。

### 部分一致

| ワイルドカード文字 |意味| 
|:-----------:|:------------:|
| %       | 0文字以上の任意の文字列 |
| -     | 任意の1文字 |


```
SELECT * FROM poker_hand_probability WHERE name LIKE '%A';
/*
AAのレコードがヒット
________________
id |name | probability
1  |AA  | 85.3%
________________
*/


SELECT * FROM  WHERE name LIKE 'A%';
/*
Axo、Axsのレコードがヒット
________________
id |name | probability
1  |A2o  | 54.6%
2  |A3o  | 55.6%
2  |A4o  | 56.4%
________________
*/


SELECT * FROM  WHERE name LIKE 'A_';
/*
AAのレコードがヒット
________________
id |name | probability
1  |AA  | 85.3%
________________
*/
```

## ORDER BY句

```
SELECT　カラム名　FROM　テーブル名　ORDER BY　基準にしたいカラム名 [ASC　または　DESC];
```

ASCが降順、DESCが昇順でデフォルトはASC

# LIMIT句

```
SELECT　カラム名　FROM　テーブル名　LIMIT　取得したい行数;
```

リリース時に書き込みが上手くいってるか確認する時はこんな感じでやってる。

```
select * from --- order by id desc limit 30;
```

## BETWEEN句

```
SELECT　カラム名　FROM　テーブル名　WHERE created_at BETWEEN "2024-01-01 15:00:00" AND "2024-01-02 14:59:59";
```

## IN句

```
SELECT　カラム名　FROM　テーブル名　WHERE name IN("山田","田中");
```

# TRUNCATE

```
TRUNCATE TABLE テーブル名 ;
```
「世界一流エンジニア思考法」から学ぶ思考メモ①

# はじめに
米マイクロソフトのシニアソフトウェアエンジニアである牛尾さんが著者である「世界一流エンジニア思考法」を読み、勉強になったところが多くあったので内容と私自身が読んで思ったことを簡単に残したいと思い書いています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646964/b59714bd-d3e1-de70-1584-c97cc83db070.jpeg" width=250  />

# 本を読んで特に取り入れるべき思考や考え
- 試行錯誤ぜず、集めたデータをもとに仮説を立て検証し、問題なければ手を動かす
- 理解に時間をかけて取り組む。
- いい習慣をつくる


## 試行錯誤ぜず、集めたデータをもとに仮説を立て検証し、問題なければ手を動かす
> 単に 思いつき で いろいろ な パターン を 試し て 正解 を 探し て いる だけなので、 とても 時間 が かかる 上、 新しい知識を何も学んでいない。

私自身、よくやってしまいがちです。ログから得た情報をもとに思いつきで試行錯誤してエラーやバグを解決しようとして、時間を費やしていました。そのため、生産性が低い時の要因の一つだったと振り返り反省しています。

## 理解に時間をかけて取り組む。短期的に成果を出すことにとらわれない。

> そんな 複雑 な アーキテクチャ を 把握 し て いる 彼ら の やり方 に、 私 は 興味 が あっ た の だ。 「いやぁ、 ビデオ を 見 ても 難しい ので 10 回 は 見 てる ね。 何回 も 見直し て、 わから ない ところ は ポーズ し て メモ し て 見 て ます」 　 もう 一人 の 同僚 も「 やっぱ そう なる よね。 自分 も 何回 も 何回 も 見 た」 と 言う。

私自身、優秀な人は時間をあまりかけずに、何でもすぐ理解できてしまうんだろうと思っていました。しかし、本書を読み実際はどんな頭のいい人でも時間をかけて理解しているし、基礎をきちんと身につけているからこそ、そう見えていると勉強になりました。
「守・破・離」という言葉があると思いますが、優秀な人ほどこの「守」を大事にされているんではないかと感じます。私自身、今まで基礎的なことはある程度理解できればいい、応用のほうが重要だと思っていたこともあり、考えを見直すきっかけになりました。

## いい習慣をつくる
>好ましい 変化 は プログラミング 技術 以外 にも 訪れ た。 私生活 において も「 頭 が 悪い から 仕方 が ない か」 と いろいろ な 理解 を あきらめ て い た。 でも 時間 を かけ て 理解 する 習慣 が 身 に つい た こと で、 人生 の 様々 な 小さな こと を「 コントロール でき て いる」 感 を 得る こと が でき、「 自分 なら できる」 という 安心感 も 生まれ て き た。 結局 の ところ、 シンプル な 日々 の 積み重ね が 一番 強い。

いい習慣を身につけることが大事なことだと頭では理解はしていますが、継続することが難しいと思います。私自身、筋トレや技術本を読む習慣をつけようと日々の生活を送っていますが、習慣化できていないのが現実です。
振り返り思うことは、習慣化する内容のハードルを高くしていることが原因かなと思います。そのため、小さなことから習慣化する、例えば技術本を開くやスポーツジムの前まで行くなどハードルが低くすることで継続しやすくなると思っています。
そこからハードルを少しづつ上げていい習慣化を私自身作りたいなと思います。



# まとめ
簡単ではありますが、「世界一流エンジニア思考法」から学んだことメモとして書いてみました。優秀な人の思考は、誰でもマネできる小さな積み重ねがあってこそだと思い知らされました。
私自身へっぽこエンジニアなため、本書の内容をもとに自分自身をアップデートし、エンジニアとして胸を張って言えるようになりたいと思います。
最後まで読んでいただきありがとうございました。

# 参考文献
この記事は以下の情報を参考にして執筆しています。
[世界一流エンジニアの思考法](https://books.bunshun.jp/ud/book/num/9784163917689)
そのエラー、予約語ですよ。

こんにちは。
開発するにあたってエラーが出て悩む瞬間が多々あるとは思います。
私は今回そのエラー内容で無駄に悩んでしまったため、備忘録としてブログに残しておきます。

## ■やろうとしたこと
CloudFormation でSSMパラメータを定義する

### ■エラーとなったymlファイル

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  TestHogeHoge:
    Type: AWS::SSM::Parameter
    Properties:
      Type: String
      Description: "TestHogeHoge"
      Value: "sasaki-test"
      Name: "aws"

Outputs:
  TestHogeHoge:
    Value: !Ref TestHogeHoge
```

### ■エラー文言

```
Parameter name: can't be prefixed with "aws" or "ssm" (case-insensitive). (Service: AmazonSSM; Status Code: 400; Error Code: ValidationException; Request ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Proxy: null)
```

エラー内容をググっても納得のいく解答が見つからなかったため
今回ブログを書こうと思った次第です。

冷静に考えればエラー内容をじっくり見ていればなんとなくエラー原因がわかりそうな気もしますが、、、
開発時はそんな冷静にいられないというのも”あるある”で、解決まで時間がかかってしまいました。

### ■エラー内容

タイトルでネタバレしていますが今回は予約語でエラーになっていました。

#### *そもそも予約語とは、、、??*
> 開発者が付ける識別名として利用できない文字列のこと。予約語に挙げられた単語やフレーズは変数名や関数名などに使用することはできない。

--- 

ということで、今回はSSMパラメータの名前”aws”っていう名前はつけられないよー！
と怒られていました。
Name: “aws”　の名前を変更して無事エラー回避することができました。

ちなみに私は勉強不足で全く知らなかったのですが、
SSMパラメータ以外にもDynamoDBでの属性名にDAYや/DATA が同様の理由で使用できなかったり、
他サービスにも予約語という概念は勿論存在しますので注意が必要です。

内部的に使用できない名前はその他にもあるので、
上記のようなエラー内容が出た場合は焦らず、予約語でエラーになったんだな。。。と思い出してください。
今回は以上です。
iPhone+iSH Shell+Rustで古いRustしか入らなかった時に最新バージョンにする方法

## 解決方法
忙しい人のために
```
iPhone:~# echo https://dl-cdn.alpinelinux.org/alpine/v3.19/main > /etc/apk/repositories
iPhone:~# echo https://dl-cdn.alpinelinux.org/alpine/v3.19/community >> /etc/apk/repositories
iPhone:~# apk upgrade cargo
# アップグレードが完了する
iPhone:~# cargo --version
cargo 1.72.1
# 最新バージョン
```

## きっかけ

**iPhoneしか使えない状況でもRustでWeb開発を学習したい！**

## 前提条件
- iPhone 13 Pro Max 128GB
- iSH Shell 1.3.2
- iOS 16.1.2
## 手順
1.rustをインストール
```
iPhone:~# apk add rust
# インストールが終わる
```

2.axumを入れようとする
```
iPhone:~# cargo add axum
error: no such subcommand: `add`

        Did you mean `b`?
```

cargo addが使えないという異変に気づく

3.cargoのバージョンを確認する
```
iPhone:~# cargo --version
cargo 1.52.0
```

> 2024/01/08 10:09 現在 
Alpine Linuxのパッケージ管理ツールapkにて
cargoを初めとしたrustの最新バージョンは1.72.1-r0
Alpine Linux packages

**バージョンが古い…**

## 解決方法
```
iPhone:~# echo https://dl-cdn.alpinelinux.org/alpine/v3.19/main > /etc/apk/repositories
iPhone:~# echo https://dl-cdn.alpinelinux.org/alpine/v3.19/community >> /etc/apk/repositories
iPhone:~# apk upgrade cargo
# アップグレードが完了する
iPhone:~# cargo --version
cargo 1.72.1
# 最新バージョン
```
【自分用メモ】Viewのサイズ指定に使っている数字をResourcesに移動する際に役立った記事

以下の２つの記事がViewのサイズ指定に使っている数字をResourcesに移動する際に役立った記事

# Is it possible to create a "dp" variable in xml?
https://stackoverflow.com/questions/51033561/is-it-possible-to-create-a-dp-variable-in-xml

上の記事で大体理解したが「dimens.xml」といったファイルをどこで作成すればいいのか分からなかったので調べてみたら以下の記事が役立った。

# dimens.xmlを使ってテキストサイズ指定 – Android
https://blog.shg25.com/?p=65

# 【以下関連動画】
dimensとは
https://youtu.be/be9fzb8AtHE?si=d-ZC2K8owcKs1HZU

dimen属性の設定方法
https://youtu.be/805D0BHjy0s?si=H4CQOP1wcPphjlnR

## 【注意点メモ】
dimensに文字列の指定はできない → 指定してしまうとエラーが発生する。
lambda(無名関数)

# lambda(無名関数)

## lambdaとは


lambdaを使うと関数定義を簡潔に表現することができます。

処理内容が少ない関数を実装したい時に便利です。

lambdaは関数作成方法のひとつで、無名関数とも呼ばれています。

defとlambdaの違いはdefは宣言文(ステートメント)であり、lambdaは式になります。

defを使う場合、事前に宣言が必要となりますが、lambdaは式ですので式として簡潔に表現できます。

## サンプルプログラム

```Python

y = lambda x: x+1
print(y(1))
```

## 実行結果

出力結果は以下の通りです。

lambdaにて、1+1を計算を行いました。

![スクリーンショット 2024-01-08 102904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/a3a1ff6a-f4c8-205b-dc3e-374eed089df0.png)


> 2
【Python】Djangoのログアウト実装でエラー「HTTP 405」が出た件について

## 発生した問題
事前に以下の通り記述した上で、home.htmlで`{% url 'logout' %}`としたところ、ログアウトされず代わりに *accounts/logout/* にリダイレクトされた。
```project/urls.py
path("accounts/", include("django.contrib.auth.urls")),
```

## 表示されたエラー
```
Method Not Allowed (GET): /accounts/logout/
Method Not Allowed: /accounts/logout/
[08/Jan/2024 00:17:08] "GET /accounts/logout/ HTTP/1.1" 405 0
```

## 原因
[こちら](https://terakoya.sejuku.net/question/detail/33882)で回答されている通り、本来はPOSTでなければいけないところ、GETしていたため弾かれていた。

よってhtmlの`form`を使用して、以下のように記述することで解決できた。
```home.html
<form action='{% url "logout" %}' method='post' name='logout'>
    {% csrf_token %}
    <a href="javascript:logout.submit()">Logout</a>
</form>
```

参考：
・[ログアウトボタンをクリックするとエラー](https://terakoya.sejuku.net/question/detail/33882)
・[HTMLのAタグでPOSTする方法](https://qiita.com/next1ka2u/items/9736ce2f9c7f3aa69d61)
Gigaスイッチの修理

ハードオフで買って来たロジテックのGigaの8ポートスイッチ(LAN-GSW08P/P)が寒くなると電源を入れても立ち上がらなくなるので修理してみました。

電源ケーブルなし、ゴム足が一つ欠損で324円だったと思います。

インターネットの接続がない開発用のネットワークで利用しています。使う時だけ電源を入れています。

通常は電源を入れると、一番左のパワーのインジケーターが点灯して全ポートのインジケーターが点滅して、リンクがあるポートの点灯に変わります。ところが室温が10度を下回ると電源を入れてもパワーのインジケーターは点灯しますが、ポートのインジケーターが点滅せず立ち上がらなくなります。10分位すると立ち上がる事もあるのですが、とっても不便なので分解してみました。

![IMG_20240108_073948(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/27aab809-c343-c5b6-4bcb-9b5f6ad3d618.jpeg)

ヒートシンクで見えませんが、このスイッチはVitesseのVSC7388を使ったものと思われます。EPROMに0741の記し、ETHERのトランスに0812の記しがあるので、2008年くらいに製造されたものと思われます。スイッチ側のコンデンサーはJACKCON製です。

初期のGigaのスイッチなのでチップも大きいですし、発熱も大きいようです。

電源ユニットに5V2Aとあり、ちょうど5V3Aのアダプタがあったので、電源ユニットを外してアダプタで起動するか確認したところ、早朝の4度くらいの時間でも問題なく起動したので、電源ユニットの問題のようです。

電源ユニットはとくにコンデンサーの液漏れ等の問題はないようですが、故障原因を調べるのも大変なので、アダプタで使うことにして、DCジャックのパターンにコネクタを付けてケースを削って使うことにしました。おそらくアダプタの製品と共通基板なのだと思われます。

![写真（2024-01-09 10.13）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d38b1b9e-a35b-e735-f8e3-01d7130e30f7.jpeg)

ケースがプラスチックで、ネジのポストが割れていたので、エポキシで補修しておきました。

今回の故障は電源ユニットの部品が劣化した可能性が高いです。通常の部品は-10度くらいから動作範囲ですが、あまり寒いところで突然電源を入れると、はんだのクラックが起きる可能性もあり、できるだけ寒いところでは使わないほうが良いかもしれません。

ルーターやスイッチなどの故障は電源部分が一番多いと思います。
ESModuleとCommonJSについてまとめてみた

# 背景
現在開発しているPJはフロントエンドをAngular、バックエンドをNode.jsで実装している。Node.jsはTypeScriptで実装している。まだ勉強中の身なので環境構築時には意識したことがなかったが、同じTypeScriptなのにモジュールをインポートしたりエクスポートする際の記述の方法が異なっていたので気になって調べたところ、ESModulesとCommonJSというものに出会ったので、理解を整理するためにまとめる。

# ESMoudlesとCommonJSの違い
それぞれの違いについてまとめる。
## 構文の違い
以下のような書き方の違いがある。

### ESModules
```typescript
// モジュールのエクスポート
// moduleA.mjs
export const add = (a, b) => a + b;

// モジュールのインポート
// main.mjs
import { add } from './moduleA.mjs';
console.log(add(3, 5)); // 8
```

### CommonJS
```typescript
// モジュールのエクスポート
// moduleA.js
const add = (a, b) => a + b;
module.exports = add;

// モジュールのインポート
// main.js
const addFunction = require('./moduleA.js');
console.log(addFunction(3, 5)); // 8
```


## 実行環境
### ESModules
ブラウザやNode.jsの新しいバージョンではサポートされている。以下のサイトでブラウザごとの対応状況を確認できる。

https://caniuse.com/es6-module

### CommonJS
　Node.jsではデフォルトで採用されているが、ブラウザではサポートされていない。ただ、Node.js上で動作するテンプレートエンジン（ejsやpugなど）を使用すればもちろんビューを作成し、ブラウザ上で動作させることが可能である。

## モジュールの読み込み
### ESModules
非同期でモジュールを読み込む。アプリケーションのパフォーマンス向上につながる。

### CommonJS
同期的にモジュールを読み込む。そのため、複数のモジュールの読み込みが並行して行われることはなく、１つずつ順番に読み込まれる。

## 静的解析ができるか
### ESModules
静的解析が可能。そのため、モジュールのパスに誤りなどがあれば、コンパイル時に指摘することが可能。

### CommonJS
静的解析が不可能。

# なぜ二つが存在するのか
そもそもなぜこのように２つのモジュールが存在するのか。これを理解するにはJavaScriptにおけるモジュールシステムの歴史を学ぶ必要がある。こちらで詳しく書かれているので、詳細は以下の記事に任せる。

https://github.com/yytypescript/book/issues/527




# ESModulesとCommonJSの統合
ESModulesとCommonJSが混同したPJの場合、フロントを実装する時とバックを実装するときで記述方法が異なったりするので、個人的にはどちらかに統一したいと思った。ここまで書いてきた通り、ESModulesの方が静的解析が可能だったり、Node.jsもESModulesをサポートし始めたことから潮流はESModulesに来ている。

Angularなどのフロントエンドフレームワーク、最新のNode.jsに関してはデフォルトでESModulesなので気にする必要はないが、古いバージョンのNode.jsを使用する場合には、以下のような手順でコンバージョンする必要がある。

引用元
https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-move-my-commonjs-project-to-esm



以下Google翻訳
>CommonJS プロジェクトを ESM に移動するにはどうすればよいですか?
x"type": "module"package.json に追加します。
package.json 内"main": "index.js"の に置き換えます。"exports": "./index.js"
"engines"package.json のフィールドを Node.js 16: に更新します"node": ">=16"。
'use strict';すべての JavaScript ファイルから削除します。
require()すべての/を/module.exportに置き換えます。importexport
インポートには完全な相対ファイル パスのみを使用します: import x from '.';→ import x from './index.js';。
TypeScript 型定義 (たとえば、index.d.ts) がある場合は、ESM インポート/エクスポートを使用するようにそれを更新します。
Node.js 組み込みインポートのnode:プロトコルを使用します。 



これを見た感想としては、
- requireをimport fromに書き換えたり、module.exportsの書き換えが重い。
- CommonJSではモジュールのパスを拡張子まで含めて書いていないと思うので、相対パスで拡張子まで含めて書くのはとても重い。
- 依存パッケージがESModulesをサポートしている必要があるので、それの確認が重い。

実際にESModulesに移行している記事を調べてみるとこれ以外にもいろんな障壁があるらしい。

https://www.wantedly.com/companies/wantedly/post_articles/410531

https://efcl.info/2023/07/05/convert-to-esm/

https://www.memory-lovers.blog/entry/2022/05/31/110000

PJの規模にもよるだろうが、移行するのはめっちゃしんどそうというのが、個人的な感想である。1から作るときはNode.jsで最初からESModulesを使おうと思った。



# 参考

 https://zenn.dev/yodaka/articles/596f441acf1cf3
Udemy講座クーポンコードの発行（2024年1月分）と新コースリリースに向けた告知

### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また [「マスタリング Java EE 5」](https://amzn.asia/d/j0txqK5)や[「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)といった書籍も執筆しています。

### Udemy講座のご紹介とクーポンコード（2024年1月末まで）

現在私が講師を務めるUdemy講座には、以下のラインアップがあります。
これらのコースは、**Udedmyセールス対象外のためタイミングを気にすることなく購入可能**です。また以下のリンクから購入いただくと、クーポンが適用されたことになり、定価の**約30%OFF**で購入することができます。
|コース名|リリース|定価|クーポン適用後価格|2024年1月末まで使えるクーポンリンク|
|--|--|--|--|--|
|**『Java Basic編』**|2023年6月リリース済|4,200円|3,000円|https://www.udemy.com/course/learn-java-se-basic/?couponCode=CB041DCAC1B97DBDFAF6|
|**『Java Advanced編』**|2023年9月リリース済|3,600円|2,500円|https://www.udemy.com/course/learn-java-se-advanced/?couponCode=563652618551A4E9A81D|
|**『Java 初学者向け演習＆解説XX問』**|**COMING SOON**|2,400円|||
|**『Java 演習＆解説XX問』**|**COMING SOON**|4,200円|||
|**『Java テスト基礎＆実践』**|2024年前半リリース予定|未定|||
|**『SpringBoot基礎＆実践』**|2024年前半リリース予定|未定|||
|**『Java DBアクセス入門』**|2024年後半リリース予定|未定|||

なお上記クーポンは期限が切れ次第、定期的に発行し、都度別のQiita記事として投稿する予定です。ぜひご活用いただけると幸いです。

ちなみに、次回作はもともとの予定は『Java テスト基礎＆実践』だったのですが、少し予定を変更して、演習問題を扱ったコースを出すことに決めました。それが『**Java 初学者向け演習＆解説XX問**』（仮）と『**Java 演習＆解説XX問**』（仮）で、2月前半くらいのリリースを目標にしています。
このコースはVS Code上でJavaの演習問題を解いてもらうコースです。ダウンロードした環境を開くと、**生成AI（Open AI）が講師として、受講生のコードに対して、個別に指導（ヒントや採点）をしてくれるという、画期的？かもしれない新システム**の導入に挑戦しています。

AI講師も選べるようになっていて、デフォルトの他、辛口の鬼軍曹タイプ、身近な優しい先輩タイプ、そしてアニメキャラクター風（今のところは孫悟空、リヴァイ、アーニャあたりかな）に指導してくれるタイプを用意しています。

「楽しみながら学ぶ」をコンセプトに新しいタイプの動画をリリースしたいと考えていますので、ぜひよろしくお願いいたします。
SAP on AWS - Specialty

## SAP サービス

### SAP Selective Data Transition (SDT)
SDT（Selective Data Transition）は、移行工程そのものを「初期移行」と「差分データ移行」に分割することにより、移行ボリュームの調整が可能です。
すなわち、任意のデータを自由にS/4HANAへ移行することが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/b2ce47ff-be17-1724-aa6e-627936f9bfab.png)

### SAP Data Management and Landscape Transformation
- データ移行サービス – Transition into the Intelligent Enterprise
- データマネジメントサービス – Data Management
- システムランドスケープオプティマイゼーションサービス – System Landscape Optimization for the Intelligent Enterprise

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/df8b8989-6863-9688-495c-484299e7be85.png)

### SAP NetWeaver Architecture
**SAP NetWeaverは**、ドイツのソフトウェア企業SAP SE社が提供する**アプリケーション実行環境**や開発・運用支援機能を有する複数のソフトウェアコンポーネントから成る**統合ミドルウェア製品**である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/851d5da4-b4aa-bdf1-cf3b-61a8c157812d.png)

## AWS サービス
### AWS Backint Agent
**AWS Backint Agent for SAP HANA** is an **backup and restore solution** for SAP HANA workloads running **on Amazon EC2 instances**. AWS Backint Agent backs up your SAP HANA database to **Amazon S3** and **restores it using SAP management tools**, such as **SAP HANA Cockpit**, **SAP HANA Studio**, or SQL commands. AWS Backint Agent **supports full, incremental, differential, and log backup** of SAP HANA databases and catalogs to Amazon S3. There is **no cost** to use AWS Backint Agent. You only pay for the underlying AWS services you use. AWS Backint Agent for SAP HANA is available in all commercial regions.
Python3: SMTP over SSL でメールの送信

こちらのプログラムを改造しました。
[Python3: Starttls でメールの送信](https://qiita.com/ekzemplaro/items/c248b52a6f36947af080)

```py:mail_send.py
#! /usr/bin/python
#
#	mail_send.py
#
#						Jan/08/2024	
# --------------------------------------------------------------------
import	os
import	sys
import	socket
from dotenv import load_dotenv
import	email
from email.mime.text import MIMEText
from email.utils import formatdate
# --------------------------------------------------------------------
from send_smtp_ssl import send_smtp_ssl_proc
# --------------------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
dotenv_path = '.env'
load_dotenv(dotenv_path)
mail = {}
mail['server'] = os.environ.get("SERVER")
mail['port'] = os.environ.get("PORT")
mail['usr'] = os.environ.get("USR")
mail['password'] = os.environ.get("PASSWORD")
mail['from'] = os.environ.get("FROM")
mail['to'] = os.environ.get("TO")


contents = 'Hello, Good Afternoon!\n'
contents += 'Jan/08/2024 AM 09:38\n'
contents += 'こんにちは。\n'
contents += ' ' + socket.gethostname ()

message = MIMEText (
	contents,
	'plain',
)

message['Subject'] = 'Hello Jan/08/2024 AM 09:39'
message['From'] = mail['from']
message['To'] = mail['to']
message['Date'] = formatdate ()

send_smtp_ssl_proc (mail,message)
#
sys.stderr.write ("*** 終了 ***\n")
# --------------------------------------------------------------------
```

```py:send_smtp_ssl.py
# -*- coding: utf-8 -*-
#
#	send_smtp_ssl.py
#
#						Jan/08/2024
# --------------------------------------------------------------------
import	sys
import	smtplib
# --------------------------------------------------------------------
# [6-4]:
def send_smtp_ssl_proc (mail,message):
	sys.stderr.write("*** send_smtp_ssl *** start ***\n")
	ss = smtplib.SMTP_SSL (mail['server'],mail['port'])
	ss.ehlo ()
	ss.login (mail['usr'],mail['password'])
	ss.sendmail (
		mail['from'],
		[mail['to']],
		message.as_string (),
		)
	ss.close ()
#
	sys.stderr.write("*** send_smtp_ssl *** end ***\n")
# --------------------------------------------------------------------
```

```text:.env
SERVER = 'mail.aaaa.co.jp'
PORT = 465
USR = '****@aaaa.co.jp'
PASSWORD = '****'
FROM = '****@aaaa.co.jp'
TO = 'sample@example.com'
```

## 実行結果
$ ./mail_send.py
```text
*** 開始 ***
*** send_smtp_ssl *** start ***
*** send_smtp_ssl *** end ***
*** 終了 ***
```

## 確認したバージョン

```text
$ python --version
Python 3.11.6
```
Djangoでmailgunを使う方法

## 正直お勧めしません

高いし、最低プランで5万通なので。amazon sesとかのほうがいいと思います(無料枠あるし。でも僕は承認されなかった)。mailgunも何かすごい部分があるのかもしれませんが..

## 設定ファイル settings.py

settings.pyで設定  
env()はdjango-environです。共有するときに、見られたらいけないapi keyとかを別ファイルに書ける。gitignoreでそのファイルをgitから除外するとgithubとかで公開されない。

```plaintext
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.mailgun.org'  # MailgunのSMTPホスト
EMAIL_PORT = 587  # SMTPポート
EMAIL_USE_TLS = True
EMAIL_HOST_USER = env('EMAIL_HOST_USER') # postmaster@.... みたいなやつ 認証してないならpostmaster@sandbox...mailgun.orgみたいな
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')  # MailgunのAPIキーかsmtpのパスワード
DEFAULT_FROM_EMAIL = 'email@infolink.dev'  # 送信元メールアドレス
```

## API

API keyは右上の自分のアカウントのドロップダウンメニューから api securityに行って、Mailgun API keysの add new keyからkeyを作成。

その時しかkeyはひょうじされないので、メモするか今すぐコードに書こう。忘れたら、新しいapi keyを作って、それを使う。

## smtp

別に隠さなくてもいいと思うけど、一応。

![](https://imagedelivery.net/ALdh-1ld8A9HsDPjM3sMHw/3/public)

sendingからdomain settingsへ行って、画像のように。  
reset passwordで新しいkeyを取得。  
 

# smtpとapiの違い

smtpはアドレスごとで、apiはすべてのアドレスで使える。

# サンドボックス環境から抜け出す

サンドボックス環境だと、自分のアカウントのメールアドレスにしか送れません。  
送れるようにするには、独自ドメインとそれを認証しなければならない。

さっきの画像のdomainsで、add new domainでmg.yourdomainを入力。僕の場合、mg.infolink.dev。  
サブドメインのほうがいいと言われたけど、なんでなのかはわからないです。

そのドメインをクリックして、使ってるレジストラーでtxtレコードなどを入力するだけ。どうすればいいかは書いてあるので、それに従ってレコードを追加してください。

domainsを押して、チェックマークがついていれば使えます。

# infolinkで、間違った情報を知る
infolink.devを使えば、間違いが指摘されたときに通知を受け取れます

infolink.devの詳細
https://zenn.dev/pandakun/articles/dc4886a996cb98