OmniAICreator/Qiita-1.07M huggingface dataset:
"RYOURIAI", 自分の初めてのPythonと機械学習のプロジェクト!

##バックグラウンド
毎日、人間は「今日は何を食べようか？」と「今日は何の料理を作ろうか？」悩みます。私もその悩んだことがあります。そうして、その悩んだことから課題をもらいました。それだけではなく、私は、AIと機械学習に興味があります。そうして、課題と自分の興味から一つのアイデアを考えました。そのためにRYOURIAIのアプリを作りたいと思います。

##RYOURIAIは何ですか？
RYOURIAIは料理レシピを提供するプラットフォームです。それだけじゃなくて、RYOURIAI 個人的なAIもあります。AIは、ユーザデータ自体に基づいて何を食べるべきかをユーザに提案する。また、ディープラーニングで技術を駆使して、レシピを探すのに役立つさまざまな機能を提供します。

##RYOURIAIの機能
このアプリについて、これは今まで考えたの機能です。
-　好きなものから（AI）に何を食べるべきものについての示唆を与える。
-　持っている食材から（AI）に何を作るできます提案する。
-　写真から（AI）にレシピを提案する。
-　データ履歴から近くのレストランに提案する。
-　自分のレシピをシェアするもできます。
-　他の人のレシピをレビューと評価することができます。
-　月間ランキング。

