OmniAICreator/Qiita-1.07M huggingface dataset:
XcodeでArchiveするとOther items(Generic Xcode Archive)になってしまう原因の探り方

Xcodeからアプリを公開するためにProduct > Archiveを行うと、生成されるファイルがなぜかGeneric Xcode Archiveとなり(iOS App Archiveになることを期待している)OrganizerのOther itemsのカテゴリに振り分けられてしまうという症状に長いこと悩まされていました。

![スクリーンショット 2020-01-16 9.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/2bdf40aa-ff60-44a3-e317-56030ae32ef0.png)

やっと解決することができたので、その方法をここに記そうと思います。

## 環境
Xcode 11.2.1

## 注意
筆者はReact Nativeでの開発をメインにやっているため、iOSネイティブのアプリ開発の知識やXcodeに対する知識が豊富ではありません。

この記事の内容自体はSwiftやObj-Cを使ったネイティブでのアプリ開発時にも役に立つと思いますが、念の為ネイティブでのアプリ開発にはそれほど詳しくない人間が書いているという点だけ了承した上でお読みください。。。

## ぐぐった
この問題が発生した時にググったところ同じ症状の人をたくさん見つけることができました。

日本語の記事ではこちらの方や

[アプリのArchiveでipaが作れなくて焦ったメモ - Qiita](https://qiita.com/jollyjoester/items/00720fffaa0fc223a6f4)

Apple公式のドキュメントにも記載があります。

https://developer.apple.com/library/archive/technotes/tn2215/_index.html#//apple_ref/doc/uid/DTS40011221-CH1-PROJ

しかし上記記事たちで触れられている「Skip install」や「Heders」の設定を見ても、自分の場合特に問題がなく途方に暮れておりました。

## 生成されるGeneric Xcode Archiveの中身を見てみる
正常にiOS App Archiveと認識されるアーカイブとGeneric Xcode Archiveとして認識されてしまうアーカイブの中身を比べてみることに。

アーカイブの中身をみるには、XcodeのWindow > Organizerを開き、対象のアーカイブの上で右クリックをし、

![スクリーンショット 2020-01-16 9.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/1eb2659f-65c5-0bc1-3bc4-fe6b140942a0.png)

Show in Finderを選択し

![スクリーンショット 2020-01-16 9.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/6a1b3081-3f41-561a-d62f-7de49d772684.png)

アーカイブを右クリックし、パッケージの内容を表示でOKです。

treeコマンド等で正常にアーカイブできる別のアプリと中身を比較してみると、

![スクリーンショット 2020-01-16 9.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/f978139d-5394-ad95-9a84-513faf9c6d19.png)

Productsディレクトリ以下にApplicationsのほか、 usrというディレクトリがあるのが確認できました。(正常なアーカイブには存在しない)

このusrディレクトリを掘っていくと、たくさんのヘッダーファイルが入っていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/1d1d945a-2676-2e13-8818-2369bc025137.png)

これらのファイル名をXcodeのプロジェクト内で検索してみたところ(Command + Shift + Oでファイル検索できます)、特定のライブラリがヒットしました。(今回はSDWebImage)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/6b943e72-6c6c-dbf2-fcd7-537dc53ab8ef.png)

どうやらSDWebImageのHeaderが怪しいというところまでこれであたりがついたので、SDWebImageを見てみたところ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/c8efe5f6-bcf1-ac9c-75d9-6989498a29da.png)

こんな感じで、先ほどググった時の記事と同じような感じで、HeadersのPublicのところにヘッダーファイルが存在しました。

## 解決!
という感じで原因を特定しました。

今回原因となっていたSDWebImageは、開発しているアプリが依存しているライブラリが依存しているライブラリだったため、SDWebImageに依存しているライブラリのバージョンをあげて対応しました。(なんでこのバージョンだけこうなっていたのかよくわからんままですが…)

---

普段からiOSアプリをネイティブで開発している方々にとってはもしかしたら当たり前のことなのかもしれないですが、普段はReact NativeでJSを書いてる身にはなかなか苦しかったのでどなたかの役に立てば幸いです。
Amazon EKS のチュートリアルで Kubernetes を理解する #04 セルフヒーリング


# はじめに
本記事は、以下の内容の続きになります。

