OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQLレプリケーション構成で、バッファ・ピンのリカバリ競合を発生させる方法

# 方法1: バッファ・ピンを取得したまま長時間走るクエリの利用

- ① レプリケーション構成をセットアップする。
- ② マスタで、テーブルを作成する。

```sql
CREATE TABLE test1 AS SELECT id FROM generate_series(1, 10) id;
```

- ③ マスタで、テーブルから1レコード削除する。

```sql
DELETE FROM test1 WHERE id = 1;
```

- ④ スタンバイで、バッファ・ピンを取得したまま長時間走るクエリを実行する。このクエリは、テーブルを外部表、```pg_sleep()```を内部表とするネストループ結合により実現する。

```sql
SELECT * FROM test1 LEFT JOIN pg_sleep(600) ON id = 2;
```

- ⑤ マスタで、テーブルに対してVACUUMを実行する。

```sql
VACUUM test1;
```

- ⑥ max_standby_streaming_delayで指定された競合待ちの時間が経過すると、スタンバイで、④のクエリがキャンセルされて、以下のエラーメッセージが出力される。

```text
ERROR:  canceling statement due to conflict with recovery
DETAIL:  User was holding shared buffer pin for too long.
```

# 方法2: カーソルの利用

- ① レプリケーション構成をセットアップする。
- ② マスタで、テーブルを作成する。

```sql
CREATE TABLE test2 AS SELECT id FROM generate_series(1, 10) id;
```

- ③ マスタで、テーブルから1レコード削除する。

```sql
DELETE FROM test2 WHERE id = 1;
```

- ④ スタンバイで、テーブルをスキャンするカーソルを作成して、1件レコードを取得する。

```sql
BEGIN;
DECLARE testcursor CURSOR FOR SELECT * FROM test2;
FETCH NEXT testcursor;
```

- ⑤ マスタで、テーブルに対してVACUUMを実行する。

```sql
VACUUM test2;
```

- ⑥ max_standby_streaming_delayで指定された競合待ちの時間が経過すると、スタンバイで、④のトランザクションを実行していたセッションが強制終了されて、以下のエラーメッセージが出力される。

```text
FATAL:  terminating connection due to conflict with recovery
DETAIL:  User was holding shared buffer pin for too long.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.
```
Vue+Nuxt+TypeScript のプロジェクトを VSCode でデバッグ可能にする

vue 初心者です。
Angular のマネをしたら、なんだかできたのでメモしておきます。

vue のプロジェクトは [tokyo-metropolitan-gov/covid19](https://github.com/tokyo-metropolitan-gov/covid19) から派生した [code4nagoya/covid19: 愛知県 新型コロナウイルス感染症対策サイト](https://github.com/code4nagoya/covid19) を使います。

VSCode の拡張機能は、

* Vetur
* Debugger for Chrome

を入れています。

## 1. SourceMap を有効にする

``nuxt.config.ts`` に sourceMap を有効にする設定を記述します。

```typescript
  ＜省略＞
  googleAnalytics: {
    id: 'xxx'
  },
  build: {
    //// 追加ここから
    extend(config, { isClient }) {
      if (isClient) {
        config.devtool = 'source-map'
      }
    },
    //// 追加ここまで
    postcss: {
      plugins: [
        autoprefixer({ grid: 'autoplace' }),
        purgecss({
          content: [
  ＜省略＞
```

## 2. VSCode のタスクを追加する

``.vscode/tasks.json`` に、デバッグを開始するためのタスクを追加します。

```json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "yarn-dev",
      "type": "shell",
      "isBackground": true,
      "command": "yarn dev",
      "problemMatcher": {
        "owner": "custom",
        "pattern": {
          "regexp": "^$"
        },
        "background": {
          "activeOnStart": true,
          "beginsPattern": "yarn run.*",
          "endsPattern": ".*Waiting for file changes.*"
        }
      }
    }
  ]
}
```

``yarn dev`` でローカルサーバーを起動、Webアプリが配置されますが、それをバックグラウンドで行うタスクです。
``yarn dev`` コマンドは、その開始時に ``yarn run`` という文字列が出力されるので、それをタスクの開始を示す ``beginsPattern`` に指定します。
同じく、``yarn dev`` でローカルサーバーの準備ができたときに ``Waiting for file changes`` という文字が出力されるので、それを "endsPattern" に指定しておきます。
つまり ``Waiting for file changes`` が来たら、このタスクは終了となります。

## 3. VSCode の起動設定を追加する

``.vscode/launch.json`` に、デバッグを開始する設定を記述します。

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}",
      "preLaunchTask": "yarn-dev"
    }
  ]
}
```

Chrome を起動して http://localhost:3000 を開くというコマンドですが、``"preLaunchTask": "yarn-dev"`` とすることで、バックグラウンドで ``yarn dev`` の準備ができたらブラウザを起動する、という挙動になります。

## 4. デバッグ実行してみる

例えば ``pages/about.vue`` のタイトルを返す行あたりにブレークポイントを張って、
F5 キーまたはメニュー -> Debug -> Start Debugging を実行します。

しばらく待つとブラウザでページが表示されるので、「当サイトについて」を押すと、ブレークポイントで停まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/437d0d5e-b570-3eb5-4994-72772628f708.png)

（なぜか仕掛けた行で止まってくれないこともあるけど、大目に見よう）

vue.js は何もわからないので、もっと良いやり方があったら教えて下さい。

今回の修正差分は

* https://github.com/amay077/covid19-1/commit/eb717611210af1477e0b2b90c72d805b7c56e009

です。

## 物足りないところ

F5 でデバッグ開始できるようになりましたが、Shift + F5（あるいはメニュー -> Debug -> Stop Debugging）すると、ブラウザは閉じますが、バックグラウンドで動いているローカルサーバーは停止しません。ファイル監視モードで常駐しているので放置でも問題ないですが、ちょっと気持ち悪いです。停止させるには Terminal で Ctrl+c しなければなりません。

## 参考

* [Angular + VSCode でデバッグ開始したときに ng serve する - Qiita](https://qiita.com/amay077/items/62e1eb656fbd730b3dd1)
* [vscode-recipes/README.md at master · microsoft/vscode-recipes](https://github.com/microsoft/vscode-recipes/blob/master/vuejs-cli/README.md)
* [Debugging Nuxt.js with Visual Studio Code - codeburst](https://codeburst.io/debugging-nuxt-js-with-visual-studio-code-724920140b8f)  ※情報古いな
[漏洞通告]jackson-2648/jackson-databind JNDI注入导致远程代码执行

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到jackson-databind更新了jndi注入的黑名单类.如果在项目包中存在该类的jar包且JDK版本满足注入版本,则可以使用JNDI注入的方式导致远程代码执行.该类为`org.apache.shiro.realm.jndi.JndiRealmFactory`.

### 漏洞编号
Jackson内部编号2648

### 漏洞威胁等级
中危

### 不受影响范围
2.8.11.6
2.7.9.7

### 漏洞验证
这里选用2.10.3这个较新的版本

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/e2c165a4-d74f-ab4c-d73d-26cee788d0b1.png)

主要增加了`org.apache.shiro.realm.jndi.JndiRealmFactory`这个类.由于解析格式的错误,该类对fastjson不造成影响

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/a4ff2406-2801-c1dc-92ca-dd1281de235e.png)


### 修复建议
1.更新到最新版本
2.使用高版本JDK
### 时间轴
[0] 2020/03/09 jackson关闭该漏洞
[1] 2020/03/11 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://github.com/FasterXML/jackson-databind/issues/2648
bashのコードメトリクス測定ツールをgolangで実装してみた

# 何の話？
シェルスクリプトって、速度重視でついつい適当に書いちゃいますよね。
プロダクション環境に納品するものであっても、動けばいいや感もあったり。
で、こんな現状を打開すべく、なんかいいツールなり何なりないかな？って思って探してみました。

# codestyle
Googleの[styleguide](https://google.github.io/styleguide/shellguide.html)がしっくりきました。
日本語訳していただいている、すばらしい[記事](https://qiita.com/laqiiz/items/5f72ca668f1c58176644)もあります。(ちょっと古いかも)

# shellcheck
上述のstyleguideでも記載されていますが、規模の大小問わず、[shellcheck](https://github.com/koalaman/shellcheck)はしましょうと言っています。完全同意。
最初は指摘がうっとうしいな〜と思うのですが、慣れてくると問題ないかと。

# comment
Googleのstyleguideにおけるコメントの記述を抜粋します。

先頭

```bash
#!/bin/bash
#
# Perform hot backups of Oracle databases.
```

関数

```bash
#######################################
# Cleanup files from the backup directory.
# Globals:
#   BACKUP_DIR
#   ORACLE_SID
# Arguments:
#   None
#######################################
function cleanup() {
  …
}
```

こんな感じですね。これはこれで良いと思うのですが、ワタシの職場では、
シェルは仕様書も出せ！とかよく言われます。(シェル読んだほうが早いんですが、納品とか色々あるので)
Googleのスタイルだと仕様書の自動生成とかが難しいので、
こんなスタイルにすれば、markdownに変換できるので、
納品前に一気にドキュメント化とかしちゃえばいいのかなと。[shdoc](https://qiita.com/summergirlna/items/70e74165077b05ee9fb0)

# メトリクス
これがないんですよねぇ。そもそもbashにメトリクスもクソもないってことなのかな。
ワタシが使ったことがある[lizard](https://github.com/terryyin/lizard)にはbashってないんですよねぇ。
[tokei](https://github.com/XAMPPRocky/tokei)だとサイクロマティック複雑度測れないし。。。

ってことで作りました。golangで作ったので、linuxでもmacでもwindowsでも動きます。

# usage
`Usage: shccn path`
これだけです。パスはディレクトリでもファイルでもかまいません。
ディレクトリの場合はディレクトリ以下のシェルすべて(再帰的に見るのではなく、直下のシェルのみ)をチェックします。

# output
```
--------------------------------------------------------------------------------
Name                      Lines       Code   Comments     Blanks  Functions
--------------------------------------------------------------------------------
make.sh                       8          8          0          0          0
tshare.bash                  30         24          0          6          3
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Name                                           Code                  CCN
--------------------------------------------------------------------------------
BARE_CODE@make.sh                                 7                    1
BARE_CODE@tshare.bash                             6                    4
play@tshare.bash                                  2                    1
start@tshare.bash                                 3                    1
usage@tshare.bash                                 4                    1
--------------------------------------------------------------------------------
```

こんな感じです。このあたりはlizardだったりtokeiにインスパイアされてます。
また、小さいシェルだと関数とか作らずにバンバンコード書いていきますので、
そのようなコードは`BARE_CODE`という名前で統計を取っています。

# ダウンロード
[ここ](https://github.com/kuritayu/infra-tools/blob/master/cmd/shccn/main.go)においています。
静的サイトジェネレーター　11ty(eleventy)

Nunjucksだけでなく PUG / Handlebars / EJSも使用することのできる優れものです。
やり方によっては、yamlを使用してhead内のテキスト内容を挿入することも可能です。

以前僕も、この案件はEJSであの案件はNunjucksってゆう感じにJSテンプレートエンジンを変えていました。
その度にgulpの設定を変えていました。

めんどくさいです。

Nuxtを使って静的サイトを作っていくのも流行っているし、かっこいいしいいかもと思いましたが、
他に選択肢はないかなと思い、dev.toを眺めていると出会いました。

使用方法も至ってシンプル。

すぐに案件で使ってみました。

```js

