OmniAICreator/Qiita-1.07M huggingface dataset:
Bokehで微分と接線の関係の可視化を試みる．

# 本日は

最近QiitaのUIが刷新されたようですね．
今日のお題は関数　$f=f(x)$ の導関数 $f'(x)$ は各々の位置での接線の傾きを表すという高校１，２年生で習うことをPython可視化ライブラリBokehで実現してみましょう．

# 導入
一変数関数 $f$ の位置（または抽象的に言えば点） $x=a$ での微分は次の極限が存在するときに定義できます:

```math
\lim_{h\to 0}\frac{f(a+h)-f(a)}{h} _{．}
```

この極限が存在するとき，　$f$　は　$x=a$　で微分可能と呼んでいました．そしてこの極限値を$f'(a)$
と記しました．

（私に取っては遠い過去の話なので「た」と過去形で書いていますが，現在形にすべきかは皆さんの解釈に委ねます．）

位置 $x=a$ での接線は, $xy$ 平面上の点 $(a,f(a))$ と $(a+h,f(a+h))$　を結ぶ直線において，パラメータ　$h$を0に近づけた時の極限で得られます．したがって，接線は点　$(a,f(a))$ を通る傾きが　$f'(a)$ の直線

```math
y=f'(a)(x-a)+f(a)
```

の方程式を満たします．このことを確認するために可視化してみましょう．

# 実装例

```py3:deriv.py
import numpy as np
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Slider
from bokeh.layouts import column
from bokeh.io import curdoc


h = 1e-5


def get_tangentdata(a):
    df = (test_func(a+h)-test_func(a))/h
    txs = np.linspace(-0.5+a, 0.5+a, 10)
    tys = df*(txs-a)+test_func(a)
    return txs, tys


def test_func(xs, a=3.0):
    return 1/(1+np.exp(-a*xs))


class DerivViewer(object):

    def __init__(self):
        self.xs = np.linspace(-2.0, 2.0, 100)
        self.ys = test_func(self.xs)

        self.source1 = ColumnDataSource(data=dict(xs=self.xs,
                                                  ys=self.ys))
        a = 0
        txs, tys = get_tangentdata(a)
        self.source2 = ColumnDataSource(data=dict(txs=txs,
                                                  tys=tys))
        self.source3 = ColumnDataSource(data=dict(x=[a], y=[test_func(a)]))
        self.fig = figure(title='view tangent line',
                          x_range=(-2.0, 2.0),
                          y_range=(-0.2, 1.2))
        self.fig.line('xs', 'ys', source=self.source1)
        self.fig.line('txs', 'tys', source=self.source2, color='orange')
        self.fig.circle('x', 'y', source=self.source3, color='red')

        self.slider = Slider(title='position',
                             value=0,
                             start=-1.5,
                             end=1.5,
                             step=0.1)
        self.slider.on_change('value', self.update_data)
        self.plot = column(self.slider, self.fig)

    def update_data(self, attr, old, new):
        a = self.slider.value
        txs, tys = get_tangentdata(a)
        self.source2.data = dict(txs=txs, tys=tys)
        self.source3.data = dict(x=[a], y=[test_func(a)])


def main():
    viewer = DerivViewer()
    document = curdoc()
    document.add_root(viewer.plot)

main()

```

`get_tangentdata` 関数で接線を描画させるためのデータを作っています．

`test_func` のところを自前で変えると対応する関数の接線を作ってくれます．

# 実行例

```
bokeh serve --show deriv.py
```

ブラウザが立ち上がり下のように動作させることができます．