- [Amazon EKS のチュートリアルで Kubernetes を理解する #03 メトリクス＆ダッシュボード](https://qiita.com/takanorig/items/124c28ce7f3d2052e8c5)

今回は、k8s自体の特長のひとつである **「セルフヒーリング（自己回復）」** の動作を確認してみたいと思います。
障害が発生してノードがダウンした場合に、どのように振る舞うかの検証を行います。

# セルフヒーリング時の動作

セルフヒーリングが実行される状況を、順を追って確認していきます。
ここでは、3ノードでクラスタを構築しています。

## 正常時の状況

まず、障害発生前の状況です。
AWSコンソールで、k8sクラスタに登録されているノード（EC2インスタンス）の状況、
および、Kubernetes のダッシュボードの状況を確認します。

![amazon-eks-dev06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/a8e872d0-5b51-f1bb-8f48-bafb50354b71.jpeg)

![amazon-eks-dashboard01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/d123f4eb-bffa-3b4e-53c1-9a3c6538587c.jpeg)

インスタンスIDと、ノード名が一致しないので、分かりにくいかもしれませんが、以下のノードが対応するモノになっています。

AWSコンソールで、2番目に表示されている **「i-04c1b56fb1ab8bc7a」**
　　↓　↑
Kubernetes ダッシュボードで、3番目に表示されている **「ip-192-168-85-79.us-west-2.compute.internal」**


## 障害の発生

次に、障害を発生させるために、AWSコンソールから、ECインスタンスを強制的に停止させます。

![amazon-eks-dashboard02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/44317661-b7ce-5419-fdca-27649fdaeea8.jpeg)

少し待つと、Kubernetes ダッシュボードで、先程のノードのアイコンが、「？」マークに変わりました。
ノードからのヘルチェックの応答がなくなり、状態が不明（Unknown）となっています。

## セルフ・ヒーリングの開始

そのまま、何もしないで、待ってみます。

![amazon-eks-dashboard03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/b545ac9d-c92d-6154-5952-70e2d5100036.jpeg)

すると、新しく <font color="#ff0000">**「ip-192-168-79-73.us-west-2.compute.internal」**</font> のノードが自動的に追加されました！
ただし、まだノードが起動している最中なので、状態は **「False」** になっています。

![amazon-eks-dev07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/4e36ea9b-ff57-b424-6b13-6167bcb0698f.jpeg)

AWSコンソールから、EC2インスタンスの状況も確認してみると、
停止したインスタンスは **「stopped」** の状態になり、新しく <font color="#ff0000">**「i-0da3402ec83997a51」**</font> のインスタンスが追加されています。

## セルフ・ヒーリング後

さらに、何もしないで、もう少し待ってみます。

![amazon-eks-dashboard04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/dda75f34-aedb-a0b4-5653-4ba6719c4af2.jpeg)

すると、先程自動で追加された <font color="#ff0000">**「ip-192-168-79-73.us-west-2.compute.internal」**</font> のノードが正常な状態になりました。
今回の場合は、およそ2分程度で、新しいノードに変わって動作する状態になりました！
障害が発生したノードで稼働していたコンテナも、新しく登録されたノードに、自動的にデプロイされたようです。

ちなみに、強制的に停止し、状態不明となった **「ip-192-168-85-79.us-west-2.compute.internal」** のノードは、しばらくすると、Kubernetes ダッシュボード上からも無くなっていました。


# まとめ

今回、セルフヒーリングの動作を確認してみましたが、障害が発生した後、
特に何をしなくても、自動でノードが追加され、元々の3ノード構成となって稼働していました。
このように、楽に回復性を向上させることができるのがk8sのメリットのひとつであり、ノードも自動で追加されるのがクラウド上でk8sを動作させるメリットだと思います。

実際の運用では、完全にノードが停止せずに、ゾンビ状態やコンテナプロセスがダウンする等のことも考えられますが、
その辺りはどのように検知＋セルフヒーリングできるのか、別途調べたいと思います。
LinkedListとArrayList

##リストって
脳死でArrayList使っていたけれど、実はいろいろあるらしい

```LinkedArrayListTest.java
package listTest;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class LinkedArrayListTest {
	
	public static void main(String[] args) {
		measure(1000000);
	}
	
	private static void linked(int num) {
		List<String> list = new LinkedList<>();
		for (int i = 0; i < num; i++) {
			list.add("asd");
		}
	}
	
	private static void array(int num) {
		List<String> list = new ArrayList<>();
		for (int i = 0; i < num; i++) {
			list.add("asd");
		}
	}
	
	public static void measure(int num) {
		Long start = System.nanoTime();
		linked(num);
		Long middle = System.nanoTime();
		array(num);
		Long end = System.nanoTime();
		System.out.println("Linked : " + (middle - start) + " ns\r\nArray : " + (end - middle) + " ns");
	}
}

```

結果

```
Linked : 19082700 ns
Array  : 14878000 ns
```

まぁ回数が少ないので何とも言えませんが、addだけならLinkedListの方が早いらしいです

ただ、get(0)とか、特定の要素を持ってくるのはArrayのほうが早いらしく

ただリストを作ってforループするだけならLinkedListでよく、順番とかをいっぱい使いたいならArrayって感じでしょうか

余力があればこういった細かい性能問題も考えられればうれしいです
Raspberry Piを用いた室内監視

#はじめに
Qiita初投稿です.よろしくお願いします.
#提案
RaspberryPiとセンサで安価な監視システムを作りたいと思いました。具体的には、研究室内にRaspBerryPi Zero,RaspBerryPi camera,人感センサ(HC-SR501)を設置し、人を検知したらカメラで撮影し,その画像をSlackに送信する監視システムです(未完成).

#使用した機材
・RaspberryPi zero
・RaspberryPi camera
・HC-SR501人体赤外線感応モジュール
・ジャンパーワイヤー(メス・メス)　3本

![35B3DEB4-8FBA-453F-943E-1122772F86F7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557268/aee61ea6-cbbb-93c4-2351-5ad2b8597e69.jpeg)


#実装
人感センサが人を検知したら,RaspberryPi cameraで撮影するプログラムは下記の通りです.

```Python:monitoring.py
import time
import picamera
import RPi.GPIO as GPIO

INTERVAL = 5

SLEEPTIME = 1

GPIO_PIN = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)

if __name__ == '__main__':
    try:
        print("処理キャンセルはCTRL+C")
        while True:

            if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
                with picamera.PiCamera() as camera
                    camera.resolution = (1024,768)
                    camera.brightness = 70
                    camera.capture('picture.jpg')
            else:
                time.sleep(INTERVAL)
    except KeyboardInterrupt:
        print("全処理終了")
    finally:
        GPIO.cleanup()
```
##実行結果
ローカルのWebサーバーを建て,画像が取得できていることを確認できました.

<img width="960" alt="キャプチャ picture.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557268/4004cf2b-119d-74d3-348a-0be365019e6e.png">


#おわりに
現状,このシステムはSlackにデータを送信する処理が実装できていない為未完成です.
実装後他の監視システムと比較し,このシステムの有用性を追求していきたいです.
僕のSQLserver

自分の忘れやすい操作を自分用にメモ


###テーブルの構造的な操作

```sql
--列の削除
ALTER TABLE [table] DROP COLUMN [column]

-- NOT NULL 制約の追加
ALTER TABLE [table] ALTER COLUMN [column] [date_type] NOT NULL

--primarykeyの設定
ALTER TABLE [table] ADD PRIMARY KEY ([column_x],[column_y]...)

--primarykeyの設定解除
ALTER TABLE [table] DROP CONSTRAINT [PRIMARY KEY name]

```



###更新
#####特定の列の更新
```sql
UPDATE [table] SET [column] = [alter value]
```

###挿入
#####BULK INSERT
```sql
BULK INSERT [table_name]
FROM 'file_path'
WITH (FIRSTROW = 2, FIELDTERMINATOR = ',')
```

###関数
```sql
--文字の置換--
REPLACE(対象,検索文字,置換文字)

--値の判定(数値かの判定)--
isnNumeric(x)
    --数値の場合:1
    --数値でない場合:0
```
#####OVER
[OVER](https://qiita.com/bubu_suke/items/5a4519bd502f71623949)
[Vue.js] ケバブケースとかキャメルケースとかパスカルケースとか

Vueでのケースの書き方って場所によって何がいいか若干悩みますよね。（私だけ？）
なので、まとめてみました。

## そもそも○○○ケースって？（復習）
一言で言うと「クラス名や変数名等の名前の付け方の総称」
覚えておくべきケースをざっと説明すると。。

## ケバブケース
文字と文字の区切りを`-`で表現するやり方。「チェインケース」とも言う。
ケバブのお肉をぶっさしている感じからきているとか。:meat_on_bone:


```
this-case-is-god
```

## キャメルケース
文字と文字の区切りを大文字で表現するやり方。
よく見るやつです。ラクダのこぶですね。:camel:

```
thisCaseIsGod
```


## パスカルケース
文字と文字の区切りを大文字で表現＋先頭の文字も大文字にする。
それもそのはず、「アッパーキャメルケース」とも呼ばれるのだから。
これもよく見ますね。

```
ThisCaseIsGod
```

## どこにどのケースを書くべきか？
### 基本的に下記の方針でOK

- コンポーネントは「パスカルケース」
- JavaScriptでは「キャメルケース」
- HTMLでは「ケバブケース」

記述に迷う主な例を挙げたいと思います。

## コンポーネントは「パスカルケース」

```vuejs
<template>
  <MyComponent></MyComponent>
</template>
```

因みに、componentsに指定する際にパスカルケースであれば、ケバブケースでも記述できるが
ケバブケースで指定するとケバブケースでしか動かない。

```vuejs
<template>
  <MyComponent></MyComponent>     <!-- OK -->
  <my-component></my-component>   <!-- OK -->
  <MyComponent2></MyComponent2>   <!-- NG -->
  <my-component2></my-component2> <!-- OK -->
</template>

<script>
export default {
  components: {
    MyComponent,
    'my-component2': MyComponent2,
  }
}
</script>

```

## props 属性は「ケバブケース」 その他は「キャメルケース」

```vuejs
<template>
  <MyComponent :my-data="hoge"></MyComponent>
</template>

<script>
export default {
  props: ['myData'],
}
</script>

```

## emitは「ケバブケース」
JavaScript内だが文字列として定義しているだけで、
カスタムイベント名として使われるためケバブケース推奨

```vuejs
<script>
export default {
  methods: {
    hogeFunc() {
      this.$emit('my-emit')
    }
  }
}
</script>
```

## 最後に
書き終わった後に気づいたのですが、とても分かりやすい記事がありました。
参考にさせていただきます。
https://qiita.com/ngron/items/ab2a17ae483c95a2f15e
値がNULLのレコードをCOUNT集計をしてくれなかった件

##やりたかったこと
カラムの値別のレコード件数を知りたい

##データ
| id     | pref_id |
|:------:|:-------:|
| 100000 | 27      |
| 138659 | NULL    |
| 200000 | 13      |
| 262241 | NULL    |
| 268371 | NULL    |
| 269365 | NULL    |
| 300000 | 13      |

##期待していた結果
| pref_id | cnt |
|:-------:|:---:|
| 13      | 2   |
| 27      | 1   |
| NULL    | 4   |

##ここで、つまづいた
```
mysql> select pref_id, count(pref_id) as cnt from dtb_customer group by pref_id;
+---------+-------+
| pref_id | cnt   |
+---------+-------+
|      13 |     2 |
|      27 |     1 |
|    NULL |     0 |
```
**カラムの値がNULLであるレコード件数がゼロで返ってきた**

##解決
```
mysql> select pref_id, count(*) as cnt from dtb_customer group by pref_id;
+---------+-------+
| pref_id | cnt   |
+---------+-------+
|      13 |     2 |
|      27 |     1 |
|    NULL |     4 |
```
**集計関数countにカラムを指定せず、レコード全体を指定すると**
**NULLレコードをカウントしてくれた**

##環境
MySQL 5.7.27
Python の Final - 型ヒントで定数と変更できない属性を宣言する。

PEP 591 で議論され Python 3.8 から追加されていたようです。

* [PEP 591 -- Adding a final qualifier to typing](https://www.python.org/dev/peps/pep-0591/)

## 変数

### ◯ 初期化しないとエラー

```python
from typing import Final

var: Final[int]
# sample.py:3: error: Final name must be initialized with a value
```

### ◯ 変更しようとするとエラー

```python
from typing import Final

var: Final[int] = 0
var = 1
# sample.py:4: error: Cannot assign to final name "var"
```

## 属性

### ◯ 初期化しないとエラー

```python
from typing import Final

class Class:
    attr: Final[int]
    # sample.py:4: error: Final name must be initialized with a value
```

### ◯ 変更しようとするとエラー

```python
from typing import Final

class Class:
    attr: Final[int]

    def __init__(self, attr):
        self.attr = attr


obj = Class(0)
obj.attr = 1
# sample.py:11: error: Cannot assign to final attribute "attr"
```
rubyでファイル末尾の改行を消す

git diffしたときの
「\ No newline at end of file」がウザいのでrubyで置換した

・パターン1

```ruby
ruby -i -ne 'print ARGF.eof? ? $_.chomp : $_' test.txt
```

・パターン2

```ruby
ruby -i -e 'print ARGF.read.strip' test.txt
```

sedでやりたかったな

もっといい方法あれば教えて下さい



viで↓をやるのがめんどくさかった
https://qiita.com/lemtosh469/items/b3a5b3b40d9f44dfbd06

（本当は末尾に改行がある方が正しいらしい）
両対数グラフの上で等間隔な点を打つ

細かい話ですが、何度も計算し直すのが面倒になったのでここでまとめておきます。

# 設定
あるパラメータ$\theta \in [\theta_{start} , \theta_{end}]$を動かして$\theta$の値ごとにシミュレーションを行い、その結果得られた観測値$f(\theta)$をグラフ上にプロットしたいものとします。このとき$f(\theta) \propto (\theta-\theta_c)^{\alpha}$のような依存性があり、この$\alpha$を求めたいものとします。$\theta_c$はあらかじめ求まっている、あるいは何かしらの値を一時的に仮定するものとします。具体的には臨界指数などを求めたい状況です。
このとき$f(\theta)$と$\theta-\theta_c$を両対数グラフ上にプロットすると、その傾きが求めたい指数$\alpha$を表しています。そこで、素朴に$\theta_{start}$から$\theta_{end}$まで等間隔に$N$個の$\theta$の値を選び、そのグラフをプロットしてみましょう。

![data_test_linspace.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313416/35788413-70e3-f604-b194-9ea2794ba4ed.jpeg)


このように、確かに直線が得られているため$f(\theta) \propto (\theta-\theta_c)^{\alpha}$という関係は成り立っていそうです。ただ、$\theta-\theta_c$が等間隔であるために、両対数グラフではグラフの一部分が密集してしまいます。これを両対数上でも等間隔になるように$\theta$をサンプルしたいというのがモチベーションです。特に臨界指数を計算するにあたっては$\theta-\theta_c$が十分近いときの情報が重要になるため、グラフの左端の部分をより細かく刻みたいというのは自然な発想です。

# パラメータリストの決定
いま求める$N$個のパラメータのリスト$\theta_i$が満たすべき条件は以下のようになります。
まず$\theta_0 = \theta_{start}$と$\theta_{N-1} = \theta_{end}$です。また両対数グラフ上で$\theta_i-\theta_c$が等間隔になるため、ある値$r$が存在して以下の式が成立します。
$$
\theta_{i+1} - \theta_c = r (\theta_{i} - \theta_c)
$$
よってこの式を繰り返し適用すると$\theta_{N-1} - \theta_c = r^{N-1} (\theta_0 - \theta_c)$が得られるため、両端の条件を考慮すると$r$の満たすべき式は
$$
r = \left( \dfrac{\theta_{end}-\theta_c}{\theta_{start}-\theta_c} \right)^{1/(N-1)}
$$
となります。
以上から、パラメータ$\theta$の選び方は次のような手順で示すことが出来ます。

1. 考えているモデルから$\theta_c$を適当に決める(既知の場合は理論値を用いる、わからないときは一時的に適当に決め、べき則に従うようなものを採用する)。
2. パラメータの数$N$と$\theta$の範囲$\theta_{start}$と$\theta_{end}$を決める。
3. $r$を上の式に基づいて求める。
4. $\theta_i = \theta_c + r^i (\theta_{start}-\theta_c)$を順に計算する。

この方法に基づいて先ほどと同じグラフを計算したものが次のグラフです。確かに両対数グラフ上で等間隔になっていることが確認できます。

![data_test_power.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313416/e3947501-e714-0523-deab-20a68cb2d737.jpeg)

一応データの生成用のコードとgnuplot用のスクリプトを示します。gnuplotでは$\theta_c$を定義しておくことで、簡単に$\theta-\theta_c$を横軸にすることができます。


```python:data_test.py

import numpy as np
theta_c = 2.0
theta_start = theta_c + 0.001
theta_end = 5.0

def f(x):
	return 2.0 * np.sqrt(x-theta_c)

N = 50

#linspace
theta_list = np.linspace(theta_start,theta_end,N)

data = [[] for i in range(N)]
for i in range(N):
	data[i] = [theta_list[i], f(theta_list[i])]

data = np.array(data)
np.savetxt("data_linspace.txt",data)

#power
r = ( (theta_end-theta_c)/(theta_start-theta_c) )**(1.0/(N-1))
theta_list = [theta_c + r**float(i)*(theta_start-theta_c) for i in range(N)]

data = [[] for i in range(N)]
for i in range(N):
	data[i] = [theta_list[i],f(theta_list[i])]
data = np.array(data)
np.savetxt("data_power.txt",data)

```

```:test_plt.txt
theta_c = 2.0
set xlabel "{/symbol q}-{/symbol q}_c"
set ylabel "f({/symbol q})"
set logscale
#plot "data_linspace.txt" u (($1)-theta_c):2 title "data"
plot "data_power.txt" u (($1)-theta_c):2 title "data"
set terminal jpeg
#set output "data_linspace.jpg"
set output "data_power.jpg"
replot
q


```
[wordpress]403 forbidden nginxの対処法

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#WordPressの管理画面に入れない
WordPressのwp-adminを表示しようとすると

```apache
403 forbidden nginx/1.16.0
```

![images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394657/955695dc-f260-a76d-a9a2-f00ff5baa21e.png)

このエラーの場合はnginxの設定エラーなのでサーバーの設定ファイルの中身を確認
一つ一つ確認したところwp-adminに関する設定を発見！

###設定ファイルの場所
>メインの設定ファイル
`cd /etc/nginx/`
各サーバー用設定ファイル
`cd /etc/nginx/conf.d/`

今回は`conf.d/`ファイルの中身をこの記事を参考にして確認しました。
・[Nginxで403 Forbiddenが表示された時のチェックポイント5選](https://engineers.weddingpark.co.jp/?p=1765/)

一旦、管理画面にログインできる状態にしたかったので`allow all;    # 全てのアクセスを許可`の記述を追加しました！

```nginx
location /wp-admin {
        auth_basic "Example";
        auth_basic_user_file /etc/nginx/.homepage;
        allow all;　#ここを追加
        }
```

あとは、設定を反映するために,nginxを再起動したら無事ログインできました！

```nginx
$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```

#参考記事
・[nginxサーバーでのphpMyAdmin設定「403 Forbidden 」と表示されてしまう](https://teratail.com/questions/32741/)
・[403 Forbidden nginx/1.16.0](https://wordpress.org/support/topic/403-forbidden-nginx-1-16-0//)
・[How to reload and restart Nginx (Dedicated servers only)](https://help.dreamhost.com/hc/en-us/articles/216454967-How-to-reload-and-restart-Nginx-Dedicated-servers-only-/)
・[【Webサーバー】Nginxが正常に起動されているか確認する](https://wordpress.org/support/topic/403-forbidden-nginx-1-16-0//)
npm を使用して、誰かが書いたコードをリユースする方法




## npmで誰かが書いたコードを使用する

NPM(Node Package Manager)は、誰かが書いたコードを使用できる便利な管理システム。

自分で1から作るんじゃなくて、誰かが書いたコードを使用できるなら、それをリユースして無駄な時間を削減しようっていう考え方を元に作成された管理システム。 

https://www.npmjs.com/



## npm を使用するまでの手順

今回は intro-to-node のフォルダ内のindex.jsというファイルでnpmを使用できるようにします。

<img width="763" alt="スクリーンショット 2020-01-14 15.14.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/77f57054-6d9a-353f-7838-21182b568662.png">


### npm を初期化する

コマンドラインでちゃんと intro-to-node フォルダに移動しているか確認してください。

<img width="534" alt="スクリーンショット 2020-01-14 15.17.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/fb6043ab-ba96-97c9-1ea2-31cf3cb1c718.png">

確認できたら 

```
npm init
```
で初期化します。

色々入力を求められるので、こんな感じで入力していきます。

<img width="442" alt="スクリーンショット 2020-01-14 15.20.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/08a27721-475f-1385-a744-3648d1ae4caa.png">

まぁほとんどコマンドラインの提案通りにEnter押していくだけで、実際入力したのは、description（説明）とauthor（著者）のみ。


すると、package.jsonファイルが intro-to-nodeフォルダに作成されているのがわかります。

<img width="282" alt="スクリーンショット 2020-01-14 15.22.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/0476a92f-0b72-fd88-8af4-eb7d1ad526e2.png">

ちなみに、package.jsonの中身はこんな感じ。

```json:package.json

{
  "name": "intro-to-node",
  "version": "1.0.0",
  "description": "This is a introduction to node project.",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "kibinag0",
  "license": "ISC"
}

```



### npm で使用したいパッケージを選ぶ


npm の公式サイト
(https://www.npmjs.com/)
にいって、使用したいパッケージを選ぶ。

今回使うのは、下記のスーパーヒーローの名前を取得してくれるパッケージです。
https://www.npmjs.com/package/superheroes

『superheroes name』 と検索したら、出てきました。


### 使用するパッケージをインストールする

各パッケージには、インストールの部分があるので、コマンドラインを使用してインストールします。

<img width="788" alt="スクリーンショット 2020-01-16 08.34.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/495a3b67-2a59-abf3-b2d4-44e8b81e5fe9.png">

ちゃんと自分が使用するフォルダ（intro-to-node）にいるか確認してから、インストールを実行しましょう。

<img width="529" alt="スクリーンショット 2020-01-16 08.37.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/28613f39-585a-eed2-4325-fcf8ef7d1507.png">

『npm install パッケージ名』

これでインストールは完了。


### パッケージを使用する

使用するときは、パッケージのUsageを見るとわかりやすいです。

<img width="780" alt="スクリーンショット 2020-01-16 08.40.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/c2c7f47d-4fd5-9a14-d222-cd62a55e0dc8.png">

```js:index.js

// superheroes をファイル内で使用できるようにする
const superheroes = require("superheroes");


// Usage に記載されている random() を使用する
var hero = superheroes.random();

// ランダムで Super Hero の名前を取得できる

```


これにてnpmの使用方法まとめ終了です。

このコンテンツはUdemyの [The Complete 2020 Web Development Bootcamp](https://www.udemy.com/course/the-complete-web-development-bootcamp/?deal_code=JPA8DEAL2PERCENTAGE&aEightID=s00000016735001) を参考にしています。
ERROR: network xxxx is ambiguous (2 matches found based on name) - #docker

delete one network

```
docker network ls

NETWORK ID          NAME                             DRIVER              SCOPE
e5a52a209d13        xxx   bridge              local
2ac4e2bbe24b        xxx   bridge              local
```

```
docker network rm 2ac4e2bbe24b
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2947








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DeepLearning_学習ノート_001

# jupyter nootbook が新規作成や保存できない時の解決方法

- エラー内容：
[An error occurred while creating a new notebook.]
[Not Found]

- bash環境にjupyter のconfigファイルを作成する

```
$ jupyter notebook --generate-config
```

- jupyterのconfigファイルに「NotebookApp.allow_origin」のような設定項目を見つけて
値に[*]を指定する

```.jupyter/jupyter_notebook_config.py
## Set the Access-Control-Allow-Origin header
#  
#  Use '*' to allow any origin to access your server.
#  
#  Takes precedence over allow_origin_pat.
#c.NotebookApp.allow_origin = ''
c.NotebookApp.allow_origin = '*'
```
Linux でテストファイルを一度に大量に作成するワンライナー

動作確認で、取り急ぎ 1 度に数千のファイルを準備する必要があったので、メモ。

奇をてらったことは何もしてません。
Windows Bash (Ubuntu) でも動きました。

```
touch test.file;for i in {1..5000};do cp test.file test_${i}.file;done

↓↓↓ これでも同じ。

touch test_{1..5000}.file
```

これで 5,000 個 (正確には 5,001 個) のファイルが作れます。
`5000` の部分を変えれば任意の数のファイルを作成できます。

ファイルサイズを指定したい場合はこんな感じ。

```
dd if=/dev/zero of=test.file bs=1M count=1;for i in {1..5000};do cp test.file test_${i}.file;done
```
これで 5,000 個の 1MByte ファイルが作れます。
`bs` × `count` のファイルサイズとなるので、これを変えることで任意のファイルサイズが指定できます。
AWS IAMユーザー作成方法

# はじめに
AWS IAMユーザーの作成方法をまとめました。

#### 関連リンク
関連リンクを下記に載せておくので、必要であれば参考にしてください。。

* 誰でも作れるクラウドストレージサービス ownCloud + EC2(AMI)
    * https://qiita.com/syukan3/items/7e3104388b2d79fd3177

# IAMユーザーとは
AWS Identity and Access Management (IAM) では、__AWS のサービスやリソースへのアクセスを安全に管理__できる。
IAM を使用すると、AWS のユーザーとグループを作成および管理し、アクセス権を使用して AWS リソースへのアクセスを許可および拒否できる。

__IAM は追加料金なし__で AWS アカウントに提供されている機能。

# 前提条件
* AWS アカウントが作成済みであること。

# IAM作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/5dd92ec4-a2a7-3b9c-dfaa-71ec14799259.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/4be992ab-d913-ee50-238b-ca1c463c687b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/5ee1dbc2-5715-bf44-d18a-799142576b6e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/1ac86336-4140-b95b-3a36-dfdbce267a0c.png)

ポリシーについては、そのIAMユーザーに何をさせたいかによりますので、各自必要なポリシーをつけるようにしてください。
添付画像はS3にアクセスできるIAMユーザーを作成するときの例を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/6d86e496-f572-f3b9-22e9-11dc9113d243.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/3898fcd7-ffc1-ece3-20d1-fd254bdd1ac4.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/e6208aef-06ba-4516-9982-884ef453fe1a.png)


下記のアクセスキーIDとシークレットアクセスキーをメモしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/50fd9aab-cf83-557f-754e-dec07040bb56.png)

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
Homebrew + rbenv + Bundler + dockerで開発環境をマネージドに構築する（後編）

#### 〜[前編](cb02e1574102388b649b)〜からの続き

## 前提

- 便宜上、既存のワーキングコピーがあります

## Docker手順

##### １. Dockerfileを作成する

```dockerfile:Dockerfile
FROM ruby:2.6.5

# Setting environment
ENV LANG C.UTF-8
ENV TZ Asia/Tokyo
ENV APP_HOME /var/www/capistrano_sample_app_v1

# Install libraries
RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs \           
                       vim \
                       default-mysql-client
RUN gem install bundler -v '2.1.4'

# Create app home
RUN mkdir -p $APP_HOME

WORKDIR $APP_HOME

# Copy Gemfile from origin
ADD Gemfile $APP_HOME/Gemfile

RUN bundle _2.1.4_ install --path vendor/bundle

ADD . $APP_HOME
```

### E: Package 'mysql-client' has no installation candidateとなった場合

- mysql-clientは消滅しており、代わりに `default-mysql-client` を使うか、 `mariadb-client` となります

### Dockerfileのコマンド

| コマンド | 説明 |
|:--------|:----|
| FROM | 使用するイメージとバージョン |
| RUN | コマンドの実行。railsに必要な必要なnodejsとpostgeqsqlをインストールしている |
| WORKDIR | そのままの意味。作業ディレクトリを設定します。 |
| ADD | ローカルのファイルをコンテナへコピーする（昔のCOPYコマンドになります） |
| ENTRYPOINT | 一番最初に実行するコマンド（ここではentrypoint.shを参照） |
| EXPOSE | コンテナがリッスンするport番号 |
| CMD | イメージ内部のソフトウェア実行（つまりRailsのことですね） |


##### ２. docker-composeを作成する

```docker:docker-compose.yml
version: '3'
services:
  api:
    tty: true
    stdin_open: true
    build: .
    ports:
      - "8080:8080"
    command: /bin/sh -c "rm -f /capistrano_sample_app_v1/tmp/pids/server.pid && bundle exec rails s -p 8080 -b '0.0.0.0'"
    volumes:
      # ホストのカレントディレクトリをコンテナの/capistrano_sample_app_v1にマウント
      - .:/capistrano_sample_app_v1
```

##### 3. docker build

```sh:Terminal
$ docker-compose up --build
...省略...
Successfully built b72c436f105e
Successfully tagged capistrano_sample_app_v1_api:latest
Creating capistrano_sample_app_v1_api_1 ... done
Attaching to capistrano_sample_app_v1_api_1
api_1  | from /var/www/capistrano_sample_app_v1/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.5/lib/bootsnap.rb:22:in `setup': The 'disable_trace' method is not allowed with this Ruby version. current: 2.6.5, allowed version: < 2.5.0
api_1  | => Booting Puma
api_1  | => Rails 5.2.4.1 application starting in development 
api_1  | => Run `rails server -h` for more startup options
api_1  | Puma starting in single mode...
api_1  | * Version 3.12.2 (ruby 2.6.5-p114), codename: Llamas in Pajamas
api_1  | * Min threads: 5, max threads: 5
api_1  | * Environment: development
api_1  | * Listening on tcp://0.0.0.0:8000
api_1  | Use Ctrl-C to stop
```

##### 4. プロセスの確認

```sh:Terminal
$ docker-compose ps
             Name                           Command               State           Ports         
------------------------------------------------------------------------------------------------
capistrano_sample_app_v1_api_1   /bin/sh -c rm -f /capistra ...   Up      0.0.0.0:8000->8000/tcp
```

##### 5. 停止

```sh:Terminal
$ docker-compose down
Stopping capistrano_sample_app_v1_api_1 ... done
Removing capistrano_sample_app_v1_api_1 ... done
Removing network capistrano_sample_app_v1_default
```

これで、ワーキングコピーをコンテナとして起動することができました
[Ruby]ネストされたHash(連想配列)をフラット(１階層）にする②

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#Hash(連想配列)を取り除く
前回からの続きです！
・[[Ruby]ネストされたHash(連想配列)をフラット(１階層）にする①
](https://qiita.com/hirokik-0076/items/771325ab561851af0dbb/)

ここからやっていきたいのは配列に入っている要素がHashだったら変数に変換する処理します。
要は、配列に入っている要素をチェックしてHashだったら特定の処理をしたら良いのです。

```ruby
#配列の場合
family_array = [ "sazae", "masuo", "tarao" ]      
pry(main)> family_array.is_a?(Hash)
=> false

#連想配列の場合
family_hash = { "tsuma" => "sazae", "otto" => "masuo", "kodomo" => "tarao" }
pry(main)> family_hash.is_a?(Hash)
=> true
```

・[Hashかどうかを判定しつつ任意の{key: value}を持っているかどうかを判定するメソッドを作った
](https://qiita.com/k-shimoji/items/76a3a570daa1364330fe/)

配列の要素を確認する処理
・[配列に対する繰り返し](https://www.javadrive.jp/ruby/array/index6.html/)
・[Ruby eachが初心者でも書ける！知っていると便利な知識とは？](https://udemy.benesse.co.jp/development/web/ruby-each.html/)

```ruby
array = hash.each_with_object([]) {|(k, v), array| array.concat v}
pry(main)> i=0
pry(main)> array.each do |var|
pry(main)*   if var.is_a?(Hash)
pry(main)*     params = var.keys
pry(main)*     array.delete_at(i)
pry(main)*     array.concat(params)
pry(main)*     print(array)
pry(main)*   end
pry(main)*   i=i+1;
pry(main)* end
=> [:name,
 :gender,
 :birthday,
 :primary,
 :clinic,
 :status,
 :age,
 :cycle,
 :history_test,
 :culture_test,
 :math_test,
 :house,
 :address,
 :favorite,
 :score,
 :history_score,
 :culuture_score,
 :math_score,
 :levels,
 :experience]
```

できた！

#メソッドにしていく！
フラットにする為の処理をメソッドにしていきます！
・[Rubyのメソッドについて
](https://qiita.com/ryosuketter/items/4cea4185f1cf7112f95b/)

###メソッドとは
>メソッドは色々な処理をひとつにまとめて定義して、何度も再利用（実行）できるようにしたものです。

```ruby
def メソッドの名前
  やりたい処理
end
```

ではメソッド化していきます！

```ruby
def flat_params(array)
  i=0
  array.each do |var|
     if var.is_a?(Hash)
       params = var.keys
       array.delete_at(i)
       array.concat(params)
     end
     i=i+1;
  end
end

array = hash.each_with_object([]) {|(k, v), array| array.concat v}
array = flat_params(array)
=> [:name,
 :gender,
 :birthday,
 :primary,
 :clinic,
 :status,
 :age,
 :cycle,
 :history_test,
 :culture_test,
 :math_test,
 :house,
 :address,
 :favorite,
 :score,
 :history_score,
 :culuture_score,
 :math_score,
 :levels,
 :experience]
```

これでフラットにできました！

#参考記事
・[class Array](https://docs.ruby-lang.org/ja/latest/class/Array.html/)
・[【Ruby入門】ハッシュ（hash）をeachで取り出す！その他ハッシュの応用について](https://style.potepan.com/articles/5433.html/)
・[Rubyで配列の要素数を調べるための3つのメソッドまとめ](https://tech-boost.jp/magazine/Programming-languages/ruby/1073503/)
・[【Ruby入門】Rubyにおけるメソッド（関数）の使い方](https://uxmilk.jp/22320/)
WEB API利用時のプロキシ対策

PythonのRequestsモジュールは環境変数のプロキシを使用しています。なので環境変数として設定してやりましょう。
※ここで設定するプロキシはプログラム内でのみ有効です。

以下の関数をmainの最初に呼んでやることでrequestsでプロキシを抜けられるようになります。

```Python 
import os

# Proxy setting
def proxy_setting():
    proxy_user = 'proxy_user'
    proxy_pass = 'proxy_pass'
    proxy_url = '******:8080'
    os.environ["http_proxy"] = 'http://' + proxy_user + ':' + proxy_pass + '@' + proxy_url
    os.environ["https_proxy"] = 'http://' + proxy_user + ':' + proxy_pass + '@' + proxy_url
```
【DOTween】ポップにアニメーションするボタンを作る【Unity】

# はじめに


[開発中のアプリ](https://twitter.com/hashtag/%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B7?src=hashtag_click)で[DOTween](http://dotween.demigiant.com/documentation.php)を使った簡単なボタンアニメーションを作ったので紹介します。

![Jan-16-2020 07-46-16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/4928f7be-8ca0-7be9-2dcb-e7098572bafe.gif)

使用しているUIアセット(有償): [Simple UI - Asset Store](https://assetstore.unity.com/packages/2d/gui/icons/simple-ui-103969)


# コード

使用する場合は以下のスクリプトをプロジェクトにインポートし、`Button`コンポーネントの変わりにアタッチしてください。CC0です。

Gist: [PopButton.cs](https://gist.github.com/nkjzm/b0a4f56d9787b1f6abe1102f496b9348)

```PopButton.cs
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine;

namespace nkjzm
{
    /// <summary>
    /// ポップに押されるボタン
    /// </summary>
    public class PopButton : Button
    {
        Tweener tweener = null;
        new void Start()
        {
            base.Start();

            // ボタンアニメーション
            onClick.AddListener(() =>
            {
                // 再生中のアニメーションを停止/初期化
                if (tweener != null)
                {
                    tweener.Kill();
                    tweener = null;
                    transform.localScale = Vector3.one;
                }
                tweener = transform.DOPunchScale(
                    punch: Vector3.one * 0.1f,
                    duration: 0.2f,
                    vibrato: 1
                ).SetEase(Ease.OutExpo);
            });
        }
    }
}
```

# 余談

ボタン押下時の機能を`AddListener`するとアニメーションの途中で見えなくなってしまう場合があるので、機能によっては`0.2f`秒のラグを入れてあげると良いかもしれません。
cyberdockが繋がらない＆編集したテキストがブラウザに反映されない



#解決方法

#cyberdockが繋がらない
php　サーバーを起動していなかった

##やり方
vagratup→vagrantsshを実行後、サーバーを立ち上げたいフォルダまでcdコマンドで移動してサーバーを立ち上げる

その後、cyeberdockが繋がるはずです。

#編集したテキストがブラウザに反映されない
macの再起動が原因でcyberdockから使用していたファイルにいくら編集を加えてもブラウザに反映されない経験をしました。
私はコレで数時間解決方法に費やしました💦

そんな時は
もう一度cyberdockからファイルを立ち上げてみましょう。
超音波距離センサ(HCSR-04)とRaspberry Piを使って凹凸の検出をしたい

#使用するもの
・Raspberry Pi Zero
・角が直角のもの(ティッシュの箱など)
・HCSR-04センサ×２
・プレッドボード
・ジャンパー

#Raspberry Piとセンサを接続する
HCSR-04とRaspberry Pi Zeroをジャンパ等で接続する
今回は接続方法については割愛する．詳細はこちらからhttps://algorithm.joho.info/programming/python/raspberry3-ultrasonic-distance-sensor-hcsr04/
また，センサと検出対象の物体の配置図は以下の図を参照する

#検出方法
検出は3つのステップで行います．また，すべてのステップではHCSR-04センサの位置は変更していません
・L：物体の中央線とセンサ間の距離(A,Bとも同じ距離である)
・ℓ：センサAと物体との距離
・ℓ’：センサBと物体との距離

###初期状態
![object1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558036/644c25fb-9ade-2560-14cd-a3a39d12957f.png)
ここでセンサAとセンサBとの距離を取得する
⇒実際に物体を通し始めるのを判定するため(距離はL＋L＝2Lとなります。)
###物体との距離の計測時
![object2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558036/d7bb707e-25d8-1e37-33a1-b89bcd50e31d.png)
Objectはゆっくりとできるだけ一定の距離で矢印の方向に動かします．速く動かしてしまうと距離がうまく取れなくなってしまいます．
また，矢印の方向以外に動かしてはいけません．
###計測終了時
![object3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558036/35921549-3b63-afb1-dd8a-9773588c6edd.png)
Objectがセンサ間を通し終えたら再びセンサA,Bとの距離を取得することになります．

#実際に分析してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558036/58ff60a4-1c78-1925-4507-5af56bd973ec.png)
上の表は計測が終えてRasberryPiで得るであろうセンサデータをまとめたものです．凹凸の検出はこのデータをもとに行います．物体の端は4回目の距離から変化しているので実際に超音波距離センサが物体を検知したといえます．
また，物体の最後の端の判定は16回目から18回目の値が初期状態とほぼ一致しているので物体が計測し終えたと言えます．
Q9.別のワークシートにセルの値をコピーするには？②

今回は、Q7で取り扱った別のワークシートへのコピーをもう一度取り扱って行こうと思います。

というのも、Q7の時は3シート分のデータを別シートへコピーするというものでした。
その為、かなり単調なコードにしてしまったからです。
今回は、13人分のデータを用意しました。(Q8参照)

こちらです。

![Q8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/b99bda06-1251-7e3d-7c7d-167ddf792c78.png)


前回の3人＋10人分のデータが追加されています。
これらのシートにある名前とそれぞれの得点を一つのシートに集約するマクロを作ってみましょう。




###■ポイント
ループ処理を利用することで、効率的に書くことができます。
どこからどこのデータを取得したくて、それをどのように記述するかを考えていくのが今回のポイントです。

ただ単に、記載するだけなら、Q7の時のように単純に記述すればいいだけですからね。
だけど、そうすると今回の数が多くなってきたときに不便になります。
今回は、その不便さをどうやって解消するかがポイントとなります。


###■回答
```VB
Sub Q9_Answer()
    Dim i As Integer
    Dim StartRow As Integer
    StartRow = 3
    For i = 3 To Worksheets.Count
        Worksheets("全体").Range("B" & StartRow).Value = Worksheets(i).Range("B3").Value
        Worksheets("全体").Range("C" & StartRow).Value = Worksheets(i).Range("C3").Value
        Worksheets("全体").Range("D" & StartRow).Value = Worksheets(i).Range("D3").Value
        Worksheets("全体").Range("E" & StartRow).Value = Worksheets(i).Range("E3").Value
        StartRow = StartRow + 1
    Next i
End Sub
```

###■解説
まず、StartRowについて。StartRowは集約するシートの記載する最初の行を表しています。
今回は、3行目で、データシートの最初のインデックス番号である3とたまたま一致していたので、StartRowに関する記述をすべて無くして、iにすることで同様のことを実現できますが、
可読性なども考慮し、今回のようにしています。

次に、For文ですが、i = 3と3からループが始まっていますね。
これは、データシートの最初のインデックス番号を表しています。
インデックス番号は左から1から順番に振られていきます。

なので、これ以前に別にシートを挿入してしまうと、動作がうまくいきません。
マクロを使う環境に合わせて適宜変えていく必要があります。
今回は、データシート以外は固定である前提で作成しています。


そして、最後が代入する値をWorksheets(i).Range("B3").Valueと
インデックス番号を使用して記述していることです。

こうすることでもし仮にデータシートが増えたとしても一切手を加えることなく、
同様の処理を行うことができます。
極端な話、1000件分のデータや10000件分のデータも取り扱うことができます。


最後にマクロを実行し、集約した後の画像を掲載しておきます。


![Q9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/6c86536e-046e-cc8a-4023-15773d61660c.png)
Spring Boot(Spring Web MVC + Tomcat)におけるSameSite Cookie

Spring Boot(Spring Web MVC + Tomcat)でSameSite Cookieを使うにはどのようにすればいいか、調べてみました。

## SameSite Cookieとはなにか

MDNのドキュメントを参照してください。

- https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies#SameSite_cookies_experimental_inline

## TomcatのSameSite Cookie対応

TomcatではCookieをHTTPレスポンスへ書き出すため`javax.servlet.http.Cookie`から文字列へのシリアライズを行います。
シリアライズは`org.apache.tomcat.util.http.CookieProcessor`インターフェースを通じて行われます。
実装クラスとして`org.apache.tomcat.util.http.Rfc6265CookieProcessor`が用意されていますが、この`Rfc6265CookieProcessor`クラスの`setSameSiteCookies`メソッドを使用してSameSite属性を付けられます。

- https://tomcat.apache.org/tomcat-9.0-doc/config/cookie-processor.html

SameSite属性を付ける設定をした`Rfc6265CookieProcessor`は`org.apache.catalina.Context`へセットしないといけませんが、とりあえずSpring Bootで使えればそれで良いのでTomcat単体でのカスタマイズ方法はスキップします。

## Spring BootでCookieProcessorをカスタマイズする

Spring Bootでは`org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer`インターフェースをimplementsしたコンポーネントを用意するとTomcatの`Context`をカスタマイズできます。

次のような実装クラスでCookieへSameSite属性を付けられます。

```java
package com.example;

import org.apache.catalina.Context;
import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.stereotype.Component;

@Component
public class SameSiteCookieTomcatContextCustomizer implements TomcatContextCustomizer {

    @Override
    public void customize(final Context context) {
        final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
        cookieProcessor.setSameSiteCookies("Lax");
        context.setCookieProcessor(cookieProcessor);
    }
}
```

- 完全なコード例 https://github.com/backpaper0/spring-boot-sandbox/tree/master/samesite-cookie-demo

## Spring SessionはデフォルトでSameSite属性が付く

@tokuhirom さんに教えてもらったのですが[Spring Sessionを使用するとデフォルトでSameSite属性が付く](https://github.com/spring-projects/spring-session/blob/2.2.0.RELEASE/spring-session-core/src/main/java/org/springframework/session/web/http/DefaultCookieSerializer.java#L88)ようです。

## まとめ

Spring Boot(Spring Web MVC + Tomcat)でSameSite Cookieを使うには次に示す2通りの方法があることがわかりました。

- `TomcatContextCustomizer`をimplementsしたコンポーネントを用意して`Context`へカスタマイズした`Rfc6265CookieProcessor`をセットする
- Spring Sessionを使用する
[Memo] vCenter6.7のネットワーク設定を変更する [Draft]

コンソールへログインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/93254517-376f-e5e7-a76d-84ce267b6e28.png)


F2を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/3199d1aa-8533-f323-b10e-8b1f7c39b36e.png)

F2を押してログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/16f2ab3b-8b30-8f67-52ed-9378ab7a3875.png)

Configure Management Networkを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/f01c2c44-f0de-f9c1-983b-4dad43993261.png)

IP Configurationを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/4323bfb8-71f0-312a-dad4-9006646d1d07.png)

設定を変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/af26f2ff-25d5-7b8f-aeca-6a05e07ffbd1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/59d05c46-87c2-2e42-b771-2dbfafbf0740.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/133a7715-4133-e1c6-c9b5-63cf7bd3fe8a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/e7a906b1-8bee-14c4-8217-0ad09096dfd9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/67391c08-2cc2-05e2-34de-81bdd7e40ffa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/e981fdf1-2dae-91aa-859c-a08fad30e234.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91280/d4bfbe40-eb52-93ab-0280-860c4bf3d2d0.png)
Rustで関数を返却するメソッドをトレイトに分離して戻り値の型をi32でもStringでも使えるようにしたい

・「impl Trait」はトレイトメソッドの戻り値に指定できんのでBoxを使用する
・トレイト名の後ろでジェネリクスを指定
・Stringの場合、関数を作成する前にcloneを呼んでコピーを渡すと関数のライフタイムを考慮しなくてよい

```Rust
trait MakeAddFn<T>{
    fn make_add_fn(&self)-> Box<dyn Fn(T)->T>;
}
struct Qom {
    p:String,
}

impl Qom{
    pub fn new(q:String) -> Qom{
        Qom{p:q}
    }
}

impl MakeAddFn<String> for Qom {
    fn make_add_fn(&self)-> Box<dyn Fn(String)->String>{
        let temp = self.p.clone();
        Box::new(move |r| format!("{}{}", temp, r))
    }
}

struct Pom<'a> {
    p:&'a i32,
}

impl Pom <'_>{
    pub fn new(q:&i32) -> Pom{
        Pom{p:q}
    }
}

impl MakeAddFn<i32> for Pom<'_>{
    fn make_add_fn(&self)-> Box<dyn Fn(i32)->i32> {
        let p = *self.p;
        Box::new(move |r| p + r)
    }
}

fn main() {
    let p = Pom::new(&8);
    let add_fn = p.make_add_fn();
    assert_eq!(15, add_fn(7));
    println!("function result:{}", add_fn(10));

    let q = Qom::new("トム".to_string());
    let add_fn_s = q.make_add_fn();
    println!("タイトルは\"{}\"", add_fn_s("とジェリー".to_string()));
}

```
【Firebase】【Firestore】名前にドットや空白など記号を含むフィールドで検索する

Firebase&Firestoreで、名前にドットや空白など記号を含むフィールドに対してクエリ実行する方法を紹介します。
(2020.1.16現在)ドキュメントに書かれている方法ではなぜか正しく動作しません。

# 前置き（うまくいかない例）

Firestoreではフィールド名にドットや空白など記号を含めて保存することができます。

```javascript
let db = firebase.firestore();
const testdata = db.collection("data").doc("test");

const doc = {normal:true, map:{}};
doc['dot.test'] = true;
doc.map['normal'] = true;
doc.map['space test'] = true;
doc.map['123456'] = true;

db.collection("data").doc("test").set(doc);
```

保存されたデータ↓

<img width="851" alt="スクリーンショット 2020-01-16 5.00.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31437/188074ae-2251-0e5d-58fd-3557c8a38317.png">

これらのフィールドをwhere条件にしてクエリを実行します。

通常のフィールド名（アルファベット＆数字＆アンスコのみ、かつ数字開始ではない）の場合、フィールド名をそのまま文字列で指定すればOKです。

```javascript
let query = db.collection('data').where('normal', '==', true);
let querySnapshot = await query.get();
querySnapshot.forEach(function(dataRef){
  console.log(dataRef.id, dataRef.data());
});
```

結果↓
<img width="427" alt="スクリーンショット 2020-01-16 5.14.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31437/f49e881a-6e00-f400-6265-6c95c7af6709.png">

入れ子の場合はドット区切りで指定

```javascript
query = db.collection('data').where('map.normal', '==', true);
```

ここからが本題。
ドットや空白などが含まれるフィールドをそのまま検索してみます。

```javascript
query = db.collection('data').where('dot.test', '==', true);
```

```javascript
query = db.collection('data').where('map.dot.test', '==', true);
```

これだと結果が返ってきません（空白を含むフィールドも同様）。

[ドキュメント](https://firebase.google.com/docs/firestore/quotas#collections_documents_and_fields)を見ると下記の様に書かれています。

> Constraints on field paths
>  * Must separate field names with a single period (.)
>  * Must enclose each field name in backticks unless the field name meets the following requirements:
>    - The field name contains only the characters a-z, A-Z, 0-9, and underscore (_)
>    - The field name does not start with 0-9

言われるがままバッククォートで囲んでみます。

```javascript

query = db.collection('data').where('`dot.test`', '==', true);
```

しかしこれでも結果は返ってきません。

# 正しい方法

どうもドキュメントが間違っていて正しくは[firebase.firestore.FieldPath](https://firebase.google.com/docs/reference/js/firebase.firestore.FieldPath)を使用する必要がある様です。

```javascript
query.where(new firebase.firestore.FieldPath("dot.test"), "==", true)
```

入れ子やmapの場合

```javascript
query.where(new firebase.firestore.FieldPath("map", "dot.test"), "==", true)
```

参考：
[firebase - Firestore Query Properties with special characters - Stack Overflow](https://stackoverflow.com/questions/49396148/firestore-query-properties-with-special-characters)

これで結果が返ってきました🎉

ちなみに「どんなときにフィールド名に記号とか保存するんだよw」と思われる方もいるかもしれませんので使用例をリンクしておきます^^
https://blog.knightso.co.jp/entry/2020/01/16/042702
Anaconda環境でnumpy使用時にIntel MKL FATAL ERRORが発生した際の対処

# 環境
Windows 10 Home 64bit
conda 4.8.1 (Python 3.7.6)

# 原因
DTMソフトなどのインストーラが、`C:\Windows\System32`の中に

- mkl_\*.dll   (\*はワイルドカード)
- libiomp5md.dll

をインストールしてしまい、コンフリクトを起こしてしまうことが原因のようだ。

# 対処
上記のファイルを別フォルダに移すか、拡張子の後ろに.bakをつけるなどしてファイル名を変える、などで対処ができる。

ただし、この対処を行うと上記ファイルをインストールしたソフトが動かなくなる可能性がある。
ソフトのインストールフォルダ内にこれらのファイルを置くことでそちらも対処可能。

# 余談
普通にググっても古い情報ばかりにあたりなかなか解決しなかったが、Twitterで調べたら解決方法に行き当たった。最新情報を取得できるのはTwitterのメリットだと実感。

筆者が今後numpyを使うときは、どのソフトにどう影響がでるか分からないためAnacondaを諦めてGoogle Colabか仮想環境を利用した開発を検討しようと思う。本当はDockerなどの仮想環境を使ったほうがいいのかもしれない。
何か他に良い解決方法があれば教えてください。

# 参考
情報源
https://twitter.com/zigzph/status/1150379847237025792
https://twitter.com/zigzph/status/1150379988442464257
参考になりそう
https://stackoverflow.com/questions/57567892/intel-mkl-fatal-error-cannot-load-mkl-intel-thread-dll
Day6 グラフに適用するデータ取得・データ削除

#グラフのデータをどう取得するか
##問題
Chartkickのグラフには日付と体重を、graphsテーブルから取得して表示させたかった。
しかし、graphsテーブルから両方のコラムだけを取得する方法がわからなかった。
例えば Current_user.graphsでgraphsテーブルをすべて取得できるが、そこから日付と体重を抽出しようとして、current_user.graphs.weightとかは取り出すことができない。
また、Graph.allでデータを全て取得して、そこから.weightとかしても取得することはできない。（←なんで？？取得できた方が便利そうなのになぜだろう。）
##解決
結論から書くと、pluckメソッドというモデルの特定のコラムのみを抽出してくれるメソッドを利用した。
pluckメソッドでは取り出したデータの形？もChartkickのグラフにそのまま適用できそうだったのでよかった。
・配列の中に配列ができる入子構造のpluckメソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/efb43983-b9a5-94bc-4be5-547dd6e7260b.png)
・同じく配列の中に配列の入子構造のChartkick
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/5d8f47e3-3596-8a5a-12d1-463b276f6e60.png)
また常に最新の日付をグラフでは一番右（折れ線グラフであるため）に持ってきたかったので、Rails Tutorialにもあったようにモデルで最新データが一番上になるように順番を定義しておいた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/efd8a529-8b71-9878-a2b0-2044563884d5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565105/c8da13ec-5b7f-fadc-59ce-2805ca556062.png)
#まとめ
Day6は主にグラフ関連の実装や修正を行った。ユーザの体重・体重登録した日付をグラフに読み込ませたり、投稿した体重を削除できるようにした。
また、これからは実装したことや解決したことは「課題リスト」を別途作成したのでそちらにまとめようと思う。
オリジナルアプリ制作過程は、なにをやったかのまとめや感想、反省点などを記録していきたい。
#反省点
前半に飛ばしたからか、少しモチベーションが失速したり集中力が途切れたりしてしまうようになってきた。
その日実装することややることをまずは明確にして、目標設定をしてからやるようにして改善したい。
とりあえず明日は、ユーザ同士でコメントをできるような機能を実装しようと思う。
「ゲームプログラマになる前に覚えておきたい技術」を Visual Studio 2019で試すときの注意

「ゲームプログラマになる前に覚えておきたい技術」は古い書籍のため公式が配布しているサンプルコードはそのままでは動かない。

# ネットでその解決策を検索すると
[ゲームプログラマーになる前に覚えておきたい技術 近代化プロジェクト – すらりん日記]
(https://blog.techlab-xe.net/game-programmer-book-new-build/)

というものがある。これはVisual Studio 2017向けのものである。
Visual Studio 2019でも動くかなと思ったがいろいろとエラーが出る（詳細は省略）。
解決は難しそうである。



# じゃあどうするか
[「ゲームプログラマになる前に覚えておきたい技術」のサンプルコードをWindows10のVisual Studio Community 2015でビルドする](http://log.moremorefor.net/entry/game-programmer-book-build-vs2015)
を参考にするとよい。

こちらはビルド時エラーが出たファイルのトップあたりに
``#include <algorithm.h>``
を追加していけばサンプルコードを動かすことができる。
dockerコンテナ リソース変化とメトリクス確認(docker stats, htop)

# Dockerのリソース変化
dockerを0から触れていまだ勉強中なので記事内に間違った内容などがあれば編集リクエストを送っていただけるととても助かります:bow:

##cpu割り当て時間
  
dockerコンテナのcpu割り当て時間は基本的に100%で割り振られ,そのコアに割り当てられたコンテナの個数で決まる. なので1つだけコンテナを立てるとcpuの割り当て時間は100%になってしまう.
要するに同じコアに3つコンテナが建てられたら1つあたりの割り当て時間は、100/3で33.333...%になるらしい.

cpuのコアの指定には`--cpuset-cpus`
cpu割り当て時間の変更には`--cpus`を使い変更.
以下の例は起動中のコンテナのcpuコアを1にして割り当て時間を50%にする場合です.

```
docker container update --cpuset-cpus=0 --cpus="0.5" <変更したいコンテナID>
```

## メモリ割り当て
メモリの割り当て変更には, `-m`を使います.
以下の例は, 起動中のコンテナのメモリ容量を100MBに制限する例です.

```
docker container update -m 100m　<変更したいコンテナID>
```
制限したいメモリ容量の単位は、b(バイト)k(キロバイト)m(メガバイト)g(ギガバイト)が使えます.


# コンテナメトリクス
コンテナのメトリクスを確認するうえで手っ取り早いのは
- docker stats
- htop
個人的には、この2つだと思います...
(コンテナのメトリクス確認なのでデータ取得にはdata dogやelasticsaerchを入れたほうが楽)

## docker stats
`docker stats`を実行するだけで起動中のコンテナの状態を一目で確認することができます.

```
docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
e7c6f7cd0153        magical_elbakyan    9.84%               50.67MiB / 100MiB   50.67%              9.97kB / 0B         341MB / 807MB       1
7d8cddfc7d9c        nervous_jones       50.08%              52.11MiB / 100MiB   52.11%              9.97kB / 0B         8.24GB / 8.91GB     1
d7d25131fa19        confident_kilby     100.33%             53.11MiB / 100MiB   53.11%              10.2kB / 0B         3.87TB / 10.7TB     1
```

|docker stats  |意味  |
|---|---|
|cpu%  |cpu割り当て時間  |
|MEM use  |メモリ使用量  |
|MEM%  |メモリ使用率  |
|NET I/O  |ネットワークI/O  |
|BLOCK I/O  |入出力中の待機I/O  |



## htop 
htopはdocker statsとは違い実行したマシンのプロセスがすべて表示されます.
`htop`で実行
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502802/1d8e3453-f488-f836-5f9b-c5b0d3012ed0.png)

cpuの状態とメモリ, swap, load averageが一目で見れてCPU・メモリ使用量で並び変えもできるので マシン全体でコンテナがどう動いているかの確認に向いてると思います.

|htopステータス  |意味  |
|---|---|
|PID |プロセスID |
|NI|プロセス優先度  |
|VIRT|仮想メモリ |
|RES|物理メモリ  |
|SHR|プロセスと共有されるメモリ | 
|S|プロセス起動状態  |
|CPU%|cpu使用率  |
|MEM%|メモリ使用率  |
|TIME+|プロセス起動時間  |


## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [さくらナレッジ - Dockerコンテナで利用できるリソースや権限を制限する](https://knowledge.sakura.ad.jp/5118/)
- [Docker実践ガイド第2版 - インプレスブックス](https://book.impress.co.jp/books/1118101052)
（swift）Loafで、サクッとエラーメッセージを表示する

#Loafって？
（実装例）
![20200116_021428.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/4ca3fee4-c4d1-9c02-2818-d6b4aa1f022f.gif)


>Inspired by Android's Toast,
Loaf is a Swifty Framework for Easy iOS Toasts
(引用：　https://github.com/schmidyy/Loaf)

つまり、
ios版のAndroid's Toastのようです。

ちなみに、Android's Toastとは、以下です。
>トーストは、操作に関する簡単なフィードバックを小さなポップアップに表示します。 トーストでは、メッセージの表示に必要なスペースのみを使用します。現在のアクティビティは表示されたままになり、引き続き操作することができます。トーストはタイムアウト後に自動的に消えます。
(引用：　https://developer.android.com/guide/topics/ui/notifiers/toasts?hl=ja)!

Loafを使うことで、超カンタンにエラーメッセージやアラートなどを実装することができます。

#Loafの使い方
Cocoapods
まず、`pod 'Loaf'`を追加して、`pod install`してください。

そして、以下のコードを記述してください。

```swift:
Loaf("メッセージを表示", sender: self).show()
```

以上です。（ｶﾝﾀﾝｽｷﾞ）

#応用
####スタイルをカスタマイズする（実装例）


```swift:
//アイコンのイメージを指定する（今回は、postクラスのphoto(UIImage)を使用しました。）
let image = self.post.photo

Loaf("\(self.post.name)のポストを編集しました。", 
      //.customを指定し、背景色にsystemGreenとアイコンにimageを指定する
      state: .custom(.init(backgroundColor: .systemGreen, icon: image)), 
      location: .top, presentingDirection: .vertical, dismissingDirection: .vertical, sender: self).show()
```


実行結果↓
![20200116_021515.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/5f7ef025-a188-6654-1df6-254c00276bf8.gif)

#引用（スペシャルサンクス）
- https://github.com/schmidyy/Loaf
- https://developer.android.com/guide/topics/ui/notifiers/toasts?hl=ja!