OmniAICreator/Qiita-1.07M huggingface dataset:
StoryboardでTableViewを使う（UITableViewカスタムクラス不使用

## 悩み
`UITableView`を使っているとき、小手先のDelegate実装やらUITableViewControllerなどのおかげで、
いつも以下のようなことを考えもやもやしていた。

- `UITableViewDataSource`の実装をしたいのであって、`UITableView`や`UITableViewController`を触りたいわけじゃない。
- そして`UITableViewDataSource`のコードしか実質書いてない。
- 分割したい
- これはおかしい。あるべきものはあるべきところへ収まらなければならない。
- 分割したい分割したい分割したい
- せっかく`UITableViewDataSource`を`UIViewController`から分離したのに、結局`init`で`dataSource`のためにインスタンスを生成するだけの`UIViewController`カスタムクラスを書いている。
- こんな無駄なクラスは抹消しなくてはならない。
- 削除したい削除したい削除したい

ということでStoryboardできちんとOutletを貼って、必要十分なクラスでTableViewを使いましょう。

## 手順

### プロジェクトの作成
- シングルビュープロジェクトを作成する

### TableViewを配置する
- `Main.storyboard`を開き、デフォルトで存在する`ViewController`に`TableView`を配置する

![スクリーンショット 2017-06-02 19.52.15.png](https://qiita-image-store.s3.amazonaws.com/0/42032/811281eb-8b12-5eeb-a935-15df3e312c88.png)

### TableViewCellを配置する
- `TableView`に`TableViewCell`を追加する。
- cellの`Identifier`には`cell`をセットする

![スクリーンショット 2017-06-02 19.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/42032/18ab0e25-63c3-d568-5028-b6613d9da230.png)

### UITableViewDataSourceを実装する
- `UITableViewDataSource`を実装した`NSObject`のカスタムクラスを作成する

例として、８時、９時、１０時をそれぞれ１５分刻みにセルで出力する。

```swift

import UIKit

class DataSource: NSObject, UITableViewDataSource {
    let sections = [8, 9, 10]
    let rows = [0, 15, 30, 45]
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        let hour = sections[section]
        return String(format: "%02d:00〜", hour)
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return rows.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        let hour = sections[indexPath.section]
        let minute = rows[indexPath.row]
        cell.textLabel?.text = String(format: "%02d:%02d", hour, minute)
        return cell
    }
}
```

### StoryboardにDataSourceを追加する
`Object`を`ViewController`に追加する

![スクリーンショット 2017-06-02 20.05.13.png](https://qiita-image-store.s3.amazonaws.com/0/42032/c66f29ad-621c-0776-ca50-aa4b3bd66128.png)

そして、`Object`のカスタムクラスに`DataSource`を指定する。

![スクリーンショット 2017-06-02 20.05.50.png](https://qiita-image-store.s3.amazonaws.com/0/42032/3e770363-f861-a3b1-f874-7bacaec5c77a.png)

### TableViewとDataSourceを繋ぐ
`TableView`を右クリックしてメニューを開き、`dataSource`のOutletを`DataSource`オブジェクトを繋ぐ。

![スクリーンショット 2017-06-02 20.06.17.png](https://qiita-image-store.s3.amazonaws.com/0/42032/9979f490-d021-cab6-c5b9-4edbf97f8fec.png)

### 実行する
ビルドして動作が確認できれば完成。

<img width="320" alt="Simulator Screen Shot 2017.06.02 21.13.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/42032/0139b6dd-17b2-d4f0-1700-29490af1a442.png">

`UITableView`のカスタムクラスなんていらなかったのだ。
`UITableViewDelegete`も同じ要領で実装できる。
愛は金よりも重い、そう Kotlin ならね

なんか [金は愛よりも重い - Qiita](http://qiita.com/Momiji0223/items/f4c47d90be59fca8585b) という悲しい話題を見てしまいましたが、 Kotlin ならそんな悲しい現実も覆すことができます。

Kotlin は Web ブラウザ上で簡単にコードを実行できる[ツール](https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt)が公式から出されているので、それを使って問題のコードを実行してみましょう。

![kotlin_kane_ai.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/e62f8153-087d-407c-cf70-5ecc7e28daf8.jpeg)

素晴らしい！　Kotlin なら「愛」は「金」よりも重くなることが証明されました！

<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

## 説明
上のコードは、スクロールで見えなくなっているところも合わせると次のようになっています。

```kotlin
fun main(args: Array<String>) {
    println("'金' < '愛' = " + ("金" < '愛'))
    println("'愛' < '金' = " + ("愛" < '金'))
}



operator fun String.compareTo(c: Char) = c.toString().compareTo(this)
```

はい、 `String` に `compareTo()` を生やして大小比較を逆転させています、ごめんなさい。

Kotlin には演算子オーバーロードがあり、 `<` は `compareTo()` メソッドの実行に置き換えられます。
また、 Kotlin には拡張関数という、既存のクラスにメソッドを追加できる（ように見える）仕組みが用意されています。

つまり、 `String` に比較結果を逆転させる `compareTo()` メソッドを拡張関数で追加すれば、上のようなあべこべの結果を出すことができます。

しかし、 `String` にはすでに `compareTo(String)` という `String` 同士で比較しあうメソッドが定義されています。
拡張関数で追加したメソッドと同じシグネチャのメソッドが既にクラスに存在する場合、そのメソッドを実行しても拡張関数の方は実行されず、オリジナルのメソッドが必ず実行されます。

```kotlin:比較を逆転するよう拡張関数をcompareTo(String)で定義しても
fun main(args: Array<String>) {
    println("'金' < '愛' = " + ("金" < "愛"))
    println("'愛' < '金' = " + ("愛" < "金"))
}

operator fun String.compareTo(s: String) = s.compareTo(this)
```

```text:実行されるのはオリジナルのcompareTo(String)なので、つらい現実が突きつけられる
'金' < '愛' = false
'愛' < '金' = true
```

ただ、拡張関数はオーバーロードは問題なく動きます。
そして、幸いにも？ `String` には `compareTo(Char)` のメソッドは[定義されていません](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/)。

そこで、 `compareTo(Char)` のメソッドを拡張関数で定義し、 `String` の `"金"` と `Char` の `'愛'` を比較することで、上のような結果を得ることができます。

以上、 Kotlin の拡張関数の間違った使い方でした。
Ruby で refinements で mixin したメソッドから別のメソッドを呼び出す

[ブログ記事](http://secret-garden.hatenablog.com/entry/2016/02/06/000000)からの転載です。

さて、Ruby では refinements 内で mixin したメソッド内から同モジュールのメソッドを呼び出すことはできません。

```ruby
module Homu
	def homu
		p "homu"
	end

	def mami
		homu
	end
end

module ObjectEx
	refine Object do
		include Homu
	end
end

using ObjectEx

obj = Object.new
obj.mami
# => undefined local variable or method `homu' for #<Object:0x0000000271e510> (NameError)
```

## [解決]

`UnboundMethod` を経由することで `mixin` したモジュールのメソッドを呼び出すことができます。

```ruby
module Homu
	def homu
		p "homu"
	end

	def mami
#		homu
		# UnboundMethod を経由してメソッドを呼び出す
		Homu.instance_method(:homu).bind(self).call()
	end
end

module ObjectEx
	refine Object do
		include Homu
	end
end

using ObjectEx

obj = Object.new
obj.mami
# => "homu"
```

これ、もっとスマートな方法ありますかね
Tips : [Python] 特定の文字列を含まない行だけを抽出する

目的
--


　特定の文字列を含まない行だけを抽出します。

ポイント
--

　このような時はpythonの```in```が便利です。

　ある文字列Aに文字列Bが含まれているかどうかは以下の構文で判定できます。

```py3
[文字列B] in [文字列A]
```

　戻り値は論理値です。

実例
--

　```in```を使って特定の文字列を含まない行だけを抽出します。

　例えば、以下の文章から特定のワードを含まない行のみを取得したいとします。

```txt:example.txt
机の上にりんごがあります。
机の上にリンゴがあります。
There is an apple on the table.
机の上にばなながあります。
机の上にバナナがあります。
There is a banana on the table.
```

　除外したいワードのリストは以下のものとします。

```txt:filter.txt
りんご
apple
バナナ
```

　そのような場合のスクリプトは以下のようになります。

```py3:fitrHavingLine.py
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

"""
参照ファイル上のデータを含まない行を出力する。
"""
__author__  = "Kazuki Nakamae <kazukinakamae@gmail.com>"
__version__ = "0.00"
__date__    = "2 Jun 2017"

import sys

def fitrHavingLine(infn,reffn,outfn):
    """
    @function   fitrHavingLine();
    参照ファイル上のデータを含まない行を出力する。
    @param  {string} infn :   入力ファイル
    @param  {string} refdir :   参照ファイル
    @param  {string} outfn :   出力ファイル
    """

    inf = open(infn, 'r')
    for infline in inf:
        isNothing = True
        ref = open(reffn, 'r')
        # 参照ファイル上の文字列が存在すれば判定をFalseにする
        for refline in ref:
            if refline.strip() in infline:
                isNothing=False
                break
        ref.close()
        if isNothing:
            outf    =   open(outfn, 'a')
            outf.write(infline)
            outf.close()
    inf.close()


if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)

    if (argc != 4):   # 引数チェック
        print("USAGE : python3 fitrHavingLine.py <INPUT FILE> <REFERENCE FILE> <OUTPUT FILE>")
        quit()

    fitrHavingLine(argvs[1],argvs[2],argvs[3])
quit()

```

　bash に以下を入力します。

```bash
python3 fitrHavingLine.py example.txt filter.txt out.txt
```

　出力は以下の通りになります。

```txt:out.txt
机の上にリンゴがあります
机の上にばなながあります
There is a banana on the table.
```
　
おわりに
--

```
if refline.strip() in infline:
                isNothing=False
                break
```
　の部分をいじれば逆に特定の文字を含む行や、あるいは特定の行のみを加工することが可能でしょう。

　csv ファイルなどで多様な項目が存在するデータを捌く際に便利かもしれません。

　以上です。ありがとうございました。
無から始めるKeras 第3回

無から始める Keras のもくじは[こちら](http://qiita.com/Ishotihadus/items/6ecf5684c2cbaaa6a5ef)

# 前回のおさらい

[前回](http://qiita.com/Ishotihadus/items/d47fc294ca568536b7f0)は雑なデータセットを作って雑に学習させた。

入力は 5 次元で、要素がそれぞれ 0 以上 1 未満。出力は 1 次元で、入力の要素の和が 2.5 以下だったら -1、2.5 より大きかったら 1。いわゆる「2 クラス分類」をする。

データセットは以下のように作った。出力の方は 0 or 1 にしてから 2 をかけて -1 している（-1 か 1 になる）。

```py3
data = np.random.rand(250,5)
labels = (np.sum(data, axis=1) > 2.5) * 2 - 1
```

モデルは以下のようにした。活性化関数には -1 から 1 を値域としてとれる tanh を使って、損失には符号に対してよく利くヒンジ損失を使った。

```py3
model = Sequential([Dense(20, input_dim=5, activation='tanh'), Dense(1, activation='tanh')])
model.compile('adam', 'hinge', metrics=['accuracy'])
```

# Sequential モデルとは

[第 1 回](http://qiita.com/Ishotihadus/items/c2f864c0cde3d17b7efb)でも述べたように、Sequential モデルは単純に、今の層のそれぞれのノードに、前の層の全ノードから矢印を引っ張ってくるイメージである。
確かにこれでもニューラルネットワークとして機能するのだが、ちょっとおもしろくない。

これを解決するのが Functional API である。なんか 2 つのニューラルネットワークの出力を入れてみたり、レイヤーを共有してみたりと、結構複雑なことができるようになる。

# Functional API とは

前回と同じ形のニューラルネットワークを作ってみよう。
同じ形なので作るのが無意味な雰囲気がするが、そこは練習である。

Functional API は簡単に言えば「矢印のつなぎ方をぐちゃぐちゃにできる」ものである。Sequential モデルでは A → B → C という形でしかできなかった。
でも Functional API では

A
　↘
　　C → D → E
　↗
B

みたいなことができるようになる。今回はやらないけど。

# Functional API を使う

## 入力層

まずは入力の層。

```py3
from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(5,))
```

この Input という名前の層なのだが、残念ながらドキュメントがない。

`shape` は入力の次元を表している。
`(5,)` という表記は Python を知らないとなんやねんという感じだが、ただ単純に 5 という要素だけもつ Tuple（配列みたいなもの）である。カンマがあるので複数要素があるように見えるが、要素は 1 個である。カンマがないとただの数値と見分けがつかないからなのだが、本当にクソ記法だと思う。Python はこういうところが嫌い。

## 隠れ層

```py3
x = Dense(20, activation='tanh')(inputs)
```

ノード数が20で、入力が `inputs` であるような層。

dense は「密な」という意味だが、前の層のすべてのノードから、この層のすべてのノードに対して、すべての矢印を引っ張るので、そういう意味で密なんだと思う。

## 出力層

```py3
predictions = Dense(1, activation='tanh')(x)
```

こちらは隠れ層とほぼ同じ。説明はいらないでしょう。

# Functional API の意味付け

Functional（関数型）というのはどういうことか。

よく見ると `Dense` はそのインスタンスを関数呼び出ししていることがわかる。
ドキュメントには、レイヤーのインスタンスを関数呼び出しすると、テンソルが返ると書いてある。

そもそもニューラルネットワークというのは、おおよそテンソル積（もっと単純化すれば行列積）である。
入力ベクトルに行列をかけて、さらに行列をかけて……というのがそもそもの本質になる。
1 回層を通り抜けることが、1 回行列をかけるのとだいたい同じ意味になる。
その行列（テンソル）をかけ合わせるイメージを、関数呼び出しと照らし合わせている。

関数呼び出しをすると、入力したテンソルが、指定した意味合いをもって変形されて、またテンソルとなって出力される。そういう感じのイメージでとらえるとわかりやすい気がする。

まったく厳密なことを言っていないのでアレだけど。

ちなみに `Input` レイヤーだけはそもそもテンソルが返ってくる（ので関数呼び出しがいらない）。

# 今回のプログラムまとめ

```py3
import numpy as np
from keras.layers import Input, Dense
from keras.models import Model

data = np.random.rand(250,5)
labels = (np.sum(data, axis=1) > 2.5) * 2 - 1

inputs = Input(shape=(5,))
x = Dense(20, activation='tanh')(inputs)
predictions = Dense(1, activation='tanh')(x)

model = Model(input=inputs, output=predictions)
model.compile('adam', 'hinge', metrics=['accuracy'])
model.fit(data, labels, nb_epoch=150, validation_split=0.2)

test = np.random.rand(200, 5)
predict = np.sign(model.predict(test).flatten())
real = (np.sum(test, axis=1) > 2.5) * 2 - 1
print(sum(predict == real) / 200.0)
```

書き方以外は第 2 回とまったく同じなので、ほぼ同じ精度が出ると思う。
連番PNGアニメーション用@mixin



```scss:sprite-image.scss
/*
$koma: コマ数
$animation-name: ユニークな名前（keyframesの上書き防止）
*/
@mixin sprite-image(
  $animation-name, $url, $w, $h, $koma, $duration:2000ms,
  $iteration:infinite, $direction:normal, $layout:vertical
) {
  @if $layout == horizontal{
    height: $h + px;
    width: 0;
    padding-left: $w + px;
    background-size: auto $h + px;
    &.active{
      animation: $animation-name $duration steps($koma) $iteration $direction;
    }
    @keyframes #{$animation-name}{
      0%    { background-position: 0 0; }
      100%  { background-position: (- $koma * $w + px) 0; }
    }
  } @else {
    height: 0;
    width: $w + px;
    padding-top: $h + px;
    background-size: $w + px auto;
    &.active{
      animation: $animation-name $duration steps($koma) $iteration $direction;
    }
    @keyframes #{$animation-name}{
      0%    { background-position: 0 0; }
      100%  { background-position: 0 (- $koma * $h + px); }
    }
  }
  animation-fill-mode: forwards;
  overflow: hidden;
  background-position: 0 0;
  background-image: url($url);
}
```

```scss
// 使用例
.horizontal{
  @include sprite-image(
    horizontal_pc,'../img/sprite_horizontal.png',
    708,455,33,3s,1,horizontal,alternate
  );
}
```

まあ、verticalでanimation-direction:normal;のやつがいいね。



> 参考
スプライトの作り方
http://qiita.com/mo4_9/items/e34d220402ecda7621ef
1フィールド目のみダブルクォートを削除し出力

半角スペース区切りの文字列に対し、
1フィールド目のみをダブルクォート削除し全体を出力
という処理について、
awkなりsedなりですぐ出来るだろうという印象を抱いたものの
よくよく考えてみるといまいちパッと手法が思いつかなかった。

そしてなんとなくで書いたのがこれ。

```bash
awk 'BEGIN{FS=" "}{gsub(/\"/,"",$1);for(i=1;i<=NF;i++)printf $i" " }' 
```

処理の内容の割りに長ったらしいように見えてしまう。
もうちょっと考えてみよう。。。
Jekyll + Netlify でのリダイレクト

タイトルのそのまま

# Netlify でのリダイレクト設定

ドキュメント
https://www.netlify.com/docs/redirects/

リダイレクトルールを書いた `_redirects` というファイルを置けばいいのだけど、ビルドコマンドを使ってるときは **公開用の** ディレクトリに設置しないといけない。リポジトリのルートでは不十分で、ここにハマる。
どうも、_（アンダーバー）で始まるファイルはビルド時に公開用のディレクトリにコピーされない模様。

# 結論：明示すればいい

参照
https://github.com/thejameskyle/netlify-redirects/blob/master/_config.yml

`_config.yml` で以下のようにincludeでコピー（ビルド）するよう明示しておく。

```yaml:_config.yml
include:
  - _redirects
```
System Trading 参考リンク一覧

## アルゴリズム取引のシステムを開発・運用してみて分かったこと

https://www.slideshare.net/amedama/ss-72296136


## さくらVPS 入門 Dot Install
http://dotinstall.com/lessons/basic_sakura_vps/8001#_=_


## VPS上に、Python をインストールする方法

http://weblabo.oscasierra.net/python3-centos7-yum-install/


## Heroku で定期的なクローラー作成 by using clockwork (ruby library)

http://blog.takuros.net/entry/20130319/1363671409


## Linux の cron で最低分単位で繰り返し実行する方法

http://make.bcde.jp/raspberry-pi/%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%9F%E6%99%82%E9%96%93%E3%81%AB%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B/

## Python の sleepモジュールで 最小単位ms ごとに繰り返し実行する。
http://www.sejuku.net/blog/21474

## Sleep モジュール無限ループ版
http://qiita.com/7of9/items/e30ed3b1558db99eed4d

でも実際、プログラムの一部分を sleep関数で繰り返し処理させるよりも、Linux の cron でプログラム全体を繰り返し処理させたほうがいいな。ただ、cron だと最低単位が'分' っていうのが気になるところ。なにかおすすめ知っている人いらっしゃいましたら、ご教授願います。 
でも、きっと、ticker とかもろもろ全部の function とか作っちゃって、sleep ループの中に全部入れちゃうっていうのもありかも。
ヘッドレスchrome で特定ID部分のキャプチャ

http://qiita.com/hai/items/522f2596734c9fef99c8
にてphantomjs で実装していたのだが、svgのmask関連が上手く表示できておらず、
泣く泣くコードを捨てて ヘッドレスchrome　で実装しました。node,js関連でかなりハマりましたので共有します。

https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja
Lighthouse の ChromeLauncher を使う

を参考にCentosにyumで入れ実行したが上手く値が取得できない。
小1時時間ほど悩んでログが/tmp/lighthouse.****
に出ていることを発見し原因が判明。

lighthouse/lighthouse-cli/chrome-launcherが見ているchromeがstableのため、stableは現在ver58のためheadlessは非対応。
bataでver59 を入れてstableはアンインストールしたが挙動は変わらず。。
/etc/alternatives/google-chrome -> /usr/bin/google-chrome-beta

になっているにもかかわらずgoogle-chrome-stableの方を直に見ているらしく、betaを参照できない。
仕方がないので、無理やりln -s /usr/bin/google-chrome-beta google-chrome-stable
にてようやくChromeLauncherが正常動作。

キャプチャに関しては、
https://medium.com/@dschnr/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a

を参考に座標、サイズを取得して位置を決めてscreenshopを実施。

```
const {root: {nodeId: documentNodeId}} = await DOM.getDocument();
const {nodeId: frontNodeId} = await DOM.querySelector({selector: '#hogehogeID',nodeId: documentNodeId,});
const {model: {height:frontHeight,width:frontWidth,content:[frontX,frontY]}} = await DOM.getBoxModel({nodeId: frontNodeId});
await Emulation.setVisibleSize({width: frontWidth, height: frontHeight});
await Emulation.forceViewport({x: frontX, y: frontY, scale: 1});
```
PyCharmのオートコンプリート機能が次の語を上書きしないように入力する方法

PythonのIDE、[PyCharm](https://www.jetbrains.com/pycharm/)はとても使いやすく愛用しています。

PyCharmの賢いオートコンプリート機能は、コードの編集中に候補の語を列挙してくれて便利ですが、選択した後にTabキーで確定させると、カーソルの直後に既に続けて文字列がある場合、その文字列を上書きしてしまいます。

上書きではなく、続く文字列の前に選択した語を挿入したい場合、Enterキーで確定させるとよいようです。普段からEnter派の人には何でもない情報ですが、Tabばかり使っていたのでなかなか気づきませんでした。
Qiitaで可換図式を描く

$\require{AMScd}$
# 方法
QiitaはMathJaxを使用しているのでAMScdを使って図が描ける。記事の最初に\$\\require{AMScd}\$と書くことでAMScdが使用できる。

>
\`\`\`math
\begin{CD}
F(B) @>F(f)>> F(A) \\
@VbVV @VaVV \\
B @>f>> A
\end{CD}
```

と書くと以下の図が表示される。詳しい使い方はAMScdで検索してほしい。

```math
\begin{CD}
F(B) @>F(f)>> F(A) \\
@VbVV @VaVV \\
B @>f>> A
\end{CD}
```
ServiceNow アプリケーションを作成する その１

今回よりServiceNowに自作のアプリケーションを構築して行く。本記事では以下の内容を扱う。
> - ServiceNowのアプリケーションモデル
> - カスタムアプリケーションの新規作成（空アプリケーション）

作業を行うインスタンスのビルドタイプはIstanbul。

また本記事はServiceNow DeveloperサイトのTrainingを元に作成している。
> - https://developer.servicenow.com/app.do#!/training/landing

# ServiceNow is SaaS and PaaS

　ServiceNowはITSMのSaaSとしてスタートしましたが、2011年頃(?)からアプリケーション開発基盤としての機能を拡充してきました。そのため独自のアプリケーションをServiceNow上に構築することができます。個人的には同一プラットフォームというメリットは、インシデントとの連動やPDCAサイクルの定型化、全体的な分析が可能な点として現れているかなといった感じです。またSalesforceの開発をした方だと分かりやすいかと思いますが、ビジュアル的にテーブルやワークフローの設定などが可能なためレガシーシステムの開発に比べて開発工数はずいぶん短く出来ると思います。
　底辺SEがこれ以上書くと何言ってんだこいつ状態になるので、早速ServiceNowのアプリケーションに取り掛かろうと思います。

# ServiceNowのアプリケーション

アプリケーションモデル
![image.png](http://wiki.servicenow.com/images/6/65/Application_model.png)

アプリケーションは基本的に独立となるように作られます。具体的には、アプリケーションの名称やアプリケーションが使うテーブル、UI、ワークフロー、WebServiceなどが一纏まりになっています。2015年にリリースされたFujiからは、このアプリケーションをServiceNow Storeで販売することが可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/7f79081b-9031-5841-edac-80d1b646985e.png)

今回（今後の記事含めて）では、アプリケーションの作成からテーブルの用意、画面、ワークフローの設定、JavaScriptによるフロント処理の実装、セキュリティの設定を行います。

# アプリケーションの作成

インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーション一覧の中から、システムアプリケーション → アプリケーションを選択（<font color="red">赤枠</font>）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/a14a02c4-ff7a-a249-5afa-cd05a5d1c62d.png)

またはログイン直後のシステム管理画面から遷移。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/f39addff-e42a-1079-41b0-a92ee157f2c2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/c6f35a1f-5cb2-475d-026b-91adecc529ee.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/6e8431fa-c93d-11d2-be56-955cf51efe53.png)

