OmniAICreator/Qiita-1.07M huggingface dataset:
spring boot で Herokuへデプロイ

#spring boot の設定
###resources配下にsystem.propertiesを作成
javaのバージョンを指定
`java.runtime.version=1.8`

###アプリケーションのプロジェクトフォルダ配下にProcfileを作成
起動時の設定を指定
`web: java -Dserver.port=$PORT -jar target/*.jar --server.port=$PORT --spring.profiles.active=heroku
`

#Herokuにデプロイするまでの手順

###デプロイしたいアプリのフォルダに移動
`cd アプリのディレクトリ`

###gitにコミットまで行う
`git init （初期化）
 git add *　（追加）
 git commit -m 'first commit'　（コミット）
`
###herokuにログイン
`heroku login`
メールアドレスとパスワードを聞かれるので入力。

###herokuにアプリを作成
`heroku create アプリ名 (アプリ名を入力しなけかったら自動で作成される)`

###herokuにpush
`git push heoku master`

###アプリの起動
`heroku open`

###Herokuに作成したアプリの一覧を確認
`heroku list`

###ログを確認
`heroku logs --tail --app アプリ名`


#うまくいかなかったこと
Herokuにデプロイした際に
`[ERROR] Failed to execute goal on project hbase-binding: Could not resolve dependencies`みたいなエラーが出てアプリがうまく起動できなかった。

##原因
ググってみると.m2/repository配下に古いmavenプロジェクトが残っている時に起こるらしい。
というか、gitにcommitする際に.mvn配下のソースもcommitしていたのがそもそもの原因。
念のために.gitignoreに.mvnを追加し、
gitリポジトリを新しく作り直して、再度上記の手順でやるとうまくいった。
mysqlのbinary-logとrelay-logの保存期間の設定


binary logの保存期間
Master

```:mysql
SET GLOBAL expire_logs_days = 14;
```

Slave

binlogはoff
relaylogの自動削除もoff

```:mysql
SET sql_log_bin=OFF; 
SET GLOBAL relay_log_purge = OFF;
```

MySQLでrelay_logの保存期間を設定する項目はない。
cronでこれを設定
mhaにあるコマンド

```:cron
10 2,6,8,10,12,14,16,18,20,22,0 * * *   /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password=`pass` --host=localhost --disable_relay_log_purge >> /var/log/mha/purge_relay_logs.log 2>&1
```
条件によって異なる文字列を表示させるプログラム（自己記録用

指定した文字列をコンソールアプリケーションケーションウィンドウに打ち込んで表示されるもの、キーが押されたときに表示されるものの2つ。このコードではEnterキーだが他のキーでも問題はない。

```csharp
using System;

namespace A
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "hello";//条件となる文字列を指定する
            s = Console.ReadLine();
            if (s == "hello")
                Console.WriteLine("Oh!hello!");//文字列がウィンドウに入力されたら表記する
            string t = "nice to meet you";//string sに同じ
　　　　　　　t= Console.ReadLine();
            if (t == "nice to meet you")
                Console.WriteLine("nice to meet you too");
            ConsoleKeyInfo Start = Console.ReadKey();//キー情報の取得
            switch (Start.Key)//エンターキーが押されたときの動作
            {
                case ConsoleKey.Enter:
                    Console.WriteLine("Communication was not found");
                    break;
            }
        }
    }
}
```
C++からQMLへユーザ定義型を渡す

