OmniAICreator/Qiita-1.07M huggingface dataset:
【Linux】setコマンドについて

## `set`コマンドについて
`set`を使用することでシェルの設定の確認や変更ができます。
```sample.sh
#! /bin/bash
set -eu

```
```sample.sh
#! /bin/bash -eu

```

オプションを設定したい場合には`-`を記述し、 解除したい場合には`+`を記述します。
```sample.sh
#! /bin/bash

# 設定
set -eu

# 解除
set +eu
```

## 主なオプション
<table>
	<tbody>
    <tr>
      <td>オプション</td>
      <td>説明</td>
	  </tr>
	<tbody>
  <tr>
			<td><span>-a, -o allexport  </span></td>
			<td><span>新規に作成した変数や関数，値を変更した変数や関数を，以後，自動的にエクスポートする</span></td>
	</tr>
		<tr>
			<td><span>-b, -o notify </span></td>
			<td><span>終了したバックグラウンド・ジョブのステータスを即座に出力する</span></td>
		</tr>
		<tr>
			<td><span>-e, -o errexit </span></td>
			<td><span>コマンドが0以外のステータスで終了した場合，一部の場合を除いて即座に終了する</span></td>
		</tr>
		<tr>
			<td><span>-f，-o noglob </span></td>
			<td><span>パス名のワイルドカードによる展開（*や?）を無効にする</span></td>
		</tr>
		<tr>
			<td><span>-h, -o hashall </span></td>
			<td><span>コマンドの位置を記憶し，検索時間を短縮する</span></td>
		</tr>
		<tr>
			<td><span>-k, -o keyword </span></td>
			<td><span>キーワードとなる引数をコマンドに対する環境として渡す</span></td>
		</tr>
		<tr>
			<td><span>-m, -o monitor </span></td>
			<td><span>ジョブ制御を有効にする</span></td>
		</tr>
		<tr>
			<td><span>-n，-o noexec </span></td>
			<td><span>コマンドを実行せず，構文エラーだけを確認する</span></td>
		</tr>
		<tr>
			<td><span>-o emacs </span></td>
			<td><span>emacs形式のコマンド行編集インタフェースを有効にする</span></td>
		</tr>
		<tr>
			<td><span>-o history </span></td>
			<td><span>コマンドの実行履歴を有効にする</span></td>
		</tr>
		<tr>
			<td><span>-o ignoreof </span></td>
			<td><span>CTRLキーを押しながらDキーを押しても，シェルを終了しないように設定する。exitコマンドは利用できる</span></td>
		</tr>
		<tr>
			<td><span>-o posix </span></td>
			<td><span>bashの動作をPOSIX 1003.2に準拠させる</span></td>
		</tr>
		<tr>
			<td><span>-o vi </span></td>
			<td><span>vi形式のコマンド行編集インタフェースを有効にする</span></td>
		</tr>
		<tr>
			<td><span>-p, -o phiysical </span></td>
			<td><span>特権モードを有効にし，ENV変数とBASH_ENV変数を処理しなくなる</span></td>
		</tr>
		<tr>
			<td><span>-t, -o onecmd </span></td>
			<td><span>コマンドを1つ読み込み，実行後，終了する</span></td>
		</tr>
		<tr>
			<td><span>-u, -o nounset </span></td>
			<td><span>未定義の変数を参照するとエラー・メッセージを表示する</span></td>
		</tr>
		<tr>
			<td><span>-v, -o verbose </span></td>
			<td><span>コマンドを実行する前に入力行を表示する</span></td>
		</tr>
		<tr>
			<td><span>-x, -o xtrace </span></td>
			<td><span>コマンドと引数の展開処理を表示する</span></td>
		</tr>
		<tr>
			<td><span>-B, -o braceexpand </span></td>
			<td><span>シェルのブレース展開を有効にする。ブレース展開では，「L{i,n,u}x}」という文字列を「Lix Lnx Lux」と展開する。ブレース展開は他の6つの展開にさきがけて実行される</span></td>
		</tr>
		<tr>
			<td><span>-C, -o noclobber </span></td>
			<td><span>既存のファイルに対する出力リダイレクトを禁じる。ただし，「&gt;|」を用いればリダイレクトできる</span></td>
		</tr>
		<tr>
			<td><span>-H, -o histexpand </span></td>
			<td><span>!形式のヒストリ置換を有効にする</span></td>
		</tr>
		<tr>
			<td><span>-P, -o physical </span></td>
			<td><span>ファイルのシンボリック・リンクをたどらない</span></td>
		</tr>
  </tbody>
</table>
テキスト内一部の大文字と小文字をぱぱっと変換しよう

# 初めに
テキスト内の一部の文字を一気に大文字(uppercase)or小文字(lowercase)にしたいとき、ありますよね。
筆者の場合、研究活動でプログラムを使っていくと、「なんで小文字になっちゃってんの？？？」ってなることがあるので、変換をよく使います（小文字であることに意味がある場合があるので注意は必要ですが・・・）。

今回は以下のテキストファイル中の一部分の大きさを変換させます（`before.txt`から`after.txt`)にします
```before.txt
One-line
aaaaccccgcttt
Two-line
ggttacaaagtca
```
2行目と4行目を小文字から大文字に変換
```after.txt
One-line
AAAACCCCGCTTT
Two-line
GGTTACAAAGTCA
```

## 目次
- `awk`を使おう
- `vim`で編集しよう
- その他変換コマンド
## `awk`を使おう
#### `toupper`と`tolower`で一括変換だ！！
これもおすすめです。ifと組み合わせれば任意行を変換できます。こちらの方法は、何もゲノムファイルに限らず使えますね。小文字にしたければ`toupper`を`tolower`にしようね。
```awk_de_henkan.txt
awk '{if($0 !~ ">"){print toupper($0)}}' before.txt > after.txt
# ifで1行目と3行目を除いて、大文字に変換！
```
#### なんでおすすめなの？
行を選択的に処理できるのが`awk`の利点だからです。
if文を駆使すれば加工したい行をうまく選択できますね。
条件文については別の機会にまとめます。

## `vim`で編集しよう
#### マニュアルで変換していこう
変換部分が少ない場合はこの方法も良いです。
1. `shift`+`V`で行選択
2. `U`で大文字化
![download.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/8c512600-249e-c64e-1b69-a276e5bdeaeb.gif)

小文字化する場合は`u`を使いましょうね。
#### 便利だけど・・・
ファイル開いて・・・選択して・・・ってめんどくさいですよね。
また、マニュアル操作なのでミスの可能性が孕んでます。
変換対象が多かったり、読者の方が私みたいにテキトー（笑）な人は、`awk`使いこなしていきやしょうね。

## その他変換コマンド
#### `tr`
ファイル内のすべての文字を変換するのに使えます。コマンドは以下の通りです。
```
#小文字to大文字
tr a-z A-Z < file1 > file2 
#大文字to小文字
tr A-Z a-z < file1 > file2
```
選択的に加工できないですけどね、方法があるのでしょうか

# 終わりに
この中だと`awk`が便利ですね。何より応用が効くので。
FASTA形式配列の大文字と小文字を一括変換しよう

# 塩基配列の大文字と小文字をさっさと変換したくない？？
プログラムを使っていくうちに、FASTA内の文字が勝手に小文字になったりしちゃいますよね（小文字になることに意味がある場合もありますがね）。
プログラムのオプションで指定もできますが、変換方法を知っておけば時短になります。
そんなわけで、以下のbefore.txtを加工しましょう
```before.txt
>Genome1
aaaaccCCGCTTT
>Genome2
ggttacaAACTCC
```

## seqkitで一発じゃね？
その通りです。FASTA形式のテキスト処理には`seqkit`が使えます。
こちらは`conda`に入っていますのでダウンロードは`conda install`で...って知ってる人はもうわかりますよね。
この†**超万能最強遺伝子文書編集コマンド**†にかかれば、ワンラインで一発ですね。
```
#小文字to大文字
seqkit seq -u before.txt > after.txt
#大文字to小文字
seqkit seq -l before.txt > after.txt
```

