OmniAICreator/Qiita-1.07M huggingface dataset:
Java ExcelをTIFFで保存

<p><strong>TIFF は、ビットマップ画像の符号化形式の一種です。タグと呼ばれる識別子を使うことによって、様々な形式のビットマップ画像を柔軟に表現できます。今回は Spire.XLS for Javaを使ってExcelをTIFFで保存する方法を紹介してあげましょう！</strong><strong> </strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/xls-for-java-free.html">Free Spire. XLS for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210324/20210324105601.png" alt="f:id:lendoris:20210324105601p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210324/20210324105623.png" alt="f:id:lendoris:20210324105623p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>元のファイル</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210324/20210324110952.png" alt="f:id:lendoris:20210324110952p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class ConvertExcelToTIFF {
    public static void main(String[] args) {
        //Workbook　objectを作成します。
        Workbook workbook = new Workbook();
        
//Excelをロードします。
        workbook.loadFromFile("Input.xlsx");

        //シートを取得します。
        Worksheet sheet = workbook.getWorksheets().get(0);

        //シートをTIFFで保存します。
        sheet.saveToTiff("SheetToTiff.tiff");

            }
}
```
<h4><strong>実行結果</strong></h4>
<p><strong> </strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210324/20210324111044.png" alt="f:id:lendoris:20210324111044p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
IBMCloud CIS サブネット指定でドメインを保護

##目的
IBMCloudのCISを利用して、特定のIPからドメインを保護できる。
サブネットを指定するには、<font color="red">演算式で実施する必要がある</font>ので紹介する。

今回は、10.10.10.0/24のサブネットから公開ドメインに対してのアクセスを禁止する。
参考ページ:[フィールド、関数、および式の使用法](https://cloud.ibm.com/docs/cis?topic=cis-fields-and-expressions)

##実施方法
**[Security]** -> **[ファイアウォール・ルール]** -> **[作成]**をクリックする
![貼り付けた画像_2021_03_24_10_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/90925fb5-f4ad-d1c9-8a74-e291a5838b74.png)

**[演算式の編集]**をクリックする
![貼り付けた画像_2021_03_24_10_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/f65d1a55-14b6-f1dd-a695-3a0dc2159aa9.png)

**(ip.src in {制御したいサブネット})**を入力し、アクションを指定する
例:(ip.src in {10.10.10.0/24})
![貼り付けた画像_2021_03_24_10_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/323cd90b-7dc7-2a12-644a-fe94586bdac5.png)

有効化しておしまい
![貼り付けた画像_2021_03_24_10_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/784702ec-36ed-57f8-4669-1d1471a0444b.png)
window.open()にnoopener noreferrerを設定する

noreferrer だけ設定していれば、自動的に noopenerもつく。  

```js
window.open(URL, "_blank", "noreferrer");
```

https://developer.mozilla.org/ja/docs/Web/API/Window/open#%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E6%A9%9F%E8%83%BD%E3%81%AE%E7%89%B9%E6%80%A7
Eclipseを使ってJavaで実装してるとき、開いていたファイル（タブ）が消えるから設定してみた。(初心者向け、未経験者向け)

普段、仕事でJAVAを使った保守開発の案件に携わっています。
その際は、ツールとしてEclipseを使っています。

作業をやっているときに、
開いていたファイル（タブ）が他のファイルを開くと"消えていること"があるので、度々開くのがめんどくさいので、設定しました。


**～手順～**
1 **ウィンドウ**
2 **一般**
3 **設定**
4 **エディター**
5 **エディターを自動的に閉じる**
6 **適用して閉じる**
7 **Eclipseを落として、再度立ち上げる**




1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174366/111aa5b5-9ec3-d5ed-c67e-920e13c064f5.png)


基本のタブ欄から"ウィンドウ"をクリックする。

2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174366/f175baab-60a6-6b81-ba7d-e1066d8d7f83.png)

クリック後に、"設定"をクリックする。



3,4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174366/7933300f-5ce1-5726-ef9f-d6ed302cf83f.png)

"一般"を開き、"エディター"を開く。


5

"エディターを自動的に閉じる"をチェックを外す。


6
"適用して閉じる"をクリック。

7
念ため、Eclipseを落として、再度立ち上げる。


完了！！
【TypeScript】any型とunknownについて　〜備忘録〜

先日からトTypeScriptを学習してるのでアウトプットがてら書いていこうと思います！

間違い等あれば指摘して頂けると幸いです！

#any型とunknown型の違い

結論→any型は使用しないよう意識するべき！
そもそもTypeScriptは型定義することで事前にエラーをアラートしてくれる言語であるのに、それを放棄するイメージ。

#####any型・・・どんな型でも許容する
#####unknown型・・・代入された値によって型が決まる

実際に挙動の違いを書いていきます

###any型の挙動


```anySample.ts
export const anySample = () => {
  let name:any = 'aaaa'
  // string型が表示される→　string aaaa
  console.log(typeof name,name);
  name = 25
  // number型表示される→　number 25
  console.log(typeof name,name);
}
```
any型で定義すると、1つ目のconsoleではstringが表示され、
2つ目のconsoleではnumber型定義される

これがany型の挙動です！

###unknown型の挙動

```unknownSample.ts
export const  unknownSample = () => {
      let number: unknown = 10;
      // number型が表示される
      console.log(typeof number,number)

      // この書き方はエラーが表示されます　→　オブジェクト型は 'unknown' です。
   //   const sum = numberValue + 10

   if(typeof number === 'number'){
          // number型と指定することで使用することができる
            const sum = number + 10
            console.log(sum)
       }
}
```
`const sum = number + 10`sumに10を追加しようとしても
エラー文で「オブジェクト型は 'unknown' です。」と表示されてしまいます。
そこで一度if文を使ってnumberはnumber型であることを証明してから使用するとうまくいきます！
unknown型を使用する時はif文を使って処理を切りわけることが必要です！


#最後に

JavaScriptは型定義する習慣がなかったから慣れないな〜
AWS認定 SysOps Administrator Associateを再試験で無事合格した話


## はじめに

皆さん、こんにちは！！
ハンズラボのサムです！！
記事更新が遅くなってしまい申し訳ないです。
前回、下記の記事にて勢いでSysOps Administrator Associateを受けて惨敗したので、2週間後にリベンジしてきました！
https://qiita.com/sam_eng3336/items/ed52f7d555431bd42fb0

## 目的

SysOps Administrator Associateのリベンジ！
目指せassociate3冠！

## スケジュール＆試験対策

試験対策期間： 5日間ぐらい

前回の内容にプラスして書籍も購入して学習しました。
・試験関連の書籍(https://www.amazon.co.jp/dp/4865941991/ref=cm_sw_r_tw_dp_ZAZZYJSJF9VCEHH33F0T)
・Udemyの模擬試験(https://www.udemy.com/course/aws-sysops-53195-q/)
・AWSの公式模試(https://aws.amazon.com/jp/certification/certification-prep/)

書籍を一通り読んで分からないサービスを重点的に調べてなるべく試験で分からない単語が無いようにし、
模試試験も反復して実施し、答えを暗記しないで論理的に結論が導き出せるようにしました。

## 実際のテストの雰囲気など

正直2度目なので、問題の質や傾向は1回目とさほど変わらなく解けはしたのですが、
これ以上落ちたらやばいと思いそこだけ緊張しました...
※問題量や質は他のアソシエイト系と比べて変わらないのですが、問題文のサービスなどが古いように感じました（何やら新試験のベータテストもやってるみたいです）
https://aws.amazon.com/jp/about-aws/whats-new/2021/01/new-beta-exam-for-aws-certified-sysops-administrator-associate/

## 結果

**無事合格しました！**

ちゃんと手応えはあったのですが、前回落ちてるのもあってヒヤヒヤしながら結果を見ました！
点数も合格ラインより100点多かったから若干余裕を持って合格できてよかったです。
ただまぁ、スコア分析で前回【十分な知識を有する】だった**高可用性**が【再学習の必要あり】だったのでゆらぎがあるからちゃんと復習しないとですね・・・！

以上、こんな感じでしたがいかがでしたでしょうか！
問題文とかはあまり詳しいことを言えないのでどうしてもこんな勉強したよっていう報告レベルになってしまいますが、少しでも皆様のお役に立てれば有り難いです！
またAWS資格試験を受験したらこのシリーズの記事を書くので宜しくお願い致しますm(_ _)m

![スクリーンショット 2021-03-24 10.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/ce331b6d-242f-d0fb-2706-323f8dc71706.png)

![スクリーンショット 2021-03-24 10.20.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181414/27db9e6e-16ec-60f6-e5d0-3852d4747c27.png)
Markdown記法の備忘録

ネットや書籍で仕入れた情報・・・
管理・整理の方法が煩雑で、欲しいときに情報が取り出せないという何とも情けない状況を少しでも良くしようということで、備忘録メモとしてQiitaを使うことにした！

世の中のみなさまに向けた技術情報発信ではないので、あしからず。

ということで、Qiitaの記事投稿の際に使用するMarkdown記法の中でも頻繁に使いそうな記法についてメモしておこうと思う。

# Code - コードの挿入
バッククォート3連打で囲む。コードブロック上下に空行を挿入しないと正しく表示されないみたいです。
先頭のバッククォート3連打に続けて、ファイル名を記述する。
※バッククォートは、***Shiftキー + @キー***
>(空行)
\`\`\`python:test.py
import pandas as pd
\`\`\`
(空行)

例）

```python:test.py
import pandas as pd
import numpy as np
```

## コードを文章中のインラインに記述する
コードの部分をバッククォートで囲う。

>\`x=x+1\` も記述できる。

例）`x=x+1`も記述できる。

---
# テキストの装飾

## テキストの見出し
\# <半角スペース> ***「見出し文字」*** で記述。#の数でフォントのサイズが変わる。

 - # これはH1タグです
 - ## これはH2タグです
 - ###### これはH6タグです


## 打ち消し線
打ち消し線は、 ~~ で囲う。 ~~打ち消し~~
打ち消し文字の前後に 半角スペース が必要。また、~~と打ち消し文字は続けて記述。


## 折りたたみ文章
文章を、開閉式の折りたたむ形式で記述する場合、文章全体を ***detailsタグ*** で囲む。
文章内で、要約として表示したい文章を***summaryタグ***で記載します。

```
<details>
<summary>Qiita(キータ)は、プログラマのための技術情報共有サービスです。</summary>
プログラミングに関することをどんどん投稿して、知識を記録、共有しましょう。
Qiitaに投稿すると、自分のコードやノウハウを見やすい形で残すことができます。
技術情報はテキストファイルへのメモではなく、タグを付けた文章、シンタックスハイライトされたコードで保存することで
初めて再利用可能な知識になる、そうQiitaでは考えています。
</details>
```

<details>
<summary>Qiita(キータ)は、プログラマのための技術情報共有サービスです。</summary>
プログラミングに関することをどんどん投稿して、知識を記録、共有しましょう。
Qiitaに投稿すると、自分のコードやノウハウを見やすい形で残すことができます。
技術情報はテキストファイルへのメモではなく、タグを付けた文章、シンタックスハイライトされたコードで保存することで
初めて再利用可能な知識になる、そうQiitaでは考えています。
</details>


# 箇条書き（リスト）
「*」「+」「-」のいづれかを箇条書きの先頭に入れると箇条書きになる。
※リストの上下に空行がないダメ。「*」「+」「-」の後にはスペースが必要！

```
- その１
- その２
- その３
```

- その１
- その２
- その３

## 番号添え字による箇条書き
文頭に「数字.」を入れる。
後からの挿入/移動を考慮して、1. 2. 3. と順番にするのではなく、1. 1. 1. という風に同じ数字にしておくと良い。
※リストの上下に空行がないダメ。「数字.」の後にはスペースが必要！

```
1. その１
1. その２
1. その３
```

1. その１
1. その２
1. その３

# リンク
\[リンクテキスト](URL "タイトル") で、タイトル付きのリンクを作れる。
(タイトルは、リンク上にマウスオーバーすると表示される。)

```
[Yahoo](http://yahoo.co.jp ヤフー)
```

[Yahoo](http://yahoo.co.jp ヤフーのリンクです。)

## リンクカード
直接URLを記述し、前後に空行を入れるとリンクカードを表示できる。

```
(空行)
http://yahoo.co.jp
(空行)
```

http://yahoo.co.jp

---
とりあえずは、これくらい覚えておけば投稿できるかな？
また、お便利記法があったら、追記していくとしよう！

おしまい
Solved /  W: mkconf: MD subsystem is not loaded && W: mdadm: failed to auto-generate temporary mdadm.conf file.

## エラー内容

```
W: mkconf: MD subsystem is not loaded, thus I cannot scan for arrays.
W: mdadm: failed to auto-generate temporary mdadm.conf file.
```

## Google翻訳
> W：mkconf：MDサブシステムがロードされていないため、アレイをスキャンできません。
> W：mdadm：一時的なmdadm.confファイルの自動生成に失敗しました。

## 対処方法

### そもそもmdadmとは

> mdadmは、ソフトウェアRAIDデバイスの管理と監視に使用されるLinuxユーティリティです。これは、raidtools2やraidtoolsなどの古いソフトウェアRAIDユーティリティの代わりに、最新のLinuxディストリビューションで使用されています。

不要だったためアンインストール。

```
$ sudo apt remove mdadm
```

### 参考
[WSL2 / Ubuntu 20.04; warning on apt update: W: mkconf: MD subsystem is not loaded && W: mdadm: failed to auto-generate temporary mdadm.conf file.]
(https://github.com/microsoft/WSL/issues/5425)
[mdadm 4.1-2 causes unrecoverable grub config loop in dpkg, apt #4903](https://github.com/microsoft/WSL/issues/4903)
コマンドラインの基本

#コマンドの種類
- touch  
新規ファイルの作成
- cat  
ファイルの中身を確認
- pwd  
カレントディレクトリを確認  
現在どこのディレクトリにいるのかがわかる
- cd  
移動。
親ディレクトリは .. で表す。  
自分が今どこのディレクトリで作業しているのか分かっていることが超重要。  
というのも、違うところで作業していて、エラーが起きていたのはこれが原因だったw
- ls  
ディレクトリの中身を確認
- mv  
mv には２種類の方法があり、  
1.ファイルやディレクトリの移動  
2.ファイルやディレクトリの名前の変更  
どちらも構文が一緒で  
mv 現ディレクトリ　移動先ディレクトリ
mv 現ディレクトリ　新ディレクトリ  
最初は違いがわからなかったけど、後ろのディレクトリが存在しているかしていないかで分かった。  
また、-rをつけることでファイルとディレクトリを区別する。
- cp    
ファイルやディレクトリのコピー。これもmv同様、-rをつけてファイルやディレクトリを区別する。  
- mkdir  
ディレクトリの作成。
キャプションを画像幅に合わせる

メディア系にて


```html
<figure>
  <img src="https://placehold.jp/400x200.png" alt="">
  <figcaption> なが〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜いキャプション</figcaption>
</figure>
```

```css
figure {
  display: table;
}
figcaption {
  display:table-caption ;
  caption-side:bottom;
  margin: 10px 0 0 0;
}
```


caption-sideというプロパティ初めて知ったけど、どのブラウザでも効く模様
https://caniuse.com/?search=caption-side
【Ruby】「プロを目指す人のためのRuby入門」アウトプット (クラスの継承)

# はじめに

「プロを目指す人のためのRuby入門」の7.6、クラスの継承について、丁寧に学習したいと思ったので、自分の学習メモとしてアウトプットしていきたいと思います。

## クラスの継承に関する用語

### スーパークラス
継承する方(継承元)

### サブクラス
継承される方(継承先)

継承は「スーパークラスの機能を全部引き継ぐための仕組み」という考えは適切ではない。
機能ではなく性質や概念が共通しているかで判断する。
「サブクラス is a スーパークラス」が成り立つかどうかで判断すると良い◎

## Ruby標準ライブラリの継承関係

Rubyの継承は単一継承

継承できるスーパークラスは1つだけ。(ただし、Rubyのミックスインという機能は多重継承に似た機能をもつ)

### 標準ライブラリの継承関係

Rubyの標準ライブラリの代表的なクラスは次の図のような関係になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953011/f9495ca7-775d-9828-ca0d-c0d4c713cbf1.png)
出典：プロを目指す人のためのRuby入門

## オブジェクトのクラスを調べる方法

classメソッドやinstance_of?メソッドを使用するとオブジェクトのクラスを調べることができる。

```ruby
# Userクラスを作成
class User
end

# 独自で作成したクラスはデフォルトでObjectクラスを継承する。
# Userクラスへはメソッドを定義していないが、Objectクラスを継承しているためto_sメソッドなどが使えるようになる。

# classメソッドを使うとクラスを調べることができる
user = User.new
user.class #=> User

user = User.new
user.instance_of?(User) #=>true

# userはUserクラスのインスタンスか？
```

継承関係を含めて確認したい場合はis_a?メソッドを使う。(「サブクラス is a スーパークラス」が成り立つかどうかの確認だね！)

```ruby
user = User.new

# is-a関係にあればtrueになる。
user.is_a(User) #=>true
user.is_a(Object) #=>true
user.is_a(BasicObject) #=>true

# is-a関係にない場合はfalse
user.is_a(String) #=>false
```

## クラスの継承

Objectクラス以外を継承したいときは

```ruby
class サブクラス < スーパークラス
end 
```

スーパークラスのinitializeメソッドを呼び出すときはsuperが使える

```ruby
class サブクラス < スーパークラス
					:
	def initialize(a, b, c)    # aとbはスーパークラスのinitializeメソッドで代入済み
		super(a, b)　　　　　　　　 # superを使うとスーパークラスの同名メソッドを呼び出せる 
		@c = c
	end
					:
end
```

スーパークラスとサブクラスで実行する処理が変わらなければサブクラスで同名メソッドを定義したりsuperを読んだりする必要もない。

## メソッドのオーバーライド

サブクラスではスーパークラスと同名のメソッドを定義することでスーパークラスのメソッドをオーバーライド(上書き)できる。

例えば、Objectクラスで定義されているto_sメソッドをサブクラスで再定義(オーバーライド)することで、自分の使いやすい形で表示できるようになる。

# まとめ

今回はここまで！

なんとなくの理解にしてしまっていたオブジェクト指向についてしっかり学習したいと思ったのため、「プロを目指す人のためのRuby入門」のクラスの章について、アウトプットしてみました。

# 参考

書籍：プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで
[WP]記事のcsv登録時にタイマーイベントを付加する

備忘録系。


* 指定の日に記事を下げる（時間は固定）
* 時間はACFでフィールド入力（close_date）

```
function my_csv_importer_save_post( $post_object ) {
  $pid = $post_object->ID;
  $close_date = get_post_meta($pid, 'close_date', true);
  $close_date_time = $close_date . ' 23:59:59';
  if ($close_date_time != '' && date_i18n('Y-m-d H:i:s') < $close_date_time) {
    $time_stamp = strtotime($close_date_time . ' JST');
    wp_schedule_single_event($time_stamp, 'my_new_event', array($pid));
  }
}
add_action('really_simple_csv_importer_post_saved','my_csv_importer_save_post',10);
```


登録時にイベント付加っていうフックがwikiとかに書いてなくて
プラグインファイルみまくって、`really_simple_csv_importer_post_saved`を見つけた・・・
XserverのMySQL(MariaDB)にTablePlusで外部接続する

XserverのデータベースにXserver外からアクセスしたい！と思ったことがある人はいると思います。

私です。

Googleで「エックスサーバー データベース 外部接続」と検索すると先人様方の知見がいくつか出てきます。

SSHトンネルを使えば外部からのアクセスが可能とのことでした。


ということはTablePlusからもアクセスできるんじゃね？と思ったのが昨日。


結論としては無事アクセスすることができました！

掘削作業してトンネル堀り堀りできます。


ただどこに何を設定すればいいのかがわからなく、ちょっと時間をとられたので備忘録としてしたためようと思った次第。



#210326追記
記事を出したその日の午後にMariaDBに載せ変わったので書き換えました。

https://www.xserver.ne.jp/news_detail.php?view_id=7454

基本的な流れは変わっていないのでご安心を。

#下準備

エックスサーバーのコントロールパネルからSSH設定で公開鍵認証用鍵ペアの生成して任意のディレクトリに保存しておきましょう。

https://www.xserver.ne.jp/manual/man_server_ssh.php

#TablePlusの設定値

![2021-03-23_16h52_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217361/f6172017-06e9-aaa6-abd0-f649eb7180fa.png)


**Name** : 好きな名前を登録しましょう
**Status color**: 好きな色
**Tag** : ご自由に
**Host** : データベースを設定するページの下部にある MariaDB10.5 ホスト名 もしくは IPアドレス

~~MySQL設定の下部にあるホスト名~~
~~(2021/3/24現在 MySQL5.7情報の MySQL5.7 ホスト名)~~
localhost もしくは 127.0.0.1 でOK
**Port** : 3306
**User** : (MySQL)ユーザ追加から作成したユーザ名
(接続したいデータベースにアクセス権を所有させておきましょう)
**Password** : (MySQL)ユーザ追加から作成したユーザのパスワード
**Database** : (MySQL)追加から追加したデータベース名

**SSL mode** : デフォルトのままでOK

**Over SSH** : チェックを入れる

**Server** : サーバー情報にあるホスト名
(sv\*\*\*\*.xserver.jp など)
**Port** : 10022
**User** : サーバーパネル左上にあるサーバーID
**Password** : 空白

**Use SSH Key** : SSH設定で作成した公開鍵認証用鍵
**Passphrase** : SSH設定で作成するときに入力したパスフレーズ

これでXserverにあるデータベースをどうしても触らないといけない、データを確認したいとなったときも
XserverにログインしてphpMyAdmin立ち上げてログインしてという手間がだいぶと楽になりそうです✨

ご利用は計画的に！
ERROR: Repository not found. fatal: Could not read from remote repository.

##問題##

今まで正常にgit push, git cloneができていたのに、あるレポジトリにpushしようとすると以下のようなエラーがでてpushできなかった。

ssh keyのあたりがおかしいのか？ということでregenerateしたがダメだった。
###エラー

```
ERROR: Repository not found.
fatal: Could not read from remote repository.

error: src refspec master does not match any...
```

###原因と解決方法

該当リポジトリのgithubのcollabolationの設定がwriteではなくreadになっていた。
設定を変えるか新しくリポジトリを作って、設定の確認をしましょう。
初学者のプログラミング　Rackとはなんぞや

勉強したけどよくわからなかったから言語化してみました！
##Rackとは
サーバーとフレームワークが密結合(あるフレームワークで開発したAアプリはXサーバーでしか動かない)という状態をRackがその中間に存在し、Rackを経ることで疎結合なやりとりを可能にする、というもの。つまり、バラバラで開発されたアプリと、その動作環境はマッチしないことがあるから、Rackという歯車を噛ませることで動作するように対応が可能になった。

##よくわからないこと
まだ初心者なので、サーバーによって動作しなくなる具体例がわからない。どういう時にRackを利用してどんな問題(動作しないという問題だと思うけどその試しがない)が解決できるようになるのかわからない。
##まとめ
今後Rackを必要とする場面がきたら、その時に改めて追記しようと思う。現在、railsを勉強しているけれど、必ずRackが必要、というわけでもなさそうなので、今はなんとなくわかれば良いかなーくらいに留めておく。今後、理解が深まった時に追記する。
## さいごに
プログラミングの初学者です。その日に学んだことを学習の一環としてアウトプットしています。より深く学習していきたいと考えておりますので、ご指摘等いただけますと幸いです。

参考図書：パーフェクト Ruby on Rails【増補改訂版】すがわらまさのり/前島真一/橋立友宏/後藤優一/五十嵐邦明
【初心者による】Linuxコマンド【初心者のための】

備忘録としてまとめます。
と、その前に軽くLunuxについて認知してから実際のコマンド(命令)に触れていきます。

# Linuxとは？
Linuxは、WindowsやMacなどと同じOS。
コンピューターの全てのハードウェアを管理しているソフトウェアのこと。
Linuxは主に**サーバー用として使うOS**。
マウスを使ったグラフィカルな操作もできるが、基本はキーボード操作がメインとなる。

詳しくは[こちら](https://www.sejuku.net/blog/4948)を参照しております。

# Linuxコマンドとは？
コマンドは直訳すると「命令」という意味。
つまり、「LinuxOSを動かすための命令」のこと。
これから「コマンド」をキーボードで入力し、「コンピューターと対話」していきます！

# よく使うLinuxコマンド
コマンドを叩く前に自分がどこのディレクトリにいるのかを確認すること。

|コマンド|説明|記述例|備考|
|--|--|--|--|
|cd|ディレクトリ(フォルダ)移動|cd ディレクトリ|[cdの詳細](https://eng-entrance.com/linux-command-cd)|
|ls|フォルダの内容をリスト形式で全表示|ls|[lsの詳細](https://eng-entrance.com/linux_command_ls)|
|cp|ファイルやフォルダのコピー|cp|[cpの詳細](https://eng-entrance.com/linux_command_cp)|
|vi|Linuxの表中のエディタを表示|vi ファイル名|[viの詳細](https://eng-entrance.com/linux-command-vi)|
|tail|ファイルの最終行から数行を表示するコマンド|tail ファイル名||
|cat|ファイルの閲覧、連結して閲覧|cat ファイル名|[catの詳細](https://eng-entrance.com/linux_command_cat)|
|grep|ファイル中の文字列を検索|grep 検索正規表現 ファイル名|[grepの詳細](https://eng-entrance.com/linux-command-grep)|
|ssh|外部のコンピュータにアクセス<通信内容が全て暗号化してる>|ssh 接続先IPアドレス または DNSアドレス|[sshの詳細](https://eng-entrance.com/linux-command-ssh)|
|mkdir|ディレクトリの新規作成|mkdir ディレクトリ名|[mkdirの詳細](https://eng-entrance.com/linux-command-mkdir)|
|rm|ファイルやディレクトリの削除|rm ファイル名|[rmの詳細](https://eng-entrance.com/linux_command_rm)|
|rmdir|ディレクトリを削除|rmdir ディレクトリ名|[rmdirの詳細](https://eng-entrance.com/linux-command-rmdir)|
|kill|普通ではない動作をしているプロセスの終了、動作の停止|kill プロセス番号|[killの詳細](https://eng-entrance.com/linux-command-kill)|
JSONって、結局なんなの？

#今回書く事
JSONっていう言葉を聞いて、ちんぷんかんぷんだったので、今回基礎を学習し直してみました。

13日の金曜日に出てくる**アイツ**じゃないですよ。

#JSONとは
>JavaScript Object Notation

の略です。
「あれ、JavaScriptって言葉が入っているな」と思った方、よく見つけてくれました。しかし、実はJavaScriptの一種というわけではなく、[Wikipedia](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)によると、

>データ記述言語の1つである。軽量なテキストベースのデータ交換用フォーマットでありプログラミング言語を問わず利用できる[1]。名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する。

と書かれており、言い換えるとJavaScriptのような書き方をするからその名前付けちゃった。みたいな感じみたいです。

さて、JSONの意味をwikiの説明で理解できた人は、ここで読むのをやめていただいて結構です。
まだよくわからないよという方々は、僕と一緒にもう少し学習していきましょう。

##データ記述言語
では、先ほどの引用で述べられていた、**データ記述言語**とはなんでしょうか？
結論から言うと

####データのやりとりをするための、ファイルの記述方法とその形式　

です。

もう少し噛み砕くと

>たくさんある書き方ルールの中のひとつが「JSON」です。

ということができます。

最も簡単な例でいくと、HTMLと言う言語は、実際に表示されるページレイアウトを構築するためのファイルの記述方法とその形式ということができます。
つまり、**「データを送るときは、こういう風に書いて、拡張子（ファイル名の.の後に続くファイルの種類を指定するもの）付けようね〜」**というルールを示しているのが、JSONになリます。

##JSONの基本的な書き方
ここまでをいったんまとめると

- JavaScript Object Notationの略称。「JSなん？」と思うかもしれないが、JavaScriptとの相性がよく、記法も似ていることからこう名付けられている。(Notaion = 表記)
- JSONは、データ記述言語である。要するに、データを送るときの書き方のルールである。

ということです。

それでは、ここからは基本的な書き方を見ていきましょう。

まず、基本的な文法です。

```
{ "名前": "値"}
```

具体的には

```
{
  "name": "齋藤"
}
```

複数入れることもできます。

```
{
  "name": "齋藤",    
  "age": 24,
  "gender": "男"
}
```

ふむふむ。確かにJSのオブジェクト作成の書き方にそっくり。

```example.js
const animal1 {
  "legs": 4
  "name": "ライオン"
  "Cry": "がおー"
}
```

ちなみに、JSONでもJSでも、`"キー": "バリュー"`という風に指定しています。

ここまで読んでくださった方は、あとは[【JavaScript】ゼロから始めるJSON入門](【JavaScript】ゼロから始めるJSON入門)を読んで頂ければと思います。より詳しく、わかりやすく文法のことを説明されていますので、是非に。

##なぜJSONを見直したか
以上のように、JSONの概念は理解していただけたでしょうか。
では最後に、僕が今回JSONを理解しなおそうと思ったきっかけについて話します。

結論から言うと、**APIと言うワードに付随してたくさんJSONという言葉が出てきたからです。**

###APIとは

>Application Programming Interface

の略で、

>APIとはソフトウェアの機能を共有できる仕組みのことをいいます。

（参考: [APIとは？意味やメリット、使い方を世界一わかりやすく解説](https://www.sejuku.net/blog/7087)）

と説明されています。

例えば、SNSのアカウント情報を利用して会員登録できるような仕組みがありますよね。このQiitaに登録するときも、おそらくいくつかの選択肢を提示されたと思います。あれも、APIの一つです。

###APIが、XMLからJSONへ
話を戻して、このAPIを理解するにあたって、JSONがなんちゃらこうちゃら・・・と出てきたことを踏まえると、ソフトウェア構築の核となる「データ」を送ってAPIが成立していることを踏まえると、きっとJSONは至る所で用いられているんだろうなという仮説を立てました。

そこで調べてみると、こういう歴史があったみたいです。

>Web APIが出始めた頃はXML形式でデータの送受信を行うものが多かった覚えがあります。...(中略)しかしXML形式は可読性が悪い、タグが多く手続きが面倒、文字が多い分送受信コストが高いなどの理由によって次第にJSONフォーマットに置き換わるようになってきます。

(参照: [5分で分かるWebAPI](https://developer.ntt.com/ja/blog/5%E5%88%86%E3%81%A7%E5%88%86%E3%81%8B%E3%82%8BWebAPI))

やはり、API(WebAPI)を実現するための手段として、XMLと呼ばれるものから、JSONに変化した。つまり、**APIを用いるためには、JSONの知識が不可欠であることがわかります。**

このように、JSONを理解してみると、その存在意義が明確になったかなと思います。

#最後に
最後まで読んでいただき、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ！」というご意見、「そこどうなっているの？」というご質問など、お待ちしております。

#参考文献
- [Wikipedia JavaScript Object Notation](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)
- [JSONとは | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13798.html)
- [【JavaScript】ゼロから始めるJSON入門](【JavaScript】ゼロから始めるJSON入門)
- [APIとは？意味やメリット、使い方を世界一わかりやすく解説](https://www.sejuku.net/blog/7087)
- [5分で分かるWebAPI](https://developer.ntt.com/ja/blog/5%E5%88%86%E3%81%A7%E5%88%86%E3%81%8B%E3%82%8BWebAPI)
iOSのネットワーク状態を取得する

iOSのネットワーク状態を取得するには、AppleのサンプルコードにあるReachabilityが有名でしたが、iOS13からNWPathMonitorってのが使えるようになってました（知らなかった）

https://developer.apple.com/documentation/network/nwpathmonitor

```swift
func getNetworkInfo(completionHandler: @escaping (String) -> ()) {
    let monitor = NWPathMonitor()
    monitor.pathUpdateHandler = { path in
        // 接続先もわかる
        if path.usesInterfaceType(.wifi) {
            // Correctly goes to Wi-Fi via Access Point or Phone enabled hotspot
            os_log("Path is Wi-Fi", type: .info)
        } else if path.usesInterfaceType(.cellular) {
            os_log("Path is Cellular", type: .info)
        } else if path.usesInterfaceType(.wiredEthernet) {
            os_log("Path is Wired Ethernet", type: .info)
        } else if path.usesInterfaceType(.loopback) {
            os_log("Path is Loopback", type: .info)
        } else if path.usesInterfaceType(.other) {
            os_log("Path is other", type: .info)
        }
    }
    monitor.start(queue: DispatchQueue(label: "nwpathmonitor.queue"))
}
```

僕はWi-Fi時のGatewayのアドレスを知りたかったので、こんなふうにしました。

```swift
func getGatewayInfo(completionHandler: @escaping (String) -> ()) {
    let monitor = NWPathMonitor(requiredInterfaceType: .wifi)
    monitor.pathUpdateHandler = { path in

        if let endpoint = path.gateways.first {
            switch endpoint {
            case .hostPort(let host, _):
                let remoteHost = host.debugDescription
                print("Gateway: \(remoteHost)")
                // Use callback here to return the ip address to the caller
                completionHandler(remoteHost)
            default:
                break
            }
        } else {
            print("Wifi connection may be dropped.")
        }
    }
    monitor.start(queue: DispatchQueue(label: "nwpathmonitor.queue"))
}
```

監視を止める場合は、

```swift
monitor.cancel()
```

です。stopではないので注意。
他にもNWPathMonitorで検索すると出てくるので探してみてください！
composer(update/install)どっちだっけ問題

Laravel等での開発を進める上で、よく忘れるので備忘録です。
間違い等ありましたらご指摘ください:tea:

## update
```bash
$ composer update
```

* <code>composer.json</code>により、各ライブラリを最新版に更新
* <code>composer.lock</code>生成
* <code>composer.lock</code>にはインストールした各ライブラリのバージョン情報が記載される。

## install
```bash
$ composer install
```

* <code>composer.lock</code>から記載のバージョンをインストール
* <code>composer.lock</code>が存在しない場合は、<code>composer update</code>と同じ効果。

## 使い分け
* <code>composer update</code>はライブラリを最新版に更新
* <code>composer install</code>は<code>composer.lock</code>に記載されたバージョンをインストール

## 個人的なベストプラクティス
### ★開発

```bash
$ composer update
```

* 上記を中心に使い最新バージョンへ更新
 * 本番環境にあげて問題ないかをテスト
 * 確認が取れたら、<code>composer.lock</code>をGitで更新
 * 開発チーム間で、同じバージョンにしたい場合は<code>composer install</code>を指示

### ★本番

```bash
$ composer install
```

* 基本的にはupdateされたものを取り込むだけ
 * 本番でエラーをおこしたり、不慮のアップデートを防ぐ
 * <code>composer install --no-dev</code>とうで不要なものを含めないようにする
Zero Trust Network Accessの2つのモデル

新型コロナウィルス感染症の拡大に伴い多くの方が自宅からのリモートワークを余儀なくされて、"ZTNA"のような何となく理解できるが具体的に何のことかはよくわからない言葉がメディアで散見されるようになってきました。私個人もお客様から"ZTNA"って何のことですか?と質問されて回答に苦慮しています。この記事はZero Trust Network Accessを代表的な2つのモデルに大別して可能な限りシンプルに整理することを試みた実験記事です。

# 共通する狙い
Zero Trust Network Accessを検討する背景はVPNの置き換えやM＆Aによる組織改編等、様々な背景があると思いますがいくつかの共通する意図があるかと思います。

- 社内で利用している気密性の高いDataを取り扱うApplicationをInternetに公開したくない
- Userの"Context"(例/Identity, 利用しているDevice, アクセスしにきているLocation)に基づいて最小限の権限でApplication/Dataにアクセスさせたい
- アクセスしにきているLocationのIP AddressやDeviceのMac Address等の物理情報は無視して論理情報のみに基づいてアクセスさせたい
- Layer3,4レベル(Network)のアクセスではなくLayer７レベル(Application)のアクセスを実現したい
- Endpoint〜ApplicationまでEndtoEndの暗号化を実現したい
- Application/Dataへの通信内容は常に監視して不正と思われる通信はダイナミックに遮断したい
- UserがいつどこからApplication/Dataにアクセスしても一貫した体験を提供したい


# モデル1 - Endpoint-initiated
Endpoint Deviceをからフローを開始するモデルでCloud Security Allianceが提唱している"Software Defined Perimeter"がこのモデルに該当します。Endpoint DeviceにインストールされたAgentがZTNA Controllerに認証リクエストを送信することでフローが開始されます。
<img src="https://i.imgur.com/layWMGK.png" width=70%>
このモデルはEndpoint DeviceにAgentがインストールされていることが前提となるため、Endpoint Device Management Solutionで常に管理されていることが必要です。またZTNA GatewayからApplicationへの通信はインバウンドになるため、間にFirewallが存在している場合はFirewallのセキュリティポリシーでインバウンド通信を許可する必要があります。

# モデル2 - Service-initiated
Applicationからフローを開始するモデルでGoogle社が提唱している"BeyondCorp"がこのモデルに該当します。ZTNA ConnectorはApplicationと同じデータセンター内にあることを想定していて、ZTNA ConnectorとZTNA Brokerの間の通信はアウトバウンドのみになるため、Endpoint-initiatedモデルにあるFirewallのセキュリティポリシーを変更することは不要になります。更にEndpoint DeviceにAgentをインストールすることも不要なため、Endpoint Device Management Solutionの導入や運用も不要でEndpoint Deviceも会社支給だけでなく個人のデバイスでも適用できます。
<img src="https://i.imgur.com/lF3dwew.png" width=70%>
このモデルはAgentをインストールしないため、Http/HttpsのプロトコルでアクセスできるApplicationが前提となります。トンネル型のApplication(例/SSH Server, RDP Server)には適用できないため、トンネル型のApplicationの利用が必要なケースはEndpoint-initiatedのモデルとの併用になります。

# 参考
[Market Guide for Zero Trust Network Access](https://www.akamai.com/jp/ja/campaign/assets/reports/gartner-2020-market-guide-for-zero-trust-network-access.jsp)
[Implementing a Zero Trust Architecture Project Description](https://www.nccoe.nist.gov/sites/default/files/library/project-descriptions/zta-project-description-final.pdf)
heroku run php artisan migrate した時のエラー

# heroku run php artisan migrateした際のエラー

````
SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables
````
上記のエラーが発生しました。

下記コマンドで、環境変数を確認します。

````
$ heroku run php artisan tinker

>>> config('database.connections.mysql')
````
````
=> [
     “driver” => “mysql”,
     “url” => null,
     “Host” => “ホスト名”,
     “Port” => “ポート番号”,
     “database” => “データベース名”,
     “username” => “ユーザ名”,
     “password” => “パスワード”,
     “unix_socket” => “/Applications/MAMP/tmp/mysql/mysql.sock”,
     “charset” => “utf8mb4”,
     “collation” => “utf8mb4_unicode_ci”,
     “prefix” => “”,
     “prefix_indexes” => true,
     “strict” => true,
     “engine” => null,
     “options” => [],
   ]

````
herokuの環境では、
unix_socketセットする必要がないので下記のように変更したら、デプロイ完了しました。

````
"unix_socket" => ""
````
メールテンプレート内で条件式を使う

数式IFはうまく行かないような質問が多かったと思います。
回避策は数式フィールドを作るが一般的ですが、探してみると回避策があった。

https://salesforce.stackexchange.com/questions/187716/conditional-logic-in-salesforce-text-email-template/187723

なんと、Caseを使うことみたい。

```
{!CASE(Enquiry__c.Destination__c, "Barcelona", "i am barcelona", "i am not barcelona")}
```

今のところ、Classicテンプレート（テキスト）ではOKだったようです。

https://trailblazers.salesforce.com/answers?id=9064S000000DkDr
J:COM HG100R-02J + Route53 で自宅サーバを公開する

# 前提
Route53でドメインを取得していること

# 下準備
疎通確認用にwebサーバーを作成します。
## macの場合
1. コンソールで下記のコマンドを叩きます。

```zsh
sudo apachectl start
```
2. ブラウザでhttp://localhost にアクセスします
3. It works!という文字が表示されることを確認してください
4. 同じくコンソールで下記を叩きます

```zsh
ifconfig
```

```
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=400<CHANNEL_IO>
	ether xx:xx:xx:xx:xx:xx 
	inet6 ffff::ffff:ffff:ffff:ffff%en0 prefixlen 64 secured scopeid 0x4 
	inet 192.168.XXX.XXX netmask 0xffffff00 broadcast 192.168.XXX.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
```

5. 出力内の192.168.XXX.XXXの部分を使用して、http://192.168.XXX.XXX にアクセスします。
6. 同じく、It works!が表示されることを確認してください

## Windowsの場合
[コチラの記事](https://programming-style.com/apache/reference/install-win/)を参照して設定してください。
そのあと、LANのIPアドレスを取得してください
このあとの記述では「192.168.XXX.XXX」として説明しています。

# グローバルIPの確認
## LANとWAN
![インターネットの図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/8a2dcbdc-bfdc-3ce8-cdab-313bd85355e4.png)
グローバルIPとはいわば、「インターネットにおけるあなたの家のネットワークの住所」です。
家庭内のネットワーク（LAN）のIPアドレスとは別です。

## 管理画面でグローバルIPを確認する
[http://192.168.0.1](http://192.168.0.1)にアクセスをして、モデムルーターの管理画面を開きましょう。
![スクリーンショット 2021-03-24 8.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/8390203a-a13d-8c1e-3b66-3fddcf7319ff.png)

ID/PASSを入力をしてログインします。
※ 初期パスワードは、本体に貼られています。設定を変更していたら知りません。

図内のWAN IPアドレスとなっているところがあなたの家のグローバルIPになります
![スクリーンショット 2021-03-24 8.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/e3ded3a8-3e0c-0ac0-779a-fa5304b94f33.png)
## 外部からアクセスに対応する
外部からグローバルIPにアクセスされた場合に、LAN内のどのPCに繋げばわからないのでモデムルータに教えてあげます。

1. 管理画面 > ネットワークの詳細設定 > 詳細設定 > フォワーディング と進んでください
![スクリーンショット 2021-03-24 8.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/32dc87ed-d816-5647-e7bb-942ec2b04325.png)
2. 設定を図のように変更し、適用をクリックします  
※ 「有効化」を忘れないようにしてください！！！
3. ブラウザで 「http://あなたのグローバルIPアドレス」 にアクセスしてください
4. It worksが表示されたら成功です

# Route53で取得したドメインとあなたのグローバルIPのアドレスを関連付ける
1. [AWSのコンソール画面](https://aws.amazon.com/jp/console/)に入り、Route53 > ホストゾーン > ドメイン名とすすんでください
![スクリーンショット 2021-03-24 8.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/b05cddfa-2fc3-a9aa-dd61-299ea18b7fe9.png)
2. レコード作成をクリックして下記のように設定してください
![スクリーンショット 2021-03-24 8.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1124047/4ff70400-aceb-75e7-8654-d207a84b3b4b.png)
3. 「http://ドメイン名」 にアクセスして、It Works!が表示されたら終了です

# おわりに
なんかワザップみたいな投稿になってしまった。
フィードバックもらえると嬉しいです

※ セキュリティには十分に注意してください
pi picoでmicropython その19

#概要

picoでmicropythonやってみた。
練習問題、やってみた。

#練習問題

ピン割り込みせよ。

#サンプルコード

```
from machine import Pin
def bon(p):
   global led
   led.toggle()
   #print('pin change', p)
led = Pin(25, Pin.OUT)
btn = Pin(17, Pin.IN, Pin.PULL_UP)
btn.irq(trigger = Pin.IRQ_FALLING, handler = bon)
```

以上。
【Swift】ライブラリ "Material Components" における leadingAssistiveLabel の色を変更する

![74f589c7693e2e2d49cdb16444bee9ae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/f346c086-bc08-fafb-487e-e80b2dc85374.png)
# どういうことか

コレ

![13c1eb11aa298a95f2a7b199272ec118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/753a86f9-c3a9-9b11-1d6b-2ee58502da61.png)

――の『**正しいパスワードを入力してください**』の色を赤にしたい。
マニュアルを見てみよう。

<https://material.io/components/text-fields/ios#outlined-text-field>

`leadingAssistiveLabel.textColor` でいいらしい。

```swift
passwordTextField.leadingAssistiveLabel.textColor = .red
```

――が、色が変わらない。
ぐぐっても解決策が出てこない。

## 試行錯誤の結果

```swift
passwordTextField.setLeadingAssistiveLabelColor(.red, for: .normal)
```

![74f589c7693e2e2d49cdb16444bee9ae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/495bf4ee-df20-43c3-e820-a899859f12a2.png)

できた。
過去の自分の記事がヒントになった（というかほぼ同じ悩み）。

**【Swift】ライブラリ "Material Components" の MDCOutlinedTextField を使ったTextField実装**
<https://qiita.com/antk/items/6a0c755e61c4e471ce5a>

おわり(´・ω・｀)
突然EC2に上げていたdockerで作成したアプリケーションが開かなくなって対処した話

タイトル通り、EC2に上げていたdockerで作成したLaravelアプリケーションが開かなくなりました。

それの原因と対処をまとめます。

docker環境
・nginx
・php
・composer
・node
・mysql
・phpmyadmin



##起こったこと
![スクリーンショット 2021-03-24 7.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640569/b6cfbb50-46b8-38a0-0762-d5602ea69f39.png)

ステータスチェックがOKになっているのにパブリック IPv4 アドレスにアクセスしても接続できない。

##原因
EC2内部のDockerが落ちていた。

##対処
１、「docker-compose up -d」で立ち上げる

２、パブリック IPv4 アドレスにアクセスすると「php_network_getaddresses: getaddrinfo failed: Name does not resolve」というエラーが発生

３、docker-compose.ymlのphpmyadminの設定に追記

```
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
###ここから下を追記
    links:
        - mysql:db
```

４、改善された
TensorBoardについて

# Tensorboard について

## はじめに

[前回](https://qiita.com/suine/items/969c2c8130554484bbd9)に引き続き機械学習における可視化に関することで Tensorboard について調べたのでまとめてみました。

## Tensorboard とは

TensorFlow を用いて学習させる際に、計算の過程や計算も出るを可視化できるようにするものです。

### Tensorboard を使用するメリット

学習の過程を視覚かすることができるため、正常に学習が行われているかどうかを確認できます。また、ハイパーパラメータの調整にも役立ちます。
何より自分で各エポックごとに正答率などの数値を記録してグラフにして......などという作業をしなくてよくなります。

## Tensorboard を使う

基本的に GoogleColaboratory で動作する方法を記述していきます。
コードは[公式](https://www.tensorflow.org/tensorboard/get_started?hl=ja)のものを使用します。

まず Tensorboard を使用し始めるために以下のコマンドを実行します。

```
%load_ext tensorboard
```

次に最も簡単な mnist のデータセットを用いて Tensorboard を使用します。
Keras の model.fit()を用いて学習させる前に
tf.keras.callbacks.Tensorboard
でコールバック関数を設定してログを記録させます。

```main.py
import tensorflow as tf
import datetime

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

def create_model():
	return tf.keras.models.Sequential([
		tf.keras.layers.Flatten(input_shape=(28,28)),
		tf.keras.layers.Dense(512, activation='relu'),
		tf.keras.layers.Dropout(0.2),
		tf.keras.layers.Dense(10,activation='softmax')
	])

	model = create_model()
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)