src/ 
  views/
   _includes
   _data

```
上記のディレクトリで大丈夫です。
.eleventy.jsに下記を記述

```js
module.exports = function(eleventyConfig) {
   return {
    dir: {
      input: 'src/views',
      includes: '_includes',
      data: '_data'
    }
  }
}

```

[Eleventy is a simpler static site generator.](https://www.11ty.dev/)
こちらにくらしくは載っていますので、ぜひご覧ください。

簡単ではありますが、11ty(eleventy)の紹介でした。
Dockerを試すサンプルメモ④（awslogs編）

# メモ
- CW Logs にログを飛ばす
- イメージは https://qiita.com/kure/items/832148a161b172039bf3 のものを使う
- CW Logsのロググループを作成しておく（東京リージョン）
- 認証情報を設定しておく

これだけで飛ぶ

```zsh
% docker run --log-driver=awslogs --log-opt awslogs-region=ap-northeast-1 --log-opt awslogs-group=[CW Logsロググループ] [IMAGE ID]
```

# 参考

https://man.plustar.jp/docker/engine/admin/logging/overview.html
テレワークをやってみた所感

テレワーク（自宅勤務）に切り替えて1週間以上経過したので、所感を書いていく

### 前段
私のチームは、1チームに社員4人（自身を含む）、契約社員6人の計10人で、私の下にフラットでメンバーがいる構成となっている

### コミュニケーション手段
・slack
・GoogleMeet

### テレワークに切り替えて実施したこと / 実施しなくなったこと

・就業開始時にToDoの報告 / 就業終了前に進捗の報告を実施するようにした
　タスクの箇条書きと、ざっくり進捗のパーセンテージ報告に留めている
　パーセンテージはあくまでも主観での報告になるが、そこまで厳密性は求めていない
　またToDo/進捗報告で気になる点がある場合は、都度コメントをして確認するようにしている

・チーム定例を実施しなくなった
　週1で開催して会社のコンディションや共有事項などの伝達をしていたが、テレワークに切り替えたタイミングで実施をやめた
　緊急度/重要度の高いものはslackで共有することにし簡素にした、
　これは自分の主観ですが「極力エンジニアのコーディングする時間/考える時間をとりたい」という気持ちがあるためである

・リモート飲み会に参加してみた
　好きな飲み物 / 食べ物を用意して雑談するだけで、3時間くらい話してた
　自宅で参加しているので、飲んだ後に電車に乗って家に帰るという労力を使わずにすむのは快適だった

---

在宅勤務状況

・モニターがなく、MacBookAirで仕事しているので表示領域が狭いのが辛い
・小さい子供がいるので、仕事中でもたまに話しかけられる
・ペットの散歩を1日3回いくことで軽微な運動をしている
【MySQL】mysqldumpコマンドを使用して、DB -> DBへデータをコピーする方法

## はじめに
`mysqldump`というコマンドを初めて見る機会がありました。
※以下簡略化して記載しています。

```shell
mysqldump -h <ホスト名_1> <DB名_1> -u <ユーザー名_1> -p | mysql -h <ホスト名_2> <DB名_2> -u <ユーザー名_2> -p
```

このコマンドが何をしているのか、分解して把握をしたかったので備忘録として残します。

## 環境
```yaml
OS: macOS Catalina 10.15.3
```
## 冒頭のコード

```shell
mysqldump -h <ホスト名_1> <DB名_1> -u <ユーザー名_1> -p | mysql -h <ホスト名_2> <DB名_2> -u <ユーザー名_2> -p
```

### コマンドの意味

```
<ホスト名_1>
<DB名_1>
<ユーザー名_1>
※パスワードはプロンプトで入力を促される
```
のDB内データを

```
<ホスト名_2>
<DB名_2>
<ユーザー名_2>
※パスワードはプロンプトで入力を促される
```
のDBに移行する。

気になる方は、以下で詳しく見ていきましょう！

## 解説

### 1. パイプ
まずは、ゴニョゴニョしている部分を簡略化したほうが全貌がわかりやすいので、前半を`A`、後半を`B`とします。

そうして見やすくすると、こうなります。

```
mysqldump A | mysql B
```
コマンドラインではパイプ(`|`)でつなぐことで、左側の出力結果を右側の入力にすることができます。

つまり、

```
mysqldump A
```
の出力を

```
mysql B
```

の入力にすることができます。

あとは、A, Bを詳しく見ればいいですね！

### 2. 前半(A)

```shell
mysqldump -h <ホスト名_1> <DB名_1> -u <ユーザー名_1> -p
```

長いとどうにも見にくいので、分解して見ていきます。
※それぞれ[MySQL公式](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)の説明を引用します。

---
```
mysqldump
```
> mysqldump コマンドは MySQL サーバーにログインして情報を抽出します。

---

```shell
-h <ホスト名_1>
```
> 与えられたホスト上の MySQL サーバーからデータをダンプします。デフォルトホストは localhost です。

---

```
<DB名_1>
```
> 該当のデータベース全体をダンプする

---
```shell
-u <ユーザー名_1>
```
> サーバーへの接続時に使用する MySQL ユーザー名。

---

```shell
-p
```
> サーバーに接続する際に使用するパスワードです。コマンド行で、--password オプションまたは -p オプションに続けて password の値を指定しなかった場合、mysqldump はそれを要求します。

---


### 3. 後半(B)
```
mysql
```
> mysql は、入力行の編集機能を備えた簡単な SQL シェルです。

※オプションは前半と同様のため割愛


## 補足：別のコマンドで代用するなら

```shell
$ mysqldump -u mysql_user_name >> /dump_database/backup
```
でエクスポートした`backup`ファイルを、

```shell
$ mysql -u mysql_user -p database_name < /dump_database/backup
```
でインポートする。

普通はこのように2回コマンドを打つわけですが、これを**一発で済ませよう**とすると冒頭のコマンドになるんですね！

以上です！
## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [mysqldumpまとめ - Qiita](https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c)
- [「DBダンプを取得して！」って何？ - Qiita](https://qiita.com/ryuuuuuuuuuu/items/c8f4525036e29d77be28)
- [MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)
- [MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.1 mysql — MySQL コマンド行ツール](https://dev.mysql.com/doc/refman/5.6/ja/mysql.html)
JavaSilver11 勉強法

JavaSilever11に合格することができたので勉強法を書いていこうと思います。



##勉強時間と方法

書籍は黒本だけを利用。
とても詳細且つ分かりやすく解説がしてあります。
ある程度知識がある人は黒本だけで十分足ります。

勉強時間　約80時間
日数　約1か月

##勉強法　
1章～11章の解説のページを自分が既に知っている内容知らない内容にかかわらずノートに要約し書き出しました。

12章と13章の模擬試験を2周する

1回目　65点　
2回目　99点（問題を暗記してしまっているからめちゃくちゃ高い）

##合格したいだけなら...

模擬試験(12章,13章)の問題をすべてを理解していれば合格可能です。
対策のブログなどでさんざん言われてますが、模擬試験と問題がほぼ同じだからです。
私が受けたとき(2020/02/29)は半分程度が模擬試験の問題とほぼ同じあるいはまったく同じでした。
ただ丸暗記はやめたほうがいいです、一見模擬問題と同じに見えて模擬と違う答えになる問題もあります。

##コツ
ラムダは捨てても大丈夫というサイトが多いですが個人的にはもったいないと思います。
ラムダはコレクションAPIを使う上で必要になりますし、ラムダを使っているから読みたいコードを理解できない...
なんていうのはもったいないです。
黒本はわかりやすいのでほとんど理解できますが、わかりずらい人は
https://www.youtube.com/watch?v=Lhr9ZCmT1b0
を見たり、自分でコードを描くと理解しやすいです。

モジュールシステムは暗記問題です。
pandas rolling()メソッドの挙動

# はじめに

[Advanced Python(時系列解析)](https://www.amazon.co.jp/%E6%99%82%E7%B3%BB%E5%88%97%E8%A7%A3%E6%9E%90-%E8%87%AA%E5%B7%B1%E5%9B%9E%E5%B8%B0%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB%E7%8A%B6%E6%85%8B%E7%A9%BA%E9%96%93%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5-Advanced-%E5%B3%B6%E7%94%B0-%E7%9B%B4%E5%B8%8C/dp/4320125010/ref=pd_aw_sbs_14_4/355-0401449-3667847?_encoding=UTF8&pd_rd_i=4320125010&pd_rd_r=1b383d15-c4b7-4c76-a51b-4defd44ba9e4&pd_rd_w=cfPZQ&pd_rd_wg=atta8&pf_rd_p=1893a417-ba87-4709-ab4f-0dece788c310&pf_rd_r=KNHHHK22TY4MB1ZQ5181&psc=1&refRID=KNHHHK22TY4MB1ZQ5181)を読んで知りました。
移動平均を取る際にrolling()メソッドを使うとのこと。
いくつか疑問が出たので簡単な検証のメモです。


# 疑問1: 指定したwindowサイズに自身は含まれるの？
-> 含まれます。

<br>
まずはSeriesの作成。

```py
series = pd.Series(range(10))
print(series)

