OmniAICreator/Qiita-1.07M huggingface dataset:
ナナメなデザインを再現する方法

# はじめに
今年やった案件で勉強になった小技？があるので、それを紹介したいと思います。
個人的には考え方が勉強になりました。


# どんなデザインだったのか
![スクリーンショット 2020-12-01 11.12.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316486/31b932fc-06f9-f053-56c2-9f1973b09d9d.png)
め、めちゃナナメです・・・！
私「でもまあ、transform: skewY();で変形いいんでしょ」
transformプロパティの値に指定出来る"skew"とは、「要素を傾斜変形させる」ことが出来ます。
ちなみに「スキュー」と読むそうです。かわいい。＼ｽｷｭｰ!／
transformプロパティで出来ることについてもまとめましたが、それは後述しますね。

# 実践！

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="tomizon" data-slug-hash="jOMPZqv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="qiita_2020_01">
  <span>See the Pen <a href="https://codepen.io/tomizon/pen/jOMPZqv">
  qiita_2020_01</a> by tomizon (<a href="https://codepen.io/tomizon">@tomizon</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ほら出来たじゃん！
…あ、あれ？
そうか、そりゃ文字文字くん（モジモジくんです。世代がバレる。）も傾くよな…確かに、そりゃそうだ。。。
そして、小さい脳みそで考えました、私。

# 閃いた！
文字エリアの傾きを戻せばいいんじゃん！


<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="tomizon" data-slug-hash="zYKGRwY" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="qiita_2020_02">
  <span>See the Pen <a href="https://codepen.io/tomizon/pen/zYKGRwY">
  qiita_2020_02</a> by tomizon (<a href="https://codepen.io/tomizon">@tomizon</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


出来ました！やったー！
ここで大切なのは、**傾斜角度の値を0にするのではなく傾けた分戻す**、ということです。


# まとめ
今回で言うと外の.wrapには背景色のみで何もせず（paddingや幅などはありますが）、.innerのエリアで傾ける。そして.boxで傾けた分だけ戻す、ということです。
あんまりやったことがないデザインだったので初見はビックリしましたが、検索したり相談したりしつつ表示することが出来ました。ありがとうございます！

# 余談
そして、今回この記事を書くにあたり、色んなこと出来過ぎるtransformプロパティについても、まとめてみました。
改めてみると、色々形を変形したりクルクルしていきますね・・・。

|    関数     |  変形効果 | 2D（XY方向） | 3D（XYZ方向） | 
|:-----------|:---------|:----------:|:------------:|
| translate  | 移動     | ○           | ○            | 
| rotate     | 回転     | ○           | ○            |
| scale      | 伸縮     | ○           | ○            |
| skew       | 傾斜     | ○           | -            |

正直結構迷うのでｗ、今度はtransformプロパティについての違いの詳細について、まとめてみようと思います！

最後までお読みくださり、ありがとうございました。

参考：
[カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/transform)
Docker Build で Elasticsearch に初期データを投入しておきたい 🐳

# はじめに
「ああ、、まちがえた...」
「やり直しや...」
「コンテナ再起動して、初期データ入れなおさなきゃ...」
Elasticsearchを開発で使っていると、こんなことがよくあります。

そんなあなたに、Dockerで使う開発環境用のElasticsearchに初期データを投入しておこうよ、という小ネタです。  

# 環境
* macOS Catalina
* docker desktop 2.5.0.1
* Elasticsearch 7.10
* kibana 7.10 （おまけ）

# データサンプル
Elasticsearch公式にある、シェイクスピアのデータを持ってきます。  

[Loading sample data \| Kibana Guide \[7\.1\] \| Elastic](https://www.elastic.co/guide/en/kibana/7.1/tutorial-load-dataset.html)


# 流れ
Dockerfile の中でデータを投入します。 　

1. JSONファイルをCOPY
2. wait-for-it.shをCOPY
3. Elascticsearchの起動を待って、bulkでデータ投入

です。

`wait-for-it.sh` というのは、サービスの起動を監視してくれるシェルスクリプトです。
Dockerの公式ドキュメントでも紹介されています。

[Control startup and shutdown order in Compose \| Docker Documentation](https://docs.docker.com/compose/startup-order/)

# ファイルたち

githubにファイルを置いております。
[jrfk/docker\-es\-entry\-initial\-data](https://github.com/jrfk/docker-es-entry-initial-data)

## Dockerfile
こんな感じです。

```dockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch:7.10.0

## data
RUN mkdir /data && chown -R elasticsearch:elasticsearch /data
COPY ./data/ /data/
RUN chmod 755 /data/*

## wait-for-it
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /utils/wait-for-it.sh
RUN chown -R elasticsearch:elasticsearch /utils/wait-for-it.sh && chmod 755 /utils/wait-for-it.sh

## RUN
RUN echo 'discovery.type: single-node' >> config/elasticsearch.yml
RUN /usr/local/bin/docker-entrypoint.sh elasticsearch -p /tmp/epid & /bin/bash /utils/wait-for-it.sh -t 0 localhost:9200 -- /data/es_init.sh; kill $(cat /tmp/epid) && wait $(cat /tmp/epid); exit 0;

```

`RUN echo 'discovery.type: single-node' >> config/elasticsearch.yml`
ですが、第７世代のElasticsearchから、nodeの指定が必須です。
開発環境なのでsingle-nodeで使ってみましょう。

# 起動

以下のコマンドを実行してみましょう。

```shell-session
docker-compose build  
docker-compose up -d
```

# 確認

データが投入されていることが確認できるかと思います！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434453/f4822fda-6b86-61b3-4004-71583e43382c.png)

# 元ネタ
Stack Overflowに元ネタがあります。
このままやると、こんなエラーがでて起動できなくて。

```l
ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-cluster.log
```


第７世代のElasticSearchで起動時にnodeの指定が必須になっているからでした。

[How to add an elasticsearch index during docker build \- Stack Overflow](https://stackoverflow.com/questions/35526532/how-to-add-an-elasticsearch-index-during-docker-build)
「指定されたファイルが見つかりません」と表示されUSBメモリがフォーマットできない

環境や操作によってはデータ消失のリスクがありますが、当方では責任を持てません。

# 結論

Linuxから以下のコマンドを実行した。◎はUSBメモリに割り当てられたデバイス名。コピペして動かすには危険な操作なので。

当然ながら、USBメモリの中身は全て消失する。データが必要であれば、ddで吸い出すこと。

```
dd if=/dev/zero of=/dev/◎ count=1 bs=4096
```

# 原因
思い当たることと言えば、RufusでISOイメージをDDイメージモードで書き込んだこと。Rufusに限らないと思う。

# やってみてダメだったこと
Windows 10 のディスクの管理や DISKPART などから何とかしようと思い、領域をあれこれするところまではできるものの、フォーマットしようとすると一様に「指定されたファイルが見つかりません」と表示され、フォーマットが完了しない。DISKPARTのCLEANでもDiskFormatterなどでもできないし、RufusでISOイメージモードでもう一度書き込もうとしても失敗した。

# ◎の調べ方
Linuxが動く実機があったので、原始的な方法で調べた。

まずUSBメモリを取り付けてない状態で。

```
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3
```

次にUSBメモリを取り付けた状態で

```
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb  /dev/sdb1
```
/dev/sdb と /dev/sdb1 が増えたので、これだろう。sdb1は領域だろうから、実際に◎に相当するのは sdb となる。あとは冒頭のコマンドを実行。

# コマンド実行後
Windowsが動くPCにUSBメモリを装着したらフォーマットするか尋ねられ、無事フォーマットできた。
サービス/プロダクトの「引継ぎ」を振り返る

これは [Supershipグループ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/supership)の2日目の記事です。

Supership プロダクト開発本部にて働いておりますKujouです。
Supership入社当初はプロダクト開発に注力しておりましたが、
最近はチームを見たり、SS社内のデータ基盤運用をしていたり、採用に関わったりと幅広く仕事をしています。

今年はコロナ禍の影響なのか凄く早く感じた1年でした。
その中でサービス/プロダクトを自分個人やチームで引き継ぐということがいくつかあり、
それをうまくやるにはどうすればよかったかな、と振り返りの意味も込めてこの記事を書くこととしました。

## 記事で書くこと
* 引継ぎ業務を遂行する時に感じたことの振り返り
* その時に準備してあると良いなと思ったこと

## 引継ぎは様々な場面で起こる

「引継ぎ」は大小さまざまなパターンがあると思いますが、多くの人が経験していると思います。

* 新しい人が入社して、作業の引継ぎをする
* 新しい部署が出来たり、サービスを立ち上げたりして異動のために引継ぎをする
* 業務効率化のため、同じような作業を集約させるときに引継ぐ
* 退職のために引き継ぐ

などなど、引継ぎが発生する場面を挙げていったらキリがないですが、
今回は特に「サービスやプロダクトの開発者としての引継ぎ」に焦点を当ててみようと思います。

## 引継ぎには段階がある

プロダクト開発やサービスの開発側として引き継ぐときに感じたことは、
引継ぎには大きく分けて3つくらいの段階があるということでした。

それは、

**1.**  **作業の引継ぎ**
**2.**  **コミュニケーションの引継ぎ**
**3.**  **意思決定の引継ぎ**

という段階です。

### 作業の引継ぎ
最初は「作業の引継ぎ」です。これはもっとも基本となるところで、現在開発しているプロダクトの中で、
開発者が実際に手を動かして書いていたコードを修正したり追加したり、調査をしたりするという作業です。
この作業を引き継いだ人も正しく出来ることが「作業の引継ぎ」となります。
そこでは、以下のような部分が最低限必要かなと感じます。

* プロダクト/サービスで動いているコードが管理されていること
* それぞれにテストコードが存在し、CI上で動かす管理がされていること
* 機能の仕様が書かれたドキュメントが存在し、正しく最新の状態を表していること

もう少し細かく言うと色々出てきますし、
コード上のclassの役割の正しさとか命名とか「理解しやすいコード」などはあると思いますが、
本題としては少しズレるので割愛します。

上記に記載した部分はコードの修正や追加などをスムーズに行うには必須ともいうべき部分であり、
今更書くことでもないのですが、仕様などのドキュメントは最新のものを意外と管理できてなかったりするので
変更作業の中にドキュメント更新までを含め、一連のフローにしておくと良いかと思います。


### コミュニケーションの引継ぎ
続いては「コミュニケーションの引継ぎ」になります。
開発側は1人ということはあるかもしれませんが、あるサービスやプロダクトを開発する現場においては、
多くの人は1人ではなく、チームとして仕事をしているかと思います。
ビジネスサイドのメンバーやクライアント、状況によってはサービスを運用するメンバーや、
開発側でも役割によってはいくつかの領域に分かれるなど1つのチームとして対応することが多いのかなと。

そこではビジネスサイドやクライアントからの質問、運用メンバーから仕様の質問、
開発メンバーからの疑問など、様々なコミュニケーションが発生します。
それをきちんと引き継いだ人が対応出来るようになることが「コミュニケーションの引継ぎ」となります。
その中では以下のような部分が整理されていると良いかなと思っています。

* ビジネスメンバーが入力するQ&Aシートなど、今まで行われてきた質問とその対応
* コミュニケーションを行うことで発生した問題を開発側でissue化している、もしくは自動でissue化するなどの仕組み

おそらくslackを使って仕事をされている方も多いと思いますし、とても便利だと自分も感じますが
ある質問がslack会話だけで終わると、サービスやプロダクトとしての知見が貯まらないこともあるので注意が必要です。

重要なのは過去どういったコミュニケーションが行われていたかをきちんと可視化しておくことにより、
その向き先が変わっても同じように対応出来るようになるように準備しておくことですね。

### 意思決定の引継ぎ
プロダクトの仕様/機能の理解が進んでいくと実際の作業やコミュニケーションを対応出来るようになります。
これに加えて具体的なアーキテクチャや利用している技術の決定理由、そのシステムが作られた背景を深く理解することで、
「そのプロダクトやサービスをどうしていくべきか」という「意思決定」が出来るようになります。
この引継ぎの最終段階とも言えるのが「意思決定の引継ぎ」だと自分は感じました。

ここでは「インセプションデッキ」をきちんと作っておくこと、適宜見直すことがかなり有用だなと。
インセプションデッキがどういったものであるかはここでは割愛しますが、その中の項目として抜粋しますと、

**「我々ははなぜここにいるのか」**
プロダクトやサービスが作られた背景を理解することに役立つ

**「エレベーターピッチ」**
このプロダクトの強みの理解、より強化していくべき部分の理解に役立つ

**「夜も眠れなくなるような問題はなんだろう？」**
システム的に最低限担保しなければならない部分の理解、さらに言うと妥協できる部分の理解に役立つ

などなど、プロダクトを開発するということだけでなく、
引継ぎなどそれ以外の場面でも有用な情報がまとめられていますので、
仮に社内システムであってもインセプションデッキを正しく作り、更新していくことは意味があることかと思います。

そういった情報を引き継がれた側が正しく理解すると、ある問題が起こったときにシステム的にどうすべきかという
「意思決定」が出来るようになります、ここまで行えるようになれば引継ぎは完了したと言っても良い状態になると思います。

## 総論
引継ぎに関しては現場で色々と発生していると思うのですが、こういったことを意識すると、
スムーズに引き継げるのかなと思い改めて振り返ってみました。
新しい業務や人を受け入れる体制などを整えると共に、いつか発生する引継ぎも意識して整理していきたいですね。

---

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。

 [Supership株式会社 採用サイト](https://supership.jp/recruit/)

是非ともよろしくお願いします。
macOS に phpenv で PHP 8.0 をインストールする

[PHP 8.0.0 が2020年11月26日にリリースされて](https://www.php.net/archive/2020.php#2020-11-26-3)、 [phpenv + php-build では2020年12月1日（多分）に PHP 8.0.0 が追加されたよう](https://github.com/php-build/php-build)なので、早速 macOS にインストールしてみた。

# 環境

- macOS: 11.0.1
- phpenv: v0.9.0-rc.1
- php-build: v0.11.0dev

（ [PHP 7.4 をインストールしたとき](https://qiita.com/dounokouno/items/60f22dae105e8c358ee5#環境)と `phpenv` と `php-build` のバージョンが変わってない気がするけど、まあいいか。。）

あと、 [PHP 7.4 をインストールしたとき](https://qiita.com/dounokouno/items/60f22dae105e8c358ee5)にいろいろなミドルウェアを入れたので、それらが入った状態の macOS を使っています。

# はじめに実行したコマンド

phpenv を最新の状態にして、

```
$ phpenv update
```

PHP 8.0.0 をインストールしようとしたところ、いくつかのエラーが発生したので、順番にエラーを潰していった。（といっても、エラーは2つだけだったけど。）

```
$ phpenv install 8.0.0
```

# `bzip2` と `iconv` のパスを通す

[PHP 7.4 のとき](https://qiita.com/dounokouno/items/60f22dae105e8c358ee5)と同様に `bzip2` と `iconv` は `brew` でインストールしたけど、 fish shell の設定ではうまくパスが通らなかったので、 `phpenv` で install するときにパスを渡すことにした。

## エラーメッセージ

### `bzip2`

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: error: Please reinstall the BZip2 distribution
```

### `iconv`

```
configure: WARNING: unrecognized options: --with-png-dir, --with-libxml-dir, --with-icu-dir
configure: error: Please specify the install prefix of iconv with --with-iconv=<DIR>
```

# 最終的なコマンド

私は fish shell を使っているので、最終的に下記のようなコマンドになった。

```
$ env PHP_BUILD_CONFIGURE_OPTS="--with-bz2=/usr/local/opt/bzip2 --with-iconv=/usr/local/opt/libiconv" phpenv install 8.0.0
```

bash であれば下記のようになると思う。

```
$ PHP_BUILD_CONFIGURE_OPTS="--with-bz2=/usr/local/opt/bzip2 --with-iconv=/usr/local/opt/libiconv" phpenv install 8.0.0
```

下記のような感じで、問題なくインストールできていることを確認した。

```
$ phpenv versions
  system
  7.1
  7.1.33
  7.2
  7.2.34
  7.3
  7.3.24
* 7.4 (set by /Users/username/.anyenv/envs/phpenv/version)
  7.4.12
  8.0
  8.0.0
$ phpenv shell 8.0
8.0
$ php -v
PHP 8.0.0 (cli) (built: Dec  2 2020 11:51:19) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
    with Xdebug v3.0.0, Copyright (c) 2002-2020, by Derick Rethans
```

# まとめ

結果的に `bzip2` と `iconv` のパスを通すだけという、 [PHP 7.4 と同じ方法](https://qiita.com/dounokouno/items/60f22dae105e8c358ee5)でインストールすることができた。

どなたかのご参考になれば幸いです。
SchemaSpyとdocker-composeでDB定義書作成

DB定義書はないんですか？と各所から聞かれるこの頃・・・
何かDB定義書を自動生成してくれるいいツールはないのかと探していたら、SchemaSpyというツールを見つけました！

# SchemaSpyとは

SchemaSpy
https://schemaspy.readthedocs.io/en/latest/

既存のRDBMSから情報を読み込んで、htmlにしてくれます！
ER図はテーブル数が多いと、全体ではいい感じにはならないのですが、部分的は見れる感じになります。

Java製のツールです。

# SchemaSpyをDockerで使う

SchemaSpyはJavaでできていて、ここからjarファイルをダウンロードするだけ・・・なのですが、
そもそもjarファイルを使うにはローカルにJavaが入っていることが必要かつ、
JavaでDBに接続するためのjdbcドライバーも必要なのでちょっと面倒です。

ですが、SchemaSpyには、公式のDockerイメージが用意されています！
これで面倒な環境構築も必要ありません！
※DBの種類によってはドライバーを用意する必要がありそう。MySQLはDockerイメージに含まれています。

SchemaSpyのDockerイメージ
https://hub.docker.com/r/schemaspy/schemaspy/

# とりあえず手頃なDBに接続してドキュメント作ってみよう

と、ここで私が参考にした素敵なページをご紹介します。

SchemaSpyで日本語カラム名を含むデータベースからER図を作成
https://dev.classmethod.jp/articles/schemaspy-docker-localize-jp/

ここを見れば、Dockerの設定からアウトプットまで万事OKです！

# 接続する手頃なDBがない！

本番環境に接続してドキュメント作成するのもなー・・・
手頃にローカルだけでドキュメント作成したいなあ・・・

そんなときはdocker-composeを使って、Dockerで立てたDBサーバへアクセスしてドキュメント作成してみます。

設定はこんな感じ・・・


docker-compose

```
version: "3.7"
services:
    mysql:
        container_name: db
        build: ./mysql
        environment:
            MYSQL_ROOT_PASSWORD: XXXX
        volumes:
            - ./mysql/bind/mysql:/var/lib/mysql
        ports:
            - 3306:3306
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    schemaspy:
        container_name: schemaspy
        image: schemaspy/schemaspy:snapshot
        build:
            ./schemaspy
        volumes:
            - ./schemaspy/output:/output
            - ./schemaspy/schemaspy.properties:/schemaspy.properties
        depends_on:
            - mysql
        # docker-compose upするたびにドキュメント作成されるのが嫌な人は入れる
        #entrypoint: /bin/sh
```

以下の部分は、docker-compose upするたびにドキュメント作成が起動するのがいやなので入れてあります（自分のマシンだとドキュメント作成も結構時間がかかるのです・・・）

```
entrypoint: /bin/sh
```

SchemaSpyのDockerイメージは、起動時にドキュメントを作成するように設定されています。
以下のコマンドを打つと、entrypointが/usr/local/bin/schemaspyに設定されているのがわかります。
これで起動時にドキュメント作成が実行されるわけです。

```
docker inspect schemaspy
```

docker-composeファイルでentrypointを適当なもので上書きしてやることで、
起動時にドキュメントを作成しなくなります。
任意のタイミングで以下のコマンドを打つことで、ドキュメントを作成できます。

```
# schemaspy起動
docker-compose run schemaspy
# dockerにログイン
docker exec -it schemaspy /bin/sh
# ドキュメント作成コマンド実行
cd /
/usr/local/bin/schemaspy
```
コードレビューのコミュニケーションの話


おはようございます こんにちは こんばんは Goodpatch 12月4日を担当している木村です

今年の振り返りで大きなことがあったといえば
Qiita だと `いいね` から `LGTM` に変わったことですね

`LGTM とは ご存知だと思いますが Looking Good To Me の略称で “問題ないと思います” という意味ですね`

そんな `LGTM`ですが今回はその `LGTM`を出す コードレビューのコミュニケーションについてのお話しです

# はじめに

みなさんは`コロナ`＆`リモート`ってどうですか？
私はリモート中で働く中のコードレビューは得意ではないことがわかってきました。

しかし、オフラインでの同じプロジェクトのメンバーから指摘を受けたり
気になるコードや動作があった場合にコメントしたりするのは割と好きだったりします。

今は `コロナ` で `リモートワーク` で作業することが多く`実際に会ってのコメント`と`テキスト`だけでは、1つのメッセージだけでも受け取り方が違っていたりしますよね
(ものすごく文章が上手な方は違うと思いますが)

間違えたメッセージの受け取り方をした時に
チームがよくない方向へ向かってしまったりしてしまいます
（例えば、失敗した報告をしなかったり、失敗を隠蔽したり） 

そんな中どうしたらメッセージの受け取り方を間違えないよう
自分なりに考えて実践してみたことをまとめました。

## クイズを仕込むことでレビューの中でもカジュアルなコミュニケーションが取れてほっこりする

今やっているプロジェクト内では画像付きのLGTMを出し合っています
主に [こちらのサイト](https://lgtmoon.herokuapp.com/) からLGTMの画像を探しています

今回はこの `画像付きのLGTMを使ってコードレビューのモチベーションを上げる` 試みをしてみました

### 方法

テーマを出して、その中からレビュアーが一番好きなものをクイズとし
レビューイにLGTMの画像で回答してもらう

出題例 ）
一番好きなガンダムは何か？
スプラトゥーンでよく使っているブキは何か？など 

回答例 )

![LGTM](https://cdn.lgtmoon.dev/images/108421)


## 実践
2ヶ月程度周囲の協力を得てやってみました
(「行ってよかった旅行先」や「好きなお酒」等お題形式でもいいかもしれません)

### こんな感じでやっていました
![20201201-142230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67480/9f2a4acd-6819-c5f8-f665-51a3a3946fed.png)

### やってみて良かった個人の感想
- レビューとは別のコミュニケーションが生まれレビュアーのことをわかってくれる感が出る
- レビュアーが好きな画像を貼ることによりフォローすることができる
- レビューが積極的に参加してくれるようになった気がする
- リモートであっても雑談が増えるので隣にいる感覚で話せるし、頼ることができる

### やってみて悪かった個人の感想
- レビュアーの好きなものを調べるために少し時間をかけてしまい自分の首を絞めてしまうこともある
    - レビュアーが好きなものを調べてから載せる
- クイズであっても向いている人向いていない人がいるので、無理してやり続けない（雑談を増やすようにする）

### 注意しておくこと
- 正解を不正解とするとレビューまで影響されかねないので嘘をつかない
- レビュイーがレビュアーに対してテーマを押し付けることレビュアーがテーマとして答えれる程度のものに止める

## コミットの中で褒めコメントをつける

### やってみて良かった個人の感想
- コメントは指摘だけではなくなるので、1つ褒めコメントがあるだけでも全部褒められている感覚になる
- コメントをする時に、１つ褒めコメントをつけると気になった箇所や指摘したいことが書きやすい

### やってみて悪かった個人の感想
- 褒めコメントをしても相手がかならず褒めるとは限らないので期待値を下げておくこと（見返りは求めない）
- 修正箇所はものすごく小さい箇所（例えば文言の修正）だとしたら、どのような褒めコメントにするか考える
- 作業してくれたコードに対して感謝するのではなく、なにに対して感謝しているのか書かないと伝わりにくい

# 終わりに

今回紹介したリモートにおいての上手なコードレビューのコミュニケーション方法はオフラインでのコードレビューと比べると、今より時間をとってしまうコードレビューのやり方となってしまうと思います。
コロナ前と同じような感覚でコメントをするともしかすると人間関係が悪化することもありえます。

そのため、リモートでのコードレビューのコメントはリモート前よりやることが増えてしまうのですが、
コメントで指摘、指摘されることがあってもある人にとっては心のポーション的役割を持つかもしれません。

失敗を恐れ、報告やミスを隠したりした場合同じミスは繰り返し発生します。
リモートなら報告やミスを隠したりがしやすい環境です、
なので、失敗を恐れずに報告できる環境づくりが大事なのでリモートでも失敗を報告共有し学んでいければと思います。

なぜならあなたの一番信頼できるチームメンバーはあなたのとなりにいる人のはずですから
Graphite vs. ELK 〜ベストな監視の方法を考える〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/8813c0b6-14a8-cf9d-57a5-8e952ce8e9a5.png)

#Graphiteとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/dde9c908-0441-82cc-b1aa-96f115f6758e.png)

Graphiteは、2008年にリリースされたオープンソースの時系列系データの監視ソフトウェアです。Graphiteは、情報プル型の監視ソフトウェアであり、エージェントなどを使用してすでにある情報を取得して、そのメトリクスを収集し、記録して可視化することが出来ます。 通常、GraphiteはStatsDまたはCollectdと連携して、時系列メトリクスをインフラストラクチャーからデータを取得します。 その後、メトリクスは集約され、GraphiteのデータベースであるWhisperに保存されます。 Graphiteは、企業のデータを監視、保存、視覚化し、特定のイベントについてアラートする機能も付随されています。 可視化の方法として、Grafanaを組み込ませることが一般的です。Grafanaがすでに付随され、特別に改良されたHosted Graphiteは[MetricFire](https://www.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Graphite%20vs.%20ELK)から入手できます。

[無料試用版](https://www.hostedgraphite.com/accounts/signup-metricfire/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Graphite%20vs.%20ELK)がありますので、Hosted Graphiteどうのうようなものか確認が出来ます。 また、いつでも[デモを予約](https://www.metricfire.com/demo-japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Graphite%20vs.%20ELK)も可能ですので、お問い合わせください。

#ELKとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/bc56b188-7f78-8bdf-954f-c8f581d5a759.png)

ELKは、Elasticsearch、logstash、Kibanaの略です。 同社は、ログ、メトリック、またはWebアプリケーションからの生データのオープンソース検索エンジンであるElasticsearchから始めました。 Webインターフェイスがあり、検索、ロギング、監視、および分析に使用できます。 Kibanaは、Elasticsearchを視覚化するためのオープンソースダッシュボードです。 Kibanaは、ユーザーがElasticstackを確認するためのインターフェースであり、データの探索、コラボレーション、データの傾向の予測などの機能を提供します。 Logstashは、Elasticsearchが処理できる形式でElasticsearchにデータを取得するデータパイプラインです。 これにより、Elasticsearchが処理できるデータ型が拡張され、データの解析またはフィルタリングの柔軟性が高まります。 Elasticsearchには、オープンソースプロジェクトのウェブサイトから入手できるホストバージョンがあります。

#MetricFireのHosted Graphiteはどのような時に使うか？
次の場合はHostedGraphiteを使用することを検討してください。

- インフラストラクチャの時系列監視が必要である
- 複数の異なるソースからのデータを視覚化する必要がある
- 重要なイベントについて警告（アラート）する必要がある
- インフラストラクチャが大きすぎて自分で実行できないため、マネージドサービスが必要である

#ELKはどのような時に使うか？
次の場合はELKを使用することを検討してください。

- 素晴らしい検索機能が必要である
- データの予測が必要である
- また、すでにELKスタックの一部を使用しているため、他の部分を使用するように簡単に拡張したい

#価格の比較

- Graphiteはオープンソースであり、無料です。
- Hosted Prometheus、Hosted Graphite、GrafanaなどのMetricFireによるビジネス対応のGraphite as a Serviceは、月額99米ドルからです。
- ELKはオープンソースであり、無料です。
- ホスト型ELKは、オープンソースプロジェクトのWebサイトからエンタープライズレベルで入手できます。

#重要なポイント

- Graphiteは、あらゆる種類の時系列データを監視、保存、警告、および視覚化できます。
- Graphiteはオープンソースであり、無料です。
- ELKは、データをすばやく検索する必要がある人にとって優れた代替手段です。

Hosted Graphiteについて詳しく知り、MetricFireが監視環境にどのように適合するかを確認するため、[無料トライアル]((https://www.hostedgraphite.com/accounts/signup-metricfire/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Graphite%20vs.%20ELK))を入手して、今すぐGraphiteの使用を開始してみてください。 [デモを予約]((https://www.metricfire.com/demo-japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Graphite%20vs.%20ELK))して、[MetricFire](https://www.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Graphite%20vs.%20ELK)のHosted Graphiteで何ができ、どのような監視が出来るかを確認してみてください。
Javascript オブジェクト、配列の扱い　〜随時更新〜

#スプレッド構文で取得

```
> const arr = ['foo','bar','hoge']
スプレッド構文で新規に配列を取得するには
const[h1,...arr2]=arr
// arr2には：[ 'bar', 'hoge' ]が出力される

//arrはそのまま ['foo','bar','hoge']が入っている
```

続く
Pythonでメソッドの多重定義：TypingのUnionと、typeによる引数の型判定の組合せで実装可能

###問題意識

__Python__では、メソッドの多重定義（オーバーロード）をする機能が標準で付いていない。

そこで、TypingのUnionと、typeを用いた引数の型判定の組合わせで実装してみた。

###実装コード

例として、__配列（list）__と__文字列（str）__を__両方、引数として受け取る__ことができ、__どちらを受け取ったかにより、異なる処理を行う__メソッドを作成してみました。

```Python:ipython（Python3.9.0）
In [1]: from typing import Dict, Tuple, List, Union

In [2]: def sample_func(arg : Union[str, List]) -> str:
   ...:     if type(arg) is list:
   ...:         output_str = "\n".join(arg)
   ...:     elif type(arg) is str:
   ...:         output_str = arg
   ...:     else:
   ...:         output_str = ''
   ...: 
   ...:     return output_str
   ...: 

```

###挙動確認

#####（ケース1） 引数として配列listを渡す

```Python:ipython（Python3.9.0）
In [3]: sample_func(["1", "a", "b"])
Out[3]: '1\na\nb'

In [4]: print(sample_func(["1", "a", "b"]))
1
a
b

In [4]:
```

#####（ケース2） 引数として文字列strを渡す

```Python:ipython（Python3.9.0）
In [4]: sample_func("明日はアフォガードを食べよう。もう今日は寝るよ。")
Out[4]: '明日はアフォガードを食べよう。もう今日は寝るよ。'

In [5]: print(sample_func("明日はアフォガードを食べよう。もう今日は寝るよ。"))
明日はアフォガードを食べよう。もう今日は寝るよ。

In [6]: 
```

___

###__（ 参考 ）__

以下も参考になります。

・ [teratail 「pythonで同じ名前の関数で引数が異なるもの」](https://teratail.com/questions/154890)
膝のレントゲン持ってなくても、変形性膝関節症LINEbotが使えるようにLIFFで改良しました。

# 膝のレントゲンなんて持ってない？でも大丈夫！！
先日、膝のレントゲン写真を送ると、その膝がどの程度痛んでいるか教えてくれるLINEbotを作成しました。多くの方から暖かい言葉をいただき感謝です。
しかしその中で、「膝のレントゲンなんて持ってないよw」という生暖かい声も多くいただいたので、今回こちらを改良いたしました。

挙動は以下の通りです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">膝関節LINEbotからサンプル画像が送れるようにLIFFで設定。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/mqz0SDKnZJ">pic.twitter.com/mqz0SDKnZJ</a></p>&mdash; 北城雅照@足立慶友整形外科 (@kutuyanomusuko) <a href="https://twitter.com/kutuyanomusuko/status/1332090537843671043?ref_src=twsrc%5Etfw">November 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

LINEのリッチメニューから製作者の自己紹介と当院のサイトが見えるように設定し、自己紹介の部分にLIFFを利用してbotにサンプル画像を送信できるように設定しました。

また自己紹介のページから、僕のnoteの自己紹介ページに飛べるようにも設定しましました。

もう、徹底的に自分をアピールします、はい。
# やること
１）VScodeのインストール
VScodeのインストールついては、googleなどで他の記事を検索してください。
２）Netlifyのアカウント作成
Netliftyとは、無料の静的ファイル用のサーバーです。
今回作成する自己紹介用の簡単なサイトは、こちらにデプロイしました。
Netlifyに関してはこちらの記事を参考にしてください。
[～ローカルからサーバーへ～：簡単にできる公開方法を調べてみた](https://qiita.com/baby-0105/items/1203d40fabf39beb6153)
３）自己紹介用のサイトを作成（HTML,CSS,JS）
４）リッチメニューを設定し、自己紹介サイトに飛ぶように設定
５）LIFFを利用し、画像をメッセージで飛ばせるように設定

# QRコード
![スクリーンショット 2020-12-02 11.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581193/04508f58-7a1d-2db9-eccc-a131ad2316c3.png)


# その他の記事
１）[誰が使うかわからないけど、膝のレントゲン写真を送ったら、その膝がどの程度痛んでいるのか教えてくれるラインbotを作ってみた。](https://qiita.com/Teru_3/items/80cecd138860fbd0c924)

２）[近すぎると小池都知事が『密です。』と連呼するデバイスを作ったら腹筋が崩壊したので、皆さんにも試して欲しい。](https://qiita.com/Teru_3/items/4570bd76d8feeaa37db4)

３）[憧れのギニュー特戦隊の誰に似てるか判定するLINEbotを作ったから、ぜってぇ見てくれよなっ！](https://qiita.com/Teru_3/items/109517e6a6e3b761285d)
MacインスタンスをCLIから起動してみた


# 準備
## Cloud9起動
Cloud9をインスタンスを起動したいリージョンで起動
IDE画面を表示

## awsコマンドのバージョンアップ
デフォルトで入ってるのが低いのでバージョンアップしておく

```
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
```

# 起動
## 専用ホストを割り当てる
Macインスタンスはライセンスの関係上、専用ホスト上で起動する必要がある
なので、ホストを割り当てる

```
$ aws ec2 allocate-hosts --instance-type mac1.metal --availability-zone ap-southeast-1a --auto-placement on --quantity 1 --region ap-southeast-1
```

## キー作成
インスタンスで利用するキーを作ります

```
$ aws ec2 --region ap-southeast-1 create-key-pair --key-name mac-key
```

## インスタンスの起動

```
$ aws ec2 run-instances --region ap-southeast-1 \
  --instance-type mac1.metal \
  --image-id  ami-0eafbca3ae8ab70f7 \
  --key-name mac-key  --associate-public-ip-address \
  --placement  \
           "{\"HostId\": \"h-000000000\", \"Tenancy\": \"host\"}"
```

# 詰まった点
[Macインスタンスの記事](https://aws.amazon.com/jp/blogs/aws/new-use-mac-instances-to-build-test-macos-ios-ipados-tvos-and-watchos-apps/)があがってたので、これ通りにやればええやん！って思ってやったんですが、所々詰まっちゃいました

## Mac用のインスタンスファミリー見当たらない問題
まずはGUIから立てようかなと思って、AMIから立てようと思い進めていきました
ここで専有ホストが必要なことを理解したんですが、その専有ホストを割り当てる画面に移動しても、mac専用のインスタンスファミリーがありませんでした
（今見るとありましたので、発表後直後で画面に反映されなかったんでしょうね）

## 専有ホストが立たない
なので諦めてCLIから実行することにしました
これならミスらんだろうとたかを括ってましたが、全然でした
記事だとバージニア北部でやってたので、同じようにコマンド叩くと、下記エラーが出ました

```
$ aws ec2 allocate-hosts --instance-type mac1.metal --availability-zone us-east-1a --auto-placement on --quantity 1
An error occurred (HostLimitExceeded) when calling the AllocateHosts operation: The number of Dedicated hosts you've requested (1) would bring your total up to 1 for the specified group of instance types (mac1). This exceeds your current limit of 0. If you've recently released Dedicated hosts, it may take some time for them to stop counting towards your limit. Try allocating your hosts again after a few minutes. Please visit http://aws.amazon.com/contact-us/ec2-request 
```

エラー内容もあまり読まずにリミットがうんぬんってあったので、専有ホスト実は立ててたりしたのかなと思って確認しましたが、やはり立ってない

```
$ aws ec2 describe-hosts
{
    "Hosts": []
}
```

エラーを良く見ると `This exceeds your current limit of 0.` と書いてあり、リミットに引っかかってました
で、何故かバージニアがリミット０で、シンガポールは3になっていたので、シンガポールで実施すると問題なく起動できました

## 起動コマンドも違う
記事通りにコマンドをうつと下記のようにオプション違うと言われる

```
An error occurred (Unsupported) when calling the RunInstances operation: The requested configuration is currently not supported. Please check the documentation for supported configurations.
```

GUIからだと専有ホストを選択していたので、こちらを設定するといけました

```diff
$ aws ec2 run-instances --region ap-southeast-1 \
  --instance-type mac1.metal \
  --image-id  ami-0eafbca3ae8ab70f7 \
  --key-name mac-key  --associate-public-ip-address \
+  --placement "{\"HostId\": \"h-000000000\", \"Tenancy\": \"host\"}"
```

HostIdは下記で取得するか、割当時に出てくる値を利用します

```
$ aws ec2 describe-hosts --region ap-southeast-1 --query "Hosts[0].HostId"
"h-000000000"
```
第6回 :: ruby_second

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83$](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>)


## variable and method


## variable


## お題

受け取った引数ARGV[0]をnameという変数(variable)に代入してそれを出力するコードを書く．

    > ruby name_variable.rb Rudy
    Rudy

こんな感じ


## rubyの変数

rubyの変数は型宣言の必要性がない．文脈に合わせて適当に型が定められる．

```ruby
name = 'Rudy'
```


## 解法

下記のコマンドを入力してファイルを作成

    > emacs name_variable.rb

emacsを起動

```ruby
p "Rudy"
```

と入力してsave．

    > ruby name_variable.rb Rudy
    "Rudy"

　


## 類題

-   nameに代入してRudyと打ち出すようにrefactoringしてください．
-   ARGV[0]を受け取って，自分の名前を返すようにrefactoringしてください


## 類題の解法

    name = 'Ruby'
    puts "hello #{name}."

    name = ARGV[0]
    puts "hello #{name}."

これでいける


## method


## お題

    > ruby hello_method.rb Rudy
    Hell Rudy.

と返すhello methodを作る．


## 解説

Rubyではfunctionやprocedureなどはmethodを定義する．methodは0個以上の引数を取ることができる．例えば以下のように

```ruby
def hello(name)
  p name
end
```


## 類題

先の解法を参照してhello メソッドを完成させる．

```ruby
def hello(name)
  puts "Hello #{name}."
end
name = ARGV[0]
hello(name)
```


## 類題の解説

こんな感じで書いた

```ruby
def hello(name)
  puts "hello #{name}"
end

def getname
  name = ARGV[0]
  return name
end
hello(getname)
```


# おまけ

以下の記事は下記サイトを引用しています（rubyの使い方とは関係ないため自分では書かない）

[コードをきれいに書く例など](https://qiita.com/daddygongon/items/c51f3e0695174bb3c508)


## 言語は英語から

これをmethodにしたら，

```ruby
def func(hoge)
  puts "Hello #{hoge}."
end

hoho = ARGV[0]
func(hoho)
```

これを動かしてみましょう．

    > ruby hello.rb bob

とちゃんと動きます．これでは何をしているのかわからないので，コメントをつけましょう．

```ruby
# method: func
# input:  hoge is a name
# output: puts greetings
# return: nil
def func(hoge)
  puts "Hello #{hoge}."
end

honya = ARGV[0] # get hoho from argv
func(honya) # call hello with a name honya
```

英語でしっかりとコメントが書ければ世界中に通用するcodeが書ける&#x2026;んでしょうかね？コメントをぐちゃぐちゃ書くんじゃなくて，もっとわかりやすい名前（method名，変数名）にしたくなるでしょう？

```ruby
def puts_hello name
  puts "Hello #{name}."
end

name = ARGV[0]
puts_hello name
```

こっちの方が短くてスッキリしていて圧倒的にいいでしょ？　適切な英単語を使えば，要らん説明が省けます．これが言語は英語からという意味です．


## 長くなったら，隠せ

もしoptionのnameを打つのを忘れたら，問い合わせてくれると，user interfaceという感じがもっとするでしょう？

```ruby
name = ARGV[0]
if name == nil
  puts "What\'s your name?"
  name = gets.chomp
end
```

というのをname=の下につけましょう[1]．ちょっと動かして見ましょう．

    > ruby hello.rb

意図通りに動いていますか？　でもmain loopが長くなってきちゃいました．そこで，これもmethodに切り出します．領域を指定して(C-spaceで先頭を指定して移動),C-wでcut, 移動してC-yでyankです．

```ruby
def gets_name
  name = ARGV[0]
  if name == nil
    puts "What\'s your name?"
    name = gets.chomp
  end
  return name
end

name = gets_name
```

この時，領域を指定してM-x indent-regionとしてください．あるいはC-x TAB.これだけでもだいぶ読みやすくなったでしょ？

もっとできます．main loopにcursorを持って行って，'C-c @ C-l'と打ってみてください．

```ruby
def puts_hello name...end

def gets_name...end

name = gets_name
puts_hello name
```

これがoutlineによるtoggle表示からきたすごいメタファなんですよ．何をしているのか知らなくていい部分は隠してしまおうというのが，methodに切り分ける理由なんです．



------
 - **source** ~/grad_members_20f/members/okamoto0910/article/c6.org
第5回 :: bash,ruby_first

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83$](<https://img.shields.io/badge/ruby-2.c7.1p83-brightgreen>)


# hello worldの前に

[bash + emacs](https://qiita.com/daddygongon/items/3ab780f22e620c3f8298)

授業のページに飛びます


# puts hello\_world


# お題

    Hello world.

と出力するプログラムを作る．


# rubyでStringsを打ち出す方法

どれを使ってもいい．

| method | 使用状況                            |
|:-------|:------------------------------------|
| print  | 普通に使う．要改行                  |
| puts   | 次に普通に使う. 自動改行            |
| p      | codingの最中にdebugがわりに打ち出すとき|
| pp     | pのpretty print, require 'pp'が必要 |
| printf | cのがあります．formatを整えるときに便利|

そのほかにもいくつかあるらしい

Stringはシングルコーテーション'で囲う方法とダブルで囲う方法の二種類がある．シングルは中身をいじらないとき，ダブル"はいじるときにつかう．


# 詳しい解法

まずはシングルで囲う

```ruby
puts 'hello world'
```

を試す．

    > mkdir codes
    > cd codes
    > emacs puts_hello_world.rb

上記のコマンドを入力してディレクトリの作成とファイルの作成．emacsを開いてhello worldのコードを入力．c-x c-sでsaveしたらc-zで一時中断する．

    > ruby puts_hello_world.rb

として実行すると

    hello world

ちゃんと出力されている．


# 類題

pとかprintとかも試す．

    print 'hello world'
    p 'hello world'
    pp 'hello world'

pとppは見た目に違いがない…printは改行せずに文字列が出力される．


# getsなんだけど，ARGV[0]でやる


# お題

    > ruby hello_name.rb Rudy

上記のコマンドで実行したときに

    Hello Rudy.

と出力されるようにする．


# 解説

putsしたら普通はgetsだが，目的の一つであるshell環境ではcommand line interfaceで作業をするためにARGV[0]というのを使うらしい．

```ruby
puts ARGV[0]
```

とhello\_name.rbに入力．

    > ruby hello_name.rb Rudy

とコマンドすると…

    > Rudy

ARGV[0]というのは引数(argument)配列の0番目を意味している．

次に"Hello Rudy."と打ち出させることを考える．これをするにはいくつか方法がある．（下記参考）

| puts  | puts "Hello " + ARGV[0]         |
|:------|:--------------------------------|
| puts  | puts "Hello #{ARGV[0]}"         |
| print | print "Hello #{ARGV[0]}\n"      |
| print | print "Hello " + ARGV[0] + "\n" |

Cからの人は，printfもありらしい．実際に実行してないけど…

```ruby
printf("Hello %s.\n", ARGV[0])
```


# 解法

hello\_name.rbを以下のように書き換える．

    puts "Hello #{ARGV[0]}"

そのあとに以下のコマンドで実行

    > ruby hello_name.rb Rudy

以下のように出てたらオッケー

```ruby
hello Ruby
```


# 類題

"Hello Rudy"というのをどこかへ保存することを考える．

```ruby
ruby hello_name.rb bob > hello_name.txt 
```

とコマンド入力すると，hello\_name.txtに出力結果が保存される．

```ruby
> cat hello_name.txt
```

で中身をcat(con-cat-inate)できる．

```ruby
Hello bob
```



------
 - **source** ~/grad_members_20f/members/okamoto0910/article/c5.org
【Semantic Segmentation】 videoの連続性を使って、dataのかさ増し

<h1>Improving Semantic Segmentation via Video Propagation and Label Relaxation</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/54acdcac-e460-ac7a-02c0-9ee22b708f77.png)

annotation dataを増やそうというのがこの論文のメインテーマである。

optical flowを知っている人であれば簡単にイメージ出来ると思うが、画像とGround Truthデータのpixelをともにshiftすることでデータが増やせる。


<h1>新規性</h1>
<h2>データを増やそう</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/cf260e58-c5ab-e251-54d3-7b034997d5b3.png)


Optical Flow(時系列におけるpixelの移動)を用いる事でground truthのデータ(time=tをシフトしただけ)を生成する事が出来る。
ついでに対応する画像も必要なので、画像もpixelを移動させる

<h2>Optical Flow</h2>
過去のデータから次のframeの移動量(x,y)を推定する

<h2>Video Prediction(Motion Vector)</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ce80d5e1-e7df-4f89-0b0a-afddc20142c0.png)

もうちょっと精度あげたくないってことで
Optical Flowと画像を入力して畳み込みを行いMotion Vectorというのを提案した。
要はOptical FlowをちょっことRefinementしてみた感じ。

*g(I,F): 画像とOptical Flowから得られたMotion Vector
*T(M,I) : Motion Vectorと画像を入力に次のFrameを推定する


<h2>Video Reconstruction(Motion Vector)</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/67d9268c-b52f-f8d7-4a22-3a3ea68a8bec.png)
過去データと現在のデータから未来を推定するより、未来のデータがあるんだから未来のデータと現在のデータから未来を推定(差分を見る)する方が正確だよね。というアイデア

t-1とtから得られたMotion Vector
より
tとt+1から得られたMotion Vector
の方が
tの画像からt+1の画像を推定するのに適している。

*recording dataだから出来る


<h2>Boundary Label Relaxation</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/46375a6b-2e07-fc98-e786-f3ee2f255e16.png)

物体のedgeではannotationが正確でないことはよくある。
例えば、車と人のpixelが隣りあっていたら、人と推定しても車と推定しても正解にしよう！
という優しさがBoundary Label Relaxationである。

<h2>結論</h2>
・画像の連続性を使いannotationデータを増やしていた。
・Boundary Label Relaxaxionで物体の境界線はどっちに推定しても良いようにしていた。

dataを増やす発送は面白いと思った。しかし、実用として精度が落ちる可能性があるので使わないと思う。
Boundary Label Relaxationは一般的に有効な手段だと感じた。



<h1>参考文献</h1>
Improving Semantic Segmentation via Video Propagation and Label Relaxation
https://arxiv.org/pdf/1812.01593v3.pdf
【Rails】carrierwave(キャリアウエーブ)の再生方法　「自動再生」「手動再生

#はじめに
carrierwave(キャリアウエーブ)で保存した動画の再生方法のを紹介します。
今回は「自動再生」と「手動再生」の二種類に着目してます。

前提に、下記の記事の続きになってますので、既にcarrierwaveを導入してるかた向けです。
分量が多かったので「保存」と「再生」で分けております。
よかったら参考にしてみてください。

【Rails】carrierwave(キャリアウエーブ)で動画の投稿(保存)
https://qiita.com/AKI3/items/541ff4d43c20eff190e2


###目次
1. 自動再生
2. 手動再生

#開発環境
ruby 2.6.5
rails 6.0.0


#実装
それでは実装していきます〜

#1. 自動再生
まずは、自動再生の方法です。

####コントローラーの編集
ビューで表示するために`@tops`を定義し、データが格納されるようにします。

```app/controllers/tops_controller.rb
class TopsController < ApplicationController
  def index
    @tops = Top.all #←ここを追記
  end

  def new
    @top = Top.new
  end
#省略
```



次いでビューを編集します。

htmlに直接埋め込むだけなら`video_tag`で再生が可能になるそうですが、railsでデータを取得して再生するにはオプションまで記述する必要があるみたいです。

```ruby:app/views/tops/index.html.erb
#省略
<% @tops.each do |top| %>
  <%= video_tag(top.video_top.to_s, :loop => true, :autoplay => true, :muted => true) %> #オプションは（）内に記述！
<% end %>
```

今回のオプションは、「繰り返し」「オートプレイ」「ミュート」を設定しました。自動再生をする際は`:muted`オプションをつけなと再生されません。
:loop => true, :autoplay => true, :muted => true

完成です！！
リロードすると動画が再生されるはずです。






#2. 手動再生
次に手動再生の方法です。
単純にオプションを編集します。


```ruby:app/views/tops/index.html.erb
#省略
<% @tops.each do |top| %>
  <%= video_tag(top.video_top.to_s, :controls => true)  %> #:controls => trueに編集
<% end %>
```

完成です！！！
「再生マーク」を押すと動画が流れ始めるはずです。
下記の参考にさせていただいた資料の中に、オプションに関する資料があるので、よっからそちらも参照してみてください。



#まとめ
キャリアウエーブ（carrierwave）を使った動画の再生方法を「自動」と「手動」に分けて紹介しました。


###最後に
私はプログラミング初学者ですが、自分と同じ様にエンジニアを目指す方々の助けになればと思い、記事を投稿しております。
それではまた次回お会いしましょう〜


#参考
【Rails】carrierwave(キャリアウエーブ)で動画の投稿(保存)　

https://railsdoc.com/page/video_tag
https://b1840943.hatenablog.jp/entry/2018/07/02/223121
AWS ClooudWatch Logs使ってみた。

AWSのCloudWatch Logsを使ってみたので作業記録として残しておきます。

#前提
前提として、Webサーバーを構築済みでパブリックIPアドレスでのアクセスが可能とします。
用意したWebサーバーの情報は、以下になります。
- OS:AmazonLinux2
- ミドルウェア:Apache
#作業の流れ
1. IAMロールを作成する
- CloudWatch Logsの設定をする
- AWSコンソールから確認する

#1. IAMロールを作成する
ロールの作成をクリックします。
![スクリーンショット 2020-12-02 10.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/081904a9-2047-b4f1-42fd-d99306342a66.png)
EC2を選択し、次のステップへ進みます。
![スクリーンショット 2020-12-02 10.48.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/97161daf-a711-b709-55e9-5155aa240f7f.png)
CloudWatchLogsFullAccessを選択し、次のステップへ進みます。
![スクリーンショット 2020-12-02 10.49.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/a0b01a71-d656-e184-c89c-382c258b8bbd.png)
タグ設定は任意です。
ロール名を入力し、ロールの作成をクリックします。
![スクリーンショット 2020-12-02 10.51.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/0d522d10-5481-4ac7-5ca8-6c69db1be366.png)
続いて、EC2インスタンスへIAMロールの割り当てを行います。
「IAMロールを変更」をクリックします。
![スクリーンショット 2020-12-02 10.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/949bd14a-d9aa-8033-90eb-db99dd085651.png)
プルダウンから、先ほど作成したIAMロールを選択し、保存します。
![スクリーンショット 2020-12-02 11.02.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/059d606e-3c86-e602-feb5-b3ee5681af1a.png)

#2. CloudWatchLogsの設定をする
次のコマンドでエージェントをインストールします。

```
yum install -y awslogs
```

続いて、CloudWatchLogsエージェントの設定を行います。
/etc/awslogs内のawscli.confを開きます。

```
[root@ip-10-0-0-81 awslogs]# ls
awscli.conf  awslogs.conf  config  proxy.conf
```
regionを東京リージョン（ap-northeast-1）に変更します。
※デフォルトではバージニアリージョン(us-east-1)になっています。

```
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1
```

/etc/awslogs内のawslogs.confを開きます。
以下のように追記します。

```
[accesslog_test]
datetime_format = %b %d %H:%M:%S
file = /etc/httpd/logs/access_log
buffer_duration = 5000
log_stream_name = {instance_id}_accesslog
initial_position = start_of_file
log_group_name = accesslog_test
```

次のコマンドでエージェントを実行します。

```
systemctl start awslogsd
```

#3. AWSコンソールから確認する
CloudWatch Logsのメニューから、先ほど作成したロググループが作成されていることが確認できます。
![スクリーンショット 2020-12-02 11.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/d5d67849-5776-6eea-930d-54b383d41254.png)

クリックすると、先ほど作成したログストリームが存在しており・・・
![スクリーンショット 2020-12-02 11.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/3c5c7bf0-a4f2-0079-a052-2dd9536624e5.png)

以下のようにアクセスログが確認できます。
![スクリーンショット 2020-12-02 11.31.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663027/79cc828f-464f-ad46-d73f-392da972cb8f.png)

以上になります。
README.org

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

この記事は講義「マルチスケールシミュレーション特論」に関する記事です。

なので、題名がおかしいところが多いですが気にしないでください。


# 最終課題

[google recruit](https://qiita.com/okamoto0910/items/fd64e778744f1aee715f)


# 第11回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-12-02 Wed&gt;</span></span>

[第11回授業まとめ](https://qiita.com/okamoto0910/items/743b434a2a72315bed4a)


# 第10回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-25 Wed&gt;</span></span>

[第10回授業まとめ](https://qiita.com/okamoto0910/items/77592729f4ee4f89e99c)


# 第9回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-18 Wed&gt;</span></span>

[第9回授業まとめ](https://qiita.com/okamoto0910/items/4e21ea20d86ba36caac6)


# 第8回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-11 Wed&gt;</span></span>

[第8回の授業まとめ](https://qiita.com/okamoto0910/items/3d6a7cfb30c69d5134a5)


# 第7回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-04 Wed&gt;</span></span>

[第7回の授業まとめ](https://qiita.com/okamoto0910/private/b405c52061282aa38701)


# 第6回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-28 Wed&gt;</span></span>

[第6回の授業まとめ](https://qiita.com/okamoto0910/private/4a411efcbc1a573dede2)


# 第5回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-21 Wed&gt;</span></span>

[第5回の授業まとめ](https://qiita.com/okamoto0910/private/303b94fafa3cadf7feab)


# 第一回から第4回<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-14 Wed&gt;</span></span>

環境構築やgitのアカウント作成、emacsの基本的な操作、README.orgをgitとqiitaに上げる

1.  [qiita\_orgのインストール](https://qiita.com/yamatoken/items/858692178d288c40714d)


# equation<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-28 Wed&gt;</span></span>

$$\frac{1}{4}$$


# qiita\_links<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-16 Fri&gt;</span></span>

1.  [README.org](https://qiita.com/okamoto0910/private/3e3b01ebc144d54504c8)



------
 - **source** ~/grad_members_20f/members/okamoto0910/README.org
偶数値を取得するeven?メソッド

##even?メソッド
Rubyが元々用意している、対象の数値が偶数かどうかを判断するメソッドです。
対象の要素の値が偶数であれば真を返し、そうでない場合は偽を返します。
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/Integer/i/even=3f.html)


今回はeven？メソッドを使用し、以下の配列から偶数の値がいくつあるか数えるメソッドを作ります。
例）
count_evens([2, 1, 2, 3, 4]) → 3
count_evens([2, 2, 0]) → 3
count_evens([1, 3, 5]) → 0

```rb
def count_evens(nums)
  count = 0
  nums.each do |num|
    if num.even?
      count += 1
    end
  end
  puts count
end


count_evens([2, 1, 2, 3, 4])
count_evens([2, 2, 0])
count_evens([1, 3, 5])
```

解説
①配列の中の偶数の数を出力するためにカウントした数を保持するための変数が必要なので、変数countを用意します

②配列に入っている数字をeach文で取り出し、even?メソッドで一つずつ偶数かどうかを確認し、偶数だった場合はcountに1を足していきます。

③each文の処理が終了し、countに代入された最終的な数が偶数の数となります。
On-premises Data Gateway を Power BI デスクトップに接続する手順

# はじめに
オンプレのデータをさくっと Power BI で可視化してみたいという方向けです。
On-premises Data Gateway から Power BI Deskptop につなげるまでの手順を記しておきます。

# 環境
- Power BI Pro を利用可能なAzure サブスクリプション
- DB
    - MySQL Community Server - GPL Ver 8.0.22 for Win64 on x86_64
- PC
    - Windows 10 Pro

※ MySQL サーバーと PC は同じネットワーク上に構成

    

# 構成
こんな感じの構成です。水色の箇所は on-premises data gateway を構築すると自動的に立ち上がります。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/f8e33655-7a7f-9743-2282-4071f35cb803.jpeg)


## On-premises Data Gateway インストール
ドキュメント通りにインストールします。Gateway Name は控えておきます。
参考：[オンプレミス データ ゲートウェイをインストールする](https://docs.microsoft.com/ja-jp/data-integration/gateway/service-gateway-install) 

## Power BI Services (Web 版)
Power BI Services の設定を行います。https://app.powerbi.com/home にアクセスすると以下の画面に遷移します。設定 → ゲートウェイの管理と進みます。
![2020-10-26_23h07_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/239d6675-c246-d782-d38b-6217c099af73.png)

控えておいた Gateway Name を選択し、データソースを追加してゲートウェイを利用するをクリック
![2020-10-26_23h08_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/fc344867-9fef-b032-082c-dee8f5e1afc5.png)

DB のサーバー名、データベース、ユーザー名、パスワードが必要です。今回は検証用のテストユーザを用意。

```sql
SELECT DATABASE(); -- データベース名確認

SHOW VARIABLES LIKE 'hostname'; -- ホストサーバー名確認

create user'admin'@'%' identified by 'P@ssw0rd'; -- Azure との接続用に admin ユーザー作成

grant all on *.* TO 'admin'@'%'; -- 接続制限解除 (本番環境だとNGなので注意)
```

以下のようにクリデンシャルを入力、下部の適用をクリック。しばらくすると上部に接続成功と出ます。
![2020-10-26_23h24_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/08eb6091-7dc9-fc9e-8ecc-2e5d3b378fac.png)

ユーザーのタブに遷移。自分かデータソース利用の権限があることを確認しておきます。これで Power BI Services 側の設定は完了です。
![2020-10-26_23h51_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/012b70ac-8b49-0f7a-fd8d-2c04a310d09e.png)

## Power BI Desktop (デスクトップ版)
Power BI Desktop をダウンロード、インストールしたら、データの取得 → MySQL データベースと進み、接続をクリック
参考：[Power BI Desktop ダウンロードページ](https://powerbi.microsoft.com/ja-jp/downloads/)

![2020-10-27_09h27_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/31de100f-09b9-dd13-54fb-74168705ca1c.png)

サーバー名、データソースを入力、OKをクリック
![2020-10-27_09h28_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/0d76daa0-e92e-ef4b-f11d-e6ec53ceae22.png)

接続完了！
![2020-10-27_09h54_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/9c635af1-22f8-eeef-19a1-ef9616fd4180.png)


# 参考
[え！？データがオンプレにあるけどPower BI で BI したいの？](https://www.slideshare.net/yugoes1021/20170520-power-bi)
[プレビュー: オンプレミス データ ゲートウェイの管理](https://docs.microsoft.com/ja-jp/power-platform/admin/onpremises-data-gateway-management)
strftimeについて

## strftimeとは？
　日時データを指定したフォーマットで文字列に変換することができるメソッド。
　**Timeクラス**と**Dateクラス**、**DateTimeクラス**のオブジェクトを指定したフォームで文字列として取得し表示させることができる。
## 各クラスについて
◯Timeクラス
　日時を扱えるクラス。

```ruby:ターミナル
# 現在の日時を取得
today = Time.now
=> 2000-01-01 12:00:00 +0000

# 日時を指定して作成
day = Time.new(2000,1,1,12,00,00)
=> 2000-01-01 12:00:00 +0000
```
◯Dateクラス
　日付を扱えるクラス。rubyで使うためには**require "date"**が必要になる。

```ruby:ターミナル
require "date"

# 現在の日時を取得
today = Date.today
=> Wed, 01 Jan 2000

# 日時を指定して作成
day = Date.new(2000,1,1)
=> Wed, 01 Jan 2000
```
◯DateTimeクラス
　日時を扱えるクラス。Dateクラスのサブクラスとして定義されているため、rubyで使うためにはDateクラスと同じように**require "date"**が必要になる。

```ruby:ターミナル
require "date"

# 現在の日時を取得
today = DateTime.now
=> Wed, 01 Jan 2000 12:00:00 +0000

# 日時を指定して作成
day = DateTime.new(2000,1,1,12,00,00)
=> Wed, 01 Jan 2000 12:00:00 +0000
```
## strftimeメソッドの使い方
```ruby:使い方
require "date"

datetime = DateTime.now
datetime.strftime("書式")
```

例）2000年1月1日と表示させたい場合

```ruby:例
require "date"

datetime = DateTime.new(2000,1,1,12,00,00)
datetime.strftime("%Y年%m月%d日")
=> "2000年01月01日"
```

　指定できる書式は下記の通りとなる。

※「 2000-01-02 15:12:34+09:00 」を基準に使用

|書式|返り値|説明|
|:--:|:--:|:--|
|%Y |2000|西暦を4桁の数で取得する|
|%m |01|月を2桁の数字で取得する（01〜12）|
|%-m|1|月を1桁か2桁の数字で取得する（1〜12）|
|%d|02|日付を2桁で取得する（01〜31）|
|%-d|2|日付を1桁か2桁で取得する（1〜31）|
|%H|15|24時間制の時刻を2桁で取得する（00〜23）|
|%-H|15|24時間制の時刻を1桁か2桁で取得する（0〜23）|
|%I|3|12時間制の時刻を1桁か2桁で取得する（1〜12）|
|%M|12|分を取得する（00〜59）|
|%S|34|秒を取得する（00〜60）※60はうるう秒|
【入門者向け】Canvas入門講座#17 マウスクリックで四角形を作成してみよう【JavaScript】

#問題17

クリックした座標を中心に四角形を描画しなさい。
四角形は赤色(#ff0000)で塗りつぶすこと。
四角形は1辺の長さが30の正方形とする。

以下のHTMLを使用すること。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>問題17</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$(() => {
    $('#my-canvas').click(e => {
    });
});
</script>
</head>
<body>
<canvas id="my-canvas" width="500" height="300"></canvas>
</body>
</html>
```

#解答

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>問題17</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$(() => {
    $('#my-canvas').click(e => {
        const cursorX = e.offsetX,
            cursorY = e.offsetY;
        drawRect(cursorX, cursorY);
    });

    function drawRect(x, y) {
        // コンテキストを取得
        const ctx = $('#my-canvas')[0].getContext('2d');

        // 現在の描画状態を保存する
        ctx.save(); 

        // 塗りつぶしの色を赤(#ff0000)にする
        ctx.fillStyle = '#ff0000';

        // (x, y) を中心に1辺が30の正方形を塗りつぶす
        ctx.fillRect(x - 15, y - 15, 30, 30);

        // 描画状態を保存した時点のものに戻す
        ctx.restore();
    }
});
</script>
</head>
<body>
<canvas id="my-canvas" width="500" height="300"></canvas>
</body>
</html>
```

クリック座標に四角形が描画できました

![ダウンロード (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/a21d5ba4-d546-ed4e-b983-1deb0619182b.png)

#解説
問題16と同じで描画時にcanvasをクリアしていません。
四角形の塗りつぶしはbeginPathを呼ばずに<b>fillRect</b>だけで描画可能です。
これも知っておくとよいでしょう。

```js
$('#my-canvas').click(e => {
    const cursorX = e.offsetX,
        cursorY = e.offsetY;
    drawRect(cursorX, cursorY);
});

function drawRect(x, y) {
    // コンテキストを取得
    const ctx = $('#my-canvas')[0].getContext('2d');

    // 現在の描画状態を保存する
    ctx.save(); 

    // 塗りつぶしの色を赤(#ff0000)にする
    ctx.fillStyle = '#ff0000';

    // (x, y) を中心に1辺が30の正方形を塗りつぶす
    ctx.fillRect(x - 15, y - 15, 30, 30);

    // 描画状態を保存した時点のものに戻す
    ctx.restore();
}
```
Splunk の iplocation で利用する Geo 情報を更新する。


iplocation を利用すると、接続先IP アドレスから、ロケーション情報を取得できます。
ロケーション情報を利用して、マップに結果を表示することができるようになるので、非常に便利な機能です。
ただ、ロケーション情報は、インストール後、定期的に更新をしないと情報が古くなります。
アップグレード時に更新されるのですが、そんなに頻繁にアップグレード作業は実施しないですよね。

社内のAWS コンソールアクセスをチェックするようなダッシュボードを作成していたら、
都内在住の社員が、栃木方面にいるような結果に。。。
![スクリーンショット 0002-12-02 午前10.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361613/3358920f-87ed-0b2f-e81b-1b892d955c5a.png)
現在は基本在宅勤務 OK なので、Goto でも利用してリモートで作業しているのかと思った次第でした。
で、確認してみたら、都内にいるようなので、こりゃデータが古いなということで、更新することにしました。

実は、ロケーション情報のデータは手動で更新が可能です。
手順は、下記に記載されています。
https://docs.splunk.com/Documentation/Splunk/8.1.0/SearchReference/Iplocation

Splunk は、 Maxmind Geolocation データベースを利用しています。
上記に記載しているリンクから、GeoLite2-City.mmdb ファイルをダウンロードし、
＄SPLUNK_HOME/share/ にあるファイルを置き換えるだけです。

※有償版を利用すると定期的にダウンロードして置き換えることも可能となります。
で置き換えた結果がこちら。
![スクリーンショット 0002-12-02 午前10.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361613/9aae95d6-887f-e4cc-ca56-d79424bb8057.png)
無事都内に戻ってきました（笑）！

なんか、表示している位置がおかしいなと思ったら、このファイルを置き換えることも検討ください。

Happy Splunking!

補足：（※2020/12/10追記）
注意事項として、インストール時にシステムで提供しているファイルを更新すると、サービス再起動時後に、ファイルの整合性チェックでエラーになります。
更新したファイルのエラーであれば、このエラーは無視頂いて問題ありません。
通常バージョンアップすることで、これらのファイルのチェックサム値が記載されているマニフェストファイルとGeo情報が格納されたファイルも更新されるので、整合性エラーはでなくなります。

補足：（※ 2023/7/24 追記）
最新のバージョンでは、Web UI からロケーションファイルを追加、更新出来ます。
https://docs.splunk.com/Documentation/Splunk/9.1.0/SearchReference/Iplocation#Updating_the_IP_geolocation_database_file
[Linux] Anaconda環境下でTensorflowにGPUを認識させる

## はじめに
Anaconda環境下において
TensorflowにGPUを認識させる場合に下記のようなエラーが発生。
その解決手順を記載。

```
# check device using tensorflow.
from tensorflow.python.client import device_lib
device_lib.list_local_devices()

>> InternalError: cudaGetDevice() failed. Status: CUDA driver version is insufficient for CUDA runtime version
```

## 解決概要
CUDAのデバイスドライバーのバージョンとTensorflow-gpuバージョンが一致していないことが原因である場合が多いと思われる。

初めに、nvidia-smiコマンドを利用しCUDAのデバイスドライバーのバージョン、及び、CUDAのバージョンを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372804/612bed50-dfe2-4e04-8d85-67ae58660ce8.png)

nvidia-smiが動かない場合は下記を参照
公式　https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#abstract
Qiita　https://qiita.com/protocol1964/items/19de3d1e27306f80d06d

上図ではCUDA Version: 10.0であることが分かる。

次に下記から対応するTensorflow-gpuバージョンを確認
https://www.tensorflow.org/install/source?hl=ja
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372804/e0ecf5ad-a9fa-fee6-e64b-eb3acb99c90b.png)

CUDA 10.0に対応するTensorflowバージョンは
1.13.1以上だとわかる。

Tensorflowバージョンが分かれば、インストールし直すだけだが、まず、既にインストールしてしまっているTensorflow関連のライブラリを削除する。

```
conda remove cudnn tensorflow tensorflow-base tensorflow-estimator tensorflow-gpu
```

次にtensorflow gpuをインストールし直す。

```
conda install -c anaconda tensorflow-gpu=2.0.0
```

最後に下記コードでGPUが認識されていれば完了

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372804/c1a6926a-1c03-e07d-0733-5097541e991d.png)