OmniAICreator/Qiita-1.07M huggingface dataset:
Dvorak配列 + Google日本語入力 のススメ

# はじめに

どうも、Dvorak教の信者、 @rinchsan です。

この記事では、Dvorak配列というキーボード配列と、その弱点をGoogle日本語入力でカバーする方法を紹介します。

# Dvorak配列とは

<img width="927" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/149003/91a0fa45-b616-9225-b805-19a9c26a4227.png">

上の画像のようなキーボード配列で、より文字入力が楽になるようにとDvorakさんが考案したキーボード配列です。
Macであれば、キーボードの環境設定の入力ソースから簡単に設定することができます。
世に出ているほとんどのキーボードに印字されている配列はQWERTY配列と呼ばれています。

## いいところ

### よく使われるキーほどホームポジションに近い

英字入力でよく使われる`t`や`n`、`e`などのキーがホームポジションに配置されています。
Dvorak配列を使うと、ホームポジションのある真ん中の横列キーの使用率が70％ほどになると言われています。
確かQWERTY配列での真ん中のキーの使用率は30％ちょっとくらいだったと思います。

### 左右の手で交互に打てる

さらに、文字を入力する際に、右手と左手で交互に打てる確率が高くなるように設計されています。
これによって入力が速くなったり、疲れを両手に分散できたりします（多分）。

### なんかカッコいい

QWERTY配列以外の配列を使っているとなんかカッコいいです。
「すげー」とか「変態じゃーん」とか言われるので嬉しいです。
上述したいいところも知っての上ですが、僕がDvorakに入門した大きな理由はこれです。

## わるいところ

### 「く」とか「きょ」とかが打ちづらい

Dvorak配列はあくまで英字入力に特化した配列なので日本語入力では不便なところがあったりします。
例えば「く」を打つときには、`k(左人差し指) -> u(左人差し指)`と打つ必要があるので左手がしんどいです。
また、「きょ」を打つときには、`k(左人差し指) -> y(左人差し指) -> o(左薬指)`と打つ必要があり、これまた左手が辛いです。

### 他人にPCを貸すと何も打てなくなる

他人に入力してもらったりするときにPCを貸すと、何も入力できなくなります。
いちいち入力ソースをQWERTY配列のものに戻す必要があってめんどいです。

### 他人のPCを借りると何も打てなくなる

人にPCを貸すと何も入力できなくなるのと同様に、他人のPCを借りて何かを入力するときに何も入力できなくなります。
キーボードに印字されているアルファベットを見ながら入力するというPC初心者のような姿に退行することができます。

### QWERTY配列からの移行がしんどい

PCを触っている人ほどQWERTY配列に慣れてしまっているため、Dvorak配列に移行するのがとても辛いです。
Dvorak使用者が少ないのはほとんどこれが原因じゃないかなと思います。
僕自身も慣れるまで1ヶ月くらいかかった記憶がありますし、移行中は入力速度が亀レベルになります。
しかも最初は配列を覚えられないので、画面上にキーボードビューアを表示し続けることにもなります。

# Google日本語入力でDvorak配列の弱点をカバーする

Google日本語入力を使うと、「く」とか「きょ」が打ちづらい弱点をカバーすることができます。
他人のPCが触れない弱点はカバーできません。

## Google日本語入力とは

