OmniAICreator/Qiita-1.07M huggingface dataset:
blenderのpythonスクリプト入門してみた_その01

# Blenderでpythonを動かすには?

Python コンソールという物がある!

![image01.png](https://qiita-image-store.s3.amazonaws.com/0/102634/87b93c48-c940-567f-d065-1b542c372aa9.png)

[何でここでも Python チュートリアル？](https://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Extensions/Python/Intro_to_Python)

# Geometry
Python スクリプトでGeometryを生成する.

```Python
import bpy

# デフォルトのCubeを削除
def delete_all():
    for item in bpy.context.scene.objects:
        bpy.context.scene.objects.unlink(item)

    for item in bpy.data.objects:
        bpy.data.objects.remove(item)

    for item in bpy.data.meshes:
        bpy.data.meshes.remove(item)

    for item in bpy.data.materials:
        bpy.data.materials.remove(item)

delete_all()

# 頂点座標を定義
coords=[
    (-1.0, -1.0, -1.0),
    ( 1.0, -1.0, -1.0),
    ( 1.0,  1.0, -1.0),
    (-1.0,  1.0, -1.0),
    ( 0.0,  0.0,  1.0)
]

# この添字を使って面を定義
# 各面は４つの整数の並びで定義
# 三角形の面は最初の頂点と４つ目の頂点が同じになる必要
faces=[
    (2,1,0,3),
    (0,1,4,0),
    (1,2,4,1),
    (2,3,4,2),
    (3,0,4,3)
]

# 新規メッシュを作成
me          = bpy.data.meshes.new("PyramidMesh")
# メッシュでオブジェクトを作成
ob          = bpy.data.objects.new("Pyramid", me)
# オブジェクトを 3D カーソルの位置に配置
ob.location = bpy.context.scene.cursor_location
# オブジェクトをシーンにリンク
bpy.context.scene.objects.link(ob)
# メッシュの頂点、辺、面を埋めまる
me.from_pydata(coords,[],faces)
# 新たなデータでメッシュを更新
me.update(calc_edges=True)
```
# 注意
コメントに日本語を使うな（コメントでも文字化けします。）

![motion01.gif](https://qiita-image-store.s3.amazonaws.com/0/102634/be5b0c74-ce67-da08-f84e-9f6e786d0959.gif)
CSSキャッシュ対策で、自動でファイル更新日時のクエリをつける

サーバーの設定でCSSをキャッシュする事が多いですが、
修正の機会も多く、クエリ文字列を書くのも面倒ですね。

WordPressでファイルの更新日時を取得して、自動でクエリ文字列を付与するコードは、
以下にあります。

http://qiita.com/chikaxxx/items/8a3b2acca3209f2d31b4

ただもう少し簡単に管理したかったので、少しカスタマイズしてみました。
ほぼ[chikaxxx](http://qiita.com/chikaxxx)さんのコード流用です。

```functions.php
function add_filedate($filename){
    $file_path = get_template_directory().'/'.$filename;
  if (file_exists($file_path)) {
        $file_url = get_template_directory_uri().'/'.$filename;
        $put_query = date('ymdHis', filemtime($file_path));
        $file_href_output = $file_url.'?'.$put_query;
    echo $file_href_output;
  }
}
```

```header.php
<link rel="stylesheet" href="<?php add_filedate('css/style.css');?>" media="all">
```
ファイル名やテーマディレクトリからのパスを書けば、

```
<link rel="stylesheet" href="http://www.com/wp-content/theme/mytheme/css/style.css?170511021430" media="all">
```
のような感じに出力されます。

wp_enqueue_styleで管理する場合があるかもしれませんが、同様に

```header.php
wp_enqueue_style( 'style', add_filedate('css/style.css') );
```
で出来ますし、mediaに書く必要がある場合は、

```header.php
wp_enqueue_style( 'smart', add_filedate('css/smart.css'),"","","screen and (max-width:640px) and (min-width:0px)");
```
で

```
<link rel="stylesheet" type="text/css" href="http://www.com/wp-content/themes/mytheme/css/smart.css?170511021430" media="screen and (max-width:640px) and (min-width:0px)">
```
のように出力されます。:thumbsup_tone2:
PHPファイルを拡張子.htmlで動かす

WordPressをサイトルートとは別のディレクトリにインストールしていて、
WordPress配下でないトップページを一部動的化したい、
index.phpは既に使ってて使えない、とかそんなときに利用した方法です。

.htaccessファイルに以下のとおり記載することで、
PHPファイルを拡張子.htmlで動作・表示させることができます。
記述は先頭の行でよいです。
`AddHandler fcgid-script .html`

XサーバーだとこれでOKでした。
ただしレンタルサーバーの仕様によって記述内容を変える必要があるようです。

---

ロリポップ
`AddHandler php○-script .htm .html`

※○の箇所にPHPのバージョンを記入。
例）PHPのバージョンが5.3なら：
`AddHandler php5.3-script .htm .html`

---

ヘテムル
`AddHandler php○-script .html`

※○の箇所にPHPのバージョンを記入。
例）PHPのバージョンが5.3なら：
`AddHandler php5.3-script .html`

---

さくらインターネット
`Action myphp-script /php.cgi
AddHandler myphp-script .php .html`

さくらの場合これだけではダメで、
php.cgiというファイルを作成して、以下を記述します。

`#!/bin/sh
exec /usr/local/bin/php-cgi`

ファイルのアップ先は.htaccessと同階層。
conda環境が変な時は入れ直そう mac編


ときたまconda環境がぶっ壊れる。細かく追う暇もないので入れ直して解決してる。
もぉこんだ環境は嫌だと思った時は入れ直そう。


#condaの状態を見る

```
conda info --e
```

#conda環境を消す

```
source deactivate
conda remove --name py27 --all
conda remove --name py35 --all
```

#pyenvの状態を見る

```
pyenv versions
```

#pyenv環境を消す

```
pyenv uninstall miniconda3-4.0.5
pip uninstall conda
```

#pyenvとcondaを入れる

```
pyenv install miniconda3-4.0.5
conda create -n py27 python=2.7
conda create -n py35 python=3.5
source activate py35
```

#動いた
さっきまでopencvが入らなかった。
ライブラリの依然関係で環境が編になることがたまにあるので、入れ直せばOK。

<img width="596" alt="スクリーンショット 2017-05-11 21.06.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/2cf334b9-a7d3-7f89-328a-6f368b0d23ca.png">


enjoy your python life!!!
DockerでAngular quick start


社内勉強会でAngularやるのでセットアップの部分のみ


https://angular.io/docs/ts/latest/cli-quickstart.html


# 起動　app works!まで

### dockerコンテナ起動

Angularはnode: 6.9.x, npm 3.x.xが必要なのでnode公式のイメージを使用
後々指定できるけどportは4200を公開
`/app`ディレクトリにアプリを追加する

`docker run -it -p 4200:4200 -v $(pwd):/app --name angular-lesson node:latest`

コンテナの中に入る
`docker exec -it angular-lesson bash`

`/app`ディレクトリまで移動

`cd /app`

### angular-cliをダウンロード

ここからはAngular公式のquick start通り

`npm install -g @angular/cli`

時間かかる

### angularアプリケーションを作成

`ng new my-app`

`cd my-app`

### ng serveで起動するhostとportの設定

`my-app/.angular-cli.json`の編集

defaultsにserveの項目を追加

portとhostを設定、localhostだとdockerコンテナにブラウザからアクセス出来ないので`0.0.0.0`に変更

```json
  "defaults": {
    "serve": {
      "port": 4200,
      "host": "0.0.0.0"
    },
    "styleExt": "css",
    "component": {}
  }
```

### 起動

`ng serve`

docker内で`ng serve --open`するとブラウザが開けないので`ng serveのみ`

これでブラウザ`http://localhost:4200/`にアクセスすると`app works!`と表示されている


とりあえず以上
vagrant up でマウントに失敗するが一応解決した

##現象

vagrant upを実施すると下記のエラー文言が表示される
どうやらVMは立ち上がっているようなのですが、mountに失敗している

```
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

yum install -y kernel-devel-`uname -r` gcc binutils make perl bzip2

Stdout from the command:

Loaded plugins: fastestmirror, versionlock
Setting up Install Process
Determining fastest mirrors
 * base: ftp.iij.ad.jp
 * epel: mirror01.idc.hinet.net
 * extras: ftp.iij.ad.jp
 * remi-safe: mirror.bebout.net
 * updates: ftp.iij.ad.jp


Stderr from the command:

/root/.bashrc: line 18: ./git-completion.bash: No such file or directory
Error: xz compression not available
```

ぐぐってみたところこの記事がいい感じに説明しているっぽい
https://centos.org/forums/viewtopic.php?t=61044


>Error: xz compression not available. 

上記のエラーはyumのリポジトリとCentOSのバージョンに差がある場合に発生するらしい。
CentOS7だとxz compressionをサポートしてるが、CentOS6ではそうではないのが原因らしい・・・

まずはvagrant sshで中にはいって現象を確認

```Bash
$ cat /etc/redhat-release　 #OSのバージョン確認
CentOS release 6.8 (Final)

$ rpm -qa | grep epel #リポジトリのバージョン確認
epel-release-7-9.noarch
```
[ここ](https://www.tecmint.com/how-to-enable-epel-repository-for-rhel-centos-6-5/)確認したところバージョンが違うね。。。
[ここ](https://www.tecmint.com/how-to-enable-epel-repository-for-rhel-centos-6-5/)を参考に正しいバージョンを入れ直す

```Bash
$ yum remove epel-release #yumのリポジトリを消す
$ rm -rf /var/cache/yum/x86_64/7/epel #キャッシュを消す

#64bit版CentOS 6のEPELリポジトリをインストール　自分のCentOSのバージョンにあったものを入れて下さい。
$ wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -ivh epel-release-6-8.noarch.rpm
#確認
$ rpm -qa | grep epel
epel-release-6-8.noarch
```

直ったと思われるので
Vagrant　reload!!!!!!!!!!!!

だめだ・・・・・がエラーが変わった

後は[この記事](http://qiita.com/tamoryo37/items/df1f3435ba186fad1e05)の⑤に沿って下記コマンドを実行して、
vagrant　reloadしたら正常に立ち上がったー♪～(´ε｀ )

```Bash
sudo yum install http://vault.centos.org/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm
```
マジックザギャザリングの内輪ドラフトの結果をgoogle spreadsheetで管理する

#mtg draft calculator

githubに登録したので練習がてら何かあげようと思い、内輪のMTGサークルで使用していた、google spreadsheetを利用してマジックザギャザリング(MTG)のドラフトにおける勝率や各色の使用率、レーティングなどを計算するスクリプトをアップしました。

これを使って数百試合のドラフトの結果を見ていますが、
なかなか各々のピックの傾向や得意な色がわかりやすくて楽しいです。
ただ、誰が弱いか一目瞭然になるので最下位の人が参加しなくなっていくような弊害も起きます。

![スクリーンショット 2017-05-11 20.15.19.png](https://qiita-image-store.s3.amazonaws.com/0/175646/02e2f2b2-ef54-816e-d515-b2338ac6f0cc.png)

こんな感じでドラフトの使用色や勝敗数を記録するとレーティングや色の使用率を計算してくれます。

![名称未設定-15-01.png](https://qiita-image-store.s3.amazonaws.com/0/175646/a573fe20-9ddb-215a-4955-e0d56e830e76.png)

一人めっちゃ勝ってるやつがいますね（一位の友人は116試合で勝率6割越えです）。

![スクリーンショット 2017-05-11 14.37.37.png](https://qiita-image-store.s3.amazonaws.com/0/175646/1e232b5a-ada9-7d22-913b-b41fd9f63d43.png)

僕は白を選びやすい傾向にありますが得意なのは赤と緑みたいですね。
合計100%を超えるのはだいたい多色化するからです。

レーティングの計算は、確率の逆数の端数切り上げで計算しています。 
例えば、三回戦の場合は以下のようになります。

![スクリーンショット 2017-05-11 20.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/175646/a6d55b86-8556-6d7c-9e36-7a11766d3a1b.png)

コードは以下です。
https://github.com/kmooog/mtg

本当はもっとデータ集まれば各々のプレイスタイルの類似度とかかっこよく可視化しようかなぁとか考えてたのですが、あんまりサークルとして集まれなくなってきたのでこれ以上作りこむ気が無くなりました(私はだいぶ前からほとんど参加できず、データ解析でその憂さを晴らしていました)。

あぁドラフトやりたい。。。
pandas で簡単なグラフを描く

![pandas_sample.png](https://qiita-image-store.s3.amazonaws.com/0/179446/b68bb4b0-8941-6059-eade-d6ba69986993.png)

```py3:draw_sample.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#     draw_sample.py
#                             Apr/13/2018
# ---------------------------------------------------------------
import sys

import pandas as pd
from matplotlib import pylab as plt

sys.stderr.write("*** 開始 ***\n")
df = pd.DataFrame( [[0,1,2,2.5],
	[0.5, 1.5, 2.5,3.0], \
	[0.3, 1.2, 1.8,2.0]], \
	columns=('A','B','C','D') )
df.plot(title='Sample')
plt.show()
sys.stderr.write("*** 終了 ***\n")
# ---------------------------------------------------------------
```

## 確認したバージョン

```text
$ python
Python 3.10.9 (main, Dec 19 2022, 17:35:49) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> pandas.__version__
'1.5.3'
>>> import matplotlib
>>> matplotlib.__version__
'3.6.3'
```
黒い画面で英英辞書を開く



### `sdcv` をインストール
```
$ sudo yum install sdcv
```


### 辞書をDL
http://stardict.rrr.rs/index.html から好みの辞書をDL
それを
> /usr/share/stardict/dic

に展開。

これで `sdcv` とコンソールで打つと辞書が開く


### 「sdcv」って打ちづらい
もっと簡便にしたかったので以下のようなエイリアスを用意。

```.bashrc
function show_oxford() {
  sdcv -n -u "Oxford Advanced Learner's Dictionary" $@ | less
}
alias ?='show_oxford'
```

これで

```
$ ? test
```

のように `?` コマンドで辞書が開く


Macの場合
--------------
参考
+ http://macappstore.org/sdcv/
+ https://flossstuff.wordpress.com/2012/01/23/sdcv-command-line-based-dictionary-for-linux/

### インストール
```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
$ brew install sdcv
```

### 辞書ファイル用ディレクトリ作成
```
$ mkdir -p $HOME/.stardict/dic
```
CDFでスタンドアロンのデモンストレーションを作る

だいたい公式ドキュメントに書いてあるが注意点まとめ。

# CDFとは

Mathematicaをすべての端末に入れられれば必要無いが、大学の契約によっては学外持ち出し可能なノートPCなどにはインストールできなかったりする。
出先でちょっとしたデモンストレーション（パラメタを変えてグラフの形をリアルタイムに変えるなど）を行いたい場合に使うのがCDF形式のドキュメントとCDFプレイヤーである[^1]。

[^1]: 但し計算や編集はMathematicaでしか行えない。

CDFプレイヤーは無料で入手できる。
https://www.wolfram.com/cdf-player/

# CDFファイルの作成方法

https://reference.wolfram.com/language/howto/CreateAComputableDocumentFormatFile.html

.nbファイルから名前を変更して保存の画面で.cdfを作成できる。また、Web用及びスタンドアロンのCDFドキュメントをエクスポートすることもできる。

但しCDFプレイヤーでは評価の実行が出来ないため、**全ての計算式は`Manipulate[]`の中になくてはならない。**
（一部その前に記述することもできるらしい。）
`Manipulate[]`自体はドキュメント中に幾つあってもかまわない。

一つの`Manipulate[]`に一つのインタラクティブな描画しかできないが、`Plot[]`や`Graphics[]`の類を変数に代入しておき、`Show[]`を使えば通常通り重ね合わせることができる。

代入も`Manipulate[]`中で行うが、先の`Manipulate[]`で定義した関数はそれより下の別の`Manipulate[]`でも利用できる。

# CDFファイルの配布について

*ドキュメントがわかりづらいので間違いがあったら教えてください。*

利用規約にあるように、作成したCDFドキュメントには[クリエイティブ・コモンズ・ライセンス（CC BY-SA）](https://creativecommons.org/licenses/by-sa/4.0/deed.ja)が適用される。
このライセンスに従う限り自由に配布できる。

https://www.wolfram.com/cdf/adopting-cdf/licensing-options.html

CCライセンスにされるのは困る場合はCDFを用いたデモンストレーションは行わないこと。

なお上位版のCDFプレイヤーを契約した場合はこの限りではない。
OCamlで説明するgen_serverの使い方

# OCamlで説明するgen_serverの使い方

Erlang/OTPを勉強し始めたので、自分が理解するためにOCamlの型でgen_serverを理解したい。間違いの指摘など大歓迎。
gen_serverを完璧に型付けすることが目的ではない。なんとなく理解できれば良いつもり。

## 想定する読者

* OCaml使い
* Erlang/OTPの勉強中の人
* (optional) すごいE本の14章を読んだ

## バージョンについて

* Erlang/OTP 19
* OCaml 4.04.1


## ビヘイビア

behaviourはOCamlでいうところのファンクタだと思う。
想定するcallback群をSeedという名前のモジュールタイプで表現し、Seedを前提として提供される関数群をMakeという名前のファンクタで表す。

つまり、gen_serverビヘイビアみたいなのをOCamlのgen_server.mlで提供するならば次のようなインターフェイス(mli)となる。

```ocaml:gen_server.mli
(**
 * OCamlの型でErlang/OTP gen_server のインターフェイスを説明したい
 * gen_serverを使う人が用意すべき関数群(Erlangではcallbackと呼ぶ)
 *)
module type Seed = sig
  ...
end

(* 上記のSeedが与えられると、gen_serverは以下の関数群を提供する *)
module Make(S : Seed) : sig
  ...
end
```

gen_serverをOCamlで実装したいわけではないので、以下ではgen_server.mliを考えることにする。

## init

gen_serverによって生成されるプロセスが内部で保持する状態の型stateと、プロセス起動時の初期状態を決める方法initをSeedで決める。

```ocaml:gen_server.mli
(**
 * OCamlの型でErlang/OTP gen_server のインターフェイスを説明したい
 * とりあえず、initのみ
 * gen_serverを使う人が用意すべき関数群(Erlangではcallbackと呼ぶ)
 *)
module type Seed = sig
  type state (* プロセスが内部で保持する状態の型、外からは見えない *)

  type args  (* プロセス起動時に必要とするパラメータの型 *)
  val init : args -> (state, exn) result (* プロセス開始時の内部状態を構成する *)
  ...
end

(* 上記のSeedが与えられると、gen_serverは以下の関数群を提供する *)
module Make(S : Seed) : sig
  val start : S.args -> start_option list -> (pid, exn) result
  val start_link : S.args -> start_option list -> (pid, exn) result
  ...
end
```

### すごいE本 kitty_serverでの例

```ocaml:kitty_server.ml
module KittySeed : Gen_server.Seed = struct
  type state = cat list
  type args = unit
  let init () = Ok []
  ...
end
```

## call系の同期的なAPI

```ocaml:gen_server.mli
(**
 * OCamlの型でErlang/OTP gen_server のインターフェイスを説明したい
 * とりあえず、同期的なやりとりのためのcall系のみ
 * gen_serverを使う人が用意すべき関数群(Erlangではcallbackと呼ぶ)
 *)
module type Seed = sig
  type state (* プロセスが内部で保持する状態の型、外からは見えない *)

  ...
  type call_request  (* プロセスが提供することになる同期APIの入力 *)
  type call_response (* プロセスが提供することになる同期APIの出力 *)

  type handle_call_result = (*hibernateとtimeoutについては省略*)
    | Reply of call_response * state
    | NoReply of state
    | Stop of reason * call_response option * state

  val handle_call : call_request -> (pid*tag) -> state -> handle_call_result
end

(* 上記のSeedが与えられると、gen_serverは以下の関数群を提供する *)
module Make(S : Seed) : sig
  ...
  val call : pid -> S.call_request -> timeout option -> S.call_response
  ...
end
```

* handle_callでNoReplyを返すときはreply関数を直接どこかで呼んでいないといけない (;ﾟ ﾛﾟ )
* なるべくReplyを返すようにするのがお行儀が良いのかもしれない
* handle_call_resultにおける hibernateやtimeoutの更新に関してはあまり本質じゃない気がしたので省略した

### すごいE本 kitty_serverでの例

```ocaml:kitty_server.ml
module KittySeed : Gen_server.Seed = struct
  type state = cat list
  ...
  type call_request = (* kitty_serverが提供する同期的なAPIは次の二種類 *)
    | OrderCat of cat
    | Terminate
  type call_response =
    | OrderOk of cat
    | TerminateOk of cat list
  ...
end
```

本当は `call_response` 型はcall_requestに依存して変わるのでGADTなど使った方がより強い型付けができるかもしれないが、ここではなんとなく理解する目的なので深追いはしない。

## cast系の非同期的なAPI

だいたいcall系とおんなじノリ。requestやresultはcast系と別の型にできるっていうのがポイントなのかも。

## その他のcallback関数について

省略
WebRTC を知ったかするために最低限使う情報メモ

わか（った気にな）った WebRTC についてまとめておく。

# WebRTC とは
* P2P できる
* 低遅延
* 他にも色々

# 対応していないブラウザ
* **Safari**
* (Internet Explorer)

# 雰囲気
* WebRTC
    * NAT 越え
    * シグナリング
        * **ICE**
            * **STUN**
            * **TURN**
    * (中央サーバでデータを処理するパターン)
        * **SFU**
        * **MCU**

## その他単語
（特にこの記事内で何も話していない。）
* SDP
* ORTC

# シグナリング
P2P で通信するための経路情報等を調整する。
仕様としてはやり方は決まっていない。

## ICE (STUN, TURN)
NAT 越えをするための方法。
基本的には **ICE** と言う技術を使う。

**ICE**: [Interactive Connectivity Establishment](https://ja.wikipedia.org/wiki/Interactive_Connectivity_Establishment)

**ICE** の中に **STUN** と **TURN** がある。

* **STUN**
    * 最初だけ IP アドレスやポートを確認するために使うもの
    * 基本的な通信はクライアント間で直接通信
* **TURN**
    * 常に通信をパススルーする
    * STUN で通信できない場合に使う
    * （暗号化されたまま通過するので通信の中身を見られることはない）

## 中央サーバでデータを処理するパターン (SFU, MCU)
中央サーバでデータの中身を見て処理するケース。
_「同一コンテンツ（サービス内コンテンツ）を扱うクライアント」数が増えた時とかに使う。_

* **SFU**
    * サーバが受け取ったストリームをそのまま必要なクライアントに送る
    * 各クライアントの送信データ量が減る(受信データ量は減らない)
* **MCU**
    * サーバが受け取った複数のストリームを加工したりしてまとめた状態でクライアントに送る
    * 各クライアントの送受信データ量が減る
    * (SFU と比べて)サーバの負荷が大きい

（※わか（った気にな）る WebRTC の図とか見たらわかりやすいので見た方が良いと思う。）

# 感想
## 「わか「った気にな）る WebRTC」の本がわかりやすい
**話の流れが（オマージュさせてもらっているが）とてもわかりやすかった。**
ただ、実際に WebRTC をガッツリ使うにはさすがに別で調べる必要はある。
とりあえず使うにはサンプルコードがあってとても助かる。

# (おまけ)みんな探すだろう URL
* https://twitter.com/mzsm_j/status/861594959052365824
【ER図作成】Treasure DataのテーブルをMySQL workbenchへ

#概要
この記事ではTreasure Data(以下TD)にあるテーブルをMySQL workbenchへ移行し、ER図を作成するまでの過程を説明していきます。

#使ったツール
・MySQL
・sublime text（テキストエディタ）

#TDからMySQLへのテーブルの移行方法
最終目的はworkbenchでER図を作成することなのですが、TDから直接workbenchに送る事はできないので、一旦テーブルのカラムを取り出しMySQLへ送ります。

まずはTDにあるテーブルのcolumnを取り出します。
欲しいテーブルのクエリ画面で次のように打ち込むと、column,type,commentのテーブルができます。

```

show columns
from テーブル名

```

そしてquery resultの右側にあるdownloadボタンからこのテーブルをcsv形式で保存します。
次にこのデータをMySQL上に移すのですが、commentが邪魔だったり、varcharの後ろに文字数の指定がなかったりと、そのままの形では使えないのでテキストエディタ上で編集します。

（column,データ形式）の形に編集できたらMySQL上にテーブルを作成します。

```
$ mysql.server start

mysql> CREATE DATABASE データベース名;
mysql> USE データベース名
mysql> CREATE TABLE テーブル名 (column1 style,column2 style,…);

```
このとき、varchar(50)といったように文字数の指定をしていないとエラーが出るので注意！

#MySQLからworkbenchへのテーブルの移行方法
workbenchでmodel横の＋ボタンより、新しいER図を作成したら
DatabaseからReverse Engineerを選択します。

<img width="333" alt="スクリーンショット 2017-05-11 19.33.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/ca293369-3ca0-ccf9-c9d5-ba56fdbd45c1.png">

このような画面が出てくるのであとは画面の指示通りに進むと
<img width="897" alt="スクリーンショット 2017-05-11 19.39.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/b550c3e2-ed5f-4ef3-1161-ef73267e76ba.png">


カラム名をアトリビュートとするエンティティが完成します。
OpenCVをUbuntu＋pythonにインストールする

##目標
  - [ ] OpenCVをインストールする

##環境
 - Ubuntu 14.04.5 LTS

##NumPyとOpenCVをインストール
```shell-session
$sudo apt-get install python-numpy
$sudo apt-get install python-opencv
```
 ※NumPyは依存モジュール

これでOpenCVは入ったはずだが、ここからエラーで動かなかったので対処

##問題１：パスが通っていない
```shell-session
$python
>>> import cv2 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named cv2
```

よくみると、cv2.soへのパスが設定されていないことに気づく
[/usr/lib/python2.7/dist-packages/]

```shell-session
>>> import sys
>>> print sys.path
['', '/usr/local/pyenv/versions/2.7.13/lib/python27.zip', '/usr/local/pyenv/versions/2.7.13/lib/python2.7', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/plat-linux2', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/lib-tk', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/lib-old', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/lib-dynload', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/site-packages']
>>> exit()
$sudo updatedb
$locate cv2
/usr/lib/python2.7/dist-packages/cv2.so
/usr/src/linux-headers-4.4.0-75/arch/arc/include/asm/entry-arcv2.h
/usr/src/linux-headers-4.4.0-75/arch/arc/include/asm/irqflags-arcv2.h
$
```

という訳で、PATHを追加して再実行する

```shell-session
>>> import sys
>>> sys.path.append("/usr/lib/python2.7/dist-packages")
>>> print sys.path
['', '/usr/local/pyenv/versions/2.7.13/lib/python27.zip', '/usr/local/pyenv/versions/2.7.13/lib/python2.7', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/plat-linux2', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/lib-tk', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/lib-old', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/lib-dynload', '/usr/local/pyenv/versions/2.7.13/lib/python2.7/site-packages', '/usr/lib/python2.7/dist-packages']
>>> import cv2
libdc1394 error: Failed to initialize libdc1394
>>> exit()
```

すると、別のエラーが発生

##問題2：RAWデバイスが存在しない
エラー内容をGoogleで調べると、対処した人のコメントがあったので採用する
ただし「It is not a permanent solution.」ともあるのでそのうち違う退避作が出てくるかも

```shell-session
$ sudo ls /dev/raw1394
ls: cannot access /dev/raw1394: No such file or directory
$sudo ln /dev/null /dev/raw1394
$python
>>> import sys
>>> sys.path.append("/usr/lib/python2.7/dist-packages")
>>> import cv2
>>> cv2.__version__
'2.4.8'
```

[参考：OpenCV: libdc1394 error: Failed to initialize libdc1394](http://stackoverflow.com/questions/29274638/opencv-libdc1394-error-failed-to-initialize-libdc1394)


##問題１の恒久対策
`sys.path.append("/usr/lib/python2.7/dist-packages")`でPATHを追加したが、設定したセッションのみ有効なため、毎回PATHを追加するのは面倒
定義ファイルを作成して自動でPATHが設定されるように変更
場所は`sys.path`で表示されたPATHの中で、パッケージに関連しそうな
`/usr/local/pyenv/versions/2.7.13/lib/python2.7/site-packages`に`custom.pth`を新規に作成する

```shell-session:custom.pth
/usr/lib/python2.7/dist-packages/
```
[メモ]Macでデバッグを実行するとIntellijの動作が重たくなるーー解決方法

Macでデバッグを実行するとIntellijIdeaの動作が重たくなり、何秒間止まったりすることで、


[参考](https://youtrack.jetbrains.com/issue/IDEA-157303)
の通り、/etc/hosts の始めのラインを修正すると、解決しました。

一行目に、hostname に自分のmacのhostnameを入れ替えください。

```text
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost      <hostname>.local
255.255.255.255	broadcasthost
::1             localhost
```
bundler が git プロトコルではなく、https プロトコルを使うように設定する



## はじめに
bundler '1.14.6' を使いはじめ、
`git://github.com/hogehoge` のような git プロトコルを使うと https プロトコルに変えろと warning が出るようになったのと、
チームで開発していて自分は git プロトコル、他の誰かは https プロトコルの場合、
 `bundle install` すると他の人の `Gemfile.lock` では https プロトコルで書かれていた部分が
 再び git プロトコルで書き直されるのがウザかったので、https プロトコルに合わせるように bundle を設定します。
## 設定
まずは bundle の設定の確認。
`bundle config` と叩くと現在の bundle の設定が表示されます。

その中に

```
github.https
Set for the current user (/Users/username/.bundle/config): "true"
```

のような記述がなければ、https に設定されていません。

ちなみに私の場合は `/Users/username/.bundle/config` のパスに設定がありましたが、人によっては app 配下にあったり、環境変数にあるかもしれないので私と同じパスになかったら確認してみてください。(詳しくは <a href='http://ruby.studio-kingdom.com/bundler/bundle_config/' target='_blank'>こちらのページ</a> に載っています。)

先程のコマンドを叩いて https プロトコルを使う設定がない場合は、

```
bundle config  github.https true
```
と叩くと https プロトコルに設定されます。
(上記コマンドは `bundle config <設定> <値>`)
## まとめ
上記コマンドを叩き、再び `bundle config` を叩くと `github.https` が true に設定されるはず。

#### 参考
http://ruby.studio-kingdom.com/bundler/bundle_config/
http://y-yagi.tumblr.com/post/150244664010/bundler-1130%E3%81%A7gemfile%E3%81%AB-github
Rails5 + webpacker環境をVagrantで構築するときの設定ファイル

# Vagrantで構築する環境
- OS: Ubuntu16.04
- DB: mysql5.7

# 設定ファイル

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box_url = "https://atlas.hashicorp.com/ubuntu/boxes/xenial64"
  config.vm.box = "ubuntu/xenial64"

  config.vm.network "forwarded_port", guest: 3000, host: 3000 // rails用
  config.vm.network "forwarded_port", guest: 8080, host: 8080　// webpack server用
  config.vm.network "private_network", ip: "192.168.33.10"

  # dockerでmysqlを構築
  config.vm.provision "docker" do |d|
    d.run "db",
          image: "library/mysql:5.7.18",
          args: "-p 3306:3306 -v /var/host_lib/mysql:/var/lib/mysql --name mysqld -e MYSQL_ROOT_PASSWORD=password -d"
  end
end
```

```js:config/webpack/development.server.js
module.exports = merge(devConfig, {
  devServer: {
    host: "0.0.0.0",
```
PhotoshopScriptが糞でTextLayerのfont sizeが正しく取れないのでどうにかした件

Photoshopは、自分でScriptを書くことでいろいろなことが自動で出来ることは皆さんご存知ですよね？
結構便利ではあるのですが、糞のような仕様が紛れ込んでいたりします。
今回はそのうちの一つ、設定しているFont sizeが正しく取れないというバグ(仕様？)を紹介します。


Referenceを見ると、TextItemにsizeというフィールドが存在し、これを使うとFontSizeが取れそうと思いますよね？

```javascript
if(layer.kind == LayerKind.TEXT) {
    var fontSize = layer.textItem.size.as("pt");
}
```
ところがどっこい、Photoshop上で表示されている値と違った値を返すことが多々発生し、全く使えません。
どういう時に発生するかというと、

* Textを20ptで作成(フォント、文章はなんでも良い)
* Transformして、2倍位の大きさに
* Photoshop上での表示は40ptに変化
* textItem.sizeを見ると20ptのまま(本当は40ptを返して欲しい)

つまり、textItem.sizeは常に初期に設定されたTransform前の値を返す仕様となっているようです。(ちなみに、ArtLayerのboundsから近似の値はとれますが、正確では無いです)
それじゃ、どうすれば良いかというと、
## 用意されているAPIでは、正しい値を取得すること出来ません。

はい、クソです。
とはいえどうにかしないと行けなかったので、どうにかしました。
PhotoshopScriptの中にはUIの操作を模倣できる機能があるので、それを利用してUI操作を模倣しUI上の値を取って来ることになります。そのコードが↓になります。

```javascript
    /**
     * textItem.sizeで取れる値は初期設定値で、
     * LayerをScaleした場合、その情報が反映されていない。
     * そのため、正しい値を取得するにはActionReferenceを使用する必要がある
     */
    function getFontSize(layer /* ArtLayer */ ){
        
        selectLayer(layer);
        // read font size
        var ref = new ActionReference();  
        ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );   
        var desc = executeActionGet(ref).getObjectValue(stringIDToTypeID('textKey'));  
        var textSize =  desc.getList(stringIDToTypeID('textStyleRange')).getObjectValue(0).getObjectValue(stringIDToTypeID('textStyle')).getDouble (stringIDToTypeID('size'));  
        if (desc.hasKey(stringIDToTypeID('transform'))) {  
            var mFactor = desc.getObjectValue(stringIDToTypeID('transform')).getUnitDoubleValue (stringIDToTypeID("yy") );  
            textSize = (textSize* mFactor).toFixed(2);  
        }  
        return textSize;
    }
    /**
     * Layer選択をする
     */
    function selectLayer(layer){
        
        var idslct = charIDToTypeID( "slct" );
        var desc = new ActionDescriptor();
        var idnull = charIDToTypeID( "null" );
        var ref = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        ref.putName( idLyr, layer.name ); // Pass layer name
        desc.putReference( idnull, ref );
        var idMkVs = charIDToTypeID( "MkVs" );
        desc.putBoolean( idMkVs, false );
        var idLyrI = charIDToTypeID( "LyrI" );
        var list = new ActionList();
        list.putInteger( layer.id );
        desc.putList( idLyrI, list ); // Pass layer id
        executeAction( idslct, desc, DialogModes.NO );
    }

```

何やっているコードかわかりませんよね？私もわかりません。Photoshopには、UI操作をScriptコードとして記録してくれるScriptingListenerと呼ばれる機能があり、そこに出てきたログをコピペしただけです。
[ScriptingListenerを有効にする方法](https://forums.adobe.com/thread/1237032)

### 次回、フィールドアクセスだけで例外(気が向いたら)
hamlでimage_tagを使う方法


```show.html.haml
= image_tag @event.eye_catch.to_s, size: "100x100", alt: "test"
```

- 第1引数　・・・　画像ファイルへのパスを指定
- 第2引数　・・・　表示したいサイズを指定できます（width × height）
- 第3引数　・・・　alt属性の指定
[React Native] iOSアプリがバックグラウンドに入ってもタイマーを動かす


# アプリがバックグラウンドに入るとJSのタイマーが止まってしまう
[前回の記事](http://qiita.com/ariiyu/items/81154c45b8b37feb8009)ではJavaScriptでタイマーを実装しましたが、それだとユーザーが端末のホームボタンを押して、iOSアプリがバックグラウンドに入るとタイマーが止まってしまいました。

上記のiOSアプリの前提としては、`UIBackgroundModes`の設定がONになっていて、バックグラウンドで音源を再生し続ける機能を持っています。 （その条件なら）iOSネイティブのNSTimerを使えばタイマーがバックグラウンドで動作し続けるのですが、せっかくなのでReact Nativeのライブラリがないか探してみました。
 
今回は[react-native-background-timer](https://github.com/ocetnik/react-native-background-timer)というライブラリを見つけたので、それを使ってみました。


# react-native-background-timer
react-native-background-timerの[iOSの実装]([react-native-background-timer/RNBackgroundTimer.m at master · ocetnik/react-native-background-timer](https://github.com/ocetnik/react-native-background-timer/blob/master/ios/RNBackgroundTimer.m))を見たところ、`beginBackgroundTaskWithName`を使ってバックグラウンドタスクを登録するようです。  
iOSの仕様上、`UIBackgroundModes`の一部のモード以外ではOSが長時間のバックグラウンド処理を止めてしまうということになっています。このライブラリを導入する際は、ネイティブ側も適切に設定する必要がありそうです（[iOSのドキュメント](https://developer.apple.com/jp/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html)や[Issues](https://github.com/ocetnik/react-native-background-timer/issues)を参考）。

# ライブラリ導入前

JavaScriptのタイマーを動かしていました。

```js:index.ios.js
let timer = null;
```

```js:index.ios.js
  runPauseTimer(sec) {
    clearTimeout(timer);
    timer = setInterval(()=> {
      // 略
    }, 1000)
```

```js:index.ios.js
   stopPauseTimer() {
    clearTimeout(timer);
     // 略
   }
```

# ライブラリ導入後

react-native-background-timerを導入します。
元の記述と殆ど変わっていませんが、`BackgroundTimer`の`clearTimeout`や`setInterval`を使います。

```js:index.ios.js
import BackgroundTimer from 'react-native-background-timer';
let timer = null;
```

```js:index.ios.js
  runPauseTimer(sec) {
    BackgroundTimer.clearTimeout(timer);
    timer = BackgroundTimer.setInterval(()=> {
      // 略
    }, 1000)
```

```js:index.ios.js
   stopPauseTimer() {
     BackgroundTimer.clearTimeout(timer);
     // 略
   }
```

これで、アプリがバックグラウンドに入ってもタイマーが動作し続けるようになりました。

# タイマー以外のバックグラウンドタスク系ライブラリ
余談ですが、Locationやbackground fetchなど、用途によっていくつかあるようです。

- [transistorsoft/react-native-background-geolocation: Sophisticated, battery-conscious background-geolocation with motion-detection](https://github.com/transistorsoft/react-native-background-geolocation)
- [transistorsoft/react-native-background-fetch: iOS Background Fetch API Implementation](https://github.com/transistorsoft/react-native-background-fetch)

# 参考
- [Timers](https://facebook.github.io/react-native/releases/next/docs/timers.html)
- [バックグラウンド実行](https://developer.apple.com/jp/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html)
- [[Swift]バックグラウンドでも処理を続ける方法 - Qiita](http://qiita.com/SatoTakeshiX/items/8e1489560444a63c21e7)
JS を途中から <script crossorigin=anonymous> で配信することにした場合はキャッシュに注意

## 起きた問題

1. これまで crossorigin のついてない script タグで JS を読み込んでいたサイトがあった
    - JS は app.[hash].js みたいな形式のファイル名で、 Cache-Control: max-age で長めにキャッシュ
    - Access-Control-Allow-Origin は当然返していなかった
2. Access-Control-Allow-Origin を返すようにして、 crossorigin=anonymous の付いたタグで読み込むように変更
3. 200 ok (from cache) でレスポンスヘッダもキャッシュされてしまっていて、 Access-Control-Allow-Origin が返ってきてない状態のキャッシュを使ってしまう
4. CORS エラーで JS 読み込み失敗
    - Cmd + Shift + R とかでキャッシュ無効のリロードをするまで解決しない

Chrome Developer Tools だと「Access-Control-Allow-Origin が返ってきてない」としか教えてくれなくて、 CORS の設定を疑ってたせいでハマりにハマった。
Safari 開発者ツールを使ってみたら 200 でキャッシュ「はい」で返ってきているのが確認できた上で CORS エラーが出力され、それでようやく問題に気づけた。

## 解決方法

上記のように長めにキャッシュしてる場合、ファイル名を変えてデプロイするしか方法はなさそう。
AutoHotKeyブロックコメントと文字エンコーディング


AutoHotKey1.1(=AutoHotKey_L)前提。

## AutoHotKeyのブロックコメント
AutoHotKeyのブロックコメントは`/* */`で表現できる。

ただし、コメントシンボルは必ず行頭に書かれている必要がある。つまり、ブロックコメント終了文字`*/`も、行末に書いてはならない。

```ahk
/* ここもコメント
ブロックコメント
*/

; 行コメント

MsgBox, , Title, test ; 行の途中からコメントする場合、`;`の前に空白文字が必要
```

これが守られない場合――例えば、終了シンボル`*/`が行末にある場合などは、スクリプトは**エラーを出さずに**終了する模様。

## スクリプトファイルの文字エンコーディング
ここから本題。

ブロックコメントに日本語（マルチバイト文字）が含まれる場合、文字エンコーディングによっては改行が正しく解釈されず、上記のブロックコメントがらみの異常終了を引き起こす可能性がある模様。

例えば、以下の極めて単純なスクリプトを**UTF-8(BOMなし)**で保存し、実行した場合、メッセージボックスが表示されない。

```ahk
/*
日本語コメント。この部分は処理に影響しないが、スクリプトファイルの文字エンコーディングによっては問題を引き起こす。
*/
MsgBox, , Title, Test
```

ファイルをUTF-8(BOMあり)で保存し直した場合、問題なく表示される。

AutoHotKey1.1(AHKL)を利用する場合、原則として、スクリプトファイルはUTF-8(BOMあり)で保存することが望ましい。

- [AutoHotkey\_L/イントロダクション \- AutoHotkey Wiki](http://ahkwiki.net/Introduction_L)

> スクリプトを全てUTF-8に変換する。コマンド等は日本語を含むことはないのでほぼ問題は無い。
> メモ帳などのテキストエディタで開いてエンコードを指定して保存すればよい。
> BOMの有り無しを指定できるテキストエディタの場合、エンコードが明示的なBOM付を選択するのが望ましい。

特に、**ブロックコメントを含むスクリプトが正常に動かない場合**、文字エンコーディングを変更することで解消する可能性がある。
Golang 関数引数のスライスはポインタで渡すべき？

```
func insertList(rows []RowColumn) error {
    ...
}
```
みたいなコードを書いたらコードレビューにて, 配列は値渡しにするとコピーが大きいからポインタ渡しの方がいいのでは？という指摘をされたので調査.
(※弊社は基本Pythonの会社でございます)

###Golang では関数の引数は基本的に値渡しである
これは公式言語仕様にもそうあります.
http://golang-jp.org/ref/spec#Calls

In a function call, the function value and arguments are evaluated in the
usual order. After they are evaluated, **the parameters of the call are 
passed by value to the function** and the called function begins execution.
The return parameters of the function are passed by value back to the 
calling function when the function returns. 

つまり要素50のスライスを関数に引数として渡すとコピーを生成する？

###スライスと配列は同じもの？
配列(array)は特定の型の0個以上の固定長列です.

```
var l [3]int = [3]int{1, 2, 3}
```
配列を関数の引数に渡すと配列のコピーが生成されるので要素数によっては非効率とのことです. (書籍 プログラミング言語Go より)
C言語等では配列を関数の引数に渡すと先頭要素のポインタを渡しとなるのでこの点は注意です.

次にスライス(slice)は要素が全て同じ型であることは配列と同様ですが, こちらは可変長です.
再び 「プログラミング言語Go」 より, 「スライスとは配列の要素の部分列へアクセスする軽量なデータ構造であり, そのような配列をスライスの基底配列と呼ぶ. スライスはポインタ、長さ、容量の三つの構成要素を持つ」とあります.
さらにポインタはスライスを通して到達可能な配列の最初の要素を指すらしいです.(必ずしも配列の最初の要素とは限らない)
長さはスライスの要素数, 容量はスライスの開始から基底配列の終わりまでの要素数です.

###つまり関数引数としてのスライスは？
スライス自体が配列へのポインタを持っているため, さらにスライスのポインタを引数にするというのはよろしくないです.
またまた 「プログラミング言語Go 」より, 「スライスのコピーは基底配列に対するエイリアスを作成します」とのことです.
配列の要素コピーは作らないのでスライスはそのまま渡す, でよさそうです.

まあエイリアスってことは関数内部でスライス変更すると元のスライスも変わるんですけどね.(これは良し悪し)
年齢計算

```GetAge.sql
-- 年齢計算SQL
DECLARE  @今日     CHAR (8) = '20170511'  -- 今日（いつ時点での年齢か）
        ,@生年月日 CHAR (8) = 'YYYYMMDD'  -- 生年月日

SELECT
    YEAR (@今日) - YEAR (@生年月日) - 
    CASE 
      WHEN 
        RIGHT (CONVERT(CHAR, @今日, 112), 4) < RIGHT (CONVERT(CHAR, @生年月日, 112), 4) 
      THEN 1 
      ELSE 0 
    END AS 年齢
```
機械学習④ K近傍法 (K-nearest neighbor) まとめ

# K近傍法 (K-nearest neighbor)  のまとめ

## What is K近傍法 (K-nearest neighbor)  ?

Train Data を平面上に plot していき、あるテストデータ 't' をテストするときに、平面上で、その点t に近い K個の点の最頻値で テストデータ 't' のラベリングをする。というのが K近傍法です。（平面以外も使うのですが、ここでは、概念を説明するため、わかりやすい平面を使います。）
ちょっと難しいので、Wikipedia から図を拝借してきます。

![Screen Shot 2017-05-11 at 16.05.09.png](https://qiita-image-store.s3.amazonaws.com/0/161691/0ef802ee-41ee-556b-8b64-ec3ffb0e9708.png)
Extracted from [Wikipedia](https://ja.wikipedia.org/wiki/K%E8%BF%91%E5%82%8D%E6%B3%95) 

というように緑の点を、最も近い K個の点を元にラベリングします。
ここで注意したいのが、K個の点とした、変数 K です。
例えば、上記の図で、 
K = 3 とすると、赤2点、青1点で 緑の点は 赤にラベリングされます。
K = 5 とすると、赤２点、青３点で、緑の点は、青にラベリングされてしまいます。

## K近傍法の注意事項 

- 上記の場合であれば赤と青の点がある程度まとまって分かれているならば、K近傍法は、うまく機能するでしょう。しかし、逆に赤と青の点が特にまとまって分かれているわけでもなく、赤と青の点が混在しているデータであれば、K近傍法を使うのは得策とは言えません。


- さらに、Kの個数を指定するときに偶数を指定すると、二つのラベルが同数になってしまって分類できなかったりするので、Kの個数は必ず奇数にしましょう。

- そして、Kの数を多くした場合、例えば、赤の点が青の点に比べて異常に多ければ、赤に分類される確率も異常に大きくなってしまいます。なので、赤と青の点の比率にも注意が必要です。



## default のコード

```python:

from sklearn.neighbors import KNeighborsClassifier

KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', 
leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=1, **kwargs)

```

## K近傍法 (K-nearest neighbor) 内の Parameter の説明

- n_neighbors
これが上記で述べたように、考慮する最寄りの点の数です。 default であれば、n_neighbors = 5 になっているので、最寄りの点 5つから分類をします。ちなみに、n_neighborsの境界線の違いは下記の図のようになります。
![Screen Shot 2017-05-11 at 17.37.00.png](https://qiita-image-store.s3.amazonaws.com/0/161691/05714fbb-4a5b-8641-d26a-46f937464195.png)
![Screen Shot 2017-05-11 at 17.37.09.png](https://qiita-image-store.s3.amazonaws.com/0/161691/250ec506-129a-adf4-8f1d-e66974aff0da.png)
Extracted from [kevinzakka's blog](https://kevinzakka.github.io/2016/07/13/k-nearest-neighbor/)

たぶん一番大切なパラメータが上記で説明した n_neighbors で、この考慮する K個の点を最適な数を下記のコードで求められるらしい。

```python:

# K個のKに入れる数字のリストを作る
myList = list(range(1,50))

# そのリストから偶数を引き、奇数だけのリストにする
neighbors = filter(lambda x: x % 2 != 0, myList)

# Cross Validation のスコアを入れる空のリストを作る
cv_scores = []

# cross validation をして、スコアを上記の空リストに append
for k in neighbors:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
    cv_scores.append(scores.mean())

```
これも [kevinzakka's blog](https://kevinzakka.github.io/2016/07/13/k-nearest-neighbor/) より抜粋

- weights
weights は重み付けのパラメータです。 'uniform' が default でこれを使用すると、すべての値が等しく考慮されます。'distance' にした場合、近くの点が遠い点よりも考慮される割合が高い（重み付け）です。また自分で関数などを作って指定することもできます。

- algorithm 
すいません、これに関してはユークリッド空間とか専門用語でてきて数学的教養のなさでわかりませんでした。でもそんな方向けに 'auto' という指定ができ、最適なのを選んでくれるそうです。ちなみに、他の種類は'ball_tree', 'kd_tree', 'brute'らしいので、興味ある方は調べてみてください。また、わかりやすい解説見つけた方、コメントで教えてください。

一応上記がメインのパラメータです。また、理解できたのが増え次第足していきます。わかる方は、編集リクエストも大歓迎です。よろしくお願いいいたします。

## K近傍法 (K-nearest neighbor)  の 良い点悪い点。

- 良い点

データの規模が大きければ、より正確な分類をすることができる確率が上がります。シンプルでわかりやすいモデル。

- 悪い点

What is K近傍法のところで2つ注意事項として悪い点を述べましたが、もう一度一文で簡単にまとめます。
複数のクラスが異常に混在していたり、比率が異常に偏っている場合などは、分類がうまくいかなかったりします。


## まとめ

以上が現在筆者のわかる範囲での K近傍法 (K-nearest neighbor)  の概要です。
日々更新していきますので、追加すべきところ、直すべきところありましたら、コメントいただけると幸いです。
YamahaRT saの更新


saの更新について
VPNのセッションがおかしくなったり、
トンネルの接続テストをしている場合でよく使いますね。

```
> ipsec sa delete all ?
    入力形式： ipsec sa delete all
               ipsec sa delete SA_ID
               SA_ID = 1-
　    　説明： 管理されているSAを削除します
```

こちらは非推奨コマンド

```
> ipsec refresh sa ?
    入力形式： ipsec refresh sa
　    　説明： すべてのSAを削除してIKEの状態を初期化します
```

切断した事を相手に通知するとかなんとか違いがあったはず。
Cognosで縦持ち表を横持ち表に変換してレポート出力する

##概要
Cognos BI&Analyticsでいわゆる縦持ち表を横持ち表に変換して、レポート出力する例です。

こんな感じに、縦持ちのデータを与えられる事があります。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9340941a-491f-f06b-1c43-a6afe5260e75.png)

そのままFramework Managerで取り込んで、レポート出力すると以下の表示となります。わかりにくいですね。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1021edc8-72ef-9579-972e-5761b7956bb6.png)

当然、この形で出力して欲しいという要件になります。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b40b25a3-8074-cb4b-bc18-71417d846201.png)

##実装方法
やり方はまあ、SQLを知っている方であれば簡単です。

Framework Managerで、セマンティックレイヤにテーブルを取り込む代わりに、クエリーサブジェクトを作成します。※作成の際は、下記のように「データ・ソース」タイプを選んで頂き、メタデータ・ウィザードを実行しないようにすれば、クエリーサブジェクトにSQLを直接記載する事ができます。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/04cbb41a-3e6a-2a9c-41d1-cee5cbdbc34e.png)

クエリーサブジェクト内のSQLの定義としては、以下のようなものを記載します。※[]内はデータソース名です

with w1 as (select PRODNAME,DATATYPE,DATAVALUE from [DB2SAMPLE2].PROD_TATE order by PRODNAME asc),
w2 as (select PRODNAME,
case DATATYPE when 'VOLUME' then DATAVALUE end as VOLUME,
case DATATYPE when 'WEIGHT' then DATAVALUE end as WEIGHT,
case DATATYPE when 'PRICE' then DATAVALUE end as PRICE 
from w1)
select PRODNAME,
max(VOLUME) as VOLUME,
max(WEIGHT) as WEIGHT,
max(PRICE) as PRICE 
from w2
group by PRODNAME

![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/155723e2-a012-5e6d-65d7-e17329a6a1ad.png)

こうやって取り込んだPROD_YOKOをレポートで表示すると、無事にこの表示になります。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8e125f72-8c9a-f8a0-6b90-5969938e334a.png)

良く使う方法なので、ご活用頂ければと思います。
Orekaを使ってみる

__この記事はまだ作成途中です__

以下は http://oreka.sourceforge.net/about/ の日本語訳です。

# About
### 企業向けのオープンソース通話録音、検索システム
オレカはウェブベースのUIを備えたオープンソース通話録音、検索システムです。
このプロジェクトは現在VoIP SIP, Cisco Skinny (aka SCCP), raw RTP, そして、オーディオサウンドデバイスからの音声録音と、複数のオペレーティングシステムとデータベース上での動作をサポートしています。

このシステムは大抵のPBXと、BroadWorks, Metaswitch, Asterisk, FreeSwitch, OpenSIPS, Avaya, Nortel, Mitel, Siemens, Cisco Call Manager, Cosmocom, NEC...などのような通話システムからの録音を可能とします。
とりわけコールセンターやコンタクトセンター内で品質管理の目的で使用されています。

オレカはOrecX LLCの支援によって運営されています。
プロフェッショナルなオープンソースのサポートと商用バージョンは[こちら](http://www.orecx.com/)で利用できます。

# Features
オレカは現在以下の機能を備えています。

## 録音と保存
* ネットワークパケット待ち受けによるVoIP RTPセッションの録音。  
会話の発話は混合され、各コールは音声ファイルとして保存されます。  
SIPまたはCisco Skinny (SCCP)の信号が検知された時は、それに関連するメタデータも抽出されます。
* 標準的なサウンドデバイス(例えばマイクやライン入力)からの録音。
同時に複数のチャンネルで録音することができます。  
各録音はそれぞれ音声ファイルとして保存されます。
* オーディオキャプチャーのためのオープンプラグインな設計思想は、多くのオーディオソースからの録音を可能とします。
* コーデックや信号解析フィルターのためのプラグイン形式を備える。
* 自動オーディオセグメンテーションによって、連続したオーディオソースは別々のオーディオファイルへの分割と、容易な抽出を可能とします。
* 複数のネットワークデバイスからのパラレルキャプチャ
* pcapトレースファイルからのキャプチャ
* ボイスアクティビティの検知
* G.711 (A-Law, U-Law), G.721, G.722, GSM6.10, speex, iLBC RTP これらのエンコーディング形式をサポート
* G.711（A-Law、U-Law）およびGSM6.1でエンコードされたwavファイルを保存形式としてサポート
* ワイヤ形式から保管形式への自動トランスコーディング
* ファイルまたは主要なデータベースシステムへの録音メタデータのロギング

## ユーザーインターフェース
利用可能な場合は、録音検索は以下の項目で行えます。  

* Timestamp
* 録音時間
* Direction (for a telephone call)
* Remote Party (for a telephone call)
* Local Party (for a telephone call)

## 互換性
オレカは以下のプラットフォームで動作することが報告されており、実際にはさらに多くのプラットフォーム上で動作するでしょう。  

* Cisco CallManager and CallManager Express v. 3.x, 4.x, 5.x, 6.x, 7.x and 8.x
* SIP
* Lucent APX8000
* Genband M6
* Sylantro
* 
Avaya PBXes (Raw RTP only, for metadata extraction and TSAPI support, get in touch with support@orecx.com)
* Siemens HiPath (Raw RTP only, for metadata extraction, get in touch with support@orecx.com)
* Nortel (Raw RTP only, for UNISTIM support, get in touch with support@orecx.com)
* Alcatel (Raw RTP only, for UA/NOE signalling support, get in touch with support@orecx.com)
* Mitel (Raw RTP only, for metadata extraction and MiTAI support, get in touch with support@orecx.com)
* Shoretel (Raw RTP only, for metadata extraction, get in touch with support@orecx.com)
* Panasonic (Raw RTP only, for metadata extraction, get in touch with support@orecx.com)

# Installation
## Environment
OS : bento/centos-6.7

## Actions
まずはインストーラーをダウンロードします。
[OrkAudio Download Page](http://oreka.sourceforge.net/download/redhat)
[OrkWeb Download Page](http://oreka.sourceforge.net/download/war)
録音するプログラムとWebUIが別々になっているようです。  

* tarを解凍してシェルを実行

```
# tar -xf orkaudio-installer.sh.tar
# chmod +x orkaudio-installer.sh
# ./orkaudio-installer.sh
```

orkwebも同様です。
シェルを実行する際には、orkaudioはperlを、orkwebはmysql-serverを必要とします。

## Execution
### orkweb

```
# service tomcat start
```

tomcatを起動後、http://machine-ip:8080/orkweb でWebGUIにアクセスできます。
最初にログイン画面が表示されますが、初期状態ではadmin/adminでログイン可能です。

ログインができない場合、DBの接続設定を確認しましょう。

```
# vi /etc/orkweb/database.hbm.xml
```
installation of package 'rattle' had non-zero exit statusとなったとき

統計の授業で`rattle`というパッケージが必要となったのでインストールしようとしましたが早速コケたのでメモ。

## 問題の概要

いつも通り`install.package()`を使ってインストールしたところ以下のようなエラーを吐いて止まった。

```R
During startup - Warning messages:
1: Setting LC_CTYPE failed, using "C" 
2: Setting LC_TIME failed, using "C" 
3: Setting LC_MESSAGES failed, using "C" 
4: Setting LC_MONETARY failed, using "C" 
* installing *source* package 'RGtk2' ...
** package 'RGtk2' successfully unpacked and MD5 sums checked
checking for pkg-config... /usr/local/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for INTROSPECTION... no
checking for GTK... no
configure: error: GTK version 2.8.0 required
ERROR: configuration failed for package 'RGtk2'
* removing '/Library/Frameworks/R.framework/Versions/3.4/Resources/library/RGtk2'
Warning in install.packages :
  installation of package 'RGtk2' had non-zero exit status
During startup - Warning messages:
1: Setting LC_CTYPE failed, using "C" 
2: Setting LC_TIME failed, using "C" 
3: Setting LC_MESSAGES failed, using "C" 
4: Setting LC_MONETARY failed, using "C" 
ERROR: dependency 'RGtk2' is not available for package 'rattle'
* removing '/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rattle'
Warning in install.packages :
  installation of package 'rattle' had non-zero exit status
```

何やら`RGtk2`というパッケージを入れようとしてコケてるみたいです。
これだけ別に入れてみます。

```R
> install.package('RGtk2')
Package which is only available in source form, and may need compilation of C/C++/Fortran:
  'RGtk2'
Do you want to attempt to install these from sources?
y/n: y

During startup - Warning messages:
1: Setting LC_CTYPE failed, using "C" 
2: Setting LC_TIME failed, using "C" 
3: Setting LC_MESSAGES failed, using "C" 
4: Setting LC_MONETARY failed, using "C" 
* installing *source* package 'RGtk2' ...
** package 'RGtk2' successfully unpacked and MD5 sums checked
checking for pkg-config... /usr/local/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for INTROSPECTION... no
checking for GTK... no
configure: error: GTK version 2.8.0 required
ERROR: configuration failed for package 'RGtk2'
* removing '/Library/Frameworks/R.framework/Versions/3.4/Resources/library/RGtk2'
Warning in install.packages :
  installation of package 'RGtk2' had non-zero exit status
```

やはりコケますね。

## 対処法

エラーログの中に以下のように書いてあるので、どうやら先にGTKを入れなければならないようです。

```R
checking for GTK... no
configure: error: GTK version 2.8.0 required
ERROR: configuration failed for package 'RGtk2
```

GTKとは、`GTK+`と呼ばれるGUIツールキットのことを指します。もともとGIMPを作るために開発されたものらしく、GNOMEプロジェクトに含まれるOSSです。

## 実際に行ったこと

私の環境は、以下のとおりです。

- MacOS X 12.2 Sierra
- R 3.4.0

```bash
$ brew install gtk+
```

これでGTK+のインストールは完了です。

ちなみに、Ubuntu等の場合は以下のコマンドでいけます。

```
$ sudo apt-get install libgtk2.0-dev
```

早速Rに戻ってrattleをインストールしてみましょう。

## 参考サイト

http://stackoverflow.com/questions/20098862/how-to-install-gtk-on-osx-for-use-with-g-gcc-compiler
jupyterが起動しなくなった場合の対処

##目標
  - [ ] jupyterをが起動しなくなったので対処する

##現象
ある日いきなり、jupyterを起動しようとするとエラーで落ちてしまうようになった
前日サーバをshutdownしたのがまずかったのか？

```shell-session
OSError: [Errno 13] Permission denied: '/run/user/1001'
```

色々調べたら($XDG_RUNTIME_DIR)が設定されていると立ち上がらないという事例を見つけたので試しに

```shell-session:
$ls /run/user/
/run/user/1001
/run/user/1002
$echo $XDG_RUNTIME_DIR
1001
$unset XDG_RUNTIME_DIR
$echo $XDG_RUNTIME_DIR
$
```
これで問題なく動いた
XDG_RUNTIME_DIRを後で詳しく調べてみる

参考URL:[Crash when running jupyter notebook with a user with id != 1000 ](https://github.com/jupyter/notebook/issues/1318)
日本語OCRメモ自分版


### 環境
AWS EC2
ubuntu16.04

### 手順
http://qiita.com/bohemian916/items/67f22ee7aeac103dd205
こちらのページのまんまですが、URL等など打ったまんまを書きました。

依存関係をインストール

```
$ sudo apt update
$ sudo apt-get install autoconf automake libtool
$ sudo apt-get install libpng12-dev
$ sudo apt-get install libjpeg62-dev
$ sudo apt-get install libtiff5-dev #若干変更
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install autoconf-archive
$ sudo apt-get install libicu-dev      # (if you plan to make the training tools)
$ sudo apt-get install libpango1.0-dev # (if you plan to make the training tools)
$ sudo apt-get install libcairo2-dev   # (if you plan to make the training tools)
```

画像ライブラリleptpnicaをインストール
※aptで入れるのもはバージョンが古いため使えない

```
$ wget http://www.leptonica.org/source/leptonica-1.74.1.tar.gz
$ gzip -dc leptonica-1.74.1.tar.gz |tar xvf -
$ cd leptonica-1.74.1/
$ ./configure
$ make
$ sudo make install
```

tesseractをインストール

```
$ cd
$ git clone https://github.com/tesseract-ocr/tesseract.git
$ cd tesseract
$ ./autogen.sh
$ ./configure
$ LDFLAGS="-L/usr/local/lib" CFLAGS="-I/usr/local/include" make
$ sudo make install
$ sudo ldconfig

#言語データ
$ wget https://github.com/tesseract-ocr/tessdata/raw/master/jpn.traineddata
$ sudo mv jpn.traineddata /usr/local/share/tessdata/
$ export TESSDATA_PREFIX="/usr/local/share/tessdata/tessdata/"
```

最後に実行

```
$ tesseract test.png out -l jpn
```
GroovyでClosureのdoCallをMetaClassで足す

**<font color="red">注意:
この内容は実用される事を意図した内容ではありません。
実際に使う場合はご自身の責任にてご利用下さい。</font>**

# はじめに
GroovyのClosureのcall()は、doCall()をMetaClass経由で呼び出しています。[参考](https://github.com/apache/groovy/blob/2989bfcae0c9505b715c1313425ce86763b0a0ce/src/main/groovy/lang/Closure.java#L415)
doCall()に、Closure個別の処理が書かれています。( `{->(doCallはここに相当)}` )

このdoCallをMetaClassで足してしまおう、と言う話です。

# 製作
## Step 1: おまじない
ClosureのMetaClassを扱うなら基本中の基本(?)

```groovy
ExpandoMetaClass.enableGlobally()
```

## Step 2: doCall無しClosureを作る
1. コンストラクタを適切に扱う
2. 匿名クラスとする(中身はもちろん空)

これだけ守れば問題なくClosureを作れます

```groovy
def closure=new Closure(this,this){}
```

## Step 3: doCallを足す

```groovy
closure.metaClass.doCall={->println 'Called'}
```

## Step 4: 呼ぶ

```groovy
closure()// Called
```

# 最後に
よいこのみんなは`{->}`を使おうね
geometry > 角度範囲を回転した結果の範囲について > {AOV:0度 / AOV:360度}の判別

## 定義
### 角度

- [min_R, max_R) : min_R以上, max_R未満
  - 0<=min_R<360
  - 0<=max_R<=360
- [rotation] : 回転角
  - 0<=rotation<360
- [min_A, max_A) : min_A以上、max_A未満
  - 0<=min_A<360
  - 0<=max_A<=360
 
min_R, max_Rとrotationを入力し、min_Aとmax_Aを取得する。

### AOV

[Angle of View](https://en.wikipedia.org/wiki/Angle_of_view)

角度範囲がどれほど開いているか、を定義する。
0から360度の範囲を持つ。

## 検討事項

### AOV < 360の場合

AOV < 360の場合は、問題がない。
例として、

- [min_R, max_R) = [0, 350)
- [rotation] = 60
- [min_A, max_A) = [60, 50)

min_Aとmax_AのAOVは350ということが分かる。

### AOV = 0もしくはAOV = 360の場合

AOV = 0の場合

- [min_R, max_R) = [0, 0)
- [rotation] = 60
- [min_A, max_A) = [60, 60)

AOV = 360の場合

- [min_R, max_R) = [0, 360)
- [rotation] = 60
- [min_A, max_A) = [60, 60)

max_Aの定義域について360超過を許可しないと、AOV=0とAOV=360の判別ができなくなる。

### 対応策1

[min_R, max_R) = [0, 360)の時だけ、[rotation]の値に関わらず
[min_A, max_A) = [0, 360)にする、というのは一つの手である。
mecabに人名辞書追加　

python3で追加して見た

ネットで参考サイトがたくさんあるんが、一応python3でやって見た。

##人名辞書
> [フリーのIME・ATOKユーザ辞書リンク集](http://www.mwsoft.jp/programming/munou/ime_dictionary_link.html#person)

ここから手にいた。
txt格式で　`あい	"亜衣":姓`のようにあって、そこでmecab向けのcsv格式変換する。
`表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音` のようにしたい。


直接excelで区切り文字を指定して、csvファイルを作るは一つ方法。

![スクリーンショット 2017-05-11 16.02.58.png](https://qiita-image-store.s3.amazonaws.com/0/175846/880ebb82-36c8-dc7f-967d-14ede5853e18.png "スクリーンショット 2017-05-11 16.02.58.png")

そして上のように編集する。
情報基礎の知識だね

pythonでやれば

```py3

\#!/usr/bin/env python
\# -*- coding: utf-8 -*-

import sys
import re

def Dic():
    dic_file = open('sei.txt','r')
    lines = dic_file.readlines()
    dic_file.close()
    
    for line in lines: 
        sword = line.split("\t")
        kana = sword[0].strip()
        word = sword[1].strip()
        cost = str(max(-36000,8000-len(word)**500)) #コスト要検討
        print(word+",,,"+cost+",名詞,固有名詞,人名,姓,*,*,"+word+","+kana+","+kana+"追加")
    
        
if __name__ == '__main__':
    Dic()
```

###左右の文脈ID

左右の文脈IDがmecabのバージョンによって違うらしい、そして
> 空にしておくと mecab-dict-index が自動的に ID を付与します
と書いているので、空白した

###コスト
> http://www.mwsoft.jp/programming/munou/mecab_hatena.html
から　`cost = -400 * word.split(//u).size ** 1.5` 

という計算方法あるが、負の数がばかりでちゃんと出るのかが心配、公式サイト見れば、
>コストの自動推定機能

がある。
また　
> -a オプションを用いて, コスト値や文脈IDが空のCSVファイルに対し, 自動的にそれらを埋めて新しいCSVを作成することができます

両方ともやってみる






## 追加先

> [単語の追加方法](http://taku910.github.io/mecab/dic.html )

システム辞書に追加
React.jsとRailsの定数管理


## JSの定数
* `constants.js`のようなファイルを用意して`window.config.xx`のように生やす
* スマホのブレイクポイントのようなJS固有の定数系はここに書くようにする(あまり無いと思うけど)

### JSで環境毎に異なる値を使いたい
* Rails Wayに沿っているアプリの場合、JS側で環境毎に違った値を持ちたいということはほぼ無いはず
* APIサーバーとフロントが完全に分離しているようなアプリの場合はJS側で処理をゴリゴリ書いていくので、
  環境によってAPIのアクセス先のURLを変えたい等のニーズが出てくるはず。その場合は定数用のファイルを分ける仕組みが必要になる(ここは今回あまり調べてない)

## Railsの定数
* gemの`config`を使う
  * constants.rbは定数が増えてくると環境毎の条件分岐が面倒
  * 環境毎にymlファイルが分割され、Setttngs.xx.yyでアクセスできて階層が把握しやすい
* 環境変数を使う
  * 外部サービスのIDやパスワード等、コード管理したくない値は環境変数に設定しておく

## JSとRailsの連携
* Rails主体のアプリの場合はシステム定数はRailsで管理し、JSはRailsの定数が必要な処理をする場合はAjaxリクエストして任せるようにする
* Railsのparamsの情報等、JS側で共通で持っていると便利で、かつユーザーに知られても問題ない値はgonを使って`window.gon`に生やしておくと便利