## はじめに
[Qt Advent Calendar 2016](http://qiita.com/advent-calendar/2016/qt) 17日の記事です。

初めてのAdvent Calendarで何を書こう？と思っていたのですが、
ちょうどQMLのお仕事でやった C++からQMLへデータを渡すコードを紹介します。


ソースコードは、[ここ](https://gist.github.com/yuu/8e2a3811e93249e3e31f94520008c306)に上げました。

## 結論
マクロ `Q_GADGET` と `Q_DECLARE_METATYPE` を使うことで、QMLからユーザ定義型を参照することができます。

## やりたいこと
viewに関するデータをC++で受け取り、QMLで値を参照すること。
サンプルでは受け取り処理は省いています。

## どうやって？
基本的に [QMetaObject::invokeMethod](https://gist.github.com/yuu/8e2a3811e93249e3e31f94520008c306#file-main-cpp-L15) を使って、QMLに定義した関数をCallすることができます。
この時に、マクロ `Q_ARG` と `QVariant型` を使うことで渡すことができます。

が... QVariant型は内包できる型が決まっています。 [URL](http://doc.qt.io/qt-5/qvariant.html#canConvert)

> Note that this only works for QObject subclasses which use the Q_OBJECT macro.

継承とマクロで解決できるそうですが、
マクロ [`Q_DECLARE_METATYPE`](http://doc.qt.io/qt-5/qmetatype.html#Q_DECLARE_METATYPE)と[`Q_GADGET`](http://doc.qt.io/qt-5/qobject.html#Q_GADGET)を使うことで継承せず、スッキリと解決できます！

## まとめ
マクロ `Q_GADGET` と `Q_DECLARE_METATYPE` を使うことで、QMLからユーザ定義型を参照することができます。

時間ギリギリ + 端折った記事になってすみません *<|:-)

明日は、Ohgochi さんです。Mobile楽しみですね。

## 参照
http://doc.qt.io/qt-5/qtqml-cppintegration-data.html
MATLABで圧縮センシングを紹介



※この記事は[UEQareer Advent Calender 2016](http://qiita.com/advent-calendar/2016/ueqareer) 17日目の記事です。
#はじめに
私は普段MATLABを利用して信号処理の研究をしています．今回は圧縮センシングと呼ばれる信号処理技術をMATLABを利用して紹介したいと思います．
#圧縮センシング
![UEQ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/151891/3a3e097c-91ed-c1db-0e82-e8d306a61a14.jpeg)

圧縮行列が既知の時，受信信号からスパース信号を復元するのが圧縮センシングです．一般的にm<nのときこの問題を解くことは困難ですが，”スパース（多くの要素が0）”という条件がある場合に圧縮センシングが利用可能になります．
無線通信の分野では圧縮センシングの技術を無線信号をサンプリングする装置に適用することで，従来よりも少ないサンプリング周波数で信号を取得し，サンプリング装置での消費電力の削減や，より広い電波空間の取得，無線信号データのトラフィックの軽減などが期待されています．
![UEQ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/151891/e535e757-f745-9723-f561-540dc0fa071e.jpeg)
無線通信の分野では，信号をフーリエ変換し周波数帯で見ることでスパースな性質が得られるため圧縮センシングが利用されます．


#受信信号の生成
1024次元の20-スパース信号(非ゼロ要素が20個)を圧縮行列により128次元に圧縮して受信信号を生成してみます．

```matlab:
k = 20; %kスパース
n = 1024;%圧縮前の次元数
m = 128;%圧縮後の次元数

%スパース信号の生成(今回はシンプルにランダムに20個の大きさ１を持つスパース信号を生成)
x = zeros(n,1);
index = randperm(n,k);
for i = 1:k
    x(index(i)) = 1; 
end

%圧縮行列　A（ランダム行列とフーリエ逆変換行列からなる）
%Θ（ランダム行列）M*N
%圧縮センシングの圧縮にはランダム行列が用いられ、ランダム行列の研究もおこなわれている.今回はシンプルにガウスランダム行列を使用します.
O = rand(m,n);
%φ(基底行列)n*n　実際に受信する信号は時間系列データなので逆フーリエ変化で時間系列データに変換します．

F = dftmtx(n);
reF = conj(dftmtx(n))/n;

A = O * reF;

%受信信号 y
y = A * x;

plot(x);% 元のスパース信号の表示
```
![UEQ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/151891/3b48e877-ea26-4638-cafc-0b6cb567568a.jpeg)

#復元アルゴリズム
圧縮センシングにおける復元（受信信号からスパース信号を推定する）アルゴリズムには貪欲法であるorthogonal matching pursuit（OMP）や基底追跡法である Basis pursuit (BP)がある．OMPはBPと比較して計算量が少ないですが復元制度が落ちます．今回はOMPを実装したmatlabのコードを紹介します．
アルゴリズムの詳細は[”圧縮センシング－疎情報の再構成とそのアルゴリズムー”](http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1803-03.pdf)を見ていただくと日本語でわかりやすいかと思います．

```matlab:omp.m
function [x res ] = omp(y,A,k)
 [m,N] = size(A);
 x = zeros(N,1); %復元するスパース信号の初期値はすべて0
 res = y; %初期値は受信信号
 column = []; 
 for i=1:k
  [c n] = max(abs(A'*res)); %内積をとり受信信号と関連の強い列を選択
  column(end+1) = n; % end+1 で配列の後ろに要素を追加できる　先ほど選択した列番号を追加
  x(column) = pinv(A(:,column))*y; %pinv():疑似逆行列　スパース行列の計算
  res = y - A(:,column)*x(column); 
 end
end
```
上記のOMPアルゴリズムでは貪欲法により圧縮行列からk個の列を選択してスパース行列を復元します．そのため復元したスパース行列の非ゼロ要素数はk個になります．
上記の復元アルゴリズムを使用する際にはあらかじめ復元する信号のスパース度（非ゼロな要素数）を知っておく必要があります．

#復元の実行結果
生成した20-スパースの受信信号を上記のOMPアルゴリズムを用いて復元させます．

```matlab:
[xp res]= omp(y,A,k); %xpに復元信号が返ってくる
plot(abs(xp));% 復元信号の表示
```

![UEQ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/151891/7f4d54b7-3d34-669d-78cf-f0adda8e7031.jpeg)

ほぼ正確に復元できていることが確認できました．

#最後に
圧縮センシングのシンプルな例をMATLABのコードで非常にざっくりと紹介しました．圧縮センシングはmatlabのリファレンスが少なく実装に苦労しています．
圧縮センシングを実装するにあたり参考になるサイトや資料をご存知の方がいらっしゃいましたら教えて頂けると幸いです．
【Coldfusion】Kuromoji で形態素解析を行う

ColdFusionから、Javaの形態素解析器のKuromojiを使ってみる。
手順は下記を参考。
[Java製形態素解析器「Kuromoji」を試してみる]
(http://www.mwsoft.jp/programming/lucene/kuromoji.html)

下記よりダウンロードしたファイルを展開して任意の場所に保存する。
[Download Packages](https://github.com/atilika/kuromoji/downloads)
今回は"C:¥Kuromoji¥kuromoji-0.7.7.jar"に保存した前提とする。

jarファイルの読み込みはColdFusion10以降であれば、Application.cfc内に記載でOK
[Java ライブラリの統合](http://help.adobe.com/ja_JP/ColdFusion/10.0/Developing/WSe61e35da8d318518-106e125d1353e804331-7fff.html)

```cfm:Application.cfc

<cfscript>
this.javaSettings = {LoadPaths = ["C:/Kuromoji/kuromoji-0.7.7.jar"], reloadOnChange= true};
</cfscript>

```


以下のように呼び出す。

```cfm:test.cfm

  <cfscript>
  Tokenizer = createObject("java", "org.atilika.kuromoji.Tokenizer");

  tokenizer = Tokenizer.builder().build();
  tokens = tokenizer.tokenize("すもももももももものうち");
  
  for (token in tokens) { 
   WriteOutput("---------------------------------<br>");
   WriteOutput("getSurfaceForm:" & token.getSurfaceForm() & "<br>");
   WriteOutput("getPartOfSpeech:" & token.getPartOfSpeech() & "<br>");
   WriteOutput("getBaseForm:" & token.getBaseForm() & "<br>");
   WriteOutput("getReading:" & token.getReading() & "<br>");
   WriteOutput("isKnown:" & token.isKnown() & "<br>");
   WriteOutput("isUser:" & token.isUser() & "<br>");
   WriteOutput("getAllFeatures:" & token.getAllFeatures() & "<br>");
   WriteOutput("getPosition:" & token.getPosition() & "<br>");
   WriteOutput("getAllFeaturesArray:" & arrayToList(token.getAllFeaturesArray()) & "<br>");
  }
  </cfscript>
  


```

その出力結果

```

---------------------------------
getSurfaceForm:すもも
getPartOfSpeech:名詞,一般,*,*
getBaseForm:すもも
getReading:スモモ
isKnown:YES
isUser:NO
getAllFeatures:名詞,一般,*,*,*,*,すもも,スモモ,スモモ
getPosition:0
getAllFeaturesArray:名詞,一般,*,*,*,*,すもも,スモモ,スモモ
---------------------------------
getSurfaceForm:も
getPartOfSpeech:助詞,係助詞,*,*
getBaseForm:も
getReading:モ
isKnown:YES
isUser:NO
getAllFeatures:助詞,係助詞,*,*,*,*,も,モ,モ
getPosition:3
getAllFeaturesArray:助詞,係助詞,*,*,*,*,も,モ,モ
---------------------------------
getSurfaceForm:もも
getPartOfSpeech:名詞,一般,*,*
getBaseForm:もも
getReading:モモ
isKnown:YES
isUser:NO
getAllFeatures:名詞,一般,*,*,*,*,もも,モモ,モモ
getPosition:4
getAllFeaturesArray:名詞,一般,*,*,*,*,もも,モモ,モモ
---------------------------------
getSurfaceForm:も
getPartOfSpeech:助詞,係助詞,*,*
getBaseForm:も
getReading:モ
isKnown:YES
isUser:NO
getAllFeatures:助詞,係助詞,*,*,*,*,も,モ,モ
getPosition:6
getAllFeaturesArray:助詞,係助詞,*,*,*,*,も,モ,モ
---------------------------------
getSurfaceForm:もも
getPartOfSpeech:名詞,一般,*,*
getBaseForm:もも
getReading:モモ
isKnown:YES
isUser:NO
getAllFeatures:名詞,一般,*,*,*,*,もも,モモ,モモ
getPosition:7
getAllFeaturesArray:名詞,一般,*,*,*,*,もも,モモ,モモ
---------------------------------
getSurfaceForm:の
getPartOfSpeech:助詞,連体化,*,*
getBaseForm:の
getReading:ノ
isKnown:YES
isUser:NO
getAllFeatures:助詞,連体化,*,*,*,*,の,ノ,ノ
getPosition:9
getAllFeaturesArray:助詞,連体化,*,*,*,*,の,ノ,ノ
---------------------------------
getSurfaceForm:うち
getPartOfSpeech:名詞,非自立,副詞可能,*
getBaseForm:うち
getReading:ウチ
isKnown:YES
isUser:NO
getAllFeatures:名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
getPosition:10
getAllFeaturesArray:名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

```
std.regexについて少し書いた

## std.regex

今のD言語の正規表現エンジンはDmitryOlshansky 氏が書いたThompson NFAベースのものです。今年D Blogに [掲載された記事](https://dlang.org/blog/2016/11/07/big-performance-improvement-for-std-regex/) では高速化の実装詳細、bit parallel法による固定文字列探索手法であるShiftOrアルゴリズムについて氏が説明しています。

今回はもう少し大枠で見ていきましょう。

D言語の正規表現エンジンは名前付きキャプチャやRangeインターフェースを扱うことができるようになっています。構文については [こちら](https://dlang.org/phobos/std_regex.html#Syntax and general information) を参考にしてください。基本的には[ECMA-262](https://www.ecma-international.org/publications/standards/Ecma-262.htm) の知識があれば問題なく使えるように設計されています。

```d
import std.regex;
import std.stdio;

void namedCapture()
{
    auto re = regex(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`);
    // writeln("バイトコード表現",  re.ir);

    auto nc = re.namedCaptures;
    writeln("名前付きキャプチャ", nc);

    auto m = matchFirst("2014-06-02", re);
    writeln("year: ", m["year"]);
    writeln("month: ", m["month"]);
    writeln("day: ", m["day"]);
}

void rangeCapture()
{
    auto re = regex(`(\d{4})-(\d{2})-(\d{2})`);
    static TO_SEARCH = "On 2010-03-14, foo happened. On 2014-10-14, bar happened.";

    foreach (caps; matchAll(TO_SEARCH, re))
    {
        writefln("year: %s, month: %s, day: %s", caps[1], caps[2], caps[3]);
    }
}

void main()
{
    namedCapture();
    rangeCapture();
}
```

`regex` 関数で正規表現オブジェクトの作成を行っています。正規表現オブジェクトの実体はバイトコードで、uint型の変数にIR表現とデータを格納したバイト列が並んでいます。

`matchAll` で正規表現マッチングを行います。入力文字列を先頭からみていって正規表現オブジェクトとつきあわせて内部で状態遷移を行っていっています。Thompson NFAはバックトラックがないので入力文字列は一度しかみることはありません。

## 特徴

- `ctRegex!` コンパイル時正規表現オブジェクト生成

D言語の正規表現最大の特徴はなんといってもコンパイル時正規表現オブジェクト生成でしょう。ループの中で同一の正規表現オブジェクトを使うときでもそのまま使うことができます。

- 雑なコード

```d
void innerLoopFunction()
{
    auto r = ctRegex!`...`;  // コンパイル時に正規表現がコンパイルされる!!
}
...
    foreach (i; 0 .. 10e7)
        innerLoopFunction();
...
```

matchに比べると軽い処理ですが、それでも正規表現オブジェクト生成はそれなりに重い処理となります。ループ内で毎回生成するとあほみたいにパフォーマンスが悪くなります。グローバル変数にするとか関数の引数に渡すとか回避策はありますが、コンパイル時生成のほうが素直に、そして実行時コスト0で書くことができます。

## さいごに

特徴って１個しか書いてない。。

あと私は正規表現の専門家でもなんでもないので間違った知識でものを語っているかもしれません。その際はコメントもしくは編集リクエストなどで指摘よろしくお願いします。
sakura editorのgrep

## grep
さくらエディタでは<kbd>Ctrl+g</kbd>かツールバー上部にあるフォルダに目玉がついているアイコンでgrepが使える。

 - 入力
   - 条件:正規表現使用可能
   - ファイル:正規表現使用不可(*のみ可能)
   - フォルダ:検索を行うフォルダを指定
   - 他:サブフォルダからも検索するにチェックを入れると便利。


## ファイル条件

- 正規表現は使えないがワイルドカード(*)は使用可能
- 拡張子をカンマ区切りで併記することにより検索条件を複数指定可能。
   - 何も指定しないと全検索`*.*` 
   

- ファイル名先頭に ! を付けることでそのファイル内は検索されない

使用例：DAから始まる.vbファイルと.sqlファイルを検索

```
DA*.vb,*.sql
```

使用例2:.txtファイルは検索しない

```
!*.txt,*.*
```

# フォルダ条件

環境変数の記述などと同様にセミコロン(;)で
親子関係にない複数フォルダを指定できます

>C:\foldaA;C:\foldaB

例：
C:\foldaA
C:\foldaB
C:\system

C直下全てを調べたいなら、Cを指定して

 - [ ] サブフォルダからも検索する

にチェックを入れればいいのですが、
systemは抜きたい場合は上記記法でfoldaA,foldaBのみの検索を行えます。

## 使用例(vb.net)

以降現在自分が関わっているvbの案件での使用例なのであまり参考にはならないかも。  
不要な拡張子をピックアップして検索条件を考えるというユースケースを参考にしてみてください。

### そもそもバイナリで人が読むものではない。

 - .dll 
 - .pdb
 - .exe
 - .resources

```
!*.dll,!*.pdb,!*.exe,!*.resources
```

### ソースでの使用状況などを調査する場合、抜いたほうがよい

 - .log
 - .txt
 - .vbproj
 - .xml
 - *.log*(XXXlog.1,△△△.log.2など数字連番のログファイルすべて含む)

```
!*.txt,!*.vbproj,*.xml,!*.pdb,!*.log*
```

### 上記すべて除外の条件
```
!*.dll,!*.pdb,!*.exe,!*.resources,!*.txt,!*.vbproj,!*.xml,!*.pdb,!*.log*
```

## sakura editorの grepで出来ないこと
間に改行をはさむ2語を含む文章の検索

 - sakura editor では通常、改行をはさんで正規表現での検索・置換はできない模様
CSSで再現するドカベンOPの文字エフェクト

## [たったーたららったったーたららったーたーーーーーーー](http://www.nicovideo.jp/watch/sm30220788)
[CSSドカベンスクリプト](http://codepen.io/trkbt10/pen/YpdOXe)作ってみた

### キノウ１　ループサイセイカノウ
![ループ再生可能.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/8b080d20-ddce-6435-4621-2d66d45ac9e7.gif)

```html
<h1 class='dokaben loop komaochi'>ダウンロード</h1>
```


### キノウ２　ソクドヘンコウカノウ
![ソクドヘンコウ可能.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/15132ddc-eae5-acf0-2fe9-784dbf24b282.gif)

```html
<h1 class='dokaben loop speed-up komaochi'>ダウンロード</h1>
```

### キノウ３　コマオトシ
![komaotoshi.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/ffbb4655-be6c-7aea-10a1-d092437c55d7.gif)

```html
<h1 class='dokaben loop komaochi'>コマオトシあり</h1>
<h1 class='dokaben loop'>コマオトシナシ</h1>
```
### キノウ４　カイテンジクヘンコウ
![baseline.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/3ba70062-b2ac-4e77-444c-093d97b15c6a.gif)

```html

<h1 class='dokaben loop komaochi'>ドカベン</h1>
<h1 class='dokaben loop　komaochi vartical-align-baseline'>ドカベン</h1>
```

## 使い方
まず、[sm29720917](http://www.nicovideo.jp/watch/sm29720917)様にてドカベンフォントを
![down.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/68034c62-a7ea-fa2e-3d64-654b83a54bde.gif)
してください

　
　
そうしたらファイルを解凍し、中にある
「dokaben_ver2_1.ttf」を実行して
![install.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/e2c98286-f85e-dd21-af23-7b378a13d90f.gif)
してください。

　
次に、[dokaben.css](http://codepen.io/trkbt10/pen/YpdOXe.css)をダウンロードし、h1タグを書いたHTMLと同じ階層に置き、linkタグでダウンロードしたCSSファイルを読み込んでください。
これで準備は完了です。HTMLファイルをブラウザで開いてみましょう。

![IE.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/f3462370-b5aa-afd7-cad8-c6ee8aea2163.gif)


## Q&A
Q. なぜウェブフォントにしないんですか？
A. フォントの再配布になるかと思って遠慮しました。

Q. ドカベンフォントじゃないとダメ？
A. 画像や動画でも同じようにできます。



![oshimai.gif](https://qiita-image-store.s3.amazonaws.com/0/74461/19468232-c638-6af1-1d4a-fa3e09274ec9.gif)
[Python][Windows] Pythonでスクリーンキャプチャを行う

Windowsでのスクリーンキャプチャの自動化方法について調べました。(今回はPythonを利用）

# PILを利用する
## 事前準備

```bash:PIL(Pillow)のインストール
$ pip install Pillow
```

pyscreenshotというものもありましたが、Windows向けでは結局内部でPILを使ってるので実装は同じです。

```bash:pyscreenshotのインストール
$ pip install pyscreenshot
```

## 実装例
```py:PILを利用したスクリーンキャプチャ例
from PIL import ImageGrab

# full screen
ImageGrab.grab().save("PIL_capture.png")

# 指定した領域内をクリッピング
ImageGrab.grab(bbox=(100, 100, 200, 200)).save("PIL_capture_clip.png")
```

上記の実装で、フルスクリーンでのスクリーンキャプチャとクリッピング、pigへの出力ができます。
PILが多機能なため、画像の加工や、別形式(jpegなど）での保存も対応してますがそれは別途調べてもらえばと思います。

ただし、この実装では問題が２点ほどありました。

+ ２画面での拡張スクリーンでも、片方のスクリーンしかキャプチャされない
+ 特定のアプリケーションのみを指定してのキャプチャができない

## 参考
[The ImageGrab Module](http://effbot.org/imagingbook/imagegrab.htm)
[pyscreenshot 0.4.2 : Python Package Index](https://pypi.python.org/pypi/pyscreenshot)

# Seleniumを利用する
PILのアプリケーションの指定ができない問題ですが、Webブラウザを指定したい場合はSeleniumを使う方法もあるようです。
(自分のユースケースには合わなかったため未検証）

[SeleniumでScreenShot ( Python編 ) - Qiita](http://qiita.com/setsulla/items/918ea1872c1947bf108f)
[pythonからSeleniumでFirefoxを操作し画面キャプチャを保存する - Qiita](http://qiita.com/tukiyo3/items/e104f9dd147ca5d9c2f5)
[How to take partial screenshot with Selenium WebDriver in python? - Stack Overflow](http://stackoverflow.com/questions/15018372/how-to-take-partial-screenshot-with-selenium-webdriver-in-python)

# pywinautoを利用する
任意のアプリケーションのスクリーンキャプチャを行う方法としては、 `pywinauto` を利用するという手もあります。

## 事前準備

```bash:pywinautoのインストール
$ pip install pywinauto
```

## 使用例

```py:pywinautoの使用例
# coding: UTF-8

from pywinauto import application
from time import sleep

app = application.Application().start("notepad.exe")

sleep(1)
app[u'無題.*メモ帳'].CaptureAsImage().save('window.png')
```

これで任意のアプリケーション(例ではメモ帳)のスクリーンショットが取れました。
注意点としては、CaptureAsImageは直接描画バッファをとってきているわけではなく、Windowが存在している領域をクリッピングしているだけのようで、上のようなサンプルだとsleepを入れないと立ち上がる前にキャプチャが走ってしまいました。

## 参考
[Pywinauto - pywinauto](http://pywinauto.github.io/)
[What is pywinauto — pywinauto 0.6.0 documentation](https://pywinauto.readthedocs.io/en/latest/)
[pywinautoでGUIのメニューをクリック: サラリーマンとパソコンと僕](http://fanblogs.jp/mountain4101/archive/50/0)
FROM JOIN直後のテーブル名にスキーマ名を一括で付け足す正規表現

## 概要
諸事情により、本番環境で発行するSQLの各テーブル名にスキーマを付け足す必要が発生した。
巨大なSELECT文などで全てのテーブル名にスキーマ(例:Production.)を付ける作業が大変なので、 　
テーブル名(from、joinの後に続くテーブル名にスキーマ名を付け足す正規表現を書いた。
 
## 正規表現

- FROM、JOINの後に改行が入っている場合、適時置換して除いてください。
- サブクエリの結果の先頭にスキーマ名を付けないように2回目のマッチの先頭はローマ字のみとしています。  

```:置換前
(FROM|JOIN)\s+([a-zA-Z]+\S*)
```


```:置換後
$1 Production.$2
```

補足1:置換後のProduction.を好きなスキーマ名に書き換えて使用してください。  
補足2:未拡張さくらエディタの置換で使用することを前提としているのでfromとテーブル名の間に改行を含む形式には対応していません。 

## 使用例

```SQL:置換前
SELECT
    *
FROM m_product p
    JOIN m_product_info pi
    ON  p.id = pi.product_id
WHERE
    p.id IN(
        SELECT
            product_id
        FROM t_sales
        WHERE
            sales_date = '20161225'
    )
```

↓

```SQL:置換後
SELECT
    *
FROM Production.m_product p
    JOIN Production.m_product_info pi
    ON  p.id = pi.product_id
WHERE
    p.id IN(
        SELECT
            product_id
        FROM Production.t_sales
        WHERE
            sales_date = '20161225'
    )
```
モナドのまほう　第11話『タイトル画面があるとゲームっぽい』

[第一話](http://qiita.com/hiruberuto/items/5321d8cebce7b87851f6) / [前回](http://qiita.com/hiruberuto/items/b1731c7b802cfc835b42)

ゲームを作る日記です。『[ステラのまほう](http://magicofstella.com/)』を見てたら、なんだかやる気が湧いてきました。




# タイトル画面とかオプション画面とかを作りました

![タイトル画面](https://qiita-image-store.s3.amazonaws.com/0/64695/ea7d82ad-27d5-c99c-a386-9d44ce449d58.png)

タイトル画面をつけました。これがあると、ぐっとゲームっぽい雰囲気になる気がします。今回のタイトル画面のポイントは、背景にちゃんとゲーム内の世界の３Dグラフィックスを使っているところです。タイトル画面が一枚絵だとなんだかタイトル画面とプレイ画面の雰囲気に落差が出来てしまいますが、最初から３Dグラフィックを使うことでユーザをゲームの世界に自然にグッと引きずりこみやすくなると思います。[Project Zomboid](http://store.steampowered.com/app/108600/?l=japanese)というゲームがあるんですが、[タイトル画面はリアル系の一枚絵](http://steam.degica.com/news2/project-zomboid)なのに、ゲーム本編はドット絵調の表現なのでどこか肩の力が抜ける感じがあって、そういうのを避けたかったわけです。


タイトルロゴもタイトルすらもまだ仮置きですが、画面が寂しくならないように何かアルファベットを書いとけ的な安直な発想でいろいろ描いています。雰囲気大切です。雰囲気が出てくると、ゲームに対するイメージも湧いてきます。先にイメージを固めてからグラフィック作業を一気に仕上げるより、とにかく仮置きして雰囲気を確かめながらゆっくりイメージを作っていくのが好きです。イメージが湧いたから作るというより、作ったからイメージが湧いてきた、というのは結構あります。

オプション設定もできるようにしました。

![options.png](https://qiita-image-store.s3.amazonaws.com/0/64695/0cad15ee-0462-0b0f-410e-c96c7352f273.png)

グラフィック面では影の表現がかなり重いんですが、これでオプションで簡単に影をオフにできるようになりました。ユーザの環境はバラバラなので、調節できるようにしておくのは必要だと思います。ちなみにここでの設定はLocal Storageに保存されるので、次回起動したときにも自動的に適用されます。





# purescript-halogen

UIにはpurescrip-halogenというライブラリを使っているのですが、今回はゲームということでちょっと用途が特殊で、使い方にひと工夫必要でした。最初うまく行かないかと思って、自分でゲーム用のUIライブラリを作りかけたりしていて作業はかなり回り道をしてました。purescript-halogenはたぶんそろそろ大きいバージョンアップがあります。APIが整理されてかなり扱いやすくなるので、いずれぜひ紹介したいライブラリです。



# Babylonjsのバージョンアップ

Babylonjsが先日2.5にバージョンアップしたんですが、嫌なエラーが出ました。JavaScript側では何もエラーが起きなくて、WebGLの側からエラーが飛んでくるやつです。

```
[.Offscreen-For-WebGL-091CF920]GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 2
```

うへえ。幸い、エラーの引き金になっているのがキャラクターの描画の部分であることはすぐにわかりました。地形の描画に比べてキャラクターのロードは一瞬遅れるのですが、エラーが起き始めているのはキャラクターが表示されてからだったからです。でも不思議なことにキャラクターの表示には問題ないようです。いろいろ試してみましたが、バッグや髪の毛といった小物のメッシュを削除して本体部だけをエクスポートするとエラーは起きません。これである程度エラーの引き金になっている部分は絞れました。結局のところ、輪郭を出すために使っている裏返したメッシュをすべて削除してエクスポートするとエラーが収まりました。うーんこの

それに、2.5になったら明らかにパフォーマンスが低下しました。FPSにして3分の2くらいになってしまいます。仕方ないのでbabylonjsのバージョンアップはひとまずあきらめました。なんかもうほんとにbabylonjsのバグとの戦いです。でもWebGL関係のライブラリはみんな死ぬほど複雑で環境依存も大きくテストもしにくいので、どのライブラリもバグはとても多いです。babylonjsが特別バグが多いわけではないでしょうし、他のライブラリに移行したところでそのライブラリでもバグに苦しめられるのは目に見えています。なんとか力づくでねじ伏せるしかありません。とにかくファイル交換の部分だけでも安定してほしいです。




# browserifyしたくない

purescript-halogenを使うときに`require`を解決しなくてはならないのでbrowserifyを使っているのですが、ファイルをガンガン結合するとデバッガで追うときに重くなるのであまり好きではないです。デバッガがどんどん重くなるのもありますし、Chromeにはデバッガでソースファイルを指定してステップオーバーできる[Blackboxing](http://qiita.com/k12u/items/3d667c1cf5287625024c)という機能がありますが、browerifyをかますとBlackboxingができなくなるというのもあります。

依存関係をコンパイル時に解決したいというのはわかりますが、このアプリケーションでは複雑な依存関係のあるものはPureScriptの部分だけで、あとはfirebase, babylonjs, virtual-domというそれぞれ独立したいくつかのライブラリがあるだけです。今回の場合はbrowerifyに解決してほしい複雑な依存関係はありません。またグローバルな空間に名前をばらまきたくないというのはわかるんですが、`FIREBASE`, `VirtualDOM`, `BABYLON`という名前がグローバルで衝突するとは思えません。ソースファイルを結合するよりは、HTMLの`script`タグを自動で構成してくれたらとか思うんですが。




# 次のお話

そういえば、firebaseの話はしばらく出てこない気がしたので記事のタイトルを少し変えました。タイトル長過ぎましたし。また変えるかもしれません。

* [第12話　RPGアツマールに私も集まーる](http://qiita.com/hiruberuto/items/cdf2a7bb66fdcbf1a78c)
F# 文字列を使ってみる

#始めに
F#の文字列で色々遊んでみました
Stringモジュール関数(mapとかcollect)はいまいち使い勝手が悪いので特に取り上げていません
その代わり、文字列をリスト化して色々プログラミングしてみました

#コード
```fsharp
module File2
//F#でに文字列を使おう！
let a = "<html>" //リテラルの宣言
printfn "%s " a //<html>が表示される

//文字列の分割
printfn "%s " a.[3..5] 
//ml>が表示される
//文字列のindexの3番目から5文字目まで取る
//javaのsubstring(int,int)の挙動と同じ
//printfn "%s " a.[3..6] これは例外が発生する

//文字列のリスト化
//Stringからcharの配列に 変換する
let charlist = a.ToCharArray(0,a.Length)
//charの配列をリストに 変換する
let b = Array.toList charlist 
printfn "%A" b //['<'; 'h'; 't'; 'm'; 'l'; '>']が表示される
printfn "%O" b //[<; h; t; ... ]が表示される


//パターンマッチを使ってリストの中身を標準出力へ出力する
let rec printArrayItems strs  =
    match strs with
    |x::xs->printfn "%A" x;printArrayItems xs
    |[]  -> ()


//パターンマッチを使って文字列がhtmlタグかどうか判定する
//ここは単純に<>の文字列が<→>の順番で入っていればhtmlタグとする
let rec isHtmlTag strs isLtChar isGtChar =
    match strs with
    |x::xs->match x with
            |'<' -> isHtmlTag xs  true    isGtChar
            |'>' -> match isLtChar with
                    |true  ->isHtmlTag xs isLtChar true
                    |false ->isHtmlTag xs isLtChar false
            |_   -> isHtmlTag xs isLtChar isGtChar
    |[]  -> isLtChar && isGtChar

let a1 = ">html<" 
let charlist1 = a1.ToCharArray(0,a1.Length)
let b1 = Array.toList charlist1

let a2 = "html" 
let charlist2 = a2.ToCharArray(0,a2.Length)
let b2 = Array.toList charlist1


in
printArrayItems b
//'<'
//'h'
//'t'
//'m'
//'l'
//'>'
//が表示される

let r =isHtmlTag b false false
printfn "%b" r  //trueが表示される

let r1 =isHtmlTag b1 false false
printfn "%b" r1 //falseが表示される

let r2 =isHtmlTag b2 false false
printfn "%b" r2 //falseが表示される
```

#疑問点
- 文字列をリストにするスマートな方法はないものだろうか？
ATOKのキーバインドをEmacs風にする

Google日本語入力を使っていた時はキーバインドをファイルにexportできたのでそれを使い回していた。<del>けどATOKだとなぜか設定がexportできないので手で移すしかない</del>。exportはキー設定の中から『テキストファイルに出力』でできました。importの方法がまだ分かっていないですが、できるかもしれません。

[ATOKのキーバインドをEmacs風にする - ekurodaの日記](http://d.hatena.ne.jp/e-kuroda/20081121/1227251088)

を参考にいじるキーバインドをEmacsっぽくするメモ。ATOKのデフォルトのキーバインドからの変更点です。

| 機能        | キーバインド           | 追加する機能  |
| ------------- |:-------------:| -----|
| 変換/次候補 | Ctrl-N | 入力中・文節区切り直し中 |
| 変換/前候補 | Ctrl-P | 文節区切り直し中 |
| カタカナ（後）変換 | Ctrl-Q | 追加 |
| 半角英字（後）変換 | Ctrl-L | 入力中 |
| 部分確定 | - | Ctrl-Nを削除 |
| 変換取消 | Ctrl-G | Ctrl-Hから変更 |
| 1文字削除 | Ctrl-D | Ctrl-Gから変更 |
| 挿入ポイント前移動 | Ctrl-B | Ctrl-Kから変更 |
| 挿入ポイント後移動 | Ctrl-F | Ctrl-Lから変更 |
| 挿入ポイント先頭移動 | Ctrl-A | 追加 |
| 挿入ポイント末尾移動 | Ctrl-E | 追加 |
| 文節区切り収縮 | Ctrl-B | Ctrl-Kから変更 |
| 文節区切り伸張 | Ctrl-F | Ctrl-Lから変更 |
| 文節前移動 | Ctrl-P | 追加 |
| 文節後移動 | Ctrl-N | 追加 |
| 文節先頭移動 | Ctrl-A | 追加 |
| 文節最終移動 | Ctrl-E | 追加 |

一部Emacsと関係ないものも混じっています。それとあくまでも自分の好みです。

メモを書いたのはATOKのバージョンアップしたらなぜか設定が吹っ飛んでしまって困ったので次困らないようにメモ。<del>そもそも設定をexportさせて欲しい</del>。
masakinihirota 「真っ先に拾った」

よく言われています、
何か作りたいものはあるのか？

それがモチベーションの鍵になると。

自分が作りたいもの？
「真っ先に拾った」
情報発表サイトを作りたい。
とサイト名だけ決めました。

4半期ごとにTVアニメ新作が発表されるので
これから何を見ると、切ると
これが毎期、自分の中でちょこっと盛り上がります。
まぁ事前情報を集めまわって
これを見ますという情報を発表するサイトです。
キューレーションサイト等で、
GoogleのSEOが問題になっています。
それをぶっ倒すぞという意気込みで作ります。
（Googleではサイトの質を評価出来ないんですよね、	
人工知能が人間を超えてないので当たり前ですけど。）
キーワードとその組み合わせとリンクの数で評価とかXXX（自主規制）です。）
自分が集めた質の良い情報を発表するサイトでもあります。

これならテキスト表示だけで
直ぐにできそうですね。
ウェブサイトですからそれなりの機能を後で付けるとしても
まずは最初に「一本の糸」を通します。

アプリを作り（Rails？）
サーバーを選び（Docker？）
アップロードする。
と3行でこれからやることを書くとやたら簡単そうですが
さて、どうなることやら。

ウェブサイトを作るに当たり、目標だけでも
はっきり決めておくことにします。

このあとはシリーズで勉強していったことなど
書ければなと思っています。

p.s.
ちなみにこのアイデアはハンドルネームを作った頃まで遡ります。
随分のんびりですが、ゆっくりやっていきます。

購入図書
プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化
Androidでネイティブコードを利用する


[前回はOpenGLESの設定まで解説](http://qiita.com/s_s_k/items/a4b09f68ef3ca994d827)しました、今回は続きを進めようとおもいましたが、AndroidではC/C++コードを利用できることが分かったので、ちょっと回り道を。

OpenGLのコードはC/C++が圧倒的に多いので、「その資産が利用できる！」と期待してみたものの利用方法が想像以上に壁でした。まだ全て把握できていませんが、私が理解した範囲をまとめておきます。

最新のAndroid Studioでの情報があまりないので、かなり手探りですすめていますので、間違っている箇所などあればご指摘いただけると助かります。

## 準備

### Android Studio2.2を準備します。
Android Studio2.2では新規プロジェクト作成で"C/C++を利用しますか？"というチェックボックスが表示されるので、まずはこれをONにします。

![c.png](https://qiita-image-store.s3.amazonaws.com/0/15535/00dae484-643c-94bc-8e60-bad896f76121.png "c.png")

### ディレクトリ構成を確認
新規プロジェクトの構成を確認します。左側のプロジェクト構造を"Android"から"Project"に変更し全てのファイルが確認できるようにします。

以下のファイルがあればOKです。

+ app/CMakeList.txt
+ app/src/main/cpp/native-lib.cpp


## buildしてみる
一度buildしてみると、画面にはTextViewが表示されると思います。
MainActivity.javaからcpp/native-lib.cのコードが呼び出されているのがわかります。

```java
public class MainActivity extends AppCompatActivity {

    // native-lib.cはコンパイルでlibraryになるようで、それをここで読み込んでいます。
    // import みたいなものでしょうか。
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * native-lib.cで実装した関数を定義しているようです。
     */
    public native String stringFromJNI();
}
```


## native-lib.cppを確認

デフォルトで下記のコードが記述されていると思います。
このコードをみると、
パッケージ、プロジェクト名、関数名をアンダースコアでつないでいるようです。多分これが書式なのかな。

という記述で定義されているようです。戻り値も"jstring"という形ですね。
これはAndroid NDKだったか、JNI(Java native interface)の型かと思います。

```c
#include <jni.h>
#include <string>

extern "C" 
jstring
Java_com_test_opengl_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
```

##　テスト関数を定義してみる。

まずは、extern "C"が全体にかかるように下記のように修正します。

```c
extern "C" {

// ここに関数をいれます。

}
```


適当にテスト関数を記述します。引数はお決まりっぽいので同じものをいれます。

```c
extern "C" {

	// stringFromJNIの記述は省略

    void
    Java_quad_jp_opengl_MainActivity_sayHello(JNIEnv *env, jobject){
        std::cout << "Hello World" << std::endl;
    }
}
```

もちろんMainActivityの方にも関数を定義します。

```java
public native void sayHello();
```

ビルドすると、特にエラーなくおわりました、coutの出力はどこで確認できるかはわかりませんでした...orz

とりあえず、C側で処理を実行する方法は分かったので、これで前回のコードを修正してみます。後ほどここに追記ます。

## 参考情報
[Android NDK(公式ページ詳しい設定方法があり)](https://developer.android.com/ndk/index.html)

一部翻訳されているページがありますが、翻訳がイマイチで少し混乱します。
[プロジェクトへの C / C++ コードの追加](https://developer.android.com/studio/projects/add-native-code.html#new-project)
炎の型工房 火の型 14日目 : ラケットを追加しよう!!：Pongを作ろう --5--

[<ruby>炎<rt>ほのお</rt></ruby>の<ruby>型<rt>かた</rt></ruby><ruby>工房 <rt>こうぼう</rt></ruby>ScratchとDartでゲームプログラム<ruby>入門<rt>にゅうもん</rt></ruby> Advent Calendar 2016](http://qiita.com/advent-calendar/2016/firefirestyle-studio)
の<ruby>記事<rt>きじ</rt></ruby>です

<img width="500" alt="magic.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/52b53993-844b-e1a1-ceb7-da21794d9b0a.png">


<ruby>宙<rt>そら</rt></ruby>をつかんで

<ruby>理解<rt>りかい</rt></ruby>、<ruby>分解<rt>ぶんかい</rt></ruby>、<ruby>再構築<rt>さいこうちく</rt></ruby>

そして

<ruby>理解<rt>りかい</rt></ruby>、<ruby>分解<rt>ぶんかい</rt></ruby>、<ruby>再構築<rt>さいこうちく</rt></ruby>



# ラケットを、<ruby>追加<rt>ついか</rt></ruby>しよう

## コードを<ruby>追加<rt>ついか</rt></ruby>する
<img width="500" alt="v001.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/223fc9ae-b5ca-ca75-f2d3-b2f721a251ed.png">



## <ruby>確認<rt>かくにん</rt></ruby>する
https://scratch.mit.edu/projects/136838905/

<img width="334" alt="v002.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/5e42eafb-b18a-ace6-c155-173c452e8b55.png">


1. <ruby>緑<rt>みどり</rt></ruby>の<ruby>旗<rt>はた</rt></ruby>をクリックすると、ラケットが<ruby>表示<rt>ひょょうじ</rt></ruby>されること


# ラケットに<ruby>動<rt>うご</rt></ruby>きを<ruby>付<rt>つ</rt></ruby>ける

## コードを<ruby>追加<rt>ついか</rt></ruby>する
<img width="500" alt="v003.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/33ff47e9-5ddf-f3b4-f262-787782dbc9d9.png">


## <ruby>確認<rt>かくにん</rt></ruby>する
https://scratch.mit.edu/projects/136839373/
<img width="334" alt="v004.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/95ce8812-a53e-7b30-ace4-cda06b81681c.png">


1. <ruby>緑<rt>みどり</rt></ruby>の<ruby>旗<rt>はた</rt></ruby>をクリックすると、ラケットが<ruby>表示<rt>ひょうじ</rt></ruby>されること
2. <ruby>上<rt>うえ</rt></ruby>キーを<ruby>押<rt>お</rt></ruby>すと、<ruby>右側<rt>みぎがわ</rt></ruby>のラケットが<ruby>上<rt>うえ</rt></ruby>に<ruby>移動<rt>いどう</rt></ruby>すること
3. 下キーを<ruby>押<rt>お</rt></ruby>すと、<ruby>右側<rt>みぎがわ</rt></ruby>のラケットが、<ruby>下<rt>した</rt></ruby>に<ruby>移動<rt>いどう</rt></ruby>すること
4. aキーを<ruby>押<rt>お</rt></ruby>すと、<ruby>左側<rt>ひだりがわ</rt></ruby>のラケットが<ruby>上<rt>うえ</rt></ruby>に<ruby>移動<rt>いどう</rt></ruby>すること
5. zキーを<ruby>押<rt>お</rt></ruby>すと、<ruby>左側<rt>ひだりがわ</rt></ruby>のラケットが<ruby>下<rt>した</rt></ruby>に<ruby>移動<rt>いどう</rt></ruby>すること




## Thanks
<div>
ここまで、<ruby>読<rt>よ</rt></ruby>んでくれてありがとう!!
</div>

<div>
では、<ruby>次回<rt>じかい</rt><ruby>、また
<ruby>会<rt>あ</rt></ruby>えることを、
<ruby>楽<rt>たの</rt></ruby>しみにしています。
</div>

そして、<ruby>次回<rt>じかい</rt></ruby>は、ラケットにボールを<ruby>跳<rt></rt></ruby>ね<ruby>返<rt>かえ</rt></ruby>す<ruby>機能<rt>きのう</rt></ruby>を<ruby>追加<rt>ついか</rt></ruby>します

<div>
ではでは
</div>
upscaledb-mysqlを試す

この記事は[MySQL Casual Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mysql-casual)の17日目としてお送りします。

この記事は[upscaleDB](https://upscaledb.com/)というものを試したという内容になります。
Hackernewsでとりあげられていて気になって確認した次第。
[Hacker News Comments]: (https://news.ycombinator.com/item?id=12591947)

CentOS7にインストールして動作を確認しました。
細かい箇所でハマりどころがあります。
まだ書きかけですが、おおよそのインストール方法は[こちら](https://shiroikagami.blogspot.jp/2016/11/upscaledb-mysql-001-on-centos-release-7.html)を御参考ください。
mysql5.7が必要となります。

upscaledbの特徴はこちらのまとめが読みやすい。
[upscaledb vs. MySQL comparison | vsChart.com](http://vschart.com/compare/hamsterdb/vs/mysql)

圧縮の有無などはテーブル毎に設定が持てる様です。
https://github.com/cruppstahl/upscaledb-mysql/wiki/Configuration

phpから使う場合、以下ドライバーを使うと良いでしょう。
https://github.com/cruppstahl/upscaledb-php
他、C/C++, .NET, Python, Erlangからも利用できる様です。
https://upscaledb.com/samples.html
（このあたりくわしく書ければよかったのですが、あまり取り組めておりません。)

気になる価格は、
- for 1 developer
- includes updates for one year
- unlimited projects
- no royalties
で、€525.00
の様です。
https://upscaledb.com/buy.html
製品としてリリースしない様であれば無料で使い続ける事ができる様です。
くわしくは[こちら](https://upscaledb.com/faq.html)

まだ、upscaledbのバージョンが2.2.1、upscaledb-mysql 0.0.1とうたっています。
https://github.com/cruppstahl/upscaledb-mysql/wiki/Installation
https://upscaledb.com/blog/0014-beta-release-of-mysql-0.0.1.html
あたたかく見守ってまいりましょう。

メーリングリストはgoogleg groupで展開されています。
https://upscaledb.com/support.html

機能面の確認ができなく記事の内容が薄くなり、かつあまりmysqlに関わっていなく申し訳ありません。
明日12/17は、[atsuizo](http://qiita.com/atsuizo)さんのMySQLのChar型のデータサイズについて小ネタについてです。
お楽しみに。
ずっとオブジェクト指向の言語しか触ってこなかった人がSwiftに出会って痺れたこと

### ずっとオブジェクト指向
ずっとオブジェクト指向型言語ばっかやってきたんですが、Swiftに出会ってその方法もあったか、みたいな発見がいくつかあったので紹介しようと思います。

### Swift
Swiftはオブジェクト指向型言語です。でも、関数型言語やプロトコル型言語とも呼ばれます。一見すると全くコンテキストの異なるセグメントに見えますが、各々の言語の弱点を柔軟に解決すべく、ざまざまなパラダイムを取り込んだ言語、それがSwiftです。

#### そもそもポインタがない
C++やObjective-Cをやってきた人にとっては慣れないかもしれません。
一方、Javaをやってきた人には馴染みある特徴です。
しかし、参照か値で渡されるのを決めるのはどのようにして決められるのでしょうか。

class/structでは、それぞれが参照なのか値なのか区別されます。
継承ができるのもclassだけです。


#### Enumがめっちゃ拡張できる
**これかなり痺れました。**
自由にメソッドはやせるし、mutatingなメソッド(自分自身を変える破壊的なメソッド)も定義できるのです。

```swift
 enum Color: String {
   
   case red,
   case green,
   case blue
   mutating changeNextColor() {
     switch self {
       case .red:
         self = .green
       case .green:
         self = .blue         
       case .blue:
         self = .red
     }
   }
 }
```
> なにが嬉しいのか

オブジェクト指向の問題点は、適切なデータに付随する責任関係を[継承か集約]でしか表現できないことでした。適切なデータと適切な処理を適切な"場所"に。
データ x 処理における、この適材適所を実現可能にしているのがこの柔軟なデータ設計の考え方だとも言えます。

#### 関数型言語
Swiftが関数型言語とも呼ばれる所以は関数を第一級オブジェクト、言い換えれば、ほかの変数と同じように「オブジェクト」として扱えるところにあります。
関数型の考え方は、あるインプットに関してアウトプットが必ず同じでなければなかったり、状態を持たないなどのいくつかの制約があります。
便利なのは先述した「関数をオブジェクト」として扱えることにあります。

例えばこんな定義の仕方ができます

```swift

typealias Region = (Point)->Bool

````
地域とは、ある座標を与えられたときにそのうちにあるかどうかを判断するためのものです。（少し抽象的な説明ですね）
要するに、**データとデータの関係性自体**をオブジェクト化できる簡潔さが魅力だと思います。
これを基調とした考え方を学ぶには[functional swift](http://amzn.to/2gNKKI1)という本がおすすめです。

#### プロトコル指向
プロトコルという考え方自体はC++やObjective-C/Javaにもあります。それぞれの呼び方は異なりますが（Javaだとインターフェイスと呼ばれたり)、オブジェクト指向とは異なり、メソッドのオーバーライドが必要なかったりコードをまとめやすいなどの特徴があります。抽象化の面倒なものに引きずられるというリスクを取り除くことができます。

```swift

protcol Animal {
    var name : String { get }
    var residence : String { get }
}

struct Dog: Animal {
   var name:String {
      return "Dog"
   }
   
   var residence:String {
     return "Home"
   }
}

```

この考え方は2015年のWWDCの講演である[Protocol Oriented Language Swift](https://developer.apple.com/videos/play/wwdc2015/408/)がおすすめです。


#### マルチパラダイムであること
このように、Swiftという言語は、あらゆるパラダイムの弱点を、複数のパラダイムによって回避でき、かつシンプルに書くことのできる柔軟さと強さを兼ね備えた言語であることが理解できます。

しかし裏返しとして、これはほかの言語をやってきた人がみて凄みを理解できるものの、Swiftからやり始めた人がほかの言語に行くときに苦しくなるであろう点でもありそうです。
新サービス「Amazon Polly」を使って、僕の今年の心情を読み上げてみた


[Myuon Corp. Advent Calendar 2016](http://qiita.com/advent-calendar/2016/myuon) 16日目です。

---

**2016年の一番の驚きは SMAP の解散だよね。悲しいねー。** それはさておき本題。

*[Amazon Polly](https://aws.amazon.com/jp/polly/)*
![amazon_polly_top-shadow.png](https://qiita-image-store.s3.amazonaws.com/0/41522/f619cabd-5148-9592-b31b-94ca99bd44e4.png "amazon_polly_top-shadow.png")


[Amazon Polly](https://aws.amazon.com/jp/polly/) は、[AWS re:Invent 2016](https://reinvent.awsevents.com) で発表された新サービスで、24言語47音声に対応した **テキストを自然な音声で読み上げる** ことができます。
また、生成された音声はコンソールからダウンロードしたり、APIを使用してストリーミング配信することができます。
今回は、その Amazon Polly を実際に使用してテキストの読み上げてみたいと思います。

# 僕の今年の心情 「2016年の一番の驚きは SMAP の解散だよね。悲しいねー」を喋らせてみた

## [その1] まずはコンソールで喋らせてみた

### 1. Amazon Polly の [今すぐ始める] をクリック
![amazon_polly_console-shadow.png](https://qiita-image-store.s3.amazonaws.com/0/41522/d76a3277-1dc5-5d1a-6780-c6967bf8ac78.png "amazon_polly_console-shadow.png")

### 2. 再生したい文字を入力して [▶︎音声を聞く] をクリック
![amazon_polly_say1-shadow.png](https://qiita-image-store.s3.amazonaws.com/0/41522/554c9598-a736-b86b-b274-ea96def80ede.png "amazon_polly_say1-shadow.png")

おお、再生された！

[▶︎1. 再生してみる](https://www.youtube.com/watch?v=iBmhVFWR4Bw)


## [その2] SSML を使って喋らせてみた

**[音声合成マークアップ言語（SSML）バージョン1.1](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/accessibility/REC-speech-synthesis11-20100907.html)**
![SSML-shadow.png](https://qiita-image-store.s3.amazonaws.com/0/41522/d070f5b1-7095-e689-c178-333fca8dbf21.png "SSML-shadow.png")

Amazon Polly では、W3C 勧告で定義された SSML 1.1 がサポートされています。
（[一部サポートされていない要素](http://docs.aws.amazon.com/ja_jp/polly/latest/dg/limits.html)があります。  *[「voice」](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/accessibility/REC-speech-synthesis11-20100907.html#S3.2.1)*  要素 使ってみたかった。残念）


### 読み上げ速度上げて 喋らせてみる
[prosody](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/accessibility/REC-speech-synthesis11-20100907.html#S3.2.4) 要素を使うことで喋るスピードを変更できます。

```xml:SSML
<speak>
<prosody rate="x-fast">2016年の一番の驚きは SMAP の解散だよね。悲しいねー</prosody>
</speak>
```
[▶︎2. 再生してみる](https://www.youtube.com/watch?v=Iy14UZVRgIY)


### 「SMAPの解散」を強調させて喋らせてみる
[emphasis](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/accessibility/REC-speech-synthesis11-20100907.html#S3.2.2) 要素を使用する。

```xml:SSML
<speak>
2016年の一番の驚きは<emphasis level="strong">SMAP の解散</emphasis>だよね。悲しいねー
</speak>
```
[▶︎3. 再生してみる](https://www.youtube.com/watch?v=8q5A3fk7_3A)

## [その3] CLI から喋らせてみた
```
$ aws --version
aws-cli/1.11.30 Python/2.7.10 Darwin/16.1.0 botocore/1.4.87

$ aws polly synthesize-speech --text "2016年の一番の驚きは SMAP の解散だよね。悲しいねー。from command line" --voice-id Mizuki --output-format mp3 speech.mp3
```
[▶︎4. 再生してみる](https://www.youtube.com/watch?v=VPBrp_BY3P8)


# まとめ
これを使えば、

1. RSS で新しい記事が配信される
2. Lambda でイベントをキャッチ
3. Polly にテキストを投げる
4. mp3 で iPhone にダウンロード
5. 通勤中に iPhone で聴く

みたいなことができそうですね。

喋りとしては、かなり滑らかだなという印象。Siriとどっこいか、それ以上か。昔の「ワレワレ ハ ウチュウジン ダ」みたいな感じは全くないw
いろんな分野で活用できそうですね。今後の進化に期待。
Unity/C#~DiveCameraを使用しVR空間内で動く(コードメモ)

今回は、VR空間内を自由に歩き回ったり、飛び回ったりできるアプリを実装。

◆事前準備
1.https://www.durovis.com/en/sdk.html から「Dive Unity Plugin Package」をダウンロード。
2.MainCameraの代わりにステージ上にダウンロードしたパッケージの中からDiveCameraを配置

デバイス上で、Gyroセンサーを感知、またDiveCamera自身を動かすために以下のScriptを用意します。

```GyroScriptWalk.cs
using UnityEngine;
using System.Collections;

public class GyroScriptWalk : MonoBehaviour {

	public GameObject diveCamera;
        // 移動速度を数パターン設定（後進は-で定義)
	public float moveSpeed  = 10.0f;
	public float moveSpeed2 = 30.0f;
	public float moveSpeed3 = -10.0f;
	public float moveAngleX = 10.0f;
	public float moveAngleXX = 20.0f;
	public float moveAngleXXX = 350.0f;
	public float moveAngleXXXX = 340.0f;


	float yOffset;

	Quaternion currentGyro;

	void Start(){
		Input.gyro.enabled = true;
		yOffset = gameObject.transform.position.y;
	}

	void Update () {
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//　Gyroセンサーを感知
		currentGyro = Input.gyro.attitude;
		this.transform.localRotation = 
			Quaternion.Euler (90, 90, 0) * (new Quaternion (-currentGyro.x, -currentGyro.y, currentGyro.z, currentGyro.w)); 
		
		// 1.カメラの傾きを取得
		float angle = diveCamera.transform.eulerAngles.x;	

		// 2.ある角度以内であれば前進させる
		if (moveAngleX < angle && angle < moveAngleXX) {
			moveForward ();
		} else if (moveAngleXX < angle && angle < 45.0f) {
			runForward ();
		} else if (moveAngleXXX > angle && angle > moveAngleXXXX) {
			moveBackward ();
	    }
  }
	
　　　　　　　　　　　　　　　　// 2.速度に合わせて移動(moveForward,runForward,moveBackward)を定義
	public void moveForward() {
		Vector3 direction = new Vector3 (diveCamera.transform.forward.x, 0, diveCamera.transform.forward.z).normalized * moveSpeed * Time.deltaTime;
		Quaternion rotation = Quaternion.Euler (new Vector3 (0, -diveCamera.transform.rotation.eulerAngles.y, 0));
		diveCamera.transform.Translate (rotation * direction);
		diveCamera.transform.position = new Vector3 (diveCamera.transform.position.x, yOffset, diveCamera.transform.position.z);
	}
	
　　　　　　　　　　　　　　　　public void runForward() {
		Vector3 direction = new Vector3 (diveCamera.transform.forward.x, 0, diveCamera.transform.forward.z).normalized * moveSpeed2 * Time.deltaTime;
		Quaternion rotation = Quaternion.Euler (new Vector3 (0, -diveCamera.transform.rotation.eulerAngles.y, 0));
		diveCamera.transform.Translate (rotation * direction);
		diveCamera.transform.position = new Vector3 (diveCamera.transform.position.x, yOffset, diveCamera.transform.position.z);
	}

	public void moveBackward() {
		Vector3 direction = new Vector3 (diveCamera.transform.forward.x, 0, diveCamera.transform.forward.z).normalized * moveSpeed3 * Time.deltaTime;
		Quaternion rotation = Quaternion.Euler (new Vector3 (0, -diveCamera.transform.rotation.eulerAngles.y, 0));
		diveCamera.transform.Translate (rotation * direction);
		diveCamera.transform.position = new Vector3 (diveCamera.transform.position.x, yOffset, diveCamera.transform.position.z);
	}
}
```
セキュリティキーをGoogleの2段階認証に設定したらハマった


皆さん、セキュリティキー使ってますか？ 使ってますよね。

自分はGoogleアカウントやGitHubアカウントの2段階認証として、セキュリティキーを導入しました。2週間ほど運用していますが、実に快適です。なにせ毎回スマホで認証アプリを立ち上げたり、電話を待ったりする必要がないのですから。

しかし、導入時に幾つか問題に直面したので、これから導入を検討する人向けにいくつかハマりポイントを共有しようと思います。正直ショボイハマリポイントなので、m9(^д^)pgrってください

尚、導入は↓の投稿を参照頂けると良いと思います。
http://qiita.com/yugui/items/382275bb04c3fad09ff7

# MacBookとインターネットアカウント連携時に使えない
皆さんは、GoogleアカウントをMacBookなどで連携していますか？　連携していますよね。
２段階認証を有効化すると、MacBook連携しているアカウントにて再認証が必要になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/59166/54bbaecd-a3db-cad1-69b7-a4497eff36ba.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/59166/f8465406-cd6b-d2d4-9c1a-a686b41e6370.png)

さて、この場面において認証コードを入力しないといけませんが、ここで **セキュリティキーによる認証方式は選択できません**! 気をつけましょう。
私は電話番号による2段階認証を有効化 -> セキュリティキーを登録 -> 電話番号による認証設定を削除 -> MacBook上の再連携、という手順を踏んでしまったので、ここでハマりました。

# モバイルでセキュリティキーは使えない
当たり前ですね。アタリマエ過ぎて書くのも恥ずかしいレベルですが、スマホにセキュリティキーさせませんよね。なので私の手順を踏むと、やはりハマります。

# 何が言いたいかというと
* 2段階認証を有効化 -> セキュリティキーを登録 -> 各種デバイス & アカウント再認証をしましょう。デフォルトの認証設定を消すのはその後にしましょう。
* セキュリティキー以外の2段階目の認証方式(アプリ認証など)をちゃんと準備しておきましょう。


# 余談: 2段階認証 vs 2要素認証
サービスによって「2段階認証」と「2要素認証」と呼称の違いがありますね。「認証の回数」か「認証方式の数」の違いだと思いますが、各著名なサービスでの呼称は以下の通りです。

* 2Factor Authentication: 
    * Slack, Amazon, Twitter
* 2 Step Authentication: 
    * Google, Micro Soft
* 定義してない: 
    * Facebook
モンキーテストのコツ

WithOne AdventCalendar 17日目の記事です。

本日はモンキーテストをテーマに記載します。

#モンキーテストとは##
 思いついたことを手当たり次第に実施し、意図せぬ問題がないかを確認する工程のことです。
テスト項目書のある「単体テスト」や「結合テスト」とは異なり、特に決められた操作はありません。自由に操作し、不具合を見つけるといった感じです。

#私がよくやる操作##
モンキーテストを行うときは、そのシステムを壊すことを考えながら行っています。
そんな中、具体的に私がよくやる操作を記載しようかと思います。
　　ボタンの同時押し　⇒　画面が二重に開く可能性がある
　　ボタン連打　　　　⇒　強制終了する可能性がある
　　アプリアイコンの連打　⇒　アプリケーションが起動する前に強制終了する可能性がある
　　複数のブラウザで対照的な操作の実施　　⇒　辻褄が合わないことがある
　　環境依存文字の入力　　⇒　データベースエラー等が起こる場合がある
　　F12ボタンを押下し、タグの中の数値を変える　　⇒　エラーが発生する可能性がある
　　
正直なところ、このテストは自由に操作して不具合を検出するといった感じなので、ここで紹介したものが全てではありません。実施するときの参考になれば幸いです。また、この操作をすると不具合が出るよ!と云った操作があれば参考にさせてください。
ただ、モンキーテストは再現性が低いため、操作内容には注視して行うことを心がけるべきだと思います。

#終わりに##
より良い製品を提供するにはやはり、多くの不具合を見つけ、それを消滅させることが一番だと思います。「単体テスト」や「結合テスト」はもちろん、その他のテストにも全力で取り組むべきだと感じております。モンキーテストを実施しない所も多いと耳にしていますが、実際にこのテストを行った私からすると、このテストこそやるべきではないかなと思いました。
今後、テストを行う場合は、今まで以上に不具合を出します。
Easy EDA 

EasyEDAは提供しているフリーの回路、基板エディタ。無料ですが。電子回路的なことがしたいって使えるようにしてみました。Webの画面上で電子回路を設計/試運転できる, あのEasyEDAが提供 https://easyeda.com/
基板を安く発注するための作業手順です。
PCB:  https://easyeda.com/rajbex/Car_battery_tester-0h5F1ZWiS

![0.jpg](https://qiita-image-store.s3.amazonaws.com/0/137498/3083bcde-bbb0-bcf0-6f98-9859acf503c1.jpeg)

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/137498/40144873-5c82-1f81-6ccc-3f043e44d45a.jpeg)

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/137498/e366641c-8b93-3145-18bd-59f1b271eb0a.jpeg)
New Relic APM: デプロイ履歴管理でパフォーマンス改善の検証を簡単に把握しよう

アドベントカレンダー17日目。New Relic APM のデプロイ履歴管理機能を紹介します。この機能は、`PRO` プランのみ利用できます。

この機能は、結構、Qiita とか他でのでもいろんな人が書いている(最近だと[これ](http://kakakakakku.hatenablog.com/entry/2016/11/23/105312)とか)けど、アドベントカレンダーの流れ的に一応紹介しておきます。

## デプロイ履歴管理機能 とは

デプロイ履歴管理機能とは、New Relic UI 上でどの時点でデプロイが行われたのか管理する機能です。どの時点でデプロイが行われたのか？という情報については、専用の API がありますので、それを適切なタイミングで実行するように各自で設定が必要です。（設定方法は後ほど説明します）

専用の API にデプロイ記録のリクエストを送ると、New Relic 側でそれを管理し、以下のようにな画面でそれを見ることができます。

## デプロイ履歴の見方

New Relic APM の左メニュー Events の `Deployments` を選択すると、以下のようにデプロイ履歴が見れます。

![qiita_deployemnts.png](https://qiita-image-store.s3.amazonaws.com/0/46003/6b7c491b-6900-beeb-e729-f4679079263e.png)

上記のリストから特定の履歴をクリックすると、以下のように、デプロイ時点を真中として、前後のパフォーマンスが簡単に分かります。以下の図では、デプロイ後であきらかに、データベースのパフォーマンスが改善されているのが分かります。

![qiita_deployemnts_detail.png](https://qiita-image-store.s3.amazonaws.com/0/46003/1326888a-8fb4-4f0b-4b79-686ee56311e3.png)

### Overeview ページでも見れる

また、これらは専用のデプロイ画面にアクセスしないと見えませんが、デプロイタイミングは、Overview などページでもみることができます。これがこの機能の便利な点です。デプロイがあったことを知らないメンバーも、Overview ページだけ見てても、デプロイがあったことを知ることができるからです。

Overview ページで以下のようにデプロイタイミングを知ることができます。

![qiita_deployment_overview.png](https://qiita-image-store.s3.amazonaws.com/0/46003/898a6d54-c2b6-99ef-749e-6be9b526f078.png)

その他にも、同じような時系列チャートのあるページ(Transactions, Databases, External services)でも同様にみることができます。以下は、Transactions ページの例です。右のチャートに２本青い垂直線(デプロイタイミング）があるのがわかります。

![qiita_deployment_transactions.png](https://qiita-image-store.s3.amazonaws.com/0/46003/50e5e1da-df65-4384-3f03-dbabea868497.png)

チャート上で、この青い垂直線にカーソルを併せて、クリックすると、そのデプロイのデプロイ履歴画面（上記で説明）に遷移します。

## デプロイ管理機能のメリット

では、この機能を使うメリットはなんでしょうか？それは、主に以下の２つのメリットがあります。

1. パフォーマンス改善を行った変更をデプロイした場合に、それが効果があったのかがひと目で把握できる
2. 何か変更を行って、それをデプロイした場合、その後、急減にパフォーマンスが低下した場合に、それがデプロイによる影響なのかがすぐに分かる。

以上のように、デプロイ前後でのパフォーマンスが簡単にわかるため、デプロイがパフォーマンスに与える影響が簡単にわかります。そのため、デプロイによってパフォーマンスが急激に落ちた場合に、デプロイを元に戻し、ユーザーに大きな影響を与えることを回避できます。


## デプロイ記録に仕方

デプロイ記録のリクエストは以下のように、`POST` リクエストを送ることで、記録されます。おそらく、本番環境などでは、デプロイスクリプトの途中に以下に以下のコマンドを組み込むことになると思います。

```
curl -X POST 'https://api.newrelic.com/v2/applications/${APP_ID}/deployments.json' \
     -H 'X-Api-Key:${API_KEY}' -i \
     -H 'Content-Type: application/json' \
     -d \
'{
  "deployment": {
    "revision": "REVISION",
    "changelog": "Added: /v2/deployments.rb, Removed: None",
    "description": "Added a deployments resource to the v2 API",
    "user": "datanerd@example.com"
  }
}' 
```

`API_KEY` は、New Relic にログインし、`右上のアカウント名をクリックし > Account settings > 画面左メニューの Integrations > API keys` ページで、`Regenerate REST API key` をクリックし、キーを生成し、それを使います。

また、エージェントによっては、上記以外の方法でのデプロイ記録の方法も提供していますので、気になる方は、[こちら](https://newrelic.degica.com/docs/apm/new-relic-apm/maintenance/recording-deployments#agent)から確認ください。 


### 併せて読みたい

デプロイ記録に関するリクエストの送信方法やなど、詳しい情報を知りたい方は、[ドキュメント:デプロイを記録する](https://newrelic.degica.com/docs/apm/new-relic-apm/maintenance/recording-deployments) をご覧ください。

## まとめ

この機能は地味に便利だと思うので、`PRO` アカウントをお使いの方は、是非ご利用ください。
scikit-optimizeの紹介

この記事は[Machine Learning Advent Calendar 2016](http://qiita.com/advent-calendar/2016/machine-learning)の17日目の記事です。

今回はブラックボックス関数を最小化するパラメータを推定することが可能なscikit-optimizeというライブラリについて紹介したいと思います。

* scikit-optimize公式ページ(https://scikit-optimize.github.io/)
* githubページ(https://github.com/scikit-optimize/scikit-optimize)

# Installation

今回実験した環境は次の通り。

* 実行環境: MacOS Siera
* Python 3.5.2

インストールはpipから簡単にできる。


```python
pip install scikit-optimize
```

# Example

githubのREADME.mdにあるGetting Startedではある関数にノイズを加えたものである。関数が分かれば良いのですが、実際は関数が未知となっていることがあります。そのような場合にあるデータ点xを関数はわからないが評価は出来る場合にBayesian Optimizationという方法使って最小化するxを求めることができる。

```python
import numpy as np
from skopt import gp_minimize

def f(x):
    return (np.sin(5 * x[0]) * (1 - np.tanh(x[0] ** 2)) * np.random.randn() * 0.1)

res = gp_minimize(f, [(-2.0, 2.0)])
```


このresは次のような変数を持っている。

* fun: f(x)の最小値
* func_vals: 各試行で得られたf(x)の値

```
fun = min(func_vals)
```

* models: 各試行で利用したモデル
* random_state: seed
* space: 探索した範囲(Space)
* specs: パラメータの一覧
* x: 最小値を得られたxの値
* x_iters: 各試行で評価されたxの値


# For Machine Learning

機械学習(特に, 教師あり学習)といえばデータ集合からモデルを構築し, 未知のデータに対する予測性能を向上させるのが目的になります。その際, 機械学習では交差検定と様々な評価指標を用いてモデルを評価します。更に, より高性能なモデルを構築したい場合にはハイパーパラメータのチューニングが不可欠になります。
今回はこのハイパーパラメータのチューニングをskoptを使ってやってみます。

## 準備

データと機械学習のモデルを決めます。
[こちらのページ](https://scikit-optimize.github.io/notebooks/hyperparameter-optimization.html)にも例が載っていますが, せっかくなので少し違うモデルでやってみます。

* データ: breast_cancer
* モデル: GradientBoostedTreeClassifier (scikit-learn)
* 評価: AUC

## 手順

1. データとモデルを準備します。

```python
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score

data = load_breast_cancer()
X, y = data.data, data.target
n_features = len(X)
model = GradientBoostingClassifier
```

2. ブラックボックス関数を定義します。

```
def objective(params):
    max_depth, lr, max_features, min_samples_split, min_samples_leaf = params
    
    model.set_params(max_depth=max_depth,
                     max_features=max_features,
                     learning_rate=lr,
                     min_samples_split=min_samples_split,
                     min_samples_leaf=min_samples_leaf)
    
    # gp_minimizeは最小化しか出来ないので高いほど性能が高いと示すような指標は負の値を使う必要がある
    return -np.mean(cross_val_score(model, X, y, cv=5, scoring='roc_auc'))
```

3. パラメータの探索範囲(Space)を決めます。

```
space  = [(1, 5), (10**-5, 10**-1, "log-uniform"), (1, n_features), (2, 30), (1, 30)]
```

4. 探索の初期値を決めます。

```
x0 = [3, 0.01, 6, 2, 1]
```

5. gp_minimizeを使って最小化するハイパーパラメータを推定します。


```
res = gp_minimize(objective, space, x0=x0, n_calls=50)

print(res.fun) # -0.993707074488
print(res.x)   # [5, 0.096319962593215167, 1, 30, 22]
```

このようにして最適なハイパーパラメータを求めることが出来ました。
ちなみにこのデータセットだとgp_minimizeにかかる時間は17[s]でした。

# Others

公式サイトには, 上記に説明したもの以外にもいくつかサンプルが載っています。

* Bayesian optimization
* Hyperparameter optimization
* Store and load results
* Strategy comparison
* Visualizing results
【Excel】MATCH関数について

# Tips 「MATCH関数」

> **MATCH関数**
> MATCH 関数は、範囲 のセルの範囲で指定した項目を検索し、その範囲内の項目の相対的な位置を返します。
> [MATCH関数 - support.office.com](https://support.office.com/ja-jp/article/MATCH-%E9%96%A2%E6%95%B0-e8dffd45-c762-47d6-bf89-533f4a37673a)


```:formula_match
=MATCH(検査値, 検査範囲, [照合の型])
```
照合の型：0で完全一致を指定可能

**表**

| ⊿ | A | B | C |
|:-:|:-:|:-:|:-:|
| 1  | い  | ろ  | は  |

```:example_match1
=MATCH("い", $A$1:$C$1, 0)
```
```:result_match1
1
```


```:example_match2
=MATCH("は", $A$1:$C$1, 0)
```
```:result_match2
3
```