OmniAICreator/Qiita-1.07M huggingface dataset:
関数テンプレートの呼び出しに優先順位をつける

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

[初心者C++er Advent Calendar 2016](http://www.adventar.org/calendars/1691) 20日目の記事です。  
クリスマスが終わって『もはや Advent Calendar とは…』となってるんですが、まあ埋まってないより埋まってるほうがいいかなーと。  
今回は初心者向けかどうか怪しい内容ですが、ちょっとしたハックでも。  
なお、この記事は SFINAE を知ってる事が前提の記事になります。  

## [コード]

さて、次のように SFINAE を利用して『`a + a`ができる型(値)のみ』受け付けたい関数テンプレートを定義したいことがあると思います。  

```cpp
template<typename T>
auto
twice(T a)
// decltype() 内で式を記述することで a + a を要求する
->decltype(a + a){
	return a + a;
}

// 42 + 42 は有効なので OK
twice(42);         // 84

// 3.14f + 3.14f も有効なので OK
twice(3.14f);      // 6.28

// "homu" + "homu" は無効なので NG
twice("homu");
```

まあここまではよくあるコードだと思います。  

## [問題]

このような関数テンプレートを定義した場合に『それ以外にマッチする関数』も定義したいことがあると思います。 
 
```cpp
// a + a が有効でない引数の場合に呼び出す関数を定義
template<typename T>
auto
twice(T t){
	return t;
}

twice("homu");        // "homu"
```

これでよかったよかった…とはならずに、次のように『`a + a`ができる型(値)』を渡した場合にエラーになります。  

```cpp
// Error: call of overloaded 'twice(int)' is ambiguous
twice(42);
```

http://melpon.org/wandbox/permlink/GqFem4RxFct7gvqF

これは `twice(int)` 時に『両方の関数に該当するため』呼び出しが解決できないためです。  

## [解決]

解決策はいくつかあるんですが、次のようにして『オーバーロードを解決するため引数』を追加することで比較的簡単に回避することが出来ます。  

```cpp
// 引数に int を追加する
template<typename T>
auto
twice(int, T a)
->decltype(a + a){
	return a + a;
}

// 引数に bool を追加する
template<typename T>
auto
twice(bool, T t){
	return t;
}

// int 型の値を関数に渡すことで最初に定義した関数の方を優先して呼び出されるようになる
twice(0, 42);        // 84
twice(0, 3.14f);     // 6.28
twice(0, "homu");    // "homu"
```

http://melpon.org/wandbox/permlink/WeEUFMV8MGEZRkyb

これは `twice(0, 42)` の場合は `twice(bool, T)` よりも `twice(int, T)` にマッチし、`twice(0, "homu")` の場合は SFINAE によって `twice(int, T)` がオーバーロードの候補から外れ、`0` が `bool` 型に暗黙の型変換されるので `twice(bool, T)` にマッチするためです。  
まあ、要するに

```cpp
void func(int);
void func(bool);

// func(int) を呼び出す
func(0);
```

ということを利用しているだけですね。  

## [ちょっと改良]

上記のままだと毎回 `0` を渡す必要があるのでラッパ関数を用意すると使い勝手がよくなります。  

```cpp
template<typename T>
auto
twice_impl(int, T a)
->decltype(a + a){
	return a + a;
}

template<typename T>
auto
twice_impl(bool, T t){
	return t;
}

template<typename T>
auto
twice(T t){
	// ラッパ関数を用意して、その中で twice の実装を呼び出す
	return twice_impl(0, t);
}

twice(42);        // 84
twice(3.14f);     // 6.28
twice("homu");    // "homu"
```

http://melpon.org/wandbox/permlink/lwTkvXx39ptEP6TN

これでユーザコードからこのハックを隠蔽する事が出来ました。  

## [まとめ]

と、言う感じで簡単なハックを紹介してみました。  
SFINAE を使った関数を定義しているとこういう『オーバーロードが解決できない関数』が結構出てくるんで地味に重宝します。  
もうちょっと汎用的にしたコードが下記の記事に載ってるので気になる方は読んでみるとよいです。  

## [参照]

* [オーバーロードに優先順位を付ける  - とくにあぶなくないRiSKのブログ](http://sscrisk.hatenablog.com/entry/20110916/1316182355)
* [複数条件での enable_if その2 - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20110917/1316234864)
Go言語の練習テーマとして良い題材ありませんか？

これは「コードを書いていて困ったときに、suinがチャットで質問に答えたり相談に乗る[suinのプログラミング相談室(仮)](https://help.suin.io/)」で頂いた質問と僕の回答の要約です。

## 質問

[suinさんが書いたGoの記事](http://qiita.com/suin/items/22662f43b6a6e8728798)をいつも参考にしています。Goの練習で何か作ってみたいのですが、良いテーマがあれば教えてください。勉強会ではコマンドラインツールを作るのが多い印象です。私はPHPやjQueryの経験があります。

## suinの回答

jQueryやサーバサイドの経験がある強みと、PHPが不得意なところをGoで補えるスキルを習得できるという観点でお答えすると、僕のお薦めは2つあります。

### JSON APIサーバを作ってみる

HTML書き出すようなウェブアプリケーションをGoでやるのは辛く、PHPやRailsのほうが適材適所です。しかし、効率的にリクエストを捌くWebサーバを作るときはGoを活かせる場面が出てくると思います。グノシーが当時APIサーバをPHPで作っていたそうなのですが、パフォーマンスが課題になりGoで書き換えて解決したという事例もあります。jQueryやCURLで操作できるAPIサーバはちょうどいい題材だと思います。今後役に経つノウハウにもなると思います。

### コマンドラインツールを作る

シングルバイナリで配布できる利点がGoにはあるので、良い練習テーマにになると思います。PHPだと、配布先のPHPバージョンや拡張を気にしないといけないが、Goは基本的にそういう心配がありません。コマンドライン系のフレームワークも多く、コマンドラインツールを作るエコシステムとしては、PHPより成熟していると思います。


## 回答に対しての反応

コマンドラインツールはライブラリを少し使ってみたことがあるので、Goの利点がイメージできます！ コマンドラインツールを作ってみようと思います。APIサーバはイメージができてませんが、調べならやってみたいと思います。
git push heroku してもherokuに反映されない

# 問題

cloud9上で

```bash
$ heroku create
$ git push heroku
```

を実行しても
herokuのアプリケーションに反映されない。
![スクリーンショット 2017-06-06 9.10.22.png](https://qiita-image-store.s3.amazonaws.com/0/42587/26f96d4c-2ca7-bf08-8697-c64331e0e84c.png)

# 解決

```bash
$ heroku apps
$ heroku destroy (appname)
$ heroku create
$ git push heroku
```
これで解決~~(作り直し)~~

```bash
$ heroku apps
```
で、現在herokuに登録されているアプリケーションを全て表示します。
無料版の場合は上限5個だっけな？

```bash
$ heroku destroy (appname)
```
で、対象のアプリケーションを殺します。

```bash
$ heroku create
$ git push heroku
```
で、再度作成してpush

終わり。

# 原因?
すでにherokuに登録しているディレクトリで
もう一回heroku createしちゃったからおかしくなったのかも？
確率論 ~σ-集合体~

σ-集合体とは、「標本空間 $Ω$ 上で確率を測ることが出来る集合の集まり」のことです。

そもそも「なぜ σ-集合体を考えるのか？」ということについて、
言及する必要を感じますが、まずは定義を載せます。

# σ-集合体の定義

$(\;Ω,\;F,\;P\;)$ を確率空間とし、$F$ を σ-集合体とするとき、

```math
1. \quad Ω \in F \\
```

```math
2. \quad A \in F ⇒ A^c \in F \\
```

```math
3. \quad A_i \in F \; (i=1,2,3...) ⇒ \bigcup _{i=1}^\infty A_i \in F
```

が成り立つ。
Python3:  OpenCV を使う

Arch Linux では、簡単に、opencv がインストールできます

```bash
sudo pacman -S opencv
sudo pacman -S hdf5
sudo pacman -S gtkglext
sudo pacman -S python-opencv
```

対話形式でインストールの確認

```text
$ python
Python 3.9.5 (default, May 12 2021, 17:14:51) 
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.5.2'
```


ちゃんとインストールできているか確認するプログラムです。
題材の　Lenna.jpg は、インターネットですぐに見つかります。

```py3:imshow.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	imshow.py
#
#						May/16/2021
# --------------------------------------------------------------------
import os
import sys
import cv2

sys.stderr.write("*** 開始 ***\n")
print("version = " + cv2.__version__)
#
file_in = "Lenna.jpg"
if os.path.exists(file_in):
	img = cv2.imread(file_in)
	img_gray = cv2.imread(file_in,cv2.IMREAD_GRAYSCALE)
else:
	sys.stderr.write("*** error *** %s doesn't exist ***\n" % file_in)
	exit(1)
#
cv2.imshow("color",img)
cv2.imshow("gray",img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

次の環境で動作を確認
>Arch Linux (5.12.3-arch1-1)
>Python 3.9.5

関連情報
[Python3: OpenCV で顔認識](https://qiita.com/ekzemplaro/items/3b84759e9119d342b2ba)
jQuery初心者でも簡単にデキる「jQueryを使った右クリック禁止」の実装方法

jQueryのcontextmenu()メソッドを使えば、
右クリック禁止の実装が簡単にできますので共有します。

```
$(document).on('contextmenu', function(){
	return false; // 右クリックキャンセル（無効化）
});
```

ページ全体を対象として、右クリックした際に無効化する処理が走る仕組みとなっています。

簡易的な画像をダウンロードさせたくない。ソースを見せたくない場合にご使用ください。（あくまで簡易的な処置です）
python3 で、Raspberry Pi 用カメラモジュールを使う

ユーザーを、video グループに加える

```bash
sudo gpasswd -a user video
```

コマンドで撮影

```bash
raspistill -o a01.jpg
```

python3 のライブラリーをインストール

```bash
sudo apt install python3-picamera
```

python3 のソース

```py3:capture.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	capture.py
#
#						Jun/06/2017
# --------------------------------------------------------------------
import sys
import picamera
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
width = 800
height = 600
cam = picamera.PiCamera()
cam.resolution = (width, height)
cam.capture("photo.jpg") 
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```
convnetjsとtensorflow その6

#概要
tensorflowで学習したデータをconvnetjsで使ってみた。その2。
素数を聞いてみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/G/C/c/GCcQ.jpg?t=1496703053)

#成果物
http://jsdo.it/ohisama1/GCcQ

#サンプルコード

```
var net;
function toarray(n) {
    var ary = new Array;
    for (var i = -1 ; i < 7; i++)
    {
        var s = 1;
        if (i > -1) s = 2 << i;
        var b = n & (s)
        if (b > 0)
        {
            ary.push(1.0);
        }
        else
        {
            ary.push(0.0);
        }
    }
    return ary;
}
function prime(j, w) {
    var str = "";
    if (w[1] > 0.9)
    {
        str = j + ", ";
    }
    else if (w[0] > 0.9)
    {
        str = "";
    }
    return str;
}
function test() {
    var str = "";
    var trainer = new convnetjs.Trainer(net);
    for (var j = 2; j < 101; j++) 
    {
        var point = new convnetjs.Vol(1, 1, 10);
        point.w = toarray(j);
        var prediction = net.forward(point);
        str += prime(j, prediction.w);
    }
    return str;
}
var load_from_json = function() {
    $.getJSON("/assets/q/o/E/T/qoETC", function(json) {
        net = new convnetjs.Net();
        net.fromJSON(json);
        var a = test();
        document.getElementById('helloWorld').innerHTML = a;
    });
}
load_from_json();

```

#使用したライブラリ

https://github.com/ohisama/tf2convnet
VPS触ったメモ

## 気がついた点

| サービス | 気がついた点 | 
|:--|:--|
| AWS | Xen。virtualbox,kvmは動かない。 |
| GCE | 分課金。virtualbox動く。kvmは動かない。 |
| Azure | 管理画面重い。設定難しそう |
| Vultr | 先払い。アカウント自動作成と鍵設置機能が今はなかった。 |

[Xenでvirtualboxが動かない](https://www.virtualbox.org/ticket/12146)

## GCE

```bash:メモリが少ない場合/swapfile作る
dd if=/dev/zero of=/swapfile bs=1M count=500
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
```

```bash:fstab
/swapfile swap swap defaults,nofail 0 0
```


* [Google Compute Engine の料金  |  Compute Engine ドキュメント  |  Google Cloud Platform](https://cloud.google.com/compute/pricing?hl=ja#internet_egress)
* 米国の中では日本から近い `us-west1` を選ぶことにした。
* [GCP の無料階層 - 無料の長期トライアル、いつまでも無料  |  Google Cloud Platform](https://cloud.google.com/free/?hl=ja)

![disk.png](https://qiita-image-store.s3.amazonaws.com/0/25728/eee78b8e-f8a8-7b33-9361-6710f47d6983.png)

* [Google Compute Engine の料金  |  Compute Engine ドキュメント  |  Google Cloud Platform](https://cloud.google.com/compute/pricing?hl=ja)

> いずれのマシンタイプについても、最低 10 分間の使用料金が請求されます。たとえば、仮想マシンを 2 分間実行した場合でも、10 分間分の使用料金が請求されることになります。
> 10 分を超えると、インスタンスは 1 分単位で切り上げて課金されます。 インスタンスの実行時間が 11.25 分間の場合、12 分間分の使用量が請求されます。

### virtualbox

```
apt install -y \
 virtualbox \
 tightvncserver openbox

vncserver :0 
```

```rb
vboxmanage import a.ova --dry-run
vboxmanage import a.ova
vboxmanage modifyvm "vm1" --natpf1 "guestssh,tcp,,2222,,22"
VBoxManage modifyvm "vm1" --memory 192

vboxmanage startvm vm1 --type headless
```

### 定時で電源を落とす

* CoreOS, Container Optimized はcronが使えないのでこの技は使えない

```
sudo -s
crontab -e
```

```bash:
# 60分後に電源落とす場合
@reboot /sbin/shutdown -h +60

# 毎日23時59分に電源落とす
59 23 * * * /sbin/shutdown -h now
```

* IPが起動の度に変動するため不便ではある

### 料金

* 停止中はディスク料金がかかる


## Azure

管理画面かっこいいが重たい

スケジュール機能があった

![azure.png](https://qiita-image-store.s3.amazonaws.com/0/25728/95bfdec9-a5b2-ef26-7595-99d96fde7165.png)

* vm削除してもリソースが残るので注意
* ipを削除しないとvnetは削除できないので注意

![resource.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5a7d8725-9c01-988f-6940-460f7f398a74.png)

2段階認証あり。[Microsoft Authenticator for iOS](https://itunes.apple.com/jp/app/microsoft-authenticator/id983156458?mt=8)を使った。

### 静的IPアドレス

* [Azure ネットワーク インターフェイスの IP アドレスの構成 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-network-interface-addresses)
    * [Download Microsoft Azure Datacenter IP Ranges from Official Microsoft Download Center](https://www.microsoft.com/download/details.aspx?id=41653)

## vultr

* 先払い
* paypalやbitcoinでもクレジット購入可能
* google authenticatorの2段階認証対応

* ログインはrootユーザー  + 提供されたpasswordだった。
* ユーザー作成に非対応
* ssh鍵でのログインに現在非対応

## さくらインターネット

* ネットワーク使用料が無料らしい
Unityで2D格闘ゲームの歩行を作るならモーションのExit Time等を設定して足元が滑って見えないようにする

画像アップロード容量上限があるようなので、記事の全面　再構成を進めている。

# 足元が滑って見えないようにする

![201701141519gif4.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/74856913-fe3c-d837-9202-7ec03fd70b99.gif)
よく走っている。

#**やること** モーションとモーションのバトンタッチの間のクロスフェードみたいな設定を切る
運動会を思い出してほしい。
![201701141456a15.png](https://qiita-image-store.s3.amazonaws.com/0/159417/af54a9df-1950-b4c6-293e-3cccf569c5e9.png)
赤組がんばれ、白組がんばれ！
このリレーの図は、モーションの切り替えを説明している。

Unityエディターで　こんなインターフェースを見たことがないだろうか。
![201701141456a21.png](https://qiita-image-store.s3.amazonaws.com/0/159417/5d3d7734-71d4-ad97-9424-17241eb30943.png)
何をするものなのか？

このスタイリッシュな図は　アニメーターのインスペクターに表示される。
![201701141456a19.png](https://qiita-image-store.s3.amazonaws.com/0/159417/5c2c16c0-5bf1-ac87-3a96-16db52f8681f.png)

このタイムラインの使い方について　最速で理解する方法は　シークバーを動かすことだ。
![201701141519gif6.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/77c72ac7-9298-e296-96c3-d41010144c1d.gif)
青い人間は Dash、オレンジ色の人間は Escape で、
うっすらと見える青色の線が　乗り換えタイミングだ。
2つ目の Dash は来ない。
エスカレーターみたいになっているところの、ちょうど真ん中で画像が挿し替わっている。

##Exit Time
![201701141456a24.png](https://qiita-image-store.s3.amazonaws.com/0/159417/f12fbb18-5e20-8507-5b82-2f0cf649802c.png)
Exit Time は、乗り換え前のモーションが１リピートするのを 1 としたときの、途中下車するタイミングだ。

##Transition Duration
![201701141456a26.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1bbaedf9-3e01-1bd1-f74f-8e144ac042a7.png)
Transition Duration は、乗り換え前のモーションの長さを１としたときの、乗り換え区間の長さの割合だ。
３Ｄなら　ここでクロスフェードでもしてくれるのかもしれないが、２Ｄでは何の恩恵もない。区間の真ん中でバッサリ切り替わる。

**ということは、2Dでは Transition Duration は常に 0 にしておいて Exit Time でしっかり切り替えタイミングを設定した方がよさそうだ。とほほ。**

##Transition Offset
![201701141456a30.png](https://qiita-image-store.s3.amazonaws.com/0/159417/3ebd53f8-deb6-0b3b-077d-aa960c417601.png)
Transition Offset は、乗り換え後のモーションが　先行して走り出している長さだ。
例えば 0.7 に設定しておけば、乗り換え元のモーションを抜けたときには　乗り換え先のモーションは　７割進んだフレームになっている。

これで今日から　モーション切り替えの鬼となれるだろう。Exit Time を 1 に、Transition Duration を 0 に、と丸暗記していた昨日とは　おさらばしよう。今日からは　好きなタイミングでモーションを抜け、好きなタイミングからモーションに入ることができる。

#**ループ再生の話し** キーを押した直後だけ再生、離して停止

![201701141519gif1.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/56ea8c60-6e4e-9d74-fa6a-ba03ce40c25d.gif)
右キーを押したら　歩行モーションを開始する、というプログラムだと、ゲームでは　ずっと右キーを押しているだろうから、　ずっと　歩行モーションの１フレーム目からの開始しろ、って指示し続けることになるので　ずっと１フレーム目が表示されている。ムーンウォークする。

![201701141519gif3.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/1172df5a-3a84-f22e-a4da-31059eafc7e6.gif)
キーを押した瞬間だけ　歩行を開始し、あとは　歩行モーションをループ再生させよう。右キーを離したときに　歩行モーションを停止すればいい。

![201701141456a32.png](https://qiita-image-store.s3.amazonaws.com/0/159417/c692ef87-ed05-7531-de50-965d28bba48d.png)
そのプログラムは　状態遷移だけで組める。
dash トリガー（１フレームで消えるフラグ）にチェックが入った瞬間　Dashモーションに移行するように Conditions を設定しておく。
左右キーを押したとき、dash トリガーと、dashing （フラグ）にチェックを入れるようにスクリプトに書いておく。

![201701141456a34.png](https://qiita-image-store.s3.amazonaws.com/0/159417/cee40f6a-0303-0cb9-6a11-e742e571cc4c.png)
左右キーを放したときに、dashing（フラグ）のチェックを外すようにスクリプトに書いておいた。

#**コントローラーの話し** キーのニュートラルを意識する

この節の記事は　移動した。
http://makegame.warabenture.com/?p=392
ServiceNow初期設定 インスタンスのデフォルトの言語を日本語にする

[前回](http://qiita.com/Kisaragi13/items/abbc205134d1696ff644)はServiceNowインスタンスに日本語を追加した。このとき、ユーザは言語を日本語と英語の２つから切り替えることが出来たがシステムのデフォルト言語は英語となっていた。
今回はシステムデフォルトの言語を日本語に変更する。
インスタンスのビルドタイプはIstanbul。

# デフォルト言語を変更

インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーションナビゲータの中から、システムプロパティ → システムローカライズを選択（<font color="red">赤枠</font>）。　※<font color="red">システムローカライズは２つあるので注意</font>
（フィルタナビゲータ（<font color="blue">青枠</font>）に「**システムローカライズ**」と入力すると簡単です）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/43aecd03-af8a-e67e-cdaf-b7cd03316878.png)

システムローカライズのカスタマイズプロパティを以下のように変更する。
1. 「**ユーザーが使用言語を指定できるように、ログインページに言語選択ボックスを表示します**」のチェックを外す
2. 「**システムのデフォルト言語**」に「**jp**」を設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/773532f7-19c2-294f-7385-a3ec75682c3d.png)

保存ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/a19f85a0-3b1d-bef5-e795-f0b776394ce3.png)

**<font color="red">再ログイン後</font>**、システムのデフォルト言語は日本語となる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1fe19ac5-f767-7829-3995-65e5b206bdde.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/83513eec-8bdc-5ba4-b801-0fe2da41c357.png)

以上で、インスタンスのデフォルト言語変更作業は終了です。

# 関連記事
> - [ServiceNow初期設定 インスタンスを日本語化する](http://qiita.com/Kisaragi13/items/abbc205134d1696ff644)
蟻本をpythonで: Sec.2-5 ダイクストラ法

ダイクストラ法は、与えられた重み付き無向グラフ上の2点間の最小距離を求める問題の解法で、負の重みのedgeが無い限りok。

解説を読んでもボヤッとしていたが、以下のようにもう一つグラフを作るような実装を考えた結果腑に落ちた。


実装のため、重み付きグラフのクラスに以下のメソッドを追加した。動作としては
1. from_nodeからto_nodeへのedgeを削除
2. 1でfrom_nodeが浮遊した場合グラフからfrom_nodeを削除


```py3

    def remove_wo_weight(self, from_node, to_node):

        if from_node in self:
            count = 0
            for [node, weight] in self[from_node]:
                if node == to_node:
                    self[from_node].pop(count)
                count += 1

            if self[from_node] == []:

                self.pop(from_node)

```

ダイクストラ法のコードは以下.


```py3

import mygraph

print("number of nodes")
N = int(input())

print("input graph")
graph = mygraph.WeightedGraph()

while 1:

    inputline = input()

    if inputline == "":
        break

    inputline = list(map(int, inputline.split()))

    graph.join(inputline[0], inputline[1], inputline[2])

graph = graph.undirected()


for node in graph:
    if not isinstance(graph[node][0], list):
        graph[node] = [graph[node]]

print("Start?")
startpos = int(input())
print("Goal?")
goalpos = int(input())


dp = N * [float("INF")]

minlength_graph = mygraph.WeightedGraph()

minlength_graph.join(startpos, startpos, 0)


while 1:

    shortest_comb = [0, 0, float("INF")]

    for min_node in minlength_graph:

        for [to_node, to_weight] in graph[min_node]:

            if shortest_comb[2] > minlength_graph.weight(startpos, min_node) + to_weight:

                shortest_comb = [min_node, to_node, minlength_graph.weight(
                    startpos, min_node) + to_weight]

    minlength_graph.join(startpos, shortest_comb[1], shortest_comb[2])

    for fixed_nodes in minlength_graph:

        graph.remove_wo_weight(fixed_nodes, shortest_comb[1])

        graph.remove_wo_weight(shortest_comb[1], fixed_nodes)

    if shortest_comb[1] == goalpos:

        print(shortest_comb[2])

        break

    minlength_graph = minlength_graph.undirected()


```

入力と出力は省略(ベルマンフォードの時と同じ)

初期位置と距離が確定した点を、その点までの距離をweightとして結んだグラフ = minlength_graphを作っていき、minlength_graphに含まれるnode間のedgeを元のgraphからgraph.remove_wo_weight()で削除していく。

要するにminlength_graphにdpリストの役目をさせているだけなのだけれど、視覚的(?)には分かりやすくなった気がする(以下gif)。


![graph.gif](https://qiita-image-store.s3.amazonaws.com/0/148079/7daf388b-8ddc-bf63-c814-49e6977158b6.gif)




追記)
計算量のことを考えると、最小距離のnodeだけではなく、二番目に近いnodeまで記録しておいたほうがいい。そうすると、次のステップでは、新たに距離が確定した点に隣接した点までの距離と、前ステップで二番目に短かった点までの距離だけを比較すれば良いので無駄がなくなる。
react-router-domでpathのパラメータ渡しと子コンポーネントへのprops渡しを両立させる

# やりたいこと
react-routerでpathのパラメータを渡しつつ、子コンポーネントにpropsを渡すことを両立させたい。

# 環境
- react-router-dom: 4.1.1

# やり方
```
<Switch>
  <Route exact path='/' component={Home} />
  <Route path='/user/:id' render={({match}) => (
    <MyComponent {...props} match={match} />
  )} />
</Switch>
```
これでOK。MyComponent内でthis.props.match.params.idを受け取れる。
明示的にmatchを渡すところがポイント。

# 失敗例
```
<Route path='/user/:id' component={MyComponent} />
```
子コンポーネントでpropsが受け取れない。

```
<Route path='/user/:id' render={() => <MyComponent {...props} />} />}/>
```
子コンポーネントでthis.props.match.params.idがとれない

# 参考
- https://stackoverflow.com/questions/43152292/how-do-you-access-url-args-in-react-router-dom-4-when-using-route-render-prop-in
- https://stackoverflow.com/questions/43081961/navigate-in-code-with-react-router-dom-4-0
shader02

#Shaderを実際使ってみる

##はじめに
今回から実際shaderを使ってみましょう！
今回使うツールはunityです。(バージョンは5.6です)

##使うまでの流れ
流れとしてはまずmaterialを作ります。その後createでshader(standard surface shader)を選択してshaderスクリプトを作ります。そしたら作った2つの物を関連付けます！materialのshaderの部分をCustomにして自分が作ったshaderスクリプトを選択してください。(画像ではmaterial:test shaderスクリプト:testとなっています。)
<img width="528" alt="スクリーンショット 2017-06-02 01.06.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/dbb8f67b-7926-9ad4-3da0-63b27b18d0f7.png">

##実際のコーディング
今回は最も簡単なSurfaceShaderについて書いていきます。

<img width="295" alt="スクリーンショット 2017-06-06 01.33.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/58f6c841-bbcb-0223-4cd8-e7c024059ace.png">

1.まずはコード全体をShader "Custom/test" {SubShader {....}FallBack "Diffuse"
}で囲みます。

2.CGPROGRAMはここからshaderコードが始まりENDCGで終わるということです。

3.#pragma surface surf LambertはSurfaceShaderのメイン関数はsurfということです。
そしてLambertはライティングの方法です。ざっくりいうと視点の位置に関わらず(近似された)同じ色で見えるという方法です。

4.10〜12行目ではshaderに流れ込んでくる情報を定義します。今回は色ですね！

5.14~16行目は主役、メインです！引数のINはInput構造体で定義した流れ込んでくる変数、oは出力する構造体です。はじめはなかなかイメージがわかないと思いますが、イメージとしては流れ込んできた構造体の変数をいじって出力構造体にセットみたいな感じです！そしたら画面に変化が訪れるはず！です。今回では出力の拡散光の色を赤にセットしているのでこのmaterialをセットしたオブジェクトは赤くなるはずです。

##最後に
初学者向けに書いているので少し難しいところは飛ばして書いてあるので触れてない部分に関しては少し我慢して写経してみてください。今後の記事でしっかり書いていくつもりですので心配しないでください！また間違いがあった場合もしくは質問などがあったらコメントください!
Reactでとりあえずテストを書いてみる

# Reactjsのテスト
RailsでもテストコードがあるようにReactjsにもテストを書くことができる。
ReactではJestと呼ばれるJavaScriptsテストフレームワークがあるのでこれを使ってみる。

## 準備
今回はnpmを使用していることを想定して記述していく

```Bash
npm i -g jest-cli
npm i --save-dev babel-jest react-addons-test-utils
```
package.jsonに以下を付け加える

```package.json
/* ... */

  "jest": {
     "unmockedModulePathPatterns": [
         "node_modules/react",
         "node_modules/react-dom",
         "node_modules/react-addons-test-utils",
         "node_modules/fbjs"
      ]
  },

/* ... */
```
これでJestを使ったテストが行うようになる

```bash
jest テスト名.js
```

## 実際にテストを書いてみる
Jestは、\_\_tests\_\_ディレクトリからテストコードを探そうとしている
そのため\_\_tests\_\_ディレクトリにコードを書き、実行するという形になる

次に、簡単なテストを書いてみる

```__tests__/dummy-test.js
describe('a suite',  () = >{
    it('is a spec' , () => {
        expect(1).toBe(1);
    });
});
```
これでテストをすると通るはずです。
英語的な記述のためテストコードが書きやすいと言われております。

# 参考文献
- [O'REILLY Reactビギナーズガイド コンポーネントベースのフロントエンド開発入門](https://www.oreilly.co.jp/books/9784873117881/)
systemdを使うためのメモ

#Systemdを使おうと思ったときに参考になった情報源

とりあえず概要
https://ja.wikipedia.org/wiki/Systemd

systemctlを使ったサービスのコントロール
http://dev.classmethod.jp/cloud/aws/service-control-use-systemd/

Unitの依存関係の書き方
http://yukiyan.hatenablog.jp/entry/2015/10/18/190639



###Systemd入門1～5
Systemd入門(1) - Unitの概念を理解する 
http://enakai00.hatenablog.com/entry/20130914/1379146157
Systemd入門(2) - Serviceの操作方法 
http://enakai00.hatenablog.com/entry/20130915/1379212787
Systemd入門(3) - cgroupsと動的生成Unitに関する小ネタ 
http://enakai00.hatenablog.com/entry/20130916/1379295816
Systemd入門(4) - serviceタイプUnitの設定ファイル
サービスの起動種別、プロセス終了時の動作の書き方
http://enakai00.hatenablog.com/entry/20130917/1379374797
Systemd入門(5) - PrivateTmpの実装を見る
ファイルシステム保護オプション(ReadOnly化、chroot、PrivateTmp等)が面白い
http://enakai00.hatenablog.com/entry/20130923/1379927579
GLSLレイマーチング研究_距離関数について勉強してみた25(続・Planeの関数をいじる)

昔の記事を再考してみました。

[GLSLレイマーチング研究_距離関数について勉強してみた09(Planeの関数をいじる)](http://qiita.com/muripo_life/items/074f69a5f0bac74e71e6)

以前、Plane関数をやったときにの画像です。

![image01.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/791cee87-a967-7d32-0ae3-479b9651d47b.png)

マーチングループの精度の問題ですけど…  
この丸みを取りたいなと思っていました。

```c
// レイが進む処理(マーチングループ)
for(int i = 0; i < 32; ++i){
    dist = distanceHub(rPos);
    rLen += dist;
    rPos = cPos + ray * rLen;
}
```

で、今回の話は、この丸みを取る話…

# for文って、floatでも回せる。
今更こんなことに気づきました。
2のべき乗のじゃなくていいんだ！   

```c
for( float i=.0; i<16.; i+=.05 ) {
	dist = distanceHub(rPos);
	rLen += dist;
	rPos = cPos + ray * rLen;
}
```

今回はこれだけですね。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/ff18603c-3d75-e6c1-2b80-3053724407eb.png)

次から、これを元に地形生成でも書いていこうと思います。

コード

```c
// ============================================================================
// fractal terrain
// ============================================================================

/* 精度修飾子の宣言 */
precision mediump float;

/* WebGLで受け渡された変数 */
// 解像度 (512.0, 512.0)
uniform vec2  resolution;
// mouse (-1.0 ~ 1.0)
uniform vec2  mouse;
// time (1second == 1.0)
uniform float time;
// previous scene texture
uniform sampler2D prevScene;

// Planeの距離関数
float sdPlane(vec3 p){
	// Planeの距離関数
	// n must be normalized
	vec4 n = vec4(0.0, 1.0, 0.0, 1.0);
	return dot(p, n.xyz) + n.w;
}

// 複数の図形を合成するの距離関数
float distanceHub(vec3 p){
	return sdPlane(p);
}

/* シェーディング */
// 法線の生成
vec3 genNormal(vec3 p){
	float d = 0.001;
	return normalize(vec3(
		distanceHub(p + vec3(  d, 0.0, 0.0)) - distanceHub(p + vec3( -d, 0.0, 0.0)),
		distanceHub(p + vec3(0.0,   d, 0.0)) - distanceHub(p + vec3(0.0,  -d, 0.0)),
		distanceHub(p + vec3(0.0, 0.0,   d)) - distanceHub(p + vec3(0.0, 0.0,  -d))
	));
}
// シェーディング(色など)
vec3 doColor(vec3 p){
	float e = 0.001;
	// レイとオブジェクトの距離を確認
	if (distanceHub(p)<e){
		// 法線を算出
		vec3 normal = genNormal(p);
		// ライトベクトルの定義（マウスの影響を受けるように）
		vec3 light  = normalize(vec3(1.0, 1.0, 1.0));
		// ライトベクトルとの内積を取る
		float diff  = max(dot(normal, light), 0.1);
		return vec3(diff, diff, diff);
		// スペキュラーを定義する
		// float spec = pow(diff*diff, 15.0);
		// return vec3(diff+spec, diff+spec, diff+spec);
	}
	// 衝突しなかった場合はそのまま黒
	return vec3(0.0);
}

/* カメラのワーク */
void main(){
	// スクリーンスペースを考慮して座標を正規化
	vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);

	/* カメラを定義 */
	// カメラの位置
	vec3 cPos         = vec3(1.0, 3.0,0.0);
	// カメラの向き(視線)
	vec3 cDir         = vec3(0.0,  0.0, -1.0);
	// カメラの上方向
	vec3 cUp          = vec3(0.0,  1.0,  0.0);
	// 外積を使って横方向を算出
	vec3 cSide        = cross(cDir, cUp);
	// フォーカスする深度
	float targetDepth = 1.0;

	// カメラの情報からレイを定義
	vec3 ray = normalize(cSide * p.x + cUp * p.y + cDir * targetDepth);

	/* マーチングループを組む */
	// レイとオブジェクト間の最短距離
	float dist = 0.0;
	// レイに継ぎ足す長さ
	float rLen = 0.0;
	// レイの先端位置(初期位置)
	vec3  rPos = cPos;
	// レイが進む処理(マーチングループ)
	for( float i=.0; i<16.; i+=.05 ) {
		dist = distanceHub(rPos);
		rLen += dist;
		rPos = cPos + ray * rLen;
	}

	// レイとオブジェクトの距離を確認
	vec3 color = doColor(rPos);
	gl_FragColor = vec4(color, 1.0);
}
```
【JavaFX】new Image(パス)でIllegalArgumentExceptionが発生する

# (ﾟДﾟ#)

2時間ほど頭を抱えてしまったので備忘録も兼ねて投稿。キレそう(キレてる)。JavaFX8です。
馬鹿げたネタではありますが自戒の意も込めて駄文を綴りましたので時間のある方はどうぞお付き合いください。
……本当に困ってここへ辿り着いたお方いらっしゃいましたら、よろしければ一緒に踊りましょう(┓^ω^)┛))ﾖｲｻﾖｲｻ♪ (┓^ω^)┛))ﾎｲｻﾎｲｻ♪


# 「IllegalArgumentException: Invalid URL: unknown protocol: c」

絶対パスをそのままぶち込んだら「そんなプロトコル知らんぞ」と言われてますね。こっちだって知らんわぶっ◯すぞ。

![2017-06-06_00h25_14.png](https://qiita-image-store.s3.amazonaws.com/0/164419/dfb894b6-ce4a-176a-18bd-d5c9299c7fa5.png)

で、どうもよく見たらパスではなくURLを要求してるんですね。いやよく見なくてもプロトコルっつってますしエラーの1行目にもがっつり書かれてるんですけど。それどころかコーディングの段階で言ってくれてます。てへぺろ。
![2017-06-06_00h29_42.png](https://qiita-image-store.s3.amazonaws.com/0/164419/79736a19-27c4-3a15-0c05-fd02875753de.png)

とまあ、つまるところ「ローカルファイルをURLで指定」すればいいわけです。
ググってみますと頭に「file:」と付け足せば済むそうで。

```Java:hoge.java
String path = "C:\\~(略)";
Image image = new Image("file:"+path);
```

たったこれだけのことです。つらいですね。俺の2時間を返せ。

# おまけ
「なんかテストしたら『RuntimeException: Internal graphics not initialized yet』を吐かれたんだけど」って人います？
私は吐かれました。ここ( http://namihira.hatenablog.com/entry/2014/12/29/125834 )見たら解決すると思うんでどうぞ。
JavaScript基礎 即時関数

即時関数って定義時に即座に実行される関数ってのはわかるけど、イマイチ使い所がわからなかったので、調べてみました。
案外コードみてると出没するので覚えておくべきと思い纏めます。

# STEP1　即時関数の構文
構文は２パターンあります。

```javascript
// パターン1
(function () {
  // 関数の中身
}());

// パターン2
(function () {
  // 関数の中身
})();
```
異なる部分は、最後の括弧です。
即時関数に引数を渡す場合は以下のようにします。

```javascript
// パターン1
(function () {
  // 関数の中身
}('arg1', 'arg2'));

// パターン2
(function () {
  // 関数の中身
})('arg1', 'arg2');
```

即時関数は通常の関数のように戻り値を指定することも可能です。

```javascript
var result = (function (weight, height) {
  return weight / (height * height)
}(50, 1.5));

console.log("bmi is " + result);  // bmi is 22.2....
```

# STEP2　即時関数の用途
## 定義後に実行され再利用されない場合
例えば、画面遷移時のページの初期化や、ブラウザのバージョンの判定等々です。

```javascript:例
var VENDER = (function () {
  var ua = navigator.userAgent;
  if (ua.indexOf('Webkit') != -1) {
    return 'webkit';
  } else {
    return '';
  }
}());
```
判定後にグローバルスコープに余計な関数名が残ることがありません。
また、最初の一度のみ実行されれば良いので即時関数に向いています。再利用もしません。

## スコープを汚染せず新たなスコープを作成する
何を言っているんだっと思う人の為にコードの例で説明します。

```javascript:例：即時関数を使わない場合(アンチパターン)
var bmi = 0;

var weight = 50;
var height = 1.5;

bmi = weight / (height * height);
console.log("bmi is " + bmi);  // bmi is 22.2....
```
上記のコードはうまく動きます。しかし、変数`weight`,`height`をグローバルスコープに定義しています。もし上記コードより前に同じ変数名が定義された場合、変数を上書きしてしまうので、予期せぬ動きをする可能性があります。このようなコードを書くとコードが大きくなるにつれてグローバルスコープが不要な変数で埋め尽くされてしまいトラブルの元になります。

では、一時的な変数を関数の中に定義してローカル変数にしてしまいます。

```javascript:例2：名前付き関数を使う場合(アンチパターン)
var result = 0;
var bmi = function() {
  var weight = 50;
  var height = 1.5;
  return weight / (height * height); 
}
result = bmi();
console.log("bmi is " + result);  // bmi is 22.2....
```

これにより、変数`weight`と`height`が関数bmiのローカル変数となるのでグローバルスコープを汚染しなくなりました。また、`weight`と`height`が外側のスコープから上書きされることはなくなり安全になりました。しかし、ここでは関数を格納している`bmi`という変数がグローバルスコープに定義されるため、一番目のアンチパターンと同じ問題が発生します。
まだ、一番のパターンよりはマシなコードですが、このbmi関数が再利用されない関数だとしたら、グローバルスコープに余計な変数を残す必要はないので、次のように即時関数を使用します。


```javascript:例3：即時関数を使う場合
var result = 0;
result = (function() {
  var weight = 50;
  var height = 1.5;
  return weight / (height * height); 
}());
console.log("bmi is " + bmi);  // bmi is 22.2....
```
これで、例２のようにbmiという関数はグローバルに生成されません。
しかし、resultという変数をグローバル変数に宣言しているので、全く汚染しなようにするには以下のようにします。

```javascript:例4：即時関数を使う場合
(function () {

    var bmi = function() {
      var weight = 50;
      var height = 1.5;
      return weight / (height * height); 
    };
    console.log("bmi is " + bmi());  // bmi is 22.2....

}());
```

と以上になりますが、即時関数は以上のようにグローバルスコープを汚染しないように使用することが多いようです。試しに適当にライブラリの中身を見てみると以外に即時関数が出てくるのでチェックして見てください。
Book Apartment at Barbados to Enjoy Outside View

Are you a newly married coupled? You want to celebrate your joyful moment in some standard way and quirk your mind to set your feet at Barbados. So, you should not have to any regret that you should have not make an attempt to revel special layer of nature in a better manner. Each person does not have dared to trip such sightseeing in their busy days and make the advanced planning for Holiday apartments Barbados. Do not go elsewhere to get the pleasure of trip and real estate nourished service in the step by step procedure. We are one of the leading real estate consultants to bestow the superlative apartment service at most affordable price. Deeply connection to rituals, customs and other services, we are providing Beach view apartments Barbados to give the some relaxation to your tired eyes. To know more information, you have to browse our web portal. http://www.apartmentsinbarbados.eu/
のらメモたぬき～Houdini編～

どうもです。今週からHoudini Coreについて
ざわ～と触っていこうと思います。

自分もちょー初心者です。（なので知っている人には飽きる内容かもしれません後了承くださいませ）

まず
Windowsであれば
スタートメニューから
**Side Effects Softwware**
　　　ＬHoudini 16.0.504.20 (ヴァージョン名のフォルダ)
　　　　　Ｌ Houdini Apprentice 16.0.504.20　
　　　　　Ｌ Houdini Core 16.0.504.20 **<font color="red">←今回はこれ使います！</font><br>**

　　　　　Ｌ Houdini FX 16.0.504.20
　　　　　Ｌ Houdini Indie 16.0.504.20

早速開いたら　すごいＵＩですね。。。Autodesk の　Mayaみたいです。
タブの中身もだいぶ豊富ですね。
![Hou00.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/f4986d1b-ece5-6a37-7e13-e4baf8fb4a10.jpeg)

とりあえず左の項目が
恐らくは・・・移動・回転・スケールとかのやつかな！？笑
![Hou01.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/a3d07793-c558-3f7c-ad48-40904be27aea.jpeg)
ざっくりとこんな感じなんでしょうか？

それでは・・！実際にオペレーションを。
ビューの動かし方は　MayaとUnityと恐らく同じです。（間違ってたらスミマセン・・・）

んで基礎モデル生成を・・・
感覚的にはＤＣＣツールや良く見かけるミドルエンジンみたいに

**Creat > Box** ボックスをつくってみましょうか。
![Hou02.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/6754600a-1272-de15-c98d-1c214c054f1d.jpeg)
この状態で**<font color="red">Enterキー</font><br>** を押してみましょう。
![Hou03.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/3f57e13c-5a95-88f0-f201-a606e5093bd5.jpeg)

こんな感じで先ほどの移動や回転・スケール・スナップを試して見ます。
ちなみに　Ctrl+C　から　Ctrl+V　　でオブジェクトをコピーしてペーストする複製ですね。

■グリッドスナップでグリッド線にピタッと移動できる。![Hou05.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/719fb12a-9248-12b3-c99f-7200fbd4ec7a.jpeg)



■複製したオブジェクトをプリミティブスナップで　ちょうど半分ぐらい？のところでスナップ移動できました！![Hou04.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/9a814cfd-eefa-90da-3422-a8f181668a47.jpeg)

■プリミティブスナップ　面スナップ！![Hou06.jpg](https://qiita-image-store.s3.amazonaws.com/0/184524/be020995-9ed4-5373-f9b6-755ebbde34bf.jpeg)


とりあえず所感ですがここまで。
codeigniter3でサイト開発(環境構築編)

# codeigniter3
私の大好きなPHPフレームワーク、codeigniterを用いてサイト開発をする手法を説明します。

## 開発環境の構築
Apacheの環境が簡単に手に入るxamppを使います。実際の公開環境ではないですが、開発するならお手軽で最適です。

### 入手方法
[ここから最新版を入手してください。](https://www.apachefriends.org/jp/index.html)

### インストール
色々とオプションがありますが、今回はApache、MySQL、PHP、phpMyAdminを選択してインストール。
インストール先は適宜変更しましょう。
デフォルトだと`C:\xampp`

### 接続確認
ウェブブラウザを開いて`http://localhost/`にアクセスし、xamppのページが開けばインストール完了。ページが開けない場合にはxamppコントロールパネルを開いて、Apacheがstartされているか確認してください。

## codeigniter
### 入手方法
[ここから最新版を入手してください。](https://www.codeigniter.com/)

### インストール
ダウンロードしたZIPファイルを解凍して、xamppの`htdocs`下に配置するだけ、以上。

いや、`htdocs`下に直接置くとデフォルトで配置されているファイルとごっちゃになるので、適当にフォルダ作成してその下に放り込みましょう。今度こそ、以上！

~~composerを用いた方法もありますが私はこの形が好き。~~
Anaconda パッケージ管理メモ

## 仮想環境表示
仮想環境のリストを表示

```
> conda info -e
```

## インストールパッケージ
表示だけなら

```
> conda env export
```

パッケージ情報の書き出し

```
> conda env export > myenv.yaml
```

別、マシンで環境構築。（まだ試していません）

```
> conda env create --file myenv.yaml
```

以下の記事を参考にしました。
[condaによるポータブルなPython環境構築のすすめ](http://qiita.com/yubessy/items/2dd43551aa8308dc7eca)
vim基本操作

#1. 三つのモードがあります
- CommandMode
- InsertMode
- VisualMode 

![image](https://qiita-image-store.s3.amazonaws.com/0/177240/4d8d40a8-ad17-da61-fb4c-0666ac81007b.png)
i ：　カーソルの前に挿入
a：　カーソルの後ろに挿入
I：　該当行の最初の文字へジャンプして、挿入モードに
A：　該当行の最後の文字へジャンプして、挿入モードに
v：　文字を選択対象として、VisualModeに
V：　行を選択対象として、VisualModeに

#2.  移動	
H←（左）　L→（右）　J↓（下）　K↑（上） すべてのコマンドはCommandModeでしか使えません。
![image](https://qiita-image-store.s3.amazonaws.com/0/177240/f2af5f69-46fe-8fe2-e370-24f14ef5dd95.png)
H / M / L ：現在のスクリーンの左上/左中央/左右へ移動		
０（数字）：　該当行の最初へ移動
^：　該当行の最初の文字へ移動（※中文输入法下，shift+6可以输入）
w：　次の単語の頭へ移動
W：　次の単語の頭へ移動、（）＜＞などをignoreする
e：　次の単語の最後へ移動
E：　次の単語の最後へ移動、（）＜＞などをignoreする
b：　一つ前の単語の頭へ移動
ge：　一つ前の単語の最後へ移動
gE：　一つ前の単語の最後へ移動、（）＜＞などをignoreする
g_：　該当行の最後の文字（non-blank）へ移動	
$：　該当行の最後の文字へ移動
ctrl -f：　一つスクリーンを進む	
ctrl -b：　一つスクリーンを戻る

**TIP** 
1. 全部選択 / Copy：　ggVG / y
2. gg 第一行 V Visual G 最後の行　y copy
3. すべての行の最初の文字の前に”a”を挿入 :%s/^/a
4. すべての行の最後の文字の後ろに”a”を挿入 :%s/$/a
5. コマンドモードで、検索したい単語まで移動して、shift + 	* にしたら、すべて同じ単語が出てくる、NとShift＋Nで単語間移動。

# 3. 編集
ｄ： 	删除从当前光标，到下一个命令之间的内容，比如dw就是删除一个单词，dd是删除一行，dk向上删除，d$删除从当前光标 到 最后，d0 删除从当前光标到最开始。	
c：	 同d，删除从当前光标，到下一个命令之间的内容，但是同时进入插入模式。组合也相同。
x： 	删除光标后的字符。
c： 	删除光标前的字符。
　
y： copy 从当前光标，到下一个命令之间的内容。
p： 粘贴到当前光标之后。
P： 粘贴到当前光标之前。（大写）
 
r： 替换
. ： 重复操作 （点号）， 	ctrl+r 撤销操作
	
d / c / y 都是针对一行进行操作，删除一行/复制一行。
另外，很多命令能够组合，比如1yy就是将一行复制后，放入寄存器1中，用1p可以粘贴。
:registers 可以查看寄存器的内容。

#4. Visual Block
使用 Visual Block能够给每行加上前置字符。
1. 先 Ctrl+q 进行矩形选择，再用I（ctrl (?shift)+ i） 进入插入模式，输入待插入的文字，再退出插入模式，那么输入的文字，会全部插入到矩形框的前面。（用A进入插入模式的话，输入的文字，会被插入矩形框尾部）
 ![image](https://qiita-image-store.s3.amazonaws.com/0/177240/87732d97-2a6d-bc14-daa4-062521a56343.png)
2. 同样的方法，使用 s的话，能够进行文本替换。
3. 使用 Ctrl+q+$ 能够在行尾部追加。

**TIP**
1. 为每一行追加行号 :%s/^/\=line(".")/  	line(".") 是追加的内容。
2. 同样，将^ 修改为 $可以在行尾部追加。 %s/^/a 行头追加字符 a

#5. 查找和替换
：/[查找内容] 或者 :?[查找内容] 	，都可以用来查找，用n或是N进行跳转。
:nohl 	取消结果高亮。
:%s/old/new/gc   	替换用语句，c 是用来确认，如果没有c 则直接替换
:%s/old/new/g   	如果先选择范围，再替换的话，即部分替换。

#6. 补全
使用Ctrl + N / Ctrl + P选择已经输入过的单词。
GetHashCode()にしてやられた件…

# タイトルそのまんまなんですけど

.NET Framework 3.5ベースのプログラムを、.NET Framework 4.6ベースに移行しようとして、ドツボに嵌りました。

単独のプログラムじゃないんです。
プログラムAがある情報を暗号化して、プログラムBがそのデータを復号化して利用する、と云う動きをします。

そこで、暗号化のためのシードをGetHashCode()で計算していたんですよ。同じ文字列だったら同じHashを返すのがGetHashCode()だと思っていました。何の疑いもなく…
少なくとも、CLR2.0ベースでは問題はなさそうでしたよ。

で、VS2010で作ったプロジェクトをVS2015で読み込んで、対象のフレームワークを4.6に変更して「さぁ実行！」ってさ。

でも、B君が云うには「復号化でけへんのやけど…」

デバッグ実行までして調べた結果、GetHashCode()で計算されるシードが異なっていると云う事が判明。まぁ、シードが違えば復号化はできないっすよね。

しかし、同じ文字列を与えてHashコードが違うって何なんだよー

# 調べてみたよ

日本語がとても怪しいのですが、msdnのString.GetHashCode()に以下の記述が…


> 重要 
>
> 2 つの文字列オブジェクトが等しい場合は、GetHashCodeメソッドと同じ値を返します。 ただし、一意の文字列値ごとに一意のハッシュ コード値はありません。 異なる文字列は、同じハッシュ コードを返すことができます。
>
> ハッシュ コード自体は、安定しているは保証されません。 .NET Framework のバージョンとプラットフォーム (32 ビットおよび 64 ビット) など、.NET Framework の 1 つのバージョンを全体と同じ文字列のハッシュ コードは異なることができます。 場合によっては、アプリケーション ドメインによっても異なることができます。
> 
> その結果、ハッシュが作成された、アプリケーション ドメインの外部のコードを使用しないで、コレクション内のキー フィールドとして使用する必要がありますしないと、永続化することはありません。
> 
> 最後に、暗号強度が高いハッシュする必要がある場合に、暗号ハッシュ関数によって返される値ではなくはハッシュ コードを使用しないでください。 暗号法のハッシュから派生するクラスを使用して、System.Security.Cryptography.HashAlgorithmまたはSystem.Security.Cryptography.KeyedHashAlgorithmクラスです。
> 
> ハッシュ コードの詳細については、次を参照してください。Object.GetHashCodeです。
 
超約をするなら―

* 同じ文字列からは同じハッシュコードが返るよ<br/>でも文字列が違うからと云ってハッシュコードが違うとは限らないので要注意
* まぁそうは云っても、フレームワークバージョンが違ったりすればハッシュコードも変わるかも知れん<br/>もっと云えばアプリケーションが違うだけでも異なるかもねー
* (以下略)

こんなに不安定なんだ、GetHashCode()って…

# で、結局

GetHashCode()使うのは諦めて、MD5を計算するようにしました。
B君の機嫌も直ってよかったよかった。

実はこの他にもCLR4に移行した（所為だと思うんですが）事によって、Stream系の動きも若干変わった様で、コードに手を入れる必要がありましたよ。
Electronをいじってみる1

はまったけどとりあえず動くようにはなった。
自分が理解できる文献がなかなか見つからないから大変。

前提
1. Node.js, TypeScript, typingsがインストールされていること
2. 使ったバージョンは、Node.js@v6.10.3, TypeScript@2.3.4, typings@2.1.1

手順
1. ソースと型定義のインストール
2. サンプルをコンパイルする
3. 実行する

追記
4. パッケージングする

# 1. ソースと型定義のインストール

```
npm install -g electron
typings install dt~electron --global --save
```

electronのインストールでエラーが出たが

```
npm cache clear
```

を実行してからやり直したらうまくいった。

# 2. サンプルをコンパイルする

```main.ts
///<reference path="./typings/index.d.ts"/>

// In the main process.
const { app, BrowserWindow } = require('electron')
app.on('window-all-closed', () => {
    app.quit()
})

app.on('ready', () => {
    let win = new BrowserWindow({ width: 800, height: 600 })
    // load a local HTML file
    win.loadURL(`file:///index.html`)
})
```

```index.html
<!DOCTYPE html>
<html>
<head>
  <title>Hello TypeScript</title>
</head>
<body>
  <h1>Hello TypeScript</h1>
</body>
</html>
```

コンパイルしたら以下のようなエラーが出てしまった。

```
Namespace 'NodeJS' has no exported member 'EventEmitter'.
```

Node.js標準の型定義がないように見えるので

```
typings install dt~node/v6 --save --global
```

を実行したところ無事コンパイル完了。

# 3. 実行する
作っていなかったpackage.jsonを作成してから実行。

```
npm init -y
electron .
```

うまくいっていればこんな感じにウィンドウが表示される。
![WS000421.JPG](https://qiita-image-store.s3.amazonaws.com/0/153576/81296644-ed57-304c-a6e8-3901ad6a4135.jpeg)

一応ディレクトリ構成も書いておく

```
.
..
typings
index.html
main.js
main.ts
package.json
typings.json
```

# 4. パッケージングする
electron-packagerをインストールしてパッケージング
上でやったのがhelloディレクトリに置かれている

```
npm install -g electron-packager
electron-packager ./hello hello --platform=all --arch=all --electron-version=1.6.10
```

とりあえずallでやってしまったが
パッケージを作るためのファイルダウンロードが増えて時間をとられてしまった。
--platform=win32 --arch=x64　でよかったね。

パッケージングしたものを起動してもなぜかうまく動かないので[２に続く](http://qiita.com/maron8676/items/8392778abe1a6e7e9383)
Pythonでタイピングゲームをプレイしてみた

#概要
pytesseractによる光学文字認識と，PyAutoGUIによる自動キーボード入力を利用して，英単語タイピングゲームをプレイしてみた．

Typing Test English : https://10fastfingers.com/typing-test/english

#環境
OS：Windows10 64bit
Python version : 3.5.3

#ゲームの概要
![capture2.jpg](https://qiita-image-store.s3.amazonaws.com/0/185448/00f579cf-f7ea-4700-ebe6-8e26514a4171.jpeg)

赤枠で囲んだ領域に英単語が表示されるので，それをひたすら入力フォームに打ち込んで行き，1分間に何単語入力できたかを競う単純なゲーム．

#使用した主なライブラリ
selenium, PyAutoGUI, pytesseract, Pillow


#プログラムの動作

```main.py
# -*- coding: utf-8 -*-

from PIL import Image
from PIL import ImageGrab
import pytesseract
import numpy as np
import matplotlib.pyplot as plt
import pyautogui as pyag
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import cv2

os.chdir(os.path.dirname(os.path.abspath(__file__)))
pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract'

fig, ax = plt.subplots()
mngr = plt.get_current_fig_manager()
mngr.window.setGeometry(10,800,1300,250)
plt.pause(0.001)

url = "https://10fastfingers.com/typing-test/english"
chrome_driver_path = "chromedriver.exe"
chrome_options = Options()
chrome_options.add_argument("--window-position=0,0");
chrome_options.add_argument("--window-size=1000,600");
browser = webdriver.Chrome(chrome_driver_path, chrome_options=chrome_options)

print("Loading...")
browser.get(url)
time.sleep(3)

while(True):
    print("-----------------------------------------")
    print("Extracted words")
    print("-----------------------------------------")
    
    img = ImageGrab.grab(bbox=(120,308,1213,430))
    
    ax.imshow(img)
    plt.pause(0.001)

    img =  np.array(img)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    img = cv2.threshold(img, 220, 255, cv2.THRESH_BINARY)[1]
    img = Image.fromarray(img)
    
    words  = pytesseract.image_to_string(img).split(" ")
            
    for word1 in words:
        if ("\n\n" in word1):
            word1 = word1.split("\n\n")
        elif ("\n" in word1):            
            word1 = word1.split("\n")
        else:
            word1 = [word1]
        
        for word2 in word1:
            print(word2)
            pyag.typewrite(word2.replace(" ", "") + " ")
            time.sleep(0.2)
            
    if len(words) < 10:
        print("Done!")
        break
    
time.sleep(3)

browser.quit()

```

---
1. Selenium で[Typing Test English](https://10fastfingers.com/typing-test/english) にアクセス
2. Pillow で赤枠内の領域をキャプチャ
3. pytesseract でキャプチャした画像から英単語を抽出
4. PyAutoGUI で抽出した英単語を自動入力

↓こんな感じで動作します
![video.gif](https://qiita-image-store.s3.amazonaws.com/0/185448/8a6b2694-0a18-dc96-6686-546612a4f3d1.gif)


#結論
pytesseractによる光学文字認識や，PyAutoGUIによる自動キーボード入力を組み合わせることで，ブラウザ自動化の幅が大きく広がる．
Centos7でKindleを使う方法

プログラマーの方々には、Kindleを愛用しているひとも多いのではないでしょうか。重くかさばる本が、電子版で見れるのは便利ですよねー。
さらに、Linuxでみれたらいいですよねー。ということで、普段Centosを使っているので、CentosでKindleを読もうとしたら、思いのほか手こずったので、被害者？を減らすためにも、備忘録として。
（Ubuntuを使えば一瞬のようですが）

# Wineのインストール
Kindleは32bit用のアプリケーションです。そのため、通常通り、yumでインストールしたり、playonlinuxに頼ろうとすると、centos7の64bit版では動きません。

そのため、まずはwineを32bit用と64bit用でインストールします。
方法は以下のページにあります。
https://www.systutorials.com/239913/install-32-bit-wine-1-8-centos-7/

つぎに、wineのwindowsの設定がデフォルトでは、`WindowsXP`になっているので、以下のコマンドで、wineのコンフィグを起動してwindowsの設定を変更します。7以上がよいと思います。
```
$ winecfg
```

# Kindleのインストール
最新版のKindle(1.20)でインストールしようとすると、エラーになって使えません。`renderer-text.exe`が原因のようです。
そのため、旧ver(1.17)を使います。
1. 旧verを https://kindle-for-pc.jp.uptodown.com/windows よりダウンロードします。
2. コマンドラインから、インストールを行います。
```
$ wine KindleForPC-installer-1.17.44170.exe
```

エラーは出ますが、これでKindleを使えます。

## 補足
影響があったのかわかりませんが、wineのフォントは以下のコマンドでダウンロードできます。
```
$ winetricks allfonts
```

## 参考
https://www.systutorials.com/239913/install-32-bit-wine-1-8-centos-7/
http://myuon-myon.hatenablog.com/entry/2013/11/02/213209
https://www.mobileread.com/forums/showthread.php?t=283371
ブロック実行にはinstance_exec

ブロックの実行コンテキストを変えるのに`instance_eval`を使っていたら、`lambda`を投げたときに詰まってしまいました。

## 失敗するコード例

```ruby
fun = -> { p self }

1.instance_eval(&fun)
```

## 解説
[るりま](https://docs.ruby-lang.org/ja/latest/method/BasicObject/i/instance_eval.html)を読めばきちんと書いてあるのですが、`instance_eval {|obj| ... } -> object`とあるように、`instance_eval`にブロックを渡した場合、ブロックへの引数としてもオブジェクトが渡されます。

そして、`lambda`である以上引数の数が違えばエラーとなってしまうので、これではうまく動かないのでした。

## 解決策
ブロックの実行であれば別に`instance_exec`があって、こちらは呼び出し時に渡した引数がそのままブロックに渡される仕様となっています。`self`の変更をしたいだけなら、引数を一つも渡さなければ引数0個の`lambda`で問題なく動きます。
Project Euler の Problem 4 をやってみたら (その1)速度編

###追記
以下のプログラムは、回文のチェックを全部やってから、そのあとで最大値を求めるというアルゴリズムになっています。実質的には文字列への変換速度のベンチマークテストのようになってしまっています。実行速度はあまり意味がありませんので削除しました。

[(その2)](http://qiita.com/ki073/items/85fa93339113d9da8e94)にアルゴリズムの改良を行なっていますので、できればそちらの方もごらんください。


###本文
久々にHaskellで書いてみようと調べていたら、[HaskellとOCamlの速度を比較してみた](http://d.hatena.ne.jp/hideshi_o/20120823/1345732820)に出会ってしまいました。[Project Euler の Problem 4 (日本語訳)](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204)を解いているものです。

3桁だとあっいう間に終わってしまうので、4桁に拡張して時間稼ぎをしています。以下はほぼ上のリンクの丸写しですが、 :: [Int]を二箇所追加しています。

```Haskell:problem4.hs
n=maximum [xy| x<-[1000..9999] :: [Int], y<-[1000..9999] :: [Int], 
  let xy=x*y, let s=show xy, s==reverse s]
main = print n
```
Intの範囲で計算できる場合にはInt型の指定をするだけでそれなりに速くなります。(例では約1.2倍)

ついでにRubyでも書いてみました。

```ruby:problem4.rb
n=(1000..9999).flat_map{|x| (1000..9999).map{|y| x*y}}.select{|xy| (s=xy.to_s)==s.reverse}.max
puts n
```

4桁の掛け算を総当たりで回文をチェックして、最大値を出力する極めて単純なアルゴリズムです、

後に実行時間を書いていますが、Rubyが健闘しているのかHaskellが事の他遅いのか意外と接近しています。

C++は見ての通り超初心者なのですが、適当に書いても本来の速度がわかるはずという事で、

```C++:problem4.cpp
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
	int n=0;
	for(int x=1000; x<10000; x++){
		for(int y=1000; y<10000; y++){
			int xy=x*y;
			string s=to_string(xy);
			string s1=to_string(xy);
			reverse(s1.begin(), s1.end());
			if (s==s1 && n<xy){n=xy;}
		}
	}
	cout << n << endl;
}
```

ついでに超超初心者ながらもPythonも

```Python:problem4.py
n=0
for xy in [x*y for x in range(1000,10000) for y in range(1000,10000)]:
    s=str(xy)
    if s==s[::-1] and n<xy:
        n=xy
print(n)
```

初心者が書いたのでもっと効率的な書き方があると思います。
総当たりで調べるというアルゴリズムを崩さずに、その言語らしい書き方である程度速度が出るのでしたら、コメントをお願いします。
APEX5.1 Tips カレンダーの当日の色を変更する方法


APEXのカレンダーの当日はグレーで目立たない。
![tip1-1.gif](https://qiita-image-store.s3.amazonaws.com/0/165520/d8d73b5b-d911-cab6-cb03-4c80da6caed6.gif)


色を変更したいときはページ・デザイナの左ペインの最上位を選択し、
![tip1-2.gif](https://qiita-image-store.s3.amazonaws.com/0/165520/15dd393b-90ca-fd1f-d4cd-e9b8aeb57011.gif)

CSSのインラインに以下の文を追加すればグレーから好きな色に変更できます。

```
body .ui-widget-content.fc-today.ui-state-highlight {
    background-color: #ffff00;
}

```
ruby周りの設定をした

うまく投稿できるかのテストを環境設定したメモでする

気が向いたらちゃんと書くかも

参考にした記事
[MacでのRuby on Rails環境構築コマンドまとめ](http://qiita.com/SRAUFactory/items/d7b07b45b10408a42046)
[MacにHomeBrew,rbenv,bundlerをインストールする](http://qiita.com/shinkuFencer/items/3679cfd966f6a61ccd1b)


Blueprintを使ってAPIドキュメントを整備する

こんにちは@xsotaです。

ドキュメントの無いAPIを使ってのフロントエンド開発はつらいので、ドキュメントを整備しましょう。

ということで、APIドキュメントを作成する手順を残します。

GitHub Pagesとかで確認したいので、仕様書はHTMLで生成できるようにAPI Blueprintを使って書いてみます。

# docker使うパターン
nodeとかgulpとか準備するのダルいし色んなとこで使うだろうと思って、とりあえずで[docker image](https://hub.docker.com/r/xsota/blueprint-gen/)を用意しました。

docker-compose.ymlをこんな感じで書きます。

```docker-compose.yml
version: "3"

services:
  app:   
    image: xsota/blueprint-gen
    volumes:
      - ./md:/md
      - ./public:/public
```

upします。

```shell-session
$ docker-compose up -d
```

mdディレクトリができてると思うので、mdディレクトリ内に以下の内容でファイルを作成します。

これが仕様書になります。
仕様書の詳しい仕様は https://apiblueprint.org/ を確認してください。

```md:examole.md
FORMAT: 1A
HOST: http://example.com/v1

# Auth
## login [/auth/login]
### POST
#### 概要
emailとpasswordでログインを試みる。
成功した場合アクセストークンやらなんやらが返る。


- Request (application/json)
	- Attribute
        - email: hoge@example.com (required) - メールアドレス
		- password: h0g3Ho9e (string, required) - パスワード
		

- Response 200 (application/json)
	- Attribute
		- auth_token: 4uThT0K3n - auth token
```

mdディレクトリ以下の`.md`ファイルを監視しているので、ファイルを保存したタイミングでpublicにhtmlファイルが生成されているはずです。

以下の図のようになっていればOKです。



```shell-session
$ tree
.
├── docker-compose.yml
├── md/
│   └── example.md
└── public
    └── example.html
    
```

生成されていない場合は`docker-compose logs`で原因を調べてなんとかしてください。

生成されたHTMLはこんな感じで表示されます。
https://xsota.github.io/dockerfiles/blueprint-gen/public/v1/example.html
![スクリーンショット 2017-06-05 21.56.49.png](https://qiita-image-store.s3.amazonaws.com/0/113692/80ffcc15-6fe8-be03-737e-14370a40982c.png)



# docker使わないパターン
わしゃdockerは使いたくないんじゃ。という方は以下の手順で自力でやってください。

いろいろインストールします。

```shell-session
$ npm install -g gulp
$ npm install gulp gulp-watch gulp-aglio
```

gulpfile.jsを作成します。 gulpって何？って方はググってください。

```js:gulpfile.js
var gulp = require('gulp');
var aglio = require('gulp-aglio');
var watch = require('gulp-watch');

var src = 'md/**/'
var dest = 'public'

gulp.task('publish', function () {
    gulp.src(`${src}*.md`)
        .pipe(aglio({ template: 'default' }))
        .pipe(gulp.dest(dest));
});

gulp.task('watch', function() {
    return watch(src, () => {
	return gulp.start(['publish']);
    });
})
```

あとはgulp watchとかてきとうにやってください。

```shell-session
$ gulp watch
```

gulpとか使わないでもできます。
たぶんこれが一番シンプルなやり方ではないでしょうか。

```shell-session
$ npm install -g aglio
$ aglio -i md/example.md -o public/example.html
```

こんな感じで、APIのドキュメントを整備していけば引き継ぎの手間も減るし、みんなハッピーなんじゃないですかね。

まぁ、僕ドキュメント作ったこと無いのでよくわかりませんが。
Vueコンポーネント & Vuex テンプレ

最近フロントエンドはVue.jsで書くのがお気に入りです。
`vue-cli`を使えば `webpack` とかの面倒なセットアップの大半が一瞬で終わりますし、 `vue-loader` で1コンポーネント = 1ファイルにまとめられるから便利です。

ただ、細々とした注意事項が多くてややこしいので自分用にVue ComponentとVuexのテンプレを作っておくことにしました。
各自ご自由にお使いくださいませ。

# Vue Component
```js:Componnet.vue

import { mapGetters, mapState, mapActions, mapMutations } from 'vuex'

export default {
  components: {
    xxx,
  },

  data () {
    return {
    }
  },

  // アロー関数不可
  computed: {
    // getterのみ
    xxx: function() {
    },

    // getterとsetter両方
    yyy: {
      get: function(){
      },
      set: function(v){
      }
    },
    // Vuexのgettersをマッピング
    ...mapGetters(['xxx']),

    // Vuexのstateをマッピング
    ...mapState(['xxx'])
  },

  // アロー関数不可
  methods: {
    xxx: function () {
    },

    // Vuexのactionsをマッピング
    ...mapActions(['xxx']),

    // Vuexのmutationsをマッピング
    ...mapMutations(['xxx'])
  },

  // アロー関数不可
  watch: {
    xxx: function() {
    }
  },

  beforeMount() {
  }
}
```

## ポイント
- computed, methods, watchはアロー関数不可。
- Vuex の `mapGetters()`, `mapState()`, `mapActions()`, `mapMutations()` ヘルパを使うと、コンポーネントからVuexの直接参照を隠すことができる。

# Vuex
```js:sotre.js
export default new Vuex.Store({
  // strictモード。
  // 本番環境は無効にしておく。
  strict: process.env.NODE_ENV !== 'production',

  state: {
  },

  // stateに対する算出プロパティ
  // stateを直接触れる。
  getters: {
    // 引数なし
    xxx: (state, getter) => {
    },

    // 引数あり
    xxx: (state, getters) => (v) => {
    }
  },

  // dispatch()で呼び出される。
  // stateの直接触れてはいけない。
  // 非同期処理可
  actions: {
    // パラメータは、1つのハッシュ（オブジェクト）にまとめる。
    xxx (context, payload) {
      context.commit('xxx')
    }
  },

  // commit()で呼び出される。
  // stateを直接触れる。
  // 非同期処理不可
  mutations: {
    // パラメータは、1つのハッシュ（オブジェクト）にまとめる。
    xxx: (state, payload) {
    }
  }
})
```

## ポイント
- `actions`, `mutations` に引き渡されるパラメータは`payload`1つだけ。複数渡したい場合はハッシュにまとめる。