OmniAICreator/Qiita-1.07M huggingface dataset:
Redash使う時に、知らなかったSQLの書き方を学びました

# Redash使う時に、知らなかったSQLの書き方を学びました

## 概要
最近、redashでsqlを書く機会が多く、こんな書き方があったのかとsqlに関して勉強をしなおしているので、学んだことをここに書きます

## 目次
1. Redashとは
2. 月ごとにデータを表示させたい
3. 週ごとにデータを表示させたい
4. 日付指定をする方法
5. having
6. case when と or null
7. データ連携

### 1. Redashとは
>Redashは、SQLの分析結果をわかりやすく可視化し共有するオープンソースBIツールです。

簡単にいうなら、DBのデータやGoogleアナリティクスなどからデータを取得してきて、グラフなどに表示させてくれます
また、定期的に作成したクエリの実行や、slackへグラフの表示など色々と便利なツールです
https://redash.io/

### 2. 月ごとにデータを表示させたい
月ごとにユーザ数の推移を見たい時に使います

```
//月ごと
DATE_FORMAT(date,![スクリーンショット 2021-02-13 22.04.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/21b04bae-6761-9cb0-170e-dbf57368b5e2.png)
 '%Y-%m')

//group by を使用して月ごとに分ける
group by DATE_FORMAT(date, '%Y-%m') 
```

### 3. 週ごとにデータを表示させたい
月ではなくて、もっと細かく週で見たい時に使えます

```
//週ごと
DATE_FORMAT(consultation_date, '%Y-%U weeks') 

//group by を使用して週ごとに分ける
group by week 
```

### 4. 日付指定をする方法
月でも週でもなくて、その時に欲しい値が欲しいから、指定してデータを取得したい場合に使えます

```
WHERE 
    date >= "{{start_date}}"
   AND date <= "{{end_date}}"
```

![スクリーンショット 2021-02-13 22.05.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/209fc3d3-9c18-bec7-bee1-6dfd1eaa9b9f.png)

### 5. having
havingはgroup byと一緒に使用します
staff_idでわけて、さらに合計金額が1万円以上に該当する値のみ表示させています

```
group by staff_id
having sum(money) >= 10000 
```

### 6. `case when` と `or null`
例えば男女それぞれの人数を出したい時に使えます

```
select
　case sex
        when 'man' then '男性'
        when 'woman' then '女性'
    end as '性別',
    count(sex) as '人数'
from members
where date >= "2021-02-01"
　group by 性別
 
```
![スクリーンショット 2021-02-13 22.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/a1c2b6f0-00d1-a6c5-c37c-c63e1748715c.png)

`or null`　を使用しても人数は出すことができます

```
select
 count(sex = "man" or null) as 男性,
 count(sex = "woman" or null) as 女性
from members
where registration_date >= "2021-02-01"
```

![スクリーンショット 2021-02-13 22.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/2b477395-ff8d-ee59-7a14-10098a524124.png)

**違い**

`case when`を使用した場合は、同じカラムに値が入っているのでpieチャートを作成することができるのですが、`or null`では、違うカラムに値を出しているのでpieチャートの作成をしてくれないです
![スクリーンショット 2021-02-13 22.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472696/cb66d153-c2e4-6e91-9638-a06ee3dcf3eb.png)


### 7. データ連携
このデータ連携はアナリティクスからデータを取得したい時にも活用できますし、1つのクエリでうまく取得ができない時や、gorup byで基準をそれぞれ分けたい時に2つのクエリを作って最終的には1つのグラフに表示させたい時などに活用できます

```
SELECT
    a.name,
    b.year
FROM query_111 a
LEFT JOIN query_112 b ON b.id = a.staff_id
```
Go 言語仕様5（スライス、マップ）

## 概要
Go 言語の仕様まとめ。

