OmniAICreator/Qiita-1.07M huggingface dataset:
初心者による初心者の為のSQLまとめ

# 現場でよく使うSQL　初心者の忘備録　
SQL初心者が初めて現場に入った時に、よく使ったSQLまとめ
posgre,Oracleをメインに使用

## 文字列関数と演算子

### 部分文字列の取り出し 
 substr(string, start int, length int])

--例
substr('Thomas' , 2, 3) 
--結果
hom

### 文字列の結合
 string || string

-- 例
'Thomas' || ' ' || 'Edison' 
-- 結果
Thomas Edison


### 半角スペースを文字列の先頭と末尾から除去する
 trim(string)
-- 例
trim(' Thomas Edison ') 
-- 結果
Thomas Edison

### 指定文字列を文字列の先頭と末尾から除去する
 trim(characters from string)
 -- 例
trim('abc' from 'abcThomasabc') 
-- 結果
Thomas

#### 文字列の前後から全角スペースと半角スペースを除去したい場合は以下を使用(現場で移行元データ に不要なスペースが多数含まれており、以下の記述は頻繁に使用した)

### 文字列を置換する
 trim(trim(' ' from ' Thomas ')
 replace(string, from_text string, to_text string)
 -- 例
replace('abcdefabcdef', 'cd', 'XX') 
-- 結果
abXXefabXXef

### 正規表現で文字列を置換する
 regexp_replace(string, from_text string, to_text string)
 -- 例
regexp_replace('Thomas', '.[mN]a.', 'M') 
-- 結果
ThM

### 大文字⇔小文字の変換
 upper(string) -- 大文字に変換 lower(string) -- 小文字に変換
 
### 文字列の文字数・バイト数を返す
 length(string) -- 文字数 lengthb(string) -- バイト数
-- 例 
length('⻁視眈々') 
-- 結果
4
-- 例
 lengthb('⻁視眈々') 
-- 結果
8
 -- 例 
upper('tom') 
-- 結果
TOM
-- 例 
lower('TOM') 
-- 結果
tom

## データ型書式設定関数
### PostgreSQLのデータ型書式設定関数は様々なデータ型(日付/時刻データ型や数値データ型など)を文字列へ変 換したり、文字列を特定のデータ型に変換することができる
### タイムスタンプ⇒文字列
 to_char(timestamp, text)
 -- 例
to_char(current_timestamp, 'HH12:MI:SS')

### 整数⇒文字列
 to_char(int)
 -- 例 to_char(128)
### 文字列⇒日付
 to_date(text, text)
 -- 例
to_date('1998/03/02', 'yyyy/mm/dd')
### 文字列⇒数値
 to_number(text)
 -- 例 to_number('2980')


### 条件式
SQLのCASE式は、ほかのプログラミング言語のif/else構文に類似している

#### CASE文
CASE
WHEN 条件 THEN
-- TRUEの場合の処理 ELSE
-- FALSEの場合の処理 END

使用例
 SELECT
age
, CASE
WHEN age >= 20 THEN '成人'
ELSE '未成年' END
FROM
wk_tbl;

以下のようにWHERE句で使用することもできる
 SELECT ...
WHERE
  CASE
    WHEN x <> 0 THEN y/x > 1.5
    ELSE false
END;
Swagger備忘録

何番煎じかわかりませんが、Swagger自体の使用がいくつか変わっていたりしていたので備忘録も兼ねて再度まとめて見たいと思います。

（参考）

https://qiita.com/disc99/items/37228f5d687ad2969aa2

# Swaggerとは？
[OpenAPI](https://spec.openapis.org/oas/latest.html)の仕様に基づいて設計された、オープンソースのツール群の名称になります。
OpenAPIとは、いわゆるRESTful APIを記載するためのフォーマットです。
Swaggerの特徴の一つとして、JSON形式で記載できることが挙げられます。

Swaggerのシリーズとしてよく使われるものは以下の３つです。
|名前　　|概要 　　　|
|:-----------|------------|
| [Swagger Editor](https://editor.swagger.io/)       | ブラウザでAPI仕様書を書くためのエディタ、<br>Dockerイメージも配布されており、ローカルでの実行も可能。      |
| Swagger UI    | API仕様書からドキュメントを生成するツール    | 
| Swagger Codegen      | API仕様書からコードを生成するツール       |

# 開発手法
主要な開発手順としては、以下二つのものがあるようです。

### トップダウン形式：
- SwaggerEditorでSwagger Specificationを編集、定義
- SwaggerCodegenでSwagger Specificationからソースコードを生成
### ボトムアップ形式
- 既に存在するREST APIのソースコードからSwagger Coreのアノテーションなどを使用しSwagger Specification定義
- 生成されたSwagger SpecificationをもとにSwagger UIによって、RESTAPIをドキュメント化


# 競合ツール
OpenAPIの仕様に基づくツールとしては、他はRamlとAPI BluePrintが有名どころである。

### [Raml](https://raml.org/)
<b>R</b>ESTful <b>A</b>PI <b>M</b>odeling <b>L</b>anguageの略でその名の通りREST APIを設計するための言語。
その名より連想される通りYamlで記載することが可能である。

### [API BluePrint](https://raml.org/)
コンセプトは「シンプルで簡潔かつ表現力が豊か」というイメージである、OpenAPI記載言語の一つ。
こちらは標準の記載言語はMarkdownである。
あまりに自由に書け過ぎてしまうため、注意しないと肥大化したプロジェクトの場合は管理が大変になる可能性がある。

<font color="gray">Swagger Editorの部分について後ほど追記予定</font>
FFUF　使い方



# はじめに

Hack The Boxやtry hack meはまずは**列挙**しろってよく言われます。そのツールとしてgobuster,nmap,rustscan,whatweb,WPScanなどなど...使うと思います。

そのツールの1つとしてあるのがffufです。

https://github.com/ffuf/ffuf

ffufはgobusterと同じWebアプリケーションへの攻撃に使います。
ただ、gobusterと違っていろんな扱い方があります。

## コマンド例

 ```shell
ffuf -c -u http://victim.com/FUZZ  -w wordlists.txt 
 ```
まず、ffufは**FUZZ**の部分に**wordlist**の文字列を順に入れて-uの**URL**にアクセスします。なので、ffufのコマンドのどこかには**FUZZ**の文字列が存在しています。

### 標準的なオプション
標準的なオプションで見やすくしたり、出力結果が欲しい時に使えます。
|  オプション  |  内容  |
| :---: | :---: |
|  -c  |  出力のカラー化  |
|  -u  |  攻撃先のURL  |
|  -w  |  ワードリストファイルのパス |
|  -o  |  出力ファイルとして出力 |
|  -of  |  出力ファイルのフォーマット (標準:json)|


### フィルターのオプション
fが付くと条件に合うものについては出力をしなくなる。
mが付くと条件に合うものだけ出力する。
以下の表に*にfかmを指定すればOKです。
|  オプション  |  内容  |
| :---: | :---: |
|  -*c  |  レスポンスコードの指定  |
|  -*s  |  レスポンスサイズの指定|
|  -*w  |  レスポンスの文字数を指定|

# 実例
以下に実例を示します。
## VHOST
組織が複数のドメイン名を1代のサーバーでホストしている仮想ホストを見つけることが可能です。

### デフォルト
 ```shell
ffuf -c -u http://victim.com  -w wordlists.txt -H "Host: FUZZ.victim.com"
 ```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/0911a99d-101b-3369-4cb3-d3216c34fad2.png)

### オプション付き
 ```shell
ffuf -u "http:/victim.com/FUZZ" -w /your/wordlist.txt -fw 13127
 ```
今回はレスポンスの文字数が**13127文字**のレスポンスを表示しないようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/ba2fe2c5-fa07-988c-e730-890988260b62.png)

## DIR
隠されたディレクトリを探すために使用する。
### デフォルト
 ```shell
ffuf -u "http:/victim.com/FUZZ" -w /your/wordlist.txt -e .php 
 ```
今回は表示する拡張子を**php**のみを表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/716c8f3d-221f-2d5d-29af-7a1376b4869b.png)

### オプション付き
 ```shell
ffuf -u "http:/victim.com/FUZZ" -w /your/wordlist.txt -e .php -fc 403
 ```
今回は表示する拡張子を**php**とレスポンスコード**403**を表示しないようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/48f9b1d4-0d5a-814a-8ea2-59b978aa0316.png)

## LFI

### デフォルト
LFIとはローカルファイルインクルードで外部ファイルの読み込みではなくサーバー内のファイルを不正に読み込んだり、意図しない動作を起こして脆弱性を発生させます。

 ```shell
ffuf -u "http:/victim.com/upload.php?file=FUZZ" -w /your/wordlist.txt 
 ```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/49e5ba7f-9bcc-ce1c-bb2d-4b3ecc782579.png)

# まとめ
まだもっとオプションがあってhttpのリクエストの指定したりできたりもします。でも、まずはこれさえできれば不自由なく扱えると思います。

## ちなみに...
実行中にエンターキーを押すことでインタラクティブモードにできます。
ここで-fwといったフィルター系のコマンドや**restart**という再スタートさせるコマンドが使えるのでわざわざctrl+Cを押さなくても済みます!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/86f62c20-45a6-8c2b-ecfb-407a09d177cc.png)
FlutterでiOSのヘルスケアから今日の歩数系合計を抽出して表示する方法


