OmniAICreator/Qiita-1.07M huggingface dataset:
Google Calendarのスケジュール一括登録用csvテンプレート

### 予定一括登録用のコピペできるテンプレがなくて面倒くさかったので作りました。
一括登録はGoogleCalendarの設定からインポート・エクスポートでできます。
詳細は[こちら](https://support.google.com/calendar/answer/37118?co=GENIE.Platform%3DDesktop&hl=ja)
SubjectとStart dateのみ必須です。
ご活用ください。

This is an import template for Google Calendar. Official support is [here](https://support.google.com/calendar/answer/37118?co=GENIE.Platform%3DDesktop&hl=en).
Subject and Start date is required, The rest are optional.
I wrote this article so that you can easily copy and paste.
For your information.

|Subject	|Start date|Start time|End Date|End Time|All Day Event|Description|Location|Private|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|Event 1|01/06/2021|2:00 PM|01/06/2021|5:00 PM|FALSE|it is a description.|Tokyo|TRUE|
|Event 2|01/08/2021||||||||
Notesログからキーワード抽出したイベントをExcelに出力する

運用保守などの業務でログの調査を依頼されたとき、HCL Notes のログデータベースを開いて、任意のキーワード（ユーザー名など）で検索して、EXCELに転記することがあるかと思いますが、任意のキーワードでイベントを抽出して、EXCELに出力するLotus Scriptを書いてみました。

Notesログについての詳細は以下を参照
[【第02回】 ノーツ新任担当者向けDominoサーバー管理講座：ログこそすべて](https://www.notescons.gr.jp/home.nsf/blog.xsp?action=openDocument&documentId=CC40CAB31BC0883C492580B60035BDB6)

#Scriptの概要
任意のキーワードを入力させて、ログデータベースからキーワードを含んだログ文書をCollectionして、ログ文書のイベント（EventListフィールド）を含んだものだけをExcelに出力します。

## サンプルコード
```
Sub Initialize
	'logデータベースの取得
	Dim db As New NotesDatabase("","log.nsf")
	
	'キーワードの入力
	Dim keyword As String
	keyword = InputBox("キーワードを入力してください","log検索")
	If IsEmpty (keyword) Then
		Exit Sub
	End If 

	'キーワードから文書の抽出をする
	Dim col As NotesDocumentCollection
	Dim SearchKey As String
	SearchKey = {@Contains(EventList;"} & keyword & {"} & {)}
	Set col = db.Search(SearchKey, Nothing, 0)
	
	'キーワードがなければ、処理を終了
	If col.count = 0 Then
		MessageBox "終了",,"キーワードと一致する文書はありませんでした"
		Exit sub
	End If

	'出力先ダイアログの表示
	Dim ws As New NotesUIWorkspace
	Dim ExcelFileName As Variant
	ExcelFileName = ws.SaveFileDialog(False,"ファイル一覧","xls|.xls|","C:\","Notesログ.xls")
	If IsEmpty(ExcelFileName) Then
		Exit Sub
	End If
	
	'Excelファイルの保存
	Dim FileNum As Integer
	FileNum = FreeFile	
	Open ExcelFileName(0) For Output As #FileNum
	Close FileNum

	'Excelを起動する
	Dim ExcelObject As Variant
	Set ExcelObject = CreateObject("Excel.Application")
	ExcelObject.Visible = False
	ExcelObject.DisplayAlerts = False
	
	'Excelを編集可能で開く
	Dim ExcelBook As Variant
	Set ExcelBook = ExcelObject.Workbooks.Open(ExcelFileName(0),,False)
	
	Dim ExcelSheet As Variant
	Set ExcelSheet = ExcelBook.ActiveSheet

	'文書からイベントを抽出
	Dim doc As NotesDocument
	Dim items As Variant
	Dim cnt As Long
	Dim spl As Variant
	Dim strA As String
	Dim strB As String
	cnt = 0
	
	'Excelに出力をする
	Set doc = col.GetFirstDocument
	While Not(doc Is Nothing)
		items = doc.Getitemvalue("EventList")
		ForAll i In items
			'イベントの文字列にキーワードがあれば書き出し
			If InStr(1, i, keyword, 5) > 0 Then
				cnt = cnt + 1
				spl = Split(i , "   ")
				ExcelSheet.Range("A" & cnt).Value = spl(0)
				ExcelSheet.Range("B" & cnt).Value = spl(1)
			End If
		End ForAll
		Set doc = col.GetNextDocument(doc)
	Wend
	
	'Excelの保存
	ExcelBook.SaveAs ExcelFileName(0)
	ExcelBook.Close
	
	'ExcelのClose処理
	ExcelObject.Quit
	Set ExcelObject = Nothing

End Sub
```

##実行結果
Notesのログ文書は以下のような仕組みです。
![EventLog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/7913cc78-1832-b6e3-a192-db82454d2480.png)

検索するキーワードを「Housekeeping」にした場合、すべてのログ文書を参照して、キーワードを含むイベントのみをExcelに書き出します。
![Log抽出の実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983034/84b2a061-a136-8c9f-912a-4efd8b58352d.png)

## 補足
全文索引の設定がされている場合は .Search を使用するより、.FTSearch を使用したほうが処理速度が速くなります。その場合は Set col = db.FTSearch(keyword, 0) と記述してください。
has_one association factory_bot accepts_nested_attributes_for request_spec [自分用]


```rb
class Project < ApplicationRecord
  has_one :location, class: 'Project::Location'
  accepts_nested_attributes_for :location, allow_destroy: true
end

```

```rb 
class Project::Location < ApplicationRecord
  belongs_to project
end
```

factory

```rb
FactoryBot.define do
  factory :project_location, class: 'Project::Location' do
    association :prefecture
    association :project
    address { '港区芝公園４丁目２−８' }
    station { 'JR浜松町駅' }
  end
end
```

request spec

```rb
    let!(:prefecture) { create(:prefecture) }
    let!(:category) { create(:project_category) }
    let(:project_params) do
      attributes_for(:project, location_attributes: attributes_for(:project_location,
                                                                   prefecture_id: prefecture.id)
    end

 post projects_path, params: { project: project_params }

```

prefecture_idを指定してあげる
[Git]git stash まとめ

# はじめに
共同開発に取り組むようになり、`git stash`コマンドを使用するようになりました。
その使い方を個人的にまとめております。

# 内容
1. 「git stash」とは
2. 使用する理由
3. よく使うコマンド


## 1.git stashとは
- 作業中のファイルを`.git/refs/stash`へ移動させるコマンド
- 別のブランチに移動する前に使用する

## 2.使用する理由
### なぜgit stashを使うのか？
→「作業途中のブランチ」から「別のブランチ」に切り替えるため

### なぜ「別のブランチ」に切り替えるのか？
→別ブランチで行う作業があるから

### 別ブランチで行う作業とは？
基本的に共同開発を行っている時に使用するかと思います。
- プルリクをローカルでチェックする時
- プルリクを修正する時

### なぜ作業途中でブランチを切り替えられないのか？
→  commitしていないファイルはマージされてしまうため

### マージされないようにするには？
２つの方法があります。
①git commit でコミットファイルを作成する
②git stashでデータを避難させる


### 使う理由まとめ
- 別ブランチに移動したい
- 作業途中だとマージされる
- しかし,
- コミットできない！
- だからstashする 

という流れで私はstashを使用しています。



## 3.コマンド
私がメインで使うコマンドは以下の通りです。
### git stash list
stashしたファイルをみることができます

```
git stash list
```

### git stash (save)
- stashでデータを避難させることができます。
- 避難したデータは`.git/refs/stash`に保存されます。
- saveは省略可

```
git stash (save)
git stash save "message" #=>　コメント付き
```

### git stash pop
- stashしたデータを取り込みます。
- 取り込んだ後、データを削除します

```
git stash pop #=>最新のデータを１つ取り込む
```

### git stash drop
- データを削除します

```
git stash drop #=>最新のデータを１つ削除
```
「Railsチュートリアル」完走しました！

![SNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/53752c2c-8934-7e3d-bef2-65e67301e3c6.png)
一昨日のことなのですがRailsチュートリアルを無事完走いたしました。

　動画サービスを購入してから完走までに12日かかりました。

　動画内で講師の安川さんもおしゃっていましたが、この教材はサービスが動く仕組みを理解することができるのでRuby以外の言語でサービスを作る上でも初学者にとってはとても役立つものだと思いました。

　しかし、この教材は初学者にとってはかなり難易度が高く、おそらく今の僕でも内容の半分も理解できていません。ですが、触り方が分かったので今後は色々な機能を取ったり付けたりして理解を深めて行きたいと思います。

今回作成したアプリを僕のポートフォリオサイトに公開していますので、ぜひ遊びに来て下さい。

ポートフォリオサイト
https://borubo.github.io/Portfolio/
作成したSNS
https://secret-lowlands-00590.herokuapp.com/
CentOS8にMySQL8をインストールする手順

# やりたいこと

* CentOS8にMySQL8をインストールしたい。

# インストール

root権限で下記を実行する。

```
dnf -y remove mariadb
dnf -y install @mysql:8.0
````

# バージョン確認

```
mysql --version
```

```
mysql  Ver 8.0.21 for Linux on x86_64 (Source distribution)
```
# 設定

```
vi /etc/my.cnf
```
下記を追記する。

```
[client]
default-character-set = utf8
```

# 起動

```
systemctl enable mysqld.service
systemctl start mysqld.service
```


# パスワードの設定

```
mysql_secure_installation
```

ウィザードに従う。

* [Press y|Y for Yes, any other key for No:] y を入力。
* [Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:] パスワードの強さレベル。個人開発環境なら 0 = LOW でよい。
* [New password:] 任意のパスワードを入力。
* [Re-enter new password:] パスワードを再入力。
* [Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) :] y を入力。
* [Remove anonymous users? (Press y|Y for Yes, any other key for No) :] y を入力。
* [Disallow root login remotely? (Press y|Y for Yes, any other key for No) :] y を入力。
* [Remove test database and access to it? (Press y|Y for Yes, any other key for No) :] y を入力。
* [Reload privilege tables now? (Press y|Y for Yes, any other key for No) :] y を入力。

下記が表示されたら完了。

```
Success.

All done!
```

# 接続確認

```
mysql -u root -p
```


先ほど設定したパスワードで接続できることを確認する。

下記が表示されたら接続OK。

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

抜けるときは

```
mysql> exit
```

と入力する。

# 任意のデータベースとユーザを作成

```
mysql -u root -p
```
で接続し、

```
mysql>
```
から下記を実行する。



### sample_db という名前のデータベースを新規作成する。

```
CREATE DATABASE sample_db CHARACTER SET utf8;
```

### ユーザ yamato を新規作成する。パスワードは abcd1234 を設定する。

```
CREATE USER yamato IDENTIFIED BY 'abcd1234';
```

### yamato がデータベースにフルアクセスできるようにする。

```
grant all on *.* to yamato;
```
多目的最適化問題のNSGA-Ⅲを勉強したの整理しました

* 製造業出身のデータサイエンティストがお送りする記事
* 今回は多目的最適化手法の中で、NSGA-Ⅲを勉強しましたので、整理しました。

##はじめに
NSGA-Ⅲは前回ご紹介した[NSGA-Ⅱ](https://qiita.com/DS27/items/025a52b26a9f2471e67c)を改良したモデルになりますので、NSGA-Ⅱと合わせて見て頂くと良いかと思います。

##NSGA-Ⅲとは
NSGA-Ⅲの特徴は下記2点があります。

* Reference point（参照点）の導入
* Reference lineを活用した個体選択

###NSGA-Ⅲのアルゴリズム概要
NSGA-Ⅲでは、親母集団$P_t$と遺伝子操作（交叉・突然変異）を行って探索を行うための子母集団$Q_t$の2つの独立した集団を用いて解探索を行う手法です（NSGA-Ⅱと同じ）。具体的なアルゴリズムの流れは下記の通りです。

① サイズNの親母集団$P_t$をランダムに生成し、サイズNの子母集団$Q_t$を生成し、$P_t$と$Q_t$を組合せて集団$R_t$を生成する。

![スクリーンショット 2020-12-29 15.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/914407c3-ed80-a3da-371d-27ba5b9b1de7.png)

② 集団$R_t$に対して非優劣ソートを実施し、全個体をランク毎（$F_1$, $F_2$, ・・・）と分類する。

![スクリーンショット 2020-12-29 15.13.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/01aacadb-aabd-3afd-3100-e034a357bf78.png)

③ 新たな空の親母集団$P_{t+1}$を生成し、②の非優劣ソートでランクが上位の個体で親母集団$P_{t+1}$を構成していく。

![スクリーンショット 2020-12-29 15.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/56294428-985d-4856-72a2-e458877f32eb.png)

④ **[変更点]**③で親母集団$P_{t+1}$を構成していく途中で、個体サイズがNを越える時、サイズNを越えるランクの個体に対して、**Reference lineを参照して個体を選択**する。

![スクリーンショット 2020-12-29 15.19.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/deac6300-3082-e7be-d5f3-ee597401c150.png)

⑤ **[変更点]**親母集団$P_{t+1}$に対して**Reference lineを活用して適合度評価**により、交叉・突然変異すべき個体を選択し、遺伝子操作を行い新たな子集団$Q_{t+1}$を生成する。

![スクリーンショット 2020-12-29 15.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/2bfc30c1-d76e-fecf-8621-31d1861d4b24.png)

⑥ 親母集団$P_{t+1}$と子集団$Q_{t+1}$を組み合わせて新たな集団$R_{t+1}$を生成する。

![スクリーンショット 2020-12-29 15.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/d540cd9d-16c3-cee3-250a-c9d51d447a16.png)

⑦ ②へ戻り、これまでの操作を終了条件が満たすまで繰り返し実施します。

##Reference lineを活用した適合度の計算方法とは
下記手順によって計算されております。

① 各個体と各reference lineとのベクトルの直交距離を計算し、各個体の最近傍のreference lineを決定する。

② 近傍個体数の最も少ないreference lineを選び、対象ランクの個体集合でそのreference lineに最も直交距離の近い個体を次世代個体として選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/8871a518-7ef1-78a5-ffa8-a7c1d413d74b.png)

##NSGA-ⅡとNSGA-Ⅲの比較表

|手法|特徴|
|:---|:---|
|NSGA-Ⅱ|・目的変数の数が少ないと良好な結果が得られる <br> ・目的変数が多く高次元になると混雑距離で解の優劣が付けにくくなり、収束性が悪くなる　|
|NSGA-Ⅲ|・reference lineで解の探索方向を予め定めておくことで、目的変数が多く高次元になっても高い収束性を実現できる。　|

##さいごに
最後まで読んで頂き、ありがとうございました。
今回は多目的最適化問題のNSGA-Ⅲを整理しました。理論的な違いは概ね理解できたのですが、実際の業務に当てはまる際にどちらが良いのかは両方試してみる必要があるかなと思いました。
次は実装したものを纏めたいと思います。

訂正要望がありましたら、ご連絡頂けますと幸いです。
特定のEC2の起動、停止、再起動のみを行えるIAMユーザーを作成する。

#問題
プロジェクトメンバーA君に、プロジェクトで使用するEC2インスタンスの起動、停止、再起動を行う権限を与えたい。
ただ、起動、停止、再起動以外の操作と、プロジェクトに関係のないEC2の操作は行えないようにしたい。

#作業の流れ
①IAMポリシーを作成する。
②IAMユーザーを作成し、作成したポリシーを割り当てる

#IAMポリシー
対象のEC2に対してキー「Project」、値「****」のタグを設定します。
以下、ポリシー。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Project": "****"　　
                }
            }
        }
    ]
}
```

以上になります。

参考：
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/list_amazonec2.html
SQLPLUSからのプロシージャ、パッケージ作成用バッチ

##フォルダ構成
````
[root]
　┣sqlplusl直接ドラック版.bat
　┣SQL_RUN.sql
　┗[実行ログ]
     ┣OutLogRunSql_2021-01-05_17-17.log
     ┣OutLogRunSql_2021-01-05_18-11.log
     ┣OutLogRunSql_2021-01-05_19-12.log
     ┗OutLogRunSql_2021-01-05_20-13.log

````

##sqlplusl直接ドラック版.bat


```SQL:sqlplusl直接ドラック版.bat

@ECHO OFF

rem =====================年月日取得=====================
rem 年
set sYear=%DATE:~0,4%

rem 月
set sMonth=%DATE:~5,2%

rem 日(ゼロ埋め対応)
set sDate=%DATE:~8,2%

rem 時間の取得（０時～９時までのゼロ埋め対応）
set sNowTIME=%TIME: =0%

rem 時(ゼロ埋め対応)
set sHour=%sNowTIME:~0,2%

rem 分(ゼロ埋め対応)
set sMinute=%sNowTIME:~3,2%

rem 日付
set sYYYYMMMDDHHMM=%sYear%-%sMonth%-%sDate%_%sHour%-%sMinute%

rem =====================フォルダ設定=====================
rem 自分のディレクトリ取得
set MY_DIR=%~dp0

rem ログ出力DIR
set LOG_DIR=%MY_DIR%実行ログ\

rem =====================接続DB設定=====================
set DB_USER=take
set DB_PASS=take

rem サーバー起動の場合は不要
rem set DB_HOST=@hostsvr

ECHO ---------------------------------------------- 
ECHO            SQL/plus 接続・コンパイル　
ECHO 　　　　　　　（ドラック版）
ECHO ----------------------------------------------

rem =========================
rem  sqlplus user/pass 
rem =========================

rem sqlplus 実行 (「%1」がドラックされるsqlファイルのパス)
sqlplus %DB_USER%/%DB_PASS%%DB_HOST% @%MY_DIR%\SQL_RUN.sql %1 > %LOG_DIR%OutLogRunSql_%sYYYYMMMDDHHMM%.log


```

##SQL_RUN.sql

```SQL:SQL_RUN.sql

@&1
quit

```
Power AutomateでSharePoint のカスタムリストの添付ファイルを扱う

#はじめに
　Microsoftが提供している自動化ツールの「Power Automate」は、同社が提供しているMicrosoft365サービスと親和性が高く、自動化する要素「コネクタ」も数多く提供されています
　ただ、各サービスの構成によっては直感的に自動化したい項目が出ないこともあり、少し戸惑うこともあります。
　今回はそんな項目の中から、「リストの添付ファイル」の扱い方を取り上げたいと思います。

#Power AutomateのSharePointリストの見え方
　通常のPower AutomateでSharePointコネクタを使用し、カスタムリストを指定すると、通常、項目名は自動で選択されます。ただし、リストの添付ファイルは可変配列になっており、単純に取得ができません。

例えば、以下のようなリストがあるとします（添付リストがわかりやすいようにフォームで表示しています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147937/76a4a6da-0539-3970-cb9f-35d37d71a396.png)

上記のリストをPowerAutomateのSharePointのコネクタ「項目を取得する」で選択しても、添付ファイルは出てきません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147937/297426f6-ebe2-722b-d634-a6b56169a15d.png)


　添付ファイルを取得するためには、専用のコネクタを使用する必要があります。

#添付ファイル関係のコネクタ
今回紹介するのは以下の２つです。
・添付ファイルの取得（SharePoint）
・添付ファイルのコンテンツの取得（SharePoint）
・添付ファイルの追加（SharePoint）

また、「ファイル名」と「ファイルコンテンツ」（ファイルの中身）は別々に取得する必要があります

##「添付ファイルの取得」コネクタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147937/7088c6d2-f505-ccb9-ed3a-87dee97df888.png)


添付ファイルの一覧を取得します
・サイトのアドレス‥SharePointリストが格納されているサイトのアドレスです
・リスト名‥対象となるリストの名前です
・ID‥ファイルを取得するアイテムのID。必須項目なので、何かしらの方法で特定する必要があります。

実行が完了すると、添付ファイル情報の配列（ファイル名、ファイル識別子）が返されます

##添付ファイルコンテンツの取得
実際のファイルのデータを取得するのに使用します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147937/94476193-1178-b699-915c-f4e9f15987e3.png)