model.fit(x=x_train,
          y=y_train,
          epochs=5,
          validation_data=(x_test, y_test),
          callbacks=[tensorboard_callback])
```

学習が終了したら

```
%tensorboard --logdir logs/fit
```

を実行します。

そうすると以下の画像のようなものが表示されると思います。
GoogleColaboratory で実行すると少し表示に時間がかるかもしれません。

![TensorBoard_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326998/3ea39e14-c610-43c1-223c-a4646e9ccc55.png)

Scalars ではエポック毎に損失とメトリックの変化をグラフにしてくれています。正しく学習できているかどうかを見ることができます。
![TensorBoard_result_scalar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326998/99213927-de00-e476-b8e1-cc6db966f575.png)


Histograms ではニューラルネットワークの各層を勾配消失しているかなどの確認することができます
![TensorBoard_result_histograms.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326998/d40dda01-2d42-3fbb-2aca-6e0b869e8f4c.png)

他にも、学習で使用した画像を表示することで正しい訓練データを使用しているのかを確認したりグラフでモデルが正しく設計されているかを見れたりします。

## さいごに

前回に引き続き機械学習における視覚化について扱いました。

今まで Tensorflow を用いることは多くあったのですが、Tensorboard については全く知りませんでした。
ほんの少ない記述だけで非常に便利になるので使わない手はないと思います。

思っていたよりも機械学習の課題であるブラックボックス化に対して対策が講じられていることを知れて勉強になりました。
ローカル(MacOS)環境でproductionモードで実行するとBootStrapのcssが反映されなくなったときの解決法

せっかくある程度のデザインができたのに、productionモードで動作確認するとCSSがバグって表示が崩れてしまいました。
BootStrapのCSSが反映されていませんでした。
解決するのにとても時間がかかったのでメモ。


## TL;DR
- Productionモードでデザインが崩れた原因はBootStrapのCSSの`import`の書き方
- DeveloperToolの確認は忘れずに(<- 当たり前だけどいつも忘れるw)
- これがRailsの黒魔術(?)


## 動作環境
動作環境は下記になります。

|  | version      |
|:----------:|:------------:|
| MacOS      | Mojave        |
| Ruby       | 2.7.2        |
| Rails      | 6.0.3.5        |
| MySQL      | 5.7          |
| BootStrap  | 4.5.3            |





## 本題
### 原因の特定
今回productionモードで動作させるために
1. アプリをコンパイルする(rake assets:compile)
2. `rails s`でRailsを立ち上げる
3. `localhost:3000/(該当ページ)`にアクセスする
4. DeveloperToolを開く → Consoleタブをクリック(これに気づくのにめっちゃ時間がかかりました)

という手順を踏みました。
1~3は、末尾に`RAILS_ENV=production`をつけて実行しています。
すると下記の内容が表示されていていました。
![18_09_56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232518/c249643d-5c20-7817-601c-1114111191f1.jpeg)
画像が見にくいのでエラー内容を文字起こしすると下記のようになってます。

```bash
Failed to load resource: the server sesponded with a status of 404(Not Found) bootstrap.css:1
```
CSSが見当たらないよというエラーが発生しています。

このエラーが発生している原因の検討をつけます。
自分のアプリの場合は`BootStrap`を`app/assets/stylesheets/application.scss`で読み込むように設定していました。
該当するファイルを開いてみると、下記の書き方をしていました。これが原因でした。

```scss:app/assets/stylesheets/application.scss
@import "bootstrap/dist/css/bootstrap.css";
@import "font-awesome-sprockets";
```

### 解決方法
これは書き方の問題ですが、単純に`.css`という記述が必要ありません。
コードを下記のように修正します。

```diff_sass:app/assets/stylesheets/application.scss
- @import "bootstrap/dist/css/bootstrap.css";
+ @import "bootstrap/dist/css/bootstrap";
```
修正した後下記手順を行い表示崩れが直っていればokです!!

1. アプリを一度終了
2. アプリをコンパイル(rake assets:precompile)
3. `rails s`でRailsを立ち上げる
4. 該当ページにアクセスする


なぜ上記のような記述になっていたのかは覚えがありませんが、書き方が`.css`いるかいらないかわからないけど動いたから大丈夫でしょということだったと思います。


### じゃあなぜ動いていたのか?
具体的にはわかりませんが、
developmentモードはこの微妙な間違いとかを解釈して動くようにしてくれるらしいです。
Rails恐るべし...
developmentモード恐るべし...

### ちなみに
Railsのアップグレードを行ったのですが、Railsを5から6に上げたせいか全体的に動作がもっさりしてる…
どうにかならんかな...
知ってる人いたら教えてください!!
Qiita Daily Survey memo 2021.03.24

# Qiita Daily Survey memo 2021.03.24
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [Java: EasyBuggy - 30分でわかる！SQLインジェクションの脆弱性](https://qiita.com/flyaway/items/462ae0f212e7abd8d8f4)
S YAMAMOTO(flyaway)さんの記事。サムネイルがかわいい。
冒頭にSQLインジェクションを使った外部からのDBの参照のデモの動画を紹介してくださっており、後半で原理と対策について記載してくださっています。
情報漏洩系の脆弱性攻撃と言えば真っ先に思い浮かぶSQLインジェクションですが、その怖さが動画で伝わってくるかと思います。
他の攻撃に比べて準備などの手間がなく、簡単にできてしまいます…。
私が学生の頃はエスケープしましょうと習いましたが、現代ではプレースホルダーというもので実装することで回避できるのですね。
クロスサイトスクリプティングやクロスサイトリクエストフォージェリ―なんてものも聞いたことがあり、なんとなく知っている…くらいなので、仕組みと対策を調べておかなければ…と思いました。

## [【図解】初心者が知っておきたいサーバ周りの仕組みの話](https://qiita.com/mi-1109/items/a8e5cfa0637ba2925b59)
Mei O.(mi-1109)さんの記事。
サーバー周りの仕組みを説明していただいている記事になります。
サーバー周りと言いますか、コンピュータの仕組みの話は興味がないと勉強するのがつらく、なかなか知識として定着しないですよね。
同期でIT業界6年目の友人も、「ポート」の概念を理解しておらず（ポートって何？レベル）、先日怒られていました…。
かくいう私もIT系の大学・大学院を出て、IT系の職業について6年目になりますが、まだ「ミドルウェア」が感覚としてしっくりきていないです。
個人的にはOSI参照モデルがわかりやすいなーと思っていますが、どうなんでしょう…？


## 草を生やしたい
昨日の投稿までに間が5日空いてしまったので、振り返りをすることにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410015/27768225-f218-6341-b304-beee2fcdaab7.png)

運動も体重測定もQiita Daily Surveyも、だいたい最初の2週間～3週間くらいは頑張れるけど、そこからなかなか続かない…。
過去めんどくさいのに続いたものは何があるかなー…と思い返してみると、mixiの日記投稿かなと思いました。
mixiの日記は、画面左にカレンダーがあり、日記を投稿した日はハイパーリンクが張られ日付が"青色"になります。
私はカレンダーのすべての日付を青色にしたかったので、バイトで疲れていた日も、飲み会で意識があまりない日も、可能な限り日記を投稿していました。
翻って、近年でそういうものはないかなー…と思い返してみると、GitHubの草を生やす機能が近いかなーと思いました。
私程度が思いつくことは、先人たちがやってくれているだろうと検索してみると、ありましたありました…。

[Pixelaで何でも草を生やす](https://qiita.com/e99h2121/items/59a80db4b107c76a3ff1)
[Trelloのタスク完了でGitHubのような芝を生やして達成感を生み出してみた](https://qiita.com/wamisnet/items/8cd6d4a569ef6c03efb7)

作戦は考えなきゃですが、上記の記事を参考に、草を生やしてモチベーションキープにチャレンジしてみたいと思います。
点群のボクセル化(jsk_pcl_ros OctreeVoxelGrid)

#はじめに

点群のボクセル化は他の複雑な点群処理(点群の差分検出やロボットの干渉チェックなど)の基本的な処理として使用されています。

その基本的な点群処理であるボクセル化がどの様な動作をしているのか気になり様子を見てみることにしました。

動作の確認にはjsk-pcl-rosパッケージのOctreeVoxelGridを使用しました。

#動作までの流れ

まずは必要なパッケージをインストールします。

```bash:install
sudo apt-get install -y ros-melodic-jsk-pcl-ros
sudo apt-get install -y ros-melodic-jsk-visualization
git clon https://github.com/hoshianaaa/jsk_pcl_ros_samples.git
cd ~/catkin_ws/src

