OmniAICreator/Qiita-1.07M huggingface dataset:
numpy行列積　メモ

行列積周りで混乱したところをメモ

#画像の畳み込み計算
imgのテンソルとkernelのテンソルの積に`np.tensordot`を使う。引数の`axis`は1つの画像が格納されている次元`(1,2)`を指定する。

```python
img_tensor = [[[0, 0],
               [0, 0]],
              [[1, 1],
               [1, 1]],
              [[3, 3],
               [3, 3]]]
    kernel = [[[0, 0],
               [0, 0]],
              [[1, 1],
               [1, 1]],
              [[2, 2],
               [2, 2]]]
    out = np.tensordot(img_tensor, kernel, axes=((1, 2), (1, 2)))
    print(out)
    print(np.shape(img_tensor), np.shape(kernel), '=>', np.shape(out))

-----------------
[[ 0  0  0]
 [ 0  4  8]
 [ 0 12 24]]
((3L, 2L, 2L), (3L, 2L, 2L), '=>', (3L, 3L))
```


#データ間の内積をまとめてやりたい

$({\bf i,j})$と$({\bf k,l})$から$({\bf i}\cdot{\bf k},~{\bf j}\cdot{\bf l})$を計算したい場合、アダマール積と`np.sum`で各要素の内積を計算する。（もっといいやり方ある？）

```python
a = np.arange(4).reshape((2,2))
    b = a[::-1,::-1]
    c = np.sum(a*b,axis=1)
    print("---a---")
    print(a)
    print("---b---")
    print(b)
    print("---c---")
    print(c)

---a---
[[0 1]
 [2 3]]
---b---
[[3 2]
 [1 0]]
---c---
[2 2]
```
「確率プログラミングの世界：論理と確率をつなぐ人工知能」メモ

先日開催された「確率プログラミングの世界：論理と確率をつなぐ人工知能」(主催: 産業技術総合研究所人工知能研究センター)を聞いてきたので簡単なメモを残してみる。

結論からいうとよくわからなかった...

人工知能の発展とともに、確率的な振舞いを表現できるような界面言語が求められている、というような話だったように思う。

とりあえず、ディープラーニングを使うならEdward、そうでなければPRISMを使っておけばよいらしい。

## 「確率プログラミングの発展と記号的確率モデリング言語PRISM」
- 確率プログラミングの発展の歴史とか概念的な部分の話
- PRISM(確率モデリング言語としてはかなり歴史があるらしい…)の話

## 「深層学習と確率プログラミングを融合したEdwardについて」
- Pythonライブラリ
- TensorFlowの計算グラフ上に確率モデルを構築する
- 実例が多めでイメージがしやすかった

## 資料
http://www.airc.aist.go.jp/seminar_detail/seminar_017a.html
kerasメモ

kerasはtensorflow 1.1あたりからtensorflowに取り込まれた。
tensorflowさえインストールすればkerasは別途インストールする必要はなし。

keras/examples/mnist_cnn.pyを動作させるさせるには以下の変更が必要(tensorflow 1.3.0にて確認)。

```py3:mnist_cnn.py(変更前)
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
```

```py3:mnist_cnn.py(変更後)
import tensorflow.contrib.keras as keras
from tensorflow.contrib.keras.python.keras.datasets import mnist
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Dense, Dropout, Flatten
from tensorflow.contrib.keras.python.keras.layers import Conv2D, MaxPooling2D
from tensorflow.contrib.keras.python.keras import backend as K
```
ChainerでのEarly stoppingを再考する

# tl; dr