有名なIMEで、[ここ](https://www.google.co.jp/ime/)からダウンロードできます。
Macであればこれをキーボード環境設定から入力ソースに指定すると使うことができます。

## キーマップ設定

Google日本語入力では、自分で定義したローマ字入力方法を使うことができます。
Google日本語入力の環境設定の`一般 -> キー設定 -> ローマ字テーブル`の編集から自分で作成したローマ字テーブルをインポートすることができます。

## おすすめキーマップの紹介

[ここ](https://raw.githubusercontent.com/rinchsan/dotfiles/main/etc/dvorak-jp.txt)に僕が使っているオススメのローマ字テーブルを置いています。
これのコピーをローカルに保存してGoogle日本語入力にインポートするとローマ字テーブルを変更することができます。
このローマ字テーブルを使うと、先ほど例に挙げた「こ」は`c(右手中指) -> o(左手薬指)`で入力でき、「きょ」は`c(右手中指) -> n(右手薬指) -> o(左手薬指)`で入力できます。
他にも簡単になっている文字があり、「にゅうりょく」とかも簡単に入力することができます（この記事を入力しながら思いました）。

# おわりに

皆さんもDvorak教の信者になってみませんか？
rel="preload" でリソースを事前にダウンロードする

# 概要
`link 要素` の `rel 属性` に `preload` を指定することで、ナビゲーションが行われた後に指定したリソースをダウンロードします。

サブリソースから参照される画像やフォントなどのリソースは、参照元のロードのタイミングに依存します。

`rel="preload"` を使用して、必要なリソースを事前読み込みをすることでパフォーマンスの向上に寄与する可能性があります。

本稿ではサブリソースから参照されるファイルの取得タイミングについて、紹介したいと思います。

# サブリソースに書かれたリソースの読み込みタイミング
例として CSS から画像を参照するコードを `rel="preload"` を使った場合と使わない場合について見てみることにします。

## `rel="preload"` を使わない場合
下記のような HTML があるとします。

```html
<html>
<head>
    <meta charset="UTF-8">
    <link href="/style.css"  rel="stylesheet">
</head>
<body>
    <div class="image"></div>
</body>
</html>
```

参照されている CSS は下記です。

```css
.image {
  width: 640px;
  height: 426px;
  background: url(./dog.jpeg);
}
```

このような場合ブラウザが `dog.jpeg` をダウンロードするタイミングは

1. CSSのダウンロードする
2. ダウンロードした CSS をパースする
3. `.image` のセレクタにマッチしている要素を見つける

というプロセスが完了したあとになります。

Google Chrome の Network タブで確かめてみましょう
<img width="1297" alt="スクリーンショット 2018-10-25 17.18.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/280341/60db06bf-3f2d-8c50-f8cb-ac79827f9a02.png">

style.css を読み込んだ後、 `dog.jpeg` をダウンロードしているのがわかります。

それでは `rel="preload"` を使って事前読込した場合はどうでしょうか。 

## `rel="preload"` を使った場合
下記のようにコードを修正します。

```html
<html>
<head>
    <meta charset="UTF-8">
    <link href="./dog.jpeg" as="image" rel="preload">
    <link href="/style.css"  rel="stylesheet">
</head>
<body>
    <div class="image"></div>
</body>
</html>
```

html の `head 要素` 内に `    <link href="./dog.jpeg" as="image" rel="preload">
` を追加しました。CSS に変更はありません。

Google Chrome の Network タブで確かめてみましょう。
<img width="1296" alt="スクリーンショット 2018-10-25 17.14.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/280341/134a6f58-bab7-4deb-830f-ad2fbe0f79d6.png">

`dog.jpeg` が style.css の前に読み込まれているのがわかります。

# まとめ
`rel="preload"` を使った画像の事前ダウンロードについて説明しました。
今回は画像を例にしましたが、`rel="preload"` では、フォントファイルや動画なども指定できます。

# 参考
[rel="preload" によるコンテンツの先読み - HTML: HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Preloading_content)
[Preload を用いたリソースプリローディングの最適化 | blog.jxck.io](https://blog.jxck.io/entries/2016-03-04/preload.html)
超速! Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)
【Angular7】 json を module として扱う

# はじめに

つい先日、Angular7 正式版がリリースされました 🎉
今回のアップデートは v6 ほどのインパクトはなく、主な更新内容は Angular Material のバーチャルスクロールとドラッグアンドドロップと言われていますが、Typescript の対応バージョンも 2.7.x から 3.1.x へ大きく上がっています。

https://blog.angular.io/version-7-of-angular-cli-prompts-virtual-scroll-drag-and-drop-and-more-c594e22e7b8c

Typescript は 2.8 からも様々な機能が追加されているのですが、今回はすぐに試せる json ファイルのモジュール化機能についてまとめてみます。

# 以前までの json ファイル読み込み

Typescript で json を読み込みたい場合、以前までであれば下記定義ファイルを作成し、json ファイルをモジュールとして無理やり解決していました。

```typescript:json.d.ts
declare module "*.json" {
    const value: any;
    export default value;
}
```

もちろん、この定義では取得したオブジェクトが any 型になってしまうため、使用する際は結局中身を確認してフィールド名を確認しないといけません。

使用頻度・重要度が高いファイルは、ts 化していた方もいるかもしれませんね。

```typescript:config.interface.ts
export interface Setting {
    repo: string;
    dry: boolean;
    debug: boolean;
}
```

```typescript:settings.dev.json
export const DevSetting: Setting = {
    repo: "TypeScript",
    dry: false,
    debug: false
}
```



# resolveJsonModule

しかし Typescript 3.1 に対応した Angular7 では、もうこのような手間は必要ありません。

tsconfig.json に下記設定を追加するだけで OK です。

```json:tsconfig.json
{
    "compilerOptions": {
        "resolveJsonModule": true,
        "esModuleInterop": true
    }
}
```

[resolveJsonModule](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html) は、自分で型定義を行う必要なく json ファイルを扱うことを可能にするオプションです。
Typescript 2.9 で追加されました。

esModuleInterop については、[こちらの記事](https://qiita.com/karak/items/29ff148788f5abb15331) によくまとまっていたので、興味のある方は一読しておくと良いかもしれません。

---

実際に使ってみるとその威力が一目瞭然です。
ただ単に読み込めるだけではなく、json を const で定義し export したオブジェクトのように扱うことができます。
これで json から簡単・安全に値を取得できますね。

```json:settings.json
{
    "repo": "TypeScript",
    "dry": false,
    "debug": true
}
```

```typescript:test.ts
import settings from './settings.json';

settings.debug === true;  // OK
settings.dry === 2;  // Error: Operator '===' cannot be applied boolean and number
```

vscode でもしっかり補完がききます

![スクリーンショット 2018-10-25 17.20.22.png](https://qiita-image-store.s3.amazonaws.com/0/41793/03ba281f-1839-6895-59bc-510ec91b3321.png)

# おまけ

- [Typescript 2.8 のアップデート内容](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html)
- [Typescript 2.9 のアップデート内容](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html)
- [Typescript 3.0 のアップデート内容](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html)
- [Typescript 3.1 のアップデート内容](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html)
Twilioを使ったSMSの受信と送信元への返信

# はじめに
TwilioでSMSを受信し、送信元の電話番号を取得して、SMSを返信する方法について、
調べたので、簡単にですが、書きます。

1. Twilioのアカウントの取得
2. Twilio電話番号の購入（月額150円くらい）
3. Twilioの電話番号にWebhook URLをセットする。SMSを受信した時の返信のため
4. CakePHP3でのサンプル

# Twilioのアカウントの取得は、割愛します。
#### 必要なもの
1. Twilioのアカウント
https://twilio.kddi-web.com/ から取得してください。
2. WebhookのURL
3. Webhookを受けて、SMSを返すサーバー側プログラム

# Twilio電話番号の購入（月額150円くらい）
#### 国際SMSの仕組みを用いてSMSを送受信するので、アメリカの電話番号を購入する必要があります。
* ダッシュボードで電話のアイコンをクリックしてください。下記の画面となります。
![1.telno.png](https://qiita-image-store.s3.amazonaws.com/0/297965/fdc32fde-1b7c-c874-2e00-6069a78ae809.png)
* 右側の赤いボタン「Manage Numbers」を押してください。下記の画面となります。
![1.2telno_get.png](https://qiita-image-store.s3.amazonaws.com/0/297965/e99d1f5b-d35f-971b-a3b2-1aea7e4ec1f8.png)
* 「＋」ボタンを押してください。下記の画面となります。
![2.telno_get.png](https://qiita-image-store.s3.amazonaws.com/0/297965/9277b0a1-21f9-ba9c-8d78-166d8a227ead.png)
上記の画面でUSの電話番号を購入してください。この電話番号を使用してSMSの送受信を行います。

#  Twilioの電話番号にWebhook URLをセットする。SMSを受信した時の返信のため
###### SMSを受信した時に、送信元の電話番号を取得する必要があります。Webhook URLを用意し、リクエストを受けた時に、サーバー側プログラムで、POSTパラメータから必要なデータを取得します。

#### Twilio画面からセット
* 電話番号は、下記画面のように一覧表示されますので、先程取得した電話番号をクリックしてください。
![list.png](https://qiita-image-store.s3.amazonaws.com/0/297965/70138707-043a-5b9b-d7d5-1fc182ac7584.png)

* Webhook URLをメッセージ受信時のURLにセットします。保存を忘れずに。
![webhook.png](https://qiita-image-store.s3.amazonaws.com/0/297965/70647fbd-f651-ee2f-fbee-cc0d23e6f241.png)


# CakePHP3でのサンプル

#### Twilio PHP SDK
Twilio PHP SDKを使用します。ここからダウンロードして
https://jp.twilio.com/docs/libraries/php
CakePHP3で使用出来るようにしておいてください。

#### SMSを受信するテストメソッド


* メソッド、acceptSMSをWebhook URLからリクエスト出来るようにしてください。
* 受けたメッセージをそのまま送信元に返す仕様です。
* サンプルなので簡素に書いています。

```PHP
// TwilioのClientをインポートしておきます。
use Twilio\Rest\Client;

    /**
     * SMSを受信するテストメソッド
     */
    public function acceptSMS() {
    	// SMSを受信した時の、POSTパラメータを取得します。
        $request = $this->request->getData();
		// レイアウトは使用しない
        $this->viewBuilder()->enableAutoLayout(false);
		// ctpは使用しない
        $this->autoRender = false;
		// Twilioの電話番号
        $twilio_number = "先程取得した番号（E.164 形式  例：+1xxxxxx）";   
        // 発信元の電話番号
        $send_number = $request['From'];
        // 発信元のメッセージ
        $body = $request['Body'];
        // アカウントSIDとAUTHTOKENは、Twilioダッシュボードから取得しセットします。
        $client = new Client('アカウントSID', 'AUTHTOKEN');
        // SMSを送る
        $client->messages->create(
                $send_number,
                array(
                        'from' => $twilio_number,
                        'body' => $body
                )
        );
    }
```

* 取得した電話番号にSMSを送信すると、Webhookに用いたCakePHP3では、以下のようなPOSTパラメータが取得できます。

```
(
    [ToCountry] => US
    [ToState] => CA
    [SmsMessageSid] => SMxxxxxxxx
    [NumMedia] => 0
    [ToCity] => 
    [FromZip] => 
    [SmsSid] => SMxxxxxxxx
    [FromState] => 
    [SmsStatus] => received
    [FromCity] => 
    [Body] => てすと
    [FromCountry] => JP
    [To] => +1xxxxxxx
    [ToZip] => 
    [NumSegments] => 1
    [MessageSid] => SMxxxxxxxx
    [AccountSid] => ACxxxxxxx
    [From] => +81xxxxxxxx
    [ApiVersion] => YYYY-MM-DD
)
```
# 参考サイト
* [Twilio SMS PHP クイックスタート](https://jp.twilio.com/docs/sms/quickstart/php)
RaspbianのSSHの設定ファイルの場所

```console
$ /etc/ssh/sshd_config
```

# ポートの変更

```config:/etc/ssh/sshd_config
# What ports, IPs and protocols we listen for
Port 22
```

# rootログインの許可/不許可
```config:/etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin no
```
Scala、AkkaHttpで簡単に外部サーバーからGETしてくる方法

なんか手っ取り早く外部サーバーとの通信を書けないか探したのでメモ

##自分で適当に作ったやつ

```ruby:qiita.scala
  private def getRequest[A](uri: String): Future[String] = {
    val request = HttpRequest(GET, uri = Uri(uri))
    val res = Http().singleRequest(request)
    res.flatMap { r =>
      res.entity.dataBytes.runFold(ByteString.empty)(_ ++ _).map(_.utf8String)
    }
  }
```

下のところがすごい冗長感が溢れる

```ruby:qiita.scala
res.entity.dataBytes.runFold(ByteString.empty)(_ ++ _).map(_.utf8String)
```


##リファクタしたやつ
```ruby:qiita.scala
  private def getRequest[A](uri: String): Future[String] = {
    val request = HttpRequest(GET, uri = Uri(uri))
    val res = Http().singleRequest(request)
    res.flatMap { r =>
      Unmarshal(r.entity).to[String]
    }
  }
```

```ruby:qiita.scala
Unmarshal(r.entity).to[String]
```

Unmarshalを使えば短くかける＾＾
うれしい

##使い方

```ruby:qiita.scala
val response: Future[String] = getRequest(uri = "http:~~~~~")
```
batsテストで参照渡しがうまく返ってこなかった件


これ、すごく単純なことだけどうっかりしていたので。

# テストコード

こんな感じのコードでした。

```bats
@test "For Qiita!!" {
  declare -A hash=()
  cat <<EOF > $tmp
B=245
G=2
EOF
  run File::SetToArray $tmp hash

  echo "hash: $(declare -p hash)" >&3
  [ "${hash[B]}" = "245" ]
  [ "${hash[G]}" = "2" ]
}
```

簡略化していますが、`File::SetToHash`でファイルの中身を仮想配列にしまう処理をしています。
(ファイルから`key=value`として読み取り、それぞれキーを`key`に、値を`value`にして格納しています)

[実際のコード](https://github.com/Cj-bc/shgif/blob/0beba31499fe7ce6a86fe0712503edc143856b61/tests/libdraw.bats#L20-L34)

# 実行結果

ダメでした


```
hash: declare -A hash=()
not ok 4 For Qiita!!
# (in test file tests/libdraw.bats, line 57)
#   `[ "${hash[B]}" = "245" ]' failed with status 127
```

`hash`に値が追加されることを期待していたのですが、入らなかった

# 解決方法: `run`コマンドを外す

どうやら、`File::SetToArray`の呼び出しに`run`コマンドを使っていたのがよくなかった模様です。
詳しい理由は調べてませんが、おそらく別プロセスで動かしているとかそういうことなのではないかなと思っています。
多分、別プロセスというよりかサブシェルなのかな...?(サブシェル内の結果は親に継承されないため)
[書評] Watson関連本 [人工知能]

AI・人工知能・ディープラーニングという言葉が流行りだして2年くらいたってきましたが、ちょっと前に投稿した[「オフィスのエアコンとSlackを連携させた話し」](https://qiita.com/hironaito/items/7998b029705f2c397485)でも使ったWatson関連の本「ワトソンで体験する人工知能」「はじめてのWatson」「Bluemix クラウド開発入門」の書評を書きたいと思います。


# ワトソンで体験する人工知能
こちらの本は、人工知能とはなんぞやというところ説明から入ってくれます。本も技術書の横書きではなくて縦書きです。
どこかの書評で「エンジニアでなく、営業やプランナーなど幅広く読んでもらいたい」という感じで書かれていたのですが、そのとおりでどんなものかを知るという点に主体を置いている印象でした。

まず最初に第三次人工知能ブームが起こっている説明からはじまり、世界のIT企業が取り組んでいることの紹介や、第一次、第二次人工知能ブームはどんな内容だったのかという歴史的な流れも紹介してくれます。

そもそも人工知能ってなんなの？っていう曖昧なところを説明してくれるので、はじめに入れておく知識としてはよいかもしれません。今すぐできることと、今すぐできないこと、小難しい話しまで色々載っています。

中盤から人工知能を使う方法が書かれています。
TensorFlowに触れていたりMachineLearningなど各社が提供するサービスを紹介されており色々な方面からの切り口がありました。
最後の方ではWatsonを使ってみる方法も書かれているので、まずはちょっと触ってみたいという部分もクリアできると思います。画像の分類器ってこんなに簡単に作れるんだ！って思いました。

ただ技術者視点でいうと触る部分は簡単な部分なので前提知識や歴史を知るといった部分になるかなと思います。

# はじめてのWatson
こちらは先程の本よりも前にでており2年経っていますが、その時ではWastonを使ってみるにはちょうどよいものでした。（むしろこれしかなくてとても貴重）
今となってはBluemixが進化しているので記載情報と差がある部分もあると思いますがその時はとても参考になりました。Wastonをまず使ってみるという敷居を下げてくれた良書です。

Wastonをさわって感じたことは、AWSやGCP、Azureで提供されている人工知能系サービスとも共通する部分も多くお互いに参考にしているのだろうなと感じたことです。
できることは似ていたり、用語がそっくりだったりと一回勉強すると他のサービスもわかりだしたりします。
WastonをさわったことでAmazon EchoでAlexaスキルを作る際にイメージがよりつきやすくなりました。
逆にAlexaスキルを作ったことがあればWatsonのAssistantが使い方がわかったりするかなと思います。

できることとして画像認識やBotの作り方なども載っているので何かを作ってみるというのにちょうどよかったです。NodeRedなどBluemixの便利サービスの紹介もあってそのへんも楽しかったです。

今は改訂版があるようなので今でも参考になると思います。


# Bluemix クラウド開発入門
こちらはタイトルからもわかるようにWastonだけでなくBluemix全体が記載されています。
そもそもBluemixがどんなサービスかもよくわかっていなかったのでどんなことができるのかというのがわかってよかったです。AWSやGCPでできるようなことももちろんできたりするんだということがわかったり。

RespberryPiとWaton IoT Platformの連携なんかも載っていたりするのでIoT関連でも少し参考になるかもしれません。サンプルも載っているので何か作ったりする参考にもなると思います。

Watson関連でいうと、Lineと連携したボットを作る箇所が載っています。
この本ではNode-Redを使ってLineボットを作ることが載っているのですが、かなり手軽にできるので驚きでした。

ここを参考に一度Lineボットを作った後、Node-Red部分をAWSに、Lineボット部分をSlackにして、エアコンを操作できるようにしようと思い付きました。

---

３冊ともWatsonを使ってみるはじめの一歩としてとても役に立ってくれたのがよかったです。

本を読み実際にWatsonを使ってどんどん触れていくことで「人工知能って分類するために利用しているんだな。」というのが感覚としてわかってきました。

自然言語処理も何を言っているのかという分類。
画像認識も何が写っているのかという分類。
音声もなんと言っているのかを分類。
機械学習などはその分類をするために教え込むみたいな。

もっと難しいことが色々あると思うのですが、小難しく言わなければ”すごい分類”なんだと思っていますｗ

自分では人工知能のエンジン部分を作ったりはできないですが、こういったサービスを使うことでより身近に簡単になるということがわかりました。
興味を持ってから2年くらい立ちましたが、まわりではまだ興味を持っている人も少なく発展中なのかなという印象は拭えません。しかしながらかなり面白く色々なことができそうという感触はあります。
どちらにしても何ができるのかということを把握した上で、使うための企画力が必要だなと思っています。

Slackとオフィスのエアコンを連携させたことが、かなり便利に使えているので、Watsonに限らず今後も色々な場面でこのようなサービスを使っていきたいです。

次はカメラ画像を簡単にAWS S3とかにアップさせて画像認識させたいなと思っています。
そうすればできることが飛躍的に広がりそう！
Python備忘録だったり色々

#初めに
Python初めてです。
ほんとに右も左もわからないです。

#型
CやJavaのように型をつける必要が無い(動的型付け)
CやJavaのような型をつけるものを静的型付けと言う

##数値型
```Python:数値
変数名 = 値
```

##文字列型
```Python:数値
変数名 = "文字列"
または
変数名 = '文字列'
```

##リスト型

###空のリストを初期化
```Python:
list1 = []
```

###数値を直接入力してリストを初期化
```Python:
list2 = [1, 2, 3]
```

###文字列を直接入力してリストを初期化
```Python:
list3 = ["a", "b", "c"]
```

###数値と文字列を混在してリストを初期化
```Python:
list4 = [1, 2, "a", "c"]
```

###リストの中にリストを挿入して初期化
```Python:
list5 = [1, 2, "a", "b", list3, list4]
```

###リストの中に変数も設定できる
```Python:
num = 1
str = 'str'
list6 = [1, 2, "a", "b", list5, num, str]
```

###指定サイズ分(要素数)だけ0埋めして初期化
```Python:
lsit7 = [0]*4
```


##シーケンス型

###参考という名の丸写し
[シーケンス型共通演算](https://www.python.ambitious-engineer.com/archives/488#innot_in)

###シーケンス演算

| 演算               |      説明                                                        |
|:-------------------:|:----------------------------------------------------------------:|
| x in s             | シーケンスsに要素xが含まれている場合にTrueを返します                |
| x not in s         | シーケンスsに要素xが含まれていない場合にTrueを返します              |
| s + t              | 2つのシーケンスsとtを結合します                                   |
| s * n または n * s | シーケンスs同士をn回結合します                                     |
| s[i]               | 0始まりのインデックスを指定してシーケンスsのi番目の要素を取得します。 |
| s[i:j]             | シーケンスsのi番目からj番目までのスライスを返します                 |
| s[i:j:k]           | シーケンスsのi番目からj番目までのk毎のスライスを返します             |
| len(s)             | シーケンスsの長さ(=要素数)を返します                               |
| min(s)             | シーケンスsの最小の要素を返します                                  |
| max(s)             | シーケンスsの最大の要素を返します                                  |
| s.index(x)         | シーケンスsの中で要素xが最初に出現するインデックスを返します         |
| s.count(x)         | シーケンスsの中で要素xが出現する回数を返します                      |


##シーケンス演算の例など

###包含判定(x in s、x not in s)
シーケンスsとオブジェクトxが要素に含まれているかどうかを判定するにはx in sと書きます。また、含まれていないかどうかを判定するにはx not in xと書きます。

```Python:
list = ['a', 'b', 'c', 'd']
 
# 含まれているかどうかを判定する
b1 = 'a' in list #「list」の中に「a」が""含まれている""か判定
print(b1) #Trueが返ってくる
 
b2 = 'x' in list #「list」の中に「x」が""含まれているか""判定
print(b2) #Falseが返ってくる 
 
# 含まれていないかどうかを判定する
b3 = 'a' not in list # 「list」の中に「a」が""含まれていないか""判定
print(b3) #Falseが返ってくる
 
b4 = 'x' not in list #「list」の中に「x」""含まれていないか""判定
print(b4) #Trueが返ってくる
```

#続き
続き書きました。[続Python](続Python備忘録だったり色々)
[Rails]レコードの保存系処理を書くときは validates を先に確認しよう

久々の失敗談エントリです。素人かよって言われるレベルですがよろしければこのままお進みください。

## 前提
### Model
こんな Model クラスがあったとします。

```ruby:app/models/some.rb
class Some < ApplicationRecord
  validates :kind, length: { maximum: 4 }, unless: :skip_foo_validation
  attr_accessor :skip_foo_validation
end
```

### Controller

で、コントローラでこんなかんじに Some のレコードを作成します。

```ruby:app/controllers/hoge/foo_controller.rb
record = Some.find_or_create_by(kind: 'some_kind')
```

## 今回の状況
別の用途があってここで作成したレコードの主キー(Some では自動採番による id が主キーであるとします。)をすぐ確認したいとします。

```ruby:app/controllers/hoge/foo_controller.rb
puts record.id # => nil
```

nil...だと...？

```ruby
Some.find_by(kind: 'some_kind') #=> nil
```

DBにもまだ保存されていません。あれ、record.save とか呼ばなきゃ保存までされないんでしたっけ？そんなはずはないんだが。。。(　ﾟдﾟ)

## ここでクエスチョン
**Q. record.id が nil になる理由と対応方法を回答してください。**

ということでさあ困りました。これはどういうことなんでしょうか。

## 回答例
まあ大したオチはないんですが、**バリデーションがまだ通っていないためレコードのINSERTが行われていないことが理由です。** find_byでレコードがなかった時点でINSERTされてないのはわかりましたが理由が謎でした。

何故判明したかといいますと、**errors に思いっきりバリデーションのエラー内容が出ていたためです。** 我ながらひどい。(細かいところは省略してます)

```ruby
puts record.errors.inspect
# => #<ActiveModel::Errors:**********
#  @base=#<Some id: nil, kind: 'some_kind', *****>,
#  @details={:kind=>[{:error=>:too_long, :count=>4}]},
#  @details={:kind=>["4文字以内で入力してください。"]}
# >
```

ということで入力内容の問題ということがわかりました。
バリデーションが通るような値を kind に渡せばいいんですが、今回は find_or_create_by にブロックを渡してスキップ用の値をセットする方向で対処してみます。

```ruby:app/controllers/hoge/foo_controller.rb
record = Some.find_or_create_by(kind: :some_kind) do |rec|
  rec.skip_foo_validation = true
end
```

こんどは大丈夫ですね。

```ruby:app/controllers/hoge/foo_controller.rb
puts record.id # => 1
```

## 教訓
例えばチームで開発していて、該当の Model クラスを自分以外の人が作っている場合は自分の知らない validates が含まれているケースは多々あると思います。保存処理を行いたい Modelクラスの validates はひととおり目を通しておくといいとおもいます。(ブーメラン)
今回は `find_or_create_by` 使用していましたが、特にこのメソッドに限った話ではないですしね。

※ちなみにぶっちゃけ30分以上ハマりました／(^o^)＼
Pythonでオウム返しをするLine botを作成

##はじめに
[プログラミング初心者こそChatbotを開発すべき理由とは？[from CodeIQ]](https://engineering.linecorp.com/ja/blog/detail/288)をみてLine botを作ってみたいと思いました。

##環境
・windows
・Python 3.6.3
・Heroku

##概要
・Line developersに登録
・実装
・Herokuの設定

#Line developersに登録
Line developersの準備については以下を参照してください。
[LINEのBot開発 超入門](https://qiita.com/nkjm/items/38808bbc97d6927837cd)

#実装
コードは[こちら](https://github.com/Dexctersu/sample_linebot)に載せておきます。
基本的にはサンプルをベースにしています。
はじめにflaskとline-bot-sdkをインストールします。


```terminal.
pip install flask
pip install line-bot-sdk
```
サンプルだと最後がapp.run()となっていますが、それだと応答しないので変更します。

```main.py
from flask import Flask,request,abort
from linebot import LineBotApi,WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent,TextMessage,TextSendMessage
import os

app=Flask(__name__)
#環境変数の取得
YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンを入力"
YOUR_CHANNEL_SECRET="Channel Secretを入力"
line_bot_api=LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler=WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback",methods=["POST"])
def callback():
    signature=request.headers["X-Line-Signature"]

    body=request.get_data(as_text=True)
    app.logger.info("Request body"+body)

    try:
        handler.handle(body,signature)
    except InvalidSignatureError:
        abort(400)
    return "OK"

@handler.add(MessageEvent,message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(event.reply_token,TextSendMessage(text=event.message.text))

if __name__=="__main__":
    port=int(os.getenv("PORT",5000))
    app.run(host="0.0.0.0",port=port)
    
```


#Herokuの設定
Herokuの準備は[Heroku初心者がHello, Herokuをしてみる](https://qiita.com/Arashi/items/b2f2e01259238235e187)を参照してください。
アカウント認証まで完了したら、アプリケーションを作成します。
コマンドからheroku createで作れます。
なお、アプリケーション名を入れなかった場合は自動的にアプリケーション名が決められます。


```terminal.

heroku create 任意のアプリケーション名
```


次に環境変数を設定します。
ここでLine developersで作成したアクセストークンとChannel Secretを使います。

```
heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの欄の文字列" 
heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの欄の文字列" 
```

###設定ファイルの作成
mian.pyと同じ階層にruntime.txtとrequirements.txtとProcfileを作成します。

```runtime.txt(Pythonのバージョンを記載)
python-3.6.3
```

```Procfile.(プログラムの実行方法を定義)
web: python main.py

```
requirementsは


```terminal.

pip freeze > requirements.txt
```

で準備ができます。なお、手動でもよいです。

```requirements.txt
Flask==1.0.2
line-bot-sdk==1.8.0
```


#Webhookの設定
Line developersに戻り、Webhook URLを設定します。
![2018-10-25 (4).png](https://qiita-image-store.s3.amazonaws.com/0/169545/610bb7be-8846-efba-175e-530b17543ec9.png)
ここでは、接続確認は不要です。

###ファイルのデプロイ
main.pyなどがある階層で

```terminal.
git init
git add .
git commit -m "first commit"
git push heroku master
```


を入力します。
コマンドからgitが使えない場合は[コマンドラインからGitを使う](https://qiita.com/taiponrock/items/632c117220e57d555099)を参照してください。

###うまくいかない場合
heroku logs --tailでエラーを確認してください。

####個人的によくあるエラー
git push heroku masterをして以下のようなエラーがでた場合は

```py
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.
```
heroku git:remote -a herokuで作成したアプリケーション名
を入力してから再びpushすると上手くいくと思います。

##注意
自分のアクセストークンをリモートリポジトリにpushしないでください。
Swift4でUITextViewのリアルタイム文字数カウントを実装

## 手順は３つ

UITextViewDelegateを継承し

```
ViewController: UIViewController, UITextViewDelegate {
```

リアルタイムで文字数カウントをしたいUITextViewにdelegate設定

```
commentTextView.delegate = self
```

メソッドtextViewDidChange内に記述

```
func textViewDidChange(_ textView: UITextView) {
        let commentNum = commentTextView.text.count
        commentNumLabel.text = String(commentNum)
    }
```
shell画面を配信しよう！！


...とか書いといて実際配信することあんまないとは思うのですが()

shell画面を配信することができるツール3選です ~(というかこれしか知らない)~
まだあまり使っていないので深くは掘り下げられないです。

---

# 1. shellshare

[vitorbaptista/shellshare](https://github.com/vitorbaptista/shellshare)
[shellshare.net](https://shellshare.net/)

shellの画面を配信できるサービスです。
コマンドを実行するとURLが表示されるので、そのURLにアクセスすると見ることができます。

## 利点

* URLさえ知っていれば誰でも見れる
* パスワードを設定し、入れる人を制限することもできる。
* room名も決められるため、事前にURLを設定しておくこともできる
* 登録不要
* iPhoneからも閲覧できました


## 欠点

* 録画は残せない


# 2. termshare

[progrium/termshare](https://github.com/progrium/termshare)

同じようなサービスですが、こちらは公式に使われていた鯖が止まってしまっているため、
コマンドを打つだけで配信することはできません。
代わりに自分で鯖を動かすことができます

## 利点

* デーモンを動かせるので、自鯖等で動かすことが可能

## 欠点

* 公式の鯖が落ちているため、動かすには自分で鯖を動かす必要がある（と言ってもコマンド打つだけ）



# 3. asciinema (やや番外編)

配信、というよりは録画共有サービスになります。
ターミナルの入力、出力を全てファイルに出力し、共有することができます。

## 利点

* ファイルに出力されるため、`asciinema`をインストールしてある端末にそのファイルを送れば再現可能
* 録画後、ローカルに保存することもできる
* 録画ファイルはtxt形式のため、軽い(よっぽど長い処理をしない限り)
* asciinemaのホームページから共有できるため、URL共有で広めることができる
* 色もきちんと出力可能！！

## 欠点

* 録画。リアルタイム配信ではない(でも似てたのでこの記事に乗せました)
CentOS7にphpとmysqlをインストール

こんにちは。

今日は、CentOS7をVMware Workstation playerに

インストールしphpをインストールしてみました。

```
yum -y install php
```
と書いてエンターしパスワードがきかれたらパスワード入力。

その後は

```
systemctl start httpd
```
これで起動しますので、起動したかどうかはブラウザを立ち上げlocalhostと

うち、ローカルホストが出れば完了です。

また、phpにかんしてはアドレスバーに
```
localhost/phpinfo()/
```
とうちNot Foundという文字が出たら

ページが作成されていないので

/var/www/html/の直下に

```php
<?php
phpinfo();
?>
```
と手入力し保存します。

この時、私がテキストエディタで

使っているのはviエディタを使用しています。

ターミナル上でsudo vi phpinfo.phpと打ち

エンターキーを押すと入力できる白い画面に遷移します。

そしてiキーを押し、入力していきます。

保存をするときは、wq!で強制的に保存して終了です。

wを押せば保存をして終了することはなく保存したままになります。

今回は、mysqlもインストールすることにしました。

mysqlをインストールするにあたり最初にMariadbを削除

しなくてはならないということがあったので

私が削除したのはmariadb-libsというものを削除し

mysql-community-serverをインストールしました。

そしてmysqlを常時起動にします。

```
systemctl start mysqld.service
```
これで、起動します。

常時起動させておくためには
```
systemctl enable mysqld.service
```
という風にします。

こうすることで、常時起動にすることが可能です。
カメラとROSでSVO

# Environment
Windows10 inter corei7 7500U
Virtual box 5.2
Ubuntu16.04 (ROS kinetic)
Webcam

# インストール
- Virtual box Extension pack
    - 設定からインストール 
- カメラようアプリ  
$ sudo apt-get install fswebcacm

# カメラテスト
Devices > Webcamでカメラ選択
$ cheese

# cv_cameraインストール
$ sudo apt-get install ros-kinetic-cv-camera

# SVO起動
$ rosrun cv_camera cv_camera_node
$ rosrun image_view image_view image:=/cv_camera/image_raw

# トピックの確認
$ rostopic list
error: option --single-version-externally-managed not recognized

# pip install mysql-connector-python-rfが失敗
表題のエラーが出た

# 試したこと
upgrade pip
`python -m pip install --upgrade pip`

さらに
https://stackoverflow.com/questions/14296531/what-does-error-option-single-version-externally-managed-not-recognized-ind
を参考に下記のコマンドを実行

```
pip install --upgrade setuptools
pip install wheel
```
そしたら、`pip install mysql-connector-python-rf`が成功した
css radio ボタン かっこよく

コピペでうごく。

```

<style>
    /* Customize the label (the container) */
    .custom_radio {
        display: block;
        position: relative;
        padding-left: 35px;
        margin-bottom: 12px;
        cursor: pointer;
        font-size: 18px;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }

    /* Hide the browser's default radio button */
    .custom_radio input {
        position: absolute;
        opacity: 0;
        cursor: pointer;
        height: 0;
        width: 0;
    }

    /* Create a custom radio button */
    .checkmark {
        position: absolute;
        top: 0;
        left: 0;
        height: 25px;
        width: 25px;
        background-color: #eee;
        border-radius: 50%;
    }

    /* On mouse-over, add a grey background color */
    .custom_radio:hover input ~ .checkmark {
        background-color: #ccc;
    }

    /* When the radio button is checked, add a blue background */
    .custom_radio input:checked ~ .checkmark {
        background-color: #2196F3;
    }

    /* Create the indicator (the dot/circle - hidden when not checked) */
    .checkmark:after {
        content: "";
        position: absolute;
        display: none;
    }

    /* Show the indicator (dot/circle) when checked */
    .custom_radio input:checked ~ .checkmark:after {
        display: block;
    }

    /* Style the indicator (dot/circle) */
    .custom_radio .checkmark:after {
        top: 9px;
        left: 9px;
        width: 8px;
        height: 8px;
        border-radius: 50%;
        background: white;
    }
</style>


<label class="custom_radio">One
    <input name="hoge" type="radio" checked="checked">
    <span class="checkmark"></span>
</label>

<label class="custom_radio">Two
    <input name="hoge" type="radio">
    <span class="checkmark"></span>
</label>

<label class="custom_radio">Three
    <input name="hoge" type="radio">
    <span class="checkmark"></span>
</label>

<label class="custom_radio">Four
    <input name="hoge" type="radio">
    <span class="checkmark"></span>
</label>


```
windowsでgit hookを使用してtagsファイル作成(自己流)

最初ctagsを導入して、vimプラグインを使用して自動更新する方法を調べていたら、  
gitから自動で更新する記事を目にして、こちらの方も調べて導入する時に Linuxやmacの書き方はいくつも見つかったが、  
Windowsの書き方がいまいち分からなかった。  
調べていくうちに、Pythonで書くことが出来るのが判って、希望どうりの動きをしてくれている物を書くことが出来た。  

> [Git Hooks (Part II) – Implementing Git hooks using Python — Omer Katz — A Blog about Software Development, DevOps, Source Control, SCM, ALM & other related topics.](http://omerkatz.com/blog/2013/5/23/git-hooks-part-2-implementing-git-hooks-using-python)  

### 前提
* windows
* git
* python  
インストールしてコマンドラインからも呼び出せるようになっていること


### hooksファイルを作成
そもそも、`` hooks/ `` は `` $ git init `` したら `` .git/ `` 内に作成される。
git で merge, pull, commit, checkoutなどが実行されたら、  
記載されている動作を実行するようになる。  

しかし、`` $ git init `` するたびに `` hooks/ `` 内のファイルを書き換えるのは面倒なので、  
テンプレートを作成して、`` $ gint init `` したらテンプレートをコピーしてくれるように設定する。  

1. 新しくフォルダを `` .git_tmp/hooks/ ``などと作成  
2. `` hooks/ ``内に、`` post-merge, post-commit, post-checknut ``を作成  
3. `` post-* ``すべてのファイル内容を下記のコードにする  

```
#!/usr/bin/env python

import os
import subprocess

tags = '.git/tags'

if os.path.exists(tags):
os.remove(tags)

cmd = 'ctags -R --sort=yes --append=no -f ' + tags + ' %CD%'
returncode = subprocess.Popen(cmd, shell=True)
```
動作は.git/tagsファイルが存在していれば削除して新しくctagsで.git内にtagsファイルを作成する。  

4. `` $ git init `` するたびに `` hooks `` の内容を `` .git_tmp/hooks/ `` の中身で作成されるようにする。  
コマンドラインなどで `` $ git config --global init.templatedir .git_tmp ``を実行  

これで、`` git init `` したら、 `` .git_tmp/hooks/ `` の内容で `` .git/hooks/ `` が作成される。  

### 参考
> [gitのhookでtags作成 - Qiita](https://qiita.com/soramugi/items/9a3687bb81ce35e3f99a)    
> [ctagsと連携するように環境を構築する - Qiita](https://qiita.com/soramugi/items/f918020c2b3f48c93bf3)  
> [GitHub - AdaCore/git-hooks: Git hooks Python-based scripts](https://github.com/AdaCore/git-hooks)  
> [Pythonからコマンドを呼び出す（Windows編） - Qiita](https://qiita.com/_akisato/items/d97b17064df158f0dea0)  

### トラブル
* .git_tmpがコピーされない。
* .gitconfigを直接開いて、`` templatedir = ‘./.git_tmp‘ `` から `` templatedir = .//.git_tmp ``に変更したらうまくコピーした。
* tagsファイルが読み込まれない。（Error: E429: File "project/.git/lib\util.php" does not exist)
* vim-fugitive でおかしくなっている？
* tagsファイルをそのまま.gitから出して、projectフォルダに移動させたら正常に動いた。
* tagsファイル内のパスがおかしい のか？ `` lib\util.php `` ではなく `` ..\lib\util.php `` だと動作した。
* つまりは、 `` project/.git/lib `` の `` /.git/ `` 部分が余計なのかな？
* 解決：フルパスで作成するようにしたら、問題なく動いた。ソースコードを更新
Nowの無料プランでもインスタンスをスリープさせない方法

HEROKUのようなPaaSの無料プランでは、一定時間インスタンスにアクセスがないと、スリープしてしまうことが多いと思います。

インスタンスを24時間起こしておくために、いろんな工夫（CRONで一定時間ごとにpingを送ってるとか）をしている人もいると思いますが、ナウでヤングなPaaSの[Now](https://zeit.co/now)には無料のOSSPlanでも24時間インスタンスを起こしておくことができるので、やり方を書いていきます。

# やり方
## Scaleの機能を使う
https://zeit.co/blog/scale
Nowにはscaleという、アプリケーションの規模などに合わせてインスタンスの数を増やしたり減らしたりできる機能があります。

こちらのscaleがデフォルトでは`max:1,min:0`になっているので、一定時間アクセスがないとインスタンスの数が０になりスリープ状態になります。
これをmaxとminを両方1台にするコマンドが以下になります。

```sh
now scale my-deployment.now.sh 1
```
このコマンドを実行することにより、`max:1,min:1`となり、一定時間アクセスがなくてもスリープすることはなくなります。

現状、２つのClovaのスキルをNowにデプロイして、この方法でスケールさせていますが、特に落ちている様子もなく、安定しているように感じます。

HEROKUの無料プランでインスタンスのスリープに困っている方がいれば、ぜひNowをつかってみてください。
Ultra96 向け Debian GNU/Linux (v2018.2版) の構築(イントロ編)

## はじめに

Ultra96 に Debian GNU/Linux (v2018.2版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * __Introduction(この記事)__
 * [Boot Loader](https://qiita.com/ikwzm/items/9c78e83298906447fe5d)
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/0489b02962c6f0455783)
   - [FSBL   (First Stage Boot Loader)](https://qiita.com/ikwzm/items/fe9d6abda60660fc2f87)
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/00024adf956696dd51c6)
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/3c0d735cd3a605d269f3)
   - [U-Boot](https://qiita.com/ikwzm/items/11853d8cfdaf373beaef)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/af4420edd262e14feef9)
 * [Linux Kernel](https://qiita.com/ikwzm/items/02af5ac78a558c910e84)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/be06b07e26cbf05fec2b)

この記事では、Ultra96 に Debian GNU/Linux (v2018.2版) を構築する方法について、その背景などを説明します。

これら記事で構築した Ultra96 向け Debian GNU/Linux の Boot Loader、Linux Kernel、Debian9 Root File System は、次の URL にて公開しています。

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)

また、次の記事でインストール方法を説明しています。

 * [「Ultra96 向け Debian GNU/Linux (v2018.2版) ブートイメージの提供」@Qiita](https://qiita.com/ikwzm/items/975ab6997905700dd2e0)

## Ultra96 とは

Ultra96は Xilinx 社の Zynq UltraScale+ MPSoC(XCZU3EG-SFVA625) を搭載した Linaro 96boards 仕様準拠のキットです。詳細は次の URL を参照してください。

 * [AES-ULTRA96-G @AVNET](https://www.avnet.com/shop/japan/products/avnet-engineering-services/aes-ultra96-g-3074457345636060700/)
 * [http://zedboard.org/product/ultra96](http://zedboard.org/product/ultra96)
 * [https://www.96boards.org](https://www.96boards.org)
 * [https://www.96boards.org/product/ultra96](https://www.96boards.org/product/ultra96)

## Zynq UltraScale+ MPSoC とは

Zynq UltraScale+ MPSoC は 64bit Quad Core ARM Cortex-A53 およびデュアルコア ARM Cortex-R5 をベースとするプロセッシングシステム(PS)と Xilinx のプログラマブルロジック(PL) UltraScale アーキテクチャを一つのデバイスに組み合わせたものです。これにはオンチップメモリ、マルチポート外部メモリインターフェース、さらに UART、Ethernet、USB などのインターフェースを備えています。詳細は次の URL を参照してください。

 * [Zynq UltraScale+ MPSoC](https://japan.xilinx.com/products/silicon-devices/soc/zynq-ultrascale-mpsoc.html)

この記事では Zynq UltraScale+ MPSoC のことを以降 ZynqMP と呼称します。

## 背景

背景に関しては以下の記事に書きましたので割愛します。

  * [UltraZed 向け Debian GNU/Linux (v2018.2版) の構築(イントロ編) @Qiita](https://qiita.com/ikwzm/items/5b657ebd8895945c4eae)

## 参考

 * [Zynq UltraScale+ MPSoC](https://japan.xilinx.com/products/silicon-devices/soc/zynq-ultrascale-mpsoc.html)
 * [Peta Linux ツール](https://japan.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html)
 * [http://zedboard.org/product/ultra96](http://zedboard.org/product/ultra96)
 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)
 * [https://www.96boards.org](https://www.96boards.org)
 * [「Ultra96 向け Debian GNU/Linux (v2018.2版) ブートイメージの提供」@Qiita](https://qiita.com/ikwzm/items/975ab6997905700dd2e0)
 * [「UltraZed 向け Debian GNU/Linux (v2018.2版) の構築(イントロ編)」 @Qiita](https://qiita.com/ikwzm/items/5b657ebd88959)
 * [「UltraZed 向け Debian GNU/Linux (v2018.2版) ブートイメージの提供」@Qiita](https://qiita.com/ikwzm/items/6e0506fc161d1da58e9c)
(メモ)asset pipelineで複数のapplication.jsを作る

この記事は
===

* asset pipelineで出力JSを複数にした際のメモです
* Webpacker使えよ！という異論は一旦置いておいてください

やりたかったこと
===

* 一般のコンシューマ向け画面と、クライアント（ビジネス)向け画面のデザインを全然違うものに分けたかったです
* アプリ自体を分けろと言われそうですが、モデル部分の共通化とか色々面倒なのでモノリシックに走り抜けたかったです
* ```require_tree .```を除去して、コントローラ毎とか細かくわけてる例は結構でて来たのですが、ざっくりとわける方法が見当たらなかったので色々試してみました

解決の方針
===

* もともとあったapplication.jsは、コンシューマ画面向けのファイルとしてそのまま活かします
* application_client.jsというファイルを追加します
  * クライアント向け画面のライブラリ関係はここに書くようにします

対応詳細
===

application_client.jsを追加
---

* クライアント向けJSファイルを追加します

```javascript:app/assets/javascript/application_client.js
//= require_tree ./clients
alert(2)
```

* 逆にコンシューマ向けJSに入らないようにstub指定で除去します

```javascript:app/assets/javascript/application.js
//= require_tree .
//= require_self
//= stub application_client
```

* application_client.jsをパスに追加します

```javascript:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( *.png *.jpg *.jpeg application_client.js)
```

読み込み対象のファイルを追加
---

* クライアント用でのみ読まれるパスにJSファイルを作成します

```javascript:./clients/hello.js
alert(1)
```

レイアウトファイルの反映
---

* クライアント向け画面のlayoutファイルを作成し、読み込むJSをクライアント向けのものにします

```erb:app/views/layouts/application_client.html.erb
<%= javascript_include_tag 'application_client' %>
```

* クライアント向けコントローラのlayoutファイルを上記のものにします

```ruby:app/controllers/client_controller.rb
class ClientController < ApplicationController
  layout 'application_client'
end
```

こうすることで
===

* クライアント画面を開いたときだけ```alert(1)``` ```alert(2)``` が出力されます
* 今後クライアント画面で扱いたいJSは```./clients/hello.js```の位置に足していけば勝手に追加されます

CSSは
===

* CSSもJSと全く同じ手順で対応可能です

不思議なのは
===

* stubでコンシューマ向け画面に```alert(2)```がでないのはわかるのですが、そこの先のhello.jsに書いてある ```alert(1)``` もでなくなるのはどういうことなんだろう
* stubは書いてある内容をずっと辿っているということなのかな

終わりに
===

* これでざっくりとJSファイルを分けられますね
Reduxの卒業式をしよう


### モチベーション
 - Reduxを使っていたが個人開発なのでコード量が増えてつらい
 - 使い慣れたアーキテクチャを使いたい
 - 自分好みの処理分割、ファイル分割をしたい
 - そもそもほかのライブラリ使うのにミドルウェアが必要なものってどうなのよ
 - 学習コストが高くて飛び入りでプロジェクトに入った人がつらい
 - 短期の開発で使いづらい
 - もっと他にいいライブラリ無いの？

## React系の状態管理ライブラリ

 - [Redux](https://redux.js.org/)
 - [mobX](https://mobx.js.org/)
 - [undux](https://undux.org/)

それぞれの長所、短所などをまとめてみます。

### Redux
メリット

 - 厳正に書きかたが決まっている(ガイドラインがある)
 - テストがしやすい
 - アーキテクチャがきれい(個人的にはコードは見やすいと思います)
 - デバッガなどのツールがそろっている

デメリット

 - 学習コストが高い
 - コードの記述量が多い
 - 影響範囲が広い
 - アーキテクチャが限定される
 - ミドルウェアが必要

### mobX
メリット

 - **Reduxに比べて**記述量が少ない
 - 学習コストが**Reduxに比べて**低い
 - [@Computed](https://mobx.js.org/refguide/computed-decorator.html)などの処理で値の操作が容易
 - StoreとActionがそろっているのでパッと見で構造がわかる(JavaのBeansっぽい構造)

デメリット

 - 自由度が高い
 - 中途半端にアーキテクチャに干渉する
 - デバッグがしづらい
 - あくまでReduxよりましというだけで、アーキテクチャに関しての知識は必要
 - ルーターと一緒に使うときに、連携させるためのコードを書かなきゃいけない

### undux
メリット

 - よりReactっぽい書き方ができる
 - 学習コストなんてものはなかった
 - コードの記述量が最小限
 - Reduxのデバッグツールが使える
 - ほかのライブラリと組み合わせやすい
 - アーキテクチャへの影響がない
 - Rxjsによる値の監視ができる(mobXの@computedと同じようなことができる)
    - 参照 : [undux#effects](https://github.com/bcherny/undux#effects)
 
デメリット

 - 発展途上
 - 多機能ではない
 - レンダリングさせたい場合はこちらで監視しなければいけない(僕はむしろこっちのが好き)
 - 別でアーキテクチャ(ファイル構造や処理の切り分け)を考える必要がある

## 結局どうしたのか

僕はいろいろ見た結果unduxを使うことにしました。
やっぱりシンプルなのが一番使いやすかったです。
中身のソースもわかりやすくて、詰まった時とかに資料がなくて困ってもソース見ればわかったりします。

ほんとにチュートリアルするのに時間かからないのでソースだけでも一回見てみてください。

[React + Unduxでみんなを幸せにする](https://qiita.com/shoichi1023/items/422699a19874b3128a27)

unduxもっと流行れ。
ASP.NET Core 2.1 では、日本語がHTMLエンティティで表示される問題（解決）

# 0から始めるASP.NET Core で発生した問題について

ASP.NET Core 2.1 で、Razorを使ってASP.NETを組み立てるという練習を始めた途端に出てきた問題として、「日本語」を含む2byte文字以上（HTMLで有害となる文字）以外をRazorを通して出力すると、HTMLの出力結果がHTMLエンティティされる問題について、環境としての仕様というコメントをいただき、コードを追加したところ解決したのでメモとして残しておきます。

## 発生した現象

文字列(string型) のデータを、view(またはpage)において、@変数 でデータを表示させるとき、それが日本語を含む2byte以上の文字列（1byteでもHTMLとして有害となるコードを除く）である場合（厳密のは全角文字）、HTMLエンティティとして出力されたこと

例えば

```c#
string hello = "こんにちは";

<div>
@hello
</div>
```

としたコードを書いた場合、ブラウザ上での出力は

```
こんにちは
```

と表示されますが、HTMLソースコード(応答結果）は、

```
<div>
&#x3053;&#x3093;&#x306B;&#x3061;&#x306F;
</div>
```

と表示されます。

## 発生を確認した環境

* Visual Studio 2017 Community より、直接コンパイルした場合
* Windowsでコマンドより、dotnet run で実行させた場合
* Linuxのasp.net core(.net core 2.1)を使った場合
* mac osでのasp.net core(.net core 2.1)を使った場合


## 問題点

ブラウザでは、読める形で出力されるために閲覧としては問題はありません。しかし、HTMLエンティティとして表示されている関係上、出力されるバイト数が生の状態よりも２倍近く増えること（UTF8の場合、日本語は3byteのため。なお、一部例外あり）と、HTMLエンティティされていることにより、デコードが余分にかかってしまうということ。特に、ブログなどの記事の場合はよろしくない状態かと思われます。

## 影響範囲

現在、検証できている範囲は、ハードコーティングしたデータを出力させる、PostおよびGetリクエストで送受信したデータにおいて発生することがわかっています。データベースから呼び出したデータを呼びしたりした場合でも、変数を通す関係上同様の現象が発生します。

以下は、RazorページでのPostデータでのテストを行うために作った簡易コードです。

[Pages/Index.cshtml]

```html
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model aspnet_zero.Pages.IndexModel
@{
    Layout = null;
}

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <form method="post">
        <input asp-for="Msg.Title" placeholder="題名" />
        <input asp-for="Msg.Msg" placeholder="内容" />
        <button type="submit">はろー</button>
    </form>
    <div>
        <p>@Html.Raw(Model.Msg.Title)</p>
        <p>@HModel.Msg.Msg</p>
    </div>
</body>
</html>
```

[Pages/Index.cshtml.cs]

```cs
public class IndexModel : PageModel
{
	public Message Msg { set; get; }

    public void OnGet()
    {
		Msg = new Message();
    }

	public IActionResult OnPost(Message msg)
	{
		if(!ModelState.IsValid)
		{
			return Page();
		}

		Msg = msg;
		return Page();
	}
}
```

[Models/Message.cs]

```c#
public class Message
{
	public string Title { set; get; }
	public string Msg { set; get; }
}
```

なお、@Html.Raw() メソッドを通している場合は、HTMLエンティティされません。が、当然のごとく不等号< > も無効化されてしまうため、サニタイジングが解除されてしまいます。

## 解決策

コメントにて、解決法をいただいたので、そのコードを記録として残しておきます

```cs
// UTF8文字コードがHTMLエンティティされる問題を解決するおまじない
services.Configure<Microsoft.Extensions.WebEncoders.WebEncoderOptions>(options =>
{
    options.TextEncoderSettings = new System.Text.Encodings.Web.TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All);
});
```

設定としてエンコード範囲にUnicodeも追加するということでしょうか。それにしても、今や世界中で使われる環境であり、今時UTF-8などのUnicode系以外の文字コード環境を使うことは稀かと思うので、できれば標準で対応しておいてほしいなとも思うのですが...。

## まとめ

環境による制約というか、仕様のよう、コードを追加することで対応可能なのが分かりホッとしました。とはいえ、MSDNでも記述が見つからず（検索のワードが悪いのか、見つけにくいだけなのか）、参考になるような文献も見つからず、結構インターネットが普及したからと言って簡単に情報を探し出し、解決できるとは限らない状況ですね。
フレームワークによってカプセル化されることによる制約は今まで何度も経験していますが、それを解決する手段を得るのは、なかなか難しいなという教訓を得た感じもします。
[Lightning Network] bitcoind/lightningd をインストールする

Ubuntu 16.04 を使用する。

## 下準備
testnet の場合 8332 ポート、mainnetの場合 18332 ポートを開放。加えて、ライトニング用に 9735 ポートも開放。


## bitcoind のインストール
[公式サイト](https://bitcoin.org/en/full-node#linux-instructions)を参照すれば簡単にインストール可能。

```
# Press [ENTER] と言われるのでEnterを推してから次の行のコマンドへ
sudo apt-add-repository ppa:bitcoin/bitcoin

# 最新版にする
sudo apt update

# CUIを入れる
sudo apt install -y bitcoind
```

なんとこれだけ。ソースからビルドするのとは大違い。`~/.bitcoin/`にインストールされるので、細かい設定をしたい場合は`bitcoin.conf`をこのフォルダに入れれば良い。

早速入れた bitcoind を起動する。

```
bitcoind -daemon -testnet # testnet の場合はこちらを実行
bitcoind -daemon          # mainnet の場合はこちらを実行
```

起動されたかテストを行う。

```
bitcoin-cli -testnet echo ミドリちゃんかわいい # testnet
bitcoin-cli echo ミドリちゃんかわいい          # mainnet
```

以下が返ってくれば成功。

```
[
  "ミドリちゃんかわいい"
]
```

## clightning のインストール
lightning の最も有名な実装としては、[lnd](https://github.com/lightningnetwork/lnd) と [clightning](https://github.com/ElementsProject/lightning) があるが、今回は clightning を用いる。こちらも[公式サイト](https://github.com/ElementsProject/lightning#user-content-installation)に従ってやればOK。

```
sudo apt update
sudo apt install -y \
  autoconf automake build-essential git libtool libgmp-dev \
  libsqlite3-dev python python3 net-tools zlib1g-dev
cd ~/
git clone https://github.com/ElementsProject/lightning.git
cd lightning
./configure
make
```

インストールが終わったら、フォルダを作成して`lightningd`を立ち上げる。

```
mkdir ~/.lightning/ # ここにデバッグログや、トランザクションのログが入る

# パスを通す
export PATH=$PATH:~/lightning/lightningd
export PATH=$PATH:~/lightning/cli

# testnetの場合はこちらを実行
lightningd --daemon --testnet --lightning-dir ~/.lightning/ --log-level=debug >> ~/.lightning/debug.log
# mainnetの場合はこちらを実行
lightningd --daemon --mainnet --lightning-dir ~/.lightning/ --log-level=debug >> ~/.lightning/debug.log
```

以下のコマンドで情報が表示されたら正常に立ち上がっている。

```
lightning-cli getinfo
```

ペイメントチャネルをつなぎたい場合、以下のコマンドで接続できる。

```
lightning-cli connect 02009947c197575f5a948e1e4343c41dc2e6122a9bd644629afb919f30e1115ff8@cln.green:9735 # 筆者のノードに接続される
```

他のノードに繋いでみたい方は、[こちら](https://explorer.acinq.co/n/038863cf8ab91046230f561cd5b386cbff8309fa02e3f0c3ed161a3aeb64a643b9)で探すとよい。

自分のノードに繋いでもらいたい場合は、`lightning-cli getinfo`して、id をコピーした上で、繋いでほしい相手に id と IPアドレス、ポート番号（デフォルトは 9735）を伝えればよい。
Win32 CプログラマーがVBを扱ったときのメモ

営業「むかーし納品したVB6アプリを、今のWindows10のPCに対応するようにしろ」
俺「VBなんていじったことないですよ」
営業「他に人いないし、同じようなもんでしょ」
俺「（いつも余裕ぶっこいて遊んでいるようにみられているからかなぁ)ぁぃ。。。」
営業「あ、あと追加機能もあるでよ」

当時の担当者は消えており、しかたなく、しぶしぶ対応したときのメモです。
(あまりそっち側に深く入り込む気がなかったので、適当対応です)

#### 1. VB6 -> VB.NET(2017)
今回は追加機能あり、ということなのでコンパイルできないと始まらない
自分の環境だとVB6はインストールしていない
ということで、VS2017でコンパイルできるようにしようと調査したところ、一旦VS2008を間に挟むことによってコンバートできる、とのことでした
VS2008を拾ってきてインストールして、無事VB.NETにコンバート終了

#### 2. MSFlexGrid.ocxのインストール
どれどれ、どんなアプリかな(いい加減な資料しか残ってません＞＜)
と実行してみると、すぐにMSFlexGridがない、と怒られました
Windows10では個別に`regsvr32.exe`で登録する必要があるようです
さらに、MSFlexGridは64bitに対応してないのですね＞＜
で、どうにかアプリを起動して使用してみると、別にグリッドをつかわなくてもリストで事足りる内容
多分、以前にそういうアプリを作ったことがあって、その部分だけ使いまわしたんだろうなっていう内容
このあたりで、前任者の先見的配慮の薄さに少し不安を感じました

#### 3. ほとんどの処理をC(C++)で書いたDLLで処理するよ～
アプリの内容はだいたいわかった、とVBのソースコードを眺めてみたところ、、、
嫌な予感的中、流れのわかりにくいコード、場当たり的なコードのオンパレードでした＞＜
こりゃ使いものにならんなぁ、と捨てたり整理していったら、各Formの定義くらいしか残ってませんでした
結局、その他は全部Cで書いたDLLに任せる方針にしました

#### 4. DLL関数引数の定義
言語間の変数型表現の違い、文字列表現の違い、が鬱陶しいです

(1) 引数=変数配列
　これは別段わかりにくい点なし

```
dllヘッダー
  int __stdcall GetArrayData(double *d);
```
``` 
VB定義
  Public Declare Function GetArrayData Lib "Test.dll" (ByRef d As Double) As Integer
```
``` 
VB実装
  Public d(32) As Double
  GetArrayData(d);
```

(2) 引数=文字列
　文字列を引数にする場合は、VBではStribgBuilder型を使うのがよいようです

```
dllヘッダー
  int __stdcall SetText(char *t);
```
``` 
VB定義
  Public Declare Function SetText Lib "Test.dll" (ByVal t As Text.StringBuilder) As Integer
```
``` 
VB実装
  Dim txtbuf As Text.StringBuilder = New Text.StringBuilder(64)
  Dim srctxt As String = ""
  txtbuf.Append(srctxt)
  SetText(txtbuf)
```

(3) 引数=構造体
よく理解してませんｗググって拾ってきたコードをコピペしただけ＾＾；
文字列を固定長配列にしてしまえば、構造体サイズも固定になって構造体の配列渡しも可能でしょう
この固定長文字列に対して、Cのコードでstrcpy()等をした場合に最後尾に\0が入るのですが、そのままVBのString型に代入するとエラーが起きるみたいです
なので、\0を取り除いた文字列をString型に代入するようにしています


```
dllヘッダー
  typedef struct _S
  {
    char cstr[64];
  }S;
  int __stdcall GetStructData(S *s);
```
``` 
VB定義
  <StructLayout(LayoutKind.Sequential)> Public Structure S
    <VBFixedString(64), MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> 
      Public cstr() As Char
  End Structure

  Public Declare Function GetStructData Lib "Test.dll" (<[In](), Out()> ByVal s() As S) As Integer
```
``` 
VB実装
  Public s(256) As S
  GetStructData(s)

  Private Sub mytrim(ByRef txt As String)
	Dim workbuf As String
	workbuf = txt
	Dim cp As Integer = InStr(workbuf, vbNullChar)
	If cp > 0 Then txt = VB.Left(workbuf, cp - 1)
  End Sub

  Dim c As String = s(0).cstr : mytrim(c)
```

#### 5. VBのFormにメッセージを飛ばす
dllからVBのFormに通信することを考えると、慣れている分、メッセージを飛ばすのがわかりやすいですよね
VB.NETではお手軽に利用できます。
起動時にFormのHWNDを取得してdllに教え、dllはそのHWNDにPostMessage()するだけ

``` 
VB実装(起動時)
  Private Sub Test_Form_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
    Dim hWndMain As UInteger = Me.Handle.ToInt32
    '起動処理 ...
  End Sub
```
``` 
VB実装
  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = WM_APP + 1 Then
      If m.WParam = 1 Then
        'WParam==1のメッセージ処理
      End If
    End If
    MyBase.WndProc(m)  ' default message_proc
  End Sub
```
FireMonkey で Window Drag

## 枠無しウィンドウを作る

下図のように Window の BorderStyle を None の状態にして
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/7547e118-c78e-8158-566b-b7fa4befe358.png)

実行すると、↓枠もタイトルバーも無い Client 領域だけの白いウィンドウができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/14ff2e52-2683-b24c-5575-9ec84b178144.png)

でも、これだと移動すらできなくてメッチャ不便！

## 移動
VCL の時は Window Message の [WM_NCHITTEST](https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-nchittest) を使って HTCAPTION を返してドラッグできるようにするっていうのが常套手段でした。

でも、FireMonkey はマルチプラットフォームのライブラリなので、Windows だけでしか使えないこの方法は、あまり使いたくないですよね。

そこで！
FireMonkey には [StartWindowDrag](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Forms.TCommonCustomForm.StartWindowDrag) というメソッドが [TCommonCustomForm](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Forms.TCommonCustomForm) に用意されています。

これを OnMouseDown の時に呼んでやると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/b93fdf43-3bad-0da2-e29d-347209f3be48.png)

こんな風にドラッグできます！
![drag.gif](https://qiita-image-store.s3.amazonaws.com/0/12977/11e29853-c7a2-a8c4-29d7-fc56217f1116.gif)

## んでんで？

ドラッグできるから何なのっていう…。

そこで、みんなお忘れかも知れないんですが TCommonCustomForm には [Transparency](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Forms.TCommonCustomForm.Transparency) っていうプロパティがあるんですよ。

そこには

>すべてのコントロールが透明になるわけではなく、それらは通常通り表示される点に注意してください。フォームの背景のみが、透明の状態に設定されます。

とあります。
つまり、[TImage](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Objects.TImage) とかを載せてそこに透過 png を置くと…
![drag2.gif](https://qiita-image-store.s3.amazonaws.com/0/12977/1e59de91-c9b8-c829-0c72-1b14c206eb17.gif)

ヤッター！
画像の形に切り抜かれたウィンドウができたよ！

ちなみに

> Transparency を True に設定すると、フォームはタイトル バーやボーダーを表示しません。

とあるので最初に設定した BorderStyle は特にいじる必要は無いわけですね。

## Desktop widget
ということで、Transparency と StartWindowDrag を使えば簡単にウィジェットが作れます。
ただ、ウィジェットなら Taskbar の表示を消したいですよね…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/6eee0151-0688-7892-10e7-e392b2d58ad6.png)

消す方法は下記の通り。
これに関してはどうしても別々に API を呼ばなくてはなりません。

```Pascal:Windows
uses
  Winapi.Windows, FMX.Platform.Win;

procedure HideTaskbar;
begin
  ShowWindow(ApplicationHWND, SW_HIDE);
end;
```

```Pascal:macOS
uses
  Macapi.AppKit;

procedure HideTaskbar;
var
  NSApp: NSApplication;
begin
  NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
  NSApp.setActivationPolicy(NSApplicationActivationPolicyAccessory);
end;
```

ちなみに、Windows 版で呼んでいる「ApplicationHWND」は FMX.Platform.Win に定義してある関数で Application の Window Handle を返してくれます。 

さて、これで Taskbar から消えましたが、本当は TaskTray(Windows), StatusBar(macOS) にアイコン表示させたいですよね。
ただ、これはこの記事で紹介できる分量ではないので、また次の機会にします！

とりあえず、TPopupMenu を表示させてあげれば終了させたりできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/051bfe26-ba2d-9f1e-53b1-230d34d1d037.png)

※なお、FireMonkey の TForm には PopupMenu を結びつけられないので、ここでは TImage に [PopupMenu](http://docwiki.embarcadero.com/Libraries/Berlin/ja/FMX.Controls.TControl.PopupMenu) を関連付けています。そのため StartWindowDrag も TImage の OnMouseDown で行うように変更しています。

#まとめ
FireMonkey なら Windows / macOS の両方でデスクトップ・ウィジェットを簡単に作れますね！
Object detection実装：anchor prior生成

この[コミット](https://github.com/festa78/objdet-tf/commit/cb90a000f1c4084fe5aff6a6e3765da76ca209ce)にてObject detectionにおいて重要となるanchor prior生成部分を実装する。

画像内物体のbounding box位置を予測するにあたって、
直接それを予測するのではなく、事前に画像全体に渡ってテンプレートを使って
作成しておいたbounding box群からの相対位置として回帰する事で予測難易度を下げる事が出来る。
この時、テンプレートを使って事前に作成しておくbounding box群をanchorと呼ぶ。

anchorに使われるテンプレートは手法によって異なるが、今回はFasterRCNNで提案された
３つのscaleと３つのaspect ratioの組み合わせである9つのbounding boxテンプレートを
用いる。
この9つのanchorはＣＮＮより抽出された特徴空間に関して各要素毎に作られる事になる。
そのため、基本的にanchorの総数は非常に多くなる。