![tangentline.gif](https://qiita-image-store.s3.amazonaws.com/0/135978/1a9526e9-81b8-27a7-27f9-d28cade70c48.gif)

こういうのを学校の先生たちは勉強して見せてくれると生徒さんはワクワクするんだろうなー．
もう終わっちゃったけれど，ワクワクさんこういうので復活してくれないだろうか．
windowsでもdockerを利用してその場で右クリックからlinux環境を使いたい

この記事は[東京理科大学 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/tokyo_university_of_science) 12/1の記事です。
初日からクォリティー低くてすみません。ハードルを下げたのでくぐっていってください。
# windowsでもdockerを利用してその場で右クリックからlinux環境を使いたい
最近ラノベ張りの長いタイトルが流行っているとばあちゃんに聞いたので。
windowsユーザーだって何かの拍子に一瞬だけ壊れても良いlinux環境が欲しくなる時もあると思います。
![スクリーンショット 2017-11-30 02.31.27.png](https://qiita-image-store.s3.amazonaws.com/0/145589/0061ee1c-ea6c-78a7-db74-5b8db5226eaf.png)

これを押すと……

![スクリーンショット 2017-11-30 02.34.21.png](https://qiita-image-store.s3.amazonaws.com/0/145589/58e54128-5342-9d7c-670d-4f92263f57ad.png)

使い捨てコンテナが上がってくるイメージです。gitbash等は初めから登録されるのですが、それと同じように起動してdockerコンテナを使い捨てしようという感じです。

## 環境
- windows 10
- powershell v5.1.15063.726

## windowsで現在のディレクトリをマウントするとき
powershellでのディレクトリ参照は`pwd`をダブルクォーテーションで囲ってやるとうまくいきます。

```
~\Documents\GitHub> "$(pwd):/tmp"

C:\Users\hi\Documents\GitHub:/tmp
```

ので、現在のディレクトリをマウントするときは以下のようにします。

```
docker run -it -v "$(pwd):/tmp" centos bash
```
## 私がよく使うワンライナー
ということで

```
docker run --rm -it -v "$(pwd):/tmp" centos bash
```

## 右クリックメニューに表示する
ファイル名を指定して実行から`regedit`を実行する。

`コンピューター\HKEY_CLASSES_ROOT\Directory\Background\shell\`以下に任意のキーを作成する

さらにその下に`command`キーを作成する


`command`キーの「既定」の値に

```
<powershell.exeのディレクトリ> -NoExit -command docker run --rm -it -v "$(pwd):/tmp" centos bash
```

## 結論
できる！

インフラは大事ですね。
Pythonのsetを使ったTips

# はじめに
・動作確認はPython 3.6.3でのみ行っています
・setを知っている人からすれば当たり前なんですが、最近まで知らなかったので覚え書きに書きました
・ちなみにsetは集合という意味で、集合論はset theoryと言います(これも知らなかった)
# listからユニークなものだけを取得
```py3
a = [1, 2, 2]
b = list( set(a) )
# b = [1, 2]
```
# ２つのリストに共通する要素を取得
```py3
a = [1, 2, 2]
b = [2, 3]
c = list( set(a) & set(b) )
# c = [2]
```
# ２つのリストに共通する要素があるか
```py3
a = [1, 2, 2]
b = [2, 3]

len( set(a) & set(b) ) != 0
# True : 共通する要素あり

set(a).isdisjoint( set(b) )
# False : 共通する要素あり
```
```py3
a = [1, 2, 2]
b = [3, 4]

len( set(a) & set(b) ) != 0
# False : 共通する要素なし

set(a).isdisjoint( set(b) )
# True　: 共通する要素なし
```
disjointは互いに素=集合が交わりを持たないという意味なので、
isdisjointは同じ要素がなければTrue、あればFalseを返します。ややこしい...
# 欠番があるか
aは0からはじまる重複を許す整数のリスト

```py3
a = [0, 1, 1, 3]

b = range( len( set(a) ) )
# b = [0, 1, 2]

set(b) != set(a)
# True : 欠番あり
```
```py3
a = [0, 1, 1, 2]

b = range( len( set(a) ) )
# b = [0, 1, 2]

set(b) != set(a)
# False : 欠番なし
```

# 欠番の最小値を取得
```py3
a = [0, 1, 1, 3]
b = range( len( set(a) ) )
# b = [0, 1, 2]

# 欠番があるとき
if set(b) != set(a):
    c = min( set(b) - set(a) )
    # c = 2
```
Bootstrapのウィジェットを手抜きでRiot化

Bootstrapのウィジェットを見ていたら、Riot.jsで動かすのもそう難しくないかなと思うところがありました。

# 「手抜き」の意味

「手抜き」と書きましたが、何の手を抜くのかといえば、「Bootstrap用のCSSをそのまま流用する」ということです。デザインにBootstrapを使っている場合、ウィジェット用のCSSまで一本になっているので、流用することにかかるコストはほぼありませんし、多くのウィジェットは「CSSで形が決まっていて、jQueryで主にやっているのはクラスの付替えだけ」という感じなので、同じHTML構造をRiotで作ればすぐできそうな感じです。

# JavaScriptを見てみる

具体的に、[ドロップダウンのJavaScript](https://github.com/twbs/bootstrap/blob/v3.3.7/js/dropdown.js)を見てみましょう。実際に行っていることは、

* 展開時…`open`クラスを追加する、`aria-expanded=true`にする、必要ならバックドロップを入れる
* 閉じる時…`open`クラスを外す、`aria-expanded=true`にする、バックドロップを消す

実はこれだけで、あとはCSSの力で行っているのです。

# Riotで再現

ということで、「本来のHTML構造」と「展開時/閉じる時の状態制御」さえあれば、Riotとして動かすことも問題なくできます。

```html:dropdown-menu.tag
<dropdown-menu>
  <div class={dropdown: true, open: opened}>
    <button type="button" aria-haspopup="true" aria-expanded={opened ? 'true' : 'false'} onclick={onClickButton}>
      ドロップダウンボタン
      <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" aria-labelledby="dLabel">
      <li each={item in items}>{item}</li>
    </ul>
  </div>
  <div class='dropdown-backdrop' if={opened && useBackDrop} onclick={hide}></div>

  <script>
    onClickButton(){
      this.opened = !this.opened
      document.body.addEventListener(/*
        略: 外側をクリックしたらthis.opened = falseに戻す
      */)
    }
    hide() {
      this.opened = false
    }
    this.items = ['foo', 'bar', 'baz']
    this.useBackDrop = 'ontouchstart' in document.documentElement
  </script>
</dropdown-menu>
```
Trelloによる、お買い物マネジメント

この記事は [ハンズラボ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/handslab) 3日目の記事です。

@naokiurこと、しむらと申します。
2017/09/16にハンズラボに入社し、
Django, Vuejsを使用してシステム開発するプロジェクトに配属されました。


みなさんもそうだと思いますが、この業界で仕事をしていると、
便利なものをたくさん知ることができると思います。
入社し、プロジェクトに配属されたことで、
個人的に新しめな技術・ツールをぞくぞくと使うことができております。

その中の一つに、カンバン系タスク管理ツール、Trelloがあります。
(前職では…RedmineやTracでした。)

Trello、便利ですよね。
個人的に、仕事で得たものをプライベートへ、
プライベートで得たものを仕事へ生かしたいと思っており、
最近Trelloを用いて、プライベートの運用を改善したため、
Trello活用の一例を記載させて頂きます。

# お買い物マネジメント
自宅にある食品・生活用品の管理を、Trelloにお任せしました。

私事ですが、
最近結婚致しまして、妻と二人で暮らしております。
一人暮らしのときには気にならなかったのですが、二人という複数人で生活した結果、
問題点が発覚し、以下のような解決策を導入しました。

## 導入前の問題点
* 欲しい、必要だ、と感じたとしても、その情報を蓄積・共有できていない
    * 「ああ…そういえば、調味料切らしてたんだった…。」
    * 「新しいスリッパ欲しくて、この前ハンズとAmazonで調べたけど…どの商品だったっけ…？」
* 家に貯蓄している物のラインナップを覚えていない場合、出先で何があるか分からない
    * 「夕飯の買い物したいけど…家に何があったっけ…？」
    * 「あ、買ったけど、もう買ってきてくれてたんだ…」
    
## 解決
* Trelloにプライベート用のボードを作成し、「十分」「不足」というリストを作成した。
    + これにより、自宅にあるもの/たりないものを見える化した。
        - 鍋を食べたい場合、リストに「白菜」と「鍋つゆ」があるのであれば、「肉」「その他入れたいもの」を帰りがけに買う、という行動を取ることができる。
* 比較的恒久的なものの場合(いくつかリストアップして判断する、家具・家電・インテリアなど)、候補をカードに記録することができる。
* IFTTTを用いて、普段の連絡用ツールであるLINEと連携させることにより、「不足」になったものがほぼ[^1]リアルタイムで分かる。

Twitterで拝見した、ホワイトボードとマグネットで管理、というアイデアを頂き(ありがとうございます)、
またどこでも確認したいと思ったためTrelloを、
また通知も欲しいと感じたため、IFTTTとの連携を導入致しました。


<img width="566" alt="trello.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/2894215e-8616-42de-104e-50e38e775b2b.png">


## Trelloの良いと感じたところ
* 周知の事実ですが、本当にシンプルなところ
* スマホアプリがあるところ
    + タスク管理なので、前職ではRedmineやTracなども使用経験があるのですが…スマホ(ブラウザ)からは見にくいのではと…。

スマホアプリのフィルタ機能は本当に分かりやすくて、
「食品」というようなラベルを付与しておくと、以下のように見ることができました。

<img width="100" alt="Image.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/86bbb714-7150-15e4-e3b0-e3964a0de912.png">　<img width="100" alt="Image-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/b2b3feb9-c2ef-78e4-fd8e-24a1b2a557cd.png">


## IFTTTでLINEと連携
IFTTTにあるTrelloのトリガーは、以下の中から選べるようなので、
その中から、「リストにカードを追加したとき」を選択しました。

* ボードにカードを追加したとき
* リストにカードを追加したとき
* 自分がカードにアサインされたとき

<img width="825" alt="スクリーンショット 2017-11-30 20.51.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/4c27ba27-3022-1474-ea5e-48c8e51ec149.png">

トリガー以外の設定は、以下のようにしました。
<img width="300" alt="ifttt-skill.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/e360033f-c74e-01b5-8c36-23bb1533627c.png">


LINE側では、煩雑にならないよう、専用のグループを作成しました。

<img width="320" alt="Image-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/129313/b7fdfc52-0290-06e8-6004-256338ea58c3.png">

※ IFTTTからLINEへ通知するためには、通知させたい部屋に「LINE Notify」を招待する必要があるようです。

## 今後
echo dotの招待を申請したので、
もし手に入ったら、echo dotからTrelloに足りない物をカードとして追加できるようにしたいと思っています。
その際は…AWSチームにご教示頂きたい…！:bow:


[ハンズラボ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/handslab) 4日目の明日は、@watarukuraさんです！✨




[^1]: 平均15分ごとに実行されるそうです。https://help.ifttt.com/hc/en-us/articles/115010194247-How-often-do-Applets-run-
fluent-logger-golangでtime.Timeを送ったら"error":"#<MessagePack::UnknownExtTypeError: unexpected extension type>"が出た

### はじめに
以下のようなスクリプト、configでfluentdに送ってみる
`Log`についてはgo generateで`msgp.Marshaler`を自動生成しています
msgpのgeneratorについては[こちら](https://github.com/tinylib/msgp/wiki)

```go:main.go
package main

//go:generate msgp

import (
	"log"
	"time"

	"github.com/fluent/fluent-logger-golang/fluent"
)

func main() {
	logger, err := fluent.New(fluent.Config{FluentPort: 24224, FluentHost: "127.0.0.1"})
	if err != nil {
		log.Println(err.Error())
		return
	}
	defer logger.Close()

	logData := Log{
		ID:        12345,
		Name:      "hogehoge",
		CreatedAt: time.Now(),
	}
	if err := logger.Post("debug.test", logData); err != nil {
		log.Println(err.Error())
		return
	}
	log.Println("done")
}

type Log struct {
	ID        uint32    `msg:"id"`
	Name      string    `msg:"name"`
	CreatedAt time.Time `msg:"created_at"`
}
```

```fluent.conf
<source>
    @type forward
</source>
<match **>
    @type file
    path /path/to/log
</match>
```

実行

```bash
$ go run main.go main_gen.go
2017/12/02 19:30:16 done
```

ログを見てみる
何かエラーが出ている。

```bash
cat log/app.log.20171202.b55f58f8a5413f5de
2017-12-02T19:30:16+09:00	fluent.error	{"error":"#<MessagePack::UnknownExtTypeError: unexpected extension type>","error_class":"MessagePack::UnknownExtTypeError","message":"forward error error=#<MessagePack::UnknownExtTypeError: unexpected extension type> error_class=MessagePack::UnknownExtTypeError"}
```

### 解決策

msgpでtime.Timeを扱うときにstringとして変換するように以下の１行を追加して`go generate`

```go
//msgp:shim time.Time as:string using:timeToStr/strToTime
```
これでtime.Timeは`timeToStr`と`strToTime`メソッドでstringに変換されて用いられます。
なので、これらのメソッドも実装しておきます

```go
func timeToStr(t time.Time) string {
	return t.Format("2006-01-02 15:04:05")
}

func strToTime(v string) time.Time {
	t, _ := time.Parse("2006-01-02 15:04:05", v)
	return t
}
```

最終的なスクリプトは以下

```go:main.go
package main

//go:generate msgp
//msgp:shim time.Time as:string using:timeToStr/strToTime

import (
	"log"
	"time"

	"github.com/fluent/fluent-logger-golang/fluent"
)

func main() {
	logger, err := fluent.New(fluent.Config{FluentPort: 24224, FluentHost: "127.0.0.1"})
	if err != nil {
		log.Println(err.Error())
		return
	}
	defer logger.Close()

	logData := Log{
		ID:        12345,
		Name:      "hogehoge",
		CreatedAt: time.Now(),
	}
	if err := logger.Post("debug.test", logData); err != nil {
		log.Println(err.Error())
		return
	}
	log.Println("done")
}

type Log struct {
	ID        uint32    `msg:"id"`
	Name      string    `msg:"name"`
	CreatedAt time.Time `msg:"created_at"`
}

func timeToStr(t time.Time) string {
	return t.Format("2006-01-02 15:04:05")
}

func strToTime(v string) time.Time {
	t, _ := time.Parse("2006-01-02 15:04:05", v)
	return t
}
```

これで送信すると

```bash
$ go run main.go main_gen.go
2017/12/02 19:39:56 done
```
ちゃんとした形でログが出ています

```bash
$ cat log/app.log.20171202.b55f58f8a5413f5de
2017-12-02T19:39:56+09:00	debug.test	{"id":12345,"name":"hogehoge","created_at":"2017-12-02 19:39:56"}
```

こうやったら直った、っていうだけで実はあまり理由を理解してない。。。
flowで書かれたコードをnpmパッケージとして公開する方法

# はじめに
自分用の忘備録として、flowで書かれたコードをnpmパッケージとして公開する方法をまとめました。

# サンプルコード
趣味で作っているゲームの、ロジック部分をnpmパッケージにしたものです。
https://github.com/kaidouji85/gbraver-burst-core/tree/a8fa796762dde89f177a70cd53e9314ca881560d

# 作成手順
大まかな作成手順は以下の通りです。

(1)flowでコードを書く
(2)ビルド設定を作る
(3)公開

## (1)flowでコードを書く
まずは普通にflowでコードを書きます。
外部公開用に特別なことをする必要はありません。

### 補足
flowには以下ににあるように、型情報をライブラリとして公開する為の機能があります。

https://flow.org/en/docs/libdefs/creation/

しかし、この機能はjQueryなど元々flow型情報を持っていないライブラリに、後から型情報を付ける為のものです。なので、初めからflowを使う場合には、このファイルを作る必要はありません。

## (2)ビルド設定を作る
ここが肝になります。
結論から言うと、flowで書かれたコードから以下の二つを生成します。

(A) flowのコードをcommon.js形式に変換したもの
(B) flowのコードをそのままコピーしてファイル名の末尾に.flowを追加する

イメージ的にはbabelで変換したコード、flowのオリジナルコードをまとめて公開する、というものです。
なぜflowオリジナルコードの末尾に.flowを追加する必要があるのかと言うと、flowにはDeclaration filesと言う仕組みがあるからです。

https://qiita.com/yuku_t/items/9c4cc921be228ae50e19#declaration-files

###(A)flowのコードをcommon.js形式に変換
サンプルコードでは(A)に相当するものは、package.jsonのscriptsの「build-src」です。

.babelrcの設定

```
{
  "presets": ["es2015", "stage-2", "flow"]
}
```

ビルドコマンド

```
babel <オリジナルソースのフォルダ> -d <ビルド結果配置フォルダ>
```

###(B)flowのコードをそのままコピーしてファイル名の末尾に.flowを追加

サンプルで(B)の相当するものは、package.jsonのscriptsの「copy-flow」です。

ビルドコマンド

```
flow-copy-source <オリジナルソースのフォルダ> <ビルド結果配置フォルダ>
```

## (3)公開
これでビルドコマンドが完成しましたが、npmパッケージ公開時にビルドをしてくれないと意味がありません。
どうすればいいのかと言うと、package.jsonのscriptsの「prepublish」にビルドコマンドを書けばいいのです。

```
“scripts”: {
  "prepublish": "npm run build",
}
```

上記設定を追加した後で、npmパッケージ公開コマンドを実行します。

```
npm punlish
```

以上で、flow型情報を持ったnpmパッケージの完成です。
もしプログラミングを12歳ではじめたら １日目

もしプログラミングを12歳ではじめたら １日目
----

# はじめに

こんにちは。「12歳からはじめるJavaScriptとウェブアプリ」の著者のひとり、谷岡（TENTO☆フェロー）です。プログラミングスクールTENTOで講師をはじめてから6年、本の構想から4年、やっと本になりました〜！ ドンドンドン パフパフパフ♪ 感慨深いですね。

[![12歳からはじめるJavaScriptとウェブアプリ](//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4899774710&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=taniokah-22 "12歳からはじめるJavaScriptとウェブアプリ")](http://amzn.to/2iwQovO)
[12歳からはじめるJavaScriptとウェブアプリ](http://amzn.to/2iwQovO)

12歳というと小学校6年生、子どもといってもプログラミング言語自体を理解する素養はすでに備わっていると思ってよさそうな年齢ですね。ScratchなどのVisual言語をつかったことのある人にとっては、この本は簡単すぎるかもしれませんが、JavaScriptという言語を通して、これから本格的なプログラミングをするにあたって必要となる基礎をしっかり、でも大人向けのように堅苦しくなく、読みやすくまとめることを意識しました。

また、この本で学んだテクニックを応用すれば、かなり高度なゲームを作ることも可能になります。工夫次第で、本格的なゲームを作ることだって可能だと思います。本当？ 本当だよ！ というわけで、このブログは、自分が12歳の少年だったころを思い起こし、「12歳からはじめるJavaScriptとウェブアプリ」を参考にしながら、実際に12歳の少年がどのくらいプログラミングが上達するか想像した思考実験（フィクション）です。

# プログラミングがやってみたいぞ

プログラミングをはじめようと思ったら、さあ、どうすればいいのかな？ . . . そうか、まずはパソコンを準備しないとね。というわけで、まずはパソコンの準備からです。うちにあったパソコンを引っ張り出します。おとうさんにお願いして、自分でも使えるように、アカウントを登録してもらいました。

![うちにあったパソコン](https://qiita-image-store.s3.amazonaws.com/0/47058/c8bf5f3c-47b9-51bb-f699-124ad972e177.png)

よーし、これからプログラミング、がんばるぞ〜

# プログラミングってどうやるんだ？

じゃあ、さっそく本を開いて、「第1章 JavaScriptってなんだ？」によると、なるほど、プログラミングというのはプログラムをつくるということ、プログラムというのは、機械が読める言葉で何をしたいかを伝えるというわけなのね。いろんな英語や日本語があるように、プログラミング言語にもいろんな言語があると。

パソコンをつかって、インターネットで買い物したり、YouTubeを見たりするとき、いつも見ているページがウェブページということ、そこで使われているのが、HTMLとCSSとJavaScriptの3つというわけか。えーっと、この本では、ウェブページをつくるときにつかうブラウザには、Chromeをつかってるから、ぼくもChromeでやることにしよう。

![Chrome](https://qiita-image-store.s3.amazonaws.com/0/47058/3fddfd94-5a00-ac99-ea22-afde21e90104.png)

# HTMLを書いてみる

本ではまずはじめに HTML の例が出てくるから、まずはそれを書いてみよう。なにをつかってどうやって書けばいいのかな？ よくわからないけど、TextEditというのがマックには入っているので、それにしてみました。

![TextEdit](https://qiita-image-store.s3.amazonaws.com/0/47058/0398e4c1-854c-0225-9147-2cad3099b5fc.png)

同じように書いてみたよ。ファイル名を「tento.html」にして保存して、えーっと、それでどうするんだ？

![Finder](https://qiita-image-store.s3.amazonaws.com/0/47058/124c85f3-4976-c662-d57e-a176049b197b.png)

とにかくダブルクリックかな？

![Chrome](https://qiita-image-store.s3.amazonaws.com/0/47058/4f9e1d3f-4bba-2665-5038-b2e31fdd5b18.png)

やった！ 見えたよ。赤文字で「テントくんだ！」と出ました。今日のところはこのあたりでおしまいにします。次回はいよいよJavaScriptでプログラミングしていきますよ。次回もがんばるぞっ！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47058/acabc369-ac63-0e43-9618-b9862486d3b5.png)
[FileMaker]カスタム関数で再帰する回数について調べてみた

# 背景
対象レコードのフィールドをList関数のように改行区切りで取りたいときに、
カスタム関数の[GetFieldValues](http://www.fmpro.info/fmi/xsl/plugin/cf.xsl?ID=0063)を使用しています。

で、あるときに、レコード数がなかなか多い件数を取得したときに、
「?」が返ってきたので、調べてみました。

## GetFieldValuesの説明
中身はこんな感じです。
ifをつかうよりcaseの方が実行速度が速いそうなので、
fmpro.jpに登録されている内容から少し変更しています。
(かなり前の情報だけど、今もそうなのかな？)

![GetFildValue.jpg](https://qiita-image-store.s3.amazonaws.com/0/130476/31ac83fd-e76b-b593-91f5-5b7208692caf.jpeg)
### 説明

```
Case (
//最終行かどうかチェック
Cnt < Get ( 対象レコード数 );

　　//最終行でなければ、Cnt番目の内容を取得、改行を追加して、同じカスタム関数を呼び出す(再帰する)
　　//このとき、Cntに+1して、次の行をとってくる
    GetNthRecord ( Field ; Cnt ) & "¶" & GetFieldValues ( Field ; Cnt + 1 );

　　//最終行の時はCnt番目の内容を返す
    GetNthRecord ( Field ; Cnt )
)
```
ザ・再帰処理って感じですね！
で、なんで「?」で返ってくるか調べたら、

対象レコード見てみると一万数十件。。。
**再帰処理の上限回数**に引っかかっていたみたいでした。
ちょっと多いけど、いっとけ！で実行してもダメですねっ！！

## 再帰処理の上限回数
書き方によって上限が、10,000回か50,000回になるらしいです。

ふむふむ

GetFildValuesの書き方だと、10,000回が制限で怒られたと。
じゃあ50,000回の書き方ですれば、
残りの数十件のためにスクリプト作らんでもいいなーと思ったのですが、
そこから理解するまでに時間がかかった。。。

## で、結局 50,000回を上限にするには？
[ここ](http://joy-h.com/bbs2/viewtopic.php?id=2685)で質問されている内容を参考にさせて頂きました。
キーワードは「**末尾最適化**」

対象レコードが2行のとき、GetFieldValuesの動きを順に見ていくと、
　1. 1レコード目をGetNthRecordで取得する。2レコード目の結果を後ろに付けるため、再帰する(関数1回目の呼び出し)
　2. GetNthRecordで2レコード目を取得して、結果を返す。(関数2回目の呼び出し)
　3. 関数1回目の呼び出しが、2回目の結果を元に、結果を返す。
となります。
つまり、関数1回目の呼び出しは、再帰する全ての処理が終わらないと終わらないんです。
で、この時は上限が10,000回まで。

**末尾最適化**を行うには、
　1. 関数1回目の呼び出しで結果を**引数**だったり**グローバル変数**に入れて再帰する。
　2. 2回目の呼び出しのときに、1回目の内容を含めて結果を返す。
ようにすると、関数1回目は2回目以降の処理を待たずに終われるようになり、
上限が50,000回になるそうです。

## サンプル
このことを踏まえ、以下のようにしてみました。
　- 1回ずつ終了するように、結果をグローバル変数に入れていく。
　- 最後にグローバル変数の内容を返す。
　- 使ったグローバル変数のクリアを忘れずに！
ついでに元の処理を見て思った、
　- 引数に必ず1を入れなくてもよくない？
　- 関数の中で「Get ( 対象レコード数 )」が再帰する度に呼ばれているのが気になる。。。
というのも対応してみました。

```
/*==============================================================
名　　称：GetFieldValues ( Field )
概　　要：現在の対象レコードのフィールドをList関数のように改行区切りで取得する。
引数：
　Field: 改行区切りで取得したいフィールド
計算式例：GetFieldValues( Current::Field )
備考　　：このバージョンは末尾最適化を行っているので、制限50000回
=============================================================*/
Case($$#Cnt = "" ;
    //初回は初期値をセット
　Let( [$$#Cnt = 1 ;
           $$#RecodeNum = Get ( 対象レコード数 ) ;
           $$#Result = ""
          ];
          GetFieldValues( Field )
    ) ;
   
   //最終条件
　$$#Cnt > $$#RecodeNum ;
   //最終処理
    Let( //使用したグローバル変数をクリアする
           [$$#Cnt = "" ;
            $$#RecodeNum = "";
            #Result = Left($$#Result ; Length($$#Result) - 1) ;
            $$#Result = ""
           ];
           #Result
    ) ;
   

    //一覧取得処理
    Let( [  $$#Result = $$#Result & GetNthRecord ( Field ; $$#Cnt ) &"¶" ;
              $$#Cnt = $$#Cnt + 1
           ];
           GetFieldValues( Field )
     )
   
)
```

\#はLet関数内で使用する変数名の先頭に付けています。
$$#は、関数内で使用するグローバル変数名の先頭に付けています。

注意としては、グローバル変数を指定するときに、スクリプトなどで使用している
変数名を使用するとクリアされてしまうので、使用しない名前で定義してください。

## まとめ
上記カスタム関数で、無事に一万数十件のフィールドの内容が取得できました。
最後かけ足でしたが、いかがでしょうか？？

サンプルは、初回と最終条件の時はGetNthRecordしていないので、
実際は49,998レコードが限界かと思いますし、
(ただ、そこまでの件数だとなかなか返ってこないです。。。)
恐らくもっといい書き方があると思うので、
ご指摘頂けるとありがたいです！


P.S.　初Qiita投稿＆初Advent Calendarでした！
文章で書くのは難しいけど楽しかった！
スペルミスの多いコードを持つプロジェクトにありがちなこと

この記事は、株式会社ACCESS Advent Calendar 2017の2日目の記事です。

----

# あらまし

9月から11月にかけて携わったプロジェクトでは、やたらとスペルミスが多かった。
そういうプロジェクトはどういう状態なのか、なんとなく思ったので書き下す。

# スペルミスによる害

スペルミスは害がある。
普通にバグの原因になるし、バグはなくともコードを読むときに脳に負荷を書ける。

そして一部の言語（Ruby, JavaScriptあたり）は、正確に治すのは難しく、スペルミスを直したつもりが直しきれずにバグになってしまうこともある（以前にAndroid StudioでJavaのリファクタリングしたときはかなり正確に、しかもコメント内まで修正が入っていた。言語によっては安全に直せるケースもある）。

そういう要素はプログラマのやる気を削ぎ、プロジェクト離脱や退職に繋がる。

# 成果物にスペルミスが混入する状況について

ある程度コードを書いていれば、スペルミスは多かれ少なかれしてしまう。

混入したものがリリース物に残ってしまう状況がどういうことか、考えてみよう。

## セルフレビューの欠如

学校のテストなら、時間があれば提出前に見直す。
それと同じようにPRをレビューに回す前に差分に対して見直すのがセルフレビュー。
セルフレビューは自分の中でスペルミスを完結させる最後のタイミングだ。

そこをスペルミスが通り抜けるということは、
セルフレビューが行われない、または行っているが十分ではない、ということになる。

なぜそういうことになるのか。以下が考えられる。
* （セルフではない）レビューに頼っている
* 締め切りギリギリ、もしくはオーバーでそれをする余裕がない
* スペルミスへの意識が低い、英語が苦手

いずれにせよ問題がある。

1番目は、他人にコードの妥当性の判断を丸投げするような人間が良いコードを書けるわけもなく
結果他人の作業時間を奪ってレビューNGでまた戻ってきて修正して、というようなループに落ちいて貴重な時間を無駄にする。
仕事人として失格。

2番めは、プロジェクトの問題で、作業見積もりが甘い、仕事の割り込みが多い、など技術的ではなくプロジェクト運営に関連する問題が疑われる。コードを書く当人だけでなく、マネジメントにも問題があるケース。

3番めは、スペルが間違っていても正しく動けばいい、という意識。
メンテナンスする必要のない、書捨てのプログラムならそれも許されるが、
プロダクトでそれをすると、プロジェクト後期やメンテナンスフェーズでひどい目に合う（主に書いた当人以外が）ので、
仲間を大事にしない人間だと思われてしまう。

## レビューの不具合

セルフレビューをすり抜けてやっぱりスペルミスが入っているコードがレビューに上がってしまうこともある。
レビューは品質保証活動の一環であり、プロジェクトの中で問題を完結させ、市場不具合などでプロダクトの価値を下げるのを防ぐ最後の砦だ。

結局こちらもほとんど同じで、以下が考えられる。

* テストに頼っている
* 締め切りギリギリ、もしくはオーバーでそれをする必要がない
* スペルミスへの意識が低い、英語が苦手

1番めについては、プロダクトの外から見た品質は守られるが、メンテナンス性への意識に問題がある。
3番目も同じである。
プロダクトの開発速度は徐々に鈍り、価値は低下していく。それを予測していないプロジェクトはろくなものではない。

2番めもセルフレビューと変わらないが、プロジェクト全体の遅延は致命的なので、より問題は深刻になる。

# まとめ

スペルミスが多いコードを持つプロジェクトは、メンテナンス性や見積もり、意識に問題がある。

ジョインしたプロジェクトのコードベースにスペルミスが多かったら危険信号、
改善するなり逃げる算段を立てるなり対処しよう。

----

明日も @katoken-0215 です。お楽しみに！
Scratch 3.0 を Androidアプリとして動作させてみよう (1)

Scratch3.0 は、Scratch2.0と異なり、スマートフォンでも動作します。
今回は、それを、もう少し発展させて、Androidアプリとして動作させて見ましょう。


# Scratch3.0はスマフォで動く。

みなさんがお持ちのスマフォでScratch3.0は動きます。Scratch2.0はFlashを利用していました。そのため、スマフォのブラウザー上で動作しませんでした。

試しに以下のサイトをスマフォでアクセスして見てください。結構、良い感じで動作します。
※ Tablet推奨!!

http://llk.github.io/scratch-vm/


### なぜ、スマフォで動作しなかった..

Scratch2.0が開発された時は、Flash というブラウザー上で動作するVMが世の中を席巻していました。
![GetAdobeFlashPlayer_icon.png](https://qiita-image-store.s3.amazonaws.com/0/54192/47f87187-57b3-de7c-bdff-d1f84de444c7.png)

https://ja.wikipedia.org/wiki/Adobe_Flash


それは、今のHtml5のベースとなるような様々なアイデアを年々も前に実現していたからです。様々なゲームやジョークアプリが作られました。
http://www.nicovideo.jp/tag/FLASH%E9%BB%84%E9%87%91%E6%99%82%E4%BB%A3


Scratchもこの、時代を先取りした環境で作られていました。
しかし、Apple社がiPhoneに、ブラウザー上でFlashを利用できなくしたあたりを切欠に、
Flash は、PCでしか動作しないVMとなりました。

Scratch3.0では、後発のHtml5を利用して作り直されています。



# なぜ、Androidアプリとして動作させるか

作成したScratchアプリを、ScratchのSNS以外の場所で活躍させる事ができるようになります。

- 作成したゲームを自分のスマフォに入れて持ち歩いたり
- 別のSNSに投稿したり
- カレンダーとか、アドレス帳とか、個人的なデータを記録するアプリを作ったり
- 作成したアプリをプレゼントしたり

使い道が広がります。



# Buildしてみよう!!

Androidアプリ化するのに、Cordova( https://cordova.apache.org/ )を使いたいと思います。
今回は以下の手順ですすめてみましょう。

1. Cordovaをインストール
2. Cordovaで、ブラウザーアプリを動作させる
3. Cordovaで、Androidアプリを作成してみる
4. Scratch3.0 を、ビルドしてサーバを経由しなくても動作するようにする
5. 4で作成したScratchアプリをCordovaに移植してみる
6. Scratch3.0をCorodovaブラウザーアプリとして動作させてみる
7. Scratch3.0をAndroidアプリとして動作させてみる。

では、順番に進めて見たいと思います。


# Cordovaをインストールしてみよう

https://cordova.apache.org/#getstarted

1. Cordovaをインストール!!
npm install -g cordova

2. Hello World Projectを作ろう
cordova create MyApp

3. ブラウザーアプリ Pluginを追加
cd MyApp
cordova platform add browser

4. Hello World アプリを動作させてみる

cordova run browser
startPage = index.html
Static file server running @ http://localhost:8000/index.html

と表示されるので、
http://localhost:8000/index.html をブラウザーで開いて見ましょう!!


![スクリーンショット 2017-12-02 19.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/54192/3f92ff33-d3d2-4f8a-08bb-c4940732b5e7.png)



無事、CorodvaでHello Worldが動作しました。

では、次回!!

ノ


# PS
以下の場所でも、アレコレ書いていきます。
https://firefirestyle.blogspot.com/

[Scratch3.0 自分専用機 を作ろう!! (0)](http://blogger.firefirestyle.net/2017/09/scratch30-0.html)
[Scratch3.0 自分専用機 を作ろう!! (1) Scratch3.0をビルドしてみよう](
http://blogger.firefirestyle.net/2017/12/scratch30-1-scratch30.html)
[Scratch3.0 自分専用機 を作ろう!! (2) Scratch3.0 を Androidアプリとして動作させてみよう (1)](http://blogger.firefirestyle.net/2017/12/scratch30-2-scratch30-android-1.html)


[火の型 With Scratch 2.0 (プログラム入門) 　第00巻](https://firebook.firefirestyle.net/)
[炎の型 With Scratch 2.0 (ゲームプログラム入門)](https://firefirebook.firefirestyle.net/)
Railsチュートリアル用の環境をローカルマシン（Windows10）上に作る

# 概要

チュートリアルで推奨されたCloud9を利用する形で進めてきたが、最近VSCodeが好きなのでVSCodeを使って開発したいなあ、と思い始めた。
Windows Subsystem for Linuxを利用してWindows上で続きをやることにした。
Windows用Rails環境構築は、仮想マシンを使う方法が検索結果に多く出てきたが、仮想マシンを使わなくても作れるようだ。

※実施しているチュートリアルはRails5.0（第4版）

# WSL環境構築

WSLおよびRubyセットアップの参考
RubyMineは使わないのでその前までの手順を真似る。
[Windows Subsystem for Linux + VcXsrv + RubyMine でWindowsでも快適なRails開発環境を作ろう](https://qiita.com/fukuramikake/items/283b817c16725af79a28)

Rubyインストール時は、Cloud9でRubyのバージョンを確認（`ruby -v`）して同じものをインストールする。
`$ rbenv install 2.3.0`

Windows用のRubyインストーラーは細かくバージョンが選べないが、WSLを利用することでCloud9で使っていたのとぴったり同じバージョンが使用できる。

# Windows用Gitの設定

リポジトリをcloneするとき、**WindowsのGit**が勝手に改行コードを弄らないようにする。
インストール時に`as-is`を選択していれば不要。
あるいは別にWindows上のGitでなくてもWSLのUbuntu内のGitでcloneしてもよいのでその場合も不要。

ユーザーディレクトリ直下の`.gitconfig`

```
[core]
    autoCRLF = false
```

# VSCodeの設定

[WSL環境構築](# WSL環境構築)でインストールしたRubyを使うため、ターミナルをWSLのBashに設定する。

```
  "terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\bash.exe",
  "termnial.integrated.shell.unixlike": "bash.exe",
```

# サンプルアプリケーション起動まで

1. リポジトリをcloneする
  * 事前にCloud9のリポジトリをBitbucketなりGitHubなりにpushして最新にしておく 
  * Windows上で任意のフォルダにcloneするのは多分Windows用Gitが楽（だが、先ほどの改行の設定がまずいと**cloneした瞬間変更だらけ**になる、というかなった）
1. リポジトリのフォルダをVSCodeで開く
  * VSCodeインストール時、**右クリックメニューにVSCodeで開くオプション**を追加しておくと便利
1. VSCodeでターミナルを開く
  * Bashが開かれているのを確認 
1. チュートリアル1.2.2通りRailsをインストールする
  * `$ gem install rails -v 5.0.3 `
1. bundle install実行
  * `$ bundle install --without production`
1. アプリ起動
  * `rails s`
  * localhost:3000でアクセス可

これで、Windows上でファイルを編集して、サーバーを立ち上げ動作確認もできるようになった。
環境準備（BoUow LDA)

主に、LDAをやってみるための環境構築のお話です。
同じように悩んでいるかたの役にたてば、幸いです。

参考にさせて頂いたのは、「け」さんのブログ。ありがとうございます。
http://ohke.hateblo.jp/entry/2017/11/14/230000


環境
---
- Windows10
- bash on ubuntu on windows(gensimなどで日本語処理したいため)
- python3



コーパスファイルのダウンロードと解凍
---

- まずは、コーパスファイルを入手。
- Windows上でファイルを入手して解凍。
- BoUoWのホームディレクトリにコピー。

ここで問題発生。
やはりBoUoWでは、Windows側で解凍したコーパスファイルを認識してくれない模様。 

しかたないので、bashのコマンドから勉強開始。

- まずは、目的のコーパスファイルの取得。

```
$ wget http://nlp.ist.i.kyoto-u.ac.jp/kuntt/KNBC_v1.0_090925.tar.bz2
```

- dirで、bash上で取得したコーパスファイルが見えることを確認。

- 取得した「tar.bz2」ファイルを展開。

「tar」が複数ファイルをまとめたアーカイブファイルで、「bz2」は、圧縮ファイルの１つの形式の模様。

- ってことで、解凍と展開。

```
$ tar -jxvf KNBC_v1.0_090925.tar.bz2
```
dirで、ディレクトリとしての「KNBC_v1.0_090925」ができていることを確認。うれしい。(^^♪


Janomeインストール
----

前準備。

- まずファイルをダウンロード。

しかし、対象ファイルがgoogleドライブ上に置かれており、容量が204MBあるので、wgetコマンドでは、すんなりダウンロードできない。

googleドライブの動的なIDが取得しにくいような問題があるらしいです。
解決方法もあるようなのですが、僕はよく理解できず、他の方法を模索。

- とりあえず、Windowsでgoogleドライブから目的のファイルをダウンロード。
- BoUoW側からWindows10のファイルにアクセスし、コピーしてくることに挑戦。

```
~$ cp /mnt/c/Users/*ユーザ名*/*Windows10上でダウンロードしたファルダ名*/Janome-0.3.5.neologd20170828.tar.gz /home/*ユーザ名*/Janome-0.3.5.neologd201708
28.tar.gz
```
無事成功。

```
$ tar -zxvf Janome-0.3.5.neologd20170828.tar.gz
```
成功はしたようですが、次のpipを考えると、特に解凍する必要もないのかもしれません。

- では、いよいよjanomeのインストール。

```
pip install Janome-0.3.5.neologd20170828.tar.gz --no-compile
```

僕の環境だと、一瞬フリーズしているように思えてしまいますが、問題なく、次のような完了メッセージが表示されます。

```
Successfully built Janome
Installing collected packages: Janome
Successfully installed Janome-0.3.5.neologd20170828
```

- 次に、こちらもエラーなど出ることなく完了。

```
python -c "from janome.tokenizer import Tokenizer; Tokenizer(mmap=True)"
```

この後は、「け」さんのブログの通り実施。

写経の時間もだんだん短縮できるようになり、満足(^^♪
rippledをAWS上で起動するまで

#rippledをAWS上で起動するまで

下記ページを参考に進めていきます。

Ripple Developer Center tutorials rippled setup
https://ripple.com/build/rippled-setup/

#EC2でインスタンスを作成
作成したインスタンスの設定
- Red Hat Enterprise Linux 7.4(64bit)
- t2.medium(2core,4GB)
- 汎用SSD(GP2)50GB
- セキュリティグループ(インバウンド:SSH マイIP,TCP 51235 インターネット)
※ノード間の通信はTCP51235ポートを使うとのこと

#rippledインストール 
チュートリアル通りのコマンドを実行

1. レポジトリを追加
`sudo rpm -Uvh https://mirrors.ripple.com/ripple-repo-el7.rpm`

2. rippledのインストール
`sudo yum install --enablerepo=ripple-stable rippled`

3. OS起動時の自動起動に設定
`sudo systemctl enable rippled.service`

4. rippledの起動
`sudo systemctl start rippled.service`

#起動後の様子
他のノードとの接続確認
`netstat | grep 51235`
これを見ると他にもAWS(EC2)でノードを起動している人がいる模様

#各種コマンド
Ripple developer center References rippled
https://ripple.com/build/rippled-apis/#list-of-public-commands
ここにコマンドが沢山記載されているので試してみる

サーバの情報確認
`/opt/ripple/bin/rippled server_info`
ビルドバージョンなどが確認できる模様

最新のledgerの状態を確認
`/opt/ripple/bin/rippled ledger current`
"ledger_current_index" : 34714721
他のノードに接続できていればこのインデックスの値が増加していく

#最後に
今回はお試しなので，サーバをそっとシャットダウンさせておく。
IoTシステム技術基礎検定を受けてきた

#はじめに
今日（2017/12/02）、IoTシステム技術基礎検定を受けてきました。

#試験概要
https://qiita.com/yamato031033/items/7ed5bea5f52dc3dfd9bd

#受けてみた印象
####時間は有り余った
予想通り、特に計算問題はなく、最後まで解いて30分くらい余った。

####マークシートめんどい
塗りつぶすのではなく、円をなぞるといったタイプだったので慣れなかった。

####出題範囲にばらつき
ある程度問題数が多そうな章は予想できたが、
結構問題数の差が極端だった印象。

####ほぼテキスト順の出題
一部入れ替わってた気もするが、
ほぼテキストの内容順になっていた。

####前半の内容が細かい
特にテキスト前半の内容が案外細かく出た。
順番に勉強したので、時間経過で記憶が薄れてたのもあったが、
ちょっと自信ない状況だった。
逆に後半の内容は大雑把だった印象。

####まったく出てこなかった節も
問題数ゆえ仕方ないが、
まったく触れられなかった節もあった。
今後出てくる可能性が強い。

####適当でないものを選べ、が多かった
適当なものを選べ、よりも多かった印象。

#自己採点
内容を思い出した57問のうち、
確実に間違ったぽいのが5問。
怪しいのが3問程度。
記憶にない3問は躓いた印象ないので大丈夫？

合格ラインは公表されてないが、
とりあえず8割＝48問以上正解が安全圏？

#終わりに
興味ある分野の試験は勉強のモチベーションになる。
テキストや試験料も安くないし、逃げられない緊張感がある。
合否通知は年末。あまり意識せずに待ちます。

（2018/01/21更新）
合格してました、良かったです。
AWS ELB を使って冗長構成を組むまでの気にするポイント

今回ELBを使って、EC2の冗長構成を作りました。
その中で、何個かはまりごとにも出くわしたので、メモがわりに投稿します。

# 前提条件の構成

(BEFORE)

```
インターネット -> EC2 -> RDS
```

(とりあえずのAFTER)

```
インターネット -> ELB -> EC2 -> RDS
```

(さらにAFTER)

```
インターネット -> ELB -> EC2その１ / EC2その2 -> RDS
```

# 大まかな流れ
1. ロードバランサーの作成
2. ターゲットグループの作成
3. ヘルスチェック用ファイルの設置
4. DNSのAレコード登録
5. EC2インスタンスを新規作成
6. DNSのAレコード登録（直アクセス確認用）
7. ターゲットグループに新規EC2インスタンスを登録
8. 動作確認

# 手順とハマりポイント

## 1. ロードバランサーの作成

- 入口が見つけづらいので数分ハマるので気をつけてくださいw

<img width="212" alt="EC2_Management_Console.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/154018/d900d73f-d7f5-fa39-c916-62f44488bf56.jpeg">

- ロードバランサーの種類を選びます。今回は「Application Load Balancer」を選択。

<img width="1633" alt="EC2_Management_Console.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/154018/6a57f426-fe2d-3ad4-e261-b80536958b98.jpeg">

- AWSコンソールの手順に従い、設定を行います。

    1. ロードバランサーの設定
    2. セキュリティ設定の構成
    3. セキュリティグループの設定
    4. ルーティングの設定
    5. ターゲットの登録
    6. 確認
 
- HTTPSを利用する場合は、証明書の設定が必要なのですが、画面からだとエラーが出ることがあるのでその場合はCLIからの実行が必要です。詳細は [既存の ELB に SSL 証明書 を追加しようとするとエラーが起きる。](https://qiita.com/nagaakihoshi/items/7be9ef812acf0cc15d4b) をご覧ください。

## 2. ターゲットグループの作成

- ターゲットグループには、複数のAZを指定し冗長構成を図りました。
- ターゲットは後からでも登録できるので、後回し。
- 基本的には、ここでどんな設定をしても、DNSのAレコードを設定しない限り影響ないので、気軽に

## 3. ヘルスチェック用ファイルの設置

- 確認をしている中でヘルスチェックが「Unhealthy」と出ていたので、Document Root配下にチェック用ファイルを置き、ヘルスチェックを再設定

## 4. DNSのAレコード登録

- ロードバランサーの「説明」タブにある情報を参照し、DNSのAレコードを追加

<img width="1307" alt="EC2_Management_Console.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/154018/cc2fa232-3e1b-e18d-243d-848e2b45cd0b.jpeg">

- この状態で、ブラウザからアクセスすると **(とりあえずのAFTER)** の構成になっている

## 5. EC2インスタンスを新規作成

- 既存のサーバのAMIを作って、いつも通りにコピー作成
- その時に、AZを既存のEC2と違うところで作るのを忘れずに。あとで必要になります。

## 6. DNSのAレコード登録（直アクセス確認用）

- 既存のサーバ＋新規作成サーバのパブリックIPを参照し、DNSのAレコードに追加
- ロードバランサーを経由せず、インターネットから直接EC2にもアクセス可能な構成とするため

## 7. ターゲットグループに新規EC2インスタンスを登録

- 既存のサーバ＋新規作成サーバのパブリックIPを参照し、DNSのAレコードに追加
- ターゲットグループのターゲットの種類を「ip」で選択した場合は **プライベートIP** を指定する必要があります。ここで **パブリックIP** を指定しようとし、しばらくハマりました。

## 8. 動作確認

- 晴れて、ロードバランサーの設定は完了です。
- それぞれのサーバにアクセスがきていること、ログが出ていること、ラウンドロビンできていることを確認し、ひと段落。

# ここには書いてないけど、一緒にやったこと

- ログファイルバックアップの設定
    - ログファイルをS3にバックアップしているのですが、単純に稼働サーバを増やすだけだとログファイル名が被っちゃうことが想定されたので、ログファイル名にホスト名を含めるなどの手入れをしました。

- ログに出てくるIPアドレス取得に X_HTTP_FORWARDED_FORに切り替え
    - 参考：[PHPでリバースプロキシを挟んだアクセス元のIPを取得する方法](https://qiita.com/sayama0402/items/91bc05681eda7f25c45f)

# 感想

サブネットグループやインスタンスの新規作成など、結構直感で運用していた面も改めてレビューすることができました。
かといって、大きなハマりポイントはなく、設定完了まで行けたのでAWSさすが！！という感じです。
geotiffの作り方

#概要
　通常のjpgとワールドファイルとしてのjgwを使って、geotiffを作成するまで。

#サンプルデータ
　[国土地理院の東北地方太平洋沖地震正射画像](https://saigai.gsi.go.jp/h23taiheiyo-zort/index.html)
　[qgisのgdal_ttanslate](https://qiita.com/hawaii_hahaha/items/67ff9e529e442a618355)

#作成の方式
　このデータを解凍して、対応するjpgとjgwを同じディレクトリにおいておく。
（以下ではfg854.jpgとFG854.jgwがあるとする）
　ここで、gdalinfo fg854.jpgとすると
<pre>
Driver: JPEG/JPEG JFIF
Files: fg854.jpg
       FG854.jgw
Size is 2500, 1875
Coordinate System is `'
Origin = (102000.000000000000000,124500.000000000000000)
Pixel Size = (0.800000000000000,-0.800000000000000)
Metadata:
  EXIF_ColorSpace=65535
  EXIF_DateTime=2012:04:12 14:26:11
  EXIF_Orientation=1
  EXIF_PixelXDimension=2500
  EXIF_PixelYDimension=1875
  EXIF_ResolutionUnit=2
  EXIF_Software=Adobe Photoshop CS Windows
  EXIF_XResolution=(72)
  EXIF_YResolution=(72)
Image Structure Metadata:
  COMPRESSION=JPEG
  INTERLEAVE=PIXEL
  SOURCE_COLOR_SPACE=YCbCr
Corner Coordinates:
Upper Left  (  102000.000,  124500.000)
Lower Left  (  102000.000,  123000.000)
Upper Right (  104000.000,  124500.000)
Lower Right (  104000.000,  123000.000)
Center      (  103000.000,  123750.000)
</pre>

ここの、キーはgdalinfoは、最初の２行にあるように、この２つのファイルを読んで、infoを出力していることである。
そして、最後の行のUpper Leftとか、Lower Rightに、わけのわからない座標が設定されているということである。

いろいろ、調べてみると、これは
[平面直角座標系](https://qiita.com/kudarisenmon/items/2003b982247448affcf6)
なのである。

というわけで、ここは福島周辺なのでEPSG:2451の座標であるわけだ

#変換のパターン
<pre>
gdal_translate -of GTiff -a_srs EPSG:2451 fg854.jpg fg854.tif
</pre>
で無事geotiffができあがる。これをqgisで読めばラスタとして表示可能
Heroku の情報を得る方法

たまにはこういう記事があってもいいんじゃないでしょうか、ということで書いてみます。

## 1. Heroku の使い方を調べる
たくさんあるので割愛。

## 2. Heroku の機能のリリースとアップデートを知る

### Heroku 公式ブログをよむ

新機能のリリースや大きめの既存機能の変更などは、ブログで記事が投稿されます。
https://blog.heroku.com/

過去のブログ投稿はここから読めます。
https://blog.heroku.com/archives

RSSフィード
https://blog.heroku.com/feed

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7046/92a9c771-e3a1-86d0-f389-f0c9e0359d09.png)


### Heroku Changelog をおいかける
ブログよりも細やかな機能のリリースやアップデートの告知です。下記のWebページにもありますし、Twitterアカウント や RSSフィードもあります。私は Twitter みてます。

Webページ
https://devcenter.heroku.com/changelog

Twitter
https://twitter.com/HerokuChangelog

RSSフィード
http://feeds.feedburner.com/herokuchangelog

## 3. Heroku のドキュメントのアップデートを知る
Heroku の公式ドキュメントは「Heroku Dev Center」に集約されています。
https://devcenter.heroku.com/categories/reference

ドキュメントには随時アップデートがはいります。
いつかわったの！？って戸惑わないためにも、追いかけておくといいです。
（任意の記事が更新されたときに通知する仕組みは公式でないので、自前で用意する必要があります。）

新しいドキュメントの投稿については、下記のTwitterアカウントで告知されています。

https://twitter.com/HerokuDevCenter

## 4. 障害情報を知る

### Heroku Status
サービス稼働状況を示すステータスページが、Herokuにもあります。
https://status.heroku.com/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7046/4f03d172-9384-7ebf-4654-68c37e96ade6.png)

画面右上の「Subscribe」ボタンから購読ができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7046/97b9a023-ff48-7d97-5404-817550fa3103.png)

Twitter
https://twitter.com/herokustatus

RSSフィード

CLI
`heroku status` で確認できます。
`heroku status --json` でより細やかな情報も。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7046/8d1a6cdb-c0f6-106a-e271-8504db276dd7.png)


## 5. イベント情報を調べる
体験談や知見を得る為には、やはり情報交換するのがよいかも。
### Japan Heroku User Group
https://herokujp.doorkeeper.jp/
Heroku User Group というのがあります。Doorkeeper にページがあるので、ジョインしておくとなにかいいことがあるかも。

### 公式セミナー
Heroku は クラウドCRM企業の Salesforce.com のグループ会社です。Salesforce社が開催しているオンラインセミナーも随時開催されています。エンタープライズ寄りの内容が多いと思いますが、興味があれば。
https://developer.salesforce.com/ja/calendar

### Trailbrazer.jp
イベント情報は、Salesforce 関連のイベントがまとまっているサイトにも掲載されていきます。
https://www.trailblazers.jp/?s=heroku

以上です。
内包表記を使ってリストの作成を簡潔に書く

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の1日目です。

# 内包表記とは

内包表記はPythonの特徴的な文法で、リストや辞書などの生成が1行で簡潔に書ける便利な文法です。

内包表記にはいくつか種類があります。

```py3:リストを生成する「リスト内包表記」
>>> [i for i in range(5)]
[0, 1, 2, 3, 4]
```
```pyp3:辞書を生成する「辞書内包表記」
>>> {c: c.upper() for c in 'abcde'}
{'a': 'A', 'c': 'C', 'b': 'B', 'e': 'E', 'd': 'D'}
```
```py3:セットを生成する「セット内包表記」
>>> {c for c in 'abcdcdcd'}
{'b', 'd', 'a', 'c'}
```
```py3:ジェネレータを生成する「ジェネレータ式」
>>> (c.upper() for c in 'abcde')
<generator object <genexpr> at 0x10a5db308>
```

ここではリスト内包表記に絞って説明します。

## リストの生成をfor文と比較

```pycon:for文でリストを作成
>>> values = []
>>> for i in range(5):
...     values.append(i)
...
>>> values
[0, 1, 2, 3, 4]
```
```pycon:内包表記でリストを作成
>>> values = [i for i in range(5)]
>>> values
[0, 1, 2, 3, 4]
```

for文だと

1. 空のリストを生成する
2. for文
3. リストにappendする

の3行が必要ですが、内包表記だと1行で簡潔に書くことができます。

# `if`でフィルタリングする

`if`を使ってリストの内容をフィルタリングできます。

```pycon:for文でフィルタリング
>>> results = []
>>> for i in range(5):
...     if i % 2 == 0:
...         results.append(i)
...
>>> results
[0, 2, 4]
```
```pycon:内包表記でifを使ってフィルタリング
>>> results = [i for i in range(5) if i % 2 == 0]
>>> results
[0, 2, 4]
```

# 複数のfor

内包表記内で複数の`for`を書くことで、for文をネストした時のような動作を書けます。

```pycon:for文のネスト
>>> values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> results = []
>>> for i in values:
...     for j in i:
...         if j % 2 == 0:
...             results.append(j)
...
>>> results
```
```pycon:内包表記で複数のfor
>>> values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> results = [j for i in values for j in i if j % 2 == 0]
>>> results
[2, 4, 6, 8]
```

# 改行して見やすくする

内包表記内の式が長い場合や複数のforを使う場合は、見やすくするために改行すると良いです。

```pycon:
>>> results = [
...     j
...     for i in values
...     for j in i
...     if j % 2 == 0
... ]
```

# 参考

- Python3 チュートリアル
    - [5.1.3. リストの内包表記](https://docs.python.jp/3/tutorial/datastructures.html#list-comprehensions)
    - [5.3. タプルとシーケンス](https://docs.python.jp/3/tutorial/datastructures.html#tuples-and-sequences)
    - [9.10. ジェネレータ式](https://docs.python.jp/3/tutorial/classes.html#generator-expressions)
windows 環境で Create-React-app + material-uiの環境を作成


## 前提条件

node.js をインストール

https://nodejs.org/en/
よりダウンロードしてインストール
ここでは8.9.1LTSをインストールした。

## Quick Overview

```
npm install -g create-react-app

create-react-app my-app
cd my-app/
npm install material-ui --save
src/App.js の編集
npm start
```

## Create React App のインストール

```
npm install -g create-react-app
```

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

以下のコマンドを実行して作成

```
create-react-app my-app
```

実行結果

react 16.2 がインストールされた

```
PS C:\Users\masan\dev> create-react-app my-app

Creating a new React app in C:\Users\masan\dev\my-app.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts...


> uglifyjs-webpack-plugin@0.4.6 postinstall C:\Users\masan\dev\my-app\node_modules\uglifyjs-webpack-plugin
> node lib/post_install.js

+ react-dom@16.2.0
+ react-scripts@1.0.17
+ react@16.2.0
added 1267 packages in 119.412s

Success! Created my-app at C:\Users\masan\dev\my-app
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm run eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd my-app
  npm start

Happy hacking!
```

## material-ui のインストール

```
cd my-app
npm install material-ui --save
```

```
PS C:\Users\masan\dev\my-app> npm install material-ui --save
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.2 (node_modules\react-scripts\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

+ material-ui@0.19.4
added 248 packages in 42.261s
```

warning がでるが、windows 環境はサポートしないオプションのようなので、無視する。

## App.js の修正

src/App.js を修正

```
import React, { Component } from 'react';

import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import RaisedButton from 'material-ui/RaisedButton';

class App extends Component {
  render() {
    return (
      <div>
        <h1>Hello, world</h1>
        <MuiThemeProvider>
          <RaisedButton label="ボタン" primary={true} />
        </MuiThemeProvider>
      </div>
    );
  }
}

export default App;

```

## 実行

```
npm start
```

実行結果

```
Compiled successfully!

You can now view my-app in the browser.

  Local:            http://localhost:3000/
  On Your Network:  http://192.168.200.13:3000/

Note that the development build is not optimized.
To create a production build, use npm run build.

```

環境があっていればブラウザも自動的に起動される。起動されない環境では、http://localhost:3000/にアクセスすれば確認できる。
windows 環境でもホットローダが有効になっている。
ソース修正して保存すれば自動的に反映される。

以前は自分で gulpfile を書いていて、yeoman なども試したが Create React App 圧倒的に便利
ReactNativeでiPhoneXに対応する方法まとめ

iPhoneX対応方法について調査しましたのでまとめておきます。

## SafeAreaView
[react-native v0.50.0 - SafeAreaView](https://github.com/facebook/react-native/releases/tag/v0.50.0)
v0.50.0のリリースに含まれました。
親に当たるComponentをWrapして使います。

[react-navigation v1.0.0-beta.16](https://github.com/react-community/react-navigation/releases/tag/v1.0.0-beta.16)
react-navigationも既に対応しています。

そうは言ってもバージョン上げるの辛い、、という方には以下。


## react-native-device-info
[react-native-device-info](https://github.com/rebeccahughes/react-native-device-info)

こちらでデバイス名を取得することができます。
ただし、注意点がありましてシミュレーターはデバイス名が `Simulator` となってしまう為、開発の際は実機を用意しなければなりません。


## 論理解像度を取得する
[apple developer - Displays](https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.html)
論理解像度とはデバイスのスクリーンに依存しない、基準値となる解像度のことだそうです。デバイスによって異なるスケール倍率がありそれと論理解像度を掛け合わせ、物理解像度を決定しています。（appleはUIKit Sizeとしている）

iPhoneXの論理解像度は `375 x 812` なのでこれを取得して対応します。

※現状、iPhoneXの論理解像度はユニークですが新たなデバイスと被る可能性もありますので一時的な対応になるかと思います。


## まとめ
まだ発売され1ヶ月程度ですが、対応されていないアプリも幾つかあるようです。
iPhoneXの為にUI/UXを新たに構築するのはしんどいですが、従来のデバイスに合わせるのは比較的簡単なのでやっておきたいですね。
既存の ELB に SSL 証明書 を追加しようとするとエラーが起きる。

<img width="951" alt="スクリーンショット_2017-10-14_17_08_01__1_.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/154018/6ee5f3cf-07a8-8d2a-5a7d-d1ca860ad012.jpeg">


# AWSサポートに質問をしました。

```
画像にありますように、既存の ELB に SSL 証明書を追加しようとすると Server Certificate not found for the key というエラーが発生します。
こちらの解消方法をご教授いただけないでしょうか？
よろしくお願いいたします。
```
# 回答はこちら

お問い合わせ頂き誠にありがとうございます。

>画像にありますように、既存の ELB に SSL 証明書を追加しようとすると Server Certificate not found for the key というエラーが発生します。

マネジメントコンソール（以下MC）から ELB に SSL 証明書をアップロード・変更する場合、保存時にご連絡いただきましたエラーが発生することがございます。

証明書自体に問題がない場合、本件は MC の既知の不具合によって発生してしまったと考えられます。
こちらの不具合につきまして修正予定となっているものの、修正が完了する日時につきましては未定となっております。
ご迷惑をおかけいたしまして恐れ入りますが、修正されるまでの間に再度発生してしまった場合には、今回の方法や後述いたします AWS CLI でのご対応をお願いいたします。

上記のエラーが発生した場合、実際には証明書のアップロードまでは成功している場合があります。
その場合にはMCで証明書の変更を再度お試しいただきますと、対象の証明書が選択可能になり、その場合には更新も成功します。

なお上記エラーメッセージが発生した場合の別のワークアラウンドとしては、AWS CLI にて回避していただく方法をお勧めしております。

AWS CLI を使用した SSL 証明書の置き換え
http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-update-ssl-cert.html#us-update-lb-SSLcert-cli

# その後

何回かトライしてから見にいってみると証明書は登録されていた状態になっていたので、アップロードは成功していました。
かろうじて、画面上からできたのでよかったですが、同じところにハマる人がいた時のためにメモです。
Electronの簡易アップデート機能を実装した話

こんにちは、[Ducklings](https://ducklings.jp)の@syumaiです。会社では、360°映像 x ウェディングのサービス、[HUG WEDDING](https://hugwedding.net)の開発をやっています。
エンジニアは二人で、RailsやVue.jsを使った開発を基本的に行っています。(直近はC#をひたすら書いてました)

## Electron使ってます

弊社で作っている社内ツールに、Electronを使用しているものがいくつかあります。

Electronを採用した目的としては、
アルバイトの方などのコマンドラインツールに親しみが無いメンバーにも簡単に使ってもらえるように、
Node.jsツールのフロントエンドを提供する事が主となります。

Web用のUIライブラリも簡単に使えるし、
過去に別の目的で作った社内JSライブラリ等を持って来て使い回せているので、開発がめちゃめちゃ楽です。
Electron最高…。

## 今回やりたかったこと

### 社内ツールのアップデートを自動で行いたい

* 会社のスタッフが、東京、大阪、名古屋と散らばっているので、いちいちツールの再配布や連絡を行うのが面倒。
* 使用するスタッフが気付かないうちに、サクッとアップデートが行われるのが理想的。

### フロント側のコードだけアップデートしたい

* 基本的に、フロントのコードだけがアップデートされればいい。
* フォントや画像などのアセットも基本的に更新しない。
* フロントのコードのみなら、数100kBになるので、アップデートの負荷が低い。

## と言うことで…、

ストアに出すアプリケーションでも無いし、
上記の目的のために、[Squirrel](https://github.com/Squirrel)を使うのも大げさな感じがしたので、
フロントのコードだけを差し替える仕組みを整えました。

## 実装方針

* メインプロセスのコード、フロントのコード、その他アセットをそれぞれ別のasarとして固めるようにする
* アップデート機能は全てメインプロセス側に載せる
* アプリケーションの起動時にアップデートをチェックし、アップデートがあればダウンロードする
  * アップデート対象のファイルは、フロントのコードのみ
* 起動時に、アップデートのファイルが存在すれば、現在のフロントのasarと差し替える

## 実装のポイント

### Electronアプリケーション起動中のasar差し替え

基本的に、**asarはElectronアプリケーション起動中に差し替えられる事を想定していません。**
> Replacing the asar file when app is running will never be supported in Electron, it is like replacing the .exe or .dll when the program is running, which is very likely to cause troubles.
https://github.com/electron/electron/issues/2198#issuecomment-121730822

一度展開された後に、無理矢理asarを差し替えた場合、メインプロセスが落ちます。

asarの展開のタイミングは、asarパッケージ内のファイルへアクセスしようとするタイミングです。
fsや、html内からのアセット読み込みで使用しようとした時に展開されるようです。

なので、フロントのコードが読み込まれる前にアップデート作業を完了する必要があります。

### original-fsを使う

Electronに付属のfsは、asarをただのディレクトリかのように扱えるようカスタマイズされています。
https://github.com/electron/electron/blob/master/docs/tutorial/application-packaging.md
なので、`fs.rename('hoge.asar')`などでファイルを移動しようとすると失敗します。

こういったケースのために、

* `const originalFs = require('original-fs');`
* `process.noAsar = true;`

などで、asarを通常のファイルと同じように扱う手段が提供されているので、これらを使いましょう。

### ビルド時にうまくasarを分ける

ビルドにはelectron-packagerを使っていますが、electron-packagerの`--asar`オプションを使うと、全てのコードが一つのasarにパッケージングされてしまいます。
今回は、メインプロセスと、フロントのコードを別々にパッケージングしたいので、
アプリケーションのビルド時に、`asar pack`コマンドでフロントのコードを別でパッケージングし、Electronのresourcesディレクトリ配下にコピーされるように設定します。

## 実装内容

時間が出来たらリポジトリ作って載せます…！汗

## 結果

うまく、スタッフに気付かせないようサクッとアップデートする仕組みが完成しました！
これからもガンガンElectron使っていきます！
RESAS-APIのクライアントをJavaでつくってみました

# RESAS APIのクライアントをJavaで書いてみました

RESAS APIでいろいろデータを公開してもらっていますが、
なかなかデータをとるのは一苦労です。

そして一度作ったらみんなでシェアしたほうが便利だとおもったので
作ってみました。
そしてgithubに公開したのですが、いまいち検索に引っかからないので、
記事にしてみました。

※　注意：RESASのみで、法人インフォはまだ対応していません。

#RESAS-Client Java
githubにあげていますので、こちらからgit cloneするか zipでダウンロードして利用してください。

 https://github.com/code4nagoya/resas-client



## RESASのAPI一覧へのリンク



https://opendata.resas-portal.go.jp/docs/api/v1/index.html
https://opendata.resas-portal.go.jp/docs/api/v1/detail/index.html


# 簡単な使い方の説明 内水面漁船隻数を例に

各クラスにRequestとResultと、テスト用のクラスがあります。
テスト用のクラスで、手で僕がテストしてとれるのをみたぐらいになっています。
サンプル的にどうぞ
（一部のテストクラスはまとまっちゃっていますが、ご了承ください　スマヌ(-人-；)）

## RESAS APIの送受信をURLをベースにクラス名と変数を作成しています。

URLに沿った名前とそれにRequest/Result/RequetTestみたいな感じのクラスになっています。


内水面漁船隻数のAPIからデータを取得したいとするとURLが以下のようになります。

- api/v1/fishery/riverBoat/forStacked

クラス名をURLに合わせてつくっているので、クラスはFisheryRiverBoatForStacked***というなまえになっています。

＊＊＊の部分は、送信用のパラメータを持つクラスはRequest、受信用のパラメータを持つクラスはResultとなっています。

 -　HTTPのリクエストのパラメータをもつクラス　FisheryRiverBoatForStackedRequest
 -　受け取るクラス　　FisheryRiverBoatForStackedResult
 -　テストでつかった送信クラス　FisheryRiverBoatForStackedRequestTest


##　送信とAPIのキー

送信するには、以下のクラスを使います。

 * ResasHttpAccess httpのリクエストをするクラス
sendStringにRequestのurlとパラメータを渡します。
このクラスのなかにAPIのキーをかくところがありまが、実行時にjavaの引数に-DXPIKEY=******という形で渡します。



 * ResasUtil パラメータをセットするクラス
 Requestにlistにしたパラメータ名と値をそれぞれ渡します

## 合わせてみてみる

gitcloneしてきてもらい
FisheryRiverBoatForStackedRequestTestを見てみてください。

テストクラスにサンプルがあるのでみてみてください。以下抜粋です。

```java:

	@Test
	public void test() throws ParseException, IOException {
		ObjectMapper om = new ObjectMapper();

		List<String> paramNames = new ArrayList<String>();
		paramNames.add("prefCode");

		List<String> paramValues = new ArrayList<String>();

		paramValues.add("1");

		StringBuffer params = ResasUtil.addParameters(paramNames, paramValues);

		String result = ResasHttpAccess.sendString("api/v1" + FisheryRiverBoatForStackedRequest.url, params.toString());

		System.out.println(result);
		FisheryRiverBoatForStackedResult resultData = om.readValue(result,
				FisheryRiverBoatForStackedResult.class);

FisheryRiverBoatForStacked a = resultData.getResult();
　　　　}
```

# 最後に

一通りのクラスがあるので、ご利用くださいませ。
また、まだまだ抽象化や簡単にできるところがあるので皆さんのリクエストやヘルプお待ちしております。

(ﾟ∀ﾟ)地元が素敵な街になりますよう