catkin build 
または
catkin make

source ~/catkin_ws/devel/setup.bash
```

次に以下のコマンドでサンプルを起動します。

```
roslaunch jsk_pcl_ros_samples octree_voxel_grid.launch
```

rqt_reconfigureを使用すると動的にパラメータを変更できます。
以下のコマンドで起動します。

```
rosrun rqt_reconfigure rqt_reconfigure
```


#結果

実行した結果は以下のようになりました。

パラメータの変化に応じて表示されるボクセルのサイズが変化しボクセル化の様子が分かりやすくなっており、今後このパラメータを設定の際に役に立ちそうだと感じました。

![Screenshot from 2021-03-24 04-41-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/b093f50b-28b6-52a0-9464-b101d916d61c.png)


![Screenshot from 2021-03-24 04-41-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/bff7cc02-9ccd-1c8f-491e-39859102732b.png)


![Screenshot from 2021-03-24 04-41-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/25b136eb-fe39-0aec-79a4-b2c5137a8712.png)

#プログラムの中身
サンプルの内部は写真のようになっていてmain部分のnodeletでボクセル化を行っています。このnodeletに自分の好きなトピック名を設定するだけで自分の好きな点群メッセージをボクセル化することができます。
![Screenshot from 2021-03-24 03-43-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/8e27888b-6908-33a4-d1fe-1e2f7e6767d8.png)

```xml:octree_voxel_grid.launch
<launch>
  
