OmniAICreator/Qiita-1.07M huggingface dataset:
Scrum Fest Sapporo Day 1 参加レポート「これまでと違うやり方に取り組む時にうまくいくかもしれない方法とその落とし穴」

# Scrum Fest Sapporo Day 1 「Yoh Nakamura - これまでと違うやり方に取り組む時にうまくいくかもしれない方法とその落とし穴」
 
2020/11/06に開催されたScrum Fest Sapporoの発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/13987
 
# チーム参加してきました
 
[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、6人で参加して、その場で実況しつつ、記事も作っています。
 
発表資料★speakerdeck
 
# 現場コーチとは？
会社のミッション：「正しいものを正しく作る」
 
# 例１ 現場の状況
チームで工場に直接いった
 
# 取り組んだこと
-  現場に行って観察
- 動くもので業務をシミュレーション
- 誰が何を決めるか整理
    - RACIチャート
 
# 起きたこと
- リアリティある場面を関係者みんなが想像し、共通認識を持てた
 
# うまくいくかもしれない方法
- とにかく実際の利用者にあって、観察し、話を聞き、違う視座を得る
- 必要な人が必要な判断をできるように情報を行き渡らせる
    - 判断できない人は情報が足りていないのかもしれない
 
# 例２　現場の状況
2010年頃の話
５人位のチーム
Webシステムの継続的な機能追加
 
# 自分の状況
- アジャイルなプラクティスを色々やっていた
- イテレーション開発はやったことがあった
 
# 取り組んだこと
- 朝会とタスクボードは人ではなく機能にフォーカス
    - 【誰がどのタスクをやっている？】ではなく【機能がどういう変化をしているか？」という点で話す
- ペアプロの目的はチームの重なりを広げる
    - メンバーの得意な部分がバラバラだった
    - 業務理解の得意な人とコードを書くことが得意な人でペアを組んで作業し、重なりを広げていった
 
お互いが得意なことを教えあうことで、
知識のあなを埋めている
 
# 変化のステージ
サティアの変化のステージ
一時的に混沌期があるので、すぐにはやめない。
 
# 取り組んだこと
人は減ってもすぐ増やさない
　チーム内のコンビネーションができており、阿吽の呼吸だったのが、増えることでチームの再構築することを避けた
メンバーが入れ替わると、タックマンモデルにおける形成期に戻る。このことはあまり会話されない。
 
チームとしての重なりが熱くなった
 
# うまくいくかもしれない方法
自分たちの思い込みを破る
・セオリーの背景を知ること
・経験を再構築して実験する
 
# 例３ 現場の状況
 
# 自分の状況
初めての事業会社
 
# やってみたこと
- 「やってみる」ことを続ける
    - 壁に張り出して見える化
    - ランチ勉強会
    - ユーザーを読んでのユーザーテスト
- 相手の世界の言葉で話す
    - 関心のある領域はそれぞれ違う
    - 「開発が楽しくなる」は伝わらないこともある
    - 売上、利益、ユーザ数など伝わる言葉で話す必要がある
 
# 起きたこと
- 先にうまくやれそうなことがわかったので乗ってくる人が増えた
- 「わかってくれない」という衝突が減った
    - 違うものを見ていることが前提になった
 
# うまくいくかもしれない方法
- あれこれ説明するより、やってみせる、一緒にやってみる
    - 「こういう事が起きたのでどうしましょうかねー」
- 提案ではなく相談からする
    - 頼られるとみんな気持ちいい
- 積極的な反対者を作らない
    - 積極的な反対者の対応に労力がかかる
- 人にはそれぞれのタイミングがあるので気軽に待つ
    - 「かんふぁれンスに参加してきた」と伝えても伝わらないことも。
    - →別のタイミングで話してみる
 
木は引っ張っても伸びない
大切に見守る
 
# 様々なスタート地点がある
**物事を構造で捉える**
- 何かやれって言われた？
    - うまくいかないことを話す
- なにかやったほうがいいけどどうすればいい？
    - ありたい姿を見つける
- 何かやっていてその加速をしたい
 
 
# 感想
 
- これまでの経験をもとに、具体的なノウハウを共有してもらえて参考になった。
- 思い込みを解消するためにするためにもまず一緒にやってみるのが大事、っていうのはすごく共感しました。あと個人的に「タイミングを気長に待つ」っていうのは、伝える側としても、伝えられる側としても意識したいですね
- 思い込みを解消するためにするためにもまず一緒にやってみるのが大事っていうのはすごく共感と同時に、とてもありがたいと思いました。
NginxでPassenger+GridFSのビルド

nginx + Passenger を使う場合は `gem install passenger` によるpassengerインストール後に使用できる `passenger-install-nginx-module` コマンドを実行して nginx をビルド＆インストールするのが便利ですよね。
nginxのビルド時にオプションを指定でき、[passenger + nginxでオプションを指定してビルドする](https://qiita.com/h-izumi/items/d5d49518b979ff9d4449) の記事で紹介されているものが参考になります。

本記事では、MongoDBのGridFSをnginxで使用するための方法を記載します。

## nginx-gridfsモジュールの用意

https://github.com/mdirolf/nginx-gridfs に書かれている手順で展開します。

```sh
$ cd /path/to     # 任意のパスを指定
$ git clone https://github.com/mdirolf/nginx-gridfs
$ cd nginx-gridfs
$ git submodule init
$ git submodule update
```

## Nginxのビルド

`--extra-configure-flags` オプションで以下のように指定する。
上記で用意したnginx-gridfsへのパスを指定する。

```sh
$ passenger-install-nginx-module --extra-configure-flags="--add-module=/path/to/nginx-gridfs/"
```

## Nginx設定への追加

以下のようにGridFS設定をNginx設定ファイルに記載します。

```
location /gridfs/ {
    gridfs my_app field=filename type=string;
    mongo 127.0.0.1:27017;
}
```
AWSのEC2インスタンスにDBサーバーを作成する方法

# はじめに
AWSはAmazon Web Servisesの略で、Amazonが提供しているクラウドサーバーのサービスです。
AWSへの理解度を高めるために、学んだことをアウトプットします。


# 今回の流れ
AWSのEC2で作成したインスタンスにMariaDBをインストールします。

インスタンスは作成していることを前提とします。
※インスタンスの作り方が分からない方はこちらを参照ください。
「AWSに仮想サーバーを構築する方法」https://qiita.com/daisuke30x/items/91307c94e8f5a702a42f

# EC2インスタンスにMariaDBをインストール

①インスタンスにログイン

```:ターミナル
% ssh -i キーペア名.pem ec2-user@<パブリックIP>
```

②MariaDBをインストール

```:ターミナル
[インスタンス]$ sudo yum -y install mysql56-server mysql56-devel mysql56 mariadb-server mysql-devel
```

③MariaDBを起動

```:ターミナル
[インスタンス]$ sudo systemctl start mariadb

（起動できたか確認したい時）
[インスタンス]$ sudo systemctl status mariadb
=> 出力される文字列の中に「active(running)」の表示があれば、起動されている状態
```

④データベースのパスワードを設定

```:ターミナル
[インスタンス]$ sudo /usr/bin/mysql_secure_installation
=> Enter current password for root (enter for none): Enterキー
=> Set root password? [Y/n]: Y
=> New password: 好きなパスワード
=> Re-enter new password: 上と同じパスワード
=> Remove anonymous users?[Y/n]: Y
=> Disallow root login remotely? [Y/n]: Y
=> Remove test database and access to it? [Y/n]: Y
=> Reload privilege tables now? [Y/n]: Y
```

⑤データベースへの接続確認

```
[インスタンス]$ mysql -u root -p
=> Enter password: ④で設定したパスワード

MariaDBにログインできていれば、問題なし（ログイン状態から抜け出す時は「exit」を入力）
```

# 最後に
本投稿が初学者の復習の一助となればと幸いです。
CloudWatchAgentを利用してインスタンスのディスク使用率を監視をしよう！

#はじめに
AWS利用においてインスタンスの死活監視方法ではロードバランサーからのヘルスチェックや、単体だとCloud Watchのアラートなどの方法がある。

インスタンスが応答しない場合は上記の方法で検知可能だが、事前にインスタンスの状態を確認し、アラートを挙げられるように設定したい。特にディスク使用率はCloud Watchのデフォルトメトリクスに存在しないので事前に検知するには少し工夫が必要になる。

#Cloud Watch Agentの導入
CWAの導入により、ディスク使用率やメモリ、プロセスについてもかなり詳細にロギングできるようになる。取得できるメトリクス一覧は[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html)。

#実装手順
実装手順は下記の4つが必要。
①監視対象であるインスタンスをEC2を作成
②インスタンスにIAMロールをアタッチする
③サーバにてCWA導入
④SSMコマンド実行

###①監視対象であるEC2インスタンスを作成
EC2画面から監視対象のインスタンスを作成し、ami-idを控えておく。
利用者によってまちまちでもあるため、インスタンス作成方法は割愛。

###②インスタンスにIAMロールをアタッチする
各サーバーで CloudWatch Agentを実行する上で必要な IAM ロールを作成するには
・CloudWatchAgentServerPolicy 
・AmazonSSMManagedInstanceCore

管理者が Parameter Store に書き込むための IAM ロールを作成するには
 ・CloudWatchAgentAdminPolicy 
・AmazonSSMManagedInstanceCore

が必要。何も考えたくなければ上記のポリシーを全てアタッチしたロールを作成すればOK。

作成したロールを、作成したインスタンスにアタッチする。
既にロールがアタッチされている場合は上記のポリシーを既存ロールにアタッチすればOK。

###③サーバにてCWA導入
サーバにログインして、下記のコマンド実行。

~~~shell
#Cloud Watch agentのダウンロード
wget https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm

#パッケージインストール
sudo rpm -U ./amazon-cloudwatch-agent.rpm

#エージェント設定・起動
#上記コマンドにてwizardの質問にいくつか答えると勝手に設定ファイルのjsonを作成してくれる
#質問される内容に関してはコード外↓のwizard質問詳細を参照(基本デフォルトでOK)
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

　
#collectdのインストール
#サーバの統計情報を収集するためのソフトウェア
sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install -y collectd

~~~
[※wizard質問詳細](https://dev.classmethod.jp/articles/ec2-how-to-install-cloudwatch-agent-for-beginner/)


###④SSMコマンド実行
AWSコンソールにログインし、AWS Systems Managerを開く。

Run Commandを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/e1c5b4c3-5235-0ff2-f69c-8bc974283f73.png)

Run Commandを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/64c96f3d-ef44-1099-620b-67bf2afe41f9.png)

AmazonCloudWatch-ManageAgentを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/4f291b9a-e651-15bf-323d-426f0abf163d.png)