「**最初から開始(－横の作成ボタン)**」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/8dccf7f5-2fea-2970-05fd-369d039719f0.png)

アプリケーションの名前およびアプリケーションスコープを設定し、「**作成**」ボタンをクリック。
※ アプリケーションスコープは最初次のように表示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/f8288a33-3720-39da-4750-7b824f8290ca.png)

このうち前部分（私の場合は「x_109995_」）までは書き換えずにそのまま使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/0df84433-8f55-6549-1886-1309302a935e.png)

「**作成**」ボタンをクリックすると確認画面が表示されるので「**OK**」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/2ed1449b-d9af-9c2c-38f1-a968a140388f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/d6c05afd-3458-0607-b5b8-0656ba077bcc.png)

以上でカスタムアプリケーションが作成されました。

# Next
次回はアプリケーションにテーブルとカラムを追加する方法について記載する予定です。
> - [ServiceNow アプリケーションを作成する その２](http://qiita.com/Kisaragi13/items/cd2eb97100c103a675ef)

# 参考サイト
> 『ServiceNow Developers ― Training』
https://developer.servicenow.com/app.do#!/training/landing
> 『ServiceNow Wiki (Product Documentation)』
http://wiki.servicenow.com/index.php?title=Applications
functionの外の変数を中で使う


`query` を `infoWhere` としてfunctionの中で使いたい時。

```php
        $query = $this->orgModel->with("info")->where($where);
        $query->whereHas("info", function ($query) use ($infoWhere) {
            foreach ($infoWhere as $key => $value) {
                $query->where($key, $value);
            }
        });
```
2017-06-02 linux > modファイルがどのバージョンのGFortranで生成されたか確認する

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS。

[CentOS / NetCDF > yum installでインストールした状況 > 関連ファイルの表示](http://qiita.com/7of9/items/b2d30a98b49911968cd0)でインストールした`netcdf.mod`がどのバージョンのGFortranで生成されたかを確認する。

```
$ head /usr/lib64/gfortran/modules/netcdf.mod 
GFORTRAN module version '0' created from netcdf4.f90 on Thu Jan 30 05:31:35 2014
MD5:a5d60d449ffe68cce8d8987e54f11e87 -- If you edit this, you'll get what you deserve.

(() () () ()
() () () () () () () () () () () () () () () () () () () () () () ())

()

(('nf90_def_var' 'netcdf' 2 3 4) ('nf90_get_att' 'netcdf' 5 6 7 8 9 10
11 12 13 14 15 16 17) ('nf90_get_var' 'netcdf' 18 19 20 21 22 23 24 25
```

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54797
> ```
Which version of gfortran?  With version 4.4.x and above 
you should have a version number.
.
% gfc44 -c a.f90 && head -1 a.mod
GFORTRAN module version '0' created from a.f90 on Wed Oct  3 12:50:55 2012
% gfc45 -c a.f90 && head -1 a.mod
GFORTRAN module version '4' created from a.f90 on Wed Oct  3 12:51:00 2012
% gfc46 -c a.f90 && head -1 a.mod
GFORTRAN module version '6' created from a.f90 on Wed Oct  3 12:51:04 2012
% gfc47 -c a.f90 && head -1 a.mod
GFORTRAN module version '9' created from a.f90
% gfc4x -c a.f90 && head -1 a.mod
GFORTRAN module version '9' created from a.f90
```

`GFORTRAN module version '0'`からversion 4.4系で作成されていることが分かった。
Laravel(Eloquent)でSingle Table Inheritance (STI) を実現する


LaravelにはSTIがない。[ポリモーフィック関連](https://laravel.com/docs/5.4/eloquent-relationships#polymorphic-relations)(Polymorphic Relation:PR)はある。PRがあればSTIが不要だと考えているのかLaravel 4の頃からずっと提供されていない。ググればStackOverflowなどにLaravel + STIの質問が見つかるし、プラグインもいくつかGithubに公開されているのでそれなりのニーズはありそうなんだが。

STIがないと関連モデルをサブタイプにすることができない。

例えば

1. [店舗]に複数の[会員]が所属している
2. [店舗]に[スタッフ]が所属している
3. [スタッフ]は自店舗の[会員]を閲覧できる
4. [本社スタッフ]は全店舗の[会員]を閲覧できる

DBには `staffs` テーブルと `stores` テーブル、`members` テーブルがある。
本社スタッフは[スタッフ]のID:1として登録されていて、本社は[店舗]のID:1として登録されている。本社スタッフと店舗スタッフは同じ[スタッフ]だが振る舞いが違うので継承して扱いたい。
以下のようなコードになるとうれしい。


```php
// 本社スタッフは全会員を取得できる
$employee = Staff::find(1); // ID:1は本社スタッフ
$allMembers = $employee->store->members()->get();

// スタッフが所属する店舗の会員を全部取得
$staff = Staff::find(123); // ID:123は店舗スタッフ
$storeMembers = $staff->store->members()->get();
```

これをそのままモデルとして実装するとこうなる。

```php
// スタッフモデル
class Staff extends Model
{
  // スタッフは店舗に所属している
  public function store() {
    return $this->belongsTo('Store');
  }
}

// 店舗モデル
class Store extends Model
{
  // 店舗内の会員を取得する
  public function members() {
    return $this->hasMany('Member', 'store_id');
  }
}
// 本店は店舗を継承する
class CentralOffice extends Store
{
  public function members() { // override Store::members()
    return Member::query(); // hasMany() の変わりに絞り込みなしのクエリを返す
  }
}

```

ここまでくれば `Store` と `CentralOffice` を直接インスタンス化して希望通りの会員が取得できる。だが `Staff` 経由ではまだ取得できない。

```php
// 全店舗の会員が取得できる
$allMembers = (new CentralOffice())->members()->get();
// 店舗ID:123の会員だけ取得できる
$members = (new Store(['id' => 123]))->members()->get();

// こっちはまだ動かない。$staff->storeがCentralOfficeモデルにならない。
$members = Staff::find(1)->store->members()->get();
```

`$staff->store` のインスタンス化をフックして、店舗IDが1のときは `CentralOffice` を、1以外のときは `Store` のインスタンスを返すようにすればこのコードが動くようになる。

Eloquentは関連モデルのインスタンス化を `Model::newFromBuilder()` に集約している。ここでIDの値を確認してインスタンス化するモデルを `CentralOffice` に変更できる。

```php
// Storeモデル
public function newFromBuilder($attributes = [], $connection = null)
{
  $attributes = (array) $attributes;
  if (isset($attributes['id']) && $attributes['id'] === 1) {
    $model = (new CentralOffice())->newInstance([], true); // CentralOfficeを使う
  } else {
    $model = $this->newInstance([], true); // Storeを使う
  }
  // 親クラスからコピーした処理
  $model->setRawAttributes($attributes, true);
  $model->setConnection($connection ?: $this->getConnectionName());
  return $model;
}
```

`Store::newFromBuilder()` の処理を置き換えてやることで `$staff->store` にアクセスしたときにIDに従って適切なクラスが設定されるようになった。

ここまでくれば以下のコードが動くようになる。

```php
$allMembers = Staff::find(1)->members()->get();
$storeMembers = Staff::find(123)->members()->get();
```

今回はidフィールドの値によってモデルを切り替えたがこの判別はなんでもいい。`type` フィールドを用意してクラス名を入れておけばRailsのSTIと同じようできる。


[PoEAAの例](https://www.martinfowler.com/eaaCatalog/singleTableInheritance.html)のように Player クラスのサブクラスに別々のフィールドを持たせたいわけではないので厳密には STI と呼ばないのかもしれない。
Windows エクスプローラー、7-Zip でファイル名を UTF-8 エンコードした ZIP ファイルを文字化けせずに解凍するためには ZIP ファイル内で EFS が有効にされている必要がある？

Java プログラムでファイル名のエンコードを UTF-8 指定で圧縮した ZIP ファイルを、Windows エクスプローラーや 7-Zip で解凍したところ、ファイル名が文字化けした際の調査メモです。

## 事象

[Zip4j](http://www.lingala.net/zip4j/)でファイル名を UTF-8 で ZIP 圧縮しました。

この ZIP ファイル内は以下のファイル構成になっています。

```
files
    ああああ.txt
```

ですが、このファイルを Windows 10 のエクスプローラーや 7-Zip で解凍を試みたところ、この「ああああ.txt」が「縺ゅ≠縺ゅ≠.txt」に文字化けしてしまいました。

その ZIP ファイルをバイナリエディタで開いた結果がこちらです。

![no-efs-binary.png](https://qiita-image-store.s3.amazonaws.com/0/10443/cccf7228-a86f-a080-e39f-cbca43cc459c.png)

右側の表記は UTF-8 で表示させてみた内容であり、「ああああ.txt」が確認できることから、正常に UTF-8 で ZIP 内に書き込まれているようです。

## EFS(Language encoding flag)とは？

ZIP の仕様が書かれている [APPNOTE.txt](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)を確認したところ、EFS(Language encoding flag) というものがありました。

APPNOTE.txt から引用すると、以下のように記載されています。

```
Bit 11: Language encoding flag (EFS).  If this bit is set,
        the filename and comment fields for this file
        MUST be encoded using UTF-8. (see APPENDIX D)
```

要約すると、このフラグが有効の場合はファイル名やコメントは UTF-8 でエンコードしなければならないとのことです。

EFS はローカルファイルヘッダとセントラルディレクトリヘッダの汎用目的ビットフラグ(general purpose bit flag)で設定します。
前述のスクリーンショットの赤枠が該当箇所です。

すべて 0 になっていることから Zip4j が圧縮した ZIP ファイルには EFS は設定されていないようです。

## 実験

自分は Windows のエクスプローラーや 7-Zip はこの EFS が有効の際は UTF-8 として判断して解凍する実装になっているのではという仮説を立てました。

そこで該当ZIPファイルをバイナリエディタで EFS を有効にしてみることにしました。

仕様書には 11 と記載されているので、右から 0 からカウントを始めて 12 番目を 1 にしました。

```
0000 1000 0000 0000
```

ZIP はリトルエンディアンなので順序を変更します。

```
0000 0000 0000 1000
```

16進数に変更します。

```
00 08
```

結果、以下のスクリーンショットのように、マルチバイト文字を使っているファイル名のローカルファイルヘッダとセントラルディレクトリヘッダの汎用目的ビットフラグを「00 08」に上書きしてみました。

![efs-binary.png](https://qiita-image-store.s3.amazonaws.com/0/10443/da528746-858f-7478-b9ac-a4c888a95ca9.png)

その結果、Windows 10 のエクスプローラーと 7-Zip で解凍を試みたところ、文字化けせずに解凍することに成功しました。

このことから、Windows 10 のエクスプローラーと 7-Zip は EFS が有効であればファイル名は UTF-8 として解凍する実装になっているのではと考えています。

## 補足

* なお、Windows 7 のエクスプローラーは[更新プログラム](https://support.microsoft.com/ja-jp/help/2704299/japanese-characters-in-file-names-are-displayed-as-garbled-text-after-you-decompress-a-.zip-file-in-windows-7-or-in-windows-server-2008-r2)を適用しないと、UTF-8 のファイル名である ZIP ファイルの解凍に対応していないそうです。
今更、Solr3.6.1Quick Start(OSX)

旧バージョンのダウンロードサイトから
http://archive.apache.org/dist/lucene/solr/

apache-solr-3.6.1.tgz 
をダウンロードして展開

apache-solr-3.6.1/example/README.txt
に沿って実行

・起動
java -jar start.jar
・管理画面
http://localhost:8983/solr/admin/
・サンプルドキュメントのインデクシング
  cd exampledocs
  sh post.sh *.xml

・Java8だと管理画面のanalysis.jspがエラーになるのでJava7に切り替えて起動
```
export JAVA_HOME=`/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v "1.7"`
PATH=${JAVA_HOME}/bin:${PATH}
java -jar start.jar
```
hamlでRubyの繰り返し処理をする方法

![OhkEventRails.png](https://qiita-image-store.s3.amazonaws.com/0/32902/a4fce733-1aa9-03a9-23f7-67dee5c4d48b.png)

ブログとかのサイドバーで新着記事など表示することが良くあると思うのですが、取得したデータを繰り返し処理で表示する方法の紹介です。

```haml
        %side.col-lg-3
          .well.sidebar-nav
            %h3 新着記事
            %ul.nav.nav-list
              %li.nav-header
              - @events.each do |event|
                %li= link_to event.title, event.url
```

`-`を付けるとRubyのコードが実行できるので、`@events`を普通に`each`するだけですね。
Computer Vision APIを使って画像分析をやってみた

# はじめに
ちょっと前に機械学習をもっと知りたくて、まずはAPIを触ったので、メモ書き程度に書きたいと思います。

## 前提
ディープラーニングを本格的に研究している代表的な企業が以下。

- Google
- Microsoft
- IBM
- Amazon
- Docomo

## APIの優劣
企業によってAPIの精度が異なるみたいで色々な方の意見を踏まえると、
こんな感じらしいです。

- 画像情報抽出・分類
Microsoft > Google,IBM...

- 文字認識（OCR）
Google > Microsoft,IBM...

# API

## Microsoft Computer Vision

今回画像ということで、一番精度の良いと噂のMicrosoft社のComputer Vision APIを使ってみることにしました。

https://www.microsoft.com/cognitive-services/en-us/computer-vision-api

## Analyze Image

また、その中でもAnalyze Imageというものを使ってみることにしました。

https://westus.dev.cognitive.microsoft.com/docs/services/56f91f2d778daf23d8ec6739/operations/56f91f2e778daf14a499e1fa

# 結果

以下のような感じになりました。

# 検証画像

![640x640_rect_6299664.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/f8267780-224a-fdc3-53ca-01aab92c4722.jpeg)

# 検証結果

```zsh
object(stdClass)#3 (3) {
  ["description"]=>
  object(stdClass)#1 (2) {
    ["tags"]=>
    array(21) {
      [0]=>
      string(4) "food"
      [1]=>
      string(5) "plate"
      [2]=>
      string(6) "indoor"
      [3]=>
      string(5) "table"
      [4]=>
      string(5) "black"
      [5]=>
      string(7) "chicken"
      [6]=>
      string(8) "broccoli"
      [7]=>
      string(4) "meat"
      [8]=>
      string(7) "sitting"
      [9]=>
      string(6) "filled"
      [10]=>
      string(4) "rice"
      [11]=>
      string(4) "cake"
      [12]=>
      string(3) "hot"
      [13]=>
      string(5) "fruit"
      [14]=>
      string(7) "holding"
      [15]=>
      string(4) "bowl"
      [16]=>
      string(4) "dish"
      [17]=>
      string(4) "soup"
      [18]=>
      string(6) "cheese"
      [19]=>
      string(3) "dog"
      [20]=>
      string(5) "white"
    }
    ["captions"]=>
    array(1) {
      [0]=>
      object(stdClass)#2 (2) {
        ["text"]=>
        string(29) "a plate of food with broccoli"
        ["confidence"]=>
        float(0.59819660429909)
      }
    }
  }
  ["requestId"]=>
  string(36) "8df11211-a86c-4c89-a87b-31dfd8e8c9ac"
  ["metadata"]=>
  object(stdClass)#4 (3) {
    ["width"]=>
    int(640)
    ["height"]=>
    int(430)
    ["format"]=>
    string(4) "Jpeg"
  }
}
```

# 感想

(´д｀)

# プログラム

検証に作ったプログラムを載せておきます。

```php
<?php

$url = 'https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Description&language=en';
$file = '{画像パス}';
　
$curl = curl_init();
　
curl_setopt_array(
    $curl,
    array(
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => array(
            'Content-Type: application/octet-stream',
            'Ocp-Apim-Subscription-Key: XXXXXXXXXXXXXXXXXXXXXXXX'
        ),
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS  => file_get_contents($file),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_BINARYTRANSFER => true,
    )
);
　
$response = curl_exec($curl);
curl_close($curl);
　
var_dump(json_decode($response));
```
AWSコストカット大作戦

# AWS

--- 

# サーバ代、決して安くないですよね

---

# 学習コストも安くはない

---

# 下手すると

---

# 破産します

---

# :banana: 

---

現状を見直してコストカットできるかもな方法をご紹介します💰

---

🌏お品書き

- コストエクスプローラー
- Trusted Advisor
- 一括請求(ボリューム割引)
- S3
- EC2 

---

# コストエクスプローラー
サービス毎に月または日毎のサービス使用量をグラフ化。もちろんサービス(EC2やRDS)毎に見れる。


---

![Cost Reports 2017-06-02 09-09-14.png](https://qiita-image-store.s3.amazonaws.com/0/37036/bcf44e76-c311-8255-ac5f-e46cebb6957e.png)

---

1->2->3の順でクリックすれば見れます(3は見たいやつをクリック)

![Billing Management Console 2017-06-02 09-12-47.png](https://qiita-image-store.s3.amazonaws.com/0/37036/a42dd692-92c7-c96b-59d0-531eb67ef334.png)

---

# コストエクスプローラーでまずは現状を把握することから始めましょう🐑

---

# Trusted Advisor
「コスト最適化」、「パフォーマンス」、「セキュリティ」、「フォールトトレーランス」の観点からAWSが自動で精査し、推奨設定を通知してくれるサービス

---

![Trusted Advisor Management Console 2017-06-02 09-24-22.png](https://qiita-image-store.s3.amazonaws.com/0/37036/a28d1de9-25c7-f83c-4b85-bda104c04f2b.png)

---

- 「コスト最適化」はダッシュボードで下記確認可能に
  - EC2 リザーブドインスタンスの最適化
  - 使用率の低いAmazon EC2 Instances
  - アイドル状態の Load Balancer
  - 関連付けられていない Elastic IP Address 
  - アイドル状態の RDS
  - 期限が近づいているリザーブドインスタンス
  - Amazon Route 53 レイテンシーリソースレコードセット
  - 利用頻度の低いAmazon EBSボリューム
  - 利用頻度の低いAmazon Redshift Cluster

---

# 注意点

- 無料で利用できるのはほんの一部の機能のみで、無料枠では残念ながらコスト最適化の項目が使いものになりません…
- `$100`のアップグレードを行えば、項目が利用可能に(パフォーマンスチェックやセキュリティチェックも高機能に)

---

# 一括請求(ボリューム割引)
一括請求を使用した複数アカウントの料金の支払いでボリューム割引が適用可能

---

![BasicDiagram.gif](https://qiita-image-store.s3.amazonaws.com/0/37036/3ad3dd6b-f903-cde5-0003-cc5795e71215.gif)

---

![VolumeDiscount.gif](https://qiita-image-store.s3.amazonaws.com/0/37036/c167f1cf-37b6-59d5-939f-36bca495efab.gif)

---

データ転送量の合計やRI購入額などいろんな部分にボリューム割引がある。
個別のアカウント毎にはボリューム割引を受けられる量を使っていなくても、
一括請求を設定することで全アカウントで合算をもとにボリューム割引が受けられるようになる

---

# S3
言わずと知れたストレージサービス

---

- S3(標準)
- S3(低頻度アクセス)
- Glacier

---

# 違い(ざっくり)
S3(標準)->S3(低頻度アクセス)->Glacier
と右に行くほど
ストレージ価格が安くなり、リクエストや取り出し料金は逆に高くなります。

---

![料金 - Amazon S3 | AWS 2017-06-02 13-37-59.png](https://qiita-image-store.s3.amazonaws.com/0/37036/2916e089-ce1b-2f12-c1de-621c3300195d.png)

---

- 基本的にはS3(標準)
- 巨大なアーカイブデータ(ログなど)はS3(低頻度アクセス)、Glacier

という運用が良さそうです。
リクエストと取り出しの料金帯が複雑なので省きます。ドキュメントを確認してください

---

# 余談
[Amazon Glacierでクラウド破産しないために](http://blog.hde.co.jp/entry/2015/01/30/154101) という記事があるので詳細は省きますが、
Glacierで100GBのファイルを復元しようとすると2万円、何かの間違いで120TBを一気に復元しようとすると2,521万円請求される計算になるらしい(旧価格ですが)

---

# EC2
言わずと知れた仮想サーバー

---

## リザーブドインスタンス

---

# リザーブドインスタンスとは
- 簡単に言うとインスタンス費用の先払いで割引が発生するサービス
- 先払い期間は1年(平均40%割引)と3年(平均60%)の2種類
- 最大75%OFF

---

- 厳密に言うとリザーブドインスタンスの権利
- インスタンスタイプのことではない
- 購入したリザーブドインスタンスと同じインスタンスタイプがあれば、そのインスタンスタイプは自動でリザーブドインスタンスになる

---

# 他EC2のチェックポイント

---
- 旧世代のインスタンスタイプのグレードアップ
  - 新しいほど安くて高性能(m3、m4などは数字が大きい方が新世代)
- 開発環境/stagingの稼働時間見直し(夜間休日は止めるとか)
- オーバースペックなインスタンスのグレードダウン検討
- アプリケーションレベルでの転送量削減(画像・html・js・cssの圧縮、無駄なリクエストの削減など)

など

---

# ありがとうございました
0からわかるPID制御（実装編）

本記事は[「0からわかるPID制御」](http://qiita.com/RyosukeHonda/items/9e5ce2ebdadd90e3db00)の続編となっています．

今回はC++でPID制御を実装し，シミュレータで自動車を走行させてみようと思います．

![pid.gif](https://qiita-image-store.s3.amazonaws.com/0/163685/b0e5d78a-cc1f-645d-81f6-b6649c230fdb.gif)


##問題設定
ある速度で走行している自動車と道路の中心の距離(Cross Track Error:CTE)をハンドル角を制御するだけで小さくすることを目標とします．

![pid.png](https://qiita-image-store.s3.amazonaws.com/0/163685/90f2b842-ad90-248d-f4aa-d883c4d03ba4.png)


##PID制御の実装
PID制御の実装部分となります．ヘッダーファイル，メインファイルは[こちら](https://github.com/RyosukeHonda/PID-Control)を参照してください．


PID制御は以下の式で書くことができます．

```math
steer = K_p cte + K_D \frac{d}{dt}cte + K_I \sum cte
```

```cpp
#include "PID.h"
#include <iostream>

using namespace std;

PID::PID() {} //コンストラクタ

PID::~PID() {} //デストラクタ

void PID::Init(double Kp_, double Ki_, double Kd_) {
  Kp = Kp_; //比例ゲイン
  Ki = Ki_; //積分ゲイン
  Kd = Kd_; //微分ゲイン
}

void PID::UpdateError(double cte) {
  if(!init_d){
    init_d = true;
    d_error = cte;
    prev_cte = cte;
  }else{
    d_error = cte - prev_cte; //cteの変化量
    prev_cte = cte;
  }
  p_error = cte; //現在のcteの値
  i_error +=cte; //cteの合計
}

double PID::TotalError() {
  return -Kp*p_error - Ki*i_error - Kd*d_error; //上式のsteer
}
```
PID制御では
・現在のcte，
・cteの変化量
・cteの合計
を求める必要があり，UpdataErrorの部分で計算をしています．

##パラメータチューニング
PID制御では$K_P$,$K_I$,$K_D$の値を設定する必要があります．様々な方法がありますが，試行錯誤で適切な値を探ることにします．

####ステップ１
$K_I$,$K_D$の値を0とし，$K_P$のみで制御する．
$K_P$の値が小さければ，自動車の振動は小さいものの，目標に達するまで時間がかかります（本シミュレーションの場合はハンドルを切るのが遅くてコースアウトしてしまいます）．逆に$K_P$の値を大きくしすぎると，自動車が目標値を超えて大きく振動してしまいます．小さすぎず，大きすぎない値を見つける必要があります．

####ステップ２
$K_D$に値を入れてみる．次に微分ゲインに数値を入れてみます．$K_D$が小さいとほぼ先ほどと大きくは変わりません．大きくしすぎると，ハンドル角の変化が小さくなりすぎてしまい，制御することできなくなります．適切な値を選ぶと，オーバーシュートが小さくなり，ほぼ目標値に追従して進むようになります．

####ステップ３
本シミュレータでは$K_I$を調整しなくても，制御することはできますが，適切な値を入れると，さらに目標値に近づきます．

##結果
以上によりパラメータチューニングを終えた結果が[こちら](https://www.youtube.com/watch?v=Bg7_N8v0xHQ)となります．
また，動画では自動車のスピードにもPID制御をしており，95MPHを目標値として設定しています．

[![begavioral_cloning.png](https://qiita-image-store.s3.amazonaws.com/0/163685/b96172e1-e016-c25b-fcc9-75db90cdd1e6.png)
](https://www.youtube.com/watch?v=Bg7_N8v0xHQ)




##ディープラーニングの手法との比較
以前にディープラーニングを用いて[このコースを走行させました](https://www.youtube.com/watch?v=HRvNs1jUHmI)．
前回は画像と人間の操作するハンドル角の量を用いてCNNをトレーニングさせたので，本手法と方法が全く異なりますが，比較をしようと思います．


###ディープラーニングによる方法
####欠点
・滑らかな走行ができていない（ジグザグ走行）．
・高速で走行させようとすると，コースアウトしてしまう．
・トレーニングに時間がかかる
####利点
・道路の基準線（車線の中心）を求める必要がない
・未知のコースにでも対応できる


###PID制御による手法
####欠点
・パラメータチューニングが難しい
・道路の基準線（車線の中心）をあらかじめ求めておく必要がある．
####利点
・ディープラーニングの手法よりも滑らかに走行する．
・高速で走行可能


本シミュレータで比較した場合，PID制御の方が実装が簡単でさらに，良い結果も得られました．
ただし，PID制御の場合，CTEを求めるために道路の基準線をあらかじめ求めておく必要があります．
これにはPath Planningという手法を用いなければなりません．一方ディープラーニングでは，Path Planningにより，経路を求めておく必要がありません．

##感想
ディープラーニングの技術進化はめざましいため，今後も様々な手法が提案されていくものだと思われます．
PID制御は古典的な方法でありながらも，問題設定が単純なため良い結果が得られました．
自動運転を実現するためにはディープラーニング等の最先端の手法のみならず，PID制御のような古典的な制御方法も必要であるということがわかりました．


本記事ではPID制御により出力目標値が得られてから，その値を実際に入力するまでの間の時間差は今回考慮していません．しかし，実際の自動車に適応する際には，その時間差が少なからずあります（人間は瞬時にハンドルを目標の角度まで切ることはできないため）．その場合，PIDが上手く機能しないことがあります．将来の出力を予測する手法の一つにモデル予測制御というものがあり，次回はモデル予測制御をこのシミュレータに適応してみようと思います．
[Python3] ApiGateway -> AWSLambdaをローカルで実行


## はじめに
apigateway -> lambdaって作りでアプリケーションを作ることが多くなてきて、
コード書いて、アップロードして、api叩いてデバッグしてってめんどくさい、ローカルでもget postとかで開発したい！
ってことから作りました。
とりあえずクエリーパラメータとjsonを受け取れるところまで！



## apigatewayとlambdaを設定する
他のサイトを参考にしてください

* lambdaはこんなの

![スクリーンショット 2017-06-02 17.28.06.png](https://qiita-image-store.s3.amazonaws.com/0/117920/4cea4d5c-ad04-5e01-192a-1a031568bcab.png "スクリーンショット 2017-06-02 17.28.06.png")



```lambda.py

def handler(event, context):

    res = {}
    res['method'] = event['context']['http-method']
    res['url'] = event['params']['path']
    res['query-string'] = event['params']['querystring']
    res['json-body'] = event['body-json']

    return res
```


* ApiGatewayのマッピングテンプレートはこんな感じ


```ApiGatewayマッピングテンプレート
#set($allParams = $input.params())
{
"body-json" : $input.json('$'),
"base64-body": "$util.base64Encode($input.body)",
"params" : {
#foreach($type in $allParams.keySet())
  #set($params = $allParams.get($type))
"$type" : {
  #foreach($paramName in $params.keySet())
  "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
  #end
}
  #if($foreach.hasNext),#end
#end
},
"stage-variables" : {
#foreach($key in $stageVariables.keySet())
"$key" : "$util.escapeJavaScript($stageVariables.get($key))"
  #if($foreach.hasNext),#end
#end
},
"context" : {
  "http-method": "$context.httpMethod",
  }
}
```


## これをローカルで開発したい！
dockerを使って開発環境を作る
[github](https://github.com/shunsuke-aikawa/apigateway-python-docker)に上げてあります。




#### docker build

```
docker-compose build
```

#### docker run
```
docker-compose up
```


#### lambdaを動かす
localhostの:80にアクセスするとlambda.pyが動きます

```bash
#GET
curl localhost/aaa?a=1

{
    "json-body": {},
    "method": "GET",
    "query-string": {
        "a": "1"
    },
    "url": "/aaa"
}


#POST
curl -H "Content-type: application/json" -X POST -d '{"a":1,"b":2}' localhost/aaa

{
    "json-body": {
        "a": "1",
        "b": "2"
    },
    "method": "POST",
    "query-string": {},
    "url": "/aaa"
}
```



## 今後
urlパラメータも取れるようにします
Jenkins2のPipline参考リンク集

従来のJenkinsに比べて、Jenkins2のパイプライン機能はとても便利。
2017年2月にJenkins2のJenkinsFileの記法がDeclarative Pipeline方式に変更になったこともあり、
JenkinsFileの書き方についての情報はまだ少ない。
あってもScripted Piplineしかない時代の記事だったりする。
Declarative Piplineに対応しているかどうかも整理して、リファレンスやサンプル等のリンクを以下に列挙する。(随時更新）

# リファレンス (Declarative Pipeline対応済)
[公式Pipline概要](https://jenkins.io/doc/book/pipeline/)
[公式リファレンス] (https://jenkins.io/doc/book/pipeline/syntax/#post-conditions)

# 公式系サンプル
## Declarative Pipeline
[公式pipeline-model-definition-plugin](https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Syntax-Reference)
[Cloudbeesのブログ](https://go.cloudbees.com/docs/cloudbees-documentation/use/automating-projects/jenkinsfile/)
[公式github](https://github.com/jenkinsci/pipeline-examples)
## Scripted Pipeline
[pipeline-pluginのチュートリアル](https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md)
[workflow-basic-steps-pluginのチュートリアル](https://github.com/jenkinsci/workflow-basic-steps-plugin/blob/master/CORE-STEPS.md)

# Shared Library参考資料
[公式リファレンス](https://jenkins.io/doc/book/pipeline/shared-libraries/)
[Jenkins.io ブログ](https://jenkins.io/blog/2017/02/15/declarative-notifications/)
[flussoドキュメント](https://ci.flusso.nl/docs/jenkins/global-shared-library/)
[fabric8ioのshared Libraryのソース](https://github.com/fabric8io/jenkins-pipeline-library)

# ノウハウ
[pipline実行時のworkspaceの場所](https://www.selikoff.net/2016/07/10/workspace-jenkins-pipelines/)
[Using Multi-branch Pipelines in the Apache Maven Project](https://www.cloudbees.com/blog/using-multi-branch-pipelines-apache-maven-project)

# 日本語の参考資料
## Declarative Pipeline
[Declarative PipelineでJenkinsfileを書いてみた](http://qiita.com/Takumon/items/e266146c225d07b82c13)
[scriptedとDeclarativeの違い解説](http://www.kaizenprogrammer.com/entry/2017/02/14/230714)

## Scripted Piplineの時の情報
[workflow-pluginのQ&A](http://qiita.com/wadahiro/items/9b1d1c0cb9675dfb63cd)
[Jenkinsfileの書き方](https://blog.mamansoft.net/jenkins2%E3%81%A7%E5%AE%9F%E7%94%A8%E7%9A%84%E3%81%AApipeline%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)
[Jenkinsfile書いてみた](http://kimulla.hatenablog.com/entry/2017/01/31/002055#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AEplugin%E3%82%92%E5%91%BC%E3%81%B6%E3%81%AB%E3%81%AF)
[はてなブログ](http://ngyuki.hatenablog.com/entry/2016/09/02/133947)
[はてなブログ](http://arasio.hatenablog.com/entry/2016/10/19/001944)

## Groovyの基礎
[Groovyチュートリアル](https://koji-k.github.io/groovy-tutorial/variable/index.html)

# 公式ブログ
[cloudbees公式ブログ](https://www.cloudbees.com/blog/categories/Jenkins)
[Jenkins.io公式ブログ（Piplineタグ)](https://jenkins.io/node/tags/pipeline/)
随時更新予定のSQL基礎

# はじめに
SQLも都度調べながら書いてたのですが、毎回同じことしていて（同じ言葉で検索、同じ記事探す、同じコマンド実行する）ほとほと疲れたので、腰を据えてSQLを勉強してみます。
（何事もなあなあにしてはだめなものだなあ）

# 構文
ではでは、いきましょう。

## データベース操作
### データベースを作る
データベースがなければ何も始まりません。

```
create database データベース名;
```

### データベース一覧を確認する
データベースが作られたか、どんなデータベースがあるかを確認する。

```sql
show databases;
```

### データベースを選択する
データベースを選択して、その中のテーブルをあれやこれやするのですね。

```
use データベース名;
```

### データベースを削除する
いらなくなったら消したいですよね。

```
drop database データベース名;
```

## テーブル関連
### テーブルを確認する
データベースを選択したら、そのデータベースにあるテーブルを確認したい（こともあるはず）

```sql
show tables;
```

### あるテーブルのカラムを確認する
データベースのテーブルにどんなカラムがあるかを確認する。

```sql
// すでにデータベースを選択しているとき
show columns from テーブル名

or

// データベースを選択していないとき
show columns from テーブル名 form データベース名
```
【HTML5学習】 Part.8

今回はdiv,span,aタグなどのよく使うもので、まだQiitaに残していなかったものと、sectionなどメモしていたけどほとんど使ったことがないものを残しておきます。

#セクション#
>##section##

>**&lt;section&gt;&lt;/section&gt;** : 文書やアプリケーションの一部分となる、意味や機能のひとまとまりを示す要素。章や節を表すため、h1~h6の見出しが必要になります。
スタイル・レイアウトを変更する場合はdivを使った方が良いので、あまり出番は少ないのではないでしょうか？

>##nav##
>**&lt;nav&gt;&lt;/nav&gt;** : ウェブサイト内の他のページへのリンクや、ページ内リンクなどのナビゲーションであることを示す時に使用する。すべてのリンクに使用するのではなく、主要なナビゲーションとなるセクションのみを囲む使い方が○。

>##article##
>**&lt;article&gt;&lt;/article&gt;** : それ単体で完結する、例えば雑誌の中にあるコラムや特集、ブログで言えばひとつの記事などを示す時に使う。


#コンテンツの分類#
>##div##
>**&lt;div&gt;&lt;/div&gt;** : 「division」の略。divに特別な意味はありませんが、要>素をグループ化したり、レイアウトを構成する時に使う。
>divは他に適切な要素が無い場合の最終手段として使用することが強く推奨されており、 適切な要素があるのに、divを使用していると、 ウェブページのアクセシビリティやメンテナンス性が低下してしまう。
>例えば、ブログには**&lt;article&gt;**、 章の区切りには**&lt;section&gt;**、 ページのナビゲーションには**&lt;nav&gt;**、 フォームグループには**&lt;fieldset&gt;** を使用してマークアップする方が○。
>一方で、divはスタイリング目的の場合や、 class属性・lang属性・title属性などの属性で複数の要素に同じ値をまとめて指定する場合に便利です。

>##pre##
>**&lt;pre&gt;&lt;/pre&gt;** : preで囲んだ範囲は改行や字下げをそのまま表示される。見やすいように半角スペースや改行などで形が整えられたテキスト(例えばポエムとか)に使うと便利。

>```html
<pre>
   料理することと食べることが大好きな、のねずみのぐりとぐらのおはなし。
   森へでかけてどんぐりやくりを集めていると、自分達よりも大きなたまごをみつけます。
   たまごで何を作ろうかあれこれ二ひきで相談し、「あさからばんまでたべてもまだのこるくらいの大きいかすてら」を作ることにしました。
   うちへ帰って材料と道具を持ってくると、大きなたまごを割ってかすてらを作ります。
   二ひきが歌いながら焼けるのを待っていると、森中の動物たちが集まってきて、みんなでかすてらをいただきました。
</pre>
```
<img width="754" alt="pre.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/eca2a111-5b28-9fcc-6e26-8287c045fed7.png">

>ちなみにpタグだとこうなります。↓
<img width="1190" alt="pre-p.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/fba6251e-9081-dde8-508a-08709ef93c34.png">

>##blockquote##
>**&lt;blockquote&gt;&lt;/blockquote&gt;** : 他のサイトのコンテンツや文献の一部を引用する際に使う引用タグ。
引用セクションであるということを、ユーザーと検索エンジンに伝える為に使う。

>```html
<p>ぐりとぐら</p>
<blockquote cite="http://www.fukuinkan.co.jp/ninkimono/detail.php?id=1">
<p>いつも仲良しで、お料理することと食べることが大好きな２ひきの野ねずみは、野菜作りが得意なナチュラリストでもあります。<br>ふたりはきょうだい？　ともだち？　じつは、ふたごのきょうだいなんです。</p>
</blockquote>
```

><img width="973" alt="blockquote.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/9e7eb248-8d47-09da-3527-0096244b48f6.png">







#テキストの意味#

>##span##
>**&lt;span&gt;&lt;/span&gt;** : 一部の色を変えたりなど、spanで囲まれた範囲にスタイル(CSS)やスクリプトを適用できる。
span自身には特別な意味を持っていませんが、style属性・class属性・lang属性・dir属性などの属性と一緒に使用する場合に便利な要素。

>```html
<p>テキストテキスト<span>テキスト</span>テキスト
```
><img width="275" alt="span.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/e6e8f9ff-050b-b201-b916-15b8e69f627e.png">



>##a##
>**&lt;a&gt;&lt;/a&gt;** : リンクを指定する時に使う。
>>**href** : リンクの飛び先を指定するときにaの後に入れて使う属性

>>```html 
<a href="#">リンクテキスト</a>
```
  
>>**target="_blank"** : 新しいタブでリンクを開く

>>```html
<a href="#" target="_blank">リンクテキスト</a>
```

>>**id="〇〇〇"**　: リンク先にidをつけると、同じページ内の指定したところに飛ぶ(ページ内リンク)

>>```html
<a href=”#〇〇〇”>リンクテキスト</a>　
<h1 id=”〇〇〇”>テキスト</h1>(リンク先)
```

>>**&lt;img src=""&gt;** : aタグで囲むことにより、画像でリンクを表示する

>>```html
<a href="#"><img src=""></a>
```

>##br##
**&lt;br&gt;** : 改行する時に使う。詩や住所などのように、改行が実際にコンテンツの一部を成すような場合にのみ使用し、文の長さを揃えたりレイアウトを整えるなどのスタイリング目的に使用するのは×
teamviewerをubuntuで動かすにはLANG=C指定が必要だった

ubuntuでteamviewerを動かすとき、LANG=ja_JP.UTF-8だと接続できなかったり、表示が豆腐で表示がおかしい問題が発生していた。

[Ubuntu日本語フォーラム / TeamViewer & Ubuntu 12.04](https://forums.ubuntulinux.jp/viewtopic.php?pid=112853)


```diff:/opt/teamviewer/tv_bin/script/teamviewer
  #!/bin/bash
+ export LANG=C
```

これで解決した。


## ホワイトリストを使って接続できるユーザを限定する

* https://blog.teamviewer.com/teamviewer-master-whitelist/
たぶん正しくない Jenkins 本体のビルド方法

ふと思い立ち、Jenkins 本体をビルドしたくなった。でも、[オフィシャルのドキュメント](https://wiki.jenkins-ci.org/display/JENKINS/Building+Jenkins)や `BUILDING.TXT` の内容にしたがおうとしても `org.apache.maven.plugins.enforcer.EnforceBytecodeVersion failed` というエラーで先に進めなかった。

## 環境

```
$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.5", arch: "x86_64", family: "mac"
```

Java も Maven もバージョンの requirements はクリアしているはずだが...。

## 雑なトラブルシュート

Maven についての理解があやふやな私は、単に `EnforceBytecodeVersion` についての記述を削除して、ビルドをすることにした。

```
$ git diff
diff --git a/pom.xml b/pom.xml
index 7521f0cd0a..8ab985657f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -674,12 +674,6 @@ THE SOFTWARE.
                 <requireMavenVersion>
                   <version>3.0</version>
                 </requireMavenVersion>
-                <enforceBytecodeVersion>
-                  <maxJdkVersion>1.${java.level}</maxJdkVersion>
-                  <ignoreClasses>
-                    <ignoreClass>org.eclipse.jetty.spdy.*</ignoreClass>
-                  </ignoreClasses>
-                </enforceBytecodeVersion>
               </rules>
             </configuration>
           </execution>

$ mvn clean install -pl war -am -DskipTests
```

これで `war/target/jenkins.war` が作れたので、まあよしとしたけど、明らかに正しい方法ではないよなあ。
iOS safariの「戻る」ボタンでページが拡大して見える件

# そもそもなんで拡大してるんだ？
制作していたページはレスポンシブ対応をさせていて、ウィンドウ幅やデバイス幅が狭い場合にJavascriptでスマホ用の画像に切り替えていた。どうやら「戻る」ボタンでページを戻るとそのJavascriptが動作していないよう...

# Safariはブラウザのキャッシュを読んでいる
Android標準ブラウザでは「戻る」ボタンでページを再読み込みしてくれる。
しかし、当たり前だけどその分表示に時間がかかってしまう。
Safariはブラウザのキャッシュを読み込むので表示が早い！ということみたい。

# でもJavascriptを実行してくれないのはやっぱり不便
「戻る」ボタンでページを戻って、リロードすれば正しい見た目になるようなので
「戻る」ボタンを押したらリロードするようにしてみました。

```Javascript:sample.js
window.onpageshow = function(ev) {
    if (ev.persisted) {
         window.location.reload();
     }
};
```
ゴリおしな感じがするので、もっとスマートにできないかな
[Java] フィールドのフィールド名を取得したい。(昔話口調)


昔々、あるところに、以下のようなfieldsがありました。

```java
public class Xxx {
	public String xxx1;
	public String xxx2;
	public String xxx3;
	public String xxx4;
	public String xxx5;
	public String xxx6;
	public String xxx7;
	public String xxx8;
	public String xxx9;
	public String xxx10;
}
```

そして、以下のようなListがありました。

```java
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
```

ある人は言いました。
「listをループして、フィールドの1から順番に設定してほしい。」

開発者Aは、以下のような実装をしました。

```java
Xxx x = new Xxx();
int idx = 0;
x.xxx1  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx2  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx3  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx4  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx5  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx6  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx7  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx8  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx9  = (idx < list.size()) ? list.get(idx) : null;
idx++;
x.xxx10 = (idx < list.size()) ? list.get(idx) : null;
```

開発者Bは、以下のような実装をしました。

```java
Xxx x = new Xxx();
for (int idx = 0; idx < list.size(); idx++) {
	x.getClass().getField("xxx" + (idx + 1)).set(x, list.get(idx));
}
```

以上。