##フロー
![Flow-Page-1.png](https://qiita-image-store.s3.amazonaws.com/0/289131/2e8db647-125c-8968-3429-095e4f068a93.png)



##目標
- Pythonを理解できる
- AIと機械学習の知識を上げる
- AIの機能を作る。

##フィードバック
- いいの勉強ソースありますか？
- このアプリ、ビジネスチャンスはどう思いますか？
- 今まで作ったの部分はどう思いますか？

##今まで作ったの機能
####テキストプロセス

ユーザーは食材のリスト入力して、機械学習をプロセスして、おすすめの料理をもらいます。
今使いるのデータセットはインドネシアのデータセットです。データセットのリンク： https://www.kaggle.com/canggih/indonesian-food-recipes

データセットはインドネシア語ですから、今インドネシア語の言葉だけ入力ことができます。

1. 最初は自分あるの食材を入力する。
![Snipaste_2018-09-11_00-58-46.png](https://qiita-image-store.s3.amazonaws.com/0/289131/1b93571f-4519-512f-6880-e684e1d6b8b1.png)
2．システムからレシピの提案をもらいます。
![Snipaste_2018-09-11_00-59-37.png](https://qiita-image-store.s3.amazonaws.com/0/289131/7ef9d6a0-e8ca-d490-dbcd-89ea3ad20910.png)
java ArrayList,Vector,LinkedList 比較

###1.比較する

| 項目      |      ArrayList |   LinkedList    | Vector    |
|:-----------------|------------------:|:------------------:|:------------------:|
| 作られたバージョン             |             JDK1.2 |        JDK1.2        |   JDK1.0       |
| マルチスレッド(synchronized)             |  非対応 | 非対応 |   対応       |
| スピード(add)             |  速い | 普通 |   遅い      |
| スピード(get)             |  速い | 普通 |   遅い      |
| スピード(remove)             |  普通 | 速い |   遅い      |
| pop,push機能             |  なし | あり |   なし     |


###2.[サンプルコード](https://github.com/YanHengGo/java/tree/master/10_listDemo)



###3.まとめ

remove,push,pop などを使うときにLinkedListを使う
マルチスレッドを使うときにVectorを使う
そのほか、ArrayList使う
第44話 完全順列

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第44話です。

```math
!5=5!\sum_{k=0}^{5}\frac{(-1)^k}{k!}=44
```

!5とは、完全順列(錯乱順列)を表す数です。
モンモール数とも呼ばれます。

5!はみたことがある人も多いでしょう。
次の計算を意味する記号です。

```math
5!=1\times2\times3\times4\times5=120
```

また、順列の組み合わせを計算するときに使います。
5人を1列に並べるとき、何通りの組み合わせがあるか、というものです。

!5はなにかというと、5人が席替えしたとき、誰も元の席に戻らない組み合わせです。
プレゼント交換したときに、自分のプレゼントが返ってこない組み合わせと言い換えてもいいでしょう。

計算方法を考えます。
まず、すでにABCDの4人に新しいEを付け加えるとします。

EはEの席にいては駄目なので、まず、EはAの席に座るとします。
すると、Aは別の席に座る必要があるのですが、
AがEの席に座るのか、BCDの席に座るのかでやや話が変わります。

もし、AがEの席にすわるとしたら、AとEが席を交換したことになります。
残りBCDは3人だけで入れ替わることになります。
すなわち、このパターンは「3人の完全順列」だけ存在します。

もしAがE以外の席に座るとしたら、まずABCDで席替えを行い、
Aの席の人とEが入れ替わるのと同じことになります。
つまりこのパターンは「4人の完全順列」だけ存在します。

まとめると、EがAの席に座るパターンは、
「3人の完全順列」＋「4人の完全順列」の数だけ存在します。
EはAの席のほか、B,C,Dの席の場合もあり、これらはAの席に座るときと重複しません。

これらを式にして表すとこうなります。

```math
M(n)=(n-1)(M(n-1)+M(n-2))
```

第2話のフィボナッチ数列と似ている式ですね。
この漸化式を一般式に置き換えると冒頭の式になります。

ちなみに、ランダムに作った順列が完全順列になる確率は、
個数が十分に大きいと1/eになります。
36%でプレゼント交換は大成功しますが、
残りの63%は誰かが自分のプレゼントをもらうことになります。


1/eや36%に見覚えはあるでしょうか。
ガチャの爆死確率です。
1%のガチャを100回引いて当たりが引けない確率が1/eや36%です。

1/eとか36%とかという確率は、確率計算をするときによく出てくる数で、
大体1/3に収束するな、と思ったら1/eであることは少なくありません。
株価予測に関する研究論文などのリンク【おれよう】

# はじめに
自分があとで読む(はず！)の、株式予測にAI技術を応用した実験結果論文のリンク集です。
きっと誰かの役に立つはず。。。

# リンク
- [Stock price movement prediction using
distributed representations of financial report](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/1177.pdf)
- [Stock Price Forecasting Using Information from Yahoo	Finance	and	
Google Trend](https://www.econ.berkeley.edu/sites/default/files/Selene%20Yue%20Xu.pdf)
- [株価変動パターンの類似性を用いた株価予測](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/367.pdf)
- [資産価格変動パターンの類似性に着目した金融市場予測の評価](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/685.pdf)
- [金融レポート、およびマクロ経済指数によるリアルタイム
日銀センチメントの予測
](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/1000.pdf)
- [投資割合を考慮した投資先類似度に基づく投資信託のクラスタリング](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/1192.pdf)
- [時系列データの動向概要を示す要約文生成に向けて](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/127.pdf)
- [テキスト情報から生成された極性辞書を用いた市場動向分析](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/563.pdf)
- [深層学習と高頻度データを用いた株式注文状況の推定](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/798.pdf)
- [時系列データ間䛾連関性と関係性理解䛾ため䛾
ビジュアルインタラクティビティ](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/822.pdf)
- [深層学習を用いた株価予測䛾分析](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/1112.pdf)
- [LSTM を用いた株価変動予測](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/1006.pdf)
- [ティックデータを用いたニュースと株価との関連性分析](https://www.ai-gakkai.or.jp/jsai2016/webprogram/2016/pdf/1127.pdf)
- [個人の予測信頼度を加味した株価掲示板情報からの株価予測](https://www.ai-gakkai.or.jp/jsai2016/webprogram/2016/pdf/332.pdf)
- [ファイナンス掲示板情報から䛾株価予測](https://www.ai-gakkai.or.jp/jsai2016/webprogram/2016/pdf/369.pdf)
- [テキストモダリティ分析に基づく投資家心理の検証](https://www.ai-gakkai.or.jp/jsai2016/webprogram/2016/pdf/445.pdf)
- [新聞記事の時系列テキスト分析による株式市場の動向予測](https://www.ai-gakkai.or.jp/jsai2016/webprogram/2016/pdf/1016.pdf)
- [銘柄類似度グラフの時系列構造変化に基づく株価予測](https://www.ai-gakkai.or.jp/jsai2016/webprogram/2016/pdf/311.pdf)
- [銘柄別期間全列挙に基づく季節性アノマリーのマイニング](https://www.ai-gakkai.or.jp/jsai2016/webprogram/2016/pdf/488.pdf)
Python環境構築（pyenv + pipenv + anaconda）

pyenvをinstall, globalでpythonを設定

## pyenv
#### Linux
    git clone https://github.com/pyenv/pyenv.git /usr/local/pyenv

/etc/profile.d/pyenv.shを以下の内容で作成

    export PYENV_ROOT=“/usr/local/pyenv”
    export PATH=“${PYENV_ROOT}/bin:${PATH}”
    eval “$(pyenv init -)”
#### Mac
    brew install pyenv
    export PATH=“$HOME/.pyenv/shims:$PATH
    pyenv install -l
    pyenv install anaconda
    pyenv global anaconda

## pipenv
   (sudo) pip install pipenv
https://pipenv-ja.readthedocs.io/ja/translate-ja/install.html
https://kashewnuts.github.io/2018/03/15/pipenv.html

---
pipenv install/shell をした場合に

```
ERROR: The executable /Users/{USER_NAME}/{USER_PROJECT_NAME}/.venv/bin/python is not functioning
ERROR: It thinks sys.prefix is '/Users/{USER_NAME}/{USER_PROJECT_NAME}' (should be '/Users/{USER_NAME}/.local/share/virtualenvs')
```

とエラーになる場合がある。



※ デフォルトの挙動だと /Users/{USER_NAME}/.local/share/virtualenvs/プロジェクトのディレクトリ名+ハッシュ値 のように仮想環境名が決まるため


`PIPENV_VENV_IN_PROJECT=true` をbashrcなどに設定してsource.

これにより、プロジェクトディレクトリ(~/projects/hoge など)で pipenv install/shell した時に ~/projects/hoge/.venv となるように仮想環境を作成してくれます。

---
開発に必要なものが入っているかチェックするツール

開発に必要なものが入っているかチェックするツール [Ready](https://github.com/utisam/ready) を作りました。

`install.sh` があるので `git clone` してインストールしてください。

```bash
git clone git@github.com:utisam/ready.git
cd ready
sudo ./install.sh
```

ただのシェルスクリプトです。アンインストールしたい時は `/usr/local/bin/ready` と `/usr/local/lib/ready` を削除してください。

プロジェクトのルートディレクトリに `.readyrc` を書きます。

```bash
check_command "dep"
check_command "migrate"
```

新しくそのプロジェクトに参加した人は、 `ready` コマンドを実行します。

```bash
ready
```

以下のようにコマンドの存在がチェックされます。

```text
Command: dep ... OK
Command: migrate ... OK
```

全て OK が表示されれば、必要なツールが全て整っていることになります。 `README` などにいちいち書かなくても良くなりますし、自動でチェックしてくれるので便利だと思います。特に `configure` や `CMake` のようなツールを利用しないプロジェクトでご利用ください。
DIについて調べてみたら理解仕掛けたのでpythonでまとめてみる

月曜日の夜なのに眠れないのでDIについて調べみた

## DI(Dependency Injection)とは
* 依存性の注入とか呼ばれるもの
* あるクラスAの成立に他のクラスBが必要なときAはBに依存している
* インターフェースを定義して、外部から依存先を注入できるようにしたもの

### 依存性を外部から注入出来ていない例

* Watcherは自分自身の心の中で視聴するアニメを決めてしまっているので他にアニメがあっても一個しかアニメを観れない

```python

class SSSSGridman():
    
    def bloadcast(self):
        return "gridman !!!"

class Jojo():
    
    def bloadcast(self):
        return "yareyaredaze !!!"

class Watcher():

    def in_my_heart(self):
        self.jojo = SSSSGridman() 
    
    def watch(self):
        print("I watchd", self.jojo.bloadcast())


if __name__ == "__main__":
    watcher = Watcher()
    watcher.in_my_heart()
    watcher.watch()
```


```
# 実行結果
I watchd gridman !!!
```


### 依存性を外部から注入出来ている例

* アニメという概念で抽象化してまとめる
* 外部からそのように定義されたものを受け付けるメソッドも定義されているのでメイン関数実行時に視聴するアニメを渡して上げることができる。

```python

from abc import ABCMeta, abstractmethod

class Animation(metaclass=ABCMeta):
    @abstractmethod
    def bloadcast(self):
        pass

class SSSSGridman(Animation):
    
    def bloadcast(self):
        return "gridman !!!"


class Jojo(Animation):
    
    def bloadcast(self):
        return "yareyaredaze !!!"

class Watcher():

    def receive_fashion(self, animation):
        if not isinstance(animation, Animation):
            raise Exception("It's not ANIME")
        self.animation = animation 
    
    def watch(self):
        print("I watchd", self.animation.bloadcast())


if __name__ == "__main__":
    watcher = Watcher()
    watcher.receive_fashion(Jojo())
    watcher.watch()
    watcher.receive_fashion(SSSSGridman())
    watcher.watch()
    watcher.receive_fashion("あにめじゃないもの")
```

```

## 実行結果
I watchd yareyaredaze !!!
I watchd gridman !!!
Traceback (most recent call last):
  File "DI_test.py", line 38, in <module>
    watcher.receive_fashion("あにめじゃないもの")
  File "DI_test.py", line 25, in receive_fashion
    raise Exception("It's not ANIME")
Exception: It's not ANIME

```

### 参考にさせていただきました

* [PythonでのDependency Injection 依存性の注入](https://qiita.com/mkgask/items/d984f7f4d94cc39d8e3c) <- とてもわかりやすかった
Python用時系列データ予測ツールprophetを使って株価推移グラフを作る

# はじめに
この記事では、Facebook社が開発した時系列データ予測ツール[Prophet](https://www.slideshare.net/hoxo_m/prophet-facebook-76285278)を使用して、
将来株価の予測を行いました。サクッと使えて面白いライブラリだと思います。

実行環境はColabotory,Python3.5.2です。
# 参考
今回の内容のほぼすべては、以下記事の情報によります。感謝です。

- 理論:[Prophet入門](https://www.slideshare.net/hoxo_m/prophet-facebook-76285278)
- コード:[Prophetで日経平均株価を予測 #1](https://qiita.com/japanesebonobo/items/58304c74d6ac67e4f41a)
- 応用:[Stock Prediction in Python](https://towardsdatascience.com/stock-prediction-in-python-b66555171a2)

## イメージ
![kabu_chart_man_cry.png](https://qiita-image-store.s3.amazonaws.com/0/190712/d7d2ea5d-f607-ee8a-441e-5edaee8a9cec.png) ⇒ ![nayamu_boy2.png](https://qiita-image-store.s3.amazonaws.com/0/190712/f0b2766a-77e8-9357-4c57-94cd265b3403.png) 
⇒ ![christian_bokushi.png](https://qiita-image-store.s3.amazonaws.com/0/190712/89c333e9-298f-f356-cb07-dff3ec4c0a41.png) ⇒ ![book_yogensyo.png](https://qiita-image-store.s3.amazonaws.com/0/190712/fb0c4ec9-0bbb-9f0f-f7ba-9dfb98b5e7ea.png) ⇒  ![kabu_chart_man_happy.png](https://qiita-image-store.s3.amazonaws.com/0/190712/04dcdaaa-e6fc-dd94-035d-7e13274a5757.png)

### Prophet = 預言者

## 結果
![ダウンロード (2).png](https://qiita-image-store.s3.amazonaws.com/0/190712/65cb9f16-47f7-fca1-948b-03f15ec39aa7.png) ![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/190712/bb895941-4938-f1bb-a216-28e99012037e.png)




## ソースコード
```python
# ライブラリインポート
import pandas as pd # データ格納
import matplotlib.pyplot as plt #描画
from fbprophet import Prophet #時系列予測ライブラリ
#Prophetのインストール
#'pip install fbprophet' を実行 

#使用するcsvデータはYahoo Finance より取得.
# https://finance.yahoo.com/quote/2181.T/history?p=2181.T&.tsrc=fin-srch

data = pd.DataFrame()
file_name = '2181.T.csv' 
data2 = pd.read_csv(file_name, skiprows=1,header=None, names=['ds','Open','High','Low','Close','y','Volume'])

data = data.append(data2)

#モデル作成
model = Prophet()
model.fit(data)

#描画の設定,何日分出力する、など
future_data = model.make_future_dataframe(periods=250, freq = 'd')
future_data = future_data[future_data['ds'].dt.weekday < 5]

# 予測
forecast_data = model.predict(future_data)

# 描画
fig = model.plot(forecast_data)
model.plot_components(forecast_data)
```

# 感想
これまで、scikit-learnやTensorflowで株価予測やろう！と思っていたが、
prophetは使用方法も簡単で、描画も親切なので驚いた。

株価の季節性や周期性、また、各種統計概念も考慮にいれてモデリングしているらしい。
もっと遊んでみよう。。。
Zabbix 4.0の新機能でおみくじを引いてみた

# はじめに
Zabbix 4.0、ようやく出ましたね！
多数の新機能が追加されましたが、何と言っても目玉は「おみくじを引く」機能の追加ですね。辛い運用の現場で荒れてしまった心を落ち着ける一種の清涼剤として、どんどん活用していきましょう！

# 新機能の使い方
新機能のおみくじを引くボタンは何と、デフォルトで実装されています！　Configuration > Host > 任意のサーバのItemの順でクリックすると、バージョン3までは存在しなかった"Check now"という見慣れないボタンがあることに気づきます。Check now ... 運勢のチェック ... つまり、おみくじのことですね。Zabbixの中の人も、おみくじの必要性に気づいていたようですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/0225dfdb-fd4b-3682-d83e-f8882e91f284.png)

使い方は簡単、ボタンを押すだけです。"Check now"ボタンを押しておみくじを引きましょう。
ボタンを押すと同画面上の方に、"Omikuji Request sent successfully"と表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/38087a19-86d9-fee8-84f8-dd42370c54f2.png)

# 結果の確認

結果はMonitoring > Latest dataから見に行くことができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/3ed01bfd-089e-762f-a6ec-402307eed1b6.png)

結果は……残念ながら凶でした。でも現実のおみくじと同じく、何度でも引き直せるので安心して下さい。大吉を引いて、ハッピーな運用ライフを手に入れましょう！

# おわりに

みなさんもZabbix 4.0で良いおみくじライフをお送り下さい。
なお、本当の[新機能](https://www.zabbix.com/jp/whats_new)はこちらです。
NAT のお勉強【理論編】

## Network Address Translation, NAT

- プライベート IP アドレスのみが割り当てられたローカルネットワーク上のホストが、インターネット上のホストと通信を行いたいとする。
- NAT とは、このプライベート IP アドレスをグローバル IP アドレスに変換する技術。
- **プライベート IP アドレスと、グローバル IP アドレスとが 1:1 で対応**。
- NAT で使用されるグローバル IP アドレスは、ルータの NIC に割り当てられているわけではない。
- そのため、このグローバル IP アドレスに対する ARP リクエスとに対しては NAT を行うルータが代理で応答する（ **プロキシ ARP** ）。
- IPv4 枯渇の解決策のひとつ。
![nat1.png](https://qiita-image-store.s3.amazonaws.com/0/288168/e3f23446-2e53-f600-3cb7-7478b7ef9298.png)

## Network Address Port Translation, NAPT

- 別名、 IP マスカレード。
- ポート番号も含めて変換することにより、ひとつのグローバル IP アドレスに複数のプライベート IP アドレスを割り当てることが可能。
- **プライベート IP アドレスと、グローバル IP アドレスとが n:1 で対応**。

![nat2.png](https://qiita-image-store.s3.amazonaws.com/0/288168/324594f5-3f3a-4788-4eb4-cbf6b8fa6c1a.png)

## 参考文献

- 竹下隆史・村山公保・荒井透・苅田幸雄 (2012) 『マスタリングTCP/IP 入門編』 オーム社
- みやた ひろし (2013) 『インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門』 SBクリエイティブ
- 佐野裕 (2016) 『インフラエンジニアの教科書2 スキルアップに効く技術と知識』 シーアンドアール研究所
メモ：プロセス起動ってどれくらい時間かかったりするのか

Git のフィルター書いてたんだけど数千ファイルとか扱うと起動コストが馬鹿にならんのか。。

対象は標準入力を受け取って先頭3文字に BOM が入っているかどうかを見てあれば削除みたいなことをやるプロセスなんだけど中身は問題ではないはず。

生 C で作ったやつ
===
```bash
% ll ./a.out
-rwxr-xr-x  1 kazuki-ma  staff  26800 11 10 17:00 ./a.out
% time bash -c '
for i in `seq 1000`;
do
echo "" | ./a.out > /dev/null 2> /dev/null
done;
'
```

>   1.19s user 1.30s system 96% cpu 2.586 total

Go で作ったやつ
===
```bash
% ll go-version
-rwxr-xr-x  1 kazuki-ma  staff  2162200 11 10 13:46 go-version

for i in `seq 1000`;
do
echo "" | ./go-version > /dev/null 2> /dev/null
done;
```
> 1.67s user 1.56s system 97% cpu 3.298 total

解ったこと
===
バイナリファイルサイズ依存かと思ってたけどそんなことはなくマジでプロセス起動は遅い。
Arduino UNOでpyserialを使ったら再起動してしまった

## 環境
Windows 10
python3.6
Arduino UNO R3

## コマンドを送るとどうしても再起動してしまう
pysesialを利用してWindowsとArduino Uno で通信をしようと試みていた。
しかしながらpyserial側でコマンドを送信すると何故か再起動[^1]してしまう。

##原因
pyserialはCOMポートを開く際にDTR信号がLowになる。
しかし、Arduino UNOはDTR信号がLowになるとArduino UNOが再起動してしまう。
これはUNOに採用されているシリアル変換チップがそういった仕様となっているためである。
なのでArduino Leonardo などでは問題にならない。

## 対処

```python
ser = serial.Serial("COM3",9600)
```
のように一回で開けるのではなく

```python
ser = serial.Serial()
ser.port = "COM3"
ser.baurate = 9600
ser.setDTR(False)  # DTRをセットしない
ser.open()
ser.write(bytes("hoge", 'UTF-8'))
```
の手順を踏むことで無事通信ができた。
しかしながら、setDTRの利用は推奨されないとのことなので

```python
ser = serial.Serial("COM3",9600,dsrdtr = True) # dsrdtrの初期値はFalse
# コメント頂いたので修正(自身の環境では未検証)
```
で対応をするべきだろう。

##余談
[pySerial API 公式ドキュメント](https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.dtr)
によると
>Some OS and/or drivers may activate RTS and or DTR automatically, as soon as the port is opened. There may be a glitch on RTS/DTR when rts or dtr are set differently from their default value (True / active).

一部の環境ではポートを開けたときにDTRがTrueになってしまう事があるらしい。
これが原因なのかもしれない。後日検証したい。

## 参考にしたサイト

[DTR と Arduino の関係 - eggshell blue
](http://d.hatena.ne.jp/RobinEgg/20090930/p1)

[DTR and RTS control lines toggle unintentionally when opening port - Github/pyserial](https://github.com/pyserial/pyserial/issues/124)

[^1]: ボードに書き込み直後と同じ点滅の仕方であったので再起動したと判断した。
[^2]: setDTRは廃止予定、推奨されない。
[^3]: serial.Serial("COM3",9600,dsrdtr = True) でも対応可能であるはず
UE4でタイトル画面の作成


大体のゲームに必要であろう**タイトル画面の作成方法**について、ウィジェットブループリントを用いて作成します。

##今回できること
- タイトル画面の背景の設置
- タイトル文字の設置


#ウィジェットブループリントの作成
まずコンテンツブラウザの"新規作成"から、"ユーザーインターフェイス→ウィジェットブループリント"　を選択し名前を付ける。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/a577ba17-7205-bf82-454c-ee797aab166c.png)


#背景の設置

作成したウィジェットブループリントを開きます。

最初にタイトル画面の背景を設置します。
左にあるパレットから"Image"を"Canvas Panel"にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/e8e2f816-a000-b078-3ef5-cdba38d8e5e0.png)


配置すると画面上の左上に白い長方形の何かが出てきたと思います。
それを広げてみましょう。点線は画面上に表示される範囲を示しています。なので点線に沿うようにして広げましょう。
それと同時にアンカーを設定します。選択するのは右下のデカいやつ。

アンカーというのは固定するもので、例えばゲームの画面サイズを変更したときに配置しているものを移動させたりする際に用います。
今作っているのはタイトル画面の背景ですので画面全体へ固定するアンカーを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/86ad8c4e-67a5-7c49-39cf-7eba91f2dd22.png)

##背景画像の変更
白背景だけでは少し味気ないので何か画像を張り付けましょう。
事前にインポートした画像を背景にします。インポートはコンテンツブラウザから、インポートを選択し自分のコンピュータにある画像を選択することでUE4プロジェクト内で作成することが可能となります。

インポートした画像を設定する際は右の、"Appearance→Brush→Image"から選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/94e64e64-3da9-b708-b1a1-9569fec6a60a.png)


##タイトル文字の作成
次にタイトル画面なので文字を表示してみましょう。
前の工程でImageを追加したように次は"Text"を追加しましょう。
表示したい文字を、"Content→Text"にて編集します。　Appearanceの"Color and Opacity"や"Font"などを弄ってタイトルをわかりやすくするといいでしょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/11a2a3c7-309e-f93d-1872-12d1a3953623.png)


#タイトル画面の表示
現在の進捗を確認してみましょう。
"ウィジェットをレベルに表示する作業"を行います。

ウィジェットの画面を閉じて、左上のファイルから新規レベル作成で"空のレベル"を選択します。
ツールバーのブループリントからレベルブループリントを開きます。

BeginPlayから出力ピンを伸ばし"ウィジェットを作成"を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/55c72c62-f38b-97bd-50bc-63d3b8591f33.png)


Classを先ほど作成したウィジェットを指定します。ウィジェットを作成の出力ピンを伸ばし、"Add　to Viewport"を選択し下図のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/5d5e7fa5-365f-7558-1f86-0f7304ca49b9.png)


それでは実際にPlayをしてみましょう。ビューポート内には作成したタイトル画面が映っているはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/33ab1cbf-ab4a-d260-6434-5ae9d7e6297e.png)
これでタイトル画面はひとまず完成です。



次の記事ではボタンによるタイトルからのレベル遷移について説明します。
pythonで複数のコンストラクタを定義したい

## はじめに

Pythonで複数のコンストラクタを定義したい、しかしメソッドのオーバーロードはできないので、一つのクラスは`__init__()`メソッドを１つしか持てない、、
そんな場合のベストプラクティスについてstackoverflowに上がっていたので、なるほど、と思った回答２つを備忘録がてら紹介します。

[What is a clean, pythonic way to have multiple constructors in Python?](https://stackoverflow.com/questions/682504/what-is-a-clean-pythonic-way-to-have-multiple-constructors-in-python)


## 解決したい問題

プロパティnum_holesを持つ、Cheeseクラスを作成する。
コンストラクタには以下の２パターンを用意したい。

- 生成時にnum_holesを明示的に指定する
- 生成時にnum_holesを指定せず、ランダムに設定させる

## 解決策

※サンプルコードは、元記事のものから適宜改変しています。

### ① デフォルト値Noneを設定する

```python
class Cheese:
    def __init__(self, num_holes=None):
        self.num_holes = num_holes if num_holes is None else randint(0, 100)
```

シンプルな方法です。多くの場合この方法で実装するのではないかと思います。

### ②コンストラクタをラッパーするclassmethodを定義

```python
class Cheese:
    def __init__(self, num_holes=0):
        """defaults to a solid cheese"""
        self.number_of_holes = num_holes

    @classmethod
    def random(cls):
        return cls(randint(0, 100))

    @classmethod
    def slightly_holey(cls):
        return cls(randint(0, 33))

    @classmethod
    def very_holey(cls):
        return cls(randint(66, 100))
```

num_holesの生成方法ごとにclassmethodを定義し、インスタンスを返却する方法です。
サンプルコードのように、指定/ランダムの二択以外にも、複数の設定手段を提供できます。

考えてみれば、組み込みの`datetime`クラスの`now()`とか`fromtimestamp()`とかはこのパターンですね。

## どっちを使えばいい？

### ①を使う場合

[値を指定する/指定せずデフォルト値を指定させる]の2択で済む場合はこちらですね。
やはりコンストラクタのみで完結するので直感的であり、今回の問題においては最適解だと思います。
stackoverflowでもこちらの回答がbest answerとなっています。

### ②を使う場合

[値を指定する/指定せずデフォルト値を指定させる]以上の分岐が必要になる場合は②も選択肢となります。
サンプルコードのように、デフォルト値は固定値として、それとは別にランダム生成の手段も提供したい、などの場合です。
これを`__init__()`で完結させた場合に、余計な引数を追加する必要があったり、処理が複雑になったりするようだったら②の方法での実装も考えるべきですが、コンストラクタ以外でのインスタンス生成するのは若干直感的じゃないというか、嫌いな人は嫌いそうではあります。
Firebase チュートリアル



★Firebaseのandroidでの設定の仕方
https://www.youtube.com/watch?v=cNPCgJW8c-E

★SHA1の取得方法

    keytool -v -list -keystore ~/.android/debug.keystore

PW : android

★アプリ側のdependenciesに追加するべきも

    implementation 'com.google.firebase:firebase-database:16.0.1'

★Realtime Database で天気予報
https://www.youtube.com/watch?v=lpFDFK44pX8


★ログイン
https://firebase.google.com/docs/auth/android/google-signin?hl=ja
ESXi6.5ホストをバックアップする

ESXiホストをバックアップといってもイメージバックアップするわけではなく、設定のみをバックアップする。

#準備

vsphere CLI を入手して作業PC へインストールしておく。

##注意
- vSphere CLI 6.5 は perl が入っていない。
- 6.0 から更新のつもりで 6.5 の CLI をインストールすると perl が uninstall されるので注意。
- Active Perl は 32bit 版の配布がなくなった。


#バックアップ
対象 ESXi ホスト名： esxi0.sorarobe.local
保存ファイル名： esxi0.cfg

```
C:\Program Files (x86)\VMware\VMware vSphere CLI>perl bin\vicfg-cfgbackup.pl --server=esxi0.sorarobe.local -s c:\vm\esxi0.cfg
Enter username: root
Enter password:
Saving firmware configuration to c:\vm\esxi0.cfg ...
```

保存されたファイルを確認する。

```
C:\Program Files (x86)\VMware\VMware vSphere CLI>dir c:\vm
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 346A-D387 です

 c:\vm のディレクトリ

2018/11/12  00:11    <DIR>          .
2018/11/12  00:11    <DIR>          ..
2018/11/12  00:11            26,300 esxi0.cfg
               1 個のファイル              26,300 バイト
               2 個のディレクトリ  212,741,472,256 バイトの空き領域
```

以上。
例外処理


```ruby
class MyError < RuntimeError
end

begin
  raise MyError.exception('エラーが発生しました')
rescue => ex
  p ex
end

→　#<MyError: エラーが発生しました>

#　メモ
 raise MyErrorだと
→　#<MyError: MyError>

```

## 用語

- バックトレース　
　例外を発生させたプログラム全体の流れを追って、原因となったコードの情報を示すもの

## バックトレース

```ruby
class MyError < RuntimeError
end

begin
  raise MyError.exception('エラーが発生しました')
rescue => ex
  ex.set_backtrace("This is new backtrace")
  p ex.backtrace
end

→　["This is new backtrace"]

```


記事：
https://qiita.com/tsubasakat/items/6825bcefcad26da3471b
リモートホストのXプログラムをローカルで表示する

下のコメントにあるように，まずいところがあるということですが，とりあえず「やっちゃいけない例」として残しておきます。あとで書き換え予定です。

##【解説】
他ホストで実行されるXアプリケーションのウィンドウを，ローカルホスト上に表示させたい。

##【手順】
local> はローカルホスト(192.168.1.10)、remote> はリモートホスト(192.168.1.26)での作業を表します。

###Ｘプログラムのウィンドウ転送を許可する
初期状態では、ウィンドウの転送が許可されていないので、xhost でウィンドウの転送を許可する。

local> xhost + [hostname or IPaddress]


例:
local> xhost + 192.168.1.26

###リモートホストにsshで -X をつけてログインします。

local> ssh -X 192.168.1.26

###環境変数DISPLAYを定義します。

remote> export DISPLAY=192.168.1.10:0.0

###/etc/ssh/ssh_config に次の一行を付け足します。

X11Forwarding yes

suやrootで編集して下さい。

###リモートでプログラムを実行します。

例:
remote> xeyes &
メディア運用を一通り分かりたい

初めてカレンダー作りました。がんばリます💪
AdventCanlendar へ一人で一つのカレンダー全てを埋めている方を見ることがあるので、今回トライしてみたくなりました😂

# 最初の投稿で何をするか
今日は初日なので実は何も決まっていません。
カレンダーにタイトルを付けたのですが、ぼんやりと何かしようかなぁくらいの感じです。

まずは方針を決め明日。

- グラウンドルールを決める
- カレンダーのテーマとゴールを決める
- なぜ WordPress か
- 更新スケジュールを決める


# グラウンドルールを決める
カレンダーでやるべき共通のルールを決めておきます。
方針をぶれないようにするためです。

- 記事を15〜30分で書く
- 投稿1つに1テーマとする
- 技術的な要素を入れる

## 記事を15〜30分で書く
あまり時間がないのでこれくらいで仕上げたいです。
最悪 WIP で投稿して後でアップデートするなど。完成させるより終わらせる(☝ ՞ਊ ՞)

## 投稿1つに1テーマとする
1つの投稿にいろいろ詰め込むと大変そうなので1テーマにします。

## 技術的な要素を入れる
Qiita のカレンダーなので入れたいです。


# カレンダーのテーマとゴールを決める
カレンダーのタイトルに **「WordPress でブログを公開したり運用する Advent Calendar 2018」** という名前です。

ちょっと曖昧で今後変更の可能性があるのですが、ひとまずはタイトルにある感じで進めていきます。

- ゴールをどこにするか
- メディア運用が一通り分かる状態になる
- メディア運用についてまとめたい動機


## ゴールをどこにするか
ゴールとは、12月25日にどういう状態になっていたいかです。もうちょっというと、25日にカレンダーの記事を書いていった結果、自分がどういう状態になっていたいかを定義します。

## メディア運用が一通り分かる状態になる
カレンダーを終えることでメディア運用がはじめから終わりまで一通り分かる状態になることを目標にします。ワンオペで運用を任せられたときに、一人で回せるような状態ですね。

## メディア運用についてまとめたい動機
個人的にメディアについて相談を受けることがよくあります。商用サイトから個人サイトまで様々ですが、相談される場合やることはだいたい似ているのかなと感じています。

もちろん、運用の悩みは実装であったり、更新であったり様々ですが、携わる案件が増えるとだいたいかぶるなという印象です。
なので一度どこかにまとめておきたいという動機があります。

# なぜ WordPress か
これまでいろいろな CMS やブログサービスを試しましたが、結論として WordPress より使いやすいものは無いと思います。

もちろん WordPress が万能とかそういうことを言うつもりはまったくないのですが、まあ総合的に見ると満足度は上位かなと思います。

WordPress にしておけば Qiita らしい技術的な内容も書きやすいしテーマとしてはいいと思います。

# 更新スケジュールを決める
ウェブメディアについて書くとなりますと内容は、多岐に渡ります。ちょっと思いつくところだけ書いてみます。

- 企画
- リリース & 実装
- 運用
- マーケティング
- 振り返り

大雑把ですが、これくらいにしておきます。
Unity2018.2でAndroid(NDK)対応したメモ

### 環境設定

- SDKは24=7.0（Minimam API Levelは21=Android5.0）
- NDKは13b（AndroidStudio経由ではなく直接アーカイブから拾う必要あり）
- Javaはjdk1.8.0_131.jdk
    - 例によってJavaはサイト構成が腐ってて目的にページにたどり着くのが困難です。UnityのJDK設定のBrowsの自動検出でないよ=>ダイアログからリンク飛ばしてもらうのが一番確実。

Libraryが不可視フォルダーなので、GUIで設定したかったら、

> https://helpx.adobe.com/jp/x-productkb/global/cpsid_91195.html

とか参考に、不可視属性を解除しておく必要あり。

なお、Mojaveだとこの方法が塞がれており、別の方法を取る必要がある。
一番てっ取り早いのはこれ。

> https://appletoolbox.com/2018/02/how-to-show-your-user-library-in-macos-high-sierra-and-sierra/

Appleは何させたいんだよ、、本当にくそくそくそ！！！！

### ビルド時間

- Monoよりやや長くなる。2回目以降/MacMiniで3分程度

### ネイティブプラグインについて

- 2018.2以降はC++を直接投げ込んで良い。
- サンプルが公式から配布されてるので、それをみつつ、やれば迷うことはない。
    - https://docs.unity3d.com/ja/current/Manual/AndroidNativePlugins.html
- 個人的にDLLをリポジトリに増やしたくないので、プロジェクト上は生のC/C++を入れておいて、NDKでビルドさせる
    - デバッグは、別フォルダで該当ソースをもってきて、テスト実行することにしよう。
    - あと、NDKのバージョン違いとかで、実行時にエラー（エラーメッセージが的外れでこれが原因と気付きにくい）も起きるの嫌だから...
        - サンプルでもってくるpackageのdllも、この理由で環境によっては実行時エラーになるため、リビルド必須
    - この方法だと、IL2CPPで勝手にビルド対象に入るが、外部依存のライブラリとかが絡むとめんどくさい
- Permissionについては、バッチ組んだ方がよいが
    - 一度ビルドすると、 Temp/StagingArea/AndroidManifest.xml が生成されるので、それを Plugins/Android/ にコピーして、必要なものを追加する。
        - ドキュメントとしては、こちらを参照： https://docs.unity3d.com/ja/current/Manual/android-manifest.html
- 文字列バッファの話とか
    - [Unity でアンマネージドな文字列の扱いに気をつけよう](https://qiita.com/Takezoh/items/66753b276d4576dfb478)

### IL2CPP と Reflection のハマりどころ

- Strip対策で、Preserved属性をつける
- 上記をつけても例外でMethod Not Found が Reflection で返ってくることがあるが、メソッド内で別のエラーが起きたときに、リフレクション側で、誤って（？）その例外が出てしまうという現象っぽい。なので、これ以外に出てるエラーがないか、合わせてチェックする必\
要がありそう。

### NativePluginにC#からコールバックを渡す時の罠

- メソッドはStaticに、かつ、MonoPInvokeCallback属性をつける。
    - 参考
        - https://qiita.com/shinobu_shiva/items/4d354126acc0a9f8e15b
        - http://tips.hecomi.com/entry/2016/01/05/230405

### 特定の端末でのみ、共有ライブラリにしたDLLが読めない問題

- よくいわれてる、ネーミングルールや、配置規則に従っても、DllNotFoundExceptionを吐く端末が存在する。（Xepriaの某機種とか）
    - C++を直接配置して、IL2CPPで吐き出すコードに直接マージさせて、__internal属性で呼び出すしかなさそう。
         
### 対象端末

- snapdragon435で動くようにチューニング(だいたい30fps維持、最低ラインで奨励とはしない)
    - snapdragon660/710も検討（奨励ラインの端末）
自分の環境だけDumpShaderDebugInfoを有効にする



シェーダーをいろいろ調べたいときはr.ShaderDevelopmentModeとかr.DumpShaderDebugInfoなどを使いますが
Engine内部はできるだけいじらないほうが事故が減るのでこれらの設定をローカルのSavedの下だけに置くとなんとなく健全です。


#やりかた
自分のプロジェクトの `Saved/Config/Windows/Engine.ini`に`[ConsoleVariables]`セクションを追記して書く。



![image.png](https://qiita-image-store.s3.amazonaws.com/0/223804/a774320f-9af4-eb8b-1340-e59f8bb0c6f1.png)

参考
[ゲーム側で定義したconsole variableをiniファイルから初期化する方法@AnswerHub](https://answers.unrealengine.com/questions/427699/%E3%82%B1%E3%83%BC%E3%83%A0%E5%81%B4%E3%81%A6%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9Fconsole-variable%E3%82%92ini%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html)

終わる
世の中のスキャナーたち@2018.12.1

　経験上ホワイトリスト登録しておいたほうがいいアドレスたち。よくセキュリティ機器で誤検知する。
逆に世の中からスキャンされていることを検知したければマッチングリストに登録してアクションを打てばよいが、だからと言って次に取れる行動は特にないと思われる。

　ドメイン名のものは定期的に名前解決してあげる必要がある。
めんどくさいので自動的に権威サーバーから結果を取得しファイルへ書き出すツールも作ってみた。
https://github.com/sanyamarseille/auto-resolve

## shodan
~~~
census1.shodan.io
census2.shodan.io
census3.shodan.io
census4.shodan.io
census5.shodan.io
census6.shodan.io
census7.shodan.io
census8.shodan.io
census9.shodan.io
census10.shodan.io
census11.shodan.io
census12.shodan.io
atlantic.census.shodan.io
pacific.census.shodan.io
rim.census.shodan.io
pirate.census.shodan.io
inspire.census.shodan.io
ninja.census.shodan.io
border.census.shodan.io
burger.census.shodan.io
atlantic.dns.shodan.io
hello.data.shodan.io
sky.census.shodan.io
dojo.census.shodan.io
malware-hunter.census.shodan.io
battery.census.shodan.io
house.census.shodan.io
goldfish.census.shodan.io
battery.census.shodan.io
mason.census.shodan.io
flower.census.shodan.io
cloud.census.shodan.io
turtle.census.shodan.io
~~~

## Symantec vulnerability assessment service for websites
https://support.symantec.com/en_US/article.TECH206404.html

~~~
scan1.ws.symantec.com
scan2.ws.symantec.com
scan3.ws.symantec.com
scan4.ws.symantec.com
scan5.ws.symantec.com
scan6.ws.symantec.com
scan7.ws.symantec.com
scan8.ws.symantec.com
scan9.ws.symantec.com
scan10.ws.symantec.com
~~~

## shadowserver
~~~
scan-01.shadowserver.org
scan-02.shadowserver.org
scan-03.shadowserver.org
scan-04.shadowserver.org
scan-05.shadowserver.org
scan-06.shadowserver.org
scan-07.shadowserver.org
scan-08.shadowserver.org
scan-09.shadowserver.org
scan-10.shadowserver.org
scan-11.shadowserver.org
scan-12.shadowserver.org
scan-13.shadowserver.org
scan-14.shadowserver.org
scan-15.shadowserver.org
scan-16.shadowserver.org
scan-17.shadowserver.org
scan-18.shadowserver.org
scan-19.shadowserver.org
scan-20.shadowserver.org
scan-10n.shadowserver.org
scan-11n.shadowserver.org
scan-13n.shadowserver.org
scan-14n.shadowserver.org
scan-15n.shadowserver.org
scan-16n.shadowserver.org
scan-17n.shadowserver.org
scan-18n.shadowserver.org
scan-19n.shadowserver.org
scan-20n.shadowserver.org
~~~

## Censys
https://support.censys.io/getting-started/frequently-asked-questions-faq

~~~
141.212.121.0/24
141.212.122.0/24
~~~

## Qualys
https://community.qualys.com/docs/DOC-4865-known-issues

~~~
64.41.200.0/24
64.39.109.20
104.130.202.77
~~~
素人がSite24x7を使ってWordPressで作ったWEBページを簡単監視してみる

## 背景

監視とかするほどじゃないけど、まあ、1ヶ月無料だし、監視ってどんなものか勉強のために、
`監視サービスSite24x7`ってのを使ってみた。

で、簡単でかっこよかったので、このサービス導入から初期設定までの経緯を記載します。

## 新規登録

まずはクラウド型Webサイト監視・サーバー監視サービス`Site24x7`のページにアクセス
https://www.site24x7.jp/

すると早速美人がお出迎えしてくれる。

[![Image from Gyazo](https://i.gyazo.com/dbd70972faa160efa43c13e02732243c.png)](https://gyazo.com/dbd70972faa160efa43c13e02732243c)

右上の`今すぐ無料で使ってみる`をクイックすると以下のページになる

[![Image from Gyazo](https://i.gyazo.com/fb8764d15a5276de5ad702de35cbc79e.png)](https://gyazo.com/fb8764d15a5276de5ad702de35cbc79e)

メールアドレスとパスワードを有力して、一番下の`I agree ...`にチェック。
`一般企業`と`電話番号`は入力不要っぽい。
サインアップするとメール認証がくる。

英語メールが来たのでGoogle翻訳してみた。

[![Image from Gyazo](https://i.gyazo.com/0823d02f69bdf2ee83638d01a967523f.png)](https://gyazo.com/0823d02f69bdf2ee83638d01a967523f)

まあ、普通っぽい。で無料期間は30日のようだ。
メールの`https://accounts.zoho.com/accounts...`のリンクをクリック

登録したメールアドレスとパスワードでログインしてみると以下の画面が。
なにやらセキュリティーは頑丈っぽい。

[![Image from Gyazo](https://i.gyazo.com/c77ada4b73419f4b4c24039bc1365032.png)](https://gyazo.com/c77ada4b73419f4b4c24039bc1365032)

レコメンドされてるっぽい`OneAuth (Recommended)`で進めてみることにした。
すると何やらアプリを導入しなあかんっぽくて、面倒なのでスルー。

[![Image from Gyazo](https://i.gyazo.com/11f2cc3837dccd361d4915e210569a06.png)](https://gyazo.com/11f2cc3837dccd361d4915e210569a06)

でスルーしても普通にTOPページに遷移してたので、そのまま利用開始してみることに。

## 早速TOPページへ

TOPページはこんな感じ。
本格的やな。。

[![Image from Gyazo](https://i.gyazo.com/e8918c2b7d16909d41bf102ba78ad45e.png)](https://gyazo.com/e8918c2b7d16909d41bf102ba78ad45e)

## 初期設定

WordPressで作ったサイトの監視が目的なので、
とりあえず`自社Webサービスを監視する`をクリック。
すると下記画面に遷移。

[![Image from Gyazo](https://i.gyazo.com/56fdde60e4ed258172c7308d3ddb2c1a.png)](https://gyazo.com/56fdde60e4ed258172c7308d3ddb2c1a)

とりあえずURLである[https://xxx.com/](https://xxx.com/)を入力して続行。
すると以下の画面に遷移。

[![Image from Gyazo](https://i.gyazo.com/6d250d9a64e6866bfddc5a1d56fe8f0a.png)](https://gyazo.com/6d250d9a64e6866bfddc5a1d56fe8f0a)

なにやら推奨される監視設定が上記な感じらしく、
そのまま`選択したリソースの監視`をクリック。

なにやらこれでセットアップ完了したよう。
**くそ一瞬やないか。**

しかも超絶かっこいい感じになっております。

[![Image from Gyazo](https://i.gyazo.com/b7e90bdfffdc7438a3eb9f243b571335.png)](https://gyazo.com/b7e90bdfffdc7438a3eb9f243b571335)

## まとめ

でこの後いろいろ触ってみたのですが、特徴を以下にまとめます。

### 素人にとってのメリット

- 設定簡単！
- なんか超かっこいい
- ブラウザ応答時間を監視できる（つまりアクセス悪い。。みたいな状態を察知できる）
- DNSを監視できる（つまり独自ドメインになんか異常があれば察知できる）
- SMTPを監視できる（つまりメール関連で異常があれば察知できる）
- SSL証明書期限の通知がある
- これらの通知をPush通知してくれるスマホアプリもある（https://itunes.apple.com/us/app/site24x7/id538759565?mt=8）

### 玄人にとってのメリット

僕が素人なので想像上の話だが、メニューがこんなにあるから、絶対やべー

[![Image from Gyazo](https://i.gyazo.com/19f3070326e94bf950661827f19466f4.png)](https://gyazo.com/19f3070326e94bf950661827f19466f4)
あるデータの要素で変数（リスト）を分けたい場合

あるデータの要素で変数（リスト）を分けたい場合の方法です。
例として、下記のようなファイル(test.csv)を読み込み、"SAMPLE"ごとにリストに分けて格納していく方法です。今回は"SAMPLE"が1と2なので、2つに分けます。

#####test.csv
![testcsv.png](https://qiita-image-store.s3.amazonaws.com/0/319484/983ff218-5253-6762-592f-56f9e5f7d0b9.png)

#####プログラム
```ruby:test.py
import pandas as pd

#ファイル情報を読み込む
test_info=pd.read_csv("test.csv")

#SAMPLE数の最大値をサーチし格納する。今回は2。
sample_count=test_info["SAMPLE"].max()

#SAMPLEごとに格納するリストの変数宣言
sample_data=[]


#SAMPLEごとにsample_dataのリストに格納する。
for i in range(sample_count):
    j=i+1
    sample_data.append(test_info[test_info["SAMPLE"]==j])
```
#####結果
######sample_data[0]
![sampledata14.png](https://qiita-image-store.s3.amazonaws.com/0/319484/bcfb02bb-ecee-3715-2887-33c9f8c1ad0c.png)
######sample_data[1]
![sampledata2.png](https://qiita-image-store.s3.amazonaws.com/0/319484/9fc8c11b-0be2-3f52-e34c-308f66c7d3a6.png)
12-2 クロスプラットフォームのオーディオI/O API 前編

https://adventar.org/calendars/3353 の2日目エントリーです。

オーディオI/OのAPIは、プラットフォームに固有のものです。これは、オーディオデバイスへのアクセスの仕方、デバイスをオープンする時に求められる設定値などが、OS固有の情報なども含み、OSによってバラバラであるためでしょう。標準的なファイルI/Oほどには単純化できないということは理由として挙げられそうです。歴史的にも、オーディオデバイスとひとことで言っても入力（マイク）は含まないものも多かったり、出力先のチャンネル数（スピーカーの数など）が増えてきたりなど、ファイルI/OのAPIなどと比べると、割と最近でも進化している部分が多い領域です。

そして、どのOS環境に行っても、オーディオデバイスの接続設定を調整してデバイスをオープンしてオーディオデータを書き込んで再生するステップは、実際にやりたいことに比べたら長大なものになります。5行程度のオーディオデータ生成／書き込み処理を行うのに数十行のコードを書かないといけないのが、プラットフォーム固有オーディオ処理の現状です。

一方で、サウンドを発生させたい、という場合は、ファイルI/Oのような感じで単純なオーディオストリームの読み書きと最低限の設定調整（録音・再生周波数の調整など）さえ出来ればよい、という状況が大半でしょう。このような状況で、プラットフォームごとにサウンド部分を実装するのは労力の無駄です。というわけで、クロスプラットフォームで動作するアプリケーションやフレームワークにおいては、クロスプラットフォームのオーディオI/O APIを使うことがよくあります。

今日はクロスプラットフォームのオーディオAPIをいくつか紹介します。参考資料として以下のサイトを挙げておきます。

- https://camlorn.net/posts/december2014/horror-of-audio-output/
- https://github.com/andrewrk/libsoundio/wiki/libsoundio-vs-PortAudio を始めとする各種APIとlibsoundioの比較ページ

### portaudio

この方面では一番有名なライブラリ（少なくとも「だった」）と言えるものです。web上の情報も一番多く、そこそこ枯れていると言えるでしょう（もっとも、わたしがC#バインディングを作ったときはAPI非互換変更を食らったりもしていましたが…）。wasapiなど新しいドライバーについては不安定である（であった）、みたいな話も上記のブログには載っています。

wasapiはまだドライバーがあるだけマシで、Linuxに行くとpulseaudioのバインディングすらありません。jackかalsaか、みたいな選択になると、他のオーディオ出力をブロックしたくないわたしみたいなLinux開発者にとっては選択肢になりません…

設計が古いことによる問題として一番大きいのは、2チャンネルまでの出力しかまともに扱えないというものでしょう。複数チャンネルのストリームをどう扱うかは、プラットフォームによって異なるので、モダンなクロスプラットフォームの
オーディオライブラリではこの問題にちゃんと対応する設計になっています。

…とまあ、さまざまな問題があるわけですが、goでもrustでもportaudioを使う例が一番多いようです。

### rtaudio

rtaudioはThe Synthesizer Toolkit (TheTsk) プロジェクトで開発されているC++のAPIです。これもそれなりに歴史があり、多チャンネル時代には合わない設計であるのはportaudioと同様です。ソースコードが10000行ちょいあるRtMidi.cppだけ（いわゆるsingle-source module）なので、読みやすいかどうかは読む人次第でしょう。上記ブログではこれがクソだみたいな書きぶりですが、わたしはSSMは全く嫌いではないです（シンボルの検索性とか）。

個人的には、rtaudioはAPIをグローバルに指定して開かないといけないようなビミョい設計にあまり肯定的な気持ちをもてないので、敬遠しています…（C APIにしてC#バインディングを作ろうとしたこともあるのですが公開まではしなかったり）。libsoundioのページではデバイス変更の検出も出来ないような話が書かれていて、APIの指定の仕方がこうではそうかなあ、と思っています（未確認）。

### SDL, OpenAL, JUCE

生オーディオの処理だけに特化したライブラリではありませんが、SDLやOpenAL、JUCEなども結果的にクロスプラットフォームのオーディオI/O機能を提供しています。

どうしても余計な色がつくのと、対象動作環境が不必要なところで限定されることがあるので、純粋に生オーディオI/Oを使えば足りる場面においては、個人的にはやはり敬遠してしまいます。

前述のブログではもっと踏み込んで、OpenALでは実質的に16bit encodingしかサポートされていないとか、デバイスの未サポート機能を使うと容赦なく落ちるみたいな話が載っていて、悪口のオンパレードかと思いきや一番良さそうな選択肢みたいにも書かれていたりするので、興味があれば読み込んでみると面白いかと思います。

SDLはゲームにはちょうどいいけどオーディオライブラリで使うと重複初期化していないかのチェックなどで無駄に煩雑になるのでやめたほうがいい、みたいな話もあるようです。

## libsoundio

libsoundioは、わたしが知る限りでは一番モダンなAPIで、多チャンネル時代に対応していて、Cだけで書かれているので他言語のバインディングにも使いやすいライブラリです（わたしもC#バインディングを作っていますが、他にも何人かいます）。

APIそのものよりも、むしろ他のAPIとの比較などがきっちり行われている（前述のリンクなど）が面白いところです。hacker newsのスレッドでいろいろ議論されているので、これが客観的な評価としては一番有用でしょう: https://news.ycombinator.com/item?id=10171802

あとlibsoundioについては去年ちょっと書いたこともあるので、これも補足資料として出しておきます: http://atsushieno.hatenablog.com/entry/2017/12/07/041145


## まだまだある

クロスプラットフォームのオーディオライブラリはまだいくつかあるので、日を改めてまた書きます（予定）。
Javaのクラス,インスタンス,オブジェクトを分かりやすく例えると。。。【分かったような気になれるシリーズ】

# クラスとかインスタンスとか何が違うねんって人がふわっとイメージできるように説明すると
## それぞれの概要
- オブジェクト
状態と振る舞いを持つひとまとまりもの。クラスもオブジェクトであり、インスタンスもオブジェクト。

- クラス
オブジェクトの共通の状態と振る舞いを集めた一つの型。設計書。

- インスタンス
クラスから生成される実態。設計書から生成される実態。

## 料理で言えば
- オブジェクト
素材のこと。料理だと「まぐろ」とか「サーモンとか」。Javaだと主に変数とかメソッドにあたるかな。知らんけど。

- クラス
レシピのこと。「まぐろ」っていう変数を「切る」っていうメソッドと組み合わせて「マグロの刺身」を作るレシピデスみたいな感じ。ただしあくまでレシピであって「マグロの刺身」そのものではない。

- インスタンス
レシピから作られた料理のこと。「マグロの刺身」レシピから作られた「マグロの刺身」そのものにあたるよ。
EAGLE 9.2でSeeed Fusionの利用がより便利になった話

# EAGLEが9.x系にバージョンアップ
EAGLEがメジャーアップデートしました。見た目だけでの変化はUIとアイコンが若干おしゃれになりました。

* **8.x系**

アイコンやデザインが古き良きスタンドアロンアプリケーションという感じがして個人的には好きです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/078a7e30-997a-5bd1-cc19-290ab5cec508.png)

* **9.x系**

アイコンが少し大きめでフラットデザインよりの見た目になった気がします。また、Boardでは8.x系にはなかったDesign Managerというウィンドウが追加され、これが結構強力です。（後述）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/c150126d-b9ec-5dbd-c203-c5b5a98c7872.png)

# 9.x系の魅力

主に以下の点が8.x系より特に使いやすくなったと思います。特にDesign Managerによって**何かを選択する**という機能が非常に強化されました。

* **Route編集**
* **Design Managerによる複数のパーツの選択・編集**
* **Design ManagerによるRouteの選択・編集**

## Route編集

8.x系では配線済みのRouteをマウスでドラッグして移動すると、図のように配線の角度はドラッグ後の位置に依存して中途半端な角度になってしまいます。なので、規定の角度（45度など）できれいに配線したい場合は配線を一度削除して書き直すか、角度を自身で調整する必要がありました。（設定でうまいことできるんですかね？）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/bf139523-fe1a-8360-d93b-29e0b4450c2f.png)
しかし、9.x系ではドラッグでの移動後も配線の規定角度を維持してくれます。なので、一旦配線した後に位置を修正する時間が大幅に短縮できるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/4995c09f-4cc9-c465-20a6-43b5ed074dfb.png)

## Design Managerによる複数のパーツの選択・編集
EAGLE 8.x系ではGroup（選択機能のようなもの）による複数の部品選択が難しいです。2層配線をどちらも表示した状態で特定の部品を選択しようとすると、部品と配線の位置が近く、選択したいものがうまく選択できないことが多かったです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/cd843fea-652b-c034-402c-05da6a1d242d.png)
Design ManagerのDevicesタブでは実装面で部品一覧をフィルタリング可能です。また、フィルタリング後の部品一覧から任意の部品名を選択することで特定の部品を正確に選択できます。また、部品名をダブルクリックすることでDesign Managerからパラメータ等を修正することも可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/7ab85937-7676-d061-9985-7b6916bd0227.png)

## Design ManagerによるRouteの選択・編集
SignalsタブではNet Classesでフィルタリングが可能です。任意の配線は、配線全体、配線の一部をDesign Managerから選択することができます。（左図が配線全体を選択、右図が配線の一部を選択）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/c1312b3e-6ce2-2161-7600-765d670997c0.png)

# CAM ProcessorにSeeedフォーマットがデフォルトで選択可能
8.x系ではSeeed FusionにアップロードするGerberファイルを生成するには、Seeedから提供されているcamファイルをダウンロードし、CAM Proocessorのjobに選択する必要がありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/01ab5692-55ac-9433-d986-1f9e57e24228.png)

しかし、9.2ではなんと**デフォルトでSeeed用のCAMが選択できます**。これはもはやSeeedがPCB界のデファクトスタンダードの1つになったと言っても過言ではないのではないでしょうか？（私はSeeedの中の人ではないです）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167138/66d80b1d-9f69-4de3-96d3-73148772ba9e.png)

詳しくはSeeedの[Gerberファイル作成チュートリアル](http://support.seeedstudio.com/knowledgebase/articles/1187746-eagle%E3%81%8B%E3%82%89%E3%82%AC%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)をご参考ください。

# PCBの入門にはオープンソースハードウェアがおすすめ

EAGLEでPCBを発注してみたいけどハードルが。。。という人は、SeeedやAdaftuitのようなオープンソースハードウェアでEAGLEフォーマットのデータを入手し、それを参考に自身で修正するという方法が良いと思います。
例えば携帯電波網で通信できるデバイスを作成したいと思った場合、Seeedだと[Wio LTE](http://wiki.seeedstudio.com/Wio_LTE_Cat.1/)、Adafuitでは[FONA 3G](https://learn.adafruit.com/adafruit-fona-3g-cellular-gps-breakout/downloads)などが参考例になります。（EAGLEのデータもダウンロード可能）
しかし、上記の回路にはそれぞれ着信用のイヤホンジャックなど、通信だけしたい場合は除外して問題ない回路も多く実装されています。まずはそれらを削除し、必要最小限の構成にした回路を作成するという練習がおすすめです。

# 最後に
### EAGLE + Seeed で爆速PCB発注しましょう
12-01 まえがき

https://adventar.org/calendars/3353 の1日目エントリーです。

この「音楽ツール・ライブラリ・技術 Advent Calendar 2018」は、普段あまりひとつのジャンルとして語られることが少ない音楽まわりのソフトウェアを構築するためのツール、ライブラリ、要素技術に関する知見を集めて、出来るならちょっとしたコミュニティを形成したい、という目的で作成されました。

「ツール」はDAWから音声処理ツールまで幅広く、「ライブラリ」はOSのAPIから特定のDAW向けのライブラリまで幅広く、「技術」は信号処理やMIDI関連仕様のような要素技術を幅広く対象としたいと思います。（カレンダーの作成者でありエントリ予定の大半を埋めているatsushienoが主にライブラリ開発者として活動しているため、内容がその方面に偏っているかもしれません。）　もしこの分野に興味があって、詳しく語れるものがあるという方がいたら、ぜひお気軽にご参加ください。

atsushienoはライブラリを紹介して、2〜3段落のテキストだけを書いて1エントリとする程度の気軽なものをたくさん用意する予定です（もっと長くまとめて用意したものもありますが、毎日そんなのを書いていたら死んでしまう）。内容としても、ソフトウェアの使い方よりは周辺トピックの紹介に終止する可能性がそこそこあります。もう少し参加者が増えるともう少し濃度の高いエントリを書くかもしれません。

初日はこの計画書だけ出して終わりとしたいのですが、技術的な話がゼロだと少々残念なので、別のアドベントカレンダー向けに書いた内容がこのカレンダーの趣旨にも近いのでリンクしておきます。

http://atsushieno.hatenablog.com/entry/2018/12/01/000749
MicroPythonのurequestsとActiveStorageの相性が悪い話

M5Stack(MicroPython)からrailsとActiveStorageの組み合わせを利用して画像ファイルをダウンロードしようとしたら苦戦をしたという話をしたいと思います。

# TL;DR
現状のMicroPythonで使えるurequestsは[リダイレクトに対応していません](https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L97)。そして、ActiveStorageは画像への直接のアクセスが現状できず、リダイレクトのリンクが表示されます。

つまり組み合わせるとつらい思いをします。

[uurequests](https://github.com/pfalcon/micropython-lib/blob/master/uurequests/uurequests.py)を使えばもっと楽に解決できたみたいです。

# 環境に関して
MicroPythonへの変更方法に関しては今回は紹介しません。
MicroPythonとRail-APIとActiveStorage使って適当に作った感じです。バージョンとかは以下の通りです。


# やりたかったこと
「サーバから画像ファイルをダウンロードして表示したい。」という目的でした。

# コードを書いてみる
##M5Stackで実行したコード
まずはM5Stackのコードを一回ローカルに保存してから表示するというコードをシンプルにしたものを出します。

```main.py
from m5stack import lcd
import urequests

with open('image.jpg', 'w') as outfile:
    outfile.write(urequests.get('画像のURL').content)

lcd.image(0,0,'image.jpg')
```

その時は画像のリンクを表示するためにRailsでは以下のコードをコントローラーで記述していました。

```imgages_controller.rb
class ImagesController < ApplicationController
  include(Rails.application.routes.url_helpers)
#  ~~~省略~~~
  def show
#    ~~~省略~~~
    render json: {image_url: rails_blob_path(image)}
  end
#    ~~~省略~~~
end
```

# 問題発生
　処理の途中で何やらエラーが出てしまいます。

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "urequests.py", line 112, in get
  File "urequests.py", line 100, in request
  File "urequests.py", line 97, in request
NotImplementedError: Redirects not yet supported
```

 どうやらActiveStorageは画像本体への直接のアクセスをさせないためにリダイレクトされるみたいです。ちょっと困りました。

# 解決策　その1
* urequestsを頑張ってリダイレクトに対応させる
    * 辛い…
* 別の画像アップロードライブラリを使用する
    * 一回作っちゃったのを変えるのが面倒くさい

で色々と悩んだのですが、ActiveStorageのドキュメントを読んでいたら[何やら変換用に一時的にダウンロードする`download`メソッド](https://edgeguides.rubyonrails.org/active_storage_overview.html#downloading-files)があることに気が付きました。

これひょっとして、downloadしてきてsend_dataしてあげれば良いんじゃないかな？と思ったらバッチリ表示できました。その部分だけ抜き出したコードが下の通りになります。

```
send_data @image.download, :type => 'image/jpeg', :disposition => 'inline'
```

力技すぎてガシガシ叩かれると辛いので、一般的なWebサービスを作成する際には辞めたほうが良いと思います。


# 解決策その２(書いてるときに教わった)
 redirectしても大丈夫なライブラリのuurequestsを利用しましょう。
phalconさんのレポジトリに[uurequests](https://github.com/pfalcon/micropython-lib/blob/master/uurequests/uurequests.py)はあるのであるのでこちらをダウンロードして一緒にM5Stackに一緒に転送してimportすれば使用できます。

```
from uurequests
uurequests.get('https://example.com')
```

みたいに使うことができます。


# まとめ
　知らないものに知らないものをかけ合わせるとうまく対応出来ずに困りますという話でした。新しいことをやるときは全部一気にやるんじゃなくてちょっとずつやっていったほうが良いですね。
さぁ、UnityのTilemapを始めよう！ 8/8 ~関連リンクとまとめ編~

「[さぁ、UnityのTilemapを始めよう！](https://qiita.com/RyotaMurohoshi/items/5c3cdd24b7e09bfd8ed3)」シリーズ、全8回の内の第8回、最終回です。

ウェブ上で公開されているTilemapの公式情報を紹介します。

前回は「[第7回 TilemapとCollider編](https://qiita.com/RyotaMurohoshi/items/8d1e7dfb4a1b2aca0463)」です。

# Tilemapの公式情報

* [2D Tilemap Asset Workflow: From Image to Level](https://blogs.unity3d.com/2018/01/25/2d-tilemap-asset-workflow-from-image-to-level/)

Unityの公式ブログです。Tilemapの概要を知るのにいいブログです。

* [2D タイルマップアセットワークフロー：イメージをそのままステージに](https://blogs.unity3d.com/jp/2018/01/25/2d-tilemap-asset-workflow-from-image-to-level/)

「2D Tilemap Asset Workflow: From Image to Level」の日本語訳です。

* [Intro to 2D World building w/ Tilemap](https://unity3d.com/learn/tutorials/topics/2d-game-creation/intro-2d-world-building-w-tilemap)

ビデオチュートリアルです。Unityエディタの操作に関しては、書籍やブログよりも動画の方がわかりやすいです。一度は見ることをオススメします。

* [Tilemap](https://docs.unity3d.com/Manual/Tilemap.html)

公式マニュアルです。

* [Unity-Technologies/2d-extras](https://github.com/Unity-Technologies/2d-extras)

Unity Technologies社のGitHubリポジトリです。Unity公式の2D拡張コード群で、Tilemapの拡張アセットがあります。本格的にTilemapを利用するのであれば、一度コードを読んでみることをお勧めします。

* [Unity-Technologies/2d-techdemos](https://github.com/Unity-Technologies/2d-techdemos)


Unity Technologies社のGitHubリポジトリです。2d-extrasを用いサンプルが豊富にあります。また、Spriteなどもサンプルごとに用意されています。Tilemapを使ってみる際は、このリポジトリのものを試してみてはいかがでしょう。

* [Unity-Technologies/2d-gamedemo-robodash](https://github.com/Unity-Technologies/2d-gamedemo-robodash)

Unity Technologies社のGitHubリポジトリです。より高度なTilemapの利用例です。マップエディターというより、レベルデザイナーです。


# おわりに

本シリーズでは「`Tilemap`」の機能・使い方を簡単に紹介しました。

Tilemapを使ってみたくなりましたか。「こんな風にTilemapが使えそうだな」というイメージが湧きましたか。「そうだTilemapでこんなゲームを作ろう」というアイディアが閃きましたか。

Tilemapは、プラットフォームゲーム、戦略シミュレーションゲーム、ロールプレイングゲームなど幅広いジャンルのゲームで活躍することでしょう。皆さんが作りたいゲームで、思い思いのマップをTilemapで作成してみてください。

最後まで読んでいただきありがとうございます。ご意見・ご要望・ご感想、お待ちしております。

※ 本シリーズは、技術書典4で頒布した技術同人誌「[Unity Tilemap Startbook](https://techbookfest.org/event/tbf04/circle/18470001)」の内容をQiita用に、修正・編集したものです。

# シリーズ一覧

* [第1回 概要編](https://qiita.com/RyotaMurohoshi/items/5c3cdd24b7e09bfd8ed3)
* [第2回 とにかくまずは触ってみよう編](https://qiita.com/RyotaMurohoshi/items/f386e81b5e2ea1ffe57d)
* [第3回 Spriteの設定編](https://qiita.com/RyotaMurohoshi/items/718e2cceec3b6da28224)
* [第4回 Tile について編](https://qiita.com/RyotaMurohoshi/items/4f88763e620a8d329163)
* [第5回 Tilemap関連のコンポーネント編](https://qiita.com/RyotaMurohoshi/items/ae46343828634a2d3321)
* [第6回 Tileの描画編](https://qiita.com/RyotaMurohoshi/items/fc473a2dd54441e9b94e)
* [第7回 TilemapとCollider編](https://qiita.com/RyotaMurohoshi/items/8d1e7dfb4a1b2aca0463)
* [第8回 関連リンクとまとめ編](https://qiita.com/RyotaMurohoshi/items/eddbb74e07e79f6c2185)
さぁ、UnityのTilemapを始めよう！ 7/8 ~TilemapとCollider編~

「[さぁ、UnityのTilemapを始めよう！](https://qiita.com/RyotaMurohoshi/items/5c3cdd24b7e09bfd8ed3)」シリーズ、全8回の内の第7回です。

今回は「TilemapとCollider編」と題して、アクションゲーム・プラットフォームゲームに欠かせないTilemapのColliderについて紹介します。

前回は、「[第6回 Tileの描画編](https://qiita.com/RyotaMurohoshi/items/fc473a2dd54441e9b94e)」です。

# 2つのColliderコンポーネント

Tilemapに関連するColliderのコンポーネントは次のふたつです。

* UnityEngine.Tilemaps.TilemapCollider2D
* UnityEngine.CompositeCollider2D

このふたつのコンポーネントをTilemapゲームオブジェクトに付与し、適切に設定します。

# TilemapCollider2Dコンポーネント

1つ目はTilemapCollider2Dコンポーネントです。

Collider2Dクラスを継承したTilemapCollider2Dクラスは、その名のとおりTilemapのためのColliderコンポーネントクラスです。このクラスをTilemapゲームオブジェクトに付与すると次のようにTilemapの各セルにColliderが設定されます。

![tilemap_collider.png](https://qiita-image-store.s3.amazonaws.com/0/4125/7cde338d-9f90-229b-fba3-38bcc1ae83a8.png)

TilemapCollider2DのColliderは、TilemapのセルにTileが追加されたり、削除されたりすると更新されます。

# CompositeCollider2Dコンポーネント

2つ目はCompositeCollider2Dコンポーネントです。

前節の画像は各セルにColliderが存在しました。この節では、次の図のようにCompositeCollider2Dを使って、各セルのColliderをまとめる方法を紹介します。

![colliders.png](https://qiita-image-store.s3.amazonaws.com/0/4125/5dc587ca-9d3e-f3a9-f04c-234b5f7d8788.png)

Collider2Dクラスを継承したCompositeCollider2Dクラスは、Colliderを連結させることができるクラスです。このコンポーネントは、Tilemap専用というわけではなく、幅広く利用できるコンポーネントです。

TilemapCollider2Dを付与したTilemapゲームオブジェクトに対して、CompositeCollider2Dコンポーネントを付与します。そして、TilemapCollider2Dの「Used By Composite」という設定項目をtrueにします。

![used_by_compiste.png](https://qiita-image-store.s3.amazonaws.com/0/4125/5ae9c613-cb10-0adc-c1e9-05ce3a6ea393.png)

このように設定すると@<img>{chapter7/colliders}のように、各セルにあったColliderとそのエッジが集約されて、Tilemapの外周のみに設定されます。

# TileのColliderの設定とSprirteのPhysics Shape

前の節でColliderをTilemapの外周のみに設定することができました。この節では、次の画像のようにSprite中の壁の位置にColliderのエッジを設定します。

![tilemap_collider_with_sprite.png](https://qiita-image-store.s3.amazonaws.com/0/4125/f9de6d44-71e9-f0fa-9f64-6be0cd240f4f.png)

まずはTileアセットの「Collider Type」を設定します。 TileアセットおよびTileData構造体には、「Collider Type」という項目・要素があります。これには、次の3種類があります。

* None・・・Colliderを作成しません
* Sprite・・・Spriteの「Physics Shape」を基にColliderの形状を決定します
* Grid・・・セルの形を基にColliderの形状を決定します

今回は、Tileアセットの「Collider Type」を「Sprite」に設定します。

つぎにSprite Editorで各Spriteの「Physics Shape」を編集します。これでSprite中の壁の位置にColliderのエッジがくるように、Sprite Editorを使って「Physics Shape」を調整してください。やり方は次のリンクを参照してください。

https://docs.unity3d.com/Manual/SpriteOutlineEditor.html

以上の設定を行うことで、前の画像のようなColliderを設定することができます。

# 次回とシリーズ一覧

次回は、「[第8回 関連リンクとまとめ編](https://qiita.com/RyotaMurohoshi/items/eddbb74e07e79f6c2185)」です。

* [第1回 概要編](https://qiita.com/RyotaMurohoshi/items/5c3cdd24b7e09bfd8ed3)
* [第2回 とにかくまずは触ってみよう編](https://qiita.com/RyotaMurohoshi/items/f386e81b5e2ea1ffe57d)
* [第3回 Spriteの設定編](https://qiita.com/RyotaMurohoshi/items/718e2cceec3b6da28224)
* [第4回 Tile について編](https://qiita.com/RyotaMurohoshi/items/4f88763e620a8d329163)
* [第5回 Tilemap関連のコンポーネント編](https://qiita.com/RyotaMurohoshi/items/ae46343828634a2d3321)
* [第6回 Tileの描画編](https://qiita.com/RyotaMurohoshi/items/fc473a2dd54441e9b94e)
* [第7回 TilemapとCollider編](https://qiita.com/RyotaMurohoshi/items/8d1e7dfb4a1b2aca0463)
* [第8回 関連リンクとまとめ編](https://qiita.com/RyotaMurohoshi/items/eddbb74e07e79f6c2185)