* `extensions.MinValueTrigger`とスナップショットを組み合わせると、chainerで簡単にearly stoppingが実現できる。
* 実装は[gist](https://gist.github.com/koreyou/a91189b53c575dd722a767ecfa9fc5e9)にて公開中


# Edit note

2019/10/30追記

# はじめに

Deep learningにおいてearly stoppingは簡単ながら強力で、ほぼどんな問題設定においても威力を発揮します。かのHintonも、Early stoppingを

> Beautiful FREE LUNCH
> *Hinton, Bengio and LeCun, in [NIPS 2015 Tutorial](http://www.iro.umontreal.ca/~bengioy/talks/DL-Tutorial-NIPS2015.pdf)*

と述べています。

~~そんなEarly stoppingですが、Chainerでは3.0.0時点で公式の実装が存在しません。現在、[プルリク](https://github.com/chainer/chainer/pull/3351)で実装が議論されています。~~ [実装されています](https://docs.chainer.org/en/stable/reference/generated/chainer.training.triggers.EarlyStoppingTrigger.html)。このプルリクでは、early stoppingをtriggerとして実装しており、patientで指定した回数だけまって、それでも値が改善にtrainerを終了させます。素直な実装ですが、この実装には2つ欠点があります。

1. patientを上げ過ぎると、patientで指定した分だけ過学習がすすんでしまう。
2. patientの指定が難しい（もっとまてば良い値が得られたかもしれない）

(**Contributorの方を批判する意図はありません**。後ほど述べますが、ここに記載の実装は、このプルリクと合わせるといいとこどりになります。念の為。)

そこで、この記事では上記２つの問題を迂回しつつ、最小のコードですむearly stoppingについて記載します。

# アプローチと実装

基本的な考え方は、監視している値が最良となるたびにモデルを保存しておき、指定のエポック分学習したあとに最良だったときのモデルを読みだすという方法です。こうすることで、指定したエポックの中では必ず監視した値が最良だったときのモデルを得ることができます。

実装は[gist](https://gist.github.com/koreyou/a91189b53c575dd722a767ecfa9fc5e9)にて公開中です。この実装を使うと、

```python
# accuracyなどを使う場合はMinValueTriggerのかわりにMaxValueTriggerを使う
trainer.extend(
    SaveRestore(),
    trigger=chainer.training.triggers.MinValueTrigger('validation/main/loss'))
```

と指定するだけ、 上記にあげた1, 2の問題を迂回して、early stoppingを実現できます。

# 欠点と解決方法

このアプローチにも、結局最後まで学習を行うので学習時間を短くする効果はない、という弱点があります。ただし、この方法と[このプルリク](https://github.com/chainer/chainer/pull/3351)を組み合わせ、かつpatientの値を緩めにすることによって、最初にあげた1と2の問題を避ける、いいとこどりができます。

2019/10/30追記:

しばらくの間上記実装を使い続けていましたが、近年は

```
trainer.extend(
    chainer.training.extensions.snapshot(filename='best.npz'),
    trigger=chainer.training.triggers.MinValueTrigger('validation/main/loss'))
trainer.run()
serializers.load_npz('best.npz', trainer)
```

のような実装を使う事が多いです。
`SaveRestore()`は自動的に不要となったtrainerを消してくれるメリットがありますが、`trainer.run()`が1エポック目にこけたときにpdbなどでエラーを追いにくくなるデメリットがあるためです。
参考書のまとめに作ってみたお天気マップ


![screencapture-localhost-1337-tenki-map-html-1509279289209.png](https://qiita-image-store.s3.amazonaws.com/0/40693/329784e6-c7c3-75d1-c6b5-a4c9782cf1c8.png "screencapture-localhost-1337-tenki-map-html-1509279289209.png")


なんか5月くらいからちょいちょい休憩を挟みつつ読んでたnode.jsを扱った本をようやく一通り読めたので、せっかくなのでその本で得た知識を元に、なんか出来ねえかなあと思い、作ってみたのが上記の天気によって日本地図を色分けするマップです。


基本的には参考書にある、みかんの出荷量(都道府県単位の出荷量が載っているCSVファイルを読み込む）で日本地図の色分けを行うのサンプルを代わりに天気情報に置き換えただけですし、お天気情報があるCSVを作るのも、yahooの天気RSSからデータを読み込むサンプルを利用して作りましたので、あまりオリジナルな箇所はないですね・・・。強いて言えば、一つのRSSからデータを読みこんでCSVファイルにappendするまでを同期させるのにPromiseを使った事でしょうか

```tenki.js
/*
* map : 場所
* RSS : 場所の天気情報があるRSS
* return : 当日のmapの天気情報
*/

module.exports = function(map, RSS) {

    var parseString = require('xml2js').parseString;
    var request = require('request');

	// requestを送るのを同期
    return new Promise(function(resolve, reject) {
        request(RSS, function(err, response, body){
            if(!err && response.statusCode == 200){
                resolve(
                analyzedRSS(body).then(function(value) {
                    return(map +  "," + value);
                }).catch(function(error) {
                }));
            }
        });
    });

	// 読み込んだXMLを解析して望む値を返すのも同期
    function analyzedRSS(xml) {
        return new Promise(function(resolve, reject){

            parseString(xml, function(err, obj){
                if(err) {
                    reject(err);
                }
                var items = obj.rss.channel[0].item;
                    resolve(items[0].title[0]);
            });
        });
    }
};


```

```tenki2csv.js

	// tenki.jsを実行して返ってきたデータを加工してCSVファイルに追加
    readTenki(i, tenkis[i]).then(function(data) {
        var s = data.split(",")
        var data = s[0] + "," + s[1] + "\n";

    });
    
    // tenki.jsを実行するのも同期
    function readTenki(map, RSS) {
    return new Promise(function(resolve, reject){
        resolve(tenki(map, RSS));
    })
}

```

promiseしまくりかよ！って話で、もう少し違う書き方があるような気もしますが、とりあえずこれで。
本来ならtenki2csv.jsをサーバ機で定期的に実行するようにしてやれば、一通りの動きとしては完成（そのやり方もサンプルである）でしょうが、そこまではやってません。あくまでお試しなので・・・。


今回読んだ参考書は、node.jsそのものを勉強するというより、利用してどんな事ができるかが主眼なので、node.jsそのものを勉強したいというなら少し目的と外れるでしょうが、node.jsを知る取っ掛かりにするには最適な本ではないかなと思います。
ただし、これを書いてる時点で既にバージョンのずれが発生しており、サンプル通りにいかないことも出てきますので、読むなら早めの方がいいかも。


#### 参考書
[JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック](https://www.amazon.co.jp/JS-Node-js%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC-%E3%83%8D%E3%83%83%E3%83%88%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4883379930/ref=sr_1_4?ie=UTF8&qid=1509279578&sr=8-4&keywords=node)

#### 参考情報提供サイト

#### 地図データがあるサイト
[Natural Earth](http://www.naturalearthdata.com/)

#### 天気情報
[Yahoo!天気RSS](https://weather.yahoo.co.jp/weather/rss/)
googleスプレッドシートのフィルタ機能で自分だけの絞り込みを行う方法

googleスプレッドシートの複数人でファイルを同時に編集する機能、とても便利ですよね。

ただ、フィルターをかけようとしたら他の人の表示もフィルターされてしまい、困ったことはありませんか？<br>「フィルター禁止！」なんて運用ルールになり、非常に不便な思いをしているケースを見たことがあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/afe02d03-a456-a222-506a-21c7bd39f8ae.png)




実は、わかりづらいですが解決策があるので、それをご紹介します。


## 「フィルタ表示」機能を使う
絞り込み対象の
「データ > フィルタ表示 > 新しいフィルタ表示を作成」 とクリックしていきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/cadd0549-6a20-2bf8-c596-007103399797.png)

画面の表示が変わり、データの周りの領域がグレーの表示になりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/4b65331b-8564-03b7-4e59-919f1bc4459a.png)

これが「フィルタ表示」機能が有効になっている状態です。

このフィルタ表示状態にしてから絞り込みを行うと、他の人には影響を与えずに、自分だけ絞り込み表示をすることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/a4469609-0168-f6ce-2b00-b95664ed85a5.png)


↑他の人から見ると絞り込なれていない状態で表示されている

## 仕組み
実は、「人に影響を与えない」のではなく、「作成されたフィルタ表示ごとに絞り込み状態が適用される」という状態になります。

作成したフィルタ表示に名前をつけてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/e6a87791-2cf6-017a-d6ea-e253a61a5e0a.png)


この「松本用フィルタ」は他の人からも見ることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/b34a0320-2d43-2a5d-3d47-9ff62d826ed8.png)

そして、このフィルタを選択すると、先ほどの「担当者：松本」での絞り込みが誰から見ても適用されています。

つまり、作成されたフィルタごとに絞り込み条件が保存されるので、人に影響を与えたくない場合は自分用のフィルタを作ってそれをしようすれば良いわけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/4e8a766c-9410-983c-76d9-58feb6308616.png)


完全にチームメンバーごとにフィルタを分けたい場合は、一人一人フィルタを作成すればOKです。
time(), gettimeofday(), clock_gettime() のタイムゾーンについて

# 結論

```c
time_t time(time_t *t);
int gettimeofday(struct timeval *tv, struct timezone *tz);
int clock_gettime(clockid_t clk_id, struct timespec *tp); // when clk_id == CLOCK_REALTIME
```

これらの関数が返す時刻の値は Epoch からの経過時間とマニュアルに書かれている。

Epoch の定義は https://en.wikipedia.org/wiki/Unix_time によると

    The Unix epoch is the time 00:00:00 UTC on 1 January 1970.

なのでタイムゾーンに関わらず **UTC** からの経過時刻で間違いない。

# 備考

gettimeofday() の引数 `struct timezone *tz` は obsolete なので使わず NULL を指定するべき。

タイムゾーンを取得する C/C++ 標準の関数は [c++ - How do I find the current system timezone? - Stack Overflow](https://stackoverflow.com/questions/3118582/how-do-i-find-the-current-system-timezone) によるとないらしいが glibc では `#include <time.h>` の前に **_BSD_SOURCE** を定義することで `struct tm` に 2 つの拡張フィールドが追加される。

```
long tm_gmtoff;           /* Seconds east of UTC */
const char *tm_zone;      /* Timezone abbreviation */
```

tm_gmtoff は UTC から表される時間のオフセット（秒単位）で、正の値は本初子午線の東を示す。tm_zone はタイムゾーン名の短縮形を示す。
もっとngrok

## はじめに
ngrokというツールがあります。ローカルで立ち上げているサービス(例えば開発中のWebサービスとか)を一時的に外からアクセスできるようにトンネリングするツールです。

例えばRailsはデフォルトが3000番ポートなのでこうなりますね

```shell-session
$ ngrok http 3000
```

起動後表示される `hogehoge.ngrok.io` にアクセスすれば、外からでもローカルのサービスにアクセスできるというわけです。Webサービスのテストに便利!

このngrokをもっと便利に使う方法です。

## Regionを変更する
前々からngrok経由でアクセスすると遅くなることが気になっていましたが、あれは単純にデフォルトusで繋ぐだけであって、別のregionも使えます。

```shell-session
$ ngrok http 3000 --region=ap
```

などとすればAsia Pasificになります。想像以上に早いです。

### 追記(2023/08/29)
ひさしぶりにさわってみたら、デフォルトでjp(apではない)に繋ぎに行くようになってて、かなり使い勝手よくなってますね

## 設定を保存する(2023/08版)
設定は
```shell-session
$ ngrok config
```
でやれるので、とりあえずコマンド打ってhelpを見るのが楽です。

サービスにログインしないとsessionが2時間しかもたなくなってしまったので、殆どの人がフリープランでログインするようになったとおもいます。その場合は

```shell-session
$ ngrok config add-authtoken ...
```

とか打ってやればsessionが永続になります。tokenはngrokのdashboardで見てね。

### 設定を保存する(旧版)
ngrok、設定ファイルを作ることができます。デフォルトで `$HOME/.ngrok2/ngrok.yml` を見にいくので、当該ファイルに

```yaml
region: ap
tunnels:
  rails:
    proto: http
    addr: 3000
```

などとやると、

```shell-session
$ ngrok start rails
```

とやれば、Rails設定でngrokが起動します。お試しあれ
実践リスクベーステスト-PRISMAメソッド-というpdfを原著者から翻訳と公開に関して許可をとって。翻訳してみました

# 実践リスクベーステスト-PRISMAメソッド-

著:Drs. Erik P.W.M. van Veenendaal CISA/訳:藤原史和

システムテストフェーズに入る前のアクティビティつまり開発や単体、結合テストは遅延することはよくあることです。

その結果、システムテストフェーズにしわ寄せがゆき、大きなプレッシャーの中で実施しなければなりません。

しかし、テストをすること自体をやめたり、遅らせたり、ましてや手抜きテストなどできません。

さてあなたは、この状況をどう乗り切りますか？

## 目次

* [1.イントロダクション](https://github.com/freddiefujiwara/prisma/blob/master/1.Intoroduction.md)
* [2.製品リスク管理](https://github.com/freddiefujiwara/prisma/blob/master/2.ProductRiskManagement.md)
* [3.十分なテスト](https://github.com/freddiefujiwara/prisma/blob/master/3.GoodEnoughTesting.md)
* [4.テストフェーズにおける課題](https://github.com/freddiefujiwara/prisma/blob/master/4.TheTestingChellenge.md)
* [5.製品の最重要部分を見つける](https://github.com/freddiefujiwara/prisma/blob/master/5.TheMostImportantPartsOfTheProduct.md)
* [6.製品の最も悪い部分を見つける](https://github.com/freddiefujiwara/prisma/blob/master/6.TheWorstAreaOfTheProduct.md)
* [7.PRISMAプロセス](https://github.com/freddiefujiwara/prisma/blob/master/7.ThePRISMAProcess.md)
* [8.PRISMAの実プロジェクトでの有効性](https://github.com/freddiefujiwara/prisma/blob/master/8.PracticalExperiences.md)
* [9.リファレンス](https://github.com/freddiefujiwara/prisma/blob/master/9.Referrences.md)
* [10.原著者に関して](https://github.com/freddiefujiwara/prisma/blob/master/10.Biography.md)

※[Practical Risk-Based Testing - Product RISk MAnagement: the PRISMA](http://www.erikvanveenendaal.nl/NL/files/e-book%20PRISMA.pdf)の原著者から翻訳と公開に関する契約を締結し翻訳しています。

* PDF版は[こちら](https://github.com/freddiefujiwara/prisma/raw/gh-pages/master-prisma.pdf)
* EPUB版は[こちら](https://github.com/freddiefujiwara/prisma/raw/gh-pages/master-prisma.epub)
* Word版は[こちら](https://github.com/freddiefujiwara/prisma/raw/gh-pages/master-prisma.docx)
* HTML版は[こちら](https://freddiefujiwara.github.io/prisma/)
video要素のテクスチャでテクスチャサイズが2のn乗でないと怒られた時の対処方法

Video要素など、普通に2のn乗ではない、画像をテクスチャとして
張り付けたいときは以下のように記述することで、警告を受けずに済んだ。

```js
const texture = new THREE.Texture(
      videoelm, THREE.UVMapping, THREE.ClampToEdgeWrapping,
      THREE.ClampToEdgeWrapping);
texture.generateMipmaps = false;
texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;
texture.needsUpdate = true;
```

# 参考資料

https://stackoverflow.com/questions/13905652/non-power-of-2-texture-render-warning-in-chrome

# 関連記事

- [[webgl]Three.jsでポリゴンを描画するには](http://abrakatabura.hatenablog.com/entry/2011/08/20/092439)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](http://abrakatabura.hatenablog.com/entry/2016/01/09/134348)
- [CI環境のNightmareでWebGLを動かす方法や、NightmareでWebGL 2.0を動かす方法](http://abrakatabura.hatenablog.com/entry/2016/03/24/211619)
- [Windows10のBlenderをアップデートしたらThree.jsのアドオンが無くなったが、見つけた](http://abrakatabura.hatenablog.com/entry/2017/12/10/231431)
- [Three.jsでexamplesの高級車たちをblenderにExportしたが残念な結果に](http://abrakatabura.hatenablog.com/entry/2017/12/16/223318)
- [gopherくんのjsonデータがthree.jsのr85以降表示されなくてはまったjsonデータがthree.jsのr85以降表示されなくてはまった](http://abrakatabura.hatenablog.com/entry/2017/12/19/222952)
- [Ammo.jsのbtRaycastVehicleを基準にしたThree.jsのカメラの指定ではまった件](http://abrakatabura.hatenablog.com/entry/2018/01/21/202350)
[Mac]localhostでTensorBoardに接続できないとき

# アパッチを起動していますか？
こちらをご参照ください。
https://qiita.com/haneri/items/7110ce24e74f9566de8b

# safariを使っていませんか？
**chrome**を使ったらアクセスできました。
僕はこれで一発でした。
【備忘録】配列に対して要素数を指定して代入した場合の挙動【Ruby】

<h2>はじめに</h2>
Rubyを勉強していて、気になった処理内容を実際に実行して、それを備忘録として作成した記事となっています。

<h2>概要</h2>
Rubyにおける、配列に対して文字の置き換えを要素数を指定して行った場合の挙動を、備忘録としてまとめています。
<h2>開発環境</h2>
  ・Rubyのバージョンは2.3.0
  ・Rubyのビルダのバージョン？（rbenv）は1.1.1-6
  ・virtual box にCentOS7をインストールし、実行

<h2>備忘録</h2>
Rubyの配列は、要素数を指定して値の代入をすることができます。例えば配列の2つ目の要素から4つ、値を変更する、という操作です。
以下はサンプルコードです。
> b = [0 <font color="red"><b>,&nbsp;1, &nbsp;2, &nbsp;3, &nbsp;4</b></font>, &nbsp;5, &nbsp;6, &nbsp;7, &nbsp;8, &nbsp;9, &nbsp;10]
> b[1, &nbsp;4] = "a", "b", "c", "d"

配列に対して処理を行った結果は以下の通りです。
> [0, &nbsp;"a", &nbsp;"b", &nbsp;"c", &nbsp;"d", &nbsp;5, &nbsp;6, &nbsp;7, &nbsp;8, &nbsp;9, &nbsp;10]

本題はここから。
この代入処理を以下のように、要素数と代入する値の個数が一致しない場合は、どうなるのか気になったので実行してみました。確認するパターンは以下の2つです。

><h5>処理内容と結果</h5>
>1.パターン1
>・配列： [0 <font color="red"><b>,&nbsp;1, &nbsp;2, &nbsp;3, &nbsp;4</b></font>, &nbsp;5, &nbsp;6, &nbsp;7, &nbsp;8, &nbsp;9, &nbsp;10]
>・処理：b[1, &nbsp;4] = "a"
>・結果：[0 <font color="red"><b>, &nbsp;"a"</b></font>, &nbsp;5, &nbsp;6, &nbsp;7, &nbsp;8, &nbsp;9, &nbsp;10]

>2.パターン2
>・配列： [0 <font color="red"><b>,&nbsp;1, &nbsp;2, &nbsp;3, &nbsp;4</b></font>, &nbsp;5, &nbsp;6, &nbsp;7, &nbsp;8, &nbsp;9, &nbsp;10]
・処理：b[1, &nbsp;4] = "a", "b", "c", "d", "e"
・結果：[0<font color="red"><b>, &nbsp;"a", &nbsp;"b", &nbsp;"c", &nbsp;"d", &nbsp;"e"</b></font>, &nbsp;5, &nbsp;6, &nbsp;7, &nbsp;8, &nbsp;9, &nbsp;10]

1つ目の処理は、<b>「置き換える要素数」 > 「代入する値の個数」</b>の場合の処理です。この場合、「代入する値の個数」が<b>3つ足りていない</b>のでその分は配列から削除されています。

2つ目の処理は、<b>「置き換える要素数」 < 「代入する値の個数」</b>の場合の処理です。この場合、「代入する値の個数」が<b>1つ多いの</b>でその分は配列に追加されています。追加される位置は置き換えようとした範囲の末尾です。

ちなみにもちろん配列の長さも要素数に合わせて変化します。

<h2>まとめ</h2>
配列に対して要素数を指定して代入をする場合、要素数と比較して、
・値の個数が不足している場合は、その分削除
・値の個数が超過している場合は、その分挿入
という処理が行われるようです。
seasar2のお勉強2(Seasar2徹底入門の2.7 のコンポーネントの自動登録あたり）



こんな感じに設定ファイルを書くと行ける

```
  <!-- コンポーネントの自動登録 -->
  <component class="org.seasar.framework.container.autoregister.ComponentAutoRegister">
	  <!-- instanceDefは省略するとsingleton -->
	  <!-- autoBindingは省略するとauto -->
	  <!-- DefaultAutoNaming機構を使うとクラスの完全修飾名からパッケージ部分を除き、
	  最後がImplまたはBeanで終わっていたら削除し､ 先頭を小文字にした名前をコンポーネントの名前に設定します。
	  例えば､aaa.HogeImplクラスの場合､コンポーネント名は､hogeになります。は省略するとsingleton -->

      <!--  検索の起点となるクラスを指定する。これ指定しないと何も見つからない -->
	  <initMethod name="addReferenceClass">
	      <arg>@hello.componentautoregister.MainCaller@class</arg>
	  </initMethod>

      <!--  検索パターンをしていhelloパッケージ配下（サブ含む）のImplメソッドが対象になる -->
	  <initMethod name="addClassPattern">
	      <arg>"hello"</arg>
	      <arg>".*Impl"</arg>
	  </initMethod>
  </component>
```

実際に使っている例。

```
package hello.componentautoregister;

import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;;

public class MainCaller {

	public static void main(String[] args) {

		// S2コンテナの初期化
		SingletonS2ContainerFactory.setConfigPath("app2.dicon");
		SingletonS2ContainerFactory.init();

		// IMessageProviderIFを実装したコンポーネントを取得（コメントアウトしてるクラス指定でもいけます）
		//MessageProvider messageProvider = SingletonS2Container.getComponent(MessageProvider.class);
		MessageProvider messageProvider = SingletonS2Container.getComponent("messageProvider");
		// メッセージを出力
		System.out.println(messageProvider.getMessage());

		// S2コンテナの破棄
		SingletonS2ContainerFactory.destroy();

	}

}

```

MessageProviderとかは前回から微妙に名前変えてて以下のようになってます。

![Clipboard01.png](https://qiita-image-store.s3.amazonaws.com/0/206483/fcce1cb6-2d4d-fdd2-bd5f-8d7cc9739033.png)
【Playcanvas】Buttonを追加する

#1.「btn-states.js」のダウンロード

[ここ](https://developer.playcanvas.com/en/tutorials/ui-elements-buttons/)

から「btn-states.js」をダウンロードします。


#2.「btn-states.js」をインポート

ダウンロードした「btn-states.js」を自分のプロジェクトに追加します。


#3.ボタンの配置

ヒエラルキーに「2D Screen」を追加します。
「2D Screen」の配下に「Image Element」を追加します。
この「Image Element」をButtonにします。

スクリプト「btn-states.js」をアタッチし、画像を配置してください。

またインスペクターのELEMENTのUseInputにチェックをつけてください。
このチェックがないとクリックなどのユーザ操作を受け付けなくなります。


#4.ボタンのイベントを制御する

既にスクリプト「btn-states.js」にはボタンをクリック、もしくはタップしたときの処理が記述されています。

```js
// When we press the element assign the active texture
BtnStates.prototype.onPress = function (event) { 
    event.element.textureAsset = this.activeAsset;
};
```

この関数にプログラムを記述することでボタンの処理を実装できます。
ただ、ここに直接プログラムを記述してしまうと、ボタンの種類ごとにスクリプト「btn-states.js」が必要になります。
複数のボタンに対応する方法は以下の通りになります。


#5.スクリプト「btn-states.js」の修正

次の関数を宣言します。

```js
BtnStates.prototype.pressAction = function() {};
```

onPress処理を修正します。

```js
// When we press the element assign the active texture
BtnStates.prototype.onPress = function (event) { 
    event.element.textureAsset = this.activeAsset;
};
```

から

```js
// When we press the element assign the active texture
BtnStates.prototype.onPress = function (event) { 
    event.element.textureAsset = this.activeAsset;
    
    this.pressAction();
};
```

これでクリック、もしくはタップ時に関数「pressAction」が呼ばれるようになりました。
次は外部からこの関数を上書きし、ボタンの種類ごとに処理を切り分けるようにします。


#6.ボタンを管理するスクリプトを用意する

このスクリプトを仮に「GameManager」とします。
ヒエラルキー上に空のオブジェクトを配置し、スクリプト「GameManager」をアタッチします。

ボタンをアタッチする属性を追加します（仮にStartButtonとTitleButtonとします）。

```js
GamaManager.attributes.add('startButton', {
    type:'entity'
});

GamaManager.attributes.add('titleButton', {
    type:'entity'
});
```

ヒエラルキー上の「GameManager」に各種ボタンをアタッチしてください。

以下の処理でボタンごとに関数「pressAction」を上書きします。

```js
// initialize code called once per entity
GamaManager.prototype.initialize = function() {
    
    var startButtonStates = this.startButton.script.btnStates;
    
    startButtonStates.pressAction = function() {
        console.log("start button press");
    };
    
    var titleButtonStates = this.titleButton.script.btnStates;
    
    titleButtonStates.pressAction = function() {
        console.log("title button press");
    };
};
```

#おまけ　スクリプト「btn-states.js」を一切さわりたくない場合

クリック時のイベントを追加します。

```js
// initialize code called once per entity
GamaManager.prototype.initialize = function() {

     this.startButton.element.on('mousedown', function(event) {
        
         console.log("start button press");
        
     }, this);
};
```

ただ、これだと別途タップ時の処理を追記する必要があります。
個人的に元のスクリプトを修正したほうが操作しやすいと感じましたので今回の方法を残しておくことにしました。
Spring Boot for Kotlin 1

# Spring Boot
## Spring Bootとは？
* Spring FrameworkはJavaの由緒あるFramework
* DIやAOP(Aspect Oriented Programming)の機能が特徴的
* 複雑な依存関係、肥大化した設定、Frameworkの組み合わせの知識を必要とするなどの要素により初心者にはハードルが高い
* そのような状況を受けて誕生したのがSpring Boot
* Spring BootはSpringのアプリケーションを簡単に開発するためのFramework


## KotlinとSpring BootでHello World
### Spring Initializr
Spring InitializrはSpringプロジェクトの雛形を作るツール

[Spring Initializr](https://start.spring.io/)

今回は以下の設定を行う

* ビルドツール: Gradle
* 言語: Kotlin
* Spring Bootのバージョン: 1.5.6
* Group: com.example
* Artifact: demo
* Dependencies: Web

上記設定でダウンロードした.zipファイルを解凍したフォルダをプロジェクトファイルとしてIntelliJ IDEAで開く。
※ Openするだけ、特にGradleの設定等は必要ない

### Hello, World
以下のファイルを作成する。

```kotlin:HelloController.kt
package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
class HelloController {
    @GetMapping("hello")
    fun hello(@RequestParam("name") name: String): String = "Hello, $name!"
}

```

DemoApplication.ktで「Run」 -> 「Run...」をクリック

ブラウザで以下のURLを開く

```
http://localhost:8080/hello?name=Spring
```

ブラウザに

```
Hello, Spring!
```

が表示される

# DIを体験する
SpringのDI(Dependency Injection)を簡単に体験する。
まずはインターフェースの実装。

```kotlin:Greeter.kt
package com.example.demo

interface Greeter {
    fun hello(name: String): String
}

```

次にGreeterインターフェースを実装したクラスを実装する。

```kotlin:JapaneseGreeter.kt
package com.example.demo

import org.springframework.stereotype.Component

@Component
class JapaneseGreeter: Greeter {
    override fun hello(name: String): String = "こんにちは、$name！"
}

```

DI機能でGreeterの実装を注入

```kotlin:HelloController.kt
package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
class HelloController(private val greeter: Greeter) {
    @GetMapping("hello")
    fun hello(@RequestParam("name") name: String): String = greeter.hello(name)
}

```

HelloControllerがプライマリコンストラクタの引数としてGreeterオブジェクトを受け取るようにしている。
SpringはHelloControllerのインスタンスを生成する際にアノテーション「@Component」が付いたGreeterの実装を見つけてオブジェクトを引数に指定する。

アプリケーションを起動して、上記と同じURLをブラウザで開くと以下が表示される。

```
こんにちは、Spring！
```

# リンク
* [Spring Boot for Kotlin 2](https://qiita.com/Miracle-T-Shirt09/items/0fa0f00fbbd0aa102692)
Google Home に話しかけるだけで、日記を書く仕組みを作ってみた

Google Home に話しかけたことを、Google Spreadsheet に日付とともに記録してくれる、日記システムを作ってみました。

「いま起きたよ」「作業がここまで終わったよ」「お出かけしてきたよ」「〜〜を買ってきたよ」「そろそろおやすみ」といった日常のログを、スマホを手に取ってアプリ立ち上げて入力するよりも、ずっと簡単に記録できるようになりました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Google Home Mini を買ったので、IFTTT使って、しゃべったことをスプレッドシートに記録してくれる日記機能をつけてみたよ。なかなか便利。 <a href="https://t.co/BfvHyXb79x">https://t.co/BfvHyXb79x</a></p>&mdash; 壽 かおり Kaori Kotobuki (@kaoritter) <a href="https://twitter.com/kaoritter/status/924574427274027008?ref_src=twsrc%5Etfw">2017年10月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



# 参考にした記事
* [Google Home、IFTTT、Googleスプレッドシートを使って独自音声コマンドでログをとる（ついでにNode.jsやngrokやらも使ってLINEやGoogle Homeに通知する）](https://qiita.com/miso_develop/items/be562d8a823ad2639d94)

やってることはこの記事の前半とほとんど同じです。が、一応、やり方を書きます。

# 必要なもの
* Google Home ※Mini でもOK
* IFTTT
* Google Spreadsheet & Google App Script

# Google Spreadsheet を準備
任意の場所に空のスプレッドシートを用意し、日付、時刻、日記の3列を作ります。

<img width="479" alt="spreadsheet 2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/4584/bebb5150-7ae7-1fd3-1670-1bc46381cc83.jpeg">

日付と時刻は、なぜかIFTTTからうまく登録できないため、行が追加される度にその日時を追加するスクリプトをGoogleAppScriptで用意しました。やり方は、[先ほどの参考記事のGoogle スプレッドシートの項目](https://qiita.com/miso_develop/items/be562d8a823ad2639d94#google%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88)をそのまんま使いました。


# IFTTT の設定
## If "THIS" のところ
1. "Google Assistant" を選択　※初回は、Google Home で使っている Google アカウントとの連携設定を行う
2. "Say a phrase with a text ingredient" を選択
3. 以下のように設定

<img width="691" alt="this.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/4584/ee20b0ab-5fd5-5fdf-0bc0-c5e3bb6c5912.jpeg">

これで、「OK, Google 日記　ほげほげ」や「OK, Google 日記を書く　ほげほげ」と話しかけるというトリガーと、完了時に Google Home から "日記を書きました" というしゃべってくれる設定が完了です。

### キーフレーズ設定の TIPS
キーフレーズになる言葉を設定する際には、実際に何度か Google Home に話しかけてみて、Google Home 管理アプリの「マイアクティビティ」から想定通りの音声認識がされているか確認してみると良いです。ありがちな認識間違いがあればそれも設定しておく、認識されやすいフレーズに変更するなどの対策が可能です。

## THEN "THAT" のところ
Google Home が聞き取った「ほげほげ」の箇所を、Google Spreadsheetに入力します。

1. "~~Google Drive~~ Google Sheets" を選択　※初回は、Google Drive で使っている Google アカウントとの連携設定を行う
2. "Add row to spreadsheet" を選択
3. 以下のように設定

<img width="569" alt="that.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/4584/70b1a385-f448-54cb-95ac-176c6a694000.jpeg">



# こんなログが取れました
数日運用してみたのがこのスプレッドシートです。
なぜかタイで逮捕されているなど、たまに認識がダメダメなのはご愛敬。NGなのは主にむすめが登録したときなので、滑舌がいまいちなのかもしれない。
<img width="479" alt="spreadsheet.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/4584/e63c047a-c09c-7792-3f8a-a16f49c7d28e.jpeg">

# 今後の拡張案
キーフレーズを変えて、わたしとむすめ（8歳）で別々のログを取れるようにしたい。
2017年現在のコンシューマ向け骨格推定カメラ

# 概要
Kinectシリーズの製造停止で僕のTLは阿鼻叫喚になりました。
https://www.fastcodesign.com/90147868/exclusive-microsoft-has-stopped-manufacturing-the-kinect

なぜなら、安価で買えて骨格推定が動くコンシューマカメラがほぼ無くなってしまうからです。現状を説明します。

## Kinect v1,v2
どちらもWindowsをサポートしていて、無料のSDKを入れるだけで人間の骨格推定した座標を取得できます。
余談ですがKinect v2のRGBカメラの露出固定が出来ないの凄く不便です(・ｘ・)

https://social.msdn.microsoft.com/Forums/en-US/bc9e345b-6ba9-4094-a2ab-9efd118a71ab/set-exposure-of-kinect-2-color-camera

## Realsense
カメラがいっぱい出ていて複雑ですが、無料のSDKがあります。
z200 系で骨格推定がサポートされていますが、4-6箇所の座標のみ取得できます。
https://communities.intel.com/thread/113007

他のカメラではSR300で腕の位置は取得できますが、全体骨格は取得できません。

また、Scene Perceptionや前述のSkeletonTrackingなどの高レベルAPIを含んだRealSense SDKが開発終了となりました。
https://software.intel.com/en-us/realsense-sdk-windows-eol

後継としてGithubで開発が公開されている新RealsenseSDKは低レベルAPIのみのサポートになっています。つまり、骨格推定は実装されていません。
https://github.com/IntelRealSense/librealsense

## Xtion2
2017年発売、単品で購入可能でKinect v2よりは深度精度が落ちる様です。
こちらもNiTEを使って骨格推定が出来るようですが、NiTE対応版は高くなるようで、またあまり現時点では情報が多くありません。

http://www.naturalsoftware.jp/entry/2017/08/10/105435


## Orbbec Persee
https://orbbec3d.com/
単体でAndroidとかを組み込んだKinect的なカメラ。
一応SDKを使うと骨格推定データを取り込めると書いてありますが、あまり調べていません。(多分国内で使う場合、技適とかが厳しそう)

# 結論
手軽に骨格推定する可能性あるならKinect v2を在庫かき集めておくのが良さそう。
amdgpu-pro 17.40 beta + rocm-smi でアンダークロックする

漢なら Linux でも amdgpu-pro ドライバで AMD GPU をアンダークロックし, 電力効率の良い計算したいですね!

やりましょう!

以前はできなかったのですが, amdgpu-pro 17.40 あたりからできるようになっているようです.

# 環境

Ubuntu 16.04.3 LTS(Kernel 4.10.0-37)

# セットアップ

amdgpu-pro 17.40 beta ドライバを `--compute` でインストールしておきます.

ROCM-smi をクローンしておきます.

https://github.com/RadeonOpenCompute/ROC-smi


# 制御する

rocm-smi では NVIDIA の `nvidia-smi` とは異なり, パワーリミットを設定することができず, コアクロックか GPU クロックの調整のみ可能です.
(OC 用に OverDrive レベルを設定できるが, これは負の値を取れないのでアンダークロックには使えない)

また, クロックは MHz やパーセンテージ指定ではなく, レベルを指定します.

```
$ rocm-smi --setsclk N
``` 

```
====================    ROCm System Management Interface    ====================
================================================================================
 GPU  DID    Temp     AvgPwr   SCLK     MCLK     Fan      Perf    OverDrive  ECC
  3   67df   70.0c    69.73W   1145Mhz  2000Mhz  33.73%   manual    0%       N/A      
...
================================================================================
====================           End of ROCm SMI Log          ====================
```

XMR(モネロ)マイニングプログラムでは, RX 480 で hashrate 620 H/s -> 610 H/s と少しの低下に抑えつつ, AvgPwr が 90W -> 70W 程度に下がりました.
(rocm-smi での表示なので, 実際の消費電力はもう少し大きい可能性があります)

R9 Nano などは GPU クロックはレベルが一つしかないので変更できません(Windows ではできるが...)

# TODO

`rocmi-smi` は単なるスクリプトなので, `/sys` あたりを直接叩けばより詳細なアンダークロック制御ができるかもしれません.

アンダーボルティングはサポートされません( https://github.com/RadeonOpenCompute/ROCm/issues/216 )が, 昔はできていたのでカーネルをハックすればいけるかも?
はじめてのVisualStudio2017でC++　-クラスの作成とインスタンス生成-

VisualStudio2017でC++を使ったプログラムの勉強。
今回はクラスの作り方とそのクラスのインスタンスの生成を学びましたので、備忘録として残しておきます。


まず適当なプロジェクトを作成します。

![MakeTheClass01.png](https://qiita-image-store.s3.amazonaws.com/0/207074/a40e73d9-a30e-4fc5-53a0-08cfc961172f.png)

作成したプロジェクトの上で右クリックをし、「追加」の「クラス」のタブを押します。

![MakeTheClass02.png](https://qiita-image-store.s3.amazonaws.com/0/207074/a9b8d1b6-c128-98da-c94d-57e913b55f01.png)

![MakeTheClass03.png](https://qiita-image-store.s3.amazonaws.com/0/207074/e6d200ec-b9cf-47df-6233-918bbc0f9de3.png)


クラス名を入力して「OK」を押すと、自動的に.hファイルと.cppファイルがプロジェクトに作成されます。

あとはプログラミングを書いていきます。

CSample.h

```C++
#pragma once

class CSample {
public:
	void set(int num);
	int get();
private:
	int m_num;
};
```

CSample.cpp

```C++
#include "CSample.h"

void CSample::set(int num)
{
	m_num = num;
}

int CSample::get()
{
	return m_num;
}
```

Main.cpp

```C++
#include <iostream>
#include "CSample.h"

using namespace std;

int main() {
	CSample obj;
	int num;

	cout << "整数を入力してください。" << endl;
	cin >> num;
	obj.set(num);
	cout << "入力した文字は";
	cout << obj.get() << endl;

	system("pause");
	return 0;
}
```



クラスを作成することのメリットの一つは、そのクラスに基づいたインスタンスを複数作ることができることにあります。

複数のインスタンスの生成の場合

```C++
#include <iostream>
#include "CSample.h"

using namespace std;

int main() {
	CSample obj1,obj2;
	int num;

	cout << "整数を入力してください。" << endl;
	cin >> num;
	obj1.set(num);

	cout << "もう一度整数を入力してください。" << endl;
	cin >> num;
	obj2.set(num);

	cout << "最初に入力した文字は";
	cout << obj1.get() << endl;

	cout << "次に入力した文字は";
	cout << obj2.get() << endl;

	system("pause");
	return 0;
}
```

実行結果

```
整数を入力してください。
7
もう一度整数を入力してください。
2
最初に入力した文字は7
次に入力した文字は2
```

このプログラムでは、obj1およびobj2という二つのインスタンスを作っています。実行結果からわかる通り、同じメソッドにアクセスし、同じメンバ変数に値を入れていますが、それぞれの実行結果は異なります。

これは、同じ名前のメンバ変数、メンバ関数であっても、インスタンスが異なれば別物であることを意味します。例えば、obj1.set(1)とすれば、obj1のm_numが1になりますが、obj2のm_numにはなんら変化は起こりません。

同様に、obj1.get()を実行しても、値がとられるのはあくまでも、obj1.m_numであり、obj2とは、なんら関係ありません。このように、同じ名前がついたインスタンス変数やインスタンス関数であっても、インスタンスが異なれば別物であるというのが、オブジェクト指向最大の特徴です。
Vagrantとシェルスクリプトで自動環境構築  ~php7, Codeigniter3~

#内容
手動でPHPの環境を作っていたので、自動で構築できるようにしてみました。

- ubuntu 14.04

- php7.0

- apache

- mysql

- Codeigniter 3.1.6

- composer


#環境
既にVagrantをインストールしているWindows環境です。

# 使い方
[ソースコード](https://github.com/ishigero/create_codeigniter_environment)
git cloneしてvagrant upするだけです。

#ディレクトリ構造

最終的にこんな感じになります。

```
.
├── application
├── composer.json
├── composer.lock
├── configFiles（設定ファイル・構築後削除して下さい）
│   ├── composer.json
│   ├── config.php
│   ├── database.php
│   ├── index.php
│   ├── init.sql
│   ├── my.cnf
│   └── project.conf
├── provision.sh
├── public（ドキュメントルート）
├── README.md
├── Vagrantfile
└── vendor
```

# 感想
5分ほどで環境構築できるので便利です。
よかったら使ってみて下さい。
SideeX

#SideeX
SeleniumIDEの後継ともいわれている。
確かに、Firefox55以降使えないのがネックであるので、代わりとして使える。

まだ、何ともは言えないが使えそうな予感。
http://sideex.org/

FirefoxとChromeで提供されている事だけは理解できた。
使えるコマンドも記載しているので、ちょいと作成してみる。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/55160/cd09ceea-e716-7465-3fdc-9ac25d756ec2.png)


ん、chromeでSeleniumIDEのスクリプトを読み込ませても
所々でエラーが出てしまう。キャプチャコマンドもなさそうなので、どうしようか。


Firefoxでは、An Extended Version of Selenium IDEの扱いですが、
SeleniumIDEの速度を早くしても、（FAST）にしても遅い気がする。

引き続き、調査を進めます。
Selenium IDEが復活したので、、進まず。。
lens（のMonadState演算子など）で自己に言及したい時はidを使う

- - -

この記事は[ブログ版](http://aiya000.github.io/posts/2017-10-29-identity-in-lens-monadstate.html)の引用です。  
スタイルが崩れている等している場合は、ブログ版の方が見やすいかと思います。

- - -
# まとめ
　lensにて。
例えば`Int`や`[Int]`のような単一の状態を持つ`MonadState`の文脈で、
状態自身（自己）に言及したい場合は、このようにすることで実現できる。

```haskell
import Control.Lens
import Control.Monad.State.Lazy (StateT, runStateT)

main :: IO ()
main = runStateT context [0] >>= print

-- dequeue behavior
context :: StateT [Int] IO ()
context = do
  id %= (10 <|)
  id %= (|> 20)
-- {output}
-- ((),[10,0,20])
```

```haskell
infix 4 %=
(%=) :: MonadState s m => ASetter s s a b -> (a -> b) -> m ()
(%=) :: ASetter s s a b -> (a -> b) -> StateT s m ()
(%=) :: ASetter' s a -> (a -> a) -> StateT s m ()
(%=) :: ASetter' [Int] [Int] -> ([Int] -> [Int]) -> StateT [Int] IO ()

(<|) :: a -> Seq a -> Seq a
(|>) :: Seq a -> a -> Seq a

(10 <|) :: Seq a -> Seq a
(|> 20) :: Seq a -> Seq a

type ASetter' s a = ASetter s s a a
type ASetter s t a b = (a -> Identity b) -> s -> Identity t

id :: p s (f a) -> p s (f a)
id :: (s -> f a) -> s -> f a
id :: (s -> Identity a) -> s -> Identity a
id :: ASetter' s a
id :: ASetter' [Int] [Int]

-- なので

(id %=) :: ([Int] -> [Int]) -> StateT [Int] IO ()
```


　ちなみに`Control.Lens.Equality`の`simple :: Equality' a a`の実定義は`id`。


# 参考

- [Control.Lens.Equality (simple)](https://www.stackage.org/haddock/lts-9.10/lens-4.15.4/Control-Lens-Equality.html#v:simple)
- [Control.Lens.Setter (ASetter)](https://www.stackage.org/haddock/lts-9.10/lens-4.15.4/Control-Lens-Setter.html#t:ASetter)


# Thanks

- [みょんさん](https://myuon.github.io/)
Daydream開発入門 BGMや効果音を鳴らす

[公式](https://developers.google.com/vr/unity/spatial-audio)にある通りにやっても音が再生しなく困ったため、解決方法を記事にしました

## 再生するための準備
この手順が公式に載っておらず(探せず)苦労しました...
この準備をしないと音の再生が出来ませんでした
[Stackoverflow](https://stackoverflow.com/questions/37562023/gvraudiolistener-and-gvraudiosource-not-behaving-as-expected-or-at-all?answertab=active#tab-top)にやり方が載ってました

```
Edit > Project Settings > Audio
```
と選択し、`Spatializer plugin`に`GVR Audio Spatializer`を設定します
![スクリーンショット 2017-10-29 18.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/112492/ea6e337f-6f62-9416-a633-fad28e158f0d.png)

## GvrAudioListenerを追加
ここからの手順は[公式](https://developers.google.com/vr/unity/spatial-audio)通りです。そちらも参照していただけると、より詳細に書いてあります。
`Main Camera`に`GvrAudioListener`コンポーネントを追加します
![スクリーンショット 2017-10-29 18.20.48.png](https://qiita-image-store.s3.amazonaws.com/0/112492/9114b22b-98a8-3855-5671-162550fe4e36.png)

## GvrAudioSourceを追加し鳴らしたい音を設定
`GvrAudioSource`コンポーネントを追加し、`AudioClip`に鳴らしたい音を設定します
![スクリーンショット 2017-10-29 18.28.33.png](https://qiita-image-store.s3.amazonaws.com/0/112492/79dfcb63-5c22-e9cf-dda4-349244f90121.png)

<br>
これで音を再生することが出来ました！
ちなみにPCにヘッドホンを繋いでおけば、エディタのPlayで確認することが可能です
nodistでnode.jsを入れた後npmがバージョンアップできない問題

正しい方法をコメントでもいただいたので追記。

[リンク先](https://qiita.com/shika358/items/0be01167d02c1abec186)（と[nodist公式](https://github.com/marcelklehr/nodist/blob/8f6c6da72549509495c21976a3521a0d7368e38a/README.md#commands)）には、

```
nodist npm x.y.z
```

とせよ、と書いてある。

でもnpxを入れてくれない。
悩ましい。。。

----
[npm](https://github.com/npm/npm)コマンドを使っていると、たまに「新バージョンがあるよ！`npm i npm -g`してね」と教えてくれる。

Windowsの[nodist](https://github.com/marcelklehr/nodist)（Windows向けnode.jsバージョン管理ツール）でnode.jsを入れている場合（その場合しか知らない）、このnpmをアップデートしてもnodist導入時のv4.0.5からバージョンアップができなかったので、いろいろ調べてみた。

まずはnodistをいれて、適当なnode.jsのバージョンを入れた後にnpmをアップデートしてみる。

```
C:>npm i npm -g
C:>npm -v
4.0.5
```
v4.0.5のまま。

どの`npm`コマンドが実行されるか調べてみる。

```
C:>where npm
C:\Program Files (x86)\Nodist\bin\npm
C:\Program Files (x86)\Nodist\bin\npm.cmd
C:\Program Files (x86)\Nodist\bin\npm.exe
```

3つも引っかかるので、それぞれバージョンを確認してみる。

```
C:\Program Files (x86)\Nodist\bin>npm -v
4.0.5

C:\Program Files (x86)\Nodist\bin>npm.cmd -v
5.5.1

C:\Program Files (x86)\Nodist\bin>npm.exe -v
4.0.5
```

`npm.cmd`はアップデートされていて、`npm`と`npm.exe`が古いままの模様。

（乱暴とはおもいつつ）`npm`と`npm.exe`の二つを`npm`で引っかからないようリネームしてみる。

```
C:\Program Files (x86)\Nodist\bin>move npm npm-orig
C:\Program Files (x86)\Nodist\bin>move npm.exe npm-orig.exe

C:\Program Files (x86)\Nodist\bin>where npm
C:\Program Files (x86)\Nodist\bin\npm.cmd
```
npm.cmdのみが引っかかるようになった。
バージョンも確認。

```
C:\Program Files (x86)\Nodist\bin>npm -v
5.5.1
```
最新版になった模様。

これでしばらく様子見る。
MySQL外部接続を可能にする(Debian8)

Google Compute EngineでBitnami Redmineのイメージを個人用環境を作っている際に、
MySQLの外部接続を行ったので、忘備録としてメモ
Debianは初心者なのでお手柔らかに..

aptitudeをインストールする

````
$ sudo -s
# apt-get install aptitude
````

① iptablesの設定を行う
「【Debian 8 Jessie】iptablesの設定をこれだけはやっておく - Qiita」https://qiita.com/osktak/items/778287711f7ee0ccec3b
sudo apt -y install iptables-persistent

② MySQLの外部接続可能なユーザーを作成する

- ユーザー作成
- ホスト名と権限付与


③ 外部接続可能なホストを設定する
「Debian/lenny MySQLに外部マシンから接続(リモート接続): プログラミング関係ごちゃごちゃメモ」http://somenotes.seesaa.net/article/140067960.html
/opt/bitnami/mysql/my.cnf で設定を行う(Bitnami Redmineの場合)

④ ComputeEngineのネットワーク設定を行う
タグ名を間違えずに設定する
【CentOS7】firewalldによるパケットフィルタリング設定

#firewalldの疎通許可設定備忘録

CentOS7からパケットフィルタリング設定仕様がiptablesからfirewalldに変更となった。
firewalld関連のコマンドは長ったらしく、忘れやすいのでメモしておく。

##http許可設定
まず現在の設定を確認する

```bash
firewall-cmd --list-all-zone --permanent
# publicがdefaultになっていることを確認
```

publicゾーンにhttp許可設定を追加
※このとき、オプション--permanentを忘れないこと。このオプションを付与しないと、一時的に有効な設定、つまりhttpdの再起動等を行うことで以前の設定に戻ってしまう。永久に有効化するために必要。

```bash
firewall-cmd --zone=public --add-service=http --permanent`
# successと表示されること
```

再び設定を確認し、publicゾーンにhttp許可設定が追加されていることを確認して設定反映

```
firewall-cmd --list-all-zone --permanent
firewall-cmd --reload
```

##任意のポートの解放
下記のように`--add-port=xxxx/tcp`で指定できる。

```bash
firewall-cmd --list-all-zone --permanent
firewall-cmd --zone=public --add-port=9999/tcp --permanent # 9999番ポートを許可
firewall-cmd --list-all-zone --permanent
firewall-cmd --reload
```
オブジェクトのリストから特定の要素を抜き出す

## 目的
リスト内のオブジェクトから特定の要素だけを抜き出す

## 手段
Java8のStream

# サンプル
## オブジェクト

```java:NamePlate.java
package stream;

public class NamePlate {
	private Integer id;
	private String name;

	public NamePlate(Integer id, String name) {
		this.id = id;
		this.name = name;
	}

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
```

## 目的の処理

```java:StreamSample.java
package stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamSample {
	public static void main(String[] args) {
		List<NamePlate> source = Arrays.asList(
				new NamePlate(1, "Taro")
				, new NamePlate(2, "Jiro")
				, new NamePlate(3, "Hanako")
				, new NamePlate(4, "Jiro")
				, new NamePlate(5, "Jiro")
				, new NamePlate(6, "Taro")
				);

		List<String> nameList = source.stream()
				.map(s -> s.getName())
				//.distinct()
				.collect(Collectors.toList());

		System.out.println(nameList);
	}
}
```

## 結果
[Taro, Jiro, Hanako, Jiro, Jiro, Taro]

コメントアウトしている「distinct」をはずすと
[Taro, Jiro, Hanako]

# 参考
[ラムダ式・Stream APIの理解のポイントは「型」](http://masatoshitada.hatenadiary.jp/entry/2015/02/09/190150)
[Java8のStreamを使いこなす](http://d.hatena.ne.jp/nowokay/20130504)
Serverless FrameworkでExpressを動かす(serverless-httpを使用)


Serverless Frameworkの公式ブログで [Deploy a REST API using Serverless, Express and Node.js](https://serverless.com/blog/serverless-express-rest-api/)という記事を見つけたので、この記事で紹介されている[serverless-http](https://github.com/dougmoscrop/serverless-http)とういミドルウェアを使って、Serverless上でExpressを動かしてみました。

# 環境

```
 $ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G29
$ node -v && npm -v
v8.8.1
5.4.2
```

# 手順
### AWS CLIの事前設定とserverlessのインストール

AWS CLIをインストールし、認証情報を登録しておきます。
[AWS - Credentials](https://serverless.com/framework/docs/providers/aws/guide/credentials/) を参考に、使用するAWSアカウントの情報をDefaultプロファイルに設定します。

serverlessをグローバルにインストールしておきます。

```
$ npm install serverless -g
```

ココらへんは、以前書いた記事 ([serverlessでLambdaのローカル開発環境を整える](https://qiita.com/daikiojm/items/891bac3a61bdea0a4340))でも紹介していますので、こちらを参照してください。

## プロジェクトを作成

```
$ mkdir serverless-express-sample
$ cd serverless-express-sample
$ npm init -f
```

## 必要なパッケージのインストール

今回は、次のnpmパッケージを使用します。

* express
* serverless-http

[serverless-http](https://github.com/dougmoscrop/serverless-http)はLambdaでexpressのようなhttpをルーティングするソフトウェアを使用できるようにするミドルウェアです。

```
$ npm i -S express serverless-http
```

## サンプルAPIの作成
`/`、`/hoge`にアクセスすると、それぞれ違った文字列をjsonで返す簡単なAPIを作成してみます。

まずは、`serverless`コマンド(エイリアス: sls)でnodejsベースのプロジェクトを作成します。

```
$ sls create --template aws-nodejs --name serverless-express-sample 
```

次に、追加されたhandler.jsを次のように変更します。
Expressを使ったことがあれば、見慣れた内容だと思います。

```js:handler.js
'use strict';

const serverless = require('serverless-http');
const express = require('express');
const app = express();

app.get('/', function (req, res) {
  res.json({ message: 'Hello World!' });
});

app.get('/hoge', function (req, res) {
  res.json({ message: 'Hello Hoge!' });
});

module.exports.main = serverless(app);
```

serverless.ymlは次のように変更します。

eventsには、全てのpath、全てのhttpリクエストをAPI Gatewayの機能のLambda Proxy IntegrationでExpress側に渡すための設定を記述しています。

```yaml:serverless.yml
service: serverless-express-sample

provider:
  name: aws
  runtime: nodejs6.10
  stage: dev
  region: ap-northeast-1

functions:
  app:
    handler: handler.main
    events:
      - http:
          method: ANY
          path: '/'
      - http:
          method: ANY
          path: '{proxy+}'
```

## デプロイ
作成したサンプルAPIをデプロイします。

```
$ sls deploy
```

## 動作確認
デプロイ結果の`endpoints:`に表示されているエンドポイントにブラウザからアクセスしてみると...
次のように、Expressからjsonレスポンスが返ってくることが確認できるかと思います。

![スクリーンショット 2017-10-29 17.26.06.png](https://qiita-image-store.s3.amazonaws.com/0/79414/21f3b46f-ab6b-5dde-097a-dd3d86ca3203.png)

![スクリーンショット 2017-10-29 17.26.10.png](https://qiita-image-store.s3.amazonaws.com/0/79414/19eb98dc-659b-66ca-b584-a3200fc27728.png)

また、[Wappalyzer](https://chrome.google.com/webstore/detail/wappalyzer/gppongmhjkpfnbhagpmjfkannfbllamg?hl=ja)というChrome Extensionで確認してみると、Expressが動いていることが確認出ます。

<img width="490" alt="スクリーンショット 2017-10-29 17.26.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/7584e4e2-0455-c79c-23f9-8db4eb9accc5.png">


# 参考
https://serverless.com/blog/serverless-express-rest-api/
Web Bluetooth APIのサンプル

## 概要
Web Bluetooth APIのサンプル
オムロン製 2JCIE-BL01のデータを取得してグラフで表示するサンプル

※web bluetooth apiが動作する環境でしか動作しないので、
クライアント側は、Android7.1 + Chrome61で確認


## ソース

[Y05H1/web-bluetooth-api-sample](https://github.com/Y05H1/web-bluetooth-api-sample)


## インストール

### 事前準備
下記とかを参考にWebサーバのインストールと、https設定を実施
(CentOS7.3 + httpdで確認）

https://www.server-world.info/query?os=CentOS_7&p=httpd&f=7



### インストール
ソースをcloneする

```
# cd /var/www/html/
# git clone https://github.com/Y05H1/web-bluetooth-api-sample.git
# systemctl restart httpd 
```

## 使い方

1. スマホのブラウザでソースを配置したWebサーバにアクセスする
2. 収集開始・終了日時を指定してSEARCHボタンを押す
細かすぎて伝わらない微妙なノウハウ

雑多で記事にならなさそうなものをまとめる。

* (Excel) オートシェイプバリバリで書かれたろくでもないのをなんとか検索したい
PDF 化しよう！とりあえずテキストで埋め込んでくれるぞ！
ただしこれはこれで案外当てにならんので注意が必要。
最近のOfficeは自前でPDF出力してくれるので、これを使えば一発解決する。ただし出力が結構重いのでそこも注意。

* (Oracle) count(*) over () すれば fetch first しても総件数を引ける。
タイトルの通り。~~きっと知ってる人多いだろうなあ~~
ただし count の例に漏れず全レコードに件数がひっつくのでそこは適当に工夫する必要あり。
MyBatis で使ったときは Collcetion を implement した List もどきを用意してしのいだ。

* (Eclipse) JUnit が動かない。SecurityException？順序は正しいのに！
http://d.hatena.ne.jp/satoshis/20170928/p1
hamcrest の jar を上書きするという解法。Works for me。

* (Java、あるいは静的型付け言語) 影響調査
規模が大したことない (=開発機1台でホイホイコンパイル (≠ビルド) 出来る) なら、サクッと型を書き換えてやると割と手っ取り早い。コンパイルエラーをそのままTodoリストにしてしまおう。
(抽象化しっかりやれば済むじゃんとか言ってはイケナイ、目の前の実物は大抵おバカな設計だ)
ところで、ここらへんコンパイラに検出させられない動的な言語ではどうやればいいのだろう。
今更ES2017 (ES8) まとめ

もう今年も終わりが見えてきたけれど、ES2017についてまとめてみる。
なお予め宣言しておくが*IE以外ではだいたい動く* **だらけ**。

# どこに？
https://www.ecma-international.org/ecma-262/8.0/index.html

# 追加
## String.prototype.padStart, String.prototype.padEnd
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd

* 名前の通り、前埋め/後埋めでパディングする。
* どちらも targetLength が必要で、padString を受け取ることができる。
* IE以外ではだいたい動く。

特段何の変哲もないパディング。
padString の長さが足らない場合は繰り返し、余れば勝手に切り落としてよしなにしてくれるようだ。
例えば "str".padStart(10, "pad") とかやると "padpadpstr" が返ってきた。

## Object.values, Object.entries
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

* 処理対象として渡した Object の有するプロパティを配列として列挙する。
* 生成された配列をアレコレしても元オブジェクトに影響しない（当たり前か……）
* 配列内の順序は for...in と同等。ただし、for...in と異なりプロトタイプチェーンは辿らない。
* IE以外ではだいたい動く。

敢えて Java に例えるなら（その必要はあるのか？）Object.values は Map#values、Object.entries は Map#entrySet が近いだろうか。なるほど JavaScript はとかく連想配列である。

## Object.getOwnPropertyDescriptors
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors

* 対象オブジェクトのプロパティ情報（記述子オブジェクト）を取得できる。
* 記述子オブジェクトは configurable, enumerable, writable, get, set, value をキーとして持ちうる。
* IE以外ではだいたい動く。

デコレータなど、ややこしいことする時向け。
JavaScript においてプロパティは名前と記述子オブジェクトで構成されているらしく、これは名前から記述子オブジェクトを引き抜かせてくれる関数。

## 引数リストのカンマに関するルール変更
以下の記述が可能になったようだ。

`function f(v1, v2, v3,){...}`
`f(1, 2, 3,);`

オブジェクトリテラルや配列リテラルと揃えた、ということであるらしい。

## async function
`async function af(){...}`
上記の関数 af は非同期の関数である。
「あれ？お前ES2016にいなかった？」と思ったそこのアナタ。
実はこの界隈、標準であるとみなされる(Stage 4)ためには2つ以上のブラウザに実装される必要があるらしい。ES2016が締め切られた時、実装してたのはEdgeだけだった（Stage 3）んだそーな。

非同期関数には以下の特徴がある。
* 非同期関数は内部で await を使用することができる。await を使うことで Promise.then へ関数を渡す手間を省き、同期処理の調子で書けるようになる。
* 非同期の関数は何を return しても構わないが、返したものは必ず Promise に Wrap される。例えば、1 を返せば "1 で resolve される" Promise が返る。

Promise が扱いやすくなる追加物。非同期がやりやすいのはありがたい。
IE以外ではだいたい動く。

## 共有メモリと Atomic
JS で共有メモリ？となるかもしれないが、これは Worker あたりを振り回して大規模な処理をする場合向けであるようだ。
SharedArrayBuffer を利用してスレッド間共有が可能になるので、かなり楽になる。
これまで同様 postMessage を使うところは同じだが、その後は SharedArrayBuffer でやり取りできる。
Atomic は、SharedArrayBuffer に対する（その名の通り）Atomicな操作のAPIであるようだ。
これは Math のようなもので、オブジェクトとして深く考える必要はなさそう。
DeepAnalyticsで開催されている金融モデリングチャレンジのサンプルコードを書いてみる

# はじめに

「大手ヘッジファンドX: 金融モデリングチャレンジ」というタイトルでDeepAnalyticsのコンテストが開催されていますが、他のコンテストと異なり以下のような記載がありました。

> 他参加者との情報共有は可能
> コンテスト参加者が他参加者と本コンテストの予測に関連するデータ・ソースコードを共有する行為は可能です。
> ブログなどでの情報発信も行っていただいて構いません。

ということなので、初学者がはじめの第一歩を踏み出す一助となるべく、簡単なサンプルコードを公開してみます。

[オプトDSL・DeepAnalyticsコンテスト『大手ヘッジファンドX: 金融モデリングチャレンジ』](https://deepanalytics.jp/compe/53)

ちなみに、懸賞の金額は1位が50万円です。

# 環境構築

言語はPython3で、ライブラリはscikit-learnを使用します。
手前味噌ではありますが、構築手順は以下のURLをご参照下さい。

- [Mac](https://qiita.com/mix_dvd/items/b49651cf1181a986506c)
- [Ubuntu](https://qiita.com/mix_dvd/items/4bf7f6e7fa19068ea1d4)
- [CentOS](https://qiita.com/mix_dvd/items/eaee8db918dbf7263ade)

# データのダウンロード

以下のサイトでユーザー登録をし、データをダウンロードします。
ダウンロードしたらZipファイルを展開し、一つのフォルダに入れます。

[オプトDSL・DeepAnalyticsコンテスト『大手ヘッジファンドX: 金融モデリングチャレンジ』](https://deepanalytics.jp/compe/53)

# データの読込

```py3:
import pandas as pd

# 学習データ
df_train = pd.read_csv("train.csv")

#　テストデータ
df_test = pd.read_csv("test.csv")

# 投稿用データ
df_submit = pd.read_csv("sample_submit.csv", header=None)
df_submit.columns = ["data_id","target"]
```

# 学習データの作成

```py3:
# 学習に使用する列の指定
X_cols = df_test.columns.tolist()[1:]
y_cols = ["target"]

# 入力と出力に分割
X = df_train[X_cols].as_matrix().astype("float")
y = df_train[y_cols].as_matrix().astype("int").flatten()
```

# 学習とスコアの確認

```py3:
# 教師データを学習データと検証データに分割
from sklearn import model_selection
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=.1)

# 学習
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
model.score(X_test,y_test)
```

# 予測

```py3:
# テストデータで予測
X = df_test[X_cols].as_matrix().astype("float")
result = model.predict_proba(X)
```

# 投稿データの出力

```py3:
# サンプルデータを書換
df_submit["target"] = pd.DataFrame(result)[[1]]

# CSV出力
df_submit.to_csv('submit.csv', header=None, index=None)
```

# 投稿

以下のURLにて、投稿するファイルを選択し、RandomForest、Pythonにチェックを入れて送信。

https://deepanalytics.jp/compe/53/subscription

さて、成績はいかがでしたか？

# これから

色々なモデルを試したり、ハイパーパラメータの調整をしたり、データから新しい特徴量を作って追加したり、やることいっぱいです(^-^)

でも、締め切りまでまだまだ時間がいっぱいあるので、みなさんどんどんチャレンジしてみましょう！！