ただ表示するだけだと審査落ちる場合もあります。気をつけましょう
`https://social.msdn.microsoft.com/Forums/en-US/82351da9-58b6-4b46-9e78-ed35e2c13b2e/ios-app-rejected-due-to-healthkit-reference-that-the-project-doesnt-have-and-use-anywhere?forum=xamarinforms`

以下を追加

ライブラリ追加

```yml:pubspec.yml
   health: ^3.0.4
```


ヘルスケアの追加

```plist:ios/Runner/info.plist

	<key>NSHealthShareUsageDescription</key>
	<string>We will sync your data with the Apple Health app to give you better insights</string>
	<key>NSHealthUpdateUsageDescription</key>
	<string>We will sync your data with the Apple Health app to give you better insights</string>

```

![スクリーンショット 2022-03-15 17.46.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239663/96166429-6ed8-eb6e-b4c1-a3f67cc7b7b1.png)

HealthKit も追加する
チェック項目は以下の画像の通り

![スクリーンショット 2022-03-15 17.51.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239663/ea25fcfa-dd28-d854-79fb-d26e10f173d0.png)


で完了
SPAとSSRの差について個人的にまとめてみた。

## SPAの動き

ブラウザから初回リクエストが来ると、サーバーは、JSのビルドファイルと最小限のHTMLファイルを返却する。
この段階では何も表示されない。

基本の中身のない空のタグだけ生成されて、中身はブラウザ上のJavaScriptがAPIを叩くことで、APIからのレスポンスをもとに初期表示との差分を更新する形でDOMを構築しHTML要素がレンダリングされる。


## SSRの動き

サーバー側でAPIを叩き、レンダリングまでを行ってからHTMLファイルを返却する。
Node.jsが実行するので、この負担はサーバーにかかる。


## それぞれのメリット・デメリット

### SPAのメリット

・ユーザーの使いやすいぬるぬるUIの実現
・高速なページ遷移
・　PWA対応などしやすいらしい。
・ビルド済みのHTMLとJSファイルがホスティングサーバーにあれば動く

### SPAのデメリット

・ 初期ローディングは時間がかかる（ブラウザ上でJSを実行する時間）
・ SEOで不利な可能性
Git:導入までの備忘録

# 目的
Windows への Git の導入や Github との連携などの自分用の備忘録
ふわっとした理解で書いているので間違ってたりすることもあるかもしれないので、
その時は指摘していただけると嬉しいです。


# Git のインストール
1. 以下の URL から自分の OS にあった bit の Git のインストーラをダウンロード
[Git] ダウロードページへ 
2. インストーラを起動して、Git をインストール。
※Windows の PATH 設定の際に、コマンドプロンプトから起動できるようにする
3. Git インストール完了

[Git]:https://git-scm.com/downloads

# Git の基本的な使い方
コマンドプロンプトで操作することを想定して以下の操作を行う。
### Git でローカルリポジトリを作成
Git で管理したいフォルダを作成し、そのフォルダに移動
```
mkdir [フォルダ名]
cd [フォルダ名]
```

```git init``` コマンドを実行。
おわり

### Git で追跡しないファイルの設定
Git は```.gitignore```ファイルを作成し、編集することでgitで追跡しないファイルを設定できる。
たとえば、```.gitignore```を作成し
```git:.gitignore
*.exe
```
と記述すると、```.gitignore```ファイルを置いているディレクトリ以下から```.exe```ファイルを追跡しないようになる。
~~例で挙げている通り、正規表現での記述ができるので便利。~~
正規表現の`[a-zA-Z]`のような書き方ができるだけで正規表現の記述ができるわけではない．（自分がワイルドカードと正規表現を混同していた）
.gitignore のパターンフォーマットのいくつかをを以下に示す．
```git:pattern format
!（dir） : dir を無視しないようにする．ディレクトリ内の特定のファイルのみ無視しないようにする時使うらしい．
* : "/"以外の任意の文字列にマッチ
? : "/"以外の任意の一文字にマッチ
[a-zA-Z] : 指定範囲の一文字にマッチ
```
その他，詳しい情報は[ここ](https://git-scm.com/docs/gitignore)（公式ドキュメント）で．

### github との連携
#### ```git init```で始めた時
自分でローカルリポジトリを作って、リモートリポジトリト連携する場合は以下のコマンドで行う。
以下のコマンドで github と連携する
```git
git remote add [GithubのURL]
```
Github の URL は Github の連携したいリポジトリを開いて、[Code] をクリックしたときに出てくる URL をコピペする。
#### ```git clone```で始めるとき
リモートリポジトリをローカルに保存して作業を行うときは、```git clone```から始める。
```
git clone [リモートリポジトリのＵＲＬ]
```
を実行した時にそのリモートリポジトリを連携する設定もされるので、
特に追加で設定することはなし。
※プライベートリポジトリをクローンするときは、パスワード等の入力を求められるので
Github で [settings]→[Developer settings]→[Personal access tokens] からアクセストークンを作成して、
それをパスワードとして入力する。
（2020年夏ごろ？にパスワード認証が使えなくなって、アクセストークンを使わないといけなくなった、）

### よく使うコマンドシート
よく使うコマンドのまとめ。
コマンドについて詳しく知りたいときは、googleとかで調べるか、`--help`とか`-h`でオプションとかを調べる。
|コマンド|意味|
|----|----|
|git init | カレントディレクトリでローカルリポジトリを作成|
|git branch [ブランチ名]|ブランチを作成。<br>オプションで-dを指定すると、そのブランチを削除。
|git checkout [ブランチ名]|指定したブランチに移動する。<br>オプションで-bを指定すると指定したブランチを作成して、移動できる。
|git add [ファイル/フォルダ名]|ファイル/フォルダをインデックスに追加|
|git commit|[更新/変更]履歴を記録 |
|git merge [ブランチ名]|カレントブランチを指定したブランチとマージ| 
| git push [リモートリポジトリ先] [ブランチ名] | リモートリポジトリのブランチとマージ。<br>同じブランチ名がないときは、同じ名前を持つブランチを作成|
|git fetch [リモートリポジトリ] [ブランチ名] |リモートブランチのブランチで更新追跡ブランチを更新 
|git pull [リモートリポジトリ] [ブランチ名]|リモートブランチからブランチを持ってくる。<br>内部的には、fetchしてからmergeを行っている
【Ruby】class Rational 有理数を扱うクラスについて

```ruby
val = 1 + 1/2r
puts val.class
```

### 返ってくる値
```
Rational
```

Rationalは**有理数**という意味。

そもそも有理数とは、有理数とは、a/b（a、bは整数）のように分数の形に表せる数のことを言うらしい。

例えば、整数の3も3/1と表現することができるため、これも有理数を言うことができる。

val = 1 + 1/2r
この場合は、1 + 1/2 の演算となる。
すると答えは、3/2になる。

そのため、これは有理数となり、Rational(有理数)が返ってくる。
ifとeach_with_indexで条件に応じたViewを表示させる

ブログサイトで、

1)広告があれば大見出しに広告を入れて、その下にブログ記事を配置

2)広告がなければ大見出しにブログ記事の1つめを配置

といった具合に、場合によってデザインを分けたい。

![完成形のイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496677/f585810d-7e3c-1605-4c19-ffc9993bc9b2.png)

完成形のイメージ

DBは説明のため簡略化して考える

![記事テーブルと広告テーブルのみ考える](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496677/39977f21-d68e-703a-6b5c-3ccaf3bfa441.png)


記事テーブルと広告テーブルのみ考える

### コントローラー

HomeController

```ruby
def index
	@articles = Article.all
	@affiliate = Affiliate.where(end_flag: false)
end
```

Viewにわたす記事、広告のデータをインスタンス変数として定義するだけのシンプルなもの。広告は一定期間出して、出し終わったらend_flagがtrueになるものと考える。

### ビュー

index.html.erb

```html
<section>
	<% if @affiliate.present? %>
	<div class="大見出し用のボックス">
		<h1><%= link_to "#{@affiliate.title}", affiliate_path(@affiliate.affiliate_id) %></h1>
	</div>
	<% is_no_affiliate = false %>
	<% else %>
	<% is_no_affiliate = true %>
	<% end %>

	<% @articles.each_with_index do |article, index| %>
	<% if index == 0 && is_no_affiliate %>
	<div class="大見出し用のボックス">
		<h1><%= link_to "#{article.title}", article_path(@article.article_id) %></h1>
	</div>
	<% end %>
	<div class="小さい見出し用のボックス">
		<h1><%= link_to "#{article.title}", article_path(@article.article_id) %></h1>
	</div>
	<% end %>
</section>
```

### Viewの処理の解説

1. `if @affiliate.present?`で、広告が存在する場合に大見出し用のボックスを表示させる
2. 広告が存在する場合、`is_no_affiliate = false`として記事の表示を分岐させるトリガーとして変数を用意する
3. 広告が存在しない場合は`is_no_affiliate = true` とする。
4. `@articles.each_with_index do |article, index|` で@articlesの中身をそれぞれ取り出して、順番にindex(0,1,2,~~)を付与
5. 最初の記事(`index == 0`)かつ、広告がない(`is_no_affiliate = true` )場合は、最初の記事を大見出し用のボックスで表示させて、それ以外は順番に小さい見出し用のボックスで表示させる。
マクロで1時間かかるやつを2分でやるRTA

マクロって、いいと思いますけど・・・
デン！っていうエラー画面がきらい。エラーの内容もよくわからん。

というわけで別の方法でやってみます。
教材はこちらの動画のものを使わせてもらいました。（この動画自体はすばらしいものですよ）
https://www.youtube.com/watch?v=oDz0CKRQSc4

まず教材データを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/2c34913e-bc0c-ca82-f80e-0a33779c90cb.png)

データの取得　→　テーブルまたは範囲から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/557ac2e2-ef3b-09bc-c387-6acad41716eb.png)

勝手に範囲選んでくれるのでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/0c5bd774-4186-a7a0-6a09-d1a0e7ccfc82.png)

エディタが開くので右端の2つの列を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/207658be-a0f4-6926-e8d7-da08c7021570.png)

カスタム列を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/591569c3-4b36-2e64-26fd-9a516653c60d.png)

このように入力（ここまで1分以内）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/79081de7-177b-6335-bbce-9b656d04a3eb.png)

条件列を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/7b10956f-729c-c9ee-4440-e932c813c438.png)

このように入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/fffad752-ef58-05a5-dc33-c0aa6192199d.png)

閉じて保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/00b4e51b-c655-4e75-20ae-5ff370df0468.png)

ここでタイマーストップ。記録は1分56秒でした。（ゆっくりボイス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/64c2f7c5-cbfc-0115-46d8-fe53dc33945a.png)

YouTubeの講座と同じ結果か確認。繰り返しますがこの動画自体はとてもすばらしいものですよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2593011/1e11de3d-a360-c17e-35d5-1a29e424cd29.png)
laravel ライブラリを使っての位置情報検索

https://qiita.com/ma7ma7pipipi/items/13c49128458bebdd95e1

上記ライブラリ無しバージョンを参考に、ライブラリありをやってみる。

```
composer require grimzy/laravel-mysql-spatial
```

```Geo.php

use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;

class Geo extends Model
{
    use SpatialTrait;

    protected $spatialFields = [
        'location',
    ];
}

```

# 実践

```HogesController.php
    public static function test(request $request)
    {

//        名古屋駅
//        $lng = 136.881537;//経度　縦方向
//        $lat = 35.170915;//緯度　横方向

//        青森
        $lng = 140.850702;
        $lat = 40.881797;

        $res = Geo::query()
            ->orderByRaw('ABS(Y(location) - ? ) + ABS(X(location) - ? )', [$lng, $lat])
            ->get();

        foreach ($res as $v) {
            echo $v->name . "<br>";
        }
    }
```

近い順に並びましたね！


# 注意

モデル に spatialFields を適切に指定しないとエラーになる

```
at /var/www/html/twikon.club/vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php:88
 possibly incorrectly encoded {"exception":"[object] (InvalidArgumentException(code: 0): Malformed UTF-8 characters,
```
tableau 自力でサンキーダイアグラムを構築する


### サンキーダイアグラムを自力で実現する
【実行環境】 Windows10 tableau2021.2

３ステップ以上の段階をサンキーダイアグラムで実現する必要が出てきたため、
Publicにあったワークブックを参考に自力で構築しました。

細かいことは説明しません。備忘も兼ねて記載します。


####データセットの作成
Excelだとこんな感じ↓
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/0caa4884-b29a-ca13-92fd-9c2fef746858.png)

first_typeから、second→thirdとステップアップするイメージです。

####計算フィールドの作成
何も考えずに↓の計算フィールドを作ってください。
[t]
(INDEX()-25)/4

[Sigmoid]
1 / (1+EXP(1)^-[t])

[ToPad]
IF [Unique Id] = {FIXED [First Type],[Second Type] : MIN([Unique Id])}
THEN 49
ELSE 1
END


[ToPad2]
IF [Unique Id] = {FIXED [Second Type],[Third Type] : MIN([Unique Id])}
THEN 49
ELSE 1
END


[Padded]
[ToPad]でビンを作成
※ビン幅1
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/0824aecb-30f0-16f1-c531-83ec170d4157.png)


[Padded2]
[ToPad2]でビンを作成
※ビン幅1


[Sizing]
WINDOW_SUM(SUM([レコード数]))
※設定に注意
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/3c335152-f56f-969e-6c21-a9f826c3f962.png)


[Sizing2]
WINDOW_SUM(SUM([レコード数]))
※設定に注意
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/935e7f4a-198d-a4eb-5d11-95d866c3af99.png)




[Rank1]
RUNNING_SUM(SUM([レコード数])/TOTAL(SUM([レコード数])))
※設定に注意
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/e5868919-289e-e74c-26d5-9e988d2155a1.png)



[Rank2]
RUNNING_SUM(SUM([レコード数])/TOTAL(SUM([レコード数])))
※設定に注意
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/c31faffd-3509-6d30-ed1d-416e7cfea76e.png)


[Rank3]
RUNNING_SUM(SUM([レコード数])/TOTAL(SUM([レコード数])))
※設定に注意
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/4ec7dac1-70da-6b60-3be6-0f31a0298323.png)



[Rank4]
RUNNING_SUM(SUM([レコード数])/TOTAL(SUM([レコード数])))
※設定に注意
![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/48dd7dc3-702f-a71f-dc5a-35e99ed464ba.png)



[Curve1]
[Rank1] + ([Rank2]-[Rank1])*[Sigmoid]+0.06
※0.06は調整してね

[Curve2]
[Rank3] + ([Rank4]-[Rank3])*[Sigmoid]+0.06

[レコード数]
1


####ワークシートの作成
①
![worksheet01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/d6376fa5-23ee-4dc7-2b94-512fe3e8d4bf.png)

②
![worksheet02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/aea550b5-c98b-1203-d30b-e15df4c9124b.png)

③
![worksheet03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/207ecc1e-02d2-62da-17a2-b16804506960.png)

④
![worksheet04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/1bf1dfd9-00c4-954c-0ca4-0a8bd224d9b0.png)

⑤
![worksheet05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/7f73de70-2499-4178-fa47-e102dcd174a5.png)




####ダッシュボードの作成
①から⑤をがっちゃんこして調整するだけ！ヘッダーとか軸の調整とかはご自身でどうぞ！
![dashboard01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2466674/a12aade3-ca01-83ee-ad6a-2ea6bca5d5ea.png)


集計関数の向き先を変更したりシグモイド関数で整形したり、新たな世界が見えてきたぞ...！
３０代初心者インフラエンジニアが知っておくべきWindowsのファイル名を指定して実行で使用できるコマンド一覧

| 内容 | 入力コマンド | 
|:-:|:-:|
|  リモートデスクトップを開く |  mstsc |  
| ペイントを開く  | mspaint  | 
|  コントロールパネルを開く | control | 
|  サービスを開く | services.msc |
【Minecraft Forge】DynmapのストレージをMariaDBに変更した際の手順

# Minecraftサーバのストレージ
第8世代Coreのmini-ITXで組んだサーバ上にハイパーバイザをどすんして、仮想マシンを以下3個動かしてます。

* Minecraft forgeサーバ
* Minecraft Webサーバ（Dynmapへのリダイレクトやインフォメーション）
* discord botサーバ

サーバ上にあるストレージがNVMe SSDだけなのでforgeで動かしているdynmapのアクセスが急に不安になった。

