OmniAICreator/Qiita-1.07M huggingface dataset:
AWS ECR, ECS, Fargateの概要

私は未経験でエンジニア転職を目指している31歳のいしかわです
とあることをきっかけに**AWS Certified Cloud Practitioner**を試験を受けようと思い現在学習中です
参考にしているもの書籍は[定番の緑本](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-%EF%BC%A1%EF%BC%B7%EF%BC%B3%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4815625387/ref=sr_1_1?adgrpid=130693345170&dib=eyJ2IjoiMSJ9.ygZu6Xz0Bm1Z3QUhkWhB4RBDj-Zl24XNLgPPVCoSDG4DhA7C6LXxCIPStNkPISsMXNMzA9Xgq7r9ywerU_k4AtIlq2ArAzUEVMiunWZGtONon6xQCQblXq0Alfp0YRpN6bTP3jNw6KA_t6baKeEnwDMfnZmKm0qtbLbO_sS5P10i8zd8mysXRdpmJyqC8CCRAjV4juiJXyt5_mrxwKNBisCuN5fJtNATrlkKVtxajB7N6YLhlvTU7QOIZarNBI0p5pJR728zmrCYfkcgIYJae-qkdHxkpOIiJfAQdk-e0os.W9sa8zg6tYt_EX1hFOpMdsv5ScBP5OkRQ5_qJ57oFIw&dib_tag=se&hvadid=678998124409&hvdev=c&hvlocphy=1009311&hvnetw=g&hvqmt=e&hvrand=10316939294139200301&hvtargid=kwd-1647616784070&hydadcr=1796_13657004&jp-ad-ap=0&keywords=%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC+%E5%8F%82%E8%80%83%E6%9B%B8&qid=1718640348&sr=8-1)です
学習したことを少しずつアウトプットしていければと思います。
できれば学習しながら関連する技術やワードのについて、適宜修正、追記していきたいと思います。

:::note warn
プログラミング、AWSともに初学者なので内容や理解に誤りがある可能性があります
誤りがありましたら教えてくださると幸いです
:::

# ECR
`Elastic container registry`の略  
コンテナレジストリのマネージドサービス。サーバーの管理やアベイラリティゾーンを意識することなく**リージョン**で使用できる
コンテナイメージを保存するリポジトリを**レジストリ**と呼ぶ。

# ECS
`Elastic container Service`の略 
AWSでDockerコンテナのデプロイや管理運営を行うための、フルマネージドなコンテナオーケストレーションサービス   
※オーケストレーションサービス：コンピュータシステムやソフトウェア、サービスの構築における、設定、管理、調整の「自動化」の意味   
ECS自体はコンテナの実行環境ではなく、あくまでコンテナが正常に稼働するサポートをするサービス   
ECSで実行されるコンテナを**タスク**と呼ぶ   
ユーザーはEC2インスタンスをプロビジョニングして、クラスターとして管理する   
※クラスター：実行環境やIAM権限の境界線。クラスターの中には複数のコンテナが格納されている。  

### なぜコンテナオーケストレーションサービスを使用するのか
コンテナは「1コンテナに1プロセスだけを起動させる」というベストプラクティスがある。しかしその場合、ホストOSでなんらかの障害が起きてしまった場合、その影響がその中で動作しているコンテナ全体に行き渡る    
コンテナオーケストレーションを使用し、本番環境でコンテナを動かす場合、一部のコンテナが停止しても提供しているサービスが停止しないように、可用性や冗長性を考慮して複数コンテナを複数サーバーに分散させておくことが安全  
しかし、複数のコンテナの管理、運営を行うこと自体が今度は大変になってしまう  
そんなときにコンテナオーケストレーションサービスを使用することで、複数のコンテナの運用を自動化することができる    

# Fargate
AWSのコンテナサービスはコンテナを管理する**コントロールプレーン**と、コンテナを動かすための実行環境である**データプレーン**の2つで構成されている
ECSはコントールプレーンの1つ   
AWSにおいてコンテナが稼働するリソース環境は2つある  
* EC2
インスタンスを管理する必要がある。インスタンスを柔軟に設定/調整することができる
* **Fargate**
サーバーレスコンテナ実行環境で**インスタンスの管理が不要**→管理者はインスタンスの管理から解放される 

### まとめ
複数のDockerイメージをそれぞれECRに保存   
それらの管理を行うためにオーケストレーションサービスであるECSを使用することで、管理運用を自動化することができる   
ECSを実行するための環境はEC2もしくはFargate   
EC2であればインスタンスの管理をしなければならないが、その分細やかな調整をすることも可能   
Fargateであればサーバーレスコンテナ実行環境のため、EC2は不要となりメンテナンスやスケーリングをする必要がなくなる  
そしてこれらのコンテナ群のことをECSを用いてオーケストレーションしている場合、タスクと呼ぶ


# 参考記事
[AWS ECR ECS Fargateについてまとめてみた](https://qiita.com/devactken/items/59eb6ade02d11c9f74ec)
[今さら聞けないAWS ECSとは？Fargateとは？](https://qiita.com/K5K/items/0d8dbdb39fbb0375e2bd)
[https://baresupport.jp/blog/2023/09/05/223/](https://baresupport.jp/blog/2023/09/05/223/)
日付項目を元に%をSalesforceで出す方法

本橋孝昭です

date1__c項目が空欄ではないレコード数を表示し、
なおかつdate1__c項目が空欄ではないレコード中からdate2__c項目に記載されている%を表示する方法を示します
なお、date1__c項目　date2__c項目ともに日付型項目とします


## ステップ1 まずはレポート絞り込み

date1__c項目が空欄ではないレコード　をレポートで表示させましょう
レポートの絞り込みで完了です

画像1（ゴール）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/09a68e88-33fe-27ed-9e80-755d4e7f654f.png)

## ステップ2 　行レベルの数式作成

行レベルの数式を作成します
画像2
数式
IF(ISBLANK(Opportunity.date2__c),0,1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6a2b8525-a347-f0b8-174a-86d62a643fa2.png)

## ステップ3 集計項目作成

レポート内に集計項目を作成します

画像3
数式
CDF1:SUM/RowCount
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d95ec668-cb08-076f-6185-5fe1c3056c76.png)


そうすればこのようなグラフ図が出ますので
・レコード件数
・%
表示が可能です

画像4
レポートグラフイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c05d5c2a-cff5-672b-841e-adbfed147737.png)
C_TS4FI_2021 SAP Certified Associate - SAP S/4HANA 2021 for Financial Accounting対策（1/100）

FI領域（財務会計）の出題が予想される過去問を紹介いたします。
試験概要は下記のリンクに掲載されています。

【試験概要】
https://training.sap.com/certification/c_ts4fi_2021-sap-certified-associate---sap-s4hana-2021-for-financial-accounting-g/

【1日目】
トピック 1：組織割当およびプロセス統合（1/15）

≪問題1≫
あなたは国際的な企業を経営しており、事業運営と会計活動のために、個別の法人を設立する必要があります。
法人ごとに設定する必要のある組織ユニットは何ですか。
□会社コード
□会社
□セグメント
□連結単位

≪解答≫
■会社コード
□会社
□セグメント
□連結単位

≪解説≫
◆会社コードは、企業グループ内で独立した法人などの法的会計管理を行う単位を示します。法的に求められる財務諸表は、会社コードレベルで作成されます。
◆会社（＝連結会社：6桁コード）は、連結決算の単位となる企業グループを示します。会社には複数の会社コードを割り当てることが可能です。
Javaの値型(基本データ型、プリミティブ型)と参照型(オブジェクト型)の違い

# 値型(プリミティブ型、基本データ型)と、参照型(オブジェクト型)の違い

|  | <font color="Red">値型(プリミティブ型)<br>基本データ型</font>| <font color="Red">参照型<br>(オブジェクト型)</font> |
| ---- | ---- | ---- |
| 型 | intとか | Integerとか |
| 頭文字 | 小文字 | 大文字 |
| 特徴 | ・変数に「値」そのものを持つ<br/>・変数のサイズ(bit)が決まっている<br/>　・既定サイズを超える値を格納することはできない<br/> 　・適切な型を使わないと無駄にメモリを使う<br/>・何のメソッドも持たない<br/> (「int.メソッド名」とかのドット演算子でメソッドを呼び出せない)<br/>・オブジェクトではなく単なる値|・変数には「値」そのものではなく、値がメモリのどこに格納されているかを示す「参照値」が格納される |

※基本データ型＝値型(プリミティブ型)
　↑言い方が違うだけで同じもの

# ラッパークラス(wrapper class、プリミティブラッパークラス)
値型(プリミティブ型)の特徴に
> 何のメソッドも持たない
オブジェクトではなく単なる値

があった
**しかし**
プログラムの中では値型(プリミティブ型)の値に対する操作(文字列との相互変換など)が必要になる場面がたくさんあり、このままだと困るヽ(´Д｀; ≡ ;´Д｀)丿ｵﾛｵﾛ

＿人人人人人人＿
＞　 そこで 　＜
￣Y^Y^Y^Y^Y￣

 Javaは値型(プリミティブ型)の補助的な役割として<font color="Red"><INS>値をオブジェクトとして扱えるように、ラッパークラスを用意している</INS></font>