インストールを省きましたが、`seqkit`はM1 Macの場合、少しインストールにコツが必要です。それは[別記事](https://qiita.com/bacbac/items/3b3c4d36477c77fd8716)で紹介してますのでご参照くださいね。

# seqkitすごい
紹介したseqkitはこのようなテキスト処理だけでなく、FASTAの配列数などをぱぱっと計算してくれます。
しかも、**高速**です。最高ですね。
どんどん使いこなしていきましょう！！
AWS環境(EC2)にnginxをインストールする方法・Cài đặt nginx trên môi trường AWS

パッケージアップデート
`$ sudo yum update`

インストール
`$ sudo amazon-linux-extras enable nginx1`
`$ sudo yum install nginx -y`
`$ nginx -v`

起動
`$ sudo systemctl start nginx`
`$ sudo systemctl status nginx`

自動起動設定
`$ sudo systemctl enable nginx`

nginxのドキュメントルート設定
`$ vi /etc/nginx/nginx.conf`

nginx https folder
/usr/share/nginx/html
wsl2-DebianにImageMagickを導入してpdfをpngに変換

wsl2上のDebian linux(ver. 11.4)にImageMagickをインストールしました。
# 動機
pdfをpngにサッと変換したかったのです。
# インストール
```
$ sudo apt list imagemagick
$ sudo apt install imagemagick
```
あるのを確認してからインストール。versionは6.9.11.60。わたしゃpdf変換できればなんでもOK。
# pdf変換で引っかかった
```
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/421.
```
検索しますと日本語のページが。

http://sstto.blog.shinobi.jp/%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86/imagemagick%E3%81%A7pdf%E5%A4%89%E6%8F%9B%E5%A4%B1%E6%95%97%E3%81%A8%E5%AF%BE%E5%BF%9C

https://www.t3nro.net/posts/imagemagick-and-postscript-files/

下記の```rights="none"```を```rights="read|write"```に変更。
```xml:/etc/ImageMagick-6/policy.xml（元設定、一部抜粋）
  <policy domain="coder" rights="none" pattern="PS" />
  <policy domain="coder" rights="none" pattern="PS2" />
  <policy domain="coder" rights="none" pattern="PS3" />
  <policy domain="coder" rights="none" pattern="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />
```
```xml:/etc/ImageMagick-6/policy.xml（上記部分、修正後）
  <policy domain="coder" rights="read|write" pattern="PS" />
  <policy domain="coder" rights="read|write" pattern="PS2" />
  <policy domain="coder" rights="read|write" pattern="PS3" />
  <policy domain="coder" rights="read|write" pattern="EPS" />
  <policy domain="coder" rights="read|write" pattern="PDF" />
  <policy domain="coder" rights="read|write" pattern="XPS" />
```
脆弱性への対処だから、脳死で変更するのも危険なんだけど…。
【SQL Server】GROUP BY句/HAVING句を使用したデータ取得

GROUP BY句を使う機会が久々にあったので、備忘として記載致します。
取得したデータのグループ化を行えます。集約関数でデータ取得したい時に使う事が私は多いです。

例えば下記テーブルが存在しているとして、各levelの平均attack値の抽出を行いたい場合等に使用します。selct カラム名 from テーブル名 の後にGROUP BY カラム名を付け加えます。

```:GROUP BY句
1> select * from vanilla;
2> go
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          1           1         300         200 ワイト
          2           8        3000        2500 ブルーアイズホワイトドラゴン
          3           4         800        2000 ホーリー・エルフ
          4           6        2500        1200 デーモンの召喚
          5           4        1500        1200 ワイバーンの戦士
          6           7        2500        2100 ブラックマジシャン
          7           3         600        1500 闇・道化師のサギー
          8           3        1200         700 ベビードラゴン
          9           4        1400        1200 砦を守る翼竜
         10           4        1300        1400 グレムリン


1> select level,AVG(attack) as avg_attack from vanilla group by level;
2> go
level       avg_attack
----------- -----------
          1         300
          3         900
          4        1250
          6        2500
          7        2500
          8        3000
```

グループ化を行った後に、データを条件付きで抽出したい場合はHAVING句を使用します。
条件指定でデータ抽出を行いたい場合はWHERE句を使用すればよいですが、集約関数を条件に入れたい場合は実行タイミングの問題でWHERE句だとエラーになります。

HAVING句は、GROUP BY句の後ろに記述します。
各レベルで、平均attack値が1000以上の場合のデータを抽出してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/0e1e53d7-6be1-5094-8067-ab640614d774.png)

```:HAVING句
1> select level,AVG(attack) as avg_atk from vanilla group by level having AVG(attack) >= 1000;
2> GO
level       avg_atk
----------- -----------
          4        1250
          6        2500
          7        2500
          8        3000

(4 行処理されました)
```

WHERE句も併用して使用可能です。WHERE　→　GROUP BY →　HAVING の順番で実行されます。
WHEREで条件を絞った後に、HAVINGでも絞っている感じです。

select ~ from ~ where ~ group by ~ having ~ で実行出来ます。
先ほど流したSQLに、levelが5以上と条件を含めてみます。

```:WHEREを付け加えた
1> select level,AVG(attack) as avg_atk from vanilla where level >= 5 group by level having AVG(attack) >= 1000;
2> GO
level       avg_atk
----------- -----------
          6        2500
          7        2500
          8        3000
```


グループ化はあんまり業務上では使う機会がなかったので、いい勉強になりました。そもそも、最近はSQL触る機会がないのですが、、泣

簡単ではございますが、以上です。
goで未定義のJSONから一部の値のみ取り出す

goに限った話ではないが、複雑なJSONから一部だけ取り出したいといった場合に、その複雑なJSONのフォーマットを構造体として定義しておくのは面倒だ。そこで型を決めず`map[string]interface{}`に流し込んでおいて、あとでType-castingすれば取り出せるのだが、値が多段になっている場合など、なかなか書き方を調べるのが大変だったので、とりあえず動いたものを公開する。

対象となるJSONファイルは、このように直下にkey:valueがあるものや、valueが多段になっているもの、配列になっているものなどを想定している。

```json:sample.json
{
    "name": "Hello",
    "value1": {
        "name":"Hello1"
    },
    "value2":[
        {"name":"Hello2-1"},
        {"name":"Hello2-2"}
    ]
}
```

それに対して、コマンドラインでキーワードを指定して、

```
jsontest ファイル名 キーワード1 キーワード2
```
といった使い方をする。

```go:jsontest.go
package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
)

func main() {

	flag.Parse()
	args := flag.Args()

	var fname string
	if len(args) > 0 {
		fname = args[0]
	} else {
		log.Fatal("usage: jsontest fname [key1] [key2]")
	}

	fileContent, err := ioutil.ReadFile(fname)
	if err != nil {
		log.Fatal("ReadFile Error")
	}
	fileString := string(fileContent)

	var jsonContent map[string]interface{}
	if err := json.Unmarshal([]byte(fileString), &jsonContent); err != nil {
		log.Fatal("Unmarshal Error")
	}

	if len(args) > 1 {
		var value1 interface{} = jsonContent[args[1]]
		switch t := value1.(type) {
		case string:
			fmt.Println(t)
		case interface{}: // valueの下にkey:valueがある場合(sample.jsonのvalue1)
			if len(args) > 2 {
				value2, ok := value1.(map[string]interface{})
				if ok {
					fmt.Println(value2[args[2]])
				}
			} else {
				fmt.Println(value1)
			}
		case []interface{}: // valueの下に配列がある場合(sample.jsonのvalue2)
			for _, value1 := range value1.([]interface{}) {
				if len(args) > 2 {
					value2, ok := value1.(map[string]interface{})
					if ok {
						fmt.Println(value2[args[2]])
					}
				} else {
					fmt.Println(value1)
				}
			}
		default:
			fmt.Println("default")
			fmt.Printf("%T ", t)
			fmt.Println(t)
		}
	} else { // 検索キーワードがない場合、そのまま表示する
		fmt.Println(fileContent)
	}

}
```

言うまでもないが、取り出すキーが決まってる場合はswitchで型ごとに分岐するのではなく一気に指定すればいい。
KritaをAppImageでインストールする

# 概要

いままでKritaのppaリポジトリを登録してインストールしていたのですが、`apt update`したときに`リポジトリ http://ppa.launchpad.net/kritalime/ppa/ubuntu focal Release には Release ファイルがなくなっています。`というエラーが出てしまいました。

調べるとkritaのppaリポジトリが非推奨になったので、Krita公式サイトのAppImageパッケージを使ってくださいという内容のことが書かれていました。

https://launchpad.net/~kritalime

# インストール方法

AppImageを使ってくださいとありましたがsnap版も使えるようになっていたのAppImageとsnapの2つの方法でインストールをしてみました。

1. AppImage版
2. snap版

# 1. AppImage

AppImageは初めて聞いたのですが、ディストロに依らずインストールできるフォーマットのパッケージ形式のことでした。有名なのはdebパッケージだと思いますがこれはdebian系のLinux限定で使えるパッケージです。ディストロによらずインストールできるフォーマットのパッケージは他にもsnapやflatpakパッケージがあるみたいです。

## ダウンロード

Kritaの公式サイトからAppImageをダウンロードしてきます。

https://krita.org/en/download/krita-desktop/

## インストール

```bash
$ chmod u+x krita-5.0.6-x86_64.appimage
```

## 起動

```bash
$ ./krita-5.0.6-x86_64.appimage
```

# 2. snap版

```bash
$ snap search krita
Name   Version  Publisher  Notes  Summary
krita  5.1.0    krita✓     -      Digital Painting, Creative Freedom
```

インストール

```bash
$ snap install krita
krita 5.1.0 from Stichting Krita Foundation (krita✓) installed
```

コマンドラインで起動する場合

```bash
$ krita 2> /dev/null &
```

もしくはアプリケーション一覧表示で **krita** と検索すれば出てきます。

![startup-krita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271649/a75994f3-738e-055a-752f-fecbdbfcc899.png)

出てきたアイコンをクリックするとkritaが起動します。

![top-krita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271649/9287d4f7-414b-cebc-b131-f42ce7b7917f.png)
python でバイト文字列を正規表現でパース


以下のような、csv に似たデータをシリアル通信で受け取る。


```
b'@-114,6,6 304 451 10097 505\r\n'
```

末尾は CRLF。頭に@がついて、7つのフィールド間のデミリタはカンマまたはスペース。


# 環境

- Python 3.9.2
- RaspberryPi OS Raspbian GNU/Linux 11 \n \l

# 作戦

バイト列としてシリアル通信で受信する。

以下のことに注意して処理する。

- readline() で一行受け取るので  \r\n がくっついてくる
- 数値は符号付き整数
- 4,5,6番目のフィールドは小数点以下1位の固定小数で  "257" と送られてきたのは "25.7"を意味している 
- 7つのフィールド間のデミリタは1バイトのカンマまたは1バイトのスペース
- 頭に @ がついていることをチェック
- 通信エラーで異常文字列が来ること前提

# 正規表現を使う


