OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerfile まとめ

## 目次
1. [Dockerfileとは?](#1-dockerfileとは)
1. [Dockerfileの記述方法](#2-dockerfileの記述方法)
1. [いろいろな例](#3-いろいろな例)

## 1. Dockerfileとは?

Dockerイメージの作成に使用するファイル。
「docker build」を使用してイメージを作成できる。

```powershell
# 構文フォーマット
$ docker build -t 作成するイメージ名 Dockerfileがあるフォルダのパス
```

## 2. Dockerfileの記述方法

### Dockerfileコマンド

|コマンド|内容|
|:----|:---|
|FROM|元にするイメージを指定する|
|ADD|イメージにファイルやフォルダを追加する(リモートからもファイル追加できる, 圧縮ファイルが自動解凍される)|
|COPY|イメージにファイルやフォルダを追加する(リモートからのファイル追加はできない, 圧縮ファイルは自動解凍されない)|
|RUN|イメージをビルドするときにコマンドを実行する|
|CMD|コンテナを起動するときに実行する既定のコマンドを指定する|
|ENTRYPOINT|イメージを実行するときのコマンドを強要する|
|ONBUILD|ビルド完了したときに任意の命令を実行する|
|EXPOSE|通信を想定するポートをイメージの利用者に伝える|
|VOLUME|永続データが保存される場所をイメージの利用者に伝える|
|ENV|環境変数を定義する|
|WORKDIR|RUN,CMD,ENTRYPOINT,ADD,COPYの際の作業ディレクトリを指定する|
|SHELL|ビルド時のシェルを指定する|
|LABEL|名前やバージョン番号、製作者情報などを設定する|
|USER|RUN,CMD,ENTRYPOINTで指定するコマンドを実行するユーザーやグループを設定する|
|ARG|docker buildする際に指定できる引数を宣言できる|
|STOPSIGNAL|docker stopする際にコンテナで実行しているプログラムに対して送信するシグナルを変更する|
|HEALTHCHECK|コンテナの死活確認をするヘルスチェックの方法をカスタマイズする|

```dockerfile
# 記述例
# Apacheの場合
FROM httpd
COPY index.html /usr/local/apache2/htdocs/
```

## 3. いろいろな例

追加予定。
【個人開発】ラーメン二郎に特化した口コミ・情報アプリ

# はじめに
ラーメン二郎に特化した口コミ・情報アプリとして『__ラーメン二郎 information__』を開発しました！

- ラーメン二郎に行ってみたいけどルールが複雑そうで不安…
- 量が多くて食べ切れるか分からない…
- 店によって味が様々で好みなので，好みの店を探したい…  

このような不安を解消し，気軽にラーメン二郎を楽しんでもらいたいと考え，『__ラーメン二郎 information__』を開発しました！
https://www.ra-men-jiro-information.com/

# サービス概要
ユーザーからの口コミをもとにデータを集計し，様々な機能を展開しています。主な機能は以下の通りです。
1. 口コミ投稿
2. おすすめ店舗診断
3. ランキング
4. 訪問履歴

### 1.口コミ投稿
こちらはラーメン二郎に行った方が，そのラーメンの感想をレビューするというお馴染みの機能です。
特徴としては，「"文章を必要としない"口コミ」を行うことが可能である，ということです。
以下は実際のレビュー画面です。
![スクリーンショット 2021-10-14 7.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660423/dc12c238-024c-fa79-dd8f-8446e739b2e4.png)
画面下部に「量，スープの状態…」等の選択肢が見えると思います。この選択肢がそのままレビューとなっています。
なぜ選択肢方式にしたか，それは__レビューの手間を軽減するため__です。
一般的にレビューは文章で書き込まれています。文章で記述することで，分かりやすく，他人に理解してもらえる感想を書くことが可能です。
しかし，文章をレビューの度に考えるのは大変ですし，実際に多忙でレビューが更新されなくなった方も多数います。
このような現状を踏まえて，選択肢によるレビュー方式を採用しました（もちろん文章によるレビューも可能です）。

### 2. おすすめ店舗診断
こちらは複数ある項目を選択して，好みにあったラーメン二郎を診断する機能です。
以下は診断機能の画面です。
![スクリーンショット 2021-10-16 23.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660423/f1d5dc70-c2f9-68a5-42ae-e15d1aefd940.png)
各診断項目につき4つの選択肢が存在し，店舗が絞り込めた時点でその店舗を表示します。
また，好みにぴったり一致する店舗が無かった場合でも，好みに近い店舗をおすすめします。

### 3. ランキング
全店舗のラーメンの特徴をランキング化して，一覧で閲覧することができます。また，全ユーザーの訪問回数を競うランキングも実装しています。
![スクリーンショット 2021-10-31 9.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660423/7a096760-ea2d-aaa0-d01f-7180e10a3323.png)

### 4. 訪問履歴
口コミ投稿を基に，訪問したラーメン二郎の履歴を保存する機能です。
ラーメン二郎は全国に40超の店舗が営業しています（2021年10月現在）。各々の店舗で味や素材が異なるため全店舗に訪問する方して好みの店舗を探す方もいらっしゃいます。そのような際に，一目で訪問した店舗が分かるように訪問履歴を実装しました。スタンプ形式で実装したため，徐々に訪問店舗が埋まっていくことはモチベーションの向上にもつながります。
![スクリーンショット 2021-10-31 9.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660423/eaf78a7b-c7f7-3c30-8484-3d255e4c5ca5.png)

# ER図
![ポートフォリオ　ER図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660423/f3988ec0-6a08-95c5-1cb6-36c7e051edbd.png)

# 使用技術
### バックエンド
Ruby 2.6.6
Rails 6.0.3.6
### フロントエンド
HTML
CSS(SCSS)
JavaScript(jQuery)
bootstrap4
### 主要なGem
devise(ログイン)
activeadmin (管理画面)
ransack(検索)
carrierwave(画像投稿)
###デプロイ
Heroku
# 今後実装したいこと
### 画像の複数投稿を可能にする
現在は，画像は1枚のみの投稿となっています。これを複数投稿を可能にして，レイアウトも合わせて変更します。
### AWSにデプロイする
サーバーがHerokuの無料プランなので，AWSにデプロイする予定です。
### 二郎インスパイアバージョンを作成する
ラーメン富士丸やラーメン荘，千里眼，用心棒等，たくさんのインスパイア店が存在します。今後はこのようなインスパイア店にも対応できるように改善していきます。

# 終わりに
ポートフォリオではございますが，自分で一からサービスを作成することの難しさ，大変さを実感しました。その分，他の人に使ってもらえる，褒めてもらえる嬉しさも実感できました。
今後も技術を追求し，より良いサービスを実装できるように努力します。
https://www.ra-men-jiro-information.com/
Docker コンテナ・ホスト間のファイルコピー、ボリュームのマウント


## 目次
1. [コンテナとホスト間のファイルのコピー](#1-コンテナとホスト間のファイルのコピー)
1. [ボリュームのマウント](#2-ボリュームのマウント)

## 1. コンテナとホスト間のファイルのコピー

### コンテナへコピーする(ホスト→コンテナ)

```powershell
# 構文フォーマット
$ docker cp ホスト側パス コンテナ名:コンテナ側パス

# 例:Apacheコンテナを作成して、TOPページを変更してみる

# 手順1:Apacheコンテナの作成
$ docker run --name apa000ex19 -d -p 8089:80 httpd

# 手順2:cpコマンドを実行してホストからコンテナへindex.htmlをコピー
$ docker index.htmlまでのパス apa000ex19:/usr/local/apache2/htdocs

# 手順3:index.htmlがトップページに変わる
# http://localhost:8089/ にアクセス
```

### コンテナからコピーする(コンテナ→ホスト)

```powershell
# 構文フォーマット
$ docker cp コンテナ名:コンテナ側パス ホスト側パス

# 例:Apacheのコンテナにあるindex.htmlをホスト側にコピーする
$ docker cp apa000ex19:/usr/local/apache2/htdocs/index.html ホスト側パス
```

## 2. ボリュームのマウント

**ボリュームとは?**
ストレージの1領域を区切ったもの。(ハードディスクやSSDの区切られた1領域)

**マウントとは?**
対象を接続して、OSやソフトウェアの支配下に置くこと。(USBメモリなど)

### ボリュームマウント
DockerEngineが管理している領域内にボリュームを作成し、ディスクとしてコンテナにマウントすること。
直接操作しづらいため、仮で使いたい場合、設定ファイルなどを置くのに使用する。

### バインドマウント
PVのドキュメントやデスクトップなど、DockerEngineの管理していない場所の既に存在するディレクトリをコンテナにマウントすること。
フォルダに対して直接ファイルを操作できるため、頻繁に触りたいファイルは、ここに置く。

### 記憶領域のマウント手順

#### 1. ボリューム(記憶領域)を作成する

```powershell
# ボリュームマウントの場合は、以下の通り
# ボリューム作成
$ docker volume create ボリューム名
# ボリューム削除
$ docker volume rm ボリューム名

# バインドマウントの場合は、あらかじめ自分のPCにフォルダやファイルを用意する
```

#### 2. マウントする(コンテナを作成する)

```powershell
# ボリュームマウント
docker run (省略) -v ボリューム名:コンテナの記憶領域パス (省略)

# バインドマウント
$ docker run (省略) -v 実際の記憶領域パス:コンテナの記憶領域パス (省略)
```

### ボリュームマウントの例

```powershell
# Apache 例

# マウントするボリュームを作成する
$ docker volume create apa000vol1

# runコマンドでApacheコンテナを起動する
$ docker run --name apa000ex21 -d -p 8091:80 -v apa000vol1:/usr/local/apache2/htdocs httpd

# volume inspectでボリュームの詳細情報を表示
$ docker volume inspect apa000vol1
```

### バインドマウントの例

```powershell
# マウントするフォルダ/ディレクトリを作成しておく

# runコマンドでApacheコンテナを起動する
$ docker run --name apa000ex20 -d -p 8090:80 -v マウントするフォルダのパス httpd

# Apacheに接続してみる
# http://localhost:8090/

# マウントしたフォルダ/ディレクトリにindex.htmlを置く
#　再びhttp://localhost:8090/にアクセスすると、表示が変わっているはず
```
<Java学習中>演算子と変数

今回は演算子を用いた計算とそれに伴い変数の勉強してきました。


演算子は大きく分けて３つあり、それぞれ

「算術演算子」
「代入演算子」
「関係演算子」

があります。

・「算術演算子」は四則計算で用いられる "+" , "-" , "*" , "/"を使って計算するためのものを指します。中には商の余りを表示する "%" もありました。

・「代入演算子」は数値や計算結果を「変数」に代入するための演算子で "=" がそれにあたります。後ほど、変数の説明で使います。

・「関係演算子」は大きい、小さい、等しいなど２つの数値の関係を判断する演算子。算術演算子のように数値同士の計算結果を出すのではなく、それらの関係が正しいか否かを判断するために扱われます。
関係演算子には色々と種類があり、
"=="なら等しい
"!="なら等しくない
">" , "<" なら左辺は右辺より大きい（小さい）
">=" , "<=" なら左辺は右辺以上（以下）
となります。
関係演算子も後ほど、変数の説明で使います。


次は「変数」です。
変数は非常に重要な概念で、Javaのみならずプログラミングする上で必要不可欠です。
変数とは「箱」のようなものであり、変数に数値を代入するというのは、数値というデータをその「箱」に入れておくということです。ただし変数そのものと代入した数値は等しいというわけではありません。

実際に変数を使ってみます。

```java
class Main{
    public static void main(String[] args){
       int x;
       x = 6;
       System.out.println("変数xに入っているのは " + x);
    }
}
```
```text:実行結果
変数xに入っているのは 6
```
int x;　の部分は「変数宣言」といいます。
まず変数を扱うには「型」の概念を知る必要があります。これから作る変数がどのデータの種類を扱うのかを示す必要があります。この場合で言うデータの種類とは int の部分のことでintは整数を使用する変数の型となります。整数を扱うモードみたいなものですかね。
次に変数の名前を決めます。数字や記号以外で名付けることが出来ます。

これで、int型を扱う x という変数を用意したことになりました。

次に行われた x = 6;  は代入と言います。
上でも説明した、変数という名の「箱」にデータを入れることですね。代入の見方は右から左です。
用意した変数 x に代入演算子"="を使って整数のデータ 6 を代入しました。

次に　System.out.println(x);　では 変数x の中身を見せてくれと命令しています。これで一連の流れが終わりました。

最後に、変数宣言をした後、初めてその変数に値を代入することを初期化と呼びます。初期化と言えば全てが最初の状態に戻るという意味で今まで見てきましたが、ことプログラミングにおいては意味が違うのでしっかり覚えたいとですね。



今回はここまで。ありがとうございました！
間違っていることがあれば、ツッコミお待ちしております。
+ - * / は代数演算子，じゃない

Ruby の初心者向け記事で `+`，`-`，`*`，`/` を「代数演算子」と書いているものをときどき目にしますが，これらは正しくは「算術演算子」です。英語だと arithmetic operators ですね。

なぜ「代数演算子」という誤った用語が広がっているのか分かりませんが，PHP のリファレンスマニュアルでなぜか「代数演算子」となっているので，PHP 界から Ruby 界に入ってきたのかもしれません：
[PHP: 代数演算子 - Manual](https://www.php.net/manual/ja/language.operators.arithmetic.php)

上記ページでは冒頭に

> 学校で習った基礎代数を憶えていますか?

とも書かれています。

この英語版は，タイトルが

> Arithmetic Operators ¶

となっており，冒頭の文も

> Remember basic arithmetic from school?

です。

単なる誤訳ではないでしょうか。arithmetic と algebraic を混同しているような気がします：

|  英語 |  日本語  |
| ---- | ---- |
|  arithmetic  |  算術（の）  |
|  algebraic  |  代数の  |

# 追記（2022-01-01）

その後，PHP のリファレンスマニュアルは修正されました。
https://github.com/php/doc-ja/pull/30
binding.pryでのエラーに関して

#### binding.pryとは
railsで使用されるデバッグツール。Gemでのインストールが必要。
Gemfileに下記コードを記載して、bundle installを実行する。

```
gem 'pry-rails'
```
#### binding.pryの使い方
binding.pryを下記のように挿入したい箇所に記述。

```rb:users.controller
def index
 @user = User.all
 binding.pry
end
```
サーバーを起動すると挿入された箇所で処理が停止しコンソールが出現。
インスタンス変数の値を確認することが出来る（この例では@user）。

``` 
　 5  def index
 ⇒6   @user = User.all
 　7  binding.pry
[1]pry(#<usersController>)
```
#### エラーに関して
もし、構文エラーで下記のようにendが抜けていると、構文エラーで全体の処理が停止するため、
binding.pry自体も機能しないため注意が必要です。

```rb:users.controller
def index
 @user = User.all
 binding.pry
```
C++11 or later で typeid 相当を実装するメモ

## 背景

新規アーキテクチャや特殊アーキテクチャで RTTI(runtime time information)が使えない.
(e.g. CUDA のデバイス側コードなど)

でも `typeid()` っぽいの使いたい...
(`std::any` っぽいのの実装に役立つ)

## 方法

RTTI を使わずに Boost.Any を実装する方法
https://melpon.hatenadiary.org/entry/20090514/1242198204

ありがとうございます.

最近だと `std::type_info`, `typeid` 相当は TypeIndex 関連にリネームしています.
コアとなる部分はここでしょうか.

https://github.com/boostorg/core/blob/develop/include/boost/core/typeinfo.hpp


あとは type_index あたりソースコード解析すればいけるはずです!

https://github.com/boostorg/type_index/tree/develop/include/boost

コンパイル時にテンプレートで型文字列や型id つくっているっぽ? :thinking:
【Rails】try / try! / &.ぼっち演算子

##try

定義してないメソッドに対してnilを返す

```ruby
User.first.try(:email)
# => "abc@gmail.com"
User.first.try(:aaa)
# => nil
nil.try(:email)
# => nil
```

##try!

定義してないメソッドに対してNoMethodErrorを返す

```ruby
User.first.try!(:email)
# => "abc@gmail.com"
User.first.try!(:aaa)
# NoMethodError: undefined method `aaa' for #<User:0x000055eafbb7a4d0>
nil.try!(:email)
# => nil
```

##&.

基本的にtry!と同じ挙動

```ruby
Employee.find_by(firstname: 'コナン')&.email || 'コナンというユーザーは存在しません'
# => "conan@gmail.com"
Employee.find_by(firstname: 'コナン')&.email || 'コナンというユーザーは存在しません'
# => "コナンというユーザーは存在しません"
Employee.find_by(firstname: 'コナン')&.aaa
# NoMethodError: undefined method `aaa' for #<User:0x000055eafb23fc30>
```

##参考

https://pikawaka.com/rails/try
GitHubのIssueから直接Issueを生成する機能「Convert to issue」について

## タスクリストの便利な機能
Issueコメントのタスクリストに他のIssueを紐付ける場合、通常は下記の手順を踏みます。
1. Issueのコメントにタスクリスト( -[ ] )でタスクを列挙する。
2. Issueの一覧画面に戻り、「New issue」でタスクのIssueを作成して、Issue番号を控える。
3. 1のIssueに戻り、コメントを再編集してタスクリストに２で作ったタスクのIssue番号を記述する。
他のIssueの紐付けは便利な機能ですが、タスクの数が多くなると上記の作業を何度も繰り返すため非常に面倒です。
そこで本記事では、GitHubから用意されているIssueから直接Issueを生成する機能「Convert to issue」を紹介します。
この機能を使うことで、1のIssueから直接Issueを生成することができるようにます。

## Demo動画
実際の操作風景は次の通りです。
![ConvertToIssue.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890567/9954c318-3b4d-5bb1-e872-3cc282d6dded.gif)

## 操作方法
1. Issueのコメントにタスクリスト( -[ ] )でタスクを列挙する。
![スクリーンショット 2021-11-12 18.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890567/e0779841-a0f5-d33d-a279-f1e37b71eb51.png)
![スクリーンショット 2021-11-12 18.58.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890567/4f7a5f8a-0cb6-95c1-01a8-ba84ae085995.png)

2. 各タスクをマウスでホバーすると、右端に丸いアイコンが表示されるので、これをクリックする。
![スクリーンショット 2021-11-12 18.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890567/315e293d-f456-43f5-fa31-b9f77799c24e.png)
以上！
すると、自動的にIssueが生成されてIssue番号も自動的に記入されて紐付けされます。
![スクリーンショット 2021-11-12 19.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890567/d20eea74-c584-6798-a1d3-191ada779063.png)

あとは、自動生成されたIssueの詳細を編集すれば完了です！
PHPのループ処理でcontinue、breakを使ってみましょう☆

#☆continue☆
<br>

特定の処理の時にループをスキップするには

continueを使っていきます！

以下のfor文があったとします。
<br>


```php:index.php
for ($i = 1; $i <= 5; $i++) {
    echo $i . PHP_EOL;
}
```
<br>
ターミナルに以下を入力します！
<br>

```
~$ php index.php
```
<br>
１〜５が出力されます！
<br>

```
~ $ php main.php
1
2
3
4
5
~ $ 
```
<br>

2だけとばしたいので continue を使います！
<br>

```php:index.php
for ($i = 1; $i <= 5; $i++) {
    if ($i === 2) {         //　2のとき
    continue;
    }
    echo $i . PHP_EOL;
}
```
<br>
ターミナルで同じく以下を実行すると...
<br>

```
~$ php index.php
```
<br>
2だけとばされました！
<br>

```
~ $ php main.php
1
3
4
5
~ $ 
```


#☆break☆
<br>
次はループを抜けたる為の break を使っていきます！

最初のfor文にbreakを追加します。
<br>

```php:index.php
for ($i = 1; $i <= 5; $i++) {
    if ($i === 3) {      //3になったら抜ける
    break;
    }
    echo $i . PHP_EOL;
}
```
<br>

ターミナルに以下を入力します！
<br>

```
~$ php index.php
```
<br>
3になると処理が終わりました！
<br>

```
~ $ php main.php
1
2
~ $ 
```


<br>

処理をスキップする方法と、抜ける方法でした！

<br>
論文メモ：Multi-Person Pose Estimation with Enhanced Channel-wise and Spatial Information

# 論文
**論文名**
*Multi-Person Pose Estimation with Enhanced Channel-wise and Spatial Information*

**著者**
*Kai Su, Dongdong Yu, Zhenqi Xu, Xin Geng, and Changhu　Wang.*

**学会**
*CVPR2019*

https://openaccess.thecvf.com/content_CVPR_2019/html/Su_Multi-Person_Pose_Estimation_With_Enhanced_Channel-Wise_and_Spatial_Information_CVPR_2019_paper.html


# 概要
　異なるレベルの特徴マップに対してシャッフル操作を行い、ピラミッド型の特徴マップ間の情報伝達を促進できるChannel Shuffle Module:CSMと、特徴マップの空間・チャンネル的文脈を強調することができるSpatial Channel-wise Attention Residual Bottleneck:SCARBの提案。COCO keypointベンチマークでSOTA達成。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/7246bf5b-dbf0-1cbc-f42b-3f1ba72c6173.png', width=500>
>Kai Su, Dongdong Yu, Zhenqi Xu, Xin Geng, and Changhu Wang. Multi-person pose estimation with enhanced channelwise and spatial information. In CVPR, pages 5674–5682, 2019.

# 貢献
- 低レベル特徴マップと高レベル特徴マップ間の情報通信を強化できるCSMの提案
- 空間的、チャンネル的に融合された特徴を適応的に強化するSCARBの提案
- COCO keypointベンチマークでSOTA

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/2a8da8f8-b44e-e3c8-5fc5-99e631cb2a73.png', width=400>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/f71f7cdd-c7e7-6b2a-d5b6-aec2f1b211bb.png', width=400>

>Kai Su, Dongdong Yu, Zhenqi Xu, Xin Geng, and Changhu Wang. Multi-person pose estimation with enhanced channelwise and spatial information. In CVPR, pages 5674–5682, 2019.

# 評価
- COCO test-devにおいてSOTA
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/12db5f93-268e-952d-7b28-96087151896b.png', width=600>

>Kai Su, Dongdong Yu, Zhenqi Xu, Xin Geng, and Changhu Wang. Multi-person pose estimation with enhanced channelwise and spatial information. In CVPR, pages 5674–5682, 2019.
【Rails】whereに配列を指定できる話

```
where(number: [配列])
```

発行されるSQLは「WHERE IN」の形になる。

```ruby
 User.where(number: [1, 2])
=>   User Load (0.9ms)  SELECT `users`.* FROM `users` WHERE `users`.`number` IN (1, 2)
[#<User:0x000055eafc265790
  id: "XXXXXXXX",
  number: 1,
  firstname: "コナン",
  lastname: "江戸川",
  email: "conan@gmail.com">,
 #<User:0x000055eafc2656c8
  id: "YYYYYYYYY",
  number: 2,
  firstname: "平次",
  lastname: "服部",
  email: "heiji@gmail.com">]
```
PowerAutomateで件数制限なしにテーブルのデータを読み取る

Power Automateを使えばSPOやOnDriveで管理されているExcelファイルを開いて内容を読み込むことができます。
データ取得のためしばしば利用するアクションは "テーブル内に存在する行を一覧表示" です。
数件から数十件のデータを扱っているうちはこれでよいのですが、数百件数千件のデータを扱い始めるとすぐに問題が生じます。

# Problem

PowerAutomateにおける他の複数データ処理系アクションと同じく、 "テーブル内に存在する行を一覧表示" にも処理できる件数の上限があります。他の方の記事でも言及されている通り、設定やライセンスにもよりますが、ようするに上限があることに変わりありません。数百数千件のデータ処理のシーンでこの制限があることは煩わしいものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/09169c55-d6ae-b7d4-92d9-de62d8515182.png)

# Solution

解決策には  "テーブル内に存在する行を一覧表示" の改ページ設定を用いるものや、 "Do Until" アクションを用いるものなども考えられますが、「目的のためには手段を選ばない」ということならば、 "スクリプトの実行" による解決策の採用も選択肢に入ってきます。

まずスクリプトを作成します：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/1afe9570-fb17-4966-b091-af63b21a98b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/5470ce68-4978-2b70-7a30-17fc1580027f.png)

```ts
function main(workbook: ExcelScript.Workbook, tableName: string)
{
  const table = workbook.getTable(tableName);
  const columns = table.getColumns().map(c => c.getName());

  return JSON.stringify(
    table.getRangeBetweenHeaderAndTotal().getValues().map(row => {
      const map = {};
      columns.forEach((colName, colIdx) => {
        map[colName] = row[colIdx];
      });
      return map;
    })
  );
}
```

`main` 関数内では、引数で名前指定されたテーブルからすべてのレコード（ヘッダーと集計行を除く）を取得しています。
このままではまだ二重配列です。

イメージ： `[ [ "R1C1 value", "R1C2 value", "R1C3 value" ], [ "R2C1 value", "R2C2 value", ... ], ... ]`

これでよければ `map()` 関数呼び出しは不要で `JSON.stringif()` に結果を渡すだけで終わりです。
ただし今回この例の元になったデータ利用シーンではレコードが連想配列である必要があったので、 `map()` 関数を呼び出して変換処理を行っています。

イメージ： `[ { "col1": "R1C1 value", "col2": "R1C2 value", ... }, { ... }, ... ]`

そして結果を `JSON.stringif()` に渡してJSON文字列を生成して返します。
OfficeScriptsの `main` 関数ではプリミティブの配列を戻すことはできるのですが、オブジェクトの配列を戻すことができません。このためJSON文字列に変換（シリアライズ）してやる必要があります。

こうして作成したスクリプトを使うフローは次のような構成になります：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/9f12e5c3-f833-6420-d40d-cf8b9af4b2c7.png)

"作成" アクションで `json()` 関数を用いて JSOM文字列からオブジェクトの配列への変換（デシリアライズ）を行っています。

```ts
json(outputs('スクリプトの実行')?['body/result'])
```

これでアクションによる件数の制約なしにテーブルのデータを読み取ることができます。

いうまでもなくこの方法は「推奨される」ものではありませんが、件数が膨大、フローを複雑にしたくないなど、あれこれ考慮した末に残る選択肢の1つではあります。
【備忘録】M1MacだとWordPress公式ドキュメントのphpunit手順でmysqlが動作しない件

## 事象

[phpunit](https://make.wordpress.org/core/handbook/testing/automated-testing/phpunit/)の手順の以下コマンドを実行するとエラーになる。

```
npm run env:start
```

エラーメッセージはこんな感じ
> > WordPress@5.9.0 env:start
> > node ./tools/local-env/scripts/start.js
>
>Pulling mysql (mysql:5.7)...
>5.7: Pulling from library/mysql
>ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
>child_process.js:655
>    throw err;
>    ^
>
>Error: Command failed: docker-compose up -d wordpress-develop
>    at checkExecSyncError (child_process.js:616:11)
>    at execSync (child_process.js:652:15)
>    at Object.<anonymous> (/Users/takao/WordPress/wordpress-develop/tools/local-env/scripts/start.js:8:1)
>    at Module._compile (internal/modules/cjs/loader.js:1063:30)
>    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
>    at Module.load (internal/modules/cjs/loader.js:928:32)
>    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
>    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
>    at internal/main/run_main_module.js:17:47 {
>  status: 1,
>  signal: null,
>  output: [ null, null, null ],
>  pid: 91303,
>  stdout: null,
>  stderr: null
>}


## 解決方法
`.env`を以下のように修正

**修正前**

```
##
# The database software to use.
#
# Supported values are `mysql` and `mariadb`.
##
LOCAL_DB_TYPE=mysql

##
# The database version to use.
#
# Defaults to 5.7 with the assumption that LOCAL_DB_TYPE is set to `mysql` above.
#
# When using `mysql`, see https://hub.docker.com/_/mysql/ for valid versions.
# When using `mariadb`, see https://hub.docker.com/_/mariadb for valid versions.
##
LOCAL_DB_VERSION=5.7
```

**修正後**

```
##
# The database software to use.
#
# Supported values are `mysql` and `mariadb`.
##
LOCAL_DB_TYPE=mariadb

##
# The database version to use.
#
# Defaults to 5.7 with the assumption that LOCAL_DB_TYPE is set to `mysql` above.
#
# When using `mysql`, see https://hub.docker.com/_/mysql/ for valid versions.
# When using `mariadb`, see https://hub.docker.com/_/mariadb for valid versions.
##
LOCAL_DB_VERSION=10.7
```

※
`mariadb`のバージョンは10.7としていますが、https://hub.docker.com/_/mariadbで任意のバージョンを選んでください。

## 補足
Dockerの公式サイトに以下のように記述されています。
https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/apple-silicon/

> 既知の問題
ARM64 アーキテクチャー向けのイメージがすべて利用可能となっているわけではありません。 Intel イメージの実行には、エミュレーションのもとで--platform linux/amd64をつけて実行することが必要です。 特に mysql イメージは ARM64 向けには利用できません。 これに対する当面の対処としては mariadb イメージを利用してください。

なので、`mysql`から`mariadb`に置き換えました。
ActiveRecord::DengerousAttributeError in ~~に困ったお話...(model_nameはカラム名にしてはいけない！)

# ActiveRecordのエラーにつまづいた

エラーのスクショはこちらです！

![スクリーンショット 2021-11-08 23.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/3221f7f8-ac36-1fe1-5831-e68b364432f0.png)

``model_name is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name.``

これを解決すれば良さそうです。

##　何をしていたか
見ての通りですが、新規投稿関係の実装中です。そして``http://localhost:3000/posts/new``でこの画面の登場です。

##　どんなエラーか

``model_name is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name.``
和訳するとこうです。
``model_nameはActiveRecordによって定義されます。同じ名前の属性またはメソッドがないことを確認してください。``

はい。私、``model_name``というカラムをpostsテーブルに用意していたわけで、エラー文そののままの通りですが、``model_name``は使えんよってことです。

##　解決方法
カラム名の変更で簡単にできます。

```:ターミナル
rails db:rollback
または
rails db:rollback step数値
```

で対象のマイグレーションファイルを編集して

```:ターミナル
rails db:migrate
```

もしくは、もっとやりやすい方法として

```:ターミナル
rails g migration rename_model_name_column_to_post
```

```ruby:db/migrate/20XXXXXXXXXXX_rename_model_name_column_to_posts.rb
class RenameRequestColumnToJobAdministrations < ActiveRecord::Migration[5.0]
  def change
    rename_column :posts, :model_name, :name
  end
end
```

これでも変更できるかと。

これで解決しました。

##　参考文献

https://github.com/rails/rails/issues/18338
【Ruby】pluckメソッド


引数に指定したカラムの値を配列で返してくれるメソッド

```
pluck(:hogehoge)
```



```ruby
User.pluck(:firstname)

User.all.map(&:firstname) # 上記と同じ

# =>  ["太郎", "二郎", "新一", "平次"]
```

結果は同じだが、発行されるSQLが異なる。
pluckメソッドは、SQLの段階から取得するカラムのデータを絞り込んでいる
mapメソッドは、全てのデータを取得した後そのデータから特定のカラムのデータを取得している

```ruby
User.pluck(:firstname)
SELECT `users`.`firstname` FROM `users`

User.all.map(&:firstname)
SELECT `users`.* FROM `users`
```

引数2つ指定もできる。

```ruby
Employee.pluck(:firstname, :lastname)

# => [["太郎", "山田"], ["二郎", "安倍"], ["新一", "工藤"], ["平次", "服部"]]
```

##参考

https://railsdoc.com/page/model_pluck

https://pikawaka.com/rails/pluck
WSL2（Windows10Pro）でEGGXをインストール

###目的
WSL2（Windows10Pro）でEGGXをインストールしました。
サンプルが動いたので環境構築とインストール方法を残します。
ほとんど、「[公式サイト](https://www.ir.isas.jaxa.jp/~cyamauch/eggx_procall/index.ja.html)」の引用です。
公式サイトに載っているそのままの作業ではうまくいかなかったので、私レベルの初心者向けの注釈を加えました。
###環境
- Windows10Pro
- WSL2
- ubuntu20.04LTS

（私の最新の開発環境は[こちら](https://anya9999.github.io/202111-2/)）

##★ X11開発用のパッケージをインストール
　/usr/include/X11/X.h が存在するかどうかを確認する。ディストリビューションによっては， EGGX の構築に必要なヘッダファイルが標準ではインストールされない事がある。その場合は，各ディストリビューションが用意している X11 の開発用のパッケージをインストールする。

```bash
$ sudo apt-get install libx11-dev　 #公式サイトと違う部分
```
##★ Windows側にXサーバーを入れる（公式サイトに無い作業）
###VcXsrvのインストーラーをダウンロード
[「VcXsrv Windows X Server」のダウンロードページ](https://sourceforge.net/projects/vcxsrv/)
###VcXsrvをインストール
　ダウンロードしたインストーラをダブルクリックして起動し、インストールオプションやインストール先などを指定してインストールする。基本的にデフォルトのままで大丈夫。（[参考サイト](https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html)）

###設定ファイル（～.xlaunchファイル）を作成
　インストールが完了したら、［スタート］メニューの［VcXsrv］－［XLaunch］を起動する。起動するとウィザード画面が表示され、幾つかの選択肢が表示される。
　基本的にデフォルトのまま、３ページ目の [Extra settings] で、[Disable access control] にチェックを付ける。
　４ページ目の［Save configuration］で設定をファイルに保存しておく。（[参考サイト1](https://qiita.com/WGG_SH/items/6680a24c58f48b93772b)、[参考サイト2](https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html)）

###VcXsrvが自動的に起動されるようにする
　［Windows］＋［R］キーを押して「ファイル名を指定して実行」ダイアログを表示させ、```shell:startup```と入力すると、ユーザーの「スタートアップ」フォルダがエクスプローラで開かれる。
　ここに、起動ウィザードの最後のステップで作成した設定ファイルを保存する。（[参考サイト](https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html)）

###WSLからXサーバを利用するために、DISPLAY環境変数を設定する
　WSLを起動する度にDISPLAY変数を手動で設定するのは面倒なので、「~/.profile」（bashの初回起動時に実行される）の中に記述を追加しておく。（[参考サイト](https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html)）

＜動作テスト＞

```bash                                                                                                                   
$ sudo apt install x11-apps  #基本的なXサーバ対応のアプリやツールなどがインストールされる。
$ xeyes -display :0.0  #目が表示される
``` 

＜自動化＞

```bash
$ cd  #homeディレクトリに移動
$ echo export DISPLAY=:0.0 >> ~/.profile  #DISPLAYの設定を.profileの末尾に追加
$ source ~/.profile  #.profileの読み込み
$ echo $DISPLAY  #設定の確認
```
＜動作テスト再＞

```bash                                                                                                                   
$ xeyes  #目が表示される
``` 

                   

##★ EGGXをインストール（[公式サイト](https://www.ir.isas.jaxa.jp/~cyamauch/eggx_procall/index.ja.html)より抜き出した作業）
###ソースを展開する
homeディレクトリにdemoディレクトリを作った。その中に「eggx-0.95.tar.gz」を入れた。展開する。

```bash
$ cd demo　 #公式サイトと違う部分
$ gzip -dc eggx-0.95.tar.gz | tar xvf -
```

###make と make install
eggx-0.95に移動する。makeする。sudo make installする。

```bash
$ cd eggx-0.95
$ sudo apt install make  #公式サイトと違う部分
$ make
$ sudo make install　 #公式サイトと違う部分
```


##★ 動作テスト（[公式サイト](https://www.ir.isas.jaxa.jp/~cyamauch/eggx_procall/index.ja.html)より抜き出した作業）
examples_tutorialにいくつかのサンプルプログラムが入っている。 それで動作確認をする。
### examples_tutorial/clock.c … シンプルなデジタル時計
```bash
$ cd examples_tutorial
$ make clock
$ ./clock &
```
Nuxt 親子間データの受渡し

# 親子間のデータの受渡し
> 活用例
> ・APIからデータを受け取った時に子に渡す
> ・フォームを親子関係にしている場合のデータの受渡し

## 親から子へデータを渡す
```js
<user-name-form
  // bind:nameの省略
  :name="params.user.email"
/>
```


## 親のデータを受取る
```js
export default {
  props: {
    email: {
      // 型を指定できる
      type: String,
      // デフォルト値を設定できる
      default: "",
    },
  }
};
```

## 子から親にデータを渡す
```js
<template>
  <v-text-field></v-text-field>
</template>

<script>
export default {
  props: {
    email: {
      type: String,
      default: "",
    },
  },
  // computed内で$emit関数を使用して渡す
  computed() {
    this.$emit.('イベント名？', this.email)
  },
};
</script>
```

## 親で受取る
```js
<user-name-form
  @update:email="params.user.email = $event"
/>
```

## syncで親子間のデータを一気に行う
親コンポ

```js
// syncでデータを受渡し、更新できる
<user-form-email :email.sync="params.user.email" />
```

子コンポ

```js
<template>
  <v-text-field
    // setEmailを忘れずに
    v-model="setEmail"
  ></v-text-field>
</template>

<script>
export default {
  // propsで受取る
  props: {
    email: {
      type: String,
      default: "",
    },
  },
  computed: {
    setEmail: {
      // getterでpropsで受け取ったデータを渡す
      get() {
        return this.email;
      },
      // setterで$emitを使ってupdateさせる
      // newValを忘れずに
      set(newVal) {
        return this.$emit("update:email", newVal);
      },
    },
  },
};
</script>
```
VSCodeの拡張機能「SFTP」で複数のディレクトリに同時接続する方法

##はじめに
WordPress開発の時などに便利な拡張機能「SFTP」。

同時にいくつかのディレクトリを設定したい時もあるかと思います。

ちょうど先日私も同じ悩みを抱えていました。

その際に上司よりいい方法を教えていただいたので、
備忘録を兼ね記しておきます。


##結論
早速目的を達成するためのコードを書きましょう。

```main.js

[
  {
    "name": "myProject",
    "context": "",
    "host": "",
    "protocol": "ftp",
    "port": 21,
    "username": "",
    "password": "",
    "remotePath": "",
    "uploadOnSave": true
  },
  {
    "name": "myProject22",
    "context": "",
    "host": "",
    "protocol": "ftp",
    "port": 21,
    "username": "",
    "password": "",
    "remotePath": "",
    "uploadOnSave": true
  }
]

```

以上です。

配列の要素として各設定のオブジェクトを格納するだけですね。

是非お役立てください。
DeepLを使って翻訳しよう！

###　参考記事

[こちら](https://self-development.info/google%E7%BF%BB%E8%A8%B3%E3%82%88%E3%82%8A%E5%84%AA%E3%82%8C%E3%81%9Fdeepl%E7%BF%BB%E8%A8%B3%E3%81%A7%E8%87%AA%E5%8B%95%E7%BF%BB%E8%A8%B3%E3%80%90%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3/)と[こちら](https://qiita.com/fujino-fpu/items/e94d4ff9e7a5784b2987)

### 改良版

```deepl_transfer.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import urllib.parse
from tqdm import tqdm
from time import sleep
from bs4 import BeautifulSoup

sleep_time = 1
try_max_count = 30
chrome_driver = r'path\to\chromedriver.exe'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}

en2ja_url = "https://www.deepl.com/translator#en/ja/"

def get_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    return [line.rstrip('\n') for line in lines]

def get_translated_text(text, driver):
    parsed_text = urllib.parse.quote(text)
    url = en2ja_url + parsed_text
    try:
        print(f'url {url}')
        driver.get(url)
        #driver.implicitly_wait(10)
        text = get_text(driver)
        while text == None:
            sleep(2)
            text = get_text(driver)
        return text
    except Exception as e:
        print(f'Error Occurred as {e}')
        return get_translated_text(text, driver)

def get_text(driver):
    try:
        selector = "#dl_translator > div.lmt__text > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container > div.lmt__translations_as_text > p > button"
　　　　text = driver.find_element_by_css_selector(selector).get_attribute("textContent")
        if text != '':
            return text
        else:
            return None
    except Exception as e:
        print(f'Error occurred as {e}')
        return None

def main():
    options = Options()
    options.add_argument('--headless') #browerが起動せずに実行される
    driver = webdriver.Chrome(chrome_driver, options=options)
    files = [翻訳したいファイルの一覧]
    for file in files:
        lines = get_file(file)
        name = file.split('\\')[-1].split('.')[0]
        for line in tqdm(lines):
            sleep(3.0)
            translated = get_translated_text(line, driver)
            print(f'translated text {translated}')
            with open(name + '_translated.txt', 'a', encoding='utf-8') as f:
                f.write(translated + '\n')

if __name__=='__main__':
    main()


```

以上。
相互作用の時系列モデル(モデル作成)

```{r}

#相互作用の時系列モデル

#最小二乗法
#とりあえず相互依存しながら変化する時系列のいいデータがなかったので
X=EuStockMarkets
dat=data.frame(X)

#これを時系列データとして使用する
X=as.matrix(X)[1:20,]/10
n=ncol(X)
t=c(1:nrow(X))

#各時系列過程
#X(t+1)~N(X(t)+A%*%X(t),sig^2)に従い、これを基に
#対数尤度から最尤推定する
#別記法だとX(t+1)=X(t)+A%*%X(t)+U, U~N(0,sig^2)

#n個の時系列過程が互いに相互依存する様子を表すパラメータ行列A
A=array(0.1,dim=c(n,n))
#n個の時系列過程それぞれのばらつき
sig=rep(1,n)
#反復計算回数
ite=10^4

eta=10^(-6)
loglikvec=c()

for(l in 1:ite){
  
xpast=X[1:(nrow(X)-1),]
xpre=X[2:nrow(X),]
diff=t(xpre)-t(xpast)-A%*%t(xpast)
dA=t(t(diff%*%xpast)/(c(sig^2)))
  
A=A+eta*dA
sig=sqrt(apply(diff^2,1,sum)/max(t))

loglik=-max(t)*n*log(2*pi)/2-max(t)*sum(log(1+sig^2))/2-sum((diff^2)/(2*sig^2))
loglikvec=c(loglikvec,loglik)
print(loglik)

}

#データと予測値の絶対平均誤差
print(mean(abs(diff)))

```
Dockerコンテナ内でおこるOperation not permittedはアプリ側の問題かもしれない

##背景

Docker × Laravel で開発を行おうとしたところ、dockerコンテナ内でlaravelのアプリケーションディレクトリに対するあらゆるコマンドがOperation not permittedで使えない状況になった。
構成としては以下の形。app/がlaravelのファイル群が入ったディレクトリで、これをvolumeでマウントしている。

```:/application
┏ docker-composer.yml
┣ docker/ 
┃   ┗ Dockerfile
┗ app/ 
    ┣ app/
    ┣ bootstrap/
    ┣ config/
　　　　　　　　:
```

```yml:docker-composer.yml
version: '3'
volumes:
  mysql-volume:
services:
  app:
    build: ./docker
    ports:
      - 80:80
    volumes:
      - ./app:/var/www/app
    working_dir: /var/www/app
  db:
    image: mysql:8.0
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - mysql-volume:/var/lib/mysql
```

## Operation not permitted
コンテナを立ち上げてbashで中に入ってみると、appディレクトリにおいてlsコマンド、composerなどあらゆる操作ができない。

```terminal
$ docker-compose up -d
Starting application_app_1 ... done
Starting application_db_1  ... done

$ docker-compose exec app bash
root@dd0e1979fc6b:/var/www/app# ls
ls: reading directory '.': Operation not permitted

root@dd0e1979fc6b:/var/www/app# composer install
                                                         
  [ErrorException]                                                                    
  file_get_contents(./composer.json): Failed to open stream: Operation not permitted  
                                              
```

別のディレクトリではlsコマンドを実行することができる。
ディレクトリやファイルの権限がないのかと思ったが、読み取りや実行権限もありそう。
なぜかappディレクトリだけ制限がかかっている状態。

```terminal
root@dd0e1979fc6b:/var/www/app# cd ..
root@dd0e1979fc6b:/var/www# ls -l
total 4
drwxr-xr-x 27 root     root      864 Nov 12 05:10 app
drwxrwxrwx  1 www-data www-data 4096 Oct 12 04:45 html
                                       
```

ここで、githubにある同じファイル群を別の方にcloneしてもらい、同じ操作をしてもらったところ、普通にlsやcomposerを使うことができていた。
よって、自分のPCの何らかの設定が怪しいと思われた・・・。

##原因と対応

これは、Docker for Mac側でデスクトップへのアクセスが許可されていないことが原因だった。
docker-composer.ymlでマウントしているホスト側の./appがDesktop下にあったため、docker for macが参照できなかったっぽい。

macのシステム環境設定 > セキュリティとプライバシーから、「プライバシー」タブへ移動する。

![スクリーンショット 2021-11-12 14.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584114/70cf1f5f-3dca-a781-1008-1df6db3253c7.png)
このDockerの "デスクトップ"フォルダのチェックマークをつけて、保存する。


```terminal:
root@3e4c6b151144:/var/www/app# ls
CHANGELOG.md  app      bootstrap      composer.lock  database      phpunit.xml  resources  server.php  tests   webpack.mix.js
README.md     artisan  composer.json  config         package.json  public       routes     storage     vendor

root@3e4c6b151144:/var/www/app# composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 111 installs, 0 updates, 0 removals
    Failed to download doctrine/inflector from dist: The zip extension and unzip/7z commands are both missing, skipping.
...
```

appディレクトリで操作ができるようになりました。
[Flutter] CodeMagic で自動で build_number を更新できない時の対処法。build number が更新されない。 --build-number=$(($BUILD_NUMBER))

https://kaedeee.com/flutter-codemagic-build_number/

CodemagicでFlutterを利用する際に、Github にデプロイ後、自動でbuild numberを更新するように設定したにも関わらず、iOSで自動更新が反映されませんでした。

対応を以下に示します。

#対処法

##Codemagicの設定を見直す。
build > build arguments を

--build-number=$(($BUILD_NUMBER))

と設定する。

![スクリーンショット 2021-11-12 17.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/24fd56ef-c082-f3d8-b787-83342dcb7035.png)

##Xcodeの設定を見直す。
Xcode > Info.plist より、

key CFBundleShortVersionString
key CFBundleVersion
部分の string を

$(FLUTTER_BUILD_NAME)

に変更する。（個人開発の簡便のため、両方とも同じ値を設定しましたが、後者片方だけで良いです。）

![スクリーンショット 2021-10-10 0.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/8da51e50-c4c3-e8ca-5484-7480801aed29.png)

Codemagic 先輩、スキッス！
終わり

https://kaedeee.com/flutter-codemagic-build_number/
WordPress マルチサイト化

# 前提知識

Wordpressを使っていると別ドメイン等でWordPressを使いたくなる

都度WordPressをインストールしていっても良いがWordPressまみれになるのでMuliSiteを使うとプラグインやWordPress本体のバージョン管理もやりやすい

Kusanagiを使っているがおそらく他のWPとほぼ同じ扱い

すでに稼働しているWordPressの場合はDBのバックアップとファイルのバックアップを念の為とっておくこと

# 手順1
wp-config.phpを編集

```PHP
 76 /**
 77  * 開発者へ: WordPress デバッグモード
 78  *
 79  * この値を true にすると、開発中に注意 (notice) を表示します。
 80  * テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。
 81  */
 82 define('WP_DEBUG', false);
 83 
 84 #define('WP_ALLOW_MULTISITE', true);
 85 #define('FORCE_SSL_ADMIN', true);
 86 #define('WP_CACHE', true);
```

WP_ALLOW_MULTISITEの行のコメントアウトをはずしてあげる。

```PHP
 84 define('WP_ALLOW_MULTISITE', true);
```

# 手順2
WordPressのadminにログインし、ツール▶サイトネットワークの設置に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210754/5529f3e3-7443-7347-eaea-67d6da7e629a.png)
すでに運用中のWPのためサブディレクトリインストール型は使えないが、
今回使いたいのはサブドメイン型なのでいったん問題なしとする。
インストールを押下

# 手順3
画面の指示通りにwp-config.phpを編集する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210754/5c54339c-ac66-17fb-b4e9-b6c64ccda862.png)

```PHP
 93 define( 'MULTISITE', true );
 94 define( 'SUBDOMAIN_INSTALL', true );
 95 define( 'DOMAIN_CURRENT_SITE', 'xxx.bitstar.tokyo' );
 96 define( 'PATH_CURRENT_SITE', '/' );
 97 define( 'SITE_ID_CURRENT_SITE', 1 );
 98 define( 'BLOG_ID_CURRENT_SITE', 1 );
 99 /* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */
```

# 手順4
再度ログインしなおすとヘッダーが変わっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210754/55cd9bb2-a38d-8ca8-ea85-2df1aeea33dc.png)
これでインストールは完了

# 手順5
マルチサイトの追加
参加サイト▶サイトネットワーク管理▶サイト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210754/ce4dc186-75b0-49a6-dd5a-91cafb12aaad.png)
新規作成から追加できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210754/40d92a2c-1965-6c98-3a12-f3469ae397df.png)
必要項目を入力して追加完了

# サブドメインのルーティング追加
アクセスしても404になっちゃうのでRoute53の設定が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210754/1892a48a-0e8d-611f-b387-1b53a75449eb.png)
*.xxx.bitstar.tokyoでRoutingを作成してあげる。
*にしておけば今後マルチサイト追加してもDNSの設定変更が必要無くなるため
設定の右側はケースバイケース。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210754/7464b9f5-b94a-c170-bd7f-4032592548b6.png)
あとはDNSが浸透してアクセスできるのを待つ
【図解で理解】Javaのinterfaceのメリットと使い方について

<h2>目的</h2>
・Javaのinterfaceのメリットと使い方を理解する


<h2>interfaceとは</h2>
メソッドの具体的な処理は記載せずに「変数」「メソッドの型」を明記したもの。

要約すると、
他のクラスで使用する変数とメソッドが明記されたファイル。

<h2>interfaceのメリット</h2>
・予め規格（ルール）を決めておけばその通りに作成することができ、保守性が上がり複数人での開発の際に実装が複雑化せずに済む。

・改修が発生した場合でも追加で改修を実装するだけで、大元の呼び出しクラスへの影響を抑えられる効果もありテストの工数を短縮することも可能。

・クラス間で疎結合の関係になる。

・インタフェース内で定義したメソッドを継承先で実装しないとエラーになるので実装漏れを防ぐことができる。
　→そのため最初に必要なメソッドと引数を検討してインタフェース内に記述しておくといい。

---

<b>▼インタフェースがない世界</b>
![インタフェースがない世界.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491501/7e71824b-7f5b-6020-62b4-5d7ca93b834e.jpeg)

複数人で開発をしていると必ずしも統一したプログラムを組んでいるとは限らず、クラスによっては戻り値や実装方法が異なるなんてことがあります。
そうなると改修が難しくなり汎用性が悪いコードが誕生します。

---

<b>▼インタフェースがある世界</b>
![インタフェースがある世界.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491501/a173308f-dee8-5a84-3063-d8d1800b445b.jpeg)

インタフェースで予め決めておけばインタフェースを継承することで戻り値が統一できるので呼び出し元は各クラスのメソッドを意識することなく実装できます。
また、改修が必要なときはインタフェースを継承して使うことができるので汎用性の高いコードになります。


<h2>interfaceの使い方</h2>
▼フォーマット
アクセス修飾子は必ず「public」。
他のクラスで継承して実装してもらうのでpublicにしないと参照できなくなってしまいます。

```
public interface インターフェース名{}
```

例)
①インタフェースを定義

```Caluculator.Java
public interface Caluculator {
	int calc(int a, int b);
}
```

②インタフェースを継承
implements＋インタフェース名で継承できる。

```AddCalculator.Java
public class AddCalculator implements Caluculator{
	@Override
	public int calc(int a, int b) {
		return a+b;
	}
}
```

③mainメソッドから呼び出し


```Application.java

public class Application {

	public static void main(String[] args) {
		int a = 10;
		int b = 20;

		AddCalculator addCalc = new AddCalculator();
		int result = addCalc2.calc(a, b);

		System.out.println("result =" + result);
	}
}
```

<h2>おわりに</h2>
インタフェースについて改めて理解を深めるにあたりまとめました。
しばらく実装から離れて開発をしていたので復習のために再確認しお取り込むことができました。
機能には必ず意味があるので再度振り返るいい機会になりました。
GitLab のリポジトリーをクローンする方法

GitLab のリポジトリーをクローンする方法です。

前提条件として、
1) GitLab にログインできること。
２）リポジトリーにアクセスできること。
　　つまり、ブラウザーで閲覧できること。

ログインした状態で
Edit Profile -> SSH Keys とすすみます。
![gitlab_ssh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a324f7b6-64c6-5fd7-0a2a-8448bd739d81.png)

次に書いてある通り、新しくキーを作成しても、普段使っているキーでもどちらでも構いません。とにかく、ssh でログインする時に、相手先のサーバーに送るパブリックキーです。それを、キーの枠にコピーペーストします。そして、Add key ボタンをクリックします。

```text
To add an SSH key you need to generate one or use an existing key.
```

次は、クローンです。
コマンドは、リポジトリーの　Clone をクリックすれば表示されます。
次は、ssh の例です。

```bash
git clone git@gitlab.com:someone/something.git
```

## https でクローンするには ##

~/.netrcにユーザ名/パスワードを書く

```text/.netrc
machine gitlab.com
  login scott
  password tigertiger
```

```bash
git clone https://gitlab.com/someone/something.git
```
CDOで水平高解像度なnetCDFファイルを低解像度に変換する

# はじめに
気象モデルの高解像度な（例えば、東西10240 x 南北5120 x 鉛直18くらいの）出力結果のnetCDFファイルは、見たい現象の空間スケールと比べて細かい場合は、サイズが大きくデータの取り扱いが大変であったりします。こうしたデータは水平格子を粗くして解析することがあります。

netCDFのデータの解像度変換を行う方法には色々ありますが、ここではCDO (Climate Data Operators) という便利なコマンドラインツールを使って簡単に行う方法を紹介します。

# インストール

LinuxやIntel Macの場合、Anaconda(Miniconda)を使うことでインストールできます。

```bash
conda install -c conda-forge cdo
```

Intel macやApple Siliconでは、Homebrewを使うことでインストールできます。

```bash
brew install cdo
```

# 解像度変換
## サンプルコード

水平高解像度なnetCDFファイル（`in_hires.nc`）を低解像度なnetCDFファイル（`out_lowres.nc`）へと変換する場合、シェル(Bash)で以下のコマンドを実行します。

```bash
export MAX_REMAPS=1
cdo -f nc4 -P <スレッド数> remapcon,grid_output in_hires.nc out_lowres.nc
```

このとき、カレントディレクトリに`grid_output`という名前の出力格子定義ファイルをあらかじめ用意しておきます。

```
gridtype = latlon
xsize = 360
ysize = 180
xunits = 'degree'
yunits = 'degree'
xfirst = 0.5
xinc = 1.0
yfirst = -89.5
yinc = 1.0
```

## 解説

格子の解像度変換をするオペレーターには、`remap`から始まる様々なものが用意されています。こうしたオペレーターには、高解像度化するのに適したものと低解像度化するのに適したものがあります。`remapbil`は周囲の格子からバイリニア内挿（線形内挿）をするオペレーターのため、高解像度な格子へと変換するのに向いています。一方、`remapcon`はfirst order conservative remapping、要は物理量の面積分が変換前と変換後で等しくなるようなオペレーターのため、どちらかといえば低解像度な格子へと変換するのに向いています。

CDOにはスレッド並列のオプションがあり、`-P`オプションでスレッド数を指定できます。並列化効率が良いかはオペレーターによりますが、解像度変換をする`remap`から始まるオペレーターは並列化と相性が良いようです。

高解像度なデータを扱うときには、メモリの使用量にも注意が必要です。陸地があるなど鉛直方向で未定義な格子数が異なっている場合、解像度変換の重み係数は再利用するためにすべての異なる層について保存されます。そのため、高解像度データを扱う場合に大量のメモリを使用してしまうことがあります。これを解決するには、異なる層の重みをメモリに保存しないように、環境変数`MAX_REMAPS`に1を設定します。このことは以下のページに書かれていました。

https://code.mpimet.mpg.de/boards/1/topics/1813

# 参考になるページ

CDOの公式マニュアルはこちらです。

https://code.mpimet.mpg.de/projects/cdo/embedded/index.html

日本語だと、以下のページが参考になります。

http://www.hysk.sakura.ne.jp/Linux_tips/how2use_CDO

http://kodama.fubuki.info/wiki/wiki.cgi/CDO/tips?lang=jp

https://qiita.com/convection/items/5d1f00d25007fac7ae0c

https://ccsr.aori.u-tokyo.ac.jp/~obase/cdo.html
プログラムするものが思いつかない人のためのオンライン競技プログラミングのリンク

# 概要

今何を作りたいのか思いつかない、作っているものが停滞して進まないので気分転換したい人のために、
競技プログラミング問題の解答をオンラインで実行・採点してくれるサイトを紹介してみる。

## AIZU ONLINE JUDGE

https://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja

2004年から運営されているプログラミング問題のオンライン採点システムです。

2018年から新しいインターフェースの試験運用がされているようですが、使用できるプログラミング言語がC++/Java/C#に限定されているようです。

https://onlinejudge.u-aizu.ac.jp/home

使い方は下記のサイトがわかりやすいと思います。

https://book.mynavi.jp/manatee/series/detail/id=88273

C++/Java/C#以外の言語を使いたい場合はAOJ ICE経由で問題の検索・コーディング・解答をするのが一番やりやすそう。

https://onlinejudge.u-aizu.ac.jp/services/ice/

使い方はこちら**(PDF注意)**

https://onlinejudge.u-aizu.ac.jp/documents/ICE_ja.pdf


## AtCoder(AtCoder Problems)

https://atcoder.jp/home

オンラインで競技プログラミングコンテストを開催しオンライン採点できるサービスです。
過去に開催されたコンテストに擬似参加してオンラインで採点する機能もありますが、
公式サイトでは探しにくいので、AtCoder Problemというコンテスト一覧サイトから探すことをおすすめします。
ちなみにコンテストに擬似参加しなくてもコードの実行・判定はしてくれるようです。

https://kenkoooo.com/atcoder/#/table/

使い方はこちら

https://ntk-ta01.hatenablog.com/entry/2020/04/15/001405

ひとまず最初はAtCoder Beginner Contest(ABC)の過去問からチャレンジしてみては。

https://kenkoooo.com/atcoder/#/table/

## Paizaプログラミングスキルチェック

https://paiza.jp/challenges/info

エンジニア向け就職・転職サイトですが、オンラインIDEやクラウド環境の提供もやってる会社です。
スキルチェックということでオンラインでプログラミング問題の正誤判定やレーティングをやっているようです。
レーティングを企業に公開することでプログラミングスキルを企業にアピールできるらしいですが、
その関係で禁止事項が厳しめ?のようなので一度読んでおくことをおすすめします。
就職転職に関係なく単に問題を解くだけという使い方でも問題ない模様。

https://paizasupport.zendesk.com/hc/ja/articles/360038932191-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B9%E3%82%AD%E3%83%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E5%8F%97%E9%A8%93%E3%81%A7%E3%81%AE%E7%A6%81%E6%AD%A2%E8%A1%8C%E7%82%BA

Paizaが意図する本来の使い方としては、個人的にはまぁ…余裕があるなら一応やっておいても…って感じかな？
React　学習帳その3

React Router
設定方法
#pagesフォルダを作成
pagesフォルダ内にホームとなるindex.jsを作成。
このページの他に必要なページを追加していく。
#src/index.jsを確認
srcディレクトリ直下のindex.jsにRoutrとpages内のコンポーネント達をインポートしていく。
Routerタグ内にRouteタグを追加。
Routeタグでpathと対応するコンポーネントを記述。
常に表示されているheaderコンポーネントなどはRouteタグの外側に。
urlに応じて内容が変わるようになる。

#useStateの使い方

```react
import React, { useState } from 'react';
export default function () {
    const [count, setCount] = useState(0);

    return (
        <div>
            <p>You clicked {count} times</p>
            <button onClick={() => setCount(count + 1)}>
                Click me
            </button>
        </div>
    );
}

```
React公式から具体例。
useStateはフックの一つ、「ステートフック」と呼ばれる。更新するまではstateの値はReactが持っていてくれる。

##stateの宣言
```react
import React, { useState } from 'react';
```
まずuseStateをReactからインポート

```react
const [count, setCount] = useState(0);
```
countという名前のstate変数（この変数を更新するのはsetCountという関数）を宣言
useStateの引数には初期値を渡す。stateの中身は何でもいい。

##stateの呼び出し方
```react
<p>You clicked {count} times</p>
```
クラス内だとthis.state.countと書くところ｛count｝で済むのが画期的

##stateの更新
```react
<button onClick={() => setCount(count + 1)}>
    Click me
  </button>
```
クラスだったら`this.setState()`を呼び出して長くなる。画期的
React 副作用フック

#副作用フック
英語で**side-effects**なので、副作用フックと訳されている。

ステートが更新されたときに必要な作業を行えるようにするときに使う。
#####どういうこと?:thinking:
ステートは値を変更すると自動的に表示が更新される。
ステートが直接表示に使われていない場所では、ステートが変更されても表示が更新されない。
ステートが変更されたときに、必要な処理を行うように（例：ステートが更新されたら、画面の色を変えるとか）できる。:hugging:

#副作用フックの使い方
```react
useEffect(関数)
```
Reactに用意されたuseEffect関数を使うので、importをしないと使えない。
`import { useEffect } from "react";`
が必要。
引数にはコンポーネントが更新されたときに実行する処理をまとめた関数を入れる。

useEffectはコールバック関数（関数を引数にとる関数）です。

```react
useEffect(() => {
    console.log("ステートが変更されました");
})
```
#副作用フックが実行される対象のstateを指定
stateが複数ある場合、特定のstateが更新されたときだけ副作用フックを使いたいときもありますよね。
第二引数で副作用フックが動くきっかけになるステートを指定できる。

```react
    useEffect(()=>{
       処理
        }
    },[ステート]
```
第二引数を`[]`と空配列を入れるとレンダー時の最初だけ処理が行われます。
Android Studio アプリをエミュレーションする方法

Android Studio 4.2.1

#方法
1.Android Studioを起動する
2.プロジェクトを開く
3.ツールバーの「AVD　Manager」でエミュレーションする機体を作成する
4.ツールバーの「▶︎」でエミュレーション実行

#etc
シミュレータを起動して、
コードをビルドして、
エミュレーションが始まるので、
▶︎ run appを押してからしばらく時間がかかる。
Arbitrumに対応したモジュールを作ってみたよ

# Arbitrum始めました
今までLayer1 mainnetだけに展開していた[弊プロダクトのDev Protocol](https://devprotocol.xyz/)ですが、この度愛でたくLayer2(Arbitrum)にも展開しました。
その際、protocolのソースにだいぶ修正を加えました。

何が違うのかをざっとまとめた会社のブログを紹介します。

[日本語](https://initto.devprotocol.xyz/ja/Difference-between-Dev-Protocol-v1-and-v2/)と[英語](https://initto.devprotocol.xyz/en/Difference-between-Dev-Protocol-v1-and-v2/)があります。
内容は同じです。どちらか好きな方をどうぞ。


# 最後に
またEthereumのカンファレンスやりたいなぁ

終わり。
SSHについて

## 環境
Ubuntu 16.04.5 LTS

## 内容
クライアントからサーバーにSSHで接続するは、クライアント側にSSHツールがインストールされている必要があります。SSHツールには色々と種類があるが、デファクトスタンダードとなっているのが**OpenSSH**です。

OpenSSHがインストールされているか確認するコマンドが**ssh -V**です。OpenSSHには、クライアントツールである**openssh-clients**と、サーバーサイドツールである**openssh-server**の２種類あります。どちらか片方でもインストールされていれば、**ssh -V**コマンドでインストール済と表示されます。どちらか片方がインストールされていても、両方がインストールされていても同じ返答を返すため、どちらのツールがインストールされているかまでは、このコマンドだけでは判断ができません。

Ubuntuにはデフォルトで、**openssh-clients**はインストールされているが、**openssh-server**はインストールされていないため、**openssh-server**を使う場合は、**ssh -V**コマンドだけでは、インストールの有無を判断することはできないことになります。

**openssh-server**がインストールされているかを確認するには２つの方法があります。**/etc/ssh/sshd_config**の中身を参照して、**PermitRootLogin**の行が存在するかを確認する方法と、**service --status-all**コマンドで、**sshd**サービスがインストールされているかを確認する方法の２つです。

**/etc/ssh/sshd_config**は、**openssh-clients**をインストールすれば自動で生成されるため、ファイルの存在だけを確認するのではなく、**PermitRootLogin**行の有無まで、しっかり確認することが重要です。

**openssh-server**がインストールされていなければ、**sudo apt install openssh-server**でインストールします。**openssh-server**をインストールした後、**sudo /etc/init.d/ssh start**コマンドで、SSHサービスを起動して、**service --status-all**コマンドで、**[ + ] ssh**と表示されれば、SSHサービスは正しく起動されています。

**openssh-server**を使う場合は、セキュリティ上、**/etc/ssh/sshd_config**をデフォルトで使ってはいけません。**/etc/ssh/sshd_config**を開いて、**PermitRootLogin**行を、**prohibit-password　⇒　no**に修正して、ルート権限でSSH接続ができないようにします。

また、SSHのポート番号がデフォルトで**22**になっているため、22以外の番号に変更する必要があります。well-known以外であれば何番に設定してもかまいません。この２つの設定は、セキュリティホールを生まないように、必ず設定してください。

ポート番号を変更した場合、クライアントから接続する際には、sshコマンドで**pオプション**をつけて、変更したポート番号を指定して接続することになります。
**/etc/ssh/sshd_config**を変更した後、ファイルに誤りがないかを確認するツール、
**sshd -t**があるので必ず実行します。ファイルに誤りがあれば、エディタで修正してください。

SSHでクライアントからサーバーに接続するときに、**ユーザー認証**と**ホスト認証**の２種類の認証が行われます。ユーザー認証とは、ユーザーIDとパスワードを使って行われる認証で、ホスト認証とは、ホスト名（またはIPアドレス）で行われる認証のことです。２つの認証が共に成功して、はじめてSSHのセッション確立されます。

認証で必要な情報を、クライアントからサーバーに送る際は、平文で送られるのではなく暗号化して送られます。SSHは以前使われていた、telnetやftpより堅牢になっています。
SSHは公開暗号鍵方式(鍵交換認証ともいう）という方法を使って情報送っています。送信元で暗号化した平文を、送信先で復号化して安全に平文を取り出すための仕組みです。

暗号化のときに利用する鍵を生成するアルゴリズムには、RSA、DSAなど色々なアルゴリズムが存在するが、一般的には**RSA**がよく使われます。RSAのアルゴリズムを使って鍵を生成するには**ssh-keygen -t rsa**コマンドを使います。

作られた鍵はどこのディレクトリで保管しても基本的に自由ですが、ホームディレクトリ配下の**.ssh**ディレクトリに保管するのが基本です。**.ssh**ディレクトリにはセキュリティ上、重要な鍵を保存するため、パーミッションの設定も重要です。パーミッションは、**chmod 600 ~/.ssh**で**600**（もしくは700）に設定して、自分以外のユーザーが参照、変更ができないようにします。

**ssh-keygen -t rsa**コマンドでは、id_rsa（秘密鍵）とid_rsa.pub（公開鍵）の２つの鍵が生成されます。公開鍵を接続先のサーバーに**scp**コマンドなどを使ってセットします。秘密鍵はローカルで管理します。クライアント側の秘密鍵を使って暗号化した平文は、サーバー側で公開鍵を使って復号化される仕組みになります。

SSHにはSSH1とSSH2の２つのバージョンが存在します。SSH2を使って接続する場合は、sshコマンドで、**ssh -2**とオプションをつけます。
Docker初心者がつまづいたところ

今まさにDockerをインストールしたところなので、メモしていく
### 公式チュートリアル
https://docs.docker.com/get-docker/

### Dockerの正体が分からない
周りのみんながDockerって言うたびに正体を知らない自分は焦っておりましたが遂に関わらざるおえなくなったようだ。

簡単に調べたところ、コンテナとかイメージとか出てくる、仮想空間って覚えた。ふんわり
正直今も分からないまま記事を書いているけどきっと大丈夫だよね。
・イメージ→構成しているもの
・コンテナ→構成を動かしているもの(止めるとコマンドプロンプト上でも止まります)

### インストールしたけど起動できずにエラーになる
とりあえず言うとおりに公式ページでインストールしたけど、起動できずにログインできていない的なエラーの通知が来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1548088/b072fc68-aeb2-d542-b4e5-4e220e4c3a6b.png)

再起動でもだめで、サインアウトして入り直したら解決した。
サインインしたままでは権限の割り当てみたいなのができないみたい。
（ちなみにそもそもPCに管理者権限なくてダメなパターンある）
### ソースコードを更新しても反映されない
pythonのソース編集しても実行結果に反映されなくて焦っていたら、Dockerを使用していることが原因だった。

【参考】https://tearoom6.hateblo.jp/entry/2020/03/12/065028
`Dockerfile 内で ADD や COPY によって、対象ファイルを image に取り込んでいる場合は、基本的には image (および container) の再作成が必要になります。`

Dockerfileを見てみると、たしかにCOPYの文字があるのでimageとcontainerの両方作成が必要そうですね...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1548088/c94c3afc-d626-501a-d796-94a196a09470.png)

### imageとcontainerの再作成が分からない
まずDocker DesktopのContainerを停止。（containerが動いていると削除できないので、停止してから！）
ImagesをRemoveするとcontainerは自動削除されます。

さてここから再作成は、作成時と同じことすればいいです！
image の再作成

```
docker build -t unity-robotics:pick-and-place -f docker/Dockerfile .
```
containerの再作成

```
docker run -it --rm -p 10000:10000 unity-robotics:pick-and-place /bin/bash
```

### ネット繋がってないとだめだった
こんなエラーが出ちゃう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1548088/d88faffb-8629-c374-fe82-d8499ebb3b70.png)


今のところ私にとって必要だったDockerについての情報はこれだけだった！以外と少なくてラッキー♪