# Synology NASにMariaDBをインストール
SynologyのNASソフトウェアの[DSM](https://www.synology.com/ja-jp/dsm/packages)はサードパーティーソフトとして、MariaDBをインストールして動作させることができる。なのでインストールする。
MariaDBインストール後の設定からTCP/IPを受け入れる設定を忘れずに。
一緒にphpMyAdminを入れて、dynmap用のDBを作ったりアクセス用のユーザを作ったりする。

# dynmapにjdbcドライバを組み込む
これにたどり着くのが一番面倒だった。  
$CLASSPATHで、jdbcドライバを指定してもうまくいかなかったので、[ここ](https://zerogravityantfarm.com/post/dynmap-sql-backend-with-fabric/)を参照にdynmapのjarに直接おうぶちこんでやるよをした。
簡単にまとめると、7zipなどでdynmapのjarと、jdbcのjarを開いた状態でjdbcの中身をdynmapのjarに入れるだけです。
あとはdynmapのconfiguration.txtを修正。  
```vim:configuration.txt
storage:
  # typeをfiletreeからmariadbに変更
  # Filetree storage (standard tree of image files for maps)
  #type: filetree
  ~中略~
  type: mariadb
  hostname: IP_ADDRESS
  port: MARIADB_PORT
  database: DB
  userid: USER_ID
  password: USER_PASSWORD
```

# 結
[dynmap公式wikiのstorage節](https://github.com/webbukkit/dynmap/wiki/Storage-Setup)にも設定の資料がないし、日本語の資料が無かったので、記事にしました。

# 記事を全部書いた後に気づいた追記
Minecraft mod用のjdbcがあった・・・
https://www.curseforge.com/minecraft/mc-mods/mysql-jdbc

# 追記2
上記のwikiに手順が追加されてました。
また公式おすすめの方法としては、前追記のJDBC Modを使う手順を推奨してるようです。
この記事は無意味になりました。ﾁｰﾝ。
Windows Subsystem for Android を今入れる

2022/03/15 ではまだ日本のストアからはダウンロードできないので、ちょっと設定を変えてインストールすることができたので紹介

# 設定
設定ー＞時刻と言語ー＞言語と地域ー＞国または地域　の項目を米国に設定。
これだけ

# install
まだAmazonAppstoreをインストールしないとSubsystemがついてこないので、`Amazon Appstore` を検索。出てくるのでそれをインストール。
ログインはしない。
Android 用　Windows　サブシステム設定ってのがスタートメニューに追加される。

# appのインストール
ADBを使ってインストールできます。
Android 用　Windows　サブシステム設定　から、開発者モードを有効にし、アドレスを確認する。

```
adb connect 127.0.0.1:XXXXX
```

みたいな感じで接続して、

```
adb install ~~~.apk
```

でインストールするとスタートメニューに現れます。
【Docker】Dockerfileの基本的な書き方


# Dockerfileとは
**Dockerイメージ**を作成するために必要な設定などを管理するファイルのこと。
この**Dockerfile**をビルドすることで**Dockerイメージ**を作成できる。

# 基本的な書き方
**Dockerfile**で使われるコマンドをいくつかまとめておく。

## FROM
ベースとなるイメージを指定する。
```
FROM <イメージ名>:<バージョン>
```
バージョンを指定しない場合は、最新バージョンが取得される。

## WORKDIR
コマンドを実行する作業ディレクトリを指定する。
```
WORKDIR <パス>
```
もし、ディレクトリが存在しない場合は自動作成される。

## RUN 
イメージ作成時に実行したいコマンド指定する。
```
RUN <実行したいコマンド>
```
複数コマンドを実行させたい場合は``&&``で連結して1つの``RUN``でまとめることができる。

## COPY
指定されたファイルやディレクトリをコピーする。
```
COPY <コピー元>　<コピー先>
```

## ENV
Dockerfile内で使用する環境変数を設定する。
```
ENV <環境変数名>=<値>
```

## CMD
コンテナ起動時に実行するコマンドを指定する。基本的には末尾で1度だけ実行される。
```
CMD ["<コマンド>", "<オプション>", ...]
```
[Windows Server 2019]言語を変更しようとしてSystemSettingsAdminFlows.exeからパーミッションに関するメッセージが表示された場合の回避方法

# はじめに
AzureなどでWindowsを使うと、デフォルト言語がUSなので言語を変更することが多いのですが、Windows Server 2019(2016とかも同じかと思いますが)で管理者権限でログインしているのにもかかわらず、言語を変更しようとして設定画面を開くと、SystemSettingsAdminFlows.exeに「多分適切なパーミッションではない」云々と怒られることがあります。
以下のようなエラーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/b28c357a-3fca-93ed-6af5-ad0b798dee57.png)

その回避方法を毎回忘れるので、記事にしました。
## 回避手順
Local Security Policyを開き、「Local Policies」-> 「Security Options」をクリックし、右の「User Account Control: Admin Approval Mode for the Built-in Administrator account」を探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/1e43f85d-476d-8512-0396-87edb9915bfa.png)

ダブルクリックし設定画面を開き、「Enabled」を選択し閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/40ed41ed-37f6-1189-3cca-4ec38f3b5a15.png)

一度ログオフし再ログイン後、言語設定を開くとメッセージは表示されず言語を変更できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/a6f860c4-483c-329e-5fc2-89cf79bb1016.png)

# 終わりに
Windowsは難しいですね。
３０代初心者インフラエンジニアが知っておくべきWindowsのショートカット

| 内容 | ショートカットキー | 
|:-:|:-:|
|  ［ファイル名を指定して実行］を表示する |  Windowsボタン　＋　R |  
| エクスプローラーを起動する  | Windowsボタン　＋　E  | 
|  指定した範囲のスクリーンショットを撮影する |  Windowsボタン　＋　Shift ＋　S|
サーバレスで動画共有サイトを作成して社内に公開

youtubeに本記事の動画を作成しました。(2022/06/24)

https://www.youtube.com/watch?v=j0G4E-oCAzM&t=2s


本内容は下記JAWS-UGのLTで登壇させて頂きました。

https://jawsug-bgnr.connpass.com/event/237621/

https://speakerdeck.com/toru_kubota/create-movie-sharing-site-using-aws-serverless

# 実施した内容
AWSのサーバレスで動画共有サイト作成して、社内のイントラに公開しました。
作成した動画共有サイトでメンバーの教育、動画業務マニュアル作成、他部署との情報共有などに使用しています。

![Site1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/09e46f23-d124-241c-50b0-64ac49cd1ab3.png)

# 作成した背景
社内でAWS研究開発を実施していました。資格取得、ハンズオンなどAWSの基礎知識習得を行ってきました。一通り基本的な環境は作成出来るようになったのですがまだこの段階では設計・構築案件などがなかったため、その後何をやるかに悩んでいました。元々、チームで教育の問題や動画のマニュアル化などを検討していたため、問題解決とAWSスキルアップのため動画共有サイトを作成しました。

![Site2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/836d458e-26dd-0349-96b9-64219b3e0b21.png)

# 目的
* AWSのスキルアップのため、サーバレス環境を設計・構築する
* メンバーの自発的に発信出来る環境を整備して教育に役立てる
* 動画マニュアル化を行い（人によって間違った内容を教えないようにするため）手順の標準化を行う
* （運用依頼事項などの）他部署に対しての情報発信を行なう

# 作成した機能
* 動画閲覧機能
アップロードした動画を閲覧する機能です。

* テスト受講&受講履歴閲覧機能
動画閲覧後にテストを受講する機能です。

![Site3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/9846b5bb-01c0-f1c6-25d9-32d0afc10ab5.png)


# アーキテクチャ
* 動画、HTML、CSS等はS3に配置。S3の静的WEBホスティングを使用しています。
* テスト受講機能はAPI Gateway,Lambda,DynamoDBを使用しています。
* 問合せ機能ではフォームに入力があるとSNSで管理者にメール通知する設定です。

![Site4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/645d83fd-2859-7b50-3bd3-716356cd4881.png)


# 振返り
メンバーが動画作成し自発的に発信出来る環境が出来ました。（動画アップロード数45本）
また、動画マニュアルなども整備が進み、チーム内の取組内容なども動画化して社内に発信することで楽しみながら業務課題の解決が出来ました。AWSのスキルについても（セキュリティ設定等）細かい所まで設計・構築出来ため業務で使用出来るレベルになりました。

![Site5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/1a194f90-8683-3a40-9d26-40a5976b4443.png)

# 動画サイトその後
* 動画数が65本に増加
* スペシャリストSuminoさんによりサイトのデザイン修正が行われよりおしゃれな雰囲気に

![Site6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/1d45346d-49d7-2fee-23a7-314954354ac4.png)
VSCodeでPython外部モジュールの予測入力させたかった。

##### あらすじ
ご無沙汰しております。じーくです。

PythonのWebスクレイピングの本を読んでいたら、
外部モジュール(tesseract)を使用して実行するコードがあったので、
いつも通り環境にインストールしてコーディング……しようとしたら何やら異変……

**importしたモジュールの関数候補がコーディング中に出てこない……**
![denele.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377966/1ffd8b4b-3134-5d5f-b1f3-573366af0a71.png)
確かにインストールして、Powershell側でもコマンド入ってること確認したんだけどなぁ……
再インスコか……？再起動ですまなかったか……？

これは一大事。まあ一応開発はできるし実行できれば動くんだけど、
コーディング中には、ちゃんと書けているのかがわからない。
そして、Warningのにょろにょろが気持ち悪い……(個人の感想)
ああでもねぇこうでもねぇと一日中ネットの海を泳ぎまわり、
ようやく解決できたので方法を共有します。

##### 手順
###### いつも通りインストールする
```
> pip install tesseract
> pip install pytesseract
```
インストール後の確認は各自よしなに。

###### インストール先を確認する。
```:pipインストール先確認
> pip show tesseract
Name: tesseract
Version: 0.1.3
Summary: Tesselation based Recovery of Amorphous halo Concentrations
Home-page: http://vpac00.phy.vanderbilt.edu/~langmm/index.html      
Author: Meagan Lang
Author-email: meagan.lang@vanderbilt.edu
License: UNKNOWN
Location: c:\programdata\anaconda3\lib\site-packages

Requires:
Required-by:
```
↑こんなんが出てくるから**Location**のところを拝借。


###### 環境設定ファイルを作成(.env)
```:${workspaceFolder}/.env
PYTHONPATH="c:\\programdata\\anaconda3\\lib\\site-packages"
```
Pythonのワークスペースに指定しているフォルダの直下に配置する。

###### setting.jsonを編集する。
(下記をJSONの形を崩さないように追記)
```:setting.json
"python.envFile": "${workspaceFolder}/.env",
```
,(カンマ)を入れるかどうかは追記場所次第。

###### 保存してVSCodeを再起動する
###### コーディングして確認！
![deta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377966/36f3fbe6-5f06-4ba5-aa77-c469369b17ba.png)
これで、開発が捗ります。。。よかったよかった。