<arg name="file_name" value="$(find jsk_pcl_ros_samples)/pcd/bunny.pcd"/>

<!-- rate : if publish at 10 Hz, set 0.1 -->

  <arg name="rate" value="0.1"/>
  <node pkg="pcl_ros" type="pcd_to_pointcloud" name="pcd_to_pointcloud" args="$(arg file_name) $(arg rate)" output="screen">
    <remap from="cloud_pcd" to="/points"/>
    <param name="frame_id" value="base_link" />
  </node>


  <arg name="INPUT" default="/points"/>
  <arg name="DEFAULT_NAMESPACE" default="octree_voxel_grid"/>

  <arg name="create_manager" default="true" />
  <arg name="manager" default="octree_voxel_grid_manger" />

  <group ns="$(arg DEFAULT_NAMESPACE)">
    <node if="$(arg create_manager)"
          pkg="nodelet" type="nodelet" name="$(arg manager)"
          args="manager" output="screen"/>

    <node pkg="nodelet" type="nodelet"
          name="octgrid"
          args="standalone jsk_pcl/OctreeVoxelGrid"
          output="screen" clear_params="true">
      <remap from="~input" to="$(arg INPUT)" />
      <param name="publish_marker" value="true" />
    </node>
  </group>

  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find jsk_pcl_ros_samples)/rviz/octree_voxel_grid.rviz" required="true" />
  