「コマンドを実行する」を選択し、「コマンドのパラメータ」を入力する
※青部分は任意の値を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/36c26561-3423-fbbc-8501-88ac45552552.png)

ターゲットにて対象のインスタンスを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/817555e9-dd45-d3e0-835b-ab1f8ef170a1.png)

実行し、「成功」するかを確認

上記すべて完了した時点で、AWSコンソールのcloud watchのメトリクスに、**「すべてのメトリクス>CWAgent」が追加される**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/fba0a88b-ad89-d3da-1431-ccd3dde1d8ee.png)

メトリクスを確認し、アラート等を設定すればインスタンスのリソース監視ができるようになる。

#最後に
今回紹介したのはインスタンス単体を決めて監視をおく方法なので、opsworksやcloudformation、Autoscallingなどで追加されたインスタンスについて自動で監視が入るものではないのでデフォルトで監視されるようにするためには工夫が必要だ。
ディスクフルに陥ってしまう前に、しっかりと監視の体制を引いておくことはとても重要なので、CWAを上手に活用しよう
FaceAPIを使った顔認識

社内向け発表会でFaceAPIを使った顔認識を発表する機会があったのでざっくりと書きたいと思います。

#Azure Cognitive Servicesとは？
開発者がAIまたはデータサイエンスのスキルや知識がなくても、コグニティブかつインテリジェントなアプリケーションを構築できる。REST API シリーズとクライアント ライブラリ SDK を含むクラウドベースのサービスである。
これを、今回PowerAppsと連携させて作っていきます。

#1,Azure PortalでFaceAPIの準備をする

検索欄からCognitive Serviceを検索する
![2020-10-25 12.28のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/3e750ec7-4253-7338-20ec-2c44f522cef5.jpeg)


Cognitive Serviceの中から、FaceAPIを検索する
![2020-10-25 12.32のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/cdb135a5-b954-42b8-a52c-b7f1f1862fc7.jpeg)


必要事項を入力する
![2020-10-25 12.38のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/0810ff31-3f37-06b5-1619-adab2e71e3e9.jpeg)
デプロイされるまで待ちます。
デプロイ完了後、Keyとエンドポイントをメモしておきます。
![564F6D18-FD13-4E23-8551-DEBA86E4A590_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/3e7d853e-e3a6-3cd9-c2ac-2780574a58e3.jpeg)

これを、Power Appsと連携していきたいと思います。
![357906CD-BA69-40CA-919D-0FC02C858D05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/2f2ab24e-80cd-9533-9dd6-a8ee19dc6d3f.png)
PowerAppsはこのような画面になっています。
アプリから、新規作成しキャンバスアプリを選択します。これが、キャンバスアプリの作成画面です。
![033301CC-5213-4547-BF91-E05A3B63E078.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/f964f588-3941-20b7-fe37-88a1210929a0.png)

PowerAppsのデータの連携は簡単です。左のコネクタの画面から選べます。
今回はFaceAPIを連携させます。
![42F3B4F6-2C70-4D38-8B3C-E0E9A7E11A7B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/7561beb2-a5d2-9ad8-41cd-13baa63407bc.png)
先ほどのKeyとエンドポイントを入力して接続させます。

もろもろ作成します(作成の詳細は後日)。
![D591A268-C492-4237-9940-148713EE63F4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/21c67ee7-61c3-dcd7-5896-f4e45a0ad5fd.png)




実行結果はこのような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/856575d5-bce9-6a76-d296-3aa524ebd9b0.png)

Power Appsは簡単にAPI・データベースの連携ができるので皆さんも色々試してみてください！
【Udemy Python3入門+応用】　 69. 絶対パスと相対パスのImport

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

## ■フォルダの中のものをimportする
こんな風にディレクトリとファイルを用意する。

```
lesson_package
 └ talk
   ├ __init__.py
   └ human.py
lesson.py
```

```python:human.py
def sing():
    return 'sing'

def cry():
    return 'cry'
```

```python:lesson.py
from lesson_package.talk import human

print(human.sing())
```

```:result
sing
```

`.` でつなぐことで、下層のディレクトリからimportできる。


## ■絶対パスと相対パスのimport
```
lesson_package
 └ talk
   ├ __init__.py
   └ human.py
 └ tools
   ├ __init__.py
   └ utils.py
lesson.py
```

```python:human.py
from lesson_package.tools import utils      # 絶対パス
from ..tools import utils                   # 相対パス

def sing():
    return 'sing'

def cry():
    return 'cry'
```
相対パスの`.`は「1つ上層にいく」という意味になる。
AWSのEC2インスタンスにRubyをインストールする方法

# はじめに
AWSはAmazon Web Servisesの略で、Amazonが提供しているクラウドサーバーのサービスです。
AWSへの理解度を高めるために、学んだことをアウトプットします。


# 今回の流れ
AWSのEC2で作成したインスタンスにRubyをインストールします。

インスタンスは作成していることを前提とします。
※インスタンスの作り方が分からない方はこちらを参照ください。
「AWSに仮想サーバーを構築する方法」https://qiita.com/daisuke30x/items/91307c94e8f5a702a42f

# EC2インスタンスにRubyをインストール

①インスタンスにログイン

```:ターミナル
% ssh -i キーペア名.pem ec2-user@<パブリックIP>
```

②環境構築に必要なパッケージをインストール
インスタンスにログインした状態で

```:ターミナル
まず、パッケージのアップデートを行います。
[インスタンス]$ sudo yum -y update

パッケージのインストールを行います。
[インスタンス]$ sudo yum -y install git make gcc-c++ patch libicu-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl-devel curl
```

③Node.jsをインストール（JavaScriptを動かせるように）

```:ターミナル
[インスタンス]$ sudo curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
[インスタンス]$ sudo yum install -y nodejs
```

③Yarnをインストール（JavaScriptのパッケージを管理するためのパッケージマネージャー）

```:ターミナル
[インスタンス]$ sudo yum install -y wget
[インスタンス]$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
[インスタンス]$ sudo yum install -y yarn
```

④rbenvとruby-buildをインストール
rbenv：Rubyのバージョンを切り替えてくれるツール
ruby-build：UNIX系のシステム上で異なるバージョンのRubyをコンパイルし、インストールするための、rbenv installコマンドを提供するrbenvのプラグイン

```
rbenvをインストール
[インスタンス]$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

パスを通す
[インスタンス]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[インスタンス]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

.bash_profileの読み込み
[インスタンス]$ source .bash_profile

ruby-buildのインストール
[インスタンス]git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

rehash(コマンドを使えるようにする)
[インスタンス]$ rbenv rehash
```

⑤Rubyをインストール

```
Ruby 2.6.5をインストール
[インスタンス]$ rbenv install 2.6.5

インスタンス内で使用するRubyのバージョンを指定
[インスタンス]$ rbenv global 2.6.5

rehash(コマンドを使えるようにする)
[インスタンス]$ rbenv rehash
```

# 最後に
本投稿が初学者の復習の一助となればと幸いです。
Scrum Fest Sapporo Day 1 参加レポート「もりあがるスプリントレビューをしよう」

# Scrum Fest Sapporo Day 1 「もりあがるスプリントレビューをしよう

2020/11/06に開催されたScrum Fest Sapporoの発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/14017

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、6人で参加して、その場で実況しつつ、記事も作っています。


# スプリントレビューの形式
1. 会議室で行う
人が多くなると固い雰囲気になりがち

2. 配信
人が増えても対応可能

3. バザール形式
人が多くても対応でき、ディスカッションもできるが、何度も説明しなければならないので手間ではある。


# 盛り上がらないスプリントレビュー

1. ステークホルダーが来ない
 - POと開発チームだけで開催
 - 進捗報告になりがち

2. 発言しにくい
 - 人が多かったり、偉い人がいて気を使う
 - 「大勢で集まることが時間の無駄」と偉い人が言う
 - 結果、発言する敷居が低くならない

3. 過度な事前準備
 - 準備を入念にしすぎていて、質問する隙がなくなってしまう
 - 説明をばっちりスライドで用意している場合などに陥りがち