# 0    0
# 1    1
# 2    2
# 3    3
# 4    4
# 5    5
# 6    6
# 7    7
# 8    8
# 9    9
```

<br>
window=3で試してみます。
(上2行 + 自身の行)の平均が出てますね。

```py
series_size3 = series.rolling(window=3).mean()
print(series_size3)

# 0    NaN
# 1    NaN
# 2    1.0
# 3    2.0
# 4    3.0
# 5    4.0
# 6    5.0
# 7    6.0
# 8    7.0
# 9    8.0
```

# 疑問2: center=Trueの場合も自分は含まれる？
-> 含まれます。

<br>
引数で`center=True`を指定すると、前後の行との平均をとっていることがわかります。

```py
series_size3 = series.rolling(window=3, center=True).mean()
print(series_size3)

# 0    NaN
# 1    1.0
# 2    2.0
# 3    3.0
# 4    4.0
# 5    5.0
# 6    6.0
# 7    7.0
# 8    8.0
# 9    NaN
```

# 疑問3: center=Trueでwindowサイズが偶数の時はどうなるの？
-> 上の行が優先して取られます。

<br>
window=2とwindow=4で検証。
window=2の場合 (上の1行 + 自身の行)の平均になっています。

```py
series_size2 = series.rolling(window=2, center=True).mean()
print(series_size2)

# 0    NaN
# 1    0.5
# 2    1.5
# 3    2.5
# 4    3.5
# 5    4.5
# 6    5.5
# 7    6.5
# 8    7.5
# 9    8.5
```

<br>
window=4の場合は(上の2行 + 自身の行 + 下の1行)の平均。

```py
series_size4 = series.rolling(window=4, center=True).mean()
print(series_size4)

