OmniAICreator/Qiita-1.07M huggingface dataset:
【GIS】Pythonでラスタ画像上の任意地点の値を拾う

# やりたいこと
ラスタ画像上で任意地点の座標を指定して，値を拾うってのをやります．多少語弊があるかもしれませんが，QGISでいうところのPoint Sampling Toolみたいなやつですね．
今回は，国土数値情報の土地利用細分メッシュを用いて，指定した座標の土地利用の画素値をサンプリングしてみます．

# 使用ライブラリ
今回使うデータがGeoTiff形式のラスタデータなので，読み込みにみんな大好きGdalを使います．
インストールは以下のコマンドでできます．

pipの人

```console
pip install GDAL
```
condaの人

```console
conda install -c conda-forge gdal
```

# 使用データ
繰り返しになりますが，国土数値情報の土地利用細分メッシュを使います．今回は四国周辺の2014年度版のものを使ってます．
以下のリンクからダウンロードできます．

[国土数値情報>土地利用細分メッシュ（ラスタ版）](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-L03-b_r.html)

# プログラム全体

```python
from osgeo import gdal
import numpy as np

file_path = './input/landuse.tif'

ds = gdal.Open(file_path)

lu = ds.ReadAsArray()

Xsize = ds.RasterXSize
Ysize = ds.RasterYSize

x_min, x_res, rtn_x, y_max, rtn_y, y_res = ds.GetGeoTransform()

x_max = x_min + Xsize * x_res
y_min = y_max + Ysize * y_res

lon_tick = np.arange( x_min, x_max, x_res )
lat_tick = np.arange( y_max, y_min, y_res )

lon, lat = np.meshgrid(lon_tick, lat_tick)


p_lon = 133. + 32.9/60
p_lat = 33. + 34./60

dist = ( lon - p_lon )**2 + ( lat - p_lat )**2

mindist = np.min(dist)

p_index = np.where( dist == mindist )
p_lu = lu[p_index]

print(p_lu)

```

# 説明

## 値の拾い方

任意地点の座標値を起点に，全画素までの距離を測り，その大きさが最小になる地点の画素値を拾うというアイデアです．

## ライブラリのインポート

```python
from osgeo import gdal
import numpy as np
```

## データの読み込み，必要な情報の取得

```python
file_path = './input/landuse.tif'

ds = gdal.Open(file_path)
```
まず，gdalのOpenでGeoTiff画像を読み込みます．

```python
lu = ds.ReadAsArray()

Xsize = ds.RasterXSize
Ysize = ds.RasterYSize

x_min, x_res, rtn_x, y_max, rtn_y, y_res = ds.GetGeoTransform()
```
上から順に，データの配列化，水平・鉛直方向の画素数，各種座標値を取得します．
GetGeoTransformでは，左から順に，始点端経度（最小経度），水平解像度，回転，始点端緯度（最大緯度），回転，鉛直解像度を取得できます．この時，鉛直解像度は負の値になることに注意してください．

```python
x_max = x_min + Xsize * x_res
y_min = y_max + Ysize * y_res

lon_tick = np.arange( x_min, x_max, x_res )
lat_tick = np.arange( y_max, y_min, y_res )

lon, lat = np.meshgrid(lon_tick, lat_tick)
```
取得した座標値から，最大緯度，最小経度を求めます．
画像の４隅の座標がわかったので，これと縦横の解像度から，緯度，経度のメッシュを作成します．

## 値を拾う
### 座標の入力
``` python
p_lon = 133. + 32.9/60
p_lat = 33. + 34./60
```
### 任意地点から全画素までの距離を測る
```python
dist = ( lon - p_lon )**2 + ( lat - p_lat )**2
```
中学数学でやる距離の公式です．ほんとは平方根取らないとちゃんとした距離にならないですが，大きさを比較するだけなので今回は平方根取ってません．

```python
mindist = np.min(dist)

p_index = np.where( dist == mindist )
p_lu = lu[p_index]

print(p_lu)

>>> [70]
```
距離の最小値を求め，それに当たるインデックスを取得します．最後に，土地利用の画像上で取得したインデックスを指定することで，指定した座標の画素値を取得できます．
ちなみに今回は画素値として70という値が取得できました．対応表でチェックしてみると，「建物用地」みたいです．

# 注意点
指定した地点が隣り合う画素のど真ん中にある時など，距離の最小値が２つ以上ある時は困ります．特に今回のように画素値が離散的な値の時は，どの値を選べばいいか問題が発生することもあります．（なかなかそんなことは起きないけど）
ぼくの場合は画素値が連続値（気温とか標高値とか）の場合は，平均とったりしています．理屈上あり得る問題なので注意してください．
3.20(難) ガンマ分布2

## 方針

3.19とほとんど同じ問題．

## 答案

```math
\begin{align}
P[Y\geq \lambda]&= \int_\lambda^\infty\frac{1}{\Gamma(x)}y^{x-1}\exp(-y)dy\\
&= \frac{1}{(x-1)!}\int_\lambda^\infty y^{x-1}\exp(-y)dy\\
&= \frac{1}{(x-1)!}\int_\lambda^\infty y^{x-1}\{-\exp(-y)\}'dy\\
&= \frac{1}{(x-1)!}\{\left[-y^{x-1}\exp(-y)\right]_\lambda^\infty+\int_\lambda^\infty(x-1)y^{x-2}\exp(-y)dy\}\\
&= \frac{\lambda^{x-1}}{(x-1)!}\exp(-\lambda)+\frac{1}{(x-2)!}\int_\lambda^\infty y^{x-2}\exp(-y)dy\tag{1}
\end{align}
```

ここで，

```math
P_{x-1}=\frac{1}{(x-1)!}\int_\lambda^\infty y^{x-1}\exp(-y)dy
```

とおくと，

```math
\begin{align}
P_0&= \int_\lambda^\infty\exp(-y)dy\\
&= \left[-\exp(-y)\right]_\lambda^\infty\\
&= \exp(-\lambda)\\
&= \frac{\lambda^0}{0!}\exp(-\lambda)
\end{align}
```

したがって．(1)より，

```math
\begin{align}
P[Y\geq\lambda]&= P_{x-1}\\
&= \frac{\lambda^{x-1}}{(x-1)!}\exp(-\lambda)+P_{x-2}\\
&= \frac{\lambda^{x-1}}{(x-1)!}\exp(-\lambda)+\frac{\lambda^{x-2}}{(x-2)!}\exp(-\lambda)+P_{x-3}\\
&\vdots\\
&= \frac{\lambda^{x-1}}{(x-1)!}\exp(-\lambda)+\frac{\lambda^{x-2}}{(x-2)!}\exp(-\lambda)+...+\frac{\lambda^0}{0!}\exp(-\lambda)\\
&= \sum_{k=0}^{x-1}\frac{\lambda^x}{k!}\exp(-\lambda)\\
&= P[X\leq x-1]
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
class内関数で可変長配列*argsとselfを使った際のエラー

## 問題
クラス内で```def sample(self, *arg)```を定義した際に以下のようにselfが引数として扱われてしまう。


```python
class Sampleclass:
    def sample(self, *args):
        print(args)
x = Sampleclass
x.sample(1, 2, 3)
```
```
>>> (2, 3)
```

## 解決方法
上の4行目でxにインスタンスを代入する際に()が抜けてました、、、
```x = sampleclass()```のようにすれば解決しました。初歩的すぎるけど()がなくても動いてしまうだけに引っかかってしまう人がいるかもしれないですね。


```python
class Sampleclass:
    def sample(self, *args):
        print(args)