↓こうゆうやつ
`Integer.valueOf(int i); // 指定されたint型を表すIntegerクラスのインスタンスを返す`

表1 プリミティブ型と対応するラッパークラス
|値型(プリミティブ型)|ラッパークラス|
| ---- | ---- |
|byte| java.lang.Byte|
|short| java.lang.Short|
|int| java.lang.Integer|
|long| java.lang.Long|
|char| java.lang.Character|
|float| java.lang.Float|
|double| java.lang.Double|
|boolean| java.lang.Boolean|

<details>
  <summary>meが間違えたこと</summary>
    誤：ラッパークラスは、オブジェクト型を定義している<br>
    正：ラッパークラスは、参照型(オブジェクト型)に分類される<br>
    　　値型(プリミティブ型)の進化系クラス
</details>

# 値型と参照型を実装で見てみると
以下の①②③は同じ意味

①`Integer test = 1; // 「1」はたぶんint型`
↑ ・String型はコレ
　・コンストラクタを使ってインスタンスの作成をしているの(←②の書き方)と同じことをしている
②`Integer test = new Integer(1); // コンストラクタを使ってインスタンスの作成をしている`
↑このコンストラクタを使って宣言をする方法は、Java9から非推奨となり、静的メソッド(←③の書き方)を使うことが推奨されている
    ③`Integer test = Integer.valueOf(1); // 静的メソッド、「1」はint型`
↑静的メソッド＝newでインスタンスを作らなくても使える

 # 参考資料

https://freelance-jak.com/technology/java/1175/


 https://docs.oracle.com/javase/jp/9/docs/api/java/lang/Integer.html
 
 ↓ 
 > コンストラクタ
 Integer​(int value)
 非推奨。 
このコンストラクタを使用することはめったに適切ではありません。 静的ファクトリvalueOf(int)は、より良い選択肢です。スペースと時間のパフォーマンスが大幅に向上する可能性が高いためです。

Java本格入門
～モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで
谷本心，阪本雄一郎，岡田拓也，秋葉誠，村田賢一郎　著、Acroquest Technology株式会社　監修
68、69頁
Dockerを使ってローカル開発環境を簡単に構築する方法

# はじめに
Githubリポジトリにアップロードされているdockerfileを使って、ローカル環境で環境構築をするまでの手順をまとめます

以下は手順です
1. リポジトリのクローン
1. ディレクトリの移動
1. Dockerイメージのビルド
1. Dockerコンテナの起動
1. Dockerの終了

# 1. リポジトリのクローン
Githubリポジトリをローカル環境にクローンします。
```terminal
git clone https://github.com/your-repo-url.git
```
※`your-repo-url`を実際のリポジトリURLに置き換えてください

# 2. ディレクトリの移動
クローンしたリポジトリのディレクトリに移動
```terminal
cd your-repo-directory
```
※クローンする際にディレクトリ名を指定しない場合、GitHubのリポジトリ名がローカルディレクトリの名前になります。`ls`コマンドを用いて確認してください。

# 3. Dockerイメージのビルド
`開発用dockerfile`ディレクトリ内のDockerfileを使ってDockerイメージをビルドします。

```terminal
docker build -t chatbot-dev -f 開発用dockerfile/Dockerfile .
```

なおDockerイメージのビルドとは、Dockerfileに記述された指示に従って、必要なソフトウェア、ライブラリ、設定ファイルを含むコンテナイメージを作成するプロセスです。このイメージは、後でコンテナを起動するときに使用されます。

|コマンドラインオプション|説明|
|--|--|
|`-t chatbot-dev`|作成するイメージに`chatbot-dev`という名前（タグ）を付けています|
|`-f 開発用dockerfile/Dockerfile`|Dockerfileの場所を指定します。|
|`.`| 現在のディレクトリをコンテキストとして使用します（ソースコードや設定ファイルが存在するディレクトリ）|

# 4. Dockerコンテナの起動
作成したコンテナイメージを使って、コンテナの作成~起動をします。

```terminal
docker run -it --rm --name my-container-name my-image-name bash
```

|コマンドラインオプション|説明|
|--|--|
|`-it`|インタラクティブモードで仮想端末を使用します|
|`--rm`|コンテナが停止したときに自動的に削除します|
|`--name my-container-name`|コンテナに my-container-name という名前を付けます|
|`my-image-name`|使用するイメージの名前です|
|`bash`|コンテナが起動した後に実行するコマンドです。この場合、bash シェルを起動します|

# 5. Dockerの終了
Dockerコンテナの使用を終了するには、コンテナ内のターミナルで`exit`コマンドを入力します。これによりコンテナが停止し、自動的に削除されます（`--rm`オプションによる）。

```terminal
exit
```

# おまけ：Dockerコンテナの起動・終了を確認する方法
- 起動の確認
    - `docker ps`: 実行中のコンテナを確認
- 終了の確認
    - `docker ps -a`: 終了したコンテナも含めたすべてのコンテナを確認
ABC359振り返り

