OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Codeでコマンドラインから新規ウィンドウでプロジェクトフォルダを開く


（小ネタ）


最近Visual Studio Code（VSCode）をMacで利用しています。
Atomのように複数プロジェクトを1つのウィンドウで開くことができないので、複数ウィンドウを立ち上げてプロジェクトごとに作業している感じです。
コードはもちろん、最近は現在取り掛かっている仕事に関する仕様やメモ書きなどを入れるフォルダを仕事単位で作成し、VSCodeで立ち上げています。
コマンドラインから開けたらいいなぁと言うのがあったので調べました。


# code

VSCode側が用意してくれているコマンドがありました。Windows/Macどちらにもあります。
Macの場合はCMD+Shift+Pで``shell command``まで入れると、候補にinstall code command in PATHというのが出てくるので選択します。これでTerminal上からcodeで呼び出せるようになります。

codeコマンドの詳細は以下。

https://vscode-doc-jp.github.io/docs/userguide/command-line.html

# 特定のフォルダを新規ウィンドウでプロジェクトフォルダを開く

本題です。本当はこういう風に書きたかった。

```
code -n -folder="hogehoge"
```

でもこれだと-nが動かず既存のウィンドウで開こうとしてしまいます。

```
code -n && code -folder="hogehoge"
```

そのためこのように書いてみたら想定通りに動いてくれました。

```vsc.sh
#!/bin/sh

code -n && code -folder $1
```

こんなスクリプトを書いて、PATHを通しておくと、``vsc .``とか``vsc hogehoge``で動かせますね。
July Tech Festa 2017スライドまとめ

自分用スライドまとめです。

