OmniAICreator/Qiita-1.07M huggingface dataset:
pulumi v1.5.2 getting started (kubernetes/minikube)

[Pulumi](https://www.pulumi.com/) がどんなものかを確認するために getting started を minikube で行う。成果物は[これ](https://github.com/nokamoto/2019-11-pulumi)。

## Getting Started
aws cdk の比較として pulumi の名前があったので試してみた。一人で試すぐらいなら Github で連携すると、 terraform の backend が pulumi で managed されているような感じで簡単に無料で導入できる。

基本的に手順に従っていれば getting started は進められた。

[Modify the Program](https://www.pulumi.com/docs/get-started/kubernetes/modify-program/) の部分で minikube で行う場合は、

```bash
$ pulumi config set isMinikube false
```

として設定を変える。すると [Deploy the Changes](https://www.pulumi.com/docs/get-started/kubernetes/deploy-changes/) の確認が動かなくなるので [NodePort](https://github.com/nokamoto/2019-11-pulumi/blob/07c1bfd14425b841b198482c0604062c0f2d1cc8/quickstart/__main__.py#L24-L38) で公開するように変更した。

```diff
+ port = { "port": 80, "target_port": 80, "protocol": "TCP" }
+
+ if is_minikube:
+    port.update(node_port=30000)
```

```diff
-        "type": "ClusterIP" if is_minikube else "LoadBalancer",
+        "type": "NodePort" if is_minikube else "LoadBalancer",
-        "ports": [{ "port": 80, "target_port": 80, "protocol": "TCP" }],
+        "ports": [port],
```

みたいにすれば、以下のように確認ができる。

```bash
$ curl $(minikube ip):30000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

## Workflows
Github Actions が使えるようになっていたので pull request で確認することを考える。
公式で [ガイド](https://www.pulumi.com/docs/guides/continuous-delivery/github-actions/) が存在していたが、動かない点があったので変更を加える必要があった。

### pip install
`pip install -r requirements.txt` で依存を解決する必要があったので、以下のように設定した。

```yaml
      - uses: docker://pulumi/actions:v1.5.2
        with:
          entrypoint: bash
          args: -c "pip install -r quickstart/requirements.txt && /usr/bin/pulumi-action preview --non-interactive"
        env:
          PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PULUMI_CI: pr
          COMMENT_ON_PR: 1
          PULUMI_ROOT: quickstart
```

見た感じ npm だと [entrypoint.sh](https://github.com/pulumi/pulumi/blob/bbc61b86af9e748c11c5c14489ad06b78c45f62a/dist/actions/entrypoint.sh#L89-L95) で解決されるようなので、何か足りていないのかもしれない。かなり強引だが上記のようにすれば python でもとりあえずは動いた。

### todo kubeconfig
kubernetes project を preview するためには kubeconfig を設定する必要があるが minikube で試したので適当なクラスタがなく todo のままになっている。

https://github.com/nokamoto/2019-11-pulumi/pull/2#issuecomment-555325943

後は kubeconfig さえ設定すれば動きそうなので、確認はここまでとする。
xeonでpfsense

#概要

アライドテレシスのAR260が、調子悪いので
xeonでpfsense動かしてみた。
webarenaのvncがつながる様になった。
pfsenseすげー。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f606b9ce-81f7-6330-a7d3-be53a8677bfa.png)

#環境

express 5800 110Ek (N8100-1264)

#ローカルルーター

wan-lan 全て通過
lan-wan 全て通過

#ファイアウォール

wan-lan 全て破棄
lan-wan 全て通過
pfsenseは、こっち。

#dhcp

プライベートIPアドレスを、払い出す。
pfsenseは、デフォで稼動。

#nat

プライベートIPアドレスをグローバルIPアドレスに変換する技。
pfsenseは、デフォで稼動。

以上。
わかると重宝するrebaseコマンドについて

#rebaseコマンドとは
大きく分けて二つ。
**1** ブランチがどこから分岐したかを変更する場合。分岐元ブランチの最新情報から分岐したように履歴を編集するためによく用いられる。
**2**現在のブランチの履歴を編集する場合。コミットメッセージの変更に止まらず、複数のコミットを統合したり順番を入れ替えたりできます。共有リポジトリに公開する前に履歴を整形する用途によく用いられます。


#コミットメッセージの修正

##1. ログでHEADから何番目のコミットか確認

```
$ git log --oneline
737b81e5cd (HEAD -> tax/201911-) jcom
acdf9669a4 e-nanwa
d680615331 k-opti
76f5dfd5a9 kepco
d112bc18e0 kyuden
c6c6901749 rikuden
```

##2. git rebase -i HEAD~{n番目} を実行
1.で確認したHEADから{n}番目をつけて実行、もしくはコミット番号でも可

```
$ git rebase -i HEAD~{n番目}

もしくは
$ git rebase -i コミット番号
```
例) git rebase -i HEAD~3
例) git rebase -i 0bffed0b2３

## vimが立ち上がるので編集

**※指示コマンド**

|コマンド|説明|
|:--|:--|
|(p)pick|コミットをそのまま残す。|
|(r)reword|コミットメッセージを変更。|
|(e)edit|コミット自体の内容を編集。|
|(s)squash|直前のpickを指定したコミットに統合。<br>メッセージも統合。|
|(f)fixup|直前のpickを指定したコミットに統合。<br>メッセージは破棄。|
|(d)drop|コミット削除。|
|（番外編）pickの順番を変更|コミットの順番を変更する。|

に書き換えて`:wq`する

```
$ git rebase -i HEAD~6
hint: Waiting for your editor to close the file... 
pick c6c6901749 rikuden #6番目
pick d112bc18e0 kyuden
pick 76f5dfd5a9 kepco
pick d680615331 k-opti
pick acdf9669a4 e-nanwa
pick 3d7b46c989 jcom

# Rebase aa6d40c996..737b81e5cd onto aa6d40c996 (14 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
"~/project/enechange/.git/rebase-merge/git-rebase-todo" 40L, 1483C
```


##4.git commit --amend実行
vimが立ち上がるので、コミットメッセージを修正する。

```
$ git commit --amend
```


>3で`reword`を指定した場合`git commit --amend`コマンド打つ必要なく同じ画面に行ける

##5.git rebase --continueを実行
競合解決中に、リベースを再開したい場合に使用する。

```
git rebase --continue
```

を実行して完了。

##なんかおかしくなったら
競合解決中に、リベースを中止し、リベース開始前の状態に戻りたい場合に使用する。

```
git rebase --abort
```



##pushしたコミットを消す場合

```
git rebase -i 番号
```

削除したい`pick`の行を消す

```
git　push -f
```




##masterを過去の位置に戻す

https://uehatsu.info/tech/archives/2015/03/rewind-the-master-on-git.html

```
$ git checkout 2ee2030a6367f18d9948e92767262f20d7bf60f6 ⭐️HEADが移動する
$ git push -f origin HEAD:master　⭐️masterがHEADの場所に移動する

```
vue.js html2canvas 文字ズレ防止

こっちにまとめた
https://qiita.com/ma7ma7pipipi/items/08461145731f1a09ce4a


vue.jsで画像を生成したい。
しかし、普通にやると文字がずれる。

参考
https://wood-roots.com/web/vue-js/2253

・CSSで body に フォントを設定しない。

・バージョンは アルファ版を使う。

α版の npm install は

```

 npm install html2canvas@1.0.0-alpha.12

```
Windows バッチファイルで変数に値を格納する

# 目的

- バッチファイルやコマンドプロンプトで変数になにかしら値を格納する方法を書く。

# 書き方の例

- バッチファイルでは変数定義と変数への値格納を一緒に行うことができる。
- 下記に変数に任意の文字列を格納する方法と出力する方法を記載する。

```
set 変数名=任意の文字列
```

# より具体的な例

- 下記の処理をコマンドプロンプトを開き記載することにより、処理を確認することができる。
- 下記に変数`string`に文字列「おはようございます。」を格納し、画面に出力する処理を記載する。
- REMの後ろのカッコ内に記載されている文字はコメントである。

```
REM [変数に文字列を格納]
set string=おはようございます。

REM [変数に格納された文字列を出力する]
echo %string%
>おはようございます。
```
MySQL memorandum

MySQL で踏み抜いたものメモ。網羅したものではないので、あくまで参考までに。

Group replication まわり

# メモリ使用量

innodb のデフォルト値が用途に対して大きすぎたので、減量した。

```
[mysqld]
innodb_buffer_pool_size = 33554432
innodb_buffer_pool_chunk_size = 33554432
```

`group_replication_message_cache_size` が 8.0.16 で導入され、最低限 1GB 確保されてしまうようになった。

## virtual size が大きい
設定可能な値とは別に、OS 側から見て確保されているメモリ量は、予想以上に大きい。これは Linux のメモリアロケータの性質上、そういうことになるようだ。それにしても VSZ が実メモリの 90% ぐらいにおさまるように（[best practice](https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/)）、と言い始めると、なかなか厳しい。

以下は同様の構成で group replication を使ったときのメモリ消費量

- 8.0.15
  - memory/group_rpl/GCS_XCom::xcom_cache は 25 MiB
  - performance_schema.memory_summary_global_by_event_name で総計 380 MiB 程度
  - cgroup memory で 500 MiB 程度
  - mysqld VSZ=1207044 RSS=440932 (1.178 GiB, 430 MiB)
- 8.0.18
 - memory/group_rpl/GCS_XCom::xcom_cache が 1 GiB 程度まで伸びて止まるのは想定通り。
 - performance_schema.memory_summary_global_by_event_name で総計 1.3 GiB 程度
 - cgroup memory で 1.7 GiB 程度
 - mysqld VSZ=3173076 RSS=1442772 (3.098 GiB, 1.41 MiB)

8.0.21 から xcom cache のサイズを調整できるようになった。https://dev.mysql.com/doc/refman/8.0/en/group-replication-performance-xcom-cache-reduce.html

## table repair

VM 上の MySQL が VM 再起動後に起動障害。
`Error: Cannot load from mysql.proc. The table is probably corrupted`
MySQL 設定ファイルに以下を追加して再起動すると修復される。

```
[mysqld]
upgrade=force
```

根本解決でもないし、そもそも常時付けるべきでもないオプションだと思う。

## 未解決
推測としては、メモリをたくさん使うようになって、逆に解放するのに時間がかかりすぎてタイムアウトを引き起こしている……とか？

```
[Warning] [MY-011648] [Repl] Plugin group_replication reported: 'While leaving the group due to a stop, shutdown or failure there was a timeout receiving a view change. This can lead to a possible inconsistent state. Check the log for more details'
```
Laravelでcomposer dump-autoloadすら通らなくなったら

## 症状

```
# composer dump-autoload
Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover

In ProviderRepository.php line 208:
                                                             
  Class 'App\Providers\RepositoryServiceProvider' not found  
                                                             

Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1
```

そもそもartisanのコマンドがほぼ通らなくなってると思う
php artisan package:discoverがエラーを出してる？っぽい
ServiceProvider作って別ブランチ切り替えたらこうなった。

# 解決方法

bootstrap/cache以下.gitignore以外の「config.php」「packages.php」「services.php」などを削除する

で、もう一回composer dump-autoloadすると通る。
【Java】JavaでKClassを取得する【Kotlin】

# やること
`Kotlin`では以下のようにして`KClass`を取得できます。

```kotlin
val myKClass: KClass<*> = MyClass::class
```

この取得処理を`Java`で行います。

# やりかた
`JvmClassMappingKt.getKotlinClass`でできます。

```java
final KClass<?> myKClass = JvmClassMappingKt.getKotlinClass(MyClass.class);
```
AWS RDS MySQL データベースログファイル

#エラーログ#

**概要**

- 起動時、シャットダウン時、エラー検出時にのみエラーログへの書き込みが行われる。

**設定**

- デフォルトで生成される。

**ログ**

- mysql-error.log ファイルに書き込まれる。
- mysql-error.log​ は 5 分ごとにフラッシュされ、mysql-error-running.log に追加される。
- mysql-error-running.log ファイルは 1 時間ごとにローテーションされ、直前 24 時間以内に 1 時間ごとに生成されたファイルが保持される。​

- cloudwatch には `/aws/rds/instance/インスタンス名/error` で保存される。



#スロークエリーログ#

**概要**

- SQL の実行時間が指定した時間(デフォルトですと10秒)よりも長くかかったものを出力することができます。これにより、問題があるSQLを特定することができるので、MySQLを運用する際のトラブルシューティングによく使われます。

**設定**

- スロークエリーログを有効にするには、パラメータグループから `slow_query_log` を `1` にする必要がある。

**ログ**

- デフォルトでは、`log_output` は `TABLE` になっっており、mysql.slow_log テーブルに書き込みされる。
- cloudwatch へ保存するためには、`FILE` にする必要があり、ログファイルは 1 時間ごとにローテーションされる。

- cloudwatch には `/aws/rds/instance/インスタンス名/slowquery` で保存される。



#一般ログ#

**概要**

- MySQL サーバが実行した全ての SQL クエリを出力するログです。 MySQL サーバに接続した時間、接続元ユーザ、実行したSQL を出力する。

**設定**

- 一般ログを有効にするには、パラメータグループから `general_log` を `1` にする必要がある。

**ログ**

- デフォルトでは、`log_output` は `TABLE` になっっており、mysql.general_log テーブルに書き込みされる。
- cloudwatch へ保存するためには、`FILE` にする必要があり、ログファイルは 1 時間ごとにローテーションされる。

- cloudwatch には `/aws/rds/instance/インスタンス名/general` で保存される。



#監査ログ#

**概要**

- MySQL データベースインスタンスでの MariaDB 監査プラグインの使用をサポートしています。
- MariaDB 監査プラグインは、データベースへのユーザーのログオンやデータベースに対して実行されたクエリなどのデータベースアクティビティを記録します。

**設定**

- `MARIADB_AUDIT_PLUGIN オプション `を指定したオプショングループを使用する必要があります。

[【新機能】Amazon RDSのMySQLとMariaDBで監査ログに対応。ついでにrdsadminの動作も確認してみた。](https://dev.classmethod.jp/cloud/aws/rds-mysql-mariadb-audit-plugin/)


**ログ**

- cloudwatch には `/aws/rds/instance/インスタンス名/audit` で保存される。


#リンク#
[MySQL データベースログファイル](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html)
[Amazon RDS](https://qiita.com/leomaro7/items/9ac81ae543689a15b322)
rubyでgmailからメールを送信する

今回は、rubyでメールを送信するプログラムの例を書いていこうと思います。

# 注意点
スクリプト等でgmailを使用する際は、アプリパスワードが必要となります。
2段階認証を設定して、このパスワードを取得してから次に進んでください

# メールの送信サンプル

```mail.rb
require "gmail" #今回使うgem

#自分のメールアドレス
MY_ACOUNT = "hoge@hoge.com"
#自分のアプリケーションパスワード
PASSWORD = #あなたのアプリケーションパスワードを入れてください

gmail = Gmail.new(MY_ACOUNT, PASSWORD)
ret = gmail.deliver do
　　#宛先
	to "fuga@fuga.com"
    #宛名
	from "hoge<hoge@gmail.com>"
	#タイトル
	subject "送信テスト"
	#本文内容
	text_part do
		body "this is a test-mail."
	end
end
gmail.logout
```

MY_ACCOUNTにアプリパスワードを取得した自分のメールアドレス、PASSWORDのところに取得したアプリパスワードを入れれば動くと思います。

# 次にやりたいこと
次は、任意のページを登録しておいて、そのページが更新されたらメールに通知されるようなプログラムを作ってみたいと思います。
[SwiftUI]見た目を変えると挙動が変わってしまう例

SwiftUIでは見た目を変えるだけで、挙動が変わる場合がある。
例えば次のような構造の場合、横にボタンが２つ並んでいる。

```swift
HStack {
  Button({
  }) {
    Text("button A")
  }

  Button({
  }) {
    Text("button B")
  }
}
```

これをテーブル表示するために、Listで括る

```swift
List {
  HStack {
    Button({
    }) {
      Text("button A")
    }
    
    Button({
    }) {
      Text("button B")
    }
  }
}
```

すると、HStack内のボタンのタップは無視されてセルのタップで両方のボタンが反応するようになる。
sandbox環境から本番環境へリリース使用の設定

変更セットは本番環境へリリース用の設定です。



![sandboxから本番環境へリリース用.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/c2575bff-0a13-1662-e444-2a5fa0c727d1.png)
Laravel5.7-複合キーの罠と解決策

#はじめに
Laravel5.7のEloquentを使ってDB(MySQL)の更新をするときに、複合キーが原因で詰まりまくったので解決法を書きます。

#何が起きた
弊プロジェクトではデータの更新の際は

```FooController.php
// リクエストされたIDの行のインスタンスを取得
$table = TableA::where('ID', $request['id'])->lockForUpdate()->first();

// プロパティに値をセット
$table->NAME = 'taro';
$table->TEL = '00-0000-0000';

// 保存
$table->save();
```
上記のように、
- １行に特定してインスタンスを取得
- プロパティに値をセット
- `save`メソッドで保存
という順序で保存するようにしています。

しかしこれが有効なのは主キーが１つの場合のみです。

`TableA`が`ID`と`DEMO_ID`からなる複合キーの場合・・・

```FooController.php
// リクエストされたIDとDEMO_IDの行のインスタンスを取得
$table = TableA::where('ID', $request['id'])
    ->where('DEMO_ID', $request['demo_id'])
    ->lockForUpdate()
    ->first();
    ///// 以下略/////
```
上記の方法で保存すると、モデルの`$primaryKey`に設定したキーが優先されます。
どういうことかというと、`$primaryKey = 'ID'`としていた場合は
「**IDとDEMO_IDを指定してインスタンスを取得したにも関わらず、IDが一致する行を全て更新する**」
処理が走ります。不思議なのは、`$table`にはちゃんと指定した１行のみが取得されていることです。よくわからなくてつらいです。

#解決策

この問題を解決するには、インスタンスを一旦変数にセットするのではなく、
「**where句で条件を指定してそのまま更新する**」必要があります。
(...ググりまくった結果、トレイトなるものを使用して解決できるようですが、設定をいじくる勇気はないので保留です)

```FooController.php
TableA::where('ID', $request['id'])
    ->where('DEMO_ID', $request['demo_id'])
    ->lockForUpdate()
    ->update([
        'NAME' => 'taro',
        'TEL'  => '00-0000-0000',
    ]);
```
このようにwhere句で行を特定し、そのまま`update`メソッドで更新すればちゃんと１行のみ更新できます。

#まとめ
複合キーの一番手軽な解決策だと思います。
ちなみに…モデルの`$primaryKey`にキーを配列でセットしてみたけどダメでした。
Vue.jsとLaravelで/public以下の画像ファイルなどを呼び出したい

# 結論

```vuejs
<template>
  <div>
    <img :src="'/img/image.jpg'">
  </div>
</template>
```

## 解説

#### 1. Vue.jsから見た`/`ルートは`/public`
`appName/public/img/image.jpg`にあるファイルは
`/img/image.jpg`で呼び出せます。

補足: `/public`はlaravelで作製したディレクトリで`/app`や`/routes`と同じ階層のことだよ！

これはコンパイルするディレクトリが指定されているからだね！
Laravelなら多分laravel-mix使ってるかな？
`webpack.mix.js`ってファイルに個別設定と`require()`で呼び出されてるものがあるから追ってみるといい！

#### 2. `:src=""`の形式でpathを文字列で指定する
`src='/img/image.jpg'`で書くとコンパイルすらさせて貰えなかったりするよ！

だから`:src=""`のVue.jsの書き方で書いてあげないとうまく認識できないんだ！

さらに`:src="'文字列'"`としてダブルクオートの中にシングルクオートを書いて文字列として
渡して上げないと「そんな変数ねぇーじゃんwww」と怒られちゃう。
【Rails 5】Vue.jsの導入を検討した際に現れたwebpackerとwebpackの正体を調べてみた

## はじめに
Ruby on RailsでVue.jsを使ってみようと思い調べたところ、**webpacker**というものが便利だと知ったものの、色々調べていくと「**webpack**」や「**モジュールハンドラ**」、「**npm**」、「**yarn**」とかイマイチ何を言っているのか理解できず怖くなったので調べてみた結果をまとめておきます。





## webpackってなに
webpackerについて調べていたのに**webpack**という単語が多数ヒットしたので、まずはwebpackとはについてです。
webpackとは、**モジュールハンドラツール**のことを指しています。

### モジュールハンドラってなに
モジュールハンドラとは、複数の機能に分割（モジュール化）されたファイルをまとめて出力するためのツールのこと


ではどんなファイルをまとめるのかというと、JavaScriptファイルだったり、cssファイルだったり画像ファイルもまとめることができます。

<br>

現状を簡単にまとめると、「様々な機能に分割されたファイルを**webpack**を利用することで、いい感じに1つのファイルにまとめて渡してくれるすごいやつ」がwebpackです。
（設定によって複数ファイルの出力も可能）




## webpackのメリット
webpack(モジュールハンドラ)を使うメリットとは
### 機能ごとにファイルを分割して管理ができる
webpackが複数ファイルをまとめて出力してくれるおかげで、機能ごとにファイルを分割して管理することができます

では分割することのメリットとは

- コードが見やすくなる
- 変数の競合、グローバル汚染を防ぐことができる
- 開発作業を複数人で分担することが容易になる
- リクエスト数を減らせる


### 依存関係に悩まされない
複数に分割されたファイルを**webpack**が依存関係を解決した状態でまとめて出力してくれるため、依存関係について悩まされない


依存関係について分かりやすい説明があったので引用させていただきます


```html
<body>
<!-- app.jsはjQueryに依存しているため、jQueryを読み込んだ後に読み込む必要がある。 -->
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="js/app.js"></script>
</body>
```

> 上記のようなファイルは以下の懸念点がある。
>
> - 依存しているライブラリが1つだけなら良いが、依存が増えれば増えるほど依存関係がわかり辛くなる。
> - それぞれのファイルの依存関係をすぐに理解できるのは作業をした人間のみであり、別の作業者が依存関係をすぐに理解するのは困難。
> - 依存関係が複雑になればなるほど、迂闊にスクリプトの読み込み順を変更したり本来不要なファイルを削除できなくなる。

- [webpack4入門 | Qiita](https://qiita.com/soarflat/items/28bf799f7e0335b68186 )



## webpackerってなに
調べ始める前はwebpackと**webpacker**を混合していました。

webpackerとは、**webpackをRuby on Rails上で簡単に利用するためのGemのこと**を指します。
Railsでは、アセットパイプラインというモジュールハンドラが使われています。ただ日々進化し続けるフロントエンド開発に対応すべく**webpack**というモジュールハンドラをRailsへ簡単に導入するためのGemを**webpacker**と呼びます。


そしてRailsで開発していくからといって、必ずしもGemである**webpacker**を導入しなくてはならないのかというと、そうではなく**webpack**を選択することもできます。

Gemである**webpacker**は、webpackに比べカスタマイズ性に優れていないというデメリットがあります。



## npm と yarnってなに
この2つは役割が似ているためまとめます

### npm(Node Package Manager)
正式名称を見たらなんとなく、理解しやすくなった。
npmとは、Node.jsのパッケージを管理するためのツールのこと。


#### Node.jsのパッケージとは
パッケージとはNode.jsの便利な機能をまとめたかたまりのようなもの


### yarn
yarn(ヤーンって読むらしい)とは、Facebookが公開した、JavaScriptのパッケージを管理するためのツールのこと


npmもyarnもパッケージ管理ツールということもあり、比較されている記事が多く見つかりました。基本的に利用目的は似通っている



- [npmとは | Qiita](https://qiita.com/lelouch99v/items/05f973df9c54cec23419)
- [yarnとは | Qiita](https://qiita.com/lelouch99v/items/c97ff951ca31298f3f24 )



## 参考

- [webpack | 公式](https://webpack.js.org/)
- [webpacker | Github](https://github.com/rails/webpacker)

---

- [【5分でなんとなく理解】Webpack入門 | Qiita](https://qiita.com/Shagamii/items/698a67bab0cd5eefcb4f)
- [webpack4入門 | Qiita](https://qiita.com/soarflat/items/28bf799f7e0335b68186 )
- [Rails5.1ではAsset Pipeline捨てたほうがいいらしいので捨ててみた | Qiita](https://qiita.com/ry_2718/items/9b824a3f9ca750ce403e)
- [npmとは | Qiita](https://qiita.com/lelouch99v/items/05f973df9c54cec23419)
- [yarnとは | Qiita](https://qiita.com/lelouch99v/items/c97ff951ca31298f3f24 )
TypeScriptでReactのstateの型指定が面倒臭い！

`typeof`演算子を活用しましょう。

```tsx
class MyComponent extends React.Component<{}, typeof MyComponent.defaultState> {
  private static defaultState = {
    input: "",
    items: [] as string[]
  };
  state = MyComponent.defaultState;

  render() {
    return <div>Hoge</div>
  }
}
```

# ポイント
* `typeof`演算子を使用することで、初期stateから型を自動的に生成できます。
* 基本的に型推論だけでなんとかなるはずですが、初期値が空配列等、型推論が上手くいかない場合は`as`演算子によるアサーションを用いて対応しましょう。
prestoのarray系頻出関数まとめ

いつもリファレンス見てるので自分用tips

公式
https://prestodb.github.io/docs/current/functions/array.html

## element_at(array(E), index) 

arrayの要素の1つ目を取得する

``` sql
SELECT ARRAY_AGG(value)
-- => ["バナナ","みかん","蒸しパン"]

SELECT element_at(ARRAY_AGG(value), 1)
-- => "バナナ"
```

## cardinality(x)

arrayの要素数。length、count

``` sql
SELECT ARRAY_AGG(value)
-- => ["バナナ","みかん","蒸しパン"]

SELECT cardinality(ARRAY_AGG(value))
-- => 3
```

## array_join(x, delimiter, null_replacement) 

GROUP_CONCATと同じことしたいよ

``` sql
SELECT ARRAY_AGG(value)
-- => ["バナナ","みかん","蒸しパン"]

SELECT array_join(ARRAY_AGG(value), ';')
-- => "バナナ";"みかん";"蒸しパン"
```

## array_sort, array_distinct

ユニークにして並び替える

``` sql
SELECT ARRAY_AGG(value)
-- => ["222","444","444","222","555","444","111","333","444","333"]

-- 全部同じ
SELECT ARRAY_AGG(DISTINCT p_date order by p_date)
SELECT array_sort(ARRAY_AGG(DISTINCT p_date))
SELECT array_sort(array_distinct(ARRAY_AGG(p_date)))
-- => ["111","222","333","444","555"]
```

`array_agg`の中では`order by`も`distinct`も使える

## FILTER()

リファレンスには`filter(array(T), function(T, boolean)) -> array(T)`って書いてある
arrayの対象を絞りたい場合

``` sql
SELECT ARRAY_AGG(key)
-- => ["AAA","ABC","BBB","CCC","AZZ","YYY","A____"]

SELECT ARRAY_AGG(key) FILTER(where REGEXP_LIKE(key, 'A'))
-- => ["AAA","ABC","AZZ","A____"]
```

## any_match, all_match

配列の中に該当条件の要素を1件以上含んでいるかのT/Fの判定に使う。booleanが返ってくる。

```sql
SELECT ARRAY_AGG(value)
-- => ["AAA","ABC","BBB","CCC","AZZ","YYY","A____"]

SELECT any_match(value, v -> v like 'C%')
-- => ture
-- どれか1つでも存在していればtrue。1つもなければfalse
```
すべての要素が条件に一致しなければいけない、という`all_match`もある

ちなみに、`any_match`にセットする配列が空の場合はnullになるので
完全にtrue/falseどちらかの戻り値を期待する場合は、事前にnullは弾かないといけない

-----------

ここからはおまけ



## max_by, min_by

arrayじゃないけど
group by したときに、そのカラムの中の最大・最小(MAX, MIN)ではなくAカラムが最大・最小のレコードのBの値が欲しい時がある
それが取れるのでめちゃ便利

``` sql
-- group by でまとめられる対象のレコード
-- date, value
-- "2019-01-01","AAA"
-- "2019-01-02","ZZZ"
-- "2019-01-03","BBB"

-- 全部同じ
SELECT max_by(value, date)
-- dateがMAXのレコードのvalueの値が取れる
-- => "BBB"
```

## map_agg

arrayじゃないけど
ハッシュにしてくれる
ハッシュなので同じキーがあると1つにまとめられるので注意

``` sql
SELECT map_agg(date, value)
-- => {"2019-01-01":"AAA", "2019-01-02":"ZZZ", "2019-01-03","BBB"}
```

## まとめのまとめ

よく使うのが出てきたら追加する
COCO FormatをYolo v3 Formatへ変換する

# 0. 概要
COCO Formatで保存しているデータセットをYolo v3で使いたい！しかし、COCO FormatのJSONって結構複雑でYOLOv3向けにパースするのって大変。そこで、COCO Format→Yolo v3 Formatへ簡単に変換する方法をご紹介します。

# 1. COCO→Yolo v3への変換
こちらのGitでCOCOをYOLOへ変換してくれるライブラリを配布しています。
https://github.com/ssaru/convert2Yolo
これを使っていきます。

``` bash
$ git clone https://github.com/ssaru/convert2Yolo.git
$ cd convert2Yolo
$ pip install -r requirements.txt
```

使い方は簡単、フォルダ直下で以下を実行

```
$ python example.py --datasets COCO --img_path /data/ --label /label/datasets.json --convert_output_path /data/ --img_type ".png"  --manipast_path ./ --cls_list_file /label/data.name
```


`--datasets`はデータセット形式で`COCO / VOC / UDACITY / KITTI`が選択可能。
`--img_path`はデータセットがあるフォルダ
`--label`はデータセットのアノテーションデータのディレクトリで、`csv/json`が使える。
`--convert_output_path`はYolo形式でBBが書き出されるOutputパス。基本的には`--img_path`と同じで良い
`--cls_list_file`はクラスの名前。
質問です！（python,django）簡単

HTML上で数値を受けとって、計算した結果を出したいのですが、計算がうまくいきません。
何か方法はありますか？

本当はただ計算するだけでなくて、2つの数値から人にあった食べ物を表示する予定です！

エラー
![スクリーンショット 2019-11-19 11.36.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479915/87730e48-afd9-bd35-531f-5c746207bc81.png)
html
![スクリーンショット 2019-11-19 11.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479915/ce05e920-7a04-fc32-22a2-85c6fb51dc23.png)
viwe
![スクリーンショット 2019-11-19 11.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479915/0875acfe-c5a0-76d8-9306-591c40100051.png)
【待望】EKSでワーカーノードのプロビジョニングがサポートされた

# 概要
EKSで使用するワーカーノードのプロビジョニングおよび管理を、EKSのサポートとして対応されたことが2019年11月18日にAWSから発表されました。
つまり、自前でEC2を管理する必要がなくなります。これは超待望。
https://aws.amazon.com/jp/about-aws/whats-new/2019/11/amazon-eks-adds-support-for-provisioning-and-managing-kubernetes-worker-nodes/

# 従来のワーカーノードの管理方法
ワーカーノード用EC2のプロビジョニングはオートスケーリンググループを用意するなどの方法で行う必要がありました。
つまり、EC2の管理とEKSの管理は別々でした。

さらに、オートスケーリンググループを使った場合は下記の設定をする必要がありました。

* クラスターオートスケール用の設定を自身で行う
* EC2起動時のuser dataにEKSクラスタと紐付けるスクリプトが必要

# 今回のアップデート内容
EKSにNodeGroupという概念が登場しました。
![eks-api-evolution-1024x495.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/04dfe42e-67b2-1e7c-8824-f8a8582bc391.png)

NodeとPodのキャパシティを見て、EKSが自動でEC2を増やしたり減らしたりしてくれる機能です。
AWSコンソール上で、EKSクラスターの詳細画面から設定できます。
![0_mng-cluster-overview-1024x516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154121/1150e2c3-a1ce-e47c-6667-61e19eaedf5d.png)

NodeGroupの設定に必要なのは

* ワーカーノード用のサブネット
* ワーカーノード用のIAMロール
* ワーカーノードのインスタンスタイプ
* 台数(Minimum size, Max size, Desired size)

この辺りの最低限必要なマシンの設定を行なっていきます。
つまり、従来のクラスターオートスケールの設定、EC2起動時のスクリプトなどが不要となり、マシンのあらかたの外枠だけ決めておけば後はkubernetesで良い感じにやってくれるようになります。

画像は公式ブログより抜粋。
https://aws.amazon.com/jp/blogs/containers/eks-managed-node-groups/

また、AWSコンソール以外にも下記ツールなどを使用してNodeGroupを作成することもできます。

* AWS CLI
* eksctl CLI
* Cloudformation
* Terraform

## Terraformではもう使えるの？
私は業務で、TerraformでEKSクラスタを構築しているので、サポートされているかが気になっていましたが、バッチリサポートされていました。
https://github.com/terraform-providers/terraform-provider-aws/blob/master/CHANGELOG.md

Terraformの場合は `aws_eks_node_group` というリソースを使用することでNodeGroupを作成できます。

# まとめ
EKSでワーカーノードのプロビジョニング、管理がサポートされました。
EC2のスペックなどの指定は必要になりますが、オートスケーリンググループを使って自前で管理していた部分がマネージドになるのは幸せになれそうです！
今後も素晴らしいアップデートを期待しております。
Amazon Windows 10 WorkSpaces で画像をプレビューする

Amazon Windows 10 WorkSpaces で画像をプレビューしようとファイルをダブルクリックしたらペイントアプリが開いてしまいました。Windows 10 標準のフォトアプリを起動しようと探したら見つからないし、どうやら入れることもできないみたい。

Amazon Windows 10 WorkSpaces は "Windows 10" とは表記されてますが、実際はデスクトップエクスペリエンスが有効化された Windows Server 2016。そしてフォトアプリはサーバー版には対応してません :expressionless:

そこで、次のリンク先の記事の説明を参考に昔の Windows フォトビューアーというアプリを有効化しました。こちらは入ってはいるけど有効化されていないだけ。この方法ではレジストリをいじっているので自己責任でお願いします。

[Reinstating Classic Windows Photo Viewer in Server 2016](https://www.leeejeffries.com/reinstating-classic-windows-photo-viewer-in-server-2016/)

![misc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63688/421b9b77-d4f5-37a5-6d86-f20e57af158b.png)

表示できました :tada:

[写真](https://www.pexels.com/ja-jp/photo/466685/)は Lukas Kloeppel さんの作品です。
AWX から MS Teams に通知する設定


# はじめに

AWXからMS Teamsに通知する設定がうまくできなかったので、対策を記録しておきます。

## TL;DR

通知の「タイプ」を`Mattermost`にして、「ターゲットURL」に`TeamsのURL`を設定すれば通知できるようになります。

## 前提

* 既にTeamsのIncoming Webhook コネクタ設定ができており、webhook用URLを取得している状態から始めます。

* バージョン
![awx_info.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196336/097771ab-e5a5-798b-7c0c-8bbfa07f0e7c.png)

## 通知設定

### 失敗手順

1. 通知の「タイプ」に`webhook`、「ターゲットURL」に`TeamsのURL`を設定。
![awx_notifications1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196336/de52da3a-f806-f527-b677-8c7142e5ccd2.png)

1. 鐘アイコンで通知テストをします。
![awx_notifications2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196336/ccdb9a2d-8a27-a5b5-b090-3f7bf205629f.png)

1. Teamsへの通知に失敗しました…
![awx_notifications3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196336/b4a1eee9-b89f-06a4-87b1-975fb9aa8841.png)

### 成功手順

1. 通知の「タイプ」を`Mattermost`にします。「ユーザー名」と「チャネル」は空欄で大丈夫です。
![awx_notifications4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196336/4e5e10f9-6296-0a09-6242-351c8700ea20.png)

1. 同じく通知テストをすると成功しました。
![awx_notifications5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196336/bf3cac2d-279c-68a5-9de1-217f8c8693f1.png)
Teamsにも通知が届いています。
![awx_notifications6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196336/7a5f00ef-0f5c-ce73-5425-0d07aae3b742.png)


## 参考

こちらのIssueを参考にしました。（というかそのまま）

[Integrated notifications with Microsoft Teams #885](https://github.com/ansible/awx/issues/885)
hub browse のように gitlabやgithubのremoteアドレスからWebへジャンプするalias

# やりかた

## fish
```bash:~/.config/fish/config.fish
alias gibr='git remote get-url origin | sed -e \'s/ssh:\/\/git@/https:\/\//g\' -e \'s/:[0-9]\{2,\}//g\' -e \'s/.git$//g\' | xargs -I \{\} open {}'
```

## bash
```bash:~/.bash_profile
alias gibr='git remote get-url origin | sed -e \'s/ssh:\/\/git@/https:\/\//g\' -e \'s/:[0-9]\{2,\}//g\' -e \'s/.git$//g\' | xargs -I \{\} open {}'
```

## 使う時

```bash
$ cd {.git があるディレクトリへ移動}
$ gibr
```

# 概要

リモートのgitリポジトリを参照したい時に、わざわざWebで検索していました。

githubでは、hubコマンドによってリンク出来ますが、gitlabでは対応していません。
sshで登録されたリポジトリだった場合色々と置換しなければ行けないのでalias化しました。

以上
laravelEloquentでMySQLのJSON型は配列として扱いたい

## 環境
laravel 5.8
MYSQL 5.7.26

## 問題

- JSON型にjsonをそのままインサート出来ない
	- `json_encode` したデータを入れようとするとstringとして入る
- jsonのまま使わないことの方が多いので、取得したデータをjson_dencodeなど加工したくない


## 解決

### Eloquentモデルの `$casts` でインサートしたいカラムに `array` を設定。

```php
protected $casts = [
        'column' => 'array'
    ];
```

### 保存
配列で保存出来るようになる

```php
$record->column = [1 => 'cat', 2 => 'dog'];
$record->save();
```

```json:保存結果
{"1":"cat","2":"dog"}
```

### 取得
配列で取得できる

```php
$column = $record->column; 
// [1 => 'cat', 2 => 'dog']
```

## おわり
この仕様を知らずに独自にミューテタなど設定していました。
Eloquentモデルは色んな事が出来すぎるので、注意したいです。
[GCP]プライベートIPアドレスを持つCloud SQL(MySQL)作成方法と、VPCネットワーク割り当て方法

# はじめに
以下のサイトを参考に、プライベートIPアドレスを持つCloud SQL(MySQL)の作成方法と、VPCネットワーク割り当て方法をまとめております。
https://cloud.google.com/sql/docs/mysql/configure-private-ip?hl=ja

# 手順
## VPCネットワークの作成
VPCネットワークのサブネットが必要になりますので作成します。

### 作業1
VPCネットワークの画面に移動し、「VPCネットワークを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/36a6e90b-b0e5-4e89-1276-c22854a916a3.png)

### 作業2
以下の必要な項目に入力し「作成」をクリックします。
以下に記載していない項目はデフォルトのままで大丈夫です。

|項目|内容|
|:-----------------|:-----------------|
|名前|2カ所ともなんでも良いです|
|リージョン|Cloud SQLインスタンスをたてる場所にしてください|
|IPアドレス範囲|なんでも良いです|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/71120a61-2f37-ebf5-2635-da03459300ae.png)

### 作業3
作成したVPCネットワークが表示されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/2eb7bd30-fddc-79f3-26a9-7037f55b930c.png)


## ファイアウォールルールの作成
作成したVPCネットワークに接続できるようにするため、ファイアウォールルールを作成します。

### 作業1
ファイアウォールルールの画面に移動し、「ファイアウォールルールを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/b4627851-136d-610b-a830-ca8ca06ff56c.png)

### 作業2
以下の必要な項目に入力し「作成」をクリックします。
以下に記載していない項目はデフォルトのままで大丈夫です。

|項目|内容|
|:-----------------|:-----------------|
|名前|なんでも良いです|
|ネットワーク|先ほど作成したVPCネットワークを選択|
|ターゲットタグ|なんでも良いです|
|ソースフィルタ、ソースIPの範囲|設定したい接続元IPを指定|
|プロトコルとポート|設定したい接続先IP・ポートを指定|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/97db439b-4c7f-7d41-4f56-1d1fb57ab026.png)

### 作業3
作成したファイアウォールルールが表示されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/ef75b2e0-cae1-834f-3e20-ff8343a76179.png)


## Cloud SQL（MySQL）の作成
### 作業1
SQLの画面に移動し、「インスタンスを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/4d07933a-c35e-c96b-9671-fae9dcfebcda.png)

### 作業2
「MySQLを選択」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/2674abee-9957-ff80-4edd-43659efb57cd.png)

### 作業3
以下の必要な項目に入力し「作成」をクリックします。
以下に記載していない項目はデフォルトのままで大丈夫です。

|項目|内容|
|:-----------------|:-----------------|
|インスタンスID|なんでも良いです|
|rootパスワード|なんでも良いです|
|リージョン|先ほど作成したVPCネットワークのリージョンを選択|
|プライベートIP|チェックを入れる|
|関連づけられたネットワーキング|先ほど作成したVPCネットワークを選択|
|パブリックIP|チェックを外す|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/757539bc-0b81-8101-b42f-1970a8393667.png)

### 作業4
作成したインスタンスが表示されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/323fcb3f-2734-3b60-8dbf-b37ba543f2bc.png)

# 関連
[GCP]Cloud FunctionsからプライベートIPアドレスを持つCloud SQLへのアクセス方法
https://qiita.com/hanzawak/items/11329be5663de9c084ed
TypeScript 複数のファイルを1つのファイルにまとめる

tsconfig.json

```
{
	"compilerOptions": {
		"target": "es5",
		"module": "amd",
        "sourceMap": true,
        "outFile": "js/app/app.js" // 複数のファイルを1つのファイルにまとめる
	}
}
```

task.json

```
{
// tasks.json 形式の詳細についての資料は、
    // https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
    "version": "2.0.0",
    "tasks": [
        {
            "type": "typescript",
            "tsconfig": "tsconfig.json",
            "problemMatcher": [
                "$tsc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```
TypeScript: オブジェクトのメソッド一覧を取得する関数 getMethods()

オブジェクトのメソッド名を配列で返す関数を作ったので紹介します。

## 関数の仕様

オブジェクトのメソッド名を配列で返す関数とは、どんな関数かというと、オブジェクトのプロパティの中から、関数だけを抽出し、その関数名を返すというものです。

例えば、次のサンプルコードのように、非関数の`property`と関数の`method`を持ったオブジェクトを渡すと、`['method']`を返します:

```typescript
getMethods({
	property: 1,
	method() {},
})
// Output: ['method']
```

クラスのインスタンスにも適用可能です:

```typescript
class MyClass {
	property = 1
	method() {}
}
getMethods(new MyClass())
// Output: ['method']
```

継承している場合、親クラスのメソッドも再帰的に探してリストアップします:

```typescript
class A {
	methodA() {}
}
class B extends A {
	methodB() {}
}
class C extends B {
	methodC() {}
}
getMethods(new C())
// Output: ['methodC', 'methodB', 'methodA']
```

ゲッターやセッターはメソッド一覧から除外されます:

```typescript
getMethods({
	get getter() {},
	set setter(value) {},
})
// Output: []
```

## オブジェクトのメソッド名一覧を返す関数の実装

関数の実装は次のようになります:

```typescript
const getMethods = (obj: object): string[] => {
  const getOwnMethods = (obj: object) =>
    Object.entries(Object.getOwnPropertyDescriptors(obj))
      .filter(([name, {value}]) => typeof value === 'function' && name !== 'constructor')
      .map(([name]) => name)
  const _getMethods = (o: object, methods: string[]): string[] =>
    o === Object.prototype ? methods : _getMethods(Object.getPrototypeOf(o), methods.concat(getOwnMethods(o)))
  return _getMethods(obj, [])
}
```

## 動作確認

上の実装が、メソッドだけを返すかの動作確認です:

```typescript
class Parent {
	parentMethod() {}
	parentArrowFunction = () => {}
	parentInstanceProperty = 1
	get parentGetter() {}
	set parentSetter(value) {}
	
	static parentStaticMethod() {}
	static parentStaticArrowFunction = () => {}
	static parentStaticProperty = 1
	static get parentStaticGetter() {}
	static set parentStaticSetter(value) {}
}

Parent.prototype.parentPrototypeProperty = 1

class Foo extends Parent {
	childMethod() {}
	childArrowFunction = () => {}
	childInstancePropetry = 1
	get childGetter() {}
	set childSetter(value) {}
	
	static childStaticMethod() {}
	static childStaticArrowFunction = () => {}
	static childStaticProperty = 1
	static get childStaticGetter() {}
	static set childStaticSetter(value) {}
}

Foo.prototype.childPrototypeProperty = 1

console.log(getMethods(new Foo))
// Output:
[
  'parentArrowFunction',
  'childArrowFunction',
  'childMethod',
  'parentMethod'
]
```

## 関連資料

* [Object.getOwnPropertyDescriptors() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors)
* [Object.getPrototypeOf() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf)
* [Object.entries() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
Windows 10 >電源管理設定の移行 (別コンピュータへ)

```txt:動作環境
Windows 10 Pro (64bit) バージョン v1903 
```

## 概要

- パソコンAからパソコンBへ電源管理設定を移行したい
    - 同じ設定を複数台のパソコンに適用する
    - 詳細設定を手作業ですると時間がかかる

## 予備知識

### PowerShellでのコピペ

PowerShellのウィンドウはコピペ操作が独特である。
以下のようにする。

1. 文字列を選択
2. Enter
    - クリップボードへコピーされる
3. Ctrl+Vでコピーしたい先にペースト

参考
https://qiita.com/7of9/items/ab3cc31827ca4033dce9#comment-68c016aca9db07d56e71

## 移行

### 情報

以下の説明は、主に下記のページの情報を用いている。

- [How to Export and Import a Power Plan in Windows 10](https://winaero.com/blog/export-import-power-plan-windows-10/)

### powファイルのエクスポート

0. PowerShellを管理者モードで起動する
1. エクスポートしたい電源プランのGUID確認 
    - `powercfg /L`
2. エクスポート
    - `powercfg -export "C:\export.pow" <1調べたGUID>`
        - C:\に書き出ししている

### powファイルのインポートと電源プランの選択

0. PowerShellを管理者モードで起動する
1. インポート
    - `powercfg -import "F:\export.pow"`
        - 外付けUSBメモリ(ドライブレターF)にあるとする
2. インポートされたプランのGUID確認
    - `powercfg /L`
3. 電源プランの選択
    - `powercfg -setactive <2で確認したGUID>`
4. プラン選択の確認
    - `powercfg /L`
        - 3で設定したプランが選択されていること
KubeCon NA 2019(Day0) 参加メモ

[Contributor Summit](https://events19.linuxfoundation.org/events/kubernetes-contributor-summit-north-america-2019/)に参加したので、自分用参加・聴講メモ
※AwardとLTは省略

# Day0 Kubernetes Contributor Summit San Diego 2019

### ・[Keeping Kubernetes Scalable - Intro to Scalability and Performance Testing](https://static.sched.com/hosted_files/kcsna2019/e8/Intro%20to%20scale%20testing%20-%20Kubecon%20SanDiego%202019%20%281%29.pdf)

Kuberenetesの性能試験に使っているツールを取り上げている([kubemark](https://github.com/kubernetes/kubernetes/tree/master/test/kubemark), [ClusterLoader2](https://github.com/kubernetes/perf-tests/tree/master/clusterloader2))
ClusterLoader2は、次のようなYAML形式で負荷を与えられる(便利そう)

```
Config (Test):
 Name: My load test
 Steps:
 -Name: Create 30 pods per node
 …
 -Name: Wait for pods to be running
 …
 -Name: Measure and verify api-call-latency
 …
```

> 実際のClusterLoader2のサンプルYAML
> https://github.com/mm4tt/perf-tests/blob/master/clusterloader2/testing/load/config.yaml

5000Nodeに負荷をかけた時の実際のMetrics

![EJrIeb4UYAUZEdg.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314463/f11ad674-e42f-4d6d-1f0c-50ea4d325919.jpeg)

![EJrJGlZUUAA3zbS.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314463/9b1e91fe-3555-69ab-5a66-2d90470c62c6.jpeg)

### ・[New/Intermediate Contributor Workshop - How We Communicate](https://docs.google.com/presentation/d/18LcwvqyNn74HgqIk7O-ChgfSsJAqDIYm7obguEXto4Q/edit#slide=id.g5e6254b17b_4_1185)

Communityにおけるコミュニケーションの取り方、SIGs, WorkingGroupなどについて
[kuberntes/community](https://github.com/kubernetes/community)に載っていることが多め

### ・Live API Review

資料公開なし
実際の[PR](https://github.com/kubernetes/kubernetes/pull/82082)をもとに、API Reviewを実際にしていく

Kubernetes APIに関する規則と変更時のフローはそれぞれ次のドキュメントにまとまっている
・[API Conventions](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md)
・[API Changes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api_changes.md)

### ・Intermediate Contributor Workshop - Local Build and Test

ほんとはLocal BuildとTestの時間だが、その前までの進みが悪く、GitHub上のLabelの話とMembershipの話で終わった

説明があったのは次のスライドから
https://docs.google.com/presentation/d/18LcwvqyNn74HgqIk7O-ChgfSsJAqDIYm7obguEXto4Q/edit#slide=id.g5e6254b17b_4_1458

### ・Present and Future of Hardware Topology Awareness in Kubelet

資料公開なし
1.16でアルファ機能としてKubeletに追加されたTopology Managerについての話
Topology Managerは機械学習や科学計算などのWorkloadに対して、CPUやDevice Pluginなどを最適化するための機構

https://kubernetes.io/docs/tasks/administer-cluster/topology-manager/

### ・Sig Cluster Lifecycle Roadmap and Feedback Session

資料公開なし
SIG Cluster Lifecycle(Cluster API, kubeadm, cluster-addons, etc...)
Cluster Addonsとその中のCluster API、Image Builder, kubeadm, minikube, kops, etcdadmについて説明

[Cluster Addons](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
[Cluster API](https://github.com/kubernetes-sigs/cluster-api)
[Image Builder](https://github.com/kubernetes-sigs/image-builder)
[kubeadm](https://github.com/kubernetes/kubeadm)
[minikube](https://github.com/kubernetes/minikube)
[kops](https://github.com/kubernetes/kops)
[etcdadm](https://github.com/kubernetes-sigs/etcdadm)
Amazon S3 GUI クライアントとして CrossFTP を Ubuntu 18.04 で動かす

Amazon S3 を GUI で操作したかったので、[CrossFTP](http://www.crossftp.com) を使えるようにしてみました。

要は Ubuntu で FFFTP や WinSCP ライクに操作できるように。

# CrossFTP ダウンロード

http://www.crossftp.com/download.htm より `Download (deb) for Debian, Ubuntu, and other Debian-based OS.` を選んで、ソフトウェアのインストールをします。

# OpenJDK 11 のインストール

Ubuntu に元から入っている OpenJDK 8 だと CrossFTP が起動しても何故か固まります。少なくとも `1.8.0_222` では固まりました。

なので OpenJDK 11 をインストールします。

```sh
sudo apt install openjdk-11-jdk

java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing)

sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 2 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      自動モード
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      手動モード
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      手動モード
```

これで CrossFTP が使えるようになります。
マハラノビス距離の求め方

## マハラノビス距離

```math
d=(x-\mu)^T\Sigma^{-1}(x-\mu)
```

$x$はデータ群との距離を求めたいベクトル。
$\mu$はデータ群の平均値。
$\Sigma^{-1}$はデータ群の共分散行列の逆行列。
コレスキー分解を使うと、以下のように式変形できる。

```math
\begin{eqnarray}
d &=& (x-\mu)^T\Sigma^{-1}(x-\mu) \\
  &=& (x-\mu)^T(LL^T)^{-1}(x-\mu) \\
  &=& (L^{-1}(x-\mu))^T(L^{-1}(x-\mu)) \\
  &=& z^Tz
\end{eqnarray}
```

$L$はコレスキー分解によって得られる下三角行列。
$$z=(L^{-1}(x-\mu))$$ として、これを求めればあとは内積を計算するだけ。


## 実装

以上をpythonで実装します。

```python
import numpy as np
from scipy.linalg import solve_triangular

def mahalanobis(x, mu, sigma):
    L = np.linalg.cholesky(sigma)
    d = x - mu
    z = solve_triangular(
        L, d.T, lower=True, check_finite=False,
        overwrite_b=True)
    squared_maha = np.sum(z * z, axis=0)
    return squared_maha
```

$L$はnumpyのlinalg.choleskyで求められます。
$z$はscipyのlinalg.solve_triangularで求められます。

## 参考
* https://github.com/ZQPei/deep_sort_pytorch/blob/master/deep_sort/sort/kalman_filter.py
* https://blogs.sas.com/content/iml/2012/02/15/what-is-mahalanobis-distance.html
* https://stackoverflow.com/questions/11785201/mahalanobis-distance-inverting-the-covariance-matrix
dotNetFrameworkのバージョンを調べる

# はじめに
時々忘れるので、qiitaにナレッジを放り込んでおきたかっただけ

# 調べ方
dotNeFrameworkのバージョンによって調べ方が若干異なります。差異はそこまで大きくないので迷うことはないはず。

## dotNetFramework 4.5 以降の調べ方

1. レジストリエディタを起動
2. [HKEY_LOCAL_MACHINE \ SOFTWAR\ Microsoft \ NET Framewrok Setup \ NDP \ v4 \Full ]の[Version]を調べる。

<font color="red">※厳密には[Release]エントリを調べると良いらしい...</font>

## dotNetFramework 4.5 以前の調べ方
1. レジストリエディタを起動
2. [HKEY_LOCAL_MACHINE \ SOFTWAR\ Microsoft \ NET Framewrok Setup \ NDP ]の下に作成される[Version]キーの[Version]エントリを調べる。


# 参考
https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed
TeXShopのコマンド補完に関する備忘録

#概要&自分語り
どうも，初投稿です．最近Windowsからmacにほぼ乗り換え，TeXもTeXShopに変わり，便利な機能を教えてもらったのでここに残しておきます．macで快適にTeXを打ちたいけどVSco*eはイヤ，という人向け(?)の記事です．
#ストレスが減る機能
あると嬉しい機能をざっとあげると，
1:数式("\begin{}~\end{}"など)やカッコが自動で閉じてその真ん中にカーソルが移動していて欲しい，
2:"\frac{}{}"とか頻繁に打つが手で入れるのが面倒なやつを少ない操作で出したい，
3:大括弧"\Bigl(~"のような，割と頻繁に使うがタイポし易い物を安全に使いたい，
と言ったところでしょうか．

#やること
大きく分けて2つあります．まずは[ソース]→[キーバインド]→[キーバインドファイルの編集]とします．"入力文字"に括弧の左側(ブラですね，ブラ)を入れ，"出力文字列"には閉じた括弧(ブラケット)の中に"#INS#"と入力します．具体例としてはこんな感じですね;入:"(",:"(#INS#)"．後は追加して保存してキーバインドをONにします．
次に[ソース]→[コマンド補完]→[コマンド補完ファイルの編集]でテキストファイルを開きます．上記の機能はまぁこいつをコピ-してテキストファイルの一番下に貼り付けておけばOKです．
% My shortcuts
% for equation
¥fr:=¥frac{#INS#}{}
¥p:=¥partial
¥i:=¥int_{#INS#}^{}

% labels
¥r:=(¥ref{#INS#})
¥l:=¥label{#INS#}
¥no:=¥nonumber
¥big:=¥Bigl(#INS#¥Bigl)

% frames
¥be:=¥begin{equation}#RET##INS##RET#¥end{equation}
¥ba:=¥begin{align}#RET##INS##RET#¥end{align}
¥subs:=¥left.#INS#¥right|_{}
¥ibox:=¥begin{itembox}[l]#INS#¥end{itembox}
¥fo:=¥footnote{#INS#}

(テキストファイルの一部なのでこんなので良いのでしょうか，オラ初心者だからよぐわがんね)
":="の左側の文字列を入力しescキーを押すと右側の文字列が自動で生成されます．"#RET#"は改行を意味します．また，僕はeqnarrayよりalignを多用しますが，そうでない人はalignの部分を適宜自分好みに変更しておいてください．

#ちょっとした問題点
"\f"でfracを定義して補完しようとしても何故が"\footnote{}"が出てきて困ってます．他の人のでは問題なく動いてるみたいなのですが，どうして...どうしてですかね...?
【Kotlin/Android】Listenerのかきかえ

```main.java
 // idがswitchButtonのSwitchを取得
        Switch switchButton = (Switch) findViewById(R.id.switchButton);
        // switchButtonのオンオフが切り替わった時の処理を設定
        switchButton.setOnCheckedChangeListener(
                new CompoundButton.OnCheckedChangeListener(){
                    public void onCheckedChanged(CompoundButton comButton, boolean isChecked){
                        // オンなら
                        if(isChecked){
                        }
                        // オフなら
                        else{
                        }
                    }
                }
        );
    }
```
```main.kt
switch.setOnCheckedChangeListener { _, isChecked ->
            if (isChecked) {
                // ONの処理

            } else {
                // OFFの処理
            }
        }
```

 - [参考サイト] (https://high-programmer.com/2017/07/14/android-studio-switch-onoff-toast/)
オブジェクト指向について学習したことまとめ

# 目次
1. オブジェクト指向とは
2. オブジェクト指向プログラミングとは

# 今回の学習のゴール
1. オブジェクト指向がわかる
2. オブジェクト指向プログラミングがわかる
3. カプセル化, 継承, 多態性についてわかる

# 1. オブジェクト指向とは
> オブジェクト指向（オブジェクトしこう、英: object-oriented）は、ソフトウェア工学理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。
[オブジェクト指向 - Wikipedia](https://ja.m.wikipedia.org/wiki/オブジェクト指向)

- オブジェクトとは、データとそれに対する処理（関数）をひとまとめにしたモノ

### 基本概念
- カプセル化
    - オブジェクトが持つデータや処理のうち、別のオブジェクトから直接利用される必要のないものを隠蔽すること
    - データと関数の周囲に線を引き、その線の外側にはデータは見えないようになっていて、一部の関数だけが見えるようになっている
    - 他のクラスの影響を受けてはいけない時に行う

- 継承
    - あるオブジェクトが他のオブジェクトの機能を引き継いで使うこと
    - スーパークラス（親クラス）の構造と機能がサブクラス（子クラス）に引き継がれる
    - 具体的には、変数やメソッドなどが引き継がれる
    - サブクラスでスーパークラスのコードを再利用することができる

- 多態性（ポリモーフィズム）
    - クラスによって同一のメソッドで異なる処理を実行できる性質のこと
    - 異なるクラスの類似したメソッドの名前を統一することによって、変更に対しても柔軟に対応できる
    - スーパークラスで定義されたメソッドと同じ名前のメソッドをサブクラス側で定義することをオーバーライドという

# 2. オブジェクト指向プログラミングとは
> オブジェクト指向プログラミング（オブジェクトしこうプログラミング、英: object-oriented programming、略語:OOP）は、オブジェクト指向の考え方を取り入れたコンピュータプログラミング手法である。
[オブジェクト指向プログラミング - Wikipedia](https://ja.wikipedia.org/wiki/オブジェクト指向プログラミング)

- プログラムを「手順」でなく、「モノの作成と操作」として捉える考え方
- モノを用意してそのモノに動作を与えれば、すでにあるモノを使って加工したモノを作ることができる
    - ex. 車というオブジェクトを用意して、アクセルを踏むと走りブレーキを踏むと止まるというメソッドを定義すれば、車というオブジェクトの外装を赤に加工して、赤い車というオブジェクトを作ることができるし、外装を黒に加工して、黒い車というオブジェクトを作ることができる（メソッドを追加したいときは、車というオブジェクトに変更を与えれば良い）
    - 作業の手間がなくなる
    - 大人数でも開発しやすい
    - 同じものを作りやすい
    - 変更に対して柔軟に対応できる
- プロトタイプベース
    - 全てのオブジェクトがプロトタイプ（試作品）をベースにして作られているもの
    - プロトタイプと呼ばれるテンプレートをコピーして、新しいオブジェクトが作られるイメージ
- クラスベース
    - 全てのオブジェクトがクラスをベースにして作られているもの
    - クラスはオブジェクトを作る設計書のことで、クラスそのものの名前、属性（プロパティ）、処理（メソッド）の3つの要素をひとまとめにして定義したもの
    - クラスという設計図から作られたモノをインスタンス（オブジェクト）という
![object.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529506/781f8435-9cbf-e558-4ab8-6e5d1b5090ac.jpeg)


## 参照
- [初心者向けに徹底解説！オブジェクト指向とは？](https://eng-entrance.com/what-oop)
- [オブジェクト指向と10年戦ってわかったこと - Qiita](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)
- [ポリモーフィズムとはなにか？超わかりやすく解説します！](https://www.jpazamu.com/object-polymorphism/)
- [オブジェクト指向が5000%理解できる記事](https://qiita.com/it-hero/items/b2f8e39d7cc23ad505f9)
- [rubyにおけるオブジェクト指向とはなにか(๑•̀ㅂ•́)و✧【基礎】](https://qiita.com/kansiho/items/13b5e9a32ddfc9bea01c)
- [『Clean Architecture 達人に学ぶソフトウェアの構造と設計』 Robert C. Martin](https://books.google.co.jp/books/about/Clean_Architecture_達人に学ぶソフ.html?id=1f9lDwAAQBAJ&printsec=frontcover&source=kp_read_button&redir_esc=y)
whileで繰り返し ❏Ruby❏

初心に戻って基本を学ぶシリーズを始めます。
初回のゲストはwhileさんです。

whileさんは条件式がtrueの場合のみ中の処理を実行してくれます。

#使い方

```ruby
while 条件式
  処理
end
```

#例

1から100まで出力したいとき

```ruby
num = 1
while num <= 100
  puts num
  num += 1
end
```

#途中で処理を止めたいとき

breakを使います。

```ruby
num = 1
while num <= 100
  puts num
  num += 1

  if num == 50
    break
  end
end
```

numが50になったら処理を抜けます。
結果は1から49まで出力されます。

<br>
ではまた！
Rでdata.table中のNAを0に変換する

# はじめに
題名がすべてですが、`data.table`の中にあるNAをすべて0にしたいと思ったのですが、変なところにハマったので、備忘録代わりに書きます。

# data.frameなら一発？

[{dplyr}のパイプの中でNAを0に置換する](https://www.pediatricsurgery.site/entry/2017/07/07/232423)の中で、`data.frame`中に含まれるNAを一括で0にするには、下記のコードで一発だそうです。

```r:NAの一括変換
df[is.na(df)] <- 0
```

ところが、`data.table`に適用するとエラーが出てしまいます。

```r:data.tableの失敗例
dt[is.na(dt)] <- 0
 エラー: Must use a vector in `[`, not an object of class matrix.
```
どうやら、`is.na(dt)`が配列として解釈されるのがだめっぽい。なぜだろう。意味がないと思いつつ、`dt[,is.na(dt)] `としてもdt[is.na(dt),] としてもだめだった。

# dplyrを使った変換
先程ご紹介した記事だと、`dplyr`を使った例も提示されている。

```r:dplyrを使った例
dt %>%
  mutate_all(funs(ifelse(is.na(.),0,.)))
```

これで行けるのだが、最新バージョンだと`funs()`はdeprecatedだよ、と怒られるようになったので、ラムダ式を使った方法にするとよい。

```r:ラムダ式を使った例
dt %>%
  mutate_all(~ifelse(is.na(.),0,.))
```

なんかもっと方法がある気もするが、この方法だと、記事中にあるように`mutate_at`とかも使えて応用が効くので知っていて損はない。
herokuオリジナルアプリをムームードメインの独自ドメインに移管設定、サーバも(2019.11)

オリジナルアプリをherokuのダサいドメインから、ムームードメインのドメインを取得する際、
ネット上の情報に作業したら表示されなかったので、自分と同じような初心者向けに書いてみました。

結論から言うと2018年にherokuがバージョンアップした際にいくつか変更点があった為に、それ以前の記事を参考に作業すると進みません。

以下の記事が大変参考になったと言うか、これ通りにやるとエラーなく独自ドメイン＆SSL化出来ます。

[Herokuアプリに独自ドメインを設定＆SSL化する](https://medium.com/@kjmczk/heroku-cdomain-ssl-1b4cae424e61)

記事の中の入力例で少し分かりづらいところを説明します。

##独自ドメイン追加のところ
>(envname) > heroku domains:add www.yourcustomdomain.com
(envname) > heroku domains:add yourcustomdomain.com

このyourcustomdomain.comのところは自分で設定したドメインを打ち込みます。


##DNSサーバ側

>入力例）
サブドメイン：www
種別：CNAME
内容：www.your...com.herokudns.com
サブドメイン：（空白）
種別：ALIAS
内容：your…com.herokudns.com

内容
　www.your...com.herokudns.com
　your…com.herokudns.com
この２つのyour...comのところには自分で作ったドメインではなくて、
herokuのsettingsのSSL certificatesの項目のconfigure SSL →　automatically選択後に出てくる
自動的に作成されたドメイン（数字と英字の組み合わせ）をそれぞれ（上記）に打ち込みます。

あとは記事に沿って進めていけば問題ないはずです。
herokuのsettings、Domains、ACM Statusの項目でOKと出れば大丈夫です。
Refresh ACM Statusを押せば、直ぐに結果が表示されます。
AWS could9のターミナル上でも 

$ heroku certs:autot

StatusがCert issuedになっていればOK。

反映されるまで２４〜72時間はみておきましょう。