# 0    NaN
# 1    NaN
# 2    1.5
# 3    2.5
# 4    3.5
# 5    4.5
# 6    5.5
# 7    6.5
# 8    7.5
# 9    NaN
```

# 疑問4: shift()でindex番号をズラす場合は計算する行もズレる？
-> ズレない

<br>
わかりやすいように、先頭の値を100にする。

```py
series = pd.Series([100, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(series)

# 0    100
# 1      1
# 2      2
# 3      3
# 4      4
# 5      5
# 6      6
# 7      7
# 8      8
# 9      9
```

<br>
ズラしてないものと2行ズラしたものを比較。
平均をとってから、indexがズレていることがわかります。

```py
series_size4 = series.rolling(window=4).mean()
series_size4_shift = series.rolling(window=4).mean().shift(-2)
print(series_size4)
print(series_size4_shift)

# 0     NaN
# 1     NaN
# 2     NaN
# 3    26.5
# 4     2.5
# 5     3.5
# 6     4.5
# 7     5.5
# 8     6.5
# 9     7.5

# 0     NaN
# 1    26.5
# 2     2.5
# 3     3.5
# 4     4.5
# 5     5.5
# 6     6.5
# 7     7.5
# 8     NaN
# 9     NaN
```
MacでKotlinを使ったAndroidアプリ開発  〜環境構築編〜

タイトルの通り

#開発環境(IDE)のダウンロード

昔はEclipseにAndroidの開発プラグインを導入してAndroid開発してたけど
今はAndroid Studioっていう独立したIDEを使うのが主流っぽい

というわけで公式サイトから[Android Studioの最新版](https://developer.android.com/studio?hl=ja)をダウンロード

#インストール

ダウンロードしたファイルでインストール作業を実施。
と言ってもMacなのでappを指定のフォルダに配置するだけ
![スクリーンショット 2020-03-11 23.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601102/676e6d75-05a5-da0b-7238-3dc6e424f6ba.png)

最初に表示された画面で「AndroidのSDKインストールしちゃうぜ」的な文章が記述されているけどそのまま「Next」
![スクリーンショット 2020-03-11 23.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601102/958efeb8-9bcc-2506-67ff-2bfc8336002c.png)


テーマの選択画面
ここ数年でダークモード採用するところ増えてきてるよね
職場でも何人かIDEをダークモードにして開発してる人いるし・・・

自分は昔ながらのホワイトを選択
![スクリーンショット 2020-03-11 23.54.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601102/25a03d65-5915-edbc-ff2b-26fb60d4b070.png)


なんか途中で「`Running Intel® HAXM installer`」がめちゃくちゃ時間かかった・・・(15分くらい)
![スクリーンショット 2020-03-12 0.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601102/5184ee31-7e34-6727-462a-268645c7acdc.png)


それでも無事に起動までできました
ViewerCertificateException

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456186/65e056a0-deb6-82d5-cfb5-3a9ca9a696e0.jpeg)


##エラーメッセージ

com.amazonaws.services.cloudfront.model.InvalidViewerCertificateException: To add an alternate domain name (CNAME) to a CloudFront distribution, you must attach a trusted certificate that validates your authorization to use the domain name

##問題

対象のドメインの証明書をCertificateManagerで発行。
しかし、CloudFront Distributionsで認識されない。
（ Edit画面、SSL Certificate にて、Custom SSL Certificate が選択不能 ）

##結論

4回くらいリロードしたら治った()

##経緯

#####1.S3で静的サイトを構築。
#####2.xdomainで独自ドメインを取得。
ドメイン作成後60日間はRoute53に移管できない事を知らずに取得。
（その他ドメイン移管条件はググって下さい）
応急処置として、AWSのName Serverをxdomeinのレジストラに登録。

#####3.CloudFront の OriginDomain にS3 の静的サイトを設定。

#####4.CertificateManager で 上記ドメインの証明書発行。
この時、証明書発行の認証方法として「DNS」か「email」を選ぶ。
この時は「DNS」を選択。

#####5.CloudFront Distribution Setting　にて、(4)の行為が反映されていない
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456186/2e413e69-abe3-33ca-fdbb-b51f5168bb96.jpeg)

SSL Certificate にて、Custom SSl Certificateを選択できない（証明書の存在を認識していない）


#####6.ドメインの証明書再発行

証明書発行の認証方法として「email」を選択。

#####7.再発と解決

またもや(5)と同じ現象。

1.CloudFront のホーム画面の　Edit　を押す。
2.Edit Distribution　から CloudFront のホーム画面に戻る。

上記1と2を4回繰り返した結果、(5)で　Custom SSl Certificate　を選択できるようになっていた。。。。
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456186/fafee3fe-ca5b-ff4f-f9e5-c39c1927af0e.jpeg)


###おまけ

今回、ドメインはxdomainで取得した。
下記参考書曰く、
AWS内でドメインを取得すれば、自動で証明書が発行される。
その場合、(5)のSSL Certificate は Default(略)でOK。

##参考

####[Youtube](https://youtu.be/JbQbwum196g)

1. CertificateManagerでドメインの証明書発行
2. 上記ドメインをCloudFrontのALtanateDomainNamesに設定。

####[Kindle](https://www.amazon.co.jp/gp/product/B07BMQL59H/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)

- Amazon Web Services パターン別構築・運用ガイド 改訂第2版
【まとめ】GoogleMapsPlatformで駆け出したいときの参考サイト3選

##GoogleMapsPlatformとは？

webサイトやアプリケーションにgoogleマップを表示・カスタマイズするためのAPI等を提供している~~重課金推奨~~サービス。

GoogleMapsPlatformの公式サイトは[こちら](https://cloud.google.com/maps-platform/?hl=ja)。

公式ドキュメントが日本語対応していないというイカしたAPIが揃っているのです。。

英弱なので頭を抱えてしまいました。。。

(イカしたAPI達を紹介する記事は後日書こうかと。)

##GoogleMapsPlatform、情報少なくない？？

以前はGoogleMapsAPIとして提供されていたのですが、
2018年6月11日からはGoogleMapsPlatformにリニューアルされました。

そのタイミングで、新しい仕様を満たさないままAPIを呼び出し、表示させているマップは警告が出たり、グレーアウトされてしまうようになったようです。

また、有料化も相まって、元々多くない日本語の解説サイトでもデモが動いていなかったり、
意外と日本語の情報が少ない気が...。

最近GoogleMapsPlatformを使用する機会があったのですが、
そういうわけでとても困った次第でした。(英弱)

##MapsJavascriptAPIを主に使用
サイト内にマップを埋め込んだりするにはMapsJavascriptAPIを使用します。

このAPIを使って、基本的なマップへのマーカー立てや、線を引いたり、
地図の縮尺を変更して表示させたりは、以下のサイトを見れば出来るようになるかと思います！

ぜひ参考にしてみて下さい！

##参考にしたサイト３選

###[SYNCER](https://lab.syncer.jp/Web/API/Google_Maps/JavaScript/)
MapsJavascriptAPIについてクラスやプロパティ等が詳細にわたって載っています！
サンプルコードも充実しているので、辞書的に使えます。
常に別タブで開いておいて損はないサイトです。

###[Let'sプログラミング](https://www.javadrive.jp/google-maps-javascript/)
こちらはGoogleMapsPlatformのAPIを使った様々な取り組みをサンプルコードと画像付きで解説してくれています。初心者はすこしとっつきにくいUIをしていますが、コード自体は複雑ではないのでおすすめです。

###[マルティスープ株式会社 StaffBlog](https://maps.multisoup.co.jp/blog/category/javascriptapi/)
APIの活用例とその解説、サンプルコードも載っていて、MapsJavascriptAPIだけでなくRoadsAPIを使用する際に何度も拝見しました。
手取り足取り初心者向けに説明はしていないのですが、
ある程度ざっくり理解出来ている状態だとナルホド！と理解できると思います。

##おまけ
###RoadsAPIの公式デモが動かない問題
[公式デモ](https://developers.google.com/maps/documentation/roads/snap#demo)
これ、そのままコピペしても動かないんですよねー...。
(もちろんjQueryの読み込みとAPIキーは入力済み)
何ならViewExampleをクリックしても真っ白で、いい加減にしてくれよと。

StackOverFlowで解決策を探したところ、
[こちら](https://stackoverflow.com/questions/48111195/google-maps-snap-to-road-demo-not-working-google-maps-api-error-missingkeymap)のAnswerに載っているコードで動きました！


RoadsAPIのデモが見たいんだ！！！という方は参考にしてみて下さい。
express-generator作成：自分用メモ

# express-generaterでアプリ作成
```bin
express -e "ファイル名"
```

# npm install
作成したファイルに移動し、

```bin
npm install
```

※もしnpm start がエラーになる場合は、

```
npm install --save npm 
```
と打つ。

#アプリをスタート

```
npm start
```
これで動きます。
CSSにデザインが適用される優先順位(自分用メモ)

htmlファイルにデザインを適用する際には、以下の３パターンの方法がある。

1.htmlのタグに直接書く
2.htmlのファイルに記述する
3.cssファイルを呼び込む

上記の３パターンの間ではデザインを適用する際に優先順位がある。
優先順位は以下の通り。

1 > 2 > 3

また、cssは下から順に書かれたものを優先するという性質もある。
Dockerを試すサンプルメモ③（Fluentd編）

# メモ
- やってる内容は参考リンクの公式ドキュメントと全く同じなので本来そちらを参照するべき
- 本記事は自分の環境での実行メモ
- 収集元：https://qiita.com/kure/items/832148a161b172039bf3 の`hoge` を定期出力するだけのイメージ
    - DockerのFluentd ログドライバを用いる
- 収集先：FluentdのDockerイメージ
    	- `@type forward` で受け取って `@type stdout` で標準出力にそのまま表示する

まずfluentedの設定ファイルを準備

```zsh:ターミナルA
 % cat test.conf                                                                   (git)-[develop] 
<source>
  @type forward
</source>

<match *>
  @type stdout
</match>
```

受け用のFluentedのDockerコンテナを立ち上げる

```zsh:ターミナルA
% docker run -it -p 24224:24224 -v [test.confへの絶対パス]:/fluentd/etc/test.conf -e FLUENTD_CONF=test.conf fluent/fluentd:latest
```

送る用のコンテナを立ち上げる

```zsh:ターミナルB
% docker run --log-driver=fluentd [IMAGE ID]
```

そうするとターミナルAの方でログが逐次出力される

```zsh:ターミナルA
 % docker run -it -p 24224:24224 -v /home/kure/repo/kanrinmaru-worker/kure-docker-ubuntu/test.conf:/fluentd/etc/test.conf -e FLUENTD_CONF=test.conf fluent/fluentd:latest
2020-03-11 14:37:33 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/test.conf"
2020-03-11 14:37:33 +0000 [info]: using configuration file: <ROOT>
  <source>
    @type forward
  </source>
  <match *>
    @type stdout
  </match>
</ROOT>
2020-03-11 14:37:33 +0000 [info]: starting fluentd-1.3.2 pid=7 ruby="2.5.2"
2020-03-11 14:37:33 +0000 [info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "-c", "/fluentd/etc/test.conf", "-p", "/fluentd/plugins", "--under-supervisor"]
2020-03-11 14:37:34 +0000 [info]: gem 'fluentd' version '1.3.2'
2020-03-11 14:37:34 +0000 [info]: adding match pattern="*" type="stdout"
2020-03-11 14:37:34 +0000 [info]: adding source type="forward"
2020-03-11 14:37:34 +0000 [info]: #0 starting fluentd worker pid=17 ppid=7 worker=0
2020-03-11 14:37:34 +0000 [info]: #0 listening port port=24224 bind="0.0.0.0"
2020-03-11 14:37:34 +0000 [info]: #0 fluentd worker is now running worker=0


2020-03-11 14:38:17.000000000 +0000 804fc5e3c34d: {"container_id":"804fc5e3c34d04fe5019019a95605dd5916bfd38fec688b8a0d13f008069a614","container_name":"/eloquent_liskov","source":"stdout","log":"hoge"}
2020-03-11 14:38:18.000000000 +0000 804fc5e3c34d: {"container_name":"/eloquent_liskov","source":"stdout","log":"hoge","container_id":"804fc5e3c34d04fe5019019a95605dd5916bfd38fec688b8a0d13f008069a614"}
2020-03-11 14:38:19.000000000 +0000 804fc5e3c34d: {"container_id":"80
```

# 参考
Fluentd logging driver | Docker Documentation https://docs.docker.com/config/containers/logging/fluentd/
[C#]DirectShowLibのサンプルを動かしてみる in 2020年

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
仕事で、PCについているカメラから画像を取ってきて表示する部分に「DirectShow」というものを使っているものが出てきた。どういうものかよくわかってないので、調べたい。

もともとC++のライブラリっぽいが、C#でラップしたライブラリ(DirectShowLib)があるようなので、それを使ってとりあえず動かして感覚をつかみたい。

30秒で調べたところによると、動画や静止画を扱うWindowsのライブラリはどんどん移り変わっていっているようで、

- Video for Windows
- Media Control Interface(MCI)
- DirectShow
- MediaFoundation
- など...

という感じでいろいろある様子。(間違えてるかも)
DirectShowについては調べてると2010年より前の情報しか出てこない感じなので、調べづらいし、今勉強する意味あるかな？と思ってしまうが、とりあえず仕事で困らない程度に慣れておくことにする。


## DirectShowLibのサンプルを動かして、画面の写真を撮るまでの流れ in 2020年3月

### 〇サンプルをダウンロード
下記のページの` 2010-February`フォルダの中の`DirectShowSamples-2010-February.zip`をダウンロードする。
https://sourceforge.net/projects/directshownet/files/DirectShowSamples/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/a4694f12-66bd-7a55-a7af-58403220344d.png)

### 〇ソリューションを開く
解凍してできたフォルダの中のいろいろあるサンプルから、`Samples\Capture\DxSnap`を開く
→VSのソリューション`DxSnap-2005.sln`を開く。

※slnファイルの形式が古いのでバージョンUPしますか？とVisualStudioに聞かれるので、バージョンUPする。

### 〇NugetでDirectShowLibをとる
DxSnap-2008プロジェクトのNugetで「DirectShowLib」のv1.0.0を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/eeb58fc6-601d-83ba-92bf-73330de35f85.png)

※サンプルには、元から「DirectSHowLib-2005」というライブラリが参照に入っているが、これが2020年時点ではNugetで手に入らないようなので、代わりにv1.0.0を追加する。

### 〇ターゲットフレームワークの設定

サンプル`DxSnap-2005.sln`のターゲットフレームワークが`.Net Framework 4`になっているが、これを`.Net Framework 4.5`にする。
※NugetしたDirectShowLib v1.0.0が4.5でないと動かないため、そうする。

### 〇実行
ビルドして、実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/ebd7e67d-fb5c-6844-a7af-d13d2cb6006f.png)

おわり

# メモ
同じサンプルの中に、`DxPlay-2005`というソリューションがあり、そこで、カメラから画像をintで受けて、それをSystem.Drawing.Bitmapに直している部分があった。

→サンプルグラバーというやつの
GetCurrentBuffer()で、画像のデータがとれてるっぽい。その辺をみれば、参考になりそう。

# 参考（DirectShowを調べようと思って通り過ぎたもの）

〇DirectShowサンプル(C++)
https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/Win7Samples/multimedia/directshow

〇良さげ？なページ(C++)
https://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html

〇画像を取って、保存するまで(ビルドしようとしたら、Win SDKの古いのがいるとかでビルドできなかった)(C++)
https://www.geekpage.jp/programming/directshow/samplegrabber.php

→最終的に、C++あきらめてC#のライブラリに行った。

〇C#のDirectShowラッパーのページ
top
http://directshownet.sourceforge.net/
Macを初期化して開発機にした。

# macにOSをクリーンインストールした。
僕のmacは個人用に使っていたのですが、無職になったのを機にいろいろなことを試したくなったので、OSをクリーンインストールして、dockerとかVScodeなどを触れる環境に構築しなおしてみました。

- 使用しているMacについて
    - intel core i5(2.7GHz デュアルコア)
    - メモリ 8GB
    - グラフィックス(グラボ？) Intel Iris Graphics 6100 1536 MB
    - 型番 A1502


- OSのインストール
    - MacのOSのインストールは公式のページから簡単に行うことができました。
        - 検索ワード：mac クリーンインストール
        - Networkでインストールする方法などがありましtが、私はUSBでクリーンインストールする方法をとりました。
        - macでレスキューモードで起動するときには、command + R をキーボード入力する必要があります。

        
- インストール後にやったこと
- vscodeのインストール
    - vscodeはmicrosoftからでているコーディングツールです。
    - 検索ワード：vscode install for mac
        - その後、pythonモジュールをインストールしました。


- 今後やりたいことについては下記。
    - pythonを使ったプログラミング
    - zabbixを使った性能可視化
    - Jenkinsを使ったcron実行とビルド自動化
    - docker + k8sを使ったアプリケーションdemoなどです。
【今日のアブストラクト】Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift【論文 ほぼ Google 翻訳 自分用】

1 日 1 回 (努力目標) 論文の Abstract を Google 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ Google 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift](https://arxiv.org/abs/1502.03167)


# Abstract

### 訳文

ディープニューラルネットワークのトレーニングは, 前のレイヤーのパラメーターが変化するため, トレーニング中に各レイヤーの入力の分布が変化するという事実により複雑になります. これにより, 低い学習率と注意深いパラメーター初期化が必要になるため, トレーニングが遅くなり, 非線形飽和特性を持つモデルのトレーニングが難しくなります. この現象を内部共変量シフトと呼び, レイヤー入力を正規化することで問題に対処します. この方法は, 正規化をモデルアーキテクチャの一部とし, 各トレーニングミニバッチの正規化を実行することの強みを引き出しています. バッチ正規化により, はるかに高い学習率を使用でき, 初期化にあまり注意を払う必要がなくなります. また, 場合によってはドロップアウトの必要性を排除して, 正則化としても機能します. 最新の画像分類モデルに適用されるバッチ正規化は, 14 分の 1 少ないトレーニングステップで同じ精度を達成し, 元のモデルを大幅なマージンで打ち負かします. バッチ正規化ネットワークのアンサンブルを使用して, ImageNet 分類で公開されている最高の結果を改善します: トップ 5 検証エラー 4.9% (およびテストエラー4.8%) に達し, 人間の評価者の精度を超えています.

### 原文

Training Deep Neural Networks is complicated by the fact that the distribution of each layer's inputs changes during training, as the parameters of the previous layers change. This slows down the training by requiring lower learning rates and careful parameter initialization, and makes it notoriously hard to train models with saturating nonlinearities. We refer to this phenomenon as internal covariate shift, and address the problem by normalizing layer inputs. Our method draws its strength from making normalization a part of the model architecture and performing the normalization for each training mini-batch. Batch Normalization allows us to use much higher learning rates and be less careful about initialization. It also acts as a regularizer, in some cases eliminating the need for Dropout. Applied to a state-of-the-art image classification model, Batch Normalization achieves the same accuracy with 14 times fewer training steps, and beats the original model by a significant margin. Using an ensemble of batch-normalized networks, we improve upon the best published result on ImageNet classification: reaching 4.9% top-5 validation error (and 4.8% test error), exceeding the accuracy of human raters.
Next.jsでdotenvを使う方法

#dotenv-webpackをインストールする
まずはNext.jsでdotenvを導入する上で必要なモジュールをインストールします。

```
npm i dotenv-webpack
```

#next.config.jsにてdotenvの設定を行う

以下みたいな感じでOK。

```JavaScript:next.config.js
require("dotenv").config();

const path = require("path");

const Dotenv = require("dotenv-webpack");

module.exports = {
  webpack: config => {
    config.plugins = config.plugins || [];

    config.plugins = [
      ...config.plugins,

      new Dotenv({
        path: path.join(__dirname, "env"),
        systemvars: true
      })
    ];

    return config;
  }
};
```
これで「process.env.」が使えるようになります。
プログラムはなぜ動くのか？を読んでみてまとめることで知識の定着を図る投稿#4

[プログラムはなぜ動くのか第２版](amazon.co.jp/プログラムはなぜ動くのか-第２版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=sr_1_1?adgrpid=53631245656&gclid=Cj0KCQjw0pfzBRCOARIsANi0g0tajATNcn3H7Ogokqrdst5O2JctSzMRb6A0XyW5GegcPbJwaEvZO84aAlK8EALw_wcB&hvadid=338517958683&hvdev=c&hvlocphy=2392&hvnetw=g&hvqmt=e&hvrand=9776556383623440456&hvtargid=kwd-334563073858&hydadcr=27265_11561134&jp-ad-ap=0&keywords=プログラムはなぜ動くのか&qid=1583760691&sr=8-1)

を僕が師匠と読んでいる方に進めていただき、読んでみようと思いました。
そこで、僕的にはかなり難しいこともあり、この本をまとめながら読み進めていくことによって理解度を高めようと思いました。

こちらはあくまでも推奨する記事ではなく、僕がこうした方が定着しやすいかもと思い、記録に残すことにしました。

##条件分岐と繰り返しの仕組み

プログラムの流れには
「順次進行」
「条件分岐」
「繰り返し」

の３種類があります。

###順次進行
アドレスの値の順に命令を実行することです。
###条件分岐
条件に応じて任意のアドレスの命令を実行すること。
###繰り返し
同じアドレスの命令を何度か繰り返し実行すること。


|プログラム・カウンタの値の変化|アドレス|メモリーの内容|
|:-----------------|:-----------------|:-----------------|
|0100|0100|命令:0106番地の値をアキュムレータに格納せよ|
|0101|0101|命令：アキュムレータの値を0と比較せよ|
|0102|0102|命令：大きければ0104番地にジャンプせよ|
||0103|命令：アキュムレータの値の符号を反転せよ|
|0104|0104|命令：アキュムレータの値をディスプレイに表示せよ|
|0105|0105|命令：プログラムを終了せよ(OSに戻れ）|
||0106|データ：123|

0104番地にジャンプせよみたいな命令を「ジャンプ命令」というらしい

なので条件分岐や繰り返しで使われているのが「ジャンプ命令」と言われるらしい

CPUを構成する中に「フラグ・レジスタ」というのがあります。

###フラグ・レジスタ
このフラグ・レジスタは直前に実行した演算の結果として、アキュムレータの値が負、ゼロ、正のいずれになったかを記憶する役割を持つ者です（オーバーフロー、バリティチャックの結果なども記憶しています）

CPUが何らかの演算を行うたびに、その結果に応じて、フラグ・レジスタの値が自動的に設定されます。

条件分岐では、ジャンプ命令の前に何らかの比較演算が行われます。

ジェンぷ命令を実行するかどうかはフラグ・レジスタが決める

##まとめ
今日の感想はこんな感じ
なんか格好いい名前のものがどうするかを決める「フラグ・レジスタ」
そろそろ8人目のレベル５かな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/7395801b-40e1-6214-87c5-f048279068a7.png)
rails db:migrateをするとエラーが発生(rails aborted!StandardError: An error has occurred)

# 発生したエラー内容
データベースにカラムを追加しようとすると次のメッセージが表示され処理が中断された。
「duplicate column name」とあるのでカラムが重複しているらしい。

```zsh
$ rails db:migrate
== 20200311131021 AddRememberDigestToUsers: migrating =========================
-- add_column(:users, :remember_digest, :string)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: remember_digest
#中略
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
```

# 原因の確認
## 1. /db/migrateでマイグレーションファイルの確認


重複した記述は見られず。

## 2. データベースの確認

```zsh
$ rails db
sqlite> .schema Users
CREATE TABLE IF NOT EXISTS "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "email" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "password_digest" varchar, "remember_digest" varchar);
```
作成しようとした「remember_digest」カラムがすでに存在した。...なぜ？

## 3. マイグレーションの実行状況を確認

```zsh
$ rails db:migrate:status

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200229035424  Create users
   up     20200229052320  Add index to users email
   up     20200229053658  Add password digest to users
   up     20200307032712  ********** NO FILE **********
  down    20200311131021  Add remember digest to users
```
NO FILEがある...

ここでやっと気づきました。
一度git resetをしていたのでマイグレーションファイルは削除されたがデータベースには手を加えていないのでそのままになっていたようです。

# 解決方法
正しい方法かはわからないですが以下の手順で解決しました。
データベースに登録されているデータは全て消えるので注意が必要です。

```zsh
$ rails db:reset # データベースの再作成

$ rails db:migrate:status # マイグレーションファイルの確認

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200229035424  Create users
   up     20200229052320  Add index to users email
   up     20200229053658  Add password digest to users
  down    20200311131021  Add remember digest to users

$ rails db:migrate # まだ適用されていなかったマイグレーションファイルの適用
Docker を試すサンプルメモ②（ログ：JSON/syslog編）

# メモ
- ログ出力する様子を確認する
- json形式とsyslog出力を試す
- ホストはUbuntu 18.04

## JSON形式のログ確認

まず事前準備でイメージを作成する

```zsh:ターミナルA
# Ubuntuのイメージをダウンロード
# ログを確認するため、フォアグラウンドで `hoge` を出力し続けるイメージを作成する
% cat Dockerfile
FROM ubuntu
CMD while :; do echo hoge ; sleep 1; done
# イメージ作成
% docker build .
```

ログの場所は `/var/lib/docker/containers` 以下になるため、ここで事前に別ターミナルでログは何も無いことを確認する。

```zsh:ターミナルB
% pwd
/var/lib/docker/containers
% ls 
# 何も無い 
```

コンテナ実行

```zsh:ターミナルA
# 作成したイメージをコンテナとして実行する
# `hoge` が出力され続ける
% docker run [IMAGE ID]
hoge
hoge
hoge
....
```

ログ確認

```zsh:ターミナルB
# 確認するとコンテナIDのフォルダが作成されている
% ls
35a6b3f7dd71728f472b8d080c0ead191e397277194f7904f0b728c29f97d629
% cd 35a6b3f7dd71728f472b8d080c0ead191e397277194f7904f0b728c29f97d629
# 中身を確認すると、いくつかファイルがあるが、コンテナID-json.log が対象のログファイル
% ls
35a6b3f7dd71728f472b8d080c0ead191e397277194f7904f0b728c29f97d629-json.log  hosts
checkpoints                                                                mounts
config.v2.json                                                             resolv.conf
hostconfig.json                                                            resolv.conf.hash
hostname
# ログファイル中身確認。JSON形式で出力内容がログとして記録されている
% cat 35a6b3f7dd71728f472b8d080c0ead191e397277194f7904f0b728c29f97d629-json.log 
{"log":"hoge\n","stream":"stdout","time":"2020-03-11T13:42:50.246660997Z"}
{"log":"hoge\n","stream":"stdout","time":"2020-03-11T13:42:51.247573417Z"}
{"log":"hoge\n","stream":"stdout","time":"2020-03-11T13:42:52.249046128Z"}
{"log":"hoge\n","stream":"stdout","time":"2020-03-11T13:42:53.249507157Z"}
....
```

## syslog でのログ確認

一度上記の環境を削除し、綺麗にする

```zsh:ターミナルA
% docker ps -aq | xargs docker rm; docker images -aq | xargs docker rmi -f
```

ちなみに、コンテナを削除すると、ログファイル類の削除も消える

```zsh:ターミナルB
% /var/lib/docker/containers# ls
# なにもない
```

```zsh:ターミナルA
% docker build .
# --log-driver で syslog を指定する
% docker run --log-driver=syslog [IMAGE ID]
hoge
hoge
...
```

```zsh:ターミナルB
% tail -f /var/log/syslog
[hogeを含んだログが色々出力される]
```

# 参考
Dockert調査　~ログ編~ - Qiita https://qiita.com/HommaHomma/items/f943fa3397bc3f386057
基本情報技術者　ストラテジ系　第2章　市場の分析

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより

# 市場の分析
基本チャートやグラフの分析となるので
縦軸、横軸がなんになるか理解することが重要です。

また指標の定義もしっかり理解することも重要です。

## バブルチャート
散布図の一種でデータ間の相関を調べる際に利用するチャートです。 
通常の散布図では、縦軸と横軸の2種類のデータが表示されますが
バブルチャートでは縦軸・横軸に加え、点の大きさで3つ目のデータを表示できます。

横軸、縦軸が何を表しているかしっかり確認することが重要です。

## 折れ線グラフ
時系列での変化を把握するのに適しています。
marginとpaddingって結局どっち使えばいいんだっけ

たまに扱うと分からなくなるので。

ここの議論と図が分かりやすかった。
こういう時は`~ vs ~` 検索がやっぱいいですね。
[When to use margin vs padding in CSS [closed]
](https://stackoverflow.com/questions/2189452/when-to-use-margin-vs-padding-in-css)

この図が全て。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149698/8b324bb3-6ea7-77f7-6866-3ec1e7ab88ce.png)
画像: https://www.w3schools.com/css/css_boxmodel.asp

Contentと別Contentとの間にスペース作りたい時はmargin
ContentとContent自身のBorderとの間にスペース作りたい時はpadding

という認識。
jshellのデフォルトエディタにVS Codeを指定する

# 環境
**OS**

Windows 10

**Java**

11

# jshell で外部エディタを使う
jshell には、外部エディタを使ってコードスニペットを編集できる機能が用意されている。

```shell
jshell> /edit
```

![jshell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28302/d9c02750-dc3f-e5a1-8d2c-ac1d8f04b1df.jpeg)

デフォルトでは、こんな感じの超シンプルなエディタが立ち上がる。[^1]

[^1]: Ctrl+Z や Ctrl+Y による編集のやり直しや再実行ができないくらいシンプル

![jshell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28302/068041de-96cc-3dcb-18c7-fef7f44c1d21.jpeg)

ここでコードを編集して `Exit` でエディタを閉じると、エディタにかかれていたコードがスニペットとして登録される。

スニペットが複数存在する場合は、 `/edit <スニペットのID>` と指定すれば、指定したスニペットだけが編集できる。
（スニペットIDを指定してない場合は、全てのスニペットがエディタに表示される）

# 外部エディタに VS Code を指定する
`/edit` で使用される外部エディタは、 `/set editor <エディタを起動するためのコマンド>` という形で指定できる。

```shell
jshell> /set editor "F:\\ProgramFiles\\Microsoft VS Code\\Code.exe" -w
|  エディタは次に設定されています: F:\ProgramFiles\Microsoft VS Code\Code.exe -w
```

VS Code を指定する場合は、 VS Code の exe へのパスと `-w` オプションを設定する。
`-w` は、ファイルを閉じるまで起動元に制御を戻さないようにするオプションで、これを付けておかないとうまく動作しない[^2]。
バックスラッシュをエスケープするのも忘れずに。

[^2]: エディタ用に作成される一時ファイルが、jshellに制御が戻るタイミングで削除されてしまい、エディタ上でコードを編集できなくなる

これで `/edit` でエディタを開くと、 VS Code が開くようになる。
ファイルを閉じれば、制御が jshell に戻る。

![jshell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28302/6dfe57f8-5bdc-530f-3b42-8c5c6e1a4786.jpeg)


# デフォルトの外部エディタを指定する
jshell の、デフォルトの外部エディタは次のいずれかの環境変数で指定できる。

1. `JSHELLEDITOR`
2. `VISUAL`
3. `EDITOR`

↑のほうが優先度が高く、先にエディタが設定されていた環境変数の情報が採用される。

つまり、環境変数 `JSHELLEDITOR` に先程の `/set editor` で指定したのと同じ情報を設定しておけば、毎回 `/set editor` する必要はなくなる。

**環境変数に設定した値**

![jshell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28302/4d1b0451-a09e-2acd-9474-a0c9ca32925d.jpeg)

**jshell から VS Code が起動される様子**

![jshell.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28302/ab75c6f8-e623-9036-4d89-0da4d5fe6804.gif)


# 参考
- [
Java Platform, Standard Edition Java Shellユーザー・ガイド リリース9](https://docs.oracle.com/javase/jp/9/jshell/editing.htm)
- [Set Visual Studio Code as default editor in jshell](https://blog.codeleak.pl/2020/02/visual-studio-code-in-jshell.html)
phpで簡易電卓を作る①


## まずは基本的な機能のみ
2つの数値と四則演算を入力すると計算した値が表示される。

```index.php
<!DOCTYPE html>
<html lang='ja'>
  <head>
    <meta charset="utf-8">
    <title>Caluculator</title>
  </head>
  <body>
    <h1>電卓(簡易版)</h1>
    <form class="formula" action="calculate.php" method="post">
      数字1:<input type="string" name="number1"><br>
      記号:<select name="symbol">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">×</option>
        <option value="/">÷</option>
      </select><br>
      数字2:<input type="string" name="number2" value=""><br>
      <input type="submit">
    </form>
    <h2>答え:<?php echo $_GET['answer']?></h2>
  </body>
</html>
```

```calculate.php
<?php
$number1 = $_POST['number1'];
$symbol = $_POST['symbol'];
$number2 = $_POST['number2'];
$answer = '';
switch ($symbol) {
     case '+':
         $answer = $number1 + $number2;
         break;
     case '-':
         $answer = $number1 - $number2;
         break;
     case '*':
         $answer = $number1 * $number2;
         break;
     case '/':
         $answer = $number1 / $number2;
         break;
};
header('Location: index.php/?answer='.$answer);

```

## 課題
・数値入力欄に数値以外を入力されたらどうする？
・続けて計算ができない

上記の点を次回は直します。
基本情報技術者　マネジメント系　第2章　サービスデスク

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより


# サービスデスク
基本的に問合せの対応に関する問題
基本情報というより、論理問題や現代文の問題に近い

## 担当部門
表からサービスデスクが何を担当しているか
理解する。

他の問題でもまず表の内容理解は必須です。

## 計算

担当部門であったことを当てはめていき、計算を行っていきます。
# Dartの定数

# Dartの定数
Flutterで何かやってみたいと思って始めたけど、Dartに触れるのも初めてなので基本的なところから勉強開始。今回は定数定義（static, final, const）について。

## staticについて
staticはクラスのフィールド変数にのみ使用することができ、同一クラスのインスタンスで１つの実体として参照できる。Dart言語ではC++なでのstatic修飾子を付与することでスコープをグローバルにすることはできない。

```dart
class Test{
	static int _left, _right;
	get right => _right;
	get left => _left;
	set right(int value) => _right = value;
	set left(int value)  => _left = value;
}

main(){
	Test test1 = new Test();
	Test test2 = new Test();
	
	test1.right = 5;
	print('test1.right = ${test1.right}');
	test2.right = 10;
	print('test1.right = ${test1.right}');
	print('test2.right = ${test2.right}');
}
```

```dart
// 実行結果
test1.right = 5
test1.right = 10
test2.right = 10
```



## finalについて

final修飾子が指定された変数は一度だけ初期化が可能な変数となり、初期化後の変更は不可。

但し、final修飾子が指定された変数のメモリ領域の内容は変更できるらしい。（これはOKなの？）

```dart
final int height = 5;
//height = 10;		// Error
print('height = $height');

final List<int> width = [ 10, 20, 30 ];
print('width = $width');
width.add(40);				// 追加できてしまう
print('width = $width');
```

```dart
// 実行結果
height = 5
width = [10, 20, 30]
width = [10, 20, 30, 40]
```



## constについて

const修飾子が指定された変数はコンパイル時に値が確定されており、finalと同様に値の変更は不可能。

一方、finalでは変更できていたが、constの場合は変数のメモリ領域の値も変更できない。

```dart
const int top = 5;
//top = 5;		// Error
print('top = $top');
const List<int> bottom = [ 5, 15, 25 ];
print('bottom = $bottom');
//bottom.add(25);	// Error
```

```dart
// 実行結果
top = 5
bottom = [5, 15, 25]
```



普段、C++を使用する機会が多いのでstatic修飾子の違いが一番印象強い。

記法は違うけれどそれほど違和感を感じる内容はなかった。引き続き時間を見つけてDartに取り組みたい。



[参考サイト]

>[Dartの変数定義時の修飾static/final/const、そしてconst constructorについて](https://qiita.com/uehaj/items/7c07f019e05a743d1022)
DVWA（SQLインジェクション）全レベルの脆弱性について

## 前提
- kali linux環境がある
- [DVWAのセットアップ済み](https://qiita.com/KPenguin/items/7e4f1c428c3dadf8591c)
- [初級レベル理解済み](https://qiita.com/KPenguin/items/0ef2fdc5a35f16f20fdb)

## 目標
- 脆弱性の理解を深める。

## 手順概要
- 大まかな挙動を把握する
- コードを見て脆弱性をみつける
- コードの脆弱性を攻撃する

## 内容
###挙動の把握
### low
- 入力値がクエリに乗っかりGETを投げる
- sqlの結果が全て下部に転写される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/f6443af0-8a8b-04a8-c824-9f8808292e52.png)


### medium
- selectBoxのoption値をPOST
- sqlの結果が全て下部に転写される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/55281d3a-d342-8d5d-78e6-5d8512f1384b.png)


### high
- クリックすると別windowが開く
- 別windowでidを入力
- 元の画面にsqlの結果が全て下部に転写される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/f9c69fd6-afd6-122c-cbce-aedb65cd7f25.png)

### コードを確認
#### low
- 入力値がそのまま格納される。

```php:
<?php
    $id = $_REQUEST[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; 
?> 
```

#### medium
- urlからの入力や、文字列の直接入力はできない。
- mysqli_real_escape_stringで特殊文字をエスケープ

```php:
<?php
    $id = $_POST[ 'id' ];

    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;"; 
?> 
```

#### high
- 文字のエスケープはない。
- 別画面で入力したIDを読み取る。（別画面と元の画面の双方がないと表示できない）
- limit 1で１つだけ表示になっている。

```php:
<?php
    // Get input
    $id = $_SESSION[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;"; 
?>
```

#### impossible
- tokenチェック
- is_numericで数値かどうかの判定

```php:
<?php
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $id = $_GET[ 'id' ];

    // Was a number entered?
    if(is_numeric( $id )) {
        // Check the database
    } 
?>
```

### 脆弱性を攻撃する
#### low
- 防御無しのため、ストレートに攻撃する。
- `1' or 'a'='a`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/5d886162-1eee-2d29-2892-18ba22c4d285.png)


#### medium
- 特殊文字はエスケープされるので、特殊文字は使用しない。
- `1 or true`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/634f1a91-f228-9a7b-9c98-1db5e96b9623.png)


#### high
- limit 1を外したいので#でコメントアウトする
- 特殊文字はエスケープされていないのでそのままでいく。
- `1' or 'a'='a' #`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/0fffdf7d-26f1-27f2-b65b-97daa85c9276.png)


#### impossible
- 無理っぽい
基本情報技術者　マネジメント系　第1章　アーンドバリュー分析、ファンクションポイント法

[基本情報技術者試験](https://qiita.com/savaniased/items/d3f94da4f087e178cb69)
こちらより


# アーンドバリュー分析


## PV(計画価値)
Planned Value
予算のこと

## EV(獲得価値)
Earned Value
報告時点での出来高

## AC(実コスト)
Actual Cost
EVの出来高完成のため実際に費やしたコスト

## CV(コスト差異) 
計算式
CV=EV-AC

## SV(スケジュール差異)
SV=EV-PV

## CPI(コスト効率指数)

## SPI(スケジュール効率指数)

# ファンクションポイント法
機能数や機能おん複雑さから
得点を計算して、開発規模を見積もる方法です。

## データファンクション
データのまとまり

## トランザクションファンクション
外部から、または外部への処理
ElmでUUID生成をTask化する

「UUID生成をTask化できないか」という相談に対して「できないだろうな」と思っていたが、@niso1985さんができる方法を見つけてくれたので日本語でも検索に引っかかるようメモとして残しておく。

以下の例は[TSFoster/elm-uuid](https://package.elm-lang.org/packages/TSFoster/elm-uuid/3.0.1)をつかったケース。
これまでUUIDを生成するには以下のように一度Cmdにしないと受け取れないのかと思っていた。

```elm:Cmd使う版
init : () -> ( Model, Cmd msg )
init _ =
    ( { uuid = "" }, Random.generate UUIDGenerated UUID.generator )


type Msg
    = UUIDGenerated UUID


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        UUIDGenerated value ->
            ( { value = UUID.toString value }, Cmd.none )
```

しかしこんな感じで書くこともできるらしい。

```elm:Task使う版
import UUID exposing (UUID)
import Task exposing (Task)
import Random
import Time


newUUID : Task Never UUID
newUUID =
    Task.map (Tuple.first << Random.step UUID.generator << Random.initialSeed << Time.posixToMillis) Time.now
```

こうすればUUIDが必要な任意の処理をTaskとしてチェーンして書ける。これはうれしい。
懸念点として、Taskのほうは現在時刻をシードとして使うため推測されやすいUUIDになる可能性があるとのこと。

参考: https://gist.github.com/JoelQ/c93a8f6a81262ff12c93ab2ff859f8e5
Macで「The disk you inserted was not readable by this computer」となったSDカードを簡単に直す方法

Macで何らかの拍子にSDカードでエラーが発生してしまったときに、使えなくなってしまうことがあります。

その際にエラーメッセージとして、「「The disk you inserted was not readable by this computer」」と表示されます。

![Screen Shot 2020-03-11 at 22.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586494/e807fb94-c0f1-e284-713e-1bba37c57555.png)

その際の対処方法をまとめました。

#初めに
今回の方法は、SDカードの中に入っているデータは消去されてしまいます。

あくまでも、SDカードを再度使いたい！データはどうでも良いっていうときに利用してください。

また、今回の方法は論理障害のみに対応しており、SDカード自体が物理的に壊れてしまったときにはどうしようもなりません。

また、論理障害でも確実なものではありません。

#対処方法

「SD/SDHC/SDXC用SDメモリカードフォーマッター」を使います。

「SD/SDHC/SDXC用SDメモリカードフォーマッター」：https://www.sdcard.org/jp/downloads/formatter/

このソフトウェアは、よくわからない怪しい企業が出しているソフトウェアではなく、SDカードの規格を管理している「SDアイソレーション」という組織が提供しているソフトウェアです。

このソフトウェアを利用して、フォーマットをしてあげることで治ります。

以上
おわおわり。
Unity 制限時間を管理するクラスを作成する

# やりたい事
制限時間をつけるこでゲームを面白くしたい。
時間を管理する部品があれば便利だとおもう。

- 表示
    - 残り秒数を表示したい
    - ゲージ（画像）の長さを秒数に応じて変えたい
- 残り時間の操作
    - 残り時間の増減できるようにしたい
    - タイマーの開始・停止を制御できるようにしたい。
- タイマーが終了していることを確認したい

## スクリプト

```c#
using UnityEngine;
using UnityEngine.UI;

namespace UdonTengoku
{

    public class Timer : MonoBehaviour
    {
        /// <summary>
        /// 残り時間を表示するText
        /// </summary>
        [SerializeField] Text timerText = default;

        /// <summary>
        /// 表示するテキストのフォーマット "F2" など
        /// </summary>
        [SerializeField] string format = default;

        /// <summary>
        /// タイマーのゲージ 残り時間に応じて fillAmount を操作
        /// </summary>
        [SerializeField] Image timerGauge = default;

        /// <summary>
        /// 残り時間の最大値（この時間からカウントダウン）
        /// </summary>
        [SerializeField] float maxTime = default;


        /// <summary>
        /// 経過時間
        /// </summary>
        float elapsedTime;

        /// <summary>
        /// 残り時間
        /// </summary>
        public float CurrentTime { get { return Mathf.Max(this.maxTime - this.elapsedTime, 0f); } }

        /// <summary>
        /// タイマーの停止状態
        /// </summary>
        public bool IsStopped { set; get; }

        /// <summary>
        /// タイマーが終了状態（0秒になると終了）
        /// </summary>
        public bool IsFinished { private set; get; }

        void Start()
        {
            // タイマーの初期化
            IsStopped = true;
            IsFinished = false;
            this.elapsedTime = 0f;

            Display();
        }

        void Update()
        {
            if (IsStopped || IsFinished) return;
            if (CurrentTime == 0f) IsFinished = true;

            // 経過時間の加算
            this.elapsedTime += Time.deltaTime;

            Display();
        }

        /// <summary>
        /// 残り時間の加算
        /// </summary>
        /// <param name="addTime">加算する秒数</param>
        public void AddTime(float addTime)
        {
            if (IsStopped || IsFinished) return;
            this.elapsedTime = Mathf.Clamp(this.elapsedTime - addTime, 0, this.maxTime);
        }

        /// <summary>
        /// 残り時間の表示
        /// </summary>
        void Display()
        {
            this.timerText.text = CurrentTime.ToString(this.format);
            this.timerGauge.fillAmount = CurrentTime / this.maxTime;
        }

    }

}

```

## 忘れがちなこと

timerGauge に指定するImageはImage Typeを Filledにするのを忘れないように。
これを忘れると、エラーがでず、ゲージも減らないので無駄に悩むことになる。

![コメント 2020-03-11 213619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500782/6d0a7a3a-776b-b7a2-6f96-d3cc1251564c.png)


## 今後
IsFinished でタイマーが終了したかどうかを、ほかのクラスから取得できるけど
Update で監視し続ける必要があるので、改善したほうがよさそう。
Observerパターンを利用してタイマーの終了をゲームを管理するクラスに
伝えられるようにした方が、すっきりするかもしれない。