[前回の振り返り](https://qiita.com/comet725/items/fd87e44bd630fa156fe8)

今日はABC開催日だったので参加した結果を適当に振り返る
https://atcoder.jp/contests/abc359

結果はAB2完の大☆玉☆砕
- ちくせう😢 

前回4完できたのはたまたまDが簡単だったからみたい
なんとABC358D 灰diffだったそうで

感想をまとめる

# A

ただの数え上げ
- 速攻で解いた

```python
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    cnt = 0
    for i in range(N):
        S = rS()
        if S == "Takahashi":
            cnt+=1
    print(cnt)
if __name__ == '__main__':
    main()
```

# B
それぞれの色の位置の差が2になる数を探す、
これにきづくまでに5,6分のロス

```python
from collections import Counter, defaultdict
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    A = rLI()
    
    d = defaultdict(lambda: -1)
    cnt = 0
    for i,a in enumerate(A):
        if d[a] == -1:
            d[a] = i
        else:
            if i - d[a] == 2:
                cnt += 1
    print(cnt) 
    
    
if __name__ == '__main__':
    main()
```

# C

こういう座標系的な問題でると拒絶反応ができて困る

縦のコストは絶対かかるとして横のコストがわからなくて詰んだ。
なので以下は解説観てといたやつ

```python
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    x0,y0 = rLI()
    xt,yt = rLI()
    
    x0 -= (y0-x0)%2
    xt -= (yt-xt)%2
    
    distx = abs(xt-x0)
    disty = abs(yt-y0)
    cost = disty + (max(0,distx-disty)//2)
    
    print(cost)
if __name__ == '__main__':
    main()

```


# D

難しそうでパスしたけどDP問題だったっていう
- これやればよかったorz

ほとんど解説からコピったけど一応ACしときました
https://atcoder.jp/contests/abc359/submissions/54854492

# E

累積和的なもの？と勘違いして行けるかもとおもって沼った
セグ木使おうとしたけどうまくいかなくて時間切れ。
- しかも遅延セグ木じゃないと行けなかったという

というかスタックでよかったらしい

# F,G

木がどうのこうのって見えた時点でそっ閉じ

# まとめ
Cがむずくて撃沈
そしてDはDPでいけるのが分からなかった
E以降は実力不足

引き続き精進します
parted

`parted`は、Linuxでディスクパーティションを操作するための強力なツールです。`parted`を使用することで、パーティションの作成、削除、サイズ変更、コピーなどができます。以下に、`parted`の基本的な使い方と一般的な操作の例を示します。

### 基本的な使用方法

#### インタラクティブモードで`parted`を起動

```sh
sudo parted /dev/sda
```

#### 非インタラクティブモードで`parted`を使用

```sh
sudo parted /dev/sda mklabel gpt
sudo parted /dev/sda mkpart primary ext4 1MiB 100%
```

### 一般的な操作

#### パーティションテーブルの作成

新しいディスクにパーティションテーブルを作成します。`msdos`（MBR）または`gpt`（GPT）を指定します。

```sh
sudo parted /dev/sda mklabel gpt
```

#### パーティションの作成

新しいパーティションを作成します。ここでは、1 MiBから100%までの範囲で`ext4`ファイルシステムを持つパーティションを作成します。

```sh
sudo parted /dev/sda mkpart primary ext4 1MiB 100%
```

#### パーティションの表示

ディスク上のパーティションのリストを表示します。

```sh
sudo parted /dev/sda print
```

#### パーティションの削除

特定のパーティションを削除します。ここでは、2番目のパーティションを削除します。

```sh
sudo parted /dev/sda rm 2
```

#### パーティションのサイズ変更

特定のパーティションのサイズを変更します。ここでは、2番目のパーティションをサイズ変更します。

```sh
sudo parted /dev/sda resizepart 2 200GiB
```

#### ファイルシステムのチェックと修復

`parted`自体にはファイルシステムのチェック機能はありませんが、`e2fsck`などの外部ツールを使用してファイルシステムをチェックします。

```sh
sudo e2fsck -f /dev/sda1
```

### インタラクティブモードでの操作

インタラクティブモードで`parted`を起動すると、`parted`プロンプトが表示され、そこからコマンドを実行できます。

```sh
sudo parted /dev/sda
```

以下は、インタラクティブモードでの基本的な操作例です。

#### パーティションテーブルの作成

```sh
(parted) mklabel gpt
```

#### パーティションの作成

```sh
(parted) mkpart primary ext4 1MiB 100%
```

#### パーティションの表示

```sh
(parted) print
```

#### パーティションの削除

```sh
(parted) rm 2
```

#### パーティションのサイズ変更

```sh
(parted) resizepart 2 200GiB
```

#### 終了

```sh
(parted) quit
```

### 注意事項

- `parted`を使用する際には、誤ってデータを消去しないように注意が必要です。特に既存のパーティションやデータを操作する場合は、事前にバックアップを取ることを強くお勧めします。
- GPTパーティションテーブルを使用する場合は、`gdisk`などのツールも併用すると便利です。

### まとめ

`parted`は、ディスクパーティションの作成、管理、修正を行うための強力なツールです。基本的なコマンドを理解し、正しく使用することで、ディスクのパーティション管理を効率的に行うことができます。
lsblkメモ

`lsblk`コマンドは、Linuxでブロックデバイスの情報を表示するために使用されます。ブロックデバイスには、ハードディスクドライブ、ソリッドステートドライブ、CD/DVDドライブなどが含まれます。このコマンドは、ディスクのパーティション構造やマウントポイントなどの詳細情報を視覚的に表示します。

### 基本的な使用方法

```sh
lsblk
```

このコマンドを実行すると、システム内のすべてのブロックデバイスのリストが表示されます。

### 主なオプション

- `-a` : すべてのデバイスを表示（デフォルトでは除外される空のデバイスも表示）。
- `-f` : ファイルシステム情報を表示。
- `-l` : リスト形式で表示。
- `-m` : アクセス権情報を表示。
- `-n` : ヘッダーを表示しない。
- `-o` : 出力するカラムを指定。
- `-p` : デバイス名を完全なパスで表示。
- `-r` : リードオンリーモードでデバイス情報を表示。
- `-t` : ツリー形式で表示（デフォルト）。
- `-u` : サイズの単位を指定（b, k, m, g, t, p, e）。
- `-x` : ソートキーを指定して出力をソート。

### 例

1. **基本的なブロックデバイス情報の表示**

    ```sh
    lsblk
    ```

    出力例：

    ```sh
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  100G  0 disk
    ├─sda1   8:1    0   50G  0 part /
    ├─sda2   8:2    0   49G  0 part /home
    └─sda3   8:3    0    1G  0 part [SWAP]
    sdb      8:16   0  200G  0 disk
    ├─sdb1   8:17   0  100G  0 part /mnt/data1
    └─sdb2   8:18   0  100G  0 part /mnt/data2
    ```

2. **ファイルシステム情報を表示**

    ```sh
    lsblk -f
    ```

    出力例：

    ```sh
    NAME   FSTYPE LABEL  UUID                                 MOUNTPOINT
    sda
    ├─sda1 ext4          d3b07384-d5d4-4e5b-8ec3-8d9e4f5b6d3b /
    ├─sda2 ext4          27d3c48e-7e1e-4c9f-8ec3-7f0d5b2e6d5c /home
    └─sda3 swap          5b5d60d4-9d4d-4e6e-8ec3-8d9e4f5b6d3d [SWAP]
    sdb
    ├─sdb1 ext4          87b3e482-5d5d-4e5b-8ec3-8d9e4f5b6d3e /mnt/data1
    └─sdb2 ext4          9e3d7482-9d4d-4e6e-8ec3-8d9e4f5b6d3f /mnt/data2
    ```

3. **リスト形式で表示**

    ```sh
    lsblk -l
    ```

    出力例：

    ```sh
    NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda     8:0    0  100G  0 disk
    sda1    8:1    0   50G  0 part /
    sda2    8:2    0   49G  0 part /home
    sda3    8:3    0    1G  0 part [SWAP]
    sdb     8:16   0  200G  0 disk
    sdb1    8:17   0  100G  0 part /mnt/data1
    sdb2    8:18   0  100G  0 part /mnt/data2
    ```

4. **指定したカラムを表示**

    ```sh
    lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
    ```

    出力例：

    ```sh
    NAME   SIZE TYPE MOUNTPOINT
    sda    100G disk
    sda1    50G part /
    sda2    49G part /home
    sda3     1G part [SWAP]
    sdb    200G disk
    sdb1   100G part /mnt/data1
    sdb2   100G part /mnt/data2
    ```

5. **完全なパスでデバイス名を表示**

    ```sh
    lsblk -p
    ```

    出力例：

    ```sh
    NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    /dev/sda      8:0    0  100G  0 disk
    ├─/dev/sda1   8:1    0   50G  0 part /
    ├─/dev/sda2   8:2    0   49G  0 part /home
    └─/dev/sda3   8:3    0    1G  0 part [SWAP]
    /dev/sdb      8:16   0  200G  0 disk
    ├─/dev/sdb1   8:17   0  100G  0 part /mnt/data1
    └─/dev/sdb2   8:18   0  100G  0 part /mnt/data2
    ```

### 使用例

- ディスクのパーティション構造を確認するために`lsblk`を使用します。
- 新しいディスクやパーティションを設定した後に正しく認識されているか確認します。
- システムのブロックデバイスの状態をチェックするために使用します。

`lsblk`は、ディスクの管理やトラブルシューティングにおいて非常に便利なツールです。各オプションを組み合わせることで、必要な情報を効率的に取得できます。
FastAPIでセキュアなHTTPS通信を実現する方法（Windows環境対応）

## はじめに

こんにちは！今回は、FastAPIを使ってセキュアなHTTPS通信を実現する方法について解説します。特に、Windows環境での開発に焦点を当てて説明します。

## 1. 必要なもの

- Python 3.7以上
- FastAPI
- uvicorn
- mkcert（ローカル開発環境用の信頼された証明書生成ツール）

## 2. 環境のセットアップ

### FastAPIとuvicornのインストール

まず、FastAPIとuvicornをインストールしましょう。

```bash
pip install fastapi uvicorn
```

### Windows環境でのmkcertのインストール

Windows環境でmkcertをインストールする方法はいくつかあります：

1. **Chocolateyを使用する方法（推奨）:**
   - まず、[Chocolatey](https://chocolatey.org/install)をインストールします。
   - 管理者権限でPowerShellを開き、以下のコマンドを実行します：
     ```
     choco install mkcert
     ```

2. **手動でインストールする方法:**
   - [mkcertのGitHubリリースページ](https://github.com/FiloSottile/mkcert/releases)から最新のWindows用バイナリ（`mkcert-v*-windows-amd64.exe`）をダウンロードします。
   - ダウンロードしたファイルの名前を`mkcert.exe`に変更します。
   - このファイルをシステムのPATHが通っているディレクトリ（例：`C:\Windows`）に移動するか、新しいディレクトリを作成してPATHに追加します。

3. **Scoopを使用する方法:**
   - [Scoop](https://scoop.sh/)がインストールされている場合は、以下のコマンドで簡単にインストールできます：
     ```
     scoop install mkcert
     ```

## 3. Windows環境での信頼された証明書の生成

mkcertを使用して、ローカル開発環境用の信頼された証明書を生成します。

1. mkcertをセットアップ:
   管理者権限でコマンドプロンプトを開き、以下のコマンドを実行します：
   ```
   mkcert -install
   ```

2. localhost用の証明書を生成:
   ```
   mkcert localhost 127.0.0.1 ::1
   ```
   これにより、`localhost+2.pem`（証明書）と`localhost+2-key.pem`（秘密鍵）が生成されます。

## 4. FastAPIアプリケーションの作成

以下のようなシンプルなFastAPIアプリケーションを作成します。

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World over secure HTTPS!"}
```

このコードを`main.py`として保存します。

## 5. WindowsでHTTPSアプリケーションを起動

mkcertで生成した証明書を使用して、uvicornでアプリケーションを起動します。コマンドプロンプトで以下を実行します：

```
uvicorn main:app --ssl-keyfile localhost+2-key.pem --ssl-certfile localhost+2.pem
```

## 6. ブラウザでの確認

ブラウザで `https://localhost:8000` にアクセスします。mkcertで生成した証明書を使用しているため、ブラウザはこの接続を安全であると認識し、警告を表示しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/987a5f16-8566-239b-3d66-3a59e95c5ae7.png)

## Windows環境での注意点

- Windows Defenderなどのセキュリティソフトが証明書の生成やアプリケーションの実行をブロックする可能性があります。その場合は、一時的に無効にするか、例外を設定してください。
- PowerShellを使用する場合、実行ポリシーの設定が必要な場合があります。管理者権限でPowerShellを開き、`Set-ExecutionPolicy RemoteSigned` を実行してください。
- コマンドプロンプトやPowerShellを管理者権限で実行することで、多くの問題を回避できます。

## 本番環境での考慮事項

1. 信頼された認証局の証明書を使用する:
   - Let's EncryptやCertbotを使用して、無料のSSL証明書を取得します。

2. リバースプロキシの使用:
   - NginxやTraefikなどのリバースプロキシを使用し、HTTPS通信の処理を任せる方法も効果的です。

3. クラウドサービスの利用:
   - Heroku、AWS、Azureなどのクラウドプラットフォームを使用すると、HTTPS設定が自動的に行われる場合があります。

## まとめ

以上の手順で、Windows環境でもFastAPIアプリケーションをセキュアなHTTPS経由で実行できます。mkcertを使用することで、開発環境でも信頼された証明書を使用でき、より本番環境に近い形でのテストが可能になります。

セキュアな通信は現代のWebアプリケーションにとって不可欠なので、ぜひ実装してみてください。
すたれそうなプログラム言語5選

# はじめに
病院の待ち時間に、もうすぐすたれそうなプログラミング言語を考え、考えた結果、5言語を紹介したいと思います。

## COBOL
メインフレームを触る機会がないので、すたれたと思っていますが、金融系では、メインフレームが稼働中なので、COBOLをすたれそうなプログラミング言語に選びました。

## Perl
一時期Perlを使ったプロジェクトにいたので、ここであげるのはどうかと思いましたが、ここ10年以上使ってないのですたれそうなプログラミング言語に選びました。

## Objective-C
Appleのサポート終了しているので、すたれた言語の印象がありますが、世の中にまだ資産があるのであえて「すたれそう」に入れました

## FORTRAN
気象庁のスパコンエンジニアには申し訳ありませんが、すたれそうって意味で入れました。

## BASIC
昔は流行してましたが、今となっては下火になっているので入れました。

# 最後に
流行り廃れはありますね。
dockerのvolumeについて

# はじめに
<!-- 発端や概要を記載 -->
dockerコンテナの開発環境で必須のvolumeについて解説・実演していきます。dockerを学びたての頃はコンテナ内でどうやって手元で書いてるコードを反映させるのか謎でした。volumeを使うことでコンテナと手元のコードを繋げ、コンテナ内で実行する。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [volumeについて](#Chapter1)
1. [volumeを開発環境で使ってみる](#Chapter2)
1. [本番環境でvolumeを使わない件について](#Chapter3)
1. [参考](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 1. volumeについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082298/205cf0ad-ca03-a72b-8d8b-ed2780e56639.png)

HOST側のソースコードのディレクトリをコンテナにcopyでコピーした場合、HOSTで変更したコードはコンテナに反映されません。そのためvolumeを使用し、hostのディレクトリとコンテナのディレクトリを繋ぎ、最新の状態を実行できることができます。

画像は次から引用
https://zenn.dev/fdnsy/articles/e2024d73ec2bda
<a id="#Chapter2"></a>
# 2. volumeを開発環境で使ってみる
### 汎用性の高いdocker-compose.ymlでのvolumeのやり方を紹介
docker-compose.ymlの例
```
version: "3"
services:
  api:
    volumes:
      - ./host_src:/container_src
```
<!-- 各チャプター -->
<a id="#Chapter3"></a>
# 1. 本番環境でvolumeを使わない件について
本番環境では、セキュリティや安全稼働の観点から、基本的に本番環境内のソースコード等の変更は行いません。本番環境ではCOPYを使います。
Dockerfileの例
```
COPY host_src/ /container_src
```

<a id="#reference"></a>
# 参考文献
- [docker 日本語ドキュメント](https://docs.docker.jp/)
- [ボリュームの利用](https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/)
- [docker公式　ボリュームの使用](https://docs.docker.jp/storage/volumes.html)
UnityでAndroid向けアプリ開発をしてみたい

Android向けアプリ開発をするために、アプリのビルドなどのやり方を少しずつ整理していくつもりです。
モチベーションは、自分のスマホで、自分が作ったものを動かしたら面白そうだという好奇心です。

# デバッグについて

## Unityの設定

### 初回
* Unity HubでAndroid Build Supportのモジュールをインストールする


### 次回以降
※時短のために、Unity HubでプラットフォームをAndroidに指定してから起動するといい
* [Edit] -> [Project Settings] -> [Editor]に移動し、[Device] を [Any Android Device] にする
* [File] -> [Build Settings] (※Unity 6では[Build Profiles]) に移動し、[Run Device] ドロップダウンからAndroid端末を選ぶ
* プラットフォームをAndroidに変更する

## Android端末の設定

### 初回
* Unity RemoteアプリをGoogleストアからダウンロードする
* PCに対して、Android端末のRSAにアクセスすることを許可する(下記の過程で要求される)

### 次回以降
* USBを接続し、[USBの設定]から[ファイル転送]を選ぶ
* [デバイス情報]の[ビルド番号]を7回連打して、[開発者モード]を有効にする
* 開発者向けオプションの[USBデバッグ]を有効にする
* 開発が終わったら、[USBデバッグ]を無効にし、[システム]の[開発者モード]を無効にする

# ビルドについて

## Unity側の操作
* [Edit] -> [Project Setting] -> [Player]を開いて、下記を設定する
* Product name: アプリ名
* Icon: アイコン
* Orientation: 画面の向き
* Active Input Handling: Input System(新)とかInput Manager(旧)　Other Settingの下の方にある
* [File] -> [Build And Run] ボタンを押して、スマホにAPKファイルを保存する

# 使用したバージョンなど
* Unity: 2022.3.4f1, Unity 6
* PC OS: Windows 11
* Androidバージョン: 14
* Android端末: Google Pixel 8a

# メモ
* USB 3.0でスマホをPCに接続できた。なぜか、2.0につないだら[ファイル転送]を選べなかった
* Run Deviceに端末が見当たらないときは、[Refresh]ボタンを押してみる
* [Build And Run]で、PCにAPKファイルを保存した際に、なぜか自動的にスマホにアプリがインストールされた (※開発者モードにしておいた）
* 試しに、Fantasy Kingdom in Unity 6をビルドした際に、Player Settingの画面の向きの設定がなぜか適用されなかった？
* 初めて開発者モードでスマホをPCと繋げたら、RSA云々の許可を要求され、許可した。RSAは素数を使った暗号方式のこと
* Pixel 8aのアスペクト比は20:9(1080×2400ピクセル)
* 開発者モードの背反として、関係あるか分からないけど、Coke ONアプリを使えなくなったり(Google Fitの開発者サービスアプリ使用と関係していると思っている)、崩スタでまれにUnity何とかで起動できないエラーが出るようになった気がする
testtest20240622

vim -c "inoremap jk <ESC>" -c "set nu"

@echo off
setlocal enabledelayedexpansion

set "folder=target/"
set "searchString=2024/06/21 12:04"

if not exist "%folder%" (
    echo フォルダ %folder% 存存在しない
    exit /b
)

cd "%folder%"
for %%a in (*.log) do (
    findstr /i /m "%searchString%" "%%a"
    if !errorlevel! equ 0 (
        call :method "%%a"
    )
)
echo End
pause
exit /b

:method
"sakura.exe" "%folder%\%~1" -M="go.mac"
goto :eof
FastAPIでBasic認証を実装する方法

## はじめに
FastAPIは高性能で使いやすいPythonのWebフレームワークです。このフレームワークでBasic認証を実装する方法を紹介します。

## 1. 必要なライブラリのインストール

まず、必要なライブラリをインストールします。

```bash
pip install fastapi uvicorn python-multipart
```

## 2. Basic認証の実装

以下は、FastAPIでBasic認証を実装する基本的なコードです。

```python
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials
import secrets

app = FastAPI()
security = HTTPBasic()

def get_current_username(credentials: HTTPBasicCredentials = Depends(security)):
    correct_username = secrets.compare_digest(credentials.username, "user")
    correct_password = secrets.compare_digest(credentials.password, "password")
    if not (correct_username and correct_password):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect email or password",
            headers={"WWW-Authenticate": "Basic"},
        )
    return credentials.username

@app.get("/")
def read_root(username: str = Depends(get_current_username)):
    return {"message": f"Hello, {username}!"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
```

## 3. コードの説明

1. `HTTPBasic`クラスを使用してBasic認証を設定します。
2. `get_current_username`関数で認証ロジックを実装します。
   - `secrets.compare_digest`を使用して、タイミング攻撃を防ぎます。
   - 認証が失敗した場合、401エラーを返します。
3. エンドポイントに`Depends(get_current_username)`を追加して、アクセス時に認証を要求します。

## 4. 動作確認

1. 上記のコードを`main.py`として保存します。
2. ターミナルで`uvicorn main:app --reload`を実行してサーバーを起動します。
3. ブラウザで`http://localhost:8000`にアクセスすると、認証ダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/457d061b-99b3-1560-ebc8-7dac9b56affa.png)

4. ユーザー名「user」、パスワード「password」で認証すると、メッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/285cee2b-9dc1-bb4d-3e98-74729b73f3eb.png)

## まとめ

FastAPIでBasic認証を実装する方法を紹介しました。この方法は簡単に実装できますが、プロダクション環境では、よりセキュアな認証方法（例：OAuth2やJWT）の使用を検討することをお勧めします。
Uncaught  ReferenceError: ｘ（変数） is not defined

# 発生したエラー
**Uncaught  ReferenceError: newCompleteTodo is not defined**
# 発生したエラーの原因
存在しない変数を参照していた為
→newCompleteTodoという変数はないと言われている。

## 実装しようとしている機能と戻すボタンを押したときに発生したエラー
* 実装しようとしている機能
**戻すボタンを押したとき、未完了のリストに追加する。**
* 戻すボタンを押したときに発生したエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/69e695ec-5a14-5aaa-ed78-6ff9649f1d51.png)
* consoleログで配列は出力されたがその後に参照エラーが発生してしまっていた。

# 問題のコード
```Todo.jsx
 const onClickBack = (index) =>{
            const newCompleteTodos = [...completeTodos];
            console.log(newCompleteTodos);
            newCompleteTodo.splice(index,1);
         
            const newInColmpleteTodos = [...incompleteTodos, completeTodos[index]];
            setcompleteTodos(newCompleteTodos);
            setIncompleteTodos(newInColmpleteTodos);
        }
```
# 修正箇所
newCompleteTodosという配列を操作するときにnewCompleteTodoになっていて配列名にsがなかったため末尾にsを付けた。
```Todo.jsx
    newCompleteTodos.splice(index,1);
```

# 修正後コンソール結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789688/66918961-5e2a-5d33-4ab9-385cd52c61aa.png)


# 修正コード全体
```Todo.jsx
const onClickBack = (index) =>{
            const newCompleteTodos = [...completeTodos];
            newCompleteTodos.splice(index,1);
         
            const newInColmpleteTodos = [...incompleteTodos, completeTodos[index]];
            setcompleteTodos(newCompleteTodos);
            setIncompleteTodos(newInColmpleteTodos);
        }
```
## さいごに
**エラーが解消し戻すボタンを押したとき、未完了のリストに追加することができた**

また文法や参照エラーなどのエラーが出た際にはconsole.logを仕込んだり、変数名が間違っていないかなど基本的な部分を最初に確認することが大事であると感じた。
SharePointOnlineでWebパーツの遅延読み込みを回避する

# どうやるの？

:::note info
動的データソースの提供機能をwebパーツに付与することで遅延読み込みが回避できます
:::

# 動的データソースとは？

webパーツ間でデータ連携するための仕組みです
サイトに配置したwebパーツ間でデータを共有できます
（らしい、、本来の目的で使ったことがないので、、）

# なぜ動的データソースの設定を行うとwebパーツの遅延読み込みが回避できるのか

動的データソースとなるwebパーツはほかのパーツからデータを参照されるため、遅延読み込み対象となるとそのデータを提供できなくなってしまうため

以前は上記に対応しておらず、遅延読み込みが行われていましたが、以下のIssueで修正されたようです
[https://github.com/SharePoint/sp-dev-docs/issues/6091](https://github.com/SharePoint/sp-dev-docs/issues/6091)

# 実装方法

以下の手順で行います
1. ダミーの動的データソースクラスを作成する
1. webパーツでダミーデータクラスを初期化して提供する

## 1.ダミーの動的データソースクラスを作成する

動的データソースクラスを作成する際、`IDynamicDataCallables`を実装したクラスが必要になります
以下のように実装してみます

```typescript
import {
  IDynamicDataPropertyDefinition,
  IDynamicDataCallables,
} from "@microsoft/sp-dynamic-data";

/** 動的データソースのダミークラス */
export default class DummyDataClass implements IDynamicDataCallables {
  /** 動的データの型定義 */
  public getPropertyDefinitions(): ReadonlyArray<IDynamicDataPropertyDefinition> {
    return [
      {
        id: "dummy",
        title: "dummy",
      },
    ];
  }

  /** 動的データの値を取得 */
  public getPropertyValue(propId: string): string {
    /** ダミーデータは使用しないため、エラーを投げるようにしておく */
    throw new Error("Method not implemented.");
  }

  /** 動的データの値をセット */
  public setPropertyValue(value: string): void {
    /** ダミーデータは使用しないため、エラーを投げるようにしておく */
    throw new Error("Method not implemented.");
  }
}
```

## 2.webパーツでダミーデータクラスを初期化して提供する

1で定義した`DummyDataClass`を`BaseClientSideWebPart`を継承したWebPartクラス内で、`context.dynamicSourceManager`に渡してあげます

```diff_typescript
export default class DummyWebPart extends BaseClientSideWebPart<IProps> {
+    /** ダミーデータ変数 */
+    dummyDataClass: DummyDataClass;

    protected async onInit(): Promise<void> {
+      /** ダミーデータ初期化 **/
+      this.dummyDataClass = new DummyDataClass();

+      /** `dynamicDataSourceManager.initializeSource`に指定する **/
+      this.context.dynamicDataSourceManager.initializeSource(
+        this.dummyDataClass
+      );
    }
```

# あとがき
上記の実装を行うとWebパーツの遅延読み込みが無効になり、サイトを読み込んだ時点で同時に読み込まれるようになります
動的データソースを利用（悪用？）したちょっとしたハックでした👏
ローカル環境からFireStoreにデータを格納する方法

# 導入
今回はFirebaseのNoSQLのデータストアであるFireStoreに直接データを挿入していきます。
JSONファイルを用意し、今回のソースを実行するだけでFireStoreにデータが挿入できます。
コンソールからデータを1つ1つ作成するよりも、早くて便利です。

# 手順
## 秘密鍵の取得
Firebaseの操作をPC上で実施するため、秘密鍵を取得する必要があります。
まず、Firebaseのコンソールを開き、FireStoreにデータを挿入したいプロジェクトを開きます。

その画面から、以下の画面のように「1.プロジェクトの設定」 → 「サービスアカウント」 → 「秘密鍵を生成」をクリックしていき、ポップアップ内で「キーを生成」をクリックすると、秘密鍵がJSON形式でDLされます。

以下、この秘密鍵は`secret.json`とします。

## アップロードデータの作成

以下のようにJSONファイルでデータを作成しておきます。
今回は例として動物の情報を挿入したいと思います。

```json:upload_data.json
[
    {
        "species": "Lion",
        "habitat": "Savanna",
        "size": 250
    },
    {
        "species": "Penguin",
        "habitat": "Antarctica",
        "size": 50
    },
    {
        "species": "Sheep",
        "habitat": "Grassland",
        "size": 120
    }
]
```

今回は「animal」コレクションに対して、idがspeciesであり、habitatとsizeの情報を持つデータをFireStoreに格納するものとします。

## Pythonコード(データアップロード処理)

```python:data_uploader.py
import firebase_admin
import json
from firebase_admin import credentials, firestore

SECRET_KEY_PATH = '/path/to/secret.json'
DATA_FILE_PATH = '/path/to/upload_data.json'

COLLECTION_NAME='animal'

cred = credentials.Certificate(SECRET_KEY_PATH)
firebase_admin.initialize_app(cred)

db = firestore.client()

# Data
animal_data = open(DATA_FILE_PATH, 'r')
animal_data_load = json.load(animal_data)
for d in animal_data_load:
    # IDとするためspeciesを取得
    species = d["species"]
    # それ以外はJSON形式でdataとして保持
    data = {
        "habitat": d["habitat"],
        "size": d["size"]
    }
    # documentの引数にIDとなるspeciesを、setにdataを設定している
    db.collection(COLLECTION_NAME).document(species).set(data)
```

### 実行結果
上記ソースを実行すると、FireStoreにデータが格納されます。

![firestore_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1655179/c5fd8097-14b6-f202-652b-9df3c9c263e6.png)

# 終わりに

今回はFirebaseのNoSQLデータベースであるFirestoreにJSONファイルのデータをコンソールを介さず、直接挿入する方法について紹介しました。
ご参考にしてもらえたら幸いです。
IngressとEgress

# はじめに

クラウド環境の構築をしているとき、ネットワークトラフィック設計をする中でIngressとEgressの違いがわからなくなります。
簡単ではありますがまとめました。

# Ingress

ネットワークの**外部から内部**にパケットが流入する際に、情報を観測・制御します。
わかりやすく言うと入国審査です。
外部からの攻撃や不正アクセスを防ぐことが主な目的となります。

# Egress

ネットワークの**内部から外部に**パケットを流出する際に、情報を観測・制御します。
わかりやすく言うと出国審査です。
機密情報の漏洩を防ぐことが主な目的となります。
PowerApps: Premium 利用のソリューションは、Premium 無償利用でもいいのでしてないと試すことは出来なかった

# 背景

素敵なサンプルを見つけたので、無償環境で試してみるかと思ったけれど、ダメだった記録

コードぐらい見られるかと思ったのだけど、残念 :sweat: 

Premium が利用できるのであれば、以下のサンプルは非常に便利そう

https://microsoft.github.io/PowerApps-Sample-Apps-Japan/

# 状況

- import しようとしたところ

> No response received: Network Error

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/a6c22371-6388-3ec5-1c83-4960ac6645ae.png)

- unmanaged.zip でも、managed.zip でもどちらでもダメ

- 恐らく、Power Apps Premium を開始すれば使えると思われる・・
   開発者ライセンスの環境であっても、以下試すことは出来そうだけれど、カード情報入れるのはやっぱり気が引けるので、これについては諦め

   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/23699cf4-810f-81d2-06cf-b07de3e4ce45.png)


# あとがき

とはいえ、Microsoft さんの GitHub にいけば、色々 Sample あるので以下を探索したいところ

https://github.com/search?q=org%3Amicrosoft%20power%20apps&type=repositories
【Node.js】入力されたキーが何かを音声で返すプログラムを作ってみる： Readline と Mac の Sayコマンドの組み合わせ

## はじめに
今回の内容は、以下の 2つの記事の内容を混ぜたようなものです。

●Node.js で Readline をシンプルに使う（1桁の数字の入力を扱う） - Qiita
　https://qiita.com/youtoy/items/fcdab642baa7007f4645

●【小ネタ】Node.js と Mac の Sayコマンドでテキストの読み上げ（複数の文章を対象にしつつパラメータ変更も試す） - Qiita
　https://qiita.com/youtoy/items/397813c607b58fac626e

### 実現する内容
具体的に実装する内容は、「キーが入力されたら、何のキーが入力されたかを音声で返す」というものです。

これを Node.js で実装します。また、音声を使う部分は Mac の Sayコマンドを組み合わせて実現します（※ Node.js の標準モジュール Child process でコマンドを実行します）。

## Readline でキー入力時にすぐに反応する処理を実装する
冒頭で紹介した過去の記事では、Node.js の Readline を使ってユーザーのキー入力を受け付けるものを実装していました。

その際の動作は、キー入力後に Enterキーを押したら、それに対して反応するというものでした。
今回はその動作を少し変え、Enterキーが入力されなくても、キー入力に反応して処理が実行されるようにします。

### 参考にするプログラム
上で書いた処理を実装するため、参考にできそうなプログラムを探してみました。

そして、検索して見つけた以下を使うことにしました。

●Example: Detect keypress event in Node.js console app
　https://gist.github.com/newvertex/d78b9c6050d6a8f830809e6e528d5e96

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ea5c8c44-2ba7-733c-af27-9f224ee92a48.png)

Enterキーの入力なしに反応する、という部分は `process.stdin.setRawMode(true)` という部分がポイントになるようです。

### 書きかえ後のプログラムと動作確認
上記を書きかえて作ったプログラムは、以下のとおりです。

```javascript:app.js
const readline = require("node:readline");

readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

process.stdin.on("keypress", (str, key) => {
  if (key.ctrl && key.name === "c") {
    console.log("終了します");
    process.exit();
  }
  console.log(`あなたが押したキーは "${str}" です`);
});

console.log("キーを押してください（Ctrl + c で終了）");
```

上記の基本的な動作は、キーが入力されたら、押されたキーが何であったかをすぐに返すというものです。また、「Ctrl + c」が押された時は処理を終了するようにしています。

#### 動作確認
上記のプログラムを実行してから、「1 ⇒ 2 ⇒ 3 ⇒ 4 ⇒ 5 ⇒ a ⇒ b ⇒ c ⇒ d ⇒ Ctrl + c」という順番でキーを入力してみます。

その結果、以下の出力が得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4ae15020-6ae6-53fc-becb-49b75eb2bbce.png)

## キー入力に反応してしゃべるようにしてみる： Mac の Sayコマンドとの組み合わせ
Mac の Sayコマンドを使い、上記のキー入力の出力として、音声でキーの内容をしゃべるプログラムを実装してみます。

### プログラム
試しに、以下のようにしてみました。

```javascript
const { execSync } = require("node:child_process");
const readline = require("node:readline");

readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

process.stdin.on("keypress", (str, key) => {
  if (key.ctrl && key.name === "c") {
    console.log("終了します");
    process.exit();
  }

  execSync(`say あなたが押したキーは${str}です`);
});

console.log("キーを押してください（Ctrl + c で終了）");
```

#### 動作確認
上記のプログラムを実行して、キーを押した時の様子を掲載してみます。
以下のとおり、押したキーの読み上げが行われることを確認できました。

https://x.com/youtoy/status/1804503974256714117
モンゴメリ乗算のプログラミングテクニック

## 前提
モンゴメリ乗算はRSA暗号などの公開鍵暗号で良く使われています。今後、準同型暗号などの暗号応用分野でも広く使われることになると思われます。ただ乗算結果に$𝑅^{−1}$がついているために使い方に戸惑う人もある。そういう人のためのテクニックを紹介します。**モンゴメリ乗算については説明を省略します。**

## モンゴメリ乗算
<dl>
<dt>INPUT:</dt> 
<dd> 整数 $p$ = ($p_{n-1}$ , ・・・, $p_1$ , $p_0$) </dd>
<dd> 整数 $Y$ = ($y_{n-1}$ , ・・・, $y_1$ , $y_0$) </dd>
<dd> 整数 $G$ = ($g_{n-1}$ , ・・・, $g_1$ , $g_0$) </dd>
<dd> 0 ≦ $Y$,$G$ < $p$ </dd>
<dd> $R$ = $b^n$ ( gcd($p$ , $b$)=1 , $p^\prime$=-$p^{-1}$ mod $b$ )</dd>
</dl>

<dl>
<dt>OUTPUT:</dt><dd>$YGR^{-1}$ mod $p$</dd>
</dl>

## A×B mod pの計算
$A_R$ = $A$ × $R$ mod $p$ 
$B_R$ = $B$ × $R$ mod $p$ 
モンゴメリ乗算 $A_R$ × $B_R$ = $ABR^1$ mod $p$
モンゴメリ乗算 ($ABR^1$ mod $p$ ) × 1 = $A B$ mod $p$

## テクニック
$A$ × $R$ mod $p$ は事前に計算できる $R^2$ mod $p$ を使えばモンゴメリ乗算で高速に演算ができる
$A$ × $R$ mod $p$ = モンゴメリ乗算 $A$ × $R^2$ mod $p$
$B$ × $R$ mod $p$ = モンゴメリ乗算 $B$ × $R^2$ mod $p$

## まとめ
モンゴメリ乗算の乗算結果には $R^{-1}$ がついていますが、事前に計算できる$R^2$ mod $p$ を使うことで、剰余乗算の計算を含む、様々な暗号計算がモンゴメリ乗算で可能です。

モンゴメリ乗算の $R^{-1}$ ついての数学的な意味について学んでおくことは、いいことかもしれない。

## 暗号プロセッサSnakeCube
SnakeCubeではA×BとA×Aの2つのモンゴメリ乗算を並列に実行します。これが高速なのはIntel ハイパースレッディングと同じ理屈。mod pのpが共用できるので、さらに効率的。RSA暗号では、この並列実行をフル活用して計算できます。楕円曲線暗号でも、多少、高速化できます。その他の暗号応用でも並列演算について考慮したアルゴリズムを開発すると、いいかもしれません。

参考まで[ICF3(1999年)](https://openicf3.idletime.tokyo/)も同様に並列実行します。ハイパースレッディングではなくて専用演算器を完全に２個使った並列方式。(当時の日立のCMOS半導体のフリップ・フロップが比較的、ゲート数が多いために、この方式が有利になったという記憶)

SnakeCubeではRの大きさを変更することができるので乗算のサイズに応じた計算コストになります。

SnakeCubeにはA × R mod pを直接計算できる方法があるのでpの値が頻繁に変更されるような演算も可能です。

ASIC版のSnakeCubeは検討中ですがICF3(1999年)のマイクロコードに似たものになると思われます。ただし大型コンピュータ向けに開発されたICF3はビッグエンディアンなのでICF3のシミュレータでマイクロコードを開発してもSnakeCubeへ移植するには労力を必要とするため推奨ではありません。

2020年に開発されたFPGA版のSnakeCubeは２組の｛A×BとA×A｝の計算ができます。1つの暗号プロセッサに２組のモンゴメリ乗算器を接続することで、１組の場合よりも、プロセッサが共用できるためトランジスタ数当たりの性能が上がります。RSA暗号ではこの２組のモンゴメリ乗算器をフル活用できます。ざっくり４スレッドで演算器を使い切る効率の良さ。

<iframe width="560" height="315" src="https://www.youtube.com/embed/beaFg0x8Qj8?si=C0BX5nbDaif7srMQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 参考URL
[暗号プロセッサ SnakeCube](https://openicf3.idletime.tokyo/snakecube/)
AWS認定セキュリティ・スペシャリティ受験談&学習法

## 概要
2024年6月22日にAWS認定セキュリティ・スペシャリティの試験を受けて合格しましたので、学習したこと等を情報共有として書いていきます。
合格基準750点のところ844点でした〜もっとギリギリかと思っていましたが、思っていたより取れていました。

## 前提の知識と経験
アソシエイトを3つ合格していて、セキュリティに関してはプロジェクトではIAMロールやCloudFrontとかを少し操作や構築したくらいです。
非機能要件をガッツリ決めてセキュリティを固めていくようなプロジェクトに参画したことはなく、基本的な対策を施していって、その時々で調査して対応していくレベル感です。
あと認証認可や徳丸さんの本とか好きで読んでいますが、あまり理解はしてないなぁ:sweat:

## 学習期間
今回も大体1ヶ月くらいで、平日は1日2〜3時間、休日は5〜6時間くらいです。これまでと変わらず。
ちなみに同じ会社のMathew Chanさんは14日間、、、すごいなぁ:thumbsup:
https://note.com/mathew_chan/n/n28ee4ba5d728

## 学習教材
あまり教材が見当たらないので、探すのが大変でしたね〜

### 1. 要点整理から攻略する『AWS認定 セキュリティ-専門知識』
これしか見当たりませんでしたが、セキュリティ・スペシャリティの書籍です。一つ前の「SCS-01」ですので、内容も今と少し変化しています。
ただ、大きく変わったところはなく、試験に出る項目はだいたい把握できると思います（管理とセキュリティガバナンス以外は）。

https://www.amazon.co.jp/%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B%E3%80%8EAWS%E8%AA%8D%E5%AE%9A-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%80%8F-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-ebook/dp/B08DCLRHC7/ref=sr_1_1

### 2. AWS認定Specialty – Security（SCS-C02）試験 対策トレーニングコース
こちらはUdemyの動画教材です。
アソシエイトの動画と重複している内容も多々ありましたが、試験範囲の概要を把握するには良いかと思います。
上記の書籍もですが、これだけで合格できそうではないなぁと思います。

https://www.udemy.com/course/aws-specialty-security-scs

### 3. 【SCS-C02対応】AWS認定 セキュリティ 専門知識 模擬問題集＋詳解
Udemyの模擬試験です。
本番試験よりレベルは高いように感じますので、解説等を理解できれば良いかなと。

https://www.udemy.com/course/scs-c02aws

### 4. AWS Skill Builder
あまりにも教材がなかったので、AWS Skill Builderの有料プランも実践してみました。
さすが公式。似たような問題が本番でも出ていました。これオススメです。
https://skillbuilder.aws/jp

## 本番試験
180分の試験時間のうち、170分を使いました。
長文問題は少なめでしたが、結構答えに迷う問題が多く、読み込みに時間がかかりました。2択に絞りんだあと、「どちらが正解かなぁ」と考え込むことが多かったですね〜
ですので、合格点まで達していたことがちょっと驚いています。
KMSの問題が多く出そうな気がしていましたが、思ったより出題されていませんでしたね〜私の時はALBやACMなどネットワークやアプリケーション寄りの問題が多かったかもしれないです。

## 最後に
AWSのセキュリティ関連のサービスの使い方がこの学習期間で少し分かったので、良かったです。
なんとなくIAMを使っていて「こんなセキュリティ知識じゃダメだなぁ」と思っていたところだったので、良い機会でしたね〜体系的に学べたのは。
ただ、AWSだけではなく本質的なセキュリティも学習していかないといけないので、まだまだですね〜試験勉強を含めて頑張っていきます:grinning:
PythonのJSONでkeyにintを使うとデータが飛ぶ

# はじめに
JSONって便利ですよね
でもちょっと扱いを間違えると場合によっては上書きでデータが飛んでしまったり...

# 本題
問題です。
```python3
data = {2024: "令和6年"}
```
というdict型のデータがあったとします。
ここで、
```python3
print(data[2024])
```
を実行したら何が表示されるでしょうか？

...簡単ですね。
```
令和6年
```
です。

## JSON化して保存する
データが出来上がったので保存します。
```python3
import json

data = {2024: "令和6年"}
with open("data.json", mode="w") as f:
    f.write(json.dumps(data))
```

## 保存したJSONを利用する
出来上がったデータを読み込んで西暦2024年が和暦何年なのかを参照します。
```python3
with open("data.json") as f:
    data = json.loads(f.read())
print("西暦2024年は、和暦"+data[2024]+"です。") # KeyError: 2024
```
エラーが発生してしまいました。

### どうして？
元のデータと比較してみます。
```python3
import json

data = {2024: "令和6年"}
print(data) # {2024: '令和6年'}
data = json.loads(json.dumps(data))
print(data) # {'2024': '令和6年'}
```
見て分かる通り、一度JSONにするとint型のkeyは自動的にstr型に変換されてしまいます。

## もしも存在しない場合に自動生成される仕様だと...
試しに簡易的なユーザー情報で試してみます。
```python3
import json

default_userdata = {"name": "ゲストユーザー"}
users = {1: {"name": "テストユーザー"}}
user_id = 1

# 模擬的な保存 & ロード処理
users = json.loads(json.dumps(users))

if not user_id in users:
    users[user_id] = default_userdata

print(users[user_id]) # デフォルトで上書きされ、 {'name': 'ゲストユーザー'} が出力される
```
上書きされてしまいました。

# じゃあどうするのか
当たり前ですが、JSON以外の方法で保存するか、keyをstrとして扱えばこの問題は防げます。
```python3
import json

default_userdata = {"name": "ゲストユーザー"}
users = {"1": {"name": "テストユーザー"}}
user_id = "1"

# 模擬的な保存 & ロード処理
users = json.loads(json.dumps(users))

if not user_id in users:
    users[user_id] = default_userdata

print(users[user_id]) # 正常に {'name': 'テストユーザー'} が出力される
```

# さいごに
かなりやりがちなことですが、この仕様はあまり知られていません。
既に運用しているシステムに跡付けする形でこんな感じにプログラムするとデータが飛んでしまいます。
バックアップがあれば復元できますが、無ければ取り返しがつかないことになってしまいます。

短い記事でしたが、これでJSONのkeyにintを使うことの危険性が伝わったと思います。
今後の開発で参考になればと思います。

# 参考
- [JavaScript Object Notation](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)
macでも使うコマンド

# 目的
コマンドって何？何をどうするの？な状態でも分かるようにしたい、、、
よく使うコマンドと覚えやすいように一言つけていきます

# コマンドをつかうよ
コマンドはターミナルで使います
ファンダー(Finder) > アプリケーション > ユーティリティ > ターミナル

# コマンド

## ファイル確認
どんなフォルダやファイルがあるのか以下のコマンドで表示します
``` 
ls 
``` 

実行するとファイル名やフォルダが表示されます
以下のコマンドを使うとファイルの更新日時や権限の情報をみることができます
``` 
ls la
``` 

## ファイルの編集(新規作成)
ファイルを書き込むのには以下のコマンドを使います(他にもいろんなコマンドがあります)
``` 
vi <ファイル名>

# 例
vi test.txt
vi ~/test.txt
vi Users/heizo/test.txt
``` 

この`~/`というのはログインしているユーザーのホームディレクトリを指します
今ログインしてるのがheizoさんであれば`Users/heizo`のことなので、下の2つは同じファイルをさしています


## 階層移動
いろんなコマンドを実行するのに決まったフォルダで実行したいことがあります
その時は以下のコマンドでフォルダを移動しましょう
``` 
cd <移動したいフォルダ>

# 例
cd ~/Desktop
```
Hexabase Dart/Flutter SDKでのワークスペース・プロジェクト・データストアを名前で取得できます

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業向けのBaaS（Backend as a Service）を提供しています。認証やデータストア、ファイルストレージ、リアルタイム通知などの機能があり、企業向けのシステム開発に必要な機能をまるっと提供しています。

APIはREST APIとGraphQLを提供しています。そのAPIをラップしたSDKも開発を進めています。SDKは現在、TypeScriptとDart向けに開発しています。Dart向けのSDKは、もちろんFlutterでも利用できます。

この記事ではFlutter SDKにおいて、ワークスペース・プロジェクト・データストアの取得方法が簡単になった件を紹介します。

## パッケージとソースコード

パッケージはpub.devで公開しています。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseです。

[hexabase/hexabase-dart: Hexabase SDK for Dart & Flutter](https://github.com/hexabase/hexabase-dart)

## インストール

インストールは `dart pub get` で行えます。

```
dart pub get hexabase
```

## インポート

SDKをインポートします。

```dart
import 'package:hexabase/hexabase.dart';
```

## 初期化

まずインスタンスを作成します。

```dart
var client = Hexabase();
```

別なファイルで再度インポートした場合には、以下でインスタンスを取得してください。

```dart
var client = Hexabase.instance;
```

## ワークスペースについて

ワークスペースはHexabaseの中で、最上位のオブジェクトです。従来、ワークスペースを取得する際にはワークスペースIDを使っていました。ワークスペースIDは `6513e1c97f90e97937eb9eef` のようなユニークな文字列です。

```dart
await client.setWorkspace("6513e1c97f90e97937eb9eef");
```

このワークスペースIDはHexabase管理画面のURLから取得できます。

```
https://app.hexabase.com/h/6513e1c97f90e97937eb9eef // ← このID
```

これでは分かりづらいので、ワークスペース名を使って取得できるようになりました。

```dart
await client.setWorkspace("my_workspace");
```

このワークスペース名は、管理画面で設定するものです。

## プロジェクトについて

ワークスペースは複数のプロジェクトを保有します。従来、このプロジェクトもプロジェクトIDを使って取得していました。

```dart
var project = await client.currentWorkspace!.project("5f9e1c97f90e97937eb9eef");
```

こちらも同じく、管理画面で設定するプロジェクト名が利用できます。

```dart
var project = await client.currentWorkspace!.project("my_project");
```

## データストアについて

プロジェクトは複数のデータストア（RDBMSのテーブルに相当）を保有します。データストアもデータストアIDを使って取得していました。

```dart
var datastore = await project.datastore("5f9e1c97f90e97937eb9eef");
```

データストア名を使って取得できるようになりました。

```dart
var mainTable = await project.datastore("MainTable");
```

このように自分で設定した名前がそのまま使えるので、開発がスムーズに進められるでしょう。実際の流れは以下のようになります。

```dart
import 'package:hexabase/hexabase.dart';

var client = Hexabase();

await client.setWorkspace("my_workspace");
var project = await client.currentWorkspace!.project("my_project");
var mainTable = await project.datastore("MainTable");

var item = await mainTable.item();
```

## まとめ

Hexabase Dart/Flutter SDKを使えば、モバイルアプリやWebアプリを素早く開発できるようになります。2024年6月現在絶賛開発を進めていますので、ぜひ試していただいてフィードバックいただければ嬉しいです！

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)
コーディング以外のスキル

個人的「質はともかく継続する」１5日目です

# コーディング以外のスキル

エンジニアにはコーディング以外に必要な、あるいはあったほうが良いスキルがあります。
それをちょっとまとめてみました。

## 文字コード
まずは文字コードです。
UTF8をはじめ、ShiftJISやEUCなどなど、日本語を扱う上で
文字コードの学習は避けては通れません。
WebだけならUTF8だけで乗り越えられたりしますが、
Sier系やBtoB系だとレガシーシステム間の連携で文字コード変換が必要だったりします。

## 正規表現
続いて正規表現です。
文字コードとも関連しますが、入力チェックやまとめて変換するときに使います。
３００ファイルの中にある特定の条件に合う言葉を変換するときに、
正規表現があれば一発でできたりします。

## DBとSQL
データベースとSQL、コレも必須です。
Railsだと使うことはほとんどないかもしれませんね。
ただ基礎知識としては必須にカウントしておきます。
テーブルの正規化や、インデックスの貼り方、
JDBCと接続するときの接続文字列、
分析関数やWITH句などなど。
SQLについては、古参エンジニアほど知らない
新しい関数や書き方等があったりしますので、
勉強は欠かせませんね。

## ネットワーク
ネットワークも大切です。
少し前に「ブラウザを起動してから画面にサイトが表示されるまでを説明しないさい」という話題がバズっていましたが、
そこまで説明できなくとも、TCP/IPの話くらいは理解しておいたほうがいいでしょう。

## セキュリティ
セキュリティはいうまでもないですね。
Web系のシステムを作るならSQLインジェクション対策は当然必要ですし、
会員登録システムが有るならパスワードの保管方法や
認証システムを作る場合もセキュリティの知識が必要になります。

## 資産管理
Git,GitHubやGitLabにかかわらず、資産管理を知っておくことは必要です。
未だにないところもありますが...
それはそれとして、資産のバージョン管理について知っておいたほうがよいです。

## まとめ

どんな知識も完全に知ることは難しいです。
開発時に必要に応じて勉強したり、話ができるレベルくらいまでに勉強しておいたほうがいいと思っています。
そういう意味で、基本情報くらいは取っておいてもいいのかもしれないですね。
今年は応用情報うけてみようかな。
【Python】モジュールとパッケージ

Pythonのモジュールとパッケージは、コードを整理して再利用しやすくするための基本的な機能です。これらを使うことで、コードの管理がしやすくなり、大規模なプログラムでも効率的に開発できます。
# モジュール (Modules)
モジュールは、Pythonファイル（*.py）のことです。モジュールには関数、クラス、変数などを定義しておくことができ、他のファイルからインポートして利用できます。

**モジュールの作成**
**my_module.py**という名前のモジュールを作成し、以下のコードを記述します。
```python
# my_module.py

def greet(name):
    return f"Hello, {name}!"

def add(a, b):
    return a + b
```
**モジュールのインポートと利用**
別のファイル（例：main.py）でこのモジュールをインポートして利用します。
```python
# main.py

import my_module

# モジュール内の関数を呼び出す
print(my_module.greet("Alice"))
print("3 + 5 =", my_module.add(3, 5))
```
説明: `my_module`をインポートし、greet関数とadd関数を呼び出しています。
# パッケージ (Packages)
パッケージは、モジュールをまとめたディレクトリ（フォルダ）のことです。パッケージには、通常、__init__.pyというファイルが含まれており、パッケージ全体の初期化に使われます（Python 3.3以降では省略可能）。

**パッケージの作成**
以下のようなディレクトリ構造を作成します。
```markdown
mypackage/
    __init__.py
    module1.py
    module2.py
```
- __init__.py: パッケージを初期化するためのファイル。内容は空でも構いません。
- module1.py: パッケージ内のモジュール。
- module2.py: パッケージ内の別のモジュール。

**mypackage/module1.py**に次のコードを書きます。
```python
# mypackage/module1.py

def greet(name):
    return f"Hello from module1, {name}!"
```
**mypackage/module2.py**に次のコードを書きます。
```python
# mypackage/module2.py

def farewell(name):
    return f"Goodbye from module2, {name}!"
```
**パッケージのインポートと利用**
別のファイル（例：main.py）でこのパッケージをインポートして利用します。
```python
# main.py

# パッケージ内のモジュールをインポート
from mypackage import module1, module2

# モジュール内の関数を呼び出す
print(module1.greet("Alice"))
print(module2.farewell("Bob"))
```
説明: `mypackage`パッケージから`module1`と`module2`をインポートし、それぞれの関数を呼び出しています。
# `__init__.py`の役割
- __init__.pyファイルは、パッケージ全体の初期化に使われます。以下はその役割の一例です。

サブモジュールのインポート: パッケージ内の特定のモジュールをインポートするために使われます。
```python
# mypackage/__init__.py

from .module1 import greet
from .module2 import farewell
```
このように`__init__.py`でインポートすると、パッケージをインポートしただけでサブモジュールもインポートされます。
```python
# main.py

# パッケージ全体をインポート
import mypackage

print(mypackage.greet("Alice"))
print(mypackage.farewell("Bob"))
```
# 実際の例
Python標準ライブラリも多くのモジュールとパッケージで構成されています。たとえば、`math`モジュールを使って数学関数を利用できます。
```python
import math

print("Square root of 16 is", math.sqrt(16))
print("Value of pi is", math.pi)
```
# まとめ
- モジュール: Pythonファイルのことで、関数やクラスを他のファイルからインポートして利用できます。
- パッケージ: モジュールをまとめたディレクトリで、__init__.pyを含むことでパッケージとして認識されます。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)
【Python】import文

Pythonのimport文は、他のモジュールやパッケージから関数、クラス、変数などを取り込み、再利用するための機能です。`as`を使うと、インポートするモジュールや関数に別名（エイリアス）を付けることができます。これにより、名前を短くしたり、同じ名前の衝突を避けたりすることができます。
# 基本的なimportの使い方
**モジュール全体のインポート**
特定のモジュール全体をインポートする場合、次のように記述します。
```python
import モジュール名
```
**例: mathモジュールをインポートして数学関数を利用する場合**
```python
import math

print("Square root of 16 is", math.sqrt(16))
print("Value of pi is", math.pi)
```
**from を使ったインポート**
モジュール全体ではなく、特定の関数やクラスだけをインポートする場合、`from`を使います。
```python
from モジュール名 import 関数名, クラス名
```
**例: mathモジュールから特定の関数だけをインポート**
```python
from math import sqrt, pi

print("Square root of 25 is", sqrt(25))
print("Value of pi is", pi)
```
**as を使ったエイリアス**
モジュールや関数に別名を付けるために`as`を使います。名前が長い場合や、名前の衝突を避ける場合に便利です。
```python
コードをコピーする
import モジュール名 as 別名
```
**例: numpyモジュールをエイリアスnpとしてインポート**
```python
import numpy as np

array = np.array([1, 2, 3])
print("NumPy array:", array)
```
**例: 関数に別名を付けてインポート**
```python
from math import sqrt as square_root

print("Square root of 49 is", square_root(49))
```
# 組み合わせた使い方
**モジュール全体をエイリアス付きでインポート**
```python
import matplotlib.pyplot as plt

# プロットを作成
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
```
説明: `matplotlib.pyplot`を`plt`という短い名前でインポートして、プロットを作成しています。

**特定の関数をエイリアス付きでインポート**
```python
from datetime import datetime as dt

# 現在の日時を取得
now = dt.now()
print("Current date and time:", now)
```
説明: `datetime`モジュールから`datetime`クラスを`dt`という名前でインポートし、現在の日時を取得しています。
# import * について
`from` モジュール名 `import *` を使うと、モジュール内のすべての内容をインポートできますが、名前の衝突が発生しやすくなるため、あまり推奨されません。
```python
from math import *

print("Cosine of 0 is", cos(0))
```
注意: *でインポートすると、どの名前がどのモジュールから来ているのかが不明瞭になるため、可読性が低下します。

**実際の使用例**
次に、いくつかの実際の使用例を示します。

**例1: ファイルの読み書きに使うosモジュール**
```python
import os

# 現在のディレクトリを取得
current_directory = os.getcwd()
print("Current directory:", current_directory)
```
**例2: JSONの読み書きに使うjsonモジュール**
```python
import json

# PythonオブジェクトをJSON文字列に変換
data = {"name": "Alice", "age": 25}
json_string = json.dumps(data)
print("JSON string:", json_string)

# JSON文字列をPythonオブジェクトに変換
parsed_data = json.loads(json_string)
print("Parsed data:", parsed_data)
```
**例3: randomモジュールでランダムな数を生成**
```python
import random

# 1から10までのランダムな整数を生成
random_number = random.randint(1, 10)
print("Random number between 1 and 10:", random_number)
```
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)