x = Sampleclass()
x.sample(1, 2, 3)
```
```
>>> (1, 2, 3)
```


#### 追記

指摘いただいたようにクラス名の先頭を大文字に変更しました。
pythonのクラスについては追々勉強していきたいと思います。
ゴミ箱が開けなくなるほどファイルをいっぱい削除してしまい、ゴミ箱の中を空に出来なくなったときの対処法

## 何故このようなことが起きたか
ドライブファイルストリームを利用して、windowsローカルでGドライブとしてGoogleドライブにアクセスできる状態で、逼迫している状態だったので、
とある階層の中のそれぞれのフォルダの中のzipファイルとcsvファイルが不要なので、削除しようということになった。

でも、手動で一個一個やると日が暮れるので、自作でシェルを作って実行した。

そして、ゴミ箱開こうとすると、以下のように一切進まなくなった。1日中変わらない。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/5f8d0d26-27bb-178a-ed14-04002b1839ed.png)


## 解決方法
コマンドプロンプトを開いて、以下のコマンドを実行

```
rd /s c:\$Recycle.Bin
```

すると、Cドライブの容量が増えたことを確認できた。


## これで終わりじゃなかった。ゴミ箱の中は消せたけど、ゴミ箱が開けないまま。。。
ゴミ箱の中は消せるようになったので、仕事はこの後もなんとかなるけど、
ゴミ箱を開けないまま変わらない。再起動したら1度は開けるが、2度目開こうとすると、
また、さっきの読み込み中のまま開けない。

・・・なんでなん？(エセ関西弁)

## 感想
ゴミ箱たまりすぎるとこういうことになるって知らなかったので、
次新規で支給されるPCからは定期的に消していこうと思った。
より正確な空気の屈折率のメモ

## 背景

物理的により正確な光学シミュレーションをしたい.

空気(air)は屈折率(ior, index of refraction) 1.0 にすることが多いが, 物理的には気圧や温度で変化する.

## 式などの情報

https://refractiveindex.info/?shelf=other&book=air&page=Ciddor

P. E. Ciddor. Refractive index of air: new equations for the visible and near infrared, Appl. Optics 35, 1566-1573 (1996)

## 実装

上の refractiveindex.info でリンクされているもの.

https://github.com/polyanskiy/refractiveindex.info-scripts/blob/master/scripts/Ciddor%201996%20-%20air.py

および batoid(C++ backed optics ray tracer)が参考になります.

https://github.com/jmeyers314/batoid/blob/7b03d9b59ff43db6746eadab7dd58a463a0415c3/src/medium.cpp#L202
Azure ADB2Cの認証画面にあるキャンセルボタンを消す設定方法

# 

- キャンセルボタン消したいけど、カスタムポリシーのどこをいじればいいんだ！というときに役立つ備忘録

- 参考：https://stackoverflow.com/questions/60403329/b2c-custom-policies-add-a-cancel-button-to-the-sign-in-page

## 追加するプロパティ

サンプルのカスタムポリシー内などでサインインやサインアップを行うテクニカルプロファイルがあると思います。  
そこの<MetaData>内にて👇のプロパティを追加してください。  

```xml
<Item Key="setting.showCancelButton">false</Item>
```

これで消えます。

## テクニカルプロファイルのリファレンス等

- [公式Document](https://docs.microsoft.com/en-us/azure/active-directory-b2c/self-asserted-technical-profile#metadata)ありました。
  - いろいろあるので、そのうち実際に使って理解したい
Google Sheets からjsonを取得

#v3からv4へ移行に伴い廃止された？ため別の方法で取得

##新方法
```html
https://docs.google.com/spreadsheets/d/{スプレッドシートID}/gviz/tq?gid={シートid}
```

##旧方法
```html
https://spreadsheets.google.com/feeds/cells/{スプレッドシートID}/{ワークシートID}/public/values?alt=json
```
正規表現とは？


正規表現とは端的に言うと、**`「いくつかの文字列を一つの形式で表現するための表現方法」`**です。

####メタ文字
「正規表現」には「メタ文字」と呼ばれる特殊な文字があります。この「メタ文字」を使って、複数の文字列をまとめて表現できます。

####メタ文字の種類

#####文字の種類
どの「文字の種類」が使われているかを指定するメタ文字です。

|メタ文字 |意味  |備考  |
|---|---|---|
|.  |すべての文字 |改行は除く  |
|[125] |1，2，3のどれか  |  |
|[0-9]  |数字  |[0123456789] と同じ |
|[a-z]  |アルファベット小文字  |  |
|[A-Z]  |アルファベット大文字 |大文字と小文字を区別しない方法もある  |
|[0-9a-z] |数字またはアルファベット小文字  |  |
|[^0-9]  | 0~9以外の文字 | ＾はいわゆる論理演算の否定「not」|
|[ぁ-ん]  |ひらがな  | |
|ァ-ヴ|カタカナ |  |
|[ｦ-°] |半角カタカナ  |最後は半角の半濁音「°　」  |

#####繰り返し
文字の「繰り返し」を指定するメタ文字です。

|メタ文字 |意味  |備考  |
|---|---|---|
| * |0回以上繰り返す |+との違いを使い分けよう | 
| +|1回以上繰り返す |*との違いを使い分けよう | 
| ?| 0回または1回| | 
| ｛5｝|5回繰り返す | | 
| ｛5,｝|5回以上繰り返す | | 
| ｛5,9｝| 5回以上9回以下繰り返す| | 


#####位置（先頭・末尾など）
文字列がどの「位置」にあるかを指定するメタ文字です。

|メタ文字 |意味  |備考  |
|---|---|---|
| ＾ |先頭 |[]内では否定の意味になるので注意 | 
| ＄|末尾 | | 
| ¥b| 単語境界|単語の末尾や先頭のこと | 
| ¥B|単語境界以外のこと| | 

####まとめ
正規表現に関するすべての知識をカバーしたわけではありませんが、
今回紹介したメタ文字については、比較的簡単で使いやすいものです。他にもエスケープ文字や選択文字、キャプチャなど種類が多くあります。<br>
メタ文字について詳しくまとめてある参考記事はこちらになります。
（https://at.sachi-web.com/blog-entry-1150.html）
Raspberry Pi Python on pyenv + NodeJS + VNC using noVNC

# 経緯
以前から音楽再生用としてアンプの上に置き、LANのどこからでもアクセスして音楽を流すことが出来たRaspberry PiのSDカードが壊れたので、再構築。　swapを利用しない方法は他の方の記事を参照し、次は壊れないといいな…
ぱっと見Web上でRaspberry Piのデスクトップが操作できる感じになります。

ネット上に無数にPython環境やNodeJS環境をインスコする情報は転がっているが、なかなか最新のものが出てこないので備忘として。
~~2021年7月中旬～8月中旬~~ 2022年6月末くらいの『最新』情報です。

# 用意するもの
- Raspberry Pi 4B 一式
- 64Bit版Raspberry Pi OSイメージ　今回は ~~21年5月~~ 22年4月 公開のもの

# サーバー構築
#### 1.microSDにRaspberryPiOSを焼き上げる。
今回はノーマル版だがLiteでやってもやることは同じ
```sudo raspi-config```
ホストネームでアクセスしたいので、ホストネームを「radiberrypi」にする。ラジオ再生用なので。
SSH有効化。

#### 2.Pythonたくさん使いそうだからPyenv入れる。
```sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev```
```git clone https://github.com/yyuu/pyenv.git ~/.pyenv```


~/.profileに
```
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
```
を追記し、PATH通す。
`source ~/.profile`
で再読み込み。

`pyenv install --list`
リストからなるべく最新に近いrcとdev以外のやつ
今回は3.10.5をインスコする。
```pyenv install 3.10.5```
結構時間かかる。心配しないように。
`pyenv rehash`
`pyenv global 3.10.5`
```python --version```
これでPython 3.10.5と表示されればOK

#### 3.NodeJSを入れる。Python新しいのにしたし、これも新しめがいいな…
`curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -`
`sudo apt install nodejs`
でサクサクっと最新版。14.19.3が入った。
npmも勝手に入る。6.14.17が入ってた。

#### 4.次にVNC、noVNCをインスコする。
Raspberry Pi OS標準のRealVNCを利用し、noVNC利用する。

noVNCを導入。aptだと若干古いバージョンをインスコしてしまうため、gitで直接持ってくる。
```sudo git clone https://github.com/novnc/noVNC```

websockifyは 出来上がった/noVNC/utilsの中 novnc_proxyを実行する際にはいっていないと勝手にインストールしてくれる。便利。

```cd /ダウンロードした場所/noVNC/utils/```
```sudo ./novnc_proxy```
一度起動して、Ctrl + C で終了する。

#### 5.vncのパスワードを決定し、CERTを設定し、VNCを起動した後にnovnc_proxyを起動する。
```vncpasswd```
```cd /etc/ssl```
```sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout novnc.pem -out novnc.pem -days 365```
名前とかメアドとか組織名とか入力したりしなかったり
```sudo chmod 644 novnc.pem```

#### 6.試しに起動
`cd /ダウンロードした場所/noVNC/utils/`
`sudo ./novnc_proxy --cert /etc/ssl/novnc.pem`

次に違う端末のWebブラウザで
https://[ラズパイのホスト名 or IPアドレス]:6080/vnc.html
今回はhttps://radiberrypi.local:6080/vnc.html

にアクセスし、VNCパスワードを入力したらWebブラウザ上でラズパイが動いているような感じに。

参考画像
![スクリーンショット 2022-06-29 151234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513230/c233a1f3-8b0c-5afc-5c65-30c711325add.png)

![スクリーンショット 2022-06-29 151357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513230/c076f9c9-970c-49dd-17f6-ddde61134f5d.png)


#### 7.サービス化
novnc.shというファイルを作成

```bash:novnc.sh
#!/bin/bash

sudo /home/shinshu/noVNC/utils/novnc_proxy --cert /etc/ssl/novnc.pem
```
`sudo chmod 755 novnc.sh`
で権限付け、