##### 素晴らしい参考サイト様
[Pylint "unresolved import" error in Visual Studio Code (Stack Overflow)](https://stackoverflow.com/questions/53939751/pylint-unresolved-import-error-in-visual-studio-code)

また、何かあったら書きこもうと思います。
よろしくお願いしますm(_ _)m
matplotlibとグラフ作成の2つの流儀

# はじめに
pythonでグラフを描画する際の定番ともいえるライブラリmatplotlibですが、仕組みがよく分からず雰囲気で使ってしまっていた（そのせいでグラフを描くのにすごく時間がかかっていた）ので、いろいろ調べてようやく仕組みが分かりました。
その概要を備忘録を込めて簡単にまとめておきたいと思います。
一番下に参考にさせて頂いたページを載せておきます。

# matplotlibでのグラフ作成の仕組み
matplotlibでは、グラフの台紙や描画領域など、「グラフの入れ物」になる部分をオブジェクトとして扱い、このオブジェクトの中にグラフの線や点、あるいは凡例といった装飾品などの要素を追加していくことでグラフを作成していく、という仕組みになっています。

グラフを作成する際は、まず台紙部分やグラフの描画領域となるオブジェクトを生成し、オブジェクトに対して必要な要素（例えばグラフの線など）を追加していきます。オブジェクトにグラフの要素を追加していく操作は、オブジェクトに付随したメソットで行うことができます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533999/6ee417d0-7a0c-4be5-72c7-f299cdbcb1ef.png)

グラフの入れ物として作成するオブジェクトとしては、グラフの台紙部分であるFigure、グラフの描画領域であるAxes、そしてグラフの軸部分であるAxisがあります。（Tickというのもあるみたいですが一旦無視します）

* Figure ： グラフの台紙（一番外側）部分のオブジェクト
* Axes   ： グラフの描画する領域のオブジェクト
* Axis   ： グラフの軸を表すオブジェクト。x軸とy軸でそれぞれXAxisとYAxisという。

上のオブジェクトは下記のように階層構造をもっています。つまり、最も外側にグラフの台紙があり、次にグラフの描画領域があり、さらにその内部にグラフの軸を表す部分があるということですね。

```:オブジェクトの階層構造
Figure
　└ Axes
      └ XAxis
      └ YAxis
      └ Tick
```

# グラフ描画の流儀
matplotlibでグラフを描画する際のコードの書き方としては、「オブジェクト指向スタイル」と「MATLAB」の２つの流儀があります。

オブジェクト指向スタイルの流儀は、先ほど上に記載したオブジェクト（台紙、描画領域など）を自分で生成し、そのオブジェクトに対して要素（グラフの点など）を追加していく方法でグラフを作成する方法です。
```python:オブジェクト指向スタイル
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()          # figureオブジェクトを作成
ax = fig.add_subplot(111)   # Axesオブジェクトを作成(Axisも一緒にできる)

x = np.linspace(-3, 3, 100)
y = np.exp(x)

ax.plot(x, y)  # Axesオブジェクトにグラフの線を追加
plt.show()     # グラフを描画
```

そして、MATLABの流儀は、グラフを描画する際の記述を全て「plt.xxxxx」のように書く方法です。オブジェクト指向スタイルでは、FigureやAxesといったオブジェクトを自分で生成していましたが、MATPLAB流では自動で生成してくれます。
```python:MATLAB流
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 100)
y = np.exp(x)

plt.plot(x, y)
plt.show()
```
上のコードを実行すると、グラフはこんな感じでできます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533999/23878a1e-de71-14ea-e1db-460697e6fd3f.png)

# どちらの流儀を使うか
いろいろ調べてみると、MATPLAB流は簡単にグラフが作れる一方、細かな装飾など微調整ができないため、できればオブジェクト指向スタイルに慣れておくほうが良いという意見が多かったです。

たしかにそうだなあと思いました。また、オブジェクト指向スタイルは、「グラフの外側をオブジェクトとして作成し、その中に要素を付け加えていくことでグラフを描画する」というmatplotlibの仕組みに則っていてわかりやすいです。初めに台紙を作ってプロットしていくという、実際に紙の上でグラフを描く場合と工程が同じだということもあり、やっていることがイメージしやすいので、個人的にもオブジェクト指向スタイルのほうが好みではあります。

