OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryのFlex Slots 概要

# この記事について

Google Cloud blogでBigQuery の費用の管理に関するシリーズが投稿されています。
その中で、[Flex Slots を利用して BigQuery の費用を最適化](https://cloud.google.com/blog/ja/products/data-analytics/optimize-bigquery-costs-with-flex-slots) を簡易説明用に簡略化したものです。
BigQueryが分かる人は、ブログの方を読みましょう。

---

# Flex Slotsとは
普段はBigQueryをオンデマンド料金で利用しているユーザーが、**スポットで定額料金を併用する**という工夫により、クエリ費用を削減できるという機能。
そのため、元からクエリ費用が気にならないユーザーは気にする必要なし。
※この機能は、元から定額料金だが更にスポットでスロットを買い足したいという需要にも応えているが、かなりのヘビーユーザー限定の話。

## 効果的な使い方

 - 1テラバイトを超える大きなテーブルをクエリするユーザー
 - データ サイエンス ジョブや ELT ジョブを大きなテーブルで実施する場合
 - 数時間あるいは 1日以上にわたって分析ジョブを行う AI Notebook ユーザーのチームを持つ企業

→　処理を実行する時間は限定的だが、スキャン量は多いという場面に効果あり

---

## 費用

Flex Slotsでは、スキャン量に従ってクエリの料金を支払うのではなく、予約したコンピューティング リソース（スロット）に対する料金を支払う。

### USマルチリージョンでの費用例

- オンデマンド
    - 1 TiB = $5
    - 4 TiB = $20

- Flex Slots
    - 500スロットを1時間予約 = $20

※コミット後、60秒を過ぎればキャンセル可能。コミットしていた秒単位で課金される。
※スロットを倍にすると、料金も倍になる。
※当然、単価は年契約や月契約より高い。

---

## 処理時間と効果

次のグラフは、3.15 TB のクエリを2,000 スロットのクエリをオンデマンドで実行した場合と、スロットを 500 単位で最大 2,000 まで増やして実行した場合とでクエリ時間と費用を比較したもの。
ざっくり見ると、最低限の500スロットだと、10倍遅い。それでもコストメリットがある時に有効。

スロットの追加に伴いほぼ一直線にパフォーマンスが上昇。
![4_avg_query_cost.max-1200x1200.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/491f022a-9092-fb7b-aac7-8e0651c21fdd.jpeg)

Flex Slots の利用により 60%～80％ のコスト削減。
※3-min Idle Costはクエリが実行されていないがコミット中の場面を表現するために、例として3分間のアイドル時間を加えている。
![3_slots_and_on-demand.max-1200x1200.jpg](https://storage.googleapis.com/gweb-cloudblog-publish/images/3_slots_and_on-demand.max-1200x1200.jpg)

※オンデマンドはバーストがあるので速い。
`オンデマンド料金モデルで課金されるユーザーの場合、BigQueryはデフォルトのスロット容量を超えてバーストできるため、クエリを高速化できます。クエリの高速化に関連する追加料金はありません。`
![スクリーンショット 2020-06-18 9.37.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/c3463a6f-a6bd-4570-245e-8e6dafa07bb0.png)

---

## 設定方法

BigQuery Reservationsの管理用に専用プロジェクトを1つ作る（推奨）。
専用プロジェクトでFlex Slotsをコミットする。→これでFlex Slotsを契約した状態。
予約を作成（オプション）→これで利用プロジェクトにスロットを予約した状態。
割り当てを作成→これで利用プロジェクトがスロットを利用できる状態。

![コンセプト](https://storage.googleapis.com/gweb-cloudblog-publish/images/1_bigquery_Flex_Slot.max-800x800.jpg)

プロジェクトへ割り当てると、それ以降にプロジェクトで実行したクエリは、上記のスロットを使うように切り替わる。
クエリ結果を見ると、`Reservation`の情報が追加されている。

![クエリ結果](https://storage.googleapis.com/gweb-cloudblog-publish/images/2_Confirming_query_reservations.max-1000x1000.jpg)

---

## 自動でFlex Slotsを利用するスクリプト例

上記の設定をAPIから実行することで、自動化が可能。
ブログの例では、コミット、予約、割り当てをおこなった後にBigQueryへクエリを実行し、クエリが完了し次第、コミット、予約、割り当ての削除を行うスクリプトが紹介されている。

---

#分かったこと＆思ったこと

- BigQueryのコストチューニング方法として、Flex Slotsがある。
- 500スロット程度では処理時間がオンデマンドより伸びる（グラフの一例では10倍）ので、費用と時間を踏まえて判断する。
- コストがかかるクエリのみ専用プロジェクトで実行するようにし、そのプロジェクトに対してBigQuery Reservationsの割り当てを行うことで、既存の他のクエリには影響なく当該クエリのみ切り替えが可能そう。
- （タイミングにより変わるとは思うが、例えばブログでの一例では）スロット数をどれだけ多くすればオンデマンドの処理時間と同じ程度まで処理時間が短縮されるのか気になる。

※ヘビーユーザー向けの視点は今回除いている
Rust while を使ったプログラム

Rustの[ドキュメント](https://doc.rust-jp.rs/book/second-edition/ch03-05-control-flow.html)のフィボナッチ整数のn番目を求めるプログラムを書きました。

もしあなたがrustに関して困っているときに、このプログラムが役に立つのならばぜひ使ってください！
このプログラムにミスやもっといい方法があるならコメントをしてください！

```rust
use std::io;
//development pre complete 
fn main() {
  let mut num = String::new();
  io::stdin().read_line(&mut num).expect("err");
  let num:i64 = num.trim().parse().unwrap();

  if num == 1 {
    println!("{}",num);
  } else if num == 2 {
    println!("1");
  } else if num < 0 {
    println!("0以上の数字を入力してください。")
  } else {
    let mut time = 2;
    let mut one = 1;
    let mut two = 1;
    let mut tmp = 0;
    while time != num {
      tmp = one + two;
      one = two;
      two = tmp;
      time = time + 1;
    }
    println!("{}",tmp);
  }
}
OpenCVでフレーム間差分法を実装

#OpenCVを使って背景差分
フレーム間差分法は、移動物体の検出方法の1つです。
Python3 + OpenCV　で作った結果です。

元のデータはこちら
（わかりづらいですが、波打ち際の水しぶきって感じの動画です）
<img width="492" alt="スクリーンショット 2020-06-17 22.54.43.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/a8a0d3ab-1645-aa79-6f17-72f45169dd99.jpeg">


**二値化したマスク画像がこちら**
<img width="605" alt="スクリーンショット 2020-06-17 22.39.08.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/2f648754-8ea9-3e68-f636-f791c5fb3b2e.jpeg">

**これ、一応動画です**
<img width="543" alt="スクリーンショット 2020-06-17 22.40.01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/47610752-9cfa-bec8-f715-5cc57b47f5d2.jpeg">

**背景画像の表示**
<img width="466" alt="スクリーンショット 2020-06-17 22.40.50.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/a429cc60-7251-6130-649c-88ba3caf7b6c.jpeg">

ではサンプルプログラムです。

```Python:movieSample.py
import cv2
import numpy as np
import time

i = 0      # カウント変数
th = 30    # 差分画像の閾値

# 動画ファイルのキャプチャ
cap = cv2.VideoCapture("/Users/.../.../.../movies/movieSample.mp4")

# 最初のフレームを背景画像に設定
ret, bg = cap.read()

# グレースケール変換
bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)

while(cap.isOpened()):
    # フレームの取得
    ret, frame = cap.read()

    # グレースケール変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 差分の絶対値を計算
    mask = cv2.absdiff(gray, bg)

    # 差分画像を二値化してマスク画像(モノクロ)を算出
    mask[mask < th] = 0
    mask[mask >= th] = 255

    # マスク画像を表示
    cv2.imshow("Mask", mask)
    # フレーム画像を表示（モノクロ）
    cv2.imshow("Flame", gray)
    # 背景画像を表示（モノクロ）
    cv2.imshow("Background", bg)

    # 待機(0.03sec)
    time.sleep(0.03)
    i += 1    # カウントを1増やす

    # 背景画像の更新（一定間隔）
    if(i > 30):
        ret, bg = cap.read()
        bg = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)
        i = 0  # カウント変数の初期化

    # xキーが押されたら途中終了
    if cv2.waitKey(1) & 0xFF == ord('x'):
        break

cap.release()
cv2.destroyAllWindows()
```
試しにOpenCVは別途インストールが必要かもしれません。
環境に合わせてトライしてみてください。
Macをご利用の方ならターミナルから

`$ python3 -m pip install opencv-python [ENTER]`
でいけるんじゃないかな、と思います。

インストールについては**K Igarashi**さんが紹介してくださっています。
[pip で OpenCV のインストール](https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb)
[flutter]packages/cameraをiPhone実機で動かすときの注意点

# やりたいこと

flutterで
https://pub.dev/packages/camera
を使ってカメラアプリのサンプルを実装し、
Android実機では動くことを確認したが、
iPhone実機ではカメラボタン押下時にアプリが落ちるので
それを解決したい。


# 対策

```
/my_app_yamato_200617a/ios/Runner/Info.plist
```

に下記を追記。

```xml
<key>NSCameraUsageDescription</key>
<string>Can I use the camera please?</string>
<key>NSMicrophoneUsageDescription</key>
<string>Can I use the mic please?</string>
```
格安Lidarを使おう　RPLidar A1・YDLidar X2L／X4を比較

Lidarを3種類用意したので比較してみましょう。
##比較対象のLidar
今回用意したのは以下の3種類です。
・RPLidar A1
https://www.slamtec.com/en/Lidar/A1
・YDLidar X2L
https://www.ydlidar.com/products/view/6.html
・YDLidar X4
https://www.ydlidar.com/products/view/5.html
##スペック比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/71215629-693c-c878-8da9-af14a0bee552.png)
##外箱
![DSC_0055 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0823b0ac-5cc9-dddb-46ec-ca0c552673fc.jpeg)
##RPLidar A1
＊仕様変更でこのギフトボックスに変更されています
![DSC_0056 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/55690821-763f-06f5-540f-24ddabc7d1f1.jpeg)
##YDLidar X2L
USBはType-CとMicroUSB(電源）になっています。
![DSC_0057 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/333c16ce-1499-067c-60f6-bc981c759c80.jpeg)
##YDLidar X4
MicroUSBx2です。
![DSC_0058 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f93edc1c-120b-d18e-f89f-c032d08da957.jpeg)
##外観比較
![DSC_0066 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f7c2ddf9-3421-0a35-26a3-7b556c83d0c0.jpeg)
左から　RPLidar　A1　YDLidar X4　YDLidar X2L
##サイズ比較
参考に同じケースに置いてみましょう
###RPLidar A1
![DSC_0073 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/85bcb925-fbf8-a248-73ea-20fad8c55be3.jpeg)
###YDLidar X2L
![DSC_0070 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ae35a01c-82b8-901b-41b7-861438c22dd4.jpeg)
###YDLidar X4
![DSC_0072 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/53ea9a9b-8979-2167-df03-1d404f40ac54.jpeg)

##シリアル接続部
![DSC_0068 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/af05ae97-0c78-fa6f-5cb9-3aa733e66d4d.jpeg)
左上；RPLidar A1
右上：YDLidar X4
下：YDLidar X2L

![DSC_0110 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dc0000f1-56a1-46f7-4a7c-7d1136a0ec81.jpeg)
左から　RPLidar　A1、YDLidar X2L、YDLidar X4

YDLidarは同じメーカーなだけあって、シリアル部のコネクタは同じようです
X2Lだけケースに入っていますね。
X2LのTXのラインは繋がってません
![DSC_0113 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d8eae017-b8b4-bd2c-3771-aca45eb3ea68.jpeg)

今回、12m程度の長さの箱を用意できなかった為、稼働検証は出来ていません。

どこかの会社さん等の協力があれば出来るんですが、残念。
（どうせならば、Realsenseとか、ホクヨウとかもあわせてやりたいですね・・・）
SQL Server: 単純復旧モデルでログが肥大し続ける現象を調査した話

# 背景
単純復旧モデルのDBにて、トランザクションログが肥大し続けてドライブ容量が逼迫する事象が発生しました。
単純復旧モデルは更新が完了するとログが切り捨てられるため、完全復旧モデルと比較するとログの肥大は起きにくい復旧モデルです。
原因の調査と解決までの流れをご紹介したいと思います。

# 調査
#### 1. なぜログの切り捨てが行われないかを確認

```sql
select * from sys.databases
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/e9336b78-880b-c618-29c6-326eaabc356a.png)
[sys.databases](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-catalog-views/sys-databases-transact-sql?view=sql-server-ver15)のlog_reuse_wait_descを確認することで、ログが切り捨てられない原因が分かります。
今回は「ACTIVE_TRANSACTION」となっていました。
これは、名前の通り、アクティブなトランザクションが存在し続けていることが原因であることを指しています。
この時点では、どのクエリが具体的な原因かまではわかりません。

#### 2. どのクエリが原因かを確認

```sql
dbcc opentran
```
[dbcc opentra](https://docs.microsoft.com/ja-jp/sql/t-sql/database-console-commands/dbcc-opentran-transact-sql?view=sql-server-ver15)を実行することで、トランザクション ログ内に存在する最も古いアクティブなトランザクションの情報が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/f397becb-9e49-afed-c5c6-551178b7957a.png)
SPID=160というセッションIDを取得できました。

#### 3. セッション情報を確認

```Sql
select 'kill ' + cast(session_id as varchar) as command, session_id, status, cpu_time, memory_usage, reads, logical_reads, writes, last_request_start_time, last_request_end_time, 'dbcc inputbuffer(' + cast(session_id as varchar) + ')' as showquery_command, client_interface_name, program_name
from sys.dm_exec_sessions
where session_id in (160)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/24d16b9f-8bf3-501d-8395-5e76861c720b.png)
1:該当のセッションはstatus=sleepingで現在は実行されていないようでした。
2:該当セッションのリソース使用状況（CPU等）は、何度上記クエリを実行しても変化がありませんでした。

以上の結果を踏まえて、該当セッションをKILLしました。

#### 4. 状況確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/986d8515-5d38-f7b7-d4fa-5847a9714908.png)
KILL完了後、dbcc opentranしてもアクティブなトランザクションは無くなりました。

また、トランザクションログも切り捨てられ、容量の逼迫が解消されました。

# まとめ
単純復旧モデルでログが肥大した際の、調査の流れと解消方法の一例をご紹介しました。
まずはsys.databasesの「log_reuse_wait_desc」を確認するところから始めて、その後の調査方針を決めるのが良さそうです。
【悪用厳禁】自分のQiita記事のview数を取得する

前々回にグラフ系の取り組みをしてみたのですが、データ自体がちょっと微妙だったのでそのリベンジも兼ねてQiitaに投稿した記事のview数の遷移をグラフ化するといったことをしようと思います！

### 今日の目標/成果物

今日はQiitaに自分が投稿した記事のview数を取得するコードを書く

### コードと資料

#### 1. スクレイピングのベースコードを準備

https://qiita.com/itaya/items/262eec85e36763497664


Qiitaのスクレイピングについては↑の記事にて一回書いているので基本的にはこちらを流用します。

```crawler.rb
require 'nokogiri'
require 'mechanize'
require 'selenium-webdriver'

def selemium_init
  ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
  # caps = Selenium::WebDriver::Remote::Capabilities.chrome('chromeOptions' => { args: ["--user-agent=#{ua}", 'window-size=1280x800', '--incognito'] }) # シークレットモード
  caps = Selenium::WebDriver::Remote::Capabilities.chrome('chromeOptions' => {args: ["--headless","--no-sandbox", "--disable-setuid-sandbox", "--disable-gpu", "--user-agent=#{ua}", 'window-size=1280x800']})
  
  client = Selenium::WebDriver::Remote::Http::Default.new
  driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps  
end

driver = selemium_init
driver.navigate.to 'https://qiita.com/login'
driver.execute_script("document.getElementsByName('identity')[0].value = 'メールアドレス'")
driver.execute_script("document.getElementsByName('password')[0].value = 'パスワード'")
driver.execute_script("document.getElementsByName('commit')[0].click()")
sleep 1
```

こちらがログイン処理をするコードとなっています。

#### 2. 自分のページの情報を取得
ここから、今回は自分のページの一覧を取得して、そこのページに飛んでview集を取得するので

```crawler.rb
driver.navigate.to 'https://qiita.com/itaya'
sleep 1
doc = Nokogiri::HTML.parse(driver.page_source, nil, 'utf-8')
doc.css('.AllArticleList__Item-mhtjc8-2').each do |div|
  driver.navigate.to "https://qiita.com" + div.css('.AllArticleList__ItemBodyTitle-mhtjc8-6')[0]['href']
  sleep 1
  article_doc = Nokogiri::HTML.parse(driver.page_source, nil, 'utf-8')
  p article_doc.css('.it-Header_pv')[0].text.split(" ")[0]
end
```

こんな感じになります。

#### 3. いざ実行！！
こちらを実行すると

```
"99"
"56"
"218"
"212"
"120"
"107"
"288"
"112"
"213"
"93"
"111"
"128"
"131"
"149"
"383"
"801"
"4629"
"510"
"1086"
```

このような感じに1ページ目に表示されている記事のview数が取得できます。
ただこれだけでは2ページ目以降の記事のview数が取得できないので、明日その部分作りたいと思います....

**※あまりに多くのリクエストはサーバーに負荷がかかるので注意しましょう!!!**

てか、これ普通にQiitaのAPI使えばいいじゃん...
https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF

メモ
毎日投稿14日目
画像の色(RGB)を抽出する

## はじめに

画像から使用されている色(RGB)を抽出する機会があったので、そのメモです。

## 環境

## 言語、パッケージ

|言語、パッケージ|バージョン|
| --- | --- |
| Python | 3.7.4 |
| numpy | 1.16.4 |
|OpenCV| 3.4.2 |

## 画像

lena.jpg
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639315/7782e087-6452-7fb2-0a01-a73c3d88f535.jpeg" width="256">


## 画像のサイズを確認

使用する画像を確認します。

```python
import cv2
import numpy as np

bgr_array = cv2.imread('lena.jpg')
print(bgr_array.shape)
# (512, 512, 3)
```

OpenCVを用いて画像を読み込むと、色は**BGR**の順番になります。
そのため、各512×512の**B**, **G**, **R**行列が3つ並んでいるイメージとなります。


## GBRの取得

例えば、一番左上のBGR値の取得は下記で行います。

```python
print(bgr_array[0, 0, :])
# [128 138 225]
```

## 画像のリサイズ

上記の方法だとBGR値の取得を512×512回行う必要があります。
効率よく行うために下記の行列を作成します。

```math
\left[
    \begin{array}{rrr}
      b_{0} & g_{0} & r_{0} \\
      \vdots & \vdots &  \vdots \\
      b_{n} & g_{n} & r_{n}
    \end{array}
  \right]
```

ここで`n=512*512-1`です。
そして、行方向でユニークな値を抽出していきます。

```python
reshaped_bgr_array = bgr_array.reshape(512*512, 3)

# axis=0で行方向のユニーク化を指定
unique_bgr_array = np.unique(reshaped_bgr_array, axis=0)

# ユニークなbgr値の一覧
print(unique_bgr_array)
"""
[[ 29  14  76]
 [ 31  11  86]
 [ 31  27 146]
 ...
 [224 175 191]
 [224 180 197]
 [225 247 253]]
"""

# ユニークなbgr値の数
print(len(unique_bgr_array))
# 73852

# 全ピクセル数に対するユニークなbgr値の割合
print(len(unique_bgr_array)/(512*512))
# 0.2817230224609375
```
## 関数化

上記のコードでは画像のサイズに依存しているので、再利用できるように関数化します。


```python
def extract_unique_color(img_path, rgb=False):
    bgr_array = cv2.imread(img_path)
    row, col, _ = bgr_array.shape
    reshaped_bgr_array = bgr_array.reshape(row * col, 3)
    unique_color_array = np.unique(reshaped_bgr_array, axis=0)

    if rgb:
        # rgbに要素を並び替え
        unique_color_array = unique_color_array[:, [2, 1, 0]]

    return unique_color_array
```

## 最後に

画像内のユニークな色の抽出方法を紹介しました。
「有限要素法概説」を読んでみた

![IMG_20200512_190855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/3eb0a4a5-01ab-d4d9-d0c3-ae1d45bec44e.jpeg)
これも1980年発行という古い本。sasaburoさんに紹介されて読んでみた。具体的な弾性体力学を扱っていた「有限要素法入門」とは対照的に、抽象的な数学を用いて一般的な微分方程式を解く手法として有限要素法を説明している。これによって色んな物理現象を有限要素法で解くことが出来る。本書は大学で学ぶ解析学や線形代数の知識を前提にしているので「有限要素法入門」と比べると少し敷居が高いかも知れない。

明解な論理で、洗練されており、無駄がない。そのため密度が高くページ数の割に内容が濃い。まるで良く出来た教科書のような素晴らしい良書。

#概要
この本は最初の敷居がなかなか高めだと思う。最初から多次元に一般化されたPoisson方程式の境界値問題が出てくる。そんなに難しいことを言っているわけではないのだが、有限要素法に具体的なイメージを持っているとこの抽象的な入り方に少し戸惑ってしまうかもしれない。直後に弱形式や変分原理が出てくる。物理の問題でいうところの仮想仕事の原理や最小作用の原理を一般化したもの。これは有限要素法の基礎となる重要な概念なのだが自分にとってはこのあたりの理解が最も難しかった。最初の30ページぐらいがこの本の山場だと思う。逆に言えばここさえしっかり理解すればあとはそれほど難しい概念は登場しない。

次はRitz-Galerkin法の説明となる。弱形式や変分原理で表した線形微分方程式を近似的に解く手法である。このために解となる関数をある適当な基底関数群の和で表す。要するにTaylor展開やFourier展開を一般化したようなものである。それぞれの基底関数についての重み係数が満たす式を連立方程式で表し、それを解けば元の微分方程式の解が得られる。連立方程式は行列で表現し、コンピュータで機械的に解くことが出来るので、このやり方はコンピュータと相性が良い。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/046b0779-b700-8ead-de1b-73e9a71ddd98.png)
次はついに有限要素法の解説。有限要素法は要するにRitz－Glerkin法の一種である。最も簡単なものでは基底関数群としてシンプルな山形関数を使う。結果としてこれは微分方程式の解を折れ線グラフで近似したと言える。この方法だと1次元だろうと2次元だろと3次元だろうと計算したい領域を適当に分けて分けた領域である有限個の「要素」についての行列をいくつも作り、それらを組み合わせた大きい行列を作るという非常に機械的な方法で解くべき行列が作れる。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/01f95b70-00dd-9105-4e37-65f472027939.png)

あとは微分方程式が変わったり、次元が増えたり、基底関数の次数を増やしたり、要素の形を変えたりしたときの説明が続く。しかしこれは多少式が複雑になるというだけで基本的な考え方は何も変わらない。最初に基礎を乗り越えておけば大部分の問題について同じように適用できる。これが抽象化された数学の素晴らしい点である。

#本書の特徴
本書も前回の「有限要素法入門」も同じ入門書なのに、全然アプローチが違うのが面白い。本書は物理屋には少し敷居が高いが数学の得意な人にとっては入りやすいかも。
また演習問題もバランス良く入っていて大変良い。ある程度自分で手を動かして計算することで理解が深まる。これを読む人はぜひ全問解いてみて欲しい。
ここで扱っている問題は単純なケースだが考え方は広く適用できて汎用性がある。時間を含まない2階の線形微分方程式の3次元解析プログラムであれば何でも作れそう。ただし3次元は計算よりも入力や表示を実装するのが面倒かも知れない。

#有限要素法プログラムを改良してみた
本書で新たに学んだことではないのだが、前回作った2次元弾性解析プログラムを少し変更して、GUIで自作したメッシュを読み込めるようにしてみた。こういう不規則で自由な形状に簡単に対応できるのが有限要素法の強み。
![EaRvUz_U0AEOQIo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/1492be3c-3abc-b2f2-8c0f-6b6cad077d87.png)
![EaRsVWiUcAIiQDS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/2790d645-7721-47ee-1eba-a67553d20fc0.png)
コードはGitHubに置いた。
https://github.com/MhageGH/FEM-exmaple
Nest.jsのディレクトリ構成をアレンジする

## 背景
仕事でNest.jsの導入を行う際に調査していた結果、ドメインオブジェクトベースでディレクトリが分けられるのが主流？なのかその様な記事しか見当たらなかった。しかし、serviceやcontrollerなどの機能単位で作成したかったのでアレンジしてみました。

## ディレクトリ構成
一応[gitリポジトリ](https://github.com/marc-town/nestjs-app/tree/master/rest-api)も載せておきます。

```
├─ web-api
│   └─ src
│        ├─ controllers                      ... 各APIのリクエストを受け付けを担う
│        │   └─ users.controller.ts
│        ├─ interfaces                       ... アプリケーションのインターフェースを格納する
│        │   └─ users.dto.ts
│        ├─ domain
│        │   ├─ entirties                    ... ドメインオブジェクトEntity
│        │   │   └─ users.entity.ts
│        │   └─ repositories                 ... DBアクセスを担う
│        │       └─ users.repository.ts
│        ├─ logger                           ... ログ出力を担う
│        │   └─ logger.service.ts
│        ├─ modules                          ... 依存関係の定義を担う
│        │   └─ users.module.ts
│        ├─ services                         ... ビジネスロジックを担う
│        │   └─ users.service.ts
│        ├─ app.module.ts                    ... アプリケーションのルートモジュール
│        └─ main.ts                          ... アプリケーションのエントリファイル
│
├─ test
│   └─                                       ... 設計中
│
├─ .eslintrc.js
├─ .prettierrc
├─ nest-cli.json
├─ ormconfig.yaml                            ... typeormの定義ファイル
├─ package-lock.json
├─ package.json
├─ README.md
├─ tsconfig.build.json
├─ tsconfig.json
└─ yarn.lock
```
まだ in を使ってるの？

# TL;DL
```js
function Say(obj) {
  if(obj && "text" in obj && obj.text){
    console.log(obj.text);
  }else{
    console.log("naiyo-");
  }
}

const hoge = {text: "hoge"};
Say(hoge);

// output --------
// hoge
```

↓

```js
function Say(obj) {
  obj = obj ?? {};
  console.log(obj?.text ?? "naiyo-");
}

const hoge = {text: "hoge"};
Say(hoge);
// output --------
// hoge
```


# ECMAScript2020 がリリースされました🎉
6月16日に ECMAScript2020 が正式リリースされました！
個人的推しは `?.(Optional Chaining)` と `??(Nullish coalescing Operator)` です。
今回はそれについて書いていこうと思います。

# ?. Optional Chaining 🤔
## 詳細
?.(Optional Chaining) の詳しい仕様はMDNをお読みください。→ [MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining)
## かんたんなせつめい

```js
const A = {}
const hoge = A?.B; // hoge <- undefined;
```

```js
const A = {B:"hoge"};
const hoge = A?.B; // hoge <- "hoge"
```

A.Bが `undefined` または `null` のとき `undefined` を返し、それ以外は `A.B` を返します。

# ?? Nullish coalescing Operator 🤔
## 詳細
上に同じく詳しい仕様はMDNで→[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)
## かんたんなせつめい
```js
const A = undefined;
const hoge = A ?? "undefined dayo"; // hoge <- "undefined dayo"
```

```js
const A = "hoge";
const hoge = A ?? "undefined dayo"; // hoge <- "hoge"
```

`??` は `A??B` で `A` が `undefined` または `null` のとき `B` を返し、それ以外は `A` を返します。

# 本題 「まだ in を使ってるの？」
## 前提
受け取った`object`に`text`プロパティがあるときコンソールに出力し、なければ`"naiyo-"`を出力する。

## これまで
```js
function Say(obj) {
  if(obj && "text" in obj && obj.text){
    console.log(obj.text);
  }else{
    console.log("naiyo-");
  }
}
```

# これから
```js
function Say(obj) {
  obj = obj ?? {};
  console.log(obj?.text ?? "naiyo-");
}
```

なんて便利なんだ
[flutter] Error connecting to the service protocol: failed to connect to http://127.0.0.1:1025/

# やりたいこと

* flutterとiPhone実機を接続してデバッグしたい。
* ホットリロードを使いたい。

# 現象

flutter run で下記。


```
Error connecting to the service protocol: failed to connect to http://127.0.0.1:1025/
```
# 対策

xCodeで下記を実行する。

* メニューから `window > Devices and Simulators` 
* 接続中のiPhoneが表示されるので、下部までスクロールし、`Condition`を`Network Link`と`WiFi Network` に設定して`start`を押す。
* 画面上部の `Connect via network` にチェックを入れる。

その後、コマンド実行。

```
flutter doctor -v
flutter clean
flutter run
```
下記が表示されたらOK。

```
Launching lib/main.dart on kenichiro.yamatoのiPhone in debug mode...

Automatically signing iOS for device deployment using specified development team in Xcode project: 3MJ3RXDPFK
Running Xcode build...

 └─Compiling, linking and signing...                         5.2s
Xcode build done.                                           11.5s
Installing and launching...                                        17.2s
Syncing files to device kenichiro.yamatoのiPhone...                 170ms

Flutter run key commands.
r Hot reload. 
R Hot restart.
h Repeat this help message.
d Detach (terminate "flutter run" but leave application running).
c Clear the screen
q Quit (terminate the application on the device).
An Observatory debugger and profiler on kenichiro.yamatoのiPhone is available at: http://localhost:1028

```
nginx 1.17 から nginx 1.19 にupdate

# はじめに

nginx1.19が出ていたのでupdate
[Introducing NGINX 1\.18 and 1\.19 \- NGINX](https://www.nginx.com/blog/nginx-1-18-1-19-released/)
[nginx\.org/en/CHANGES](http://nginx.org/en/CHANGES)

## LOG

### Update

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

# cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=0

# nginx -v
nginx version: nginx/1.17.10

# yum update --enablerepo=nginx nginx
... 略

依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ nginx.x86_64 1:1.17.10-1.el7.ngx を 更新
---> パッケージ nginx.x86_64 1:1.19.0-1.el7.ngx を アップデート
--> 依存性解決を終了しました。

依存性を解決しました

==============================================================================================================
 Package               アーキテクチャー       バージョン                          リポジトリー           容量
==============================================================================================================
更新します:
 nginx                 x86_64                 1:1.19.0-1.el7.ngx                  nginx                 777 k

トランザクションの要約
==============================================================================================================
更新  1 パッケージ
... 略

# nginx -v
nginx version: nginx/1.19.0
```
BuefyでMaterial Design Iconsを使う

## はじめに

[Buefy](https://buefy.org/)は、[Bulma](https://bulma.io/)をベースにしたVue.js向けUIライブラリです。

Buefyはアイコンを利用できるのですが、ドキュメントにはCDNからダウンロードする方法しか記載されていません。
ここでは<strong>npm(or yarn)でinstallした</strong>Material Design Iconsのアイコンを使うときの手順を紹介します。

## 環境

Node.js v12.13.1
vue-cli v4.4.1

## アプリケーションの雛形を作って、Buefyをインストールする

```shell
$vue create my-app # オプションは自由に
$cd my-app
$npm install buefy
```

アプリの雛形ができたら、Buefyを使えるようにします。

```main.js
import Vue from 'vue';
import Buefy from 'buefy';
import App from './App.vue';
import 'buefy/dist/buefy.css';

Vue.use(Buefy);

Vue.config.productionTip = false;

new Vue({
  render: (h) => h(App),
}).$mount('#app');
```

## Material Design Iconsをインストールする

```shell
$npm i @mdi/font
```

```main.js
import Vue from 'vue';
import Buefy from 'buefy';
import App from './App.vue';
import 'buefy/dist/buefy.css';

// 追加
import '@mdi/font/css/materialdesignicons.css';

Vue.use(Buefy);
```

## まとめ

これでアイコンを使えるようになりました。
[チートシート](https://cdn.materialdesignicons.com/5.3.45/)を見ると`mdi-`が先頭についていますが、コンポーネントの`icon`プロパティには不要です。
`mdi-`をつけるとアイコンが表示されません。

```MyComponent.vue
<template>
  <section>
    <b-button icon-left="github">Add</b-button>
    <b-icon icon="home"></b-icon>
  </section>
</template>
```
[VScode]コマンドプロンプトで作成したフォルダを開く

#初めに
コマンドプロンプトでフォルダを作成したら、コマンドでvscodeに行き作成したフォルダを開く方法を書く
##やり方
**codeコマンド**を使います 
[公式ドキュメント](https://vscode-doc-jp.github.io/docs/userguide/command-line.html)

```bash
  #フォルダを作成
  $ mkdir test

  #testフォルダへ移動
  $ cd test
  
  #VScodeを開き、なおかつ作成したフォルダを開く
  $ code .
```

#終わりに
また何か発見したら備忘録としてQiitaに投稿しようと思います。
Vue.js mapState について

state を参照したり、変換して取得したりするヘルパーのこと
スプレッド演算子と組み合わせて使うのが基本

めちゃくちゃわかりやすく纏まっている
[Vuex: mapStateの使い方を理解する - Qiita](https://qiita.com/Statham/items/046649bff81c00ba275e)

スプレッド演算子とは、配列やオブジェクトの要素を文字通り展開する構文
配列のスプレッド構文はECMAScript2015で標準
スプレッド構文はshallow copyなので、ネストしている場合は個別に分割する必要がある

```jsx
const foo = {
  a: {
    b: 1,
    c: 2
  },
  d: 3
};

const bar = {
  ...foo,
  a: {
    ...foo.a,
    c: 4
  }
};
console.log(bar); // => { a: {b: 1, c: 4}, d: 3 }
```

**分割代入**(Destructuring assignment)とも組み合わせて使える

分割代入は配列やオブジェクトの要素を取り出して個別の変数に代入するのを簡単に行えるもの

```jsx
const array = [1, 2, 3];
const [p, ...q] = array;
console.log(p); // => 1
console.log(q); // => [2, 3]

const obj = { foo: 1, bar: 2, baz: 3 };
const { foo, ...rest } = obj;
console.log(foo); // => 1
console.log(rest); // => { bar: 2, baz: 3 }
```

```jsx
const nestedObj = {
  x: { a: 1, b: 2, c: 3 },
  y: [4, 5, 6]
};

const { x: { a, ...restX }, y: [y0, ...restY] } = nestedObj;
console.log(a); // => 1
console.log(restX); // => { b: 2, c: 3 }
console.log(y0); // => 4
console.log(restY); // => [5, 6]
```
[Git] 大容量リポジトリをcloneする…！

大分多忙で記事が滞ってしまいました。
ここは現場ノウハウ系でお茶を濁しましょう…

# 何事！？

内容が膨大なGitリポジトリ、あると思います…
（ゲームアプリのアセットリポジトリとか）

それをcloneしようとするとエラーになったりします。

```
Cloning into 'xxxxxxxxxx'...
Warning: Permanently added '[xxx.xxx.xxx.xxx]:11111' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 83107, done.
remote: Counting objects: 100% (83107/83107), done.
remote: Compressing objects: 100% (54788/54788), done.
ssh_dispatch_run_fatal: Connection to xxx.xxx.xxx.xxx port 11111: message authentication code incorrect
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
```

# どうする！？

いくつか方法がありそうなのですが、

## バッファーを大きくしてみる

これだけではダメでした…。

```
git config --global http.postBuffer 524288000
```

でも設定してみるに越したことはないでしょう。

## 最新の状態のみcloneしてみる

`--depth X` で、直近の更新X件にのみ含まれるデータに絞ってcloneします。

```
git clone --depth 1 リポジトリurl
```

でもダメでした…。
その直近の状態ですでに膨大なら `無駄無駄無駄無駄無駄無駄無駄無駄ッッッ!!`

## リポジトリ内容のうち一部だけをcloneする

これでなんとかなりました…！

### ただし条件が…

何らかの方法で、**リポジトリの中のディレクトリやファイル構成**をすでに知っていなければこの手は使えません。

### まず、受け入れるディレクトリをローカルに作成

```
mkdir ttt
cd ttt
git init
```

### 一部だけcloneするための設定を施す

```
git config core.sparsecheckout true
git remote add origin リポジトリurl
```

### cloneしたいパスだけを列挙したテキストファイルを作成する

viで手書きとかでもなんでもOKですが、一発コマンドとかでしたら↓こういった感じで。

```
cat - << EOS >> .git/info/sparse-checkout
リポジトリurlより下の、欲しい/パス
リポジトリurlより下の、欲しい/パス2
リポジトリurlより下の、欲しい/パス3
EOS
```

※ `欲しいパス` の内容がすでに膨大だったら、がんばってもっとサブディレクトリやファイルを絞って下さい…

### いざclone！（実際は `git pull` だけど）

```
git pull origin master
```

これで何とかなりました！
んがああああああああああああああああ！！！

# 余談

リポジトリ（Gitサーバー）側の操作権限があれば、他にもやれる方法はあるみたいです（あらかじめ圧縮したりとか）
私の場合は受託案件のためその権限がなく、手前でどうにかしなければいけなかったので…という次第です:sweat:
MotionBoardのExcel読み込み機能を使おう~番外編~

#最初に
[MotionBoardのExcel読み込み機能を使おう](https://qiita.com/Ryo---san/items/15fb18f1a77975250bc0)という記事でMotionBoardのExcel読み込み設定について書きました。
今回はその番外編となります。

#さらに複雑なExcelの場合
このようなExcelを読み込んでみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/6ea4e6e1-7aa0-e0d0-d52e-6c6b904cf34b.png)

個人学習塾の春期講習の日程表ですね。
生徒毎に何月何日の何限にどの講師の授業があるかを記載しています。

これらを全生徒の情報を一元管理したくなりますよね。


#解決策
実はいろんなパターンを試してみたのですが、結論としてMotionBoardの力だけでは正確に読み込めませんでした。
今回の場合は２段構成になっていて１段目と２段目をそれぞれ読み込まなければならない上に、

セルが結合されてたり、上下段に分かれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/0ac28837-804a-2773-eff1-a45d1609e971.png)



このような場合は、Excel側も加工して取り込みやすい形を作りましょう。

非表示にしたシートの中や、印刷範囲ではない場所に、MotionBoardが読み込みやすい形式でセル計算をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/0bcf9a9b-068c-331f-a4ba-56cf5213d903.png)

セルの中は$で固定させてコピペして一気に作ります。
今回のような取込のフォーマットが固定された形式でしたら、取り込みやすい形を作ったシートを用意する方が運用が楽になります。


あとはMotionBoardのExcel読み込み設定で、該当の計算式の箇所だけを抜き取れば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/22e091b7-8a11-99bf-d264-13bd79f5fc43.png)


データ分析に活用できる情報が揃います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657414/7dd6f7d9-f4a1-a983-ca82-589c6afbe9ac.png)



このようにMotionBoardの取り込みの機能、Excelの機能のそれぞれを活用すると、様々なExcelデータを取り込むことができます。
CSS勉強メモ 属性の指定方法

```
<section id="about">
      <h1 id="main" class="title box" style="color: skyblue;">Main</h1>
</section>
/* <h1>の指定方法 */
#about > #main.title{ color: pink;}
h1 { color: red !important;}
/* important>直接スタイルを書き込む>属性ランキングの順で適用される */
h1#main.box { color: yellow;}
section > #main.title { color: blue}
section#about > h1 {color: green;}

/* 全て書いた場合は[id],[class,属性,擬似クラス],[要素，擬似要素]の数で評価されて、前から値が大きいものが選ばれていき、同点の場合は後に書いた方でスタイルが決まる */

li:empty{
  background: skyblue;
}
li:not(:empty){
  background: skyblue;
}

main > h2:first-of-type{
  background: pink;
}
main > h2:last-of-type{
  background: pink;
}
main > h2:nth-of-type(3){
  background: pink;
} 
/* 指定する要素の〜番目にスタイルをつける */
/* 要素の種類も考慮したい時はnth-of-type */

h1::before,
h2::before{
  content: '- ';
}
h1::after,
h2::after{
  content: attr(data-subtitle);
}
.btn{
  width: 100px;
  background: skyblue;
  text-align: center;
  padding: 4px;
  color: white;
}
.btn:hover{
  opacity: 0.7;
  cursor: pointer;
  擬似クラスはカーソルが当たったときに適用されるクラス
}

main > :nth-child(3){
  background: pink;
} */
main > :nth-child(3n){
  nは自然数を入れてくれる
  background: pink; 
}

main > :nth-child(odd){
  background: pink;
}
main > :nth-child(even){
  background-color: skyblue;
}
 
main > :first-child{
  background: pink;
}
main > :last-child{
  background: skyblue;
}
sshキー(秘密鍵・公開鍵)の作成と認証　流れ

# はじめに
エンジニアとして初めての現場。
支給されたMacで、sshキーの作成と認証作業で少し手こずったので記録として残しておく。

Githubやbitbucket, ec2やlightsailなど、様々なサイトやサーバーへのアクセスをする際に必要になる。

# sshキー(秘密鍵・公開鍵)の作成 

まずは、接続元であるクライアント側(ex. 自分のパソコン)で、鍵を生成します。

### ssh クライアントへ移動

```terminal
$ pwd
Users/ユーザー名/  <====ホームディレクトリ
$ cd .ssh
$ pwd
Users/ユーザー名/.ssh
```

### キー作成コマンド

```terminal

$ ssh-keygen  # 私はデフォルトのままで作成
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): <--鍵の保存先 
Enter passphrase (empty for no passphrase):  <-- パスフレーズを入力（任意）
Enter same passphrase again:  <-- もう一度、パスフレーズを入力（任意）
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.

# 私は全て何も書かずEnter押しました。(全てデフォルトのまま作成)

$ ls 
id_rsa  id_rsa.pub

```

これで、**秘密鍵(id_rsa)**と**公開鍵(id_rsa.pub)**が作成されました。


その名の通り、
秘密鍵：　**他の人に教えてはいけない**
公開鍵：　**他の人に教えてもよい**

となっている。


#### ssh-keygenコマンドのオプションが記載されてるサイト
【 ssh-keygen 】コマンド――SSHの公開鍵と秘密鍵を作成する
https://www.atmarkit.co.jp/ait/articles/1908/02/news015.html




# sshキー(秘密鍵・公開鍵)の認証 

sshキーを使って、サイト(Github, bitbucketなど)やサーバー(ec2インスタンスなど)にアクセスするための鍵の認証方法を書いていく。

先ほど作成した2つの鍵のうち公開鍵をサーバー側に登録することにより、クライアント側との接続を可能にする。

#### サーバー側(接続先)での操作

```terminal
$ install -m 0700 -d ~/.ssh # .sshがない場合
       or
$ chmod 700 .ssh # .sshがある場合
# 上記のどちらかを実行

$ cd .ssh
$ touch authorized_keys # authorized_keysというファイルを作成 
$ vim authorized_keys　# ここで、先ほど作った公開鍵（id_rsa.pub）の記述をそのままコピペする 
$ chmod 600 authorized_keys # authorized_keysに権限を与える

```

これで、sshキーの認証はできた。

# .ssh/config 

.ssh/configとは、ssh経由でのリモートサーバーの接続する際に利用される設定ファイルです。

一つの秘密鍵で複数の公開鍵を扱うときなどに、.ssh/configを利用すると便利です。

ssh経由で接続する際の、長ったらしいユーザー名・ホスト名・ポート番号・鍵の名前　などを予めファイルに記載しておくことで、省略できます。

```~/.ssh/config
Host 任意の接続名(hoge)
HostName ホスト名
User ユーザー名
Port ポート番号
IdentityFile 鍵へのPATH(例えば~/.ssh/hoge.key)
```

この場合だと、、、

```
$ ssh hoge
```
で接続できてしまいます。


その他もう少し詳しく知りたい方は下記リンクへどうぞ

~/.ssh/configについて
https://qiita.com/passol78/items/2ad123e39efeb1a5286b


# おわりに

OpenSSH 7.3以降だと、.ssh/configに記述していた複数の公開鍵をファイルごとに分けることもできるらしい。そこまで私の理解はまだ深くないので、詳しくは説明できない。

sshキーの生成・認証作業は、僕はそんなに頻繁にやることではないので、こうやって自分のメモと、参照した記事も一緒に保存しておくと、後々、思い出しやすくなる。

もし私の説明がわかりにくいと感じた人は、ぜひ各項目に散らばっている参考記事を読んでほしいです。


### 参考記事

秘密鍵・公開鍵を作成する（Mac）
https://qiita.com/reflet/items/0c338df07d9f6c6ef776

RSA公開鍵認証によるssh接続設定について（Macbook -> VPS）
https://qiita.com/m1220/items/9dc3856bbcf985577023
【AWS】用語を整理しながら学ぶAWS - part1


# はじめに

この記事では
AWSのあんなことやこんなことについて
まとめた記事です。
間違いがあれば修正していく予定です。
今回はAmazonVPCとそれを扱う上で重要な用語について整理してみました。

参考図書：[さわって学ぶクラウドインフラAmazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/dp/B084QQ7TCF/ref=cm_sw_r_tw_dp_U_x_-vD5EbQCMD1A9)

--------------------------------

# AmazonVPCって何ぞ

Amazonが提供するクラウドサービスの一つ
Amazon Virtual Private Cloud の略

**要するに
手軽にネットワークを構築できる優れモノ**

--------------------------------
# オンプレ、その他とはどう違う

・ネットワーク構築に必要な設備の調達がほぼ必要ない。
・ネットワーク保守に必要な設備がほぼ必要ない。
・ネットワーク運用に必要な設備を一括管理できる。


--------------------------------
# 必要な前提知識

基本情報技術者試験レベルのネットワーク知識
例えば、IPアドレスの計算方法や表記、ネットワークレイヤーの知識

--------------------------------

# 基礎用語集
IPアドレス
サブネット
サブネットマスク
CIDR表記(プレフィックス表記)
サブネットマスク表記
ルーティング
リージョン
アベイラビリティゾーン

--------------------------------
# IPアドレス

ざっくり、グローバルとプライベートの２種類が存在する。
AWSではグローバルIPアドレスのことを**パブリックIPアドレス**と呼ぶそうだ。

--------------------------------
# サブネット
区切られたネットワーク
サブネットマスクを行うことで作成できる。

--------------------------------
# サブネットマスク
ネットワークを区切るときに必要なネットワークの範囲情報


--------------------------------
# CIDER表記（サイダー表記）
ネットワーク部のアドレスのビット長を
／（スラッシュ）で表記する方法
このビット長を**プレフィックス**という

--------------------------------
# サブネットマスク表記
プレフィックスの数値分だけ
ネットワーク部を1、つまり255で表すこと

例
/24
=> 255.255.255.0
=> 11111111 11111111 11111111 00000000

--------------------------------
# ルーティング
レイヤー3における通信経路の情報
この通信経路情報をもつテーブルを**ルーティングテーブル**という

--------------------------------
# リージョン
それぞれの地域（リージョン）に存在するデータセンター群のことをいう
AWSでは地名にリージョンをつける
東京ならば 「東京リージョン」
アクセスする地域が近ければレスポンスははやくなる。

--------------------------------
# アベイラビリティゾーン
リージョンをさらに分割して
めっちゃ距離をおいたファシリティを使うゾーンのこと

※ここでいうファシリティとは：ネットワークや電源設備のことをいう

--------------------------------
# まとめ
ちょっとした疑問
リージョンは近ければよいという話ですが
CDNサーバを使えば、遠くても良いような気がしますけど
どうなんでしょうね・・・
程度によるかぁ

--------------------------------
# おわり
AtCoder 生活　80日目

[前回]()

#80日目
今回は茶色diffの問題を2問解きました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|CODE FESTIVAL 2014 予選A|C|◯|13分52秒|
|Code Formula 2014 本選|C|✕|74分41秒|

##[CODE FESTIVAL 2014 予選A_C](https://atcoder.jp/contests/code-festival-2014-quala/tasks/code_festival_qualA_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int f(int x){
    int s = 0;
    s += x/4;
    s -= x/100;
    s += x/400;
    return s;
}

int main(){
    int a,b;
    cin >> a >> b;
    int p = s(a);
    int q = s(b);
    bool ul = false;
    if(a%4 == 0){
        ul = true;
        if(a%100 == 0){
            ul = false;
            if(a%400 == 0) ul = true;
        }
    }
    if(ul) cout << q - p + 1 << endl;
    else cout << q - p << endl;
}

```

解くのにかかった時間：13分52秒


##[Code Formula 2014 本選_C](https://atcoder.jp/contests/code-formula-2014-final/tasks/code_formula_2014_final_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    string s;
    getline(cin,s);
    s.push_back(' ');
    set<string> st;
    int l = s.size();
    int pos = 0;
    while(pos < l){
        if(s[pos] == '@'){
            string t = "";
            while(pos++ < l && 'a' <= s[pos] && s[pos] <= 'z'){
                t += s[pos];
            }
            if(t.size() > 0) st.insert(t);
        }
        else pos++;
    }
    for(auto x : st) cout << x << endl;
}

```

解くのにかかった時間：74分41秒
感想：getlineをこの問題でしか見たことないから使い方に慣れない。


###最後に
茶色も難易度の落差がひどい気がする

難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|C|13分52秒|2問中1問|
よく調べるJavaScript文法まとめ（随時追記）

# この記事について
最近、業務でJavaScriptを使うことが多いのですが、その際に何度も何度も調べてしまう文法を、自分の備忘録もかねて書き溜めていこうと思います。
随時追記していく予定です。

# 配列操作系
## 配列をカンマ区切りの文字列にする
ソースコード

```javascript
const array = ['aaa', 'bbb', 'ccc'];

const arrayStr = array.toString();

console.log(arrayStr);
```

実行結果

```console
aaa,bbb,ccc
```

## 配列の要素をひとつずつ取り出す
ソースコード

```javascript
const array = ['aaa', 'bbb', 'ccc'];

for (const e of array) {
  console.log(e);
} 
```

実行結果

```console
aaa
bbb
ccc
```

## 配列からインデックスと値をひとつずつ取り出す
ソースコード

```javascript
const arr = ['aaa', 'bbb', 'ccc'];

arr.forEach( (value, index, array) => {   // arrayは何に使うかわからない
  console.log(`index: ${index}, value: ${value}, array: ${array}`)
});
```

実行結果

```console
index: 0, value: aaa, array: aaa,bbb,ccc
index: 1, value: bbb, array: aaa,bbb,ccc
index: 2, value: ccc, array: aaa,bbb,ccc
```

## 配列から条件に合致するものを抽出する（配列に詰める）
ソースコード

```javascript
const arr = ['150', '75', '200', '99'];

const filtered = arr.filter( value => {
  if (value > 100) return value;
});

console.log(filtered);
```

実行結果

```console
["150","200"]
```

## 配列の各要素に処理をして、新しい配列を作る
ソースコード

```javascript
const arr = [1, 2, 3, 4, 5]

const square = arr.map( (value, index, array) => {
  return value * value;
})

console.log(square);
```

実行結果

```console
[1,4,9,16,25]
```

# オブジェクト操作系
## オブジェクトのキーを配列として取り出す
ソースコード

```javascript
const obj = {
  banana: "バナナ",
  apple: "リンゴ",
  peach: "モモ"
};

const keyArray = Object.keys(obj);
console.log(keyArray);
```

実行結果

```console
["banana","apple","peach"]
```

## オブジェクトのキーをひとつずつ取り出す
ソースコード

```javascript
const obj = {
  banana: "バナナ",
  apple: "リンゴ",
  peach: "モモ"
};

for (const key of Object.keys(obj)) {
  console.log(key)
}
```

実行結果

```console
banana
apple
peach
```

## オブジェクトのキーと値をひとつずつ取り出す
ソースコード

```javascript
const obj = {
  banana: "バナナ",
  apple: "リンゴ",
  peach: "モモ"
};

for (const [key, value] of Object.entries(obj)) {
  console.log(`${key}: ${value}`);
}
```

実行結果

```console
banana: バナナ
apple: リンゴ
peach: モモ
```

## オブジェクト内の要素数を取得する
ソースコード

```javascript
const obj = {
  banana: "バナナ",
  apple: "リンゴ",
  peach: "モモ"
};

const elementsNum = Object.keys(obj).length;
console.log(`number of elements in obj: ${elementsNum}`);
```

実行結果

```console
number of elements in obj: 3
```

# 空判定系
## 配列の空判定
ソースコード

```javascript
const array1 = [];
if (array1) console.log('array1 is decleared');           // 配列が定義されていれば、true
if (array1.length > 0) console.log('array1 has element(s)')  // 配列に値が入っていれば、true

const array2 = ['aaa', 'bbb', 'ccc'];
if (array2) console.log('array2 is decleared');
if (array2.length > 0) console.log('array2 has element(s)')
```

実行結果

```console
array1 is decleared
array2 is decleared
array2 has element(s)
```

## オブジェクトの空判定
ソースコード

```javascript
const obj1 = {};
if (Object.keys(obj1).length) console.log('obj1 has element(s)'); // オブジェクトに要素があれば、true

const obj2 = {
  banana: "バナナ",
  apple: "リンゴ",
  peach: "モモ"
};
if (Object.keys(obj2).length) console.log('obj2 has element(s)');
```

実行結果

```console
obj2 has element(s)
```


# その他
ソースコードの書き方を調べていると、本当にこのやり方で自分のやりたいことができるのか確かめたくなる事があると思います。
そんな時は、このような[エディタ](https://playcode.io)を使うと、簡単に確認ができて良いと思います。
Serverlessで、デプロイ時idobataに通知するプラグインをTypeScriptで作ってみた

Serverlessで、デプロイ開始・終了時に[idobata](https://idobata.io/)に通知するプラグインを作ってみました。

https://github.com/mk2/serverless-idobata-webhook

# 使い方

- まずはインストール。

```sh
yarn add -D serverless-idobata-webhook
```

- pluginsに追加。

```yml
plugins:
  - serverless-idobata-webhook
```

- webhookのURLを設定。

```yml
# in serverless.yml
custom:
  serverless-idobata-webhook:
    webhookUrl: https://idobata.io/hook/custom/...
```

- 通知メッセージに任意のメッセージを指定する場合は、次のプロパティをカスタムに設定。

```yml
custom:
  serverless-idobata-webhook:
    webhookUrl: https://idobata.io/hook/custom/...
    beforeDeployMessage: 'ok, {username} started deploying.'
    afterDeployMessage: 'ok, {username} finished deploying.'
```

[pupa](https://github.com/sindresorhus/pupa)でフォーマットしていて、次の変数が使えます。

- `username`: デプロイしているマシンのユーザー名。
- `hostname`: デプロイしているマシンのホスト名。
- `ipAddress`: デプロイしているマシンのIPアドレス。
- `currentTime`: 通知送信時の現在日時（`yyyy-MM-dd HH:mm:ss`フォーマットされている）。

idobataにデプロイ時に通知飛ばして～！という方は使ってみてください。

# プラグインを作ってみての雑感

Serverlessは仕事で使っていて、結構色々簡単にいじれるので、自分でプラグインを作ってみたいなーと思っていました。で、一念発起して（非常に簡単な）プラグインを1個作ること出来ました。

参考にしたドキュメント・ウェブサイトは下記のとおりです。

- TypeScriptでServerless FrameworkのPluginを書いてみる https://dev.classmethod.jp/articles/create-serverless-framework-plugin-by-typescript/
- How To Write Your First Plugin For The Serverless Framework - Part 1 https://www.serverless.com/blog/writing-serverless-plugins/
- How To Write Your First Plugin For The Serverless Framework - Part 2  https://www.serverless.com/blog/writing-serverless-plugins-2/

Developers.IOさんの記事が一番参考になりましたが、TS的にそうじゃなくてもいいのでは…？という部分があったので、ここで補足しておきます。ついでに作っていて気がついたことも。

### `module.exports = ModuleName`を書かないと駄目？

tscを使う限り、書かなくて大丈夫です。TSには以下のように、`module.exports`としてエクスポートをトランスパイルする文法があります。

```ts
export = class MyAwesomePlugin {...}
```

ただ、これはtscだとトランスパイル可能なのですが、babelは受け付けてくれません :cry: 

### `lifecycleEvents`は必須？

プラグインは何らかの機能を提供するので、普通はコマンド経由で`lifecycleEvents`が必須…かなと思います。ただ、このプラグインでは予めある`deploy`ライフサイクルにフックを追加するだけなので、必要ありませんでした。なので、特にライフサイクルイベントは書いてないので、問題なく動いているようです。
matplotlibを使って●をプロット｜Python

#平面座標で円を描く
X-Y平面上に点をプロットすることはできますが、円を描くことはどうでしょうか。
こんなふうに円の描画をすることができます。
<img width="587" alt="スクリーンショット 2020-06-17 21.33.22.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/eefb4501-9a3d-d93f-66ef-7604f05ed6fc.jpeg">

*matplotlib*を使用して描いてみます。

```Python:xyPlotCircle.py
import matplotlib
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

# 中心を (x, y) = (0.2, 0.2)に設定
# 　半径0.2の円を描画
circle = plt.Circle((0.2, 0.2), 0.2, fc="#778800")
ax.add_patch(circle)

plt.show()
```
以上です。

・参考サイト
[matplotlib.pyplot について[英文] ](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html?highlight=matplotlib%20pyplot#module-matplotlib.pyplot)
Vue.js Nuxt.js 初期インストールおよびプロジェクト作成（Mac）

### node.js インストール

```sh
$ brew install nodebrew
$ mkdir -p ~/.nodebrew/src
$ nodebrew -v
nodebrew 1.0.1
```

インストール可能なnode.jsのリストを表示

```sh
$ nodebrew ls-remote
```

version8.9.4をインストール

```sh
$ nodebrew install-binary v8.9.4
$ nodebrew ls
$ nodebrew use v8.9.4
```

nodeとnpmコマンドのパスを通す

```sh
$ nodebrew setup
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
```

バージョン確認

```sh
$ node -v
v8.9.4
$ npm -v
5.6.0
```

### vue-cli インストール

```sh
$ npm install -g @vue/cli
$ vue --version
@vue/cli 4.4.1
```

### プロジェクト作成

1. createコマンドで作成 (vue-cli3.x系)

```sh
$ vue create <プロジェクト名>
```

2. nuxt.js のプロジェクト作成

```sh
$ npx create-nuxt-app <プロジェクト名>
```

### 起動


```sh
# npm なら
$ npm install
$ npm run dev

# yarn なら
$ yarn install
$ yarn run dev
```

### sass導入

```sh
yarn add node-sass sass-loader
```

nuxt.config.jsに追記

```jsx
module.exports = {
	css: [
		'@/assets/css/main.scss'
	]
}
```

### フォーマッタを設定する

Prettier インストール

1. eslint-plugin-prettierESLint と一緒に Prettier の機能を利用したい場合に導入するeslint-config-prettier
2. Prettier とバッティングする、ESLint のフォーマット関係のルールを無効化する

```sh
yarn add prettier eslint-config-prettier eslint-plugin-prettier
```

プロジェクト配下に.eslintrc.js を作成する

```jsx
module.exports = {
    root: true
    env: {
        node: true
    },
    extends: [
        'plugin:vue/essential',
        'eslint:recommended',
        'plugin:prettier/recommended' // EsLintとprettierを両方使用する場合に必要な設定
    ],
    plugins: ['vue'],
    rules: {
        // コーディングのルールを設定できる。設定項目に則った内容でエラーが出力されるようになる
        'prettier/prettier': [
        'error',
        {
            semi: true, // 文末にセミコロンを使用するか
            singleQuote: true, // 文字列にシングルコーテーションを使用すか
            trailingComma: 'es5' // es5の記法に従う
        }
        ],
        'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
        'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
    },
    parserOptions: {
        parser: 'babel-eslint'
    }
};
```

VSCode で「Prettier - Code formatter」をインストールする

setting.json に以下を追加

```jsx
// JavaScriptでのみ保存時フォーマットを有効化
 "[javascript]": {
     "editor.formatOnSave": true
 },
 // prettierのシングルクオーテーションオプションをon
 "prettier.singleQuote" : true,
 // Eslintによって不適切と指摘された箇所をファイルの保存時に自動的にフォーマットする。
 "eslint.autoFixOnSave": true,
```

### Tips

```sh
# yarn を入れてパッケージ管理をyarnでやる
npm install -g yarn
```
Vue.js リンク集

## Vue CLI 3.0

[Vue CLI 3.0 が来ました！ - Vue.js](https://jp.vuejs.org/2018/08/11/vue-cli-3-0-is-here/)

## Snippet

### UI・アニメーション

[Vue.jsでできること8選。凄さが分かる実用例スニペット集 | Workship MAGAZINE(ワークシップマガジン)](https://goworkship.com/magazine/vuejs-framework-snippets/)

### テンプレート

[25+ Vuejs Themes And Templates @ Creative Tim](https://www.creative-tim.com/templates/vuejs)

### マルチセレクター、タグ付けも可能（vue.js）

[「Vue-multiselect」を使って万能なセレクトボックスを実装する](https://www.kabanoki.net/4224/)

### モーダル

[Vue・Vuexでモーダルを管理する - Qiita](https://qiita.com/RikutoYamaguchi/items/2fb1c1dc8be196dfc883)

### フォームバリデーション

[Buefy と VeeValidate でお手軽フォームバリデーション！ - Qiita](https://qiita.com/POPOPON/items/45681ff75e430ad0a4da)

## 概念

### 完全ビルドとランタイムビルドの違いについて

[Vue.jsの完全ビルドとランタイムビルドの違い - Qiita](https://qiita.com/sansaisoba/items/58f8176f6e462fe4d591)

### オレオレディレクトリ構造

[Vue.js ディレクトリ構成 色々試してみた - Qiita](https://qiita.com/tockn/items/2ce68b99e0839df52200)

## webpack

[Concepts | webpack](https://webpack.js.org/concepts/)

## go × Vue.js

[社内管理画面を Vue + Go で作る - Gunosy Tech Blog](https://tech.gunosy.io/entry/admin-vue-go)
[flutter]Exception: No development certificates available to code sign app for device deployment

# やりたいこと

flutterとiPhone実機を接続してデバッグしたい。



# 現象

flutter run で下記。

```
yamato@MacBook-Pro my_app_yamato_200617a % flutter run
Launching lib/main.dart on kenichiro.yamatoのiPhone in debug mode...

════════════════════════════════════════════════════════════════════════════════
No valid code signing certificates were found
You can connect to your Apple Developer account by signing in with your Apple ID
in Xcode and create an iOS Development Certificate as well as a Provisioning
Profile for your project by:
  1- Open the Flutter project's Xcode target with
       open ios/Runner.xcworkspace
  2- Select the 'Runner' project in the navigator then the 'Runner' target
     in the project settings
  3- Make sure a 'Development Team' is selected.
     - For Xcode 10, look under General > Signing > Team.
     - For Xcode 11 and newer, look under Signing & Capabilities > Team.
     You may need to:
         - Log in with your Apple ID in Xcode first
         - Ensure you have a valid unique Bundle ID
         - Register your device with your Apple Developer Account
         - Let Xcode automatically provision a profile for your app
  4- Build or run your project again
  5- Trust your newly created Development Certificate on your iOS device
     via Settings > General > Device Management > [your new certificate] > Trust

For more information, please visit:
  https://developer.apple.com/library/content/documentation/IDEs/Conceptual/
  AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html

Or run on an iOS simulator without code signing
════════════════════════════════════════════════════════════════════════════════
Exception: No development certificates available to code sign app for device deployment
```

# 対策

作成したflutterプロジェクトのルートにて下記を実行する。

```
open ios/Runner.xcworkspace
```

xCodeが立ち上がるので、左メニュー上のRunnerをクリックする。

Signing & Capabilities の Team に自分のAppleIDアカウントを設定する。

以上を実施してから、再度、flutter run を実行する。

途中で「キーチェーンのパスワード入力」を求められたら、Macのログインパスワードを入力する。

実機側で

```
「Appを検証できません」信用を確認するにはインターネット接続が必要です。
```

と表示された場合は、WiFiに接続した実機側で下記を実行する。


設定＞一般＞プロファイルとデバイス管理＞デベロッパAPP

```
Apple Development:
```

をタップして「信頼」を押す。
数十秒後に「このiPhoneで信頼されています」「検証済み」と表示されたらOK。
Vuex メモ書き

### Vuex

- 兄弟や親子のコンポーネントに値を共有する
- Vueのコンポーネント内ではコンポーネントの画面で使う情報だけを扱い、APIからデータを取得する部分は全てVuexに委譲するのが良いよ

- コンポーネント横断で状態を保持してしまうと、インプットとアウトプットがごちゃごちゃになり破綻してしまう
- props は深く入れ子になったコンポーネントには渡すの面倒で、兄弟には渡せない
- 親子のインスタンスを直接参照したり、イベントを介して複数の状態のコピーを変更、同期することはやってはいけないよ
- ストアパターン
    - 小規模なアプリであればこれでOK

```jsx
// 単純ストアパターン
var store = {
  debug: true,
  state: {
    message: 'Hello!'
  },
  setMessageAction (newValue) {
    if (this.debug) console.log('setMessageAction triggered with', newValue)
    this.state.message = newValue
  },
  clearMessageAction () {
    if (this.debug) console.log('clearMessageAction triggered')
    this.state.message = ''
  }
}
```