OmniAICreator/Qiita-1.07M huggingface dataset:
Vue と一緒に Redux

## Redux の Store

カウンターで試します。まず、普通のReducerを以下のように作ります。（面倒臭いのでaction関数使わずに）

```js:store.js
import {combineReducers, createStore} from 'redux';

export const counter = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    default:
      return state;
  }
};

export default createStore(combineReducers({counter}));
```

各ファイルでこれを読み込んで`store.dispatch`します。

## コンポーネントでステートが使えるように

```js:with-state.js
import reduxStore from './store';

export default {
  data() {
    return {
      state: reduxStore.getState(),
    }
  },
  created() {
    reduxStore.subscribe(() => {
      this.state = reduxStore.getState();
    });
  }
}
```

これを`mixins`で取り組みます。
取り込んだコンポーネントは、`this.state`にその時のステートを持ち、ステートが更新されたら新たなステートで`this.state`が更新されるようになります。

## カウンターコンポーネント

```vue:components/Counter.vue
<template>
  <button @click="increment">{{state.counter}}</button>
</template>

<script>
import withState from '../with-state';
import store from '../store';

export default {
  mixins: [withState],
  name: 'Counter',
  methods: {
    increment() {
      store.dispatch({type: 'INCREMENT'});
    },
  }
}
</script>
```

`INCREMENT`アクションを発行すると、`counter`ステートが更新されて、`mixin`の中の`subscribe`で`this.state`を更新して再レンダリングという感じです。

## `react-redux`の`connect`みたく

まず`with-state.js`を変えます。やってることは`mapStateToProps`みたいな感じです。

```js:with-state.js
import reduxStore from './store';

export default mapState => ({
  data() {
    return {
      ...mapState(reduxStore.getState()),
    }
  },
  created() {
    reduxStore.subscribe(() => {
      const mappingState = mapState(reduxStore.getState());
      for (const key in mappingState) {
        // 値が変わってなければ再代入してしまっても`updated`されないようなので
        // 入れてしまう
        this[key] = mappingState[key];
      }
    });
  }
});
```

コンポーネント側も変えます。

```diff:components/Counter.vue
-  <button @click="increment">{{state.counter}}</button>
+  <button @click="increment">{{counter}}</button>
==================================================================================
-  mixins: [withState],
+  mixins: [withState(state => ({counter: state.counter}))],
```

`counter`が直接使えるようになりました。

## Redux Devtools

これはReactで使うのと同じ方法で使えます。

```diff:store.js
- export default createStore(combineReducers({counter}));
+ export default createStore(
+   combineReducers({counter}),
+   window.__REDUX_DEVTOOLS_EXTENSION__ &&
+     window.__REDUX_DEVTOOLS_EXTENSION__(),
+ );

```