</launch>

```


#サンプル

以下のパッケージで今回の内容を含めたjsk-pcl-rosのサンプルを簡単に試すことができます。

https://github.com/hoshianaaa/jsk_pcl_ros_samples
Databricks Reposによるデータサイエンスの本格運用

[Databricks Repos Integrates With Git Providers for a Better Development Experience\- The Databricks Blog](https://databricks.com/blog/2021/03/16/productionize-data-science-with-repos-on-databricks.html)の翻訳です。

**Gitベースのコラボレーション、再現性確保、CI/CDがより容易になりました**

多くのデータサイエンスに関わるソリューションは、データチームに対して、探索の柔軟性か本格運用における厳密性かの二択を迫ります。結果として、データサイエンティストは彼らの成果物をエンジニアリングチームに引き渡す際に、異なるテクノロジースタックに載せ替えることになり、新たな環境に応じて、成果物を書き直す必要があります。これはコストがかかるだけではなく、データサイエンティストの成果をビジネス価値につなげるまでに時間を要することを意味します。
![](https://databricks.com/wp-content/uploads/2021/03/repos-blog-screenshot.png)

Databricksの[次世代データサイエンスワークスペース](https://databricks.com/blog/2020/06/25/introducing-the-next-generation-data-science-workspace.html)は、先進的かつ統合された、オープンな体験をデータチームに提供します。このワークスペースの一機能として、データチームの全ての人がベストプラクティスを活用できるように、リポジトリレベルでGitプロバイダと連携可能な新たなRepos機能を提供できることを嬉しく思います。DatabricksのRepos機能はGithub、Bitbucket、Microsoft Azure DevOpsを含むGitプロバイダと連携できます。

Gitと連携することで、Databricks Reposはデータサイエンス、データエンジニアにおける洗練された開発環境を提供します。Databricksでの開発において、本格運用前のコードレビュー、テストと言ったコードに関する規則を導入できます。Reposにおいては、リモートGitリポジトリのクローン(図1)、ブランチの管理、リモートでの変更のPull、コミット前の変更確認(図2)など慣れ親しんだGitの機能を利用することができます。
![](https://databricks.com/wp-content/uploads/2021/03/prod-ds-repos-blog-image-2.png)
**図1** 利用を開始するには、クローンしたいGitリポジトリのURLを指定するだけです

![](https://databricks.com/wp-content/uploads/2021/03/prod-ds-repos-blog-image-3-rev.png)
**図2** 開発者は自身の開発用ブランチで作業し、コードをコミットしたり変更をプルしたりできます。コミット前にUIで差分を確認することができます

Reposの正式ローンチに際して、エンターブライズでの利用を想定した以下の機能を追加しています：

- **許可リスト(Allow lists)** 管理者はコードをコミットできるGitリポジトリのURLのプレフィクスを指定できます。これにより、許可されていないリポジトリにコードがコミットされることを防ぐことができます。
- **シークレット検知(Secret detection)** コミット前に、ソースコードに平文で記述されてしまっているシークレット情報を検知します。これによりデータチームは、機密情報をDatabricksのシークレットマネージャで管理すべきというベストプラクティスに従うことが可能になります。

また、ReposはあなたのCI/CDパイプラインと統合可能であり、データチームはデータサイエンス、機械学習のコードをシームレスに実験段階から本格運用段階に移行することが可能です。Repos API(現在プライベートプレビュー、詳細はDatabricks担当にお問い合わせください)によりプログラムを通じて、Databricks Reposをリモートブランチの最新の状態にアップデートすることが可能です。これによりCI/CDパイプラインを容易に実装できます。例えば：

1. **開発：** 開発者はユーザーフォルダにチェックアウトされた機能開発のためのブランチで作業します。
2. **レビュー及びテスト：** 開発した機能をレビューする準備ができた際には、PR(Pull Request)が作成されます。あなたのCI/CDシステムは、Repos APIを利用し、ブランチ上の変更に基づくDatabricks上のテスト環境のアップデート、変更箇所のテストを自動的に実行します。
3. **本格運用:** そして、全てのテストを通過したのち、PRは承認されマージされます。ここでもCI/CDシステムはRepos APIを使用し、本番環境をアップデートします。本番環境におけるジョブは最新のコードを用いて処理を行います。

Reposは次世代ワークスペースの機能の一つです。正式リリースにより、データチームはベストプラクティスを活用し、容易に実験段階から本格運用に移行できるようになりました。

## Reposを利用するためには
![](https://databricks.com/wp-content/uploads/2021/03/prod-ds-repos-blog-image-4.png)

Reposは現在パブリックプレビューですので、Databricksワークスペースでご利用いただけます！Reposを有効化するためには、AdminコンソールのAdvancedに移動し、"Repos"の隣にある"Enable"ボタンをクリックするだけです。詳細は[ドキュメント](https://docs.databricks.com/projects.html)をご確認ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
11章で躓いたところ振り返っておく

##概要
1日1章終わらすスピードでここまでやってきたが、１１章で撃沈した。
内容を振り返っておく。

- createアクションが機能していなかった。
- masterブランチにマージする時コンフリクトが多発した。

###createアクションが機能していなかった。

7章で新規登録のページを作成したが、以降のsession機能作成でloginページにしか
遷移しなくなるように上書きされてしまった。
11章のcreateアクション更新時に気づいたが時すでに遅し。
数時間模索するも修正箇所を明確にできずに8章からやり直すことになった。


###masterブランチにマージする時コンフリクトが多発した。

11章の途中までmasterブランチにコミットした後、
8章のローカルブランチからブランチ切り直して作業した。
もちろん、以前のmasterブランチと重複するところが多々あるのでコンフリフトが多発する。
ファイル一つ一つを見直しする作業は時間ロスに繋がった。

##振り返ってみて
一番理想なのは修正箇所を明確にして修正することだが、これは今後の自分に期待したい。
現時点で対策できそうなのはバグの早期発見。
一つ一つの作業の区切りに確認動作も含めていきたいところだが、
あまり丁寧にやりすぎても作業スピードが落ちるので、
アウトプット時にもう一度見直して二重チェックの形をとろうと思う。
学び直し Rubyがミニツク Part11

今日の教科書
[エラーメッセージ](http://www.minituku.net/courses/566428009/contents/184741269.html)

#エラーメッセージ

```
ファイル名:行番号:in `メソッド名`: エラーメッセージ（例外の種類）
        from メソッドを呼び出した位置