4. 段取りが悪い
 - PC繋ぎ変えに時間がかかる
 - 説明者がでも内容をきちんと理解していない
 - 逆に細かい技術説明になってしまい、聴衆が置いてきぼりになる


# そもそもスプリントレビューって何のためにやるのか？
- スクラムガイドでの定義
 - チームと関係者がスプリントの成果をレビューして、次に何をするか議論する場
 - 前回の成果はどうでもよい
 - バックログの順番や方針などに影響がなかったとしたら、そのスプリントレビューは意味をなさなかったということになる
- スプリントレビューの目的は、価値を最適化するために次に何ができるのかをみんなで議論すること

# もりあがるスプリントレビューレビューににするためには？
目的を忘れずに、盛り上がらないスプリントレビューの逆をやればよい

1. ステークホルダーが来ない → 関係者を招待する
 - 根気強く声掛け
 - 目的を説明
 - ステークホルダーが空いている時間に開催する

2. 発言しにくい → 発言しやすい雰囲気づくり
 - ペアで司会をやる(合いの手を入れてもらうことができる)
 - チャットにコメントを投稿してもらう
 - 賑やかしコメント(コメントのハードルを下げることにつながる）


3. 過度な事前準備 →　準備はほどほど、ただし些細な指摘はつぶしておく
 - デザイン・文面などの細かい指摘が始まると本来見てもらいたい内容がレビューしてもらえなくなる


4. 段取りが悪い → 事前確認を短く行う
 - 機材の接続確認
 - デモ項目の各ににゃ説明粒度の認識合わせをチーム内で行う
 - 開発の背景説明を適切な人に依頼

+α.　提供する価値を明確に
- スプリントゴールを明確にするということ


ゴールを明確にしておくことで、議論することができる
制約の中でも自由にできるようになると感じた


# Rettyで取り組んだ施策
- スプリントゴールを毎週設定し、開発チームで揉んでもらう
    - 自分たちの使い勝手の良い、意義のあるところでやってもらう
    - スプリントレビューは全員招待している。カスタマーサポートや開発者など40名ほど参加している
- 事前の接続確認はデモがある場合、毎回実施
- スプリントレビューの流れ
- スプリントゴールの確認
- デモ。背景説明は企画者から。
- QA、コメントはチャット　← 記録として残るので口頭よりもよい
- 次スプリントのゴール確認

# まとめ
参加者に「やってよかった」と思われるイベントにしていく。
大きな目的（＝スプリントゴール）を共有できると、より有意義なスプリントレビューになると思う。
もりさげる要因は複数あるが、１つずつ改善していくしかないかなと思っている。
2～3か月くらい改善には時間がかかった。


# 感想（チーム全員の感想をまとめています）
- イベントで相談した内容を別のイベントで共有されていることが発表者にとっても参加者にとっても有意義な活動だなと感じました。

- 指摘しあう場ではなく、目的に向かってどうすればよりよくなるかを話合う場としてスプリントレビューを開催することが大切だと改めて感じました。

- 接続確認はとても大事。昨今ではリモートワークが主流になっておりレビューもリモートで行うことがおおいので、以前に比べると接続確認の重要性は高まっていると思う。

- スプリントレビューの盛り上がりはプロダクトの盛り上がりとも捉えられるので、まずは盛り下がる要素をつぶして、そのうえで盛り上げる工夫が必要だと感じました
MySQLで最小値/最大値を取得する

### やりたいこと
最小値かつ最小値のグループの中の最大値を取得したい

### 条件
開始日が１番古い値の処理日時を取得する
※開始日が被っていた場合（時間は見ない）には処理日時が一番新しいものを取得

**ここでは開始日が『 9/16 16:45 』で処理日時が『 9/20 13:23 』の２行目の値を取得します。**

**テーブル名：item**

|  開始日(start_time) | 処理日時(process_time)  |
| ---- | ---- |
|  9/16 15:34  |  9/17 10:43  |
|  9/16 16:45  |  9/20 13:23  |
|  9/17 12:45  |  9/23 13:23  |
|  9/17 17:45  |  9/27 14:29  |
|  9/20 10:45  |  9/29 13:23  |

### SQL
```SQL
select start_time, max(process_time) 
from item 
group by date_format(start_time, '/%m/%d') 
order by start_time 
limit 1
```

### 解説
**max(process_time)**
max(カラム名)を使用すると最大値を取得できる。　
※min(カラム)を使用した場合は最小値を取得できる。

**group by date_format(start_time, '/%m/%d')**
group byを使用することで同一の開始日のデータをグループ分けをすることができる。
date_format(start_time, '/%m/%d')とすることで、時間を見ずに日付の部分だけでグループ分けができる。

**order by start_time**
group byで取得した中で開始日が最も古い順に並び替える。


**limit 1**
group byをすることにより複数件値が取れているが、１件しか欲しくないためlimit 1を使用し最初の行を取得する。
order byで並び替えていることによりlimit 1で欲しい行が取得できる。


### 参考ページ
https://dev.mysql.com/doc/refman/5.6/ja/example-maximum-row.html




上記、参考になれば幸いです。
もっと簡単に取得できる方法があれば教えていただきたいです！
ArduinoでPCから、シリアル通信で数値を送る (Serial.parseInt())

#結論から
**Serial.parseInt()**という関数により、簡単に、**マイナス符号も考慮**した数値を読み込むことができる(整数)  
  
小数点の場合は**Serial.parseFloat()**を用いる

追加のライブラリは必要ありません

#つまずくこと
このままでは、記事にならない、また、つまずく箇所があったため、サンプルと解説を以下に示す  

このサンプルは、シリアルモニタで入力した数値×10を出力するプログラムです(Arduino Nanoにて検証済み)

```c:スケッチ.ino
///////////////////////////////////////////////////////
//setup
///////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);     //シリアル通信初期化
}

///////////////////////////////////////////////////////
//loop
///////////////////////////////////////////////////////////
void loop() {
  //受信データがある場合if内を処理
  if (Serial.available() > 0) {
    delay(10);
    int val = Serial.parseInt();    //文字列データを数値に変換

    while (Serial.available() > 0) {//受信バッファクリア
      char t = Serial.read();
    }
    
    Serial.println(val*10);         //出力
  }
}
```

ここで、受信バッファをクリアしなければ、Serial.parseInt()で、ループ？(うごかなくなる)や、次の周で0が取得されたりする。

**追記: 受信バッファをクリアする以外の方法をコメントにて＠KeitetsuWorksが記述してくださいましたので、コメントもぜひご覧ください（コメントの方法では、parseIntではなくtoIntを利用します）**

他のサイトでは、(ASCIIコード)などから、計算する方法などが紹介されておりますが、簡単な関数があるという紹介でした。

#複数の数値を送信する
1度に、数値をスペースなどで区切って複数送信するサンプル  

このサンプルは、シリアルモニタで入力した3つの数値を加算し、出力するプログラムです(Arduino Nanoにて検証済み)

```c:スケッチ2.ino
///////////////////////////////////////////////////////
//setup
///////////////////////////////////////////////////////////
void setup() {
  Serial.begin(115200);     //シリアル通信初期化
  Serial.setTimeout(10);    //タイムアウト短縮1sから0.01sへ
}

///////////////////////////////////////////////////////
//loop
///////////////////////////////////////////////////////////
void loop() {
  int val[3] = {0};

  //受信データがある場合if内を処理
  if (Serial.available() > 0) {
    delay(10);
    for (int i = 0; i < 3; i++) {
      val[i] = Serial.parseInt();    //文字列データを数値に変換
    }

    while (Serial.available() > 0) {//受信バッファクリア
      char t = Serial.read();
    }

    Serial.println(val[0]+val[1]+val[2]);         //出力
  }
}
```
区切り文字は、たぶん数値とマイナス以外なら、なんでも大丈夫そう。詳しくは引用を参照されたし  

またSerial.setTimeoutが追加されているが、これは、入力された数値の個数が、3つ未満である場合(このサンプルは値を3つ入力することが前提)、シリアル通信がタイムアウトするまで(1秒)、動作が停止するため、高速化させるために追加した

#引用
Arduinoリファレンス  Serial.parseInt()
https://garretlab.web.fc2.com/arduino_reference/language/functions/communication/serial/parseInt.html
windows リモート接続時コピペができない：解決策

https://daichan.club/windows/888
windowsでコピペができない解決策
リモート接続時発生
サーバ先のコピペ機能を強制終了・再起動する
サーバ先でコピペを使うexcelマクロを回してたので、
俺の場合は使えなかった。
クリップボード共有を切ればあるいは？


JERA Planning to Shift Coal Power Fleet to 100% Ammonia
http://www.powermag.com/jera-planning-to-shift-coal-power-fleet-to-100-ammonia/
Scrum Fest Sapporo Day 1 参加レポート「ゼロからつくったリモートスクラムチームはスクラムに挫折し解散しました」

# Scrum Fest Sapporo Day 1 「ゼロからつくったリモートスクラムチームはスクラムに挫折し解散しました」

2020/11/06に開催されたScrum Fest Sapporoの発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/14135

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、6人で参加して、その場で実況しつつ、記事も作っています。

# スクラムやってみて思ったこと
- スクラム難しい
- でもじょうずにソフトウェア開発したい
  - 楽しく
  - みんなで
  - 儲かるものを

# おはなしするプロジェクト
新しいコンポーネントをつくり、新しいソリューションを提供する。
ウェブ開発との違い：いろんな会社の機器と相互接続する必要があるため、国際標準の企画が厳密に決まってる

# チーム結成前夜
お客様になりそうな人たちと一緒に「こういうもの作りたい！」となっている状態。
必要なコンポーネント・マイルストーンも見えている状態で、早く開発するためにスクラムでやることに。
でも、開発は始まらない。開発者も集まらない。

救いを求めてOSTへ。

まずはマイルストン・スケジュールの合意とスケジュールの相談を行い、
メンバーは挙手制。60％以上時間をさける人を求めた。
前提知識を得るために課題を出す（SCRUM BOOT CAMP THE BOOK）

# チーム結成
集まった人たちはモバイルコアの開発、スクラム開発したことがない人たちばかり。

# 立ち上げ期
1週間スプリントでフルリモートでスクラムを開始。
出勤時間がバラバラなので、デイリースクラムは非同期で実施。slackに何かひとこと＋やったこと、困っていることを書くことに。

# 自走期
- SM/TL不在によりチームは自走しだす
	-自分たちでバックログを作る
- タスクを人ごとに割り振っていたが、だんだんとタスクの境界線がなくなってきた 
- ぬるっと進みだした

# いつも通り進める期
- slackへの報告は面倒なので廃止
-スラムでない 
-自信を無くす


# ふりかえって
- メンバーはみんなゼロからはじめた
- 会社としても初めてスクラムやった 
- このチームでは「スクラムじゃない」状態から開発が進んだ
- スクラムのフレームワークにのっとるよりだいじなことがあった
- 経験と学習をくりかえして、じょうずにソフトウェアをつくれるエンジニア・会社になりたい


# 感想
- スクラムコーチがいない状態でスクラムをはじめるのはハードルが高そうだなと感じました。
- また、基調講演にもありましたが、なぜスクラムをやるのかを論理的に説明できるようにしておくことが大切なのかなとも思いました。
- 初登壇のことや、内容からとても行動力のある方だと思いました。自分は行動力があまりない方なので、積極的に行動に移したいと思います。
cv2.selectROI()を実行した時にエラーが出た

##概要
opencvで画像マッチングを探していたら、youtubeでこんなやつが出てきた

[![360度マッチング](http://img.youtube.com/vi/h2vmhB6WzG4&ab_channel/0.jpg)](http://www.youtube.com/watch?v=h2vmhB6WzG4&ab_channel)

これは面白いと思って、コメント欄にあるgithubからソースをコピーして、実行したら、以下のエラーが出た。

```
module 'cv2' has no attribute 'selectROI'
```

##環境
- Ubuntu 18.04 64bit
- opencv 4.2.0

> :pythonで"import cv2" 'cv2.__version__'でバージョン確認。いつものやつ

## Solution

[Stack overflow](https://stackoverflow.com/questions/44633378/attributeerror-module-cv2-cv2-has-no-attribute-createlbphfacerecognizer)に解決法あった。特に細かいことは気にせず以下を実行。

```
pip install opencv-contrib-python
```
そうしたら動いた。

トランプさんで良かったのに。
なんかもうめちゃくちゃ。
2020年11月6日
[Packer]Provisionersでaptがエラーになるときの対処法

## 背景

Ubuntu 18.04ベースのAMI(Redash用のAMI)をベースにPackerでローカルAMIを作成しようとしたところ、Provisionersで以下のエラーが発生しビルドが失敗した。

```
    amazon-ebs: E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
    amazon-ebs: E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
==> amazon-ebs: Provisioning step had errors: Running the cleanup provisioner, if present...
```

## 原因

ubuntuでは定期的ないしサーバ起動時にaptが自動実行される設定があり、provisionersでaptを実行したときに重複起動によりエラー終了してしまう事がある。

## 対策

aptの自動起動を停止するとともに、万が一aptが動作している場合はwaitするようにすることで重複が発生しないようにする。

```
  "provisioners":[{
    "type": "shell",
    "inline": [
      "sudo sed -i '/APT::Periodic::Update-Package-Lists/s/1/0/' /etc/apt/apt.conf.d/20auto-upgrades",
      "sudo sed -i '/APT::Periodic::Unattended-Upgrade/s/1/0/' /etc/apt/apt.conf.d/20auto-upgrades",
      "sudo systemctl stop apt-daily.timer",
      "sudo systemctl disable apt-daily.timer",
      "sudo systemctl mask apt-daily.service",
      "sudo systemctl daemon-reload",
      "sudo sed -i '/APT::Periodic::Update-Package-Lists/s/1/0/' /etc/apt/apt.conf.d/10periodic",
      "while pgrep -f apt.systemd.daily > /dev/null; do echo 'waiting: apt.systemd.daily; done' >&2; sleep 1; done",
      "sudo rm -f /var/lib/dpkg/lock-frontend",
      "sudo apt update",
      "sudo apt -o Dpkg::Progress-Fancy=false -y install software-properties-common",
      "echo 'end apt install software-properties-common' >&2",
      "sudo apt-add-repository --yes --update ppa:ansible/ansible",
      "sudo apt -o Dpkg::Progress-Fancy=false -y install ansible",
      "mkdir -p /tmp/ansible-local",
      "sudo apt -o Dpkg::Progress-Fancy=false -y install chrony"
    ]
```

# 詳細解説

```
      "sudo sed -i '/APT::Periodic::Update-Package-Lists/s/1/0/' /etc/apt/apt.conf.d/20auto-upgrades",
      "sudo sed -i '/APT::Periodic::Unattended-Upgrade/s/1/0/' /etc/apt/apt.conf.d/20auto-upgrades",
      "sudo systemctl stop apt-daily.timer",
      "sudo systemctl disable apt-daily.timer",
      "sudo systemctl mask apt-daily.service",
      "sudo systemctl daemon-reload",
```

自動アップデートと自動アップグレードを無効

```
      "while pgrep -f apt.systemd.daily > /dev/null; do echo 'waiting: apt.systemd.daily; done' >&2; sleep 1; done",
```

起動している自動アップデート処理が終了するまで待つ

```
      "sudo rm -f /var/lib/dpkg/lock-frontend",
```

元となったAMIにlockファイルが残ってしまっていた場合を考慮して削除

```
      "sudo apt update",
      "sudo apt -o Dpkg::Progress-Fancy=false -y install software-properties-common",
      "echo 'end apt install software-properties-common' >&2",
      "sudo apt-add-repository --yes --update ppa:ansible/ansible",
      "sudo apt -o Dpkg::Progress-Fancy=false -y install ansible",
      "mkdir -p /tmp/ansible-local",
      "sudo apt -o Dpkg::Progress-Fancy=false -y install chrony"
```

以降は通常のaptを利用したインストール作業。

Packerの場合はプログレスバーの出力を抑制するために `-o Dpkg::Progress-Fancy=false` と yes/no 入力待ちで引っかからないようにするために `-y` オプションを利用する。
Scrum Fest Sapporo Day 1 参加レポート「アジャイルに向かう組織に聴いてほしいアジャイルへの第一歩」

# Scrum Fest Sapporo Day 1 「アジャイルに向かう組織に聴いてほしいアジャイルへの第一歩」

2020/11/06に開催されたScrum Fest Sapporoの発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/14224

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、5人で参加して、その場で実況しつつ、記事も作っています。

# 話したこと
アジャイルが浸透してない組織にアジャイルを取り入れるときに何をすればよかったか

# こんな人向け
- アジャイルを取り入れたい
- アジャイルやりたいけど何やったらいいんだろう
という人

# 初めてのスクラム
- 社内部門の業務アプリを刷新しようとした
	- 勉強会を開いてスクラムとは何か学んだ
	- プロジェクトのルールや体制を決めた

# 起きたこと1
それぞれアジャイルってこうでしょ！という考え方がぶつかりあう

# 起きたこと2
依頼者は発注側であって、受注者が御用聞き状態

→まずはアジャイルを知ろう、それがスタートライン。WFとアジャイルを比較する人が多いけれど、そもそも軸が違う。


アジャイルの誤解は最初に払拭しておくこと
そうすることで「想像していたものと違う」ことを理解してもらえる
結果、長期計画が立てにくいということも理解してもらいやすくなる

# 計画と目的と進捗の指標
計画を守ることが目的なのだろうか？
計画を守れているからOK、ということではない
**目的を考えたときに何を指標にすると良さそうか。**を意識したほうがいい

- 目標を誰と共有するか
プロジェクトの目的を改めて確認したとき、どの範囲で共有すべきかを見極める。

# 適用判断
銀の弾丸ではなく、向き不向きを把握していく。

- 顧客との競争体制を作れそうか
	- 顧客と同じ方向を向ける状態じゃないと厳しい
	- 契約云々もあるけど、最低限歩み寄れそうかどうか
- 向き不向きを考える
	- 要件定義が終わってるたいみんぐなら、アジャイルである必要性はない
	- なんでアジャイルをするかは考えたほうがいい。レッツトライ精神は歓迎。
	- あくまで選択肢の１つ。

# 体制を整える
## 周囲のアジャイル理解に対応する
WF開発とのギャップが大きく、関係者に理解されにくかったりする。
単純な説明はするとして、必要に応じて抵抗を和らげる策を講じておいたほうがいい。

## 目的の認識を合わせる
- 計画書など、明文化されていても、個々の受け取り方に微妙に差異があったりする。

インセプションデッキは全部できたほうがいいけど、最低限「1. われわれはなぜここにいるのか」と「2.エレベータピッチ」はやっておいたほうがいい。
開発中に何度か実施して見失わないようにするのも良い
フランクにアイスブレイクっぽくやってみても面白い

## チームのルールを決める
スプリントの期間、ツールなど、狙いを持ったうえでルールを決めることが大切。
狙いを持っておくことで、ふりかえふりかえることができる。
一度決めたルールに固執しなくてもよい。スプリントが終わるのタイミングを待たなくても、スプリント中に変えたって良い。

## まとめ
得たいの知れないものを独自解釈しないようにする。
いきなり決めるよりはゆっくり頭を切り替えることが大切。まずは、よくわからない状態からチョットワカル状態にすること。

# 感想
（参加したチームメンバーの感想です）

- 1年前の発表のまとめはマインドセットを変える！だったが、1年経って考え直すと、、
- マインドセットというものではなく、アジャイルとはこういうものだとか、WFはこういうものだという思い込みをなくすことに尽きる
- 変化した後の姿をイメージしてもらえるかどうかの問題だと思った。
MacにてJavaの開発環境構築ーーJDK Install（2020年保存版）

Java開発環境構築の最初に、JDKのインストールをしましょう。

まずはhttps://www.oracle.com/jp/java/technologies/javase-downloads.html
という公式サイトからJava SEのバージョンを見て右下の「JDK Download」をクリックして、
![スクリーンショット 2020-11-06 16.08.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858237/2cdf0405-4f45-5239-3900-8b66cbdc22d8.png)
ダウンロードの詳細画面に遷移して、「jdk-15.0.1_osx-x64_bin.dmg」というリンクをクリックします。
![スクリーンショット 2020-11-06 16.13.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858237/895c7ee4-35a0-d4f6-9e62-15589008ea01.png)
「License Agreement」というチェックボックスをチェックして、「Download jdk-15.0.1_osx-x64_bin.dmg」をクリックするとダウンロードが開始されます。
![スクリーンショット 2020-11-06 16.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858237/694e8018-8642-83ee-2b8a-8b48d7a04f81.png)

ダウンロードしたファイルをクリックして、
![スクリーンショット 2020-11-06 16.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858237/540f4515-b967-913c-3b81-c67b7d153ddc.png)

インストール画面に遷移して、「続ける」ボタンを押して、
![スクリーンショット 2020-11-06 17.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858237/a3cda676-be52-2f80-d9f5-57a6368672a5.png)

続きまして、インストールボタンを押します。
![スクリーンショット 2020-11-06 17.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858237/662c71c8-6874-540d-7397-5c969755dbaf.png)

続きまして、正常にインストールされました。
![スクリーンショット 2020-11-06 17.35.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858237/1d75e718-08e1-24b0-14b6-bf53aaee8a81.png)

インストールした後でターミナルにて下記のコードで確認しましょう。

```
java -version
```
インストールしたJavaのバージョンが出てます。それで正確にインストールされました。

```
java 15.0.1 2020-10-20
Java(TM) SE Runtime Environment (build 15.0.1+9-18)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
```

以上です。ここまで読んでいただきまして、ありがとうございました。
何とか参考になれば幸いです。
Windows雑記

Windowsでよく忘れるパスと管理ソフトを書いておきます
### パス

|場所|パス|例|
|:-:|:-:|:-:|
|スタートアップ| shell:startup|C:\Users\[user]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup|
|コンテキストメニュー 送る|shell:sendto|C:\Users\[user]\AppData\Roaming\Microsoft\Windows\SendTo|

### マネージャー
| マネージャー | コマンド 
|:-:|:-:|
|ローカルグループポリシーエディター| gpedit.msc | 
|ディスク管理 | diskmgmt.msc | 
|デバイスマネージャー | devmgmt.msc |
|システムのプロパティ|sysdm.cpl|
|プログラムの機能|appwiz.cpl|
##### 今後
他にもあ～あれあれってなったら追記していこうと思います
Radeon GPU を Windows on QEMU/KVM で動かす


## QEMU/KVM でGPUパススルーをする
最近はGPUの性能向上や、ソフトウェアの改良により、仮想環境下のWindowsでも一般的な3Dゲーム程度ならば十分な性能を発揮できるようになってきました。ただし、そのためには仮想環境内のOSからGPUを直接触れる必要があります。この技術をGPUパススルーと言います。
NVIDIA社のGeForceシリーズ、AMD社のRadeonシリーズのどちらでもパススルーは可能ですが、いろいろな事情によりRadeonの方がやりやすいようです。

この記事は Radeon 5700XT についての記事です。その他の製品についても当てはまるかもしれませんが、当てはまらないかもしれません。情報のご利用は自己責任で。

基本的に、[Arch Linux の記事](https://wiki.archlinux.jp/index.php/OVMF_%E3%81%AB%E3%82%88%E3%82%8B_PCI_%E3%83%91%E3%82%B9%E3%82%B9%E3%83%AB%E3%83%BC)
の通りにすればOKなので、まずは記事を読んでくださいな。

ここでは記事に書かれていないコツを紹介します。

### GPUパススルーのコツ

#### ホストのカーネルにパッチが必要
この記事を書いている現在の時点（2020年10月）でLinuxカーネルに対してパッチが必要です。
これはRadeonシリーズに存在する、俗にPCIeリセットバグと呼ばれるバグを迂回するために必要です。
通常、仮想マシンの終了時にデバイスに対してリセットを送るのですが、Radeonシリーズはこの命令を受けると変な状態にロックしてしまうバグがあるようです。実マシンではPCIeの電源が切断されるので問題にならないのですが、仮想マシンの場合は電源断を仮想的に行なう（BACO）ため、問題になります。
この現象を回避するため、デバイスのリセットを特殊な手続きで行う必要があります。[そのためのパッチ](https://forum.level1techs.com/t/navi-reset-kernel-patch/147547)が有志の方から提供されています。このパッチを適用することで、仮想マシンの再起動（終了、起動サイクル）が可能になります。

#### ドライバインストール後はホストを再起動
Radeon のドライバはインストール直後にマシンの再起動を求められます。また、カウントダウンが始まり、自動的に仮想マシンが再起動しようとします。
この時、（恐らくハードウェアをリセットする必要があるため)ホストを再起動してください。仮想マシンの再起動だけだとドライバをうまくインストールできないようです。警告なども特にありませんが、一度失敗してしまうと、ドライバの再インストールが必要です。

### 春のドライバアップデートで動作不能になった

2020年春ごろのドライバアップデートからうまく動作しなくなりました。ディスプレイへの画面出力がうまく行なわれず、ディスプレイからは無信号状態として扱われてしまいます。
この現象、ドライバの不具合などの可能性もあるため、しばらく放置していたのですが、複数回のアップデートを重ねても一向に直る気配がないため、本腰を入れて解決策を探しました。

いろいろと試行錯誤した結果、どうやらGPUドライバを騙す必要がありそうです。
llbvirtを使っている場合はマシンのXMLファイルの`/domain/features/hyperv`に`<vendor_id state="on" value="101"/>`などと書き加える必要がありました。QEMUをそのまま使っている場合は相当のオプションを付加する必要がありそうです。
[Arch Linux の記事](https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Video_card_driver_virtualisation_detection)
とほぼ同じ操作が必要なようです。ただし、`<hidden state='on'/>`は必要ありませんでした。

これによって以前と同様にGPUを使うことができるようになりました。さらに、以前はドライバユーティリティに項目が出現せず、使用できなかった録画機能（Radeon ReLive）も使えるようになりました。こういうこともあるんですね…

GPU回りはプロプラで固められていますし、正常動作するようになったので、こんな所で満足することにします。
hostsファイルをターミナルで設定やってみる

## まず、hostsって何？

リニューアル公開前（DNS切り替え前）のサイトを確認する際に、公開時のドメインでアクセスしないと正しく表示できないケースがあります。
そこで、PC内にある「hostsファイル」を編集することで、DNS情報を参照せずに設定したPC上のブラウザからドメイン名で新しいサーバにアクセスすることができる！

```
【例】IPアドレス ドメイン
```


### macOS Catalinaのhostsファイルの場所

/private/etcディレクトリにあります。/etcが/private/etcのシンボリックリンクになっているので/etcディレクトリでも同じです。

```
❯ cd /private/etc
```

### hostsファイルの編集

hostsファイルを編集するには管理者権限が必要なのでsudoをつけてvimやnanoでファイルを編集します。

```
❯ sudo vim hosts
```

### vimの使用方法

```
i（入力開始）
↓
esc （入力完了）
↓
:wq　（上書き保存）
```

### hostsファイルの記述方法

```
<IPアドレス> <ホスト名>
```

### 設定後の確認方法

pingコマンドで設定が確認できます。

```
ping 確認したいドメインをここにいれる
```
WordPressを速攻でGoogle Cloud Platform(GCP)に構築！

元記事：[genkitech.net](https://genkitech.net/gcp-wordpress-deploy)

###いきさつ

フリーになってから個人的な技術メモをどこかに残しておきたいと思い、Qiitaとかでもいいんだけど、折角なのでまだ使った事が無いWordPressを使って、本サイトを立ち上げることにしました。プラグイン開発とかの案件もありそうなので、触っておいて損はなさそうですし。

###GCPのメリット

直前にAWSを使っていたのでAWSで行こうかと思ったんですが、金額をざっくり調べるとGCPの方が安そうだったのと運用の手間が少なそうだったのでGCPにしました。今回はドメイン取得もしたいので完全無料ではありませんが、可能な限り低コストでGCPで完結させます。

##GCPにWordPressを構築！

早速やっていきましょう！前提として、GCPのアカウントをすでに持っている事とします。作成後に画面を撮っている関係で整合性が取れていないところはご了承ください。

###GCPのプロジェクト作成

[Google Cloud Platform](https://console.cloud.google.com/)のサイトにログインし、画面上部の「プロジェクトの選択」から「新しいプロジェクト」を開き、適当なプロジェクト名を入力します。（今回はgenkitechにしました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/956a8fe5-2db6-b6de-d749-e8f5f79885fa.png)

###WordPressをデプロイ
左のナビゲーションメニューから「Marketplace」を選択し

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/8d2ce069-197d-850a-d1be-fba555627e89.png)

上部で「wordpress google」と検索し、仮想マシンタイプのClick to DeployのWordPressを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/ee8ea436-7c91-b471-99ca-90f1b72930d3.png)

確認画面が出るので金額部分などを確認して「運用開始」し、詳細設定します。
GCPには無料期間後も無料で使える[無料枠](https://cloud.google.com/free?hl=ja)があるので、運用費を無料に近づけるために以下の設定を行います。

1. Zone
us-系のゾーン(us-east4以外)。westの方が日本に近いため「us-west1-a」を採用。
2. Machine type
f1-micro
3. Boot disk size in GB
無料枠上限の30GB
4. Allow HTTPS traffic from the Internet
続く記事で説明するSSL接続(https)をする場合、チェックをONにしておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/95465328-e81f-1f86-7561-fdc499c5f2e5.png)

デプロイのログが流れ「デプロイしました」の表示が出たら、横の「Site Address」のアドレスにアクセスすると、WordPressの初期画面を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/0d6677af-a980-4268-81bd-b36201b3cbde.png)

とりあえずここまでで、WordPressをGCPに構築することが出来ました。簡単すぎて拍子抜けですね。今の段階だとサイトのアドレスが http://25.197.5.xxx みたいになっているので、ドメインを取得して設定したいと思います。
【AWS】IAMユーザーMFA再登録

## 経緯
- 携帯の機種変更や突然の故障、PCの故障等により仮想MFAが突然使えなくなってしまった場合の対処方法

## 前提
- AWSマネージメントコンソールには入れないが、AWS CLIが利用可能なこと

## 手順

- ${IAMユーザ名}: MFAデバイスを再設定するIAMユーザ名を入れてください
- ${AWSアカウントID}: AWSアカウントID（12桁の数字)を入れてください

### 1. MFAデバイスの SerialNumber を確認する

```
$ aws iam list-mfa-devices 
{
    "MFADevices": [
        {
            "UserName": "${IAMユーザ名}",
            "SerialNumber": "arn:aws:iam::${AWSアカウントID}:mfa/${IAMユーザ名}",
            "EnableDate": "yyyy-mm-ddThh:mm:ssZ"
        }
    ]
}
```

### 2. MFAデバイスを無効化する

- コマンドの返り値はありません

```
$ aws iam deactivate-mfa-device --user-name ${IAMユーザ名} --serial-number arn:aws:iam::${AWSアカウントID}:mfa/${IAMユーザ名}
```

### 3. MFAデバイスを削除する

- コマンドの返り値はありません

```
$ aws iam delete-virtual-mfa-device --serial-number arn:aws:iam::${AWSアカウントID}:mfa/${IAMユーザ名}
```

### 4. マネージメントコンソールにサインインしてMFAデバイスを再登録する

- MFAデバイス削除したのでID/PWで入れるようになってます。

以上、お疲れ様でした。

## 参考

- list-mfa-devices
https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-devices.html

- deactivate-mfa-device
https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html

- delete-virtual-mfa-device
https://docs.aws.amazon.com/cli/latest/reference/iam/delete-virtual-mfa-device.html
EC2でデプロイしたRailsアプリ内のReact.jsのCSSが読み込めない

#この記事いついて
 私の備忘録としてここに残します。

Railsで作成したアプリのフロント部分にReact.jsを採用し、そこにCSSを読み込ませました。ローカル環境ではCSSが読み込まれていたのに、EC2でデプロイした際には読み込まれない。そんな状況の解決方法を記述します。

#ディレクトリ構成
appディレクトリ直下

```
.
├── assets
│   ├── config
│   ├── images
│   └── stylesheets
├── channels
│   └── application_cable
├── controllers
│   ├── concerns
│   └── users
├── helpers
├── javascript
│   ├── channels
│   ├── components
│   └── packs
```

javascriptディレクトリ

```
.
├── channels
│   ├── consumer.js
│   └── index.js
├── comment.js
├── components
│   └── HelloWorld.js
├── count.js
├── darkmode.js
├── nav.js
└── packs
    ├── App.jsx
    ├── Navbar.jsx
    ├── application.js
    ├── data.jsx
    ├── index.jsx
    ├── index.css
    ├── logo.svg
    ├── logo2.svg
    └── server_rendering.js
```
javascriptディレクトリのpacksの中にReactと対象のCSSを作成しています。
この状態で所定のビューファイルに下記を記述。

```index.html.erb
<%=javascript_pack_tag 'index'%>
```

これでローカル環境ではReactもCSSも読み込まれる。
しかし、EC2でデプロイした先のブラウザではCSSが読み込まれず、悲惨な状況に...

#原因
javascript/packsディレクトリにCSSを作成した事が原因でした。
EC2でCSSを読み込む際はpublicディレクトリで対応します。

「railsではassetsディレクトリにCSSを記述して読み込んでいるんじゃないの？どうやってpublicにCSSを読み込ませるの??」

と思われる方もいらっしゃると思います。
EC2上で設定した上で下記を実行。
今回は備忘録なので詳細は省きます。

```EC2
[ec2-user@~~~ myapp]$ rails assets:precompile RAILS_ENV=production
```
「rails assets:precompile」このコマンドでassetsディレクトリを圧縮してpublicに移動しています。
「RAILS_ENV=production」は単純にproductionでデプロイしているから記述しています。

#まとめ
作ったCSSはひとまずassetsに入れておくとトラブルなく済みます。
クラス名が被ることも考慮してCSSを作成しましょう。
信頼関係を崩壊させる方法

# はじめに
みなさん、チームを組んでお仕事をするときは、信頼関係を築いて、ハッピーにお仕事したいですよね？

チームの信頼関係がプロジェクトの成功の鍵を握っているといっても過言ではありません。

そんな、大事な大事な信頼関係はどうやったら崩壊させられるでしょうか？

普通であれば、「信頼関係を構築する方法」を考えるところですが、あえて「信頼関係を崩壊させる方法」を考えることで、アンチパターンを知ることがこの記事の目的です。

信頼関係は一度崩壊させてしまうと修復するのが大変なので、**信頼関係を構築することよりも崩壊させないことがより大切だと思います。**

# 信頼関係が崩壊するとどうなるのか？

信頼関係の崩壊によってもたらされる悪影響はなんでしょうか？

「そもそも一緒に仕事したくない」とか「ストレスがたまる」など挙げていけばキリがありませんが、ことシステム開発において、**信頼関係の崩壊による最大のデメリットはコミュニケーション・コストがとにかくかかってしまうことにあると思います。**

- 提案（この仕様でこうしませんか？
- 調整（これこれこうで、納期延ばしませんか？
- 改善（再発しないためにこうしませんか？

信頼関係がない人とこれらのことをしようと想像してください。かなりしんどいと思うはずです。

**信頼関係がないと、理詰めで説明しないと相手が納得しないので、ロジックを用意しなければならず、とにかく時間がかかってしまうのです。**
（信頼関係がない人との Slack のやりとりは文字数が多くなりがちですよね？）

何か物事をすすめるよりも、このようなロジックの用意に膨大な時間を費やしていたら、それは信頼関係が構築されていないサインになります。

やっぱり信頼関係、崩壊させたくないですよね。

【参考】
・[炎上しないプロジェクトの進め方](https://qiita.com/dowanna6/items/67d6fa50915c522a1fec)

# 信頼関係を崩壊させる方法【8選】

「信頼関係を構築する方法」も「信頼関係を崩壊させる方法」をどちらもインターネットで調べてみました。

残念ならが、私の調べ方が悪いのか、**それらの方法論を科学的根拠を元に解説しているような記事には巡り合えませんでした。**

なので、ここからは私が思う信頼関係を崩壊させる方法を挙げていきたいと思います。

**発想としては「信頼関係を構築する方法」の逆のことをひたすら考えて、なるべくやりそうな（やられそうな）ところに落とし込みました。**


## 1. レスポンスを遅くする

逆：レスポンスを早くする

## 2. 困っている人を見て見ぬ振りをする

逆：困っている人を助ける

## 3. 頼んだことはやってくれて当たり前だと思う

逆：お礼を言う

## 4. 質問されたら文句を言いながら答える

逆：質問されたら笑顔で答える

## 5. 指摘やアドバイスを全員の前で行う

逆：指摘やアドバイスは必要最小限のコミュニティの中で行う

## 6. 締め切りをちょっとオーバーしても何も言わないでおく

逆：締め切りを守る

## 7. ミスしたときに 言い訳を探す / 認めない / 謝らない

逆：間違いがあれば、それを認めて謝る

## 8. 悪口や噂話をする

逆： 悪口を言ったり、噂話をしない

# まとめ

- **信頼関係を構築するために、まずは崩壊させる方法を知る。**
- **信頼関係が崩壊するとコミュニケーションコストが増える。なので信頼関係は大事。**
【JavaScript】オブジェクトのプロパティ取得・更新

#プログラミング日記
2020年11月6日
オブジェクトのプロパティ取得・更新について

##オブジェクト(連想配列)とは
```script.js
let jsbook = {title: 'JavaScript入門', price: 2500, stock: 3};

```
複数のプロパティを持つ値の集まり。
プロパティ名と値が必要。


##プロパティ、プロパティ名、値


`title: 'JavaScript入門'`・・・プロパティ
`title`・・・プロパティ名
`'JavaScript入門'`・・・値



#プロパティの書き方
プロパティ名：値

```script.js
title: 'JavaScript入門';
```

#プロパティの値を取得する方法


①オブジェクト名.プロパティ名;


```script.js
console.log(jsbook.title);

---出力結果---
JavaScript入門
```



②オブジェクト名['プロパティ名'];
※プロパティ名が数字の場合は、シングルクォートorダブルクォートで囲む必要なし

```script.js
console.log(jsbook['price']);

---出力結果---
2500
```

#プロパティの値を書き換える方法

①オブジェクト名.プロパティ名 ＝ 新しい値;


```script.js
jsbook.price = 3000;
```



②オブジェクト名['プロパティ名'] = 新しい値;


```script.js
jsbook['title'] = 'CSS入門';
```

#全てのプロパティを読み取る(for...in文)
```script.js
let jsbook = {title: 'JavaScript入門', price: 2500, stock: 3};

for(let p in jsbook) {
    console.log(p + '=' + jsbook[p]);
}

---出力結果---
title=JavaScript入門
price=1200
stock=3
```
`for...in文`・・・繰り返し処理が行われるたびに、変数pにプロパティ名が1つずつ代入される。

for...in文の中でプロパティを取得する際は、`オブジェクト名['プロパティ名'];`を使う。
`オブジェクト名.プロパティ名;`で書くと、jsbookオブジェクトのpプロパティとなるため。
取得したいのは、pプロパティではなく、title,price,stockプロパティの`値`である。

`オブジェクト名.プロパティ名;`で書いたときは、以下のように`undefind`になる。

```script.js
let jsbook = {title: 'JavaScript入門', price: 2500, stock: 3};

for(let p in jsbook) {
    console.log(p + '=' + jsbook.p);
}

---出力結果---
title=undefind
price=undefind
stock=undefind
```



#今回の学びと課題
* プロパティの取得・更新方法について。
* for...in文の使い方について。
* プロパティの取得・更新の方法が2種類あるが、使い分けがイマイチ理解できていない。
* オブジェクトのキーの順序が変わる場合がある。







#参考資料
* [JavaScriptプロパティへのアクセス：ドット表記vsブラケット？](https://qastack.jp/programming/4968406/javascript-property-access-dot-notation-vs-brackets)
* [for...inについて](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...in)
* [[JavaScript] オブジェクト/Mapのキーの列挙順は保証されるのか](https://qiita.com/anqooqie/items/ab3fed5d269d278cdd2b)
オブジェクト指向の初学者でもわかる「継承」

# はじめに
オブジェクト指向プログラミングの三大要素って知っていますか？

+ 1. クラス（カプセル化）
+ 2. 継承
+ 3. ポリモーフィズム

この記事では、三大要素の１つである「継承」を解説します。
ポリモーフィズムについては、 [こちら](https://qiita.com/tomonori_hioki/items/d8b1f8a6552c94b3180a "オブジェクト指向の初学者でもわかるポリモーフィズム")の記事で解説しています。

# 継承とは？

一言でいうと、オブジェクト（クラス）の共通点と相違点を整理するためのしくみです。
いわゆる「is-a関係」です。
is-a関係とは、A is a B. のことで、日本語だと「AはBの一種」という意味です。
また、数学の概念では、「全体集合と部分集合」の関係です。

（例）

+ 哺乳類は動物の一種（他にも、魚類や両生類も動物の一種です）
+ イチゴはバラ科の一種（他にも、サクラ、ウメ、モモもバラ科の一種です）

### 補足
@shiracamusさんより「スーパークラスは、共通機能の最小セット」とコメントいただきます。


## スーパークラスとサブクラス

+ スーパークラスとは
    + 全体集合のことです。
    + 前述の例では、「動物」や「バラ科」がスーパークラスに相当します。
    + 全体集合で共通の性質を定義します。
+ サブクラスとは
    + 部分集合のことです。
    + 前述の例では、「哺乳類」や「イチゴ」がサブクラスに相当します。
    + 部分集合で固有の性質を定義します。


# なぜ継承が重要なのか？

+ プログラムの無駄をなくすためです。つまり、プログラム作成の効率性やメンテナンス性が向上します。
    + 例えばクラスA, クラスB, クラスCに同じメソッドがあったとします。
    + そのメソッドを修正する必要があったとき、クラスA, クラスB, クラスCの3箇所を修正しなければいけません。
    + 上記は無駄な作業です！（プログラム修正、テスト実施の工数が発生します）
+ 必ず持たせたい機能（メソッド）をスーパークラスで定義しておけば、そのスーパークラスを継承した全サブクラスに同じ機能を持たせることができます。
    + 全てのクラスのスーパークラスであるObjectクラスには、文字列化するtoStringメソッドが定義されています。
    + 「ポリモーフィズム」にも通じる概要です。


# 継承の具体的なプログラミング例

### プログラム概要

+ じゃんけんプログラムです。
+ じゃんけんのプレイヤーは人とロボットです。
    + プレイヤーをスーパークラス、人とロボットをサブクラスとします。
    + プレイヤーの動作（じゃんけんするjankenメソッド）をスーパークラスで共通化しています。
+ 人とロボット、どちらもじゃんけんできます（jankenメソッドを呼び出せます）。

### スーパークラス
```java:Player.java
public class Player {
    public void janken() {
        // じゃんけんの処理
    }
}
```

### サブクラス

形式：サブクラス名 + extends + スーパークラス名

```java:Person.java
public class Person extends Player {
    // 省略
}
```
```java:Robot.java
public class Robot extends Player {
    // 省略
}
```

### メインクラス

```java:MainClass.java
public class MainClass {

    public static void main(String[] args) {

        Person person = new Person();
        Robot robot = new Robot();
        
        // じゃんけんする
        person.janken();
        robot.janken();
    }
}
```


# まとめ

### 継承とは？
+ クラスの共通点と相違点を整理するためのしくみです。
    + スーパークラス
        + 全体集合
        + 共通点を定義するクラス
        + is-a関係(A is a B.)の「B」に相当するクラス
    + サブクラス
        + 部分集合
        + 相違点を定義するクラス
        + is-a関係(A is a B.)の「A」に相当するクラス

### なぜ継承が重要なのか？
+ プログラムの無駄をなくすためです。
+ プログラムの修正やテストにかかるコストを減らせるためです。これは、実務では非常に重要な観点です。


# 参考文献
+ オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向をもっと勉強したい方は一読をオススメします。
Amazonでも購入できます。
Windows10の便利機能

## ウィンドウサイズ変更
**ウィンドウを見比べて作業したい！**
そんなアナタにオススメなのがコレ。
右寄せ、左寄せがとっても簡単にできますよ。

|機能 |ショートカット  |
|---|---|
|右寄せ|Win + →|
|左寄せ|Win + ←|
|最大化|Win + ↑|
|最小化|Win + ↓|
|元のサイズに戻す|Win + ↓|

## アクティブウィンドウ以外最小化
**アクティブウィンドウにデスクトップ上にあるファイルをドラッグしたい！**
そんなアナタにオススメなのがコレ。

|機能 |ショートカット  |
|---|---|
|アクティブウィンドウ以外最小化|Win + Home|

アクティブウィンドウを上下や左右に素早く振ることでも、それ以外のウィンドウがすべて最小化されます。
もう一度素早く振ると元に戻ります。

## 仮想デスクトップ
**画面が狭くて複数のウィンドウやアプリが重なってしまう！**
そんなアナタにオススメなのがコレ。
作業内容ごとにデスクトップを分けることで画面を広く利用できます。

|機能 |ショートカット  |
|---|---|
|新しいデスクトップ|Win + Ctrl + D|
|デスクトップ閉じる|Win + Ctrl + F4|
|デスクトップ切り替え|Win + Ctrl + →|
|デスクトップ切り替え|Win + Ctrl + ←|
|タスクビュー|Win + Tab|

タスクバーの「タスクビュー」ボタン（表示されていない場合は、タスクバーを右クリック→「タスクビューボタンを表示する」をクリック）をクリックし、表示されるタスクビュー画面からも利用できます。

## クリップボードの履歴
**さっきコピーしたテキストをペーストしたい！**
そんなアナタにオススメなのがコレ。

|機能 |ショートカット  |
|---|---|
|クリップボードの履歴|Win + V|

初めて利用する場合は機能が有効になっていません。
有効にするボタンをクリックしましょう！

![clipbord_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/7bbf592e-0d21-aeea-42f5-5602568fa9d6.png)

有効にするとコピーしたテキストが一覧となって表示されます。

![clipbord_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/ab1792d3-3a2e-9580-07ed-9077e0812bb8.png)

### Clibor
「クリップボードの履歴」も便利なのですが、定型文の登録ができる [Clibor](https://chigusa-web.com/) のほうが一枚上手です。

## 画面キャプチャ
**画面をキャプチャしたい！**
そんなアナタにオススメなのがコレ。

### 画面の一部
「切り取り＆スケッチ」アプリが起動します。
キャプチャしたい範囲を指定することができます。

|機能 |ショートカット  |
|---|---|
|画面キャプチャ|Win + Shift + S|

### 任意のウィンドウ

|機能 |ショートカット  |
|---|---|
|画面キャプチャ|Alt + PrintScreen|

### 全画面

|機能 |ショートカット  |
|---|---|
|画面キャプチャ|Win + PrintScreen|

## 画面録画キャプチャ
**画面を録画したい！**
そんなアナタにオススメなのがコレ。

|機能 |ショートカット  |
|---|---|
|動画キャプチャ|Win + G|

## ロック画面を表示
**離席する時は画面を見られたくない！**
そんなアナタにオススメなのがコレ。

|機能 |ショートカット  |
|---|---|
|ロック画面を表示|Win + L|
VMware VMotionについて

VMware VMotion
 サービスの中断なしで仮想マシンのライマイグレーションを実現

【概要】
　VMware VMotionを使用すると、実行中の仮想マシンを別の物理サーバへ移行して、IT環境のメンテナンスをダウンタイムなしで行うことができる。
　また、可用性が継続され、完全なトランザクションの整合性が維持されます。
　VMotionは、自己最適化が可能で、自動化された動的なデータセンターを構築するためのテクノロジーです。

【メリット】
　ビジネスの運用を中断せずにメンテナンスを行うことで可用性を向上。
　サーバリソースプール内で仮想マシンを移行し、ビジネス上の優先順位に従ってリソースを継続的に調整。


・VMware　VMotionを使用すると、次のことが可能になります。
　計画的ダウンタイムなしでハードウェアメンテナンスを実行
　障害が発生したサーバやパフォーマンスが低下しているサーバから、仮想マシンをプロアクティブに移行
　最適なハードウェア使用率を実現し、ビジネス上の優先順位に合わせるため、全てのリソースプールの最適化および割り当てを自動化

![スクリーンショット 2020-11-06 16.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580357/7d319b5f-ccf5-641f-2155-27cd22f3c624.png)
Line LIFFまわりメモ

#Line LIFFというものがあるらしい
　line内でアプリを起動できるものらしい。
　もともとはMessaging APIで作ったbotからでも作成できたぽいけど、いつかのアップデートで不可能になったよう。
　Line ログインというものになったらしい。
　（参考：https://developers.line.biz/en/news/2019/11/11/liff-cannot-be-used-with-messaging-api-channels/）

#備忘録
・LIFFの公式ドキュメント
　https://developers.line.biz/ja/docs/liff/overview/#operating-environment

・LIFFを使ったサービス例
　https://saichat.jp/line/liff/

・LIFFスターターキットGithub
　https://github.com/line/line-liff-starter

・やってみた系
　謎解き作ってみた：
　https://qiita.com/kyamamoto9120/items/433c996ef4656825a7e1
　予約フォーム作ってみた：
　https://qiita.com/yagi_eng/items/5dce5527dc5d6a6e9833
ファーストガンダムの名言で振り返るデブキャンとDockerと私

#なぜこうもDockerに振り回されるのか
弊社で定期的に行われています日帰り開発合宿(デブキャン)に久しぶりに参加しました。
最近は音楽活動(下手の横好き)が忙しく、休日の開発活動は本当に久しぶりです。

Dockerを使ってDjango環境を構築しようかと考えて奮闘しましたが、Dockerfileと
docker-compose.ymlの違いに混乱したり、無理にPyenvも取り入れようとしたりで
散々な結果です。
Dockerというものを理解しているようで、実は浅くしか理解していなかった
自分に猛省しつつ、最終的はEC2環境に直にDjango環境を構築する始末。

>殴られもせずに一人前になった奴がどこにいるものか!(ブライト・ノア)

ここからはDockerについて再勉強した自分の備忘録のようなものをつらつらと書いていきます。

##Dockerコンテナ(コンテナ) ≠ VirtualMachine(VM)
当たり前ですが、DockerはVirtualMachineとは原理や思想が異なりますし、
使用されている技術も大きく異なります。
コンテナはホストOSのカーネルを始めメモリやストレージも共有するのに比べ、
VMはそれぞれ別に(仮想的に)専有するイメージです。
コンテナはシェアハウスでキッチン・バス・トイレ共同、VMはアパートの一室で
キッチン・バス・トイレは個別みたいな感じですね。

>ザクとは違うのだよ、ザクとは！(ランバ・ラル)

##コンテナは別のコンテナと簡単につながる
コンテナ双方のネットワークはLinux系OSのカーネルが持つNameSpaceや仮想
NIC、仮想アダプタ(ルーター)の機能で実現することができます。
仮想という言葉がポイントで自由に追加・変更・削除できる点が非常にフレキシ
ブルで素晴らしいです。
コンテナ間の通信はDockerのもつ機能だと勘違いしておりました(汗)。

>坊やだからさ(シャア・アズナブル)

##コンテナは管理が楽
不要なコンテナは停止する、必要なコンテナはgitからイメージをcloneして起動する、なんて便利なんでしょう。
先のNameSpaceのおかげで他の領域を汚染しない作りも非常にありがたいです。

>こんなに嬉しいことはない(アムロ・レイ)

##今回の反省
結局大半の時間をDockerの勉強に費やしたデブキャンとなりました。

>俺だって前の俺とは違うんだ　引かねえぞ(カイ・シデン)

次回は思いのままにDockerを使いこなしてDjangoの環境を構築するゼッ！

##謝辞
大変勉強になりました。
- [世界一わかりみが深いコンテナ & Docker入門](https://tech-lab.sios.jp/archives/18811)
- [Docker入門](https://knowledge.sakura.ad.jp/13265)
Laradock+Laravelで開発する時のPhpStormのCLI Interpreter設定

## 概要

dockerとか仮想環境に開発環境があるとPhpStormと実行環境が異なるためインタプリタの設定しないと1クリックでテスト走らせたりとかPhpStormの便利機能いろいろ使えないのでちゃんと設定する

## 設定

公式ドキュメント参考に設定します。
https://pleiades.io/help/phpstorm/configuring-remote-interpreters.html

`⌘,`で設定を開き、`Languages & Frameworks`の`PHP`を開く
![スクリーンショット 2020-11-06 15.26.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/0da189e2-cf17-dc53-be70-de2ab3385593.png)

`CLI Interpreter`を新規作成して設定する
`...`ボタンから`CLI Interpreters`のウィンドウを開いて新規追加します。`From Docker, Vagrant...`という仮想環境の実行環境を作成できるやつがあるのでそれを選びます。
（`/usr/bin/php`とかは自分の開発マシンの物理環境にあるバイナリです。`docker`とか使わずに直接マシンにホストしたりする場合にはそちらを使います。）
![スクリーンショット 2020-11-06 15.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/5ec7dc67-2f0c-38be-2ef5-0a1f6f050b0d.png)

`Configure Remote PHP Interpreter`のウィンドウが出ます。↓
![スクリーンショット 2020-11-06 15.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/06bda094-165e-d34f-c415-442ea4a9e800.png)

`Server`を`NEW...`から追加↓
![スクリーンショット 2020-11-06 15.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/abeb70ab-203e-dcef-4b9b-eae41782c63a.png)

`Configuration File`には`Laradock`の`docker-compose.yml`を設定し、`Service`に`workspace`を指定
![スクリーンショット 2020-11-06 15.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/ea88b7c4-adba-98ee-5042-0350916ffaf2.png)

`workspace`という名前の`CLI Interpreter`が作成されます。

![スクリーンショット 2020-11-06 16.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/d75b6f0c-4984-267b-09a8-f66ddee5d990.png)

最初の`Language & Framework > PHP`の設定に戻り、`workspace`をCLI Interpreterとして設定

![スクリーンショット 2020-11-06 16.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/54503642-a64e-dac3-2829-b21be1e9e3e5.png)

`Languages & Frameworks > PHP > Test Frameworks`の設定
`PHPUnit by Remote Interpreter`を選びます
![スクリーンショット 2020-11-06 16.11.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/db048e4e-46de-c892-6c16-4af573b12599.png)

さっき作成した`workspace`を指定します。

![スクリーンショット 2020-11-06 16.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/9b240bf2-8abb-a5f3-669d-ba2af6661513.png)

`Path mappings`でプロジェクトのルートディレクトリを指定します
![スクリーンショット 2020-11-06 16.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/65355162-8bc8-59cf-9ec9-7c0d9da5e833.png)


`PHPUnit library`で`Use Composer autoloader`を選択し、`Path to script`に`vendor/autoload.php`を指定します。
設定して更新ボタン（リサイクルマークみたいなやつ）を押すと`PHPUnit version:x.x.x`が表示されます。
![スクリーンショット 2020-11-06 16.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/eeda7545-b3e8-2f22-09b2-6a91ce9f79ba.png)

ここまでで設定が完了です。

## エディタからテスト実行してみる

テストコードをPhpStormで開くとクラス宣言、function宣言の左の方に緑色の矢印があるのでそれをクリックしてテストを実行できます。
![スクリーンショット 2020-11-06 16.43.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/6e55fcb2-ec42-27a8-37b3-416e021f8773.png)

実行結果
![スクリーンショット 2020-11-06 16.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192321/fde28be3-5334-9a40-97fe-84337b209161.png)

いちいちターミナルに行かなくてもテストを走らせながら開発できるようになりました。