前回：
[Go 言語仕様4（defer, panic, recover）](https://qiita.com/R_R/items/7e3c1c34027a6169998d)

## 内容

- スライス
- マップ

## スライス

- **基本的なところ**

```Go:宣言
var sl []int
fmt.Println(sl) // []

var sl2 []int = []int{1, 2, 3}
fmt.Println(sl2) // [1 2 3]

sl3 := []int{10, 20, 30}
fmt.Println(sl3) // [10 20 30]

// make([]型, 要素数, キャパシティ)
sl4 := make([]int, 5, 10)
fmt.Println(sl4) // [0 0 0 0 0]
```

```Go:代入
sl := make([]int, 5, 10)

sl4[0] = 10
sl4[1] = 20
sl4[2] = 30
sl4[3] = 40
sl4[4] = 50

fmt.Println(sl4) // [10 20 30 40 50]
```

```Go:要素の取得
fmt.Println(sl4) // [10 20 30 40 50]

// indexを指定して取得
fmt.Println(sl4[2]) // 30

// index >= 1 && index < 3 の要素を取得
fmt.Println(sl4[1:3]) // [20 30]

// すべての要素を取得
fmt.Println(sl4[:]) // [10 20 30 40 50]

// 最後の要素を取得
fmt.Println(sl4[len(sl4)-1]) // 50

// index < 2 の要素を取得
fmt.Println(sl4[:2]) // [10 20]

// index >= 2 の要素を取得
fmt.Println(sl4[2:]) // [30 40 50]
```
　　

- **スライスに要素を追加する関数**

 - append: 要素の追加

```Go:append
sl := []string{"cat", "coyote", "giraffe"}

// append(スライス, 追加する値)
sl = append(sl, "bird")
fmt.Println(sl) // [cat coyote giraffe bird]

// 引数に複数の値を渡せる
sl = append(sl, "elephant", "alligator", "lion")
fmt.Println(sl) // [cat coyote giraffe bird elephant alligator lion]
```
　　

- **スライスのコピー**

sliceは参照型であり、参照型の場合、以下のように単純に新しい変数に代入してコピーすると、
メモリ上のアドレスは同じ場所を指すため、どちらか片方を更新するともう一方にも反映される。

```GO
func main() {
	sl := []int{10, 20, 30}
	sl2 := sl
	fmt.Println(sl2) // [10 20 30]

	sl[0] = 999
	fmt.Println(sl)  // [999 20 30]
	fmt.Println(sl2) // [999 20 30]
}
```

そのため、スライスのコピーにはcopy関数を使う。

```Go:copy
func main() {

	sl3 := []string{"A", "B", "C", "D"}
	sl4 := make([]string, 4, 8)
	// copy(コピー先, コピー元)、コピーに成功した要素数を返す
	num := copy(sl4, sl3)

	fmt.Println(num, sl4) // 4 [A B C D]

	sl3[0] = "E"
	// sl3 のみ更新される
	fmt.Println(sl3) // [E B C D]
	fmt.Println(sl4) // [A B C D]
}
```
　　

- **可変長引数**

...を付けることで、引数に渡す値の数を可変にできる

```Go
func VariableLen(i ...int) int {
	var num int
	for _, v := range i {
		num += v
	}

	return num
}

func main() {
	r := VariableLen(1, 2, 3)
	fmt.Println(r) // 6

	// 引数の数を変えられる
	rr := VariableLen(1, 2, 3, 4, 5)
	fmt.Println(rr) // 15

	// スライスも渡せる
	sl := []int{10, 20, 30}
	fmt.Println(VariableLen(sl...)) // 60
}
```

## マップ

key value形式の配列。

```Go:宣言
var m = map[string]int{"A": 10, "B": 20}
fmt.Println(m) // map[A:10 B:20]

m2 := map[string]int{"A": 10, "B": 20}
fmt.Println(m2) // map[A:10 B:20]

// {}を改行する場合
m3 := map[string]int{
	"A": 10,
	"B": 20, // 最後の要素の後にも , が必要
}
fmt.Println(m3) // map[A:10 B:20]
```

```Go:要素の代入
var m = map[string]int{"A": 10, "B": 20}

m["A"] = 100
m["C"] = 30

fmt.Println(m) // map[A:100 B:20 C:30]
```

```Go:要素の取得
var m = map[string]int{"A": 10, "B": 20}

// mapのindexを指定すればOK
fmt.Println(m4["B"]) // 20

// 存在しないkeyでもvalueの初期値が取得できてしまう
fmt.Println(m4["D"]) // 0
// 2つ目の戻り値にboolが入ってくるため、これで判定してエラーハンドリングができる
v, ok := m["D"]
if ok {
	fmt.Println(v)
} else {
	fmt.Println("error")
}
```

```Go:要素の削除
var m = map[string]int{"A": 10, "B": 20}

// delete関数 → delete(map, index)
delete(m, "A")
```

## 次回

[Go 言語仕様６（goroutine 並行処理）](https://qiita.com/R_R/items/7e3c1c34027a6169998d)
sassの画像の読み取りのpathについて

# 概要
以下のようなファイルの構成とする。

.
├── image
│   ├── img.jpg
└── scss
    ├── base
    │   ├── _base.scss
    │   └── _status.scss
    ├── component
    │   ├── header.scss
    │   └── top-img.scss
    └── style.scss

ここでtop-img.scssからimg.jpgを読み取りたいので以下のように記述したところwebpackでエラーが発生してしまった。

```:top-img.scss
.top {
    background: url("../../image/mv.jpg");
}
```

理由としてはstyle.scssで以下のようにtop-img.scssをインポートしたためである。

```:style.scss
@import "./component/top-img";
```

つまり最終的にインポートした場所からのパスになるのである。
つまり以下のように記述することがで動かすことができた。

```:top-img.scss
.top {
    background: url("../image/mv.jpg");
}
```
SFDX 開発

###・要件
SFDCのローカルのLWC開発環境の整備
###・対応案
・VSCodeのインストール
・SFDXエクステンション
・コマンド実行
###・コマンド
#####プロジェクトとScratchOrg（VscodeもできるCtl＋Shift＋P）
・ sfdx update
・プロジェクト作成
　sfdx force:project:create -n "TodoManager"
・開発Orgへログイン
  sfdx force:auth:web:login -a todoscratch -d
   ※ -d Default Hub
   ※ログインDomainはCustomizeの場合、sfdx-project.jsonにのsfdcLoginUrlを指定

・Scratch ORGを作成
 sfdx force:org:create -a lwc01 -d 20 -f config/project-scratch-def.json -s
 -- "hassSampleData":"true";
・Open
　sfdx force:org:open
・Source同期
  sfdx force:source:pull ロカールへ同期
　　※手作業の場合、左雲のところ、ダウロードマックをクリックする
　sfdx force:source:push Devへ同期

#####ロカールウェブサーバ
・sfdx plugins:install @salesforce/lwc-dev-server
・sfdx force:lightning:lwc:start

#####ソース配布
・メータ編集

    <apiVersion>50.0</apiVersion>
    <isExposed>true</isExposed>
 
    <targets>
        <target>lightning__HomePage</target>
        <target>lightning__AppPage</target>
        <target>lightning__RecordPage</target>
     </targets>

・右クリックして、Deployする
【AWS】DevOps エンジニア – プロフェッショナル(DOP)合格記

#はじめに
AWS 認定DevOps エンジニア – プロフェッショナル(DOP)に合格した(2020-09-26)ので、合格までの道のりを残しておこうと思います。

CLF合格記は以下をご覧ください。
[【AWS】クラウドプラクティショナー(CLF)合格記](https://qiita.com/nnydtmg157/items/6c66a23d6b4c544cfcb2)
SAA合格記は以下をご覧ください。
[【AWS】ソリューションアーキテクト-アソシエイト(SAA)合格記](https://qiita.com/nnydtmg157/items/5705410a0b31f1d5a89d)
SOA合格記は以下をご覧ください。
[【AWS】SysOpsアドミニストレーター-アソシエイト(SOA)合格記](https://qiita.com/nnydtmg157/items/ba86af83ae400bbcb82b)
DVA合格記は以下をご覧ください。
[【AWS】Developer-アソシエイト(DVA)合格記](https://qiita.com/nnydtmg157/items/b75384e15c70d1bb6775)
SAP合格記は以下をご覧ください。
[【AWS】ソリューションアーキテクト – プロフェッショナル(SAP)合格記](https://qiita.com/nnydtmg157/items/c9dbae1f70d2dcd3fcfe)

DOPはSAPの合格後すぐに勉強を始めました。
AWS認定試験は範囲が被る部分が多いので、複数資格取得を目指すなら、継続して勉強することをおススメします。

DOPは試験の名の通りDevOpsがメインになります。
DevOpsとは、「Development」と「Operations」つまり、「開発」と「運用」をより協調性をもって、迅速にビジネスの価値を高めながらエンドユーザーへシステムを提供するという概念です。
なので、開発や運用の自動化や効率化といった部分が多く出題されます。

#What's SAP?
まずは、DOP試験について
[AWS 認定 DevOps エンジニア – プロフェッショナル](https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/)

上記サイトによると、認定によって検証される能力は以下のようです。

* AWS で継続的デリバリーのシステムと手法を実装して管理する
* セキュリティコントロール、ガバナンスプロセス、コンプライアンス検証を実装し、自動化する
* AWS でのモニタリング、メトリクス、ログ記録システムを定義し、デプロイする
* 高可用性、スケーラビリティ、自己修復機能を備えたシステムを AWS プラットフォームで実装する
* 運用プロセスを自動化するためのツールの設計、管理、維持を行う

開発経験やIaC経験などが推奨されていますが、私は何も経験していません。
AWSとして推奨しているDevOpsに関する各サービスのベストプラクティスとパターンに合った選択が理解できるようにしましょう。


#試験に向けて
基本的にはSAAと同じ手法をとっていきました。(研修への参加はしていません。)
問題⇒解説⇒BlackBelt⇒問題⇒・・・の流れは変わりません。
ただし、今まで以上に開発・運用までの効率化や自動化の手法(構成)を意識して学習しました。

###公式サンプル問題
これはCLFと変わらず事前に受けて現状のレベルの確認をします。
他の試験を通して勉強してきたので、私は80％ほどの出来でした。

###ホワイトペーパーを読む
CLFと同じくホワイトペーパーを読みました。

###Black Beltを読む
こちらもCLFと同じくBlack Beltを読みました。

###問題を解く
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)

こちらのサイトは一問ごとに解説が表示され、都度確認ができ、BlackBeltやホワイトペーパーへのリンクもあるので、勉強しやすかったです。

個人のハンズオンでは実践できる範囲が限られているので、机上での学習がメインになります。
問題文の構成図を素早くイメージして、最適解を導く訓練をしましょう。
DOPはさらに自動化ツールや運用効率化をメインに出題されるので、CodeシリーズやElasticSerchなどをメインに学習することをお勧めします。
というか、ほとんどこのあたりの出題ですので、ここを完璧にすると、安心して試験に向かえます。

#試験当日
上記対策を計2週間(延べ20時間程度)行い、試験に臨みました。

結果は、762点(720点以上で合格)で合格でした。


#感想
SAPを受けた後なので、問題分の長さには困りませんでしたが、インシデントへの対応やセキュリティなどの管理ポリシーが難しかった印象です。
やはり、CodeシリーズやElasticシリーズが多かったです。デプロイ方法の最適解も聞かれたりしましたので、そのあたりは詳しく勉強しておいた方が良いです。(BeanstalkとCodeDeploy、OpsWorksの違いや、All at onceとRolling with an additional batch等々)

最後まで読んでいただきありがとうございます。
「Mathematical Theory of Bayesian Statistics」読後メモ(2) (「ベイズ統計の理論と方法」の比較)

# 本稿について

本稿はSumio Watanabe ・著「[Mathematical Theory of Bayesian Statistics](https://www.amazon.co.jp/dp/1482238063)」(Chapman and Hall/CRC, 2018)の読後メモです。

- 読後メモ(1)  
[https://qiita.com/hiroto1979/items/4985de1dd7a6c876d685](https://qiita.com/hiroto1979/items/4985de1dd7a6c876d685)
- 読後メモ(2)(本稿)  
[https://qiita.com/hiroto1979/items/618b62194c20b598e560](https://qiita.com/hiroto1979/items/618b62194c20b598e560)

# はじめに

## 略称など

以下の略称を使います。

- 「緑本」⇒「Mathematical Theory of Bayesian Statistics」(Chapman and Hall/CRC, 2018)  
[https://www.amazon.co.jp/dp/1482238063](https://www.amazon.co.jp/dp/1482238063)
- 「赤本」⇒「ベイズ統計の理論と方法」(コロナ社, 2012)   
[https://www.amazon.co.jp/dp/4339024627/](https://www.amazon.co.jp/dp/4339024627/)
- 「学習本」⇒「代数幾何と学習理論」(森北出版, 2006)  
[https://www.amazon.co.jp/dp/462781321X/](https://www.amazon.co.jp/dp/462781321X/)

## 本稿の対象

緑本のChapter1とChapter3の読後メモおよびChapter2のさわりを書きます。

# 本編

## Chapter1 Definition of Bayesian Statistics 

Chapter1の赤本との共通の箇所は、以下の通り。

- 1.1　ベイズ推測の定義
- 1.2　考察される量
- 1.4　事後分布の例
- 2.2.1　基礎概念
- 6.2.1　評価の規準
- 6.3　クロスバリデーション
- 8.1　確率分布と確率変数
- 8.2　平均と分散
- 8.3　同時分布と条件付き確率

緑本のみの箇所は、以下の通り。

- 1.7 Marginal Likelihood or Partition Function
- 1.8 Conditional Independent Cases

まずは、赤本の8章の一部が前に切り出されているので、イントロダクション的な感じで読みやすくはなっていますね。

赤本では、WAIC(赤本の168ページの$W_{n}$)は「6.2.1　評価の規準」にて、クロスバリデーション量(以降、「損失」および「誤差」をまとめて「量」と表す)は『6.3　クロスバリデーション』にて、汎化量や経験量とは個別に扱われましたが、緑本では、汎化量や経験量と並列で量のひとつとして扱い、定義を天下り的に行っています。
それに伴い、同時予測や周辺尤度の意味合いについての説明も追記されています。

なお、個人的に緑本のおかげで意識するようになった箇所は以下の内容。

- (緑本Remark9・21ページ)  
モデル選択やハイパーパラメータの選択において、損失の最小性と誤差の最小性は等価になる。  
しかしながら、誤差(Error)は損失(Loss)よりも分散が小さくなることから、数値計算を行う場合は、損失(Loss)の代わりに誤差(Error)を用いての比較がしばしば行われる。


## Chapter2 Statistical Models

赤本との大きな差はこの章の存在だと思います。
ここでは以下の具体的なモデルを提示して、量の計算をしています。

- 2.1 Normal Distribution(正規分布モデル)
- 2.2 Multinomial Distribution(多項分布モデル)
- 2.3 Linear Regression(線型回帰モデル)
- 2.4 Neural Network(ニューラルネットワーク)
- 2.5 Finite Normal Mixture(正規混合分布モデル)
- 2.6 Nonparametric Mixture(ノンパラメトリック混合分布モデル)

なお、2.5と2.6の違いは、混合する分布数が有限か無限かの差です。

2.5で扱う確率モデルは以下の通り。

```{math}
  p(x|a,b)
    = \sum_{k=1}^{K} a_{k} N(x|b_{k})
```

2.6で扱う確率モデルは以下の通り。

```{math}
  p(x|a,b)
    = \lim_{K\to\infty} \sum_{k=1}^{K} a_{k} N(x|b_{k})
```

「統計モデルごとに量がどのように動くかを肌で感じる」の方針で書かれており、応用を意識した書き方になっています。
量の計算を追ってみて、「じゃあ理論としてどのようになっているでしょう？」に続く感じです。

Chapter1でも触れた、「数値実験では誤差を用いる」を地で行く書き方になっています。
なお、コードの話とかが必要になるが、主題の比較から外れるため、これは別途の扱いと言うことで。

## Chapter3 Basic Formula of Baysian Observables

赤本の以下の内容が該当します。

- 2.1　真の分布と確率モデルの関係
- 2.2.2　正規化された変量
- 2.2.3　キュムラントと母関数
- 2.3　ベイズ統計理論の構造

赤本の35ページにある真の分布と確率モデルの関係のベン図は緑本にはないです。

![Image_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271370/a629351b-d747-0ab6-5ea7-ae41aafd33b1.png)

しかし、具体例が以下のパターンで提示され、包含のイメージがわかりやすくなるように思われます。

- 実現可能, 正則 ⇒ 相対的に有限な分散をもつ
- 実現可能 ⇒ 相対的に有限な分散をもつ
- 正則 ⇒ 相対的に有限な分散をもつ
- 非正則かつ実現不可能だが、相対的に有限な分散をもつ
- 実質的にユニーク ⇒ 相対的に有限な分散をもつ

また、扱う観測量自体はChapter1と同様ではあるが、これらの観測量の取り回しはキュムラント母関数をベースに行うのが基本。
そういう意味では赤本の内容が理解できるなら、そんなに苦労はしないと思われます。

ここまでは言うほどの差がないです。
次はChapter4ではなく、Chapter5を扱う予定です。
ここからが大きな差になります。
[生産性向上]おすすめのChromeの拡張ツール

新卒で１年ほどエンジニアをやって来ましたが、「プログラミングができる」ことよりも、「より早く（生産性高く）」「問題解決するための方法」を身につける方が圧倒的に大切だと感じています。
今回は自身が「生産性を高めるため」に役立った考え方・知識・スキルの一つである、「便利なChrome拡張ツール」についてまとめました。

#JSON Formatter#
Webブラウザ上に表示されるJSONを整形してくれます。
[おすすめポイント]
①JSONをいちいちコピペしなくてもワンクリックできれいになる。
②keyとvalueを色分けしてくれるので見やすい。
chrome ウェブストア：[JSON Formatter](https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=ja)

#Weblioポップアップ英和辞典#
Webサイトの英単語を任意のタイミングで翻訳して表示してくれます。
[おすすめポイント]
①コピペせずにその場で翻訳してくれる。
②翻訳したいタイミングを自由度高く設定できる。
③分からなかった単語を単語帳に即追加できる。
chrome ウェブストア：[Weblioポップアップ英和辞典](https://chrome.google.com/webstore/detail/weblio%E3%83%9D%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97%E8%8B%B1%E5%92%8C%E8%BE%9E%E5%85%B8/oingodpdjohhkelnginmkagmkbplgema?hl=ja)

#Awesome Screenshot#
Web画面をスクショしたり録画したりできる。
[おすすめポイント]
①キャプチャした後そのキャプチャ画像に対してコメントを書くことができる。
②スクロールが必要な範囲をキャプチャしたい場合でも、ワンクリックで一つのファイルに保存できる。
chrome ウェブストア：[Awesome Screenshot](https://chrome.google.com/webstore/detail/awesome-screenshot-screen/nlipoenfbbikpbjkfpfillcgkoblgpmj?hl=ja)

#おまけ#
###Wappalyzer###
今見ているウェブサイトがどんな技術で書かれているか見ることができる。
[おすすめポイント]
①興味本位でいろんなサイトを覗いてみると楽しい。
chrome ウェブストア：[Wappalyzer](https://chrome.google.com/webstore/detail/wappalyzer/gppongmhjkpfnbhagpmjfkannfbllamg?hl=ja)

###DevTools Theme: Zero Dark Matrix###
デベロッパーツールの配色を暗めにすることができる。
[おすすめポイント]
①目に優しい色合いになる。
②普段使ってるエディタと色が揃っててなんかいい。
chrome ウェブストア：[DevTools Theme: Zero Dark Matrix](https://chrome.google.com/webstore/detail/devtools-theme-zero-dark/bomhdjeadceaggdgfoefmpeafkjhegbo?hl=ja)

###Momentum###
Chromeを初めに開いたときに表示される画面をカスタマイズできる
[おすすめポイント]
①日替わりでオシャレな画像と気の利いたポエムを表示してくれる。
②画面共有中に急遽共有するサイトを新たに準備しなければいけない場合、「新しいタブ」をクリックすると、この画面が表示される。共有するサイトを準備しながらこの画面についての雑談を挟むことができるため、会話に困る相手でも間を持たせられる。
chrome ウェブストア：[Momentum](https://chrome.google.com/webstore/detail/momentum/laookkfknpbbblfpciffpaejjkokdgca?hl=ja)

#最後に#
ここまで読んでいただきありがとうございます！
他に便利なものを見つけ次第追記予定です。
みなさんからもこの他におすすめの拡張ツール・面白い拡張ツールがあれば、コメントで教えていただけるとありがたいです。
Paizaでも好きなエディタ使いたい！

Qiita初投稿です。
今回は自作のCLIツールを紹介します。

## TL;DR

- Paizaのスキルチェックを始めたが、Webページ上のエディタは使いづらいので、ローカルのエディタでコーディング&テストできるようなCLIツールを作ってみた

## 制作物

[![pz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565704/2ffbaef2-b79a-c51d-e554-85edc7a6654c.png)](https://youtu.be/FTqw5-lfkNE)
(↑クリックするとYouTubeへジャンプします。)

リポジトリはこちら → [reeve0930/pz](https://github.com/reeve0930/pz)

## なぜ作ったか

ものすごく個人的な話なので、興味のない人は読み飛ばして下さい…

最近、[AtCoder](https://atcoder.jp/)で競技プログラミングを始めました。
AtCoderで過去問を解いて色々と勉強していたのですが、
[Paiza](https://paiza.jp)のスキルチェックで似た感じの問題が解けるということを友人に教えてもらったため、
こちらの問題も練習として解いてみることにしました。
Paizaも同様にレーティングがあり、Aランク問題より上に行くと現状の自分では即答できない問題が出てくるようになり、
確かに練習問題として解くにはちょうどいいと感じました。

ただ、一点不満な点がありました。
それはWebページ上のエディタでコーディングをしなければならないことです。
以下の点でコーディングしづらいと感じています (一部個人的な理由を含んでいます)。

- エディタは問題ページ下部に存在し、問題文を読みながらコーディングできない
- 今まで作成した関数を使うためには、それを毎回コピペする必要がある。
- Vimキーバインドを使用できない (個人的理由)

私は普段[VSCode](https://code.visualstudio.com/)に[Vim拡張](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)を入れてコーディングしています。
カーソルキーを使わずにカーソルを移動できるため、キーボードのみでコーディングできるのが魅力です。
また、便利なキーバインドも多数あり、これがないとコーディングする気が起きなくなってしまいました (中毒)。

AtCoderでは以下のようなツールがあり、自分の好きなエディタでコーディングできる環境が整っています。

- [atcoder-cli](http://tatamo.81.la/blog/2018/12/07/atcoder-cli/)
    - 問題用のディレクトリの作成からテストケースのダウンロードなどを自動化
- [online-judge-tools](https://github.com/online-judge-tools/oj)
    - テストケースのチェックやコードの提出を自動化

AtCoderはコンテストサイトのため、競技性が高く、それ故このようなツールを制作する人も多いです。
しかし、Paizaの場合はあくまでも個人のスキルを評価することを目的としているため、
これらの便利なツールが今まで開発されて来なかったのだと思います (私が見つけられてないだけで、既にあったらごめんなさい)。

## Paiza用CLIツール: pz

前置きが長くなりましたが、以上の背景から[Paiza用CLIツール **pz**](https://github.com/reeve0930/pz)を作成してみました。
このツールでできることは以下の通りです。

- Paizaへの自動ログイン
- 問題用のディレクトリの作成
- 問題のテストケースのダウンロード
- 事前に準備しているテンプレートのコピー
- テストケースのチェック
- 特定のテストケースに対するデバッグ
- コーディングした内容をクリップボードにコピー
- 提出用フォームのプルダウンメニューを事前に設定したプログラミング言語に設定

このツールのインストール方法や詳細な使い方についてはリポジトリのREADMEに記載しております。
使ってみたい方はこちらからご確認下さい。
→ [reeve0930/pz](https://github.com/reeve0930/pz)

## 開発に用いたもの

- 言語: [Go言語](https://golang.org/)

マルチプラットフォームのCLIツールにしたかったため、Goを用いました。
異なるOS用のバイナリもコンパイルできるため(クロスコンパイル)、多様な動作環境で動作させるプログラムを作成できます。
(とは言え、M1 Macに対応させようとして、`GOOS=darwin GOARCH=arm64`でビルドしたら失敗しました… Goがまだ対応していない…？ 誰か教えて下さいw)

また、Goのライブラリとしては以下を用いました。

- ライブラリ: [cobra](https://github.com/spf13/cobra)

CLIツールの開発を劇的に楽にするライブラリです。
Cobra自体もCLIツールとなっており、これを使うことでテンプレートとなるコードを自動で生成してくれます。

- ライブラリ: [agouti](https://github.com/sclevine/agouti)

chromedriverなどでブラウザを操作するライブラリです。
seleniumのGo言語用のライブラリとなります。
chromedriverでブラウザと連動させることで、
問題番号などを指定せずとも現在のページの状態に応じて処理を行えるようにしました。

## 今回実装できなかったこと

実は当初考えていたけど現状実装できていない機能もあります。
`submit`コマンドで当初はWebページの提出用のテキストフォームに自動でコピペするように作りたかったのですが、
テキストフォームの作りが少し特殊でうまくできなかったのでクリップボードにコピーすることにし、
ペーストは手動で行うようにしました。
Paizaのエディタでも一応シンタックスハイライトや補完が効くので、
そのあたりの処理の関係でうまくいかないのだと思います。
時間があるときにそのあたりをちゃんと解析し、実装したいと思います。
うまくいく方法がわかる方がいましたら教えていただけると大変助かります。
何ならプルリクでも… (強欲)

## まとめ

今回はPaizaのスキルチェック用の自作CLIツール **pz**を紹介しました。
興味がある方がいましたら是非使っていただけるとありがたいです。
また、バグや機能改善要望などがございましたら、[issue](https://github.com/reeve0930/pz/issues)に書き込んでいただければ、随時対応したいと思います。
Circle CIでの自動デプロイ(SpringBootアプリケーション)のためのconfig.yml

```yml
version: 2 # バージョンは「２」とする
jobs: # 実行するタスクの定義
  build: # ビルドする内容をいかに記述
    working_directory: <アプリケーションのルートディレクトリ> 

    docker: # Dockerの設定
      - image: circleci/openjdk:11-stretch # Dockerfileの「From」に記述したベースイメージ

    steps: # 実行するコマンドを以下に記述

      - checkout:
          path: <circleciフォルダの階層>

      - restore_cache: pom.xmlが変わった時の差分を取得
          key: portfolio-{{ checksum "pom.xml" }}

      - run: mvn dependency:go-offline # プロジェクトのdependencyを取得する

      - save_cache: # プロジェクトのdependencyを取得するを保存
          paths:
            - ~/.m2
          key: portfolio-{{ checksum "pom.xml" }}

      - run: mvn clean install # テスト実行

      - store_test_results: # テスト メタデータを `target/surefire-reports` ディレクトリからアップロードし、CircleCI ダッシュボードに表示されるようにします
          path: target/surefire-reports # mave sure-fireプラグインというのが必要

      - store_artifacts: # uberjarファイルをアーティファクトとして保存します
          path: target/<jarファイル>


```
小規模事業者持続化補助金を使ったホームページ制作について

・<a href="https://miraiagent.co.jp/homepage-by-subsidy/">【2021最新版】補助金を使ったホームページ制作</a>

・<a href="https://miraiagent.co.jp/%e8%a3%9c%e5%8a%a9%e9%87%91%e6%b4%bb%e7%94%a8%e3%81%a7%e7%84%a1%e6%96%99%e3%81%a7%e3%81%8a%e5%ba%97%e3%82%92%e6%b6%88%e6%af%92%e3%81%a7%e3%81%8d%e3%81%9f%e5%ae%9f%e4%be%8b/">【補助金で50万円分が無料】お店を消毒してPRした取組事例(小規模事業者持続化補助金)</a>
【AWS】認定ソリューションアーキテクト-アソシエイト-受験記録

[【AWS】認定クラウドプラクティショナー受験記録](https://qiita.com/shin_moto/items/5d94d89ca4bbb39c4d16)

前回クラウドプラクティショナーを受験してから、
次なる目標としたのはみんな大好きソリューションアーキテクト-アソシエイト-です。

受験の際に同意した受験者行動規範により、試験内容の開示、共有は禁止されていますので、今回もあくまで試験に向けて行った準備とか感想とかを記していこうと思います。

## 本題

今回の試験も無事に一発合格しております。
スコアは753でしたので、余裕を持っての合格と言う感じではなかったですが。

![スクリーンショット 2021-02-13 20.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/0e602edb-c73b-e3ac-aed1-b5c30beab233.png)

準備期間はちょうど4週間、学習ペースは土日は3~5時間、平日は仕事が終わった後に1時間くらい。教材も前回と変わらず、安定の問題集をゴリゴリ解きまくるスタイルで。

書籍
・[AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4815607389/ref=pd_sbs_3?pd_rd_w=rVppw&pf_rd_p=1821eedd-9050-44ff-9f94-4ca9c8c19ec5&pf_rd_r=MKFTF3QYK9F9KCGEX0NE&pd_rd_r=03d23962-6866-4148-afd0-d42b875488cf&pd_rd_wg=MIBkS&pd_rd_i=4815607389&psc=1)
Udemy
・[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)
その他
・[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)


書籍はお馴染みAWS認定資格試験テキストですが、改訂第2版がちょうど発売されるタイミングだったので購入しました。SAA-C02に対応した内容も含んでいるようではありますが、これだけで完結と言う事ではなく、概要を掴んで各サービスの理解を深めるのは自分でやってねと言う書き方だったかなと思います。書籍ではあっさり書かれているサービスでも公式資料などを見て、深く理解しておく必要があると思います。

Udemyは模試を1、2周だけ。気になるサービスのハンズオンは少しやりましたが、サービスを起動して試運転する程度の内容なので、効率的に試験対策したいなら全部をやる必要はないかなと思います。動かすなら、実際にサービス組んでみるくらいやらないと意味ないなあと個人的には思います。

一番世話になったのはWEB問題集ですね。
SAAは問題文が長い傾向にあるので、数をこなすにはかなりの忍耐力が必要になりますが、腐らずガンガン解いて、正解も不正解も解説をしっかり読み、サービスの理解を深めるのが重要です。

数をこなせば、サービス毎の長所短所が把握出来て、ユースケースのパターンもある程度想像出来るようになりますので、このサービスならこう言う問題が作れるな、みたいな感じで自分で問題を考えられるくらいになると自信がつくかなと。

まあ、出題範囲が広いんで、網羅するのはなかなか難しいんですけどね。
今回あまり点が伸びなかったのは、問題集を過信し過ぎたのが要因かなと思います。新しく試験範囲になった新サービスの理解が明らかに足りなかったです。

試験は今回もピアソンVUEですが、近所のテストセンターで予約が取れなかったので、
自宅からはちょっと遠目のテストセンターで受験しました。運営企業は前回とは異なるようでしたが、段取りはほとんど変わりませんでした。

## まとめ
ビッグデータを扱うようなサービスは実際に使ってみるという事はないかもしれないですが、
ストレージ系やサーバレスなコンピューティング系のサービスは個人アプリとかで使ってみながらこれからも理解を深めて行こうかなと思いました。AWSは奥が深い・・・。

一先ず合格出来て一安心ですが、アソシエイト資格は是非網羅したいので、
次に受けるSysOpsアドミニストレーターの勉強を早速始めたいと思います。
Azure Blobの論理的な削除とライフサイクル管理の併用した再アップロードができなくなった問題

Azure Blobストレージにて、「論理的な削除」と「ライフサイクル管理」を併用すると問題が発生するケースがありましたので共有します。

# 再現条件

なるべく細かくかきましたが、基本的には太字部分が影響していると思われます。

## Blobストレージ側の設定

* Storage V2
* 東日本リージョン
* 読み取りアクセス地理冗長
* __[データ保護]で[Blobの論理的な削除を有効にする]を7日に設定__
* __[ライフサイクル管理]で3日後にクール層、14日後にアーカイブ層に移動する__

## SDK側

* [Azure.Storage.Blobs 12.7.0](https://www.nuget.org/packages/Azure.Storage.Blobs/12.7.0)
* __主に数十GB以上の大きなファイルを取り扱った場合__

# 再現手順

1. ファイルをBlobにアップロードする
1. 14日以上経過し、ライフサイクル管理機能でアーカイブ層に移行される
1. ファイルをBlobから削除する
1. 直後、同じパスにファイルを再アップロードしようとすると下記の様なエラーが発生し、失敗する

```
Azure.RequestFailedException: One of the request inputs is not valid.
Status: 400 (One of the request inputs is not valid.)
ErrorCode: InvalidInput
```

なお、数バイト～数キロバイトのダミーファイルで一旦上書きすると、事象が解消します。

# エラー原因

Blobの論理的な削除を無効にすると再現しなくなることから、なんらか干渉しているのは間違いないと思います。
マイクロソフトのサポートにも調査を依頼していますが、半年以上経過しても解消には至っていません。
何か進展があったら記事を更新しようと思います。
Nuxt.jsでAdobe Fonts（TypeKit）を使う

# Nuxt.jsでもAdobe Fontsを使いたい
静的なHTMLページをNuxt.jsで作り直そうと思ったのですが、Adobe Fontsの埋め込みコードを発行しても、以下のようにピュアなJS用のコードしか発行されない。

```javascript:AdobeFontsが生成するJS
(function (d) {
  var config = {
      kitId: '各自異なるID',
      scriptTimeout: 3000,
      async: true,
    },
    h = d.documentElement,
    t = setTimeout(function () {
      h.className = h.className.replace(/\bwf-loading\b/g, '') + ' wf-inactive'
    }, config.scriptTimeout),
    tk = d.createElement('script'),
    f = false,
    s = d.getElementsByTagName('script')[0],
    a
  h.className += ' wf-loading'
  tk.src = 'https://use.typekit.net/' + config.kitId + '.js'
  tk.async = true
  tk.onload = tk.onreadystatechange = function () {
    a = this.readyState
    if (f || (a && a != 'complete' && a != 'loaded')) return
    f = true
    clearTimeout(t)
    try {
      Typekit.load(config)
    } catch (e) {}
  }
  s.parentNode.insertBefore(tk, s)
})(document)
```

これだとプロジェクトにそのまま読み込めない。


# Googleで調べてみる
## Cannot find name 'Typekit'
[Nuxt.jsでいい感じにAdobe fontsのwebフォントを読み込む](https://qiita.com/keyakko/items/f313290437bbd8044573)

こちらの記事の方法でもできるはできるのですが、`Cannot find name 'Typekit'.`エラーが出てしまい、buildができない。

## Vue.jsでのやり方があった
[Vue.jsとBootstrapVue上でAdobeの日本語ウェブフォントを使う](https://qiita.com/xerroxcopy/items/ec9ae6b9352dceb73e3b)

pluginとして、Adobe Fontsで生成されたJSを単体ファイルとして作成し、それを読み込むという方法。これならいけそう！


# 解決
まずはAdobe Fontsで生成されたJSをpluginsで作成

```javascript:plugins/typekit.js
/* eslint-disable */
// めちゃめちゃ怒られるのでESLintは切っておく
;(function (d) {
  var config = {
      kitId: '各自異なるID',
      scriptTimeout: 3000,
      async: true,
    },
    h = d.documentElement,
    t = setTimeout(function () {
      h.className = h.className.replace(/\bwf-loading\b/g, '') + ' wf-inactive'
    }, config.scriptTimeout),
    tk = d.createElement('script'),
    f = false,
    s = d.getElementsByTagName('script')[0],
    a
  h.className += ' wf-loading'
  tk.src = 'https://use.typekit.net/' + config.kitId + '.js'
  tk.async = true
  tk.onload = tk.onreadystatechange = function () {
    a = this.readyState
    if (f || (a && a != 'complete' && a != 'loaded')) return
    f = true
    clearTimeout(t)
    try {
      Typekit.load(config)
    } catch (e) {}
  }
  s.parentNode.insertBefore(tk, s)
})(document)
```

作成した`typekit.js`をグローバルに読み込む

```javascript:nuxt.config.js
export default {
  ~ 省略 ~
  plugins: [
    { src: '~/plugins/typekit.js', mode: 'client' }
  ],
  ~ 省略 ~
}
```

ここで`mode: 'client'`オプションをつけておかないと、SSR時に**「documentが見つからないよ！」**となるので注意。


# おしまい
有料だし、あんまりAdobe Fontsを使うことはないかもしれないけどAdobe CC契約している人はぜひ。
最初の記事

とりあえずつくりました。
小技の寄せ集めみたいなもの？になるといいのかな？

VBAのシンタックスハイライトもいけるんかな？
大文字で書かないといけないのか・・・なるほど。
（VBE上だと意識してないけど、これが正式・・・なんかな？）

```vb:test.vb
Dim name As String
Dim cost As Long
```
経時データ解析の数理　藤越 康祝先生　朝倉書店

```{r}

library(dplyr)

#p.24 多群の場合

data("EuStockMarkets")

t=seq(0,1859*0.04,0.04)+rep(1991.496,1860)

t=t/1000

times=cbind(t,t^2);colnames(times)=c("t","t2")

groups=ncol(EuStockMarkets)

data=data.frame(times,EuStockMarkets)

times=as.matrix(cbind(rep(1,nrow(times)),times))

V=t(times)%*%times

sitas=svd(V)$u%*%diag(1/svd(V)$d)%*%t(svd(V)$v)%*%t(times)%*%EuStockMarkets

pre=times%*%sitas

sij2=(EuStockMarkets-pre)^2

N=prod(dim(EuStockMarkets))

sig_hat=sum(sij2)/N

sig_childer=sig_hat*N/(N-groups*ncol(times))

#回帰係数の信頼区間幅

qt(1-0.05/2,df=N-groups*ncol(times))*sqrt(diag(solve(V))*sig_childer)

#各標本の信頼区間幅

C_sita=t(sitas)%*%times[1,]

ncol(times)*qf(1-0.05,groups*ncol(times),N-groups*ncol(times))*sig_chider*t(c(times[1,]))%*%solve(V)%*%t(t(c(times[1,])))



```


```{r}

t=c(8,8.5,9,9.5)

mat=matrix(c(47.8,46.4,46.3,45.1,47.6,52.5,51.2,49.8,48.1,45,51.2,48.5,52.1,48.2,49.6,50.7,47.2,53.3,46.2,46.3,48.8,47.3,46.8,45.3,48.5,53.2,53,50,50.8,47,51.4,49.2,52.8,48.9,50.4,51.7,47.7,54.6,47.5,47.6,49,47.7,47.8,46.1,48.9,53.3,54.3,50.3,52.3,47.3,51.6,53,53.7,49.3,51.2,52.7,48.4,55.1,48.1,51.3,49.7,48.4,48.5,47.2,49.3,53.7,54.5,52.7,54.4,48.3,51.9,55.5,55,49.8,51.8,53.3,49.5,55.3,48.4,51.8),ncol=4)

t_vec=c(rep(8,20),rep(8.5,20),rep(9,20),rep(9.5,20))

sita1=cov(c(mat),c(t_vec))/var(c(t_vec),c(t_vec))

sita0=mean(c(mat))-mean(t_vec)*sita1

pi=ncol(mat);n=nrow(mat)

s=c()

for(j in 1:n){

s=c(s,t(c(mat[j,]))%*%(diag(rep(1,pi))-t(t(t))%*%t(t)/sum(t^2))%*%t(t(c(mat[j,])))/(n-1))

}

sig_hat=sum(s)/(pi-1)



```
flutterの文字列の中で.(ドット)を使った変数を表示したい


文字列の中に変数を代入する時は$を挿入することで表示することができます。
例えば下のようにするた$taskとすることでtaskに代入されている値を文字列の中に組み込むことができます。

```
print('タスクは$taskだよ');
```
しかし、インスタンスのプロパティを利用したいときに$task.nameのように挿入しようとすると.nameが単なる文字として認識されてしまい、変数を表示することができなくなってしまいます。

```
print('タスクは$task.nameだよ');
//これではtaskまでが変数として認識され.nameはただの文字として認識される。
```
これでは.nameが変数として認識されないので困ってしまいます。いちいちtasknameなどの新しい変数を作って代入してあげてもいいのですがもっと簡単な方法があります。
そこでこの問題を解決するには変数として認識して欲しい部分を全て{}を使うと大丈夫です。

```
print('タスクは${task.name}だよ');
```
これで万事解決です！
Firestore のデータ削除をトリガーに Cloud Storage の画像も削除する

Cloud Storage のパス（`post/{userId}/images/`）やファイル形式`jpeg`は皆さんのプロジェクトで違うので注意。

本当はCloud StorageのダウンロードURLをCloud Firestoreに保存しているのでそれを使いたかったが、スラッシュが一部だけエンコードされて%2Fになってるし、altやtokenなどのクエリもついていて、replace()で置換しようにも面倒だった。なので素直にFirestoreに書き込む時に画像ファイル名も合わせて書き込むようにしました。

```index.js
const functions = require("firebase-functions");
const admin = require('firebase-admin');
admin.initializeApp();

const db = admin.firestore();
const storage = admin.storage();
// db.settings({ ignoreUndefinedProperties: true }) // undifinedでエラーにならないための設定


exports.onDeleteMyPost = functions.firestore
  .document('/users/{userId}/posts/{postId}')
  .onDelete((snapshot, context) => {
    const userId = context.params.userId;
    const fileName = snapshot.data().postImageFileName; // 画像アップロード時にFirestoreに書き込んでおいたファイル名
    const path = `post/${userId}/images/${fileName}`; // Cloud Storage のパス
    return storage.bucket().file(path).delete();
  })

// file()の引数に指定すべきは以下の形式
// gs://myproject.appspot.com/post/{userId}/images/xxx.jpeg

// しかしアクセストークンを含むダウンロードURLは以下のようになる
// https://firebasestorage.googleapis.com/v0/b/myproject.appspot.com/o/post%2F{userId}%2Fimages%2Fxxx.jpeg?alt=media&token=yyy

```

##Firebaseの復習

Zennに書いたので良かったら見てね。
https://zenn.dev/maztak/articles/152c95647177b3
Rails：モデルの命名規則を破ったらエラーが出ました【NameError】【uninitialized constant】


# Rails：モデルの命名規則を破ったらエラーが出ました【NameError】【uninitialized constant】

## エラー画面
![スクリーンショット 2021-02-13 20.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101969/4aa01c8a-fb8e-ad61-ad86-f194dea72b5e.png)

### エラー説明
uninitialized constant:「定義したクラスを読むことができないよ」
（Railsでは定数やclassが定義されていないという意味のエラー）
NameError:「そんな名前は定義されてないよ」
（定義されていないローカル変数やメソッドが呼び出されている場合に、発生するRubyのエラー）

## 原因
classの命名規則が正しくできていなかった

誤：「Deliver_fee」
正：「DeliverFee」


## RailsのDBモデルの命名規則
### 単語が１つの場合
例）モデルの名前が「Deliver」

モデル名：deliver
モデルクラス名：Deliver
ファイル名：deliver.rb
テーブル名：delivers


### 単語が複数の場合
例)モデル名が「Deliver Fee」

モデル名：deliver fee
モデルクラス名：DeliverFee
ファイル名：deliver_fee.rb
テーブル名：deliver_fees
　
　
Railsは命名規則がきっちりしているので、ファイル名を命名規則に従わせないとファイルが見つからないとエラーが出てしまうようです。
気をつけましょう。

以上です。
nmtuiでIPアドレスを固定する

#IPアドレスの固定

#目的
Ubuntu 20.04.2 LTS Desktopでの固定IPアドレス設定。
今回は、設定ファイルを編集してIPアドレスの設定・変更ではなく、「nmtui」を使用したGUIで設定する。


#環境
- Windows10(TeraTerm)
- Ubuntu 20.04.2 LTS Desktop

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/524abdcd-abd2-d47b-6ebd-8fad628a54a1.png)

#IPの固定

固定するため、UbuntuのIPアドレスを調べる。


```
hostname -I
```
例：192.168.1.32

今回は、現状設定されているIPアドレスが変更されないように固定する。

IPアドレスを確認したら、nmtuiを起動する。

```
sudo nmtui
```


###メニュー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/424fc839-4fee-a6d9-41f2-7c3863ebd379.png)
起動する上の画面が表示される。

####操作方法
- 方向キーで移動
- Enterで選択

表示されたら、「接続の編集」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/969133d3-5942-e9b6-2767-e89085f26cd6.png)

この画面では変更したいネットワークを選択する。
有線で接続しているのであれば、表示されている「有線接続１」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/85230122-53e3-eb36-a225-fed0401e187c.png)

上の画面が表示される。
ここで、IPアドレスの設定する。

###IPアドレスの設定

- IPv4設定の<自動>を選択し、手作業に設定を変更する。
- アドレスに固定するIPアドレスを設定する。
- ゲートウェイにはデフォルトゲートウェイを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/de1fb267-692c-0798-2cc2-97eabaeb5cb0.png)

- OKを選択し、設定を保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/49b55120-3e3c-7fd2-8c93-cd5979329fa6.png)

#設定を有効化

メニュー画面に戻り、「接続のアクティベートする」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/aad45f7d-972d-4698-9da0-eb5500fa98dd.png)

画面のように接続の編集で設定したものが<解除>になっていればアクティベートされた状態になっているのでOK。
<アクティベート>になっていた場合は、接続設定を選択すればアクティベートされる。
※リモート接続で設定していた場合、接続が切れる時があるので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090510/e02616a3-f2c6-b4c9-d115-28f5a9e9b8c1.png)

<<戻る>>もしくは、ESCキーでnmtuiを終了する。
再起動すれば設定が反映される。

#確認
再起動後、設定したIPアドレスになっていれば設定完了です。

#最後に
IPアドレス固定のために、検索すると設定ファイルを編集して固定する記事が多かった。
記事の通り、設定を行ってもうまく設定できなかった時、GUIでの設定方法を思い出した。（以前、CentOSでいじった気がする）
Ubuntuでも使用できたので、IPの固定はこちらの方法をとった。

コマンドも覚えやすいので、今後もお世話になりそう。
AWS Client VPNをAWS SSOで認証できるようにする途中で詰まったところを書く

# 各種ログファイルの出力先

> MacOS のトラブルシューティング - AWS Client VPN : 
> https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/macos-troubleshooting.html

```
/Users/username/.config/AWSVPNClient/logs

アプリケーションログ: アプリケーションに関する情報が含まれます。これらのログには「aws_vpn_client_」が前に付けられます。
OpenVPN ログ: OpenVPN プロセスに関する情報が含まれます。これらのログには「ovpn_aws_vpn_client_」が前に付けられます。

/tmp/AcvcHelperErrLog.txt
/tmp/AcvcHelperOutLog.txt
```

# TunnelBlickなどのOpenVPNクライアントで読み込めない。もしくは接続エラーになる

## 現象

- TunnelBlickで出てきたエラー

```
"Unrecognized option or missing or extra parameter(s)".
このエラーは OpenVPN サーバから送られた OpenVPN 設定に以下の問題が含まれていることを示しています:
     • スペルが間違っている
     • パラメータが不足している、余計なパラメータが指定されている
     •このバージョンの OpenVPN では実装されていないオプションです(おそらく新しいオプションでまだサポートされていないか、古いオプションで既に削除されているもの)。"VPN の詳細" ウインドウの "設定" タブにある "OpenVPN バージョン" で、この設定で使用する OpenVPN のバージョンを選択できます。
詳細は "VPN の詳細" ウインドウの "ログ" タブに出力されているログを確認してください。
```

## 解決策
> クライアント VPN エンドポイントが SAML ベースのフェデレーション認証を使用するように設定されている場合は、AWS が提供するクライアントを使用して接続する必要があります。
> - ユーザーガイド > AWS Client VPN > MacOS
> - https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/macos.html

## 発生した環境

```
Tunnelblick 3.8.3 (build 5520)
```

## 原因
- SAMLベースのフェデレーション認証を使用するクライアント VPN エンドポイントからクライアント設定をダウンロードしたovpnファイルには以下のようなオプション指定が入っている

```
〜大体110行目あたり〜
〜前略〜
auth-user-pass
auth-federate　　　　　　←問題の部分
auth-retry interact
auth-nocache
reneg-sec 0
```
- OpenVPN2.4時点では「auth-federate」と言うオプションは存在しないのでエラーとなる




# ダウンロードしたプロファイルをAWS Client VPNで読み込み接続をしても、ログイン画面が開かず、ぐるぐる回ったまま動かなくなってしまう。

## 原因
> Amazonから提供された クライアントVPN設定ファイルに認証機関 (CA) チェーン情報がないため、検証に失敗します。
> - Windows のトラブルシューティング - AWS Client VPN : 
> - https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/windows-troubleshooting.html 
    - ※Windows向け記事だがMacOSでも当てはまる

## 解決策

- ダウンロードしたプロファイルを開き<ca>セクションの3番目の証明書を置き換えて、設定ファイルをインポートしなおしてみる
- 置き換え先の内容は以下URLに記載されている
- Windows のトラブルシューティング - AWS Client VPN : 
    - ※Windows向け記事だがMacOSでも当てはまる
    - https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/windows-troubleshooting.html 

# 反省
- 全部ドキュメントに書いてあることでした。。。。
- サポートの人ごめんなさい。。。
フロントコーディング(マークアップ)を行うときに使っているフォーマットと気をつけていること

今までの大学生活の中で多くの本や記事を読んだり、web制作会社で働いたりした経験から初心者こそ知ってほしい原則や考え方を書きました。


## Format
```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="ここにこのページの説明を書く">
    <link rel="icon" type="image/png" href="images/">
    <link rel="stylesheet" href="css/sanitize.css">
    <link rel="stylesheet" href="css/style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <title></title>
  </head>
  <body>
    <header></header>
    <main></main>
    <footer>
      <p><small lang="en"></small></p>
    </footer>
  <script src="js/script.js"></script>
  </body>
</html>
```

```css:css/style.css
@charset "UTF-8";
*{
    margin: 0;
    padding: 0;
}

/* 共通部分 */

html {
    font-size: 62.5%;
}
body{
    margin: 0 auto;
    font-size: 1.6rem;
    font-family: "Helvetica Neue",
    Arial,
    "Hiragino Kaku Gothic ProN",
    "Hiragino Sans",
    Meiryo,
    sans-serif;
    line-height: 1.7;
    color: #432;
}
.wrapper{
    max-width: 1024px;
    margin: 0 auto;
    padding: 0 4%;
}
*, *::before, *::after {
    box-sizing: border-box;
}
a {
    text-decoration: none;
}
li{
    list-style-type: none;
}
img {
    max-width: 100%;
    height: auto;
}


::selection {

}
```

htmlファイルと　cssファイルについてのみ言及します。

htmlファイルでは予め言語設定やメディアクエリ設定、cssファイルやjsファイルとの連携を行っておきます。また人によってはこれに加えてfontawesomeの設定などを挿入しておくと良いでしょう。bodyタグの中身についてはwebページの中は大まかにheader,main,footerで大きく分けて書かれるため自分がコーディングしやすくなるようにに予め書いておきます。

cssファイルについてはセレクタに対して共通のレイアウト指定をしておきます。これについては個人の考え方やチームの方針によって変わると思うので編集してください。
reset.cssやsanitize.cssを用いることでこういった指定をする必要がない場合もあります。


## HTML,CSSを書くときに気をつけていること
ここでは私がコーディングをするときに決めている原則や決まりごとについて書きます。

+ !importantはプラグインで余計なスタイルが指定されている場合などを除いて極力使わない
+ style属性は使わない
+ IDに対してCSSを書かない
+ 要素セレクタに対してCSSを書かない
+ 共通部分を抜き出し、1つににしていくことでスタイルを再利用しやすくする
+ 予め統一するもの(配色、フォントファミリー、フォントサイズ、絶対値の余白、アニメーションのイージング、コンテナの最大幅、各パーツのデフォルトサイズ）を決めておく
+ セレクタ名の後ろにスペースを1ついれる
+ 値が0以下の少数の場合は0を省略する(0.3s → .3s)
+ 値が0の場合は単位は省略する(0px → 0)
+ 色はカラーコードで指定する
+ カラーコードは省略可能なら3桁で指定する
+ z-indexは10,100のように桁違いで指定する
+ class名は短くしようとついつい略語と使いたくなるが、誰が見ても意味がわかるようにclass名は極力省略しないようyにする
+ marginの向きは片方向に統一する(僕はtop,left派)
+ transitionのall指定は避ける→面倒くさくてもプロパティ名で指定しよう(all→colorにするとか)
+ wrapperなどにmax-widthとmargin:aotu;を指定して、それより外の要素は画面いっぱいに広がるようにする
+ widthやheightの絶対値指定は本当に必要な要素のみに指定する。大抵の場合はmarginやpaddingで解決できることが多い。
+ HTMLを書くときはdivとspanを一切使わないセマンティックなコードを書いて、デフォルトのスタイルのみで意味が通じるかを確認し、CSSでレイアウトをしていくときにdivとspanを解禁する。


だらだらと気をつけていることを書いたが、自分が無意識のうちに原則にしていることや決めていることが本当はもっとあると思う。
実は以上のようなことを守るかどうかなんてどうでもいい。

結局大切なことはチームで共通の書き方を認識しあっておくということだ。メンバーの中には変なこだわりを持ったメンバーもいたり、全くこだわりがなく様々な指定の仕方をしてしまうメンバーもいたりするかもしれない。そんな中でも本当に生産的なことに各メンバーが時間をかけられるように、誰が見てもわかり、誰が見ても編集しやすい、保守性、可用性、可読性の高いコードを書けるようになるとより良い。
あなたが今書いているコードが後に誰かが解読に苦しむコードにならないために。
【初心者でもわかる】CSSで縦横比を固定したまま画像を正方形にトリミングする3つの方法

# どうも7noteです。縦横比固定したまま正方形にトリミングする方法の解説

画像は予めトリミングされていればいいのですが、WordpressなどのCMSを使っていたり、デザインの都合上元画像が長方形しか用意できない場合なんかもあります。

そんなときに**CSSで縦横比を固定したまま、画像を正方形にトリミングできる方法**を3つ紹介します。


## `object-fit: cover;`を使って正方形にトリミング（IE非対応）

```index.html
<div class="photo"><img src="sample.jpg" alt="写真"></div>
```

```style.css
.photo {
  width: 200px; /* 正方形の横幅 */
  height: 200px;/* 正方形の高さ */
}

.photo img {
  width: 100%;  /* 表示したい範囲(100%) */
  height: 100%; /* 表示したい範囲(100%) */
  object-fit: cover; /* 画像をトリミング */
}
```

**結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/a9a23a79-863f-51ee-82be-70b6113933e2.png)


### 解説

`object-fit: cover;`を使えば、一発でトリミングが可能です。画像(img)の親要素に縦横の幅を指定して、子要素のimgでは`width: 100%;`と`height: 100%;`、そして`object-fit: cover;`を指定するだけで簡単にトリミングすることができます

また、`object-position: center top;`のように書くことで、トリミングする基準値を決めることができます。

※IE非対応なので、一般公開するサイトとしてIEにも対応させる必要がある場合は違う方法を取るか、既存のIEにも対応させるjsを読み込む必要があります。

詳しくは過去の記事のコメントをご覧ください→[こちら](https://qiita.com/7note/items/d8908d9eae046f40ad74#comments)

## `object-fit`を使わずに画像を正方形にトリミング

```index.html
<div class="photo"><img src="sample.jpg" alt="写真"></div>
```

```style.css
.photo {
  width: 200px; /* 正方形の横幅 */
  height: 200px;/* 正方形の高さ */
  position: relative; /* 基準位置とする */
  overflow: hidden;   /* はみ出た分を非表示 */
}

.photo img {
  position: absolute; /* 相対位置とする */
  top: 50%;           /* 上から50%の位置 */
  left: 50%;          /* 左から50%の位置 */
  transform: translate(-50%, -50%); /* 画像のサイズの半分だけ位置を戻す */
}
```

**結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/734b6c29-3dc5-e861-32a9-56d798e0e998.png)

※元の画像サイズのまま一部を切り抜いてるので、coverのような切り抜きにするなら以下のようにimgタグに高さ、もしくは幅に100%を指定する必要がある。

```style.css
/* 以下も追加したらcoverみたいになる */
.photo img {
  width: auto;
  height: 100%;
}
```

## 短く書ける、imgタグを使わず背景画像として正方形にトリミング

```index.html
<div class="photo"></div>
```

```style.css
.photo {
  width: 200px; /* 正方形の横幅 */
  height: 200px;/* 正方形の高さ */
  background: url(sample.jpg) center center / cover; /* 背景画像を設定 中央に配置し、幅高さいっぱいに表示 */
}
```

**結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/b5664ca8-e556-8770-73c0-164d1931587f.png)

## まとめ

3つの方法を紹介しましたが、imgタグとして利用したいのであれば①つ目の方法。imgでIEにも対応させたいのであれば②の方法。
あまり制限はないので、簡単に作りたいなら③の方法がオススメかなと思います。

どの方法でもほぼほぼ同じことができるので、すきな方法を使ってみてください。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Raspberry Pi PicoのMicroPython開発環境をVSCodeで準備する

# はじめに

Raspberry Pi PicoをMicroPythonで書く環境でいい感じなのはどれかといろいろ調べていて、今の所良さそうなのがこれかなと思って準備してみました。 [Pico-Go](https://marketplace.visualstudio.com/items?itemName=ChrisWood.pico-go) + [Pico-Stub](https://github.com/cpwood/Pico-Stub) Pico MicoroPythonのコード補完が効いてVSCodeからコードが転送できます。

[Developing for the Raspberry Pi Pico in VS Code — Getting Started](https://medium.com/all-geek-to-me/developing-for-the-raspberry-pi-pico-in-vs-code-getting-started-6dbb3da5ba97)に沿ってセットアップしてみます。

環境:
macOS Big Sur 11.2.1
Python 3.8.6
pip 21.0.1
nodejs v12.14.0

# セットアップ

`micropy`と`pylint`をインストールします

```shell
pip install micropy-cli
pip install pylint
```

[Pico-Stubのアーカイブファイル](https://github.com/cpwood/Pico-Stub/archive/main.zip)をダウンロードして展開し、mycropyに登録します

```
cd Pico-Stub-main/stubs
micropy stubs add micropython-rp2-1_13-290
```

VSCodeに以下の拡張機能をインストールします
[ms-python.python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
[VisualStudioExptTeam.vscodeintellicode](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode)
[Pico-Go](https://marketplace.visualstudio.com/items?itemName=ChrisWood.pico-go)

Pico-Goをインストールした後、USBケーブルでRaspberry Pi PicoとPCを接続するとVSCodeのターミナルに `Connecting to /dev/tty.usbmodem0000000000001...` と表示され自動的にシリアル接続されます。

![スクリーンショット 2021-02-13 20.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/cadd67b7-8102-e052-d89c-3a96fa8e76ac.png)

この状態でターミナルペインの`＋ `ボタンをクリックしてもうひとつターミナルのタブを開いてそこで新しいディレクトリを作り、micropyのプロジェクトを作成します

```shell
mkdir LED-Flash && cd $_
micropy init
```

スペースキーで2つのオプション`VSCode Settings for Autocompletion/Intellisense`、`Pylint MicroPython Settings`を選択してエンターを入力します

![スクリーンショット 2021-02-13 20.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/1b13ef32-1db2-3c7b-138a-bb47cc42ff28.png)

スペースキーで`rp2-micropython-1.13.0`を選択しエンターを入力します

![スクリーンショット 2021-02-13 20.08.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/97009e1e-2c6d-8178-7995-2d797520300f.png)

これでプロジェクトが作成されます。

# コードを書いてRaspberry Pi Picoに転送してみる

作成した`LED-Flash`ディレクトリをVSCodeで開き、`blink.py`というファイルを新規作成して以下のコードを書きます

```blink.py
from machine import Pin, Timer

led = Pin(25, Pin.OUT)
t = Timer()

def tick(timer):
  global led
  led.toggle()

t.init(freq=2.5, mode=Timer.PERIODIC, callback=tick)
```

コードを入力するといい感じで補完されたりします。

![スクリーンショット 2021-02-13 20.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/83b01bd4-599a-568f-9e4e-aa561dc1aa4e.png)
![スクリーンショット 2021-02-13 20.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/11a1989e-8be0-f4c1-2549-9b3693c39222.png)

コードが書けたらコマンドパレットで`Pico-Go > Run current file`を選択します

![スクリーンショット 2021-02-13 20.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/617f03e3-6a0a-4031-621c-baeeb949282f.png)

コードが転送されてLEDが点滅します

![PXL_20210213_030907012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61995/308d919f-d6d2-3b53-63e9-ae1995d6d841.jpeg)

# おわりに

とりあえず開発環境が整ったのでいろいろやってみようと思います
仮想化とCPUのお話

#はじめに
[仮想化に関する基礎知識](https://qiita.com/Lynx_Arc18/items/8cdb77e1462d21c975c9)
上記の記事で仮想化とは、「仮想化の対象よりも低い層を"仮にあるもの"として動作させる」と紹介しました。
しかし仮想化の技術をもってしても越えがたい壁が存在します。
その壁とはコンピュータを構成するハードウェアの一つであるCPUに由来します。

##CPUのアーキテクチャ
CPUのアーキテクチャにはその設計思想や用途に応じて、様々な種類が存在します。例えば、CPUメーカとして有名な「Intel」はX86-64というアーキテクチャのCPUを製造しているメーカです。
※厳密にはさらに細分化されますが、ここでは省略します。
個人で使用するパソコンにはこのX86-64系が多く使用されています。他にもスマートフォン向けには電力消費が小さいARMアーキテクチャのCPUが採用されています。現行のものだけでも10種類以上のCPUアーキテクチャが存在します。

##越えられない壁
前述した越えがたい壁は、このアーキテクチャに由来し、X86-64ベースのOS（例えばWindows10）を仮想化する際に、SPARCアーキテクチャ(スーパーコンピュータ「京」に採用されていたアーキテクチャ)のCPUを搭載したコンピュータ上では、仮想化することができません。
同様にSPARCベースのOS(例えばOracleのSolaris)を仮想化する際に、X86-64アーキテクチャのCPUを搭載したコンピュータ上では、仮想化することができません。

#おわりに
旧来のシステムを延命させるために仮想化を実施することがあるかもしれません。
お客さんが自前でX86-64の仮想化基盤を用意できることもありますが、それはそれ。
CPUのアーキテクチャのことは頭の隅に置いておきましょう。
※知人はSPARCをX86の仮想化基盤でできない？という依頼を受けたことがあるようです。
tasks.jsonで変数に含まれるバックスラッシュが除去されてしまう

## やりたいこと
- 環境はWindows10(ファイルパスの区切り文字が`\`)
- `tasks.json`にg++でcppファイルをコンパイルするタスクを定義する
- コンパイル対象は「今アクティブなウィンドウで開いているファイル」
  - 今回の例では`C:\test\hoge.cpp`とする

## つまづいたこと

- 以下のようなタスク定義を`tasks.json`に記述

```json:tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "g++ compile",
      "type": "shell",
      "command": "g++",
      "args": [
        "-g",
        "${file}",
        "-o",
        "${fileBasenameNoExtension}.exe"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}
```
- 想定している実行コマンドは`g++ -g C:\test\hoge.cpp -o hoge.exe`
- タスクを実行すると`g++.exe: error: C:testhoge.cpp: No such file or directory`のエラー
  - tasks.argsの`${file}`に含まれている`\`が除去※されている模様  
  ※`C:\test\hoge.cpp`が`C:testhoge.cpp`としてコマンドライン出力されている

## 解決策
- `"\"${file}\""`と記述する(ダブルクォートで囲むことで内部のバックスラッシュが除去されない)
  - この時の実行コマンドは`g++ -g "C:\test\hoge.cpp" -o hoge.exe`となり、期待通り動作する
- 今回は`tasks.json`の例だが、`launch.json`とかでも解決策は同じ

```json:tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "g++ compile",
      "type": "shell",
      "command": "g++",
      "args": [
        "-g",
        "\"${file}\"", // ★ここ
        "-o",
        "${fileBasenameNoExtension}.exe"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}
```

## 参考
[公式ドキュメント：Variables Reference](https://code.visualstudio.com/docs/editor/variables-reference)
[今回の対応方法が書いてあるissue：\" doesn't work correctly in tasks.json](https://github.com/microsoft/vscode/issues/31722)
Jupyter Notebook で Ruby が使えるってま！？

# 概要
会社でRailsを使って開発をしている関係でRubyのコードを試したいことが多々ありました。
Paizaとかブラウザで実行できるものもあるがPythonみたくJupyter notebookでできないかなと思っていました。

そこで調べるとRubyをJupyter notebookに入れることが出来ることが判明(ﾟ∀ﾟ)　実際に導入する手順がわかったので今後PCが壊れたときのためにインストール方法をメモします。

# 条件
|  言語  |  ver  |
| ---- | ---- |
|  Ruby  |  2.10 以上  |
|  Jupyter Notebook  |  --  |

※Ruby と jupyter notebookの道入がまだの人は以下の記事よりそれぞれのインストールを済ませて下さい。

・Rubyのインストール
[【完全版】MacでRails環境構築する手順の全て](https://qiita.com/kodai_0122/items/56168eaec28eb7b1b93b)


・Jupyter Noteboookのインストール

① anacondaのインストール
[Anaconda（Python3）インストール手順＜macOS用＞](https://sukkiri.jp/technologies/ides/anaconda-mac_install.html)

② anacondaのPATHの通し方
[AnacondaのPATHの設定](https://qiita.com/funabashi800/items/c13c4f742f43d9ebdd86)

③ Jupyter notebook のインストール
[Installing the Jupyter Software](https://jupyter.org/install)

# 方法

[iRubyのgithub](https://github.com/SciRuby/iruby)をもとにインストールを進めていきます。

まず、依存関係にあるライブラリのインストールをします。

cmzp の versionによっては動かない可能性あり↓
* [Jupyter NotebookにRuby Kernelを追加する方法](https://collab-it.net/2018/07/1391/)

```:terminal
brew install automake gmp libtool wget
brew install zeromq --HEAD
# 1.30以上で動かないとの記事あり
brew install czmq --HEAD
gem install ffi-rzmq
gem install rbczmq
```

irubyのインストールとjupyterへの登録をします。

```:terminal
# irubyのインストール
gem install iruby

# irubyの登録
iruby register --force
```

最後にjupyter notebookの起動をします。

```:terminal
jupyter notebook
```

以下のように Ruby が New の中に入っているのを確認して下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656158/ec0532ab-ea7b-c884-35f1-9a6647a162d4.png)
ネットワークスペシャリストお勉強ノート【ネットワーク層、トランスポート層の基礎技術編】

★NAT
Network Address Translation
プライベートIPアドレスをグローバルIPアドレスに変換すること
NAT対応ルータに搭載
送信元（Source）NATと宛先（Destination）NATがあり送信元IPアドレス、宛先IPアドレスを書き換える

★NAPT
Network Address Port Translation
NATは１対１のアドレス変換だが、NAPTは１対多のアドレス変換を実現する
ポート番号も持ってる

★CGN（NAT444)
Carrier Grade NAT
ISPなどの通信キャリア級の規模で使うNAT
少数のIPv4グローバルアドレスを使ってより多くの端末をインターネットに接続するためのアドレス変換技術

★IPv4アドレス
4バイト

★グローバルIPアドレス
機関に申請して割り当てられる
インターネットにて利用

★プライベートIPアドレス
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
組織内などの閉じたネットワークのみで利用
インターネットに出るにはNATによりグローバルIPアドレスにて通信

★ネットワークアドレス
前３つ

★ホストアドレス
後ろ1つ

★サブネットマスク
ホストアドレス部の情報を分割し、複数のより小さいネットワークを形成するために使用する情報

★CIDR
Classless Inter Domain Routing
IPv4のアドレス割り当てを行う際に、クラスA〜Cといった区分にとらわれずに、ネットワークアドレス部とホストアドレス部を任意のブロック単位に区切り、IPアドレスを無駄なく効率的に割り当てる方式

★ループバックアドレス
自分自身を示すアドレス
127.0.0.1

★ICMP
Internet Control Message Protocol
送信元ホストへのIPパケットの送信エラー報告などの制御メッセージを通知する
ping
Type
Code
Type 0 Echo reply
Type 3 Destination unreachable 

★ICMPリダイレクト
今より適切なルータがあることを伝えるICMP（Type5）のメッセージ
Gateway Address

★traceroute
ICMPプロトコルによるネットワークの通信経路を調査するコマンド
相手先に届くまでにどのルートを通ったかがわかる

★IPv6
ネットワーク回線、ネットワーク機器、サーバやパソコンが対応している必要がある
グローバルユニキャストアドレス
ユニークローカルユニキャストアドレス
リンクローカルユニキャストアドレス


★トランスレータ
パケットのヘッダを書き換える

★マルチキャスト
１対（特定の）多

★ユニキャスト
１対１

★ブロードキャスト
１対多

★IGMP
マルチキャストグループへの参加や離脱をホストが通知したり、マルチキャストグループに参加しているホストの有無をルータがチェックする時に使用するプロトコル

★IGMPスヌーピング
不要なPCにはマルチキャストフレームを送信しない仕組み

★TCP
Transmission Control Protocol
伝送を制御するプロトコル
コネクション型通信

★３ウェイハンドシェイク
TCPのコネクション確立方式
SYN、SYN＋ACK、ACK

★TCPのスライディングウィンドウ
TCPの通信高速化を実現する技術

★UDP
User Datagram Protocol
コネクションレス型のプロトコル
TCPに比べて高速

★ルーティング
静的ルーティング
動的ルーティング

★RIP
Routing Information Protocol
ディスタンスベクター型のルーティングプロトコル

★RIP2(RIP Version 2)
マルチキャストになった

★RIPng
IPv6ネットワークに使用され距離ベクトル方式を用いているもの
next generation

★OSPF
Open Shortest Path First
最短経路優先のアルゴリズム
リンクステート型のアルゴリズム
コストの概念
エリア分割
LSA（Link State Advertisement）をルータが交換することで経路情報を把握

★BGP
Border Gateway Protocol
AS（Autonomous System）：自律システム
パス属性を用いたパスベクタ型
BGPスピーカ：BGPが設定されているルータ
IBGP(Inter BGP)とEBGP(External BGP)
chitubox を ubuntu20 にインストールする

chitubox を ubuntu20 にインストールします。

まずは公式サイトにログインを行い、アプリをダウンロードします。

[All-in-one SLA/DLP/LCD Slicer-CHITUBOX Free Download ](https://www.chitubox.com/en/download/chitubox-free)

ダウンロードしたファイルを解凍して AppRun を叩けば普通は動くのですが、今回のバージョンでは QT のバージョンが 5.15 が必要とエラーがでるので下記コマンドで対応をします。

```bash
# goto https://www.chitubox.com/en/download/chitubox-free
# and download CHITUBOX FREE Linux (CHITUBOX_V1.8.1.tar.gz)

cd ;
tar xvf CHITUBOX_V1.8.1.tar.gz ;
mv "CHITUBOX V1.8.1" chitubox_1_8_1 ;
echo "export LD_LIBRARY_PATH=/home/$USERNAME/chitubox_1_8_1/lib" >> .bashrc ;
source .barshrc ;
cd chitubox_1_8_1 ;
./AppRun ; 
````

たぶん、簡単なミスなので、次期バージョンでは対応されているでしょう。

####参考リンク
[Unable to launch 1.8.1 on Linux Mint 20-Troubleshooting and Bug Reports-CHITUBOX Community]( https://forum.chitubox.com/?thread-800.htm)