# 参考
下記を参考にさせて頂きました。とても参考になりました、ありがとうございます。
[早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)
[pythonのmatplotlibの使い方をまとめてみた](https://qiita.com/renesisu727/items/24fc4cd8fa2635b00a0d)
[matplotlib の２つの流儀（ MATLAB・オブジェクト指向スタイル）](https://boul.tech/mpl-plot-style/)
DAXメジャーを使って、集計カウントゼロ件を省略されることなく抽出できるようにする

# 前提
定期的に取得するアンケートや、対象者が（ある程度）決まっているアンケートの集計にPower BI を用いると、データモデルさえ出来ていれば回答者数や回答数など簡単に集計することが出来ます。
一方で未回答の人に催促しようとした場合、未回答者の抽出や、まだ回答されていないアンケートをリストアップしようとすると、上記のように簡単にはいかないため、ひと工夫する必要があります。

名簿テーブル
| ID | 氏名 |
|:-:|:-:|
|   1| A氏   |
|   2| B氏  |
|   3|C氏   |
|   4|D氏   |

アンケート回答ステータス
| アンケート名 | 回答者ID | 回答日 |
|:-:|:-:|:-:|
|   職場改善|  1 | 2022/1/12  |
|   職場改善|  2 | 2022/1/23  |
|   満足度|  2 | 2022/2/1  |
|   満足度|  3 | 2022/2/2  |

データモデル
アンケート回答ステータス.ID → 名簿テーブル.ID

これを普通に可視化すると、未回答のD氏が出てこずに、こうなります。
| 氏名 | アンケート名のカウント |
|:-:|:-:|
| A氏  | 1  |
| B氏  |2   |
| C氏  |1   |

# やりたいこと
未回答者にフォローアップしたいので、ゼロ件の人も抽出されなければなりません。
| 氏名 | アンケート名のカウント |
|:-:|:-:|
| A氏  | 1  |
| B氏  |2   |
| C氏  |1   |
| D氏  |0   |


過去一度も回答していない人の抽出
上記でいうとD氏

スライサーで設定した範囲で回答されていない人の抽出
2022/1/15 ～ 2022/2/15 で指定した場合、A氏とD氏

# 実装方法
Power QueryとDAXのどちらも実装出来そうですが、Slicerとの相性を考えてDAXで実装しました。
下記のメジャーを名簿テーブルに加えます（どこでもよいようです）。

```dax:回答数のメジャー
回答数 = 
VAR SumTotal =
    CALCULATE(
        COUNT('アンケート回答ステータス'[回答者ID]), 
        ALL('アンケート回答ステータス'[アンケート名])
    )
RETURN
    IF ( ISBLANK ( SumTotal ), 0, SumTotal )
```
回答者数というメジャーが出来るので、表なり値なりにドラッグ＆ドロップすれば、未回答のD氏がリストアップされます。
アンケート名をSlicerに加えればさらにアンケート毎に未回答者を絞り出せます。
実現出来てみれば、0件をきちんと出せばよいだけなので、たいしたことないんですが、ちょいと苦労しました。
LinuxでWindowsサーバーの共有フォルダをマウントする

FTPを立ててほしかったけど、相手方がWindowsの共有フォルダが良い！というのでフォルダをLinux上にマウントします。
たしか15年くらい前にそんな連携をやったなぁと思って当時の記憶を頼りにCIFS（しふす で読み方合ってる？）といキーワードを思い出しました。
linux上からははNFSのようにマウントできて普通にファイルの読み書きができるようなので便利そう。コレにします。


## ひとまずマウントしてみる

```
$ sudo mount -t cifs -o user=win_username,password=win_password //10.10.10.1/WinShareFolder /mnt/linuxdir
mount: /mnt/linuxdir: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
```

怒られました。オプションがだめだそうです。

## 必要なもののをインストール

```
$ sudo yum install -y samba-client cifs-utils
```

-yなので特に何もせず終わるのを待ちます。

## もう一回トライ

```
$ sudo mount -t cifs -o user=win_username,password=win_password //10.10.10.1/WinShareFolder /mnt/linuxdir
$ 
```

なんにも言われないので成功した？

```
$ df -h
Filesystem                   Size  Used Avail Use% Mounted on
・・・
//10.10.10.1/WinShareFolder  4.0T  1.5T  2.5T  25% /mnt/linuxdir
・・・
$
```

成功したみたいです。良かった。

## 忘れずに再起動用の設定追加

後は再起動しても復帰するように fstabに記載しておきます
コレをしておかないと、OS再起動後にはmount設定が消えてなくなります。

```/etc/fstab
# mount setting
//10.10.10.1/WinShareFolder/ /mnt/linuxdir/ cifs username=win_username,password=win_password,file_mode=0755,dir_mode=0755 0 0
```

オプションはこちらを参考にしました。
http://www.profaim.jp/tools/soft/linux/auto_mnt.php

#### ちなみに

マウントする際、パスワードに記号(!)が入っていたのですが、そのままだとmountコマンドに弾かれました。
記号の前にエスケープが必要でした(\\!)
EC2リザーブドインスタンス２パターン

①スケジュールされたリザーブドインスタンス(一定の予約済インスタンス)(Scheduled Reserved Instances)
→廃止
スケジュールで購入できるのはオンデマンドインスタンスだけ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-scheduled-instances.html

②全ての予約済インスタンス（All Upfront Reserved Instance）
→一括払いなり
https://aws.amazon.com/ec2/pricing/reserved-instances/pricing/
統合テストについて

# システム開発で組み合わせテスト技法について
ソフトウェアテストにおける組み合わせテスト技法として、オールペア法や直行法などがあります。組み合わせテスト技法はテストケースを大幅に削減することができます。非常に強力な技法です。しかし、組み合わせテスト技法はうまく工夫しないと適切な因子・水準を摘出できなくなってしますため、効率的かつ効果的にテストを行うことが重要です。今回は、システム開発で組み合わせテスト技法を使いこなすための4つ方法。

## 組み合わせテスト技法の大原則
組み合わせテストではテスト対象の項目を因子、対象項目がとりうる値を水準と呼びます。例えば、OSを因子とした場合は、水準には、「Windows」　「MacOS」　「Linux」などが該当します。表の横(列)に因子、縦(行)に水準をとり、任意にN列(つまりN因子)を選んだ時の水準の組み合わせが全て一回以上表れるような組み合わせを「N因子間網羅」と言います。組み合わせテスト技法となるテストケースを作成することがです。組み合わせテスト技法では、特に２因子間網羅をよく使用します。代表的な技法としては、２因子のすべての組み合わせが同じ回数現れる直公表と、少なくとも１回現れるようなオールペア法が挙げられます。

組み合わせテストの技法は、組み合わせ条件が増えてテスト実行に支障が生じる場合に活用する手法であり、効率性を求めて案内にテスト技法に頼ることは望ましくありません。初めから組み合わせテスト技法を適用してテストパターンを削減したり、因子安順の性質を考慮せずに組み合わせを省略しようとしたりすると、本来テストケースがカバーするべき条件が満たされない場合があります。
洗い出した因子・水準をそのまま用いてオールペア法(All-Pair)や直公表を適用し、テストパターンを作成することが組み合わせテストの大原則であり、テストパターンの削減や効率化に活用するテスト技法は、目的や意図に合わせて見極める必要があります。

## 組み合わせテストを使用するためには
- 必要なテストパターンを網羅する因子と水準を設定する
- 禁則組み合わせの抜け漏れや重なりに着目する
- 因子や水準の優先度を調整する
- 「機能要求」から必要な因子・水準を抽出する

## まとめ
膨大なパターンのテスト条件が設定されがちな組み合わせテストですが、テスト工数を削減しようとむやみにテストケース数を減らす試みは適切ではありません。まずは必要な因子と水準を洗い出した上でテスト目的と実装内容に即した効果的なテストケース数の調整を行う必要があります。
システムの仕様と因子・水準を見比べ、禁則パターンを抽出したり機能仕様に基づく因子抽出を抽出を行なったりすることが出来れば必要最低限のテストパターンを用いてテストケースを作成できるでしょう。今回ご紹介したポイントを踏まえて、組み合わせテストを効果的に実施してみてください。
Databricksデータ共有ガイド

[Data sharing guide \| Databricks on AWS](https://docs.databricks.com/data-sharing/index.html) [2022/3/10時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

このガイドでは、Databricksで組織外の受領者とのデータ共有を行うためにどのように[Delta Sharing](https://qiita.com/taka_yayoi/items/3a53516c4434c0ee76f0)を使うのかを説明します。

[Delta Sharing](https://qiita.com/taka_yayoi/items/3a53516c4434c0ee76f0)は、Databricksによって開発された、どのような計算プラットフォームを使っているのかに関係なく他の企業とデータを共有できるセキュアなオープンプロトコルです。Delta SharingはUnity Catalogのメタストアのデータに対して使用することができます。[Unity Catalogを使い始める](https://qiita.com/taka_yayoi/items/3f2df6ddea81521ee786)をご覧ください。

Delta Sharingでデータを共有するには以下の手順を実行します。

1. [Unity Catalogのメタストアにデータをロード](https://docs.databricks.com/data-governance/unity-catalog/create-tables.html)します。
    新規テーブルを作成し、レコードをインサートするか、ワークスペースローカルのHiveメタストアから[既存テーブルをUnity Catalogにインポート](https://docs.databricks.com/data-governance/unity-catalog/migrate.html)することができます。
1. メタストアで[Delta Sharingを有効化](https://qiita.com/taka_yayoi/items/3a53516c4434c0ee76f0#%E3%83%A1%E3%82%BF%E3%82%B9%E3%83%88%E3%82%A2%E3%81%A7delta-sharing%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B)します。
1. 共有(share)と受領者(resipient)を作成します。共有と受領者はDelta Sharingのオブジェクトです。
    - *共有*(share)は1人以上の受領者と共有するテーブル、テーブルのパーティションの読み取り専用のコレクションを意味します。メタストアで複数の共有を作成することができ、どの受領者がそれぞれの共有にアクセスできるのかをコントロールすることができます。1つのメタストアには複数の共有を含めることができますが、それぞれの共有は1つのみのメタストアに属することができます。共有を削除すると、その共有の全ての受領者はアクセス権を失います。
    - *受領者*(recipient)は、1つ以上の共有にアクセスできる組織を許可する認証情報と組織を関連づけるオブジェクトを意味します。受領者を作成すると、受領者がダウンロード可能な認証情報が生成されます。メタストアで複数の受領者を作成することができますが、それぞれの受領者は1つのみのメタストアに属することができます。受領者は複数の共有にアクセスすることができます。受領者を削除すると、それまでアクセスできていたすべての共有にアクセスできなくなります。
1. 受領者を作成し、共有に対する受領者のアクセスを許可した後で、セキュアなチャネルを通じて受領者とやりとりを行い、認証情報をダウンロードできるユニークなURLを受領者に送信します。

    認証情報ファイルは一度しかダウンロードすることはできません。ご自身の組織の他の方と共有する場合には、パスワードマネージャを使用することをお勧めします。

    また、[Delta Sharingのデータ受領者向けドキュメント](https://qiita.com/taka_yayoi/items/f45b77984c3ed4b6a0c0)を共有します。彼らは、あなたが共有したデータにアクセスするためにこのドキュメントを活用することができます。

1. 任意のタイミングで、共有コンテンツを変更し、受領者がアクセスできる共有を変更し、共有や受領者を削除することができます。
1. データ受領者は即座にライブかつ最新の共有データに対する読み取り専用アクセスを取得します。
1. データ提供者は、誰が共有、受領者を作成し、どの受領者がどの共有にアクセスできるのかを理解するために、Delta Sharing向けの[監査ログを有効化](https://qiita.com/taka_yayoi/items/3a53516c4434c0ee76f0#delta-sharing%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A8%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E3%81%AE%E7%9B%A3%E6%9F%BB)することができます。
1. Delta SharingのデータにアクセスするためにDatabricksを使用しているデータ受領者は、誰がどのDelta Sharingデータにアクセスしているのかを理解するために[監査ログを有効化](https://qiita.com/taka_yayoi/items/f45b77984c3ed4b6a0c0#delta-sharing%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A8%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E3%81%AE%E7%9B%A3%E6%9F%BB)することができます。

このガイドでは以下を説明します。

- [Delta Sharingによるデータ共有\(プレビュー\)](https://qiita.com/taka_yayoi/items/3a53516c4434c0ee76f0)
- [Delta Sharingを用いて共有データにアクセスする](https://qiita.com/taka_yayoi/items/f45b77984c3ed4b6a0c0)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【よくあるエラー対応】"-[UIViewController _loadViewFromNibNamed:bundle:] loaded the \"xibファイル名\" nib but the view outlet was not set."

# 状況
- Xcodeの`InterfaceBuilder`を用いてViewを作成し実行したところ、View生成時に以下のエラーに遭遇。

```
"-[UIViewController _loadViewFromNibNamed:bundle:] loaded the \"xibファイル名\" nib but the view outlet was not set."
```
つまり、「指定された　xibファイルを読み込んだけど、ViewのOutletがセットされてないよ〜」　とのこと。

そういえば、 別のxibファイルからViewをコピぺして、最初に生成されていたViewを消しちゃってそのままにしてたなと。

# 対応

ViewのOutletをセットしてあげましょう！

## xibファイルを開き、`File's Owner`を選択
## 右端の`inspector`を表示し、一番右端の`Outlets`を選択

ここでViewにOutletが接続されていないことがはっきりわかりますね
![スクリーンショット 2022-01-28 18.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999511/d475043e-5a99-5026-c69f-5be4dc88ef75.png)

## Outletのviewの丸ポチからドラックし、Viewの上でドロップ

![スクリーンショット 2022-01-28 18.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999511/c114fff3-6a71-87f4-6788-6a60324b8681.png)

## Outletのセットが完了！

以下の状態で実行したところ、エラーは解消されました✨
![スクリーンショット 2022-01-28 18.41.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999511/c54d0b8f-913d-1d5f-53f9-85d60014dded.png)

#  最後に
よくやってしまいがちなエラーなので、次回のために対応をまとめてみました！
DockerはLinuxOSでしか動かない【個人的なお勉強アウトプット】

コンテナの中にはLinuxのディストリビューションが入っている。
なので、Linuxのカーネルにしか命令を伝えることができない。
なのでLinuxOSじゃないと動かない。
WinやMacで動いているのは、Linuxの仮想環境の上にLinuxOSをインストールしてその上でDockerを動かしているケースや、Desktop Docker for Windows や　Desktop Docker for MacのようなDockerの実行に必要なLinuxを含むパッケージをインストールしている。
つまり、WinやMacOSの上にさらにLinuxOSを強引に入れて動かしている。

# 参考書籍
https://www.amazon.co.jp/dp/B08T961HKP/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
sourceTreeでBitbucketにpushしようとして認証エラー

sourceTreeでBitbucketにpushしようとして認証エラーになりました。

2日前まで、できていて設定は変更してないはずですが、なぜか下記のエラーが起こるようになりました。
仕事で使っているアカウントなので、Bitbucket側の設定が何か変更になったのかもしれませんが、とりあえずエラーメッセージのURLを読んでみました。

```
git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v origin refs/heads/xxxx:refs/heads/xxxx 
Pushing to https://bitbucket.org/xxxxxxx.git
remote: Bitbucket Cloud recently stopped supporting account passwords for Git authentication.
remote: See our community post for more details: https://atlassian.community/t5/x/x/ba-p/1948231
remote: App passwords are recommended for most use cases and can be created in your Personal settings:
remote: https://bitbucket.org/account/settings/app-passwords/
fatal: Authentication failed for 'https://bitbucket.org/xxxxxxx.git/'
Completed with errors, see above
```

`https://atlassian.community/t5/x/x/ba-p/1948231`
ここでこの件について説明されているようです（英語）。

`https://bitbucket.org/account/settings/app-passwords/`にアクセスすると、bitbucketのアプリパスワードを設定する画面が表示されます。

いろいろ調べた結果、アカウント＆パスワードでの認証ではダメで、このアプリパスワードをbitbucketで作成して、それをsourceTreeにも設定しないといけないようです。たぶん。

・アプリパスワードの設定方法についての説明
`https://support.atlassian.com/ja/bitbucket-cloud/docs/app-passwords/`

ここで、アプリパスワードを作成する際に、「このアプリ パスワードに与えるアクセス権と権限を指定します」としか書いてありませんが、権限で「アカウント」を追加しないといけないようです。
最初、それなしでリポジトリの読み書きだけで作ったら失敗しました。

アプリパスワードの設定は修正はできないので、設定を変えたい場合は削除して新しく作ります。
パスワードは一度しか表示されないので、わからなくなってしまったら、また削除して作り直す以外ありません。

権限：アカウント（全部チェック）、リポジトリ（読み書き管理）、プルリクエスト（読み書き）

私は上記の権限を追加してpushできるようになりました。
（pushするのにプルリクエストはいらないと思いますがつけてみました）

bitbucketでアプリパスワードを作り
sourceTreeの環境設定→アカウント→追加、でアカウントを下記のように作成しました。

認証タイプ：Basic
ユーザー名：bitbucketのPersonal settings→アカウント設定→Bitbucket プロフィール設定→ユーザー名のところにあるもの
パスワード：アプリパスワードで表示されたもの
プロトコル：HTTPS

これで接続できました。
プロトコルはsshで自分のpcに作ってる公開鍵を設定してもうまくいきました。

ユーザー名がメアドだと思ってましたが違ってて、ユーザー名が何かでちょっとつまずきました。
DynamoDBのキャパシティについて


（キャパシティ=スループットキャパシティ）

DynamoDB には「オンデマンド」と「プロビジョニング済み」という 2 種類のキャパシティーモードがある


「プロビジョニング済み」のキャパシティモードは
プロビジョニングされたキャパシティーとリザーブドキャパシティがある
AutoScalingが使えるのはこっちのプロビジョニングされたキャパシティの方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/27b924d8-8bcc-d6bf-31d5-b8ca30453ff1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/9477104d-bbac-d8b0-e1d9-7848733de660.png)

「オンデマンド」キャパシティモードは
オンデマンドキャパシティのみ
こっちはWCUとかRCUとかそういう単位で支払わない（使った分だけ課金）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/3cdc73c8-0d1d-cb15-0d39-3e7aff618225.png)


https://d1.awsstatic.com/webinars/jp/pdf/services/20170809_AWS-BlackBelt-DynamoDB.pdf
https://aws.amazon.com/jp/dynamodb/pricing/provisioned/
https://aws.amazon.com/jp/dynamodb/pricing/on-demand/
https://aws.amazon.com/jp/dynamodb/pricing/
スティッキービット とは

## 勉強前イメージ

同じく聞いたことあるけど記憶にはないやつ

## 調査

### スティッキービット とは

linuxなどで使用できる特殊なパーミッションの一つで、ディレクトリに適応します。
スティッキービットが設定されたディレクトリはすべてのユーザがファイルの作成・書き込みが可能です。
それでは777にしとけばいいって話ですが、
作成したファイルやディレクトリを削除出来るのは所有者のみというのが違いになります。(rootは所有者じゃなくても可能)
適応されているディレクトリは `/tmp` などが有名です。

以下が実際のcentos7の/tmpになります。
`drwxrwxrwt` の最後に `t` がありますが、これがスティッキービットになります。

```
[root@localhost /]# ll | grep tmp
drwxrwxrwt.  10 root root 4096  3月 14 19:10 tmp
```

### スティッキービット試してみる

- 概要

a_user と b_user という2つのユーザを作成。
/tmp配下にa_userがcreate_aというディレクトリを作成。
b_userはディレクトリを削除できないことを確認

- create_a ディレクトリを作成

a_user所有のcreate_aディレクトリを作成しました。
777に権限も変更しています。

```
[a_user@localhost tmp]$ ll
drwxrwxrwx 2 a_user a_user  6  3月 14 19:27 create_a
```

- b_userにログイン

ログインしました。

```
[root@localhost ]# su - b_user
[b_user@localhost ~]$ 
```

- b_userでcreate_aの削除を試してみる

怒られてしまいました・・・

```
[b_user@localhost tmp]$ ll
drwxrwxrwx 2 a_user a_user  6  3月 14 19:27 create_a
[b_user@localhost tmp]$ rm -rf create_a/
rm: `create_a/' を削除できません: 許可されていない操作です
```

- a_userにログイン

```
[root@localhost ]# su - a_user
[a_user@localhost ~]$ 
```

- a_userでcreate_aの削除を試してみる

削除できました

```
[a_user@localhost tmp]$ ll
drwxrwxrwx 2 a_user a_user  6  3月 14 19:27 create_a
[a_user@localhost tmp]$ rm -rf create_a/
[a_user@localhost tmp]$ ll
```

### スティッキービット 作成方法

- スティッキービットにするディレクトリを作成してみる

new_dir を作成しました。

```
[a_user@localhost tmp]$ ll
drwxrwxr-x 2 a_user a_user  6  3月 14 19:34 new_dir
```

一旦777にしておきましょう。

```
[a_user@localhost tmp]$ chmod 777 new_dir/
[a_user@localhost tmp]$ ll
drwxrwxrwx 2 a_user a_user  6  3月 14 19:34 new_dir
```

スティッキービットは +1000を指定するか o+u で変更ができます。

```
[a_user@localhost tmp]$ chmod 1777 new_dir/
[a_user@localhost tmp]$ ll
drwxrwxrwt 2 a_user a_user  6  3月 14 19:34 new_dir
```

## 勉強後イメージ

/tmpなんて使ったことあるのに権限まで見たことなかった・・・
確かにみんな使えるよね！
ちなみに /var/tmp も同じみたい。

```
[root@localhost var]# ll
drwxrwxrwt.  5 root root  243  3月 14 19:10 tmp
```

## 参考

- [【Linux初心者向け】スティッキービットとは？と設定方法](https://eng-entrance.com/linux-permission-stickybit)
- [スティッキービット（Sticky Bit） - 特殊なアクセス権](https://kazmax.zpp.jp/linux_beginner/stickybit.html)
遷移先のアクティビティが終了した時に元のアクティビティで処理を実行したい

タイトルの通りです。
サブアクティビティが終了した時にメインアクティビティで特定の処理をしたいです。


## 書き方
`onResume()`をオーバーライドしたらいいです。
```MainActivity.kt
class MainActivity : AppCompatActivity() {
 
    override fun onPause() {
    super.onPause()
    //ここに処理を追加する
    println("add tssk")
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}
```

## 補足
![activity_lifecycle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581152/b2178534-23b7-81cb-509d-9ccce5fe5875.png)

アクティビティのライフサイクルを見てみると他のアクティビティが最前面に来た時(another Activity comes into foreground)に`onPause()`が実行され、その後復帰すると`onResume()`が実行されるので`onResume()`をオーバーライドすればいいと分かります。
ライフサイクルを意識するとアプリが作りやすくなりそうです。

## 最後に
まだまだ勉強中ですがこれからも備忘録を兼ねて投稿していきます。
この記事の内容にに誤りがあればお知らせください、大喜びします。
[その3]AWS-SAA-躓いたメモ

### AutoScalingのクールダウンとは
AutoScalingが連続で実行されないようにAutoScalingの待ち時間を設定する。

### プロビジョニング
必要な時に応じて、ネットワークやコンピュータなどの設備を予測、需要に合わせて事前に用意する。

### CloudWatchカスタムメトリクスでは...
`メモリ稼働率`が見える様になる。(標準では見れない)

### RAIDの訳わからないやつ

|RAID  |最小構成のディスク数  |処理の特徴  |備考|
|---|---|---|---|
|RAID0  |2  |ストライピング  |高い障害性と高速な処理|
|RAID1  |2  |ミラーリング  |非常に高い、耐障害性|

### プレイスメントグループとやら(低レイテンシ、高スループット)
#### クラスタープレイスメントグループ
`単一のAZ`内のEC2インスタンスを論理化し、全て同じ`ラック`で管理する

#### パーティションプレイスメントグループ
`パーティション単位`でラックが分かれている

#### スプレットプレイスメントグループ
それぞれ個別にネットワークと電源を備えたグループ

#### S3は自動的にAZにコピーされない。

#### S3のデータ整合性モデルは、結果整合性
データ更新直後は古いデータが参照される。削除直後は削除前のデータが参照される。

#### S3で503レスポンスが増加！ライフサイクル管理を設定する！

#### Route53のALIASレコードは特殊！
Route53のALIASレコードは`ELBやcloudFrontのエンドポイント`を`CNAMEではなく、Aレコード`として指定可能

#### 複数のAZにデータを保管できるストレージサービスはEFS、FSx

#### SQS処理の重複を防ぐためには可視化性タイムアウト

#### EBS-プロビジョンどIO0PS SSD 指定したIOPS数に対して課金される
#### Accelerated VPN Connection
オンプレから利用者のゲートウェイデバイスに最も近いAWSエッジロケーションをルーティングサービスする

#### EBS同じリージョンのインsタンスであればアタッチできる！

#### Memcachedはマルチ、Redisはシングル

#### AutoScalingはSQSのキューサイズに応じて、EC2インスタンスを利用

#### cloudwatch logsでログを一丸管理できる。

### その他
- ELBに登録された、EC2インスタンスを`バックエンドインスタンス`
- NATゲートウェイを使用しない場合、NAT機能をもつEC2インスタンスをNATインスタンスと呼ぶ。

- AWSで複数のAZに冗長化できないサービス
→NATゲートウェイ

- VPCは`リージョンサービス`
- ElasticIPが課金されない時、はElasticIPをアタッチしてEc2が`停止`している時
- `ハイパーバイザー型`を使用したコンピューティングサービスは`EC2`


- cloudFormationでAWS cloud formationでプロビジョニングされるAWSリソースの集合体を`スタック`と呼ぶ
LINE APIをcurlで叩く

LINE Messaging APIによる開発を行っていて、「このデータでちゃんとメッセージが送られるのか？」というのを手軽に試す方法として、curlで直接Messaging APIを実行する方法を紹介します。

## 事前準備
事前にLINE Developersに登録しておきます。
- 参考：[LINE APIの個人検証環境を作る](https://zenn.dev/tokku5552/articles/create-line-provider)

#### 1. 友だち追加
LINE Developersにログインし、対象チャネルの`Messaging API設定`タブで表示されるQRコードを読み取って友達に追加しておく。
![スクリーンショット 2022-03-14 11.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/c1678a18-e67a-b736-d2d7-3f263b881100.png)

#### 2. チャネルアクセストークンを取得
`Messaging API設定`タブの下部にあるチャネルアクセストークンを控えておく。

![スクリーンショット 2022-03-14 11.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/f940d534-82d3-60bc-102a-dcd06a50285f.png)



[チャネルアクセストークン | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/channel-access-tokens/#what-are-channel-access-tokens)
#### 3. ユーザーIDを取得
対象チャネルの`チャネル基本設定`タブで中程に表示されている`あなたのユーザーID`を控えておく。

![スクリーンショット 2022-03-14 11.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/319c18e9-53fa-9a94-6038-b2b791444369.png)

## LINE APIに対して直接実行
実際の実行方法を紹介します。今回はプッシュメッセージを送ろうと思います。
[メッセージを送信する | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/sending-messages/#push-messages)

#### 1. 送信するjsonファイルを準備
試したいデータを準備します。
以下の`Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`の部分は`3. ユーザーIDを取得`で控えておいたユーザーIDに変えておきます。
```json:body.json
{
  "to": "Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "messages": [
    {
      "type": "text",
      "text": "Hello, user from api direct call!"
    }
  ]
}
```
​
#### 2. API実行
チャネルアクセストークンを`2. チャネルアクセストークンを取得`で取得したものに書き換えて、以下のコマンドを実行します。
```bash:
curl -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer チャネルアクセストークン' \
-d @body.json
```
​
#### 結果
無事送信されました！

![スクリーンショット 2022-03-14 12.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141823/e60a9366-f98a-8160-d490-9af4e0622d85.png)

## まとめ
LINE Messaging APIを使って開発を進めるときに、「このデータって正しく送れるんだっけ？」というのをcurlで簡単に確認する方法を紹介しました。
特にFlex Messageの場合複雑なデータになりがちなので、確認したくなるかとおもいますが、Flex Message Simulatorというシミュレーターが公式から提供されてますので、Flex Messageの場合はそちらを使うのも手です。
[Flex Message Simulator](https://developers.line.biz/flex-simulator/)
OSとは、Dockerが軽い理由【個人的なお勉強アウトプット】

OSとは、ソフトウェアなどのプログラムをハードウェアに翻訳して伝える役割。
PCは命令されたことしかできない。なので具体的に命令が必要。しかし、人間が用意したプログラムはハードウェアにとってはかなり大雑把になっている。
それを具体的に翻訳してくれている。
OSは「カーネル」と「周辺の部分　ディストリビューション」でできてる。
命令をディストリビューションが取ってきて、カーネルに伝えている。
ディストリビューションにはRed Hat、centOS、Ubuntuなどがある。
よく聞くLinux（カーネル）のRed Hat、centOS（ディストリビューション）はそのような関係にある。
Dcokerはコンテナの中にこのディストリビューションを作る。（OSっぽいもの、と表現される正体はこれ）
ディストリビューションが命令を取ってきて、マシン本体のカーネルに命令を伝えている。
なのでdockerは軽さを実現できている。

# 参考書籍
https://www.amazon.co.jp/dp/B08T961HKP/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
Coq IDEの文字化け問題

Coq ideで日本語というかutf-8でコメント書いて保存すると、
勝手にエスケープエンコード(\uxxxx形式)されて保存される問題がある。
https://github.com/coq/coq/issues/11526
coqideのEdit -> Preferences -> Files -> File charset encodingで、UTF-8に変更すれば、バグを防げるらしい。

ただCoqIDEで設定(preferences)が開けない問題もあるので、
https://github.com/coq/coq/issues/15486
設定ファイルを直接いじります。

```shell
vi ~/.config/coq/coqiderc
```

```diff
diffs = "off"
dynamic_word_wrap = "false"
- encoding = "LOCALE"
+ encoding = "UTF-8"
error_color = "#FFCCCC"
error_fg_color = "red"
```
Route53のALIASに関してメモ

ALIASってどのレコードタイプで使えるんだっけ？
結論：どのレコードでも使えるには使える、ただしAレコードかAAAAレコードでないとレコードを作成するホストゾーンの別レコードにしか使えない


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/0698a5e7-119c-86b3-9738-505bf9e60862.png)
このように様々なサービスに対してエイリアスを設定できる

一方でほかは
AAAAの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/08e67571-7ecc-1e84-d4c8-76dfdc076d8b.png)

CNAMEあたりすべて（MXやらPTRやらまだ列挙してないものすべてがこうなります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/d283cd0f-006a-765a-e96d-5c4875f3777f.png)

レコードを作成するホストゾーンの別レコードにしか使えないとはこの事を言ってます

レコードタイプがCNAMEの場合は![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/78bf0939-2dd4-ae53-e794-056aea9bdd7e.png)

このように複数値回答ルーティングポリシーを使うことができません

また複数値回答ルーティングではALIASを使えません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/565011f0-5f95-9937-98f5-49a981cdcd7b.png)
RDSのレプリケーションに関してメモ


①RDSからAuroraのエンジンに変更することは簡単にできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/51238284-bdef-3c3c-b986-95f88d7e0970.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/ba3edfdb-34c7-3c77-1128-624a5899055e.png)

このようにしてクラスター構成に変更しリードレプリカを追加する形でMySQLから互換性のあるAurora MySQLに変更することが可能である
※ただしクロスリージョンレプリケーションはクラスター構成で設定変更した後でないと実施できない


②別リージョンにリードレプリカを追加したいときはリードレプリカの追加を行いリージョンを指定する

再登場
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/51238284-bdef-3c3c-b986-95f88d7e0970.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/f4baf26d-bd87-1f0e-c839-d0ba0ae6c8bc.png)


https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ReadRepl.XRgn.html
OSのアップデートしたら'wchar.h' file not found でC++が実行できなかった

# 起きたこと

OSのアップデートを行ったら下記のエラーが発生

```
#include_next <wchar.h>
              ^~~~~~~~~
``` 

# 対処法

```
sudo rm -rf /Library/Developer/CommandLineTools
``` 

``` 
xcode-select --install
```