↓↓↓↓↓↓↓ あなたの記事の内容
```Python
───────
```python
↑↑↑↑↑↑↑ 編集リクエストの内容

  result=( re.match( rb'^@([-0-9]*)'    # 行頭の@に続く符号付整数
                      +b',([-0-9]*)'    # ,で区切られた符号付き整数
                      +b',([-0-9]*)'    # ,で区切られた符号付き整数
                      +b'[ ,]([-0-9]*)' # ,あるいはスペースで区切られた符号付き整数
                      +b'[ ,]([-0-9]*)' # ,あるいはスペースで区切られた符号付き固定小数
                      +b'[ ,]([-0-9]*)' # ,あるいはスペースで区切られた符号付き固定小数
                      +b'[ ,]([-0-9]*)' # ,あるいはスペースで区切られた符号付き整数
            , onerecord))

```

# パースした値を取り出す

↓↓↓↓↓↓↓ あなたの記事の内容
```Python
───────
```python
↑↑↑↑↑↑↑ 編集リクエストの内容
result.group(n)
```
としてn番目のフィールドがバイト文字列で取り出せる。

# 取り出した値の変換

これを utf8 文字列にするには

↓↓↓↓↓↓↓ あなたの記事の内容
```Python
───────
```python
↑↑↑↑↑↑↑ 編集リクエストの内容
result.group(n).decode('utf-8')
```

整数型にするには

↓↓↓↓↓↓↓ あなたの記事の内容
```Python
───────
```python
↑↑↑↑↑↑↑ 編集リクエストの内容
int(result.group(n))
```

固定小数フィールドを float にするには
↓↓↓↓↓↓↓ あなたの記事の内容
```Python
───────
```python
↑↑↑↑↑↑↑ 編集リクエストの内容
float(result.group(n))/10
```

# サンプルプログラム

↓↓↓↓↓↓↓ あなたの記事の内容
```Python
───────
```python
↑↑↑↑↑↑↑ 編集リクエストの内容

import serial
import pymysql.cursors
import time
import re

ser = serial.Serial("/dev/ttyS0",115200)

while 1:

  oneline = ser.readline()
  result=( re.match( rb'^@([-0-9]*)'
                      +b',([-0-9]*)'
                      +b'[ ,]([-0-9]*)'
                      +b'[ ,]([-0-9]*)'
                      +b'[ ,]([-0-9]*)'
                      +b'[ ,]([-0-9]*)'
                      +b'[ ,]([-0-9]*)'
            , onerecord))

  rssi=int(result.group(1))
  node1=int(result.group(2))
  node2=int(result.group(3))
  temp=float(result.group(4))/10
  humi=float(result.group(5))/10
  pressure=float(result.group(6))/10
  co2=int(result.group(7))

  db=pymysql.connect(host="localhost", user="hogehoge", password="hagehage" , cursorclass=pymysql.cursors.DictCursor)
  cursor=db.cursor()
  cursor.execute("USE hokan")
  db.commit()
  sql=('insert into hokandata (recvtime,node,rssi,recv,temp,humi,pressure,co2) values (now(),"%s","%s","%s","%s","%s","%s","%s");')
  cursor.execute(sql,(node1,rssi,result2,temp,humi,pressure,co2))
  db.commit()
  db.close()
```

  temp=float(result.group(4))/10

  temp=float(result.group(4).decode('utf-8'))/10
Docker上でUbuntuコンテナを立ち上げる方法

## はじめに
備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。
## 手順
### Ubuntuの最新版を取得
```bash
$ docker pull ubuntu 
```
:::note warn
$ docker pull ubuntu:20.04
のようにすることで、バージョンを指定することもできます。
:::
### イメージをインストールできたかを確認 
```bash
$ docker images 
```
### testという名前でubuntuコンテナを起動 
```bash
$ docker run -it -d –name test ubuntu 
```
### 起動できたかを確認 
```bash
$ docker ps 
```
### Ubuntuに入る 
```bash
$ docker exec -it “CONTAINER ID” “COMMAND” 
```
:::note warn
「CONTAINER ID」と「COMMAND」は
$ docker ps 
で「IMAGE」が「ubuntu」の行を確認してください
:::
## 注意点
:::note alert
Dockerコンテナ内のUbuntuではsystemctlコマンドが使えません。
:::
# ブログもあります
https://kyit.net/how-to-launch-ubuntu-on-docker/
Python-VLC の使い方

Ubuntu 22.04 でライブラリーのインストール

```bash
sudo apt install python3-vlc
```

```py:replay_mp4.py
#! /usr/bin/python
#
import sys
import vlc
import time

sys.stderr.write("*** start ***\n") 
file_mp4 = "./sample-5s.mp4"
media = vlc.MediaPlayer(file_mp4)
 
# start playing video
media.play()

loop_forever = True
while loop_forever:
	try:
		time.sleep(5)
	except KeyboardInterrupt:
		loop_forever = False
		sys.stderr.write("*** interrupted ***\n") 
#
sys.stderr.write("*** end ***\n") 
```

mp4 ファイルはこちらからサンプルをダウンロードできます。
[Sample MP4 video files](https://samplelib.com/sample-mp4.html)
[Laravel]Collectionを空判定する

# はじめに
今回は、Laravelでcollectionの空判定に苦戦したので、備忘録として残しておきます。

# 環境
- Laravel：8.83.4

# 結論. isEmptyで空判定する
コレクションの空判定はisEmpty()メソッドを使うことでできます。
また、`if`, `isset`, `empty`, `is_null`　メソッドではコレクションの空判定はできません。
### 1-1. 改善前のコード
```php
$posts = Post::where('user_id', 1)->get();

if (!empty($posts)) {
  // データがなくても入ってしまう
}
```
### 1-2. 改善後のコード
```php
$posts = Post::where('user_id', 1)->get();

if (!$posts->isEmpty()) {
  // データがある場合のみ入る
}
```
以上で実装完了です。
空判定するにも色々なメソッドがあるので、うまく使い分けていきたいです。

# 2. 参考文献

https://readouble.com/laravel/8.x/ja/collections.html#method-isempty
PostmanからPythonのpost処理に飛ばす(formのPostman版)

# Postman側での送信内容
今回は問い合わせ内容をpostする。形式はjson形式で送信する。
```
{"name":"メガネ","company_name":"株式会社暴力反対","mail_adress":"@gmail.com","title":"剛田武","body_text":"やばくね"}
```
# python側での受け取りのコード
```python:qiita.py
@app.route('/', methods=['GET', 'POST'])
def form():
    if request.method == 'POST':
         name = request.json["name"] 
         company_name = request.json["company_name"] 
         mail_adress = request.json["mail_adress"] 
         title = request.json["title"] 
         body_text = request.json["body_text"] 

```

需要があるかどうかはさておき、request.jsonで出来た。
ENVの意味がわからなかったけど調べたら簡単だった。

はじめに
--
githubで有名なgemのコードを読んでみると、全く知らない文字列が羅列していて、そもそもどんな風にコードを読めばいいかわからないと言うことを何度も経験しました。
プログラミングを始めたばかりは（まだまだ初学者ですが。。）わからないものが羅列していると何が何やら訳が分からなくなり、単純に恐くて手をつけたくないと思ってしまっていました。
でも一つ一つの単語を調べて理解が少しできると怖さが激減するんだな、ということを経験の中で知ることができました。

少しでも疑問に感じたことはそのままにせず調べて、備忘録としてアウトプットをしていこうと思います。

ENV.fetch(“~”)の文字列が怖かった
--
現在ポートフォリオを作成している中で、twitter apiを使ってtwitterのアカウントでログインができる機能を実装しています。

その機能のためにネットの記事を参考にしていた際に、下記のコードが出てきました。
~~~
ENV.fetch("TWITTER_KEY")
~~~
いつもコードを書くときは大抵小文字なのに、ENVは大文字と言うだけで少し怖っ、、と思ってしました笑

ネットの記事をそのまま読んでも実装はできると思いますが、ここで意味を理解すれば知らないことへの苦手意識が減っていくと思ったのでちゃんと意味を理解するためにENV.fetchについて調べました。

ENV.fetchは思ったより簡単だった
--
ENV.fetchは調べてみるととても簡単なものでした。
一言でまとめると、「環境変数を.envファイルから持ってくる」ということです。

twitter apiを使用するためには"api key"と"api secret key"が必要で作成をする必要があります、このkeyを悪意のある人に見られると色々な悪さができてしまうので、絶対に他人に見られてはいけません。

しかし、githubでコードを公開した時にkeyを使用する時に、その値がそのままファイルに記述されていたとしたら、誰でもkeyが見れる状態になってしまいますよね。

そこで.envファイルを作成して、下記のようにkeyとvalueを記載します。
~~~
key = value 
//.envを使用する場合は、'dotenv-rails'というgemが必要です。
~~~

そして必ず、.gitignoreファイルに.envを追加してgit管理外にします。
（この手順を踏まないと、、githubに.envファイルがアップロードされなくなります)

今回のように、twitter apiを使用する場合だと下記のようになります。
~~~
TWITTER_KEY="取得したapi key"
~~~

このように.envでkeyを環境設定に設定すれば、api keyを使用したい場合はファイルに直接値を記述しなくても、下記の式で.envファイルからkeyに紐づいた値を勝手に持ってきてくれるようになります！
~~~
ENV.fetch（"TWITTER_KEY"）
~~~

ENV.fetchではなくENVのみでも良い
--
また今回調べていく中で、fetchを使用せずに下記の式でも値を持ってこれると言うことを知りました。
~~~
ENV["TWITTER_KEY"]
~~~