2017/08/27開催　July Tech Festa
[公式HP](https://2017.techfesta.jp)

[A00:「ITエンジニアリングの本質」を考える](https://www.slideshare.net/mobile/enakai/it-78447313)

[A10:今日から始めるAnsible](https://www.slideshare.net/mobile/h-saito/ansible101)

[A20:Linuxコンテナの内部を知ってワンランク上のコンテナ遣いを目指そう](https://speakerdeck.com/tenforward/jtf2017
)

[A30:Google出身者が作った監視システム「Prometheus」を入門から運用まで徹底解説](https://www.slideshare.net/ssuser88ff5b/prometheus-79183671)

[A40:Kubernetes でクラスタリングして解決したことと新たに出てきた課題]
(https://speakerdeck.com/koudaiii/number-jtf2017)

[A50:どんなに頑張ったって運用の自動化もDevOpsも進まない。そう、テストがなければね](https://www.slideshare.net/yasuhiro_yamazaki/devops-jtf2017-a50)

[B20:標的型攻撃からどのように身を守るのか](
https://www.slideshare.net/abend_cve_9999_0001/ss-79184373)

[B30:Infrastructure as Code自身のテストを考える](
https://www.slideshare.net/TatsunoriSaito1/infrastructure-as-code-79200028
)

[C10:Internetトラフィックエンジニアリングの現実](
https://www.slideshare.net/tech_jstream/traffic-engineering-jtf2017)

[C30:コンテナのネットワークインターフェース その実装手法とその応用について](https://www.slideshare.net/s1061123/ss-79184035)

[D10:ブロックチェーン実践入門。30秒で39億円を集める「スマートコントラクト」の衝撃とその作り方]
(http://slides.com/urelx/learn-blockchain-with-bat-smart-contract)

[D20:情シスのひみつ。人とシステムをつなぐエンジニアリング]
(https://www.slideshare.net/cloretsblack/ss-79185381)

[E30:オープンソースコミュニティにおける英語が苦手な開発者の苦悩と奮闘記]
(https://github.com/masayukig/non-native-english-speaker)

[E40:ネットワークの検証やレビューにはもう正直疲弊したので全部プログラムで自動化できるようにしてしまえばいいと思った]
(https://speakerdeck.com/corestate55/jtf2017)

F10:Elasticsearchと科学技術ビッグデータが切り拓く日本の知の俯瞰と発見
[その1]
(https://www.slideshare.net/mobile/yasushihara/elasticsearch-15-spias)
[その2]
(https://www.slideshare.net/yasushihara/elasticsearch-15-spias)

[F20:強化学習による「Montezuma's Revenge」への挑戦](
https://www.slideshare.net/ItsukaraIitsuka/deepmind20166-unifying-countbased-exploration-and-intrinsic-motivation-pseudocount-montezumas-revenge)

[F30:急成長するサービスを支える DevOps 戦略と組織変革へのアプローチ]
(https://speakerdeck.com/kakakakakku/approaches-of-devops-and-organization)

[F40-2:cronやDHCPなど「あって当たり前な機能」の最新ツール事情2017]
(https://speakerdeck.com/habuka036/cronyadhcpnado-atutedang-tariqian-naji-neng-falsezui-xin-turushi-qing-2017)

[F40-3:機械学習に超入門したはずが・・・いつのまにかFPGAを触っていた話]
(https://www.slideshare.net/shihoasa/fpga-79188871)

[F50:博士学生が語る、4K/8K/VR配信基盤の最先端とコンテンツ配信の未来]
(https://www.slideshare.net/takumanakajima90/4k8kvr)
Ankoでdebugログが出力できない


ロガーにAnkoを導入しようと思い以下のようにコードを書きましたが、ログが出力されずに少しハマりました。
`info`関数を使えば出力されます。

```Kotlin
debug("hogehoge") 
```

原因はAnkoLoggerのログ出力は`Log.isLoggable`の値によって出力する/しないが決まる仕様のためです。
そしてこの`Log.isLoggable`の値を変更するには次のadbコマンドを実行する必要があります。

```bash
adb shell setprop log.tag.<ログレベルを設定したいタグ名> <ログレベル>
```

てっきりAndroidStudioからデバッグ実行するとログレベルがDEBUGになると思い込んでいましたが違うようでした。
AndroidのデフォルトのログレベルはINFOで、それを変更するには明示的にadbコマンドで指定する必要があるようです。

ログレベルをコードで指定出来ないのはちょっと不便な気もする。
gradleの設定とかでどうにかならないのかな。。。
Hadoop (HDP) を０から構築する方法

## Hadoop環境を構築したい
皆さんは自分用のHadoop環境をどの様に構築されていますか？
色んな方法があるようですが入り口からいろいろ模索してしまいました。
調査不足の面もあったり、構築の方法論にとどめていたりしますがご一読いただければと思います。

## 主な方法
1. ローカルVMでSandoBox
2. AzureでSandBox
3. AWSでSandBox
4. Hortonworks　Data Cloud
5. Ambariから構築

## 1. ローカルVMでSandoBox
[Hortonworks Sandbox with VirtualBox](https://2xbbhjxc6wk3v21p62t8n4d4-wpengine.netdna-ssl.com/wp-content/uploads/2015/05/Import_on_Vbox_5_11_2015.pdf)によると、メモリが自分のPCには厳しかったです。
最小4GB、AmbariやHBaseなどもろもろ載せるとホストOSに10GB、Sandboxに８GBが必要。

## 2.AzureでSandBox
kkitaseさまの記事が明快です。
[Azureで、Hortonworks Sandboxを使い、Hadoop、Sparkを試してみよう](http://qiita.com/kkitase/items/1d2e4662c2e8c9b0fd59)
自分もこの方法は良いなと思いやってみましたが少し自分のほしい環境と異なっていました。
- HDP2.5が提供されている（２０１７/８/17現在） →希望はHDP2.6（現バージョン）
- Hive2が入ってなかったです。（HDP2.5では入っていない）
- 最小４ノード構成（仮想サーバーを４台使う）

## 3. AWSでSandBox
CommunityサイトHCCに似たような質問がありました。
[HDP Sandbox on AWS?](https://community.hortonworks.com/questions/251/hdp-sandbox-on-aws.html)
ローカルVMをDLしてAWSのインストールイメージ（AMI）として使うのですが、AMIのところが自分には難しく、入力出来ない項目があり。
また、1回だけの作業ですが、10GB程度ローカルにDLするのとバケツにUPするのが一手間。
 `wget`とかできればいいのですが。

## 4. Hortonworks Data Cloud
手順など以下から。
[Hortonworks　Data Cloud](https://jp.hortonworks.com/products/cloud/aws/)
これは簡単でした。拡張の方法も同様に簡単です。
- 最小４ノード構成（仮想サーバーを４台使う）
- Hortonworksのソフトウェア・ライセンス費用が必要（若干ですが）

## できれば
今更ですがこんなのは無いのかなと？
- 最新のVersionで
- １台構成が可能で（自由に選択できる意味で）
- 構築手順がシンプルで
- 拡張時も同様の手順が使えて
- HiveやPigやecosystemのアプリ群はいろいろ入れたい
- 若干の費用は良いとして

## 5. Ambariから構築
そこでこれです。
あっさりAmbariから構築しちゃいましょう。
Ambariとはざっくり言うとHadoopの管理モジュールです。
`yum`で最新版を入れれます。アプリもクラスタ構成も好きにできます。1台でOKです。
[Apache Ambari Installation](https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/ch_Getting_Ready.html)
私はAWSのAmazon Linuxで構築しましたが問題なく、上述した自分の希望に一番あっている気がしました。

何かのお役に立てれば。

8/29　イントロの文言修正
Gitlabのサーバサイドフックでユーザ情報を得る

2017/11/16追記
Gitlabのアップデートによりユーザ名を直接得ることができるようになりました。
詳細はこちら（[Gitlabのサーバサイドフックでユーザ名を得る](https://qiita.com/dalance/items/0f84d887333632e7f6d7)）

# はじめに

Gitlabのrole/permissionはかなり大雑把で、branchへのpushに関するアクセス制御は2種類のrole(Develop/Master)による区別しかできません。そのため「特定branchについてDevelopのうち一部ユーザのみpushを許可する」といった運用はGitlab上では困難です。
（もちろんその一部ユーザをMasterにすれば出来ないことはないのですが、不必要な権限までついてきてしまいますし、すでにMasterのユーザに対して制限をかけることはできません）

そのような場合はgitのサーバサイドフックを使うことができます。
（Gitlabにおけるサーバサイドフックの設定は[こちら](https://docs.gitlab.com/ee/administration/custom_hooks.html)）
例えば`update`フックでpushしたユーザに応じてpushを拒否することが可能ですが、そのためにはフックスクリプトでpushしたユーザの情報を得る必要があります。

# Gitlabのサーバサイドフックにおけるユーザ情報

## 注意事項
この情報は公式ドキュメントには未記載のため、バージョンアップ等で使えなくなる可能性があります。動作確認した環境は以下の通りです。

|               |version|
|:--------------|:------|
| Gitlab CE     | 9.4.5 |
| Gitlab CE     | 9.5.1 |

## 環境変数`GL_ID`

ユーザ情報はフックスクリプトの実行環境に環境変数`GL_ID`として渡されます。
`GL_ID`の値は`key-X`です。`X`はssh鍵認証での鍵番号とのことで、手元の環境では`User ID`（User SettingsページのNameの隣に出ています）と同じになりましたが、詳細不明です。
API経由でユーザアカウントまで得られるようなのですが、フックスクリプトに
`echo $GL_ID`などとして調べれば十分かもしれません。

## 今後の見通し

公式ドキュメントでの記載はないのですが、実際に使っている人はいるようで、[あるMR](https://gitlab.com/gitlab-org/gitlab-shell/merge_requests/73)で`GL_ID`が参照出来なくなった際には、参照できるように[再修正](https://gitlab.com/gitlab-org/gitlab-shell/issues/53)が行われました。
実際にユーザがいて再修正も通っていますので急に使えなくなる可能性は低いと思われます。

ちなみに環境変数`REMOTE_USER`も[MR](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/13264)には上がっているので、将来的にはこちらが本命かもしれません。

# サンプル

最後に`GL_ID`を使った`update`スクリプトのサンプルを置いておきます。
以下では`master`ブランチに対して`key-10`ユーザのみpushを許可します。

```bash
#!/bin/bash

branch="$1"

if [ "$branch" == "refs/heads/master" ]; then
    if [ "$GL_ID" == "key-10" ]; then
        exit 0
    else
        echo "-------------------------------------"
        echo "[$branch] is protected"
        echo "-------------------------------------"
        exit 1
    fi
fi

exit 0
```
GnuPGの使い方メモ

全く覚えられないので最低限の情報を殴り書きしておく

## キーのリストの確認
```
$ gpg --list-keys
/home/k0kubun/.gnupg/pubring.gpg
--------------------------------
pub   4096R/12EE23DD 2017-05-15
uid                  Takashi Kokubun <xxx@gmail.com>
sub   4096R/4AA0B869 2017-05-15
```

pubがコード署名に使われ、subが暗号化などの用途に使われるらしい。
別のバージョンだと以下のような出力になる

```
$ gpg --list-keys
/home/k0kubun/.gnupg/pubring.kbx
--------------------------------
pub   rsa4096 2017-05-15 [SC]
      149033D7861A9117B2D34B8D6FFC433B12EE23DD
uid           [ultimate] Takashi Kokubun <takashikkbn@gmail.com>
sub   rsa4096 2017-05-15 [E]
```

## public key の export
```
$ gpg --armor --export [email]
```

## secret key ring file
gradleのsigning pluginとかで使う`signing.secretKeyRingFile`は`/home/k0kubun/.gnupg/secring.gpg`みたいなパスにある。
上記の出力の場合`signing.keyId`は`12EE23DD`を使えばよい

## keyserverへのキーの送信
やっておかないとgradleでは使えなかったりする。 http://keyserver.ubuntu.com:11371 に送信するには以下のようにする。

```
$ gpg --keyserver keyserver.ubuntu.com --send-key 12EE23DD
gpg: sending key 12EE23DD to hkp server keyserver.ubuntu.com
```

## gitconfigの設定
```
[user]
  signingkey = 149033D7861A9117B2D34B8D6FFC433B12EE23DD
```

`gpg --list-keys` でpubに出てくる奴を設定する。`git commit -S` すると使われる。

## gpg-agentの設定
`~/.gnupg/gpg-agent.conf` に以下のファイルを作る。TTL 8時間の例。

```
use-standard-socket
default-cache-ttl 28800
max-cache-ttl 28800
```

この設定は `gpg-connect-agent reloadagent /bye` でreloadできるらしい

## gpg-agentの起動
### Linux
```
$ sudo apt-get install gnupg-agent
```

以下のような `~/.config/systemd/user/gpg-agent.service` を作る

```
[Unit]
Description=GnuPG agent

[Service]
Type=simple
ExecStart=/usr/bin/gpg-agent

[Install]
WantedBy=default.target
```

その後、

```
$ systemctl --user start gpg-agent
$ systemctl --user enable gpg-agent
```

### macOS

```
$ brew install gnupg
```

TODO
TCPの仕組み

## コネクション確立
+ 3 way handshake
+ まず先にサーバ側(サービスを提供する側)がListen状態に入ってクライアントからのオープン要求を待ち、クライアント側が接続要求を送信することによって、TCP接続が確立される

## コネクション状態遷移
+ 接続種別
  + オープン(確立)
      + Active Open：自分から相手方に先にオープン要求を送信すること
      + Passive Open：相手からのオープン要求を待ち受けしてオープンすること
  + クローズ
      + Active Close：先にクローズ処理を開始すること。Active Close完了後は送信はできないが、受信はできる
      + Passive Close：Active Close処理開始後に、Active Closeの逆側()がクローズ処理を開始すること。Passive Close処理の完了をもって、接続が完全に切れる。
+ 状態一覧
 + LISTEN
     + Passive Openで、待ち受け状態。
 + SYN_RECEIVED
     + Active OpenのSYNに対してACKとSYNで応答し、それに対するACKを待っている状態。
 + SYN_SENT
     + Active Openで、SYNを送信した状態。
 + ESTABLISHED
     + TCP接続が確立した状態。データの送受信を行うことができる。
 + FIN_WAIT_1
     + Active Closeの最初の段階。FINを送信して、それに対する応答を待っている状態。
 + FIN_WAIT_2
     + 送信したFINに対するACKを受け取った状態。送信側のクローズ処理が終了し、相手からのFINを受信するのを待っている状態。
 + CLOSING
     + Active CloseでFINを送信した後、ACKが戻ってくるよりも先に、相手からもFINを受けた状態。
 + TIME_WAIT
     + CLOSING状態でACKを受けた状態。Active Close後のタイムアウト待ち状態。同じシーケンス番号やポート番号などを再利用しないように、パケットが受信しきるのを待つ。
 + CLOSE_WAIT
     + Passive Closeの状態。送信側にFINを送信したあとの状態。
 + LAST_ACK
     + CLOSE_WAITで送信したFINに対するACKを待つ状態。
 + CLOSED
     + 未使用もしくは使用済みでTCB(Transmission Control Block)の状態。netstatで表示されない。
+ 状態遷移図<p>
![tcp.gif](https://qiita-image-store.s3.amazonaws.com/0/107486/8542204a-0b99-18d9-a420-026b987eda2b.gif)

[ここから転載](http://www.atmarkit.co.jp/ait/articles/0402/13/news096_2.html)


## TCPの性能を実現する特徴
+ シーケンス番号
  + シーケンス番号によって、分割されたパケットのどの部分(パケット)まで受信したかを指し示している。
+ 再送機能
  + 送信に対するACKが返ってこない場合に、送信側が再度同じパケットを送信する機能。全く同じパケットを再送することによってどこでパケットが消失してもデータの整合性を担保できる
+ フロー制御/ウィンドウ制御
  + スライディングウィンドウ方式：パケット送信に対するACKの受信を待つことなく、連続してパケットを送信し、待ち時間を短縮する技術。

## GoogleのBBRについて
https://cloudplatform.googleblog.com/2017/07/TCP-BBR-congestion-control-comes-to-GCP-your-Internet-just-got-faster.html
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0ahUKEwiCs5mqqvjVAhVFjpQKHSZ7B_gQFggvMAE&url=http%3A%2F%2Fwww.publickey1.jp%2Fblog%2F17%2Fgoogletcptcp_bbrgoogle_cloud.html&usg=AFQjCNE03mObETnRbVJQD_YzVXtzBoa1IQ

## 参考
[RFC793](https://tools.ietf.org/pdf/rfc793.pdf)
[TCPの状態遷移](http://qiita.com/mogulla3/items/196124b9fb36578e5c80)
[信頼性のある通信を実現するTCPプロトコル](http://www.atmarkit.co.jp/ait/articles/0401/29/news080_2.html)
ざっくばらんメモ_4：kaggle, ACKTR, A2C, Semantic guide


###kaggle zillow challenge
pytorchによるCNNベースのregressionモデルの構築を開始する。
モデルのベースはresnetを利用する。
torchvisionのライブラリ内にresnetのモデルがあるためそれを利用したい。
このモデルはそのまま利用するとclassificationの出力となってしまうため、
最後の出力部のみ線形出力を行えるように修正しておく。

###[ACKTR, A2C from OpenAI](https://blog.openai.com/baselines-acktr-a2c/)
最近のOpenAIのRLに関するベースライン手法を解説。
A2Cは従来手法であるAsynchronous Advantage Actor Critic (A3C)をsynchronousかつdeterministic
にした手法。
synchronousかつdeterministicになったので、計算効率的が良くなり、アルゴリズム的にも扱いやすい
と思われるが、この手法で従来のA3Cと同等の性能が出せるとの事。
ACKTRは従来手法のTRPOやA2Cよりもさらに効率的な手法で、A2Cにさらに少量の計算処理を増やすことで
実現可能な手法である。
ACKTRはKronecker-factored Trust Region (KTR)と呼ばれる空間を見つけそれ上の探索を行う事でより効率的な
強化学習における探索を可能にする。
KTRはNatural Gradientに関連する二次オーダーの最適化手法の一つで、Natural Gradientの効率的な近似計算を可能にする。
この手法は従来のTRPOと比較して高速である。

### [Superresolution with segmantic guide](http://mtyka.github.io//machine/learning/2017/08/09/highres-gan-faces-followup.html)
最近良く見るようになってきた、semantic情報を援用した手法で、superresolutionに関するもの。
生成モデルにおける画像生成は、メモリや処理能力の問題から高解像度画像に対する適用が難しい。
StackGANなどの手法では段階的な生成を行う事で高解像度を実現しようとしている。
本記事では、そこで生成された画像をsuperresolutionの手法によってさらなる高解像度化を目指す。
具体的には、画像をcroppingし、抽出された画像と対応するsemantic segmentaion情報を共に
入力としたup-resolution networkを利用する。
ここでは、従来の画像入力だけのup-resolutionと比較して、semantic情報が付加されるため、
より高性能な高解像度化が可能になる。
これは高解像度化タスクが、対象画像に対するsemantic情報を多いに要求する事から性能向上が
理由付けできる。
興味深いのは、与える必要のあるsegmentation情報も別のモデルを用いて推論した結果を用いる事が
可能で、必ずしも人間により正確にラベル付けされたものを要求しない事である。
これは類似手法であるDeep Photo Style Transferでも行われている事である。
これは、異なる観点で学習されたモデルを組み合わせる事の効果（アンサンブル）を
示していると感じられた。
[クイズ]javascriptと仲良くなるための一歩　第４２話「this参照１」

#問題

```js
var obj = {
           x:3,
           doit: function(){ console.log("method is called." + this.x); }
          }
obj.doit(); //=> method is called.3

var fn = obj.doit;
var x = 5;
fn(); //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```js
var obj = {
           x:3,
           doit: function(){ console.log("method is called." + this.x); }
          }
obj.doit(); //=> method is called.3

var fn = obj.doit;
var x = 5;
fn(); //=> method is called.5
```
mailtrapを利用してメール送信のテスト

# メール送信テスト用のサービス
開発環境でのメール送信テストで，わざわざメーラとかを見に行ったり，余計なテストメールが増えて後で整理する(消す)のが面倒です．
送信できればOKのテストでは以下の無料のサービスを利用しています．

https://mailtrap.io

アカウントの登録は，メール，Github，Googleのいずれで可能です．

# 使い方
アカウント登録後，Inboxができるので，そちらのSMTP設定をのぞいてみます．
そうするとユーザIDやパスワード，HOSTなどが記載されており，また言語ごとのサンプルも記載されています．

```
■設定
SMTP
Host:	smtp.mailtrap.io
Port:	25 or 465 or 2525
Username:	*************
Password:	*************
Auth:	PLAIN, LOGIN and CRAM-MD5
TLS:	Optional
```

```
■サンプルソース
In config/environments/*.rb specify ActionMailer defaults for your development or staging servers:

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :user_name => '*************',
  :password => '*************',
  :address => 'smtp.mailtrap.io',
  :domain => 'smtp.mailtrap.io',
  :port => '2525',
  :authentication => :cram_md5
}
```
これらをもとに，自身の開発環境のConfigなり.envなりに記載すればOK．

# 確認
メール送信後，MailtrapにログインしてInboxをのぞけば，送ったメールがそちらにあります（実際のメーラとかには届きません）
そこでメールの内容を確認すればOKです．

ただし，無料は50通までで，それをOverすれば古いものから消されていきます．

個人的には，stg環境まではこのようなサービスを利用するのが良いと考えます．
（迷惑メールとかメールの整理とか不要なので）
TensorFlowを投資につかうまで 衝撃のサンプル編 (3)

#前置き
衝撃のサンプルとはGoogle公式の以下です。
[財務時系列データを使用した機械学習](https://cloud.google.com/solutions/machine-learning-with-financial-time-series-data)

TensorFlow1.3でN225の予測を試みます。
まだ機械学習に到達できまてん。

#証券取引所の取引時間を考慮

CSVを読み込みそのままだと同じ日付で処理してしまいますが、実際には日本の市場がおわってからアメリカの市場などがはじまります。
このため予測に使用できるデータは各インデックスでずらす必要があります。
公式のサンプルではあまり説明がありませんが、S&P500の予測を"アメリカ市場が始まる前に"実行しているという意味になっています。
日本の場合は日付変更線に近く早く市場がはじまるので日付はすべて前日のものしか使用できません。

対数差分を取得した後にN225以外のものを１日ずらします。

```python:study.py
    for index in INDEIES:
        closing[index] = closing[index] / max(closing[index])
        closing[index] = np.log(closing[index] / closing[index].shift())
        if index is not "N225" : # これと
            closing[index] = closing[index].shift()　# これ追加
```

また前回は相関を散布図行列で確認しましたが、数値でみてみます。

```python:study.py
    print(closing.corr()["N225"])
```

|N225   |  1.000000  |
|:------|:-----------|
|HSI    |  0.027631  |
|GDAXI  |  0.372748  |
|DJI    |  0.485095  |
|GSPC   |  0.488717  |
|SSEC   | -0.032805  |
|BVSP   |  0.320686  |

自己相関同様1が似ていて-1が真逆に似ているということですね。
HSIとSSECは関係なさそう。

2日ずらしてみると以下になります。

N225    | 1.000000  |
|:------|:----------|
HSI     | 0.014626  |
GDAXI   |-0.011343  |
DJI     |-0.040324  |
GSPC    |-0.041072  |
SSEC    | 0.004826  |
BVSP    |-0.015128  |

まったく意味をなさなくなりました。関係ないってことですかね。

#相関ってやっぱ偉い投資家の人は見てるの？

少し話がそれます。
なんとなく株などを行われている方はいろいろな相関関係を把握し取引しているんだろうなと思っていましたが、
これでプログラムで相関の高い銘柄をさがせるようになりました。
当然どっかにまとまった情報あるだろうと思って検索してみると以下が出てきました。

[Oanda Currensee](https://www.oanda.com/lang/ja/forex-trading/analysis/currency-correlation)
うん　今見てみるとしっかり内容が把握できます。

また日本の株価同士の相関もまとめられていたりしましたが、それでは予測ができないです。
しかしリスク分散の為相関の高い銘柄を集中して買わないという判断には使用できそうです。

できればねこそぎデータをいれて相関をだしていき精度の高い学習をさせたいのですが、チョー貧乏なのと機械学習の習得がメインなのでこのまますすめます。
次回より機械学習にやっとはいれるので短いのですがここで切ります。

前 [TensorFlowを投資につかうまで 衝撃のサンプル編 (2)](http://qiita.com/verizi/items/b002638b6738dcef5282)
次 [TensorFlowを投資につかうまで 衝撃のサンプル編 (4)](http://qiita.com/verizi/items/8ca3018de8a3f15dc2b1)
react-intlがmaterial-uiと併用すると動作しない場合がある

# react-intlが動作しなかった

**material-ui Ver0.16.7の話です（恐らくver関係ないと思いますが・・・）**
[material-ui](http://www.material-ui.com/#/components/text-field)の`<TextForm />`を使用していた時のこと。
`<TextForm />`の`props`に`errorText`というものがあり、そこにreact-intlの`<FormattedMessage />`を使用していました。

```javascript
<TextField
  errorText={<FormattedMessage id={'hoge'}/>}
  hintText={<FormattedMessage id={'hogehoge'}/>}
/>
```

という風に使用していました。
言語切り替えようのボタンを押すと、言語部分が再レンダリングされるという感じです。
しかし、なぜか私が作成した一部分だけが言語が切り替わっていませんでした。

## 原因
フォームにエラーメッセージを設定する際は、すでに構築されているフォームにエラーメッセージなどの更新処理を施すようにしていたのですが、そこが原因でした。

```javascript
ComponentWillMount() {
  // stateにフォームの内容を設定
  フォーム構築関数();
}

ComponentWillReceiveProps() {
  // setState()で更新処理
  すでに構築されたフォームに対して更新処理();
}

render() {
  return {
    <FormattedMessage id={'test'}/> // これは切り替わる
    <独自Component 
      data={this.stateに設定したformの内容}
    />
  }
}

```

言語を切り替えた際は、`ComponentWillReceiveProps`が動作するのですが、その際`<TextForm />`の内部で再レンダリングするかどうかを判断する処理が動き、結果再レンダリングさせないと判断されて言語が切り替わっていませんでした。
reactのライフサイクルには、`shouldComponentUpdate`というものがあります。
ここで`false`が返されると、再レンダリングが実施されないというものです。
もうお気づきかと思いますが、`<TextForm />`の中でこの処理が動作して、`false`が返されていたわけです。

### `<TextForm />`はなぜ再レンダリングしないと判断したか
material-uiはパフォーマンスのためか、`shouldComponentUpdate`の中で変更前と変更後の一致比較を行います。一致すれば再レンダリングを行いません。
言語を切り替えた際、`<FormattedMessage />`に変更はないので`shouldComponentUpdate`の中で一致してしまうわけです。（恐らく言語ファイルの参照先を帰るだけだから変更が起きないのかと・・・）

## 対応策
ベストな対応策では無いと思いますが、私はformをレンダリングのたびに再構築させることにしました。

```javascript
render() {
  const form = {
    // formの内容
  }
  return {
    <独自Component 
      data={form}
    />
  }
}

```

material-uiの一致比較の際、インスタンスが別であれば中身が同じであっても別物と判断されるのを利用しています。
今のところパフォーマンスに影響も出ていないので、問題無いかな・・・？

---
原因特定が難しくて、胃が痛かったです・・・
（原因がわかると理由は簡単なものでしたが、`<FormattedMessage />`単体はしっかり動作するので特定がかなり難しかったです・・・）
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第一章 知識をかみ砕く4

# ビジネスの活動・ルール
> 「名詞を見つける」ことに留まらない。ビジネスの活動やルールも、ドメインに含まれるエンティティと同じように、ドメインにとって中心的なのだ。

かっこいいのは以下の言葉・・・
> エンティティや値を超えてその先に行こうとする。

ビジネスの活動やルールの難しさは、複数のビジネスルールの間の矛盾の調整ですよね。

今、自分はECサイトを扱っていますが、機能を追加する度にこの矛盾の解決には頭を悩ませされます。

例えば、割引サービス。

「複数点購入で割引」や「セール期間中の割引」など複数の割引が両方適用される商品が購入されるときどうすうるか？などなど。

> 通常、ドメインエキスパートは、自分の頭のなかで起きているプロセスがいかに複雑かを意識することなく、仕事をする中でこれらのルールをすべて調べて矛盾を調整し、常識で考えたり隔たりを埋めている。だが、こういうことはソフトウェアはできない。

それを知識を噛み砕くことによって、明確にすることができるのだと思います。と思ったのですが、最後の一文。。。

> 知識を噛み砕くことによって初めて、ルールが明確となり、具体化されて、**折り合いがつけられるか、あるいはスコープから対象外と**なるのである。

矛盾があるビジネスルールは、必ずしもきれいな解決策があるわけではない。折り合いを付けるか、対象外とすることも多々あるのだということですね。

エンティティや値を超えてその先に行こう！
課題管理システム(ITS)とは？

# はじめに

最初のバグトラッキングシステムの登場から既に四半世紀が経過しましたが
ソフトウェア関連職の人と話していて「ITSってなに？美味しいの？」
という反応が返って来る事が今でも珍しくありません。

一方で、職場にITSを導入したいけど、周りが理解してくれなくて
困っている人も多いのではないでしょうか。

ここではそういう方々の助けになるよう、ITSがどんな味なのか、
なぜ美味しいかをまとめて行こうと思います。

なお、美味しくなるかは、プロジェクトに関わるメンバー全員が
ITSを正しく使えるかどうかにかかっています。
お箸も正しい使い方をしなければ、食事がうまく味わえませんよね。

# ITSとは

課題管理システム(ITS, Issue Tracking System)とは、簡単に言ってしまえば
todo付箋を電子化し、Webブラウザから電子掲示板ライクに扱えるようにした物です。

イメージ
![ExampleOfITS.png](https://qiita-image-store.s3.amazonaws.com/0/199141/68ec2a8c-a4b6-7b8f-3474-9d3e51fbd3ae.png)

この電子化されたtodo付箋は「チケット」と呼び、内容や誰がいつコメントしたか等が
データベースに保存され、課題の進捗を管理したり、あとから見直したりできます。

![ITSの図.png](https://qiita-image-store.s3.amazonaws.com/0/199141/f80e0fff-818d-3c57-3277-1dd28d9ede3c.png)

ITSは有料のもの、無料のもの、様々な種類があります。
比較表が英語版wikipediaがあるので参照して見て下さい。
https://en.wikipedia.org/wiki/Comparison_of_issue-tracking_systems
良く使われているのはRedmine, Trac, Jiraあたりでしょうか。

こう書いていると使っているのはWEBベンチャーだけと思うかも知れませんが、
近年は腰の重い日本のメーカーの間にも普及が進んでいます。
Todoを紙の付箋で管理していた企業も多く、それを電子化するだけなら
比較的スムーズに導入できるのです。

# 何が美味しいのか

他の記事と重複するかもしれませんが、個人的に特にメリットを享受した点を述べていきます。

## 議論に途中から割って入ることができる

口頭、電話、メールで検討を行う場合、特定の数人の中での
閉じた議論になり易く、そもそもの前提条件が間違っていても
気づけない事があります。

議論をITS上で行えば、上司や他チームが横から割って入って
早い段階で軌道修正できます。

経験上、これはかなり大きなメリットです。
もし前提条件の間違いを指摘されるのが実装まで終わった後なら、
また一から作り直しという事になりかねません。

もちろん、ITSを使えば絶対に防げる訳ではありません。
ただし、キーワードによるチケットの検索などがあるため、
間違いを指摘してもらえるチャンスが増えます。

## 伝言ゲームにならない

上と似た話ですが、身内だけで議論していた件が他の人も
巻き込む必要が出てきたケースです。

口頭や電話だとどうしても伝言ゲーム化し、話の経緯などが
上手く伝わらないことがあります。

ITSを使えば、相手にチケットを渡すだけで済みます。

## 転入者の戦力化がスムーズになる

ITS上のチケットは完了したら消滅する訳ではなく、
完了状態のチケットとして残り、後から見ることができます。

そのため、中途採用者や他部門から来た者が
ここから過去の経緯や事例などについて知ることができ
非常に速く戦力化できます。

また、チーム内だけで通じる一種の方言ができてしまう事がありますが、
ITSに残る過去のチケットが理解の助けになることがあります。

## ホウレンソウが簡単になる

今現在の進捗がITSを見るだけで一目瞭然になるなので、
状況をいちいちメールにまとめて報告する必要がなくなります。
何かに躓いている人を他の人が手助けするのも簡単になります。

またマネージャからしても、リアルタイムで進捗を見られるため、
遅れや問題が発生したときに早く気づけます。

もっと言えば、誰がどれだけ貢献しているかが把握しやすくなり、
個人のパフォーマンスの測定に使えます。

# 運用のコツ

個人的な経験ですが、以下は心がけた方がうまく運用できると思います。

## どの部分をITS上に切り替えるか

まず、メールは情報共有のためITS上のコメントで代替した方が良いです。
課題管理を付箋やExcelファイルで行っていたなら、それもITSでやりましょう。

しかし、口頭での相談はITS化するべきではありません。
問題を抱え込まずに報告しやすい雰囲気は他愛もない会話から
生まれることが多いと一般的に言われています。

ただし、議論の結果はITS上にコメントとして残しましょう。
宇宙世紀最強の量産MSについての結論とかなら書かなくて良いですが。

## ITS上でのコメントの粒度

「そんな事いちいちコメントするな」は禁句だと思います。
これを言われた結果、途中経過の報告を一切しなくなる人がいます。

例えば「○○APIの使い方、これもうわかんねぇな」といったコメントは
一番報告してほしい事項ですし、もしAPIの仕様が本当に変で
それを元にAPIの使用を変えるなら将来にわたって残したい情報です。
こういった進捗情報が報告され無くなる位なら、多少ノイズが乗る方が
遥かにマシではないでしょうか。

報告のフォーマルさで並べると、以下のような感じが好ましいと感じています。
メール > チャット・電話 > ITS上のコメント > 独り言

## できるだけたくさんの部署を巻き込む

ITSは巻き込む人が多ければ多いほど情報共有の効果が増して
コミュニケーションコストを低下させます。

セキュリティの観点からITS上に入れてはいけない人を除けば、
できるだけ増やした方が良いでしょう。

# 最後に

長々と書いてきましたが、いずれもITSを使わないと絶対に出来ない事ではありません。
メールや共有フォルダ上のExcelファイルでも工夫を凝らせば同じ事はできます。
ITSが使われるのは、現代人が狼煙や伝書鳩、飛脚を使わずメールを使うのと同じ理由なのです。

ITSについてさらに知りたいという方は、この辺りも見ておいた方が良さそうです。
http://slides.redmine.jp/
http://qiita.com/yuuta/items/865bff8d9d303fe3aa48
http://qiita.com/y_hokkey/items/3267f7f9b1ced05e0cc0

なお、投稿者はITSについて特別詳しいわけではないので、
ところどころ間違っているかも知れません。

何か見つけたらコメントください。
Jackson が変換・出力対象とするもの

Jackson の変換対象についてちょっと勘違いしていたことがあって、改めて調べ直したものをせっかくなので記事にしました。

# Jackson が JSON に出力してくれるもの

以下が条件となります。（過不足があればご指摘ください）

- public のフィールド
- public のゲッター
    - 対応するフィールドが**なくても**、get で始まるメソッドがあれば出力対象となる
    - boolean の場合は、is で始まる名前も対象となる
        - can とか has などはならないっぽい
- ここまでの条件に当てはまっていても、`@JsonIgnore` アノテーションをつけると対象外となる（つけるのはフィールドでもゲッターでもよい）

## サンプル

百聞は一見に如かず、ということで実際にやってみましょう。

### 変換対象クラス

```java:JacksonSampleObject.java
import com.fasterxml.jackson.annotation.JsonIgnore;

public class JacksonSampleObject {

    private Integer notOutputPrivate = 0;

    protected Integer notOutputProtected = 1;

    public Integer outputPublic = 2;

    private Integer outputPrivateWithPublicGetter = 3;

    public Integer getOutputPrivateWithPublicGetter() {
        return outputPrivateWithPublicGetter;
    }

    protected Integer outputProtectedWithGetter = 4;

    public Integer getOutputProtectedWithGetter() {
        return outputProtectedWithGetter;
    }

    private Integer getNotOutputPrivateGetter() {
        return 5;
    }

    protected Integer getNotOutputProtectedGetter() {
        return 6;
    }

    public Integer getOutputPublicGetter() {
        return 7;
    }

    @JsonIgnore
    public Integer notOutputPublicWithIgnoreAnnotation = 8;

    @JsonIgnore
    public Integer getNotOutputPublicGetterWithIgnoreAnnotation() {
        return 9;
    }

    private Boolean outputBoolean = true;

    public Boolean isOutputBoolean() {
        return outputBoolean;
    }

    public Integer isNotOutput() {
        return 10;
    }

    public Boolean getOutputBooleanGetter() {
        return true;
    }

    public Boolean canNotOutputBooleanMethod() {
        return false;
    }
}
```

### 実行クラス

```java:JacksonSample.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class JacksonSample {

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        System.out.println(mapper.writeValueAsString(new JacksonSampleObject()));
    }
}
```

### 実行結果

```json
{
  "outputPublic" : 2,
  "outputPrivateWithPublicGetter" : 3,
  "outputProtectedWithGetter" : 4,
  "outputBoolean" : true,
  "outputPublicGetter" : 7,
  "outputBooleanGetter" : true
}
```
Python入門②（条件分岐編）

#条件分岐

この記事は、[Python入門①（はじめの一歩）](http://qiita.com/kameda05/items/2c529a35e2695fd68424)からの続きです。

##条件分岐とは

**条件分岐(じょうけんぶんき)**とは、プログラムの処理を条件によって変えることです。
pythonでは、条件分岐を**if文(イフ)**で記述します。

```if1.py
# 数値を入力してもらう
x = input("input number : ")
# 文字列型を数値型に変換
num = int(x)
# もしもその数値が3ならば、メッセージを表示
if num == 3 :
    print "The Number is 3"
```
実行すると、数値のの入力を求めてきます。３と入れると、メッセージが出ますが、そうでなければ何も出ません。

if文のあとは、**:を入れて改行**してください。

①3を入力した場合の実行結果

```
input number : 3　　←　整数を入力
The Number is 3
```

②3以外の値を入力した場合

```
input number : 1
```

このように、ifを用いれば、条件分岐を記述することが可能です。

値の比較には、**比較演算子**を用います。比較演算子は、二つの値を比較するのに用います。

**比較演算子**

|演算子  |意味  |記入例|
|:---:|:---|:--:|
|==  |二つの値が等しいかどうかを調べる      |a == b |
|!=  |二つの値が等しくないかどうかを調べる  |a != b |
|>   |左辺が変より大きいかどうかを調べる  |a > b |
|<   |左辺が変より小さいかどうかを調べる  |a < b |
|>=  |左辺が変より以上どうかを調べる  |a >= b |
|<=  |左辺が変より以下かどうかを調べる  |a <= b |

## if else
いｆ
ある条件が成り立つときは処理Aを、成り立たないときは処理Bを、というときは、**if else**文が便利です。

```if2.py
x = input("input number : ")
num = int(x)
if num %2 == 0:
    print "even"
else:
    print "odd"
```
ifの場合と同様に、**elseのあとには:を入れて改行**してください。

プログラムを実行したら、「input number:」と出ますので、そのあとに整数を入力してください。偶数なら「even」と表示されます。

```
input number : 6
even
```
奇数ならば、「odd」と表示されます。

```
input number : 5
odd
```

と出力されます。

ここで出てくる**else**は、ifの条件が成り立たなかったときに実行される処理です。

##　elif

さらに、複数の分岐をする場合は、**elif**を用います。

```if3.py
x = input("input number : ")
num = int(x)
if num > 0:
    print "plus"
elif num < 0:
    print "minus"
else:
    print "zero"
```
ifやeleseの場合と同様に、**elifの後には:を入れて改行してください。**

今度は、入力した数が正の数であれば「plus」、負の数であれば、「minus」、ゼロであれば、「zero」と表示されます。

```
input number : 5　←　正の数を入力した場合
plus
```

```
input number : -2　←　負の数を入力した場合
minus
```

```
input number : 0　←　ゼロを入力した場合
zero
```

最初の**if**で、numが正の数（0より大きい）かどうかを調べます。そして、もしその条件に合致しなければ、次の**elif**で、今度はnumが負の数（0より小さい）かどうかを調べます。

そして、そのどの条件に合わない場合は、**else**の処理が実行されますが、最終的にそのような数は０しかないので、そのように判断して、結果を出力しています。

なお、**elifの数に制限はありません。**必要に応じて、いくつでも書いてもかまいません。

## 複数の条件

```if4.py
x = input("input number x : ")
y = input("input number y : ")

if x > 0 and y > 0:
    print("x and y are both plus.")
else:
    print("x or y is not plus.")
```

実行すると、x,yの２つの整数へのあたいの代入が行われます。この時、両方とも0より大きければ、

```
input number x : 5
input number y : 3
x and y are both plus.
```

と、表示され、どちらかが負の数であれば、

```
input number x : 6
input number y : -3
x or y is not plus.
```

となります。

**and**は、**複数の条件が成り立つかどうか**を判定します。このサンプルでは、x > 0とy > 0の両方が成り立つかどうかを判定します。

一方、**どちらか一方の条件が成り立つ**場合を判定したいこともあります。そんな時用いるのが、**or**です。

```if5.py
x = input("input number x : ")
y = input("input number y : ")

if x > 0 or y > 0:
    print("x or y is plus.")
else:
    print("x and y are not plus.")
```

入力した二つの数のうち、どちらか一方でもプラスであれば、以下のような結果が出ます。

```
input number x : 5
input number y : -2
x or y is not plus.
```

逆に、両方ともマイナスである場合、以下のようなメッセージが出ます。

```
input number x : -1
input number y : -2
x or y is not plus.
```

→　[Python入門③（繰り返し処理変）](https://qiita.com/kameda05/items/8ae2f2f638229a77c430#-break%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E6%8A%9C%E3%81%91%E3%82%8B%E3%82%B1%E3%83%BC%E3%82%B9)
[RaspberryPi][python]温度センサー＋IFTTTで室温をLINEに知らせる

#環境

- mac
- Raspberry Pi2 Model B 
- Raspbian JESSIE
- [デジタル温度センサ（１ｗｉｒｅ）DS18B20+](http://akizukidenshi.com/catalog/g/gI-05276/)
- python3.5.4

#1.温度センサーの準備

１wireのセンサーを使うので、RaspberryPiの/etc/modulesに以下を追記する

```
w1-gpio
w1-therm
```

/boot/config.txtに以下を追記する

```
dtoverlay=w1-gpio-pullup
```

センサーの接続は、

- センサーの1番ピン（GND）をRaspberryPiの6番ピン（GND）
- センサーの2番ピン（DQ）をRaspberryPiの7番ピン（GPIO4）
- センサーの3番ピン（VDD）をRaspberryPiの1番ピン（3.3V）

にします。
センサーの2番ピンと3番ピンをプルアップ抵抗でつなげています
参考：http://blog.livedoor.jp/victory7com/archives/33399310.html

![20170820002519.png](https://qiita-image-store.s3.amazonaws.com/0/106763/4c47510b-dd77-f6a8-3c15-cfafffe59a48.png)
![20170819235926.jpg](https://qiita-image-store.s3.amazonaws.com/0/106763/0cad94e0-bc70-617f-6e69-3b0f47f6d058.jpeg)

接続の確認はlsmodコマンドで。うまく接続できていれば、以下のようになります。

```lang:cmd
pi@raspberrypi:~/Documents/work$ lsmod | grep w1
w1_therm                6401  0 
w1_gpio                 4818  0 
wire                   32619  2 w1_gpio,w1_therm
```

取得した温度は「/sys/bus/w1/devices/28-XXXXXXXX/w1_slave」に書き出されます。
（28-XXXXXXXXのXXXXは、お使いの端末ごとにかわります）

```lang:cmd
pi@raspberrypi:~/Documents/work$ cat /sys/bus/w1/devices/28-00000723fabd/w1_slave 
b1 01 4b 46 7f ff 0f 10 8d : crc=8d YES
b1 01 4b 46 7f ff 0f 10 8d t=27062
```

「t=」の値を１０００で割った値が現在の温度です。

#2.IFTTTの準備

[IFTTT](https://ifttt.com/)にアクセスしてMy Appletから、レシピを作っていきます。

「this」には「Webhooks」を設定、「that」には「line」を設定します

設定後、 https://ifttt.com/services/maker_webhooks/settings にアクセスして、記載されているURLにアクセスして、キーを有効にします。

- eventは、Webhooks設定時に設定したイベント名
- valueは、LINEに送りたい値

「You can also try it with curl from a command line.」に続くcurlのコマンドを実行することで、設定したLINEの宛先に送信します

#3.pythonで結合する

RaspberryPiで、pythonで温度を取得して、IFTTTで設定したWebhooksのURLをリクエストして、LINEに室温を送信します。

温度を取得するライブラリをインストールします

```lang:cmd
pip install w1thermsensor
```

取得と送信は以下のようなコードで

```lang:python
from w1thermsensor import W1ThermSensor
import urllib.request, json

sensor = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "（センサーのデバイス名）")
temperature_in_celsius = sensor.get_temperature()

url = "https://maker.ifttt.com/trigger/（Webhooksのイベント名）/with/key/（Webhooksのキー）"
method = "POST"
headers = {"Content-Type" : "application/json"}

obj = {"value1" : temperature_in_celsius}
json_data = json.dumps(obj).encode("utf-8")

request = urllib.request.Request(url, data=json_data, method=method, headers=headers)
with urllib.request.urlopen(request) as response:
  response_body = response.read().decode("utf-8")
```

THERM_SENSOR_DS18B20は使用しているセンサーの型番に合わせてください。
センサーのデバイス名は２８−XXXXXXXXのXXXX部分です。
あとはこれをクーロンなどに設定すれば、室温を定期的に取得できます。
babel-transpiler gem でES6がES5にどう変換されるのか簡単に確認する方法

`() => {}` って一体何なんだよみたいなときにこんな感じで気軽に確認できます。

```rb
require "babel/transpiler"
puts Babel::Transpiler.transform(<<EOT)["code"]
() => {};
() => { 1 };
() => { return 1 };
() => 1;
let v = 1;
`v = ${v}`;
EOT
# >> "use strict";
# >> 
# >> (function () {});
# >> (function () {
# >>   1;
# >> });
# >> (function () {
# >>   return 1;
# >> });
# >> (function () {
# >>   return 1;
# >> });
# >> var v = 1;
# >> "v = " + v;
```

- `babel/transpiler` は `gem i babel-transpiler` すると使えるようになります。
- オンラインであれば https://babeljs.io/ で試す方がもっと簡単です。
OneToManyのリストフィールドの削除・更新の仕方

# 問題
- reposytoryに主キーでdeleteメソッドを送っても、当該レコードが削除されないらしく、再表示用のhdr検索で、dtlが検索されてしまう

- 以下のようなentityをもつ
- dtlEntityは子データ（明細）
- hdrEntityが親
- hdrEntityは、以下のようにリストフィールドにdtlEntityを持つ
- 
```java:HdrEntity
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "tMitsumoriHdrEntity")
    @JsonIgnore
    private List<DtlEntity> dtlEntity;
```

- コントローラ上で、dtlEntityをリポジトリのdeleteメソッドで削除を行うが、画面上では消えたように見えるが、画面を別のリクエスト後に生き返る、永続化がうまくできていないらしい

# 前提
- Spring-boot 3.7.1
- Spring Tool Suite Version: 3.7.1.RELEASE
- java

# 対策
## 1. 関連Entityの直接削除は行わない
- 関連を持つ場合、直接削除するとhdrの方にデータが残ってしまい、削除が戻ってしまう 

```
dtlRepository.delete(dtlEntity);
```

- だけだると、HdrEntityの方にまだそのdtlEntityが残ってしまっていて、消えない

## 2. orphanRemovealをtrueにする
- oneToManyに、orphanRemoval=true属性をつけないと、関連テーブルを削除してもメモリ上だけで、永続化がされない

```
// 明細テーブル
	@OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, fetch = FetchType.EAGER, mappedBy = "tMitsumoriHdrEntity")
	@JsonIgnore
    private List<DtlEntity> dtlEntity;

```
## 3. A collection with cascade="all-delete-orphan" was no longer referencedエラーの対処

- リストで関連entityをフィールドで持つとき、clearメソッドで関連づけをクリアしてaddして入れ直す、という方法で永続化を行わなければならない


- NG例

```
HdrEntity.setDtlEntity(saveDtlList);
HdRepository.save(HdrEntity);

```

- リストの項目数が変わる変更を行うとき、
- 消したいEntityをremove後のリストをフィールドに代入し、
- リポジトリのsaveで永続化を行なった場合
- 
```
A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance
```

- エラーが発生する



- 正しい

```
HdrEntity.getDtlEntity().clear();
HdrEntity.getDtlEntity().addAll(saveDtlList);
HdRepository.save(HdrEntity);

```

- 先に、Entityのリストが入るフィールドをclear()し、
- もう一度そのフィールドに変更後のリストを入れ直す

# 参考
>  HibernateException - A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance   
> http://cristian.sulea.net/blog.php?p=2014-06-28-hibernate-exception-a-collection-with-cascade-all-delete-orphan-was-no-longer-referenced-by-the-owning-entity-instance

----
> 5.2. データベースアクセス（JPA編    
> 5.2.2.11. Entityの削除処理の実装    
> https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/DataAccessJpa.html#id38

----
> JPAについて調べてみた   
> http://juzow.hatenablog.com/entry/20121017/1350480972
attr_encryptedを利用してカラムの暗号化・復号化を行う

# 記載内容の修正について(2017/9/21)
DBに`ssn`カラムを作成することによって可読性の低下や`attr_encrypted`の設定漏れによって平文のままデータが格納されてても気づきにくい問題を引き起こす可能性があるため、DBに`ssn`カラムを作成しない手順に修正しました。

# 参考
Github: [attr\_encrypted](https://github.com/attr-encrypted/attr_encrypted)

# 準備

## Gemfile

```ruby:Gemfile
gem "attr_encrypted", "~> 3.0.0"
```

```shell-session
$ bundle install
```

## DB設計

~~README通り、暗号化するカラム名は`ssn`とします。~~
【修正】REAEME通り、暗号化したssnを格納するカラムを用意します。

Usersテーブル

| カラム名 | 型 | 備考 | 
| :--- | :---| :--- |
| name | string | |
| ~~ssn~~ | ~~string~~ | ~~暗号化したいカラム~~【修正】ssnカラムは作成しない  | 
| encrypted_ssn | string | 暗号化されたデータが格納されるカラム | 
| encrypted_ssn_iv | string | 初期化ベクトルが格納されるカラム |


## Scaffold

Usersモデルに`name`,~~`ssn`~~,`encrypted_ssn:string`,`encrypted_ssn_iv`カラムを作成します。
【追記】`ssn`についてはscaffoldでフォームなどを自動生成させる目的で指定してます。

```shell-session
$ rails g scaffold user name:string ssn:string encrypted_ssn:string encrypted_ssn_iv:string
```

## Migration
【修正】DBにssnカラムが作成されないように`t.string :ssn`をコメントアウトします。
【補足】コメントアウトしない場合、DBに`ssn`カラムが作成されますが`attr_encrypted`が正常に動作すれば`ssn`カラムに値は登録されず、空のカラムになります。

```ruby:db/migrate/YYYYMMDDhhmmss_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :name
      # t.string :ssn DBにssnカラムが作成されないようにコメントアウトする
      t.string :encrypted_ssn
      t.string :encrypted_ssn_iv

      t.timestamps
    end
  end
end
```

## Migration

```shell-session
$ rake db:migrate
```

## Model

【追記】`ssn`アクセサを追加します。
User.ssnに値を指定した状態でsaveすることで,`encrypted_ssn`,`encrypted_ssn_iv`カラムに暗号化したデータが登録されます。また、User.ssnを参照することで復号化されたデータを取得することができるようになります。

```ruby:app/models/user.rb
class User < ApplicationRecord
  attr_encrypted :ssn, key: 'This is a key that is 256 bits!!'
end
```

# データの登録

`ssn`カラムに暗号化させたい値を入力して登録します。

![attr_encrypted1.png](https://qiita-image-store.s3.amazonaws.com/0/141934/9f8f81d5-a861-e7a5-4242-2588c69c275d.png)

# データの取得

~~`ssn`カラムに登録した値が表示されてるが、DBの`ssn`カラムは空なので、正常に暗号化・復号化されてることがわかります。~~
【修正】`encrypted_ssn:string`,`encrypted_ssn_iv`に暗号化したデータが登録されてることがわかります。
DBに`ssn`カラムは存在しませんが、画面上には暗号化前と同じデータが表示されてるため、復号化も正常に行われたことがわかります。

![attr_encrypted_5.png](https://qiita-image-store.s3.amazonaws.com/0/141934/b8ee6001-1569-c5cf-42b2-e9f807c36d76.png)

<img width="432" alt="attr_encrypted_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/d3afef7d-f98c-2023-2c72-36b9d73ea030.png">
【rails】ログイン無し、sessionでユーザー管理

# やりたいこと

ログイン無しでユーザーの特定をできるようにサイトに来たら自動でユーザーを作成し、そのidをsessionにため、投稿などをした時にそれを元にユーザーを判別するようにする。

# DBの作成

* id:integer・・・userのid

このカラムを作成。idなのでintegerで十分かなと。

# controller

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :createlogin
  def createlogin
    if session[:user_id]
      @current_user = User.find_by(id:session[:user_id])
    else
      @current_user = User.new
      @current_user.save
      session[:user_id] = @current_user.id
    end
  end
end
```

サイトに来た際にuser_idを発行し、すでにブラウザにuser_idがセットされていたらそのuser_idを元にユーザーを特定するコードを共通のapplication_controllerに記述。ここに書いたのはどのページでもこのアクションを通るように。

追記

```ruby:application_controller.rb
  def createlogin
    if session[:user_id] == User.find_by(id:session[:user_id])
      @current_user = User.find_by(id:session[:user_id])
    else
      @current_icon_id = rand(0..9)
      @current_icon_color_id = rand(0..9)
      @current_user = User.new(icon_id: @current_icon_id,icon_color_id: @current_icon_color_id)
      @current_user.save
      session[:user_id] = @current_user.id
    end
  end
```

前のやり方だとdbをなんらかの理由で掃除してidがなくなった際もブラウザに残っているとuser_idがあるかのように動作してしまう。本番だとあまりありえないが開発中はcookieを消したりするのでDBと同じsession[:user_id]があったらという条件に変更した。

さらに追記

```ruby:application_controller.rb
  def createlogin
    if User.find_by(id:session[:user_id])
      @current_user = User.find_by(id:session[:user_id])
    else
      @current_icon_id = rand(10)
      @current_icon_color_id = rand(10)
      @current_user = User.new(icon_id: @current_icon_id,icon_back_id: @current_icon_color_id)
      @current_user.save
      session[:user_id] = @current_user.id
    end
  end
```

もっとコードを簡単にするためにfind_byで探してきて無かったらユーザーを生成するようにした。


# form

```ruby:show.html.erb
<%= form_tag("/posts/comment") do %>
<form>
 <div class="form-group">
  <textarea name="comment" class="form-control"></textarea>
  <textarea name="post_id" class="hidden"><%= @post.id %></textarea>
 </div><!--form-group-->
 <button type="submit" class="btn btn-primary">保存</button>
<% end %>
```

<textarea name="post_id" class="hidden"><%= @post.id %></textarea>でpost_idを送っているがあまり美しい感じではない。。。
DHCPの仕組み

## DHCPとは
+ Dynamic Host Configuration Protocol
+ L7(アプリケーション層)プロトコル
+ 構成要素
  + DHCPサーバ：クライアントにIPアドレスを割り当てる。Windowsサーバ/Linuxサーバ/ルータに構築。
  + DHCPクライアント：IPアドレスを割り当てられる端末。
+ DHCPサーバ向けのパケットはUDP:67で、DHCPクライアント向けのパケットは、UDP:68を使用。


## DHCPの仕組み
+ IPアドレスをクライアントに割り当てるまでの流れ(同一セグメントにクライアントとサーバがある場合)


1. DHCP Discover
 + クライアントからブロードキャストでDHCP Discoveryメッセージを送信し、ネットワーク全体に問い合わせる
     - そのときのパケットの中身

|送信元MACアドレス|宛先MACアドレス|送信元IPアドレス|宛先IPアドレス|送信元ポート|宛先ポート|DHCPメッセージ|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|クライアントのMACアドレス|FF:FF:FF:FF:FF:FF|0.0.0.0|255.255.255.255|68|67|DHCP Discover|


2. DHCP Offer
    + サーバ側でアドレスプールから割り当てるIPアドレスを選択し送信。
    + そのときのパケットの中身

|送信元MACアドレス|宛先MACアドレス|送信元IPアドレス|宛先IPアドレス|送信元ポート|宛先ポート|DHCPメッセージ|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|サーバのMACアドレス|FF:FF:FF:FF:FF:FF or クライアントのMACアドレス|サーバのIPアドレス|255.255.255.255|67|68|DHCP Offer + 割り当てるDHCPクライアントのIPアドレス + DHCPサーバのIPアドレス|


3. DHCP Request
    + クライアントは割り当てられたIPを使用する通知をブロードキャストで送信。まだこの時点では設定情報がなく、割り当てられていない。
    + そのときのパケットの中身

|送信元MACアドレス|宛先MACアドレス|送信元IPアドレス|宛先IPアドレス|送信元ポート|宛先ポート|DHCPメッセージ|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|クライアントのMACアドレス|FF:FF:FF:FF:FF:FF|0.0.0.0|255.255.255.255|68|67|DHCP Request + 割り当てるDHCPクライアントのIPアドレス + DHCPサーバのIPアドレス|


4. DHCP Ack
    + サーバが割り当てるIPアドレスの情報をクライアントに送信。
    + そのときのパケットの中身

|送信元MACアドレス|宛先MACアドレス|送信元IPアドレス|宛先IPアドレス|送信元ポート|宛先ポート|DHCPメッセージ|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|サーバのMACアドレス|FF:FF:FF:FF:FF:FF or クライアントのMACアドレス|サーバのIPアドレス|255.255.255.255|67|68|DHCP Ack + DHCPクライアントのIPアドレス + Gatewayやsubnetなどの情報|


+ ※DHCP Offer/DHCP Ackはブロードキャストもしくはユニキャストで送信される。DHCP Discovery内のブロードキャストフラグ次第でどちらかに決まる。

+ IPアドレスのリース更新の流れ
  1. DHCP Request
     - クライアントがサーバにリース期限更新のリクエストを送る
  2. DHCP Ack
     - サーバがクライアントに要求を許可するメッセージを送信する。


+ IPアドレスの解放までの流れ
  1. DHCP Release
     - クライアントがサーバにリリース依頼のリクエストを送信。


## なぜDHCPクライアントがDHCP Offerの情報をそのまま使わないのか？
 + DHCPサーバがネットワーク上に複数台存在する場合があり、その際に他のすべてのDHCPサーバにどのDHCPサーバからの設定情報を使用するか通知する必要があるため、DHCP Requestによってブロードキャストで送信し、通知している

## DHCPリレーエージェント
+ L2を超えた先にDHCPサーバが存在する場合(=ルータの先にDHCPサーバが存在する場合)、DHCPリレーエージェントを設置する必要あり
+ ブロードキャスト通信は、ルータ(L3)を越えられない(ルータがパケットを破棄する)ため。
+ DHCPリレーエージェントとは？
  + ルータがリレーエージェントになることが多いが、サーバにソフトウェアを入れて構築することも可能
  + DHCPクライアントが送信したDHCP Discovery/OfferパケットなどのブロードキャストパケットをユニキャストでDHCPサーバに転送する役割
  + その後、DHCPサーバはDHCPリレーエージェントにユニキャストで応答し、DHCPリレーエージェントは、ブロードキャストでDHCPクライアントに送信する
Angular CLI で作成したアプリをHerokuへデプロイする方法

## 事前準備
- Herokuのアカウトを作成する
- Heroku上にアプリを作成する
- [Heroku CLIをインストールする](https://devcenter.heroku.com/articles/heroku-cli#download-and-install)

事前準備は以下を参考に作成する
[Herokuにアカウント登録してアプリを作成する](https://codenative.xyz/stacks/heroku/signup-for-heroku-and-create-a-new-app)

## ng new で作成したPJにすること
### express をインストール
```
cd your-app-name
npm install express --save
```

### pacage.jsonの記述を変更する
- scripts内のstartの内容をnode server.jsに変更
- scripts内にpostinstallを追加

```
  "scripts": {
    "start": "node server.js",
    "postinstall": "ng build --aot --target=production"
  },
```

- devDependenciesに記述されているangular系とtypescriptをdependenciesへ移動する

- enginesを追加する

```
  "engines": {
    "node": "6.10.3",
    "npm": "3.10.10"
  }
```

### 参考のpackage.json

```
{
  "name": "your-app-name",
  "version": "0.0.0",
  "license": "MIT",
  "angular-cli": {},
  "scripts": {
    "ng": "ng",
    "start": "node server.js",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "postinstall": "ng build --aot --target=production"
  },
  "private": true,
  "dependencies": {
    "@angular/cli": "1.2.7",
    "@angular/common": "^4.0.0",
    "@angular/compiler": "^4.0.0",
    "@angular/compiler-cli": "^4.0.0",
    "@angular/core": "^4.0.0",
    "@angular/animations": "^4.0.0",
    "@angular/forms": "^4.0.0",
    "@angular/http": "^4.0.0",
    "@angular/platform-browser": "^4.0.0",
    "@angular/platform-browser-dynamic": "^4.0.0",
    "@angular/router": "^4.0.0",
    "@angular/language-service": "^4.0.0",
    "core-js": "^2.4.1",
    "express": "^4.15.3",
    "ng2-bootstrap": "^1.6.3",
    "rxjs": "^5.4.1",
    "tslint": "~5.3.2",
    "typescript": "~2.3.3",
    "zone.js": "^0.8.14"
  },
  "devDependencies": {
    "@types/jasmine": "~2.5.53",
    "@types/jasminewd2": "~2.0.2",
    "@types/node": "~6.0.60",
    "codelyzer": "~3.0.1",
    "jasmine-core": "~2.6.2",
    "jasmine-spec-reporter": "~4.1.0",
    "karma": "~1.7.0",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-coverage-istanbul-reporter": "^1.2.1",
    "karma-jasmine": "~1.1.0",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.1.2",
    "ts-node": "~3.0.4"
  },
  "engines": {
    "node": "6.10.3",
    "npm": "3.10.10"
  }
}

```


### server.jsを作成する
- your-app-name 直下に作成する

```
const express = require('express');
const app = express();
app.use(express.static(__dirname + '/dist'));
app.listen(process.env.PORT || 8080);
const path = require('path');
app.get('/*', function(req, res){
  res.sendFile(path.join(__dirname + '/dist/index.html'));
});
console.log('Server listening on port 8080');
```

## Heroku へデプロイ

```
heroku login
# gitが初めての場合、git initする

heroku git:clone -a [heroku-app-name]
cd your-app-name
git add .
git commit -am "make it better"
git push heroku master
```
[参考コード GitHub](https://github.com/DotaKobayashi/angular-gallery)
vue.jsのv-forで選択された情報を取得して何かしたい

# こんな時どうする？
例えばv-forでテーブルを作成した際に、選択されたレコードの情報を使って何かしたい

# やりかた
オブジェクトでの例

```html
・・・

<table>
  <tbody>
    <tr v-for="item in items" @click="select(item.name)">
      <td>{{ item.name }}</td>
    </tr>
  </tbody>
</table>

・・・
```

```javascript
new Vue({
  data: {
    items: [{name: 'hoge'}, {name: 'fuga'}, ・・・]
  },
  method: {
    select: function (itemname) {
      alert(itemname)
    }
  }
})
```
これでいけました。
二段階認証をOnにしたGithubとbitbucketにTortoiseGitでアクセスする方法

#はじめに

github と bitbucketを遅まきながら使おうとして、TortoiseGitからアクセスするのに四苦八苦しました。

二段階認証をONにしていて、HTTPSでgithubとbitbucketにアクセスするためのメモ書きです。

※たぶん、TortoiseGitじゃなくても、コマンドラインのGitでも使えると思います。

#前提条件
* windowsつかい(筆者はWindows10つかい)
* [TortoiseGit](https://tortoisegit.org/)つかい & 、[TortoiseGit](https://tortoisegit.org/) & [git for windows](https://git-scm.com/)のセットアップ済み
* githubもbitbucketも2段階認証はOnの方

#ダウンロード

マイクロソフトがOSSで公開してくださっている[Microsoft/Git-Credential-Manager-for-Windows](https://github.com/Microsoft/Git-Credential-Manager-for-Windows)のバイナリの最新版を[ダウンロード](https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases)する。
※2017/08/27時点では、v1.12.0が最新です。

#インストール
1. ダウンロードしたインストーラーをダブルクリックする
1. [windowsのUACの画面](https://www.google.co.jp/search?q=windows10+uac&num=100&safe=off&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjvhqWHrffVAhXHwrwKHcx6AjMQ_AUICigB&biw=987&bih=828#imgrc=9q9ZHXz4hqFU6M:)がでるので、「はい」を選択
1. ライセンスの同意画面がでるので、「I accept the agreement」にチェックをいれ、「Install」をクリック。
![ライセンス同意画面](https://qiita-image-store.s3.amazonaws.com/0/133291/d68be50e-8503-452b-1e3f-d4ff55587175.png)
1. プログレスバーが一瞬でますが、すぐさま終了
![インストール完了画面](https://qiita-image-store.s3.amazonaws.com/0/133291/47a4a933-0468-3338-fca7-2a3fd44780f2.png)
 
 これで準備は完了です。


#githubにアクセスする

1. TortoiseGitでgithub上の自分のリポジトリをクローンする
1. ちょこっと修正をしてTortoiseGitでプッシュする
1. githubへのログイン画面が開きますので、usernameとpasswordを入力します。![プッシュ画面でGithubのログイン画面が表示されます。](https://qiita-image-store.s3.amazonaws.com/0/133291/7c53aa6e-aec3-344e-4791-b061e2cbd911.png)
1.  次に2段階認証の画面が開きますので、二段階認証のパスコードを入力します。![プッシュ画面で二段階認証の画面が表示されます。](https://qiita-image-store.s3.amazonaws.com/0/133291/885f93d1-6698-e071-1461-9ec3d77dde95.png)
1. プッシュ完了

以後は、トークンの有効期限が切れるまでパスワードを聞かれずに利用ができます。

仕組みとしては、自動でパーソナルアクセストークンが追加されます。下図は、github上の設定画面の「Personal Access token」の画面です。赤枠の部分が自動的に追加されたトークンになります。
![github上のPersonal Access Tokenの画面](https://qiita-image-store.s3.amazonaws.com/0/133291/4665d5c7-3774-9a82-2e0d-7792f0eb97ad.png)


#bitbucketにアクセスする
1. TortoiseGit自分のリポジトリをクローンする
1. ちょこっと修正をしてTortoiseGitでプッシュする
1. bitbucketのログイン画面が開きますので、Eメール＆パスワードを入力します。
![bitbucketのログイン画面](https://qiita-image-store.s3.amazonaws.com/0/133291/d28ac068-f85e-6b3e-f121-64942aeedabb.png)
1. OAuth認証のダイアログがでますので、「Autthorize」をクリックします。
![OAuth画面](https://qiita-image-store.s3.amazonaws.com/0/133291/fb651beb-af44-d1a6-7365-f5452754f100.png)
1. 自動的にブラウザを開いて、ブラウザ上でbitbucketにログイン済みならば、認可される権限リスト(下図)が表示されます。ここで「アクセス許可する」をクリックします。未ログインの場合は、ログイン後に表示されると思います(未確認)。
![ブラウザ上の権限確認画面](https://qiita-image-store.s3.amazonaws.com/0/133291/a710aeca-290e-54ad-c8b2-e1e6d638ef26.png)
1. 「認可」が完了した画面が表示されます。
![ブラウザ上の認可完了画面](https://qiita-image-store.s3.amazonaws.com/0/133291/997776ce-465e-1221-9005-51aeac99d0cc.png)


以後は、トークンの有効期限が切れるまでパスワードを聞かれずに利用ができます。

こちらの仕組みは、OAuthになります。
bitbucketの管理画面で確認すると、sourcetreeのWindows版という認識のようです。

![ScreenClip5.png](https://qiita-image-store.s3.amazonaws.com/0/133291/6c945950-ad7b-f0ff-ef2d-6e5e2e53da53.png)
【UnityError】The function parameters have to be of type:~~の解決


# 概要
Unityの開発における理解不能なエラーへの対処方法第一弾。

ある日、コードを書いているとUnityEditorに戻った際にコンソールにエラーが出ているのを確認した。
以下メッセージ。

```
Script error(Player): OnStateEnter.
The function parameters have to be of type: {OnStateEnterの引数}
The function will be ignored.
```

状況としては、MonoBehaviourを継承したPlayerというクラスにOnStateEnterというメソッドを定義した時のこと。
メソッドにはいくつかの引数を与えている。
そして、このメソッドを外部のクラスでAction型でpublic宣言されているコールバック変数に対して代入した時にエラーが起きた。

要は、外部のクラスで色々処理が行われているんだけど、その処理の中でStateEnterというタイミングでこのメソッドを呼び出してほしかったのだ。

# 環境
Windows10
VisualStudio2017
Unity5.6.2f

# 解決策
メッセージの内容をGoogle先生に翻訳してもらうと、以下の回答。

```
関数のパラメータは型でなければならない
```

ふむ。わからん。

ということで、そもそもこのメソッドの宣言自体に問題がありそうだったので、試しに``OnStateEnter``ではなく``OnStateAAAAAAAAAAAAAAAAAAAAEnter``にしてみたところ、案の定エラーがでなくなったので何か定義済みのメソッドと名前が被っているのだろうという考えに至った。

命名を変更して終了。

# 後日談
名前を変えることで対処したのだが、原因がわかっていない。
そこで、``Unity OnStateEnter``という検索でGoogle先生に聞いてみたところ、``StateMachineBehaviour``の記事しか出てこない。
多分、例のコールバック変数を持っているクラスが``StateMachineBehaviour``を継承しているせいで型の解決に不具合が生じているんだと思う。
（結局、確証は得られていない）

詳しく知っている人いたら教えてください。

終わり。