次に/etc/systemd/system/novnc.serviceを作成
```service:/etc/systemd/system/novnc.service
[Unit]
Description=Run vnc and novnc

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/[novnc.sh保存した場所]
ExecStop=sudo vncserver -kill :1 && killall websockify
Restart=always
RestartSec=10


[Install]
WantedBy=multi-user.target
```
保存できたら、
`sudo systemctl daemon-reload`
`sudo systemctl enable novnc.service`
`sudo systemctl start novnc.service`
これでウェブブラウザから先程のリンクをクリックして無事に起動できているかどうかを確認する。

# 2022年6月末更新
pyenvの使い方完全にミスってたり
各所のバージョンが少し新しくなってたりしたので実際に試しながら復習しました。
ディスプレイあってもなくてもウェブブラウザ1つでアクセスしてリモートコントロールできるのは強みかと思います。
家中どこからでもラズパイを操作できます。
Go言語(Golang)のチートシート 型、演算子、エスケープシーケンスまとめ

Go言語の型、演算子、エスケープシーケンスをまとめました。

## 組込み型一覧

### 符号あり整数

| 型名 | 概要  |
| --- | --- |
| **基本型** | |
| string | 文字列。「"」で囲んで表現する。 |
| bool | 真偽値(true/false) |
| **nビット符号あり整数** | |
| int8 | -128~127 |
| int16 | -32,768~32,767 |
| int32 | -2,147,483,648~2,147,483,647(約-21億~21億) |
| int64 | -9,223,372,036,854,775,808~9,223,372,036,854,775,807(約-922京~922京) |
| int | システム依存サイズの符号あり整数。32ビットシステムなら32ビットだが、int32やruneとの互換性はない(代入できない)。 |
| rune |32ビット符号あり整数(int32のエイリアス)。Unicodeの1文字を格納する。「'」で囲んで表現する。runeは文字の意。 |
| **nビット符号なし整数** | |
| uint8 | 0~255 |
| uint16|0~65535 |
| uint32 | 0~4,294,967,295(0~約43億) |
| uint64 | 0~18,446,744,073,709,551,615(0~約1845京) |
| uint | システム依存サイズの符号なし整数。 |
| uintptr |システム依存サイズの符号なし整数。ポインタの値を格納する。 |
| byte | 8ビット符号なし整数(unit8のエイリアス) |
| **その他の数** | |
| float32/float64 | nビット浮動小数点 |
| complex64/complex128 | nビット複素数 |

## 演算子

算術演算子の四則演算、比較演算子、は他の言語と同様のため省略

| 演算子 | 概要 |
| --- | --- |
| **論理演算子**||
|&&|AND条件|
|&#124;&#124;|OR条件|
|!|否定。trueとfalseを反転。|
|**代入演算子**||
|=|値の代入|
|:=|変数の定義と値の代入|
|**送信演算子**|※チャネルから値の送受信で利用|
|ch <- x|右辺の値(x)を左辺のチャネル(ch)へ送信|
|x = <-ch|右辺のチャネル(ch)から値をxに受信|
|**算術演算子(ビット演算)**|※a [演算子] bの形で利用|
|&|論理積(AND)。※左辺と右辺の各ビットの論理積を算出。|
|&#124;|論理和(OR)|
|^|排他的論理和(XOR)|
|&^|論理積の否定(AND NOT)|
|<<|左シフト演算。右辺の値だけ左辺を算術左シフトする。|
|>>|右シフト演算。右辺の値だけ左辺を算術右シフトする。|
|**アドレス演算子**|※[演算子]aの形で利用|
|&|右辺の変数のアドレスを取得|
|*|右辺の変数に格納されたアドレスを解決|

### 演算子の優先順位

|優先度|演算子|
|---|---|
|5|*、/、%、<<、>>、&、&^|
|4|+、-、&#124;、^|
|3|==、!=、<、<=、>、>=|
|2|&&|
|1|&#124;&#124;|

## エスケープシーケンス

|文字|概要|
|---|---|
|\t|タブ|
|\n|改行|
|\\\|バックスラッシュ|
|\'|シングルクォート。文字列リテラル内では使用不可。|
|\"|ダブルクォート。ルーンリテラル内では使用不可。|
|\b|バックスペース|
|\r|キャリッジリターン(カーソルを先頭へ戻す)|
|**使う機会なさそう**||
|\a|ベル|
|\v|垂直タブ|
|\f|フォームフィード(紙送りをして、次の用紙の先頭から印刷)|

## おわりに

素敵なGoライフを！
Git Diff Indicator in the Gutter (Editor Margin)

## だめだ

　もうだめだ、どうしても機能名を忘れてしまう。書いておこう。

アプリケーション|機能名
---|---
Visual Studio Code|[Git Gutter Indicator](https://www.exceedsystem.net/2020/11/25/how-to-hide-gutter-indicator-on-vscode/)
Visual Studio|[Git Diff Margin](https://marketplace.visualstudio.com/items?itemName=LaurentKempe.GitDiffMargin)
NetBeans|[拡張機能 "Git"](https://netbeans.apache.org/kb/docs/ide/git_ja.html#_ソースエディタでの変更の表示)
Eclipse|[Quick Diff](http://wiki.eclipse.org/EGit/User_Guide/State)
IntelliJ IDEA|[VCS / Editor Gutter](https://www.jetbrains.com/help/idea/file-status-highlights.html#editor)
Cloud Monitoring における SLO の作成

#はじめに
Cloud Monitoring を使って SLO を作成することができるのですが、事前知識がないとちょっと理解しずらいと感じたため、自分の頭を整理する目的で本記事を書きました。

# SLOについて
SLO は、SLI に対して具体的なゴール設定と計測期間を定義したものです。
計測期間は、開発スプリントに合わせやすため7の倍数にすることが多いです。(28日など)
計測期間には2つの考え方があります。Rolling windowとCalendar-aligned windowです。Cloud Monitoring では、Compliance periodとして設定します。設定方法は後述します。
参考：https://sre.google/workbook/implementing-slos/

## Rolling window
通常の運用においてよく使用されるのは、Rolling windowになります。こちらは、時間が経過するにつれて、計測期間も移動していきます。つまり、時間が経過するほど、基本的にエラーバジェットが回復していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/23028f36-28c9-51df-3e74-d9d6c7e8cd3e.png)

## Calendar-aligned window
Calendar-aligned window は、時間枠は固定になります。つまり、任意の時間が経過するとエラーバジェットの消費が０にリセットされます。用途としては、４半期ごとの評価時等に使用されます。

## Request-based と windows-based
計測期間の次には、評価方法を決定します。評価方法には、Request-based と windows-basedが存在します。
参考：https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/ui/create-slo#sli-type

Request-based は、一定期間におけるリクエストの合計数に対する評価条件を満たすリクエストの数を測定します。

例）
例)
期間：7日間
目標とする可用性: 99%
想定RPS: 10rps
総リクエスト数(100%): 6,048,000 リクエスト
良いリクエスト(99%): 5,987,520 リクエスト
エラーバジェット(1%): 60,480 リクエスト

Window-based は、時間枠ベースの評価では、評価対象期間全体に対して良好さの基準を満たす評価期間の数を測定します。つまり、時間ベースで計算します。

例)
期間：7日間
目標とする可用性: 99%
時間枠: 5分
任意の時間枠における良いイベントの閾値: 99% *5分以内に発生したイベントの内99%が良いイベントであればこの5分は条件を満たすことになる
総時間(100%): 604,800 秒
良い時間(99%): 598,752 秒
エラーバジェット(1%): 6,048 秒

重要な点としては、Window-basedは、夜間帯などリクエスト数が少ない場合に、エラーが発生した際の影響が大きくなる傾向にあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/76747d16-ce49-c4c3-3184-aefe96c852a9.png)

ここまでの話を図にすると以下のようなイメージになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/cfe9737c-7b4c-6cc2-c183-77f4b386269f.png)

# Compliance period(コンプライアンス期間)の設定
Compliance periodは、Cloud Monitoringでは以下の画面で設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/b779616c-d02b-ef0f-651a-8c335a6f05b8.png)

# Request-based と windows-basedの設定
評価方法は、Cloud Monitoringでは以下の画面で設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/7b79403a-b757-dbdb-5e3f-e7e9fdef90d3.png)
【第11章】Railsチュートリアルで手が止まった箇所まとめ（unless、cloud9のホスト名、gitのトークンパスワード)

[Railsチュートリアル第11章(第6版)](https://railstutorial.jp/chapters/account_activation?version=6.0#cha-account_activation)で、少し悩んだ点を挙げる。

#①－11.2.2送信メールのプレビュー－ にて
■クラウドIDEのホスト名は、IDEのメニューからPreview > Preview Running Applicationで表示した画面のURLに表示される。
参考：https://teratail.com/questions/125713

#②－11.3.3.演習３－ にて
■unless文はif分の反対で、falseであるときに実行する。
参考：https://www.sejuku.net/blog/75155

#付記：いつも通りgitにpush出来なくなった
『2021年8月13日から、ローカルからGithubにアクセスする際にパスワードではなく、個人アクセストークンが必要になった』らしい。
以下を参考にトークンを作成してアクセスできた。
参考：https://ios-docs.dev/20210813support-for-password/
PhpStorm ビルトインWebサーバーで実行する 

# PhpStorm ビルトインWebサーバーで実行する

### 1.phpのダウンロード

[ここからダウンロード](https://www.php.net/downloads)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654540/5a3239b0-40df-f718-9ce8-0782115d1e03.png)](https://www.php.net/downloads)

windowsのダウンロードをクリックすると、以下のページが表示されるので自分のPC環境に合わせてダウンロードする。64bitの場合はマークの場所からダウンロードする。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654540/e7706ce1-b1a8-ac29-ca2b-e5bc15e5afba.png)](https://windows.php.net/download#php-8.0)

zipファイルを自分の好きな場所に解凍し、

- php.ini-development(開発サーバ用php.iniのサンプルファイル)
- php.ini-production(公開サーバ用php.iniのサンプルファイル)

のどちらか好きなほうを**php.ini**に書き換える。

### 2.PhpStormの設定

1. 設定画面を開く。

1. PHP language levelの欄を先ほどダウンロードしたバージョンに設定して青で囲ったボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654540/b2c6d1f5-656c-c957-9844-01ef946a0047.png)

1. 赤で囲ったPHP executableのところに解凍したファイルの場所を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654540/ba423a29-2c1c-524d-9c34-e66b049fb29d.png)

1. 元の設定画面に戻り、左上の＋ボタンを押して表示されるものを選択する。
![2021-08-24 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654540/84a2a5f9-9cdb-8f12-72d9-52ea149a0d7e.jpeg)

### 3.準備完了→実行

コードを書き、赤枠で囲ったアイコンを押すと実行結果が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654540/7b1899c0-e972-f31d-0c73-e115070838ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654540/6d1c5a24-da87-6c14-ede3-60a5054a3502.png)
ROSノードをターミナル上の複数タブで一斉に開く方法

# はじめに
いつもROSノードを複数起動させる時は以下のようなbashファイルを作って使用していたが、これだとターミナルがノードの数だけ立ち上がってしまうという問題があり解決方法が見つからず困っていた。

```bash
#!/bin/bash
gnome-terminal -- roslaunch test test1.launch
gnome-terminal -- roslaunch test test2.launch
```