・サイトのアドレス‥SharePointリストが格納されているサイトのアドレスです
・リスト名‥対象となるリストの名前です
・ID‥ファイルを取得するアイテムのID。必須項目なので、何かしらの方法で特定する必要があります
・ファイル識別子..ファイルを一意に識別する識別子。「添付ファイルの取得」コネクタから取得できます

なお、添付ファイルの取得コネクタの出力値を参照すると、出力値が配列のため、自動的に「Apply to each」で囲まれます。

#取得したファイルの利用について
以下の通りに扱います
※ファイルは「ファイル名」と「ファイルコンテンツ」を組み合わせて使います
以下は実際に添付ファイルをリストに追加する例です（IDは無視してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147937/d354deba-b703-1222-808b-6959efb225aa.png)

実際に「テストリスト」から「リスト」に添付ファイルをコピーするフローは以下の通りになります。
（IDがコピー元とコピー先で一緒ですが、そこは無視してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147937/2140d6d1-d270-b797-9ea2-c0808bcfc4fa.png)
React JSXの書き始め方


Reactを勉強していると、
JSXでいろんな書き方が出てきて混乱してしまう。
そもそもJavascriptが苦手なので、よくわからない。
そんな私が未来の自分（またよくわからなくなった時の自分）へ宛てた記事です。
###①
```react

import React from "react";
export default function (){
    return(
        <div>
            <h1>あいうえお</h1>
        </div>
    )
}
```
###②
```react
import React from "react";
const Kansu1 = function (){
      return(
        <div>
            <h1>あいうえお</h1>
        </div>
    )
 }
 export default Kansu1
```