test.rb:3:in `+': String can't be coerced into Fixnum (TypeError)
        from test.rb:3
```

#例外処理

```
begin
  ＜例外が起こる可能性のある処理＞
rescue => ＜例外オブジェクトが代入される変数＞
  ＜例外が起こった場合の処理＞
end
```

```
month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
wrong_number = [0, 1, 2, 3, 4, 5,
                "6", "7", 8, 9, 10, 11]
wrong_number.each do |num|
  begin
    puts month[num]
  rescue
    next
  end
end
```

例外オブジェクトのメソッドで例外の情報を知る。
class：例外の種類
message：例外のメッセージ
backtrace：例外の発生した位置に関する情報

##後処理
例外が起こらない場合でも実行したい処理がある場合

```
begin
  ＜例外を発生させる可能性のある処理＞
rescue => ＜変数＞
  ＜例外が起こった場合の処理＞
ensure
  ＜例外の有無に関わらず実行される処理＞
end
```

```
begin
  x = 10
  y = "a"
  p x + y
rescue => ex
  puts(ex.message)
ensure
  puts("足し算をしました")
end
```

##やりなおし
rescueでretryを使うと例外処理の実行をやり直す。

```
flag = 0
begin
  open("/no/file") do |f|
  end
rescue => ex
  flag += 1
  puts ex.message
  if flag < 3
    retry
  end
end
```

