OmniAICreator/Qiita-1.07M huggingface dataset:
Linux: mallocで返されるアドレスを固定する

通常のLinux環境では、単純に`malloc`してそのアドレスを表示するだけのプログラムでも、実行するたびに異なるアドレスが表示される。

```c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char* p = malloc(1024);
    printf("p = %p\n", p); 
    return 0;
}
```

実行結果：

```shell-session
$ a.out
p = 0xdd8fa82010
$ a.out
p = 0xe683097010
$ a.out
p = 0xb79170f010
```
これはカーネルの[Address space layout randomization](https://en.wikipedia.org/wiki/Address_space_layout_randomization#Linux)という機能で、セキュリティ上の理由により意図的にアドレスをランダム化している。

しかしデバッグ時など、アドレスを固定化したい場合もある。そのようなときは

```
$ echo 0 > /proc/sys/kernel/randomize_va_space
```

とすればよい。
0以外に受け付ける値は下記の通り：

```
0 – No randomization. Everything is static.
1 – Conservative randomization. Shared libraries, stack, mmap(), VDSO and heap are randomized.
2 – Full randomization. In addition to elements listed in the previous point, memory managed through brk() is also randomized.
```

参考：

[kernel - How can I temporarily disable ASLR (Address space layout randomization)? - Ask Ubuntu](https://askubuntu.com/questions/318315/how-can-i-temporarily-disable-aslr-address-space-layout-randomization)
初級 Pythonista で Serverless Framework 初心者が勘違いしてた(理解してなかった) exclude/include の話

全てを除外(`**`)してから、必要なもの(`mymoduledir/**`)だけ含めつつも、不要物(`**/__pycache__/**`)は取り除く(`"!**/__pycache__/**"`)のが王道、なのかな？

```yaml:serverless.yml
package:
  exclude:
    - "**"
  include:
    - mymoduledir/**
    - "!**/__pycache__/**"
```

ちなみに、pip モジュールのパッケージングには[`serverless-python-requirements`](https://www.npmjs.com/package/serverless-python-requirements)を利用しているので、自動生成される `.requirements.zip` と `unzip_requirements.py` などは設定にかかわらず追加されます。

※ 油断して `.git/` や `.venv/` がパッケージに含まれていた事は内緒ですよ。
KerasでGPUメモリの使用量を抑える方法

バックエンドをTensorFlowとしてKerasを利用しようとすると，デフォルトだとGPUのメモリを全部使う設定になっていて複数の実験を走らせられないので，GPUメモリの使用量を抑える設定方法について紹介します．[^1] [^2]

## 検証環境

```
tensorflow==1.3.0
tensorflow-gpu==1.3.0
Keras==2.0.6
```

## GPUのメモリ使用量を抑える

下記コードを貼り付けるなり，importするなりすれば大丈夫です．

### 最小限のGPUメモリのみ確保

`gpu_options.allow_growth`で設定可能です．
実行時に必要な分だけ確保する方法で，さらに必要になるとメモリ領域を拡張するようになっています．
ただし自動的にはメモリを開放しないので，メモリが断片化して性能が悪化する可能性があり注意が必要です．[^1]

```python
import tensorflow as tf
from keras import backend as K
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
K.set_session(sess)
```

### 合計GPUメモリの割合指定で確保

`gpu_options.per_process_gpu_memory_fraction`で設定可能です．
下記例だと40%のメモリを使います．

```python
import tensorflow as tf
from keras import backend as K
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
sess = tf.Session(config=config)
K.set_session(sess)
```

### 実行時の状況

```bash
$ nvidia-smi -l
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0     30654    C   python                                        3527MiB |
|    1     30779    C   python                                        3357MiB |
+-----------------------------------------------------------------------------+
```

## References

[^1]: [TensorFlow - Using GPUs](https://www.tensorflow.org/tutorials/using_gpu)
[^2]: [Keras FAQ: Frequently Asked Keras Questions](https://github.com/fchollet/keras/blob/master/docs/templates/getting-started/faq.md)
[Rails]大規模データのseed

数十万行のデータをseedで入れようとするとローカルの環境だとメモリが膨れてエラーになる。
seedbankなどでファイル分割、activerecord-importで一括処理しても無理だったので、MySQLのLOAD DATA LOCAL INFILEを使う。

# CSVのフォーマット
```db/seeds/001_table_name.csv
id,hoge_id,name
1,1,'fugafuga'
```

db/seeds配下に
番号_table_name.csv
で配置する。使依存関係を記述する一番簡単な方法としてファイルに番号を付与した。

1行目にheaderで、文字列は'でくくり、文字列内の'は''とする(LOAD DATA LOCAL INFILEのオプションを変えればこの限りではない)

本番からデータを持ってくるコマンド。
QUOTEでシングルクオートにくくり、,区切りに置換、\\'を''に置換している。このcsvをscpでローカルに持ってくる
```
mysql -u user -h hoge -ppass production -e "SELECT id, hoge_id, QUOTE(name) as name FROM table_name;" | sed -e 's/\t/,/g' | sed -e "s/\\\\\\\\'/''/g" > /tmp/001_table_name.csv
```

# seed.rb
```ruby:db/seeds.rb
# ビッグデータはmysqlのload data infileに任せる
Dir.glob(Rails.root.join('db/seeds/*.csv')).sort.each do |file_name|
  table_name = file_name.match(/\d+_(.+).csv/)[1]
  header = ""
  # csvの1行目はheader
  File.open(file_name) { |f| header = f.readlines[0] }
  # 改行消す
  header = header.gsub(/(\r\n|\r|\n)/, '')
  sql = "
    LOAD DATA LOCAL INFILE '#{file_name}'
    REPLACE INTO TABLE #{table_name}
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '\\''
    LINES TERMINATED BY '\\n'
    IGNORE 1 LINES
    (#{header})
    set updated_at = NOW(), created_at = NOW()
  "
  ActiveRecord::Base.connection.execute(sql)
end
```

# まとめ
大規模データ処理でRubyだとパフォーマンスが出ない時に、MySQLに処理を移譲するってちょいちょい使う。
ローカル環境のデータをどう揃えるかはフェーズによって変えていった方が良さそう。
JavaScriptのcall, apply, bind, ...スプレッド演算子について

#JavaScriptのcall, apply, bind, スプレッド演算子についてまとめてみた。

##call
callは特定のオブジェクトの外からthisの値を指定することができます。
このメソッドはどの関数オブジェクトに対しても呼び出すことができます。

例

```js
const object1 = {
  name: "yasu",
  email: "yyy@yyy.com"
}

function getName() {
  return this.name; // このままではundefinedになる。
}

console.log(getName()); // undefined
console.log(getName.call(object1)); // callによりobject1とthisが結び付けられる

```

output

```
undefined
yasu
```

次のようにobjectを書き換えることにも使えます

```js
const object = {
  name: "yasu",
  email: "yyy@yyy.com"
}

function update(name, email) {
  this.name = name;
  this.email = email;
  return this;
}

console.log(update.call(object, "example", "example.example.com")); // 後ろの２つはupdateの引数
```

output

```js
{name: "example", email: "example.example.com"}
```

##apply

applyはcallと同じような働きをしますが引数の扱いが異なります
applyは引数を配列として受け取ります

例

```js
const object = {
  name: "yasu",
  email: "yyy@yyy.com"
}

function update(name, email) {
  this.name = name;
  this.email = email;
  return this;
}

console.log(update.apply(object, ["example", "example.example.com"])); // 後ろの２つはupdateの引数
```

output

```js
{name: "example", email: "example.example.com"}
```

### スプレッド演算子(展開演算子)
スプレッド演算子(...)は、複数の引数、複数の要素を置かれる所で値を展開することができます。

上記例を使って例えると、

```js
const object = {
  name: "yasu",
  email: "yyy@yyy.com"
}

const newObject = ["example", "example@example.com"];

function update(name, email) {
  this.name = name;
  this.email = email;
  return this;
}

console.log(update.call(object, ...newObject)); // 後ろの２つはupdateの引数
```

このようにcallを使ってapplyと同じように引数に配列を渡すことができるようになります。

## bind
bindもthisの値を結びつけることができるのですが、その結びつきが永続的になります。

```js
const object = {
  name: "yasu",
  email: "yyy@yyy.com"
}

const object2 = {
  name: "maruyama",
  email: "maruyama@aya.com"
}

const newObject = ["example", "example@example.com"];

function update(name, email) {
  this.name = name;
  this.email = email;
  return this;
}
const updateObject = update.bind(object);// objectがthisに永続的に結び付けられる
console.log(updateObject.apply(object2, newObject)); //object2をupdateしようとしても...
console.log(object2); // thisはobjectに紐付いているためupdateされない。
```

output

```js
{name: "example", email: "example@example.com"}
{name: "maruyama", email: "maruyama@aya.com"}
```

参考 [初めてのJavaScript](https://www.amazon.co.jp/gp/product/4873117836)
170819三年後のウェブ地図に備えて考える

# 問題設定
大量の現金の流れを掴んでいないプレイヤーが三年後のウェブ地図に備えて考えるべきことを整理し、自分のスタンスとして晒すことで新たな議論を得る。

- 結局、スタンスを持たないのは卑怯だから
- スタンスはいつでも更新してよいから

---

# 選択肢
大量の現金の流れを掴んでいないプレイヤーの選択肢

1. 大量の現金の流れを掴む
2. 大量の現金の流れを掴んでいない前提で戦略や戦術を考える

私の場合は 2. を選択。

---

# 状況分析

大量の現金の流れを掴んでいないことを前提とするということは、ウェブ地図の運営自体が本業という訳ではないですね。本業を支えるという性格でウェブ地図を運営するというわけだ。

本業の目的・目標をよく把握することは大事で、それが戦略につながるが、ここでは戦術のみを考える。

---
# ただ、これだけは記しておく

本業に寄与しない機能は削るべき。

- その機能、もっと正しく実装できる人が他にいるから。コラボの芽出しを阻む。
- 真剣を振るえない機能の混入は全体の質を下げるから。顧客に失礼にあたる。
- どうしてもやりたいなら、それは本業に寄与するのかもしれない。あるいは、本隊と分離して試行してはどうか。

---

# 戦術考案の判断要素

- Web GL の主流化完了
  - 2D と 3D を融合して提示したほうが経済的に
- モダンウェブが普通になる
  - fetch とか promise とかコンポーネントとか普通になる
- 扱うデータ量は増え、転送技術は進展する
  - 同時アクセス数というよりは一ユーザあたり転送量に対してもスケールせよ
  - その意味でもオフラインキャッシュ主流化

---

# 戦術案

1. 基本モデルを踏襲して近代化改修
  - レイヤメタデータ、タイル、目録
  - これにオフラインキャッシュをビルトイン
  - モダンウェブで作り直し
2. UI はどうする？
  - 3次元と2次元の一枚化はするが、ボタンの配置程度は直しても基本構成は踏襲
  - UIとボンネット下を同時改修しない

---

# 現時点での部品候補

このスライドはいつでも豹変する可能性あり

- 標高タイル対応した Mapbox GL JS 又はベクトルタイル対応した Cesium
- Service Worker 系活用
- 軽めの Web Components 活用
- サーバサイドは引き続き回避
  - 使っても lambda

---

# 入れるべきとは思いにくいもの

- パーソナライズ；大量の現金の流れを掴んでいない場合には、止めたほうが経済的に回る可能性が高まる。
- ストーリーマップ；まだまだ当面、語るのはサイトじゃなくて人でありスライドだろう。

このスライドには、言わずもがなのことも書いておく。

---

# オープンな課題

- レイヤメタデータ肥大化問題
  - しかし各人が必要なレイヤ数は少数
  - でも大量の現金の流れを掴んでいるわけではないので、パーソナライズは回避
- レイヤ情報の集め方、読み込み方、回し方
  - レイヤメタデータの標準化はまだ進まないだろう。タイルの主流化完了待ち。
- バイナリベクトルタイルスタイルの設定自由度の制御（ゲームバランス的な意味で）

---

# さらに挑戦的になる場合に参考とすべき作品

- iD editor
  - つまり作図です。
- Maputnik
  - 状態の扱いとかの部品取り。

---

# 蛇足

通常、大規模な地理空間情報はバージョン管理するべきものじゃない。時系列バックアップするべきものだ。

バックアップの思想に立った上で、効率的にバックアップする方法を洗練させよ。

おおむね、TimeMachine と似たような思想に結果的になる。また、目録とも思想が似る。

---

# 書いてみた感想

- 私は思ったよりオフラインキャッシュを気にしている
  - 単に外出用じゃない。日常使用の高速化に使うつもりだ。
  - 結局、アプリに迫ることを意味しているのだろう。
- 投影の話が出てこなかった
  - 積極推進というよりライブラリ待ち

---

# 書いてみた感想 Cnt'd

- 国際化にはコストをかけるのか？
- 結構、私はパターンを知っている。
JenkinsをWindowsにオンラインインストールする

# JenkinsをWindowsにインストール
- JenkinsのWindowsへのインストール方法

## Jenkinsのダウンロード

- Jenkinsのダウンロード方法

### Downloadへ移動
1. Jenkinsのページを開く(https://jenkins.io/)
2. [Download]ボタン
![01_ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/162829/74fff08b-4e18-66f3-7ad7-ee3175c26976.png)


### 指定のOSを選択
![02_ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/162829/9682e5c9-458e-94cf-b251-d26e9730296f.png)
## Jenkinsのインストール
- Jekinsをインストールする


### インストール開始
![11_インストール開始.png](https://qiita-image-store.s3.amazonaws.com/0/162829/306b8cbf-320d-9979-d5ed-5779fbb43189.png)

### インストール先の選択
![12_インストール実行.png](https://qiita-image-store.s3.amazonaws.com/0/162829/0a8e54d8-1e07-fac3-ffe0-b731eccdf303.png)


### インストール実行
![13_インストール先.png](https://qiita-image-store.s3.amazonaws.com/0/162829/84006638-6141-24b1-25f8-36236d80d06b.png)

### インストール完了
![14_インストール完了.png](https://qiita-image-store.s3.amazonaws.com/0/162829/06bf645e-684b-3473-c292-e5d0dc5a5a9a.png)

## Jenkinsの初回設定
- Jenkinsの初回設定(http://localhost:8080)

### ロック解除
#### 管理者パスワードファイルの確認
![21_ロック解除.png](https://qiita-image-store.s3.amazonaws.com/0/162829/bbf0727f-b2bd-77a1-0784-1f1a6d6f5891.png)

#### 管理者パスワードファイルを開く
![22_ロック解除-file.png](https://qiita-image-store.s3.amazonaws.com/0/162829/7bab3e37-feba-4906-f49d-cd37cb5e4855.png)
![23_ロック解除-file-in.png](https://qiita-image-store.s3.amazonaws.com/0/162829/261a8d71-75d5-d087-8d62-26c58f4d8352.png)

#### 管理者パスワードをJenkinsに設定
![24_ロック解除-file-in.png](https://qiita-image-store.s3.amazonaws.com/0/162829/28b5770f-e760-17b0-5bfd-13651039fd96.png)

### プラグインのインストール
- Jenkinsにインストールするプラグインの選択

#### インストールするプラグインの選択方法を指定
![31_plugin-select.png](https://qiita-image-store.s3.amazonaws.com/0/162829/39f7cde3-7583-529c-0a94-a0bd75ceb5f4.png)

#### プラグインインストール
![32_plugin-instarll.png](https://qiita-image-store.s3.amazonaws.com/0/162829/480e54fc-cbc9-45df-00aa-877b233fa215.png)

### ユーザー作成
- 初回ユーザーを作成する

#### ユーザー作成
![41_user.png](https://qiita-image-store.s3.amazonaws.com/0/162829/622833c1-ad03-7c26-f2e9-47a261f46689.png)

## Jenkinsの開始
### Jenkinsの開始
![42_user.png](https://qiita-image-store.s3.amazonaws.com/0/162829/5870cbda-2715-7f9d-1961-9187b54efdb1.png)

### Jenkinsの開始完了
![51_start.png](https://qiita-image-store.s3.amazonaws.com/0/162829/14ab9811-0e1f-f1cb-8580-60763e68e663.png)
Slack の Reminder で平日だけ通知させたいとき

日付部分で `every weekday` と指定すれば良い。

# 例

```
/remind me "Hello World!" at 10:00 every weekday
```

---

その他複雑な指定の仕方はヘルプをみると良い
https://get.slack.help/hc/en-us/articles/208423427-Set-a-reminder
関数とクラスの違いって

プログラミングはswiftが初めてで、色々プログラミングの概念も一緒に勉強しているが、
関数もクラスも変数の宣言や処理をまとめてるだけで、同じことをしているのでは？と思った


ここがわかりやすかったきがする。
http://wp-p.info/tpl_rep.php?cat=swift-biginner&fl=r32
Azure WebAppsでJSONファイルを読み込もうとすると404になる問題の修正方法

# はじめに

Three.jsを使用したアプリケーションを作成し、AzureのWebAppsで公開しました。
その際に、3DデータのJSONファイルを読み込む際に、404 Not Foundのエラーが発生しました。
このエラーは以下の方法で修正することができます。

# 修正方法

以下のサイトを参考にしました。
[json - Error 404 on Angular 2 app when deployed to Azure - Stack Overflow](https://stackoverflow.com/questions/44767665/error-404-on-angular-2-app-when-deployed-to-azure)

`web.config` にMIME Typeの設定を追記すればよいようです。

以下の項目を追記しました。

```xml:web.config
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <system.webServer>
        <staticContent>
            <remove fileExtension=".json" />
            <mimeMap fileExtension=".json" mimeType="application/json" />
        </staticContent>
    </system.webServer>
</configuration>
```

すでに `<configuration>` や `<system.webServer>` は記載されている場合があるので、適切な場所に記述するようにしてください。
最後にアプリケーションを再起動すれば、JSONファイルが適切に読み込まれるはずです。
分身するVimプラグインを作った

## 背景

gvimを使っていて、普段は1ウィンドウで利用しているのですが、見比べたいときや作業の途中などで、ウィンドウを分割して使いたくなったときに、ウィンドウサイズをわざわざ変更するのが面倒だったのでプラグインを作ってみました。
サイズの調整とかは少し自動でやってくれたりもします（はず）。

プラグイン自体は2年前に作って、最近はgvimを使ってないので（Vim自体は使っている）、少しバグはあるかもです。 
分身って言うにはちょっと盛っていますが...

## 動作

こんなかんじです。(gifなのでクリックしてみてください）

![screenshot.gif](https://qiita-image-store.s3.amazonaws.com/0/29764/27cece9e-7fb5-cf1b-f850-ae1cbd06f608.gif)


## 使い方

リポジトリは[vim-bunshin](https://github.com/pyohei/vim-bunshin)です。  
お使いのプラグインマネージャで`pyohei/vim-bunshin`を取得すれば使うことができます。

使い方は画面上で `:Bunshin` で画面サイズの変更と分割をします（デフォルトはカラムサイズ80）。
`BunshinEnd`で分割はもどります。

また、`.vimrc`などで、以下の設定も可能です。

```vim
let g:BUNSHIN_COLUMN = 100 " カラムサイズ（標準は80)
let g:BUNSHIN_MAX = 3      " 最大複製数（デフォルトは3)
```

## その他

* 中二病感のあるプラグインにしてしまいました
* もともと作成したのが結構前なので、問題あればコメントくだされば直すかもしれません（もう自分自身が使ってないので...)
* Vimのコマンドだけでもある程度できるので、作った後にプラグインにするほどでもなかったなと感じていますw
Angular Component内でのリスナー設定


今回やりたかったことは、編集中のページで誤ってcmd+rやcmd+wでページ内容を無効にしてしまうような動作をしてしまった時にページを離れてもよいか確認のダイアログを出すことです

#### 参考
- [javascript detect browser close tab/close browser](https://stackoverflow.com/questions/3888902/javascript-detect-browser-close-tab-close-browser)
- [attribute-directive Respond to user-initiated events](https://angular.io/guide/attribute-directives#apply-the-attribute-directive)
- [Is there any lifecycle hook like window.onbeforeunload in Angular2?](https://stackoverflow.com/questions/36763141/is-there-any-lifecycle-hook-like-window-onbeforeunload-in-angular2)


## 対応
サンプルコード
HostListenerをcoreからimportして@HostListenerの引数にリスナ名書いて、その下の行に処理書くだけ


```javascript
import { Component, OnInit, HostListener } from '@angular/core';

@Component({
  // ~~~
})
export class SampleComponent {

  // プロパティとかコンストラクタとか
  
  // 追加した処理
  @HostListener('window:beforeunload') // リスナの設定
  closeConfirmation(e): string { // イベントを受け取った時のメソッド
    var confirmationMessage = "!!!";
    (e || window.event).returnValue = confirmationMessage; //Gecko + IE
    return confirmationMessage;
  }
}
```


これで確認のダイアログが出るようになりました、以上
チャットツール「Oneteam」を全社導入したみた

# Oneteamとは
株式会社Oneteamが提供しているチャットツールで、作成したトピック毎にチャットができ、トピック自身も内容を更新できるのが特徴です。([https://one-team.com/ja/](https://one-team.com/ja/))

# 全社導入した経緯
・Oneteam導入前は、slackとメールを運用
・slackだと議題が流れてしまう
・議論中だと、別の事柄について話したくても入りづらい場合がある
・一度流れた議題について蒸し返しづらい
・決定事項も流れてしまい、ログを読み返すハメになる
・かといって、メールで問題提起してもレスポンスが悪い
・質問をメールですると、slackで回答がくる
・連絡事項をメールで周知しても、誰もレスしない
・やっぱり双方向なやりとりはチャットが楽

特に、社外プロジェクトに参画していいて社内にいないメンバも多い状況なので、メールではレスポンスが悪く、チャットではリアルタイム性がネックになる、、、とコミュニケーションツールに悩んでいた背景からOneteamの試験導入に至ります。

# どんな風にOneteamを利用しているか
Oneteamが持つ機能を見て、メールに置き換えられると感じ、
社内でやりとりする**メールを全てOneteamに置き換え**、社内のオフィシャルではslackは廃止することにしました。

トピック：メール本文
フォロワー：メールの宛先
グループ：メーリングリスト

とし、**メール＋チャット**の位置づけで導入してみることにしました。
（メール本文にチャット欄があるイメージ）

導入にあたり、この場合はslack、その場合はOneteam、こっちはメール、、、と条件分岐を増やせば増やすほど、障壁が厚くなってしまいます。
なので、シンプルに今まで社内でメールでやりとりしていたものは、メールの代わりにトピックを起票する、
チャットでやりとりしていたのものはOneteamにチャット専用トピックを作成して運用する、としました。

文章では伝わりづらいので、以下、少し画像を交えて説明します。

![oneteam1'.png](https://qiita-image-store.s3.amazonaws.com/0/141209/c7915d0e-d0f0-c91b-ce37-1670a0cc6c23.png)

　　　　　　　　　　　　　　　　　　　　　　　　　　　　![Oneteam2’'.png](https://qiita-image-store.s3.amazonaws.com/0/141209/e4b0ce9b-9fc7-d1ce-3633-e8e3c3e3c77d.png)

社内ではメール作成とトピック作成を以下のように置き換えています。

![Oneteam3'.png](https://qiita-image-store.s3.amazonaws.com/0/141209/7f35e63c-51bc-5d0a-e099-c7bc5a74ca71.png)



# 良かったこと
・リモートでの議論、情報連携が活発になった
　⇒トピックの作成自体、メール送信よりも気軽にできる
　　例）最初はフォロワ（メールだとあて先）を少なめに、トピック作成しても、必要に応じて後からフォロワを追加すればすぐに情報連携できる
　　　　メール転送の必要なく、状況に応じてトピックの関係者を追加、コメント（チャット）でフォローできる
　⇒トピック内容に対するつっこみ（返信）がしやすい
　　内容に対する意見をチャットで返せるのでカジュアルお手軽
　⇒トピック＋コメントなので、議論がぶれない、流れない
・周知事項や、依頼事項の漏れがなくなった
　⇒既読機能のおかげ

# 悪かったこと
・機能不足な面がある
　⇒サブジェクトを工夫して運用しているものの、トピックの整理がしきれない
　　（トピックのステータス管理機能や、検索機能が向上するといいなぁ）
　⇒ユーザ管理機能不足
　　MLのように、AグループにBグループを追加できない
　　AグループにBグループを追加したければ、Bグループのメンバ全員を個別にAグループに登録する必要がある
　。。。等々
・なんか通知いっぱい来て心が休まらない
　⇒これはslackでも一緒か。。
　　プッシュ通知切るなりする割り切りがあれば解決？

機能不足は、導入当初から比べると雲泥の差ではあるので、今後の機能拡張によって徐々に解消されていくと思われます。
あとは、webhookやbotを見ると技術者はslackの方が面白いんだろうなーと思います。
なので、プロジェクトや個々の社員同士でslackを利用するのは特に禁止されてないです。
今回のOneteam導入は、あくまでも全社で利用するコミュニケーションツールの位置づけとしています。
Windowsでzipファイルを作成するコマンド

Power Shell で[Compress-Archive](https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Archive/Compress-Archive?view=powershell-5.1)コマンドで一発です。

cmd.exeから実行する場合は先頭に`powershell`をつけて

```
powershell compress-archive src dest
```

を実行すればOKです。
「ホストを解決しています」と表示されたまま、ネットがつながらない

　この現象の直接的な意味は、”DNSで名前解決をしている処理が終了するのを待っている”ということですが、何故突然発生するのかが非常に不可解でした。無線LANのルータを再起動してもブラウザを再起動しても現象が消えません。
　調べてみると、使用しているブラウザ（Chrome）のDNS関連の設定に問題があることがわかりました。

【設定変更方法】
　Chromeの設定で、中程にある「詳細設定を表示...」をクリックして、「プライバシー」のところにある
　”リソースをプリフェッチしてページをより迅速に読み込む”
のチェックを外します。
  
---
　本現象に関連するものとしてその他には、
　・DNSサーバの変更
　・DNSキャッシュのクリア
などがあります。特に意味はありませんが、備忘録として残しておきます。
 
(１）DNSサーバの変更
　DNSサーバの設定ですが、通常はデフォルト設定で自動取得になっています。
 （プロバイダーのDNSが自動で設定されるようです。）
　Googleが高速のDNSサーバを提供しているようですので、プロバイダーのDNSサーバからGoogleのDNSサーバに変更することにしました。（このサーバをGoogle Public DNSというそうです）
設定方法は次の通りです。

　①コントロールパネルで「ネットワークとインターネット」→「ネットワークと共有センター」の順にクリックします。

　②「ネットワークアダプター」画面が表示されたら、該当するネットワークアダプターを右クリックし、「プロパティ」を選択します。

　③「イーサーネットのプロパティ」画面が表示されたら、「インターネットプロトコルバージョン4」を選択して「プロパティ」をクリックします。

　④表示されたプロパティに関する画面で、「次のDNSサーバーのアドレスを使う」にチェックを入れ、DNSサーバーのアドレスを以下のように設定してOKをクリックします。
　　優先DNSサーバー： 8・8・8・8
　　代替DNSサーバー： 8・8・4・4

(2）DNSキャッシュのクリア
 　クリア方法は次の通りです。
 
　①WindowsのDNSキャッシュクリア
　　・DOSプロンプトで、下記を実行します。
　　　　ipconfig /flushdns
    
　②ChromeのDNSキャッシュクリア
　　・ChromeのURL入力欄に次のように入力します。
　　　　chrome://net-internals/#dns
　　・表示された画面でClear host cacheボタンをクリックします。
pandasのresampleとrolling

はじめに
====================
pandasの `resample` と `rolling` について、似てるようで似てなくて毎回調べるので、簡単にまとめておきます。


- version : `pandas v0.20.3`

### 参考
- [Resampling time series data with pandas – Ben Alex Keen](http://benalexkeen.com/resampling-time-series-data-with-pandas/)
- [Computational tools — pandas 0.20.3 documentation](http://pandas.pydata.org/pandas-docs/stable/computation.html)

resample
====================
関数本体
--------------------
- [pandas.DataFrame.resample — pandas 0.20.3 documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html)

```py
DataFrame.resample(
    rule,
    how=None,
    axis=0,
    fill_method=None,
    closed=None,
    label=None,
    convention='start',
    kind=None,
    loffset=None,
    limit=None,
    base=0,
    on=None,
    level=None
)
```

後続する関数
--------------------
| 関数 | 説明 |
|:--|:--|
| first | 未来方向に最も近い値 |
| last | 過去方向に最も近い値 |
| bfill | backward fill, 未来方向に最も近い値 （`NaN`は埋める） |
| ffill | forward fill, 過去方向に最も近い値 （`NaN`は埋める） |
| count | 値の個数 |
| unique | ユニークな値の個数 |
| max | 最大値 |
| min | 最小値 |
| mean | 平均値 |
| median | 中央値 |
| sum | 合計値 |
| var | 分散 |
| std | 標準偏差 |
| ohlc | 始値(opning)、最高値(highest)、最安値(lowest)、終値(closing) |
| pad | = ffill |

rolling
====================
関数本体
--------------------
- [pandas.DataFrame.rolling — pandas 0.20.3 documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html)

```py
DataFrame.rolling(
    window,
    min_periods=None,
    freq=None,
    center=False,
    win_type=None,
    on=None,
    axis=0,
    closed=None
)
```

後続する関数
--------------------
| 関数 | 説明 |
|:--|:--|
| count | 値の個数 |
| max | 最大値 |
| min | 最小値 |
| sum | 合計値 |
| mean | 平均値 |
| median | 中央値 |
| var | 分散 |
| std | 標準偏差 |
| cov | 分散共分散行列 |
| corr | 相関行列 |
| skew | 歪度 (3次モーメント) |
| kurt | 尖度 (4次モーメント) |
| quantile | 分位値 |
| apply | 独自関数による集計 |

独自関数による集計
--------------------
`rolling().apply()`により、独自の集計ができる



- 例)FIRフィルタ、移動平均フィルタ

```py
import numpy as np

# フィルタ係数
b = np.ones(5) / 5

def f(x):
    # x は窓内の値が入った配列
    # x[0]が最も古い、x[-1]が最も新しい値

    # 集計後の値を return する
    return np.sum(b*x)

# 適用
series.rolling(5, center=True).apply(f)
# series.rolling(5, center=True).apply(lambda x : np.sum(b*x)) でもOK
```
Raspberry PiでC/C++によるwebsocketサーバを立ち上げる

## 開発に至った背景
C言語で開発したOpenCVのアプリケーションからwebsocketで画像を配信するとき、OpenCVと同じC++からWebSocketで画像を配信しようと思ったのがスタートです。探していたところ、[cwebsocket](http://github.com/m8rge/cwebsocket)を見つけましたが、残念ながらオリジナル版はRaspberry Piで動かなかったため、Raspberry Piとx86のどちらでも動作するように修正をしました。

### オリジナル版からの変更点
次の修正をして、[http://github.com/NaotakaSaito/cwebsocket](http://github.com/NaotakaSaito/cwebsocket)に公開しました。
1. Base64エンコードの処理を修正して32bit/64bitの双方で動くようにしました。
2. 将来、multi clientに対応できるようSocketのノンブロッキングを使用するように修正しました。（今現在、同時接続可能なクライアントは1台です)
3. WebSocketサーバーを安全に終了できるように修正しました。
4. gcc,g++,c++のどれでもコンパイルできるようにしました。
5. 複数のクライアントに対応しました。(2017年9月13日)

### 修正版コードの使用方法
以下の手順でソースコードを取得、ビルドをしてサーバーを起動したら、cwebsocket/client.htmlをブラウザで起動してください。
### コンソール画面
```
$ git clone git://github.com/NaotakaSaito/cwebsocket
$ cd cwebsocket/raspberry_pi
$ make
$ ./websocket 
opened 0.0.0.0:8088
connected 127.0.0.1:48092
disconnected

```
### ブラウザ側の画面
画面はRaspberry Piではないのですが、Raspberry Piでも同じように動きます。

![2017-08-19-113647_1440x900_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/136933/2e65b4f6-552e-b846-8e24-0e842efb2ba0.png)

## オリジナル版の動かし方
オリジナル版のソースコードは、[http://github.com/m8rge/cwebsocket](http://github.com/m8rge/cwebsocket)にあります。こちらは、x86なら問題なく動作します。
### オリジナル版の動かし方
```
git clone git://github.com/m8rge/cwebsocket
cd cwebsocket
cd x86_server
cp ../lib/* .
gcc main.c websocket.c -o websocket
./websocket
```
### オリジナル版をRaspberry Piで動かした時の問題点
Raspberry Piで実行して起動することができますが、ブラウザから接続すると「Sec-WebSocket-Accept」でエラーが発生します。私はWebSocket自体は詳しくないのですが、原因はBase64のエンコード部分にCPUのビット幅に依存したコードがあり、エンコード結果が間違ってしまいブラウザ側でエラーが発生していました。
また、オリジナル版はクライアントを接続した状態でサーバー側をCtrl+Cで終了すると、しばらくの間ポートがbusy状態でサーバーを再起動できないという問題もありました。
Python機械学習ことはじめ

蒲田でやってるオープンデベロッパーズカンファレンスに来ました。

お話聞きながら、ライブ記事作成してみます。

**2017/12/21追記** 発表スライドはこちらです → https://speakerdeck.com/terapyon/python-ji-jie-xue-xi-kotohazime-at-odc

#　お題「Python機械学習ことはじめ」

千葉市のインフルエンザ報告数と、気温から流行を予測する


# 手順

1. データ選び、データ入手　〜〜〜　ネタ探し
2. データ加工、データ連結　〜〜〜　使いやすく加工する
3. 可視化　〜〜〜　なんとなく何かが見えてくる。どんなアルゴリズム使おうかなー。
4. アルゴリズム選定
5. 機械学習モデル選定
6. 機械学習モデル評価


# データ選び、データ入手

千葉市と気象庁からいただきー。

# データ加工

* 文字コードとか
* 欠損している部分を補ったり

#　可視化

*　グラフにしてみたり
*　相関見えてくる？
*　使う特徴量を決める

#　アルゴリズム選定

*　ディープラーニングで特徴量全部がっつり？
*　場合によってデータ再加工
*　次元数作成？？？
*　説明変数と目的変数を決める


#　機械学習モデル選択

ここまでくれば簡単
すぐすんじゃう

#　機械学習モデル評価

*　予測
*　予測結果を評価
*　交差検証とか
*　モデルにフィットしすぎて過学習になってないかとか


# さあPython

##　Jupyter notebook 使う

[Shift]-[Enter]で実行してくれる

便利

ｇｉｔｈｕｂにもそのまま公開できる

## Pandasでデータ眺める

いけてないCSV読み込んで、なんとなく加工できちゃう

データフレーム機能を駆使

日付でインデックスつけとけば、週単位のデータと日単位のデータの連結もコマンド一発

シリアライズ化

ここが一番時間かかってたいへん

##　matplotlibで可視化

日本語入っているとうまくいかない

pandasからｍａｔｐｌｏｔｌｉｂ使ってヒストグラム簡単に出したり

「流行」とは何かを定義したり

pandasで、多変数うんたらを一気に可視化
左下から右上にまっすぐ上がるグラフは相関1

##　アルゴリズムの候補を検討

* ロジスティック回帰

とか


##　 scilit-learn使って学習データとテストデータを分割

説明変数x

目的変数y　流行っている1　流行ってない0

過学習を避けるため、テストデータを取っておく。80%を学習に、20%をテスト
割合は、モデルやデータ量による


##　アルゴリズム初期化

scｉｌｉｔ－ｌｅａｒｎを使う

## 予測 clf.predict(X_val)

だいたい当たるので、混同行列を使う

真陽性　偽陽性
真陰性　偽陰性

##　交差検証

学習とテストの割合はOKだった？
分割をやり直して計算し直すのを繰り返す

##　グリッドサーチ（パラメータ調整）

（というところで、時間切れ
wxPythonに関して

# はじめに
大した話ではないけど、1時間くらいハマったので備忘録としてメモ。
今回しようとしたことは[Mayavi](http://docs.enthought.com/mayavi/mayavi/mlab.html)を使ったプログラムのデバックをして欲しいと言う依頼が来たので環境を整える際にwxPythonをインストールする必要が出て来てハマった話。

# 環境
pyenvで使用する環境を切り替えられるようにしている。
今回の環境はAnaconda-2.4.4.0。

# したこと
単純にMayaviを入れようと次のコマンドを叩いてインストールした。

```bash:
conda install -c anaconda mayavi
```
まずは、これでMayavi自体は手に入ったのだが、Traitsというモジュールでエラーが発生。
その理由は必要なモジュールが足りないよっというもの。
仕方なく、足りていないモジュールは何か探したらそれはwxPythonだったため次のコマンドでインストールした。

```bash:
conda install -c anaconda wxpython
```

さて、これで動くかな？っと思うと次のエラーメッセージが表示された。

>This program needs access to the screen.
Please run with a Framework build of python, and only when you are
logged in on the main display of your Mac.

う〜ん、パスも正常だし、ちゃんと`conda list`でも入っているの確認できるし、なんだコレ。っと思ってGoogle先生に聞いて色々みんなのQ&Aを見てたけど、どれも解決にはいたらず...

# 結論

ようやく見つけたのがGoogleグループでのやりとりのこちら。

* [Running wxPython on OS X 10.9, Framework build issue](https://groups.google.com/a/continuum.io/forum/#!topic/anaconda/_envRc_iy7Q)

ここで、Travis Oliphantさんという回答が次のもの。

> Anaconda is not a Framework build of python.   However, you should be able to still run the program using "pythonw" which runs python with the correct options to run the GUI.
>
> pythonw simple.py
>
> It should be on your PATH 

そうなのか。　Anaconda上には'Framework build of python'というものは存在しないらしい。
なので、動かしたいなら`pythonw`で動かす必要あるらしい。

そして、

```bash:
pythonw main.py
```

として動かしたところちゃんと動作した(∩・∀・)∩
RubyでValue Objectを作るイディオム

DDDでいうValue ObjectをRubyで実装するときに使えるイディオムを紹介します。

# 手順

- Structを作り、freezeする

# 例

```ruby
class Equipment < Struct.new(:place, :name)
  def initialize(*args)
    super
    freeze
  end
end

kagi = Equipment.new('玄関', '鍵')
```

# 説明

短い記述ですが、Value Objectに便利な以下の特性が得られます。

* 不変オブジェクトになる。
* Constructorが自動で定義される。
* 各メンバのreaderが自動で定義される。
* ==, hash などの比較関数が、各メンバの値を使った実装として定義される。

比較関数が、各メンバの値の比較として定義されるため、Value Object自体をハッシュのキーにも使えるようになるのがすごく便利です。これと同じことを自前のクラスで実装しようとすると、== と hashを自前で実装する必要があります。

Rubyは変数の型を定義できないので、メンバーに何がセットされるかを制御できないのが残念ですが、不変オブジェクトを使えるだけでも大きなメリットがあります。

以上です。
HomebrewでNode.jsをインストール＋エラーの解決方法

# はじめに
MacにNode.jsをインストールしたときのメモです。

# 前提
Homebrewは事前にインストールしてください。
ターミナルのコマンドに記載している{user}はユーザのホームディレクトリです。

# 手順

## 1. nodebrewのインストール
以下のコマンドを実行してください。

``` ターミナル
$ brew install nodebrew
```

インストールできたかを確認するために、バージョン確認を行います。

``` ターミナル
$ nodebrew -v
nodebrew 0.9.7
...
```

と出てくればＯＫかと思います。

## 2. Node.jsのインストール
以下のコマンドを実行してください。（今回は最新版のインストールです）

``` ターミナル
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v8.4.0/node-v8.4.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/{user}/.nodebrew/src/v8.4.0/node-v8.4.0-darwin-x64.tar.gz: No 
Warning: such file or directory

curl: (23) Failed writing body (0 != 941)
download failed: https://nodejs.org/dist/v8.4.0/node-v8.4.0-darwin-x64.tar.gz
```

私はこのようなエラーがでました。
ググってみると、インストール先のディレクトリがないのが原因だったので、
以下のコマンドでディレクトリを作成しました。

``` ターミナル
$ mkdir -p ~/.nodebrew/src
```

作成できたのでリトライ。

``` ターミナル
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v8.4.0/node-v8.4.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
```

インストールができました！
インストールできたかを確認するために、バージョン確認を行います。
（厳密にはローカルにインストールされたNode.jsのリストです）

``` ターミナル
$ nodebrew list
v8.4.0

current: none
```

上記の通り、「current: none」のままだとNodejsは実行できないので、
使用するバージョンをuseコマンドで有効化します。

``` ターミナル
$ nodebrew use v8.4.0
use v8.4.0
```

有効になったかをlistで確認。

``` ターミナル
$ nodebrew list
v8.4.0

current: v8.4.0
```

これで有効化されました。
次に、パスを通します。

``` ターミナル
$ echo 'export PATH=$PATH:/Users/{user}/.nodebrew/current/bin' >> ~/.bashrc
```

Node.jsのバージョン確認をします。

``` ターミナル
$ node -v
-bash: node: command not found
```

このような場合、
.bashrcの変更設定が反映されていないので、再反映します。

``` ターミナル
$ source ~/.bashrc
```

反映されたのでリトライ。

``` ターミナル
$ node -v
v8.4.0
```

npmも合わせて確認します。

``` ターミナル
$ npm -v
5.3.0
```

これで、Node.jsのインストールが完了しました！
msgpack-c を openFramworks で使う

msgpack-c
https://github.com/msgpack/msgpack-c

# how to install ?
## (1) xcode in mac の場合
- msgpack-c 配下の include だけ含め プロジェクトファイルのてきとーな場所に追加
- xcode に drag & drop
- user header search path で msgpack-c 配下 を recrusive に 指定
- header をソースコード上で呼び出す時に、こんな感じでよびだす。

```
#define MSGPACK_DISABLE_LEGACY_NIL
#include "msgpack.hpp"
```

※ この #define が入ってないと、なんかエラーでる。cmake だったら -D で指定したほうがいいようなやつ。とりあえず。

## (2) config.make in ubuntu の場合
- addonとか別ディレクトリにいれとく、msgpack-c をおいておく （正しいやり方なのかはわからない・・）
- config.make の中にこんな感じで、そのパスをかいてあげればおｋ

```
PROJECT_CFLAGS = -I$(OF_ROOT)/addons/msgpack-c/include
```


# how to use ?
ここにのってる。
https://github.com/msgpack/msgpack-c/blob/master/QUICKSTART-CPP.md

ofBufferでクラスをやりとりする超シンプルなサンプルコード書いた。

```
#pragma once

#include "ofMain.h"

// lib
#define MSGPACK_DISABLE_LEGACY_NIL
#include "msgpack.hpp"

// https://github.com/msgpack/msgpack-c/blob/master/QUICKSTART-CPP.md

class myclass {
private:
public:
    std::string m_str;
    float m_x;
    MSGPACK_DEFINE(m_str, m_x);
};

class ofApp : public ofBaseApp
{
public:
    void setup()
    {
        // シリアライズ化したいデータ
        std::vector<myclass> vec;
        
        myclass m1;
        m1.m_str = "test1";
        m1.m_x = 1.23;
        
        myclass m2;
        m2.m_str = "test2";
        m2.m_x = 4.56;
        
        vec.push_back(m1);
        vec.push_back(m2);
        
        
        // シリアライズ化して、"data.bin"として保存する
        msgpack::sbuffer sbuf;
        msgpack::pack(sbuf, vec);
        
        ofBuffer buf;
        buf.set(sbuf.data());
        ofBufferToFile("data.bin", buf);
    }
    
    void keyPressed(int key)
    {
        switch(key)
        {
            case ' ':
                parseFromBin();
                break;
        }
    }
    
    // バイナリ化されたファイルをデシリアライズして、もともとのクラスの値を使う
    void parseFromBin()
    {
        ofBuffer buf = ofBufferFromFile("data.bin");
        
        msgpack::object_handle oh =
        msgpack::unpack(buf.getData(),buf.size());
        msgpack::object obj = oh.get();
        
        
        // you can convert object to myclass directly
        std::vector<myclass> rvec;
        obj.convert(rvec);
        
        printf("\n----\n");
        for(myclass v : rvec)
        {
            printf("%s \n", v.m_str.c_str());
            printf("%f \n", v.m_x);
        }

    }
		
};

```
linux command > test_readCombで始まるファイルを探す > locate -b test_readComb | sudo updatedbでDBを更新

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

```bash
$ locate -b test_readComb
/home/yasokada/ADDA/adda/src/seq/CODE_170405/test_readCombined_170722.py
/home/yasokada/ADDA/adda/src/seq/CODE_170405/test_readCombined_170819.py
```

```
man locate
...
       -b, --basename
              Match only the base name against the specified patterns.  This is the opposite of --wholename.
...
```

### ファイル作成直後

DBに反映されていないので、以下を実行する。

```bash
$sudo updatedb
```
Python で、Google の Translation API を使う

Google の Translation API を、python3 で使う例 と curl の例です。

実行した様子
![google_translate_aug19.png](https://qiita-image-store.s3.amazonaws.com/0/179446/026a0d11-c75f-6b8f-adf4-a2d26f66cced.png)

API KEY は、自分のものと変えて下さい。

```py3:google_translate.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	google_translate.py
#
#					Aug/19/2017
#
# ----------------------------------------------------------------
import sys
import json
import requests
#
# ----------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
api_key="BXzaSyBSZCXB9A1EodnHzbAPpO8EPNNCt5q4abc"
#
sentence_in="I got up early today."
print(sentence_in)
#
url="https://translation.googleapis.com/language/translate/v2"
url += "?key=" + api_key
url += "&q=" + sentence_in
url += "&source=en&target=ja"
#
rr=requests.get(url)
# print(rr.text)
unit_aa=json.loads(rr.text)
result = unit_aa["data"]["translations"][0]["translatedText"]
print(result)
#
sys.stderr.write("*** 終了 ***\n")
# ----------------------------------------------------------------
```
curl の例です。

```bash
API_KEY="BXzaSyBSZCXB9A1EodnHzbAPpO8EPNNCt5q4abc"
#
curl "https://translation.googleapis.com/language/translate/v2?key=$API_KEY&q=hello%20world&source=en&target=ja"
```
非同期処理を含むループをシリアルに処理したい場合に AsyncAwait でスッキリ書くスニペット

## はじめに
ついこの前、Node.js の LTS が 6系になったと思ったら、次の LTS(8系) のリリースまで 残り 1ヶ月くらいになってしまいました。
待ちに待った AsyncAwait の登場ですね！

## 本文

今までさんざん面倒だった、非同期処理のシリアルループが、AsyncAwaitでスッキリするよという例です。

MongoDB で、一つのコレクションの内容を、もう一方にコピーする場合を例にします。
(関係ないフィールドは値を保持)

Node.js 8.2、MongoDB は 3.4、ドライバは2.2を使っています。


```js
const mongodb = require('mongodb');

const uri = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017/test?max_pool_size=1';

// コレクションのコピー
const copy = async (db, from, to) => {
  const src = db.collection(from);
  const dst = db.collection(to);

  const cond = {}; // 検索条件

  const cursor = src.find(cond);

  const update = (c) => {
    return c.next().then(obj => {
      const { _id } = obj;
      return dst.updateOne({ _id }, { $set: obj }, { upsert: true });
    });
  };

  while (await cursor.hasNext()) {
    await update(cursor);
  }
};

// メイン
let db;
mongodb.MongoClient.connect(uri).then(_db => {

  db = _db;
  return copy(db, 'data_src', 'data_dst');

}).then(() => {
  db && db.close();
  process.exit(0);
}).catch(e => {
  db && db.close();
  process.exit(-1);
});
```
## まとめ
結局、重要なことは

 - 「async 関数」は、実行することで promise になる
 - await は async 関数内部だけで有効なキーワード
 - promise に await を付ければ、そこで非同期処理の終了を待ってくれる
RTXでNGN網内DNSサーバを利用する

YAMAHA RTXでNGN網内に存在するaoi.flets-east.jpのゾーン情報を持つDNSサーバを参照する際のメモ


```
# dns server select 100 2404:1a8:7f01:a::3 2404:1a8:7f01:b::3 aaaa aoi.flets-east.jp
```

以上
ゼロから作るDeepLearning、私的勉強範囲の整理

#はじめに
現在[オライリー社のゼロから作るDeepLearning](http://amzn.asia/anRpGOp)を読みながら勉強しています。
今まで読んだ技術書で一番分かりやすい(今までそんなに量読んでないですがw)のですが
後半に行くと難しいなあと思うことが増えてきたので自分用に一旦整理。
5章の誤差逆伝播法のところまでです。

#ざっくり流れ
サンプルと同じTwoLayerNet(入力層1,隠れ層1,出力層1の場合でサンプルのMNISTを使う)場合

##データ読み込み
訓練データ&テストデータの入力用&正解データを読み込み

##ミニバッチ
訓練データの中から一部のデータをランダムに取り出す
ここでは60000個のデータから100個取り出して同時に処理する(重複あり,np.random.choiceの第二引数をreplace=Falseにすると重複なし)
というのを10000回繰り返す

##パラメータ用意
ディレクショナリ配列paramを宣言
Wは重み、
bはバイアス

Wは0~1のランダムな数(ガウス分布)
bは0を格納

形状(一次元目、二次元目の数)はそれぞれ
'W1' = 入力層の数,隠れ層の数
'b1' = 隠れ層の数
'W2' = 隠れ層の数,出力層の数
'b2' = 出力層の数

##レイヤの生成
逆伝播時のために順番付きディレクショナリ配列layerを作成
クラスには順伝播時、逆伝播時の関数が用意されている
順伝播時は宣言した順番通りに処理、逆伝播時は逆の順序で処理する

'Affine1' = アフィン計算クラス(入力層→隠れ層の内積　+　バイアス)
'Relu1' = Relu関数(Affine1にRelu関数で計算)
'Affine2' = アフィン計算クラス(隠れ層→出力層の内積　+ バイアス)
変数lastLayer = ソフトマックス関数&損失関数を求めるSoftmax-with-Lossクラス

##フォワード処理
Affine1　→　Relu1　→　Affine2 →　Softmax-with-Loss

##勾配の計算
Softmax-with-Lossで算出された誤差を使用して
重みとバイアスに対する勾配を計算
数値微分もしくは誤差逆伝播法で求める

##パラメータの更新
重みとバイアスのパラメータを勾配方向に微小量だけ更新する
params -= 勾配 * 学習率

##繰り返し
フォワード処理に戻って繰り返す
損失関数をグラフで表したりする際はこの時に配列に値を格納する
infobip 社のオムニチャネルコミュニケーションプラットフォーム♪♪♪

次期プロジェクトで調査中に見つけたメッセージ会社。以下、メモとして残します。


☆彡　インフォビップ社のオムニチャネルコミュニケーションプラットフォーム <https://www.infobip.com/>  
-------------------------------------------
同じプラットフォームからSMS,Voice,Email,Facebook Messenger, Line, Viber, Push通知を単体チャネルからの送信を行ったり、SMSが一定時間内に届かない場合、SMS送信をキャンセルして、EmailやVoiceを送信していくように複数チャネルを組み合わせてロジックで送信順番と送信条件を予め決めて送れます。SMSの運用がうまくいかない場合に相手に伝えたいメッセージを的確にリーチさせたり、社内に分散するメッセージチャネルをまとめ上げ、全社一丸となり統合的なメッセージソリューションを実現するにはよいと思います。参照URL）https://www.youtube.com/watch?v=WWnACGkaQYI　
-------------------------------------------

☆彡　チャネル一覧 ♪♪(^_^)
------------------------------------------------
・SMS
・Voice（Inbound, Outbound, IVR）
・Email
・Push通知
・Chat App（Facebook Messenger, Line, Viber）

・2FA(二段階認証）
・Number Context（携帯電話番号検証サービス）


☆彡　特徴とおもったこと ♪♪(^_^)
------------------------------------------------
♪APIで簡単に接続できる。APIはWebで公開。
♪SMS→Voice→Email→FacebookMessengerの順番を予め決めた順番通りに送信可。
♪相手にリーチさせる確率を高めれる。
♪相手に届いたメッセージのみ課金なので、低料金で済む。



☆彡　注意したいこと ♪♪
------------------------------------------------
・SMSは、受信許諾が必要。（ただし、最初の受信許諾依頼は例外）
・Facebook messenger, Lineは作成したチャットアプリ許可を運営会社から取得が必要。
・Facebook Messengerでは、広告やマーケティングは禁止。
・そのため、Facebook Messengerではサポート、予約連絡、QRコードなどがよい。


☆彡　良いとおもったこと ♪♪(^_^)
------------------------------------------------
・私の上司がグローバル対応したので社内でほめられたこと。
・低コストにかかわらず他社以上の事ができたこと。
・開発時に和訳マニュアルの提供や無料でたくさんのテストをさせてくれたこと。
・開発時の問い合わせ対応が外資系なのに早くて作業が進めやすかったこと。
・この業界では超有名な会社なこと。
・今まで見ていなかったサービス内容と組み合わせが実現できたこと。
・データセンターが世界8か所あるので、システムダウンの心配がない。
・SMSでは、迷惑SMSをフィルタリングサービスで排除してくれるから安心。
・ISO 27001, 9001, PCI-DSS取得、GDPR（欧州個人情報保護法）対応済み。
・A2P（アプリから携帯への送信）で最高ランクであること。https://www.infobip.com/en/media/press-releases/infobip-rated-as-the-top-tier-one-vendor-by-rocco-a2p-sms-messaging-report　


☆彡　APIサイト
------------------------------------------------
・https://dev.infobip.com/　 
・C,C♯,Java,Java Script, Python, Json,XML, PHP etc
Let's try to analyze your chat bot.

I will introduce how I tried to analyze my chat bot.

# Table of Contents
1. 3 basic ways.
2. A review of analytics tool for the bots.
3. References
4. Versions

# 3 basic ways
To analyze my chat bot, I have to log the conversations. Then, there are 3 basic ways to analyze the logs.

1. Read logs directly.
Any way, It is important to see the conversations directly. I need check how my bot had conversations with users.

2. Filter logs.
Since I cannot see all conversations, I have to filter logs to find problems quickly. So, It is useful to allow users to give feedbacks. Below picture is an example getting user's feedbacks.
<img width="756" alt="スクリーンショット 2017-08-19 2.04.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/72274/5eaa8885-ccf0-b4f7-89aa-d2d6a38cca90.png">
[LOHACO](https://lohaco.jp/support/index.html?sc_e=zm_palj_aas_blh_cleg_dps_del)
And then, if I filter logs using message which is sent when users give feedbacks, I can find when problems happened quickly.

3. Watch number of unique user or sessions.
As usual web site, I have to watch number of unique user or sessions.

# A review of analytics tool for the bots.
I introduced 3 basic ways to analyze the bots. But it is difficult to make visualization tool by myself. So, I introduce an analytics tool specialized to the bots.
[Dashbot](https://www.dashbot.io/) is an analytics tool specialized to the bots and you can analyze your bot for free.
You can see the conversations directly.
<img width="1418" alt="スクリーンショット 2017-08-19 3.39.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/72274/395751a3-6128-6c3d-9c61-a92037f73b6a.png">
You can filter the messages.
<img width="1418" alt="スクリーンショット 2017-08-19 3.42.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/72274/3df40fc1-71d8-653c-3cc9-a771a402f888.png">
You can watch many access datas.
<img width="1414" alt="スクリーンショット 2017-08-19 3.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/72274/4ed5f779-ad03-a244-e757-5c9e901ce4e8.png">
<img width="1419" alt="スクリーンショット 2017-08-19 3.45.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/72274/88ee467b-74ec-a2cb-63b9-b7622d01204d.png">

# References
1.[Designing Bots](https://watson-api-explorer.mybluemix.net/apis/conversation-v1#!/message/message)
2.[LOHACO](https://lohaco.jp/)
3.[Dashbot](https://www.dashbot.io/)

# Versions
1. [2017.08.19] First Release
matplotlibのsubplotで共通の設定をオサレにやる

# やりたいこと
matplotlibのsubplotで描画した全ての軸に対して、グリッドやラベルなど共通の設定をしたい。
![Example1.png](https://qiita-image-store.s3.amazonaws.com/0/35426/4a2e5487-0217-a51a-bd20-1cdb0983b25c.png)


# やり方 1
1. 軸の一覧を取得する。
2. 軸毎にループ
3. 現在の軸を変更

```py3
# 1. 軸の一覧取得
axs = plt.gcf().get_axes()

# 2. 軸毎にループ
for ax in axs:
    # 3. 現在の軸を変更
    plt.axes(ax)
```

# コード例 
```py3
import matplotlib.pyplot as plt
import numpy as np

# データ
x  = np.linspace(-np.pi, np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# figure
plt.figure(figsize=(8,4))

# プロット1
plt.subplot(1,2,1)
plt.plot(x,y1,label='sin')

# プロット2
plt.subplot(1,2,2)
plt.plot(x,y2,label='cos')

# 軸の一覧取得
axs = plt.gcf().get_axes()

# 軸毎にループ
for ax in axs:
    # 現在の軸を変更
    plt.axes(ax)

    # 凡例を表示
    plt.legend(loc=2)

    # グリッド
    plt.grid(linestyle='--')

    # 軸ラベル
    plt.xlabel('x')
    plt.ylabel('y')

    # 軸の範囲
    plt.xlim([-np.pi, np.pi])
    plt.ylim([  -1.2,   1.2])

# 図の調整
plt.tight_layout()
```
# やり方 2
1. データとラベル等をリストにする。
2. enumerateを使ってループ
3. plt.subplotは+1するのを忘れない

```py3
# 1. データとラベル等をリストにする。
Y    = [y1, y2]
lbls = ['sin', 'cos']

# 2. enumerateを使ってループ
for i, y in enumerate(Y):

    # 3. plt.subplotは+1するのを忘れない
    plt.subplot(1,2,i+1)
```
# コード例 2
```py3
# figure
plt.figure(figsize=(8,4))
# list
Y    = [y1, y2]
lbls = ['sin', 'cos']

for i, y in enumerate(Y):
    # サブプロット
    plt.subplot(1,2,i+1)
    
    # プロット
    plt.plot(x,y,label=lbls[i])

    # 凡例を表示
    plt.legend(loc=2)

    # グリッド
    plt.grid(linestyle='--')

    # 軸ラベル
    plt.xlabel('x')
    plt.ylabel('y')

    # 軸の範囲
    plt.xlim([-np.pi, np.pi])
    plt.ylim([  -1.2,   1.2])

# 図の調整
plt.tight_layout()
```

# 以下補足情報
## gca, gcf
 plt.gcf()で現在のfigureを、plt.gca()で現在のaxesを取得できる。またplt.axes()で現在の軸を指定できる。

## 階層構造
　matplotlibのfigureは、MATLABと同じく以下の図のように階層構造になっている。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/35426/f1381a42-0e52-0b13-7aaf-d94f22cbff88.png)

figureの中にaxesがあり、axesの中にlinesがある。plt.gcf().get_axes()で現在のfigureにある全ての軸をリストで取得できる。他にはplt.gca().get_lines()だと現在のaxesにある全てのlinesを取得できる。
http_proxyの設定があるとlocalstackの起動でエラーになる

localstack を起動するときに、環境変数 http_proxy (または HTTP_PROXY) が設定されている環境では、以下のように elasticsearch の起動チェックで、何度か WARNING:infra.py:Service "elasticsearch" not yet available, retrying... の警告が出た後、エラーで終了することがある。

```
WARNING:infra.py:Service "elasticsearch" not yet available, retrying...
ERROR:localstack.services.es.es_starter:Elasticsearch health check failed (retrying...): (以降略)
```

また、Docker on Mac でもデフォルトがsytsem proxyを参照するようになっているため、OSのネットワーク設定でプロキシが有効になっている場合でも、同様の問題が発生する。

```
WARNING:infra.pyc:Service "kinesis" not yet available, retrying...
ERROR:infra.pyc:Error checking state of local environment (after some retries): Traceback (most recent call last):
File "/opt/code/localstack/localstack/services/infra.py", line 285, in check_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'
Traceback (most recent call last):
File "bin/localstack", line 79, in <module>
infra.start_infra()
File "/opt/code/localstack/localstack/services/infra.py", line 359, in start_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'
```

これは、起動チェックでモックサーバに接続しに行くところがプロキシサーバ経由となり、モックサーバに接続できないことが原因である。
このような場合、プロキシサーバを使用しないように環境変数の設定を解除すればエラーは解消するはずである。あるいは、環境変数 `no_proxy` を
`no_proxy=<コンテナのhostname>,localhost,127.0.0.1,[::1]`
のようにセットすれば、ヘルスチェックがプロキシをバイパスするようになる。

この問題は、[#239](https://github.com/localstack/localstack/issues/239)で解決済みであり、リポジトリから最新版を落としてくるか、[PR#244](https://github.com/localstack/localstack/commit/ae72427551a3d0b2d87c3bb68cf0be201b2dbbee)のパッチを適用することで解消する。
Bashで使えるMustache実装のmoが便利

## Mo

大げさなものは必要ないが、ちょっとしたテンプレート処理をスクリプトで実行したい場面はたまにあると思います。でも、その環境に何かをインストールさせるのはちょっと…というときには、Bashのみで完結すると嬉しいです。

そこで、MustacheテンプレートのBash実装である[mo](https://github.com/tests-always-included/mo)を使ってみました。

適当なテンプレートを用意します。

```foo.yml.mo
foo:
  {{FOO}}
```

出力するための数行のスクリプトを用意します。

```bash:generate.sh
#!/usr/bin/env bash
export FOO='hello world'
MO="$(curl -sf https://raw.githubusercontent.com/tests-always-included/mo/master/mo)"
cat foo.yml.mo | bash -c "${MO}"
```

```shell-session
$ ./generate.sh
foo:
  hello world
```

カジュアルに使えそうで便利です。


## または
[envsubst](http://qiita.com/minamijoyo/items/63ae57b99d4a4c5d7987)というコマンドがある。こちらも軽量で良い。
Cloud9上でデスクトップアプリを起動する

## はじめに

オンラインIDEのCloud9は環境構築不要でアプリ開発を始められて便利なのですが、それ自体がWebアプリケーションで、ブラウザ上でのUIしか提供していないため、標準ではElectronなどのデスクトップアプリは開発・実行できません。

ところが、最近Communityを見ていたら、過去の投稿でこんなものがありました。
https://community.c9.io/t/how-to-set-display-in-my-workspace/1646/22

つまり、Cloud9上でnoVNCを稼働させてしまうわけですね。やってみましょう。

## インストール
すべてCloud9上で実行します。
基本的には元記事に書いてある通りにやれば躓くところはありませんでした。

インストール：

```
cd ~
mkdir plugins
cd plugins
git clone https://github.com/acabey/cloud9-vnc.git
cd cloud9-vnc
sudo ./install.sh
```

途中、パスワードを聞かれますが、VNC用のパスワードなので、新しく入力してください。Cloud9のログインとは関係ないです。

```
Do you wish to set password for x11vnc? (not recommended for public workspaces!) y
Enter VNC password: [パスワードを入力]
Verify password: [パスワードを再入力]
Write password to /home/ubuntu/.vnc/passwd?  [y]/n y
Password written to: /home/ubuntu/.vnc/passwd
```

依存パッケージのインストール：

```
sudo apt-get update
sudo apt-get install supervisor
sudo apt-get install x11vnc
sudo apt-get install xvfb
sudo apt-get install fluxbox
sudo apt-get install novnc
```

ここまで出来たら、
`Run > Run With > C9vnc`
または
`/opt/c9vnc/c9vnc.sh`
を実行すると、VNCアクセス用のURLが表示されます。

アクセスすると、下記のようにnoVNCの画面が出てきます。

![Screenshot 2017-08-19 at 02.10.56.png](https://qiita-image-store.s3.amazonaws.com/0/112393/3f134e56-2c88-4173-36f5-e7879b7b33dd.png)

`Connect`をクリックして、先程設定したパスワードを入力すると、Ubuntuのデスクトップが出てきます。

## デスクトップアプリを動かす

[electron-quick-start](https://github.com/electron/electron-quick-start)をインストールして実行してみましょう。
VNCが起動していれば、Cloud9のコンソールから操作できます。

```
git clone https://github.com/electron/electron-quick-start.git
cd electron-quick-start
npm install
npm start
```

すると、こんな感じでVNC側に画面が表示されます。

![Screenshot 2017-08-19 at 02.20.32.png](https://qiita-image-store.s3.amazonaws.com/0/112393/7c53935e-3cfb-5a7b-d37f-cfc46f250856.png)
PHPでSQLServerの名前付きインスタンスに接続する

# 概要
* PHP7.1のPDO/php_sqlsrvではポート番号指定が必要。
* SQL Server Browserにポート番号を教えてもらって、指定すればOK。

# 経緯
*  PHP7.1で、SQLServerの名前付きインスタンスに接続できなかった。
*  PHP5.6の時は問題なく接続できていた。
*  [PHP.net](http://php.net/manual/ja/ref.pdo-sqlsrv.php)の説明を読んでも、名前付きインスタンスへの接続については書かれていない。
*  ググってみても、名前付きインスタンスをやめて固定ポートにすれば解決するという情報ばかり。
* ほかのアプリでも使っているSQLServerなので、インスタンスの公開方法を変えるのは避けたい。

# 環境
PHPはremiリポジトリからyumでインストールしたもの。
* CentOS6 / PHP5.6 ：php_pdo, php_mssql
* CentOS7 / PHP7.1 ：php_pdo, php_sqlsrv

接続するのにFreeTDSを使っていたのが、microsoft製のドライバ経由に変わったらしい。


# 接続するコード
```php
// PHP5.6で接続できたDSN
$dsn = "dblib:host={$ipaddr}\\SQLEXPRESS;dbname={$dbname};charset=UTF-8";

// 以前テストしたときにwindows上のphp_pdo_sqlsrvをつかって接続できたDSN
// 当時の環境は不詳。PHP5.3だったような。
$dsn = "sqlsrv:server={$ipaddr}\\SQLEXPRESS;database={$dbname}";

// PDOで接続。
$pdo = new PDO($dsn, 'dbuser', 'password');
```

PDOで接続する部分は一緒なので、以下はDSNのみ記載する。
windowsで成功していたのと同じように書いてみるが、つながらない。

```php
//接続に失敗する
$dsn = "sqlsrv={$ipaddr}\\SQLEXPRESS;database={$dbname}";
```
失敗する様子をWiresharkでモニタしてみたところ、tcp/1433に接続しようとして応答がない状態。
インスタンスの動的ポート番号を調べたところ49174だったので、[PDO_SQLSRV DSNの説明](http://php.net/manual/ja/ref.pdo-sqlsrv.connection.php)に従ってポート番号を入れてみると接続に成功した。

```php
//つながった
$dsn = "sqlsrv={$ipaddr}\\SQLEXPRESS,49174;database={$dbname}";
```


# 動的ポートに対応する
SQLServerの名前付きインスタンスは動的ポート番号でListenしているため、ポート番号を調べる必要がある。
SQLServerのポート番号を解決するために、[SQL Server Browser](https://technet.microsoft.com/ja-jp/library/ms165724\(v=sql.90\).aspx)というサービスが動いているらしい。

## SQL Server Browserに問い合わせる方法....
udp/1434でListenしていることは分かったものの、どうすればいいのかは調べきれず。

### 実際に問い合わせて観察してみた
PHP5.6ではポート番号を指定しなくても接続できたので、PHP5.6 (dblib) はSQL Server Browser に問い合わせているはず。
Wiresharkでパケットをモニタしながら接続してみたところ、

![img.png](https://qiita-image-store.s3.amazonaws.com/0/160635/8c6691e8-753c-5da9-4be4-6e95c36392f1.png)

「SQLEXPRESS」という文字列の前に0x04、後に0x00をつけて送っていた。

### 手動で問い合わせてみると...
シェルから問い合わせてみた結果 (PC名は伏せ字に修正)。

```Bash
$ echo -en "\04SQLEXPRESS\00" | nc -u 192.168.18.99 1434
?ServerName;*****;InstanceName;SQLEXPRESS;IsClustered;No;Version;9.00.4035.00;tcp;49174;np;\\*****\pipe\MSSQL$SQLEXPRESS\sql\query;;
```
セミコロン区切りで、項目名・内容の繰り返しで返ってくるようで、「tcp;<ポート番号>」を拾えばOKな印象。

## PHPで接続する
クラスメソッドにして、コンストラクタから呼ぶ形にする。

```php
class MyPDO_SQLSRV extends PDO {
    public function __construct($ipaddr, $dbuser, $password, $dbname) {
        $port = self::querySqlBrowser($ipaddr);
        if ($port === false) {
            throw new Exception('failed to find port number.');
        }
        $dsn = "sqlsrv:Server={$ipaddr}\\SQLEXPRESS,{$port};Database={$dbname}";
        parent::__construct($dsn, $dbuser, $password);
    }
    
    public static function querySqlBrowser($ipaddr) {
        $fp = fsockopen("udp://{$ipaddr}", 1434, $errno, $errstr);
        fwrite($fp, "\04SQLEXPRESS\00");
        $res = fread($fp, 1024);
        fclose($fp);
        if (!preg_match('/;tcp;([1-9][0-9]{0,4});/', $res, $matches)) {
            return false;
        }
        return $matches[1];
    }
}
```
```php
//接続できた
$mypdo = new MyPDO_SQLSRV($ipaddr, 'dbuser', 'password', 'dbname');
```
スクリーンオブジェクト

# screen (スクリーンオブジェクト) 
## モニタ画面(ディスプレイ)の色数やサイズ情報をなどを持っている。
ウィンドウを画面中央や指定位置に配置したい場合使用する。

| No.| プロパティ | 説明 | サンプル値|
|:-----------|:-----------|:------------|:------------|
|1| screen.width | 画面の横幅 |1680|
|2| screen.height | 画面の縦幅 |1050|
|3| screen.availWidth | 使用可能な横幅 | 1680|
|4| screen.availHeight | 使用可能な縦幅 |961|
|5| screen.availTop | 画面上から有効なピクセル|23|
|6| screen.availLeft | 画面左から有効なピクセル |0|
|7| screen.colorDepth | モニタ色深度 |24 ※2の２４乗色|
|8| screen.pixeDepth | 仮装画面色深度 |24 ※2の２４乗色 |

### 確認用サンプルコード
```js
for (i in screen) {
  console.log(i + "=" screen[i]);
}
```