###③
```react

import React from "react";
const Kansu2 = ()=>{
    return(
        <div>
            <h1>あいうえお</h1>
        </div>
    )
}
export default Kansu2
```

上の３つは関数の名前は違うけれど全部同じ動きをする。
これがよくわからなかったので、整理していく。

#JSXの流れ

 - returnするだけの関数を作る
 - 表示したい内容をreturnの中身に入れる。
 - 関数を`export default`する

これが基本！絶対のルール！:hand_splayed_tone2::hand_splayed_tone2::hand_splayed_tone2:
惑わされないで:bangbang:

#改めて、最初の3つについて確認すると、
**①は関数を直接export defaultしているだけ。**

**②③は定数にreturnする関数を代入。定数をexport defaultしている。**

**③は②をアロー関数を使って書いただけ。**

#アロー関数を忘れた人:point_down_tone2::point_down_tone2::point_down_tone2:

##普通の関数の定義　

```js

const 定数名 = function(){処理};
```
##アロー関数　
function()の代わりに()=>で関数を定義できる。　

```js

const 定数名 = ()=>{処理}
```
GIGA School | NHK for School アプリを Microsoft Intune を使って端末に配布する

# はじめに

[**Microsoft ストアーで公開されている NHK for School**](https://www.microsoft.com/ja-jp/p/nhk-for-school/9nblggh4szwq?activetab=pivot:overviewtab) を Microsoft Intune を使って端末に配布する方法を紹介します。


# Intune に NHK for School を追加する

1. [Microsoft Endpoint Manager 管理センター](https://endpoint.microsoft.com/) にサインインします。
2. **[アプリ]**　→　**[すべてのアプリ]** →　**[追加]** を順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/2a77546a-a0d9-4143-aaa8-765b4d9f87cd.png)
3. **[アプリの選択]のペインの「アプリの種類」で、**[Microsoft Store アプリ]** を選択し、**[選択]** bボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/5d21cfb4-2b52-9312-9510-a64985b39e7d.png)
4. **[アプリの追加]** のページで、アプリの詳細を追加し、**[次へ]** ボタンをクリックします。
   NHK for School のストアアプリの URL は、https://www.microsoft.com/ja-jp/p/nhk-for-school/9nblggh4szwq?activetab=pivot:overviewtab です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/89b374be-c994-fcf7-5f80-5e10be7f7160.png)
5. アプリケーションを割り当てるグループを選択して、**[次へ]** をクリックします。ここでは、**[すべてのユーザー]**を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/7e6ac31f-6290-4bd2-2815-038919613e4a.png)
6. 最後に**[作成]** ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/4db6eca3-2483-b06a-311a-58858f6b0101.png)
Kinesis Data StreamsをLambda関数で処理する場合のCloudWatchメトリクスの読み方[Lambda編]

Kinesis Data StreamsのレコードをLambda関数で処理するアプリケーションについて、CloudWatchメトリクスを分析することで以下の様な用途に役立てることができます。

* アプリケーションの動作におけるエラーの兆候を見つける
* 入力されるデータ量が増えるに従ってKinesis Data Streamのシャードを拡張するといった例にみられるように、リソースの拡張が必要な兆候を見つける
* AWSサービス利用料が適正であるかを分析し、コスト削減につなげる