##メソッドでの例外処理の書き方

```
def foo(x, y)
  add = x + y
  sub = x - y
  begin
    mul = x * y
    div = x / y
  rescue => ex
    puts(ex.message)
  ensure
    return add, sub, mul, div
  end
end
foo(10, 0)  # エラーが発生する
```

beginとendを省略できる。
```
def foo
  ＜メソッドの本体＞
rescue => ex
  ＜例外処理＞
ensure
  ＜後処理＞
end
```

rescueがない場合はメソッドを呼び出したところに戻りながら例外処理を探す。

```
def add(a, b)
  a + b
end
 
def call_add
  add("a", 1)
end
 
begin
  call_add()
rescue => ex
  puts(ex.message)
end
```

#クラスでの例外処理

```
class Foo
  ＜クラスの本体＞
rescue => ex
  ＜例外処理＞
ensure
  ＜後処理＞
end
```

 > もしクラスの処理をすべて例外処理で囲む時は、beginとendを省略して書くことができます。ただし、クラスを定義している中で例外が起こると、そこから後のメソッドの定義などがおこなわれません。そのため、通常のプログラムでクラスの定義をすべて例外処理で囲むことはしません。クラスの定義では例外が発生しないことが望まれます。

#特定の例外の処理
例外のクラス名を書くことによって、その例外の時だけおこないたい処理を書くことができます