fetchがある時とない時の違いは、設定したkeyが見つからない時に、nilを返すか設定したデフォルト値を返すかどうかということでした。
何も考えずにfetchを使わずに、必要に応じて使用するか決めたいですね！
~~~
//TWITTER_KEYが存在しない時
ENV["TWITTER_KEY"] =>nilを返す
ENV.fetch（"TWITTER_KEY", "default"） =>設定したデフォルト値（今回だとdefault）を返す

ENV['TWITTER_KEY'] || 'default' =>fetchを使わなくてもデフォルト値を設定できる
~~~


終わりに
--
最初はENVという見慣れない文字列に苦手意識を感じてしまいましたが、調べてみるとめちゃくちゃ簡単でした！
意味がわかっていないと怖さを感じてしまいますが、調べると一気に親近感が湧くものですね。

これからも怖いと感じたものを積極的に調べて理解していこうと思いました。
VitestによってVueコンポーネント中のAxiosをテスト

## 1.Vitestをインストール

[公式サイト](https://vitest.dev/guide/#adding-vitest-to-your-project)に参照

```shell
yarn add -D vitest
```

`vue-test-utils`をインストールしなければ、インストール

```shell
yarn add -D @vue/test-utils
```



## 2.使用

テストファイルにて  
例えば、テストしたいVueコンポーネントを`mounted`すると`/api/v1/test`に`post`リクエストをします

```typescript
import { test, expect, vi } from 'vitest'
import { mount } from '@vue/test-utils'
import Components from '@/components/Components.vue'

// リクエストのレスポンス、モックデータ
const result = { message: 'data取得成功' }

test('test', async (): Promise<void> => {
    // axiosを監視して、レスポンスのモックデータを設定
    const spyPost = await vi.spyOn(axios, 'post').mockResolvedValue(result)
    // テストしたいVueコンポーネントを使う
    const wrapper = await mount(Components）
    // リクエストパラメータのモックデータ                      
    const params = { id: '1'}
    // postリクエストをモックして検証
    expect(axios.post).toHaveBeenCalledWith('/api/v1/test', params)
    // リクエストのレスポンスを検証
    expect(await axios.post().then(res => res)).toBe(result)
    // axios監視をクリア
    spyPost.mockRestore()
})
```
Ubuntu 22.4でCodeDeploy Agentをインストールする

EC2に対してCodeDeployでアプリケーションをデプロイする場合、CodeDeploy Agentがインストールされている必要がある。

Ubuntuの場合はマニュアルでインストールが必要になり、その手順は公式ドキュメントに書いてある。

https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html

ただし、 Ubuntu 22.4 の場合は　`apt install ruby-full` で入ってくるRubyのバージョンが3.x系になっているせいか、インストールに失敗してしまうようだった。


回避策を探していたら、以下のissue commentのスクリプトで無事にインストールできた。

https://github.com/aws/aws-codedeploy-agent/issues/301#issuecomment-1129912011
Visualforce間の画面遷移/新規ウィンドウ表示/新規タブ表示時にPOSTパラメータを渡す方法

メンテナンス性を考え以下のサイトに移動しました。

https://sigulog.com/2023/03/07/visualforce%e9%96%93%e3%81%a7post%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf%e3%82%92%e6%b8%a1%e3%81%99%e6%96%b9%e6%b3%95/
モンテカルロ法を理解しやすいコードで書く

# はじめに
初記事で拙いところがあると思いますが、ご容赦ください。
コードは[Github](https://github.com/Tomoro0726/Monte)にあります。
# 実行環境
Python 3.8.5('base:'conda)
[Anaconda](https://www.anaconda.com/)の実行環境を導入している。

# 基本原理
N回シュミレーションを行ったときある事象がM回起これば、<br>その事象が起こる確率はM/Nで近似されるという性質を持っているということがモンテカルロ法の原理。
# 観測方法
1×1のXY平面上に原点から半径1の90度の弧を描いてランダムに点を打って<br>弧の外側と内側の点の個数の割合から円周率を求める。
# コードの実装
```python:monte1.rb
import random
import numpy
import time

start = time.time()

trial = 100
#試行回数
x = []
y = []
true = 0
false = 0
for i in range(trial):
    x.append(random.uniform(0, 1))
    y.append(random.uniform(0, 1))
    i = i+1

for i in range(trial):
    if numpy.sqrt(x[i]**2+y[i]**2) < 1:
        true = true+1
    elif numpy.sqrt(x[i]**2+y[i]**2) > 1:
        false = false+1

result = 4*(true/(true+false))

print(result)

elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```
試行回数を変えることによって精度が変化する。
また、出力までの実行時間を計測可能にする。

また、実際の図形を可視化してみる。
```python:moten2.py
import random
import numpy
import matplotlib.pyplot as plt

trial = 10000
x = []
y = []
true = 0
false = 0
for i in range(trial):
    x.append(random.uniform(0, 1))
    y.append(random.uniform(0, 1))
    i = i+1

for i in range(trial):
    if numpy.sqrt(x[i]**2+y[i]**2) < 1:
        true = true+1
    elif numpy.sqrt(x[i]**2+y[i]**2) > 1:
        false = false+1

result = 4*(true/(true+false))

print(result)

c1 = plt.Circle((0, 0), radius=1, fc="None",
                ec="r", linewidth=2, color="black")
ax = plt.gca()
ax.add_patch(c1)
plt.axis("scaled")
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.xlabel("X")
plt.ylabel("Y")
plt.title("PLOT")

plt.scatter(x, y, marker=".", color="blue", label="POINT")
plt.show()
```
実行結果
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664165/5ce47c9c-72e1-b750-93ad-68d0484ab45e.png)

# まとめ
試行回数を変えて何度か実行してみましたが、まだまだ結果が不安定。
試行回数を多くすればするほど実行時間が長いので今後は実行時間の短縮を目標としていきたい。
【無料＆有料】PC画面録画ソフト TOP 10

<h2>1位: 4Videosoft 録画ソフト </h2>
<p><a href="https://www.4videosoft.jp/screen-capture/">4Videosoft 画面キャプチャー</a>は専門的なPC録画ソフトとして、高画質、高音質でスクリーンのビデオ画面、システム音、マイク音をレコードして、保存できます。このソフトがあれば、動画、ゲーム実況を録画できます。さらに、音楽なども録音できます。また、録画する時、マイクで自分の音を追加することもできます。</p>
<h2>2位: Bandicam </h2>
<p>PC画面録画、ゲーム録画、ウェブカメラ録画、外部デバイス録画、予約録画、録音、クロマキー合成など。分かりやすいインターフェースがあって、初心者でもすぐに使える。</p>
<h2>3位: Game DVR </h2>
<p>PC画面録画、スクリーンショット、ゲーム録画、録音。Windows 11/10の標準機能であるので、非常に使いやすい</p>
<h2>4位: ロイロゲームレコーダー</h2>
<p>ゲーム録画、PC画面録画、録音。低負荷で、動作が軽く、低スペックのパソコンでも動けます。</p>
<h2>5位: AG-デスクトップレコーダー</h2>
<p>PC画面録画、マウスカーソルの録画、録音。動作が非常に軽く、性能の低いPCでも録画できます。</p>
<h2>6位: 4Videosoft オンライン 画面録画 	</h2>
<p>PC画面録画、録音、ウェブカメラ録画。オンライン録画ソフトで、インストール必要なく、非常に使いやすくし、低い性能のパソコンで負担なし使えます。</p>
<h2>7位: Debut動画キャプチャ</h2>
<p>PC画面録画、ゲーム録画、外部デバイス録画、ウェブカメラ録画、録音など。</p>
<h2>8位: アマレココ 	</h2>
<p>PC画面録画。パソコンへの負荷を最小限に抑えながら画面を収録できます。</p>
<h2>9位: VClip 	</h2>
<p>PC画面録画。非常に簡単なPC録画ソフトです。シンプルな操作性が魅力のデスクトップ録画ツールだと思います。</p>
<h2>10位: Icecream Screen Recorder 	</h2>
<p>PC画面録画、録音、ウェビナーの録画、ウェブカム録画、ゲーム録画。比較的シンプルで、画面録画、録音から、編集、共有までををシームレスに行えるのが特徴です。</p>

<p>具体的には、<a href="https://www.4videosoft.jp/tutorial/pc-screen-recording-software.html">PC画面録画</a>と言う文章までご確認してください。</p>
Rollup.jsによってNode.js/TSプロジェクトをバンドルと圧縮

## 0.初めに

+ 普段、 `tsc` を使って `TS` プロジェクトを `JS` に変換しますが、バンドルツールを使わないと、変換した後のサイズが大きくなってしまうことが多いです。この記事は`Rollup.js`を使って、バンドルと圧縮を実装します
+ この記事は`TS`による開発した`Node.js`プロジェクトに基づいて展開します



## 1.インストール

まずは、`Rollup.js`をインストール  
[公式サイト](https://rollupjs.org/guide/en/#installation)

```shell
yarn add -D rollup
```

`Rollup.js`のプラグインをインストール

```shell
yarn add -D @rollup/plugin-commonjs rollup-plugin-terser rollup-plugin-typescript2
```

プラグイン説明

+ `@rollup/plugin-commonjs`：プロジェクトが使用する依存関係を`rollup`に伝えます
+ `rollup-plugin-terser`：コードを圧縮します
+ `rollup-plugin-typescript2`：`rollup` に `TS` コードを理解させます



## 2.設定ファイル

`rollup.config.js`ファイルを新規作成、ルールを書く

```javascript
// インポート
const { terser } = require('rollup-plugin-terser')
const commonjs = require('@rollup/plugin-commonjs')
const typescript = require('rollup-plugin-typescript2')

// tsconfig.jsonのマージオプション
// 一般に、デフォルトとしてプロジェクトのtsconfig.jsonを使う
// 個別の項目を修正したかったら、ここでマージできます
const override = { compilerOptions: { module: 'ESNext' } }

module.exports = {
  // プロジェクトの入口
  input: 'src/app.ts',

  // バンドル、出口の設定
  output: {
    file: 'dist/app.min.js',
    format: 'cjs',
    sourcemap: true,
    exports: 'default',
  },

  // プラグイン
  // ご注意！ここでプラグインは順番がある！
  // 最初にtsをjsにコンパイルし、次に依存関係を探し、最後に圧縮する
  plugins: [typescript({ tsconfig: './tsconfig.json', tsconfigOverride: override }), commonjs(), terser()],
}
```



## 3.package.json編集

`package.json`ファイルで追加  
 `-c`の意味は：設定ファイルを使て実行

```json
 "rollup:build": "rollup -c",
```



## 4.使用

`rollup:build`を実行します

```shell
yarn rollup:build
```



## 5.検証

`Rollup.js`使用前、サイズは`106KB`

![6.jpg](https://s2.loli.net/2022/08/09/9Us5VgKNRElC6H3.jpg)



`Rollup.js`使用後、サイズは`12.2KB`、ボリュームを大幅に削減しました

![7.jpg](https://s2.loli.net/2022/08/09/I9UHqxZvXMrucfn.jpg)
Lambdaのpython Layer（simple_salesforce）作成

<h1>0. 目次</h1>
<ol>
<li>概要</li>
<li>環境情報</li>
<li>作成方法</li>
</ol>

<h1>1. 概要</h1>
Lambdaのpythonを使用してSalesforceへの処理を実装したいので、pythonのSalesforceモジュールである『simple_salesforce』をimportするためにLayerを作成します。

<h1>2. 環境情報</h1>
pythonは、バージョン3.8を使用します。<br>
Lambdaのpythonバージョン3.8はAmazon Linux2上で動作しているので、Amazon Linux2のEC2インスタンス上でLayerを作成します。<br><br>
詳細に関しては、<a href="https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html">Lambda ランタイム</a>を参照してください。

<h1>3. 作成方法</h1>
<div>1. EC2インスタンス作成
    <div>Amazon Linux 2（イメージ：カスタム、Linuxカーネル：4.14）のEC2インスタンスを起動します。スペックは最低限で良いです。セキュリティグループなどの各種設定の説明は省きます。</div>
</div>
<br>

<div>2. pythonのバージョン設定
    <div>pyenvを使用してpythonのバージョン3.8をインストールして、pythonのバージョンを3.8に切り替えます。</div>
</div>

```batchfile
pyenvインストールと環境変数設定
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

pythonのバージョン設定と確認
$ pyenv install 3.8.0
$ pyenv global 3.8.0
$ python --version
Python 3.8.0
```
<br>

<div>3. simple_salesforceモジュールのダウンロード
    <div>pipを使用してsimple_salesforceモジュールをダウンロードします。</div>
</div>

```batchfile
pipのインストール
$ sudo yum -y install python-pip

simple_salesforceモジュールのダウンロード
$ pip install -t python simple_salesforce
$ zip -r9 layer.zip python
```


<br>

<div>4. Layerのアップロード</div>
<div>layer.zip をLambdaのLayerに登録すればOKです。</div>
平均偏差と共分散行列を行列の積により計算する方法

# 分散共分散行列の計算法
$p$次元のデータが$n$個ある。これを$n \times p$の行列$X$で表す。このとき分散共分散行列は以下に計算できる。$1_n$は全ての成分が$1$の$n$次元縦ベクトルである。
```math 
\begin{align}
&S = (1/(n-1))X'J_n X \tag{1} \\
&J_n = I_n - (1/n)1_n (1_n)' \tag{2}
\end{align}
```

ここで以下の性質がある。(3)式は平均偏差にほかならない。
```math 
\begin{align}
&(X_{.j}- 1_n({1/n})\sum_i X_{ij})=J_n X_{.j} \tag{3}\\
&(J_n)^2=J_n  \tag{4}\\
&J_n' = J_n  \tag{5}
\end{align}
```
以上を、matlabで確認した例を以下に示す。　
```matlab 
N = 5;
P = 3;
X = randn( N, P );
one = ones( N, 1 );
J = eye(N) - 1/N*(one*one');
fprintf( ' X^T * J * X ');
(X'* J * X)/(N-1)
fprintf( ' cov( X ) ')
cov( X )

fprintf( ' Jを二乗しても値は変わらない　J - J*J = 0 \n');
J - J*J
```

以下は計算例です。
```terminal 
X^T * J * X 
ans =

    0.8465   -0.2367    0.3679
   -0.2367    0.2478   -0.1620
    0.3679   -0.1620    1.0746

 cov( X ) 
ans =

    0.8465   -0.2367    0.3679
   -0.2367    0.2478   -0.1620
    0.3679   -0.1620    1.0746

 Jを二乗しても値は変わらない　J - J*J = 0 

ans =

   1.0e-15 *

   -0.2220         0         0    0.0278    0.0278
         0   -0.2220         0    0.0278    0.0278
         0         0   -0.2220    0.0278    0.0278
    0.0278    0.0278    0.0278   -0.1110    0.0278
    0.0278    0.0278    0.0278    0.0278   -0.1110
```
Linux 【od、split、uniq、sort、cut、paste、fmt、wc、expand、pr、join、head、tail】コマンドについて（自分用メモ

●odコマンドはファイルの内容を8進数や16進数で表示するコマンドです。

od [オプション] [ファイル名]

オプション
・-t 出力フォーマットを指定
・-o（デフォルト）　8進数２バイト区切りで表示(-t o2と同じ）
・-x １６進数２バイト区切りでｓ表示（-t x2と同じ）
・-c ASCII文字またはバックスラッシュ月のエスケープ付き文字で表示(-t cと同じ）

オプションを指定しない場合は「-o」オプションがデフォルトで使用されます。
なお、odコマンドは通常、バイナリファイルの内容を表示する際に使用します。

-t オプションで出力形式を指定することができます。

▲フォーマット
・c ASCII文字またはバックスラッシュ月のエスケープ付き文字で表示
・-o[SIZE]　8進数で表示。SIZE表示を区切るバイト数を指定できる（未指定時４バイト）
・-x １６進数で表示。SIZE表示を区切るバイト数を指定できる（未指定時４バイト）

●splitコマンドは指定した行数でファイルを分割するコマンドです。

split [-行数] [入力ファイル名 [出力ファイル名]]
split [-l 行数] [入力ファイル名 [出力ファイル名]]

「-行数」または-lオプションでファイルを何行ごとに分割するかを指定できます。なお、デフォルトは1000行です。
また、出力(分割)されたファイルのファイル名は、出力ファイル名を指定しない場合は先頭が「x」、出力ファイル名を指定した場合は先頭が「出力ファイル名」で、末尾に「aa」、「ab」、「ac」などの文字列が順番に付きます。


●ソートされているファイルにある連続した重複行のみを表示するにはuniqコマンドを利用

uniq [オプション] [入力ファイル [出力ファイル]]

オプション
・-d 重複している行のみを表示
・-u 重複していない行のみを表示

なお、出力ファイルを指定するとコマンドの実行結果は画面ではなく出力ファイルに出力されます。


●行単位でファイルの内容をソートするにはsortコマンドを利用します。

sort [オプション] [ファイル名]

オプション
・-b 行頭の空白を無視
・-f 大文字、小文字を区別しない
・-r 降順でソート
・-t 区切り文字　指定した文字を区切り文字としてフィールドを認識
・-n 数字を文字でなく数値としてソート
・-k フィールド　ソート対象とするフィールドを指定（デフォルトは１つ目のフィールド）

「-r」オプションを指定しない限り、ファイルの内容は昇順にソートされます。


●テキストファイルの各行から指定したフィールドを取り出して表示するにはcutコマンドを利用します。

cut [オプション] [ファイル名]

オプション
・-c 文字数　抽出する文字位置を指定
・-d 区切り文字　区切り文字を指定（デフォルトはタブ）
・-f フィールド　抽出するフィールドを指定。n →n番目のフィールド。n,m→n番目とm番目のフィールド


●複数のファイルを行単位で結合するにはpasteコマンドを利用します。

paste [-d 区切り文字] [ファイル名...]

「-d」オプションで区切り文字を指定することが出来ます。デフォルトはタブ。


●fmtコマンドは1行あたりの最大文字数を指定してテキストを整形するコマンド。

fmt [-w 文字数] [ファイル名]

「-w」オプションで一行あたりの最大文字数を指定することが出来ます。なお、デフォルトは75文字


●wcコマンドはファイル内の文字数や行数を調べることができるコマンドです。

wc [オプション] [ファイル名]

オプション
・-l 行数を表示
・-w 単語数を表示
・-c 文字（バイト）数を表示

オプションを指定せずに実行すると行数、単語数、文字(バイト)数が順に表示。


●expandコマンドはタブをスペースに変換するコマンドです。

expand [オプション] [ファイル名]

オプション
・-i 行頭のタブのみを変換
・-t スペース数　１つのタブで置き換えるスペースの数を指定（デフォルトは８）


●unexpandコマンドは行頭にある連続したスペースをタブに変換するコマンド。

unexpand [オプション] [ファイル名]

オプション
・-a 行頭以外の連続したスペースもタブに変換
・-t スペース数　タブに変換するスペースの数を指定（デフォルトは８。このオプ書を指定すると「-a」オプションも指定されたことになる。


●prコマンドはファイルを印刷用に整形するコマンドです。

pr [オプション] [ファイル名]

オプション
・-l 行数　ヘッダ、フッタを含めたページの行数を指定（デフォルトは６６行）
・-h 文字列　ヘッダに表示されるファイル名を指定した文字列に変更
・+開始ページ[:終了ページ]　開始ページ、終了ページを指定


●2つのファイルを読み込み、共通するフィールドがある行を結合して表示するにはjoinコマンドを利用します。

join [-j フィールド] ファイル1 ファイル2

「-j」オプションは連結するフィールドを指定します。
オプションを指定しない場合は2つのファイルの1番目のフィールドを比較して、同じ値の行を結合して表示します。なお、結合するフィールドはそれぞれのファイルでソートされている必要があります。


●headは指定したファイルの先頭部分を表示するコマンドです。

head [オプション] [ファイル名]

オプション
・-n 行数| -行数　指定した行数をファイルの先頭から表示
・-c バイト数　指定したバイト数をファイルの先頭から表示


●tailは指定したファイルの末尾部分を表示するコマンドです。

tail [オプション] [ファイル名]

オプション
・-n 行数| -行数　指定した行数をファイルの末尾から表示
・-c バイト数　指定したバイト数をファイルの末尾から表示
・-f ファイルの末尾に追加された行を表示し続ける
OpenSSLで自己証明書を作成する

# Configファイルを作成する
`cert_config`を作成する。
下記はAWS 東京リージョンに構築したEC2用の設定。
Domainはワイルドカード(*)を使用している。
```config
[ req ]
prompt             = no
distinguished_name = Domain

[ Domain ]
countryName = JP # 国名
stateOrProvinceName = Tokyo # 都道府県名
organizationName = xxx # 企業名
organizationalUnitName = yyy # 組織名
commonName = *.ap-northeast-1.compute.amazonaws.com # ドメイン名(必須)

[ ExtendedAttributes ]
# "拡張キー使用法"の設定
extendedKeyUsage = 1.3.6.1.5.5.7.3.1 # サーバー認証
# 下記の記法でも可
# extendedKeyUsage = serverAuth
```
:::note warn
RD Gatewayで自己証明書を利用する場合は、必ず`拡張キー使用法`を`サーバー認証`に設定する事。
設定しない場合はRD GatewayでImport出来ない。
:::
参考URL:
https://www.openssl.org/docs/manmaster/man5/x509v3_config.html

# 秘密鍵とサーバー証明書を作成する
秘密鍵(.key)とサーバー証明書(.crt)を作成する。
```bash
# 有効期間100年(36500日)の作成例
openssl req -x509 -config cert_config -extensions 'ExtendedAttributes' -nodes -days 36500 -newkey rsa:2048 -keyout xxxxx.key -out xxxxx.crt
```

# 証明書をpfx形式に変換する。
```bash
openssl pkcs12 -export -out xxxxx.pfx -inkey xxxxx.key -in xxxxx.crt
```
メモリ用語まとめ（エンベデッドシステムスペシャリスト午前Ⅱ）

# 目的
アウトプットによる理解の促進と情報共有。

# 内容
## メモリの種類

| 名称 | 揮発性 | 速度 | 容量 | 説明 |
|:--|:-|:-|:-|:-|
| SRAM | 揮発性 | ◎ | × | リフレッシュ操作不要。消費電力小。 |
| DRAM | 揮発性 | 〇 | △ | リフレッシュ操作必要。消費電力大。安価。 |
| SDRAM | 揮発性 | △ | △ | リフレッシュ操作必要。動作がバスクロックと同期。 |
| DDR-SDRAM | 揮発性 | 〇 | △ | リフレッシュ操作必要。クロック立ち上がり、立ち下がり両方でデータリード可能。 |
| マスクROM | 不揮発性 | △ | △ | 書き込み不可。 |
| EEPROM | 不揮発性 | △ | △ | バイト単位でデータの書き込みと消去が可能。 |
| フラッシュメモリ | 不揮発性 | × | 〇 | ブロック単位で消去が可能。 |
| FeRAM | 不揮発性 | △ | × | フラッシュメモリより書き換え回数多、高速。 |

参考：https://www.nedo.go.jp/content/100085075.pdf
※速度、容量の星取表は独自調査に基づいてつけました。間違っていたらご指摘ください。

### フラッシュメモリの構造
* **NOR型**：データの信頼性が高いため、FWの格納用に用いられる。
* **NAND型**：大容量化がしやすく、SSDなどで使われる。

NAND型には1セル当たり1ビットのデータを保持する**SLC型**と2ビット以上データを保持する**MLC型**がある。
MLC型の中でも1セル当たり3ビット保持を**TLC型**、4ビット保持を**QLC型**と呼ぶ。MLC型は慣例的に2ビットのものを指す用語として使われている。
ビット数が多いほど安価だが、書き換え可能回数は減少し、耐久性が低くなる。

## 大容量化技術
### オーバレイ方式
プログラムをセグメント単位に分割し、必要なセグメントのみ主記憶に読出しして実行。
不要になったセグメントは次に実行するセグメントで上書き（オーバレイ）する。

### 仮想記憶
細切れになったメモリ空間を1つの連続した空間としてアプリケーションに提供する技術。
外部記憶も仮想記憶の領域として使うことで、主記憶の物理容量を超える空間を得られる。
記憶領域の管理はOSが行う。
主記憶の仮想記憶への割り当て方には2つの方式がある。
* **ページング方式**：固定長の区画(ページ)に区切って行う。主記憶に読出しされていないアドレスにアクセスしたとき、**ページフォールト**の割込みが発生する。これが頻繁に発生して処理能力が低下することを**スラッシング**と呼ぶ。
* **セグメント方式**：プログラムごとに可変の大きさで行う。

### ページ置き換えアルゴリズム
メモリ領域管理のアルゴリズムは以下4つ。
* **LFU方式**：利用頻度(Frequency)の低いデータから順に置き換える。
* **LRU方式**：最も使われなかった(Recently)データから順に置き換える。最もヒット率が高い。
* **FIFO方式**：最も古いデータから順に置き換える。
* **LIFO方式**：最も新しいデータから順に置き換える。

## 高速化技術
### メモリインタリーブ
主記憶を複数のバンクに分け、メモリコントローラが各バンクに並列にアクセスすることでアクセスを高速化する技術。
参考：https://atmarkit.itmedia.co.jp/icd/root/78/39772278.html

## 高信頼化技術
### ECCメモリ
パリティ方式やハミング符号を用いて誤りの検出や訂正を行うメモリ。
**パリティ方式**は1ビットの誤りを検出できるが誤りの訂正はできない。
**ハミング符号**は2ビットの誤り検出と1ビットの誤り訂正ができる。

### 記憶保護
メモリ上のデータを誤った操作や不正な操作から保護する仕組みをいう。
**リング方式**とは、メモリのブロック単位で権限(**リングレベル**)を設定し、実行中のプログラムが属する階層よりも高い階層のアクセスを禁止する方式。

## キャッシュメモリ
### 構成と動作
CPUと主記憶の速度差が大きく、1階層のキャッシュでは十分に高速化の効果が得られない場合、複数のキャッシュを階層的に配置する。
複数キャッシュの動作形式は2つある。
* **インクルージョンキャッシュ**：上位キャッシュのデータはすべて下位キャッシュにも格納する。
* **ビクティムキャッシュ**：**キャッシュミス**(アクセス先データがキャッシュに存在しないこと)発生時、上位キャッシュからあふれたデータを下位キャッシュに格納する。

### ヒット率
アクセスしようとするデータがキャッシュ上に存在することを**キャッシュヒット**、その確率を**ヒット率**という。
キャッシュのアクセス時間をx[ns]、主記憶のアクセス時間をy[ns]、ヒット率をrとすると、平均アクセス時間[ns]は以下で表される。
```math
平均アクセス時間=rx+(1-r)y
```

### 制御方式
* **ライトスルー方式**：キャッシュ上にデータがあるかないかに関わらず主記憶に書き込む方式。**コヒーレンシ**(キャッシュと主記憶の内容の一貫性)は気にしなくてよいが主記憶への書き込み頻度は多い。
* **ライトバック方式**：キャッシュ上にデータがある場合はキャッシュだけに書き込み、主記憶への後でまとめて書き込む方式。マルチプロセッサではコヒーレンシを保つ必要がある。各CPUが共有する主記憶の内容が変化したかどうかを監視し変化があった場合にキャッシュに反映させることを**バススヌープ**という。

### データ格納構造
キャッシュはキャッシュラインと呼ばれる単位で主記憶のアドレス範囲(エントリ)と対応させる。
キャッシュのデータ格納構造には次の方式がある。
#### ダイレクトマップ方式
キャッシュラインとエントリの対応をあらかじめ決めておく方式。
キャッシュに格納したいエントリと同じエントリが既に使われているときは上書きする。
#### フルアソシティブ方式
キャッシュラインとエントリの対応をキャッシュのどこに置いてもいい方式。
アクセス時、どこに置いたか探索する必要があり、回路規模大きいし遅い。
#### セットアソシティブ方式
上記二つの折衷案。
1個のエントリに対して2個以上のキャッシュラインを割り当てる方式。
割り当てるキャッシュラインの数を**ウェイ数**という。

参考：https://pepper.is.sci.toho-u.ac.jp/pepper/index.php?plugin=attach&refer=%BB%B3%C6%E2%A4%CE%BC%F8%B6%C8%A4%CE%A5%DA%A1%BC%A5%B8%2F11%BD%D5%2F%A5%B3%A5%F3%A5%D4%A5%E5%A1%BC%A5%BF%A5%CF%A1%BC%A5%C9%A5%A6%A5%A7%A5%A2&openfile=ar_11.pdf

## 疑問に思ったこと
* 1個のセルに複数のビットを書き込むことが可能なの？　ていうかセルとはなんぞや
* キャッシュむずい。動作が把握しきれない
Linuxでディスク、メモリ容量確認でよく使うコマンド（備忘録）

自分への備忘録・・・
Linux奥深いし有識者さまお手柔らかに・・・

--- ディスク管理 ---
■全体のディスク容量確認
`$ df -h /`
1.dfコマンドでディスク容量を確認
2.-hオプションでサイズに応じて読みやすい単位で表示
3./を指定することでルートディレクトリから全体のディスク容量を確認

■ディスクの使用量をディレクトリごとに集計し、サイズが大きい順に表示
`$ du -h <対象のディレクトリ> | sort -h | tail -15
`
1.duコマンドでディスクの使用量をディレクトリごとに集計して表示
2.-hオプションでサイズに応じて読みやすい単位で表示
３.sortコマンドの-hオプションでduの出力をサイズが小さい順から並び替え（-hにより数値だけでなく単位も考慮）
4.tailコマンドの-(数字)オプションにて指定した数字分だけ出力

--- メモリ管理 ---
■メモリ容量確認
`$ free -h`
1.freeコマンドでメモリの空き容量などを表示
2.-hオプションで読みやすい単位で表示

■プロセスごとのメモリ使用率表示
`$ ps aux --sort rss`
1.psコマンドで現在実行中のプロセスを表示
2.a,u,xオプションで端末操作のプロセス、cpu,メモリ使用率、現在実行しているプロセスを表示
3.--sort rssにて、プロセスが確保している物理メモリの使用率を昇順に並び替え


他にもtopやvmstatコマンドも便利。これはCPUの動向を確認する時に私は使ってます。

□おまけ
メモリキャッシュ解放
`# echo 1 > /proc/sys/vm/drop_caches`
ページキャッシュを解放する。

他にも 
`# sync; echo 3 > /proc/sys/vm/drop_caches`
とかもある。これはdentry, inode, ページキャッシュも削除する。

dentry, inodeについてざっくり書くと・・・
・dentryはファイル名やディレクトリ構造（path等)を管理するデータ領域
・inodeはファイルに当てられるファイルサイズや実際のデータの位置等、情報が含まれるデータ領域。

簡潔に、、以上です。
【クエリビルダ：拡張表現】Switch構文を使用してみる

前回の記事 **ワイルドカードを用いた文字検索を使用してみる**で使用したデータをそのまま活用して、今回はSwitch構文を試してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cf37f125-c491-34ca-ea7c-5720512becd3.png)
ではクエリ定義に戻り、出力領域の右クリックメニューから`拡張表現の追加`を選び、出力オプションダイログを開きます。
検索フィールドに**Swi**と記入し、Switch構文のテンプレートを関数一覧から探し出し、ダブルクリックで上部のエディタに転送します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1fb132bf-c91d-6f7b-895b-daa78003183e.png)
今回は単純にコードがA100なら`"この行のコードはA100です。"`、コードがA200なら`"この行のコードはA200です。"`といった風に表示するだけとします。
ではテンプレートを以下のように書き換えます。
```
Switch({%コード}
,"A100","この行のコードはA100です。”
,"A200","この行のコードはA200です。”
,"A300","この行のコードはA300です。”
,"この行のコードはA400です。” )
```
実行結果は、このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a00a3e9b-314c-3d1b-7828-0f6c2832907e.png)
レポート作成時に応用してみてください。
【Xcode】実機でビルドできなくなった

# エラー
![スクリーンショット 2022-08-04 19.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/fd3be3d6-e44c-a126-aceb-6257d70e396c.png)
```
Faild to prepare device for development.
Please unlock and reconnect the devive.
```
# 解決方法
端末の再起動

# おわり
簡単なことで時間喰われました。。。

# 参考サイト
https://developer.apple.com/forums/thread/133106
【Rails】コントローラ作成方法メモ

## 0. 環境
macOS Monterey 12.3.1
ruby 3.1.2
rails 6.1.6

## 1. コントローラ作成方法

以下のコマンドを入力する。

```bash:ターミナル
rails g controller (コントローラ名) (アクション名1) (アクション名2)...
```
作成例

```bash:ターミナル
rails g controller users index show
```

## 2. 特定のディレクトリ下に作成する時

コントローラ名にパスを付けて入力する。

```bash:ターミナル
rails g controller api/v1/users index show
```

または

```bash:ターミナル
rails g controller api::v1::users index show
```

## 3. 作成コマンドを取り消したい時

`g(generate)`を`destroy`に置き換える。

```bash:ターミナル
rails destroy controller users index show
```

## 参考記事
https://qiita.com/terufumi1122/items/634dac88de01f3f73821

https://shinodogg.com/2011/02/15/rails%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7generate%E3%81%97%E3%81%9F%E3%81%AE%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%83%A1%E3%83%A2/
ドメイン駆動設計入門#3 ユビキタス言語

### はじめに
今回はドメイン駆動設計においてよく目にする言葉、ユビキタス言語について説明します。
参考にした記事などは適宜リンク載せるので、そちらもぜひ読むようにしてください。
本記事はこちらを参考にしました。非常にわかりやすいので是非目を通してほしいです。
[・ユビキタス言語についての知見を共有します](https://qiita.com/kmdsbng/items/bf415afbeec239a7fd63)

### ユビキタス言語とは
まず言葉の定義として、ユビキタス（Ubiquitous）とは、いつでもどこでも存在するという遍在を表す言葉を表しています。
そしてユビキタス言語について、ドメイン駆動設計の公式リファレンスには以下のように記載があります。
```html
A language structured around the domain model and used by all team members within a bounded context to connect all the activities	of the team with the software.
```
簡単に訳すと、<b>ドメイン・モデルを中心に構成され、社内のすべてのチーム メンバーによって使用される言語。チームのすべての活動をソフトウェアに接続する境界付けられたコンテキスト</b>という記載になります。チームで使
ここで登場している<b>境界付けられたコンテキスト</b>については[こちら](https://qiita.com/haykubo/items/4ff1582a88f70a0bae2f)でまとめています。境界付けられたコンテキストを簡単に振り返ると、システムを「境界づけられたコンテキスト」に分割し、それぞれの中でモデル、言語の統一を実現し、関係者間での認識を揃えることを指します。

先ほどの公式リファレンスの定義を見てみると、社内のすべてのチーム メンバーによって使用される言語という定義があります。境界付けられたコンテキストはあくまでもユビキタス言語をチームで共有する範囲という解釈ができます。

### 境界付けられたコンテキストとユビキタス言語
前回記事にした境界付けられたコンテキストを例にユビキタス言語を考えてみます。
境界付けられたコンテキストの説明時、例としてECサイトの開発を上げました。その際、商品というコンテキストを販売コンテキスト、発送コンテキストと境界付けることで各モデルの認識を設計者・開発者・各関係者でそろえることが可能としました。

実際に販売コンテキストのユビキタス言語を定義してみます。販売コンテキストのユビキタス言語は「商品」「売値」「在庫」「顧客」のような言葉を使うと思います。
ポイントとして、設計者・開発者・各関係者が使う言葉とプログラムを構成する言葉を一致するようにすることです。実装の中で使用されるクラス名、メソッド名などは誰が見ても意味が解らなければいけませんし、設計者・開発者・各関係者が使っている言葉がついたクラスやメソッドは、実際の言葉が意味するものと同じ振る舞いをする必要があります。
例えば、顧客をECサイトで商品を購入する人と定義します。であれば顧客クラスは今定義した内容を指していなければいけないです。

設計者・開発者・各関係者が使っている言葉でプログラムを検索すれば、該当する概念の挙動を示す実装をたどることができる必要があります。またその状態の設計ができることで保守性の高い（＝<b>変化に強い</b>）システム / プログラムであると言えます。ユビキタス言語で定義した言葉と概念が異なる同じ名称の実装はNGですし、同じの概念が複数のファイルに分割されている状況もできる限り避けることが重要です。コンテキストを分割し、境界付けられた中で設計者・開発者・各関係者間で言葉の認識を揃える・ユビキタス言語を定義することがとても重要ということになります。

### まとめ
まとめとして、実際にユビキタス言語を実践している方の記事を紹介します。非常にわかりやすいので、ぜひこちらも読んでみてください。

[・ユビキタス言語策定したらビジネス理解がめっちゃはかどった話](https://zenn.dev/leaner_tech/articles/20210922-ubiquitous-language)
[・ユビキタス言語について](https://iikanji.hatenablog.jp/entry/2018/03/09/214811)
[・Chatwork WebのUIに1つ1つ丁寧に名付けをしている話（ユビキタス言語検討会について）](https://creators-note.chatwork.com/entry/2021/12/22/153540)
【C#殴り書き知見忘備録】 listとArrayList

## はじめに

### 配列
[参考記事](https://resanaplaza.com/%E3%80%90c%E3%80%91%E9%85%8D%E5%88%97%E3%81%A8%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%EF%BC%9F%E3%81%9D%E3%81%AE%E5%8A%B9%E6%9E%9C%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9/#:~:text=%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82-,%E9%85%8D%E5%88%97%E3%81%A8%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E6%98%8E%E7%A2%BA%E3%81%AA%E9%81%95%E3%81%84%E3%81%AF%EF%BC%9F,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
> 配列は連続した値を保持し、添え字を使って値の登録・変更を行うためのデータ構造です。
宣言した要素数を格納するのに必要な領域を、まとめてメモリ上に確保します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/1f5bbc2d-d5c9-7639-3b10-8d9788009cf7.png)

### リスト
[参考記事](https://resanaplaza.com/%E3%80%90c%E3%80%91%E9%85%8D%E5%88%97%E3%81%A8%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%EF%BC%9F%E3%81%9D%E3%81%AE%E5%8A%B9%E6%9E%9C%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9/#:~:text=%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82-,%E9%85%8D%E5%88%97%E3%81%A8%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E6%98%8E%E7%A2%BA%E3%81%AA%E9%81%95%E3%81%84%E3%81%AF%EF%BC%9F,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
>1次元配列とよく似ていますが、宣言時に空の変数が作成され、随時必要に応じて要素を追加していきます。
>要素同士がチェーンで繋がっているようなイメージなので、途中でチェーンを切ったり繋ぎ変えることで、要素の挿入や削除が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/da135f00-be47-e6a0-74d7-93dd083a0bd6.png)


## ArrayListとList

> ArrayListコレクション（.NET Frameworkの最初からある）のジェネリック版がList<T>コレクションだ。どちらも主要なメソッドとして、Add／Remove／CopyTo／Sortメソッドなどを持っている。


https://www.atmarkit.co.jp/ait/articles/1710/25/news023.html


- ArrayListはなんでもぶちこめるけど出す時にキャストしないといけない。
> ArrayListクラスの要素にはどんな型でも格納できるが、取り出すときには必ずキャストしなければならない（Visual BasicではOption StrictをOnにした場合）。
- listは入れる型を決めるのでキャストする必要が無い、その代わりその型しか入れられない。
> List<T>クラスの要素には特定の型しか格納できない代わりに、取り出すときのキャストは不要だ（ただし、インスタンスを作るときにObject型を指定すれば、ArrayListクラスと同じことになる）。


## Listと配列
http://urx3.nu/PkVX

配列は固定長のデータを扱う時に適しているそうだ。




### IReadonlyCollection
リードオンリーなコレクションという事なのでこれ引数にして使ってるメソッド内では変更されたりしないって事が分かるらしい、IEnumerableとの使い分け的なのも書いてある。ありがてえ。


https://qiita.com/lobin-z0x50/items/248db6d0629c7abe47dd#%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%9E%8B%E3%81%AE%E7%B6%99%E6%89%BF%E9%96%A2%E4%BF%82%E5%9B%B3

コレクション関連難しい・・・。

何でもかんでもListを引数にするのよくないんだね、頑張って使い分けよう。
GitHubのクローンしながらディレクトリ名を変更する

# はじめに
　GitHubでテンプレートとして使っているリポジトリを同じディレクトリ内で展開したいということで、クローンしながら名称を変更できないかと考えたところ出来るようなので紹介。

# コマンド

```
git clone https://github.com/example/example.git sample
```

　方法としてはクローンしたいリポジトリURLに空白を一つ、つけたいディレクトリ名を書けばそのディレクトリになってくれます。

**以上！**
MahApps.Metro のスタイルを継承する

色々調べた結果、BasedOnを下記のように書けば良いということが判明。

VS2017
MahApps.Metro 2.4.9

予め、App.xamlに以下を記入しておく。

```xml
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
```

DataGridにスタイルを”追加”したい場合は、以下。
```xml
  <Style BasedOn="{StaticResource MahApps.Styles.DataGrid}" TargetType="{x:Type DataGrid}">
    <Setter XXX />
  </Style>
```

TabItemなら、以下。
```xml
  <Style BasedOn="{StaticResource MahApps.Styles.TabItem}" TargetType="{x:Type TabItem}">
    <Setter XXX />
  </Style>
```


いくつかのサイトで、`StaticResource MetriDataGrid`と書く方法があったがうまくいかず、上記にたどり着く。バージョンに依るのだろうか。。
Powershell入門 - 01.Powershellとは

# 1. Powershellとは
PowershellはMicrosoftが開発した`シェル`であり、スクリプト言語の一種です。

シェルとはなにか、ざっくり説明すると**ユーザーがコンピュータを操作するための提供するソフトウェア**のことです。
このソフトウェアを使うと、
1. テキストファイルを閲覧する
2. Excelを編集する
3. OSをシャットダウンする  

というような操作を行うことができます。

ちなみに、1の操作をPowershellで記述したものと、その結果が以下のとおりです。
```powershell
(base) PS D:\powershell> get-content ./data/sample1.txt
sample
(base) PS D:\powershell>
```

今回学ぶPowershellはこれらの機能が備わったシェルになります。
また、このシェルで使われるスクリプト言語を指してPowershellと呼ぶこともあるので注意しましょう。

# 2. GUIとCLI
上で紹介した1～3の操作は皆さんも日常的にやってると思います。
ですが、Powershellやシェルなんて使っていませんよね？

実は我々が利用するPCを操作するための手段(ユーザーインターフェース)は2種類に分けることができます。  
それが`GUI`と`CLI`です。

我々が普段マウスなどを使って画面上のファイルやフォルダを操作する方法は`グラフィカルユーザーインターフェース(GUI)`といいます。
GUIはユーザーが直感的にPCを操作できるように設計されています。

一方で、今回学ぶPowershellは`コマンドラインインターフェース(CLI)`と呼ばれています。
CLIは実行したい操作をコマンドとしてシェルに与えて実行します。  

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781058/c804efbb-a037-a39b-dcdc-7ca4b3c263ae.png" width="500px">

## 2.1. GUIとCLIのメリット・デメリット
ここまでの話を聞いても、今までGUIでやれていたことをわざわざCLIやPowershellで実行したいとは思わないでしょう。
ですが、CLIにはGUIにはないメリットがあります。  

例えば1000件のファイルがあったとします。そのファイルの名前の先頭に、001～1000までの番号を連番で振りたいとしましょう。
GUIの場合、どんなに手際よくやっても10分はかかると思います。
では、10000件ではどうでしょう？もうやる気が起きないですよね？

このような単純作業の場合、CLIが力を発揮します。
CLIでは、すべての処理がテキストで書かれており、他のプログラミング言語同様、変数や条件分岐、繰り返し処理が行なえます。
これらを駆使することで、上記の名前の修正処理を高速に処理することが可能です。
さらに、一度このスクリプト(処理のまとまり)を書いてしまえば、何度でも使いまわしが可能です。
この再利用性の高さもCLIの大きな魅力の一つです。

| | GUI | CLI |
|:--|:--|:--|
|メリット|・直感的でわかりやすい<br>・学習コストが低い |・単純作業が非常に高速にできる<br>・書いたスクリプトは再利用可能 |
|デメリット|・繰り返し発生する作業にその都度同じ時間がかかる |・学習コストが高い |

では、実際にPowershellを動かして、操作方法を学びましょう。

Prev : なし
Next : [02.コマンドの基本](./8f805fb23a4f074218f5)

[目次へ戻る](./926b8053a031539437a3)
AccessのVBAで特定サイト（URL）をデフォルトブラウザーで開く

# やり方

```vb:サンプルコード
With CreateObject("WScript.Shell")
    '第二引数の1 = 通常サイズで開くという指定
    .Run "http://※※※", 1
End With
```

サンプルコードのコンセプト。

* とにかく短いコード。
* 変数を作らない。（変数名を考えなくていい）
* 参照設定を変更しなくていい。（ただしコンパイルチェックができないというデメリットあり）

# 参考サイトさん

https://jizilog.com/vba-browse

https://atmarkit.itmedia.co.jp/ait/articles/0709/12/news125.html

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1865
Microsoft Access for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット

TODO:ブラウザーを指定して開く方法まとめる。
TODO:第二引数の画面サイズについて動作確認とまとめ。
nextjsでトグルボタンのサンプル


## 目的
- 以下のようなトグルボタンをNextjsに追加したい。

![スクリーンショット 2022-08-10 9.02.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/bfd80e61-9d7a-f587-6926-bb729e5c66bb.png)

## コード

親

``` typescript
import React from 'react'
import ToggleSwitchButton from './components/ToggleSwitchButton'

const index: React.FC = () => {
  ...省略...
  return (
    <>
      <ToggleSwitchButton />
    </>
  )
}
```

子コンポーネント(./components/ToggleSwitchButton)

``` typescript
import React from 'react'
import styles from './components/button.module.css'

const ToggleSwitchButton = () => (
  <div>
    <div className={styles.toggle_button}>
      <span className={styles.toggle_text}>トグルボタン</span>
      <input id="toggle" className={styles.toggle_input} type='checkbox' />
      <label className={styles.toggle_label}/>
    </div>
  </div>
)

export default ToggleSwitchButton
```

components/button.module.cssのコード

``` css
.toggle_input {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  z-index: 5;
  opacity: 0;
  cursor: pointer;
}

.toggle_label {
  width: 60px;
  height: 25px;
  background: #ccc;
  position: relative;
  display: inline-block;
  border-radius: 40px;
  transition: 0.4s;
  box-sizing: border-box;
}

.toggle_label:after {
  content: "";
  position: absolute;
  width: 25px;
  height: 25px;
  border-radius: 100%;
  left: 0;
  top: 0;
  z-index: 2;
  background: #fff;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
  transition: 0.4s;
}

.toggle_input:checked + .toggle_label {
  background-color: #4BD865;
}

.toggle_input:checked + .toggle_label:after {
  left: 35px;
}

.toggle_button {
  position: relative;
  width: 265px;
  height: 25px;
  margin: 0 auto 10px auto;
}

.toggle_text {
  height:35px;
  line-height:25px;
  padding:0 10px 0 0;
  vertical-align:top;
}
```

うまく表示されました。
めでたし、めでたし。