上記の様な目的でCloudWatchメトリクスを分析した経験から、Kinesis Data StreamsとLambda関数のCloudWatchメトリクスをどのように分析するのかをまとめてみたいと思います。

# Lambda関数のCloudWatchメトリクス
ここでは、Kinesis Data Streamsのレコードを処理するLambda関数に関連するCloudWatchメトリクスの中でコスト、エラー検知、拡張性の観点で注目すべきメトリクスを取り上げたいと思います。

### Invocations
InvocationsはLambda関数の起動回数を示すメトリクスになります。Kinesis Data StreamsからLambda関数がレコードを読み込む場合、デフォルトで1秒おきにレコードを読み込むため、100シャードのストリームの場合、各シャード毎に1秒間隔で1回Lambda関数が起動されますので、合計して1秒間に100回のLambda関数が起動されることになります。ただし、1回のLambda関数の起動でシャードから読み込んだレコードを処理するのに1秒以上かかる可能性があります。この場合は、処理完了後にLambda関数が起動されますので、Lambda関数の起動は1秒間隔でないケースがあります。この場合は、秒間あたりのLambda関数の起動回数も減少していきます。

### Duration
Invocationのメトリクスで説明しましたように各シャードごとに1秒ごとにLambda関数が1回起動されますが、Durationは起動されたLambda関数内での処理時間になります。1回のLambda関数の起動でシャードから読み込んだレコードの処理に時間がかかる場合にはDurationも長くなります。レコードの処理内容が複雑で処理に時間がかかるような場合はDurationが延びていくことになります。

### Concurrent executions
Concurrent executionsは同時実行しているLambda関数の数になります。Kinesis Data Streamsで複数のシャードを使用する場合、1つのシャードに投入されるレコードを処理するLambda関数の数を指定できます[^1]。シャード数をM、シャードあたりのLambda関数をNとした場合、全てのシャードを処理するLambda関数の同時並行数（Concurrent executions）は最大でMxNになります。投入されるレコードのPartition Keyを適切に設定しないと、Kinesis Data Streamsの各シャード及びシャードに割り当てられた複数のLambda関数にバランスよくレコードが振り分けられません[^2]。Concurrent executionsの数値がシャード数やシャードあたりのLambda関数の設定に比較して小さい場合にはPartition Keyの設定によりレコードの振り分けがうまくいっていないことも一因として考えられます。

[^1]: [こちらのマニュアル][link1]の「シャードごとの同時実行バッチ」のパラメーターを参考にしてください。
[link1]:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-kinesis.html#services-kinesis-eventsourcemapping

[^2]: Partition Keyによるシャード及びシャードに割り当てられたLambda関数への振り分けルールについては[こちらの記事][link2]を参考にしてください。
[link2]:https://qiita.com/sabmeua/items/7fec5b8dd3415c5733cb

### IteratorAge
シャードにレコードが投入されてからその後にLambda関数によりそのレコードが取得される（読み込まれる）までの所要時間になります。シャードからレコードを読み込んだ後にLambda関数の処理が遅延した場合、その処理が終わるまでLambda関数によりシャード内のレコードは読み取られないため、シャード内のレコードがLambda関数に読み込まれるまでの所要時間（IteratorAge）が長くなります。逆に言えばIteratorAgeが長くなっている場合は何等かの理由でLambda関数の処理が遅延している（Lambda関数のdurationが延びている）ことになります。

### Error count and success rate
Lambda関数またはLambda関数が稼働するLambda runtime内で想定外のエラーが発生している場合はError countのメトリクスにカウントされます。Error countがカウントされている場合はLambda関数内に実装したユーザーコードのエラー処理で拾えていないような想定外のエラーが発生していることになります。Error countがカウントされている場合はLambda関数が出力するCloudWatch Logsを解析することによりエラー内容の詳細に解析して下さい。

# 各メトリクスの活用方法
### コスト観点
Lambdaの料金はInvocationsの回数とDurationの長さにより課金されます。運用の中でLambda関数の単位時間当たりのInvocationsの回数の合計と平均Durationが上昇してきた場合はLambda関数の課金が増えてきている兆候になります。

### エラー確認の観点
Lambda関数またはLambda runtimeでの想定外のエラーを検知する場合にはError countのメトリクスに対してCloudWatchアラームを設定することで検知することができます。

### 拡張性の観点
Lambda関数の処理時間（Duration）が長くなっている、Kinesis Data Streamの投入されたレコードが処理されるまでの時間（IteratorAge）が長くなってきている、Lambda関数の同時実行数（Concurrent Executions）が増加してきているといった兆候が見られる場合にはKinesis Data Streamのシャードの数を増やすまたはシャードあたりのLambda関数の数を増やす等、パラメーターチューニングによる拡張を考慮する必要があります。

拡張性の観点やコスト削減の観点ではCloudWatchメトリクスの値を参考にどのようにパラメーターをチューニングするかは別の記事でまとめてみたいと思います。
IP　まわりの勉強メモ

### 自分のIPを確認する方法
https://www.ugtop.com/spill.shtml
    
### アドレスが使用可能か確認する
http://note.cman.jp/network/subnetmask.cgi
    
### プレフィックス表記（CIDR表記）

    プレフィックス = 短縮表記
    IPアドレスとサブネットマスクをまとめて書く方法
    
    例
    プレフィックス   サブネットマスク値
    /23	             255.255.254.0
    512個のIPアドレスが対象になる
    

### XFF(X-Forwarded-For)
    HTTPヘッダフィールドの１つ。
    ロードバランサなどの機器を経由してWebサーバに接続する
    クライアントの送信元IPアドレスを特定する際のデファクトスタンダード。
    
    
    
    
### アクセス元IPの確認方法
https://qiita.com/akym03/items/48606f05cfa621ef445b
VMWareにLinuxMintをインストールして、LinuxMint上でVirtualBoxを動かす

仮想マシン上でVirtualBoxを動かそうとしたら、32ビットしか動かせなかったため、
その解決方法を記載する。

# 手順（概要）

1. VMWare上にLinuxMintをインストールする
2. 1で作成した仮想マシンで「Intel VT-x」を有効にする
3. 1で作成した仮想マシンにVirtualBoxをインストールする

# 手順（詳細）

## VMWare上にLinuxMintをインストール

### 仮想マシンを作成する
このとき「Intel VT-x」は有効にしない
（なぜか有効にした状態でインストールして起動しようとするとうまく行かなかった。この原因は下かも）
※大事なこと：VMWare Workstationは外付けのディスクに仮想マシンを作るとものすごく遅い。
　そのため、ファイルシステムのあるディスクに仮想マシンを作成する
DVDイメージからLinuxMintの仮想マシンを作成する

## 1で作成した仮想マシンで「Intel VT-x」を有効にする

## 1で作成した仮想マシンにVirtualBoxをインストールする
公式サイトからダウンロードしてインストール
VSCodeとDataiku DSSを連携させてみた

Dataiku DSSでChart系のPlugin作ってるのだけど、ちょっとでもデバッグ楽にしたかったのでVSCodeと連携させてみた覚書き。
有償ライセンスがいる話です。

 - 参考サイト
    - https://academy.dataiku.com/work-environment/506883
    - https://www.excelion.io/blog/integrating-dataiku-and-visual-studio-code-for-python-development
    - https://marketplace.visualstudio.com/items?itemName=dataiku.dataiku-dss

 - 環境
    - Windows
    - Dataiku DSS ver 8.0.2

# VSCodeにDataiku DSS Extentionをインストール。
参考サイト参照

# Dataiku DSS側との接続。
Configファイルの設定をしていきます。まず、設定にあたって必要な、Personal API Keyの発行からやっていきます。

## Personal API Keyの発行
鍵の発行については、このあたり参照。たぶん、ここで有償ライセンスが必要。
https://doc.dataiku.com/dss/latest/publicapi/keys.html

Dataiku DSS上のマイページみたいなところにいく。
画面右上の自分のアカウントの最初の一文字が表示されている丸をクリックした後、自分の名前クリックでいける。正式名称はUser centerの模様。

API keysタブをクリック。セキュリティの都合上、いくつかマスキングしている画像で失礼します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/cd34ba57-7a47-9b79-1f00-3c0be75c56d0.png)

右上の[+ NEW API KEY]をクリックすると、personal API keysが発行される。
Secretのところのい記載されている文字列が、設定ファイル（次で説明）のapi_keyにあたる。（画面は省略）