```
begin
  ＜例外を発生させる可能性のある処理＞
rescue ＜例外１の名前＞, ＜例外２の名前＞ => ＜変数１＞
  ＜指定した例外１または例外２でおこないたい処理＞
rescue ＜例外３の名前＞ => ＜変数２＞
  ＜指定した例外３でおこないたい処理＞
rescue
  ＜それ以外の例外が起こった場合の処理＞
end
```

```
begin
  require "file_not_exist"
rescue LoadError
  puts("file_not_exist.rbというファイルは見つかりませんでした")
end
```

#例外を発生させる
raise：条件を判定した結果によって例外を発生させるメソッド、raiseメソッドは、引数を指定しないで呼び出すとRuntimeError例外を発生します。

`raise ＜発生させたい例外クラス＞`]

#エラーのクラス
[例外のクラス](http://doc.okkez.net/static/1.8.7/library/_builtin.html)
Ruby学び直し -フォーム送信時のエラー-

フォームを作成し送信しようとしたら、

`no implicit conversion of nil into String`

と言われてた、nilからstringへの暗黙の了解がない…？

https://teratail.com/questions/171144
上の記事を参考に…

`.to_s`をテキストを用いる変数につけたら無事使えました。

.to_sはString型であることを明示して取り出すメソッド。
CfnInstanceで立てたEC2インスタンスにロードバランサをつける

詰まりまくったので共有

## 必要なモジュール一覧

```ts
import * as ec2 from '@aws-cdk/aws-ec2';
import * as elbv2 from '@aws-cdk/aws-elasticloadbalancingv2';
import * as targets from '@aws-cdk/aws-elasticloadbalancingv2-targets';
```

## ec2立てる
```ts
const ec2Instance = new ec2.CfnInstance(this, 'instance', {
  instanceType: 't2.micro',
  subnetId: vpc.privateSubnets[0].subnetId,
  tags: [{
    key: 'Name',
    value: 'tag1',
  }],
})
```

## ALB立てる

```ts
const alb = new elbv2.ApplicationLoadBalancer(this, 'ApplicationLoadBalancer', {
  vpc,
  vpcSubnets: {
    subnets: vpc.publicSubnets,
  },
  loadBalancerName: 'alb',
  internetFacing: true,
}
```

## 80ポートにリスナー設定

```ts
const listener = alb.addListener('Listener', { open: true, port: 80 }
```

## 80リスナーにターゲットを設定

```ts
listener.addTargets('target', {
  port: 80,
  targets: [new targets.InstanceIdTarget(ec2Instance.ref)]
});
```

以上