stack overflowで何かないか探していたらちょうどいいものがあったのでこれを参考に改善を試みる。
[Opening new gnome-terminal (v3.28+) with multiple tabs and different commands](https://stackoverflow.com/questions/52764599/opening-new-gnome-terminal-v3-28-with-multiple-tabs-and-different-commands)

# 方針
* bashスクリプトを起動するとターミナルが1つ立ち上がる。
    * ROSノードはそのターミナル上で新しいタブを作成してその中で起動する。
    * 複数ノード起動する場合はその度に新しいタブを作成する。
* 作成されたタブはROSノード終了後も開いた状態を継続できるようにする。
    * 作成されたタブは何も手当をしないとROSノード終了後に閉じてしまう。異常終了等の原因究明をするためには開いた状態を継続して欲しい。

# 環境
* Ubuntu 18.04

# 実装・使用方法
次のような2つのファイルを用意する。


```bash:run.bash
#!/bin/bash

# 新しいターミナルを最大化して立ち上げその中でlaunch_ros_node.bashを起動する。
gnome-terminal --window --maximize -- bash launch_ros_node.bash
```

```bash:launch_ros_node.bash
#!/bin/bash

# 新しいタブ"Tab 1"を作成しその中でROSのlaunchファイルを起動させる。
gnome-terminal --tab -t "Tab 1" --  roslaunch test test1.launch
# 連続でタブが立ち上がると正常に起動できない場合があるので適当にsleepを入れる。
sleep 1
# "Tab 1"はROSノードが終了すると自動的にタブも終了するが、以下のような記述をするとROSノード終了後もbashが立ち上がるのでタブはそのままとなる。
gnome-terminal --tab -t "Tab 2" -- bash -c "roslaunch test test2.launch; bash"
```
launch_ros_node.bashに起動したいROSノードを記載してrun.bashを起動すれば、上記例の場合1つのターミナルが立ち上がり2つのタブでROSノードがそれぞれ起動する。
laravel sailで作成したmysqlコンテナにログインできない対処

# 起こった問題

mysqlコンテナに入り、ターミナルから`mysql -u root`でログインしようとしたところ下記のようなエラー

```
ERROR 1045 (28000): Access denied for user 'root'@'localhost'
``` 

ログインできない・・・！
# 解決策

以下で対応し、解決しました。

```
$ mysql -u root -p -h 127.0.0.1 -P 3306
```

- コマンドオプション説明　　　　
  
  - `-p`:パスワード指定
  - `-h`:host名を指定 　
  - `-P`:ポート番号を指定

デフォルトでホスト名がlocalhostになっていたことから、ログインができなかった模様。
localhostで設定されていると、おそらくコンテナ内でlocalhostを探してしまっているのだと思われます。
よって、IPアドレスで指定したことで解決。
ちなみに、ポート番号はお使いの環境によって違うと思いますので、`docker-compose.yml`などを参照してください。

- 参考

<https://teratail.com/questions/139019>
異なるバージョンの Xcode をインストールするときはブラウザではなく Xcodes.app を使おう！

# はじめに

Xcode をインストールする時は Safari を使え！と思っていましたが、 [Xcodes.app](https://github.com/RobotsAndPencils/XcodesApp) というアプリがあるらしく、そちらの方が便利だと教えていただきました。
使ってみたらとても便利だったのでご紹介します。

https://twitter.com/rizumita/status/1430003762781851684?s=20

# Xcodes.app について

こちらが GitHub のリポジトリです。
[RobotsAndPencils/XcodesApp: The easiest way to install and switch between multiple versions of Xcode - with a mouse click.](https://github.com/RobotsAndPencils/XcodesApp)

> The easiest way to install and switch between multiple versions of Xcode.

複数のXcodeのバージョンを管理するのに適したアプリのようです。

### インストール方法

#### Homebrew 

```
brew install --cask xcodes

# These are Developer ID-signed and notarized release builds and don't require Xcode to already be installed in order to use.
```

#### zip をダウンロード

以下のリンクの zip ファイルをダウンロードしたらすぐに使えます。
[Release 1.1.0 (7) · RobotsAndPencils/XcodesApp](https://github.com/RobotsAndPencils/XcodesApp/releases/tag/v1.1.0b7)

# 今までのインストール方法

### Safari でインストールして Xcode を使う

1. Apple Developer Program から Xcode 最新版のダウンロードリンクを探す
1. ダウンロードする（めちゃくちゃ時間かかる）
1. 失敗したらまたダウンロードする
   ※Safari だとほぼ失敗しないのでおすすめ
1. ダウンロードが終わったら解凍する（時間かかる）
1. .zip は不要なのでゴミ箱へ
1. Xcode の名前が被らないように `Xcode_13.0beta5` のように変更する
1. アプリフォルダに Xcode を移動させる
1. 終わり


# これからのインストール方法

### Xcodes.app を使ってインストール

1. 必要な Xcode のバージョンの `INSTALL` を押す
1. 終わり

※初回インストールは AppleID の登録や、パスワード入力があります

### 使い方

画像の `INSTALL` ボタンを押すだけ。とても簡単ですね！

![CleanShot 2021-08-24 at 12.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/37ec612e-37a4-c084-7cf2-31281a798cee.png)

OPEN を押すと、ちゃんとインストールできていることがわかります。
これは便利だ。。。

![CleanShot 2021-08-24 at 12.55.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/79ccfe6d-e8a5-7632-4099-49c8f8bb6a32.png)


# さいごに

こんな便利なツールがあるなんて知らなかったです！
教えていただいて本当に感謝！

次回からのインストールが劇的に便利になりました。
これからは　Xcodes.app を使ってインストールしていきます！
【Golang】テスト実行中にメッセージを表示させる【テストの進捗表示】

> テスト中、API などのリクエスト過多を防ぐために `Sleep` させたり、重い処理が始まったなど、**テスト実行中に、その旨をユーザに知らせたい**。

:::note info
<sub><sup><a href="https://www.google.com/search?q=%22golang%22+%E3%83%86%E3%82%B9%E3%83%88%E4%B8%AD%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B" target="_blank">「"golang" テスト中にメッセージを表示させる」でググって</a>も、ピンポイントで見つからないので自分のググラビリティとして。</sup></sub>
:::

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

1. 重い処理や `Sleep` 実行前に `t.Log()` する。
2. テスト実行時に `-v` を付けて実行する。（`go test -v ./...` など）
2. [Go v1.14 から対応](https://go-review.googlesource.com/c/go/+/242057/)している。

## TS; DR

```go:テスト実行時にオプション-vを忘れないこと
package main

import (
	"testing"
	"time"
)

func TestFoo(t *testing.T) {
	t.Parallel()

	t.Logf("重い処理を開始します:%v", t.Name())
	for i := 0; i < 15; i++ {
		time.Sleep(1 * time.Microsecond)
	}
}

func TestBar(t *testing.T) {
	t.Parallel()

	t.Logf("重い処理を開始します:%v", t.Name())
	for i := 0; i < 15; i++ {
		time.Sleep(1 * time.Microsecond)
	}
}

func TestBaz(t *testing.T) {
	t.Parallel()

	t.Logf("重い処理を開始します:%v", t.Name())
	for i := 0; i < 15; i++ {
		time.Sleep(1 * time.Microsecond)
	}
}

// Output:
// === RUN   TestFoo
// === PAUSE TestFoo
// === RUN   TestBar
// === PAUSE TestBar
// === RUN   TestBaz
// === PAUSE TestBaz
// === CONT  TestFoo
//     prog.go:11: 重い処理を開始します:TestFoo
// === CONT  TestBaz
//     prog.go:29: 重い処理を開始します:TestBaz
// === CONT  TestBar
//     prog.go:20: 重い処理を開始します:TestBar
// --- PASS: TestBaz (0.00s)
// --- PASS: TestBar (0.00s)
// --- PASS: TestFoo (0.00s)
// PASS
```

- [オンラインで動作をみる](https://play.golang.org/p/T5ci0YYwhrf) @ GoPlayground

## 参考文献

- Issue #24929: "[testing: stream t.Log output as it happens](https://github.com/golang/go/issues/24929)" | go | golang @ GitHub
- Fix: [[release-branch.go1.14] testing: "reformat test chatty output"](https://go-review.googlesource.com/c/go/+/242057/) | CL 242057 | review  @ googlesource.com
- ["go test -v streaming output"](https://dave.cheney.net/2020/03/10/go-test-v-streaming-output) @ dave.cheney.net
- ["How do you print in a Go test using the “testing” package?"](https://stackoverflow.com/questions/23205419/how-do-you-print-in-a-go-test-using-the-testing-package) @ StackOverflow
SQL CASEを使って条件分岐させてみた


CASEで条件分岐させてDBから値を取得しようとした時に書き方がわからなくて
少し手こずったのでおさらい:writing_hand_tone1:
ちなみに元々のクエリ文はWHERE句のみ（ANDやORを使って）で
20行以上あったのが8行にまとまりました！
CASEすごい！便利:clap_tone1:

仕様：選択項目がすべての場合は全件取得、値が選択された場合はその値だけを取得する
DB：MariaDB


###まず、CASE式とは
プログラム言語にあるif文のような条件文をSQLでも書くことができる
それがCASE式です。
CASE式とはの説明がわかりやすい記事、参考にしたのはここ→https://qiita.com/sfp_waterwalker/items/acc7f95f6ab5aa5412f3




####WHERE句でCASEを使う

いろんなところにCASE式が書けるみたいですが私はWHERE句に書きました！


:::note info
構文
CASE
      WHEN [条件] THEN [条件を満たしたら表示する内容]
      ELSE [条件を満たしていなかったら表示する内容]
END
:::

```sql
SELECT * FROM table
WHERE
 CASE WHEN :value1<>'全て' THEN :value1=value1 ELSE 1=1 END
   AND
 CASE WHEN :value2<>'全て' THEN :value2=value2 ELSE 1=1 END
   AND
 CASE WHEN :date IS NOT NULL THEN STR_TO_DATE(date, '%Y%m%d') >= STR_TO_DATE(:date, '%Y%m%d') ELSE 1=1 END
   AND
 CASE WHEN :enddate IS NOT NULL THEN STR_TO_DATE(enddate, '%Y%m%d') >= STR_TO_DATE(:enddate, '%Y%m%d') ELSE 1=1 END"
```
:::note warn
条件をいくつも書きたい場合、ANDを使って書ける
:::

※ELSE 1=1　は全件取得

####書き方でわからなかったところ


:::note info
CASE
      WHEN [条件] THEN [条件を満たしたら表示する内容]
      ELSE [条件を満たしていなかったら表示する内容]
END
:::
CASEの構文はわかったがつなげて何個も条件分岐を書きたかったので、最初は　CASE〜ENDの中に全部条件を書いてしまった

:::note warn
失敗例１

CASE 
　WHEN :value1<>'全て' THEN :value1=value1
　WHEN :value2<>'全て' THEN :value2=value2
　WHEN :date IS NOT NULL THEN STR_TO_DATE(date, '%Y%m%d') >= STR_TO_DATE(:date, '%Y%m%d')
　WHEN :enddate IS NOT NULL THEN STR_TO_DATE(enddate, '%Y%m%d') >= STR_TO_DATE(:enddate, '%Y%m%d')
　 ELSE 1=1
END

:::

この状態だと、どれか条件にマッチした場合他の条件文を通らなくなってしまった


:::note warn
失敗例２

CASE 
　WHEN :value1<>'全て' THEN :value1=value1　ELSE 1=1
　WHEN :value2<>'全て' THEN :value2=value2　ELSE 1=1
　WHEN :date IS NOT NULL THEN STR_TO_DATE(date, '%Y%m%d') >= STR_TO_DATE(:date, '%Y%m%d')　ELSE 1=1
　WHEN :enddate IS NOT NULL THEN STR_TO_DATE(enddate, '%Y%m%d') >= STR_TO_DATE(:enddate, '%Y%m%d')　ELSE 1=1
END

:::
1行ずつWHEN [条件] THEN [条件を満たしたら表示する内容]ELSE [条件を満たしていなかったら表示する内容]
で書いてみたが構文エラー、下記のようにCASE〜ENDで囲われていないからかな？と思い‥

:::note info
CASE
      WHEN [条件] THEN [条件を満たしたら表示する内容]
      ELSE [条件を満たしていなかったら表示する内容]
END
:::

####私的な解釈、考え方

CASE ~ END は　if文でゆう　if（）{ }←ブロック（波括弧）に置き換えるとわかりやすい！

```sql
CASE WHEN :value1<>'全て' THEN :value1=value1 ELSE 1=1 END
```
↑この一文は↓のイメージ:bulb:（※このif文はあくまでイメージです。）

```
if(value1<>'全て'){
  :value1=value1
}else{
  1=1　
}
```
【AWS】プライベートサブネット内のEC2から、CloudWatch Agentを利用する

#はじめに
皆さんは CloudWatch Agent を利用し、EC2サーバー上のメトリクスやログを監視したことがありますでしょうか？
今回はプライベートサブネット内のEC2から、CloudWatch Agentを利用し、メトリクスやログをCloudWatchへ転送したい場合の利用手順を公開したいと思います。
なお、CloudWatch Agentのインストール仕方は、以前の記事で書いたことがありますので、下記の記事をご覧いただければ幸いです。

https://qiita.com/hyj624117615/items/5f9aefa545cfb5520b17

https://qiita.com/hyj624117615/items/2f2719fd34656e0df79e

#構成図
![名称未設定ファイル-ページ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/320f9c4b-6a1d-50c6-1a77-ceeb73a56150.png)

#エンドポイント
プライベートサブネット内のEC2から、CloudWatch Agentを利用し、メトリクスやログをCloudWatchへ転送したい場合は、エンドポイントの利用が必要となります。
結論から言うと、下記の三条エンドポイントを実装していただければと思います。
１．com.amazonaws.ap-northeast-1.monitoring
２．com.amazonaws.ap-northeast-1.ec2
３．com.amazonaws.ap-northeast-1.logs

#エンドポイントのポリシー
エンドポイントのポリシーは、AWS公式サイトを参考の上、下記まとめました。
まずは``com.amazonaws.ap-northeast-1.monitoring``のポリシーです。

>CloudWatch のエンドポイントポリシーの例を次に示します。このポリシーは、VPC を介して CloudWatch に接続するユーザーに対して、CloudWatch にメトリクスデータを送信することを許可し、他の CloudWatch アクションを実行することを禁止します。

```json
{
  "Statement": [
    {
      "Sid": "PutOnly",
      "Principal": "*",
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

参考URL：

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch-and-interface-VPC.html

次に```com.amazonaws.ap-northeast-1.logs```のエンドポイントのポリシーです。
>CloudWatch Logs のエンドポイントポリシーの例を次に示します。このポリシーでは、VPC を介して CloudWatch Logs に接続するユーザーはログストリームを作成してログを CloudWatch Logs に送信できますが、他の CloudWatch Logs アクションは実行できません。

```json
{
  "Statement": [
    {
      "Sid": "PutOnly",
      "Principal": "*",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

参考URL：

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html

最後は``com.amazonaws.ap-northeast-1.ec2``のポリシーです。
基本的には、私はこれをデフォルトポリシーとして使用しております。

#セキュリティグループ
セキュリティグループの内に入れるルールは、下記となります。
・プロトコル：HTTPS
・CIDR：VPCで使用しているCIDR

https://docs.aws.amazon.com/ja_jp/general/latest/gr/vpc-service.html

#参考
今回はClassmethodさんの記事が大変参考になりました。

https://dev.classmethod.jp/articles/private-cloudwatch-agent/
C言語　グローバル変数の正しい使い方

# グローバル変数の使い方

結論から言えば、使用する場所の1つで`定義`をして、ヘッダーファイルで`宣言`するのが良いようです。

## グローバル変数の規則



- 規則1 同名の strong symbol が複数存在してはならない。
- 規則2 同名の strong symbol と weak symbol が存在する場合、strong symbol を選ぶ。
- 規則3 同名の weak symbol が複数存在する場合は、任意の1つを選ぶ。 

## symbol のタイプ

この記事の範囲ではシンボルはグローバル変数のことだと考えても大丈夫です。

symbol のタイプ | 詳細
---            | ---
strong symbol  | 関数および、初期化済みグローバル変数 => `定義`( defined )
weak symbol    | 初期化されていないグローバル変数 => `宣言`( declared )

これは、ストレージが割当られているかで判断されています。

## グローバル変数の使い方

他の場所でstrong symbolとして`定義`されると意図しない値が設定されてしまう危険性があるため、使用したい場所で`定義`して、ヘッダーでexternで`宣言`しておきます。

ヘッダーでexternを使用する意義としては、明示的に`宣言`のみすることができるためです。予め`定義`を別ファイルで行っているため、規則3が適応されて`定義`が意図しない場所で起こることを防ぐことができます。

## コードによる具体例

```foo.c
/* foo.c */
#include <stdio.h>
#include "foo.h"

int x = 100;

int main()
{
	printf("x = %d\n", x);
	f();
	printf("x = %d\n", x);
	return 0;
}
```

```bar.c
/* bar.c */
#include "foo.h"

void f()
{
	x = 200;
}
```

```foo.h
/* foo.h */
extern int x;

void f(void);
```

### 出力結果

```terminal
$ gcc foo.c bar.c && ./a.out 
x = 100
x = 200
```

## 参考

[コンピュータ・システム 第七章](https://amzn.to/2XIaE5Y1)
[記憶域クラス指定子 - cppreference.com](https://ja.cppreference.com/w/c/language/storage_duration)
[c - How do I use extern to share variables between source files? - Stack Overflow](https://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables-between-source-files)
AWS Lambdaでpandasを使いたい！

# Lambdaにはpandasが提供されていない
なので、自分でLayerを設定する必要があります。
以下、できるだけシンプルにLambdaでpandasを使うやり方をまとめます。

# pandasを追加する方法
## 1.追加するpandasのARNを調べる
* [ここ](https://github.com/keithrozario/Klayers/tree/master/deployments)から、**python3.8->arns->(リージョン).csv**へ進む
    * 東京リージョンで使うならap-northeast-1.csv
* さまざまなライブラリがあるので、好きなpandasバージョンを探してARNコピー
    * 2021年8月現在、最新版は1.3.2

## 2.Lambda関数で設定
* pandasを追加したい関数を選択
* 関数ページの一番下にあるレイヤーの「レイヤーの追加」を選択
* 「レイヤーを選択」で**「ARNを指定」**を選択
* 「ARNを指定」のテキストボックスに(1)でコピーしたARNをペーストして追加

## 3.pandasをインポートしてテスト
* 関数ページで、**import pandas**などでインポート
* 「テスト」タブからテストイベントを作成して保存し、テストを実行
    * import pandasの行にエラーが出ていなければ問題なし

# まとめ
とりあえず、簡単にまとめました。
間違いなどあれば、ご指摘お願いいたします。
IBM Cloudの新認定試験IBM Cloud Advocate v1を受けてみた

# IBM Cloud Advocate v1とは

IBM Cloudの認定技術者の1つで、2021年7月から受験可能になりました。レベル感としては、営業やマネージメント向けの最も入門的な試験となります。

IBM Cloud Advocate v1に合格すると、**IBM Certified Advocate - Cloud v1**の認定資格を得ることができます。もちろんOpen Badgeももらえます。

<img width="160" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/ee423f4c-7305-cbed-53a9-deaeb1e3d75a.png">

試験の概要はこちら。

> https://www.ibm.com/certify/exam?id=C1000-124

認定資格の概要はこちら。

> https://www.ibm.com/certify/cert?id=C0010900

# 学習方法

IBM Cloudを利用したシステム構築をしているエンジニアであれば目を瞑っても合格可能なレベルです。一から学習する、または自信のない方は、下記サイトでラーニングパスが公開されています。

> https://www.ibm.com/training/path/ibmcloudadvocate

# 受験方法

PearsonVUE社のサイトで予約して受験してください。

https://www.pearsonvue.co.jp/Clients/IBM.aspx

以前は最寄りのテストセンターでしか受験できなかったのですが、最近はカメラ付きPCがあれば自宅でも受験可能になりました。こういうご時世ですので、可能であれば自宅での受験をお勧めします。ただし部屋の片づけはきちんとしておいてください。

# 合格点

61問中40問以上の正解で合格です。正答率は65%です。IBMの認定試験では甘い方だと思います。

# 出題内容

試験規約により具体的な問題文は書けませんので、雰囲気になりますが、いくつか問われそうな箇所を書きます。

* Cloudとは
* Kubernetesとは
* IBM Cloud Pakとは
* VPCとネットワークコンポーネント
* VPCとセキュリティ
* VMwareソリューション
* クラウドストレージ3種の特性
* Watson関係のサービス
* IAM、権限とリソースの関係
* IBM Cloudのサポート
* Cloud Nativeとは

このあたりを抑えておけば合格できると思います。
ReactNativeのFlatlistでデフォルトでレンダリングされる数を変更する

Flatlistのデフォルトでレンダリングされる数は10ですが、
ScrollToIndexとかを使うときにこんなエラーが出て困ったりします.

```
Invariant Violation: scrollToIndex should be used in conjunction withgetItemLayout or onScrollToIndexFailed,
otherwise there is no way to know the location of offscreen indices or handle failures.
```

#解決
 
``` initialNumToRender={レンダリングする数} ```でデフォルトででレンダリングされる数を変更できます.

```react:例
<Flatlist
   ...
    initialNumToRender={9999}
   ...
 />
```
Nuxt.jsでChart.jsを利用する手順

#手順1
Visual Studio Codeの「ターミナル」より以下のコマンドを入力・実行する。

※ターミナルが開いていない場合は、メニュ→「ターミナル」→「新しいターミナル」を選択してターミナルを開く。

```
npm install vue-chartjs chart.js@2 --save
```

#手順2
プロジェクトのComponent配下に「Chart_bar.vue」を作成する。
※ファイル名は任意。

```/compnent/Chart_bar.vue
<script>
import { Bar} from "vue-chartjs";

export default {
  extends: Bar,
  props:['chartdata', 'options'],
  mounted () {
    this.renderChart(this.chartdata, this.options)
  }
};
</script>
```

#手順3
以下の要領で、コンポーネントからチャートを描画する。

```/pages/index.vue
<template>
  <div class="chart">
    <Chart-test :chartdata="chartdata" :options="options" />
  </div>
</template>
<script>
export default {
  data() {
    return {
      chartdata: {
        labels: ["ラベル1", "ラベル2", "ラベル3", "ラベル4", "ラベル5"],
        datasets: [
          {
            label: "サンプル",
            backgroundColor: "#008b8b",
            borderColor: "#9acd32",
            data: [100, 90, 80, 70, 60],
          },
        ],
      },
      options: {
        responsive: true,
        maintainAspectRatio: false,
      },
    };
  },
};
</script>


```

#手順4
Visual Studio Codeの「ターミナル」より以下のコマンドを入力・実行し、
、ブラウザでチャートが表示されればOK

```
npm run dev
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1866473/a6c0f21a-d466-1786-edf7-d79e1c922b2a.png)
error while loading shared librariesの解決法（備忘録）

##背景
外部ライブラリを使ったプログラムの実行時、

```
error while loading shared libraries: libhdf5_cpp.so.103: cannot open shared object file: No such file or directory
```

というエラーが起こる場合がある。（上記エラーはHDF5というライブラリを使用したプログラムを実行した際のエラー）

## 動作環境
WSL Ubuntu18.04

##解決法

bashrcにLD_LIBRARY_PATHを追加する。以下をbashrcに追記。

```
export LD_LIBRARY_PATH=/home/hogehoge/lib/hdf5/lib:$LD_LIBRARY_PATH
```

今回はhome下にlibディレクトリを置き、そのディレクトリ内にライブラリをインストールしていることを想定。

```
source ~/.bashrc
```

追記したらsourceしておく

自分の環境では無事に解決した。
AutoIt3をVSCodeでチョメチョメするときのエラー

VSCodeでAutoItを使おうとして、[適当なエクステンション](https://marketplace.visualstudio.com/items?itemName=4ern.4ern)をインストールしても、*.au3を開いてF5を押すと、AutoIt3Wrapper\AutoIt3Wrapper.au3が開けない（Error: Error opening the file.）、というエラーが出たりします。

![55989716-f4d36580-5c73-11e9-8162-a151106bb8ce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79187/5bd11f7e-7d22-42a1-a22a-61185832a8eb.png)

こんなの。そんな時は、[AutoIt用SciTEの本家](https://www.autoitscript.com/site/autoit-script-editor/downloads/)からSciTE4AutoIt3.exeをダウンロードしてインストールしましょう。AutoItがインストールされたときのSciTEをアンインストールする必要はありません。ただ単に、上書きインストールです。AutoIt3\SciTE\*に、補助的なファイルがごっそりインストールされ、VSCodeからAutoItが使えるようになります。以上
IntStream reduce()初期値有り時の挙動


# はじめに

IntStreamのreduce()の初期値(第一引数)の有無で
ループの回数が変わるということに
気が付きましたので書き残します。

:::note warn
初期値が無いとループの回数が1回減ります。
:::

ので注意が必要です。

# 初期値無しの場合

reduce((total,i)-> total + i)
0回目無し
1回目から

```java:Test.java
		int result = IntStream.range(0, 4)
				.reduce((total, i) -> {
					System.out.println(i + "回目");
					return total + i;
				})
				.orElseThrow();

		System.out.println("result:" + result);
```

``` :実行結果
1回目
2回目
3回目
result:6
```

# 初期値(0)有りの場合

reduce(0, (total,i)-> total + i)
0回目から

```java:Test.java
	public static void main(String[] args) {
		int result = IntStream.range(0, 4)
				.reduce(0, (total, i) -> {
					System.out.println(i + "回目");
					return total + i;
				});

        System.out.println("result:" + result);
```

```:実行結果
0回目
1回目
2回目
3回目
result:6
```

# 初期値(2)有りの場合

reduce(2, (total,i)-> total + i)
0回目から

```java:Test.java
	public static void main(String[] args) {
		int result = IntStream.range(0, array.length)
				.reduce(2, (total, i) -> {
					System.out.println(i + "回目");
					return total + i;
				});

        System.out.println("result:" + result);
```

```:実行結果
0回目
1回目
2回目
3回目
result:8
```
プロトタイプ継承についてアウトプット

#プロトタイプ継承とは
`別のコンストラクター関数のプロトタイプを受け継いで、機能を流用`できるようにすること。
また、プロトタイプ継承を用いることで`コンストラクター間で機能の受け渡し`ができるようになるため、効率的にプログラムを組むことができる。


```js:例
function Person(name, age) {
  this.name = name,
  this.age = age 
}

Person.prototype.hello = function() {
  console.log('hello' + this.name);
}

function Character(name, age) {
  this.name = name,
  this.age = age 
}

Person.prototype.hello = function() {
  console.log('hello' + this.name);
}
```
これだとコードが冗長となり、変更があったときにコードのメンテナンスがしづらくなってしまう

#継承
別のコンストラクター関数を受け継ぐこと

```js:例
function Person(name, age) {
  this.name = name,
  this.age = age 
}

Person.prototype.hello = function() {
  console.log('hello' + this.name);
}

function Character(name, age) {

}

Character.prototype　= Object.create(Person.prototype);
// PersonのprototypeがCharacterのprototypeの中に含まれるプロトタイプになる
```

[Object.createは第一引数に渡したオブジェクトをプロトタイプに持つ空のオブジェクトを作成する]
(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/create)


#コンストラクター継承


```js:例
function Person(name, age) {
  this.name = name,
  this.age = age 
}

Person.prototype.hello = function() {
  console.log('hello' + this.name);
}

function Character(name, age) {
 Person.call(this, name, age)
}
Character.prototype　= Object.create(Person.prototype);
```

Personのコンストラクター関数の継承をするには、Characterの中で`callメソッド`を呼び出す
Characterの関数コンテキストのthisを渡す、`第2引数以下は関数の引数が入る`
関数コンテキストのthisがPersonに渡り、thisのnameとageが設定される


###継承したメソッドの上書き

```js:上書き前
Person.prototype.hello = function() {
  console.log('hello' + this.name);
}
```

```js:上書き後
function Person(name, age) {
  this.name = name,
  this.age = age 
}

Person.prototype.hello = function() {
  console.log('hello' + this.name);
}

function Character(name, age) {
  Person.call(this, name, age)
}

Character.prototype　= Object.create(Person.prototype);

//PersonからCharacterに変更する
Character.prototype.hello = function() {
  console.log('Hi' + this.name);
}

const mickey = new Character('ミッキー', 20);

mickey.hello();
```

`Personプロトタイプより、Characterプロトタイプの優先度が高くなり、'Hiミッキー'と表示されます`
CharacterプロトタイプはPersonプロトタイプと独立しているので、Characterプロトタイプだけにメソッドを追加することもできます。
Windows 資格情報をコマンドで削除する

Windows 資格情報をまれによく一括削除したくなるのでメモ。
PowerShellとcmdkey.exeを使います。

Adobe CCのやつが行が多くてわかりやすかったのでこれで実験。

```powershell
cmdkey /list | ForEach-Object{if($_ -like "*ターゲット:*Adobe*"){ cmdkey /delete:($_ -replace ".*ターゲット: ","")}}
```

1. `cmdkey /list`で一覧を出力
1. `ForEach-Object`とif文で`ターゲット:Adobe`が出てくる行を抽出
1. `cmdkey /delete:(略)`で(略)の文字列を対象に削除実行
1. `(略)`では`ターゲット: `と日本語で書かれてるやつを削除

参考は[こちらのStack OverflowのQA](https://stackoverflow.com/questions/51565300/cmdkey-delete-credentials-with-dashes-and-spaces-on-the-name)。
【Android Studio / Windows10】ウイルススキャン除外設定

# はじめに
Windows10でAndroid Studioを使用時、以下のような警告が出た際の対処法。

```
Your anti-virus program might be impacting your build performance. Android Studio checked the following directories:
...
```

対応することで、おそらくBuildが速くなる。
ウイルススキャン除外設定画面に辿り着くまでややこしかったので、メモ。

# 対処法
1: 「Windowdボタン」→「設定」
2: 「更新とセキュリティ」→「ウイルスと脅威の防止」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/822e0260-0c47-1577-3b92-afd4c002e6e8.png" width="70%">

3: 「ウイルスと脅威の防止の設定」の「設定の管理」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/259a05d9-1f96-d3eb-8926-3d2a9d555419.png" width="70%">

4: 「除外」の「除外の追加または削除」
5: 「除外の追加」
ここで警告に書かれているフォルダを追加する。
Datadogでプロセスの監視ができないとき

## これは何

Datadogでプロセスの監視ができなく、ハマった時のメモです。

## 前提

①/process.d/conf.yaml には、取りたいプロセスを記述しています。

```vim
/etc/datadog-agent/conf.d/process.d/conf.yaml

init_config:
instances:
  - name: sshd
    search_string: ['sshd']
  - name: httpd
    search_string: ['httpd']
  - name: crond
    search_string: ['crond']
  - name: mysqld
    search_string: ['mysqld']
 - name: chronyd
    search_string: ['chronyd']
- name: rsyslogd
    search_string: ['rsyslogd']
```

②設定変更後、リロード済みです。

```
$ sudo systemctl restart datadog-agent
```

③各プロセスがstartしていることを確認


## 原因

コンフィグ設定が正しいかどうかのチェックが抜けていたから。

```
　＄　sudo datadog-agent configcheck
```

```
=== Configuration errors ===
process: yaml: line 10: did not find expected key
```

エラー文によると、10行目おかしいから見ろ、と言っているので、見てみると、
インデントが揃っていないのが原因でした。(単純)

```vim
/etc/datadog-agent/conf.d/process.d/conf.yaml

# Before

init_config:
instances:
  - name: sshd
    search_string: ['sshd']
  - name: httpd
    search_string: ['httpd']
  - name: crond
    search_string: ['crond']
  - name: mysqld
    search_string: ['mysqld']
 - name: chronyd
    search_string: ['chronyd']
- name: rsyslogd
    search_string: ['rsyslogd']
```


```vim
/etc/datadog-agent/conf.d/process.d/conf.yaml

# After 

init_config:
instances:
  - name: sshd
    search_string: ['sshd']
  - name: httpd
    search_string: ['httpd']
  - name: crond
    search_string: ['crond']
  - name: mysqld
    search_string: ['mysqld']
  - name: chronyd
    search_string: ['chronyd']
  - name: rsyslogd
    search_string: ['rsyslogd']
```

## 総括

原因としては単純なものでしたが、なんなのか原因を見つけることができたので、
コンフィグチェックコマンドは偉大です。

```
参考
https://docs.datadoghq.com/ja/agent/guide/agent-commands/?tab=agentv6v7
```
Power Automate Desktopで役に立ったこと

自分なりに役に立ったことを書き出しておきます。

#祝日と日付
##祝日一覧を取得する
変数だけで（ファイルシステムを使わずに）完結できないかといろいろ試したけど、結局素直に一旦ファイルに落とすのが簡単だった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839497/a91b9bcf-cfaa-c018-69f2-4172b304bc48.png)

###祝日のCSVのURL
https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv

###手順3の詳細
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839497/d1aa6317-58c4-4cfa-5a59-f7accca89323.png)

###手順4の詳細
日付しかいらないならこんな感じでリストに抜き出す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839497/8c59a3db-d2fd-de0b-d0c7-fd285b238173.png)

##今月の祝日だけを抜き出す
正規表現が苦手なのでこうなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839497/a32b631a-d372-640c-c593-9633f6b7f423.png)
現在日時を取得して、ダウンロードしたCSVの形式に合わせてyyyy/Mのテキストにする。
簡単な正規表現で抽出して別のリストに保存した。
###手順8の詳細
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839497/892a7ee2-62c7-8a3a-f011-2f828a79c256.png)
###今年の祝日にしたいとき
手順7で形式をyyyyにすればOK

#カレンダー
##毎月のカレンダーからいつ出てくるか、いくつ出てくるかわからない要素を検索して値をリストかテーブルに取得したい時
今回は2つの値を取得したいのでリストじゃなくてテーブルに収めます。

色々試した結果7x5マスを巡回して、探しものがあった時はそこのテキストをリストに入れ、最後にテーブルに追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839497/8a8cc2e1-2140-be85-d926-11f5eefe68c0.png)
###「探したいdiv」の中身（の例）
`div[Class="ug-body"] > div:eq(%LoopIndexRow%) > div:eq(%LoopIndexWeek%) > div:eq(2)  div[Class="ug-block__inner"]`

こんな感じでdivの番号を変数にしておく

#テーブル
##列名付きの空テーブルの作り方
こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1839497/90369939-4b8f-1c83-5163-23ee19a5ea89.png)
PCBWAYに4層基板をinner layerの厚み1オンス以上で注文する

##概要
半年前のことだけど、inner layerの厚さを1オンス以上の厚さで4層の基板を作りたかったので、PCBWAYで注文をした。
今回改めてPCBWAYに同じような条件で基板を注文したいので、注文条件を整理してみました。


##環境
- Windows 10 64bit
- Kicad 5.99.0-2849-g8bca145b75 (Nightly-build)

> :pushpin: 最近、windows向けにnightlyのビルドをできるようになったので、その方法もどこかで整理したいと思う

## Capabilities

省略

## KicadのBoard Setup
デザインルールをKicadのPCBNEW -> File -> Board Setup に反映させる。次の写真のようになる。

![pcbway_4layer_2once.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691828/e7846dbe-6141-620e-699f-ff0aaba7bbd6.png)

前回はこれで注文できた、という参考程度にお考え下さい。実際はもう少しクリアランスを小さくできるはずです。
ただしPCBWAYはクリアランスを小さくしていくと、値段が上がったはず。折り合いをつけたのがこの条件だったと思う。


![pcbway_inner_layer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691828/3cb31ebe-47c5-57b5-d5b8-1dcb8541c770.png)


横浜市長選で自民党推薦候補が負けたのは、自民党のコロナ対策への不信感が背景にあると思います。
とは言え民主党（くずれ）政権になってほしくはありません。
2021年8月24日


## 追記

今回の基板をざっくり自動見積もりしてみた。今回は基板サイズが130x130なので、↑の図とベース料金が異なっている点のみ注意。

![pcbway_4layer_condition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691828/41e66bfa-244b-620f-9f04-71fe0e225070.png)

- Min Track/Spacing

8/8mil(0.2mm)なら159ドル、6/6mil(0.15mm)で260ドル、納期も倍。パワー系のモジュールなら8/8milで十分

- Min Hole Size

0.3mm以上で159ドル。0.25mmで166ドル。0.2mmで263ドルに跳ね上がり、納期も倍。0.25でも良いけど、今回は0.3。

- Finished Copper

2オンスまでなら159ドル、3オンス以上は260ドル以上＋納期倍。今回は2オンス。

ご参考まで。


- Inner Copper

1.5オンスまでなら159ドル、2オンス以上なら260ドル以上＋納期倍。今回は1.5オンス。
Exastroを触ってみた(編集中)

# Exastroを触ってみた

## 目次
1.  はじめに
1.  作業環境
1.  Ansibleを動かしてみる
1.  Terraformを動かしてみる
1.  Ansible＆Terraformを使って構築からミドルウェアの設定までまとめてどーん。
1.  Conductorを動かしてみる
1.  収集機能を使ったパラメータシートの生成自動化
1.  比較機能を使ったパラメータシートと実機比較による単体試験自動化


# はじめに
東北地域の顧客（中小規模）でも使えるのか？  
　⇒小規模案件での使い捨てでは学習コスト増で費用対効果なし。  
　⇒自動化する部分を部品化して再利用すれば道はあるかもしれない。  
「Exastroを使いたい」と強く思えるOnlyなステキ機能があるか。（机上調査ではなさそう）  
  

# 作業環境

# 構築する

# Ansibleを動かしてみる

# Terraformを動かしてみる

# Ansible＆Terraformを使って構築からミドルウェアの設定までまとめてどーん。

# Conductorを動かしてみる

# 収集機能を使ったパラメータシートの生成自動化

# 比較機能を使ったパラメータシートと実機比較による単体試験自動化

画像
![](./image/exastro_top.PNG)
timedatectlで表示される情報

## 環境
Ubuntu20

## timedatectlコマンドで表示される情報について


```
$ timedatectl
               Local time: Tue 2021-08-24 10:28:54 JST
           Universal time: Tue 2021-08-24 01:28:54 UTC
                 RTC time: Tue 2021-08-24 01:28:52
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no
```

`localal time`とは、システムクロックともいいますが、OSが持っている時間のことです。`dataコマンド`で表示される時間は、`Local timeで設定されている時間が表示されます。

`Universal time`は、世界標準時の事です。つまりイギリスの現在時刻です。

Ubuntuのでデフォルトでは、タイムゾーンはUTCになっているため、Universal timeがそのままLocal timeとなっているということになります。

`RTC time`のRTCとは、`Real Time Clock`の略。リアルタイムクロックは、ハードウェアクロックともいいます。マザーボードが保持している時刻のことです。

`System clock synchronized`はNTPで時刻取得をおこなっているかどうかの確認表示です。
noとなっていれば、NTPによる時刻取得は行っていません。NTPの設定を行えば、yesになります。

`NTP service: inactive`となっていれば、NTPサービスが起動してないことになります。NTPサービスを起動すれば、activeに変わります。

デフォルトでは、`RTC in local TZ: no`になっています。これをyesにするには、timedatectl set-local-rtc trueコマンドをうつ。yesにすると、ハードウェアクロックに、システムクロックの時間を同期合わせさせるようです。基本的にnoのままでいいようです。
【Apple Developer】App Store/TestFlightへのアプリ申請でできる限りレビューの回数を減らしたい時の前準備

# アプリのみで完結しないiOSアプリの新規申請はなかなか通らない件
ビジネスロジックが複雑なアプリは何かと審査にひっかかります。
審査員がまず機能を網羅的に確認できないから一つ一つの機能のレビューで1ヶ月審査に時間を使うなどあったりします。

なのでできる限り機能面の問い合わせでレビューのやりとりを減らしたい時は審査前のテスト情報として、下記質問に前もって答えておくとすんなりレビューを通してくれるのでおすすめです。

また、TestFlightで外部配信時にも審査が必要になったので、
ログインが必須なアプリはテスト用のログイン情報も必ずTestFlightのテスト情報欄に共有するようにしましょう。

```
1. Is your app restricted to users who are part of a single company? This may include users of the company's partners, employees, and contractors.

2. Is your app designed for use by a limited or specific group of companies?
- If yes, which companies use this app?
- If not, can any company become a client and utilize this app?

3. What features in the app, if any, are intended for use by the general public?

4. Identify the specific countries or regions where you plan to distribute your app.

5. How do users obtain an account?

6. Is there are any paid content in the app? For example, do users pay for opening an account or using certain features in the app?

7. Who pays for the paid content and how do users access it?
```