![Kapture 2018-06-06 at 21.19.58.gif](https://qiita-image-store.s3.amazonaws.com/0/84144/9a191b20-2ca0-3aab-470e-03629bb2536c.gif)

## サンプル

https://github.com/nju33/example-vue-redux
Riotでイベントの最中にエレメントを消した場合の挙動

Riot.jsなどのJavaScriptフレームワークを使うと、簡単に要素を出したり消したりできます。ただ、時にはそれでややこしい現象になることもあります。

# イベントが…うまく伝わらない

Riotで作ったモジュールで、「確認済み - 未確認」の状態を制御するものを作っていました。

* 確認ボタンは未確認の状態でだけ出る
* 確認ボタンは`<button type='submit'>`になっていて、押したら確認フラグをセットしてあとはフォーム送信に任せる

というような形となっていました。ところが、この確認ボタンを押すと、確認フラグをセットしてボタンを消す…ところまでは動くのですが、ブラウザによってその後に送信されるかされないかが違ってくる、という状況になってしまいました。

# 原因

どうやら、「イベントを送ったエレメントをイベント中に削除した場合」にどうなるかが、ブラウザによって違ってくるようでした。あるブラウザでは「そのままイベントが上まで伝わる」、別なブラウザでは「削除した段階でイベントが止まる」というようになっていたのです。

ということで、イベントを上まで波及させる必要のあるエレメントは、`if`でエレメントごと削除してしまうのではなく、`display: none`で表示だけ消す、という処置を取るほうが適当なようです。
Google Cloud SDKのインストールと Google Cloud Shell への SSH 接続

RHEL7 に Google Cloud SDK のインストールし、SSH で Google Cloud Shell へ接続するまでの手順。

# 実行環境

* OS: RHEL7
* python: 2.7.5

# インストール

```shell-session
$ tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
[google-cloud-sdk]
name=Google Cloud SDK
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM

$
$ yum install google-cloud-sdk -y
```
# SDK の初期化

```shell-session
$ gcloud init --console-only

::

You must log in to continue. Would you like to log in (Y/n)?  Y

Go to the following link in your browser:

    https://accounts.google.com/xxxxxxxxxxxxxxxxxxxxx←URL にブラウザでアクセス


Enter verification code:←ブラウザで取得したコードを入力。以降はデフォルトのゾーンなどの入力が求められる
```
#SSH 接続

```shell-session
$ gcloud alpha cloud-shell ssh
```

WEB ブラウザで Google Cloud Shell を使用した場合と異なり、SSH 接続直後はプロジェクトが設定されていないので、以下のコマンドでプロジェクトを設定する。

```shell-session
$ gcloud projects list
PROJECT_ID             NAME              PROJECT_NUMBER
xxxxx                  yyyyy             zzzzz
$ 
$ gcloud config set project <PROJECT_ID>
```

参考：
* https://cloud.google.com/sdk/docs/quickstart-redhat-centos
* https://cloudplatform-jp.googleblog.com/2018/04/introducing-the-ability-to-connect-to-Cloud-Shell-from-any-terminal.html
* https://cloud.google.com/sdk/gcloud/reference/alpha/cloud-shell/ssh
* https://qiita.com/saber_chica/items/6d3a413ce73aae0f6607
    * 参考にさせていただきました。ありがとうございます。
Raspberry Pi3を5インチのディスプレイで使いたい

ラズベリーパイを5インチ画面に合わせて設定します。その後、タッチスクリーンの設定をします。LCD5-showというドライバーを使った方法もありますが、カーネルパニックになる恐れがあるのでLCD5-showは使いません。ちなみに私はLCD5-showを使ってカーネルパニックになりました。

# 解像度の設定
ターミナルからconfid.txtを開きます。

```
$ sudo vim /boot/config.txt
```

ファイルを開いた後、解像度を指定します。ハッシュタグが左端に付いているのですが、コメントアウトのための記号なので使用するコードの部分については消してください。ちなみに `=` の前後は半角を入れてはいけません。もし入れてしまうと起動できなくなります。

```
hdmi_group=2
hdmi_mode=87
hdmi_cvt=800 480 60 6 0 0 0
```
`hdmi_group`は、接続するディスプレイがCEAかDMTかを指定します。CEAはテレビ、DMTはパソコンのディスプレイなどに対応するそうです。CEAならば`hdmi_group=1`に、DMTならば`hdmi_group=2`にしてください。

>参考
[Raspberry Pi 解像度設定メモ](http://yotazo.hateblo.jp/entry/2015/02/19/170014)
[RPiconfig](http://elinux.org/RPiconfig)
https://corgi-lab.com/raspberrypi/raspberrypi3-hdmi/

`hdmi_mode=87`と指定した後、`hdmi_cvt=800 480 60 6 0 0 0`と指定します。これは、800x480 60Hz、アスペクト比 15:9、マージンなし、プログレッシブ、ReducedBlankではないという意味だそうです。

>参考
[秋月の800x480のHDMIディスプレイにRaspberry PIをつなぐ](http://hanposaki.blog.so-net.ne.jp/2016-09-11)
https://corgi-lab.com/raspberrypi/raspberrypi3-hdmi/

解像度の設定は以上です。rebootすると設定した通りになっているはずです。

# タッチパネルを有効にする

ディスプレイがタッチパネルであってもラズパイはタッチパネルと認識していないので、設定する必要があります。
再びconfig.txtを開き、

```
dtparam=spi=on
dtoverlay=ads7846,penirq=25,speed=10000,penirq_pull=2,xohms=150
```
と指定します。

このままでもタッチパネルは使えるようになるのですが、ペンを押下した位置とマウスカーソルの位置がずれるのでタッチセンサーの設定をします。設定にはxinput-calibratorを使います。

```
$ sudo apt-get install xinput-calibrator
$ xinput_calibrator
```

すると、十字マークが表示されるのでタッチペンでタッチします。十字マークは4つ表示されると思います。

無事終了すると、補正結果のようなものが表示され、99-calibration.conf に記述してくださいと指示されます。Raspbianの場合は、/usr/share/X11/xorg.conf.dにファイルを作成し記述してください。記述する部分はSection から EndSectionのところです。

以上でタッチディスプレイの設定は終了です。

>参考
[Raspberry Pi用タッチパネル機能付き5インチHDMI LCD](http://www.soramimi.jp/raspberrypi/xpt2046/)
Rails で gem を使わず、フォームで画像を扱う方法

Rails勉強し出して、フォームで画像を使いたいんだけど、
CarrierWaveやら、Paperclipやら、gemはまだ使いたくない。
PHPみたいに、シンプルに画像を直接プロジェクトのフォルダーに保存できないだろうか。

**できます。**

# 概略

```erb:フォーム
<%= form_tag('posts', multipart: true) do %>
  <input type="file" name="image">
  ...
<% end %>
```

```ruby:コントローラ
File.binwrite("public/my_images_folder/image_name.jpg", params[:image].read)
```

```html:画像のパス
<img src="/my_images_folder/image_name.jpg" />
```
画像のパスでは `/public/`は不要。form_tag では `multipart: true` をつけ忘れずに。
画像の保存先のフォルダ`my_images_folder`は先に作成してあげないとアップロードするときに「そんなフォルダないよ」と怒られます。


# サンプルアプリ

簡単なサンプルを作って、実用的な使い方を見ていきましょう。

![ezgif-4-111600c375.gif](https://qiita-image-store.s3.amazonaws.com/0/225997/3c6f244c-6e25-fc32-815d-21573c44bd33.gif)


```shell
$ rails new image-form-sample
$ cd image-form-sample
```
```ruby:/Gemfile
# 以下の行をコメントアウトする (JSON使わないので）
gem 'jbuilder', '~> 2.5'
```
```shell
$ bundle install
$ rails g scaffold post content:text image_name:string
$ rails db:migrate
```

```ruby:/app/controllers/posts_controller.rb
  # POST /posts
  def create
    @post = Post.new(post_params)
    if @post.save

      # 以下6行を追記
      if params[:post][:image]
        File.binwrite("public/post_images/#{@post.id}.jpg", params[:post][:image].read)
        @post.update(image_name: "#{@post.id}.jpg" )
      else
        @post.update(image_name: "default.jpg" )
      end

      redirect_to @post, notice: 'Post was successfully created.'
    else
      render :new
    end
  end


  # PATCH/PUT /posts/1
  def update
    if @post.update(post_params)

      # 以下4行を追記
      if params[:post][:image]
        File.binwrite("public/post_images/#{@post.id}.jpg", params[:post][:image].read)
        @post.update(image_name: "#{@post.id}.jpg" )
      end

      redirect_to @post, notice: 'Post was successfully updated.'
    else
      render :edit
    end
  end
```

```erb:/app/views/posts/_form.html.erb
<!-- multipart: true を追記 -->
<%= form_with(model: post, local: true, multipart: true) do |form| %>
  ...
  <!-- image_nameの項目を以下に変更 -->
  <div class="field">
    <%= form.label :image %>
    <%= form.file_field :image %>
  </div>
```

```erb:/app/views/posts/show.html.erb
<p>
  <!-- image_nameの項目を以下に変更 -->
  <strong>Image:</strong>
  <img src="/post_images/<%= @post.image_name %>" width="200px" />
</p>
```

```shell
$ cd public
$ mkdir post_images
$ cd ..
$ rails s
```
Readable Code を読む - 第1部と第2部 -

Readable Code を読む
====================
今までほぼ我流でコーディングしてきたので，ずっとどうにかしたいと思っていました．
そんなときに，O'REILLYの **Readable Code** を奨めてもらったので，読んで自分用にまとめてみようと思います．

今回の内容は，**第1部と第2部**です．

[はじめに・第1章はこちら](https://qiita.com/hsmtknj/items/8e126c81e7a055242135)
[第1部と第2部はこちら](https://qiita.com/hsmtknj/items/bc784cbff60256c951cc)
[第3部と第4部はこちら](https://qiita.com/hsmtknj/items/31601e3ebd51f22231b2)


本書は次のリンク先等で入手できます．
[Readable Code](https://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=77RQXSX2C82VCWRW3S02)


第１部 表面上の改善
=================
処理内容を変えない状態で，いかに読みやすいコードにするかというお話．
主に，**名前の付け方**や**レイアウト**のコツのお話．


## 2章 名前のつけ方

変数，関数，クラス等は**見てすぐに意味が分かる名前**が良い．
名前に**情報を詰め込む**．名前は短いコメントである．

- **具体的な名前**をつける（tmpやsizeなど，汎用的・抽象的な名前はなるべく避ける）
- **単語を加えて**情報を追加する（getPage()のPageなど）

### - 名前の長さ
**スコープ**（その名前が**「見える」**コードの行数）の長さに合わせて長さを考える．
使用範囲が小さければ，短い名前でも良い．

### - 単語の省略形
**基本的に避けた方が良い**が，一般的なものであれば使用して良い．
（evaluation を eval，document を doc など）

### - 名前のフォーマットで情報を伝える
- クラス : CamelCase
- 変数名 : lower_separeted
- 定数 : CONSTANT_NAME

`variable_`のように最後にアンダースコアをつけて，区別するなども良い．


## 3章 誤解されない名前

自分がつけた名前が，**別の意味に解釈されることはないか**自問自答する．
以下，状況別のおすすめ単語まとめ．

- `max`, `min`: 限界値を含めるとき
- `first`, `last` : 範囲を指定するとき（**最後を含める**）
- `begin`, `end` : 範囲を指定するとき（**最後を含めない**）
- `is`, `has` : 関数等がブール値を返すとき
    - 何が`True`で何が`False`かを明確にすること
    - **肯定系**を使うこと


## 4章 見た目の美しさ

コードを読みやすくするための**余白**，**配置**，**順序**についての説明

- 一貫性のあるレイアウト
    - 書き方を統一する
- 関連するコードはまとめてブロックにする
    - 同じ処理の関数化
    - コメント区切りで処理をグループ化


## 5章 コメントのつけ方

コメントの目的は，**書き手の意図を読み手に知らせる**こと．

> **優れたコード** > ひどいコード + 優れたコメント
> コードを理解するのに役立つものなら何でもいいから書こう

### コメントすべきでないこと
- コードから**すぐに**分かることをコメントに書かない
- コメントが不要なくらい，**良い名前**を関数や変数につける

### コメントすべきこと
- **自分の考え**を記録する（**コードの意図**を書く）
    - 〜すればよかったとか，〜より高速だったとか
- コードの欠陥に関するコメントをつける
    - `TODO:` あとで手をつける
    - `FIXME:` 既知の不具合があるコード
    - `HACK:` あまり綺麗じゃない解決策
    - `XXX:` 危険!大きな問題がある
- 質問されそうなことを前もって書く
- ハマりそうな罠を告知する
- **「全体像」**のコメント（クラスや関数の関係性など）
- 処理の要約を書く


## 6章 コメントは正確で簡潔に

- 曖昧な代名詞は避ける
- 入出力の実例を示す


第２部 ループとロジックの単純化
===========================
以下のような精神的な荷物を減らすコツのお話．

- 複雑なループ
- 巨大な式
- 膨大な変数

## 7章 制御フローを読みやすくする
**流れるように**読めるコードを書く．
コードの読み手が立ち止まったり，**読み返したりしないように**書く．

- 条件式の引数の並び順  
    ```if (length > 10)```
    - 左 : 調査対象
    - 右 : 比較対象
- if文の条件の書き方
    - 基本的に**肯定形**を使う
    - **単純な条件**を先に書く
    - **関心を引く条件**や**目立つ条件**を先に書く
- whileで書き直せるなら，do-while文は避ける
- goto文は基本的に使用しない
- ネストを浅くする


## 8章 巨大な式を分割する

巨大な式を分割して読みやすくする．

- **説明変数**を利用する

    ```py
    username = line.split(':')[0].strip()
    if username == "root":
    ```

- **ド・モルガン**の法則を使う

    ```
    1) not (a or b or c) ⇔ (not a) and (not b) and (not c)
    2) not (a and b and c) ⇔ (not a) or (not b) or (not c)
    ```

- 複雑なロジックになった場合，他に置き換えられないか考える




## 9章 変数と読みやすさ

- 不要な変数を削除する
- **制御フロー変数**を削除する
    - while文を抜ける判定をするだけの変数など
- 変数の**スコープ（使用範囲）を縮める**
    - **グローバル変数を避ける**
        - どこで使用されているか分かりにくい．追えない．
    - **ネスト内での変数定義**は言語によってスコープが異なる
        - なるべくブロックの外側で定義しておく（ifやwhileの直前など）
    - 変数定義の位置を下げる（先頭に定義しなくてもよい）
- 変数は一度だけ書き込む
    - 更新され続ける変数を追跡するのはしんどい
    - constやfinalなどのイミュータブルにする方法を使うのも良し
[Python]Choppiness index 


ビットコインのalgorithmic trading botを作るうえでレンジ判断に使える指標がないかと探していたら、Choppiness indexというものが見つかったのですがTaLibには無かったので自作しました。
I was looking for an indicator to identify sideways trend of a market and came across this index called "Choppiness index".I made it because the index was not in Ta-Lib, so please feel free to use it if you are interested.

>Choppiness index 引用元　reference
https://www.linnsoft.com/techind/choppiness-index

>Talib
https://github.com/mrjbq7/ta-lib



重要な計算部分　Important calculation part
tpの基本設定は"14"らしいです the basic setting of tp is "14" according to the webisite

```python:
ATR = ta.ATR(high,low,close, timeperiod=tp)
nmrt = np.log10(np.sum(ATR[i-tp:i])/(max(high[i-tp:i])-min(low[i-tp:i])))
dnmnt = np.log10(tp)
choppiness = 100*nmrt / dnmnt
```






Pandas DataFrame1 -> calculation -> pandas DataFrame2

```python:choppiness.py
import talib as ta
import numpy as np
import pandas as pd
from collections import deque

def choppiness(tp,candlestick):
    high = candlestick["high"]
    low = candlestick["low"]
    close = candlestick["close"]
    ATR = ta.ATR(high,low,close, timeperiod=tp)
    Timestamp = deque()
    CP = deque()
    for i in range(len(candlestick)):
        if i < tp*2:
            Timestamp.append(candlestick.index[i])
            CP.append(0)
        else:
            nmrt = np.log10(np.sum(ATR[i-tp:i])/(max(high[i-tp:i])-min(low[i-tp:i])))
            dnmnt = np.log10(tp)
            Timestamp.append(candlestick.index[i])
            CP.append(round(100*nmrt / dnmnt))
    CP = pd.DataFrame({"CP" : CP}, index=Timestamp)
    return CP
```




example of DataFrame1
<img width="285" alt="can.png" src="https://qiita-image-store.s3.amazonaws.com/0/227427/7199bfcb-f946-3ea1-b531-980daafbb46a.png">



example of DataFrame2
<img width="169" alt="cann.png" src="https://qiita-image-store.s3.amazonaws.com/0/227427/e50acf2f-d50a-2e6e-5af7-bf68383dd6a5.png">



graph of the result above
<img width="475" alt="a.png" src="https://qiita-image-store.s3.amazonaws.com/0/227427/f419db80-4888-798e-a480-f29f2567451c.png">







間違っている部分や効率化できる部分があればコメントいただける幸いです。
Please leave your comment if there is anything wrong or to make it more efficient
POSTでJSONを投げるとなにかJSONで投げ返してくるサーバ

# なぜ

測定器の繋がったコンピュータ（例えばラズパイ）とか、あるいは何かのアルゴリズムで返事を生成するプログラム（例えばAI）とかに、問い合わせを投げると返事をくれるweb APIみたいなのを用意してみたい。

portを変えてnodeを立ち上げまくっておけば、別の応答サーバに聞きに行って総合的に返事を考えてくれるサーバとかも作れよう。

# どのように

json返すだけなのでフル機能の express は要らなかったのだが、これでやるのが一番手が抜けた。

```npm```で```express-generator```をglobal installしておいて、```express -v pug```して（デフォルトがjadeなので古いライブラリに依存して文句が出る）、```npm install```して準備だけなら完了。

複雑なことを考えないので```routes/index.js```を書き換える。

```js
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
```

デフォルトでこうなっているので、最初はこれを書き換えて

```js
router.get('/', function(req, res, next) {
  res.set({ 'content-type': 'application/json;charset=utf-8' })

  res.json(body(req));
});
```

とかしてしまう。```function body(req)```を用意して、返したいオブジェクトをreturnすればよい。

形ができてきたら

```js
router.post('/', function(req, res, next) {
  res.set({ 'content-type': 'application/json;charset=utf-8' })

  res.json(body(req));
});
```

とpostの方に移してしまう。GETの間はテストはブラウザででも叩けばよかったがPOSTになったら```curl```で叩く。

```
 curl -X POST http://localhost:3000 -H "Accept: application/json" -H "Content-type: application/json" -d '{ "uid" : "u0001" }'
```

curlで送ったjsonは

```js
function body(req) {
  let params = req.body;

  //...
}
```

で拾う。

# モジュール化

色々と機能を差し替えられるようにしてあると便利そうな気がして、 POST処理まわりをこう変更する。

```js
const mod_name = '../modules/hogehoge.js';
const mod = require(mod_name);

router.post('/', function(req, res, next) {
  res.set({ 'content-type': 'application/json;charset=utf-8' })

  mod.body(req, (ans) => {res.json(ans)});
});
```

```../modules/``` というディレクトリができて、そこに関数が逃がされている。呼び出し方は今度は```mod.body(req, (ans) => {res.json(ans)});```となっていて、body()の中で非同期処理をやっていてもすっぽ抜けないようにしてある。

モジュールの名前が1段変数を介しているのは、あまり意味はない。

モジュール側はこう

```js
exports.body = function(req, act) {
    let json_data = {"Name":"dummy"};
    act(json_data);
}
```

作成できたjsonを引数で受けているであろう無名関数経由で```res.json()```に渡している。

おしまい。
第10話 ラマヌジャンの式

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第10話です。

```math
\pi^2-\sum_{n=1}^{\infty}\frac{1}{n^3(n+1)^3}=10
```
ラマヌジャンという、~~インドの変態~~ 数学者が発見した式です。

この式は次の式と同じです。

```math
\frac{1}{1^3 2^3}+\frac{1}{2^3 3^3}+\frac{1}{3^3 4^3}+\cdots=10-\pi^2

```

隣り合う数をかけて、3乗した逆数を無限に足すと、$10-\pi^2$になります。
無限和は第6話にも出てきましたね。

この式は、第6話の式を使うことで計算できます。
最初は式の展開を根気強く行うだけですので、面倒ですが難しくはないです。

冒頭のΣの中の計算式を変形するにあたり、次の式を使います。

```math
\frac{1}{n(n+1)}=\frac{1}{n}-\frac{1}{n+1}
```
では3乗して計算しましょう。

```math
\frac{1}{n^3 (n+1)^3 }=(\frac{1}{n(n+1)})^3=(\frac{1}{n}-\frac{1}{n+1})^3
```

この式を展開します。ちょっと長くなるので飛ばします。

```math
(\frac{1}{n}-\frac{1}{n+1})^3= (\frac{1}{n^3} -\frac{1}{(n+1)^3} )-3(\frac{1}{n^2} +\frac{1}{(n+1)^2} )+6(\frac{1}{n}-\frac{1}{n+1})
```

3つの式に別れました。まずは、一番右の部分の無限和を計算します。

```math
\sum_{n=1}^\infty (\frac{1}{n}-\frac{1}{n+1})= (\frac{1}{1}-\frac{1}{2})+(\frac{1}{2}-\frac{1}{3})+(\frac{1}{3}-\frac{1}{4})+\cdots \\
=\frac{1}{1}+(-\frac{1}{2}+\frac{1}{2})+(-\frac{1}{3}+\frac{1}{3})+\cdots=1
```

引き算でつながっているので、次の項と打ち消し合い、最初の数だけ残ります。
要はこういうことです。

```math
\lim_{n→\infty}f(n)=0\ のとき\\
\sum_{n=1}^{\infty}(f(n)-f(n+1))=f(1)
```

このパターンは左の式も同様です。
ここまでをまとめます。

```math
\sum_{n=1}^\infty \frac{1}{n^3 (n+1)^3 }=1-3( \sum_{n=1}^∞ \frac{1}{n^2} +\sum_{n=1}^∞ \frac{1}{(n+1)^2} )+6
```

さて、真ん中の式ですが、第6話でみたバーゼル問題の式です。
これが$\frac{π^2}{6}$となることを知っています。
また、n+1と言うのは、n=2からスタートしているのと同じなので、全体和の後にn=1の値を引きます。

```math
1+6-3( \sum_{n=1}^∞ \frac{1}{n^2} +\sum_{n=1}^∞ \frac{1}{(n+1)^2} )=7-3(\frac{π^2}{6}+\frac{π^2}{6}-\frac{1}{1^2} )
=7-π^2+3=10-π^2
```
感嘆符以外に見えるようになりたい「?」「!」feat.optional型

Swiftを初めて触ってから2年くらい経っているので
今更情けないんですが、ちゃんとわかっていないので、調べたことを整理しつつ記録します。



#変数の型が明確に分けられる
##例：optionalなString型

**optional型はnilを許容します**
```変数の型が持つ通常の値➕nil```の状態を保持できます。
宣言時に値を代入していないと、自動的にnilがセットされるのもoptional型の特徴です。

###optional型には?がつきもの

```Swift:optional.swit
var hoge: String?
hoge = nil
```
optional型は、型の後ろに「?」をつけます。
optional型は、nilが許容されるのでエラーにはなりません！

##例：optionalでないString型

```Swift:error.swit
var hoge: String
hoge = nil
```

これはエラーになります・・・
?が付いていないからです・・・




上記のことからも、SwiftはObjective-Cと違って、
**通常の変数(optionalでない変数)がnilを持つことがない**ことがわかります。

つまりは、**nilが入るのか入らないのかを「?」が教えてくれる:point_up:**というわけですね・・・！？:vulcan:





(2018/06/12　追記しました。)
続きです。
「?」とか「!」とか、どういう時に使うのか、Swift書きながらやっと覚えてきた感ある今日このごろです(｀・ω・´)

#「！」もOptional型

「!」も「?」と同じく、nilを許容する役割をする。


##「?」との違い

使用時には勝手にアンラップされる。
ただし、アンラップ時に変数がnilだった場合にエラーとなる。


##アンラップとは
Optional型の変数を使う時に必要な処理。
　アンラップの方法は複数ある。

- Forced Unwrapping(強制的アンラップ) 
- Optional Binding
- Optional Chaining

(上記のアンラップ方法に関しての記載は、今回は割愛)


##私的解釈図
<img width="586" alt="スクリーンショット 2018-06-13 0.11.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/186535/26a75344-fa80-3ca4-defa-5ba38e2ee29a.png">



以上です。
ご指摘などありましたら、コメントいただけると幸いです。
WindowsのAndroidStudioでFFmpegを使用する


##環境
- Windows 7
- AndroidStudio 3.0

##概要
本来はFFmpegをAndroid用にビルドして自作アプリに組み込む必要があるが、
Windowsでは成功例がなかった。
そこで、すでに作成済みのものをお借りして組み込もうとした。
しかし、いろいろエラーが出たのでその解決方法を記載。

##拝借先
↓をお借りしました。
https://github.com/WritingMinds/ffmpeg-android-java

##作成手順
↑のリンクから「ffmpeg-android-java-master.zip」をダウンロードして解凍。

解凍した「ffmpeg-android-java-master」をAndroidStudioで開く。

↓のようなエラーが出るが、リンクをクリックしてはいけない。
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/25600944-7cf2-adf7-5fae-137b37f4c496.jpeg)


build.gradleとgradle-wrapper.propertiesを変更する必要がある。

それぞれ以下のように変更。
変更前：classpath 'com.android.tools.build:gradle:<font color="Red">2.1.0-beta3</font>'
変更後：classpath 'com.android.tools.build:gradle:<font color="Red">2.2.0</font>'

変更前：classpath 'com.github.dcendents:android-maven-gradle-plugin:<font color="Red">1.3</font>'
変更後：classpath 'com.github.dcendents:android-maven-gradle-plugin:<font color="Red">1.4.1</font>'

↓画像
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/400551ad-6ce5-8949-5f52-69cd6385b3ae.jpeg)



変更前：distributionUrl=https\://services.gradle.org/distributions/gradle-<font color="Red">2.10</font>-all.zip
変更後：distributionUrl=https\://services.gradle.org/distributions/gradle-<font color="Red">2.14.1</font>-all.zip

↓画像
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/6c4ac744-c7f4-a1b6-16ca-3360c438f802.jpeg)

変更後、以下の画面が出るが、Updateしてはいけない。これをすると、先ほどの設定が書き換わる。Don't～をクリック。
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/cd8d10e6-0b9c-48f7-e1ab-aecf71542a94.jpeg)

この状態でビルドすると、以下のようなエラーが出る。
![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/f384f408-b9ff-9fa1-5389-b5f233916408.jpeg)

エラーの部分を以下のように変更。
![WS000021.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/d92c3b84-eb8d-52df-9294-fd70fefa2c0b.jpeg)

これでビルドが通るはず。
↓のアプリが起動できれば成功。
![Screenshot_2018-06-05-22-18-40.png](https://qiita-image-store.s3.amazonaws.com/0/256346/024df69e-c1af-9f74-c301-53c5e2d0c74f.png)
VSCodeでKotlinを使ってUnityで使えるAndroid用処理を作る　その１

##はじめに
前回、[VSCodeをUnity5開発用に設定する](https://qiita.com/fuminyami/items/28fab172bd866e514d16)の延長上のお話でもあるので、VSCodeをUnity開発向けに導入する部分は省略します。

今回はVSCodeでKotlinを使いAndroid用のUnity拡張機能を作る部分を中心にまとめます。

## 準備
###VSCodeの拡張機能のインストール
以下の拡張機能の導入を推奨します

[Kotlin Language](https://marketplace.visualstudio.com/items?itemName=mathiasfrohlich.Kotlin)

###kotlinのコンパイラを用意する
[公式ドキュメント:Working with the Command Line Compiler](https://kotlinlang.org/docs/tutorials/command-line.html)の手順にそって導入します。
※今回のやり方でビルドを行う分には導入の必要はありません。
kotlinコードのコンパイルテスト用にあると便利です。

##ビルド環境を整える
###Gradleの導入
[Gradle公式ページ](http://www.gradle.org/)から最新のGradleを入手しGRADLE_HOMEの環境パスを設定しておきます。（詳しい手順については省略）

Gradleの導入ができたらVSCodeのプロジェクト内にビルドに必要なファイルを用意します。
必要なファイルは以下のコマンドを実行し用意します。

```sh
$ gradle
```

実行後.gradleが作成されます。
続けてgradleの環境を導入していない人でもビルドできるようにする場合は以下のコマンドを実行しwrapper系のファイルを作成します。

```sh
$ gradle wrapper
```
###build.gradleファイルを用意する
ビルド時のふるまいを設定するファイルを作成します。
参考までに今回作成した設定ファイルのコードを紹介します。

```gradle

buildscript {
    ext.kotlin_version = '1.2.41' // kotlinのバージョンを指定
    repositories {
        mavenCentral() // kotlin用
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: "kotlin"

sourceSets {
    main.kotlin.srcDirs += 'src\\'
}

repositories {
    mavenCentral()
}

// 外部ライブラリの依存関係指定
dependencies {
    // kotlin標準ライブラリ
    // implementationの方がcompileよりも高速にビルド可能
    implementation "org.jetbrains.kotlin:kotlin-stdlib"

    compileOnly fileTree(dir: 'libs', include: ['*.jar'])
    // Unityのライブラリを持ってくる場合は
    // 参考 https://docs.unity3d.com/ja/current/Manual/PluginsForAndroid.html
    // 参考 https://docs.unity3d.com/Manual/NativePlugins.html
    // classes.jarが必要だがこのファイルは以下の場所にある
    //"\Editor\Data\PlaybackEngines\androidplayer\Variations\mono\Release\Classes.classes.jar"
}
```

※設定されているパスについては各プロジェクトの構成に合わせて適切なパスの設定が必要です。

##ビルド
ビルドの設定が完了したらVSCodeからビルドできるようにします。
毎回コンソールからコマンドを叩くのも面倒なのでショートカットキーに割り当てると楽で良いです。

###ショートカットの設定の仕方
[公式のドキュメント](https://code.visualstudio.com/docs/getstarted/keybindings)が一番わかりやすいです。

Keybindings.json内に今回のビルド用のショートカットを用意します。一例として今回設定したコードを紹介します。


```json
[
    { "key": "ctrl+l ctrl+k",       "command": "workbench.action.tasks.runTask",
                                    "args": "kotlinc" },
    { "key": "ctrl+g ctrl+k",       "command": "workbench.action.tasks.runTask",
                                    "args": "gradlew build"},
]
```

###ビルド後
無事ビルドが終わるとbuild\libsの中に.jarファイルが出来ているはずです。後はこれをUnityのpluginとして読み込ませてあげれば完了です。

##さいごに
今回は具体的な実装部分（肝心のkotlinのコード部分等）には一切触れませんでした。次回はkotlinで実際にUnityの機能を拡張する形で実装してみた例をベースに紹介したいと思います。
JavaScriptでrange関数を作る

備忘録。
もっと速いのがあればご教示ください。

### その1 オーソドックス

```javascript
const range = size => {
  const range = Array(size);
  for (let i = 0; i < size; i++) {
    range[i] = i;
  }
  return range;
};
```

`start`, `step`を実装すると

```javascript
const range = (start, end, step) => {
  if (typeof end === 'undefined') {
    end = start || 0;
    start = 0;
  }
  if (!step) {
    step = end > start ? 1 : -1;
  }
  const length = Math.max(Math.ceil((end - start)/step), 0);
  const range = Array(length);
  for (let i = 0; i < length; i++, start += step) {
    range[i] = start;
  }
  return range;
};
```

- underscore.jsを模倣した
- 結局これが一番早い

### その2 一行

```javascript
const range = size => [...Array(size).keys()];
```

`start`, `step`を実装すると

```javascript
const range = (start, end, step) => [...Array(Math.max(Math.ceil((end - start)/step), 0)).keys()].map(n => n*step + start);
```

- 引数を省略できない(省略したけりゃその1を使う)
- 速そうで遅い

### その3 うーん

```javascript
const range = size => Array.from({length: size}, (x, i) => i);
```

うーーん
初心者が、ハッカソンに出る！！


初心者が、ハッカソンに出る！！


geeknaviさん　の　IoT子どもハッカソン　に参加しました！

というよりも、アキハバラのIoTツアーも書いてあったので、
出てしまいました。

そこで　
geeknaviさんのプログラマーさんたちに大変お世話になりました。

皆さんが作っているものでないものをやろうと、
で、マイクロビックの兄弟でもう用意してきた方があり、
やはり　IchigoJamはいない〜〜＾で、用意してきたたくさんの機材を出して、
でも、NETに繋げない〜〜たりないものかいだしに（そこはアキバ便利）
で　ダウンロードしたら　今度はキーボードが動かない！！

で、午後はすごい時間ロス、、、、
6時に場所移動に、、、間に合いませんでした＞＜

　いくつも種類があるから　やり方が見つからなくて　わからないことが多かった中
IchigoJamをこの参加者の中で唯一詳しかったから
geeknaviさんのはんだごてで大変お世話になった方が、
下記を書いていたのを見つけました。
クラウドExpo2016でIDCフロンティア様のブースで出展されていた
https://geeknavi.net/iot/ichigojam_part1
を書かれていました。

昨年度の優勝者の方だそうです。


初心者で　昨年度夏、台湾オープンデータハッカソンにも出ました！
ハッカソン数回出ていますが、
その時にいい方と巡り会えるのは、本当に嬉しい出会いで、勉強にはなります！

私は毎回＊＊プレゼン資料作り。
そこは、数年色々勉強してきたので　デザインも好きで一人でやることができるので　
アイデアもあるので　と　その担当です。

1日では難しい！
ハッカソンは初心者には、最初から繋げるもののが楽かも。
ただ基盤が同じ人がいない方を選んだほうが、比べられなくていいとは思いますが、みんなエンジニアだから、早いし
すごいのばかり〜〜　勉強になりました。

というか、よく初心者で、色々出ていますね、私。

出してくれる主催者さん、組んでくださる、優しい素敵な皆さんありがとうございます。

次の登壇　協力してもらわないと、一人では無理なので、作れるか
Cannot subscript a value of type '[String : NSArray]' with an index of type '[String]' のエラー

また同じような間違いしそうなので、自分メモです。
尚、知識が激浅なため、誤った記述があるかもしれませんし、曖昧な記述が多いです。ご了承ください。

#エラー文言
>Cannot subscript a value of type '[String : NSArray]' with an index of type '[String]' 





ほぉ〜〜〜と思って英単語ググってましたけど、
>**subscript**：添え字、下に書いた

**subscript**って普通に専門用語( )だったんですね。^^;



ちなみにsubscriptとは、
>**Dictionary とか Array で hoge["fuga"] みたいな感じで、要素にアクセスするアレ**
引用：[Swift の Subscript について](https://qiita.com/happy_ryo/items/72b68859ed8ace9f5fb4)
　

だそうです。()

#環境
・Swift 4.0
・Xcode9.4



#つまづいたところ
とりあえず配列をvalueに持つ辞書型を作成。
(プロジェクトにもともとあったので使いまわしてますが、わかりにくいなぁ。。。)

``` Swift:hoge.swift
var menuSections:[String: NSArray] = [:]

        menuSections = ["キー1" : ["値A", "値B", "値C"],
                        "キー2" : ["値A", "値B", "値C", "値D"],
                        "キー3" : ["値A", "値B"],
                        "キー4" : ["値A", "値B"]
        ]
```

```Swift:hoge.swift
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 省略
        let sectionTitle: [String] = [menuSectionTitles[section]]
        let sectionTitles: NSArray = menuSections[sectionTitleStr]!
        return sectionTitles.count
        // 省略
    }
```


#こうしたらエラーが消えた

```Swift:hoge.swift
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 省略
        let sectionTitle: [String] = [menuSectionTitles[section]]
        let sectionTitleStr: String = sectionTitle[section] // 😇 
        let sectionTitles: NSArray = menuSections[sectionTitleStr]!
        return sectionTitles.count
        // 省略
    }
```
※ちなみにtableViewで使おうとしてました。


😇の行で、
**```let sectionTitleStr: String = sectionTitle[section]```**
この１行を加えたらエラーはなくなりました。。。。
むむ、とりあえず丁寧に展開しましょうというお話なんですかね。。。
(このとりあえずはよろしくないですが。。。。)


今回は解決方法だけ記載しましたが、すぐにきちんと理論まで理解、追記していきたいと思います。。。。！！

Swift自信なさすぎる(勉強し直し始め)ので、ご指摘などあればバシバシコメントしていただけると助かります。。。。

以上です。
抽象クラス（授業）

#抽象クラスの基本
抽象クラスとは、継承されることを目的とした、インスタンスを生成することができないクラスです。抽象メンバーとは実装をもたない宣言だけのメンバーです。抽象クラスに宣言、抽象メンバーの宣言ともに、通常の宣言に加えてabstractキーワードで修飾します。

###抽象クラスの宣言
```C#
abstract [修飾子] class クラス名1
{
   ...メンバの宣言
}
```
###抽象メソッドの宣言
```C#
abstract [修飾子...]戻り値の型 | void メソッド名（[引き数リスト...]）;
```
###抽象メソッドの宣言
```C#
abstract [修飾子...] データ型 プロパティ名
{
[[アクセス修飾子...]get];
[[アクセス修飾子...]set];
}
```
#抽象メンバの宣言
次のコードは生物クラスに抽象的メンバーを加えて抽象クラスに変更した例です。
```C#
abstract 生物
{
public DateTime 誕生日 { get: set}
public Sex 生物 { get: set}
public String 名前 { get: set}
abstract public void なく();
}
```
#抽象クラスの継承
前項の生物クラス（抽象クラス）を継承した「人」「猫」クラスの例です。
```c＃:
class 人 : 生物
{
public string 趣味 { get; set; }
public override void なく（）
{
Console.WriteLine("しくしく")
}
}
class 猫 : 生物
{
public string 飼主 { get; set; }
public override void なく()
{
Console.WriteLine("にゃー");
}
}
```
抽象クラスの継承は、一般的なクラスと同様に記述することができます。
従って、基本クラスが抽象クラスかどうかを意識する必要はありません。ただし、派生クラス側で抽象クラスを実装しなければならない点と、そのメンバーをオーバーライドしなければならない点だけ注意が必要です。

###一言
まだコードの書き方が分かっていません。
もしよければ、教えていただきたいです。
AE テキストのアンカーポイントを常に真ん中へ エクスプレッション

#テキストのアンカーポイントを常に真ん中へ
コピペで使えるようにメモです。


```jsx
src = thisLayer;
box = src.sourceRectAtTime(time -src.inPoint);
[(box.width/2)+box.left,(box.height/2)+box.top]
```
Embulkのバージョンアップ（0.8.17→0.9.7)

v0.8.17 から直接、0.9.7にはできませんでした

```
root% embulk selfupdate
2018-06-06 19:24:43.273 +0900: Embulk v0.8.17
Checking the latest version...
Found new version 0.9.7.
Downloading https://dl.bintray.com/embulk/maven/embulk-0.9.7.jar ...
Corruption checking failed (No such file or directory - jar:file:/var/folders/5p/04q0zd2n743384ct9h7smyc0pr0kw3/T/embulk-selfupdate20180606-44186-xp296u.jar!/embulk/version.rb).
This version might include incompatible changes.
Please add '-f' argument to selfupdate command to skip checking.
```

なので、`０．８系` の最新版を経由してから上げました

```
# embulk selfupdate 0.8.39
2018-06-06 19:28:09.293 +0900: Embulk v0.8.17
Checking version 0.8.39...
Found version 0.8.39.
Downloading https://dl.bintray.com/embulk/maven/embulk-0.8.39.jar ...
Embulk::VERSION in (J)Ruby is deprecated. Use org.embulk.EmbulkVersion::VERSION instead. If this message is from a plugin, please tell this to the author of the plugin!
Updated to 0.8.39.
bash-3.2# embulk -v
Embulk v0.8.39
```
(J)Rubyへの警告が出てますね・・・

```
# embulk selfupdate
2018-06-06 19:28:53.264 +0900: Embulk v0.8.39

********************************** INFORMATION **********************************
  Join us! Embulk-announce mailing list is up for IMPORTANT annoucement such as
    compatibility-breaking changes and key feature updates.
  https://groups.google.com/forum/#!forum/embulk-announce
*********************************************************************************

Checking the latest version...
Found a newer version 0.9.7.
Downloading https://dl.bintray.com/embulk/maven/embulk-0.9.7.jar ...
Updated to 0.9.7.
```

動作テストしなきゃ
Python で StreamingAPI を使って Twitter からリプライのテキストを収集

# Twitter のリプライたくさん欲しいですよね？
**今更ですが．**

## 背景
科学技術の進歩に伴い自然言語処理技術が発達してきました．
データと計算環境があれば会話や要約や感情分類等の様々なモデルを作れることはご存知だと思います．

また，TwitterのようなマイクロブログサービスやSNSでは大量のデータが日々生成されています．
そこでこんなことを思う人が出てきたのではないでしょうか？

- 「Twitterのリプライでチャットボットを作りたい！」
- 「ツイートから位置情報を特定したい！」
- 「あのアカウントを監視したい。」


その中でも今回は「Twitterのリプライでチャットボットを作りたい！」
そんな人のために，TwitterのStreamingAPIを用いたリプライ(テキストのみ)収集方法を紹介します．

## 動作環境
- Python 3.6+ (pyenv)
- Twitter StreamingAPI

## 流れ (tl;dr)
1. Twitter API tokens を[入手](https://apps.twitter.com/)
2. `git clone git@github.com:liseos-x140/twitter_scraper.git`
3. `cd twitter_scraper/`
3. `cp config.yml.default config.yml`
4. `config.yml`に 1.で入手した自分の tokens をそれぞれ記入．
5. `pip install -r requirements.txt`
6. `python twitter.py`

corpus/corpus/ja_YYYYMMDD_HHMMSS.txtに保存されていきます．
また，半永久的に動くので`screen`コマンド等を用いたバックグラウンドでの実行をお勧めします．

## Twitter API tokens
今回はStreamingAPIを使ってリプライ収集をしていきます．
~~StreamingAPIが近いうちにそのまま使えなくなるらしい？と聞いて記事をまとめたなんてことはないです多分．~~

まず，Twitter公式のdeveloperページから規約を確認し，tokensを入手してください．
https://apps.twitter.com
https://developer.twitter.com/content/developer-twitter/en.html


入手方法は割愛します．


## 初期設定
### ソースコードの入手

[ソースコード](https://github.com/liseos-x140/twitter_scraper)は自分のgithubに置いてあるのでまずcloneしてください．
`git clone git@github.com:liseos-x140/twitter_scraper.git`

このソースコードは，[Marsam-Ma-zz/twitter_scraper](https://github.com/Marsan-Ma-zz/twitter_scraper)を日本語リプライ収集用に独自改良したものです．

### API tokens を設定
まずcloneしたレポジトリに移動して，configファイルをコピーもしくはリネームします．

```sh
cd twitter_scraper/
cp config.yml.default config.yml
```

config.ymlの中身を自分のtokensに置き換えます．

```yaml:config.yml
twitter:
  consumer_key: YOUR_CONSUMER_KEY 
  consumer_secret: YOUR_CONSUMER_SECRET 
  access_token: YOUR_ACCESS_TOKEN 
  access_token_secret: YOUR_ACCESS_SECRET 
```

### 必要ライブラリのインストール
```sh
pip install -r requirements.txt
```

### 実行
環境によっては`twitter.py`のshebangを設定し直してください．
(プログラムの解説は時間のあるときに追記するかも)

```sh
python twitter.py
```

注意していただきたいのが，
**このスクリプトは問題が発生する限り半永久的に収集しますのでご注意ください**．
このため，`screen`コマンドなどを用いてバックグラウンドでの実行がお勧めです．

#### Filter
[stream.filter](https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/connecting)を用いて監視を行います．`track`に指定した文字列により，指定の検索ワードでストリーミングが行えます． 

デフォルトでは，

```
track=['私','あなた','俺','ー','する','です','ます','けど','何','@', '#', '＃', '。', '，', '！','？','…', '.', '!','?', ',', ':', '：', '』', ')', '）', '...']
```
という適当な文字列を指定しているので，自分でフィルターを改良したほうがいいと思割れます．詳しくは[公式ガイド](https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/connecting)を参照ください．

### 出力
corpus/corpus/ja_YYYYMMDD_HHMMSS.txtに保存されていきます．

| Line number | Sentences |
| :--- | :---|
|1	|誕生日おめでとう!|
|2	|ありがとう！|
|3	|おはようー|
|4	|おは！|
それぞれ Line number(1,2),(3,4) がそれぞれ独立した会話のペアになっており，奇数行が発言，偶数行がそれに対する返信となっています．


## 最後に
簡単にTwitterのリプライを収集する方法をまとめてみました．
~~（クソリプしか収集できない愚痴はTwitterユーザーに言ってください．）~~
コードを改良すれば，リプライのテキストと同時に画像を収集できると思います．

また，[改良元のレポジトリ](https://github.com/Marsan-Ma-zz/twitter_scraper)では中国語や英語のリプライを収集できるようになっています．近々，対話システム系のチャレンジがあるのでその練習とかに使ってみるのはいかがでしょうか？

#### DSTC7 Dialog System Technology Challenges
http://workshop.colips.org/dstc7/



初投稿ともあり拙い文章となっていて申し訳ありませんでしたが，
閲覧，ありがとうございました．
Embulk のリリースノート （0.9系）

自分用のメモ　
基本的にGoogle翻訳に通しただけ・・・なところが多数
（本当の目的は、0.9系にバージョンアップして問題ないかどうかの調査メモ）
[タイムゾーン呪いの書] (https://qiita.com/dmikurube/items/15899ec9de643e91497c) これがあったので気になった
→ `default_timezone: 'Asia/Tokyo'` を使わなくする的な話をどこかで聞いたので気になったのでした・・・　
PLAZMAでそんな事を言ってらしたと思ったんだけど、Documentには特にその記載はないなぁ・・・将来的な話かなぁ・・・


http://www.embulk.org/docs/release.html 

#Release 0.9.0　[Date : 2018-01-30]
## Java8
-　　Embulk0.9はJava8ベース（Java7との互換性なし）
-　　すべてのテストは、CIのJava 8で実行される
-　　`org.embulk.spi.time.Timestamp`　は　Java8から組み込まれた`java.time`クラスを使う

##Emulk0.9からGemベースのリリースはもうしない（0.8.39を最後にする０
- JARパッケージの構成は変更、Bundlerを使う形式に。Rubyのコードと依存性はJARファイル内に梱包される、Gem構成も一緒に。`embulk bundle`サブコマンドと`-bオプション`は必要なくなる
- ユーザはBundlerのGemfileを変更して、Embulkの明示的なバージョンを記述しないようにする必要があります。 Embulkコアの古いGemパッケージをアンインストールする必要があるかもしれません。
- `embulk/runner.rb` は削除済み

## 削除したもの
廃止予定（非推奨）だったクラスとメソッドが削除された
- `org.embulk.spi.json.RubyValueApi`
- `org.embulk.spi.time.Timestamp#getRubyTime`と`org.embulk.spi.time.Timestamp#fromRubyTime`
- `org.embulk.spi.time.TimestampFormatter`関連
- `org.embulk.spi.time.TimestampParser`関連
- `org.embulk.spi.util.DynamicPageBuilder` 関連
- `org.embulk.spi.util.PagePrinter ‘s constructor PagePrinter(Schema, TimestampFormatter.FormatterTask)`

## 非推奨
0.9.0 から新たに非推奨になったもの。0.10で削除予定（できるなら出来るだけ早く削除）
- `org.embulk.spi.ExecSession#newTimestampFormatter(String, org.joda.time.DateTimeZone)`

## Packaging
- `embulk-jruby-strptime` が `embulk-core` へ組み込まれた
- `embulk-cli` が `embulk-core` へ組み込まれた

##依存性
- `Bundle` が　`1.16.0`以上が必要に
- `JRuby`が`9.1.15.0`以上に

##その他変更点
- Gemプラグインのデフォルトディレクトリが`~/.embulk/lib/gem`へ変更
- JARプラグインのデフォルトディレクトリが、`~/.embulk/lib/m2/repository `へ変更
- Guessプラグイン（推測プラグイン）が、`embulk-standards`へ移動
- `ruby:` をプレフィックスに持つ `timestamp`フォーマットが追加
- `java:` をプレフィックスに持つ `timestamp`フォーマットが実験的に追加
- `guess_sample_buffer_bytes`オプションを修正。 `GuessParserPlugin`の読み込み先をユーザがして指定できるように


#Release 0.9.1　[Date : 2018-04-16]
- 依存性を含んでいない塞栓コアと塞栓基準の.pomファイルを修正しました
- プラグインが見つからないときのエラーメッセージを修正しました
- 重複した@Configの疎通名を許可する

#Release 0.9.2 [Date : 2018-04-16]
- 修正＃964：＃956と＃960を元に戻す

#Release 0.9.3 [Date : 2018-04-16]
- JRubyベースのプラグインが使用されていない場合、JRubyの初期化を停止します。

#Release 0.9.4 [Date : 2018-02-14]
- RubyのTimeオブジェクトを使用するEmbulk :: Schema

#Release 0.9.5 [Date : 2018-04-02]
- JRuby ScriptingContainerDelegateからより明示的な例外を投げ
- Embulk-announceメーリングリストの通知バナーを削除する
- "embulk bund -version"を受け入れて "bundle -version"を実行する
- CLIオプションの修正「-I」が「-C」で反転されました #バグ修正

#Release 0.9.6 [Date : 2018-04-10]
- "stdout"出力プラグインの列名を表示する
- GuavaのThrowablesを使用して除去
- com.google.common.base.Optional＃1：Configと内部使用以外のjava.util.Optionalを使用する
- JavaタイムスタンプからのRubyTimeの作成をナノ秒単位で修正


#Release 0.9.7 [Date : 2018-04-16]
- org.jruby.embed.ScriptingContainer を再び注入(injection)可能にした
音声が認識されない問題 Xubuntu　解決済み

#音声が認識されない問題を解決する。
古いパソコンを使っているとマイクと音声を入力するところと出力する場所が２つになっていると思います。
たとえば、Simple screen Recorderなどをつかうとわかりますが、うまく、音声が認識されていないのがわかります。これを改善するのは、以下の英語の文章をうって、しらべると良いでしょう。


>how to change volume in linux

ココらへんがいいかとおもいますが、どうでしょうか？
もしかしたら
一旦諦めてUSBタイプのヘッドセットを用意したほうがいいかな　ちょっと考えましょう。


これを導入して、行くとうまく行く流れがでる可能です。こちらが[リンク](https://www.bleepingcomputer.com/forums/t/547262/microphone-troubles-in-xubuntu-1404/)です。

```
sudo apt-get install libasound2-plugins:i386
```

##結論　音声の設定
これの[リンクを使って](https://www.onlinemictest.com/microphone-settings/ubuntu/)、音声を調整するとうまく行きます。どうやら初期設定ではマイクロフォンの音声が音になっていないことが原因でした。
Human Interface Guidelines - Authentication の日本語訳（2018/06/06時点）

Human Interface Guidelinesの[Authentication](https://developer.apple.com/design/human-interface-guidelines/ios/user-interaction/authentication/)のページが更新されたとのことなので和訳しました。

# 認証

認証は、パーソナライズされた体験の提供、追加機能の提供、コンテンツの購入、データの同期などの価値あるものとの引き換えにのみ求めるようにしましょう。もしあなたのアプリで認証が必要なら、アプリの楽しみの妨げにならないよう、サインインのプロセスをすばやく、簡単に、そして邪魔にならないようにしましょう。

## 全てのサインアップ、サインインプロセスでPassword AutoFillを使いましょう

パスワードとセキュリティコードが自動で生成、入力されるこの機能により、ユーザは認証画面で過ごす時間を減らすことができます。全てのアプリはこの機能をサポートすべきです。開発者向けのガイダンスは[Supporting Password AutoFill](https://developer.apple.com/documentation/security/password_autofill/)をご覧ください。

## サインインはできるだけ遅らせよう

ユーザは、何かをする前にサインインを強制されるとアプリを使うのをやめてしまうことがしばしばあります。なのでサインインさせる前にアプリに恋をする機会を与えましょう。ショッピングアプリの場合、商品の閲覧はアプリ起動直後にできるようにし、商品を購入する段階になってからサインインを要求しましょう。メディア閲覧アプリの場合、サインインをする前にコンテンツを探したり閲覧したりできるようにしましょう。

## 認証することのメリット、サインアップの方法を説明しましょう

もしあなたのアプリで認証が必要なら、ログイン画面でわかりやすく、手短にその理由とメリットを説明しましょう。また、あなたのアプリを使用している全てのユーザが最初からアカウントを持っているわけではないということに注意してください。どのように作るのか、アプリ内でどうサインアップするのか説明するようにしましょう。

## 適切なキーボードを表示し、データ入力を最小限に抑えましょう

例えばメールアドレスを入力してもらう場合、データ入力がショートカットできるものと一緒にメール入力用キーボードを表示しましょう。関連ガイダンスとして[Keyboards](https://developer.apple.com/design/human-interface-guidelines/ios/controls/text-fields/#keyboards)もご覧ください。利用可能なキーボードリストは[UITextInputTraits](https://developer.apple.com/documentation/uikit/uitextinputtraits)の[UIKeyboardType](https://developer.apple.com/documentation/uikit/uikeyboardtype)を参照してください。

## `パスコード`という用語を使わないでください

`パスコード`はiOS端末のロックを解除したり、生体認証が無効で別途Apple Payの認証が必要な場合に使うものです。

Apple Payのデザインガイダンスは[Apple Pay](https://developer.apple.com/design/human-interface-guidelines/apple-pay/overview/introduction/)を参照してください。


# Face ID と Touch ID

## 可能な限り生体認証をサポートするようにしましょう

Face ID、Touch IDは信頼できる、安全で親しみやすい認証方法です。ユーザが生体認証を有効にしている場合は、きっとユーザはその使い方を理解し利便性を高く評価しているので、可能な限り生体認証を使いたいと思うでしょう。一方生体認証を無効にする人もいるので、この場合のシナリオにも対応できるよう準備することを忘れないでください。

## 認証方法の提示は1つだけにしましょう

認証の選択肢が他にない状況だと、人は最も直感的になれます。なのでFace IDのように一つの選択肢だけ与えるようにしましょう。最初の認証方法で失敗した時のみ、ユーザ名とパスワードの入力のような代替手段を提示するようにしましょう。

## ユーザがアクションした時のみ認証を開始しましょう

ボタンをタップするなどの明示的な操作は、ユーザが認証したいと思っていることを表します。Face IDの場合は、ユーザがカメラに顔を向けた時にその可能性が高くなります。

## 常に認証方法を明確にしましょう

例えばFace IDを使用してログインするためのボタンは、"ログイン"ではなく"Face IDでログイン"というタイトルにすべきです。

## 認証方法への言及は正確にしましょう

Face IDをサポートしている端末でTouch IDについて触れないでください。逆に、Touch IDをサポートしている端末ではFace IDについて触れないでください。デバイスの特性を確認し、適切な用語を使用してください。開発者向けのガイダンスは[LABiometryType](https://developer.apple.com/documentation/localauthentication/labiometrytype)を参照してください。

## 特に何もなければアプリ内で生体認証を有効にする設定を使用しないようにしましょう

生体認証がシステムレベルで有効になっている場合のみ、ユーザがそれを使いたいと思っているとみなしましょう。もしアプリで固有の設定ができる実装をしてしまうと、システム全体では生体認証を無効にしているのに、あなたのアプリでは有効になっているような状態ができてしまう可能性があります。

## システムが提供している認証機能と同じアイコンは使わないでください

システムが使用しているTouch ID（親指の指紋）アイコン、Face IDアイコンのようなものを見た場合、ユーザは認証しなければいけないと思ってしまいます。このような認証アイコンを使ってしまうと、矛盾が生じたり、混乱を引き起こしたりしてしまいます。特にそのアイコンに色が付いていたり、大きいサイズで表示されていたり、文脈から外れて表示されている場合はなおさらです。

開発者向けガイダンスは[Local Authentication](https://developer.apple.com/documentation/localauthentication)をご覧ください。
rails generate controller で不要なファイルを生み出さないために

Railsを使っていて、新しくControllerを追加するときに、こんな感じで必要なファイルを生成するかと思います。

```sh
rails generate controller hoge
```

ドサッとファイルが生成されるんですけど、

```sh
$ rails generate controller hoge
      create  /controllers/hoge_controller.rb
      invoke  erb
      create    /views/hoge
      invoke  rspec
      create    spec/controllers/hoge_controller_spec.rb
      invoke  helper
      create    /helpers/hoge_helper.rb
      invoke    rspec
      create      spec/helpers/hoge_helper_spec.rb
      invoke  assets
      invoke    coffee
      create      /assets/javascripts/hoge.js.coffee
      invoke    scss
      create      /assets/stylesheets/hoge.scss
```

> 「いちいちControllerごとにCSSやJSを分けたりしない」
> 「このControllerでHelperを使う予定はない」
> 「テストコードは必要になった時に書くから、最初からは要らない」

なんて人もいるんじゃないでしょうか。

不要なファイルを生成しないためのオプションが用意されています。

|オプション|省略される要素|
|---|---|
|`--no-assets`|`app/assets/stylesheets`以下の`*.css`<br>`app/assets/javascripts`以下の`*.js`|
|`--no-helper`|`app/helpers`以下のHelperファイル|
|`--no-test-framework`|`spec/controllers`以下のSpecファイル|
|`--skip-routes`|`config/routes.rb`のroutesの追記|
|`--skip-template-engine`|`app/views`以下のViewファイル|

以上、まとめた記事が見つからなかったので、自分でまとめてみました。
Herokuでアップロードした画像が時間経つと消える問題

# 問題
フォームで画像を投稿できる機能を作って、
画像を投稿した直後は普通に表示されるけど、
一定時間が経つとなぜか画像が消えてしまう。

# 原因
一定時間が経つと、Heroku上のリポジトリ (Dyno) が最後のコミットの状態にリセットされるから。

# 対処法

## ①クラウドストレージ

もっとも一般的なのは、AWS Amazon S3などのクラウドストレージに画像を保存する方法。
クラウドストレージとは、プログラムを通して画像を外部のサーバ(クラウド)にアップロードし、そのURLを取得できるサービス。
比較的簡単に実装できますが、画像の量によってはお金がかかります。

Railsの場合:
https://qiita.com/hmmrjn/items/479c9e9ce82771f1b6d7

## ②データベースに保存

データベースに画像のバイナリデータを保存し、画像を表示するための関数などを用意する方法もあります。
こちらはお金はかかりませんが、画像のURLの扱い方などが少し複雑です。

Railsの例:
https://sha.ngri.la/index.php/Railsで画像をデータベースに登録し表示する%E3%80%82
simple screen recorderがインストールできない

# Ubuntuではできたスクリーンキャプチャができない
まずは現状として、どのようなコマンドを入力したのかを見ていきましょう。

この問題は次のコマンドを順番に入力していないからである。
レポジトリーのセットの後のアップデードが非常に重要であるということ。
そうしないとこのパッケージはロケートできませんとでますので注意しましょう。

```
sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
sudo apt update
sudo apt install simplescreenrecorder simplescreenrecorder-lib
```

##新たな問題点
レポジトリーはどこにあるのか？
【Swift】PagingMenuControllerの描画がズレる

PagingMenuControllerの小ネタです。

PagingMenuControllerでaddSubViewされるviewの横幅がなぜか大きく表示されていたので、その解決方法です。
普通にテーブルビューを含むviewControllerをaddSubViewする分には全く問題がなかったのに、とある画面だけ表示がずれていたので、原因を探ってみました。

結論としては、addSubViewされる対象の画面がスクロールビューを持っていたのですが、このスクロールビューの生成が間に合っておらずwidthがxcodeのデフォルトの値のままで、その子ビューもスクロールビューのサイズに合わせて生成されていたためだと思います。（これが原因かどうかは断定できませんが…）
addSubViewされる画面は端末の横幅で生成されていたので、サイズの合わないビューに対して無理やりaddSubViewしていたので、以下のように修正したらうまく表示できました。

```ruby:
UIView.animate(
            withDuration: 0.0,
            delay: 0.0,
            animations: {
                self.scrollView.setNeedsLayout()
        }, completion: {(finished: Bool) in
            if finished {
                self.pagingView.addSubview(pagingMenuController.view)
                self.addChildViewController(pagingMenuController)
                pagingMenuController.didMove(toParentViewController: self)
            }
        })
```

今回のケースだと、pagingMenuControllerのビューをaddSubViewする対象のビューのスクロールビューの生成がうまくいっていなかったため、スクロールビューに対して更新をかけていますが、通常のビューでも生成がうまくいかなかった場合は対象のビューに更新をかけてやれば正しく表示されるかと思います。

pagingMenuControllerはaddSubViewする時に制約を自動で付与してくれているっぽいので（要確認）、逆にハマってしまいました。
手動でつけられたらこんなに悩まなかったのに…。

**※ちなみに手動でautolayoutを切って制約をつけたら画面が表示されないバグにハマりました（xcode上では正しく表示されます）。**

自分でもかなり凌ぎの実装だな〜と思いますが、他にやり方が思いつかなかったので、addSubViewやPagingMenuControllerに詳しい方がいらしたらご教授お願いいたします。
OculusGo 開発をUnityで行うノート

## Pref.
個人的OculusGo開発用の備忘録です．
だんだん書き足していく予定です．
毎回の如く間違っていたらコメントをよろしくお願い致します．

## Env.
Unity20181.1f1

## 基本設定
### 1. PlayerSettingの変更

- 通常のAndroidビルド時の設定のとき同様にCompanyNameなどを変更する．
- Other Settings / Minimam API Levelを API Level 19に変更する．
- XR Settings / Virtual Reality Supported にチェックを入れ，Virtual Reality SDKsにOculusを追加する．

### 2. OculusGo Utility をインポート
以下のURLからOculus Utility をDLして，中にあるunitypackeageをプロジェクトに展開する
これをしないとはじまらない( •̀ .̫ •́ )✧
[https://developer.oculus.com/downloads/package/oculus-utilities-for-unity-5/](https://developer.oculus.com/downloads/package/oculus-utilities-for-unity-5/)

### 3. パフォーマンス設定
適当な名前のスクリプトを作成し適当なオブジェクトにアタッチを行う．
<font color="red">以下の記述を行うことで描画のクオリティーが激変する．</font>

```SystemUtility.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SystemUtility : MonoBehaviour {

	void Start () {
        OVRManager.display.displayFrequency = 72f; //72Hzモードに変更

        //パフォーマンスレベルの変更 Default=2 0~3,低~高 とパフォーマンスが変わる
        //3にすると高クロックになり著しくバッテリー消費と発熱を起こす．
        OVRManager.cpuLevel = 2;
        OVRManager.gpuLevel = 2;
    }
}
```

また Edit/ProjectSettings/Qualityを開き以下のようにLevelを設定する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181807/3f56160b-a51f-3cfd-d32b-8f2de2ce9479.png)

### 4. カメラを配置
はじめから存在しているCameraを削除し，
Oculus/VR/Prefabs/<font color="orange">OVRCameraRig.prefab</font>をヒエラルキーに配置を行う．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181807/105f44c7-680d-3a2f-31bf-f20be62f21f0.png)

### 5. コントローラを配置
Oculus/VR/Prefabs/<font color="orange">TrackedRemote.prefab</font>を<font color="green">LeftHandAnchor</font>と<font color="green">RightHandAnchor</font>の両方にアタッチすることで
システム設定の右利きか左利きかで自動的に左右が選ばれるコントローラが表示される．

<img width="551" alt="アセット 1@2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/181807/d01accee-1a93-6065-d94a-039aea2f106d.png">


## その他
### OVRManager
|関数|説明|
|---|---|
|OVRManager.display.RecenterPose();|位置の初期化|

## 参考
[https://framesynthesis.jp/tech/unity/oculusgo/](https://framesynthesis.jp/tech/unity/oculusgo/)
[https://framesynthesis.jp/tech/2015/07/oculuslegacy/](https://framesynthesis.jp/tech/2015/07/oculuslegacy/)
[https://www.pixiv.net/fanbox/creator/177993/post/43818](https://www.pixiv.net/fanbox/creator/177993/post/43818)
[http://rikoubou.hatenablog.com/entry/2018/06/04/193607](http://rikoubou.hatenablog.com/entry/2018/06/04/193607)
Siri Shortcutsについて調べてみた【ショートカット登録編】

WWDC18で発表されたSiriのShortcuts機能についてリファレンスを参考に調べてみました。

# 概要
ユーザーの日常のルーチンを適切なタイミングでサジェストしてくれ、ショートカット実行させてくれる便利な機能です。
ロックスクリーン、Spotlight検索、SiriのApple Watchインターフェースから直接アプリのアクションを実行することができます。

# Siri Shortcutsでできること
* ショートカットの登録
* ショートカットの削除
* ショートカットフレーズの設定
* Siriにユーザーが実行したい行動と関連したアクションであることを伝える

# ショートカットの登録
リファレンスには以下のように書かれており、ユーザーがアプリ内のアクションを実行したタイミングで登録すべきとのことです。
> You should donate shortcut after each time the user performs the action in your app.

ショートカットの登録は以下2つのどちらかを使います。
* `NSUserActivity`
* `INInteraction`

## NSUserActivityを用いた登録
手順は以下です。

1. `NSUserActivityTypes`をInfo.plistに登録する
2. アプリ内の処理で`NSUserActivity`をインスタンス化する
  1. `title`、`userInfo`、`requiredUserInfoKeys`等、必要なプロパティ情報を設定する
  2. `isEligibleForSearch`と`isEligibleForPrediction`プロパティを`true`にする
  3. `persistentIdentifier`プロパティを一意になる文字列で設定する(`NSUserActivityPersistentIdentifier`構造体として生成する必要がある)
  4. Siriからあるフレーズを指定して起動したい場合、`suggestedInvocationPhrase`プロパティを設定する
3. コントローラオブジェクトのプロパティに 2. で作成した`NSUserActivity`を保持させる(※補足1)
4. `NSUserActivity`の`becomeCurrent()`メソッドを呼ぶ

上記でアクティビティの登録は完了です。
あとは、登録したアクティビティがタップされた時のハンドリング処理を`AppDelegate`の`application(_:continue:restorationHandler:)`メソッドに実装します。

上記の手順が完了するとSpotlight検索で検索をかけるとアクションが実行できるようになり、実行することでSiriのサジェストにも出てくるようになります。

※補足1：
Apple公式ドキュメントの`NSUserActivity`の利用時の注意に対する対応です。
> アクティビティやそのメタデータが確実にインデックスされるよう、実際にインデックスされるまでの間は、当該アクティビティに対する強い参照を保持していなければなりません。それには2つのやり方があります。ひとつは、アクティビティを生成するコントローラオブジェクトのプロパティに当該アクティビティをアサインする方法です。

参照：https://developer.apple.com/jp/documentation/General/Conceptual/AppSearch/Activities.html

## INInteractionを用いた登録
手順は以下です。

1. 提供したいアクションがSiriKitの「Intent Domains」にあるかを確認し、なければカスタムIntentを作成する(※補足2)
2. `INIntent`継承クラスを作成する
  1. 必要なパラメータ、画像を設定する
  2. Siriからあるフレーズを指定して起動したい場合、`suggestedInvocationPhrase`プロパティを設定する
3. `INInteraction`をインスタンス化し、 2. で作成した`INIntent`継承クラスを渡す
4. `donate(completion:)`メソッドを呼び出し、Siriにショートカットを伝える

上記で登録は完了です。
あとは、ハンドリング処理を`AppDelegate`の`application(_:continue:restorationHandler:)`に実装します。

※補足2：Intentの作成
https://developer.apple.com/documentation/sirikit/creating_an_intents_app_extension

# 参考
Donating Shortcuts：https://developer.apple.com/documentation/sirikit/donating_shortcuts
AzureのFunction Appで時間を扱うときのメモ

Function AppのデフォルトのタイムゾーンはUTC。なので
タイマーでトリガーするときのcron式もUTC時間で指定する
日本時間の朝６時に起動したかったら、次のように21時に指定する
`0 0 21 * * *`

このような設定で、Node.jsでGoogleカレンダーのAPIに日本時間の日付範囲を指定してデータを取得するには、下記のように[Luxonライブラリ](https://moment.github.io/luxon/)を使うと便利

```js
const { DateTime } = require('luxon');
console.log(DateTime.local());
//DateTime {
//  ts: 2018-06-05T21:00:00.000+00:00,
//  zone: UTC,
//  locale: en-US }

var dt = DateTime.local().setZone('Asia/Tokyo');
console.log(dt);
//DateTime {
//  ts: 2018-06-06T06:00:00.000+09:00,
//  zone: Asia/Tokyo,
//  locale: en-US }

//本日の予定を取得したいので
var targetDate = dt.startOf('day').toString();
var targetEndDate = dt.endOf('day').toString();
console.log(targetDate);  //2018-06-06T00:00:00.000+09:00
console.log(targetEndDate); //2018-06-06T23:59:59.999+09:00

//GoogleカレンダーのAPI呼び出し
//・・・・・
```