OmniAICreator/Qiita-1.07M huggingface dataset:
【Tips】TypeScriptで関数の返り値を分割代入構文で変数に格納しようとすると型が不正確になる

# 事象
JavaScriptには [分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) という構文が存在する。この構文を使えば、Pythonライクにこのような書き方が可能になる。
```JavaScript
function hogeFunc() {
  return ["resA", 0];
}
const [val1, val2] = hogeFunc();
console.log(val1); // resA
console.log(val2); // 0
```
しかし、先程の例のval1, val2の型をそれぞれ見てみると、
![スクリーンショット 2023-05-07 22.00.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156669/fe92eed0-e042-dcdb-d670-1e31b4275c7a.png)
おや？
hogeFuncが返しているリストの1番目はstring型の `"resA"` であるため、当然val1もstring型と推論されて欲しいが、実際には `string | number` と曖昧だ。
# 解説

この理由は、TypeScriptのリストにおける型の扱い方にある。TypeScriptで複数の型が代入可能な配列を定義する場合、
```JavaScript
const multipleTypeList: (string | number)[] = ["resA", 0];
```
のようにパイプで型を区切って定義する。
今回の場合はこれと全く同じことが型推論によって起こっている。「multipleTypeListはstring型またはnumber型の変数を格納できる配列だ」と推論されるため、当然その1番目の型は `string | number` となる。
# 対策
## 方法1. 関数をタプルで返すようにしよう
[タプル](https://typescriptbook.jp/reference/values-types-variables/tuple)は配列の一つ一つに型を定義できるものだ。
```JavaScript
const multipleTypeList: [string, number] = ["resA", 0];
```
これを利用することで、先程の例はこのように書き換えられる
```JavaScript
function hogeFunc(): [string, number] {
  return ["resA", 0];
}
const [val1, val2] = hogeFunc();
console.log(val1); // resA
console.log(val2); // 0
```
![スクリーンショット 2023-05-07 22.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156669/7580f7c7-ec71-cf91-7e9e-d29b30939a1c.png)
これならば型は期待通りになる。

## 方法2. 分割代入構文をやめて、大人しくオブジェクトを返すようにしよう。
オブジェクトならばタプルの型を定義するまでもなく適切に推論してくれる。
```JavaScript
function hogeFunc() {
  return {
    val1: "resA",
    val2: 0
  };
}
const hogeValues = hogeFunc();
console.log(hogeValues.val1); // resA
console.log(hogeValues.val2); // 0
```
![スクリーンショット 2023-05-07 22.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156669/1a2928df-d614-42b3-228f-fd5461595eb5.png)
【初心者向け】ShellScriptで使える便利なコマンド3選

ShellScriptでよく使われるコマンドに下記のものがあります。
- echo
- read
- if
- while

今回は、上記以外に個人的に便利そうだなと感じたコマンドを3つご紹介します:relieved:


## 1. sed : テキスト置換コマンド
sedコマンドは、テキストファイル内の文字列の置換、削除、追加、抽出などの操作を行うことができます。

sedコマンドの基本的な構文は以下のようになります。
```shell:shell
sed オプション 's/置換前の文字列/置換後の文字列/g' ファイル名
```
これは、ファイル名で指定したファイル内のすべての置換前の文字列を置換後の文字列に置き換え、結果を標準出力に表示することを意味します。

たとえば、`foo` を `bar` に置換する場合は、以下のようになります。

```shell:shell
sed 's/foo/bar/g' file.txt
```
このコマンドは、"file.txt"内のすべての `foo` を `bar` に置き換え、結果を標準出力に表示します。

***

オプションとして、`-i` を指定すると、置換結果を元のファイルに書き込むことができます。

::: note warn
ただし、このオプションを使用すると元のファイルが上書きされるため、注意が必要です。
:::

```shell:shell
sed -i 's/foo/bar/g' file.txt
```

このコマンドは、"file.txt"内のすべての `foo` を `bar` に置き換え、結果を"file.txt"に書き込みます。


## 2. cut : テキスト分割コマンド
cut コマンドは、指定した区切り文字で文字列を分割し、指定されたフィールドを取り出すために使用されます。

以下は cut コマンドの基本的な使い方です。
```shell:shell
cut オプション ファイル名
```
ファイル名にはテキストファイルを指定します。また、オプションを指定することで、フィールドの指定や区切り文字の変更が可能です。

例えば、次のようなテキストがある場合：

```shell:file.txt
apple:fruit:Japan
```
1と2のフィールドを取り出すには、次のようなコマンドを使います：

```shell:shell
cut -d ":" -f 1,2 file.txt
```

実行結果は以下のようになります：
```shell:file.txt
apple:fruit
```
-d オプションは区切り文字に`:`  を指定しています。 -f オプションはフィールド番号1,2を指定しています。




## 3. grep ： 文字列検索コマンド

grepは、ファイル内のテキストデータから、指定された文字列を含む行を抽出するためのコマンドです。

基本的な使い方は以下の通りです。

```shell:shell
grep オプション 検索文字列 ファイル名
```
"a"を含む行を検索する場合、次のように grep コマンドを使用します。
```shell:shell
grep "a" file.txt
```

これは単純な文字列検索で、"a"を含む全ての行を出力します。しかし、正規表現を使用することで、検索の幅を広げることができます。

例えば、"a"で始まる行を検索する場合は、次のように ^ を使用します。

```shell:shell
grep "^a" file.txt
```
これは、"a"で始まる行を出力します。

また、"e"で終わる行を検索する場合は、次のように `$` を使用します。

```shell:shell
grep "e$" file.txt
```

これは、"e"で終わる行を出力します。

このように、正規表現を使用することで、検索の柔軟性が向上し、より細かい検索が可能になります。

## まとめ
以上、テキスト置換コマンドのsed、テキスト分割コマンドのcut、そして文字列検索コマンドのgrepの個人的に便利そうだなと感じたコマンドを3つご紹介しました！

この中で一つでも便利そうだなと感じてもらえたものがあれば幸いです:thumbsup:

最後まで見ていただきありがとうございました！
pythonとpachagesのversionのずれでエラーが出ていた

まず、pythonのversionを調べる。
iterm2で
```
python3
```
でインタラクティブ入って、
```
import sys
sys.path
```
の結果に、
`/opt/homebrew/lib/python3.10/site-packages`
があるから、`python3.10`を使っていることがわかる。

>`sys.executable`はなんだろう
>出力は`/opt/homebrew/opt/python@3.10/bin/python3.10`

次にパッケージのversionを調べる。
```
pip show numpy
```
とかで見ると、出力のLocationが、
`Location: /opt/homebrew/lib/python3.9/site-packages`
だから、`python3.9`と紐づいてる？ことがわかる。

このpythonのversionのずれがエラーの原因かも。  
そこで、
```
python3.10 -m pip install --upgrade pip
```
すると、
```
pip show numpy
```
の出力のLocationが、
`Location: /opt/homebrew/lib/python3.10/site-packages`
になる。
そんで,
```
pip list
```
すると数が減っているので、必要なものをinstallする必要がある。
```
pip install PyPDF2
```
とかすると、showのLocationが、
`Location: /opt/homebrew/lib/python3.10/site-packages`
になっていて、`python3.10`に紐づく？パッケージがinstallされていることがわかる。
VPCピアリングでEC2から別アカウントのRDSへ接続してみた

# 実現したいこと
アカウントAにあるEC2から、アカウントBにあるRDSに対して、VPCピアリングを通して接続したい
![ec2-rds-peering.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619923/052699b1-0ee3-9c20-fc85-2cfc37621dcc.png)

※EC2やRDSは既に構築されている前提で、VPCピアリングの方法について解説します。

## VPCピアリングとは
VPCピアリングは、VPC間(別アカウント/別リージョンも可)を接続することで、別VPCのリソースに対してルーティングを可能にする機能のことです。VPC間でインターネットを経由した通信を行いたくない(行えない)場合、この機能が良いかもしれないです！

ただし、VPCピアリングにはいくつか条件があります。
特にVPCのCIDRが重複する場合にはピアリングできないので注意です！

[VPC ピアリング](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-peering.html)
[VPC ピアリング接続条件](https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/vpc-peering-basics.html#vpc-peering-limitations)

## 1.VPCピアリング接続の設定
VPC > [ピアリング接続]を選択します！
VPCリクエスタはVPCピアリングの接続元、今回だとアカウントAのピアリングさせたいVPCのIDを入力します。

ピアリング接続先のVPCは[別のアカウント]を選択します。
アカウントIDを入力します。今回の場合はリージョンが同じなので[このリージョン]を選択しました。
VPC ID（アクセプタ）にはピアリング先のVPCのIDを入力します。

![スクリーンショット 2023-05-07 21.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619923/c6a65f0c-39b0-77e4-bd6d-cf169d68211b.png)

上記でピアリング接続が作成されているはずです。
この時点ではステータスは[承諾の保留中]となっていると思います。
ステータスを利用可能にするためにはピアリング先、つまりアカウントBでピアリング接続を承認する必要があります！

アカウントBへログインします。
VPC > [ピアリング接続]を選択します。
ピアリング接続が作成されていて、ステータスが[承認の保留中]となっていると思います。

![スクリーンショット 2023-05-07 21.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2619923/509b33dc-3827-7462-f73a-9e7315b43321.png)

[アクション]から[リクエストを承諾]を選択します。
これでピアリング接続の作成は終わりです！
但し、これだけだとまだVPC間で通信することはできないので、ルートテーブルの設定を少し変更します。

## 2.ルーティングの設定
※アカウントAとアカウントBそれぞれで下記を行います。
VPC > [ルートテーブル] > [ルートの編集]を選択します。
ターゲットは[ピアリング接続]を選択し、先程作成したピアリング接続のIDを設定します。
送信先は、送信先となるVPCのCIDRを指定します。

アカウントAでルーティングの編集している場合は、アカウントBのVPCのCIDRを指定し、アカウントBでルーティングの編集をしている場合は、アカウントAのVPCのCIDRを指定します。

これでVPCのルートテーブル設定は終わりです。
しかし、アカウントBのセキュリティグループでアカウントAからの通信は許可されていないのでまだ通信ができません。

## 3.セキュリティグループの設定
アカウントBのRDSのVPCのセキュリティグループの設定を変更します。
具体的には、インバウンドルールを追加します。

ソースには①アカウントAのEC2インスタンスにアタッチしたセキュリティグループを指定する or ②アカウントAのEC2があるVPCのCIDRを指定します。
どちらでも可能とは思いますが、、、セキュリティグループを指定することで指定したインスタンスのみ通信を許可することができるようになるので、CIDRを指定するよりセキュリティグループを指定する方が良いと思います。

## 4.確認
アカウントAのEC2インスタンスで、mysqlコマンドを叩きアカウントBのRDSへ接続できるか確認します。

# おわりに
別アカウントのRDSへVPCピアリングを使って接続することができました。
同一リージョン間でのVPCピアリング、異なるアカウントの異なるリージョン間でのVPCピアリングなどなど、、、、ピアリング接続のユースケースはありそうですが、ベースとなる部分は上記の内容と変わらないかなと感じています。

最近はAWSで色々と作業することが増えてきたので、知見はどんどんアウトプットしていきます！
まだまだ経験は浅いのでベストプラクティスとか、こうした方が良いなど、あれば何でもコメントで教えていただけると幸いです！
EclipseでGitHub管理したい！

# 経緯
Eclipseで作ったプロジェクトをGitHubで管理するためにリモートリポジトリにpushしたいがなかなかできない！
ということで備忘録として解決した方法を載せます。

正直AWSのCloud9からリモートリポジトリにコマンドでpushする方
が楽だと思いました。（多分慣れのせい）
以下「そもそも～」については読み飛ばしても大丈夫です。

## そもそもなぜEclipseを使うことになったのか
#### 転職するにあたりJavaを学びたい！あと純粋に気になる！
 と思ったためです。なぜかと言えば……
* 興味のある言語の1つである
* 学習することで入社後の研修で躓くことが減るのでは？
* Ruby以外にも触りたい・比較してみたい

と考えたからです。
そんなときに[一週間で身につくJava言語の基本](http://java.sevendays-study.com/day0.html)というサイトに出会い、これだ！と思い早速行ってみることにしました。

~~それでEclipseを使うことになったのですが、計算機アプリを開発しながら基礎を学ぼう、ということで実践的かつ実用的なのが嬉しいですね~~
※改めてサイトを確認したらこのようなことは記載されておりませんでした。失礼いたしました。

# 環境
* Windows11
* GitHub2.39.2
* Eclipse2023(最新版)で日本語化されているもの

※Pleiades All in One ダウンロードしたため環境変数の設定やEgitのダウンロードなどは自動的に行われています。そのためこの2点に関する手順の記載はしていません。

　また、日本語化されているため手順に関しては日本語記述のあとに（英語）としています。

# 概要
やったこと
　1.ローカル環境ででGit管理できるようにする
　2.GitHubにリポジトリ作成
　3.ローカルリポジトリをリモートリポジトリへpushする
　4.一度リモートリポジトリをpullしてpushする
　5.ファイルに変更を加えたときは
おわりに
参考サイト

# やったこと
## 1.ローカル環境ででGit管理できるようにする
学習サイトの手順に従いプロジェクトを作り、ソースファイルを作成後、このサイトには載っていないものの足跡を残すためにGitと連携させる。

##### 手順
1. 新規プロジェクトやファイルを作成する
1. パッケージ・エクスプローラーで右クリック→チーム→プロジェクトの共有（Shere Project……）
1. 設定ダイアログが表示されるためEclipse のワークスペースをそのまま Git リポジトリにする場合、「Use or create repository in parent folder of project」にチェックする。
※そうでない場合は「Create Repository」に任意の名前をつける。
1. 「Create Repository」をクリック→「決定」（Finish）
これでプロジェクトがローカルでGit管理することができるようになった。


## 2.GitHubにリポジトリ作成
##### 手順
1. GiitHubにログイン→「New repository」→「Create repository」で任意のリポジトリ名を記入しリポジトリを作成する。
※このときにREADMEファイルが必要であれば「Initialize this repository with a README」にチェックを入れて一緒に作成する。
1. GitHubの認証パスワードとしてトークンを作成する。（2021年8月31日でパスワード認証が廃止となっているようなので）作成方法は公式の[個人用アクセス トークンの作成](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)を見て行ってください。

## 3.ローカルリポジトリをリモートリポジトリへpushする

##### 手順
1. Eclipseでプロジェクトを右クリック→チーム→ブランチのpush'main'（Push Branch 'master'……）をクリックする
1. 「リモートブランチへpush」（Destination Git Repository）のダイアログ表示がされるため、リポジトリのURL（https）、ユーザー名、パスワード（トークン）を入力する
1. 「次へ」を二回クリックして完了する。
1. リモートリポジトリのコミットを取り込んでいないためrejectされてしまうものの正常です

## 4.一度リモートリポジトリをpullしてpushする
##### 手順
1. プロジェクト名で右クリック→チーム→pull　からリモートリポジトリのpullを行う
1. 再び先ほどと同じ手順でリモートへpushすると無事成功し、GitHubの該当リポジトリ画面でリロードすると反省されていればOK

## 5.ファイルに変更を加えたときは
1. ファイルやフォルダなど何かしら変更を加えたら一度セーブする（WindowsなのでCtrl+sを打ち込む）。
2. Gitステージングに「ステージされてない変更」としてファイルが表示されるので＋マーク（または++マーク）を押してインデックスに追加すると「ステージされた変更」に移る
2. コミットメッセージを記入し「コミット」「コミットおよびpush」のどちらかを選択してpushすると反映される。
2. GitHubの該当リポジトリでリロードすると反映されていることが確認できる

# おわりに
以上、EclipseでGitを管理する工程です（もし間違っている箇所があればお手数ですが教えていただけると幸いです）

いつも環境構築には苦労しているので理解を深めて早く対処できるようになりたいですね（先人に感謝）

よし、Javaの基礎を学んでいこう！:writing_hand:

# 参考サイト
以下サイトを主に今回は対処しました。感謝:pray:
[Pleiades日本語化プラグイン](https://mergedoc.osdn.jp/#pleiades.html)（Eclipseダウンロードサイト）
[【Eclipse】 プロジェクト作成から GitHub に登録するまで](https://www.shookuro.com/entry/2018/12/16/164631)
[Githubにpushできなくなったときの対処法](https://codeaid.jp/blog/github-auth/)
[【Eclipse】GitHubと連携する方法について解説する](https://miya-system-works.com/blog/detail/100)

# 【追記】
計算機開発のサイトを見た気がしたのでもう一度探してみたところ、以下のサイトにありました。
基礎を押さえたらやってみようと思います！
[Javaで始めるプログラミングChapter12電卓を作ってみる](https://msyk.net/keio/JavaBook/eclipse-indigo/ch12.html)
CSVファイルのフィルタリング及びそのCSVファイルの出力

# RubyでCSVファイルをフィルタリングして新しいCSVファイルに出力する方法

この記事では、RubyでCSVファイルを読み込み、特定の条件に一致する行を抽出し、新しいCSVファイルに出力する方法を初学者向けに解説します。

## 準備

まず、RubyでCSVファイルを操作するためには、標準ライブラリである`csv`を読み込む必要があります。

```ruby:Ruby
require 'csv'
```

## 入力ファイルと出力ファイルの設定

次に、入力ファイル名、出力ファイル名、およびフィルタリング条件として部署名を指定します。

```ruby: Ruby
input_filename = 'employees.csv'
output_filename = 'filtered_employees.csv'
target_department = 'Engineering'
```

## CSVファイルの読み込みとデータの抽出

`csv_headers`と`filtered_data`という2つの配列を用意します。`csv_headers`はヘッダー行を格納し、`filtered_data`はフィルタリングされたデータを格納します。

```ruby:Ruby
csv_headers = []
filtered_data = []
```

1. `CSV.foreach`メソッドを使って、入力ファイルを読み込みます。`headers: true`オプションを指定することで、ヘッダー行を扱いやすくします。
1. headers: trueオプションを指定することで、CSV.foreachがヘッダー行（最初の行）を特別に扱い、カラム名をキーとして値にアクセスできるようになります。これにより、カラムの位置に依存せずに、カラム名でデータにアクセスできるため、コードの可読性と保守性が向上します。
1. `row.headers`の`headers`はメソッドで、現在処理している行が持っているカラムに格納されているデータを返します。このメソッドはCSVライブラリのCSV::Rowオブジェクトに対して呼び出されます（つまり、行に対してのみ使用可能）。
1. `csv_headers = row.headers if csv_headers.empty?`の部分は`csv_headers`がnilの場合に現在読み込んでいる行のカラムに格納されているデータをヘッダーとして使用させるための記述です。


```ruby
CSV.foreach(input_filename, headers: true) do |row|
  csv_headers = row.headers if csv_headers.empty?

  # 特定の部署に所属する従業員を抽出
  if row['department'] == target_department
    filtered_data << row
  end
end
```

## 抽出したデータを新しいCSVファイルに出力

最後に、`CSV.open`メソッドを使って新しいCSVファイルを作成し、抽出したデータを出力します。
1. CSV.openメソッドは、RubyのCSVライブラリに含まれるメソッドで、CSVファイルを開いて読み書きするために使用されます。
1. `CSV.open(output_filename, 'w') do |csv| `の `w`は、ファイルを書き込みモードで開くことを意味します。このモードでファイルを開くと、新しいファイルが作成され、既存のファイルがある場合は内容が上書きされます。このモードで開いたファイルに対して、データを書き込むことができます。

```ruby
CSV.open(output_filename, 'w') do |csv|
  csv << csv_headers
  filtered_data.each do |row|
    csv << row
  end
end
```

これで、特定の条件に一致する行を抽出し、新しいCSVファイルに出力するRubyプログラムが完成しました。このコードをカスタマイズして、さまざまな条件でデータをフィルタリングすることができます。
AWSソリューションアーキテクトアソシエイト試験を受けてきた際の備忘メモ

AWSソリューションアーキテクトアソシエイト試験を受けてきた際の備忘メモです

2023/5上旬に試験を受験(@京都某所のテストセンター)し、合格しました。
![スクリーンショット 2023-05-06 20.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/cb56a21d-abc9-0e7c-c56d-743e96e77538.png)

---
# 表題の試験概要

AWSを使ったシステム開発する人向けの試験です。

> https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
> AWS 認定ソリューションアーキテクト – アソシエイトは、幅広い AWS のサービスにわたる AWS テクノロジーに関する知識とスキルを示します。この認定の焦点は、コストとパフォーマンスが最適化されたソリューションの設計にあり、AWS Well-Architected フレームワークに関する深い理解を示します。この認定は、認定された個人のキャリアプロファイルと収益を向上させ、利害関係者やお客様とのやり取りにおける信頼性と自信を高めます。

---
# 受験の動機

以下をきっかけに2023/4/E頃から学習を始めました。

- 先日、[AWSクラウドプラクティショナー試験](https://qiita.com/seigot/items/278762335d018d6e57db)を受験してもっと知識を深めたいと思った
- 2023/4に行われた[AWS summit tokyo 2023](https://aws.amazon.com/jp/summits/tokyo/)の熱気がすごい（気がした）
- 今後、AWS関係の知識があると何かと便利かもと感じた

---
# 前提知識

過去に以下のようにIPA試験やAWS関連試験の受験経験がありました。

- [情報処理安全確保支援士試験を合格するために読んだ本まとめ](https://qiita.com/seigot/items/80a0ed8437b8918c723a)
- [エンベデッドシステムスペシャリスト合格に向けた学習進め方メモ](https://qiita.com/seigot/items/2890ee49de29964e1ead)
- [AWS クラウドプラクティショナー試験を受けてきた際の備忘メモ](https://qiita.com/seigot/items/278762335d018d6e57db)

:::note warn
当初は上記試験の知識を活かせば何とかなるはず、、と考えた事もありました。
しかし上記知識のうち、今回の試験に直接活きる部分は少なかったような気がします。（かろうじてクラウドプラクティショナー試験の基礎知識が活きたくらい）
:::

---
# 取り組み方

学習時に参考にした教材は以下の通り。

1.[AWS認定資格 無料WEB問題集＆徹底解説 ソリューションアーキテクト – アソシエイト](https://aws-exam.net/saa/)
2.[一夜漬け　AWS認定ソリューションアーキテクト　アソシエイト 直前対策テキスト](https://www.amazon.co.jp/gp/product/4798069086/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)
3.[AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)

:::note warn
1.2.で試験範囲を把握した後、3.を活用して理解を補っていく。試験勉強を始めた2023/4/E以降、隙間時間を繕って学習時間を確保した。（学習時間25hほど）
:::

---
# 感想

- 各サービスの機能や最適設計について知ることができてきた、嬉しい。
- [AWS認定試験一覧](https://aws.amazon.com/jp/certification/exams/)にある他の認定試験にもチャレンジしていきたい。
- 試験対策としては過去問活用が効果的（教科書は程々に過去問に取り組む。不正解の選択肢を理解するところまで考えると効率がよい）
- 学習時間は25~50h程が目安と思われるが、短期間だと辛いので1ヶ月〜など計画的に取り組んでいきたい。
- 試験対策のみならず、そろそろハンズオン的に何らかのサービスを作ってみたい。

---
# 後日談

実は試験前日の過去問では得点率60%前後を推移して怪しかったが、当日は運が良く無事に合格できた。合格が怪しくても思いきって受験してみるのが吉。

---
# 参考

https://aws-exam.net/saa/

https://www.amazon.co.jp/gp/product/4798069086/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

https://www.udemy.com/course/aws-knan/

https://qiita.com/yamazombie/items/d56e1f66ec03f8d115f4
`.msg` ファイルを Outlook Web から参照する方法（インストール不要）

## はじめに

レジストリはじめ OS にいろんなゴミが溜まっていくのが嫌なので、極力 PC にはソフトウェアをインストールしない派です。

基本的に Web 版が存在するものは Web 版を使っており、特にメーラーについては日々ストレージを圧迫していくこともあり、アプリケーションをインストールするにあたり一番抵抗感のある種類のものです。

ただ、時々ではありますが `ファイル` でメールが共有されることもあり、困っていたわけです。。

## `.msg` ファイルを Outlook（Web版）に取り込む

そんな中、感激するような方法を教えてもらったのでメモとして以下に記録しておきます。

1. 共有されたメールのファイル
    ![msg_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/75ba765e-204e-d546-621d-18b68a936f16.png)

1. Outlook（Web版）で新規メールの作成を選択し、`.msg` ファイルをメール本文エリアにドラッグ・アンド・ドロップ
    ![msg_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/c6a7ee93-f486-7e55-3c97-fec99d49bb44.png)

1. ファイルがメールに添付され、クリックすると `.msg` ファイルの中身が参照できる。
    ![msg_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/55949c49-20aa-bcee-7097-34819c4a6e7c.png)

    `.msg` ファイル内に添付してあった Excel ファイルも同じく Web版で参照可能。。

## まとめ

感動した！

でも、周りの反応は微妙だった。
【プログラミングスクール】Happiness Chainに入会してよかったこと、感じたこと

# はじめに
https://happiness-chain.com/

Happiness Chainに入会して3か月ほどたちましたが、ここまで学習を続けてきて加入してよかったと感じています。
スクールに加入すると何が得られるのか紹介したいと思います。
下記の様な方の参考にしていただけるとうれしいです。

- 未経験でエンジニアになりたいと思っている人
- プログラミングスクールの加入に迷っている人
- 現在もエンジニアだがスキルアップしたい人
- 幸せになりたい人

# 加入してよかったこと、感じたこと（Happiness Chainの魅力）
### 間違いなく成長できるロードマップがある
独学で学習を進めていると「何を勉強したら良いのか」、「どういう順番で勉強したら良いのか」わからないことだらけでした。
しかし、考え抜かれたロードマップが用意されているのでこういった不安がなくなり学習に専念できた点はよかったところです。<br>
実際に勉強を続けてきて感じたのはこのロードマップがなかったら、もっとず～～～っと非効率な学習をしていただろうなというのが正直なところです。
学習する教材、そしてどういった順序で学習するか、ということがいかに大事か痛感しました。

### 強力なメンターのレビューを受けることができる
レビューをしてくれるメンターは第一線で活躍している強力なエンジニアです。
独学では決して気づけないような気づきを与えてもらえます。
また、レベルの高いレビューを受けることで自信にもつながります。<br>
自分ひとりでやっていては学習を進めていても「本当に身についているのか？」等の不安が付きまとってしまいます。
不安や迷いが生じると学習にも悪影響があり、なかなか集中できなくなってしまうのではないでしょうか。

### 仲間が手に入る
スクール生同士でのコミュニケーションのおかげでモチベーションが継続できています。
チャットや音声通話で自由に交流も行っており、スクール生同士で学習内容について会話を行ったり、相談事や雑談等も行っています。<br>
一人きりではモチベーションの低下や孤独感による不安が付きまとうと思いますがこういった交流が活力になってここまで学習が続けてこれたと思います。
さらにスクールの卒業後も引き続きコミュニティに所属でき、学習中のスクール生とも
交流を持てます。<br>
実際にわたし自身も、既にスクールを卒業して転職に成功した方と仲良くさせていただいています。
学習していたときの話など聞かせていただいて、とてもためになっています。

### 学習する技術がモダン
ホームページを確認していただけるとわかると思いますが、モダンな技術がロードマップに盛り込まれています。ここまでいろいろな技術が学べるのはとても魅力的だと思います。

### 料金が安い
入会金もかからずサブスク(月額制)なので負担が少ないです。
分割払い等ではないので合わなければいつでもやめることができます。

未経験からエンジニアを目指すとなると進めていくなかで「エンジニアはやっぱり合わないな」等、相性も当然でてくると思います。
少しチャレンジしてみて違うと感じても比較的少ない負担でやめることができるのでリスクも少なくて良いと思っています。

### 幸せになれる
冗談かと思われるかもしれませんが、ロードマップの中には「幸せになるマインドを学ぶ」という内容もあります（笑）
こういった遊び心もHappiness Chainの魅力の一つだとわたしは感じています！

# 悪いところ？
良いところばかり書いてしまったので悪いところも書いてみようと思います。
##### 普通に大変です。
良いところでもあるのですが、ロードマップのボリュームがえぐいです。そして、難しいです。
けして楽してスキルが身につくわけではないです・・・
結局のところやるのは自分自身なので「継続しやすい環境」、「効率的な学習」が手に入ったところで簡単になるわけではないです。<br>
ちょっと脅してしまいましたが、未経験の方もロードマップをこなし卒業されているのでコツコツしっかりと進めれば大丈夫です！<br>
また進めている途中で「学習の進め方に問題がないか不安」、「わからないことだらけでどうしていいかわからない」こんな状況に陥ったとしても、いつでもメンターに相談可能（チャット、1on1等）なので安心して取り組めると思います。

# 最後に
学習を継続していくのは大変で、時にめちゃくちゃはまったり、頭がパンクしそうになる時もありますが、引き続き継続していきたいと思います！
#### 「継続は力なり！！！」
【Ruby】定数や変数を別の変数に代入すると元の変数の値も変更されてしまう

### はじめに
ある変数を別の変数に代入した後、代入後の変数に変更を加えると、元の変数まで変更が反映されてしまい、初めて知った挙動だったので、流れをまとめてみました。

### 概要
サンプルコードを以下に記します。
下記のように、クラス内で定義した```ADRESS```という定数を、メソッド内で利用するために、```adress```という変数に格納しています。

```ruby
class XXXX
  ADRESS = {"東京都":["中央区","千代田区"],"大阪府":["大阪市","堺市"]}

  def xxx
    adress = ADRESS
    ...
    adress.merge!({"愛知県":["名古屋市","豊田市"]}) ### adressに変更を加える
  end
end
```

この```xxx```というメソッドを実行後、各変数の値を確認すると、下記のような結果となりました。
```merge!```を行った```adress``` の値が変更されたのは意図通りでしたが、元の```ADRESS```の値まで変更が及んでいました。

```ruby
puts adress
=> {:東京都=>["中央区", "千代田区"], :大阪府=>["大阪市", "堺市"], :愛知県=>["名古屋市", "豊田市"]}

puts ADRESS
=> {:東京都=>["中央区", "千代田区"], :大阪府=>["大阪市", "堺市"], :愛知県=>["名古屋市", "豊田市"]}
```

### 原因
原因について、調べていたところ、ちょうど、下記の記事が参考になりました。

https://www.javadrive.jp/ruby/var/index4.html

記事の通り、各変数の```object_id```を確かめてみると、同じ値を返ってきており、2つの変数が同じオブジェクトを参照していたことがわかりました。

```ruby
### 同じオブジェクトを参照している
ADRESS.object_id
=> 17420

adress.object_id
=> 17420
```

このため、```adress```に変更を加えると、```ADRESS```にも変更が反映されてしまうということでした。

### 最後に
結構、長時間嵌ってしまいましたが、オブジェクトの振る舞いが確認できました。
あとは、定数が変化された時、エラーになってくれてたら、すぐ気づけたと思うので、定数の定義には、```freeze```とかした方がよさそう。
ChatGPTでPDFファイル名を自動で適切な名前にリネームするプログラム

## 概要
これは、OpenAIのChatGPTを利用してPDFファイルのファイル名を自動で適切な名前にリネームするプログラムです。指定された入力フォルダ内のPDFファイルを読み込み、その内容に基づいて適切な題名を生成し、出力フォルダにリネームされたファイルを保存します。

ソースコードは以下をご参照ください。
https://github.com/PsychYu/SmartPDF

【処理前のファイル（例）】
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634683/b63862ac-aa56-1530-c06f-7881934ac234.png" width="280px"> 

【処理後のファイル（例）】
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634683/229ba025-3149-6465-12e4-7c089e181ac1.png" width="420px">

## 環境構築
### Gitリポジトリのクローン
次のGitコマンドでリポジトリをクローンしてください。
```
git clone git@github.com:PsychYu/SmartPDF.git
```
Gitを導入していない場合、[GitHub](https://github.com/PsychYu/SmartPDF)のサイトから直接ダウンロードしてください。
### 必要なパッケージのインストール
次のコマンドで必要なPythonパッケージをインストールします。
なお、Python自体のインストールはすでに完了しているものとします。
```
pip install -r requirements.txt
```
### Tesseract OCRのインストール
[Tesseract OCR](https://github.com/tesseract-ocr/tesseract)をインストールします。デフォルトでは`C:\Program Files\Tesseract-OCR`が読み込まれます。別の場所にインストールした場合は、`settings.ini`の`tesseract_path`のパスを変更してください。

### Popplerのインストール
[Poppler](https://poppler.freedesktop.org/)をダウンロードし、解凍したうえで`smartPDF.py`と同一のディレクトリ直下に配置してください。別の場所に配置した場合は、`settings.ini`の`poppler_path`のパスを変更してください。

## 設定
`smartPDF.py`を実行すると、「OpenAI APIキーが設定されていません。settings.iniにAPIキーを設定してください。」と表示され、`settings.ini`が開きます。ここでOpenAIのAPIキーを追記してください。

## 使い方
1. プログラムを実行してメインウィンドウを表示させます。
2. 入力フォルダと出力フォルダを選択します。
3. 「開始」ボタンをクリックして処理を開始します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634683/7ff450ba-fe0a-49fb-abe2-2d84ab1b0227.png" width="300px">

入力フォルダ内のPDFファイルが読み込まれ、それぞれのファイルの内容に基づいて題名が生成され、出力フォルダにリネームされたファイルが保存されます。プログラムが完了すると、リネームされたファイルのサマリがポップアップウィンドウで表示されます。

※venvによる仮想環境を作成した場合は、`smartPDF.bat`を実行することで仮想環境が自動的に有効化され、プログラムが実行されます。仮想環境の名前は`venv`としています。もし別の名前にした場合は、`smartPDF.bat`を編集してください。

## 注意事項
- このプログラムは、OpenAIのChatGPTを利用して作成いたしました。APIキーは設定時にOpenAIのサービスにアクセスするために必要です。APIキーをお持ちでない場合は、先にAPI利用申請を行ってください。
- プログラムの使用には、OpenAIのAPI利用料が発生する場合があります。
- このプログラムはWindows 10でのみ動作確認を行っています。
- PDFファイルの解析にはOCR技術を利用しています。解析結果は100%正確ではないため、リネーム後のファイル名に誤りが含まれる場合があります。リネームされたファイル名を確認して問題がある場合は手動で修正してください。
- 入力フォルダ内のファイル数が多い場合、プロセスに時間がかかることがあります。適切な範囲でファイルを分けることをおすすめします。

## まとめ
これは、PDFファイル名を自動的にリネームするプログラムです。OpenAIのChatGPTを利用して、PDFファイルの内容に基づいて適切な題名を生成し、出力フォルダにリネームされたファイルを保存します。環境構築や初期設定を行うことで、簡単にPDFファイル名の整理が可能になります。是非お試しください。
【Android】アプリをフルスクリーンで表示する



通常だと　この状態のアプリが


![Screenshot_2023-05-07-20-48-51-82_7775b79a7312c35cfd35e081660950c8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/a95eb539-5a7b-04b2-c9ad-3faccefed993.png)








AndroidManifest内の  テーマに設定されているstyle内に 「android:theme=""」



        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>

を追加することで　

![Screenshot_2023-05-07-20-57-15-80_7775b79a7312c35cfd35e081660950c8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/28ecc3b7-ade8-5efc-e1d9-16e1762a8296.png)

このようにフルスクリーンにすることができます。

時間や充電状況、電波などの部分を表示したままにしたい場合は
windowFullscreenをfalseにすることで表示したままにできます。
Obsidianの小技その11｜Callouts機能でターミナルコマンドの記録をスマートに

## はじめに

### この記事を読むとできること

本記事では、ObsidianのCallouts機能を使って、ターミナルで実行したコマンドとその結果を簡単に記録・整理する方法を解説します。記事を読むことで、次のようなことができるようになります。

- Callouts機能を自分のObsidianに導入する
- ターミナルで実行したコマンドと結果をObsidianに記録・整理する方法を理解する

### 記事を書くにいたった背景

ふだんからObsidianを使って作業記録を取っています。タスクログと呼んでおり、知見の整理にとても役立っています。しかし、ターミナルで実行したコマンドやその結果をいい感じに記録する方法を見つけられておらず、手間がかかっていました。

このたび、ObsidianのCallouts機能を見つけ、その素晴らしさに感激しました。コマンドと結果を綺麗に整理できることに驚いてしまいました。

この記事ではCallouts機能の使い方や活用方法を紹介し、ぜひ魅力を知っていただきたいと思い、筆をとりました。ぜひ、Callouts機能を導入して、効果的な知識管理を実現してください。

## 概要

Before/Afterを見ていただくのが早いかと。

### Callouts利用前

![SS 2023-05-07 20.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/1662600d-2d7f-d7eb-b0ed-f7d9568767ab.png)


### Callouts利用後

![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/ab06f92d-bae6-903b-4c74-d7d4206b7139.gif)


最初はタイプしたコマンドだけ表示しておき、`>`をクリックするとコマンドの実行結果を表示する、というタスクログを作成できます。

## 詳細

### インストール方法

不要。デフォルトで使えます。

### 利用方法

- クォートブロックを作成
- 1行目に`[!info]- `などを追加

たとえば、上記を例にすると

```markdown
> [!success]- $ brew tap sidneys/homebrew
> Running `brew update --auto-update`...
> ==> Auto-updated Homebrew!
> Updated 4 taps (homebrew/services, koekeishiya/formulae, homebrew/core and homebrew/cask).
> ==> New Formulae
> aarch64-elf-gdb                 go-feature-flag-relay-proxy     llvm@15                         renovate                        wazero
> aichat                          hexer                           mdt                             streamvbyte                     zpaqfranz
> blocky                          hz                              musikcube                       trurl
> dexter                          imessage-exporter               notify                          tt
> enchive                         ksops                           opal                            typst
> flavours                        libansilove                     openssl@3.0                     victoriametrics
```

と書きます。

### 細かなコツ

- `[]`のあとに`- `をつけると「折りたたみせよ」という意味になります。
- 複数行をクォートブロックにするには、複数行を選択し、コマンドから「ブロッククォートをトグル」を使用すると便利です。
- 「ブロッククォートをトグル」にショートカットキーを割り当てておくと便利です（`cmd/ctl + shift + .` にしました）。
- `[!info]`以外にも`[!note]`や`[!tips]`など、さまざまなタイプが選べます。くわしくは公式ヘルプご参照 → [Callouts - Obsidian Help](https://help.obsidian.md/Editing+and+formatting/Callouts)

## おわりに

ObsidianのCallouts機能を活用し、ターミナルで実行したコマンドとその結果を効率的に記録・整理する方法を紹介しました。Callouts機能を活用することで、タスクログの見やすさと整理が格段に向上し、知識管理がより効果的に行えるようになります。

ObsidianのCallouts機能はデフォルトで利用可能であり、インストールや設定の手間もありません。Obsidianを使った情報管理がさらに充実し、作業効率が向上するとおもいます。

最後に、Obsidianは多機能なアプリケーションであり、Callouts機能だけでなく、他にも多くの機能が存在します。Obsidianの機能をさらに活用することで、より効果的な知識管理を実現してください。それでは、あなたのObsidianライフがさらに充実することを願って、筆を置かせていただきます。


### 参考リンク

[Obsidian｜使いかたとコツ（目次）](https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4)


### 環境

ここで書いていることは、下記のバージョンで実施しました。

- Obsidian v1.2.5
- macOS Ventura 13.3.1（22E261）
-  MacBook Pro (14-inch, 2021)
Rubyブラックジャック開発：ソフトウェアエンジニアからのフィードバックと変更例

# はじめに
Rubyでオブジェクト指向の練習アウトプットとしてコンソール上で遊べるブラックジャックゲームを作成しました。
そのコードに対して現役ソフトウェアエンジニアの方からフィードバックを頂く機会があり、その内容を記事にしました。

# 概要
以下の点についてフィードバックを受けました。
1. 紛らわしい命名は避ける
1. 継承する場合は抽象クラスを用意する
1. 実行ファイルの名前と内容について


# 紛らわしい命名は避ける
以下2点の指摘がありました。
- クラス名に`controller`という単語を入れるとMVCモデルを連想するので避ける
- `loop`という単語は非エンジニアには一般的ではないので避ける

### controllerについて
ゲームの進行を管理するクラスの名前を`BlackjackController`にしたのですが、この`Controller`がMVCモデルのコントローラーを連想してしまうという指摘を受けました。
今回MVCモデルを採用した訳ではないので紛らわしい命名となってしまいました。

##### 変更例
`Game`クラスとする。

### loopについて
今回、ゲームの進行を管理するクラスに以下のメソッドを用意しました。
```ruby
def loop_player_turn
    # プレイヤーターン時の処理
end

def loop_dealer_turn
    # ディーラーターン時の処理 
end
```
こちらのメソッド名に含まれる`loop`について指摘を受けました。  

業務上コードを読む人間はエンジニアに限らず、**非エンジニアの方**もいる。
それなのでエンジニア目線で読みやすい命名ではなく、できるだけ**非エンジニアの方にも読みやすい命名**を心掛けた方が良いとのことでした。

※`loop`が非エンジニアの方にとって一般的ではなく直感的に理解しにくいのでは？とのことでした。

##### 変更例
`player_turn`
`dealer_turn`とする


# 継承する場合は抽象クラスを用意する

今回作成したブラックジャックはディーラー（CPU）とプレイヤー（自分）の2人対戦の形式を取りました。
そこで
- `Player`クラス
- `Dealer`クラス　　

の2つを用意し、`Dealer`クラスに`Player`クラスを継承させました。
この点について指摘を受けました。

- **"is-a"の関係が成り立たない**にも関わらず継承させた。
- **具象クラス間**で継承させた。

これらの点がよくありませんでした。

#### 変更例
`Player` `Dealer`の両クラスに共通する要素を抜き出して新たに**抽象クラス**を用意し、`Player` `Dealer`それぞれに継承する。
抽象クラスの名前候補として、`Participant` `Actor` `GameMember`などが考えられる。


# 実行ファイルの名前と内容について
以下2点の指摘がありました。
- 実行ファイルは一般的には **`main.rb`**
- 処理の流れを制約する（縛る）記述をする

### 実行ファイルの名前について
今回実行ファイルの名前を`blackjack.rb`としていました。
この名前は問題があるわけではないが、一般的には __`main.rb`__ とした方がベターとのことでした。

### 処理の流れを制約する記述にする
実行ファイルのコードです。（修正前）


```ruby
require_relative 'blackjack_controller'

game = BlackjackController.new
game.start
game.loop_player_turn
game.loop_dealer_turn
game.show_final_scores
game.show_result
game.finish

```
この記述だとメソッドの呼び出し順を簡単に入れ替えることができてしまい、それによってゲームが破綻してしまうとの指摘を受けました。
言い換えれば、**処理の順番を制約できていない**とのことでした。

##### 変更例
実行ファイルでは、例えば`play`メソッドのみを呼び出し、ゲームの進行（順）については、`game`クラスの`play`メソッド内に記述する。

```ruby
require_relative 'game'

game = Game.new
game.play
```


# まとめ
継承についての言及もありましたが、全体的に
 __「直感的に読みやすいかどうか」__ という一言にまとめられるようなフィードバックでした。

- 非エンジニアにもわかりやすい命名を心掛ける
- 実行ファイル名など通例が存在するものは踏襲する
- 既成の概念と被る名前を別の意味合いで使うと混同してしまうので避ける


# おわりに

最後まで読んでいただきありがとうございます。
私と同じ様な学習段階の方々にとって少しでも参考になれば幸いです。

内容に不備がありましたら遠慮なくご指摘いただけると嬉しいです。
モデル駆動アプリのアクティブビューでソート条件を保存する

**ソート条件の保存方法**

モデル駆動アプリを再生状態にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/633350d8-4ab9-73c2-3f7f-9d5f7b645f95.png)

ソート条件を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/b77fb433-0029-10e2-b15b-108acebe11b8.png)

「新しいビューとして保存」を押下しする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/9086eab1-a7c2-8733-d4e8-b728fd8b99ea.png)

名前等設定して作業完了。
【Tips】『メンテナンス』の観点からなるべく「ライブラリ」は使用するべきではない。

『自分で実装するのが簡単に見えるライブラリ』は
インストールせずにできる限り自分でコードを書いた方がいい。

というのは、ライブラリとは他人が作ったプロジェクトなので、
たくさんライブラリを使っていくと他人任せな保守性が悪いプロジェクトになってしまうから。

基本的にXcodeのバージョンアップに、ライブラリも対応していかなければならない。なので、Xcodeのバージョンアップをした時に、ライブラリでエラーになることがある。

ちゃんとしたライブラリ(企業が作っているライブラリや有名なライブラリなど)は、Xcodeのバージョンアップのたびにメンテナンスしてくれるが、そのような個人が作ったマイナーなライブラリだと、メンテナンスしてくれない可能性がある。

なのでバージョンアップのタイミングでエラーになったりすると、
そのライブラリの中身を確認して修正しなければならない。
ライブラリの修正はかなり難しい。

そして、もし修正が難しければそのライブラリは使わないという選択をしなければならない。使わないとなれば一から作成することになり、すぐにバージョンアップしたいのに、できないという状況になる。

『自分で実装するのが簡単に見えるライブラリ』の一例としては
「星5段階で評価するUI」など。

要は、有名なライブラリ以外はなるべく使わないほうが良い。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

## 《見極め方》

##### ◆ ライブラリの更新頻度

##### ◆ ライブラリを検索した時に、10件以上記事があること。

##### ◆ ライブラリを出しているのが個人か起業かどうか。

##### ◆ そのライブラリの容量はどのくらいあるのか。

##### ◆ spmに対応しているか。

##### ◆ ライブラリを使う場合は、アプリ内に明記しなければならない等。

→ RealmSwift, SwiftLint, 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

「星5段階で評価するUI」をライブラリを使わずにコードで書いた例。

```
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var ratingImageView: UIImageView!
    
    var rating: Int = 0 {
        didSet {
            let imageName = "star\(rating)"
            ratingImageView.image = UIImage(named: imageName)
        }
    }
    
    @IBAction func ratingButtonTapped(_ sender: UIButton) {
        // rating を更新します。
        if rating == 5 {
            rating = 0
        }
        rating += 1
    }
}
```

この例では、１つのボタンで星の評価を行います。
ボタンをタップするたびに、ratingの値を1ずつ増やしていきます。
ratingの値が5になったら、また最初の評価に戻るように実装しています。

また、星の画像を表示するために、ratingImageViewを使用しています。
ratingの値が変更されるたびに、imageName変数を更新して、
対応する星の画像を読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/c9b1d23c-ab36-99c6-1ba7-dfaa57738cce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/e68fa5fb-75f5-2833-6552-eb3dd8dec56e.png)
Jest×Next.js×TypeScriptでテストを書く準備

（テストコードを書き始めたので、今後忘れないように、自分用にメモします）

## テンプレートを作成
```
npx create-next-app@latest --ts next-sample
```

## Jestをインストールする
（Jest以外にも、必要なライブラリをインストールする）
```
npm install -D jest @testing-library/react @testing-library/jest-dom jest-environment-jsdom
```

## Jest-DOMを使えるようにする
ルートディレクトリに、jest.setup.tsを作成し、以下を書く
（このファイルを作るのは必須ではないが、その場合、jest.config.tsのsetupFilesAfterEnv: ['<rootDir>/jest.setup.js'],を消す。）

```typescript
import '@testing-library/jest-dom/extend-expect'
```

## 設定を書く
ルートディレクトリに、jest.config.tsを作成し、以下を書く

```typescript
const nextJest = require('next/jest')

const createJestConfig = nextJest({
  dir: './',
})

const customJestConfig = {
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
  moduleDirectories: ['node_modules', '<rootDir>/'],
  testEnvironment: 'jest-environment-jsdom',
}

module.exports = createJestConfig(customJestConfig)
```

### テスト
あとはテストコードを書くのみです。


以上
GitHubコマンド、略称の付け方

# <font color="MediumPurple">はじめに</font>
GitHubをコマンド操作していると、よく使うコマンドが出てきます。
たとえば、`commit`や`status`等…
何度もうつの大変ですよね…><
これらに略称をつけることができるので紹介します!!



# <font color="MediumPurple">コマンドにエイリアスをつける　</font>

#### **<font color="DarkOrange">`git config --global alias.希望のエイリアス名 元のコマンド`</font>**

で出来ます!!

#### <font color="HotPink">**例１**</font>


**<font color="DarkOrange">`git config --global alias.c commit`</font>**

`commit`というコマンドに　`c`というエイリアスを割り当てますよ~

今後、 **`git c -m "コメント"`**　でコミットできます。


#### <font color="HotPink">**例２**</font>

**<font color="DarkOrange">`git config --global alias.st status`</font>**

`status`というコマンドに　`st`というエイリアスを割り当てますよ~

今後、 **`git st`**　で、ステータスが確認できます。

# <font color="MediumPurple">--global の意味</font>

`--global`をつけることで、PC全体に設定を反映できます。

`--global`がないと、git initしたフォルダのみに適用されます。

# <font color="MediumPurple">エイリアスとは</font>

「別名」や「通称」って意味が近いでしょうか・・・
「あだ名」・「ショートカット」ともいえます。
by辞書　>> ファイル等の実体を別の名前で参照するシンボル及び機能のこと

gmailでもエイリアス使えたりしますよね...
考えてみると、1アカウントで複数のアドレスが利用できるってスゴイ

ありがとうございました!!!

# <font color="MediumPurple">参考</font>
[Udemyもう怖くないGit！チーム開発で必要なGitを完全マスター](https://www.udemy.com/course/unscared_git/)
Dockerネットワークで遊ぶ_その2_イーサネットヘッダ編

## はじめに

[前回記事](https://qiita.com/t13801206/items/0fd95e85377098f996b3)では、Dockerの分離されたネットワークにサーバとクライアントをつくった

今回は、クライアント(ubuntu)にインストールした`gcc`が使用するヘッダーファイル(`.h`)の中身を見ていく
レイヤ２のイーサネットヘッダに焦点を当てる

### 連載情報

連載|内容
---|---
[その１](https://qiita.com/t13801206/items/0fd95e85377098f996b3)|〈実践〉同じセグメント内のPING疎通確認
[その2](https://qiita.com/t13801206/items/0858f2af9c57a9db65aa)|〈コード〉イーサネットヘッダの中身をみてみる
[その3](https://qiita.com/t13801206/items/81459f9374bffcd293ec)|〈コード〉ARP,IP,ICMPの中身をみてみる
[その4](https://qiita.com/t13801206/items/478493c1527cbcf0511c)|〈実践〉IP,TCPをキャプチャする
[その5](https://qiita.com/t13801206/items/7fa2f7bf75021899e05e)|〈実践）ルーターを準備する
[その6](https://qiita.com/t13801206/items/0aa1d0f2b762d013e9f8)|〈実践〉別セグメントのWEBへアクセスをする

## イーサネットフレームのフォーマット

イーサネットを流れるデータの呼称は、OSI参照モデルのレイヤ（層）に応じて、**フレーム**だったり**パケット**だったりと変化する
が、
瑣末なことなので、変化するということだけ覚えておけばよいと思う（自論）

章タイトルにフレームと書いているので、ここではデータリンク層（OSI第２レイヤ）が対象

フレームの中身がどうなっているのかは、下記参照
参考：[Ethernet LAN - イーサネットフレームのフォーマットとMACアドレス](https://www.infraexpert.com/study/ethernet4.html)
> 現在、最も使用されているイーサネットフレームはDIX仕様です。

### DIX仕様

DECの社名が起源に書かれている
DECといえば、[戦うプログラマー](https://bookplus.nikkei.com/atcl/catalog/09/P47570/)の主人公（！？）デヴィッド・カトラーが居た会社

### MACアドレスを調べる 6byte

`ifconfig`です（Windowsでは`ipconfig`）
または`ip addr`です

MACアドレスの最初の**3byte**はベンダー固有値であるが
`02:42:ac`で始まるものはヒットしない
 [MACアドレス検索](https://uic.jp/mac/)

その理由は、[stack overflowでも明確な答えはなかった](https://stackoverflow.com/questions/42946453/how-does-the-docker-assign-mac-addresses-to-containers)

#### 6バイトすべてを0xFFにすると

ブロードキャストアドレスになります

### タイプ／長さ 2byte

dockerからクライアントのターミナルに入ってコマンドを打つ

2byteのタイプ`ETHERTYPE_***`一覧が書かれている箇所がある　※一部抜粋

```c:cat /usr/include/net/ethernet.h
/* Ethernet protocol ID's */
#define ETHERTYPE_PUP           0x0200          /* Xerox PUP */
#define ETHERTYPE_IP            0x0800          /* IP */
#define ETHERTYPE_ARP           0x0806          /* Address resolution */
#define ETHERTYPE_REVARP        0x8035          /* Reverse ARP */
#define ETHERTYPE_VLAN          0x8100          /* IEEE 802.1Q VLAN tagging */
#define ETHERTYPE_IPV6          0x86dd          /* IP protocol version 6 */
#define ETHERTYPE_LOOPBACK      0x9000          /* used to test interfaces */
```

### イーサネットヘッダー

同ヘッダーファイルに、イーサネットヘッダーの構造体が定義されている
送信元と宛先のMACアドレスと、タイプ／長さの2byteの3メンバ構造体

```c
/* 10Mb/s ethernet header */
struct ether_header
{
  uint8_t  ether_dhost[ETH_ALEN];       /* destination eth addr */
  uint8_t  ether_shost[ETH_ALEN];       /* source ether addr    */
  uint16_t ether_type;                  /* packet type ID field */
} __attribute__ ((__packed__));
```
attribute, packedについての説明は[こちらのブログ](https://syohex.hatenablog.com/entry/20110908/1315494911)が参考になる

[uint8_t ‐ 通信用語の基礎知識](https://www.wdic.org/w/TECH/uint8_t)

## 余談～MTUに関するIPAの出題例

[IPAネスペ令和5年午後2問5](https://www.ipa.go.jp/shiken/mondai-kaiotu/2023r05.html)において

MTUのサイズ(1500byte)からIPヘッダーTCPヘッダーの合計40byteを引いた値が
フラグメントが起きずにデータを遅れる最大量であるという問題が出た

ここでMACヘッダーが**14byte**であるのは
送信先MACアドレスと送信元のMACアドレスが各**6byte**で合計**12byte**
それに加えてタイプ／長さが**2byte**あるので、合計**14byte**となる

## 糸冬了！！
spreadsheetのimage関数用の簡単な高さ合わせの方法

　googleのspreadsheetには、image関数という指定したURLから画像を引っ張ってくる関数があります。この関数ですが、セルに合わせるか元のサイズで表示したりするモードがありますが、セルそのものの高さは変更しない仕様になっています。


https://support.google.com/docs/answer/3093333?hl=ja

# やり方
A列は画像URL、B列にはimage関数で、第1引数にURLのセルを指定しています。
C列には
```="文字"&REPT( char(10)&"文字" ), 【高さ入力箇所】-1)```
C1が高さを入力する箇所です。
あらかじめ、２、３行目は高さを自動調整となるようにし、A列は折り返しを無しにしてあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132088/2bc34ec5-13d1-07fd-58df-d9244d32169f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132088/51f1ff9a-d386-c9ba-ed9d-b82796ad18e6.png)

C1の値を変化させると、
高さ＝２
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132088/ee46fd48-2eb7-688c-9791-594ff0f8ca62.png)
高さ＝７
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132088/710145d8-7466-155a-adf1-80eafa575c53.png)
横幅が小さいと、上のように空白ができますが、
Bの列を調節すれば、ちゃんと大きくなってくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132088/a84616b3-e0cb-363a-401a-40a1675bb49d.png)

以上です。
ちなみに、文字の部分はなくても普通に機能します。行を非表示にすると機能しません。
また、行内の一番行数があるセルに合わせるのでその点は注意です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132088/d3b9c5b1-b98c-4d15-4b69-d9b6079a15a0.png)

# Excel for Webでの挙動では
執筆時点（2023年5月7日）ではExcel for Webでは、行の高さ自動調節がボタンとかクリックとかのタイミングでしか機能しないため、うまく機能しませんでした。
4次方程式「2023近畿大学医学部後期【１】」をWolframAlphaとsympyでやってみた。

WolframAlphaとsympyのグラフがでます。

オリジナル(youtube)

https://youtu.be/DnBkAx1eeFk

2023年解答速報
https://www.mebio.co.jp/files/answer/2023/M_kindai_2023B.pdf
医学部後期　YMS問題解答講評＜近畿大学 
https://kamelink.com/exam/index.php?2023%C7%AF%B2%F2%C5%FA%C2%AE%CA%F3#t74d4546

上と同じです。大学入試数学問題集成＞テキスト
未登録
https://mathexamtest.web.fc2.com/daigakubetumj/index.html#osaka

# WolframAlphaで

https://www.wolframalpha.com/input?i=x4%2B4x3%2B7x2%2B2x-5&lang=ja

上と同じです。

https://www.wolframalpha.com/input?i=x**4%2B4*x**3%2B7*x**2%2B2*x-5&lang=ja

# sympyで(オリジナル様の方法を参考に)
勉強中


# sympyで(解と作図だけ)

```python
from sympy import *
x=symbols('x')
f=x**4+4*x**3+7*x**2+2*x-5
print("#",solve(f))
plot(f)
plot(f,(x,-2,2))
# [-3/2 - sqrt(11)*I/2, -3/2 + sqrt(11)*I/2, -1/2 + sqrt(5)/2, -sqrt(5)/2 - 1/2]
```

①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

？？？？plotコマンドは、縦横比？異なります。
![1png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/a2ca6e94-754d-7df3-538f-a986755e0dbf.png)
![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/67e7154f-cb5c-ff8f-6024-d01d56eb6346.png)


# sympyで(sympy的?安易なやり方。誘導に従って。)

```python
from sympy import *
x=symbols('x')
f=x**4+4*x**3+7*x**2+2*x-5
t,alpha=symbols('t alpha')
myPoly=Poly(f.subs({x:t-alpha}),t)
alpha_ans=solve(myPoly.coeffs()[1])[0]
A,B,C=Poly(myPoly.subs({alpha:alpha_ans})).coeffs()[1:] 
print("#(1)",alpha_ans,A,B,C)
#
a,b,c=symbols('a b c',real=True)
myEqLhs=t**4+A*t**2+B*t+C
myEqRhs=(t**2+a)**2+b*(t+c)**2
ans=solve(Eq( myEqLhs,myEqRhs ),[a,b,c])[0]
print("#(2)",ans)
#
h=myEqRhs.subs({a:ans[0],b:ans[1],c:ans[2] })
myEq1=Eq(factor_list(h)[1][0][0],0 )
myEq2=Eq(factor_list(h)[1][1][0],0 )
print("#(3)",solve(myEq1)+solve(myEq2))
#(1) 1 1 -4 -3
#(2) (1, -1, 2)
#(3) [1/2 - sqrt(5)/2, 1/2 + sqrt(5)/2, -1/2 - sqrt(11)*I/2, -1/2 + sqrt(11)*I/2]
```

# 参考
4次方程式の勉強中

https://qiita.com/mrrclb48z/items/b46d2fc539a9e35bc6bb

sympy

https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.polytools.poly


https://www.geeksforgeeks.org/python-sympy-factor_list-method/
LeetCode　2619. Array Prototype Lastの解き方



配列の最後の要素を返す問題です。空配列の場合は-1で返します。

### 自分の解き方

```
Array.prototype.last = function() {
    if (!Array.isArray(this)) {
        return
    }

    const result = this.length === 0 ? -1 : this[this.length -1]


    return result 
};
```

### ベターな解放
よくよく考えたら、数値の0はfalseとみなされるのでわざわざ、`this.length ===0`と書く必要はなかった。

```
const result = this.length ? this[this.length -1] : 0
return result
```

### falseとみなされる値
- 0
- -0
- 空文字('')
- 0n
- null
- undefinend
- NaN
Azure Functions(従量課金プラン)でIPアドレスによるアクセス制限を実施

## 目的
タイトル通り
## 事前準備
- 何かしらのAzure Functionsを作成しておく
## 手順
### 1. 対象のAzure Functionsにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333416/e617c451-358f-7832-c199-ab63a3b0dd40.png)

### 2. ネットワークを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333416/e3f67556-8f0a-bcda-5197-bb5041504fc1.png)

### 3. アクセス制限を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333416/d69c58e9-17a9-55e0-4078-89d6570f86be.png)

### 4. 追加を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333416/275ab72c-1fb3-fc30-e94a-1daf4e6da4d8.png)

### 5. アクセス許可したいIPアドレスを入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333416/aeaddcef-9d4b-7534-bd73-854eac90ccd4.png)

入力例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333416/ad4a7cee-c750-9bc3-8e02-01d4ed479ba8.png)
Android JetpackCompose タップで画像を切り替える方法

簡単なタップすると画像が切り替わるImageViewの実装のサンプルです。
あまり利用頻度は高くないですが、たまに使用したりするので、実装例として残しておきたいと思います。


```ImageSample.kt
@Composable
fun ImageSample() {
    var showDelete by rememberSaveable { mutableStateOf(false) }
    Image(
        if (showDelete) {
            painterResource(id = android.R.drawable.ic_delete)
        } else {
            painterResource(id = android.R.drawable.ic_input_add)
        },
        contentDescription = null,
        modifier = Modifier.clickable {
            showDelete = !showDelete
        }
    )
}

@Preview
@Composable
fun ImageSamplePreview() {
    ImageSample()
}
```

タップするとデリートアイコンに切り替わりもう一度タップするとインプットアイコンに切り替わります。
『単体テストの考え方/使い方』を読んだ感想

:::note warn
この記事の内容は技術書を読んだ感想や個人的な考察です。
:::

# 書籍情報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595926/0701cf35-4a48-7075-f491-658b5513a116.png)

**質の高いテストを行い、ソフトウェアに価値をもたらそう！**

著作者名：Vladimir Khorikov
編集者名：須田智之

[Unit Testing Principles, Practices, and Patterns](https://www.manning.com/books/unit-testing)の翻訳書。

https://book.mynavi.jp/ec/products/detail/id=134252

# なぜこの本を読んだのか

ソフトウェア開発において単体テストは基本的に必要なものだと考えています。
単体テストが無いと、変更に対して自信を持つことができません。代わりに時間がかかるE2Eレベルの手動テストをしたり、バグが多く発生してその修正が必要になることでスピードが低下します。また、スピードの低下をカバーするために、リファクタリグなど保守性に関わる作業を後回しにしたり、テストケースを省いたりすることで質が低下します。
このようにスピードの低下が質の低下させ、質の低下がスピードの低下を招くという悪循環が発生し、開発を継続することが困難になっていきます。

このように考えて単体テストを積極的に実施していますが、単体テストの価値やトレードオフ、良し悪しの判断など、曖昧な部分が多くあったのでこの本を手に取りました。

# 当書から得られたこと

## 単体テストの定義

そもそも、単体テストとはどういったテストのことを言うのか？統合テストとの違いは何か？という部分が不明確でした。そして、これは私だけではなく、人によってテストの分類の認識が異なる、ということがよくあるようです。[^1]
[^1]: サバンナ便り〜自動テストに関する連載で得られた知見のまとめ〜 https://forkwell.connpass.com/event/281043/

当書では、まず第１部で２つの学派（古典学派、ロンドン学派）の違いについて分析しつつ、単体テストを**３つの性質**で明確に定義しています。そして、この明確な定義を土台として以降の話が展開されていきます。

テストについて議論する際、こうしたテストの分類について認識を揃えることが大切なのだと思います。

## 良い単体テストの定義とトレードオフ

単体テストにも良し悪しがあり、悪い単体テストが増えてしまうと、開発を持続させることが難しくなってしまいます。では「良い単体テスト」とはどのようなものでしょうか？

当書では"良い単体テストを構成する**４本の柱**"として定義しています。そして様々なプラクティスについて、この４本の柱に対してどのような影響があるのか、という観点で説明されています。

また、４本の柱のトレードオフをどのように考えるべきか、という指針も得ることができました。

## モックをどのように使うのか

私が初めて書いたテスト・コードはモックが多く使われていて、テストに対して自信が持てなくなったり、テスト・コードが長く保守するのが難しい状態になってしまいました。

こうした問題を回避して適切のモックを活用するための、モックの対象（依存）にはどのようなものがあるのか、どのような依存をモックに置き換えるべきなのか、といった点について学ぶことができました。

## プロダクション・コードの設計

テスト・コードとプロダクション・コードは対になるものです。私が初めて書いたテスト・コードが良いものにならなかったのは、テストに関するスキルが不足していただけではなく、プロダクション・コードの設計が良くなかった事も大きいです。

そのプロダクション・コードの分類や、どのようにプロダクション・コードをリファクタリングして単体テスト（あるいは統合テスト）を改善していくか、という点について学ぶことができました。

# 考察

## テストのフェーズの区切り

当書ではAAAパターンの各フェーズを示すコメントについて、空白行で区切れるなら不要、としています。
これについては基本的に同意しますが、GitHub CopilotなどのAI支援を受ける場合は、一律で各フェーズを示すコメントを入れたほうが、その恩恵を受けやすいように感じています。

## 管理下にない依存をモックする

当書ではモックする対象として「管理下にない依存」としていますが、Next.jsで開発していて、次のような構造になることがありました。

- テスト対象
    - Web API（管理下にある） 
        - データベース（管理下にない）

このような構造の場合、テスト対象をテストするにあたり、Web APIへのリクエストはモックすべきかどうかを考えました。私の考えとしては、このWeb APIは管理下にないデータベースへの中継であるので、「実質管理下にない」としてモックするのが良いと考えています。

- テスト対象
    - Web API（管理下にある）
        - 管理下にある依存 
        - 管理下にない依存

また、このように管理下にある依存と管理下にない依存を両方含む場合も同様に、実質管理下にないと考えています。
そして、Web APIをテスト対象としてテストする場合に、管理下にない依存だけをモックに置き換えます。

## テスト・コードのテスト

単体テストをするにあたって、テスト・コードのテストはどうするのか、という疑問がありますが、残念ながら当書では扱っていませんでした。これについて是非著者の意見を聞いてみたいところです。
私の考えとしては、TDDのように最初に失敗することを確認したり、一時的プロダクション・コードに誤りを入れて確認する方法があると思います。

# まとめ

当書はページ数**400**と、エヴァンス本（約500ページ）に近い分厚さです。一度通して読んだだけで全て身につくものではないですが、その一部を取り入れて実践するだけでも役に立っている実感があります。これからも繰り返し読み返すことになるでしょう。

また当書で紹介されていた、依存の管理に関する書籍[^2]や、著者のブログ[^3]も興味を惹かれる内容なので読んでみたいと思います。

[^2]:Dependency Injection Principles, Practices, and Patterns https://www.manning.com/books/dependency-injection-principles-practices-patterns
[^3]:Enterprise Craftsmanship https://enterprisecraftsmanship.com/
MariaDB に外部から接続する方法

こちらのページを参考にしました。
[Host xxx is not allowed to connect to this MySQL server の対応](https://zenn.dev/ryo_kawamata/articles/mysql-connect-error)

次が必要です。
<ol>
<li>サーバーの設定</li>
<li>外部から接続できるユーザーの作成</li>

## サーバーの設定

```text:/etc/mysql/mariadb.conf.d/50-server.cnf
(省略)
# bind-address            = 127.0.0.1
(省略)
```

MariaDB の再起動

```bash
sudo systemctl restart mariadb
```

## 外部から接続できるユーザーの作成

次の状況では、外部から接続できません。

```text
MariaDB [(none)]> select user, host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
| scott       | localhost |
+-------------+-----------+
4 rows in set (0.001 sec)
```

次の状況では、外部から接続ができます。

```text
MariaDB [(none)]> select user, host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| scott       | %         |
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
| scott       | localhost |
+-------------+-----------+
5 rows in set (0.002 sec)
```

ユーザーの作成方法

```sql
CREATE USER 'scott' identified by 'tiger123';
GRANT ALL PRIVILEGES ON *.* TO 'scott'@'%' with grant option;
```

## 外部から接続

```text
$ mysql -uscott -ptiger123 city -h 10.39.166.1
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 36
Server version: 10.11.2-MariaDB-1-log Ubuntu 23.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [city]>
```
Ubuntu G500 内蔵マイクの問題解決

ここしばらく問題になっていた、UbuntuでG500の内蔵マイクの問題は

https://wiki.archlinux.org/title/PulseAudio/Troubleshooting#Static_noise_in_microphone_recording

ここの

3.1 Microphone not detected by PulseAudio

で解決。PulseAudioの問題でした。
AWS認定SAA-C03 勉強まとめ【S3のアクセス制御方法をまとめた】

## IAMロール

- IAMユーザ/ロールに対してできるアクションやリソースの制御を行う
- **特定のアクセスを必要とするEC2インスタンスにアクセス権限を付与することができる**
- S3の場合、バケット、フォルダへのアクセス制御を行うことができる

## バケットポリシー

- アクセス制御は**アカウント内のIAMの他にクロスアカウント(他のAWSアカウント)のアクセス制御を行うことができる**
- バケットポリシーはあくまでもバケット側で特定のEC２インスタンスからのアクセスに限定する際に設定する

## ACL

- バケット及びオブジェクト単位で細かなアクセス制御を行うことができる。
- **アカウント内のIAMの他に、外部からのアクセスに対しても制御を行うことができる。**
- IAMポリシーやバケットポリシーでDenyポリシーが設定されていた場合、IAMポリシー/バケットポリシーの拒否が優先される。
(リンクだけです)「4次方程式 (英:quartic equation)」を調べた。

https://www.deepl.com/ja/translator#ja/en/非常に奥が深そうなので、さわりだけにしました.

# wikipedia

https://ja.wikipedia.org/wiki/%E5%9B%9B%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F

https://en.wikipedia.org/wiki/Quartic_equation


# 過去問
4次方程式＜

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=4%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F&oq=4%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F&gs_l=partner-web.12..0i512l10.10890.16928.2.18370.9.8.0.0.0.2.144.671.1j5.6.0.csems%2Cnrl%3D10...0....1.34.partner-web..10.24.2600.O_cusEeCR1w

https://kamelink.com/?s=4%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F&submit=%E6%A4%9C%E7%B4%A2

site://mathmathmass.exblog.jp "4次方程式"

【近畿大（医2023】こんな求め方もあるんだなあ～4次方程式～" を YouTube で見る
https://youtu.be/DnBkAx1eeFk


# WolframAlphaで
勉強中

# sympyで
勉強中

# 参考
AWS認定SAA-C03 勉強まとめ【EC2編】

現在、AWS認定ソリューションアーキテクト-アソシエイト合格に向けて勉強中なので、個人的に苦手なところをまとめていく。今回はEC2編。

# EC2とは？

- オンプレミス環境にあるサーバーと同じ性能を持ったサーバーをインターネット上で瞬時に作成することができるサービス
- 数分で利用可能となる従量課金（時間～秒単位）で利用可能な仮想サーバー

# 購入オプション

## ハードウェアを専有するインスタンスの購入オプション

以下の購入オプションは、AWSアカウント内でハードウェアを専有して利用します。

### ハードウェア専有インスタンス

- **他のAWSアカウントとは分離された専用ハードウェア**でEC2インスタンスを利用できる購入オプション
- 物理的なCPUソケット、コア数、ホストIDは確認不可
- ハードウェア専有インスタンスは、**同AWSアカウントのハードウェア専有インスタンスではないインスタンスと、ハードウェアを共有する可能性あり**

### 専有ホスト（Dedicated Hosts）

- **他のEC2インスタンスとは分離された専用ハードウェア**で利用できる購入オプション
- 物理的なCPUソケット、コア数、ホストIDを確認可能
- Dedicated Hosts（専有ホスト）のハードウェアには、ユーザーが指定したインスタンスのみ配置される
- Dedicated Hosts（専有ホスト）はEC2インスタンスを利用する上で、もっとも**購入価格が高いオプション**

# EC2の高度な設定

## プレイスメントグループ

プレイスメントグループは、**複数のEC2インスタンスを論理的にグループ化し、インスタンス間での低遅延な通信や、ハードウェア障害による影響を軽減できる機能**

参照：[【AWS】プレイスメントグループを完全に理解する - Qiita](https://qiita.com/mzmz__02/items/8651f578601f3a567fa0)

![https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/13495ea2-f259-c275-2806-527ddb65baf7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/13495ea2-f259-c275-2806-527ddb65baf7.png)

### クラスタープレイスメントグループ

- **一般的に使われる**。グループをパーティションと呼ばれる論理的なセグメントに分割する。
- 以下の要件のアプリケーションのEC2インスタンスのグループに適用
    - ネットワークの待ち時間が短い
    - ネットワークのスループットが高い
    - またはその両方のメリットがある

### パーティションプレイスメントグループ

- グループをパーティションと呼ばれる論理的なセグメントに分割する。
- **障害に対応するため**のプレイスメントグループ

### スプレッドプレイスメントグループ

- それぞれ独自のネットワーク、電源がある異なるラックに1つ1つのインスタンスを分割する。
- 1つのAZ内のスプレッドプレイスメントグループに配置された7つのインスタンスは7つの異なるラックに配置される。互いに分離して保持できるのでそれぞれのインスタンスを独自に構成したいときに使う。
- **インスタンスが同じラックを共有するときに発生する可能性のある同時障害のリスクを減らせる。**

# 運用方法

## 不要になったリザーブドインスタンス

- マーケットプレイスで販売することができる
    
    ### リザーブドインスタンスマーケットプレイス
    
    - 期間の長さや価格設定オプションが異なるサードパーティおよびAWSのユーザー未使用の標準リザーブドインスタンスの販売をサポートするプラットフォーム
    - **EBSボリュームのスナップショット**を取得しインスタンスを停止することで、データのみを保持することができる

## 障害復旧ソリューション（AMIの作成）

- EC2インスタンスのAMIを取得して、別リージョンにコピーすることで、同じ内容のEC2インスタンスを別リージョンに複製できる。
- 実行中または停止したインスタンスのいずれかを使用する。
- AMIには以下が含まれている
    - **1 つまたは複数のEBS スナップショット**、または、instance-store-backed AMI、インスタンスのルートボリュームのテンプレート (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど)
    - **起動許可** (AMI を使用してインスタンスを起動する権限を特定の AWS アカウントに与える)
    - インスタンスの起動時にインスタンスにアタッチするボリュームを指定する**ブロックデバイスマッピング**