## Configファイルの作成
VSCodeのターミナルで以下をやってconfig.jsonをつくる。VSCodeの正式な使い方がいまだによくわからないのでなんでもターミナルで済まそうとしてしまう。
C:\Users\ユーザー名\\.dataikuを作るという話です。

```
mkdir ~/.dataiku
cd ~/.dataiku
```

config.jsonファイルを作成し、以下の要領で、urlとapi_keyを記入。
designInstanceとかは任意の文字列でOK。defaultinstanceとかpluginDevelopInstanceとか。
今回は、SSL証明書のチェックがはいるサーバだったのでno_check_certificateで回避している。関係ない場合はこの一行はいらない。
最終行のdefault_instanceに記載されているものが、デフォルトで接続するインスタンスになる。

```
{
        "dss_instance": {
                "designInstance": {
                                 "url": "https://www.mydesigninstance.com:11500",
                                 "api_key": "your-design-API-key-secret",
                                 "no_check_certificate":true
                },
                "productionInstance": {
                                 "url": "https://www.myproductioninstance.com:12500",
                                 "api_key": "your-production-API-key-secret"
                }
        },
        "default_instance": "designInstance"
}

```


 - url : Dataiku instanceのURL。末尾に/をつけてはいけない。
 - api_key. The secret for personal API key。先ほど作成した鍵をここに記載。


これで再読み込みすると、Dataiku DSSのサイドパネルにプロジェクトやプラグインの一覧が表示される。

### おまけ
config.jsonのdefault_instanceの設定内容は、Ctr+Shift+Pで設定もできる模様。
dataikuと打ち込むと、いろいろ一覧でてくるので、Setup your DSS instance URLや、Ssetup your API Keyなどを設定することが可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/b6927572-78aa-57e8-db05-3a6229ef1c6a.png)


VSCode的にはこういうやり方が一般的？なのです？
[ JavaScript 入門 ]ブロックスコープの概念を問題を解いたら少し理解できた件

##JavaScriptのブロックスコープに関する問題を解いてみた:raised_hand:　　
###問題:writing_hand:

```
* 問題：
 * 以下のコードではエラーが発生します。
 * コンソールで"fn called"と表示されるように
 * fn内のコードを変更してください。
 * 
 * ※if文は削除してはいけません。
 */
function fn() {
    if(true) {
        let a = 'fn called';
    }
    return a; // ReferenceError: a is not defined
}

const result = fn();
console.log(result);
```
解答:v:
ifの中でletを使って変数定義している為、ブロックスコープが有効になり、ブロックスコープの外で、return a; のようにaを呼び出そうとしてもReferenceError: a is not definedのようなエラーが出てしまう！:frowning2:　　

よって、**ブロックスコープの外に変数宣言を持っていく**ことでエラーを解消することができる！！

```
function fn() {
    let a;
    if(true) {
         a = 'fn called';
    }
    return a; 
}

const result = fn();
console.log(result);

```

このようにしてあげることによって、return a; とlet a;が同じスコープ内にあることからa; を呼び出すことができる！

ちなみに、let a = 'fn called';　を　var a = 'fn called';にすることで、varはブロックスコープを無視することより、aを取得することはできるが、varは非推奨とのことだったので、上記のような方法でa;を取得しました！:ok_hand:
UEFI grub2でFreeBSDを起動する方法

UEFI grub2でFreeBSDを起動する方法
--
自分用の備忘です。
さて、メイン機のMINISFORUM UM300に、

+ Windows 10
+ Ubuntu 20.10
+ Archbang
+ FreeBSD 13-CURRENT

と入れてきました。FreeBSD 13-CURRENTはzfsです。
このArchbangからgrub2を編集/更新してFreeBSDを起動する場合、ufsとは異なり、

```
insmod zfs
insmod zfsinfo
insmod chain
set root='(hd0,gpt9)'
chainloader /@/boot/loader.efi
```

こんな感じでinsmodと、特に/@/がポイントになります。ウェブであまり事例を見ないため残すことにしました。この設定でいま実際に動いています。

+ http://blog.livedoor.jp/goldfish_and_laser/archives/5314961.html

(2021/7/16追記)
Ubuntuのgrub2からは上ではだめで、次のように設定することで起動しました。

```
insmod zfs
insmod zfsinfo
insmod chain
set root=(hd0,gpt9)
zfsinfo (hd0,gpt9)
chainloader /@/boot/boot1.efi
```
Laravelプロジェクトの構築メモ①

＊使用するもの＊
・Mac OS 
・MAMP
・Visual Studio Code
・Laravel6
・phpMyAdmin

#Laravelアプリケーションを立ち上げる手順
###ターミナル操作
①MAMPのhtdocsに移動（ここでプロジェクトを作成するため)
`Applications/MAMP/htdocs`

②composerコマンドを使ってLaravelプロジェクトを作成する（今回は６系のものを使用する）（アプリ名はmyappとする）
`composer create-project laravel/laravel myapp --prefer-dist "6.0.*"`

③htdocsからmyappに移動する
`cd myapp`

④いくつか権限を変える
`chmod -R 777 storage`
`chmod -R 777 bootstrap/cache`

###MAMPの設定
①MAMPを立ち上げる

②preferencesの中のServerへ移動し、Document rootを変更する
　Document rootを先ほど作成したアプリの中のpublicフォルダを指定する
`Applications/MAMP/htdocs/myapp/public`

③MAMPのサーバーを起動する

④ブラウザでlocalhost:8888にアクセスすると、Laravelプロジェクトが表示される

###Laravelフォルダの.envファイルの初期設定
①Visual Studio Codeで先ほど作成したmyapp（Laravelプロジェクト）というファイルを開く

②その中の.envファイルを編集する
・アプリ名を変更

```
APP_NAME=Laravel
```

・データベース設定
MAMPのトップページの下にMySQLの情報が記載されているから、
その通りにデーターベース設定を行う

```
DB_CONNECTION=mysql
DB_HOST=localhost　←変更
DB_PORT=8889　←変更
DB_DATABASE=laravel　←あとで編集する
DB_USERNAME=root
DB_PASSWORD=root　←追加
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock ←追加
```

###文字コードのエラーを防ぐ設定
MySQLのバージョンによって文字コードでエラーが発生する場合がある。

①Laravelフォルダにて、`app/Providers/AppServiceProvider.php`へ移動

②use文を追加する

```PHP
use Illuminate\Support\Facades\Schema;
```

を追加し、

```PHP
public function boot()
    {
        Schema::defaultStringLength(191);
    }
```

###細かい設定を行う
Laravelフォルダ内の`config/app.php`を開く

```PHP
'timezone' => 'Asia/Tokyo'
```
```PHP
'locale' => 'ja'
```

以上がLaravelアプリケーション作成前準備です。
Writing Cypress tests in TypeScript 

# Typescript で Cypress testを書く

## はじめに

Typescript で Webアプリケーションを書いている際に、テストプログラムが必要になる。
比較検討した結果[Cypress](https://www.cypress.io/)が何かと使い勝手が良いようなので使うことにした。
なお、当方は開発環境をUbuntu 20.04 LTS on WSL2 かつ vscodeで行っているのでこの環境で動かす為の手順を合わせて記載する。

## 環境要件

- OS: WSL2上で動作するUbuntsu 20.04LTS
- 使用エディタ VScode 
- パッケージ管理には yarn を使用

## この記事の目標

- Cypress を動かすためのWSL2(Ubuntu 20.04LTS)の環境作り
- Cypress のインストール完了
- Cypress の起動
- Typescriptによるテストコードの作成・実行

## 前提条件

- 適当なtypescript projectが存在し起動する


## 作業手順

### WSL2の環境作り

Cypressには CLIがあるので必ずしもXは必要では無いが、
あった方が便利なのでX環境も含めて環境作りとする。

#### X環境作り

##### Xサーバインストール

まずは母艦（Windows）側の環境作りが必要なのでそちらから手がける。
[VcXsrv](https://sourceforge.net/projects/vcxsrv/)をダウンロードしインストールする。
exe形式で配布されているのでインストール作業に手間取る人は居ないと思う。
というか、そのレベルで詰まるようであれば諦めろ。無理だ。

##### 初期設定

- Display Settings
    - `Multiple win windows` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82979/26969ec6-ac0d-e379-9f3c-a05aeb7ae4a4.png)

- Select how to start clients
    - `Start no client`を選択

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82979/a2c6153a-547f-6d00-b6fb-2882eef07214.png)

