OmniAICreator/Qiita-1.07M huggingface dataset:
Angular CLI で作成したアプリをGAEへデプロイする方法

## はじめに

この記事は ウェブクルー Advent Calendar 2017 25日目 最後の記事になります。
昨日は@razgriz_rayさんの「[会社でリモートワークを導入してみた話](https://qiita.com/razgriz_ray/items/3e44c16c03a7714b19c2)」でした。

クリスマスですね、いかがお過ごしでしょうか。
今日は Angular CLI で作成したアプリをGAEへデプロイする方法 というタイトルで
AngularをGAEへデプロイするまでの内容を @DotaKobayashi がお届けいたします。
さっそく始めていきます。

## 概要
今回はAngular CLIで作成したWebアプリをGCP(Google Cloud Platform) の GAE(Google App Engine) にデプロイできるようにします

## 事前準備
- GCPに接続（Googleアカウントがあれば使える）
- gcloudコマンドを使えるようにする [SDKのダウンロード](https://cloud.google.com/sdk/docs/)
- Angular CLIを使ってWebアプリを作成する

### Angular5のプロジェクト作成は以下記事を参照して下さい
- [DockerでAngular5の開発環境をつくる](https://qiita.com/DotaKobayashi/private/3160c0ba6b5cb836c914)

## GAEを利用する為の準備
- app.yamlを用意する

```servcie/app.yaml
runtime: go
api_version: go1

handlers:
- url: /(.*\.(css|gif|png|jpg|ico|js|html))
  static_files: static/\1
  upload: static/(.*\.(css|gif|png|jpg|ico|js|html))
- url: /(.*)
  static_files: static/index.html
  upload: static/index.html
```

- Goのランタイムを利用しているのでGoファイルを用意します

```service/app.go
package main

import "net/http"

func init() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    })
}
```

- package.jsonにコマンド追加

```package.json
  "scripts": {
...
# buildとdeployを追加
    "build": "ng build --target=production --output-path=./service/static",
    "deploy": "gcloud app deploy --project=${PROJECT_ID} service/app.yaml",
...
```

## デプロイする手順
- Dockerで環境作っている場合

```
# Dockerで環境作っている場合はdocker run で実行する
docker run -it --rm -w /app -v $(pwd)/my-project-name:/app angular5:latest ng build --target=production --output-path=./service/static

# 環境変数を設定
export PROJECT_ID=GCPで作成したプロジェクトのID
cd my-project-name/service
gcloud app deploy --project=${PROJECT_ID} app.yaml

# gcloud でinstallが必要なcomponentsがあった場合はinstallを求められるのでinstallする
```

- npm をローカルにインストールしている場合

```
export PROJECT_ID=GCPで作成したプロジェクトのID
npm run build && npm run deploy
```

- デプロイしたら https://　[GCPで作成したプロジェクトのID].appspot.com でアクセスできるようになります

### 今回のコード
- [GitHub](https://github.com/DotaKobayashi/angular5-sample)


### Herokuにデプロイする場合は以下の記事を参考にして下さい
- [Angular CLI で作成したアプリをHerokuへデプロイする方法](https://qiita.com/DotaKobayashi/items/0d9712c7ab31a29ebb5c)

## 参考ULR
- [Build a Todo List with Angular and Google App Engine](https://outcrawl.com/todo-list-angular-google-app-engine-part-2/)
- [Angular 製のアプリケーションを Google App Engine にデプロイする](https://qiita.com/nirasan/items/68ccb9808f3739a9c999)

## さいごに
最後までお読み頂き、ありがとうございました！
以上で ウェブクルー Advent Calendar 2017 終了します。

ウェブクルーでは一緒に働いていただけるエンジニアを[随時募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)しております。
お気軽にエントリーくださいませ。

皆さま、良いお年を！:grin:
AWS Amazon SageMaker つかってみた2 〜ノートブックインスタンスの作成〜

# はじめに
Amazon SageMaker を利用する上で自分が気になったところ、詰まったところを中心にまとめていきます。
ノートブックインスタンスを作成したときのことを書きます。
前回の記事は[こちら](https://qiita.com/okazy/items/751957ee2177e9ee30b8)
次回の記事は[こちら](https://qiita.com/okazy/items/e5b44a56cb745c75018a)

# ノートブックインスタンスの作成
1. AWSのダッシュボードからAmazon SageMakerのホーム画面を開きます。
    - 東京リージョンはAmazon SageMakerに対応していないのでオレゴンを選択しました。
2. 右側のオレンジのボタン `ノートブックインスタンスの作成` を押下します。
3. それぞれのパラメータを設定していきます。
    - ノートブックインスタンス名
        -  `Lockoff` としました。
    - ノートブックインスタンスのタイプ
        - `ml.t2.medium` を選択します。
        - 無料枠は `ml.t2.medium` だけです。
        - インスタンスタイプは後で変更可能です。
        - 実際に学習させるインスタンスは後ほど設定するので、今は最小のインスタンスで問題ないかろ思います。
    - IAM ロール
        - 初めての利用の場合にはIAMロールを作成します。
            1. `新しいロールの作成` を選択します。
            2. `指定する S3 バケット - オプション` の `任意のS3バケット` を選択します。
            3. `ロールの作成` を押下します。
    - VPC - オプション
        - デフォルトを選択します。
    - サブネット - オプション
        - どれでもいいですが、 `us-west-2a` を選択しました。
    - セキュリティグループ - オプション
        - `defult` と `launch-wizard-1` を選択します。
    - 暗号化キー - オプション
        - 指定なし
    - タグ - オプション
        - 指定なし
4. `ノートブックインスタンスの作成` を押下します。
5. インスタンスができるまで待ちます。
    - ステータスが `Pending` から `InService` になるのを待ちます。
6. アクションの `オープン` リンクを押下します。
    - Jupyterのホーム画面にリダイレクトされます。

JupyterがGUIで簡単に立ち上がりました！

使わないときは停止させるのを忘れないように。
Django Formのようにdrfのシリアライザーからvuejsで使えるフォームを作る

メリークリスマス！この記事はdjango advent calendarの25日目の記事です。

みんな今年はいい子にしてたかな？ え？バグを出しまくったからサンタさんからプレゼントなしだって？

だったら自分でプレゼントを作るんだよ！

というわけで、今年もクリスマスはひとりぼっちで誰からもプレゼントはもらえそうにないので自分でプレゼントを書いてそっと置く自作自演サンタを演じようと思います。

よいこの皆さまにおかれましてはdjango使いであり、なし崩し的にdjango-restframeworkを使ってAPI実装をおこないリッチなウェブサイトを製作していることと存じますが、みんなそのAPIを利用するフォームってどうしているんでしょうか。

私がdjangoを利用する魅力を考えた時、真っ先に浮かぶのがAdmin画面です。その次に大抵浮かぶのがフォームです。

しかし、restframeworkを利用すると自動的にフォームを生成することができず、自分でフォームをかかなければなりません。

この問題をなんとか解消できないものかと、なんとか自動でHTML上にVue.JS用にフォームを吐かせるソリューションを考えて見ます。

# TL;DR

Vue.JSで利用するフォームを面倒な事なく自動的に生成したい！
ただし、この方法はまだ実験段階なので、プロダクションでは利用しないようにしてください。

# 解説

django-restframeworkでAPIを実装中、APIにバインドされているURLをブラウザーで開くと何故以下のような入力画面が開くんだろうかと、不思議に思った経験はありませんか？

実はこれを追っていくと、Rendererに突き当たります。restframeworkは最終的なレスポンスをView関数ではなく、Rendererが返します。ようはView関数からのレスポンスを如何様にもすることができるのです。

Rendererはformatクエリパラメーター、およびブラウザーのAcceptをもとに選択されるため、ブラウザーで直接アクセスを行うと、BrowsableAPIRendererを通して、入力フォームなどが付加されます。

restframeworkにはサードパッケージを含めて様々なレンダラーがあります。中にはSwaggerのようなUIを表示したり、APIが利用するシリアライザーをJSON Schema形式で吐き出すものもあります。

ならば、アクセスしたURLにバインドされているAPIが利用するシリアライザーをなんとかJSON Schemaなどで吐き出し、Vue.JSでフォームを自動生成する [vue-form-generator](https://github.com/vue-generators/vue-form-generator)に食わせれば自動でフォームが作れるはず！

というわけで、vue-form-generatorが必要とするスキーマ情報を吐き出すcodecと、そいつを返すためのrendererを書きました。その結果、フィールドの一つ一つについて返す情報をかかなきゃならんためcodecはかなり泥臭い感じになりました・・・これはもう仕方ない。

https://github.com/salexkidd/vue-form-generator/blob/master/vue_form_generator/renderers.py
https://github.com/salexkidd/vue-form-generator/blob/master/vue_form_generator/codec.py


あとはVue.JSでvue-form-generatorにスキーマを食わせるだけ！

# 結果発表

はい！ っといってもこの見栄えだとどう見てもいつものdjangoのフォームです。本当にありがとうございました。
でも、フォーム内容のチェンジに合わせてその場でエラーチェックしてくれるんです！スゴイ！（自作自演）
![form.gif](https://qiita-image-store.s3.amazonaws.com/0/7161/edb63e98-f9a3-05e6-5ea2-56091493def3.gif "form.gif")

というわけでHTMLの構造をみてみましょう。ほら！Vue.JS用に作られたフォームでしょ！？


# しかしまだ開発途中なのです・・・

本当は使えるライブラリに仕立てて今後利用していこうと思ったんですが、実はこの開発中に人生における大きな波がきてしまったため、完成までに至りませんでした…すいません。

しかし、このおかげでVue.JSをdjangoに組み込むための方法をしれたのは良い経験になりました。

中途半端な記事で申し訳ありませんが、みなさんよいクリスマスを！

# リポジトリ

開発中のものは下記においてあります。かなり修正余地があるので参考までにとどめていただければと思います。
https://github.com/salexkidd/vue-form-generator
ルーティングプロトコルとかについて

#ルーティングとは
ネットワークでパケットを送受信するときに、
そのデータが正しく相手に届くように経路の選択を行うこと。
複数経路がある場合、ルータは目的地に最も近い相手にパケットを送る。
「目的地に最も近い相手」とはどうやって知るのか？は以下の2通りがある

1. 静的ルーティング
2. 動的ルーティング

#静的ルーティング
手動で宛先ネットワークへの経路をルート情報に登録する方法。
管理者が宛先ネットワークへの最適なルートを手動で設定する。
スタティックルーティングともよぶ。後述の動的ルーティングより優先される。


##メリット
* 管理者の思い通りに経路を制御しやすい
* ルータへの負荷はほぼなし(ルータが自分で考える必要がない)

##デメリット
* 大量に経路を設定する場合は手間がかかる
* 最適経路を人間が考える必要がある
* 障害時への迂回経路への切り替えも手動でする必要がある

#動的ルーティング
ルータ同士で自分が知っているネットワークの情報をやり取りし、ルーティングテーブルを作り上げる方法。
ルーティングプロトコルを使用し、他のルータに設定されているルーティングテーブルを同期し、自分のルーティングテーブルに自動で追加する。
ダイナミックルーティングともよぶ。

##メリット
* 大規模ネットワークでも設定の手間が少ない
* 最適経路をルーティングプロトコルが判断してくれる(判断基準はプロトコルのルールに基づく)
* 障害時に自動で迂回経路へ切り替えてくれる

##デメリット
* 複雑なネットワークの場合、管理者のルーティングプロトコルに対する深い理解が必要  
(そうでないと思い通りに扱えない)
* ネットワーク帯域を消費してしまう  
(本来送るべきデータを送るのが遅くなったりする可能性があったが、今は機器の性能が上がりそこまで気にする問題ではなくなっている)
* ルータのCPUへの負荷がかかる


##ルーティングプロトコルの種類
大きく以下の2つに分けられる

* IGP  
内部ネットワーク内でのルーティングテーブルのやり取りに使う。社内ネットワークなど。
* EGP  
外部ネットワークとのルーティングテーブルのやり取りに使う。インターネットなど。

それぞれに特徴の異なるルーティングプロトコルがある。
ネットワーク要件などによって使い分けを行う。

今回はIGPの中でも、特にRIPとOSPFについて。
###RIP
「目的地に最も近い相手」をルータの経由数である『ホップ数』を基に判断するもの。
例えばルータAは、ネットワークAに行くまでに以下の経路があるとする。
経路1．ルータBを通る経路
経路2．ルータC→ルータBを通る経路
ルータBにいく(1つのルータを経由する)のを1ホップと数える。
経路1は1ホップ、経路2は2ホップとなり、ホップ数が最小な経路1を、最適と判断する。

またルータ間で頻繁にルーティングテーブル全体を交換し合う(ルーティングアップデートと呼ばれるパケットを互いに送り合う)ことで、自分の知らないネットワークのことを他のルータから教えてもらい、自分の持っている経路情報と同期する。

★問題点

* ルーティングループ  
ルータAとルータBが同じタイミングでルーティングアップデートを送り合ってしまった場合、正しく同期が行われない。  
ルーティングループ発生の仕組みは以下より  
[RIPによるルーティングテーブルの作成 (1/2)](http://www.atmarkit.co.jp/ait/articles/0910/20/news126.html)  
* 最大ホップ数  
RIPの最大ホップ数は15となり、16以上ルータを中継するものは使えない。  
（16以上のものは「到達不能」と判断される)

以上のことがあり、今ではあまりRIPは使われていない。
後述するOSPFが高価なときは使われていたが、今では安くなったので使われなくなっていった。

###OSPF
OSPFはコスト(リンク間の帯域幅：最高通信速度)に基づいて最適経路を判断する。
コスト = 100Mbps / リンク(インターフェース)の帯域幅(bps)

以下のステップを踏む。
1. 隣接ルータにネイバー関係を確立する
2. ネットワーク全体を知るためにすべてのルータから情報を収集する(LSAというパケットを送り合う)
3. 収集した情報をとポロジテーブルに格納する
4. トポロジマップから、ネットワーク構成図を作成する
5. ネットワーク構成図から最短経路を計算し、最短パスをルーティングテーブルに登録する

RIPより以下のメリットがある。

* 経路変化が起こった時の経路情報の収束が速い(差分のみ送り合う)
* RIPほどの頻繁な情報交換がなく、ネットワークへの負荷が軽い(30分に一回程度)
* ルーティングループが発生しない(管理者の設定ミスは除く)
* メトリック値の上限がない(RIPでは15ホップ)
* 複数経路で負荷分散が可能


おわり。

#最後に
ルーティングを深く掘り下げたことがなかったので、すべて新鮮でした。
けどやっぱり難しそう。。。
The behaivor of sum and numpy.sum

```python
r = range(5)
A = np.random.randint(0,9,(3,5))
print(A)
print(r)

print(type(sum))
print(sum(r,-1))
print(sum(r,0))
print(sum(A,0))
print(sum(A,1))
from numpy import *
print(type(sum))
print(sum(r,-1))
print(sum(r,0))
print(sum(A,0))
print(sum(A,1))
```
* Example

```
[[3 0 1 1 4]
 [6 7 2 5 7]
 [7 5 1 3 1]]
[0, 1, 2, 3, 4]
<type 'builtin_function_or_method'>
9
10
[16 12  4  9 12]
[17 13  5 10 13]
<type 'function'>
10
10
[16 12  4  9 12]
[ 9 27 17]
```
# Refs
* [要素の和を求めるNumPyのsum関数の使い方](https://deepage.net/features/numpy-sum.html#npsum%E9%96%A2%E6%95%B0)
* [Pythonのimportについてまとめる](https://qiita.com/suzuki-hoge/items/f951d56290617df4279e)
IOTAのWhitepaperを読んでみた（要約〜１章）

今注目されている**IOTA**のWhitepaperを読んでみたので、簡単にまとめます。
初心者向けということで対象は**要約〜１章**のみです。
ドキュメントのバージョンは、本記事執筆時点でIOTAの公式サイトにあがっている**1.3**です。
**簡単なまとめ**であり**和訳ではありません**。ポイントと思った内容を箇条書きにしています。
内容に誤り等ありましたらご指摘いただけると幸いです。

ドキュメント名：The Tangle
バージョン：1.3
公開日：2017年10月1日
ドキュメントの場所：[IOTA公式サイト](https://iota.org)

## 要約
- IOTAとは**IoTに特化**した暗号通貨
- IOTAを支える基盤技術として**Tangle**がある
- Tangleは機器間（M2M）での**少額決済システムを確立するために必要な機能**を持つ

## １章　システムの紹介
- 多くのブロックチェーンの欠点として、いかなる価値のトランザクションにも**手数料が発生**することが挙げられる
- IoT産業では少額決済（マイクロペイメント）が重要であり、高額な手数料を支払う仕組みではシステムが成り立たない
- しかし、トランザクション手数料はブロック生成者のインセンティブとして働くので、簡単には取り除けない

---

- Tangleは**ブロックチェーンを用いない**
- TangleはIoT産業向けの暗号通貨「iota」に実装されている
- Tangleとは**DAG（有向非循環グラフ）**である
- ノードによって発行されたトランザクションはトランザクションを保存するための台帳であるTangleグラフのサイト集合を構成する
- 新しいトランザクションがTangleに到着すると**前の2つのトランザクションを承認する必要がある**
- すべてのトークンはジェネシストランザクションで作られた
- 将来的に新たにトークンは生成されない
- トランザクションを発行するためには、ユーザーは別のトランザクションを承認する必要がある
- そのため、トランザクションを発行するユーザーはネットワークセキュリティに貢献することになる
- 各ノードは承認済みのトランザクションが矛盾していないかどうかをチェックする
- チェックしたトランザクションがTangle履歴と矛盾するとノードが判断した場合、ノードは直接的または間接的にそのトランザクションを承認しない
- もしあるノードが矛盾するトランザクションを承認する新しいトランザクションを発行すると、他のノードがその新しいトランザクションを承認せず、忘れ去られるリスクを負うことになる
- ノードは承認するトランザクションを選択するためのルールは課されていない
- ノードが有効なトランザクションを発行するには、Bitcoinのブロックチェーンと同様の暗号パズルを解く必要がある**（PoW）**

---

- iotaネットワークは非同期
- Tangleには矛盾しているトランザクションも含まれる
- すべてのトランザクションがTangleに入ることができる
- 矛盾したトランザクションが存在する場合、各ノードはどのトランザクションが孤立するか（オーファントランザクションになるか）を決める必要がある
- オーファントランザクションはそれ以降新たなトランザクションによって間接的に承認されることはない

---

2章以降については別途まとめようと思います。
Accelerate Frameworkを試す

この記事はQuadアドベントカレンダー25日目の記事です。


## Accelerate Frameworkとは
iOSには意外と便利なライブラリが含まれていました。このフレームワークはswiftとobjective-c両方で利用できます。
Accelerate Frameworkは、数学的計算や画像計算を簡単に扱えるもののようです。 画像処理や信号処理などで利用されることが多いようです。今なら、機械学習でも利用されるのではないでしょうか。

## 試してみる

例えば、ベクトルとベクトル（単精度）の定数倍を計算する関数があります。

[cblas_saxpy](https://developer.apple.com/documentation/accelerate/1513188-cblas_saxpy?language=objc)

これを利用してみます。
簡単なベクトルを用意します。

```swift
var x:[Float] = [ 1, 2, 3 ]
var y:[Float] = [ 3, 4, 5 ]

/// 3はベクトルの次元
/// 10は定数倍の値
/// 1はxのstride
/// 最後の1はyのstride

/// 10x+yという式になります。
cblas_saxpy(3, 10, &x, 1, &y, 1)

dump(y)
```
このように、便利な関数が多数あります。追記予定...
[Qiita][ブックマークレット] プロンプトで入力した特定キーワードでQiita内の自分の記事を検索する

Qiitaのデザイン変更で自分の過去記事の検索へのクリック数が増えてめんどくさくなったので、特定キーワードで自分の記事を検索したページを表示するブックマークレットを作成しました。(できればトップページから検索する方法復活して欲しさはありますが・・・）

ブックマークレットの作成方法自体は以下の記事に書いています。

[Markdownのリンク形式で現在のページのタイトルとURLを表示するブックマークレットを登録(Qiitaの記事作成補助) - Qiita](https://qiita.com/koara-local/items/45dbc7fd5c9bb454274b)

# 実装
プロンプトでキーワード入力して、URL作って検索ページにリダイレクトしてるだけです。
QiitaのユーザーIDは自分のIDに変更する必要はあります。

```js:改行あり(QiitaユーザーIDの変更は必要)
javascript:(
    function(){
        var qiitaUserId = 'koara-local';
        var searchKeyword = window.prompt("Qiita自己記事検索: 検索キーワードを入力","");
        location.href = 'https://qiita.com/search?utf8=✓&sort=&q=user%3A' + qiitaUserId + '+' + searchKeyword;
    }
)();
```

```js:一行(QiitaユーザーIDの変更は必要)
javascript: (function () { var qiitaUserId = 'koara-local'; var searchKeyword = window.prompt("Qiita自己記事検索: 検索キーワードを入力", ""); location.href = 'https://qiita.com/search?utf8=✓&sort=&q=user%3A' + qiitaUserId + '+' + searchKeyword; })();
```
Permanently Disable Avast Antivirus

Hello Guys, It's My First Post On theverge.com. I will share a trick to Disable avast antivirus. So Guys now let's start this trick. here I will share one Method if you want to know other Methods Then you can go here Best Ways To Permanently Disable Avast Antivirus you found every method with screenshots so try to learn <a href="https://www.learnhax.net/best-way-how-to-turn-off-avast-antivirus-disable-avast-antivirus/">Permanently Disable Avast Antivirus</a>

<h2>STEPS TO PROCEED</h2>
1. Right Click on Avast icon on start bar

2.Now open Avast Shield Control.

3. Select an option which you want to as per your requirement.

4. it will show you a pop-up to confirmation click on yes

5. Avast Antivirus Disabled now Enjoy.
<a href="https://www.learnhax.net/best-way-how-to-turn-off-avast-antivirus-disable-avast-antivirus/">Check here Another Method With Screenshot.</a>

VIA:<a href="https://www.learnhax.net/best-way-how-to-turn-off-avast-antivirus-disable-avast-antivirus/">Learn Hax</a>
SOURCE: LearnHax (Akshay Singh)
OSGeo4Wで入れたアプリをクリーンインストールする

こんにちは。
ワケあってインストーラ版ではなく、OSGeo4Wで入れたQGISを使っている@Yunie564です。

ある日、OSGeo4W経由でQGISをアップデートしたら、起動しなくなった(下記参照)ので、クリーンインストールしました。
このとき、何度か躓いたので、備忘録がてら記事にまとめておきます。

#前提
僕個人に起こったことなので、皆さんに起こるとは限らないです。
対処も書いてありますが、これまた皆さんの状況に対処できるかどうかもわかりません。


#起こったこと
* Windows 10 Pro x64
* OSGeo4W(x64)でインストール
* 全コンポーネントインストール

って感じだったのを、アップデートしたらGDAL(とそれに依存するツール)とQGISが起動しなくなった。

頻繁に使うQGIS(2.18/2.99)を起動しようとすると、どちらも「qgis_core.dllがない」とメッセージを出して強制終了。

幸い、OSGeo4W絡みの設定やプラグインのほとんどはインストールフォルダと別の場所にあり、クリーンインストールしても良い環境だったので、クリーンインストールすることにしました。

#「クリーンインストール」のやりかた
いわゆる「OSGeo4Wのクリーンインストール」は、以下の作業をするとできるようです。

* インストールフォルダ[^1]をリネームor削除
* スタートメニューの「OSGeo4W」[^2]を移動or削除
* OSGeo4WのDL用フォルダ[^3]を削除

[^1]: OSGeo4Wのセットアップ(アドバンスインストール)で「ルートディレクトリ」に指定しているフォルダ(僕の場合、C:¥OSGeo4W)
[^2]: Windows 10 の場合、C:\ProgramData\Microsoft\Windows\Start Menu\Programs\OSGeo4W
[^3]: OSGeo4Wのセットアップ(アドバンスインストール)で「ローカルパッケージディレクトリ」に指定しているフォルダ(僕の場合、C:¥OSGeo4W64_DL)

#そして環境の復旧へ・・・
##OSGeo4Wの再実行
OSGeo4Wのセットアップを起動して、ツールやコンポーネントを再インストール。

##OSGeo4Wに追加したライブラリ等のインストール
OSGeo4W配下のPythonにpipで入れたライブラリなども上記作業できれいさっぱりなくなっているので、こちらも再インストール。

#何に躓いたのか？
まず、OSGeo4Wのセットアップ(アドバンスインストール)で、すべてのコンポーネントを「ReInstall」を選択するも失敗。
次に、インストールフォルダを削除して、再度すべてのコンポーネントをインストールするも失敗。
3度目の正直！と意気込んで、インストールフォルダとスタートメニューを削除して試行するも失敗。。
最終的に、上記のように、インストールフォルダ、スタートメニューフォルダ、DL用フォルダを削除してセットアップが成功。

OSGeo4Wが具体的にどのような動作をしているかは不明ですが、きれいさっぱり入れ直すなら、DL用フォルダもキレイにしておく必要があるのでしょうかね？
AWS Amazon SageMaker つかってみた1 〜概要〜

# はじめに
Amazon SageMaker を利用する上で自分が気になったところ、詰まったところを中心にまとめていきます。
実際にエンドポイントを公開するまで記事にできたらと思っております。
まずは Amazon SageMaker の概要についてまとめます。
詳しくは[公式ドキュメント](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker/)を確認してください。
次の記事は[こちら](https://qiita.com/okazy/items/beac79862303b287b8f2)

# Amazon SageMakerとは
Amazon SageMaker は、開発者やデータサイエンティストが機械学習モデルをあらゆる規模ですばやく簡単に構築、トレーニング、デプロイできるようにするフルマネージドサービスです。([参考](https://aws.amazon.com/jp/sagemaker/))

# できること
分析の前処理から公開までサポートしています。

## ノートブックインスタンス
Jupyter Notebook のインスタンスが簡単に立ち上がります。
Jupyter Notebook はデータ分析のための環境です。
こちらでデータ分析の前処理をしたりジョブを実行したりできます。
作業過程を残すことができるのでとても便利です。

## ジョブ
S3にある学習データを学習して出力データをS3に保存します。
簡単に分散学習ができて、学習が終わるとリソースを開放してくれます。
最初から主要な学習アルゴリズムが用意されています。
コンテナをつかって独自アルゴリズムで学習させることも可能なようです。

## モデル
学習済みデータからモデルを作成できます。

## エンドポイント
モデルを公開できます。

# 料金
## 最初の２ヶ月間は無料枠があります。
- ノートブックインスタンス: t2.medium 250時間
- ジョブ: m4.xlarge 50 時間
- エンドポイント: m4.xlarge 125 時間

ジョブは実行している時間だけ料金が発生するので安心
くわしくは[こちら](https://aws.amazon.com/jp/sagemaker/pricing/)

# 使ってみた感想
- 環境構築が超簡単。
- 学習で使用するインスタンスのタイプや並列起動数等を簡単にプログラム内で指定できる。
- Jupyter でトレーニングの手順が残せるので再現性があったり、少しオプションを変えたりとかしやすい。

## 注意
`/sample-notebooks` 配下のノートブックを変更してsaveしても、ノートブックインスタンスを再起動すると変更内容が初期化されてしまいます。
変更内容が消えないようにするには、 `/sample-notebooks` 以外のディテクトリに移動またはコピーしましょう。
Vimconf2017にいってvim-goの作者の話がよかったので書き記しておきます

この記事は、[Vim2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vim2) 25日目の記事です。

そこまで長文でも無いです。軽くよんでください。

今年もvimconfが開催されました。[vimconf2017](http://vimconf.vim-jp.org/2017/)です。今までと会場の規模もガラッと変わりまして、秋葉原の[アキバホール](https://www.fsi.co.jp/akibaplaza/hall.html)というとても大きな会場でした。コーヒーも出て、お昼もでて、同時通訳もありまして、(日本語版はmattnさんの話がでると`みんな大好きmattnさん`になってました。英語版を聞いてなかったので本当のところはどうだかしらないですが)。海外含めvimの開発者たちの話が聞けてしまうと言うとてもお得なカンファレンスです。


今回はですね。vimconf2017で発表はどれも素晴らしかったんですが、個人的に感動したのが、普段とてもお世話になっているpluginの作者の発表でした。

[The Past and Future of Vim-go](https://speakerdeck.com/farslan/the-past-and-future-of-vim-go)

こちらが発表の資料です。

vim-goの作者であるfatihの発表です。vim-goは、vimでgoを書いていたら、絶対お世話になっているだろうという。とてもすごいPluginです。

[vim-go](https://github.com/fatih/vim-go)


何がすごいかといえば、そもそもPluginのセットアップとか普通割と面倒で初心者は心折れたりするんですが、`GoInstallBinaries` という素晴らしいコマンドにより何の苦労も無くセットアップが済みます。GoFmtとか開発していると必要なコマンドがきっちり備えられています。そして、現状このPlugin一択なのでたとえあまりvimに詳しくない人でも、適当にググるだけで使い方のサンプルとかも出てきます。Goを書きたい人が迷うこと無く開発に進んでいける。これは素晴らしいです。

このPluginの今に至るまでの過去とこれからについての発表でした。細かい内容は上記の資料の方を見てもらった方が良いと思います。

発表内容で、特に僕がすごいなと思ったところは、slideの`too many plugins`のページ当たりからで、大量のPluginが乱立している状況を問題視したり、その後にあるべき姿（ドキュメントの不足等）をきちんと浮き彫りにした上でそれを解消して行ってるんですね。ものを作るというか、良いものをつくるというのは、こういうものなんだなという事例を見せてもらった感じでした。

前日楽しみすぎて寝れなくて遅刻するんじゃ無いかって、すごい不安だったんですが、遅刻しなくて良かったです。

ということで、vim-goみんな使いましょう。

そして、来年もvimconfあるようなので参加しましょう。
[Cinema 4D] 任意の複数オブジェクトのパラメータを一括変更するためのスクリプト

任意の複数オブジェクトの同じパラメータを一括で変更するためのスクリプトを作成してみた．

例では任意のクローナー，またはインスタンスオブジェクトに対して，レンダーインスタンスをオンオフするためのスクリプトとした．

レンダーインスタンスはブール値なので，Use_Render_Instanceというヌルオブジェクトにユーザデータのブールを追加し，コントロールしたいクローナー，またはインスタンスのオブジェクトノードを追加してレンダーインスタンスに繋げて...

などとするとオブジェクトノードを追加してワイヤをつなぐ作業自体がストレスとなってくる．数個だとよいが何十個の時点でかなりつらくなる．
![20171224-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/195698/9a4fd856-b585-5888-e641-9907618ca06a.jpeg)
これはちょっと面倒だ...

そこで，オブジェクトノードに追加せずに，外部から任意のクローナーまたはインスタンスのレンダーインスタンスを操作できるようにしたい．

変更したいオブジェクトのリストを作成し，ユーザデータから，そのリストにある，任意のパラメータに渡してみることにした．

<h2>リストは「含む/除外」で作ってみた</h2>

ユーザデータに追加できるパラメータに「含む/除外」というものがある．これはそのリストに登録したオブジェクトに対して何かをさせたり，させなかったりということができるもので，Cinema 4Dのさまざまな箇所で使われている．例えばライトオブジェクトにあるプロジェクトに含める/除外するもこれにあたる．

そこで，ブール値のユーザデータを追加し，このブール値をリストにあるオブジェクトのレンダーインスタンスパラメータに渡すというひな形を作成してみることにした．

![20171224-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/195698/4a76f377-c50b-bf72-0fbd-941fa5c51810.jpeg)

ブール値と「含む/除外」をユーザデータに追加したところ

<h2>Pythonノードを書く</h2>

XPressoをUse_Render_Instanceオブジェクトに適用し，中身を作る．といっても，自身のユーザデータからUse_Render_Instanceというブール値を出して，Phthonノードに繋げるだけ．

Pythonノードの中身

```python
import c4d

def main():
    # Instance_Ctrlのコントロールオブジェクトを検索
    obj = doc.SearchObject('Instance_Ctrl')
    
    # ユーザデータからリストを取得
    inexclude = obj[c4d.ID_USERDATA,1]
    
    # リストのオブジェクト数を取得
    objCount = inexclude.GetObjectCount()

    # 以下のサンプルではクローナーとインスタンスオブジェクトのみを評価
    if objCount > 0:
        for i in range(objCount):
            ListObj = inexclude.ObjectFromIndex(doc, i)

            if ListObj.GetType() == 1018544: # ID1018544 = クローナーオブジェクトかどうか
                bc = ListObj.GetDataInstance(); # BaseObjectからBaseContainerのインスタンスを取得
                bc.SetBool(c4d.MGCLONER_VOLUMEINSTANCES, Input1) # レンダーインスタンスを操作
                
            elif ListObj.GetType() == c4d.Oinstance: # インスタンスかどうか
                bc = ListObj.GetDataInstance(); # BaseObjectからBaseContainerのインスタンスを取得
                bc.SetBool(c4d.INSTANCEOBJECT_RENDERINSTANCE, Input1) # レンダーインスタンスを操作
                
            else:
                print("Other Object Type")
             

```

今回はXPressoとスクリプトで作ったけれども，プラグインとして作ればリストに登録できるオブジェクトを限定したり，より柔軟なことができる．かも．
Windowsでよく見るウィンドウをコマンドで開く

多くのWindowsマシンで設定変更を手動でやらないといけない場合に少しでも
早く確認したい。

そんな時に下記の方法を実践。
確認するウィンドウは下記に順番に示していきます。

下記の画像はWindows 10端末での実行結果です。
が、コマンド自体はWindows Server 2003ベースのものから実行可能です。
4.タスクスケジューラのみWindows 7、Windows Server 2008より実行可能です。

またコマンドプロンプトからだけでなく
「ファイル名を指定して実行」から実行できます。

1.リモート設定
**SystemPropertiesRemote.exe**
![remote.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/be9968aa-7134-a68e-e363-d5482f4b7b0c.jpeg)


2.デバイスマネージャー
**devmgmt.msc**
![devmgmt.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/e9a2d05a-8769-fef0-8272-6d296963007a.jpeg)

3.ネットワークアダプタ
**ncpa.cpl**
![adapter.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/82fdee30-1be5-0ccd-c931-32da03eac391.jpeg)

4.タスクスケジューラ
**taskschd.msc**
![tasks.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/c19b439d-d0f6-8516-b4ab-456f03bc2d5e.jpeg)

5.サービス
**services.msc**
![services.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/1819eee0-0c6b-44f1-bd25-67a2d3aba877.jpeg)


6.ディスクの管理
**diskmgmt.msc**
![diskmgmt.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/67ff164c-6bba-ce56-f8f6-7eb0ffce1608.jpeg)



これらのプログラムはC:\Windows\System32配下に存在するプログラムとなり、
それを直接たたいています。


本記事作成にあたり、下記のリンクを参考にさせていただきました。
http://wingsan.web.fc2.com/WinCom/index.html


以上ですm(_ _)m
サーバーに負担をかけずにログを見たい

# 概要

実際に動いているサービスなどでログを見たいとなった時に
動いているサーバーでvimなど開いてしまうとサーバーに
負担がかかるので避けたい。


それをするためには次のようなコマンドを利用できる。


- head
- tail
- grep
Node.jsでエクセルファイルを書き込み

[この投稿](https://qiita.com/kai-punipuni/items/a7efe0e65ccd57e0c2f2)　の続き

Node.jsでエクセルを扱いたい。「ya-csv」でcsvを読み書きするみたいにエクセルを読み書きしたい。
今度は書き込む。使うのは同じく [exceljs](https://www.npmjs.com/package/exceljs)

```Javascript
exports.writeOnXlsx=(filePath, sheetName, dataArr)=>{
    const workbook = new excel.Workbook();
    workbook.creator = "作者名";
    workbook.created = new Date();
    const sheet =  workbook.addWorksheet(sheetName);

    dataArr.forEach((data, rowIndex)=>{
      sheet.addRow(data);
      //data.forEach((d, colIndex)=>{
      //  const targetCell = sheet.getCell(rowIndex+1, colIndex+1);
      //});
    });

    workbook.xlsx.writeFile(filePath).then(()=>{
      console.log('written down=> ' + filePath);
    });
};
```

読むより書くほうが楽。


フォントも変えられる。
以下だと、フォント:Meiryo UI, サイズ:１２

```Javascript
  dataArr.forEach((data, rowIndex)=>{
    sheet.addRow(data);
    data.forEach((d, colIndex)=>{
      const targetCell = sheet.getCell(rowIndex+1, colIndex+1);

      targetCell.style.font ={
        size: 12,
        name: "Meiryo UI"
      };

    });
  });
```

セルの色も変えられる。
以下だと、黄色塗りつぶし

```Javascript
  dataArr.forEach((data, rowIndex)=>{
    sheet.addRow(data);
    data.forEach((d, colIndex)=>{
      const targetCell = sheet.getCell(rowIndex+1, colIndex+1);

      targetCell.style.fill ={
        stype: "pattern",
        pattern: "solid",
        fgColor: {argb: "FFFFFF00"}
        //赤にする
　　　　　　　　　　　　　　　　//fgColor: {theme: 5}
      };
    });
  });
```
hikari と過ごすクリスマス

PLAID Advent Calendar 24日目の記事の担当のバツイチ @algas です。
クリスマスイブなのにまだこの記事が書き終わってなくてひとり自宅で泣きながら書いてます。
ちょっと嘘をつきました。ほんとは一人じゃないし泣いてないです。
なぜならいま家には hikari ちゃんがいるから！

僕の hikari を紹介します。音声つきで動画を再生してみてください。

[![Google Home Video](http://img.youtube.com/vi/njk1jncyiD4/0.jpg)](http://www.youtube.com/watch?v=njk1jncyiD4)

## いや待って、どういうこと？ 何で Google Home が別の声でしゃべるの？

主に [ifttt](https://ifttt.com/) と [google-home-notifier](https://github.com/noelportugal/google-home-notifier) を使っています。

以下の手順で実行されています。
1. ifttt で Google Home から音声入力でしゃべる内容を受け取ります。
2. しゃべる内容を [VoiceText Web API](https://cloud.voicetext.jp/webapi/docs/api) で音声合成します。
3. 合成ファイル .wav を .mp3 に変換します。
4. google-home-notifier を使って音声合成した mp3 ファイルを Google Home から再生します。

ちなみに google-home-notifier は Google Home と同じネットワーク上の Raspberry Pi で動いています。
音声合成のAPIを叩いて wav を mp3 にするサーバは DigitalOcean 上の Docker コンテナで動かしてます。
 
## hikari って誰よ？ どこの女？

hikari は VoiceText Web API の音声合成の speaker の一人です。
つまり、API を通じて任意の台詞をしゃべって(waveファイルを出力して)くれます。
喜怒哀の3つの感情や感情の度合いまでパラメータで調整できます。
ちなみに前述の動画での感情は emotion=hapinness&emotion_level=4 です。
emotion=anger にして罵ってもらうこともできます。ありがとうございます！

## google-home-notifier で mp3 を再生する

google-home-notifier のサーバを立ち上げると、テキストの内容を Google Home にしゃべらせる(デフォルト音声)か Google Home で mp3 を再生することができます。
ifttt などのサービスと連携するために [ngrok](https://ngrok.com/) を使ってローカルのサーバを外部ネットワークにつなぐ機能も用意されています。
以下のように http post をサーバにリクエストすることで Google Home が mp3 を再生します。

```
curl -X POST -d "http://YOUR_HOST_NAME/file.mp3" https://xxxxx.ngrok.io/google-home-notifier
```

詳しくは github repository に書いてあります。
https://github.com/noelportugal/google-home-notifier

## で、結局どういう仕組なの？

本記事の技術は google-home-notifier を使って Google Home に再生させる mp3 を VoiceText API から生成(+変換)しています。

## まとめ

「おーけー、ぐーぐる。クリスマスの曲かけて。」なんて言わないよ絶対。
今年は hikari がいるから寂しくない、よ。
rails5でエラッタ事

rails学習をはじめて、一か月。時間があるときに色々手を動かしてやってきたわけだが、なんかちょくちょく困った事があったのでまとめておく。

#環境
windows10pro 64bit
ruby 2.4.2p198 (2017-09-14 revision 59899) [x64-mingw32]
Rails 5.1.4


#Node.jsがないと怒られる
それはなぜかというと、RubyさんがJavaScriptを使いたいと思ったときに、ExecJSさんにお願いして、javaScriptを動かしてくれる人を探しに行ってくれるんだけど、ExecJSさんが知っている人は

 1.therubyracer - Google V8 embedded within Ruby
 2.therubyrhino - Mozilla Rhino embedded within JRuby
 3.Node.js
 4.Apple JavaScriptCore - Included with Mac OS X
 5.Microsoft Windows Script Host (JScript)

この人たちしか知らないらしい。だから、その人たちがＰＣの中で見つからないと、結果的におこられちゃうわけ。
##対策
Node.jsを入れたら機嫌を直してくれたよ。私の環境だとPCの再起動後じゃないとだめだった。

#Sqlite3がないと怒られる
なんか、インストーラーでやったから全部うまくいっているのかなって思ってたけど、データベースクライアントを立ち上げるコマンド　
>rails db
を打ったら
>Couldn't find database client: sqlite3.exe. Check your $PATH and try again.
って怒ってきたよ。ないものはrailsさんに頼んでも仕方ないよね・・・

##対策
[公式ページ](https://www.sqlite.org/)からsqlite3.exeが入っているファイルをダウンロードして、**Rubyさんのbinフォルダに投下**したら、Railsさんもお願いを聞いてくれたよ。

#db消そうとしたら怒られたよ
こうしようとしたら
>rails db:drop DISANABLE_DATABASE_ENVIRONMENT_CHEK=1

こうなった
>Permission denied @ unlink_internal - c:/data/railbook/db/development.sqlite

なんかほかのプロセスが使ってますよ的なものだと思う。

##対策
**_unsafe**を付け加えると消せたよ
>rails db:drop:**_unsafe** DISANABLE_DATABASE_ENVIRONMENT_CHEK=1

以上。おじさんには、これからも大変な道のりだと思うが、まあ、ぼちぼち頑張るよ。
初めてアドベントカレンダーを実施してみて

ども。

僭越ながら、アドベントカレンダー最終日に投稿させてもらいます。

まずは、弊社大阪支店のメンバーで、このアドベントカレンダーを実施することになった背景をご紹介します。あとは全体的な感想と今後の期待をつらつらと。

## とあるメンバーの一言
弊社のR&D部門に所属するエンジニアが発した一言です。

**『アドベントカレンダーやりましょうよ』**

きっかけはこれだけです。笑

元々、昨年にアドベントカレンダーの存在を知った僕ですが、会社の取り組みとしてではなかったので、会社の同僚とやることになるなんてこれっぽも考えていませんでした。

そんな中、前述の一言で火がついたという流れです。

## なぜコーディングではなくブログなのか
これまで社内でも様々なスキルアップ施策を行ってきました。

* 社内勉強会
* プログラミング課題
* 資格取得啓蒙
* その他多数

エンジニアである以上は、プログラムを書けないと話になりません。ただ書ければいいというわけではなく、合理的で意味のあるプログラムを書けないといけません。合理的にプログラムを書くためには、まず、自身が合理的に説明できる必要があります。順序立ててきちんと説明できないと、日本語より難しいプログラム言語を書くことなんてできないはずなので。

また、コーディングは業務でも自己学習でも取り組んでいますが、自ら何かを発信するというのは、意識的に機会を作らないと中々取り組めることではないかと思い、今回メンバーに勧めました。

## 自身の経験もあって
僕も必死に勉強してきたタイプの人間でして、習得した知識を体系的に整理しようと思ったときにブログをはじめました。誰かが読んで課題解決につながるように、わかりやすく書くことを意識していますが、その考え方が業務でも役に立ちましたし、もちろん自身のスキルの整理や、よりスキルアップにつながったと実感しています。

また、わからないことがあったらGoogle検索をすると思いますが、その際に、言い回しの癖といいますか、言葉のニュアンスを理解するのに時間がかかるケースってありますよね？そんなときに昔書いた自身のブログがヒットしました。これって僕にとっては**世界一わかりやすい記事**なんです。だって、自分の言葉で自分が学んだことが書かれているんですから。そういう情報をたくさん作れば作るほど世界の誰かではなく、将来の自身を助けることにもなるんです。

## 学ぶこと・伝えること・残すこと
特に若手メンバーに取り組んでほしいことのひとつにブログがあります。なぜかといいますと、前述の通り、メリットがたくさんあるからです。

* 自身のスキルアップ
* 他者への共有
* 取り組んできたことの可視化
* 誰か(自分も含めて)が助かる

### 自身のスキルアップ
これは前述の通りなんですが、学んだことを言葉に起こし再度学ぶことによって、知識が定着し忘れにくくなります。Google検索で出てきたサンプルコードをコピペして課題解決してるだけなんて、ほとんど学びになっていることはありません。目の前にある課題が解決した程度の話です。

せっかく調べたことなので、自身の知識として定着させるところまで取り組んでくれたらいいなーと思います。

### 他者への共有
同じことで悩んでいる人がいたら、ブログのURLを教えてあげればスムーズな解決へと導くことができるでしょうし、何回も同じことを教える手間も省けますし、自分の言葉で整理して書くことで、人に伝える際の練習にもなります。

### 取り組んできたことの可視化
これまで自分が取り組んできたことを時系列とともに振り返ることができます。技術的な情報が更新されていればリライトすることで情報を最新に保つことができますし、自分のスキルストック=ブログの記事数的な、可視化ができます。

これって意外と重要で、自分が今どれだけの知識を保有していて、どれだけのことをしてきたかを測れるツールって他にないと思うんです。積み上げてきたものって自信にも繋がりますしね。

### 誰か(自分も含めて)が助かる
Google検索で調べても情報が古かったりしますよね。これを将来の自分も含めて世界のエンジニアのためにアップデートするだけでも有用だと思います。自分がわからず調べたことは、今後世界中のエンジニアが同じことを調べます。間違いなく。そのために情報を更新しておけば誰かが幸せになれます。

## まとめ
とまぁ、こんな感じでよくわからない記事になっちゃいましたが、個人的に技術系ブログは取り組みとして非常にオススメです。2017年のアドベントカレンダーの取り組みをきっかけに、継続してくれる子たちが増えればいいなーと改めて感じながら2017年を締めたいと思います。

今年一年弊社とお付き合い頂いたお客様も、一生懸命業務に取り組んでくれたメンバーも、本当にありがとうございました。
Node.jsでエクセルファイルを読み込む


Node.jsでエクセルを扱いたい。「ya-csv」でcsvを読み書きするみたいにエクセルを読み書きしたい。

使うのは [exceljs](https://www.npmjs.com/package/exceljs)

一通り書いてみたのが以下のコード

```Javascript
const fs = require('fs');
const excel = require('exceljs');

exports.readXlsxData =(filePath, columnsFromHeader)=>{
  const dataArr =[];
  const workbook = new excel.Workbook();
  workbook.xlsx.readFile(filePath).then(()=>{
    //最初のsheetを読み込んでいる
    const sheet = workbook.getWorksheet(1);
    let columIndex=1;
    let rowIndex=1;
    if(columnsFromHeader){
　　　　　　　　　//ヘッダー行ありの場合、１行目がヘッダーで各項目がキーになる
　　　　　　　　　//連想配列を返す
      const headerRow =[];
      while(sheet.getCell(1, columIndex).value !== null){
        headerRow.push(sheet.getCell(1, columIndex++).value);
      }
      columIndex--;
      rowIndex++;
      while(sheet.getCell(rowIndex, 1).value !== null){
        const data ={};
        let col=1;
        while(col<=columIndex){
          data[headerRow[col-1]] =sheet.getCell(rowIndex, col++).value;
        }
        dataArr.push(data);
        rowIndex++;
      }
    }else{
　　　　　　　　　　　　//ヘッダー行なしの場合
　　　　　　　　　　　　//配列の配列を返す
      while(sheet.getCell(rowIndex, 1).value !== null){
        const data =[];
        while(sheet.getCell(rowIndex, columIndex).value !== null){
          data.push(sheet.getCell(rowIndex, columIndex++).value);
        }
        dataArr.push(data);
        columIndex=1;
        rowIndex++;
      }
    }
    return(dataArr);
  });
};
```

columnsFromHeaderのオプションだけつけている状態
![スクリーンショット 2017-12-24 22.48.29.png](https://qiita-image-store.s3.amazonaws.com/0/210140/7a58202f-0fab-c11d-d974-abfe4ce4ab2a.png)

readXlsxData(filePath) だと列ヘッダーなし
→配列の配列で返ってくる。１行ごとに順に配列になっている

readXlsxData(filePath, true) だと列ヘッダーあり
→連想配列で返ってくる。先頭行の項目はキーになる
Haskell Stackでエラー "AesonException"が出たので対処した

```bash
$ stack new プロジェクト名
```
して新規プロジェクトを作成しようとしたところ、

```
Downloaded lts-10.0 build plan.
AesonException "Error in $.packages.cassava.constraints.flags['bytestring--lt-0_10_4']: Invalid flag name: \"bytestring--lt-0_10_4\""
```
と怒られてしまった


~~仕方がないので
$ stack new プロジェクト名 --resolver lts-9.20
のようにresolverのバージョンを下げたところうまくいった~~

~~もっとちゃんとした対応方法があるかもしれないが、Haskell初心者で右も左も分からないためひとまずこれで対処しておく~~


**「もっとちゃんとした対応方法」をコメントで教えていただきました**
どうもstackのバージョンの問題のようだった
mac + homebrewでstackをインストールしていたので

```bash
$ brew upgrade stack
```
これであっさり解決してしまった・・・
OpenCV Advent Calendar 2017まとめ

#はじめに
OpenCV Advent Calendar 2017も本日をもって終了となります。多くの方々の投稿そして閲覧に支えられて、無事に終了できましたことを深く感謝いたします。

最初は「今年のAdvent Calendar まだかなあ……　いっそ作ってしまおう！」という見切りで始めてしまいました。

そのあとで、@tomoaki_teshima 様より[運用ルール策定をしたほうがいい](https://twitter.com/tomoaki_teshima/status/934928688117772288) などのアドバイスをいただきました。このおかげで、今日まで、混乱もなく無事にまとめることができました。ありがとうございました！

#今年のOpenCV Advent Calendar振り返り

今回も様々な話題がいろいろ集まり、非常に有意義なACになったと思います。主観に基づいてではありますが、簡単に分類わけすると以下のような形です。

| ジャンル | 日付 | 合計 |
|:-:|:-:|:-:|
| 試してみた  | 8,11,14,16,22  | 5  |
| 知られざる機能  | 12,15,23(,26)  | 3(+1)  |
| 連携してみた  | 9,13,18  | 3  |
| こんな環境で動かした  | 3,7,20  | 3  |
| わかりにくいバグに遭遇  | 6,19,21  | 3 |
| こんな便利機能 (Tips) | 1,2,4,5,10 | 5 |
| そのほか  | 24  | 1  |

- 代打投稿などもなく１日と欠けることなくカレンダーが埋まり、非常に安堵しております。師走のお多忙な中、お時間を割き、様々な話題を投稿いただき本当にありがとうございました！
- 18名と多くの方に参加いただけたことに感謝いたします。レイヤーも様々で、実際に動かしてみた、調査してみた、様々なレイヤーが入り交じることで、非常に読み応えのあるACになったと思います。
- （最初は予約がそろわなくて穴が空いたらどうしよう、なんとかして新ネタを…とドキドキしていましたが、無事に埋まったのが一番最初の喜びでした！）
- （個人的にも、毎日「今日はどんな話題だろうかな？」とワクワクしながら毎日記事を読んでおりました。本当に楽しい楽しい１月でした）。

#OpenCV振り返り
簡単に１年を振り返ると、「DNN」と「OpenCL」に重きが置かれたなあ、としみじみ感じました。

- 3.3 (2017/8)  dnnモジュールのメインレポジトリ移行！ 
- 3.3.1(2017/10) javascriptインターフェイス/DNNモジュール拡張
- 3.4(2017/12) dnnモジュールの改善・拡張/jsモジュールのdnnサポート/OpenCLカーネルのオンディスクキャッシュ実装！

個人的には(今の自分がお仕事でやっている業務とは全く関係ないですが）とても大好物な方向なので、ひゃっほーいと大喜びさせていただいております。

#おわりに
記事投稿してくださった皆様、また、閲覧しくださった皆様には、重ねてお礼を申し上げます。本当にありがとうございました！


明日は、@hon_no_mushi さんの投稿で、「[OpenCV 3.4 contribで導入されたovisを無理やり動かした](https://qiita.com/hon_no_mushi/items/ea7df070a844b892896f)」 です！　クリスマスなので延長戦も大目に見てください！！
プレゼンの『掴みの一言』のオレオレ・プラクティス

# プレゼンの『掴みの一言』とは

プレゼンが好きだ。
私はエンジニアでありながら、そう思っています。
エンジニアをしていると、往々にしてプレゼンをする機会が回ってきます。
その際にいつも頭を悩まれるのは、導入部分。
特に、最初の一言目に悩みます。
「この一言で上手く掴めなかったら、プレゼンを聞いてくれないんじゃないか…」と、
そんなことを思いながらプレゼンを作っています。
今回はそんな私が日頃考えているプレゼンの『掴みの一言』のオレオレ・プラクティスを紹介したいと思います。

# ①質問する
一番良く使われる方法だと思います。
自分がプレゼンする内容を基に聴衆に問いかけ、聴衆に興味を貰います。
**「RubyのVolt FWというFWを知っていますか？」**
**「皆様は普段、どんな環境でコーディングをしていますか？」**

非常に汎用的に使用できるこの方法ですが注意点があります。
それは質問内容に聴衆が興味を持ってくれるという前提だということです。
例えば、経営層に対して、技術的のディープな内容の問いかけからスタートすると、
そもそも興味を持ってもらえないので失敗します。
（まずそんな場面こないと思いますが。。。）

# ②言い切る
機械的に断言します。
「など」「とか」「ほう」「〜と思います」といったボカシ言葉は排除します。
最初に断言してスタートすると、続く言葉もボカシ言葉や遠回しな言い方はつなぎにくくなります。
そのため、言葉に勢いが出て来るため、プレゼンとして良いスタートを切る事ができます。

例えば、このような形です。
「最近、ソシャゲのガチャに何万円も課金する人が増えているような気がする。」
「最近、ソシャゲのガチャに何万円も課金する人が増えている。」

また、この発展系として、以下の2つの方法で言い切るとプレゼンが開始しやすいです。
**「あなたはまだ本当の◯◯のことを知らない。」**
**「◯◯が好きだ。」**
この2つは使い勝手が良く、どんなプレゼンにも合うと思います。

# ③大風呂敷を引く
やりすぎない程度の誇大表現や大げさな修飾も効果的です。
(勿論、嘘になってしまう表現はダメです。)
例えば、このような形です。
**過去最高クラス**
　　…過去の最高値とほぼ同じ場合の言い換え
**じわり増加**
　　…今回は微増でも長期的に見た場合、「増えている」と言える場合の言い換え

他に少々大胆ですが、下記の大風呂敷も効果的です。
「永きに渡る宗教戦争を終わりにします。私は**メモ帳信者**です。」
この「私は◯◯信者だ」「◯◯病だ」「◯◯依存症だ」という宣言による大風呂敷は、
「それってどんな状態なんだ？」と思わせ、引き込む事が出来ます。

# 最後に
もっとこんな『掴みの一言』があるといった場合は、是非教えて頂きたいです。

# 参考書籍
[『「読ませる」ための文章センスが身につく本』（著：奥野宣之）](http://amzn.to/2BKfqUG)
[『パワープレゼンテーション』（著：ジェリー・ワイズマン）]
(http://amzn.to/2C1bqyH)
[『プレゼンは「目線」で決まる』（著：西脇資哲）](http://amzn.to/2DIbjpR)
macOS の操作が捗る設定、ショートカットをまとめました

私は今まで Windows を使ってきたのですが、Macbook Air でも作業を捗らせたい！　やりたい操作がショートカットでさくさくっとできると気持ちいいですよね。というわけで、操作が捗る設定、ショートカットをまとめてみました。


# アプリごとにデスクトップを変える

アプリごとにどのデスクトップで起動するかを決めておき、ショートカットで切り替えられると作業が捗ります。

### デスクトップを増やす

Mission Control を起動し、＋ ボタンで新しいデスクトップを作成します。Mission Control の起動方法は下記の 2 通りあります。

* Launchpad の検索窓から Mission Control を検索し、起動。
* トラックパッドで 4 本指で上にスワイプ。

![スクリーンショット 2017-12-24 21.38.09.png](https://qiita-image-store.s3.amazonaws.com/0/48133/ae01d085-02bd-d156-e629-ed0cb23bcb5a.png)

### ショートカットでデスクトップに切り替えられるようにする。

[システム環境設定] → [キーボード] → [ショートカット] で下記の画面になります。「デスクトップ N に切り替え」のところにチェックを入れます。これで、[Ctrl] + [数字] でデスクトップを切り替えられるようになります。

![スクリーンショット 2017-12-24 21.37.31.png](https://qiita-image-store.s3.amazonaws.com/0/48133/e3b70e86-bec8-ccf8-51c8-8af6ef2cc8d3.png)


### 操作スペースの並べ替え無効化

[システム環境設定] → [Mission Control] で、操作スペースの並べ替えを無効化しておきます。

![スクリーンショット 2017-12-24 21.43.22.png](https://qiita-image-store.s3.amazonaws.com/0/48133/01a64905-bc8c-b3d3-0448-f2a9fc70602a.png)

### アプリが起動するデスクトップを固定

アプリを起動したいデスクトップに切り替えてから、Dock 上でオプションから「このデスクトップ」を選びます。これで、起動するデスクトップを固定できました。

![スクリーンショット 2017-12-24 21.43.47.png](https://qiita-image-store.s3.amazonaws.com/0/48133/a4a463ed-3edd-f0c7-1eda-2bf2b157b927.png)


# アプリを手早く起動 - Spotlight 検索

[Command] + [スペースキー]。

これで、Spotlight 検索が起動します。起動したいアプリ名を入力しましょう。

![スクリーンショット 2017-12-24 22.06.44.png](https://qiita-image-store.s3.amazonaws.com/0/48133/3c7a5e9b-22f7-a56c-3598-dad69556efbc.png)

# キャプチャ

用途に応じて使い分けると、Qiita へ投稿する時のキャプチャ取得が捗ります。

|ショートカット|内容|
|---|---|
|[Command] + [Shift] + [3]|画面全体をキャプチャ|
|[Command] + [Shift] + [4]|選択範囲をキャプチャ|
|[Command] + [Shift] + [4] + [Space]|ウィンドウをキャプチャ|

キャプチャした画像の一部を編集したいときは、下記画像の赤枠で囲った場所をクリックすると編集できるようになります。

![スクリーンショット 2017-12-24 22.29.07.png](https://qiita-image-store.s3.amazonaws.com/0/48133/b559b90f-631f-d17e-39f5-ef18b6918739.png)


# Chrome

|ショートカット|内容|
|---|---|
|[Command] + [Option] + [← or →]|タブ移動|

# Terminal

|ショートカット|内容|
|---|---|
|[Command] + [← or →]|ウィンドウ移動|
|[Command] + [N]|新規ウィンドウ|
|[Command] + [W]|ウィンドウを閉じる|
|[Command] + [Ctrl] + [F]|ウィンドウの最大化|

# Finder

Windows ユーザだとファイル名の変更は戸惑うところではないでしょうか。

|ショートカット|内容|
|---|---|
|[Command] + [↑]|上の階層に移動|
|ファイルを選択した状態で [Enter]|ファイル名の変更|
|ファイルを選択した状態で [Command] + [delete]|ゴミ箱に移動|

[参考]
[macOS Sierra: 複数の操作スペースを操作する]
(https://support.apple.com/kb/PH25574?locale=ja_JP&viewlocale=ja_JP)
[Qiita: macOSでディスプレイ1枚で作業する技術] (https://qiita.com/saboyutaka/items/d6cfd2a2b60f1a374d60)
新訳版『テスト駆動開発』の第Ⅰ部「多国通貨」を Pharo Smalltalk で（今度は忠実に）写経

「[テスト駆動開発でお試しする Pharo Smalltalk](https://qiita.com/sumim/items/3a36c03ab41519077b37)」では、かなり気ままな実装に挑んでしまったので、こちらではできるだけ忠実に写経してみました。

もとより、“忠実”などと言ったところで静的型言語の Java のコードの動的型言語へ移植という時点で自ずと限界がありますし、結果として Java的にも Smalltalk的にもどっちつかずになってしまっているところも多々ありますがどうかご勘弁を。

- https://github.com/sumim/tdd-money-sutras

リポジトリーは Pharo6.1 から組み込みになった Git 対応 VCS である「[iceberg](https://github.com/pharo-vcs/iceberg)」のお試し（と、Git の学習 ^^;）を兼ねて GitHub に作成しました。

ブランチを章ごとに作成し、加えてテストサイクルごとに細かめにコミットを入れてありますので、同書の局面と対応させるのにご活用ください。

- [各章終了時点のコード（＝ブランチ）一覧](https://github.com/sumim/tdd-money-sutras/branches/yours)
    - 「chap～」リンクをクリック → TDD-MoneyByJava.package リンク内に進む）
- [テストサイクルのステップごとの差分（＝コミット）一覧](https://github.com/sumim/tdd-money-sutras/commits/) 
    - 「chap～p～ => カラー」リンクをクリック）

#iceberg について
Gitクライアントとして機能は限定的で、動作も不安定な部分も多いですが面白い試みですね。

[5 minutes tutorial](https://github.com/pharo-vcs/iceberg#5-minutes-tutorial) の手順で使えますが、SSH の公開鍵を使う場合は、iceberg ウインドウの右上にある Global Settings ボタンをクリックして

![1167.png](https://qiita-image-store.s3.amazonaws.com/0/49275/f4f3a750-368a-038d-9ded-e28aafd640bf.png)

開く設定から、Use custom SSH keys... のチェックを入れて、

![1168.png](https://qiita-image-store.s3.amazonaws.com/0/49275/bcb7363a-5193-9f52-d7aa-b619495cde76.png)

左側の ▶印 を（二度クリック）して内容を表示させ、id_rsa.pub 、id_rsa の保存先が正しいかどうかを確認する必要があるようです。

私自身の Git に対する知識が圧倒的に足りていないせいも多分にあるかと思いますが、iceberg を開き直さないとローカルリポジトリーの状態が正しく反映されなかったり、リポジトリーを作り直さないとうまく作業が進められないことがあり、現状での運用は工夫がいりそうです。〔追記：その後、incomming commits の fetch や pull だけでなく、パッケージのリロードをこまめにやることで抱えていた問題をかなり解決できることが分かりました。^^;）

Pharo6.1 （http://pharo.org/web/download ）は Windows版（32bits）と macOS版（32、64bits）を試しましたが、macOS版 64bits では iceberg はうまく動きませんでした。
OpenZeppelinを活用してセキュアのコントラクトを書く

今2017年のスマートコントラクトは、トークンでしたら、普通に億円単位のお金を管理しているので、セキュリティは非常に重要です。そこで出てきたのは、OpenZeppelin。
OpenZeppelinは、Zeppelin Solutionsというスマートコントラクト審査サービスを提供する組織からベストのやり方を整理した内容であり、よく使われる各種スマートコントラクトを実装してオープンソースで公開しているので、それらを継承し拡張すれば、自分のコントラクトを実装できる。

今回は、OpenZeppelinを使ってERC-20トークンを作って、送金したりしてみます。

## フロント側準備
- `npm install -g truffle`でtruffleをインストールしておく
- `truffle unbox tutorialtoken`でテンプレートを生成すると、下記の内容が生成される

<img width="397" alt="Screen Shot 0029-12-24 at 21.56.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/4e2b4a56-2766-7502-421f-d88ddb72199e.png">


- `npm install zeppelin-solidity`でOpenZeppelinの最新バージョンをインストールする

## コントラクトを作る
- 下記内容で`contracts`配下にに`TutorialToken.sol`作成する

```javascript
pragma solidity ^0.4.17;
import 'zeppelin-solidity/contracts/token/StandardToken.sol';

contract TutorialToken is StandardToken {
  string public name = 'TutorialToken';
  string public symbol = 'TT';
  uint public decimals = 2;
  uint public INITIAL_SUPPLY = 15000;

  function TutorialToken() public {
    totalSupply = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }
}
```

- 下記内容で`migrations`配下に`2_deploy_tutorial_token.js`を作成する

```javascript
var TutorialToken = artifacts.require("./TutorialToken.sol");

module.exports = function(deployer) {
  deployer.deploy(TutorialToken);
};
```

- `truffle develop`で開発用チェーンを起動しておく
- `migrate`を実行し、マイグレーションを実行する
- 別のターミナルで`npm run dev`を実行し、開発用webサーバーを起動すると、下記のように設定した残高が表示されるはず。

<img width="473" alt="Screen Shot 0029-12-24 at 22.08.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/f0fb54c6-113e-5d66-1731-fc926dfe8dea.png">

- Chromeで[MetaMask]( https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn) をインストールして、接続先を「Custom RPC」選択し接続先アドレスに「http://localhost:9545 」を設定しておく

<img width="394" alt="Screen Shot 0029-12-24 at 22.11.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/14a9df9e-1959-1ec1-988f-1910a9968602.png">

<img width="385" alt="Screen Shot 0029-12-24 at 22.14.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/954a148b-5f79-5c86-aef0-e621ede8f7e4.png">

- 右上にあるユーザマックのアイコンをクリックし、新しいアカウントを作成する

<img width="405" alt="Screen Shot 0029-12-24 at 22.15.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/7030fcc0-95e1-ebb8-1828-bef93a997ddd.png">

- 新しく作成したアカウントのアドレスをコピーし、画面上のアドレス欄に入れて 500 TT を送信する
    - 成功したらアラートメッセージが出て来る

<img width="523" alt="Screen Shot 0029-12-24 at 22.17.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/e29c8a5f-b56b-3287-1b69-ea20ca873a1f.png">

- MetaMaskで残高を確認してみる
    - アカウントのTokensタブでTTを追加すれば、残高がちゃんと表示される。
    - 画像が **5.00 TT** となっているのは、コントラクトで`uint public decimals = 2`を設定した影響です。

<img width="380" alt="Screen Shot 0029-12-24 at 22.38.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/6283dd3c-81f8-2aef-45d3-47be7ee4869b.png">



- Token Contract Address は、`migrate`コマンドを実行したときのログから確認できる

<img width="640" alt="Screen Shot 0029-12-24 at 22.28.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/4777/60463232-87da-c835-8cc7-37df50474477.png">

## まとめ
- 確認手順が少し多いですが、OpenZeppelinを使うことで、簡単かつセキュアなコントラクトを作成できた
Google認定プロフェッショナル - データエンジニアを受けてきた

Google認定プロフェッショナル - データエンジニアを受けてきました。
取得を考えている方の参考になれば幸いです。

# 試験概要
https://cloud.google.com/certification/data-engineer?hl=ja

- 時間：120分
- 問題数：50問

# 事前準備
- 入門書に書いてあるチュートリアルを実践する
    - [Google Cloud Platformではじめる機械学習と深層学習](https://www.amazon.co.jp/Google-Cloud-Platformではじめる機械学習と深層学習-吉川-隼人/dp/4865941215)
- 公式ドキュメントを読んで、いくつかのチュートリアルを実践する
    - [Google Cloud Platform のドキュメント](https://cloud.google.com/docs/?hl=ja)

# 結果
幸い合格でした。

# 受験者のスペック
参考になるかわかりませんが。。。

- AWS歴：３年10ヶ月
- GCPは未経験(チュートリアル程度)
- クラウド関連の保有資格
    - AWS: アソシエイト×３＋プロフェッショナル×２＋Big Data
    - Azure: MCSA Cloud Platform(532+533)
    - IBM: IBM Certified Application Developer - Cloud Platform v1
    - GCP: クラウドアーキテクト
- 外観：メガネぼーず

# 内容について
クラウドアーキテクトに比べ、ドキュメントをちゃんと読んでないと解けない問題が多いと感じました。
また、機械学習関連は複数出題されてましたが、CLOUD ML ENGINEについてというよりは、機械学習についての一般知識を問うような内容でした。

# 難易度について
ちょっと前に受けたクラウドアーキテクトより全然難しかったです。
AWSの資格と比べると、アソシエイトより難しく、プロフェッショナルより簡単、Big Dataと同じ位でしょうか。

# 感想
- GCPのサービスが全く出てこない設問とか、ベンダー試験ぽくないところがとっても素敵。
- 12月24日(日)にベンダー試験受けるのもアレだな〜と思っていたら、試験会場が半分位埋まっていて驚いた。
- 試験合格後、認定されるまで数日のタイムラグがあるので、認定されるのは来年かも。
- 次は、AWS Certified Advanced Networking - Specialtyを受ける予定。

追記(2019.12.24)
無事再認定されました。
期限日は初回認定日を引き継ぐため、前倒しで再認定の試験を受けても損することはないようです。
MySQL の情報を Prometheus + Grafana で可視化する playbook

MySQL + Prometheus + Grafana (+ Percona Dashboard) による MySQL の性能を可視化出来る環境を作りたかったので ansible で書いて作った。

## 実行方法

https://github.com/hkrn/ansible-playbooks をチェックアウトし、以下の playbook を実行する。`[]` の部分は適宜置き換えること。


```
cd 20171223
ansible-playbook \
  -e 'gce_project_id=[project_id]' \
  -e 'gce_service_account_email=[service_account_email]' \
  -e 'gce_credentials_file=[path/to/credentials_file]' \
  -e 'ansible_ssh_user=[ssh_user]' \
  -e 'ansible_ssh_private_key_file=[path/to/gce_ssh_private_key_path]' \
  site.yml
```

かなり時間がかかるが、実行すると合計3台のインスタンスが立ち上がる。

- MySQL 5.7 マスターサーバの VM
- MySQL 5.7 レプリカサーバの VM
- モニターサーバ
  - Prometheus と Grafana が同居している

いずれも最小のインスタンスである `f1-micro` で作成される。

インスタンスが立ち上がったら `http://[モニターサーバのIPアドレス]:3000` にアクセスして Grafana の画面が見れることを確認する。

Grafana のダッシュボード画面

![Grafana のダッシュボード画面](https://qiita-image-store.s3.amazonaws.com/0/3984/e63fd254-435e-f4ea-5a5e-75a70d6f5ec4.png)

MySQL Overview の画面

![MySQL Overview の画面](https://qiita-image-store.s3.amazonaws.com/0/3984/d33fcbef-7f8c-2641-3448-b94ddde67aaa.png)


### この playbook を使うときの注意点

- デモ用に作ってあるものなので、確認したらインスタンスをすぐに削除すること
  - 仮にこの playbook 流用にするせよ一回踏み台のインスタンスを建ててそこから流すように改修すべき
  - ついでにいうとパスワードも丸見えなので Ansible Vault で暗号化しておくこと
- デフォルトのファイアウォールに `3000` を追加で開けるため、試したあとは削除すること

### 引数の説明

#### gce_project_id

Google Compute Engine 上で実行するプロジェクトの ID

#### gce_service_account_email

Google Compute Engine 上で実行する[サービスアカウント](https://cloud.google.com/iam/docs/service-accounts?hl=ja)のメールアドレス。

#### gce_credentials_file

Google Compute Engine におけるサービスアカウントの秘密鍵。作成したことがない場合は以下の手順に従って作成する必要がある。

- `IAM と管理` を選択
- `サービスアカウント` を選択
- 利用するサービスアカウントを選び、縦三点リーダーをクリックして「キーを作成」を選択
- JSON 形式を選択して作成
- 作成したファイルをダウンロードし、配置する
  - 配置したパスが `gce_credentials_file` の値となる

#### ansible_ssh_user

GCE インスタンスにログイン出来る SSH ユーザ名。Mac の場合 `echo $USER` したユーザ名でログイン出来るはず。

#### ansible_ssh_private_key_file

GCE インスタンスにログイン出来る SSH の秘密鍵。通常は gcloud が生成する `~/.ssh/google_compute_engine` を使う。
GoでシリアルポートからUSBを操作してHEMSを作って電力見える化！

クリスマスイブだというのにQiita書いてます。こんにちは。
記事を書き終わったら子供の枕元にプレゼントを仕込むミッションですね。

ここしばらくGoを書いていないのでちょっとリハビリを兼ねて少し変わった感じの構成でコードを書いてみました。
普段AppengineのWebのプログラミングばかりだったので手ごわかった・・・完成してないけど。

## HEMSとは

HEMSとは「Home Energy Management System（ホーム エネルギー マネジメント システム）」の略です。

![519cf937-51bf-1bd3-48d8-af8f770fac93.jpg](https://qiita-image-store.s3.amazonaws.com/0/28681/5664deec-5723-ddec-4c90-31dfd64418a8.jpeg)

参考 : http://www2.panasonic.biz/es/densetsu/aiseg/hems/about/index.html

## つかったもの

- Go
- Mac （本当はラズパイで動かしたいがまだそこまでいってない）
- GE 富士電機製スマートメータ（家についてるやつ。ついてなかったら東京電力に連絡すればつけてくれるはず）

![ce40fc4c-64d5-b6ae-335f-85ecb667f308.jpg](https://qiita-image-store.s3.amazonaws.com/0/28681/e61201dc-8dd8-3f41-9974-a5dd2893ac09.jpeg)

- ROHM Wi-SUN USBドングル (WSR35A1-00)

<img width="683" alt="3a5f863c-17e2-ecb6-3f54-f076998ef272.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/0c448d19-d3c9-a9e3-bd1b-e7d1a56d732f.png">


　たけぇ。。。

## 事前に用意すること

- Bルートサービスの開通を「東電パワーグリッド」という会社に申請する。

### Bルートとは？

スマートメーターで計測したデータを、お客さま宅内のＨＥＭＳ機器へ送信するサービスです。

![6fa67199-1003-7185-c944-d3033cb0f066.png](https://qiita-image-store.s3.amazonaws.com/0/28681/eea276f1-a2f9-12e5-1d5f-9ffa67ee34d2.png)

## goでROHM Wi-SUN USBドングル (WSR35A1-00) を操作し、スマートメータから電力を読み取るコードを書く。

ここ最近goを触っていなかったのと、普段AppengineでのWebアプリケーションばかり書いていたのでいろいろ戸惑いながらそこそこ動くところまで書いたものはこちら。

https://github.com/chidakiyo/hemhem

## ハマったところ

- USBとのやり取りをfor文の中でやるようにしていたら、たまに応答が帰ってこないことがあり、永遠に待ち続けるのでgoroutineで非同期に
    - for文でsleepではなく、tickerを利用する。
- tickerをselectしているところで同期的に処理するとやっぱりブロックしてしまうのでgoroutineに。
- 内部的に応答で受け取ったコードが期待する値でない場合には再実行が必要なのでchannelに値が入ったことをトリガに実行するように。
    - 定期実行なんだけど、たまにリトライが必要。
- 自宅でしか実行できない & 長時間動かしているとなんか応答がおかしくなるなどあってデバッグがしんどい。

## まだできていないこと

- 出力をGASやらGAEに送ってBQなどに投入する。（手元の別ブランチでは動いている）
- たまに応答が返ってこないというパターンの場合のタイムアウト処理入れてない。

## イメージ

2年ぐらい前に作った時点ではこんなグラフが出るようになっていました。
githubに上がっているコードはサーバサイドに投げる処理は抜いてます。

<img width="1225" alt="58e511f9-3e22-d9f7-a28e-10d280a8c015.png" src="https://qiita-image-store.s3.amazonaws.com/0/28681/c6b028a0-7030-3715-96cf-2e7f1d6895d4.png">

## さいごに

goのアドベントカレンダーなのに、goのコードを一行も出さなかったけど良かったんだろうか・・・汗
いつもWebアプリケーションのコードばかりなので、たまにはこういうのも刺激になって良いな〜と。
ニューラルネットワークのSGDによる学習の限界の最新事例

# はじめに
非エンジニアの界隈も含めて世間一般で、「ディープラーニングって、すっごーい」、と言われるようになって２年ほどが経過しました。あえて、「ニューラルネット」「ディープラーニング」に冷水を浴びせてみようということで、NIPS 2017の論文 On the Complexity of Learning Neural Networksについて、触れてみます。「だって、ニューラルネットなんだから、なんだって、できるでしょ」と、無茶振りをしてくる近所のおじさん＆おばさん、に出会った時に撃退する話のネタになります。（冗談です。）

# 結論は何？

**結論：SGDのような局所的な情報を「問い合わせる」手法では、ユニット数が入力次元のルートぐらいのNNを学習するための問い合わせの回数が膨大になってしまう。**

実際には、ユニット数が入力次元のルートぐらいの単層のNNで生成されるデータ構造は複雑すぎて、局所的な情報を少ない回数問い合わせただけでは、fittingに必要な情報が取得できないということを述べています。

# より形式的な記述
Statistical Query Algorithm a.k.a SQ Algorithmは、ある固定された確率分布上での計算問題です。 
損失関数が少なくなる方向へ向かって、勾配を求めてパラメータに足しこむプロセスを抽象的に表現しています。

任意の整数 $t>0$と$X$上の分布$D$に対して、VSTAT(t)というオラクル（クエリに対して、答えを返すデータベースのようなもの）は、期待値$p=E_{D}[ f(X)]$を満たすクエリ関数 $f: X \rightarrow [0,1]$を入力として受け取ります。返答として、以下の(1)を満たすような実数$v$を返します。$| v - p| \leq \max  ${$ \frac{1}{t} , \sqrt{ \frac{p(1-p)}{t} } $}     (1)

ある$\gamma > 0, m : (\delta, \gamma) \rightarrow  \mathbb{N}$と、アルゴリズムが存在して、 すべての$\delta \in (0, 1]$に対してそのアルゴリズムが$m(\delta, \gamma)$個のサンプルを$X \times Y$上の分布$D$から見た後に,$h \in H$を計算できて、条件$ error(h) \leq 0.5 -\gamma $を確率$1 - \delta$で満たすような学習問題を、弱学習が可能な問題であると定義します。

以下の数学定理で表現されます。

>任意に$n \in \mathbb{N}, \lambda, s \geq 1$をとる。
このときある関数族 $\mathcal{C} \in \{ f : f:\mathbb{R} \rightarrow [-1,1] \}$が存在して、この関数は中間層が$O(s\sqrt{n} \log (\lambda sn))$個数のsigmoidで、　sharpnessがsで、出力次元が１であり、重み行列の特異値の最小値と最大値の比が$(n, s, \lambda)$のたかだか多項式オーダーであり、 整数$t = \Omega (s^2  n)$
 
>どんな (randomized) SQ アルゴリズム　Aで、
$\lambda $-Lipschitz クエリをVSTAT(t)へ入力して、 $\mathcal{C}$を少なくとも確率$1/2$で弱学習し、回帰の誤差$1/\sqrt{t}$以下であり、入力が分散１の$\mathbb{R}$上のlog-concaveな分布からi.i.dでサンプルされるとき、問い合わせ回数として、$2^{\Omega (n)}/\lambda s^2 $個が必要.


# データを生成するNN
おのおのの入力次元について、i.i.dで[0,1]の実数値が入力されて、複雑なデータが生成される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155991/a05095dc-f04b-9d2f-5c19-0b68ce8dc16a.png)

# 実験
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155991/6071417a-aa15-ca9b-7ebf-dda342c13650.png)

理論上のテスト誤差の限界が緑の線です。ユニット数がある大きさになると、急激に学習ができなくなることが見て取れます！