OmniAICreator/Qiita-1.07M huggingface dataset:
「量子コンピュータで因数分解」数式を使わずに説明してみせる

# はじめに
「量子コンピュータができたら暗号が解かれてヤバい」なんて話を聞いたことは無いでしょうか。

量子コンピュータは因数分解を高速に解けるので、現在の暗号システムはすぐに破られてしまう、などと言われていますね。
今回はその暗号を解くために必要な因数分解についての話をします。

厳密な理論とかいいから、イメージだけ知りたいって人向けにゆるくまとめます。

# 因数分解の解き方
因数分解のための定番アルゴリズムがありまして、量子コンピュータでも同じものを使います。

フローチャートを貼っておきますが、最悪内容は分からなくても番号だけ覚えてもらえれば大丈夫です。

![スクリーンショット 2018-02-18 20.37.19.png](https://qiita-image-store.s3.amazonaws.com/0/182999/62051b14-76e2-fd62-717f-ed302cfe3e9e.png)


## 高速に解けない原因

フローチャートの各項目に①〜④の番号を付けておきました。大きく分けて４つ項目があるわけですが、実は

①　条件付きで乱数を生成するだけ
③　ただのif文
④　ユークリッドの互除法を使えば四則演算で解ける

ですので、②以外はサクッと計算できるものばかりなんですね。
ところが、②の計算時間は、因数分解する数の桁が１つ増えれば10倍、2つ増えれば100倍と、指数関数的に増えていきます。

②の求め方としてすぐに思いつくのは、しらみ潰しに全部の自然数を確認していく方法です。
しかし、上記のようにこれではすぐに計算量が爆発的に増えてしまいます。
そこで、少し工夫が必要です。

## rを求めたい
②を解くために、余剰の周期性を利用します。
イメージしやすいようにPythonコードで具体的な例を出すと、`x = 4`, `N = 25`として

```python
4**1 % 25  # => 4
4**2 % 25  # => 16
4**3 % 25  # => 14
4**4 % 25  # => 6
4**5 % 25  # => 24
4**6 % 25  # => 21
4**7 % 25  # => 9
4**8 % 25  # => 11
4**9 % 25  # => 19
4**10 % 25  # => 1
4**11 % 25  # => 4
4**12 % 25  # => 16
4**13 % 25  # => 14
4**14 % 25  # => 6
4**15 % 25  # => 24
4**16 % 25  # => 21
4**17 % 25  # => 9
4**18 % 25  # => 11
4**19 % 25  # => 19
4**20 % 25  # => 1
4**21 % 25  # => 4
4**22 % 25  # => 16
4**23 % 25  # => 14
4**24 % 25  # => 6
4**25 % 25  # => 24
4**26 % 25  # => 21
4**27 % 25  # => 9
4**28 % 25  # => 11
4**29 % 25  # ...
```

同じパターンが繰り返されています。

グラフにしてみるとこんな感じです。周期があるのがわかりますね。

![4-25.png](https://qiita-image-store.s3.amazonaws.com/0/182999/a8f5df60-6c92-4e35-ee40-16b6cb54743c.png)

この周期が分かれば、②を満たす自然数rを求める事ができます。

## 周期を求めると言えば
あるパターンから周期を求めるには、「フーリエ変換」がよく使われます。
フーリエ変換は奥が深くて重要な分野なのですが、詳しく話すにはどうしても数学的に難しくなるので、今回は使うとどうなるのか結果だけお見せします。

さっきの余剰のグラフの式をフーリエ変換すると、次のようになります。なんか城みたいなグラフですね。
![fft.png](https://qiita-image-store.s3.amazonaws.com/0/182999/d218eaa1-848c-62cc-511a-502127082de3.png)
この中で尖ってる偶数をrとして使用します。
今回は３つありますが、どれでもいいので6を使うことにします。

これでrを求められたので、あとは簡単に因数を求める事ができます。

```python
math.gcd(int(4**(6/2)+1), 25)  # 5
```

こうして因数5が求められました。

このようにフーリエ変換を使えば因数を求められるのですが、従来のコンピュータはフーリエ変換も苦手です。
条件にもよりますが、最悪の場合はrをしらみ潰しに探した方が早いくらい苦手です。

ところが、量子コンピュータならフーリエ変換を高速に解けます。

どのくらい差があるかというと、従来のコンピュータで100桁の数字をフーリエ変換するなら、2の100乗回の操作が必要です。
数字で書くと1000000000000000000000000000000回です。

対して量子コンピュータならだいたい5000回で計算できます。
量子コンピュータの場合は何度か計算をやり直さなければいけない場合もあるのですが、それを差し引いても圧倒的な差ですね。

このフーリエ変換を高速に解けるという性質が、因数分解の高速な計算を可能にしています。

## サンプル
projectQというライブラリで、今回紹介した量子アルゴリズムのExampleが用意されています。
https://github.com/ProjectQ-Framework/ProjectQ/blob/develop/examples/shor.py

projectQをインストールしているなら、gitからcloneして`python shor.py`すれば試してみる事ができます。
あくまでシミュレータなので全く高速ではありませんが、コードを見てみると理解が深まるかもしれません。

# まとめ
最後に要約すると、

**因数分解はフーリエ変換に時間がかかる
でも量子コンピュータはフーリエ変換を高速に解ける
だから量子コンピュータは高速に因数分解できる**

です。

フーリエ変換を高速に解けるなら、他にもいろいろな事に応用できそうな気がしますね。
JenkinsでSpringBoot自動デプロイ

## ゴール
いままで何となくJenkinsを使っていたが、JenkinsがほぼCronだということがわかった。
いろいろプラグイン入れると便利みたいだけど、とりあえずCronのまとめ役として使ってみる。
GithubからプッシュされたタイミングでJarを作成するシェルをJenkinsで動かす。

## Jenkinsダウンロード＆起動
下の参考リンクからJenkinsをダウンロード
https://qiita.com/inakadegaebal/items/b526ffbdbe7ff2b443f1

## Javaの文字コード設定
javaコマンドを実行すると???という文字化けするため以下設定しておく

```sh:UTF8を指定
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8
```

## Jenkinsユーザでsudoでシェルを実行するときパスワードなしにする
JenkinsでSudoで実行してもうまく動作しないため以下の設定を行う

```sh:visudoを付与
sudo /usr/sbin/visudo


#追記箇所（最終行等に加える）------------------
Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD:ALL

```

## GitHubからソースを取得する
```sh:Githubからソース取得
cd /opt/
git clone https://github.com/xxxx/xxxxx.git
```

## シェル作成
Jenkinsで実行するシェル。Gitから最新のソースを取得してMavenを実行。

```sh:build.sh
#!/bin/sh
filepath="/opt/gitsource-filename"

## 実行するディレクトリ移動（適時修正）
echo '***Change Directory'
cd $filepath

## 最新のソースアップデート
echo '***Git Update'
git pull

## Mavenクリーンアップ
echo '***Maven Clean'
mvn clean

## DomaのためSQLファイルをコピー
echo '***Directry Copy'
mkdir -m 777 -p ./target/classes/
cp -r ./src/main/java/META-INF ./target/classes/

## Jarに固める（テスト実行はスキップ）
echo '***Maven Download'
mvn package -Dmaven.test.skip

## 実行するJar変更
chmod 666 ./target/xxxxxxx-0.0.1-SNAPSHOT.jar
## Jar実行&ProcessIdをテキストファイルに書き込み
java -jar ./target/xxxxxxx-0.0.1-SNAPSHOT.jar & echo $! > ./pid.file &
```
## JenkinsでGitHubのポーリング設定
GitHubのログイン情報を設定。SCMポーリングで起動するよう設定。
![jenkins2.png](https://qiita-image-store.s3.amazonaws.com/0/230829/6ba11075-7e38-f346-51cf-bf33a2e9f6fd.png)

## Jenkinsでシェル実行を設定
上記のシェルを叩く
![jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/230829/7ecf8b3d-f637-950e-e4ec-c86e4cd820c5.png)

## 困っていること・今後解決していきたい課題

### 1.DomaのSQLがパッケージングされない
今回自身が作成したアプリにDomaを利用したが、
Domaで使用しているMETA-INF配下のSQLファイルがビルドフォルダにコピーされない
無理矢理コピーしているのが現状。Eclipseならビルドパス指定してたけど、CentOSではどうすれば？検索中。。。

> SQLファイル[META-INF/../select.sql]がクラスパスから見つかりませんでした
http://doma.seasar.org/faq.html#development-environment-5

### ~~2.SprigBootのjar実行するとJenkinsの結果が帰ってこない~~
~~jar実行したらあたりまえだけど。実行したら帰ってこない。起動した時、一旦OKを返してくれると嬉しい。~~
 →　以下のようにJarをテキスト出力に変えたら結果が表示された

```sh:変更前
java -jar ./target/xxxxxxx-0.0.1-SNAPSHOT.jar
```

```sh:変更後
java -jar ./target/xxxxxxx-0.0.1-SNAPSHOT.jar & echo $! > ./pid.file &
```
C++ 任意の順番で引数を指定し、任意の引数を省略する関数オブジェクト

#デフォルト引数と名前付き引数
VBAでは以下のようにしてプロシージャにデフォルト引数を指定することができる。
Optional は引数が省略可能であることを宣言する。

```vb
Sub OptionalArgs(Optional arg1 As Integer = 0, Optional arg2 As Integer = 0)
'...
End Sub
```

多くの場合において使用される実引数が事前に判明している場合、このようにプロシージャを設計することで呼び出し側のコードが簡潔になる。

```vb
OptionalArgs 100, 200
OptionalArgs 100
OptionalArgs
```

引数が不足している場合末尾から省略されていると解釈され、省略された引数としてデフォルト引数(=0)が使用される。

```
OptionalArgs arg1:=100, arg2:=200
OptionalArgs arg2:=200, arg1:=100
```

名前付き引数を使用してプロシージャを呼び出すこともできる。
こちらは**任意の順番で引数を指定できる**ため、**任意の引数を省略することができる**。

#C++で名前付き引数やデフォルト引数を扱う
C++にもデフォルト引数を扱う構文が用意されている。

```c++
void func(int arg1 = 0, int arg2 = 0) {
/* ... */
}
```

一方、名前付き引数を使用した関数呼び出しはサポートされていない。
VBA同様、引数が不足している場合末尾から省略されていると解釈され、省略された引数としてデフォルト引数(=0)が使用される。
必ず引数を後ろから省略する場合、この構文で何ら問題ない。
問題は引数の数が多く、かつどれが省略されるか事前に判断できない場合だ。

```c++
void func(int arg1 = 0, int arg2 = 0, int arg3 = HOGE, int arg4 = FUGA, int arg5 = ...)
```

それぞれの引数についてデフォルトで使用したい値はあるが、省略される引数は先頭の arg1 かもしれない。
arg1 についてデフォルト引数を使用したい場合、呼び出し側のコードは以下のようになる。

```c++
func(0, 0, HOGE, FUGA, ...);
```

愚直に全てのデフォルト引数を呼び出し側に記述するしかない。
デフォルト引数を使用したい引数以降の全てのデフォルト引数を調べて指定する必要がある。
例えばウィンドウを生成する関数を考えている場合、「大きさ」、「タイトル」、「アクティブ状態」、「フォーカス有無」等の多岐にわたる設定を行うための引数を関数が持つことが考えられるが、それらの引数のうちどれが省略されるかは場面によって異なり、省略のされやすさに明確な序列は存在しない。
このような場面において、引数の序列を事前に定義せず、**任意の順番で** また **任意の引数を省略する** ことができる設計はないものか。

#自身の参照を返すsetter
引数から setter に話を移す。以下を見てほしい。

```c++
class func {
  int _a;
  int _b;
public:
  func& a(int value) { _a = value; return *this; }
  func& b(int value) { _b = value; return *this; }
};

auto f1 = func().a(1).b(2);
```
単純な setter が自身の参照を返している。
これによりコンストラクト後、メソッドチェーンを使用して連続的に a, b といった複数の setter を呼び出すことができる。

```c++
auto f1 = func().a(1).b(2);
auto f2 = func().b(2).a(1);
```

注目すべきは上記のように任意の順番で各々の setter を呼び出すことができる点である。
この様式は、先に挙げた VBA の名前付き引数に類似している。

#関数オブジェクトに適用する
任意の順番で setter を呼び出すことができるなら、setter により設定されたメンバ変数を利用して関数を呼び出せるようにすればいい。
関数オブジェクトの出番である。

```c++
class func {
  int _a;
  int _b;
public:
  func& a(int value) { _a = value; return *this; }
  func& b(int value) { _b = value; return *this; }
  
  func () : _a(1), _b(1) {} //デフォルト引数

  void operator()() { //関数呼び出しのオーバーロード
    std::cout << (_a * _b) << std::endl;
  }
};

func().a(2).b(3)(); // 2 * 3 -> 6
func().a(2)();      // 2 * 1 -> 2
func().b(3)();      // 1 * 3 -> 3
func()();           // 1 * 1 -> 1
```

#マクロによるパターンの抽象化
このパターンにおいて「引数と対応するメンバ変数」と「自身の参照を返す setter」は必ず対になって宣言される。
冗長なためマクロを使用して簡略化してみよう。

```c++
#define PARAM(type, name) private: type _##name; public: auto name(const type& name) { _##name = name; return (*this); }

class func {
  PARAM(int, a)
  PARAM(int, b)
public:
  func () : _a(1), _b(1) {}

  void operator()() {
    std::cout << (_a * _b) << std::endl;
  }
};
```

PARAMマクロは「引数と対応するメンバ変数」と「自身の参照を返す setter」に展開される。
展開後のマクロで private: や public: を指定して可視性を変更しているため、PARAMマクロ使用後は public: 等と以降の可視性を明示する必要があることに注意すること。
3次元構造格子のメッシュの可視化


# 背景
前回の["3次元構造格子のサーフェイスメッシュ及びコンターのplotlyによる可視化"](https://qiita.com/Toyoharu-Nishikawa/items/80c77d7fa00d61964f01)に引き続き、今度は3次元構造格子自体を可視化したいと思いました。前回のをサーフェイスメッシュを少し変えるだけで、3次元メッシュを描画できると思いましたので、今回もplotly.jsを使いました。

[![Imgur](https://i.imgur.com/ez0rtH6.png)](https://qiita.com/Toyoharu-Nishikawa/items/044d53974c42bc635f0f)

plotly.jsのダウンロードはこちらでできます。
https://plot.ly/javascript/getting-started/

# 問題

3次元構造格子上のi番目, j番目, k番目の要素のx, y, z座標が分かっていいるとき、そのメッシュを表示する。

```math
x = x(i, j, k), y = y(i, j, k), z = z(i, j, k) \\
f = f(i, j) \\
(i = 0,1,2, ... , imax) \\
(j = 0,1,2, ... , jmax) \\
(k = 0,1,2, ... , kmax) \\
```
 

# 方法

メッシュのラインを描くために、3次元配列はx[k][j][i], y[k][j][i], z[k][j][i]を
for文の3重ループでnullでつなぎながら一次元配列にするだけです。

```javascript
const imax = 10
const jmax = 10
const kmax = 10


const listX = [...Array(kmax)].map(k=>[...Array(jmax)].map(k=>[...Array(imax)].map((k,index)=>index)))
const listY = [...Array(kmax)].map(k=>[...Array(jmax)].map((k,index)=>[...Array(imax)].map(k=>index)))
const listZ = [...Array(kmax)].map((k,index)=>[...Array(jmax)].map(k=>[...Array(imax)].map((k,index2)=>index)))

const x=[]
const y=[]
const z=[]

for(let k=0;k<kmax;k++){
  for(let j=0;j<jmax;j++){
    for(let i=0;i<imax;i++){
      x.push(listX[k][j][i]) 
      y.push(listY[k][j][i]) 
      z.push(listZ[k][j][i]) 
    }
    x.push(null)
    y.push(null)
    z.push(null)
  }
}

for(let j=0;j<jmax;j++){
  for(let i=0;i<imax;i++){
    for(let k=0;k<kmax;k++){
      x.push(listX[k][j][i]) 
      y.push(listY[k][j][i]) 
      z.push(listZ[k][j][i]) 
    }
    x.push(null)
    y.push(null)
    z.push(null)
  }
}

for(let i=0;i<imax;i++){
  for(let k=0;k<kmax;k++){
    for(let j=0;j<jmax;j++){
      x.push(listX[k][j][i]) 
      y.push(listY[k][j][i]) 
      z.push(listZ[k][j][i]) 
    }
    x.push(null)
    y.push(null)
    z.push(null)
  }
}


const trace1 = {
  x: x,
  y: y,
  z: z,
  line: {
    color: 'blue', 
    width: 1,
  }, 
  mode: 'lines', 
  type: 'scatter3d'
};

const data = [trace1];

const layout = {
  height: 500, 
  width: 500,
  scene: {
    /*aspectratio: {
      x: 1, 
      y: 1, 
      z: 1,
    },*/ 
    xaxis: {
      backgroundcolor: 'rgb(230, 230,230)', 
      gridcolor: 'rgb(255, 255, 255)', 
      showbackground: true, 
      zerolinecolor: 'rgb(255, 255, 255)'
    }, 
    yaxis: {
      backgroundcolor: 'rgb(230, 230,230)', 
      gridcolor: 'rgb(255, 255, 255)', 
      showbackground: true, 
      zerolinecolor: 'rgb(255, 255, 255)'
    }, 
    zaxis: {
      backgroundcolor: 'rgb(230, 230,230)', 
      gridcolor: 'rgb(255, 255, 255)', 
      showbackground: true, 
      zerolinecolor: 'rgb(255, 255, 255)'
    }
  }, 
 title: '3D structual grid', 
};

Plotly.plot('draw',data,layout,{
    editable: true,
    scrollZoom: true,
    showLink: false,
    displaylogo: false,
    modeBarButtonsToRemove: ['sendDataToCloud']
});
```
jsnoteで実行できます
[![Imgur](https://i.imgur.com/HstpPha.png)](https://toyoharu-nishikawa.github.io/jsnote/#sample=sample/public/plotly/structual_grid.js&drawCheckBox=1)

# サンプル

![Imgur](https://i.imgur.com/ZB5pmuw.png)
![Imgur](https://i.imgur.com/pmJpq9t.png)
![Imgur](https://i.imgur.com/KT3IRhQ.png)
みんなのプロコン 2018 C問題

みんなのプロコン 2018 C問題
https://yahoo-procon2018-qual.contest.atcoder.jp/

C問題を解けなかったというメモでございます。

# 競技中に考えたこと
問題を一通り読んだときの特徴は
「x,c,vが非常に大きいので計算時間にこれらが関係してしまうと即アウト」
「N <= 18が小さく、また半端な数。Nの(次数が高めの)多項式、もしくは2^Nあたりの計算時間かな」

互いに「自分がこの手を出したらその後の得点がどうなるかを考えてから自分の手を決定する」という状態である。再帰構造、DPの構造に似ている。集合に対するDPだとするとビットDPである。蟻本を持ってきてビットDPの項目を読む。
高橋くんの売り方は一定なので、所持金は商品の要素数に応じて自動的に決まるところがコツである。
DP[S]を、高橋くんの手番で買える商品の集合がSであるときに、その後両者最善を尽くした場合の得点と定める。定義より問題の解答はDP[1,2,...,N]である。またDP[$\phi$] = 0である。
例えばDP[1,2,3]を求めるにはどうすればよいか。

- 高橋くんが財宝を売却することに決めると、得点はDP[1,2], DP[1,3], DP[2,3]のいずれかになる。しかし、青木くんはこのうちの最小になるように選ぶのでmin{DP[1,2], DP[1,3], DP[2,3]}となる。
- 高橋くんが商品を購入することに決めると、実行可能な買い方の価値のうち最大のものが得点となる。これをbuy[1,2,3]としよう。
- 以上より答えはmax{min{DP[1,2], DP[1,3], DP[2,3]}, buy[1,2,3] }となる。

buyの計算量を考えなければ、計算量は$O(N 2^N)$である。(一つの状態での得点を計算する際に、最大N個の数を参照せねばならないので、最初にNを掛けている。) N=18のときこの値は約471万 < 10^7。よって間に合うのでめでたし……**ではない**。
buy[1,2,3]を素直に計算すると「8通りの部分集合に対してコスト合計と価値の合計を計算して、コストが所持金以下となる組み合わせの中で価値最大のものを選ぶ」という方法になる。計算時間は$2^3$であり、一つのDP[...]を計算するときに最大で$2^N$の時間がかかってしまう。
というわけで計算時間の合計は$N\cdot2^N\cdot2^N$ か(正確な計算量は後述)……アカン。これでは間に合わない。

buy[1,2,3]とbuy[1,2]では後者のほうが所持金が多いことに注意する必要がある。極端な話、buy[1,2]では商品1と商品2の2つとも買えるが、buy[1,2,3]では所持金が減ったので何も買えない、といった事態も起こりうる。したがってbuyのほうはDPで計算できなさそうだし、かと言って全通り探索は時間が足りないのでここで手詰まり、試合終了。

# 上記方法の計算量について
実は、上記の解法で解いたときの計算量は$2^N \times 2^N$よりも少ない。
2^N個のマス目があるDPテーブルの各要素は、高々N個の前要素を参照して計算できる。よってDPテーブルを全て計算するのに掛かる時間のうち、buyの計算を除いた部分は高々N * 2^Nである(厳密に計算しても良いが、その結果の値はこの半分である)。
さてbuyのほうのテーブルの計算だ。テーブルのマス目は全部で2^N個である。あるマス目の要素数がk個ならば計算量は高々N*2^k。要素数がk個となるマス目は${}_N C_k$個あるから、合計は

```math
\sum_{k=0}^N N\cdot {}_N C_k \cdot 2^k 
= \sum_{k=0}^N N\cdot {}_N C_k \cdot 2^k 1^{N-k}
= N(2+1)^N = N3^N
```

二項定理とか超久しぶりに使ったな……全体の計算量も、$O(N 3^N)$である。

# 正解は

buyテーブルの求め方を解説文を参考に書く。
buy[{1,2,3}, M]を、Mの金を持っていて商品1,2,3を買おうとするときの価値の最大値とする。

* 全部の商品を買えるならば全部買うのが最適解。
* そうでない場合、買わない商品が1つ以上あるのでこれはmax{buy[{1,2}, M], buy[{1,3}, M], buy[{2,3}, M]}に等しい。

計算量について。
Mを1つ固定した場合、buy[X, M]を求めるためには2^|X|個のテーブルを埋めれば答えが出る。そしてMは(高橋くんの各手番での所持金の)N通りある。高々$N\cdot2^N$の計算量となる。(もう一つNが掛かるかも?)
DPを求めるときには「所持金は商品の要素数に応じて自動的に決まる」を利用して要素数を削減していた。しかしbuyテーブルを求めると金は、所持金・商品要素数の組み合わせのうち実際には起こり得ないものまで考えなければいけない。一度上手く利用できた条件を逆転して考えなきゃいけないわけで、だいぶ難しいと思った。

おしまい。
urllib.parse で URL のクエリ文字列を動的に組み替える

# やりたいこと

`https://github.com/search?q=rails&type=Repositories`

という URL を元に

`https://github.com/search?q=numpy&type=Repositories&l=C`

という URL を生成したい。具体的には、クエリパラメータの `q` の値が変わり、かつ `l=C` というパラメータが追加されている。

# 方法

## 実装

```py
import urllib.parse


def update_query_parameters(url, query_parameters):
  result = urllib.parse.urlparse(url)
  params = urllib.parse.parse_qs(result.query)
  params.update(query_parameters)
  new_query = urllib.parse.urlencode(params, doseq=True)
  result = result._replace(query=new_query)
  
  return urllib.parse.urlunparse(result)
```
```py
>>> url = 'https://github.com/search?q=rails&type=Repositories'
>>> update_query_parameters(url, {'q': 'numpy', 'l': 'C' })
'https://github.com/search?q=numpy&type=Repositories&l=C'
```

## 詳細

```py
>>> import urllib.parse
>>> result = urllib.parse.urlparse('https://github.com/search?q=rails&type=Repositories')
>>> result
ParseResult(scheme='https', netloc='github.com', path='/search', params='', query='q=rails&type=Repositories', fragment='')
>>> params = urllib.parse.parse_qs(result.query)
>>> params
{'q': ['rails'], 'type': ['Repositories']}
>>> params.update({'q': 'numpy', 'l': 'C' })
>>> params
{'q': 'numpy', 'type': ['Repositories'], 'l': 'C'}
>>> new_query = urllib.parse.urlencode(params, doseq=True)
>>> new_query
'q=numpy&type=Repositories&l=C'
>>> # ParseResult オブジェクトでは somenamedtuple._replace(**kwargs) が使える。
... result = result._replace(query=new_query)
>>> result
ParseResult(scheme='https', netloc='github.com', path='/search', params='', query='q=numpy&type=Repositories&l=C', fragment='')
>>> urllib.parse.urlunparse(result)
'https://github.com/search?q=numpy&type=Repositories&l=C'
```

うーん、ちょっと複雑だなぁ :sob:

# 参考

* [Python ドキュメント » 21.8. urllib.parse — URL を解析して構成要素にする](https://docs.python.jp/3/library/urllib.parse.html)
Visual Studio Codeで簡単にショートカットキーを変更する方法

## 環境
- Visual Studio Code: Version 1.20.1
- OS: Mac OS High Sierra Version 10.13.2
- 言語設定: OS, VSCode 共に English

記事内で説明しているショートカットはMacのものなので、他OSの方は適宜読み替えてください。

※2018年2月18日時点のVersion 1.20.1の内容なので、ショートカットや画面は現在とは変わっている可能性があります。


## やり方
`shift+cmd+p` でコマンドパレットを開く。`key` と打って表示される `Preferences: Open Keyboard Shortcuts` を選択してキーバインド一覧（というよりアクション一覧？）を表示。
`cmd+k cmd+s` (`cmd+k 入力した後に cmd+s`) でも表示されます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/130946/3f6c8424-2d58-1a10-b851-b4c803f08412.png)


キーバインドを変更または追加したいアクションを検索し、左の鉛筆マークをクリックするか該当アクションをダブルクリック。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/130946/30b42e56-d608-0497-aaab-4fabf063e3a9.png)

ポップアップが出るので希望するキーバインドを入力してエンター。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/130946/d62442f0-92c9-d5e6-21a6-f8628128a6ae.png)


以上です。

この作業で `keybindings.json` に変更が追加されています。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/130946/0f7f91a3-be68-42b3-9373-bcbb6ba81c73.png)


もちろんこのファイルを自分で編集してもいいのですが、めんどくさい＆間違えやすいので、`Preferences: Open Keyboard Shortcuts` から変更した方が楽かと思います。`when` だけはこちらで細かく設定するといいかもしれませんね。


## その他
`keybindings.json` を開いているときに `cmd+k cmd+k` (`cmd+k`を二回) と入力すると、キーバインドを入力するポップアップが出ます。そこでキーバインドを入力してエンターを押すと、以下のコードが挿入されます。あとは `command` と `when` を自分で設定すればOKです。
知っておくと便利かもしれません。

```keybindings.json
{
  "key": "入力したキー",
  "command": "commandId",
  "when": "editorTextFocus"
}
```

## 参考
キーバインドについて詳しくは公式ドキュメントをご覧ください。
[Visual Studio Code Key Bindings](https://code.visualstudio.com/docs/getstarted/keybindings)
今更ですがCSSの優先順位について

フロントエンド初心者ですがCSSの優先順位でハマってしまったので

#後から書いたものが優先
まずは基本的な所から、おそらく少しでもCSSに触れたことのある人は知ってると思いますが同じプロパティに重複して書き込んだ場合は後から書いたものが適用されます。

```css
h1 {
color: red;
}

/* こっちが優先 */
h1 {
color: blue;
}
```

このあとポイントの概念を説明しますが、ポイントが同じなら後から書いたものが優先されます

#セレクタのポイント
実はこれを知らなくて悩んでたんですが、セレクタには優先順位を決めるポイントがあります。
各セレクタのポイントは以下のようになります。

|セレクタ|例|ポイント|
|:--:|:--:|:--:|
|インライン|<p style="color: red;" ...|1000|
|id|#id { color: blue; }|100|
|class, 擬似class|.class { color: green }|10|
|エレメント, 擬似エレメント|p { color: yellow }|1|

ここでの擬似classとは:hoverみたいなもので、擬似エレメントは::afterみたいなやつです。
この総合ポイントが高いものが優先されるようです。

```html:hoge.html
/* 1000ポイント */
<h1 style="color: red;">赤色だよ</h1>

<p id="sample" class="hoge fuga">黄色だよ</p>
```

```css:fuga.css
/* 100ポイント */
#sample { color: blue; }

/* 10 + 1 = 11ポイント */
.fuga p { color: green; }

/* 100 + 10 + 1 = 111ポイント */
#sample .hoge p { color: white; }

/* 100 + 10 + 1 = 111ポイント */
#sample .fuga p { color: yellow; }
```

111ポイントが二つありますが、後から書いたものが優先されるので黄色になりますね

*追記
ポイントというのは同じレベル内での話で、単純なポイントの足し算では優先度は決まらないようです。
いくらclassを増やしてポイントを増やしても、idやインラインが優先されるといった感じです。

```css
/* ポイントは 0.0.13.0 */
.class .a .b ...(クラス１０個) { color: red; }

/* ポイントは 0.1.0.0 こっちが優先　　*/
#id { color: blue; }
```
コメントでご指摘いただきました、ありがとうございます！

#!important
ここまでいくつか例を出してきましたが、とりあえずこれさえ付ければ最優先になってしまうものがあります、それが !important です。
ポイントとかありましたが、これを書いてしまえば問答無用でスタイルが適用されます(最終的にこれを使いました)
乱用はダメだと思います…

```css
/* !importantは最優先！ */
p { color: red !important; }
```

<br>
<br>
フロントエンドは楽しいですね

#参照
[CSS優先順位の実例とまとめ](http://mawatari.jp/archives/css-selector-priority)
Windows10からUbuntu16.04にVNC接続する

#Ubuntuには標準でVNCサーバが入っている

Ubuntuには既に**vino**と呼ばれるVNCが標準で搭載されている。

なお、本記事ではLAN内でのみの接続を想定している。

#vinoを設定する

Dashから「vivo」で検索をかけると、「デスクトップの共有」と出るので、これを起動し、設定を行う。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/215782/4bfe94ff-7afb-ac52-aa2e-b1a8d89546ce.png)

#vinoの設定

設定では、以下のものにチェックを入れる。

- 他のユーザーが自分のデスクトップを表示できる
- 他のユーザーがデスクトップを操作できる

また、クライアント側からVNC接続した際にパスワードを要求したい場合、「パスワードの入力を要求する」にチェックを入れ、パスワードを設定する

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/215782/6220d15a-ab9a-522c-3b2f-ea8aaf2fff43.png)

なお、サーバ本体での操作を廃したい場合(殆どの場合はそうだと思うが)、「このマシンへの接続を毎回確認する」のチェックを外しておく。

# Windowsからリモート接続できるようにする設定

クライアント側のOSもUbuntuであれば上記の設定で十分だが、vinoには特有の認証があり、このままではWindowsまたはMacOSからリモート接続することはできない。

WindowsまたはMacOSからのリモート接続を可能にするには、以下のコマンドをターミナルで実行する。
`$ gsettings set org.gnome.Vino require-encryption false`

# クライアント側の設定

クライアント側(今回の記事で言うWindows10)にてVNCviewerを用意する。

VNCはオープンソースとして公開されていることから、様々な派生ソフトが存在する。
基本的に使用するソフトは何でもいいが、今回は**REALVNC Viewer**を用いた。

[Download VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/)

VNC Serverの部分にサーバのIPを入力し、起動する。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/215782/9bb7d231-7116-01bd-135f-8f2e9c1564c4.png)


今回はこれでVNC接続することができた。
Facebook の Graph API で自分についての情報を得る

このプログラム　は User Token が有効かの確認に使えます。
ここに表示してある User Token は既に無効です。文字数がこんなに長いということを示しています。Facebook には、色々なトークンがあるので、適切なものを選ぶ目安として、トークンの長さが使えます。

```py3:get_me.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	get_me.py
#
#					Feb/18/2018
#
# ----------------------------------------------------------------
import sys
import json
import requests
# ----------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="https://graph.facebook.com/v2.12/me"
#
params={}
params['access_token']="FG4EFFBgb938BAO2ouOc1235pjXC8YgsXZBYRnZB8nNvwZCP7dJDTXq7pRrZCVXDX4rmH9hvEZCUj8ZA2ihBlMKMoVWWwzaaRzI8tqA6zCAhgZB12idZCYxIxXNmC112GypCJlnsGdUgLLwAYp0PAQinfL3J123f6or2JYj65bt0QSp1umNabcfg"
#
params['fields'] = 'id,name,last_name,first_name,gender,name_format,timezone'
#
try:
	rr=requests.get(url,params=params)
	print(rr.text)
	unit_aa=json.loads(rr.text)
	print(unit_aa['id'])
	print(unit_aa['name'])
	print(unit_aa['last_name'])
	print(unit_aa['first_name'])
	print(unit_aa['gender'])
	print(unit_aa['name_format'])
	print(unit_aa['timezone'])
except Exception as ee:
	sys.stderr.write("*** error *** in requests.get ***\n")
	sys.stderr.write(str(ee) + "\n")
#
sys.stderr.write("*** 終了 ***\n")
# ----------------------------------------------------------------
```

API の仕様
[Graph API User](https://developers.facebook.com/docs/graph-api/reference/user/)

投稿を取得する例は、こちらです。
[Python3 で Facebook の自分の投稿を取得する](https://qiita.com/ekzemplaro/items/00750a2ccbb5761c96e8)
ActiveRecordのorクエリをscope化する

Rails 5では、ActiveRecordに`or`クエリを立てる機能が加わったのはいいのですが、うまく使わないと変なハマり方をします。

# `#or`の機能

すでに[詳しい紹介](https://qiita.com/QUANON/items/0033a5adb76d0cb963cd)があるのでそちらに譲りますが、ざっと使い方を書くと、`リレーション.or(別なリレーション)`とすることで、両者のORを取る、という流れです。

# スコープにしてのハマリゴト
## サンプルテーブル
今回は、以下のようなテーブルでSQLを組み立ててみます。

```rb
create_table :users do |t|
  t.string :name
  t.string :nickname
  t.string :telephone
  t.string :mobile_telephone
end
```

## シンプルに立ててみると

では、「`name`もしくは`nickname`が引数に一致する」ようなスコープを作ってみましょう。とりあえずは、これで動きます。

```rb
scope :simple_name, ->(name) { where(name: name).or(where(nickname: name)) }
```

ただ、これには1つ問題があって、`where`がそれまでに付けた条件すべてを拾う形になるので、`User.別なscope.simple_name('hoge')`のようにすると、`User.別なscope.where(name: name).or(User.別なscope.where(nickname: name))`のように、条件が増えてしまいます。このスコープを複数回使えば、倍々ゲームでSQLが伸びていくという、悲惨な事態となります[^1]。これでは汎用のスコープとしては適当ではありません。

[^1]: 10個orしたものを5つ連ねた結果、数MBのSQL文が出来上がってしまったこともありました。

## 回避策

では、どうすればいいのでしょうか。いくつか方法を考えてみました。

### ActiveRecordの`#or`を使わない

少し負けたような感じもありますが、文字列やArel、[baby_squeel](https://github.com/rzane/baby_squeel)など別な手段でORクエリを組み立てれば、この問題の影響は出ません。

### `merge`を使う

`unscoped`などを使って、正確に「追加する分だけ」の条件を組み立てて、それを元のリレーションに`merge`することで、`#or`だけでも今までの条件と完全分離して作ることができます。

```rb
scope :merge_name, lambda { |name|
  rel = unscoped.where(name: name).or(unscoped.where(nickname: name))
  merge(rel)
}
```

# 脚注
WebpackしたReactコンポーネントを非同期に読み込む

[サンプルコード](https://github.com/teradonburi/learnReactJS/tree/AsyncComponent)

# webpackしたコンポーネントを非同期でレンダリングする(Code Spliting)
参考：[Code Splitting for React Router with Webpack and HMR]
(https://hackernoon.com/code-splitting-for-react-router-with-webpack-and-hmr-bb509968e86f)

プロジェクトが大きくなってくるとwebpack.jsでコンパイルしたbundle.jsが肥大化します。
bundle.jsが肥大化するとbundle.jsの読み込みに時間がかかってしまい、初回のページの表示が遅くなります（SPAの欠点）
そこでAsyncComponentを作成して、非同期リソース読み込みを行います。

``` asyncComponent.js
import React from 'react'

// 遅延レンダリングを行うコンポーネント
export default (loader, collection) => (
  class AsyncComponent extends React.Component {
    constructor(props) {
      super(props)
      this.Component = null
      this.state = { Component: AsyncComponent.Component }
    }

    componentWillMount() {
      // 遅延して読み込み完了させる
      setTimeout(() => this.setState({startProgress: true}), 500)
      if (!this.state.Component) {
        loader()
          .then(module => module.default) // export defaultされたコンポーネント
          .then(Component => {
            // コンポーネントを遅延読み込みしたものに差し替え
            AsyncComponent.Component = Component
            this.setState({ Component })
          })
      }
    }

    render() {
      if (this.state.Component) {
        // Wrapしたコンポーネントをレンダリングする
        return <this.state.Component { ...this.props } { ...collection } />
      }

      if (!this.state.startProgress) {
        return null
      }

      // Loading中コンポーネント
      return <div>Now Loading...</div>
    }
  }
)
```

次のようにimportをラップして読み込みを行います。

```js
const UserPage = asyncComponent(() => import('./components/UserPage'))
```

## webpackでトランスパイル後のファイル名を指定のファイル名にする方法
上記のacyncComponentでラップしたコンポーネントをwebpackでトランスパイルすると
0.jsのようにファイル名がリネームされて出力されてしまいます。
これを回避するためにWebpack 2.4.0以降でmagicコメントが使えます。
参考：[How to use Webpack’s new “magic comment” feature with React Universal Component + SSR](https://medium.com/faceyspacey/how-to-use-webpacks-new-magic-comment-feature-with-react-universal-component-ssr-a38fd3e296a)
このmagicコメントを指定することでwebpackでコンパイルされた後のファイル名を指定することができます。(App.js)

```js
const UserPage = asyncComponent(() => import(/* webpackChunkName: 'userpage' */ './components/UserPage'))
const TodoPage = asyncComponent(() => import(/* webpackChunkName: 'todopage' */ './components/TodoPage'))
const NotFound = asyncComponent(() => import(/* webpackChunkName: 'notfound' */ './components/NotFound'))
```

上記マジックコメントで指定すれば、webpackリリースビルド時に
userpage.js、todopage.js、notfound.jsが出力されます。
なお、複数コンポーネントがある場合は、magic commentのコンポーネント名は被ってはいけません。

なお、ReactHotLoader使用時は次のようにrequireすることで、遅延レンダリングではなく
全て読み込み完了待ちするまで待ってからレンダリングすることができます。

```js
/*globals module: false require: false */

// ReactHotLoader時は全部読み込んでしまう
if (module.hot) {
  require('./components/UserPage')
  require('./components/TodoPage')
  require('./components/NotFound')
}
```
dmidecodeコマンドの実装

# 概要
コードリーディングの勉強も兼ねて、dmidecodeコマンドの実装をかなりざっくりと概要だけ追った時のメモです。使用した環境の構築メモは下記に記載しています。

* [GNU GLOBALを使ったコードリーディング環境の構築](https://qiita.com/kutsurogi194/items/4d121dcb758b0cfb96aa)

* [Dockerコンテナにgdbによるデバッグ環境の構築](https://qiita.com/kutsurogi194/items/16e0546c927075fc4409)

誤りや過不足があればご指摘いただければ幸いです。

# 環境
* CentOS 6.9
* dmidecode-2.12

# dmidecodeコマンド
DMI(いわゆるSMBIOS)テーブルからハードウェア情報をダンプするコマンドです。サーバ情報や物理CPU数などを確認する際に使用することが多いです。詳細はdmidecode(8)のmanページをご参照ください。

# dmidecodeコマンドの実装をざっくりと

* `mmap(2)`で`/dev/mem`をメモリマッピングしていました。これは、dmidecodeコマンドで使用するハードウェア情報はSMBIOSに格納されているのですが、Linuxでは`/dev/mem`からSMBIOSを読み取れるためだそうです。

```c:util.c
 127         mmp = mmap(0, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset);
```

* なので、`/dev/mem`が存在しないDockerコンテナなどでdmidecodeコマンドを実行すると下記のようにエラーとなります。

```bash
# dmidecode 2.12
/dev/mem: No such file or directory
```

* `/dev/mem`のオフセットが`0xF0000`から`0xFFFFF`までを順に読んでいき、`_SM_`という文字列が現れたら、そこを起点として読み取った内容をダンプする実装でした。なお、`_DMI_`という文字列が現れたら、SMBIOSとは異なるレガシーな方法でダンプします。

```c:dmidecode.c
4672         if ((buf = mem_chunk(0xF0000, 0x10000, opt.devmem)) == NULL)
4673         {
4674                 ret = 1;
4675                 goto exit_free;
4676         }
4677 
4678         for (fp = 0; fp <= 0xFFF0; fp += 16)
4679         {
4680                 if (memcmp(buf + fp, "_SM_", 4) == 0 && fp <= 0xFFE0)
4681                 {
4682                         if (smbios_decode(buf+fp, opt.devmem))
4683                         {
4684                                 found++;
4685                                 fp += 16;
4686                         }
4687                 }
4688                 else if (memcmp(buf + fp, "_DMI_", 5) == 0)
4689                 {
4690                         if (legacy_decode(buf + fp, opt.devmem))
4691                                 found++;
4692                 }
4693         }
```

* VirtualBoxの仮想環境で`/dev/mem`をhexdumpコマンドで16進ダンプして見たところ、特定のオフセット間に確かに`_SM_`が存在することが見て取れます。

```sh:hexdump
# hexdump -C /dev/mem | grep _SM_
000fff60  5f 53 4d 5f 7d 1f 02 05  ff 00 00 00 00 00 00 00  |_SM_}...........|
```

* 上記実装について、[System Management BIOS](https://wiki.osdev.org/System_Management_BIOS) 等に纏まっていたことを後々確認しました(汗)
いまさらビッグデータ勉強中

#はじめに
- IAサーバ、アプライアンスのストレージ製品を中心にやってた。
- ビックデータ関連の仕事が増えたが基礎がない。。。
    - 一から勉強中。
- 定着にはアウトプット必要だよね。→とりあえずかいてみる

#基礎知識
- データパイプライン：データ連携をするシステム全体
- 処理もろもろ
    - ストリーム処理：受け取ったデータをリアルタイムに処理
    - バッチ処理：ある程度まとまったデータを効率よく加工
    - ETL(ELT)：Extract(取り出し) Transforme(加工) Load(読み込み) の略。ELTは順が違う。
 
- データの貯め方
    - DWH:長期保存用に整理したテーブル。テーブル設計が必要
    - データレイク：RAWデータをそのまま保存
 
- 分析
    - アドホック分析：その場限りの分析→手作業でデータ集計とか

- 基本的な流れ
    - データ集約　→　データマート　→ 可視化


#データのはなし
- データ格納
    - 列志向がいいらしい：データ集計で考えると扱うデータは数列に絞れる→効率的
    
- テーブルの呼び方
    - ファクトテーブル：トランザクションのように事実が記録
    - ディメンジョンテーブルファクトテーブルが参照するマスタ

##集計のコツ
- ビックデータの集計 -> 早い段階でファクトテーブルを小さくする
- 分散システムの性能を活用するためにデータの偏りをなくす
 ->例えばWebページであれば特定のページがアクセスが多いとかある。
- クエリエンジンには「ベストプラクティス」や「クエリ最適化」といったドキュメントがあるので参考にすると良い。

#分散処理
##コンポーネント
- 分散ファイルシステム：HDFS
- リソースマネージャ：YARN,Mesos
- 分散データ処理：MapReduce,Spark
    - クエリエンジン：Hive,Impara,Presto
 
##hadoop
##spark
##presto
- (Hiveとちがって)クエリ実行過程でディスク書き込みが発生しない。
- 同じキーを持つデータは同じノードに集められる(分散結合)
- 片方のテーブルが小さい場合は全データを各ノードにコピーすることもできる（ブロードキャスト結合）

#データマートの作り方
- ファクトテーブルが重要
- ファクトテーブルの作成方法は２種類
    - 追記
    - 置換
- 他
    - サマリーテーブル
    - スナップショットテーブル
    - 履歴テーブル
- ディメンジョンで使うデータは定期的にスナップショットを取っておくと良いらしい(復元が楽〜)
- ディメンジョンを追加して非正規化テーブル完成！

#ビックデータの蓄積
##メッセージ配送のトレードオフ
- 性能と信頼性はトレードオフ
- 大量のデータを安定して受け入れる仕組みが必要↓

##メッセージブローカ
- データを一時的に蓄える中間層のこと
    - オープンソース：Apache Kafka
    - クラウド：Amazon Kinesis
- プッシュ型：プロデューサがメッセージを送る
- プル型：コンシューマがメッセージをもってくる

#ビッグデータのパイプライン
## ワークフロー管理ツール
- 役割
    - 定期的なタスク実行
    - 異常を検知してその解決を手助けする
- タイプ
    - 宣言型：最低限の記述でタスクを定義
    - スクリプト型：柔軟性
Angularで表示/非表示に関するあれやこれやそれや

##　はじめに

:monkey_face:「これが『ngIfディレクティブ』で非表示にした要素」
:monkey_face:「スタイルバインディング『hidden』で非表示にした要素」
:monkey_face:「スタイルバインディング『style.display』で非表示にした要素」
:wolf:「全部同じじゃないですか！？」
:frog:「ちがいますよーーっ」
:monkey_face:「これだからしろうとはダメだ！」「もっとよく見ろ！」
:monkey_face:「『ngIf』と『hidden』のちがいは、ngIfは要素が生成されないんだ」
:monkey_face:「『hidden』は要素にhidden属性が加わる」
:monkey_face:「『style.display』はスタイル指定だからinlineやblockを指定できる」

.
.
.

Angularにはテンプレートの表示、非表示を制御する方法がいくつかあります。
今回は、それぞれどのような特徴があるのかを見ながらAngularしろうとから1歩前に踏み出してみましょう。

## ngIf

ngIfが真の場合HTML要素を生成し、逆の場合は生成しません。不要な情報を生成しない為、リソースが軽く済みます。ngIfを変更する度に要素が再生成される為、頻繁に切り替える処理には向きません。

また、要素が生成されない為、コンポーネントを通して要素を参照することが出来ない点には注意が必要です。

```HTML:実装コード
<div *ngIf="show" class="content-block">
　　ngIf
</div>
```
↓

```HTML:表示中の要素
<!--bindings={
  "ng-reflect-ng-if": "false"
}-->
<div _ngcontent-c0="" class="content-block">
  ngIf
</div>
```

```HTML:非表示の要素
<!--bindings={
  "ng-reflect-ng-if": "true"
}-->
```

ngIfはng-templateを使って真偽の切り替えも可能です。ngIfだけでなくngSwitchでも同じことができます。

```HTML:thenブロックとelseブロック
<div *ngIf="show; then thenBlock; else elseBlock" class="content-block">
  ここの内容は表示されない
</div>
<ng-template #thenBlock>真の場合</ng-template>
<ng-template #elseBlock>偽の場合</ng-template>
```

## hidden

hidden属性を追加して非表示の制御を行っています。ngIfとは異なり、非表示の状態でもコンポーネントから参照することができます。
hidden属性の特性上、CSSでdisplayプロパティに変更が割り当てられている場合は、CSSの表現が優先されてしまうので注意が必要です。

```HTML:実装コード
<div [hidden]="hidden" class="content-block">
  hidden
</div>
```
↓

```HTML:表示中の要素
<div _ngcontent-c0="" class="content-block">
  hidden
</div>
```

```HTML:非表示中の要素
<div _ngcontent-c0="" class="content-block" hidden="">
  hidden
</div>
```

## style.display

CSSのdisplayプロパティを指定して非表示制御を行っています。もちろん非表示にするには"none"を指定する必要があります。
また、hiddenと同様にCSSで割り当てている場合は注意です。

```HTML:実装コード
<div [style.display]="displayProperty" class="content-block">
  styleDisplay
</div>
```
↓

```HTML:表示中の要素
<div _ngcontent-c0="" class="content-block" style="display: block;">
  styleDisplay
</div>
```

```HTML:非表示中の要素
<div _ngcontent-c0="" class="content-block" style="display: none;">
  styleDisplay
</div>
```

## ケース

以下の様な基準で使い分けをしています。

表示、非表示の切り替えが不要な場合
→ *ngIf*

表示、非表示を繰り返す場合
→ *hidden、style.display*

非表示状態の要素を参照、変更する場合
→ *hidden、style.display*

切り替え時に要素の初期化をしたくない場合
→ *hidden、style.display*

※ hidden属性は関連性が無いことを示す属性ですので、上記のケースが使い方として相応しくない場合があります。

##　参考

https://angular.io/api/common/NgIf
https://angular.io/guide/ajs-quick-reference
https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/hidden
LINEボットにしゃべらせてみる


今回は、LINE Messaging API、Repl-AIを使ってLINEボットにしゃべらせてみようと思う。
プログラム？heroku？何それおいしいの？という諸兄必見。
Repl-AIを使えばプログラミングレスでbotが作れてしまうのだ。

なお、準備は下記の記事を参考に。

[LINE@でbotを始めてみる：Qiita](https://qiita.com/ASLA/items/14fc5a6675e73ecc073d)

[Repl-AIを使ってみる：Qiita](https://qiita.com/ASLA/items/05d6c0869ea225687043)

# Repl-AI とLINEを連携させる
## Repl-AIでLINE連携の設定をする

* Repl-AIのマイページで、「LINE連携」ボタンから設定する。

![Repl-AI_LINE](https://qiita-image-store.s3.amazonaws.com/0/233979/2b983017-ee36-3d13-eb4a-78908b25f2c0.jpeg)

* LINE Messaging APIのチャネルID、トークンなどを登録、でおしまい。
なお、アクセストークンは事前に「再発行」で発行しておこう。
ここで表示されるRepl-AIへのWebhook URLをコピーしておく。

![Repl-AI_LINE_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/233979/2ba32da2-e1e2-a573-c631-eeda2edacdd8.jpeg)

## LINE DevelopersからRepl-AIへのWebhook送信設定をする

* 「Webhook URL」に先ほどのURLを設定、以上。
これでもう自分のLINE@アカウントと雑談できるようになっているはずだ。

![LINE@MESSAGING_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/233979/4d46a15c-c249-6b40-6c60-64a97c47e874.jpeg)
fastTextのための前処理と使い方

#はじめに
Facebookが開発したfastText。
今までの自然言語ツールよりも高速で学習や分類をするらしいです。（この記事は速度比較ではありません）
以前は単語極性辞書を使って、文に含まれている単語を辞書と照らし合わせ、そのスコアの平均を出すという手法でやってみたことがあります。しかしこの方法だと「①この商品は値段が高い」と「②この商品は精度が高い」が同じようなスコアになってしまう可能性があります。
（①は値段が高いためネガティブな発言であるのに対し、②は精度が高いのでポジティブな発言）
fastTextはこれとは異なる手法であり、気になったので使ってみました。
今回は、分類です。
テキストの分類ができると、レビューの解析や、メールの仕分けなどが行えます。

#実行環境
- PCスペック
    - OS  : Ubuntu 16.04
    - CPU : core i7 7700
    - GPU : GeForce GTX 1080
    - RAM : 32GB 
- ソフトウェアバージョン
    - python(Anaconda) => 3.6.1
    - fasttext => 0.8.3
    - pyknp => 0.3
    
#用意するもの
- 教師データ
- 分類したいデータ

#前処理
fastTextは以下のようなフォーマットでなければ読み込んでくれません。
`__label__*, 今日 は 良い 天気 です 。`
※「*」にはクラスナンバーを入れてください。

つまり、もしポジティブとネガティブの二値分類をしたい場合は、`__label__1, `と`__label__2, `の二種類が必要になります。

私はまずそれぞれのファイルを作成し、最後に１つにまとめました。
では早速、用意した教師データを上記のフォーマットにしましょう。

##手順① 形態素解析（分かち書き）
今回は形態素解析ツールはJUMAN++を使用します。
この他にもMeCabなどがよく使われています。

```py:wakati.py
def make_wakati():
    morps = pyknp.Jumanpp().analysis(sentence).mrph_list()
    wakatis = [m.midasi for m in morps]
    return " ".join(wakatis)
```

上記で分かち書きしたものをファイル出力しておきましょう。

##手順② ラベル付け
分かち書きした文の頭に`__label__*, `を追加します。
※「*」には適切な数値を入れてください。

```
sed -i -e "s/^/__label__*,/" ファイル名 
```

##手順③ ファイルを１つにまとめる
`__label__1, `や`__label__2, `が文頭に書かれたそれぞれのファイルを１つにまとめます。
ファイル名は`model.txt`としました。

```
cat ファイル１ ファイル2 > model.txt
```

前処理は終了です！

#fastTextの使い方
##学習（model生成）
先ほど作成した`model.txt`をfastTextに学習させましょう。
学習は簡単で`supervised`で読み込むだけ。
以下のコードで出力されるのは`model.bin`です。

```python:model.py
import fastText as ft
ft.supervised('model.txt', 'model')    
```

##分類

```python:classifier.py
def predict(wakati):
    classifier = ft.load_model('model.bin')
    estimate = classifier.predict_proba([wakati], k=2)
    print(estimate)
```


#感想
以上で簡単に分類ができます。
今回はデータがある前提で書きましたが、教師データを集める場合は、
TwitterAPIなどを利用するとすぐに集まりそうな気がします。
注意点として、Twitterで取得した場合、キレイな文章でないことが多いと思います。（文末に「。」がなかったり、正確な日本語になっていない）
形態素解析をする際に、記号などが含まれているとうまくいかないので、予め日本語のみを抽出するか、スペースや記号等を削除する必要がありますね。

ありがとうございました。
sbtプロジェクト作成手順(Mac限定)

ScalaをインストールせずにsbtのみでScalaを実行できる環境手順をメモ書き程度に書きます。

前提条件

- JDK 8
- homebrew

## sbtのインストール

```
$ brew install sbt
```

## プロジェクトの作成

```
$ sbt new scala/scala-seed.g8
``` 

以下は「hello-scala」プロジェクトを作成した例

```
$ sbt new scala/scala-seed.g8
[info] Loading project definition from /Users/yoshikawayuki/workspace/project
[info] Set current project to workspace (in build file:/Users/yoshikawayuki/workspace/)

A minimal Scala project. 

name [Scala Seed Project]: hello-scala <-名前を入力する

Template applied in ./hello-scala
```

## 対象クラスの実行方法

上記でプロジェクトを作成した場合にHello.scalaがデフォルトで作成されます。そのファイルを実行したい場合は以下のコマンドを入力すれば、Hello.scalaが実行される

```
sbt "runMain example.Hello"
```
#### Hello.scala
```scala
package example

object Hello extends Greeting with App {
  println(greeting)
}

trait Greeting {
  lazy val greeting: String = "hello"
}

```

#### 実行結果
```
$ sbt "runMain example.Hello"
[info] Loading project definition from /Users/yoshikawayuki/workspace/hello-scala/project
[info] Updating ProjectRef(uri("file:/Users/yoshikawayuki/workspace/hello-scala/project/"), "hello-scala-build")...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/yoshikawayuki/workspace/hello-scala/project/target/scala-2.12/sbt-1.0/classes ...
[info] Done compiling.
[info] Loading settings from build.sbt ...
[info] Set current project to hello-scala (in build file:/Users/yoshikawayuki/workspace/hello-scala/)
[info] Updating ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/yoshikawayuki/workspace/hello-scala/target/scala-2.12/classes ...
[info] Done compiling.
[info] Packaging /Users/yoshikawayuki/workspace/hello-scala/target/scala-2.12/hello-scala_2.12-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running example.Hello 
hello
[success] Total time: 1 s, completed Feb 18, 2018 7:22:09 PM
```

## 留意点

sbtを既にインストール済みでアップグレードをする場合、brew updateをした方が良いが、Mac OS High Sierra の場合、以下のエラーが発生する。

```
/usr/local must be writable!
```

その場合はhomebrew 再インストールすれば良い。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
【React.js】createStoreを実装してみたらReduxの理解が捗った

Reduxの使い始めにActionやらReducerやらStoreやら新しい概念が出てきて混乱しました。
その時にcreateStoreを実装してみたら流れをよく理解出来たので紹介します。

##Reduxでカウンターを実装
シンプルなカウントアプリを作成。今回はstate更新の流れを確認したいので、ActionCreatorやstateのイミュータブルは一旦置いておきます。

```index.html
<div id="root"></div>
```
```カウントアプリ.js
import { createStore } from 'redux';
import React from 'react';
import ReactDOM from 'react-dom';

// Action
const myAction = { type: 'ACTION_INCREMENT'};

// Reducer
const myReducer = (currentState = 0, action) => {
  switch(action.type) {
    case 'ACTION_INCREMENT':
      return currentState + 1;
    default:
      return currentState;
  };
};

// storeにreducerを登録
const store = Redux.createStore(myReducer);

const render = () => ReactDOM.render(
  <h1>{store.getState()}</h1>,
  document.getElementById('root')
);

// storeが更新(dispatch実行時)されたら実行される
store.subscribe(render);

// クリック時にstateの更新を行う
document.addEventListener('click', () => store.dispatch(myAction));

render()
```
**Action**
stateをどう変更するかという情報を返しています。
↑では「ACTION_INCREMENT」が該当します。

**Reducer**
Actionをを引数として受取り、stateをどう更新するかを定義します。
↑では「ACTION_INCREMENT」を受取り、currentStateにインクリメントしています。
※Reduxではstateに手を加えないという作法があり、Object.assign()を使って新しいstateを返すのが正しいやり方ですが今回は無視します。

**subscribe**
subscribe()は、dispatch()される度に指定した処理を実行します。
↑ではクリックイベントにdispatch()を登録し、クリックされる毎にrender()を実行しています。

**dispatch**
引数にActionを指定し、Reducerが呼ばれます。dispatch()が呼ばれる度にstateが更新されsbuscribe()が実行されます。

##createStore()の中身はどうなっているのか？
Reduxを初めて見た時はdispatchやsubscribeが何をしているのか理解出来ませんでした。
Reduxフレームワークに隠れているからです。dispatchもsubscribeもcreateStoreが持つ関数ですのでcreateStoreの中身を見ると何をしているのか分かります。

createStoreを実装することで全体の流れを理解出来るようになりました。今回は自分なりに実装してみます。

```createStoreを実装してカウントアプリ.js
//import { createStore } from 'redux';
import React from 'react';
import ReactDOM from 'react-dom';

// createStore()を実装
const myCreateStore = (reducer) => {
  let state;
  let listeners = [];
  
  //　getStateはただstateを返すだけ
  const getState = () => state;
  
  // dispatchはreducerを呼んでstateを更新する
  // subscribeで登録した処理を実行
  const dispatch = (action) => {
    state = reducer(state, action);
    listeners.forEach(listener => listener());
  };
  
  // subscribeでdispatch時に呼ぶ処理を登録
  const subscribe = (listener) => {
    listeners.push(listener);
  };
  
  dispatch({});
  
  return { getState, dispatch, subscribe };
};

// Action
const myAction = { type: 'ACTION_INCREMENT'};

// Reducer
const myReducer = (currentState = 0, action) => {
  switch(action.type) {
    case 'ACTION_INCREMENT':
      return currentState + 1;
    default:
      return currentState;
  };
};

// storeにreducerを登録
// const store = Redux.createStore(myReducer);
const store = myCreateStore(myReducer);

const render = () => ReactDOM.render(
  <h1>{store.getState()}</h1>,
  document.getElementById('root')
);

// storeが更新(dispatch実行時)されたら実行される
store.subscribe(render);

// クリック時にstateの更新を行う
document.addEventListener('click', () => store.dispatch(myAction));

render()
```

Codepen上で試しただけですが問題なくカウントされました。

隠蔽されていたcreateStore()を見てみると、
dispatch：Reducerを実行してstateの更新、subscribeで登録した処理の実行
subscribe：dispatch時に実行する処理の登録
をしているのがよく分かるんじゃないかと思います。

それぞれの役割を見るとReduxは決して複雑なものではなくシンプルなものだと思うようになりました。
初学者の方の参考になれば幸いです。
Repl-AIを使ってみる


Repl-AIは、docomoが提供するプログラミングレスのボットサービスである。
今回はこれを試してみようかと思う。

![Repl-AI_start](https://qiita-image-store.s3.amazonaws.com/0/233979/99a40714-4d64-8416-46ea-c92fd1d03499.jpeg)

# Repl-AIをはじめる
## docomo Developer supportに登録

* 「新規登録(無料)」から、docomo Developer supportでアカウント登録を行う。

![docomoDeveloper_register](https://qiita-image-store.s3.amazonaws.com/0/233979/3009f3b9-fd27-ce4d-9e5d-0fc5af8afc27.jpeg)

* アカウント登録後、APIの利用申請を行う。

![docomoDeveloper_APIstart](https://qiita-image-store.s3.amazonaws.com/0/233979/91a81848-3fc7-fcb8-3180-c0373ff3046b.jpeg)

* 雑談APIやシナリオ対話APIなど、色々なものがある。
色々試してみたいので、とりあえず全部チェックしてみる。
一部のAPIには、法人登録ユーザ専用のものがあるため、使用するなら法人情報を登録する必要がある。

![docomoDeveloper_APIselect](https://qiita-image-store.s3.amazonaws.com/0/233979/b6033eb3-180f-8149-d21f-d09b6a168c8e.jpeg)

## Repl-AIにログイン

* Repl-AIにdocomo Develper supportのID/PWでログインすると、対話シナリオをブラウザ上で作成することができる。お手軽。

![Repl-AI_console](https://qiita-image-store.s3.amazonaws.com/0/233979/f3c429b8-b1c9-1732-d585-df351d4bd875.jpeg)
LINE@でbotを始めてみる


# Messaging APIの利用をはじめる
## Messaging APIとは

LINEが提供する、外部サービスからメッセージのやり取りをするためのAPI。
LINE develoersに使い方やAPIリファレンスなど詳しく説明されている。

<https://developers.line.me/ja/docs/messaging-api/overview/>
![LINE_MessagingAPI_overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/233979/30c0f99a-d1f0-5776-e91e-0925eea48749.jpeg)

## Messaging APIを利用するには

<https://developers.line.me/ja/docs/messaging-api/getting-started/>

* LINE@ MANAGERから利用開始登録をする

![LINE@MESSAGING_start](https://qiita-image-store.s3.amazonaws.com/0/233979/daf25e1e-634a-4f1a-610c-6610b2bb6686.jpeg)

* LINE@MANAGERではAPIの設定は行えない。設定はLINE developersから行う。

![LINE@MESSAGING_setting](https://qiita-image-store.s3.amazonaws.com/0/233979/c942f13a-fb54-0e7d-bd56-a826eaa89095.jpeg)
OpenCVで画像にキャプションを追加する（cv2.putText()）

三つの画像をキャプションつけて連結して一つの画像にする。ソースコードは[ここ](https://github.com/ka10ryu1/jpegcomp/blob/master/concat_3_images.py)。日本語に対応していないので、日本語でできるやり方を募集中。

# 動作環境

# 結果

北海道の美瑛で撮影したこの3枚
![biei.PNG](https://qiita-image-store.s3.amazonaws.com/0/227399/04e50c9a-d0ca-58b5-6eed-13886427f6c3.png)

結合するとこうなる
![concat02.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/7f8abcc5-ad0c-ee25-a3ac-44572980b19e.jpeg)

とても高い肉とデザートの3枚
![nikutoaisu.PNG](https://qiita-image-store.s3.amazonaws.com/0/227399/b84dd1f4-6450-e04c-223e-112930a485d7.png)

結合するとこうなる
![concat01.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/418442bf-7ca4-c9e8-60fe-19044afb6c01.jpeg)

6枚の写真はすべて2048pixelから4096pixelの位置で切り取っている。縮尺は変わっているが、結合画像は両方とも同じ横幅。高さは三枚のうち一番小さい画像に合わせている（1枚目の肉画像のサイズが他と若干異なる）。OpenCVの`putText()`を利用しているため、日本語はすべて`?`で表示されるので注意。

# ソースコード

以下がソースコードのmain部分。[1]で画像の読み込みと整形、[2]で縮尺変更、[3]でキャプションの設定と挿入、[4]で三枚の画像を結合、[5]で表示と保存を行っている。

```python3
import cv2
import numpy as np
from Tools.func import getFilePath
import Lib.imgfunc as IMG

def main(args):
    # [1]
    ch = IMG.getCh(args.channel)
    imgs = [cv2.imread(name, ch) for name in args.image]
    height = np.min([i.shape[0] for i in imgs])
    start_pos = args.offset
    end_pos = start_pos + args.img_width
    if(args.channel == 1):
        imgs = [i[:height, start_pos:end_pos] for i in imgs]
    else:
        imgs = [i[:height, start_pos:end_pos, :] for i in imgs]

    # [2]
    imgs = [cv2.resize(i, getSize(i, args.img_rate),
                       cv2.INTER_NEAREST) for i in imgs]
    # [3]
    text = ['[hitotsume]', '[futatsume]', '[mittsume]']
    header_size = (30, int(args.img_width * args.img_rate), 3)
    imgs = [titleInsert(i, t, header_size) for i, t in zip(imgs, text)]
    # [4]
    img = concatImage(imgs, thick=1, color=(0, 0, 0))

    # [5]
    cv2.imshow('test', img)
    cv2.waitKey()
    cv2.imwrite(getFilePath(args.out_path, 'concat', '.jpg'), img)
```

importしている`Tools`と`Lib`は自作関数で、同じリポジトリにある。
PHPのテンプレートエンジンで改行表示

textarea等に入力された改行は改行コードで保存されますが、それをhtmlとして出力する際の方法です。
使ったことのないテンプレートエンジンは知りません。

# Smarty

```
{ $input_text|escape:"html"|nl2br }
```

`escape:"html"`は`htmlspecialchars($input_text, ENT_QUOTES, SMARTY_RESOURCE_CHAR_SET)`

* double_encodeはtrue（デフォルト）なので既存のエンティティも変換する
* エンコーディングはSMARTY_RESOURCE_CHAR_SET
* 改行は`<br />`

```
{ nl2br(htmlspecialchars($input_text, ENT_QUOTES, 'UTF-8', false), false) }
```

* double_encodeはfalseなので既存のエンティティは変換しない
* エンコーディングはUTF-8
* 改行は`<br>`

# Blade

```
{!! nl2br(htmlspecialchars($input_text, ENT_QUOTES, 'UTF-8', false), false) !!}
```

* double_encodeはfalseなので既存のエンティティは変換しない
* エンコーディングはUTF-8
* 改行は`<br>`

Laravelだと[ヘルパー関数](https://github.com/laravel/framework/blob/5.5/src/Illuminate/Support/helpers.php)が使えるらしいです

```
{!! nl2br(e($input_text), false) !!}
```

* double_encodeはfalseなので既存のエンティティは変換しない
* エンコーディングはUTF-8
* 改行は`<br>`


```php:src/Illuminate/Support/helpers.php
function e($value, $doubleEncode = false)
{
    if ($value instanceof Htmlable) {
        return $value->toHtml();
    }
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', $doubleEncode);
}
```

# 参考

[htmlspecialchars](http://php.net/manual/ja/function.htmlspecialchars.php)
[nl2br](http://php.net/manual/ja/function.nl2br.php)
IntelliJ IDEAでjava+OpenCV 3.X

表題の通りIntelliJ IDEAでjava版OpenCVを使おうとしてつまずいたのでメモ．


## 環境
+ OS: Windows10 64bit
+ Intellij IDEA Community Edition 2017.3.4
+ OpenCV 3.4.0

## OpenCVをインストール
最新のやつを https://opencv.org/releases.html からダウンロードしてインストール.

## IntelliJにPathを通す
File -> Profect Structure -> Libraries で，
[+] -> java を選択し，`C:\opencv\build\java\opencv\-340.jar`を指定．

Run -> Edit Configurations... の
VM Options: に　`-Djava.library.path=C:\opencv\build\java\x64`を入力

※32bitの場合は`x64`->`x32`
※`C:\opencv`は適宜，インストールした場所に変えてください．

## テスト
###コード

```java
public class OpenCVMain(){
  public static void main(String[] args){
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    System.out.println("Hello, OpenCV");
  }
}
```

###実行結果

```
Hello, OpenCV
```


## 参考にしたサイト
+ http://labusers.net/~ymatsubara/menu/blog-ja.php?path=20150516.html
+ https://stackoverflow.com/questions/31286453/no-opencv-java300-in-java-library-path
NoderedからWatson Visualize RecognitionのCustom Classifierを利用

## はじめに
NoderedからWatson Visual RecognitionのCustom Classifierを利用するほうほうが変更されたみたいなので、現時点のものを記載します。

## Noderedの指定方法

<img width="891" alt="スクリーンショット 2018-02-18 17.03.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/239309/e68fc291-ca95-bc36-a5f3-3235a60509c8.png">

### ・「URL抽出」には普通にリンクを

msg.payloadには画像URLのリンクを入力

```
msg.payload = msg.payload.imageurl;
return msg;
```

### ・「classifier_id登録」にはclassifier_idを

msg.pramsには画像URLのリンクを入力

```
msg.params = []; 
msg.params={"classifier_ids":["dogs_XXX"],"threshold":0};
return msg;
```

### ・「Visual Recognition」にはAPI Keyを

<img width="459" alt="スクリーンショット 2018-02-18 19.07.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/239309/0fe30d17-94d4-d8e3-22b3-9078360f0fe1.png">

### ・設定完了

上記で設定完了です！
classifier_idsの登録方法の参考にしてください。
DockerでC++のsvmの開発環境を構築する(1)

# はじめに
c++でsvmをやってみたいということで，c++の古いライブラリであるlib-svmとlib-linearを使ってみた．インストールの際の依存ライブラリのインストールがかなり手間だったので，その手順をdockerfileに記述し，またコンパイル・実行をdockerコンテナ上でテストできるようにした．

ソースファイルは，以下の通り
(https://github.com/sey323/svm-sample)

#Dockerfileの準備
Dockerfileの記述は以下の通り．
  
```Dockerfile:./Dockerfile  
FROM ubuntu:16.04

RUN apt-get update
RUN apt-get -y install make cmake gcc g++

# liblinear周りのインストール
RUN apt-get -y install liblinear-dev liblinear-tools liblinear3
# libsvm周りのインストール
RUN apt-get -y install libsvm-dev libsvm-tools libsvm3

# プロジェクト追加
ENV APP_DIR  /home/svm_sample
RUN mkdir -p $APP_DIR
WORKDIR $APP_DIR
```

#Dockerのビルド

dockerのビルドは以下の通り．

```  
docker build -t svm:0.1 .
```

gccのコンパイルやapt-getのアップデートに，結構時間がかかるので待つ．

# コンテナの実行
ローカルの環境とコンテナを接続して，ローカルで行ったファイルに対する変更を，コンテナのファイルにも適応できるようにする．

```
docker run --rm -v `pwd`:/home/svm_sample -it svm:0.1 /bin/bash
```

# ソースコードの編集とコンパイル

以下のコマンドでコンテナ内にログインし，コンパイルを行う．

```
docker exec -it svm:0.1 /bin/bash
root@b37e305ca519:/home/svm_sample# make all
```

./srcフォルダの中に，liblinear_sample.o，libsvm_sample.oがそれぞれ生成されるので，./dataフォルダの中のサンプルデータに対して，実行してみる．
第１引数は学習に用いる教師データのパスで，第２引数は保存する学習データの名前．

```
root@b37e305ca519:/home/svm_sample# ./src/libsvm_sample.o data/data.train.csv test.csv
```

出力結果は以下の通り．
<pre>
learning datas :40
Ready to train ...
*
optimization finished, #iter = 19
nu = 0.000011
obj = -1.774179, rho = -2.823552
nSV = 4, nBSV = 0
Total nSV = 4
Finished ...
predict training samples ...
done
RESULT : correct =1
</pre>

とりあえず実行ができれば，環境構築は終了．

ソースコードなどの説明は今後．
# 参考
https://www.csie.ntu.edu.tw/~cjlin/libsvm/