OmniAICreator/Qiita-1.07M huggingface dataset:
【PHP】CSV読込備忘録


```:sample.csv
123456789,0,234567890,ABCDE
345678901,1,456789012,BCDEF
```

上記のようなCSVファイルを読み込んで、数字はint型に変換し、配列に詰めて、さらにごにょごにょするというのをやってました。
しかし、下記のように、1行目の先頭が0になってしまうという問題とご対面。
その時の備忘録です。

```:
array(4) {
  [0]=>
  int(0)
  [1]=>
  int(0)
  [2]=>
  int(234567890)
  [3]=>
  string(5) "ABCDE"
}
array(4) {
  [0]=>
  int(345678901)
  [1]=>
  int(1)
  [2]=>
  int(456789012)
  [3]=>
  string(5) "BCDEF"
}
```

# 疑惑① fgetcsv
Google先生で調べていくと、[fgetcsv](http://php.net/manual/ja/function.fgetcsv.php)で苦しんだ先人の記事がたくさん出てきました。
やれsetlocaleだの、やれ文字コード変換だの、試してみたものの、結果は変わらず。

こりゃfgetcsvそのものを諦めるかと、[SplFileObject](http://php.net/manual/ja/class.splfileobject.php)を使って書き直してみました。
ところが、結果は変わりません。

そこで、CSVファイルを読み込み、配列に詰めた段階でvar_dumpしてみました。
※詰め方が違うのは見逃してください。

```:
array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(12) "123456789"
    [1]=>
    string(1) "0"
    [2]=>
    string(9) "234567890"
    [3]=>
    string(5) "ABCDE"
  }
  [1]=>
  array(4) {
    [0]=>
    string(9) "345678901"
    [1]=>
    string(1) "1"
    [2]=>
    string(9) "456789012"
    [3]=>
    string(5) "BCDEF"
  }
}
```

…12？9じゃなくて？

# 疑惑② CSVファイル

どうやら先頭に意識していない3バイトが含まれているようです。

「php csv 先頭」でググって答えにたどり着きました。BOMです。
[UTF-8とは：BOM付きとBOMなし（UTF-8N）の違い――Unicode関連の文字エンコード](http://site.oukasei.com/?p=1116)

先頭に数バイトつくって厄介すぎませんかね。

ダウンロードしてきたCSVファイルを流用して編集したのですが、確かに秀丸で開いてみたらBOMにチェックが入ってました。

というわけで、このBOM対策を行います。
※【参考】[[解決済] ExcelでUTF-8のCSVを吐いたらwith BOMだったせいでPHPでの取込に不具合が出た件](http://gadget-nail.com/blog/2017/02/11/727/)

# BOM対策① CSVファイルをBOMなしに変更

エディタなどでCSVファイルをBOMなしに変更してしまいます。いちばん簡単です。

# BOM対策② BOMを置換

そうはいってもBOMがあろうがなかろうが対応したいよね…という場合はこちら。

```php:
$count = 0;
$handle = fopen($file_dir.'sample.csv', 'r');
while (($data = fgetcsv($handle)) !== FALSE) {
    if ($count === 0) {
        $data[0] = preg_replace('/^\xEF\xBB\xBF/', '', data[0]);
    }
    $row[] = $data;
    $count++;
} 
```

※この記事は、[アウトプットネタ棚卸し Advent Calendar 2018](https://dosomething.hatenablog.com/entry/2018/12/01/000000) 22日目の記事も兼ねています。
Windows7へIE9をインストールしなければならない

# 前提
Windows7でのIE9サポートは終了しています。非推奨です。
どうしても。何故かIE9をインストールしたいとき、以下の方法を使用してください。
# RC版を使う
IE9 RC版であれば以下から入手→インストール可能です。
[Windows 7 用 Windows Internet Explorer 9 Release Candidate](https://www.microsoft.com/ja-jp/download/details.aspx?id=19379)
# ENU(英語)版を使う
以下のリンクから。直リン注意。
[IE9 for Windows 7 32-bit](http://download.microsoft.com/download/C/3/B/C3BF2EF4-E764-430C-BDCE-479F2142FC81/IE9-Windows7-x86-enu.exe)
[IE9 for Windows 7 64-bit](http://download.microsoft.com/download/C/1/6/C167B427-722E-4665-9A40-A37BC5222B0A/IE9-Windows7-x64-enu.exe)
## 日本語化したい
language packをMicrosoft公式からダウンロードする。
[Windows 7 と Windows Server 2008 R2 向け Windows Internet Explorer 9 の言語パック](https://www.microsoft.com/ja-jp/download/details.aspx?id=1944)

# その他
以下のリンクのIE9はおそらくVista用。（試してない。）
[Internet Explorer 9 (32-Bit)](https://www.microsoft.com/ja-jp/download/details.aspx?id=29254])

# 参考
[IE6, IE7, IE8, IE9, IE10, IE11 Offline Installers Download Links](https://www.itechtics.com/download-internet-explorer-all-versions/)
ROS講座82 obstacle_detectorを使う

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 20.04 |
| ROS | Noetic |
| Gazebo | 11.9.0 |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
lidarの/scanから障害物を検出するパッケージとしてobstacle_detectorがあります。これを使ってみます。

# obstacle_detector使用の準備

## 依存ライブラリのインストール
obstacle_detectorのビルド、起動にはArmadilloという数学ライブラリが必要です。

```shell:armadilloのインストール
sudo apt-get install -y libarmadillo-dev libarmadillo6 
```

## ダウンロード
githubからソースをダウンロードします。

```shell:obstacle_detectorのダウンロード
cd ~/catkin_ws/src
git clone https://github.com/tysik/obstacle_detector.git
```

## ビルド
```shell
cd ~/catkin_ws
catkin build
```

## テスト実行
ソースに入っているデモを起動します。
各ターミナルごとに実行前にsource ~/catkin_ws/devel/setup.bashを実行する必要があります。

```shell
roslaunch obstacle_detector demo.launch 
```

![obstacle_demo1.gif](https://qiita-image-store.s3.amazonaws.com/0/254442/e84fa95f-8754-56fa-e55a-21d9cee1ccce.gif)


# 使い方
今回はobstacle_trackerの中からobstacle_extractorとobstacle_trackerの2つを使います。前者はscanデータから円（障害物）と直線（壁）を検出します。後者は時間的に見てましてノイズで発生する円（障害物）を除外します（tracking IDを振るとかはやってくれません）。

## config
実はたくさんの設定項目がありますが、ほとんどデフォルトのままで使えます。tf関連は設定しておく必要があります。またobstacle_extractorはデフォルトではpclデータを入力するようになっているので、scan入力になるように設定を変更します。
またydlidarのような点数が少ないlaserでも反応するように設定を一部変えます。

```yaml:laser_lecture/config/obstacle_detector.yaml
obstacle_extractor:
  use_scan: true
  use_pcl: false
  min_group_points: 3
  max_group_distance: 0.05
```

## launch
```xml:laser_lecture/launch/obstacle_detector.launch
<?xml version="1.0" encoding="UTF-8"?>
<launch>
  <arg name="model" default="$(find sim_env_lecture)/urdf/sensor_station.urdf" />
  <arg name="rvizconfig" default="$(find laser_lecture)/rviz/obstacle_detector.rviz" />  
  <param name="robot_description" command="$(find xacro)/xacro $(arg model) --inorder"/>

  <!-- gazebo world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="sensor_station_coke_box.world"/>
  </include>

  <!-- obstacle detector -->
  <rosparam command="load" file="$(find laser_lecture)/config/obstacle_detector.yaml" />
  <node name="obstacle_extractor" pkg="obstacle_detector" type="obstacle_extractor_node">
    <remap from="scan" to="/front_laser/scan" />
  </node>
  <node name="obstacle_tracker" pkg="obstacle_detector" type="obstacle_tracker_node" />

  <node pkg="tf" type="static_transform_publisher" name="tf_1" args="0 0 0 0 0 0 map base_link 10" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />   

  <!-- rviz -->
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>
```

## 実行
```shell
roslaunch laser_lecture obstacle_detector.launch 
```

以下のように障害物がそれぞれ検出されました。
表示では赤い丸が物体の大きさ、緑はマージンらしいです。

![laser_OD.png](https://qiita-image-store.s3.amazonaws.com/0/254442/1c33adb3-9552-889d-69f2-43fd1caa2515.png)


# 参考
[obstacle_detector](https://github.com/tysik/obstacle_detector)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
Mac セットアップ備忘録

## 変更した設定

* コンピュータ名の変更（要再起動）  
  システム環境設定 > 共有 > コンピュータ名  
* ファイルの拡張子を表示  
  Finder > 環境設定 > すべてのファイル名拡張子を表示

## ネットからダウンロードしてインストール

* Karabiner-Elements  
  https://pqrs.org/osx/karabiner/
* Chrome
* Google 日本語入力
* iTerm2  
  https://iterm2.com/
* Docker CE for Mac  
  https://store.docker.com/editions/community/docker-ce-desktop-mac

## ターミナルからインストール

* Xcode  
  `xcode-select --install`
* Homebrew  
  http://brew.sh/index_ja.html
* brew install ...
  * coreutils
  * bash-completion
  * vim
  * git
  * curl
  * wget
  * nkf
  * ack
  * jq
constexpr での再帰の深さ

`constexpr` はもはや C++ になくてはならないものになったが `constexpr` 関数には様々な制約があり、特に C++11 では普通の関数とはまるで違う書き方を必要とする。 特にループを書けないという制約が厳しい。 再帰で代用することになるのだが、再帰の深さにも上限があるので、どうにかして再帰の深さを減らすかというのが重要なテクニックになる。 再帰の深さは規格では最小でも 512 以上であることが要求されているようだが、ループの替わりにするならいかにも少ない数値だ。

さて、 `constexpr` 関数を書いたときに実際に再帰の深さがどの程度になっているのか雑に計測する方法として、私はコンパイラのオプションで限界値を減らしてみるという方法をとろうとした。 GCC や Clang なら `-fconstexpr-depth` というオプションである。 が、 GCC と Clang で結果が異なるという知見を得た。

# 処理系

ここで使う Clang と GCC は [MSYS2](https://www.msys2.org/) 上のパッケージとして提供されているもので、それぞれのバージョンは以下の通りです。

- GCC 7.3.0
- Clang 7.0.0

# アッカーマン関数での例

サンプルとしてアッカーマン関数で示す。

```cpp:sample.cpp
#include <iostream>

constexpr int ack(int m, int n) {
  return m == 0
    ? n + 1
    : n == 0
    ? ack(m - 1, 1)
    : ack(m - 1, ack(m, n - 1));
}

int main(void) {
  constexpr auto bar = ack(3,1);
  std::cout << bar <<std::endl;
  return 0;
}
```

Clang では

```
clang++ sample.cpp -fconstexpr-depth=15
```

GCC では

```
g++ sample.cpp -fconstexpr-depth=8
```

が限界値の最小となる。

実際はどうなのか、少しプログラムを変形して確認してみると……

```cpp
#include <iostream>

int max_depth=0;

int ack(int m, int n, int depth) {
  if(max_depth < depth) max_depth = depth;

  return m == 0
    ? n + 1
    : n == 0
    ? ack(m-1, 1, depth+1)
    : ack(m-1, ack(m, n - 1,depth+1), depth+1);
}

int main(void) {
  auto bar = ack(3, 1, 1);
  std::cout << "depth=" << max_depth << std::endl;
  return 0;
}
```

Clang での限界値に一致する。

```cpp
depth=15
```

# フィボナッチ数での例

フィボナッチ数を計算する関数ならどうだろうか。

```cpp
#include <iostream>

constexpr int fib(int n) {
 return n < 2 ? 1 : fib(n-1) + fib(n-2);
}

int main(void) {
  auto bar = fib(10);
  std::cout << bar << std::endl;
  return 0;
}
```

```
clang++ sample.cpp -fconstexpr-depth=1
```

```
g++ sample.cpp -fconstexpr-depth=0
```

Clang と GCC のどちらとも、実際の再帰の深さよりもかなり小さい値を指定してもコンパイルが通ってしまった。

# まとめ

このようなざっとした確認に過ぎないが、上手く最適化して再帰の深さを抑えるような仕組みでもあるのか、見かけ上の再帰の深さよりも少ない値を指定しても通ってしまうようだ。

再帰の深さを計測するために使うという当初の目的には使えなさそう。
LAMMPS入門の手引き 3:データの保存と制御文

今回は、LAMMPSのデータの入出力と制御文について紹介します。

#シミュレーション結果の保存とリスタート

LAMMPSは`write_restart`コマンドで現在の状態を保存することができます。ここでは保存したものをリスタートファイルと呼びましょう。
また、`restart`コマンドを呼んでおくとその後`run`中に一定ステップおきにリスタートファイルを保存することができます。指定したファイル名に"*"が入っていればステップ数に置換してくれます。

```
restart 1000 hoge.*.restart
run 100000
write_restart hoge.restart
```

これは`write_dump`コマンドと`dump`コマンドの関係と同じです。なお、リスタートファイルはバイナリ形式なのでテキストエディタで開いても読めません。

リスタートファイルに何が保存されて何が無視されるかは結構複雑なので、詳しくは`read_restart`コマンドの[マニュアル]([https://lammps.sandia.gov/doc/read_restart.html)を見ることをおすすめします。
特に`fix`の条件がややこしく、保存と再開の繰り返しで状態依存しすぎると脳みそがついていかなくなるので、`fix`は`run`のたびになるべく解放しておくほうが見通しが良い気がしています。

一方、読み込みについては3種類のコマンドがあります。`read_restart`, `read_dump`, `read_data`です。
`read_restart`はリスタートファイルを読むもの、`read_dump`は実行中に`dump`コマンドでファイルに書き出した原子の位置情報を読み込むもの、`read_data`は(ケースによっては分子のボンドの情報なども含めて)原子の配置を特定の形式で書いたファイルを読むものという位置づけでよいと思います。

系の原子が持つ情報はポテンシャルに依存しています。
固体材料系でよく使われるポテンシャル(EAMやStillinger-Weber、Tersoffなど)や化学反応を扱うポテンシャル(ReaxFFなど)であれば初期条件は基本的に原子の位置のみですが、固定電荷ポテンシャルの場合は原子ごとの電荷なども入力になります。分子系ポテンシャルでは原子の結合状態も入力の一部になります。
そのため、`read_dump`や`read_data`を使って読み書きをする際には、ポテンシャルに応じてそれらの情報も必要になります。
より正確に記すと、原子が持つべき情報を`atom_style`コマンドで指定します。そして、データの入出力はこの`atom_style`で指定した形式に依存するという形になります。

#スクリプトの制御

何らかのシミュレーションが終わった後、一度今までの実行結果をすべて破棄するのには`clear`コマンドを使います。LAMMPSを一旦終了させて再起動したようなイメージです。
`create_box`や`read_restart`などシミュレーション格子を作成するコマンドは本来一度しか呼べませんが、`clear`コマンドをまたげば使えます。

```
clear
```

他のスクリプトファイルを読み込むには```include```コマンドを使います。

```
include in.hoge
```

名前空間のような扱いはなく、`variable`などを保持したままそこから指定先のスクリプトを上から順に読んでいきます。
引数の受け渡しみたいなことをしたければ、異なるスクリプト間で同じ名前の変数でやりとりしましょう。

`if`コマンドによる条件分岐や、ループも存在しています。ループは`variable`と`label`と`goto`を使った素朴なものです。

スクリプト中でシェルを呼ぶことができます。Pythonとの結合は力を入れているようで、LAMMPS側からデータの入出力も含めてPythonを呼ぶこともできます。
ただし、Pythonモジュールを入れてLAMMPSをコンパイルする必要があります(デフォルトではオフになっています)。

```
shell mkdir hoge
python p1 file hoge.py
python p1 invoke
```

LAMMPSスクリプト内で複雑なフローを書くこともできますが、個人的にはそういった制御は外部のスクリプト(シェルやPythonなど)にまかせてしまって、LAMMPSはなるべく疎結合にしたうえで外部から呼ぶ程度のほうが見やすいかなと考えています。

---

← [LAMMPS入門の手引き 2:動的な計算](https://qiita.com/tkmtSo/items/b4bd8dabb8005ac8dbfb)
→ [LAMMPS入門の手引き 4:LAMMPS内部のオブジェクトあれこれ](https://qiita.com/tkmtSo/items/e385aab6d1d186195311)
RailsをProductionで起動するとき、「credentials.yml.enc」を使用しない方法[Rails 5.2]

# 背景
Productionモードで起動するときには```config/credentials.yml.enc```の中身を復号して環境変数”SECRET_KEY_BASE”として使用するけど、”SECRET_KEY_BASE”ってRailsで暗号化とかするときのキーとして使用されるからそもそも```config/credentials.yml.enc```ってコミットしたくなくね？って話。
バージョン管理に登録する/しないは別の議論にするとして、```config/credentials.yml.enc```を使用しないで起動する方法を試してみることにした。

# 前提
* Docker上でRailsが起動している(ローカルで起動している方は読み替えてください)
* ローカルPCで動作させる
* １度credentials.yml.encを生成している("rails credentials:edit"実行済み)

# 手順

## config/credentials.yml.encを削除する
以下のファイルを削除する

* config/credentials.yml.enc
* config/master.key

## 環境変数にSECRET_KEY_BASEを追加する
今回はDocker上でRailsを起動させているため、docker-compose.ymlに環境変数を追加する

```yml:docker-compose.yml
version: '3'
services:
・
・
　　web:
　　　　environment:
　　　　　　SECRET_KEY_BASE: ${SECRET_KEY_BASE}
・
・
```

ここでハッシュ値を書くと秘匿情報が丸見えで意味がないため、外部ファイルから設定する
**${SECRET_KEY_BASE}**の部分について、docker-compose.ymlの階層(基本はRailsのルートディレクトリ)と同じ階層に".env"ファイルを配置しておくと、そこに記載されている変数に設定された値を設定してくれる

```sh:.env
# docker-compose.ymlの${}と同じ変数名にすること
SECRET_KEY_BASE=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

これにより秘匿情報をコミットすることはなくなる(ただし、.envファイルは別の管理方法で管理することになる)

## master_keyを使用しないようconfigを定義する
master_keyを使用する/しないの設定項目があるので、「使用しない」を定義しておく
定義されていない場合は定義する。trueが定義されている場合はfalseにする。

```ruby:config/environments/production.rb
config.require_master_key = false
```

## RailsをProductionモードで起動する
「config/credentials.yml.enc」が存在しない状態でProductionモードでの起動ができればOK

# 最後に
環境変数にハッシュ値が設定されているだけで良いのはびっくりした。が、特に難しいこともなくできることがわかった
実は"SECRET_KEY_BASE"はハッシュ値であればなんでも起動できたりする(なにかのファイルをmd5コマンドでハッシュ値を出したものでも)
Dockerコンテナとイメージの一括起動/停止/削除

#docker 

時たま、YOZAWAさんを超える勢いで、秒でコード生成とテストしたい時ってありませんか？
「sandboxにコンテナ一個だけ立てて即刻テストしたい!!!タグとかノード考えるのめんどい知らん!!」

しかし、結果sandboxのマシンに要らないコンテナやイメージが溜まってしまうという...。
そこで、コンテナとイメージを全消したりするお便利コマンドをペラりと。

##【やりたきこと】
1.手元のコンテナを全台起こしたり寝かしたりしたい!!
2.コンテナとイメージを全消ししたい!!

「こんなに苦しいのなら悲しいのなら・・・・・・・・・・・
　愛などいらぬ！！」
>If it is so painful, if it is sad.I do not need love.
![CwSjRpbUUAAiAR6.jpg](https://qiita-image-store.s3.amazonaws.com/0/168731/3e5168b4-e99c-2d21-99d0-852cda89eb31.jpeg)

■手元のコンテナ一括起動

```
$ for i in `docker ps -a|awk '{print $NF}'|grep -v NAMES`;do docker start $i;sleep 10; done;
```
■手元のコンテナ一括停止

```
$ for i in `docker ps -a|awk '{print $NF}'|grep -v NAMES`;do docker stop $i;sleep 10; done ;
```
■手元のコンテナ一括削除

```
$ docker ps -a | awk -F, 'NR>1{ print $1}'|xargs  docker rm
```
■手元のイメージを一括削除

```
$ docker images | awk '{ print $3}'|xargs  docker rmi -f
```

<参考>
http://www.hokuto-no-ken.jp/
https://www.kaiyukan.com/
pythonで総当たりの試合表を作成する（並列処理）

## はじめに
　１対１で行う処理を$n$クライアントで行う時、$_nC_2$ 回も処理を行う必要があり、計算時間がかなりかかってしまう。そこで、並列処理をすることで計算時間を短縮しようと考えたが、適当に組み合わせを考えると重複がでてしまい、非効率である。また、$n$の値が固定されていない場合予め組み合わせを作成しておくことができない。
　そのため、総当たりの試合表を作成するアルゴリズムを利用することで、この問題を解決した。

## 作成した関数

```python

def Round_robin(N):
    """
    関数の概要：一度に行う試合数を最大にしつつ
    　　　　　　総当たり戦の試合を組む。
    @param N：チーム数
    @return ：試合の組み合わせのリスト
    """
    match = []  # 試合の組み合わせを入れるリスト
    M=[i for i in range(N)]
    center = int(N/2)
    if N%2==0: # 偶数の時
        for i in range(N-1):
            match.append([(M[0+i],M[-1-i]) for i in range(center)])
            M = M[:1] + M[2:] + M[1:2] # 先頭を固定して１つずつずらす
    else: # 奇数の時
        for i in range(N):
            match.append([(M[i],M[-i+1]) for i in range(1,center+1)])
            M = M[1:] + M[:1] # １つずつずらす
    return match
```

## 実例
### 奇数の場合
```python

Round_robin(5)
>>>[[(1, 0), (2, 4)],
    [(2, 1), (3, 0)],
    [(3, 2), (4, 1)],
    [(4, 3), (0, 2)],
    [(0, 4), (1, 3)]]
```
### 偶数の場合
```python

Round_robin(4)
>>>[[(0, 3), (1, 2)],
    [(0, 1), (2, 3)],
    [(0, 2), (3, 1)]]
```

## 参考
[世界一簡単な、総当たり戦の試合の組み合わせの方法](http://salon-hiyake.hatenablog.com/entry/2014/08/14/091103)
パスワードを忘れた方へをPHPで実装してみた

初めまして、新卒一年目で未経験からwebサービスを作っている小川と申します。
今回は私が実際に書いたパスワードを忘れた方へについてアウトプットしたいと思います。

#簡略化した手順
1.パスワードを忘れた方用のページを作成(メールアドレス入力欄を作成)
2.入力されたメールアドレスがデータベースに登録されているかをチェック
3.メールアドレスが登録されている場合 4へ、されていない場合エラー表示
4.ランダムな文字列をmd5(uniqid(rand(),true))を用い生成し、URLのパラメータとする
5.現在時刻をdate("Y-m-d H:i:s")を用い取得し、 4,5で取得したデータをデータベースに保存
6.ユーザーに 4で生成したurlを付与したメールを送信(mb_send_mail関数)
7.ユーザーがurlを押した際にパラメータを取得（このパラメータがデータベースにあるかどうかを認証）
8.データベースにパラメータがあった際は現在日時を取得
9.登録されている日時と 8の日時を比べ24時間を超えていなければパスワード再設定ページへ（24時間は今回の仕様） 24時間経過している場合はエラー
10.エラーになった際、またはパスワード再設定ページを表示した際に 4.5でデータベースに登録したデータをdelete

##1.パスワードを忘れた方用のページを作成(メールアドレス入力欄を作成)
実際のページ

![1542114550351.jpg](https://qiita-image-store.s3.amazonaws.com/0/315102/41537339-41ac-339c-8f38-34f699dee4d4.jpeg)

こちらはHTMLで実装可能なので説明は省略します

##2.入力されたメールアドレスがデータベースに登録されているかをチェック
PDO手法を用いてデータベースからセレクトします
実際のコード

![1542114883356.jpg](https://qiita-image-store.s3.amazonaws.com/0/315102/5ab48773-92be-ba53-58f7-e2a2f910a3d8.jpeg)

##3.~~メールアドレスが登録されている場合 4へ、されていない場合エラー表示~~
第三者にメールアドレスが登録してあるか特定されてしまうのを避けるためにエラーの際もメールアドレス送信完了ページを表示する

上記のように訂正させていただきました。
コメントありがとうございます。

##4.ランダムな文字列をmd5(uniqid(rand(),true))を用い生成し、URLのパラメータとする
md5(uniqid(rand(),true)) については下記のリンクを参考にさせていただきました！ありがとうございます。
[ランダムな文字列生成] http://ysklog.net/php/2103.html

ただしパスワードのハッシュ化にはpassword_hash関数を用いることが推奨されています
[PHPリファレンス]http://php.net/manual/ja/function.password-hash.php

$passResetToken = md5(uniqid(rand(),true));
'http://care4/fac/index.php?passReset=$passResetToken';

上記のようにランダムで生成した文字列をURLのパラメータとして渡す

##5.現在時刻をdate("Y-m-d H:i:s")を用い取得し、 4,5で取得したデータをデータベースに保存

こちらについては下記リンクを参考にさせていただきました！ありがとうございます。
[PHPで日付関数を使いこなす]https://qiita.com/shuntaro_tamura/items/b7908e6db527e1543837

##6. 4で生成したurlを付与したメールをユーザーに送信(mb_send_mail関数)
メール送信に使っている関数

![1542115807625.jpg](https://qiita-image-store.s3.amazonaws.com/0/315102/a649a986-e33a-48ba-f680-16fe87103f10.jpeg)

##7.ユーザーがurlを押した際にパラメータを取得（このパラメータがデータベースにあるかどうかを認証）
$_GETを用いてパラメータ取得
その後データベースにアクセスし認証

![1542116091683.jpg](https://qiita-image-store.s3.amazonaws.com/0/315102/e18b2eaa-e8e1-2968-a9be-af35cfe77d76.jpeg)

##8.データベースにパラメータがあった際は現在日時を取得
7のコードの一つ目のelse文で取得

##9.登録されている日時と 8の日時を比べ24時間を超えていなければパスワード再設定ページへ（24時間は今回の仕様） 24時間経過している場合はエラー
7のコードの二つ目のif else文で実装

##10.エラーになった際、またはパスワード再設定ページを表示した際に 4.5でデータベースに登録したデータをdelete

![1542116363433.jpg](https://qiita-image-store.s3.amazonaws.com/0/315102/58f209d8-254d-49cf-e186-f7694b2843ca.jpeg)


以上、パスワードを忘れた方への実装でした

プログラムを学び始めて2か月ちょっとなため不備が多いと思いますがご了承くださいませ。
質問、感想等ご意見お待ちしております。
【SMTP】ヘルスチェックのログを手作り、ログをフィルタリングで破棄したい。【rsyslog】

##【事象】
ILBを新たに立てる際、25番ポートにヘルスチェックが飛んでしまってmaillogを逼迫されて困っていた。

##疑似ヘルスチェックログを作成
ログの破棄そのものはrsyslogの設定で選別できるものと判明したが、sandboxでテストしたい。
できればping的な感じのコマンドが欲しかったけど特になく、
telnet以外にもプロトコルやポートを指定したログの吐かせ方があるのでやってみた。
・telnetで実現する場合
・ncで実現する場合
・curlで実現する場合

・telnetで実現

```
■送信元
[root@ba7f4321aa7e /]#  while true;do clear;date ;echo '----';(sleep 1;echo quit) |telnet 対象ホストのIP 25 ;sleep 1;done
[root@ba7f4321aa7e /]# 
■受信元
[root@0d5efba6e27b /]# tail -F /var/log/maillog
Nov 13 12:27:28 0d5efba6e27b postfix/smtpd[223]: connect from unknown[172.17.0.6]
Nov 13 12:27:36 0d5efba6e27b postfix/smtpd[223]: lost connection after CONNECT from unknown[172.17.0.6]
```

・ncで実現

```
■送信元
[root@ba7f4321aa7e /]# while true;do clear;date ;echo '----';(sleep 1;echo quit) |nc 対象ホストのIP 25 ;sleep 1;done
[root@ba7f4321aa7e /]# 
■受信元
[root@0d5efba6e27b /]# tail -F /var/log/maillog
Nov 13 12:27:28 0d5efba6e27b postfix/smtpd[223]: connect from unknown[172.17.0.6]
Nov 13 12:27:36 0d5efba6e27b postfix/smtpd[223]: lost connection after CONNECT from unknown[172.17.0.6]
```

・curlで実現

```
■送信元
[root@ba7f4321aa7e /]# while true;do clear;date ;echo '----';sleep 1 |curl -vv smtp://対象ホストのIP:25 --mail-from 'send-from@example.com' --mail-rcpt 'send-to@example.com' ;sleep 1;done
■受信元
[root@0d5efba6e27b /]# 
[root@0d5efba6e27b /]# tail -F /var/log/maillog
Nov 13 16:19:56 0d5efba6e27b postfix/smtpd[294]: connect from unknown[172.17.0.6]
Nov 13 16:19:56 0d5efba6e27b postfix/smtpd[294]: 0776410DF92C: client=unknown[172.17.0.6]
Nov 13 16:19:57 0d5efba6e27b postfix/cleanup[298]: 0776410DF92C: message-id=<>
Nov 13 16:19:57 0d5efba6e27b postfix/qmgr[127]: 0776410DF92C: from=<send-from@example.com>, size=188, nrcpt=1 (queue active)
Nov 13 16:19:57 0d5efba6e27b postfix/smtpd[294]: disconnect from unknown[172.17.0.6]
```

##rsyslogで破棄する設定をし反映
■受信元

```
[root@0d5efba6e27b /]# cat /etc/rsyslog.d/filter.conf
if fromhost-ip == "送信元のIP" and msg contains "検索対象文字列" then
& ~
[root@0d5efba6e27b /]# 
[root@0d5efba6e27b /]# systemctl restart rsyslog
[root@0d5efba6e27b /]# 
[root@0d5efba6e27b /]# tail -F /var/log/maillog
[root@0d5efba6e27b /]# 
```

無事、吐かれなくなりました～。
公式を読むと、フィルタリングは正規表現も使えてかなりチューニングできるみたいですね。
Filter Conditions
https://www.rsyslog.com/doc/master/configuration/filters.html

<参考>
curl
https://curl.haxx.se/

cURLはHTTPだけじゃない 
https://dev.oro.com/posts/2017/06/server/curl/

nc(netcat)コマンドで覚えておきたい使い方8個
https://orebibou.com/2015/11/ncnetcat%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e8%a6%9a%e3%81%88%e3%81%a6%e3%81%8a%e3%81%8d%e3%81%9f%e3%81%84%e4%bd%bf%e3%81%84%e6%96%b98%e5%80%8b/
atomでpython3を実行する

環境構築ってどの言語使うにしてもハマるんだよなー
ってことでatomでpythonを実行した際にpython3で実行されるように設定する。
※atom-runnerで実行

atom-runner.coffeeを開き、
defaultScopeMapのpythonをpython3にする。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/306027/6e898979-2ada-7eec-e483-c507a03ef2cd.jpeg)

ふぅ～
大分時間つかってしまった。
あ、初投稿！

====================================================
補足：atom-runner.coffeeの開き方
====================================================
ヘルプ→ウェルカムガイド
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/306027/cf575b15-ef16-d10b-dc91-027dab252be2.jpeg)

「install a Package」をクリック→「Open Installer」をクリック
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/306027/623e0ee0-49e3-8d1a-d511-82620edbf22f.jpeg)

左側にメニューがでてくるので、「Open Config Folder（設定フォルダを開く）」をクリック
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/306027/86590071-6ded-cf07-cfda-9c90aa2e5bc4.jpeg)

階層が表示されるので、「atom-runner.coffee」を選択！
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/306027/82139395-afec-6f63-b831-5ec88b444639.jpeg)
OANDA APIから為替データを取得

FXの自動売買について少し興味が湧きましたので
OANDA APIから為替のデータを取得する方法を書いていきたいと思います．

#OANDA API
アメリカに本社を構えるFX業者OANDAが提供しているAPIです．
新しい情報であったり，細かい情報は英語のページしか存在しないのですが，
日本語のページも存在するのですごく助かります．
口座の開き方であったり，APIのアクセス方法は別のサイトを参考にしてください．

OANDA APIを選んだ理由は，

- デモ口座が存在する
- 25万円で本番用APIを扱える

この二つです．
いきなり自分の作成したソフトを使ってお金を動かすのは怖いので，
デモ口座でもAPIを動かせるのは必須です．
次に本番用APIを扱うために口座が必要なのですが，
25万円で開く事ができるのは学生にしてはすごくありがたいです．
このような理由から私はOANDA APIしようすることにしました．

#Pythonで為替データを取得
まず，oandapyV20とpandasをインポートします．
oandapyV20はoandapyを操作するライブラリで，pandasはデータの操作をするためのライブラリです．
それぞれインストールしていない場合は，pipなどでインストールしてください．

```python:
# インポート
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
import pandas as pd
```

APIの設定をしていきます．
`accountID`,`access_token`にはそれぞれ自分の取得した値を代入してください．
与えている数値は適当な数値なのでこのまま実行してもエラーが起きてしまいます．

```python:
# APIの設定
accountID = "000-000-0000000-000"
access_token = "XXXXXXXXXXXXXXXXXXXXXX"
api = API(access_token=access_token)
```

次に，取得したい為替データを指定します．
この例では5分間隔の5000個のデータを取得します．
`count`でデータ数，`granularity`で時間の間隔を指定します．
1度の取得で5000データまでしか取得できないので注意してください．
`granularity`で指定できる間隔は付録を参考にしてください．

```python:
# 5分間隔で5000データ
params = {
    "count": 5000,
    "granularity": "M5"
}
```

では，実際に為替データをリクエストしていきます．
`instrument`では取得したい為替を指定します．
ここでは，米ドル/円を取得しています．
`api.requesr(r)`とすることで，`r.response`にデータが取得されます．


```python:
# APIへ過去データをリクエスト
r = instruments.InstrumentsCandles(instrument="USD_JPY", params=params)
api.request(r)
```

取得したままでは扱いにくいので，必要なデータだけを取り出し，リストに変換します．

```python:
# dataとしてリストへ変換
data = []
for raw in r.response['candles']:
    data.append([raw['time'], raw['volume'], raw['mid']['o'], raw['mid']['h'], raw['mid']['l'], raw['mid']['c']])
```

機械学習などで使用しやすいようにデータフレームに変更します．

```python:
# リストからデータフレームへ変換
df = pd.DataFrame(data)
df.columns = ['time', 'volume', 'open', 'high', 'low', 'close']
df = df.set_index('time')
```

最後に時間についてソートすることで綺麗にします．

```python:
# date型を綺麗にする
df.index = pd.to_datetime(df.index)
print(df.tail())
```

以上のプログラムを続けて入力するだけで為替データを取得できるようになっています．
最後に確認の意味を込めて`df`の最初の5行のデータをプリントしています．
実行結果は以下のようになります．

```
                     volume     open     high      low    close
Time                                                           
2018-11-13 12:00:00      60  114.000  114.034  114.000  114.022
2018-11-13 12:10:00      51  114.020  114.022  114.004  114.010
2018-11-13 12:20:00     141  114.008  114.010  113.937  113.938
2018-11-13 12:30:00     150  113.940  113.982  113.933  113.980
2018-11-13 12:40:00      69  113.978  113.980  113.945  113.945
```

これで5分間隔の5000件のデータを取得できたのであとはデータベースに保存するなり，
学習させるなり好きなようにしてみてください！

#付録
データの間隔を指定する`granularity`で扱える間隔を記載します．

| 引数       |       間隔 | 
|:----------------:|:-----------------:|
|S5| 5秒間|
|S10|  10秒間|
|S15| 15秒間|
|S30|  30秒間|
|M1|  1分間|
|M2|  2分間|
|M3|  3分間|
|M4|  4分間|
|M5|  5分間|
|M10|  10分間|
|M15|  15分間|
|M30|  30分間|
|H1|  1時間|
|H2|  2時間|
|H3|  3時間|
|H4|  4時間|
|H6|  6時間|
|H8|  8時間|
|H12|  12時間|
|D|  1日|
|W|  1週間|
|M|  1ヶ月|
laravel-admin formでドロップダウンリストから選択する

### Controllerのformで下記のように記載するとドロップダウンリストで選択した値を入力することができる

```
$form->select('<カラム名>','値の名前')->options(['設定値' => '設定値名', '設定値' => '設定値名', '設定値' => '設定値名']);
```

###設定例

```
    protected function form()
    {
        $form = new Form(new Reservations);
        $form->display('id','予約ID');
        $form->display('store_id','店舗ID');
        $form->date('reservation_date','予約年月日');
        $form->time('start_time','開始時間')->format('HH:mm');
        $form->time('end_time','終了時間')->format('HH:mm');
        $form->text('number_of_people','受付人数');
        $form->select('status','予約ステータス')->options(['1' => '予約中', '2' => '来店済', '3' => 'キャンセル']);
        return $form;
    }
```

###検証
下記のように選択できる
![ドロップダウンリスト.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/995aefda-ef47-7ee3-a9f7-33c2199870ef.png)
スクロールに合わせて要素をタイミングよくフェードインさせる方法

## やりたいこと
よく見かける動きだと思いますが、スクロールで画面内に要素が表示されたタイミングでフェードインさせるというあれです。

使ったことはないですが、同様のアニメーションは[jquery.inview](https://github.com/protonet/jquery.inview)などで実現できるみたいです。別途ライブラリを入れる程のことではないかなと思い、わりと要望も多いため、使い回せるようにjQueryプラグインとして作成しました。
### こういう感じのレイアウトのやつです（イメージ図）
左右の画像がそれぞれ交互にフェードインします。
![68747470733a2f2f692e696d6775722e636f6d2f7257446c41615a2e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/186008/ee2ea80f-c937-6c3f-c503-7d05eb39b64d.png)
## HTML
cssは掲載していませんが、`fadeinRight` `fadeinLeft`クラスの疑似要素にtransitionでフェードインのアニメーションを指定しています。

`fadeinRight`なら左から右に、`fadeinLeft`は右から左にフェードインさせるという具合です。

```ruby:index.html
<div class="wrapper">
  <div class="block">
    <div class="block__item--img fadeinRight">
      <p>
        <img src="//images/block01.jpg">
      </p>
    </div>
    <div class="block__item">
      <div class="block__item__body">
        <h2 class="block__item__title">見出し</h2>
        <p>テキストテキストテキストテキストテキストテキスト</p>
      </div>
    </div>
  </div>
  <!-- /.block -->
  <div class="block">
    <div class="block__item">
      <div class="block__item__body">
        <h2 class="block__item__title">見出し</h2>
        <p>テキストテキストテキストテキストテキストテキスト</p>
      </div>
    </div>
    <div class="block__item--img fadeinLeft">
    <p>
      <img src="//images/block02.jpg">
    </p>
  </div>
  <!-- /.block -->
</div>
<!-- /.wrapper -->
```

## JS 画面内の判定、クラス付与の処理
各画像が画面内に入ったタイミングで`is-show`クラスを付与し、上記で指定したクラスでフェードインさせます。

```ruby:scripts.js
//プラグイン呼び出し元 関数
function fadeinAnimation() {
  //フェードインさせる要素を指定	
  var $target = $('.block__item--img');
  //要素の数だけプラグインを実行	
  for (var i = 0; i < $target.length; i++) {
    $target.eq(i).scrollIn();
  }
}
//プラグイン
(function ($) {
  $.fn.scrollIn = function (options) {

    var elements = this;
    var defaults = {
      position: 0.5, //フェードインさせる位置の基準
      className: 'is-show' //画面内に要素が入った時に付与するクラス
    };
    var setting = $.extend(defaults, options);

    $(window).on('load scroll', function () {
      addClass_scrolling();
    });

    function screenIn_Decision() {
      var winScroll = $(window).scrollTop(); //スクロール位置を取得（X軸）
      var winHeight = $(window).height(); //ブラウザの高さを取得
      var scrollPos = winScroll + (winHeight * setting.position);
      //スクロール位置がフェードインさせる要素の位置を上回ると'is-show'を追加
      if (elements.offset().top < scrollPos) {
        elements.addClass(setting.className);
      }
    }
  }
})(jQuery);
```

jQueryプラグインの作成方法についてはこちらをご参照下さい。
[jquery プラグイン/作成](https://qiita.com/rorono/items/11e5dbd53cb93edb8b4d)
【Unity】Lean Touchで、3Dモデルに拡大、縮小、回転させる

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Xcode version 10.0(10A255)
⭐️Unity 2018.2.15f1
⭐️iPhone7 IOS11.4.1

実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1062318867408609280
![スクリーンショット 2018-11-13 22.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/93155/c5badc64-eae6-62d2-098c-2e5ceda5a1ae.png)



#<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>

続きは、こちらに記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://blogs.yahoo.co.jp/nonpipo/18716982.html)
HTMLはHTMLでスタイリングしよう

HTMLにある機能を使えばいいものを、手を抜こうとしたらしっぺ返しを食らった、そんな話です。

## 長い長い、識別子

プログラミングをやっていると、時折`example_of_very_very_long_identifier_name`や`exampleOfVeryVeryLongIdentifierName`のように、えんえん長い識別子が誕生してしまいます。これをふつうにHTMLへ表示すれば、アンダーバーや大文字小文字の境界は単語の区切りとして認識されないので、改行が発生せずに行を突き抜ける、などのトラブルを生んでしまいます[^1]。

## 手抜きの手法

表示されるものを制御する上で、タグのない文字列からタグ入りの文字列にしようとすれば（XSSなどを防ぐために）それなりの工数がかかりますが、同じ文字列であればほぼ変化なく運用できます。ということで、改行したい位置に[ゼロ幅スペース](https://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E5%B9%85%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9)を投入して表示させたところ、きれいに表示がなされました。

### 思わぬしっぺ返し
そこまではよかったのですが、ある時コードが意味不明なエラーを吐くようになりました。調べてみると、ゼロ幅スペース入りのものをコピペしてしまったがために、コードとして成立せずエラーとなってしまったのでした。しかも、ゼロ幅なだけあって肉眼には全く見えないので、探すのも厄介でした。

## 正しい方法

手を抜いたのがすべての元凶、ということで、きちんとHTMLでスタイリングすることとしました。`<wbr>`というタグがあって、「ここで改行していい」という指示ができます（[MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/wbr)）。[アンダーバーで切り分けて](https://qiita.com/jkr_2255/items/86ac76ec8aa0b108cecd)、適宜`<wbr>`と絡ませれば、コピペしても問題なく表示できるようになりました。

## 教訓

* 見えない文字が混入すると厄介
* コピペする前提のものは、きちんとHTMLでスタイリングしよう

[^1]: Qiitaはプログラムコード入りの文章を書くことが前提のサイトということもあって、`<body>`レベルで`word-wrap: break-word`をかけてありました。
graphillionを使ってみた

# はじめに
　まずは<b>[フカシギの数え方](https://www.youtube.com/watch?v=Q4gTV4r0zRs&feature=youtu.be)</b>を見ていただきたい。これは、日本科学未来館で平成24年8月1日(水) ～ 平成25年4月15日(月)の間に公開されていたアルゴリズムの重要性をわかりやすく示した有名な動画である。この動画でわかる通り、アルゴリズムを使うことで計算時間を大幅に短縮することができる。
　そこで、動画内で紹介されていたアルゴリズムを<b>graphillion</b>（読み方はグラフィリオン）というライブラリを用いてpythonで実際に計算してみる。
# graphillionとは
　graphillionとは、グラフ集合を扱うためのライブラリであり、PythonやC++でパスや全域木、マッチングなど、様々な対象を列挙できる。今回は、このグラフ集合ライブラリgraphillionのチュートリアルを実際にpythonで行い、実用性を実感する。
# インストール
　まずはgraphillionをインストールする。詳しくは[Github](https://github.com/takemaru/graphillion#graphillion---fast-lightweight-library-for-a-huge-number-of-graphs)を見てもらいたいが、実際にインストールした手順を示す。なお、環境は MacBook ProのIntel Core i5(64bit)で、Python 3.6.3 である。
　なお、`networkx`と`matplotlib`は必須ではないが、チュートリアルでグラフ図示をする際に必要となる。

```
pip install networkx
pip install matplotlib
pip install graphillion
```
　以上のコマンドを打つと、自分のOSとpythonのバージョンに合わせた最適なバージョンがインストールされる。

# チュートリアル
　それでは、チュートリアルを行う。

``` python
# 必要なモジュールのインポート
from graphillion import GraphSet
import graphillion.tutorial as tl
```
　まずは、動画でお姉さんが命をかけて挑んでいたグリッドの問題を解く。

``` python
# グリッドのサイズを指定
universe = tl.grid(2, 2)
GraphSet.set_universe(universe)
tl.draw(universe)
```
　この時、`tl.draw(universe)`で考えているグラフを図示できるので、便利である。今回考えているグリッドは、以下のようになる。<img src="https://qiita-image-store.s3.amazonaws.com/0/308700/eed966c8-e82b-714c-11cc-fc6ad0189093.png" width=50%>

　それでは、実際に経路が何本あるのかを計算する。

``` python
start = 1 # スタート位置
goal = 9 # ゴールの位置
paths = GraphSet.paths(start, goal)
len(paths)
>>> 12
```
　正しい答えも以下の通り12通りである。
<img width="566" alt="all_path.png" src="https://qiita-image-store.s3.amazonaws.com/0/308700/90b5c556-db3b-abce-b4e3-d63856c84065.png">

　それではここで、この問題の派生問題を解いてみる。「指定された２箇所を指定された順番で通る」という制約付きで道順が何通りあるかを調べる。（チュートリアルでは、"key is picked up before reaching the treasure box" として紹介されている。）

``` python
key = 4        # 1箇所目
treasure = 2   # 2箇所目
paths_to_key = GraphSet.paths(start, key).excluding(treasure)
treasure_paths = paths.including(paths_to_key).including(treasure)
len(treasure_paths)
>>> 2
```
　ここでも正しく計算された。（もちろん選ばれたのは以下の２つ）
<img src="https://qiita-image-store.s3.amazonaws.com/0/308700/fa43aa99-f43e-bb99-036f-f305c8061c43.png" width=50%>

　それでは最後に、お姉さんが６年半もかけてしまった9×9のグリッドで全てのパスを求める時間を調べる。

``` python
import time              # 計算時間を調べる。
universe = tl.grid(8, 8) # 9×9のグリッド
GraphSet.set_universe(universe)
start = 1
goal = 81
s = time.time()          # 計算開始時刻
paths = GraphSet.paths(start, goal)
time.time() - s # 計算時間
>>>0.37097..
len(paths)
>>>3266598486981642
```
　かなり早く計算ができた。
# 計算時間を短縮できる理由
　端的に言えば、<b>「圧縮と剪定をしているから」</b>である。
　また、graphillionでは、<b>ZDD(Zero-suppressed Binary Decision Diagram)</b> という「集合の集合を表現するデータ構造」を利用している。
　ここで、<b>「１本のパス（道順）」＝「いくつかの辺の集合」</b>と考えることによってパスを集合と捉え、ZDDを利用できる。パスを列挙するアルゴリズムは以下の通り。

1. 辺に順番をつける。（例えば、sから幅優先）
2. 上でつけた順番が早い方から「その辺を通るか通らないか」を決める
3. 等価なパスは<b>圧縮し</b>、不成立が確定しているパスを<b>剪定</b>する

[「ZDDを自作して数え上げお姉さんを救ってみた」](https://qiita.com/cabernet_rock/items/01c48dd06178ba0768f9)で、より詳細な解説と自作のZDDアルゴリズムを紹介しているので、興味がある人は見て欲しい。

# 参考文献
[フロンティア法 - 組合せ問題の解を列挙 索引化するZDD構築アルゴリズム](http://www-lsm.naist.jp/~jkawahara/frontier/frontier_lec.pdf)
(北海道大学 情報科学研究科 川原純助教のスライド)
(レポート)ふりかえり実践ワークショップ(11月 in 大阪)をふりかえる会

# はじめに
2018/11/13 Zoomにて行った、[ふりかえり実践ワークショップ(11月 in 大阪)をふりかえる会](https://retrospective.connpass.com/event/107699/)のレポートです。

# ふりかえりの内容
ワークショップの前準備と序盤について、3名でふりかえりを行いました。
RealtimeBoardを使って、ワークショップの進め方やファシリテーションについて、ふりかえりを行っています。

ふりかえりの対象となるスライドは[こちら](https://speakerdeck.com/viva_tweet_x/hurikaeriwakusiyotupu-shi-jian-shi-jian)。

内容はこちら。
※画像が巨大ですので、拡大してご参照ください

![2018_11_13 ふりかえり実践会 in 大阪のふりかえり (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/221788/4605f268-fd7a-a6d3-9b9f-25915b14afbc.jpeg)

2時間のふりかえりでしたが、多くの気付きもあり、私としてもいろいろ言語化できた部分はあったなぁ、と感じます。
リモートでワイワイするふりかえりもよいものですね。

※一番下の「Facilitacion=>進行」はそういうものじゃないよね、という意図で書いています
jenkins


C:\Program Files\Jenkins\secrets\initialAdminPassword


STEPCOUNTER
http://d.hatena.ne.jp/takuma02141978/20111225/1324778439

Jenkinsの管理>プラグインの管理>利用可能>StepCounter Plugin

再起動
http://localhost:8080/restart

起動
es\Jenkins>java -jar jenkins.war
Running from: C:\Program Files\Jenkins\jenkins.war
webroot: $user.home/.jenkins
11 13, 2018 9:05:01 午後 org.eclipse.jetty.util.log.Log initialized
情報: Logging initialized @1678ms to org.eclipse.jetty.util.log.JavaUtilLog
11 13, 2018 9:05:01 午後 winstone.Logger logInternal
情報: Beginning extraction from war file
キズナアイちゃんなりきりVRの補足メモ(2018/11/13～)

# 概要
Qiita記事「Unity＋Vive＋MMD＋VRIKで、キズナアイちゃんになりきりVR」を
参考にキズナアイちゃんのMMDをVIVEで動かしてみた際に個人的につまずいた点をメモしました。
[Unity＋Vive＋MMD＋VRIKで、キズナアイちゃんになりきりVR](https://qiita.com/halne369/items/daadf0e00330a1019830)

# 実行環境
- Windows10 64bit
- Unity 2018.2.6f1  
- HTC VIVE

# プラグイン（アセット）
- MMD4Mecanim 2018/05/23 版(β)
- SteamVR Plugin Ver2.0.1
- FinalIK Ver1.8
- [キズナアイMMD](http://kizunaai.com/download-page/)

# 注意メモ
## SteamVR PluginのInput設定を先に行わないといけない。
SteamVR Plugin 2.0になり少し仕様が変わったようです。
SteamVR Pluginをアセットストアからインポートした後に、
Window > SteamVR Inputを開き、SteamVR Inputのアクションを
設定しておく必要があります。
[SteamVR Plugin 2.0 セットアップ・サンプルシーンを動かすまでの備忘録](https://qiita.com/kyourikey/items/5967018e613b2fd49a1f)

## FinalIKを正常に動かすために、Unity2018を使用する。
詳しい原因はわからないが、FinalIKをインポートした後に、
Unity2017ではエラーがたくさん出た。
「CCDIKJob.cs」内の「using UnityEngine.Experimental.Animations;」などが
無いというようなエラーがたくさん出るため、
Unity2018でインポートしなくなると出なくなった。

# まとめ
プラグインやアセットは頻繁に更新されるので、
バージョン違いなどに気を付けたほうがよさそうです。

# 参考記事
[Unity＋Vive＋MMD＋VRIKで、キズナアイちゃんになりきりVR](https://qiita.com/halne369/items/daadf0e00330a1019830)
[SteamVR Plugin 2.0 セットアップ・サンプルシーンを動かすまでの備忘録](https://qiita.com/kyourikey/items/5967018e613b2fd49a1f)
初めてのサウンドプログラミング②~PC上での音データ~

続きました。
[一話目](https://qiita.com/kamiro/items/62f648f7201cdb0097cf "初めてのサウンドプログラミング")がありますが、読まなくても大丈夫です。
初心者が勉強したことをテキトーアウトプットしてるだけですので、間違えてる箇所が多いかもしれません。間違えてたらご指摘お願いします。

今回は__プログラミング、コーディングのお話はナシ。__

#音を出力するまでの物理的な工程の話
サウンドプログラミング関連の参考書はなかなか話題がフォーカスしすぎたものが多く、全くの初心者にはどういう工程のどの部分について言っているのかわかりません。概念的な工程のイメージがつかめれば、その意味不明な参考書が光り輝く情報源になるはずです!

というわけで、今回は__どういう流れでPC上で音を扱う__のか、うっすーーいお話しをしていきます。

##こんな人に読んで欲しい
- サウンドプログラミングやってみたいけど具体的なイメージが掴めない人
- デジタルサウンドがどうやってできているか知らない人

##デジタル上での音データの中身は?
PC上でサウンドデータを操作すると言っても、サウンドってどうやってデジタルでデータ保持しているのでしょう?

###音はもともとアナログなもの
音というのは波です。__連続的__な信号です。
ですので、デジタル上でそのまま音の情報を入力するのは無理なのですね。連続的な値を本気で表現しようと思ったらファイルサイズが無限大になります。
ここでよく聞く__A/D変換__という工程を踏みます。

###A/D変換とは?
この言葉だけ聞くとビビってしまいそうですが、簡単な話です。
__アナログ→デジタルに音を変換しましょう__ということです。

まず連続した波の値を、何分割かして離散値にします。これは__サンプリング(標本化)__と言います。(A/D変換=標本化といっていい?)細かく分割すればするほど、細かい音の変化が取れるので、解像度の高いデータという事になります。この分割数は、1秒間に実行する標本化処理の回数で表されます。これを__サンプリングレート__と呼びます。

![a:d1.jpg](https://qiita-image-store.s3.amazonaws.com/0/248178/bc584c7c-8d62-fd17-c04a-324eb279cc65.jpeg)

サンプリングレートはその時の必要条件を満たすぐらいの値でいいのですが、人間の耳が聞き取れる限界がだいたい22khzぐらいなのでCD音源などは44.1khzです。
ん?なぜ聞き取れる音の最大値から倍の値なのかって?[標本化定理](https://kotobank.jp/word/%E6%A8%99%E6%9C%AC%E5%8C%96%E5%AE%9A%E7%90%86-10928 "標本化定理")で検索けんさくう!

###PCM配列にしまう
さてA/D変換を行って何が嬉しいかということなんですが、エンジニアならわかるでしょう!__配列に突っ込め__るのです!
この時に一個一個のデータの表せる精度の高さを__量子化ビット数__と言います。
16bitもあれば2の16乗分なので、0〜65,535の65,536段階まで表せるのでこんなもんでいいかなという感じです。もっと細かくしてもいいですが、データ量と相談してください。

rustでかくとこんな感じ..?
```let pcm :Vector<i16> = vec![];```
このサンプリングデータを配列として表現したものが、__リニアPCM__というものになります。
これが__デジタルサウンドデータの本体__なわけですね〜。

##どうやって音を出力するのか
これはA/D変換と逆のことをします。つまり、__D/A変換__ですね。
音を出力するときは__アナログの波に戻さないといけません__。これはまあ、電気的な話です。詳しく知らなくてもソフトウェア組みたいだけなら深く知らなくていいでしょう。

アナログへ変換が終わると、スピーカーなどのハードを振動させる事によって音を出力します。
##終わりに
今回もざっくりすぎる説明をいたしました。もっと知りたいと思ったかたはこの記事のキーワードをゴリゴリ検索していただければお分かりいただけるかと思います。
自分は専門家ではないので。エンジニア視点でだいたい流れがつかめればいいくらいに考えています。お読みいただきありがとうございました。


##参考にさせていただいたページ
[PCM ‐ 通信用語の基礎知識](https://www.wdic.org/w/TECH/PCM "PCM ‐ 通信用語の基礎知識")
[用語解説辞典｜【公式】NTTPC](https://www.nttpc.co.jp/yougo/D%EF%BC%8FA%E5%A4%89%E6%8F%9B.html "用語解説辞典｜【公式】NTTPC")
matplotlib 2軸グラフ　③プロット編

# はじめに
前回（[matplotlib 2軸グラフ　②データ合成編](https://qiita.com/ozikot/items/f7e5c346e631de067efb)）に引き続きやっていきたいと思います
ようやく本題に入ります

# 構成
全部で3部構成です

* [matplotlib 2軸グラフ　①データ生成編](https://qiita.com/ozikot/items/604c96c6714f50b55f26)
* [matplotlib 2軸グラフ　②データ合成編](https://qiita.com/ozikot/items/f7e5c346e631de067efb)
* [matplotlib 2軸グラフ　③プロット編](https://qiita.com/ozikot/items/a742487147fbdd666d88)←今ここ

今回は「③プロット編」です
使用するコードは以下に載せてあります
https://github.com/ozikot/BiaxialPlot/tree/master/ep3_plot

# プロット
ひとまず何も設定せずにプロットします
![before_merge.PNG](https://qiita-image-store.s3.amazonaws.com/0/314579/a1b42e6d-4014-3fac-70ff-6d10801d5c2c.png)

* x軸の範囲は左端から始まっておらず右端で終わっていない
* 左のy軸と右のy軸で目盛の個数が合っていないのでグリッドがずれる

実は私が描画を始めたころに比べたら，これでもかなりマシなのですがまだ改善の余地があるので設定を加えていきます

コードが少し長くなりました
各行の説明にコメントを設けました

```python
import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def main():

    # CSVファイル読み込み
    df = pd.read_csv('..//csv_file//merged.csv')

    # 描画するデータの時間範囲を04:00:00~04:19:59に設定します（お互いのグラフ線を区別しているので見やすくするため）
    # 論理演算子は and ではなく &
    df = df[('2018-09-01 04:00:00'<= df['Time']) & (df['Time'] <= '2018-09-01 04:20:00')]

    # index降りなおし dropは元のindexを保存するかしないか -> 保存しない場合はTrue
    df = df.reset_index(drop=True)

    # BPMを左y軸、Temperatureを右のy軸(secondary_y)とした二軸プロット
    # gridの設定は後で行うためFalseにしておく
    # mark_rightは右y軸の凡例表示に(right)を追加することを意味する　デフォルトはTrue
    ax = df.plot(secondary_y=['Temperature'], figsize=(20, 5), style=['-', '-.'], grid=False, fontsize=15, mark_right=False)


    #-#-# ラベル #-#-#
    
    # 左y軸のラベル
    ax.set_ylabel('BPM', fontsize=15)
    
    # 右y軸のラベル
    ax.right_ax.set_ylabel('Temperature[°C]', fontsize=15)

    # x軸のラベル
    ax.set_xlabel('Time[s]', fontsize=15)


    #-#-# 軸の範囲 #-#-#

    # 各列の要約統計量
    desc = df.describe()

    # 左y軸の描画範囲 余裕を持たせるために下限上限共に-1, +1
    ax.set_ylim(math.floor(desc['BPM']['min']) - 1, math.ceil(desc['BPM']['max']) + 1)

    # 右y軸の描画範囲
    ax.right_ax.set_ylim(math.floor(desc['Temperature']['min']) - 1, math.ceil(desc['Temperature']['max']) + 1)

    # x軸の描画範囲
    start_idx = list(df.query('Time == "2018-09-01 04:00:00"').index)[0]
    end_idx = list(df.query('Time == "2018-09-01 04:20:00"').index)[0]
    ax.set_xlim(start_idx, end_idx)


    #-#-# グリッド #-#-#
    
    # グリッドの調整　両y軸のメモリの数をそろえればグリッドを引くのは片方だけに設定すればよい
    ax.grid(True, linestyle=':')
    
    # 目盛の範囲を指定 第三引数は目盛の個数、(max-min+1)の倍数であることが好ましい（小数にならないため）
    ax.set_yticks(np.linspace(math.floor(desc['BPM']['min']) - 1, math.ceil(desc['BPM']['max']) + 1, 8))
    ax.right_ax.set_yticks(np.linspace(math.floor(desc['Temperature']['min']) - 1, math.ceil(desc['Temperature']['max']) + 1, 8))
    ax.set_xticks(np.linspace(start_idx, end_idx, 7))

    # 画像を保存
    plt.savefig('merged.png')
    plt.show()


if __name__ == '__main__':
    main()
```

グラフを見てみましょう

![merged.png](https://qiita-image-store.s3.amazonaws.com/0/314579/4eb8bca8-9a2d-4a45-8cd4-3808874bd51a.png)


右y軸の目盛の値が微妙ですが、安直ですが最小公倍数などでそろえようとしたら数が大きくなってしまい今も悩みどころです



# おわりに
いかがでしたでしょうか
最後まで見てくださった方、ありがとうございました
私はax.right_ax~という書き方にたどり着くまでに時間がかかりました

何かありましたらコメントかTwitter(https://twitter.com/ozikot) にて教えてください！
built-in 関数の memoryview でメモリアクセスを効率化

built-in 関数なのに知らなかった。大規模なバイト列を利用する場合、 `memoryview` で無駄なコピーを避けることで、負荷を大幅に下げることが出来る。

``` python
$ ipython
In [1]: a = b'a' * int(1e9)

In [2]: %time b = a[:int(1e8)]
CPU times: user 13.7 ms, sys: 24.3 ms, total: 38.1 ms
Wall time: 37.9 ms

In [3]: mv = memoryview(a)

In [4]: %time c = mv[:int(1e8)]
CPU times: user 12 µs, sys: 3 µs, total: 15 µs
Wall time: 20.7 µs
```

1GBのデータから初めの100MBを取得する処理の場合、約1000倍速。
Imagemagickで2値化してみた

# 背景
画像処理とやらをやってみたく、パソコン初心者が少しググりながら２値化をやってみました。2値化をするにあたり、ImageMagickを導入しました。また、参考にさせていただいたページも下記にリンクさせて頂きます。

## 環境
MacBookPro
macOS Mojave 10.14.1
Homebrew 1.8.2

## Imagemagick導入&2値化
その前に、画像をディスプレイに表示させるために必要なXQuartzを入れました

``` terminal.
brew --version
brew cask install xquartz
```
その後、Imagemagick w/ X11(X Window System) 導入

``` terminal.
brew install imagemagick --with-x11
convert -list configure
```
設定を有効にするためには、再起動してください

再起動後displayコマンドを試してください
無事にImageMagickとX11で画像が表示できました
(下はデスクトップ上の画像表示の例）

``` terminal.
cd ~/Desktop
display original.jpg
```
<img width="302" alt="ImageMagick__original_jpg.png" src="https://qiita-image-store.s3.amazonaws.com/0/171851/3dd92147-c28d-7131-8500-2a0cdcd723f2.png">

そして、**2値化！**(original.jpgを2値化してoriginal_1.jpgで保存)
"7000"という値はTry＆Errで、いい感じの値を入れています。

``` terminal.
convert -threshold 7000 original.jpg  original_1.jpg
```
<img width="300" alt="ImageMagick__original_1_jpg.png" src="https://qiita-image-store.s3.amazonaws.com/0/171851/d40aae94-d80c-fc96-5fbf-7e5262a6a014.png">

何にも使えませんが、**2値化**できました！

## 参考にさせて頂いたページ
- https://tamosblog.wordpress.com/2017/06/20/simple_cg_by_ruby/
- http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/image/magick_process.html
electrumxに問い合わせるときに使うscripthashスニペット

新しいプロトコルバージョンではアドレスではなくscripthashを使って問い合わせる必要がある
p2pkhのscripthashはscriptpubkeyから作る
p2shのscripthashはredeem scriptから作る

# scripthash(p2pkh ver)とは

* アドレスを作るための元となるデータscriptpubkey（ビットコインにはアドレスと言う概念はそもそもない、ウォレット上の概念）をsha256でハッシュしたもの
* scriptpubkey = pubkey + bitcoin script
* scripthash = sha256(scriptpubkey).reverse()
* コインごとに別の値にならない

# scriptpubkeyからscripthashを生成するやりかた

* sha256でハッシュしてから反転したものをscripthashとする

```
const crypto = require("crypto")

const toScriptHash = (scriptpubkey) => {
    const sha256 = crypto.createHash("sha256")
    const buf = Buffer.from(scriptpubkey, "hex")
    const data = sha256.update(buf).digest()
    return data.reverse().toString("hex")
}

if(toScriptHash("76a91436896b2798eeec0fc03c95b52a357448ed0dfd4688ac") === "719bcde52a3ef42b6f665d338eaed567ac66426dd3127595584abbd8e255dd58"){
    console.log("OK")
}

```

# scriptpubkey取得のサンプル(xpubから)

```
const bitcoin = require("bitcoinjs-lib")
const bip32 = require("bip32")
const getScriptPubkey = (node, network)=> {
    return bitcoin.payments.p2pkh({ pubkey: node.publicKey, network }).output
}

const xpub = "xpubxxxxxxxxxxxxx"
const hdnode = bip32.fromBase58(xpub, bitcoin.networks["bitcoin"])
const node = hdnode.derivePath("1/1")
const scriptpubkey = getScriptPubkey(node)
console.log(scriptpubkey.toString("hex"))
```

# scriptpubkey取得のサンプル(アドレスから)

```
const bitcoin = require("bitcoinjs-lib")

const address = "1xxxxxxxxxxxxxx"
const scriptpubkey = bitcoin.address.toOutputScript(address)
console.log(scriptpubkey.toString("hex"))
```

# scripthashを扱えるプロトコルバージョン

* electrumx 1.3からプロトコルバージョン1.2対応
* electrumx 1.5からプロトコルバージョン1.3対応
* electrumx 1.8 プロトコルバージョン1.1 - 1.4


## プロトコルバージョン1.1から現れた

https://electrumx.readthedocs.io/en/latest/protocol-changes.html#version-1-1

## プロトコルバージョン1.2からアドレスを引数にした処理が非推奨

https://electrumx.readthedocs.io/en/latest/protocol-changes.html#version-1-2


## プロトコルバージョン１．３からアドレスを引数にした処理が削除されscripthashが必須

https://electrumx.readthedocs.io/en/latest/protocol-changes.html#version-1-3
iTerm2のプロファイル、タブ名を、接続先で切り替える＆その情報をjsonで管理する方法

Macのsshターミナルとして有名なiTterm2には、プロファイルやタブ名を変えられる機能があり、
複数環境を切り替えて作業するのに便利です。

プロファイルには画面の背景色、画像や、文字色、フォントなどが設定でき、
ログイン先に応じて切り替えを行うと、接続先を間違って操作するような事故が減らせます。

使うサーバーが数台なら、手動切り替えでもいいのですが、
普段業務で扱うサーバーが30台以上あり、手動だと面倒なので自動で切り替えされるように、
後々のメンテなども考慮し、jsonで管理できるようにしました。

##前提知識
プロファイルの切り替えは、こちらの記事を参考しました。
[iTerm2でSSHログイン先別にプロファイルを自動的に切替えて事故防止する方法](https://dev.classmethod.jp/tool/iterm2-ssh-change-profile/)
タブ名は、このコマンドで切り替えられます。

```
echo -ne "\033]0;タブ名\007"
```
※「タブ名」部分を編集します。
##jqのインストール
シェルスクリプトでjsonを扱う際に便利なコマンドをインストールします。
方法はいくつかありますが、brewを使いました。

```
brew install jq
```

##.ssh/configの準備
[.ssh/configで設定すると接続が楽になる方法](https://qiita.com/murapon/items/a029d040ed4f67e50372)
の「２．別名で接続」というのを参考に設定します。

##プロファイルを用意
メニューからPreferences→Profilesを選択して、
新規でファイルを作成します。
ここでは、developという名前で追加。

##ログイン先をjson形式で作成
HOME以下に、binというディレクトリーを作成し、その中に、
environment.jsonを作成。

```json:environment.json
{
	"service1": {
		"profile": "develop",
		"tab_name": "サービスA"
	},
	"service2": {
		"profile": "develop",
		"tab_name": "サービスB"
	}
}
```
service1の部分はログインするホスト名と同じにしてください。
profileは作ったプロファイル名、tab_nameはウインドウ上部に表示したい名前を設定します。

##切り替えシェルスクリプトを作成
同じHOME/bin以下に、ssh-change.shとファイル名で、以下のシェルスクリプトを作成。

```sh:ssh-change.sh
#!/bin/bash

# 環境情報読み込み
environment=`cat $HOME/bin/environment.json`
server=$@

profile=`echo $environment | jq -r '."'$server'"'.profile`
tab_name=`echo $environment | jq -r '."'$server'"'.tab_name`

# set profile
echo -ne "\033]1337;SetProfile=${profile}\a"

# タブ名変更
echo -ne "\033]0;$tab_name\007"

# ssh login
/usr/bin/ssh "$@"

# set profile(default)
echo -ne "\033]1337;SetProfile=Default\a"
# タブ名変更(default)
echo -ne "\033]0;\007"
```

##.bash_profileに追記
プロファイルを作成し、以下の２ファイルが出来たら、
・HOME/bin/environment.json
・HOME/bin/ssh-change.sh

HOME/.bash_profileの最後に、

```
alias ssh='~/bin/ssh-change.sh'
```
を追記して終わりです。

あとは、ターミナル立ち上げ直して、

`ssh service1`

とすると、service1にログインし、
developというプロファイルで、「サービスA」というタブ名が付いた状態になります。

##この方法のメリット
前提知識の、ログインするホスト毎にプロファイルを用意する方法にタブ名切り替えのコマンドを追記する方法だと、
タブ名 = ホスト名になってしまい、個人的にわかりにいくタブ名になってしまいます。、
jsonで管理すれば、プロファイルは、開発、ステージ、本番の３種類だけ作成し、
タブ名はサーバーの数分切り替えたい場合などといったことが出来ます。
Flow 0.82.0 で行われた React.Node 型の変更について

## これはなに？

Flow 0.82.0 で行われた [React.Node](https://flow.org/en/docs/react/types/#toc-react-node) 型の修正が面白かったのでメモ。

> React render() cannot return undefined: React$Node shouldn't be undefined
> https://github.com/facebook/flow/pull/6829

## なぜ修正が必要か？

Flow には React が描画可能な型を表現する `React.Node` という型が用意されています。

Flow 0.81.0 以前では React.Node 型は次のように定義されていました。

```javascript
declare type React$Node =
  | void
  | null
  | boolean
  | number
  | string
  | React$Element<any>
  | React$Portal
  | Iterable<React$Node>;
```

今回問題となったのは `void` が許可されているという点です。 Flow でいうところの [void](https://flow.org/en/docs/types/primitives/) は JavaScript でいうところの `undefined` を表します。

改めて React コンポーネントの render メソッドのドキュメントを見てみると、実は `undefined` を返すことは許可されていません。実際に render メソッドで `undefined` を返すと例外扱いとなります。

> render() | React.Component – React
> https://reactjs.org/docs/react-component.html#render

この挙動は JSX 内の JavaScript 式における `undefined` と混同しやすいですが、JSX 内での JavaScript 式に `undefined` を用いることは可能です。 `undefined` を渡した場合、[単に何も描画しない](https://reactjs.org/docs/jsx-in-depth.html#booleans-null-and-undefined-are-ignored)という挙動になります。

## どう修正されたか？

この問題を受けて、Flow 0.82.0 で次のように修正されることになりました。

```diff
  declare type React$Node =
-   | void
    | null
    | boolean
    | number
    | string
    | React$Element<any>
    | React$Portal
-   | Iterable<React$Node>;
+   | Iterable<?React$Node>;
```

## props.children への影響

React コンポーネントの render メソッドの戻り値の型は `React.Node` で正しく表現されるようになりました。`React.Node` は `props.children` の型としても利用されていたので、合わせて `?React.Node` という型に変更されています。

## おわりに

今回の修正は[リリースノート](https://github.com/facebook/flow/releases/tag/v0.82.0)に言及がなかったので、 v0.81.0 と v0.82.0 の差分から推測しながら変更内容を把握しました。(悲しいかな Flow ではよくあるのでもう慣れてしまったが...)

細かい変更であっても積み重なると修正の難易度が上がってしまうことがあるので、 Flow のバージョンにはこまめに追従しておくほうが良いでしょう。

ちなみに 0.85.0 では、[意図せず型を要求できていなかった箇所がたくさん見直されて、型の注釈を求めるようになっている](https://medium.com/flow-type/asking-for-required-annotations-64d4f9c1edf8)ので、しばらくバージョンアップをサボってる人は覚悟しておくように。
【macOS Mojave】Karabiner-Elementsが効かないときの対処法

# Karabiner-Elements

キー入力時に最初に割り当てられたものと異なった動作を割り当てることができるアプリケーションです。
例えば、MacBookではUSキーボードの場合、`Command + Space` で日本語入力と英語入力を切り替えますが、頻繁に切り替えるときは面倒なので `Command` 単体で切り替えができるように設定したりします。

***参考: MacBook USキーボード commandキーのみで日本語切替え***
https://satoshisgarage.tech/?p=7016

# なんか動かない

で、上記参考URL通りに設定したけど何故か動かない。
再起動しても動かない。

と悩んでいましたが、Karabiner-Elementsにlogというタブがあったので見てみました。
すると以下のようなwarningが出力されています。

```
[2018-11-13 20:52:26.627] [warning] [console_user_server] bind: Permission denied
```

ああ、アプリケーションが入力ソースに変更を加えることを許可しないといけないのか。

# 対処

System Preferences(システム環境構成) > Security & Privacy 
すると、` Click "Allow" next to "Software from Fumihiko Takayama has been blocked"`
というような文章と、`Allow(または許可)`といったボタンがあると思うので、許可します。

私はこれで解決しました。

入力の切り替えが簡単になったー
いやー便利ですね。
横並びnavを作る3つの方法③flex

最近の流行り？
対応していないブラウザーもあるので、要注意！

```CSS
#nav03 {}
#nav03 ul {
    display:flex;
    background-color:#ccc;
    border: 1px solid #000;
    border-right: none; 
    
    
}
#nav03 ul li {
    width: 25%;
}
#nav03 ul li a {
    display: block;
    text-align: center;
    padding: 10px;
    border-right: 10px solid #000;
}
```

```HTML
<nav id="nav03">
            <ul>
            <li><a href="#">たたかう</a></li>
            <li><a href="#">にげる</a></li>
            <li><a href="#">まほう</a></li>
            <li><a href="#">ぼうぎょ</a></li>
            </ul>
        </nav>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/204239/ec593ca5-df6b-a881-560f-1a5142121489.png)







＃　参考
https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet