OmniAICreator/Qiita-1.07M huggingface dataset:
PepperでWatson Visual Recognitionを使うボックスライブラリに顔認識を追加してみた

この記事はPepperアドベントカレンダーの記事として、、、のはずがすっかり、気がついたら書いているのはクリスマス翌日です。ごめんなさいごめんなさい。とりあえず画面も何もないけど、それぞれサンプルと解説資料にリンクを貼っておきますので、そちらをご参考に。

## Pepperと画像認識
そもそも、PepperにはクラウドAIが搭載されて加速度的に賢くなるとか、[ディープラーニングが搭載されて](https://robotstart.info/2016/01/19/kozaki_shogeki-no4.html) (ってその「ディープラーニングを搭載ってなんなんだって感じだけど）商品の認識などの機能が追加されるとか言われてたけど、どうなったんだっけ。とかいう話があったんですが、それでも「ロボットでクラウドに繋がってて、”AIが載って”て、カメラがついてる」となると、画像認識くらいできるだろう、と画像認識を使ったプロジェクトは後をたたないのです。

一方、Pepperのデフォルトの画像認識機能は内部でOpenCVを使ったもので、決して優秀なものとは言えません。そこでエンジニアの人たちは、Micorsoftの [Custom Vision Service](https://azure.microsoft.com/ja-jp/services/cognitive-services/custom-vision-service/) を使ったり、IBMの [Watson Visual Recognition](https://www.ibm.com/watson/jp-ja/developercloud/visual-recognition.html)を使ったりしてクラウド側で画像認識処理をしています。

## PepperとPythonライブラリ
それぞれのサービスにはPythonのSDKも用意されていますが、如何せんPepperのPython環境は **PIPが使えません！！** なのでライブラリ一つ導入するにも一苦労。WatsonのSDKを入れようと思ったらすごい数の依存ライブラリの導入とそのバージョンの解決をしないといけない。。。やってられません。
では、APIのエンドポイントを調べてそれぞれのAPIのパラメーター調べて、、、ってのはなかなかハッカソンとかではとっかかりが悪くて使ってもらえません。

そう、今回のライブラリはハッカソンで「PepperとWatson Visual Recognitionを使ってもらうため」に公開したものです。

## ライブラリとサンプルアプリ
元々はロボスタさんの運営する[Robot Libraryで公開](https://robo-lib.com/repositories/summary/122)していたのですが、これまたハッカソン等でロボットライブラリの紹介から利用登録からしてもらうのもなんなので、githubに公開しました。
[birdtomita/Watson-Visual-Recognition-Pepper](https://github.com/birdtomita/Watson-Visual-Recognition-Pepper)

Watsonの紹介とライブラリの導入方法は、大学生向けのセミナーの時に使用したこちらの資料を参考にしてください。ただし、Watsonの画面が古いのですが。
[Watson Visual Recognition X Pepper](https://www.slideshare.net/birdtomita/watson-visual-recognition-x-pepper)

## 顔認識機能も追加
先に言っておきますが、**Pepperの基本機能にも顔認識機能と年齢認識の機能はあります！** けど、確かにこれ使いにくいんですよね。わかりにくいというか。夏に行われたハッカソンの時に「このサンプルでWatsonの顔認識が使えるようにして欲しい」という要望をいただいたので、FaceDetect.cblを追加しました。Watsonの画像に写ってる人の顔の場所と性別・年齢の推定値を返してくれます。**全部Pepper単体でエッジ側でできますけどね！！**

## 利用実績など
大学生向けのハンズオンでは、「肉の種類を判定するPepper」など面白い作品が発表されました。また顔認識機能を追加した夏のハッカソンでは、「Pepperが飲み会メンバーの顔と年齢・性別を認識して割り勘の割合を調整してくれる」という作品が会場で注目を集めました。

是非みなさんも独自の工夫で画像認識を使った新しいPepperの活用方法を考えてみてください。「使ってみたよー」という声を頂けると嬉しいです。
USBポートサイズマイコン「Tomu」の開発環境構築

動画での解説はこちら。
[![getting started with tomu](https://img.youtube.com/vi/JwDfoIl4YpA/0.jpg)](https://youtu.be/JwDfoIl4YpA)

## tomuとは
tomuはUSBタイプAのポートにすっぽりとはまる、超小型のマイコンボードで、2つのボタン(タッチセンサ)と2つのLEDを搭載し、USBからの給電で動作します。

設計情報はすべてオープンソースで、PCBやケースを含めて12点の部品でできています。

USB DFU(Device Firmware Update)に対応しているので、専用ツールを必要とせずに、プログラムを書き込めます。

**主なスペック**

```
CPU: Silicon Labs Happy Gecko EFM32HG309
Clock: 25 MHz ARM Cortex-M0+
RAM: 8 KB
Flash: 64 KB フラッシュ
Interface:USB 2.0 FS
ボタン: 2
LED: 2 (赤 + 緑)
```

入手方法

国内ではスイッチサイエンスで販売しています。

https://www.switch-science.com/catalog/5254/

## 開発環境の構築
quick startに従って開発環境を構築していきます。プログラムをビルドしてtomuに書き込んで実行するには以下3つのツールが必要です。

- ARM toolchain
- Make
- dfu-utils

### An ARM toolchain

ARMの開発者向けページ( [GNU Toolchain	GNU Arm Embedded Toolchain – Arm Developer](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm) )からDLするのが確実ですが、ここではpx4というオープンソースドローンのプロジェクトが公開しているformulaを使ってbrewでインストールする方法をご紹介します。
px4 https://px4.io/
github https://github.com/PX4/homebrew-px4
以下コマンドでインストールします。

```
$ brew tap PX4/homebrew-px4
$ brew update
$ brew install gcc-arm-none-eabi
```

### Make

MakeはXCodeにバンドルされています。XCodeをインストールしていない場合はインストールして、以下のようにコマンドが実行出来ることを確認しておきます。

```
$ make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0
```

### dfu-utils

tomuはUSB DFU(Device Firemware Update)という標準仕様に準拠しているため、専用のツールを必要とせずに、DFU用の汎用ツールでファームウェアを書き込めます。

dfu-utilはbrewでインストールできます。

```
$ brew install dfu-util
```

エラーが出る場合は

```
$ brew doctor
```
を実行して、表示される指示に従います。

## サンプルの実行
githubからサンプルコードを取得します。

$ git clone git@github.com:im-tomu/tomu-quickstart.git
$ cd tomu_quickstart
このリポジトリに以下サンプルが含まれています。

```
bare-minimum	Does nothing, forever, without crashing.
miniblink	Blink the two LEDs using the SysTick timer.
usb-hid	Emulate a USB mouse, and wiggle the cursor back and forth.
usb-msc	Emulate a very small “USB Mass Storage” disk drive.
usb-midi	Provide a USB MIDI device that continuously sends NoteOn and NoteOff events.
usb-cdcacm	Communicate with Tomu over a virtual serial port.
opticspy	 
```
tomuをUSBポートに差し込み、任意のディレクトリ内でmakeし、dfu-utilでtomuに新しいファームウェアを書き込みます。

```
$ cd usb-hid-keyboard
$ make
$ dfu-util --download usb-hid-keyboard.dfu
```

## WebUSBでファームウェアを書き込む#
Tomuは、ファームウェアの書き込みだけであれば、上記のような手順を踏まずに、WebUSB仕様に基づいて、ブラウザからファームウェア書き込みが出来ます。

TomuをUSBポートに差し込むと、bootloaderを認識したとポップアップメッセージが出るのでクリックすると、以下ページが開きます。

https://dfu.tomu.im/

こちらのWebUI上で、以下の手順でファームウェアを書き込みます。

- VenderIDでdapboot DFU bootloaderを選択しconnectボタンをクリック
- ダイアログが表示されるので、Tomu Bootloaderを選択してconnect
- Firmware DownloadのChoose fileボタンを押して書き込む.dfuファイルを選択し、downloadボタンをクリックで書き込み開始

## 参考
- 公式サイト https://tomu.im/
  - quick start https://github.com/im-tomu/tomu-quickstart/
  - sample https://tomu.im/samples
- 購入 https://www.switch-science.com/catalog/5254/
- misc
  - U2F (https://github.com/im-tomu/chopstx/tree/efm32/u2f)
  - WebUSB (https://wicg.github.io/webusb/)
  - dapboot (https://github.com/devanlai/dapboot)
  - px4 (https://px4.io/)
WPA/WPA2 Enterprise(IEEE 802.1x)環境構築 - その1 知識編

事前に共有した鍵を使った無線LAN(WPA Personal)ではなく、Active Directoryに登録されているユーザIDで接続できる無線LAN環境を構築します。

# IEEE 802.1x用語

自分の理解のために、環境構築時に必要そうな用語をまとめます。

## サプリカント Supplicant

無線LANのクライアントです。パソコンやスマホになります。

## 認証機 Authenticator

サプリカントが接続する機器です。無線LANのアクセスポイントです。

## 認証サーバ Authentication Server

認証機が接続する機器です。ここでユーザID/パスワードが認証されます。
実際のところはRADIUSサーバです。これをActive Directoryドメインコントローラに任せます。

## RADIUS - Remote Authentication Dial-In User Service

認証と認可、さらに課金管理（アカウンティング）のプロトコルです。デフォルトでは、認証と認可はUDP 1812番ポート、アカウンティングはUDP 1813番ポートで通信します。

自分が使うのは認証/認可だけなのでLDAPでもよいのですが、LDAP喋るWi-Fi APってないんですかね。

## EAP - Extensible Authentication Protocol


様々な認証方式をサポートするPPPです。


## 認証方式

サプリカントによって使える認証方式が違います。
Windowsだと、以下のものが使えるようです。

| Type | 認証方式 ||
|:-:|:-:|:--|
| 13  | EAP-TLS   | EAP-Transport Layer Security |
| 25  | PEAP  | Protected EAP |
| 26  | EAP-MS-CHAP v2  | EAP-Microsoft Challenge Handshake Authentication Protocol version 2 |

EAP-TLSが最も強固ですが、クライアント証明書を運用したりしないといけないので面倒です。
EAP-MS-CHAP v2が一番簡単だそうです。

方式自体は、全部で何十個もあります。

## PEAP - Protected EAP

混沌としたEAP界に現れたCisco/Microsoft/RSA Security連合による認証方式です。
しかし、versionが0から2まであって、混沌を生んでいます。

PEAPの中で、さらに以下の認証方式を選ぶことができるようになっています。いよいよもってわかりません。

* TLS
* MS-CHAP v2

上の項でEAP-MS-CHAP v2が使えるようなことを書きましたが、実際は使えません。
PEAPの中でEAP-MS-CHAP v2を使います。

## EAPoL - EAP over LAN

レイヤ2上でEAPを通すプロトコルという理解で良いのかな？
知らなくても大丈夫です。

## WPA EnterpriseとWPA2 Enterprise

暗号化方式/暗号化アルゴリズムが違います。

|  | 暗号化方式 | アルゴリズム |
|:-:|:-:|:-:|
| WPA Enterprise  | TKIP  | RC4  |
| WPA2 Enterprise  | CCMP  | AES  |

RC4はやめて、AESを使っていきたいです。


# 実際の環境構築に必要なもの

## WPA/WPA2 Enterpriseに対応した無線LANクライアント

PCのスペック表を眺めて、対応しているかどうか調べてください。
USB等で後付けする際は、購入時の確認をお忘れなく。

## WPA/WPA2 Enterpriseに対応した無線LANアクセスポイント

自分は一番安価だった[アライド・テレシスのAT-MWS1750AP](https://www.allied-telesis.co.jp/products/list/wireless/mws_ap/catalog.html)を買いました。

## RADIUSサーバ

Windows Serverであれば、ネットワークポリシーサーバ(NPS)機能を有効にすると使えるようになります。

## 信頼されている証明書

無線LANクライアントから信頼(知っている認証局から発行)されている証明書が必要です。RADIUSサーバで使います。

買うと結構なお値段がするので、オレオレ認証局を作って運用するのもありです。




# 参考リンク



* [IEEE802.1X認証とは、EAPとは](https://www.infraexpert.com/study/wireless14.html)
* [EAPのはなし(2)](http://www.silex.jp/blog/wireless/2013/10/eap2.html)
* https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd283091(v=ws.10)
* https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb457039(v=technet.10)
* https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc759077(v=ws.10)
* [RFC3748 Extensible Authentication Protocol (EAP)](https://tools.ietf.org/html/rfc3748)
* [IETF Draft Microsoft EAP CHAP Extensions](https://tools.ietf.org/html/draft-kamath-pppext-eap-mschapv2-02)
pandasで日付から祝日を含めた曜日を取得する方法

jupyterで統計しているときに、説明変数として曜日を使いたくなった。
ただし、祝日だけは別扱いしたい。
こんな時に使える方法です。

```python
import pandas as pd
import japandas as jpd
import locale
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')

#日付を含むデータフレームがある
df = pd.DataFrame(jpd.date_range(u'2016年5月1日', u'2018年12月10日', freq='D'))

# japandasにある祝日カレンダを拾ってくる
jhc =  jpd.JapaneseHolidayCalendar()

# 祝日カレンダにあれば「祝」を、なければ曜日を格納
df[1] = [('祝') if  t in jhc.holidays() else (t.strftime('%a')) for t in df[0]]

# 曜日の列ができる
df
```
こんな感じで祝日を含む曜日データが得られます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293301/b981d4c1-2333-cc8d-9d8a-9e89e5625cd5.png)


これだけにずっと悩んでしまったのでメモ。
もっといい方法があれば教えてください
Amazon Linux WorkSpaces で Flatpak をセットアップする

Amazon WorkSpaces (Amazon Linux 2) で Flatpak を使いたかったのでセットアップしてみました。やり方を書いておきます。

## ビルドとインストール

Amazon 標準のパッケージがありましたが、バージョンがかなり古かったので、ソースからビルドした方がよいでしょう。

自前でビルドするか、私がビルドしたパッケージを[配布先](https://github.com/albuild/flatpak/releases)から入手してインストールしてください。詳しくは [README](https://github.com/albuild/flatpak) をどうぞ。

## テスト

試しに flathub のレポジトリを追加してみます。

```
flatpak remote-add flathub https://dl.flathub.org/repo/flathub.flatpakrepo
```

```
flatpak remotes
```

出力:

```
Name    Options
flathub system
```

できました:tada:

## デスクトップサービスのインストール

Flatpak パッケージのアプリはサンドボックス内で実行されます。このため、例えば、「URL をシステム標準のブラウザで開く」や「システムのファイル選択ウィンドウを開く」といった動作をアプリが行うには、アプリがデスクトップサービス (xdg-desktop-portal) を呼び出せるようにしておく必要があります。

Amazon 標準の xdg-desktop-portal パッケージはありましたが、やはりバージョンが古いので、ソースからビルドした方がよいでしょう。

自前でビルドするか、私がビルドしたパッケージを[配布先](https://github.com/albuild/xdg-desktop-portal/releases)から入手してインストールしてください。詳しくは [README](https://github.com/albuild/xdg-desktop-portal) をどうぞ。
ubuntu wine kindle

以下からwineで使用できるkindleをダウンロードする

````
https://kindle-for-pc.jp.uptodown.com/windows/download/1179941
````

wineのインストール

````
sudo apt -y install wine64 ;
sudo apt install -y winetricks ;
sudo sed -i -e s/249473568eba7a1e4f95498acba594e0f42e6581add4dead70c1dfb908a09423/e17cb384eeac4caf08a4f5d4bceb9697fff83fa942d2a3d9ad0294a9b1774390/g /usr/bin/winetricks ;
winetricks allfonts ;
winecfg ;
wine kindle-for-pc-1-17-44183.exe ;
````
今日は年に一度の Ruby がリリースされる日ですね！！！

[ブログ記事](http://secret-garden.hatenablog.com/entry/2018/12/25/223957)からの転載です。


クリスマス？知らないですねえ…。

と、言うことで Ruby 2.6 が無事にリリースされました。やったー！

* [Ruby 2.6.0 Released](https://github.com/https://www.ruby-lang.org/ja/news/2018/12/25/ruby-2-6-0-released/)
* [NEWS for Ruby 2.6.0](https://github.com/ruby/ruby/blob/v2_6_0/NEWS)

そんなわけで気になった機能をいくつか上げてみようかと思います。
ちなみに Ruby 2.6 にパッチを10個ぐらい投げた結果 4つ取り込まれました。わーい。


## `Kernel#then` が `Kernel#yield_self` のエイリアスとして追加

`Kernel#yield_self` のエイリアスとして `Kernel#then` が新しく追加されました。
`yield_self` が `then` と短く書けるやったー、と思う一方 `then` って名前はどうなんですかね…という思いもあり…。
まあ文字数が半分以下になるのは喜ばしいこと。


## `Enumerable#filter` `Enumerable#filter!` が追加

`Enumerable#select` のエイリアスとして `Enumerable#filter` が追加されました。
これで同機能の `Enumerable` の絞り込みメソッドが

* `Enumerable#select`
* `Enumerable#find_all`
* `Enumerable#filter`

の3つに増えました。
知らない人から見るとますます混乱しそうな気もしますが…。
Ruby をやり始めた頃は『なんで `filter` がないんだよ』と思っていた思い出。


## `Proc#<<`、`Proc#>>` が追加

`Proc` にはいわゆる関数合成を行う演算子が新しく追加されました。

```ruby
f = proc{|x| x + 2}
g = proc{|x| x * 3}
p (f << g).call(3) # -> 11; identical to f(g(3))
p (f >> g).call(3) # -> 15; identical to g(f(3))
```

`f << g` は `f(g())` になり、`f >> g` は `g(f())` になります。
また、`Method` にも同等の演算子が追加されています。

```ruby
f = proc{|x| x + 2}
g = proc{|x| x * 3}

p (1.method(:+) << 2.method(:*)).call(3)  # => 7  (1 + (2 * 3))
p (1.method(:+) >> 2.method(:*)).call(3)  # => 8  ((1 + 3) * 2)

# Proc と組み合わせたり
p (1.method(:+) << g).call(3)   # => 10  ((3 * 3) + 1)
p (f >> 2.method(:+)).call(3)   # => 7   ((3 + 2) + 2)
```

`Proc#<<`、`Proc#>>` ともに『`#call` が定義されている』オブジェクトを渡すことが出来ます。

```ruby
class G
	def call x
		x * 3
	end
end

f = proc{|x| x + 2}
g = G.new
p (f << g).call(3)  # => 11  f(g(3))
```


## 所感

と、いう感じで少しですが Ruby 2.6 の機能を取り上げてみました。
他には終端なし Range が追加されたり `#to_h` にブロック引数が追加されたりなどなど。
気になる方はリリースノートを見てみるといいともいます。
さて、Ruby 2.6 がリリースされたということは Ruby 2.7 の開発が始まったことになります。
Ruby 2.6 ではパッチを10個投げた結果 4つ取り込まれました。
Ruby 2.7 でもまだまだ追加したい機能がたくさんあるので、Ruby 2.7 ではもう少しがんばってパッチを投げていきたいと思います。
あと直せる範囲であればバグ修正とかも手伝えるといいですねえ…。
そんな感じで来年も Ruby 2.7 を楽しみにしています！！
ROOTを使ってみる

# ROOT

[ROOT](https://root.cern.ch/) とは、[欧州原子核研究機構(CERN)](https://home.cern/) が開発しているデータ分析ツールです。
主に高エネルギー物理学を専門とする研究者の間で使用されています。
ROOTでできることは以下の通り。

- データの可視化（ヒストグラム、グラフ、散布図...）
- フィッティング（線形、多項式など任意の関数で使用できる）
- 統計解析（検定など）
- 機械学習

といったように、基本的になんでもできる便利なツールです。
C++やPythonでプログラミングする必要がありますが、Pythonを用いて紹介していきます。


# インストール

### 環境

- CentOS7 (AWS上に作成)
    - AMI: CentOS 7 (x86_64) - with Updates HVM
- ROOT 6.14.06 (2018年12月25日現在、最新バージョン)

### インストール手順
基本的に公式ページに書かれた[手順](https://root.cern.ch/building-root)通りに行えばできるはず。
今回はbinary版で行ってみました。
1. ダウンロード  <br>` wget https://root.cern.ch/download/root_v6.14.06.Linux-centos7-x86_64-gcc4.8.tar.gz`
2. 解凍 <br>`tar -zxf root_v6.14.06.Linux-centos7-x86_64-gcc4.8.tar.gz `
3. パスを通す  <br> `source /path/to/install-or-build/dir/bin/thisroot.sh`
4. 起動してみる  <br> `root`  <br> これで下図のような画面が出ればインストール完了。
![title1.png](https://qiita-image-store.s3.amazonaws.com/0/329888/7d169f14-2a0c-7556-dedd-92de84c2c93e.png)  <br> この画面は`root -l`とオプションをつけることで消すことができます。


# ヒストグラムを描画する

````test1.py
from ROOT import TCanvas, TH1F, TRandom


c = TCanvas()
h = TH1F("h1", "", 10, 0, 1)
rdm = TRandom()
rdm.SetSeed(1)

#ガウス分布にしたがって発生させた乱数をヒストグラムにつめる
for i in range(10):
	h.Fill( rdm.Gaus(0.5, 0.2) )

#描画して画像を保存
h.Draw()
c.SaveAs("test.png")
````

これを`python test1.py`で実行した結果が下図。

![test1.png](https://qiita-image-store.s3.amazonaws.com/0/329888/52de8ce9-84a3-0e07-fc9c-7463f56ff57d.png)

こんな感じで簡単に図を作ることができました。
magnific-popupの２重起動は可能か

jQueryのモーダル系プラグインmagnific-popupの２重起動は可能か試してみた。
２重起動というのは、２枚重ねという意味ね。

結果

可能である。

背景をクリックした時にポップアップを閉じる機能は、無効にした方が使いやすいかもしれませんね。
WordPress　カスタム投稿タイプに親子関係を持たせる


# 内容

カスタム投稿タイプを作成して記事を親子関係を持たせたい時にどうやるか

ここではプラグインは使いません。

# 実装手順

function.phpにカスタム投稿タイプを追加する関数を追加します。
その際に、2つのことをやります。

### 1. 階層構造をtrueにします。

```php

'hierarchical' => true
```

### 2. この投稿タイプで「メニューの順序'page-attributes'」を有効にします。

```php
'supports'  => array('title', 'editor', 'thumbnail','page-attributes'),
```

### 全体. function.phpに追加したカスタム投稿タイプ

```php

 function create_post_type_organization(){
    $labels= array(
        'name' => 'xxx',
        'all_items' => 'xx',
        'add_new_item' => 'xxを追加',
        'edit_item' => 'xxxを編集',
        'view_item' => 'xxxを表示'
    );
    $args = array(
        'labels'    => $labels,
        'supports'  => array('title', 'editor', 'thumbnail','page-attributes'),
        'public'    => true,
        'show_ui'   => true,
        'menu_position' => 5,
        'has_archive'   => true,
        'hierarchical' => true
    );
    register_post_type('organization', $args);
}
add_action('init', 'create_post_type_organization', 0);
```

## 管理画面での表示

追加したカスタム投稿タイプで、親子の設定を入力できるようになります。

![スクリーンショット 2018-12-26 8.05.31.png](https://qiita-image-store.s3.amazonaws.com/0/32215/85da1d75-111e-4ea2-6d82-9ff3770cea5e.png)


## カスタム投稿タイプ画面での表示

- アーカイブの表示は**「archive-{カスタム投稿タイプ}.php」**
- 個別表示は**「single-{カスタム投稿タイプ}.php」**


### アーカイブ表示　 archive-organization.php


#### ページ一覧を列挙する場合。

```php
<?php while ( have_posts() ) : the_post(); ?>
	<div class="entry-content">
		<a class="link-list" href="<?php the_permalink(); ?>"><?php the_title(); /** タイトル */ ?></a>
	</div>
<?php endwhile; ?>
```

#### 親子関係で表示する場合

get_childrenで取得

```php
	<div class= "mt-4">
		<?php while ( have_posts() ) : the_post(); 
		if (!$post->post_parent) :?>
			<?php
			$args = array(
				'post_parent' => get_the_ID(),
				'post_status' => 'publish',
				'post_type'   => 'organization'
			);
			$children_array = get_children( $args );
			if ( count( $children_array ) > 0 ) {
				echo '<h3>'.esc_html(get_the_title()).'</h3>';
				echo '<ul class="list-child">';
				foreach ( $children_array as $child ) {
					$url = get_permalink( $child->ID );

					$html = '<li>';
					$html .= '<a href="' . esc_url( $url ) . '">';
					$html .= esc_html( $child->post_title );
					$html .= '</a>';
					$html .= '</li>';

					echo $html;
				}
				echo '</ul>';
			}else{
				$title = '<h3><a href="' .esc_url(get_permalink()) . '">';
				$title .= esc_html(get_the_title());
				$title .= '</a></h3>';

				echo $title;
			}
			?>
	<?php endif; 
	endwhile; ?>
	</div>
```


## 参考

- [WordPressのカスタム投稿タイプで記事に「親子関係」を持たせる方法](https://www.imaginationdesign.jp/blog/wordpress/2416/)
この例ではプラグインを利用していますが、プラグイン利用なくても使えます

- [関数リファレンス/add post type support \- WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_post_type_support)
カスタム投稿タイプの投稿サポートの公式

- [【WordPress】カスタム投稿タイプの作り方と使い方 \| ULノマド](http://ulnomad.com/2017/05/%E3%80%90wordpress%E3%80%91%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E6%8A%95%E7%A8%BF%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9/)
カスタム投稿タイプについて詳細にパラメーターを解説
HTTPStartでリクエストBodyのJSONを取得する

# はじめに

以下のような直接HTTPリクエストのbodyに差し込まれているJSONデータを取り出す方法を考えてみました。

```
Content-Type: text/plain; charset=utf-8
Connection: close
User-Agent: Jakarta Commons-HttpClient/3.0.1
Host: localhost:21380
Content-Length: 40

{"id":"100","name":"test","value":"abc"}
```

# 環境

+ OS:Windows 10
+ Java:1.8.0.191
+ ASTERIA Warp:1806

# フロー

<img width="325" alt="httpstart_json_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/21372a9a-4ac5-8c96-cff9-6506ad92e378.png">

## HTTPStart

<img width="327" alt="httpstart_json_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/fa63f8dd-30c7-4ede-1ce2-24e240073c05.png">


ヘルプをみるとHTTPStartの出力ストリームはParameterListかMIMEが選択できるようですがParameterListは

> HTMLフォームのパラメーター（HTMLのformタグ）

とあります。今回はHTMLフォームの形式ではくbodyに直接JSONが差し込まれているのでひとまずMIMEでHTTPのリクエストをそのまま出力します。

## MIMEDecode

<img width="364" alt="httpstart_json_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/39a60580-8bf7-d33f-53f5-87600c6b7166.png">


出力ストリームは`text`で「取得対象とする条件式」に`part[0]`とだけ書いておきます。

これでbodyのJSONデータを取得できます。
MIMEの記述方法はヘルプや参考文献など確認してください。

## JSONDecode 

<img width="396" alt="httpstart_json_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/1449a498-84a1-4542-90f1-7b1b5622e4d0.png">


JSONデータを取得できたのであとはJSONDecodeでXMLやRecordなどに持ち替えてフローで扱えます。


# おわりに

HTTPStartでbodyのデータを直接取得できればよかったのですが、現在はストリームタイプMIMEで一旦リクエストをそのまま出力し、MIMEDecodeで取り出す方法になりそうです。
MIMEDecodeは少し癖があるので使うときにいつも戸惑いますが、ひとまず何も考えずに`part[0]`でHTTPリクエストのbodyがとれるという備忘も込めて。

以上です。
0xプロトコルの0x-launch-kitを解説する

# モチベーション
11月ごろにリリースされた0x-launch-kitの解説を行う。このkitはリレイヤーを簡単に作成するものである。僕自身も現在リレイヤーを開発しているので、意見交換や興味のある方は[Twitter](https://twitter.com/WatanabeSota?lang=en)などでDMお願いします。

# 0x-launch-kitとはなにか？
launch-kitはリレイヤーを創るためのテンプレートであり、無料で使えるオープンソースである。先日[launch-kitのページ](https://0x.org/launch-kit)がアップされた。このkit上ではERC20トークンとERC721トークンを取引することができる。言語はTypescriptもしくはJavascriptかを選択しなければいけない。

# 開発手順
1. [0x-launch-kitのレポジトリー](https://github.com/0xProject/0x-launch-kit)をクローンする
<img width="1327" alt="Screen Shot 2018-12-25 at 23.58.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/327904/7fb65ce3-90ca-dd80-b536-80ed9018f458.png">
（現時点でこちらのようになっている）

2. JSの場合、`ts`レポジトリーを削除する。TSの場合、`js`を削除する
3. `js`の場合、`package.json`内の`ts`パッケージを削除する。`ts`の場合`js`を削除
4. 今回は`js`で行う (`js`の場合、ハイライトしている部分を削除）
<img width="1019" alt="Screen Shot 2018-12-26 at 0.03.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/327904/533091b4-c9ae-fcc1-6c38-60f39636f487.png">

5. 開発する前に、`Node.js`が v8.x以上、`Yarn`がv1.x以上であることを確認する
6. `config.js`（もしくは`ts`）を開き、以下の通り編集をする

* `NETWORK_ID`を指定する（Mainnet：1, Kovan:42, Ropsten:3）
* `WHITELISTED_TOKENS`を指定する。これはオーダーブックにてどのトークンをサポートしたいかを表明するため
* `FEE_RECIPIENT`を指定する。リレイヤーが手数料を受け取るために指定する
* `MAKER_FEE_ZRX_UNIT_AMOUNT`を指定する。これはMakerから受け取る手数料を指定するため
* `TAKER_FEE_ZRX_UNIT_AMOUNT`を指定する。これはTakerから受け取る手数料を指定するため

7 .  `yarn`でディペンデンシーをダウンロードする
8 . `yarn start:js`でリレイヤーをスタートする

<img width="1440" alt="Screen Shot 2018-12-26 at 0.30.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/327904/c8e54eb7-d6e6-c000-49b4-ba00e11ae2ef.png">

リレイヤーが正常に動いているかを確認するためには、以下のcarlコマンドを打つ
`$ curl http://localhost:3000/v2/orders`
正常に動いていれば

```
{"total":0,"page":0,"perPage":20,"records":[]}
```
を返す。またオーダーを追加していないので、`records`の中に何も入っていない。

**コマンド**
`yarn start:js` : リレイヤーをスタートする
`yarn prettier:js` : オーダーをフォーマッティングする

# 参考
[0x-launch-kit](https://github.com/0xProject/0x-launch-kit)
php-master-changes 2018-12-25

今日は処理系のコードサイズ削減の修正があった！

# 2018-12-25
## dstogov: Avoid code duplication
- https://github.com/php/php-src/commit/2954a309de7844c7a9cce36853f649b22ec01a46
- goto 使って重複コードを削除
- ZEND_VM_C_GOTO は zend_vm_gen.php で処理系ビルド中に goto へ展開される
自作timeoutスクリプト

# TL;DR
あるコマンドを一定時間で強制終了させたいときには、timeoutコマンドを使っていました。
ところが、なんとインストールされていない環境で作業することがあったので、
簡易タイムアウトスクリプトを自作しました。


**参考：timeoutコマンド**

```
ryotakata@ryotakata-ubuntu03:~/timeout$ timeout --help
使用法: timeout [OPTION] DURATION COMMAND [ARG]...
または: timeout [OPTION]
Start COMMAND, and kill it if still running after DURATION.

Mandatory arguments to long options are mandatory for short options too.
      --preserve-status
                 exit with the same status as COMMAND, even when the
                 command times out
      --foreground
                 When not running timeout directly from a shell prompt,
                 allow COMMAND to read from the TTY and receive TTY signals.
                 In this mode, children of COMMAND will not be timed out.
  -k, --kill-after=DURATION
                 also send a KILL signal if COMMAND is still running
                 this long after the initial signal was sent.
  -s, --signal=SIGNAL
                 specify the signal to be sent on timeout.
                 SIGNAL may be a name like 'HUP' or a number.
                 See 'kill -l' for a list of signals
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する
```

# 自作したtimeoutスクリプト

```bash
#!/bin/bash

function main () {
    SCRIPT_PATH=$(cd $(dirname $0) && pwd)
    SCRIPT_NAME=$(basename $0)
    
    ###  5 sec 経過でタイムアウトする
    ### [1] timeout コマンドを使う##############################################
    # timeout 5 ./hoge.sh
    ### [2] 下記Step1/2を1 sec毎に実行する######################################
    # Step1: kill -0 ${TGT_PID} or ${TIM_PID}でprocessの死活(終了/実行中)を取得
    # Step2: ${TIM_PID}, ${TIM_PID}の終了をOR条件で判定、killする
    # ※  ${TGT_PID}: タイムアウト監視対象のPID
    # ※  ${TIM_PID}: タイマーのPID
    ./hoge.sh &
    TGT_PID=$!
    sleep 5 &
    TIM_PID=$!
    
    err_msg=$(
    echo "${SCRIPT_PATH}/${SCRIPT_NAME}: "
    echo "Process ${TGT_PID} will be killed by ${SCRIPT_NAME}."
    )
    
    while true; do
        kill -0 ${TGT_PID}
        if [ ! $? -eq 0 ]; then
            killtree ${TIM_PID} KILL
            exit
        fi
        kill -0 ${TIM_PID}
        if [ ! $? -eq 0 ]; then
            killtree ${TGT_PID} KILL
            echo ${err_msg}
            exit 1
        fi
        sleep 1
    done
    wait
    ###########################################################################
    exit
}


### kill all members of a process group
function killtree() {
    if [ $# -eq 0 -o $# -gt 2 ]; then
        echo "Usage: $(basename $0) <pid> [signal]"
        exit 1
    fi
    local _pid=$1
    local _sig=${2:-TERM}
    kill -stop ${_pid} # needed to stop quickly forking parent from producing child between child killing and parent killing
    for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
        killtree ${_child} ${_sig}
    done
    kill -${_sig} ${_pid}
}

main
```

# 参考にした記事
* プロセスツリーを辿ってkillする方法：
[https://stackoverflow.com/questions/392022/whats-the-best-way-to-send-a-signal-to-all-members-of-a-process-group](https://stackoverflow.com/questions/392022/whats-the-best-way-to-send-a-signal-to-all-members-of-a-process-group)
名前だいじ！ 死ぬほど大事！ プログラミングには神が存在する。

#プログラミングに命名が必要なのか論理的に説明できる人はいる？@yumainaura は自信がない。

- 人間が名前という情報空間に影響を受けるということ自体が信じられない頭でっかち。
- 人間が作り出したプログラミングというものに名前が与えられ、それがソフトウェアの根源をゆるがすということ自体が不思議すぎて3年間はモヤモヤしたままだ。
- どうにかこの問題を解決して言語化しておかなければ。そう言いつつもこうやってキーボードをカタカタと叩いて文字を打ち込む行為自体が

# プログラミングには神が存在する

- つまり人間の脳の中に神が存在するという理解をすれば良いだろうか。
- 僕ら人間の表面的な意識には補足できない部分で巨大な「名前と神」というシステムが動いている気がする。
- 畏敬の念を懐きつつ、たとえどんなスーパーエンジニアであろうとも、神の世界から

# で宗教なの？これは？

- 宗教に近づくレベルのプログラマでありたい34歳アラサー男性@yumainauraは寂しいナルシスト、信者はゼロ
- プログラミング、エンジニアリングは技術から、人間性、そして宗教、世界平和、人類皆兄弟の世界へと必然的に向かわざるを得ない
- よしまずは大阪IT交流会に参加するところから始めよう…！


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e1b7017c-43ba-d5b0-97fe-7bf95c13c4cb.png)


# きっかけはいつもTwitterで

Respected!

うざがらみしてすいません

迷惑かけないように名前を念の為、隠しておくモザイク的、3画像ペースト

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5c3bebf0-f796-c2ed-e444-3f59ada20aec.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/65d0c909-5ea0-a32f-99f0-f6077acc0bdd.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/434d2dfb-7a59-a62d-67b1-4eb66b3c25f7.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニア向けの名刺を作成してみた

# はじめに
こんにちは。なおとです。
僕は現在フリーランスエンジニアですが、今まで名刺を持っていませんでした。
正社員時代、名刺はありましたが、実際に渡した数は0枚でしたので、必要ないと思っていました。

ただ、今回名刺を作成しようと思ったきっかけは、下記です。

- 勉強会に参加するようになり、初めて話す人とのきっかけづくりにしたい
- 営業用の職務経歴にしたい
- 無いは無いで寂しいので、何となく、作ってみたい

意外と調べるとエンジニア向けの名刺がなかったので、書いて残そうと思います。

# 名刺の作成方法
## 利用する印刷会社
一先ず、「名刺 作成」で検索すると沢山のサイトが出てきます。
ただ、値段やテンプレデザインに違いはありますが、どこも機能的には似たり寄ったりの印象です。
qiitaで記事のあったマヒトデザインで迷いましたが、僕はラクスルにしました。
比較はできませんが、とても使いやすかったです。

[ラクスル](https://raksul.com/businesscard/)
[マヒトデザイン](https://mhtdesign.net/)

## 載せる内容
正社員のときは「名前 + 会社名」のみの記載でした。
ただ、実際にそういう名刺頂いても、どんなことをしているのかを分かりませんでした。
そのため、今回は話すきっかけと職務経歴書も兼ねているので下記内容を載せるようにしました。
特に経験言語を記載しておくことで、「Vueやっているのですね？」など質問してもらえるので、人見知りの自分にはとても助かっています。

- 名前(英語)
- アイコン
- 肩書
- アカウント・連絡先
- 経験した言語・FW
- アウトプットした媒体URL
- 資格
- 経歴
- 業務

## デザイン作成
ラスクルではすでにオリジナルテンプレートがあります。気に入ったのがあればそれを使用してもいいと思います。
僕はピンとくるものがなかったので、白紙から作成しました。
デザインセンスはないので、とりあえず必要な部品を最初に作成して、あとは感覚で配置していきました。(ドラッグアンドドロップでできます)
デザインで困る場合は、僕のを真似して配置して、そこからアレンジしてもいいかもしれません。（僕のデザインをそのまま使って頂いても大丈夫です！！）

デザインが終わればラスクルの手順を進めるだけ終わりです。簡単ですね。

表はこんな感じ
<img width="1428" alt="スクリーンショット 2018-12-25 22.25.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/aafeb12d-c701-3951-edbe-415c4b9f01c1.png">

裏はこんな感じ
<img width="1423" alt="スクリーンショット 2018-12-25 22.25.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/21ec8004-7e80-1d88-67ed-aef1e4141dda.png">

## 実際の名刺
<img width="1423" alt="スクリーンショット 2018-12-25 22.25.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/84042dfe-a245-cd7b-3f15-e45ebfcb29c9.jpeg">

# 作ってみて/渡してみての感想
### 作成は簡単、そして安い
デザインスキルがなくても、簡単に名刺を作成することができました。
また、値段も送料込みで705円です。（100枚入り）

### スキルセットの棚卸しができた
自分のスキルセットの棚卸しをする機会は転職などをしない限り少ないかと思います。
僕も名刺を作成して、フロントエンドのほうが経験が長い、静的言語は経験が少ない、インフラは書ける内容がない。と気づきました。
自分の得意分野、苦手分野、経験が浅い分野を客観的に把握できました。

### どんな技術をやっていきたいかを考えるようになった
自分のスキルセットを公開するのは一種の恥ずかしさと怖さもあります。
僕のスキルレベル、経験はこれだけあります。と言っているようなもので、このスキル・経験では厳しいなど名刺を見ただけで分かってしまいます。
そのため、モダンな技術やニーズが高い技術を取得しなければと考えるようになりました。
スペースの関係上もありますが、あまりニーズがないと考えVBAやVB6などは入れませんでした。


### 会話のきっかけができた
初対面の人と最初に話す時の話題が難しかったです。
大体は「どんな仕事しているんですか？」、「エンジニアしているんですか？」、「勉強会よく参加するんですか？」などでした。
名刺を先に渡すことで、相手から「Vueをやっているんですね？」、「自分はRubyをやっています」など質問されるようになり、きっかけ作りが楽になりました。

### 勉強会のSNSでつながる人が増えた
名刺を渡した後にSNSで連絡がくることが多くなったような気がします。

# 最後に
名刺を作ること自体はとても簡単です。
もし、会社用ではなく自分の名刺を作りたいと思っているなら、作ってみてください。愛着が湧きます。
年末年始を利用して作成し、2019年から使用してみてはいかかでしょうか？
そして素敵な名刺を作って、僕と交換しましょう！！

# 参考にした記事
[ソフトもセンスもいらない勉強会のための名刺作成方法](https://qiita.com/hekitter/items/d920a17d92cee02ddb4d)
[エンジニアは「会社の名刺」を使うのをやめましょう。](https://kentakatsumata.net/n/n629ca43d65da)
🎒 #Google #大学 #就職 #プログラマ 🐼 #ホワイト #ブラック 🏢 #日本企業

#Twitter発見

https://twitter.com/y8o/status/1077120772991180801


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/45cc817e-e020-39fa-5911-fab7795cd387.png)

#ハフィントンポスト

[コミュ力もリーダーシップもいらない。元Google社員が語る、本当に“優秀な人材“とは | ハフポスト](https://www.huffingtonpost.jp/2018/01/16/piotr_a_23334437/)

#ピョートルさん

本を読んだことのある人だった！マインドフルネスももちろん実践。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/24cab66f-572a-ef76-0944-157802822167.png)

# 性格よりも結果にコミットするライザップGoogle

>「性格は関係ない。大切なのは、結果を出せるかどうか」

確かに過去の偉人たちもいろいろな性格がある

エジソンとアインシュタインは真逆の性格、たぶん

性格に依存して成功失敗を考えることには根本的な無理がある、多様性が真実


# 太陽に向かうキャンバス

>古い保守的な会社は「性悪説」の考え方で動きます。

>Googleは真逆の「性善説」です。

>本社の敷地は「キャンパス」と呼ばれるのですが、誰でも入ることができます。

@YumaInauraもいちど個人的に、カリフォルニアのキャンバスを訪れたことがある

そこらじゅうに自転車とかあって、本当に開放的だった

太陽の日差しがあたたかな環境、これ最高の労働環境かもしれない、働かずして働くには

# 2018年、日本企業の一番ホワイトでさえ、ブラック企業と呼ばれる未来が来てほしい


>■日本の保守的な会社は「性悪説」 では、Googleは...

>日本では大手企業の経営者というと「黒塗りの車」で常に移動しているというイメージがありますよね。


日本企業の一番ホワイトな会社でも、Googleの足下にも及ばない環境だと思う

スティーブ・ジョブズのような昼寝が許されず、硬いコンクリートのビルの中で、マインドフルネスの瞑想をすると変人扱いされて人事評価に響きそう‥という愚痴

Googleでさえ人類にとって、まだまだ最高の環境ではないが、それに近づいているとは思われる










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SQLSTATE[HY093]: Invalid parameter number

# 概要

出たので調べた。


# そもそもどういうエラーか

PHP においては PDO を利用していてミスをした時に起こる。
本来は DB のエラーを返しているに過ぎない。

## 発生条件

1. PHPの構文内でSQL文において発行している標準関数、またはメソッドのバインド変数の数と異なる 
2. SQLの構文が異なる

# 解決方法

1. 最初の標準関数、またはメソッドのバインドの数を確認し、そのバインド数を同じ数に合わせる
2. 発行されたSQLの中身を表示させ、構文に間違いがあれば、その内容を調整して合わせる
#Qiita 記事のタイトルに Twitter アカウント名を入れてみては？ e.g @yumainaura

# TwitterとQiitaのアカウント名が揃っている場合に有効

揃えてないの？揃えようぜ！

# Qiitaの記事がツイートされると、Twitterで気づける

QiitaのTwitter連携は微妙なので…。ユーザー独自対策。

# 主に僕の場合、他の人の記事から勉強する場合に。リスペクトを込めて。




![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/493ca87f-f6e0-c5ad-44d1-b2aefb2ae15a.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/580a427e-e46d-fc41-1287-da10937b5a7b.png)

# 迷惑だったら全裸で謝罪…。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/24853c16-8519-0311-cb3a-03bbf1ffb777.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/131369e3-0e7e-3679-44dc-24e199ebd611.png)

[Web書道.com](http://web-shodo.com/shodo.php)


# Twitter10周年？今にして素晴らしさに気づく

恐ろしいほどレイトマジョリティな@yumainauraを来年もよろしくお願いいたします…！

# Qiitaの皆さん最高です！

面白楽しいエンジニアライフはQiitaの人類なくしてありえない‥！

[yumainaura qiita アカウント - Google Search](https://www.google.co.jp/search?q=yumainaura+qiita+%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88&oq=yumainaura+qiita+%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88&aqs=chrome..69i57j69i60l3j69i64l2.3097j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#とりあえず #Googleイメージ検索  #勉強法 #未知 #ジャンル #プログラマ #エンジニア RT @animegazer


[制御理論としての動的計画法 - Qiita](https://qiita.com/animegazer/items/4158462e5a3efaba9d7b)

honoring @animegazer


# まったく何も知らない初心者です

>おそらく、Qiitaを見る人の大半もこのような認識ではないでしょうか。

別ジャンル、Ruby Web開発者が勉強させていただきます。

# 動的計画法 とは？

>動的計画法（どうてきけいかくほう、英: Dynamic Programming, DP）は、計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。

# 未知のジャンルを勉強する場合は、Googleイメージ検索から入る

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8f38c0ca-cf16-1afc-1a64-86b5a0fe2ba5.png)


# 英語でもGoogleImageSearch

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7c8e4deb-2e7e-011f-b398-56a3a743f6cb.png)


# これ小学校の頃やった、確率分岐というか、枝分かれのブロックのマス目てきなあれでは！？

ぜんぜん分からないなりに、イメージを描いてゆく。

#いかがですか？

分からなかったらイメージ検索。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#プログラマ の超必殺技「ギュメ・アングルブラケット・エクスクラメーションマーク！」とは？  @atsuk0r0

# キーボード入力の教科書的記事

[記号の名称について - Qiita](https://qiita.com/atsuk0r0/items/131e6cf91223a5c3e2cb)

エンジニア生活は長くても知らない記号があった。

# ギュメ

ギュメ！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6ad6dd6d-4167-a523-b2d6-f22a335c011c.png)

# 言葉に出して叫ぼう！

@atsuk0r0 さんもおすすめのメソッドは。

>普段から口に出して覚えていくしかないかな〜と思います。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Docker] "Operating system error number 28. Check that your OS and file system support files of this size"  mysqlの容量エラーでコンテナが起動できない状態を解決する




環境
Docker for mac Version (2.0.0.0-mac78)
mac OS 10.13.13 (High Sierra)

mysqlのコンテナを起動しようとすると、以下のように容量が足りないとエラーがでる。


### 現象

```
Initializing database
2018-12-25T21:43:30.931202Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use for_timestamp server option (see documentation for more details).
2018-12-25T21:43:30.935205Z 0 [Warning] InnoDB: Using innodb_file_format is deprecated and the parameter may be removed in  http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html
2018-12-25T21:43:30.961773Z 0 [Warning] InnoDB: Retry attempts for writing partial data failed.
2018-12-25T21:43:30.961810Z 0 [ERROR] InnoDB: Write to file ./ibdata1failed at offset 0, 1048576 bytes should have been  written. Operating system error number 28. Check that your OS and file system support files of this size. Check also that the a disk quota exceeded.
2018-12-25T21:43:30.961820Z 0 [ERROR] InnoDB: Error number 28 means 'No space left on device'
2018-12-25T21:43:30.961825Z 0 [ERROR] InnoDB: Could not set the file size of './ibdata1'. Probably out of disk space
2018-12-25T21:43:30.961828Z 0 [ERROR] InnoDB: InnoDB Database creation was aborted with error Generic error. You may need to ile before trying to start up again.
2018-12-25T21:43:31.565477Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2018-12-25T21:43:31.565514Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2018-12-25T21:43:31.565518Z 0 [ERROR] Failed to initialize builtin plugins.
2018-12-25T21:43:31.565520Z 0 [ERROR] Aborting
```

### 調査

対象のコンテナを起動して容量を確認すると
ルート以下が容量100%になっている

```
/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          59G   56G     0 100% /
tmpfs            64M     0   64M   0% /dev
tmpfs          1000M     0 1000M   0% /sys/fs/cgroup
osxfs           421G  333G   85G  80% /etc/mysql/conf.d
/dev/sda1        59G   56G     0 100% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs          1000M     0 1000M   0% /proc/acpi
tmpfs          1000M     0 1000M   0% /sys/firmware
```


docker volumeコマンドでvolumeを確認すると、使っていなそうなvolumeがたくさんある

```
$ docker volume ls
local               0a147b310b327a732d452aba0da74e7fcb745641d53654cd6f6013efefba3f7e
local               0b86da4bcda4bbde206e02104a9449040cc3b9e22290a4583bda816910a23f50
local               0bd0f647f099ccde83a9ec7ac6fefe41d754cf28183cffeb66f01cc05dd32316
local               0e23c68d181912fc998c66e6f313de61ac97cf62fe5c0af99b5a9e8f5c2254f4
...
```


### 解決方法

不要なvolumeを消すコマンドを実行

```
docker volume prune
```

これで半分以上消えた。

この状態で、mysqlのコンテナを再起動すると、
正常に起動できるようになった。


参考：
https://www.pospome.work/entry/20160505/1462444972
マテリアルの透明度をscriptから変えたい！

https://toburau.hatenablog.jp/entry/20170731/1501518531

materialの透明度をscriptから変えたくて、
```
        var meshRenderer = GetComponent<SkinnedMeshRenderer>();
        var materialC = meshRenderer.material.color ;
        materialC.a = 0.5f;
        meshRenderer.material.color = materialC;
```
transformと一緒で、一度取り出してから値を代入しないと上手くいかなかったです。たぶん、これもどこかが構造体なんだろうなーと思いつつ、調べる余裕はないマン！！！
GoogleのSVGアイコンをFileMakerで使えるようにするAppleScript

[Google の icon を FileMaker で使う][p386cell]を読んで、いちいちエディタで修正するのもなんだな〜と思ってDropletを作ってみました。  
実際の置換部分はsedを使ってます。
`-e指定で検索パターンを並べれば列記できるようですが、エラーが出てしまい、解決できなかったので2回連続で置換することに……

下記コードをスクリプトエディタにコピー＆ペースト。アプリケーション形式で保存すればドロップレットができますので、[material.io][material]からダウンロードしたsvgファイルをDrag&Dropすれば、FileMakerで不具合なく扱えるSVGファイルができあがります。


```AppleScript
(*
	GoogleのSVGアイコンをFileMakerで使えるようにテキスト置換するスクリプト
	
	2018-12-26
*)


on open (dropList)
	repeat with aFile in dropList
		
		set aExt to name extension of (info for aFile)
		if aExt is "svg" then
			my main(aFile)
		end if
		
	end repeat
end open


on main(aFile)
	set find to {"<path\\ d=\\\"M0.\\{1,\\}none.\\/>", "\"24\""}
	set rep to {"", "\\\"50\\\""}
	
	set src to POSIX path of aFile
	
	my sedRep(src, find's item 1, rep's item 1)
	my sedRep(src, find's item 2, rep's item 2)
	
end main

on sedRep(src, find, rep)
	set shcmd to "sed -i \"\" -e 's/" & find & "/" & rep & "/g' " & (quoted form of src)
	my doshell(shcmd)
end sedRep

on doshell(shcmd)
	do shell script shcmd
end doshell

```



[p386cell]:https://medium.com/@p388cell/google-icon-filemaker-91527df4514d?fbclid=IwAR39EEdewkMFYPUOVlB_T4AwKUsTglDIHqauEM2vBquW6VUyqcWEtuMGJ5Q
[material]:https://material.io/tools/icons/?style=baseline
OculusGoをサンタに貰ったので WebVR でゆきだるさんを作った

## YUKI★DARU★SAN
<img width="385" alt="スクリーンショット 2018-12-26 4.35.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/752/77d234b1-055a-7366-27ae-5982ce5846cb.png">
[Hello, ゆきだるさん](https://kzkick2nd.github.io/oculus-go-hello-webVR/index.html)

2018年締めくくりに、Amazon で安くなっていた [OculusGo](http://amzn.asia/d/7sfYEtF) をセルフクリスマスでゲットしました。

何をやっても面白くてあまりにテンション上がったので、とりあえずハローワールドしようとWebVRライブラリ [A-Frame](https://aframe.io/) を利用した 「Hello, ゆきだるさん」 をつくりました。

短縮URL版： https://git.io/fhTeP
※OculusGo に PC からリンクを送る簡単な方法が欲しい。

### WebVR 雑感
- やすい造形でも OculusGo で観ると大きさや距離が感じられて面白い。
- 生WebVRは仕様を見たら polyfill 他めんどそうで、Twitter で聞いたところ [A-Frame – Make WebVR](https://aframe.io/) が簡単らしいので使ってみた。
- A-Frame はドキュメントもサンプルも多く、はまりどころも無いのでとりあえずの一歩に良い感じ。（雪だるさん位なら30分くらい）
- Web開発者がとりあえず VR 空間を作ってみるなら WebVR はすぐ動くので良い。
- プログラミング教育とかにも VR 空間を作って遊ぶとかのが喜びそう。
 
### まとめ
Web屋も OculusGo で遊べるぞい。
迷っているなら買っちゃえ！メリークリスマス！

※OculusGoは 32GB 版を買ったが、割と容量食うので面倒なく楽しむなら 64GB のが良さそう。

- [Oculus Go (Amazon販売ページ)](http://amzn.asia/d/8G91in0)
- [A-Frame – Make WebVR](https://aframe.io/)
- [kzkick2nd/oculus-go-hello-webVR](https://github.com/kzkick2nd/oculus-go-hello-webVR)
ミドルウェア/パッケージ/運用ソフトウェア/ベンダー遷移

ボケて忘れ始めたので記録しておく。
詳細はリンク先に記載してあるので、だたのまとめです。

##ミドルウェア/パッケージ/運用ソフトウェア

|系列|旧ソフトウェア名|現ソフトウェア名|コメント|
|:----------|:----|:----|:----|:----|
|バックアップ|Norton Ghost|Symantec System Recovery|リネーム[^Ghost]|
|LDAP       |Novel Directory Server|NetIQ eDirectory|買収親のグループ会社に転籍|
|SSO        |Novel Access Manager|NetIQ Access Manager|買収親のグループ会社に転籍|

##ベンダー

|旧会社名/ブランド名|現会社名/ブランド名|コメント|
|:-----|:----|:----|
|Veritas|Symantec|合併したものの、現在も情報管理部門の会社名として継続利用中[^Veritas]|
|Novel|Attachmate→マイクロフォーカス|買収。NDS/NAM等一部製品はAttachmateグループのNetIQ社が担当。NovelブランドはSuSEのみ担当[^Novel]|


[^Ghost]: http://www.symantec.com/content/ja/jp/micro_partner/SSR_NortonGhost_compari_201305.pdf
[^Veritas]: https://ja.wikipedia.org/wiki/VERITAS
[^Novel]: https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%99%E3%83%AB_(%E4%BC%81%E6%A5%AD)
Webスクレイピング初心者はPythonでChrome起動から実践するのがオススメ

#はじめに
PythonでWebスクレイピングをやってみたい初心者向けの記事です。
私はここからスタートして、Webスクレイピング、Webクロールの世界にのめり込んでいきました。

#環境
- MacOS High Sierra
- Python 3.7.1
- Chromedriver 2.45（2018/12/26時点で最新のもの）

本記事を書いている時点ではMacユーザーですが、Windows7や10でも同じ流れです。

# PythonでChromeを起動する方法

## ドライバをインストールする
以下からダウンロードできます。
※Google検索で「chromedriver download」と検索してもOKです。
[http://chromedriver.chromium.org/downloads](http://chromedriver.chromium.org/downloads)

「Latest Release: ChromeDriver 2.XX」のようなリンクがあるので、各自のOSに合わせてファイルをダウンロード（zipファイル）してください。

ダウンロードしたzipファイルを解凍すれば、ドライバの取得は完了です。

Macの場合、ドライバのファイル名は、**chromedriver**です。
Windowsの場合、ドライバのファイル名は、**chromedriver.exe**です。

## seleniumをインストールする

本環境のMacの場合

```python:
pip3 install selenium
```
Windowsの場合

```python
pip install selenium
```

##Pythonファイルと同じフォルダにchromedriverを置く

上記でダウンロードした**chromedriver**を、Pythonファイルと同じフォルダ階層に置いてください。

※chromedriverを置くフォルダを固定したい場合は、PATHを通すやり方もあるようです。

##Pythonファイル実行

Macの場合、ターミナルからPythonファイルがあるフォルダに移動して以下のコマンドで実行します。

```python:
$ python3 start_chrome.py
```

```python:start_chrome.py
import time
from selenium import webdriver

# chromedriverのPATHを指定（本ファイルと同じフォルダの場合）
driver_path = './chromedriver' 

# Windows
# driver_path = r'./chromedriver.exe'

# Chrome起動
driver = webdriver.Chrome(driver_path)

# Googleにアクセス
driver.get('https://www.google.com/')

# 3秒待つ
time.sleep (3)

# Chromeを終了
driver.quit()
```
#結果

Chromeが起動して、Googleにアクセスできれば成功です！

お疲れ様でした。
今後もWebスクレイピングLIFEを楽しみましょう！

#参考

以下を参考にさせていただきました。
[Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)
IKSでDocker Registry用のSecretを作成する（メモ）

## 概要

IKS上にデプロイするアプリケーションのIBM Cloud Container Registryに接続するためのSecretを作成する手順のメモ。（デプロイするアプリケーションが使用するnamespaceのService AccountにImagePullSecretの指定をしたかった。）

### 参考文献
[IBM Cloud Container Registry の概説](https://console.bluemix.net/docs/services/Registry/index.html#index)
[DockerコマンドでIBMコンテナ・レジストリへログインする方法](https://qiita.com/MahoTakara/items/ae3ff2b7b154e164ba3c)
[IBM Cloud Dedicated イメージ・レジストリー用の IBM Cloud Container Registry トークンの作成](https://console.bluemix.net/docs/containers/cs_dedicated_tokens.html)

## 手順
#### (1) 既存のTokenの確認

- bx cr token-listの結果表示されたtokenの一覧から自分が現在利用しているclusterの名前で作られているtokenのidを\<token_id>に指定

```
$ bx cr token-list
$ bx cr token-get <token_id>
```

※ibmcloud cr token-addの手順は参考文献の「IBM Cloud Dedicated イメージ・レジストリー用の IBM Cloud Container Registry トークンの作成」を参照。

#### (2) Tokenからのsecretの作成

- \<token_value>にはbx cr token-getで確認した値を指定

```
$ kubectl --namespace <kubernetes_namespace> create secret docker-registry <secret_name>  --docker-server=<registry_url> --docker-username=token --docker-password=<token_value> --docker-email=<docker_email>
```
BOXNUC8I7BEHはCentOS 7.6で動く

# 経緯

BOXNUC8I7BEHはIntel社製の小型PCです。小型ですがそこそこのスペックですので、これをサーバ用途にしてKubernetesのワーカーノードにしたりして遊んでいます。

# スペック

## 本体（BOXNUC8I7BEH）

IntelのNUCは発売当初はロースペックでしたが、現在はサーバ用途でも耐えうるスペックになっています。

* Intel Core i7-8559U Processor (2.7 GHz/ターボ・ブースト時4.5 GHz、8MB cache、4コア8スレッド)
* 2 × DDR4 SODIMM/DDR4-2400 MHz/最大32GB (16GB×2)

## ストレージ

* Crucial SSD 500GB 7mm / 2.5インチ MX500シリーズ SATA3.0 9.5mmアダプター付 CT500MX500SSD1/JP

# OS

BOXNUC8I7BEHは公式にはWindows 10のみ対応していますが、ESXiでも動く場合があるようです。場合がある、とはあいまいな言い方ですが、いくつかコミュニティ掲示板の情報を漁ってみたところ、ハイパーバイザのバージョンやBIOSのバージョンに左右されるらしく、しかも、うまくいったという人とだめだった人がまちまちで、確定的な成功条件を見つけることができませんでした。

私もESXi 6.7u1で試しましたがインストーラが途中でハングしていまいました。

というわけで、CentOS 7.6を採用しました。素晴らしいことに何の問題なく起動でき、KVM上で仮想マシンを動かすことができました。

個人的には20年来のVMwareユーザでしたが、これを機にKVMに乗り換えようと思います。なんたってRedHat社がスポンサーですしね（意味深）。
2018 アドベントカレンダーやってみて

# 2018 アドベントカレンダーやってみて

ただいま、`Tue Dec 25 17:40:06 UTC 2018` です。まだセーフ？
なんとなく思い立ってやってみた 2018年のアドベントカレンダー。
いくつか他のもやりましたが、結局自分の記事だけになってしまった [DevOps](https://qiita.com/advent-calendar/2018/devops) 。。。
そんなアドベントカレンダー最後のまとめです。

## やってよかったこと

- 普段とりとめなく流れていく知識を記事としてまとめられたことは少しよかったと思います
- 自分の興味だけでなく、それ以外のことにもアンテナのばせたのはよかったですね
- 自分の中でも曖昧だった部分をある程度はっきりできたのもよかったです

## 悪くはないけど、微妙だった部分

- 消化試合のようになってしまった記事がそこそこあった
- 力の入れ方が記事によってずいぶん違う
- 文章力のなさ

## 今後

とりあえず、アドベントカレンダーを機に Qiita 始めてみたので、今後も少しずつ記事を書いてみたいと思います。
アドベントカレンダーのように日次とはいかないですが、極力アウトプットできるようにしたいです。
BEAR.Sunday開発初期

BEAR.Sunday開発初期に考えてたことや出来事をいくつか紹介したいと思います。

# BEAR.Saturday

その頃は単にBEARと呼んでいたBEAR.SaturdayというPHP5.2の時代に作ったフレームワークを、PHP5.3に書き直そし次のバージョンにしようとしたのが制作の最初の動機です。

BEAR.Saturdayは同じアプリケーションで携帯とPC、各キャリアで表示が出し分けられるように作られていました。開発者は各キャリアの文字エンコード(SJIS,UTF8)や携帯の文字コードを意識する事なく開発する事が出来ました。

開発は順調でしたが、ほぼ完成が見えた時点で開発を中止する事にしました。確かにコードの品質は上がり、スタイルも洗練されたように思いました。しかし表面的なものが良くなったとしても、本質的な価値向上がないものを後方互換性を破壊してまで提供する事に疑問を感じました。

# API-Centric

携帯電話の時代が終わりつつある中「API中心のアプリケーション」という着想を得ます。アプリケーションが扱う意味の情報や操作を、リソースというHTTPに習った強い境界の中に閉じ込め、ステートレスリクエスト、アドレス可能なURI、統一インターフェイス、ステータスコード、属性と言ったRESTの設計原則を取り入れる事にしました。

以下はチュートリアルのコードです。

```php
class Weekday extends ResourceObject
{
    public function onGet(int $year, int $month, int $day) : ResourceObject
    {
        $weekday = \DateTime::createFromFormat('Y-m-d', "$year-$month-$day")->format('D');
        $this->body = [
            'weekday' => $weekday
        ];

        return $this;
    }
}
```
このリソースのクラスメソッドは、HTTP(REST)の世界とPHP(OOP)の世界の橋渡しとなる境界です。

クラス名がURI(`/weekday`)にマップされ、リクエストに必要な引数はメソッドシグネチャーに`$year`、`$month`、 `$day`と表されます。メソッドの中のコードを読む事なく、ドキュメントを参照する事なく、リクエストに必要な引数が表されるべきで、このようにクラスやメソッドシグネチャーそのものがリソースのスペックになればいいと考えました。[^3]

## ルーティング

[BEAR.Sunday + Swoole](https://qiita.com/koriym/items/7d4fd7b1efe41b06aff3)の記事でも紹介したPHP作者のPHPフレームワーク批判に以下のものがあります。

> Duplicating the Web Server Functionality
> フレームワークはwebサーバーの機能（ルーター）を複製している

本来phpは`public`フォルダに置かれた場所に置いてURIが決定されますが、BEAR.Sundayでも基本はクラス名（クラスファイルの位置）でURIが決定します。Webルーターの場合はルーターファイルを用意する必要もありません。[^1]

同じように最小限の構成ではリソースのファイルを１つ設置しただけで（全体構造を理解する必要なく）APIができるのが理想と考えました。実際に上記の日付から曜日をレスポンスとして返す`/weekday`リソースはファイル１つ設置するだけでAPIとして機能します。

## 値と表現の分離

「リソースはメソッドで与えられた引数に基づいて自らの状態を決定し、その表現については興味を持たない。」

状態に関心を持つビューのコンポーネントがリソースオブジェクトにインジェクトされ、そのリソースオブジェクトが（文字通り）文字列評価された時に文字列（表現）になれば良いと考えました。[^2]

表現を返してしまうやり方に比べ、メソッドは値だけを返しているのでテストは容易です。JSON表現、HTML表現といった表現の種別を実行コンテキストを変えるだけで（ソースコードや設定ファイルを変更することなく変えることができます。

この部分の設計はBEAR.SundayのリソースクラスでRESTから着想を得てない珍しい部分ですが後になるほど強力に機能した部分でもあります。

## 終わりに

本当に少しだけ紹介しましたが、どのように新しいフレームワークの着想を得て形にしていくか、違う形でしっかり紹介できる機会が持てればと思います。ソフトウエア"開発"に興味がある人に有用なお話ができたら良いと思います。

@kumamidori さん、今年もカレンダーの設置ありがとうございました。@jingu君も、@77webさんも記事をありがとうございました。小さなカレンダーでしたけど、それぞれの問題の取り組みが記事になって良かったと思います。

今年も残りわずか。良いお年を。

Merry Christmas and HaPHPy new BEAR 2019 !!

![BEARSunday.gif](https://qiita-image-store.s3.amazonaws.com/0/3940/a4d975e6-344a-c4d2-2988-df4886d578cf.gif)

[^1]: 一般的なMVCフレームワークは、ルーターでURIとクラスのマップを行い、フロントコントローラーがディスパッチャーとしてページコントローラーを呼び出し、ほぼ全てのHTTP入力値を`Request`オブジェクトとして渡されます。

[^2]: 一方、MVCフレームワークの構造上の明らかな問題点は、C、すなわちコントローラーの責任の多さです。HTTPリクエスト全てが入ったオブジェクトを受け取り、全てのモデルとデータのやり取りが可能でその結果表現にも責任を持ちます。単一責任原則からも離脱しています。

[^3]: 後にJsonスキーマが導入されレスポンスの詳細についてもメソッドの外で定義され、コードから入出力のドキュメントの自動生成とバリデーションができるようになりました。
React Router with TypeScriptでちゃんと型をつける

react-routerでRouteコンポーネントを使って`<Route path='foo' component={Bar}/>`のように書くと、Barコンポーネントにはmatch,location,historyの３つのpropsが渡されます。

これらのpropsをどう型定義するかという話です。

## Routing

例えば以下のようなroutingがあるとします。

```app.tsx
  <BrowserRouter>
    <Switch>
      <Route path="/counter" component={Counter} />
    </Switch>
  </BrowserRouter>
```
Counterコンポーネントにはmatch, location, historyのpropsが渡されます。

## RouteComponentProps

Routeのcomponentに指定したコンポーネントのpropsはreact-router-domのRouteComponentPropsをextendする形で使えばうまく型定義できます。

```counter.tsx
import { RouteComponentProps } from 'react-router-dom'

interface Props extends RouteComponentProps<{}> {
　// 他の型定義
}

const Counter = (props: Props) => (
  <div>
    <Navi history={props.history} />
  </div>
)
```
RouteComponentPropsの型定義：

```index.d.ts
import * as React from 'react';
import * as H from 'history';

export interface RouteComponentProps<Params extends { [K in keyof Params]?: string } = {}, C extends StaticContext = StaticContext, S = H.LocationState> {
  history: H.History;
  location: H.Location<S>;
  match: match<Params> | null;
  staticContext?: C;
}
```
paramsが必要なときは`RouteComponentProps<{id: string}>`という感じで渡してあげれば良いです。

## History

さらにCounterがNaviという子コンポーネントを持っており、historyだけ渡している場合にNaviではどう型を定義するかというと、RouteComponentProps型定義でも使われているhistoryを使えば良いです。

```navi.tsx

import * as H from 'history'
interface Props {
  history: H.History
}

const Navi = (props: Props) => (<div><button onClick={props.history.push('/next')}/><div/>)
```

locationの場合は、H.LocationでOK。

以上です。