- Extra Settings
    - `Additional parameters for VcXsrv` に `-ac`を追記

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82979/6e27c4c4-f043-6dde-2643-71cd10770626.png)

次の画面でsave config とあるがそこはお好みで。

##### X関連パッケージのインストール

```bash
# sudo apt install x11-apps
# export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0
# xeyes
```

正しく設定されていれば目玉が出る。なお、
`export DISPLAY` は今後も使うので .bashrc辺りにでも書いておくと今後が楽になる。

##### 日本語フォントの追加

WSL2、素のUbuntuは日本語フォントが入っていないので殆どがフォント無しになってしまう。
従ってOSのフォントを使えるようにしてしまう方が良い。


```bash
$ sudo vim /etc/fonts/local.conf
```

```
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>
```

なお、Dockerで使う場合は母艦のフォントをマウント。と言うわけには行かないのでこんな風に。

```
RUN apt-get update
RUN apt-get install -y locales locales-all
RUN apt-get remove fonts-vlgothic
RUN apt-get install -y fonts-vlgothic
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_CTYPE ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP.utf8
```

##### X関連の起動エラー対策

こんなのが出るので対処する。

```
Failed to connect to the bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
```

```bash
 # /etc/init.d/dbus start
```



### Cypress のインストール

#### 依存パッケージのインストール

```bash
# sudo apt-get update
# sudo apt-get install libgtk2.0-0 libgtk-3-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb
```

#### Cypress のインストール

yarnで入れていく関係上、package.json等を更新するため、予めproject フォルダで実行する

```bash
# cd your_project_path
# yarn add -D cypress
```

##### 起動オプションの追加

package.jsonに以下を追記する。jsonファイルなのと、scriptsの項はプロジェクト向けに何かしら書いてあるはずなので追記方法については適宜実施。

```json
  "scripts": {
    "cy:open": "cypress open",
    "cy:run": "cypress run",
  },
```

#### typescript 向け設定

以下を見ながら実行する
https://docs.cypress.io/guides/tooling/typescript-support.html#Install-TypeScript
Ubuntu18.04でswap領域を拡張する


ubuntu18.04でswap領域を拡張する
初期は2GBしかなく、メモリを食い尽くすとそのままスワップも食い尽くして落ちるので、スワップを増やさなければいけなくなった。

スワップをオフにする。スワップにデータがあるとメモリに乗っけるので少し時間がかかる。

```
$ sudo swapoff /swapfile
```
  

既存のswapfileを新しいサイズで上書き

```
$ sudo fallocate -l 32G /swapfile
```

パーミッション設定

```
$ sudo chmod 600 /swapfile
```

初期化

```
$ sudo mkswap /swapfile
mkswap: /swapfile: warning: wiping old swap signature.
Setting up swapspace version 1, size = 32 GiB (34359734272 bytes)
no label, UUID=869d1f34-eec7-475e-b871-471e4d5fa9f8

```

スワップをオンにする

```
$ sudo swapon /swapfile

```

確認

```
$ sudo swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file  32G   0B   -2

```

参考
[Ubuntu 18.04でスワップファイルを増やすにはどうすればよいですか？](https://www.it-swarm-ja.tech/ja/swap/ubuntu-1804%E3%81%A7%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%A2%97%E3%82%84%E3%81%99%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/998285373/)
[Ubuntu 18.04 LTS でスワップファイルを作成・拡張する](http://stacktrace.hatenablog.jp/entry/2019/09/16/112015)
MYSQL8.0でInnoDBクラスタを組み、mysqlrouterからの接続をラウンドロビンさせる

# MYSQL8.0でInnoDBクラスタを組み、mysqlrouterからの接続をラウンドロビンさせる
はい皆さんこんにちは

この記事ではInnoDBクラスタを利用した環境にMYSQLROUTER経由で接続し、R/Oをラウンドロビンさせる内容を整理します。

# 詳細
参考URL：
https://www.s-style.co.jp/blog/2020/10/6689/


環境：

- APserver
CentOS7
mysql-community-server-8.0.21-1.el7.x86_64
DBサーバに接続する用にFirewallを開けておく

- DBmaster、DBslave1、DBslave2
CentOS7
mysql-router-community-8.0.21-1.el7.x86_64
APサーバから繋がるようにFirewallを開けておく

注意事項：
R/WはDBmasterのみ
R/OはDB3台のラウンドロビンとなりますが、
DBが1台でもMISSINGの場合は、完全なラウンドロビンにはなりません。
MISSINGのサーバが復旧した後は再度ラウンドロビンに戻ります。

##DBサーバにてInnoDBクラスタを作る

```
3台それぞれ実施します。
# mysqlsh --uri root@localhost:53306 --sql
↑↑実際のホスト名やポート番号に変えてください。

SQL > reset persist;
SQL > stop group_replication;
SQL > set global super_read_only=0;
SQL > drop database mysql_innodb_cluster_metadata;
SQL > reset master;
SQL > \quit
```


```
ここはDBmasterで実施します。
# mysqlsh --uri root@DBmaster:53306
SQL > cluster = dba.getCluster()
↑↑現段階では何も表示されない

SQL > cluster=dba.createCluster('dbcluster',{ipWhitelist:'172.25.32.0/24',localAddress:'DBmaster:53061'})
SQL > cluster.addInstance('root@DBslave1:53306',{ipWhitelist:'172.25.32.0/24',localAddress:'DBslave1:53061'})
SQL > cluster.addInstance('root@DBslave2:53306',{ipWhitelist:'172.25.32.0/24',localAddress:'DBslave2:53061'})
↑↑クラスタに接続可能なIPのホワイトリスト、ローカルアドレスで使うポートを指定。

SQL > cluster.status()
↑↑クラスタ情報が見れること。DBmasterがR/Wになっている。
SQL > \quit
```


##APサーバでmysqlrouterの設定

```
# mysqlrouter --bootstrap root@DBmaster:53306 --user=mysqlrouter --force
↑↑実際のホスト名やポート番号に変えてください。
※R/Wになっているホストを指定します

# vi /etc/mysqlrouter/mysqlrouter.conf
編集箇所
[routing:dbcluster_default_rw]
#bind_port=6446
bind_port=56446
↑↑これはAPサーバ上で待ち受けているポート番号を指定します。

[routing:dbcluster_default_ro]
#bind_port=6447
bind_port=56447
↑↑これはAPサーバ上で待ち受けているポート番号を指定します。

#destinations=metadata-cache://dbcluster/default?role=SECONDARY
destinations=metadata-cache://dbcluster/default?role=PRIMARY_AND_SECONDARY
↑↑PRIMARY_AND_SECONDARYにする事で3台でのラウンドロビンになります。

#routing_strategy=round-robin-with-fallback
routing_strategy=round-robin
↑↑ここも変えてください。

# systemctl restart mysqlrouter
```


##APからDBに繋いでみましょう

```
# mysqlsh --uri root@localhost:56447 -p --sql -e "SELECT @@HOSTNAME;"
⇒数回実行すると3台でラウンドロビンになっている事が分かります

# mysqlsh --uri root@localhost:56446 -p --sql -e "SELECT @@HOSTNAME;"
⇒R/WになっているDBmasterにしか行きません。
```

##感想
構築した時に3台ラウンドロビンにならない事が分かり、色々と調べたのですが
このやり方で落ち着きました。
縮退中はラウンドロビンにならないので、運用的にOKかは確認しましょう。


**ありがとうございました。**
2021年Go言語フレームワークスター数比較

Go言語のフレームワーク（マイクロもフルスタックも含む）についてGithubの星比較です。（2021/01/05集計）
2021年版が見つからなかったので。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285581/8c78aa78-c058-ed45-3712-600cf7d338ba.png)

ginが強いですねー

---

参考

Go言語Webフレームワークランキング
https://qiita.com/loftkun/items/1a9951d1864bebdc51e1

Golang フレームワーク比較
https://qiita.com/yumin/items/5de33b068ead564ebcbf
Couchbaseにおけるシステム監視手法概観（Prometheus, Grafanaとの連携まで）

# はじめに

この記事では、Couchbase Serverにおける監視手法について見ていきます。

はじめに、Couchbase Serverの持っている監視のための機能について説明します。

そして、外部の監視システムとの連携の例として、PrometheusおよびGrafanaとの連携について紹介します。

# Couchbase Server 監視機能

## 監視対象概観

監視の対象は、CPU・メモリ利用量などのノード/サーバ単位の監視と、バケット/データベース単位の監視に分類することができます。

## ビルトイン機能

以下のビルトイン機能は、Couchbase Serverインストールにより、利用することが可能です。

### Webコンソール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/69b3b5bc-23e3-7eb2-3af3-16476b0ddaf8.png)


[公式ドキュメント Monitoring with UI](https://docs.couchbase.com/server/current/manage/monitor/ui-monitoring-statistics.html)

### Eメールアラート

Couchbase Serverは、（自動フェールオーバー等）特定の状況が発生した際に、Eメールを送付する機能を持っており、Webコンソール画面またはCLI、REST APIから設定することが可能です。

## 外部連携機能

### Rest API

Webコンソールで公開されているメトリックスは、全てRest APIで取得することが可能です。

### CLI

監視システムとの連携の手法として、（エージェント型監視ツールを典型として）CLI(コマンドラインインターフェイス)　が必要とされるケースもあります。Couchbase Serverは用途に応じた各種CLIツールを備えていますが、監視情報取得の用途としてcbstatsがあります。


# 外部監視システム連携（Prometheus, Grafana）

## Prometheus

Prometheus Serverは、監視対象にアクセスしてデータを収集するPull型アーキテクチャに基づいています。そして、監視対象サーバーは、Exporterと呼ばれるアクセスポイントを公開します。下記で、公開されているExporterのリストを見ることができます。

[Prometheus 公式ドキュメント Exporters and Integrations](https://prometheus.io/docs/instrumenting/exporters/)

### Couchbase Exporter

[couchbase-exporter](https://github.com/couchbase/couchbase-exporter)

Couchbase Exporterは、監視するCouchbase Serverクラスターに対して、プロセスを実行します。

```bash
./couchbase-exporter --couchbase.username Administrator --couchbase.password password --web.listen-address=":9420" --couchbase.url="http://example.host.a:8091"
```



## Grafana

Grafanaのダッシュボード定義のサンプルが下記で公開されています。

[Couchbaselabs GrafanaDashboard.json](https://github.com/couchbaselabs/blog-source-code/blob/master/Meliani/GrafanaDashboard.json)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/84ef9333-4922-f33b-c3c5-d6111e144d11.png)


# 最後に
高信頼性(high-reliability)システムを構築・運用するためには、システム監視は必須の要件と考えられます。
ここで紹介した内容には、システム監視の定番として、特に真新しい部分はなかったかもしれません。
それでも、当たり前のことが当たり前にできることが分かった、という感想を持っていただけるようであれば、それだけでも、この記事の目的は果たされたと考えます（もちろん、PrometheusやGrafanaを使ったシステム監視を検討される切っ掛けになったのであれば尚のことですが）。

# 参考情報

[Couchbase Monitoring](https://blog.couchbase.com/monitoring-couchbase-cluster/)
Couchbaseの監視機能に関する解説（英語）

[Couchbase Monitoring Integration with Prometheus and Grafana](https://blog.couchbase.com/couchbase-monitoring-integration-with-prometheus-and-grafana/)
CouchbaseとPrometheus,Grafanaとの連携に関する詳細な手順説明（英語）

[Zabbix Couchbase template](https://qiita.com/myaaaaa_chan/items/a86c286f13dca414c7b3)
ZabbixとCouchbaseとの連携が（日本語で）紹介されています。
実行すると任意の文字列を読み上げるPowerShellスクリプト

## tl;dr

日本語を読み上げさせるときはスクリプトファイルの文字コードを「BOM付きUTF-8」にするとよい。

```powershell:helloworld.ps1
$sapi = New-Object -com SAPI.SpVoice
$sapi.Speak('こんにちは、世界') | out-null
```
vagrant upで「Failed to create the host-only adapter」が発生した場合の対応

## tl;dr

Vagrantをアンインストールしたのち、Virtualbox、Vagrantの順になるようにインストールしましょう。

## 解説

Windows10で仮想マシンをVirtualboxとした場合、Virtualboxより先にVagrantをインストールすると「Failed to create the host-only adapter」を発症します。
Vagrantのインストール時に仮想マシンのおぜん立てを行うようですが、肝心の仮想マシン環境がないので空振りに終わり、いざ`vagarnt up`したときに必要な事前準備ができておらず上記エラーを引き起こすようです。[要出典]

`chocolatey`などで一括インストールするときは順番に気を付けてみてください。
対処療法的なTipsでスミマセン…
TextField付きアラート

##はじめに
ちょっと何かを入力させる時に、いちいちUI配置したりしなくて済むので便利で使える。


完成形
![スクリーンショット 2021-01-05 15.23.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918084/93a03a54-c86b-1949-2ef9-b360e9544533.png)

##環境
Xcode 12.3

##コード

```swift

    let title = "Title"
    let msg = "Message"
    
    let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
    
    //OKボタンの設定
    let okAction = UIAlertAction(title: "OK", style: .default, handler: {(action:UIAlertAction!) -> Void in
      
      //テキストフィールド付きアラートでOKボタンが押された時の処理
      //テキストフィールドに入力された値をオプショナルバインディングして取り出す
      if let str = alert.textFields?[0].text{
        print(str)
      }
    })
    
    alert.addAction(okAction)
    
    //キャンセルボタンの設定
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    alert.addAction(cancelAction)
    
    //テキストフィールドの追加
    alert.addTextField(configurationHandler: {(textField:UITextField!) -> Void in
      // ここでテキストフィールドのカスタマイズができる
      textField.placeholder = ""
      textField.keyboardType = .default
      
    })
    
    // 複数追加したいならその数だけ書く
    // alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in
    //     textField.placeholder = "テキスト"
    // })
    
    //アラートを画面に表示
    self.present(alert, animated: true, completion: nil)
  }

```

textFieldを複数使用したい時はaddTextFieldを複数書く
RDkitを用いた分子の操作（3D構造の最適化）

# 前準備
### モジュールのインストール

```
conda install -c conda-forge rdkit
pip install py3Dmol
```
### 分子の準備
適当な分子を準備する。

```python
#分子の準備
mol = Chem.MolFromSmiles('CN[C@H](C)[C@H](O)c1ccccc1')

#もしくは,SDFファイルの読み込みの際に,removeHs=Falseとすることで、水素原子を保持したまま分子の読み込みが可能
# suppl = Chem.SDMolSupplier('XXXX.sdf', removeHs=False)
# mols = [mol for mol in suppl if mol is not None]
```

# 最適化前の構造を確認

とりあえず、未処理の分子の3D構造を確認してみる。

```python
#Jupyter notebook上で描画してみる
IPythonConsole.drawMol3D(mol)

#MOLファイルを出力して、座標から構造を確認することも可能
mb = Chem.MolToMolBlock(mol)
with open('mol_2D.mol', 'w') as f:
    f.write(mb)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348376/beb58803-7985-4a5e-1209-8ee254bf140a.png)
sp3炭素も全て平面に押し込まれてしまっている。
（実際は、マウスで構造をぐりぐり動かして確認することが可能）

# 水素の付加と三次元構造の最適化
### 水素の付加について
通常、RDkitに格納された分子は水素原子が暗に扱われている。
3次元の帰化構造を生成したり、最適化する場合には、良い3Dコンフォメーションを得るには、水素原子を分子に付加することが必要

### 三次元構造の最適化について
Molオブジェクトの3次元構造の最適化は、AllChem.EmbedMoleculeで行うことが可能。
RDkitでは以下の4つの方法が実装されており、デフォルトはETKDG法になっているとのこと。（普段使う分には、ETKDGの使用で問題ないらしい<sup>[参考]((https://future-chem.com/rdkit-3dstruct/)<sup>)）

- **ディスタンス・ジオメトリー(DG)法**：Stochasticな立体構造の生成方法としてはかなり精度がよい
- **KDG**：DG法に一般的な化学常識（ベンゼン環は平面、アルキンは直線）を加えた手法
- **ETDG**：ケンブリッジ結晶構造データベースの実験データから得た二面角の分布傾向を考慮した手法
- **ETKDG**：KDGとETDGの両方を合わせた手法
- **ETKDGv2**

```python
#水素の付加
molH = Chem.AddHs(mol)

#ETKDGによる構造最適化
p = AllChem.ETKDG()
AllChem.EmbedMolecule(molH, p)

#Jupyter notebook上で描画してみる
IPythonConsole.drawMol3D(molH)

#MOLファイルを出力して、座標から構造を確認。
mb = Chem.MolToMolBlock(molH)
with open('mol_3D.mol', 'w') as f:
    f.write(mb)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348376/4db32627-a14c-4756-ad8d-9784ae029be4.png)
画像だとわかりにくいが、水素が付加され立体構造も妥当なものになっている。

# 参考
- [RDKitで３次元構造に挑戦！part1（magattacaのブログ）](https://magattaca.hatenablog.com/entry/2018/11/21/222203)
- [RDKitによる3次元構造の生成](https://future-chem.com/rdkit-3dstruct/)
- [RDKitドキュメンテーション非公式日本語版サイト](https://rdkit.org/docs_jp/index.html)
pytestでテスト中にprintで標準出力したいとき

##結論から -s オプション追加でOK

pytestでテストするとき、単純に結果だけでなく途中の変数の値などを調べたいときがあります。
結論から言うと-sオプションを追加すれば出力されます。

```bash
$ pytest -s
```

## 例1 -sを使わない場合

以下のようなコードを考えます。

```test_one.py
# test_one.py
def test_good():
    for i in range(5):
        print(i)
    assert True


def test_bad():
    print('this should fail!')
    assert False

```

-sオプションなしでテストすると、ループの中のアウトプットは出ません。

```bash
$ pytest
=========================================================== test session starts ===========================================================
platform darwin -- Python 3.7.0, pytest-6.2.1, py-1.10.0, pluggy-0.13.1
rootdir: /Users/reishimitani/Desktop/d2xx/D2XX
collected 2 items

test_one.py .F                                                                                                                      [100%]

================================================================ FAILURES =================================================================
________________________________________________________________ test_bad _________________________________________________________________

    def test_bad():
        print('this should fail!')
>       assert False
E       assert False

test_one.py:10: AssertionError
---------------------------------------------------------- Captured stdout call -----------------------------------------------------------
this should fail!
========================================================= short test summary info =========================================================
FAILED test_one.py::test_bad - assert False
======================================================= 1 failed, 1 passed in 0.37s =======================================================
```


## 例2 -sを使う場合

同じコードで-sを追加して試してみます。ループの中のアウトプットが出力されます。

```bash
$ pytest -s
=========================================================== test session starts ===========================================================
platform darwin -- Python 3.7.0, pytest-6.2.1, py-1.10.0, pluggy-0.13.1
rootdir: /Users/reishimitani/Desktop/d2xx/D2XX
collected 2 items

test_one.py 0
1
2
3
4
.this should fail!
F

================================================================ FAILURES =================================================================
________________________________________________________________ test_bad _________________________________________________________________

    def test_bad():
        print('this should fail!')
>       assert False
E       assert False

test_one.py:10: AssertionError
========================================================= short test summary info =========================================================
FAILED test_one.py::test_bad - assert False
======================================================= 1 failed, 1 passed in 0.34s =======================================================
```
標準リストビューに表示するレコードがない場合でも、テキストを表示する

## 背景 Background

https://help.salesforce.com/articleView?id=rss_record_list_view.htm&type=5
> 標準リストビューまたはコンパクトリストビューに表示するレコードがない場合、コンポーネントは非表示になります。

> NOTE If there aren’t records to display for either a standard or compact list view, the component is hidden.

ところが、標準リストビューをExperience Cloudなどで使いたいとき、これでは都合が悪いことがある。

However, this can be inconvenient for general users when the component is used in Experience Cloud.

## 対処法 How to manage
ヘッダーマークアップに以下のcssコードを入れると、標準リストビューの内容が空のときだけメッセージが出せる。
In header markup add following css to display a message when the record list is empty.

```css
<style>
    div.forceCommunityRecordListStandard:empty::after {
    content: "表示するデータがありません No records available";
}
</style>
```
Pythonのwith文に複数のcontext managerを指定した場合の実行順序

Pythonの[Language Reference](https://docs.python.org/3/reference/compound_stmts.html#the-with-statement)によると、`with`には複数のcontext managerを指定できます。

```python:Language_Referenceより抜粋
with A() as a, B() as b:
    SUITE
```

これはネストした`with`文と同等とのこと。

```python:Language_Referenceより抜粋
with A() as a:
    with B() as b:
        SUITE
```

となると、 `__exit__()` が呼ばれる順序は書いた順の逆（B→A）になるはずです。

実際にサンプルを書いて確かめました。

```python:my_context_manager.py
class MyContextManager:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print(f'{self.name} enter')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f'{self.name} exit')


with MyContextManager('A') as a, MyContextManager('B') as b:
    print('do something')
```

```bash:実行結果
$ python my_context_manager.py
A enter
B enter
do something
B exit
A exit
```

確かに、逆順になっています。
WordPressで管理画面のサイドメニューからカテゴリー、タグを削除する

ワードプレスのテーマtwentynineteenを基盤に、管理画面のサイドバーメニューからカテゴリーやタグを削除する実装を行ったので、備忘録的にこの記事を残す。

# 環境情報

PHP：version 5.3.3
WordPress：version 5.1.8
WPテーマ：twentynineteen

# 既存の投稿 と 既存のカテゴリー、タグ

```functions.php
//サイドバーメニューからカテゴリー、タグを削除（既存の投稿と既存のカテゴリー、タグ）
function remove_menu() {
    remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=category');
    remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=post_tag');
}
add_action('admin_menu', 'remove_menu');
```

# カスタム投稿 と 既存のカテゴリー、タグ

```functions.php
//サイドバーメニューからカテゴリー、タグを削除（カスタム投稿と既存のカテゴリー、タグ）
function remove_menu() {
    remove_submenu_page('edit.php?post_type=カスタム投稿のスラッグ', 'edit-tags.php?taxonomy=category&amp;post_type=カスタム投稿のスラッグ');
    remove_submenu_page('edit.php?post_type=カスタム投稿のスラッグ', 'edit-tags.php?taxonomy=post_tag&amp;post_type=カスタム投稿のスラッグ');
}
add_action('admin_menu', 'remove_menu');
```

# カスタム投稿 と カスタムタクソノミー

```functions.php
//サイドバーメニューからカテゴリー、タグを削除（カスタム投稿とカスタムタクソノミー）
function remove_menu() {
    remove_submenu_page('edit.php?post_type=カスタム投稿のスラッグ', 'edit-tags.php?taxonomy=カスタムタクソノミーのスラッグ&amp;post_type=カスタム投稿のスラッグ');
}
add_action('admin_menu', 'remove_menu');
```
IntelliJでunitテストしようとしたときに"java.lang.OutOfMemoryError: Java heap space"といわれた

##　起こったこと
![スクリーンショット 2021-01-05 14.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/fff593c9-46b3-47e1-90f5-382e66b0df86.png)
ある日intellijでjavaのunitテストをしようとしたところ。。。

`java.lang.OutOfMemoryError:`

というエラーが、、、
調べてみるとそこそこ情報はあったのですが、割とハマったので備忘録として対応方法を残しておきます。

## やったこと
今回は２つの方法をやりました
### 1つめ
メニューバー > IntelliJ IED > Preferences > Compiler 
の`Shared build process VM options:`に`-Xmx2048m`を追加
![スクリーンショット 2021-01-05 15.05.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/0c46e80e-399a-7790-473f-b143f777b7d6.png)
このやり方が調べてて一番多く出てきた方法です

### 2つめ
![スクリーンショット 2021-01-05 15.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/7fc9d357-5c08-1e15-768d-6f551679f2c7.png)
unit testの実行ボタンから一番下の`Modify Run Configuration`を選択
![スクリーンショット 2021-01-05 15.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/a81ce4a3-0608-efed-2213-944d6a6a0073.png)
このような画面が出てくるのでここの`VM options`のところに`-Xmx2048m`を入れapplyする

## まとめ
調べていると割と１つめのやり方で解決している方が多そうだったのですが、なぜか僕は２つめのやり方をしないと解決しなかったのでもし参考になる方がいらっしゃれば嬉しいです

## 参考文献
https://stackoverrun.com/ja/q/7802559
https://www.366service.com/jp/qa/986b19e266eaaafb99b2f2ccddd3378c