OmniAICreator/Qiita-1.07M huggingface dataset:
世界の果てからssh、固定ドメインで自宅ラズパイへ簡単接続

はじめに
---
どこからでも固定ドメインで自宅ラズパイへssh接続できるよう、[Serveo](http://serveo.webflow.io/)を使った設定例を紹介します。
**serveo.net**のサブ・ドメインを利用します。仮にドメイン名を**test1234.serveo.net**とします。
無料で利用できます。ルータの設定変更は必要ありません。

参考：

- [ngrok的なことをsshだけでできるServeoに感動した](https://qiita.com/somainit/items/ac26cf7850300605b2d9)

サーバ側(ラズパイ)の設定
---

:one:一度sshを起動し、serveo.netをknown hostsとして登録します。

```shell-session
pi@raspberrypi:~ $ /usr/bin/ssh -R test1234:22:localhost:22 serveo.net
The authenticity of host 'serveo.net (159.89.214.31)' can't be established.
RSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'serveo.net,159.89.214.31' (RSA) to the list of known hosts.
Forwarding SSH traffic from alias "test1234"
Press g to start a GUI session and ctrl-c to quit.
```
[ctrl]+[c]で中断します。


:two:プロセス管理・デーモン化ツールsupervisorを使い、Serveoをデーモン化します。

```shell-session
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install supervisor
pi@raspberrypi:~ $ sudo vi /etc/supervisor/conf.d/serveo.conf
```

```shell:/etc/supervisor/conf.d/serveo.conf
[program:serveo]
command=/usr/bin/ssh -o ServerAliveInterval=60 -R test1234:22:localhost:22 serveo.net
numprocs=1
autostart=true
user=pi
```

```shell-session
pi@raspberrypi:~ $ sudo service supervisor start
pi@raspberrypi:~ $ sudo reboot
```

クライアント側(Android/Termux)から接続します。
---

```shell-session
$ ssh -J serveo.net pi@test1234
Hi there
The authenticity of host 'test1234 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'tst1234' (ECDSA) to the list of known hosts.
pi@test1234' password:
pi@raspberrypi:~ $ 
```

おわりに
---

サーバ側もクライアント側も、sshが使えれば簡単に利用できて便利ですよ。(=^・^=)
RaspberryPi の自作ケース（クリスマスバージョン）

#はじめに
ハロウィンが終わったのでクリスマスネタを。
クリスマスバージョンのラズパイケースを作りました。
※実際には熱対策していないので実用的ではありません・・・ジョークネタです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/RaspberryPi?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPi</a><a href="https://twitter.com/hashtag/xmas?src=hash&amp;ref_src=twsrc%5Etfw">#xmas</a><a href="https://twitter.com/hashtag/DIY?src=hash&amp;ref_src=twsrc%5Etfw">#DIY</a> <a href="https://t.co/77KBrUDffr">pic.twitter.com/77KBrUDffr</a></p>&mdash; nori.dev.akg (@nori_dev_akg) <a href="https://twitter.com/nori_dev_akg/status/1064107853072330753?ref_src=twsrc%5Etfw">2018年11月18日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/40de7a76-d3c6-7f4f-5d17-7bf7546d3e72.png" width=70%>

#材料
* RaspberryPi 3B
* LED 数本
* 小型ブレッドボード
* ケース 100均
* オーナメント 100均

#組み立て
適当に詰め込んで完成！

ポイントは、グリーンの小型ブレッドボードがとてもマッチしています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/e8d005b7-7f1f-7c27-58c9-0b7802f47ede.png" width=70%>

#Lチカ
プログラミングネタが無いと規約違反になるので、Lチカさせます。
クリスマスっぽく、赤／緑／白をランダムに点灯。

```js:blink.js
var Gpio = require('onoff').Gpio;
var NO = [5, 6, 13];    // GPIO
var blinkInterval = setInterval(blinkLED, 500);
var LED = [];

NO.forEach(function (v) {LED.push(new Gpio(v, 'out'))});


function blinkLED() {
    LED.forEach(function(v) {
        if( v.readSync() != Math.floor( Math.random () * 10)%2 ) {
            if (v.readSync() === 0) {
                v.writeSync(1);
            } else {
                v.writeSync(0);
            }
        }
    });
}

function endBlink() {
    clearInterval(blinkInterval);
    LED.forEach(function(v) {
        v.writeSync(0);
        v.unexport();
    });
}
```
```bash:
$ sudo node blink.js
```
Tomcat on DockerでJSPのHello Worldをシュッと動かす

普段ほとんど触っていないJSPの対応が突然舞い込んだ際、まず何をすれば良いかに迷ったためメモとして残します

## 使うもの

* Docker
* Docker Compose

## 手順

1. docker-compose.ymlを用意する
  - TomcatのDocker公式イメージを指定する
  - webappsディレクトリをマウントしてTomcatのコンテナを起動する
2. webappsディレクトリ配下にアプリケーション用のディレクトリを配置、JSPを置く
  - 今回は `helloworld` にします
3. 起動する

## ディレクトリ構成

```
├── docker-compose.yml
└── webapps
    └── `アプリケーション名`
        ├── WEB-INF
        │   └── lib
        │       └── `JSTLなどの必要なライブラリ`
        └── index.jsp
```

## 1. docker-compose.ymlを用意する

* Tomcatのイメージは、Docker Hubにて公式イメージが公開されているので、その中から必要なものを選んで使います
  - https://hub.docker.com/_/tomcat/

`docker-compose.yml`

```yml
version: '3'

services:
  tomcat:
    image: tomcat:9.0.13-jre11-slim
    volumes:
      - ./webapps:/usr/local/tomcat/webapps
    ports:
      - 8080:8080
```

## 2. webappsディレクトリ配下にアプリケーション用のディレクトリを配置、JSPを置く

`webapps/helloworld/index.jsp`

```java
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Hello, world!</title>
</head>
<body>
  <h1><%= "Hello, world!" %></h1>
</body>
</html>
```

## 3. 起動する

* docker-compose.ymlを配置したディレクトリに戻って、 `docker-compose up` を実行します
* `localhost:8080/helloworld/index.jsp` にアクセスして動作確認出来ます


## その他困ったこと

* JSTLの動かし方に迷ったのですが、Mavenで公開されているJSTLのjarを取ってきて、アプリケーション内の `WEB-INF/lib` に置いたら動きました
  - `jstl-1.2.jar` http://central.maven.org/maven2/javax/servlet/jstl/1.2/
  - `jstl-impl-1.2.jar` http://central.maven.org/maven2/org/glassfish/web/jstl-impl/1.2/
Swaggerから静的HTMLを生成する

Swaggerから静的（Webサーバ不要でローカルに保存したファイルをブラウザで開いて表示できる）HTMLを生成する方法を調べました。

### (1) [redoc-cli](https://github.com/Rebilly/ReDoc/blob/master/cli/README.md)

[redoc-cli](https://github.com/Rebilly/ReDoc/blob/master/cli/README.md) を使うとコマンドラインでSwaggerファイルを静的HTMLに変換できる。

インストール

```shell
npm install -g redoc-cli
```

静的HTML生成

```shell
redoc-cli bundle [Swaggerファイル]
```

### (2) [Swagger-UI](https://github.com/swagger-api/swagger-ui)

SwaggerUIBundleのspecプロパティにJSON形式のSwaggerオブジェクトを渡すことで、静的HTMLを作成できる。

https://codepen.io/unhurried/pen/OajdKZ

### 参考

* https://qiita.com/buzztaiki/items/6b04d735f28e00b8b574
* https://qiita.com/ryutah/items/b3c4359b5470e848c89d
Elementary OSのTerminalにNerd Fontを設定する


`colorls`や`vim-devicons`を使うためにElementary OSのPantheon terminalにNerd Fontを設定した際の記録用です。

## 環境

OS: elementary OS 0.4.1 Loki
Laptop: Mi notebook air 13.3 2018

## 手順

最初に以下の手順で、[Nerd Fontsのrepo](https://github.com/ryanoasis/nerd-fonts#font-installation)からフォントをDownloadしてそれに変更してみた。
FontはElementary OSのdefaultにあわせてRoboto Monoを選択。

1. Fontファイル(.ttf)をダウンロードする。nerd-fontsのrepositoryをそのままcloneしようとすると容量がとてつもなく大きいので、RobotoMonoのディレクトリのみダウンロードする。GitHubのsubversionサポートを利用するとディレクトリ/ファイル単位のダウンロードができる。参考: https://qiita.com/raucha/items/1219327df8a9ded494df

    ```fish
    mkdir -p ~/tmp/nerd-fonts/patched-fonts
    cd ~/tmp/nerd-fonts/patched-fonts    
    svn export https://github.com/ryanoasis/nerd-fonts/trunk/patched-fonts/RobotoMono
    cd RobotoMono
    ```

1. ダウンロードしたフォントをpersonalなフォントディレクトリへ移動

    ```fish
    cp 'Regular/complete/Roboto Mono Nerd Font Complete.ttf'   ~/.local/share/fonts/
    cp 'Thin-Italic/complete/Roboto Mono Thin Italic Nerd Font Complete.ttf'   ~/.local/share/fonts/
    cp 'Thin/complete/Roboto Mono Thin Nerd Font Complete.ttf'  ~/.local/share/fonts/
    cp 'Medium-Italic/complete/Roboto Mono Medium Italic Nerd Font Complete.ttf'  ~/.local/share/fonts/
    cp 'Medium/complete/Roboto Mono Medium Nerd Font Complete.ttf'     ~/.local/share/fonts/
    cp 'Light-Italic/complete/Roboto Mono Light Italic Nerd Font Complete.ttf'    ~/.local/share/fonts/
    cp 'Light/complete/Roboto Mono Light Nerd Font Complete.ttf'   ~/.local/share/fonts/
    cp 'Italic/complete/Roboto Mono Italic Nerd Font Complete.ttf'    ~/.local/share/fonts/
    cp 'Bold-Italic/complete/Roboto Mono Bold Italic Nerd Font Complete.ttf'   ~/.local/share/fonts/
    ```
1. フォントキャッシュを更新

    ```sh
    $ sudo fc-cache -fv
    ```
1. フォントが利用可能になっていること ＆ 設定する際に使うFont nameを確認

    ```sh
    $ fc-list | grep "Roboto Mono Nerd Font"
    /home/ryo/.local/share/fonts/Roboto Mono Nerd Font Complete.ttf: RobotoMono Nerd Font:style=Regular
    ```
1. フォントを設定。 `dconf-editor`を使うか、cliで設定する。cliの場合は以下を使う。

    ```sh
    $ gsettings set org.gnome.desktop.interface monospace-font-name "RobotoMono Nerd Font 10"
    ```
1. Terminalを再起動して確認。

![nerd-font-done.png](https://qiita-image-store.s3.amazonaws.com/0/296589/5fcb5826-5d6d-e5b5-b1aa-b4626fcdbdc3.png)

![nerd-font-nvim.png](https://qiita-image-store.s3.amazonaws.com/0/296589/12d1e2e6-eea8-6fe1-bee0-3b7f8ec0ec3a.png)

deviconやAwesome fontのiconが表示されていることを確認できました。
VPCの各要素

AWS認定試験のため、まずは基本的な単語とそれらの関係性をまとめる。

## VPCとは
EC2等のサービスを利用する上で必須となるプライベートなネットワーク環境

## 用語
#### VPC
AWSのネットワーク環境のこと
リージョン内に作成され、リージョンをまたいで作成することはできない

#### インターネットゲートウェイ（IGW）
VPCにアタッチされる、外部ネットワークとの出入り口
VPNや専用線で通信を行いたい場合はVGWをアタッチする

#### サブネット
VPC内を区切ったネットワーク環境のこと
サブネット内にEC2等のインスタンスを配置してシステムを構築する
AZ内に作成され、AZをまたいで作成することはできない
サブネット内のインスタンスはIGWにリクエストを送信することで外部ネットワークと通信ができる
IGWへのルーティングがあるルートテーブルを関連付けたサブネット（パブリックサブネット）と
IGWへのルーティングがないルートテーブルを関連付けたサブネット（プライベートサブネット）に大別される

#### メインルートテーブル
VPCに関連付けられ、通信のルーティングを行う
VPC内のサブネットすべてに暗示的に関連付けられる

#### カスタムルートテーブル
サブネットに関連付けられ、通信のルーティングを行う
カスタムルートテーブルが関連付けられていないサブネットは
VPCのメインルートテーブルが暗示的に関連付けられる

#### NATゲートウェイ
パブリックサブネットにアタッチされ、プライベートサブネットのインスタンスは
NATゲートウェイにリクエストを送信することで外部ネットワークと通信ができる
AZに依存しているサブネットにアタッチされるため、AZ障害時に影響を受ける

#### ネットワークACL
サブネットごとのファイアウォール
デフォルトではすべての通信が許可されている
ステートレス（受信と送信が一括りではない）なので通信を許可/拒否したい場合、
インバウンド、アウトバウンドそれぞれ許可/拒否を設定する必要がある

#### セキュリティグループ
インスタンスごとのファイアウォール
ステートフル（受信と送信が一括り）なので通信を許可したい場合、
受信したい場合はインバウンド、送信したい場合はアウトバウンドで許可するだけで戻りの通信も通る
インバウンド、アウトバウンドにはIPアドレスだけでなく、他のセキュリティグループIDも指定できる
その場合、そのセキュリティグループが割り当てられているインスタンスからの通信を許可できる

#### ピアリング接続
VPC ピアリング接続リクエスト（PCX）にルーティングすることで他VPCとの通信ができる
同一リージョン内だけでなく、他リージョンにあるVPCとのピアリングもできる

## 構成
リージョン配下に以下のように構成される。（例）
　リージョン
　　┠VPC
　　┃　├VPC①　←　メインルートテーブル①、インターネットゲートウェイ①
　　┃　│　↑サブネットⅠ
　　┃　│　↑サブネットⅡ
　　┃　├VPC②　←　メインルートテーブル②、インターネットゲートウェイ②
　　┃　│　↑サブネットⅢ
　　┃　├VPC③　←　メインルートテーブル③
　　┃　│　↑サブネットⅣ
　　┃　└...
　　┠サブネット
　　┃　├サブネットⅠ　←　ネットワークACLⅠ、カスタムルートテーブルⅠ
　　┃　│　↑インスタンスA
　　┃　├サブネットⅡ　←　ネットワークACLⅡ
　　┃　│　↑インスタンスB
　　┃　│　↑インスタンスC
　　┃　├サブネットⅢ　←　ネットワークACLⅢ、カスタムルートテーブルⅢ
　　┃　│　↑インスタンスD
　　┃　├サブネットⅣ　←　ネットワークACLⅣ、カスタムルートテーブルⅣ
　　┃　│　↑インスタンスE
　　┃　└...
　　┠ルートテーブル
　　┃　├メインルートテーブル①
　　┃　├メインルートテーブル②
　　┃　├メインルートテーブル③
　　┃　├カスタムルートテーブルⅠ
　　┃　├カスタムルートテーブルⅢ
　　┃　├カスタムルートテーブルⅣ
　　┃　└...
　　┠インターネットゲートウェイ
　　┃　├インターネットゲートウェイ①
　　┃　├インターネットゲートウェイ②
　　┃　└...
　　┠ネットワークACL
　　┃　├ネットワークACLⅠ
　　┃　├ネットワークACLⅡ
　　┃　├ネットワークACLⅢ
　　┃　├ネットワークACLⅣ
　　┃　└...
　　┠セキュリティグループ
　　┃　├セキュリティグループx
　　┃　├セキュリティグループy
　　┃　├セキュリティグループz
　　┃　└...
　　┗...

　EC2
　　┠インスタンス
　　┃　├インスタンスA　←　セキュリティグループx
　　┃　├インスタンスB　←　セキュリティグループy
　　┃　├インスタンスC　←　セキュリティグループz
　　┃　├インスタンスD　←　セキュリティグループx
　　┃　├インスタンスE　←　セキュリティグループx
　　┃　└...
　　┗...

上記の構成の場合

* VPC③内のインスタンスは直接インターネットに接続できない
* サブネットⅠのルーティングはカスタムルートテーブルⅠに従う
* サブネットⅡのルーティングはメインルートテーブル①に従う
* インスタンスAの通信許可先はセキュリティグループxとネットワークACLⅠに従う
* セキュリティグループyでセキュリティグループxからのインバウンドを許可した場合、
  <br>インスタンスBはインスタンスA、C、Eからの通信を受信できる
  <br>※ネットワークACLⅡはインスタンスA、C、Eとの通信を許可していることが前提

各要素の役割が分かったので、次はどういった問題を解決することができるか確認していきたい
HaskellでHello Worldしてみました（Mobile Haskell/iOS)

## この記事では

HaskellプログラムをiOS上で確認したいなーと思っていまして、まずは定番のHello Worldを動かしてみました。

ちなみに私のMacにはstack等既に入っているので、Mac向けHaskell環境系の話は省略させてもらいます。

* Xcode10.1 / iPhone8シミュレータで動作確認を行ています。

## Mobile Haskell

今回はMobile Haskellを使いました。

http://hackage.mobilehaskell.org/

更にChristian Kjær様の[MobileHaskellFun](https://github.com/Tehnix/MobileHaskellFun)及びその解説記事の内容を利用して確認をさせて戴きました。

## ビルドするにあたって（主に補足です）

原則的には以下のサイト通りにやれば動きます。

https://codetalk.io/posts/2018-02-07-Mobile-Haskell.html

だったらQiitaに書くなって。すみません、超絶初心者の私では↑でも厳しいところがあったので、その補足事項を書かせていただきたいなー…と（滝汗）

### Git関係

一時的な評価を行う場合、gitコマンドの入力を少し変え、以下のようにする事で簡単に落とす事ができるかと思います。

```
・ git clone git@github.com:haskell/cabal.git  は
・ git clone https://github.com/haskell/cabal.git  に

・ git clone git@github.com:zw3rk/toolchain-wrapper.git  は
・ git clone https://github.com/zw3rk/toolchain-wrapper.git  に

```

ターミナル操作に関して、補足はこれぐらいです。gitアカウントとかっちり結びついている場合はこれすら不要で[上記サイト](https://codetalk.io/posts/2018-02-07-Mobile-Haskell.html)の方法でサクサクと進むかと思います。

### Set up the Haskell Codeの所

[上記サイト](https://codetalk.io/posts/2018-02-07-Mobile-Haskell.html)では以下のようになっています。

```
$ touch MobileFun.cabal cabal.project Makefile call LICENSE src/Lib.hs
```

別の方法として、楽するために、以下のリポジトリを

https://github.com/Tehnix/MobileHaskellFun

cloneして落としてそのhs-srcのファイル達を、自分で作成したXCodeプロジェクト配下（hr-src)に持ってくるなどして、ブログの内容と見比べてやる方が楽かもしれないです（MobileFun.cabalをちょっと変えるぐらいになるかと思うです）。

### XCode

元記事はXCodeのバージョンが9.2なので、10,1で使うとなると多少工夫が必要となります。

#### Labelどう貼るの

Labelを貼ろうにも、画面右下にそういうのが出ません。あれー前は出てた気がするのですが・・

以下の図の感じでUIパーツが貼れます。

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/294469/b9e5a344-afb3-1b79-fb39-b2847a552d7d.png)


#### libconv？

これはかなり細かい話ですみません。
私の環境でビルドすると、以下のエラーが出ました。

````
ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame
Undefined symbols for architecture x86_64:
  "_iconv_close", referenced from:
      _hs_iconv_close in libHSMobileFun.a(iconv.o)
     (maybe you meant: _hs_iconv_close)
  "_iconv", referenced from:
      _hs_iconv in libHSMobileFun.a(iconv.o)
````

これは[記事](https://codetalk.io/posts/2018-02-07-Mobile-Haskell.html)の下にある「NOTE:」にある通り、ライブラリを足す必要があります。Xcode10.1にはlibvoncは無いので、下図の感じで libiconv を足してビルドすることで、問題なく動作させる事ができました。

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/294469/2e59158a-328d-2044-0a98-0fd949d2aef2.png)

# 動くとどうなるか

こんな感じのコードで

```haskell
hello = "Hello World from Mobile Haskell"
```

```swift
class ViewController: UIViewController {

    @IBOutlet var helloWorldLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        helloWorldLabel.text = String(cString: hello())
    }
```

こんな画面が出ました。

![fig3.PNG](https://qiita-image-store.s3.amazonaws.com/0/294469/2f5caa8c-2feb-0bf2-c210-aa375ae8cef2.png)

# 最後に

こういうツールもcabalで引っ張ってこれるんですね…
便利なコード／ツールを開発して下さり感謝なのです。
Project Euler 問題4 「2つの3桁の数の積である最大のパリンドローム数」

## 問題

2つの３桁の数を掛け合わせて得られる最大のパリンドローム数（前から読んでも後ろから読んでも同じ数）を求めよ。
> A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.

## コード①
```python
#　２つの因数を大きいもの同士から掛け合わせていく　->　パリンドロームか調べる.
#  最初に出てきたパリンドローム数が最大とは限らないので注意.

#　min, max = 因数の最小、最大
def getLargestPalindromicMultiple(min, max):
  largestMultiple = 0  # 最大のパリンドローム数を保存しておくための変数
  for x in range(max, min, -1):
    for y in range(max, min, -1):
      multiple = str(x * y)

      # 積の桁数が奇数の場合
      if len(multiple) % 2 != 0:
        halfLength = int((len(multiple)+1)/2)
        if multiple[0:halfLength] == multiple[::-1][0:halfLength] and int(multiple) >= largestMultiple:
          largestMultiple = int(multiple)
        else:
          continue
      # 積の桁数が偶数の場合
      else:
        halfLength = int(len(multiple)/2)
        if multiple[0:halfLength:1] == multiple[::-1][0:halfLength] and int(multiple) >= largestMultiple:
          largestMultiple = int(multiple)
        else:
          continue
  return largestMultiple

largestPalindromic = getLargestPalindromicMultiple(100, 999)
print(largestPalindromic)
```

## コード②
```python
# パリンドローム数を作る -> ２つの三桁の因数に分けられるか調べる.

import math

# max = パリンドローム数の左半分の最大, digit = 因数の桁数
def getLargestPalindromicMultiple2(max, digit):
 
  # パリンドローム数が持つべき最小の因数
  minFactor = 10**(digit-1)
 
  #　桁数が偶数（977->977779）と桁数が奇数(977-> 97779)の場合を両方調べる（今回の問題では無くてもいい）
  for round in ['even', 'odd']:

    for num in range(max, minFactor, -1):
      
      # パリンドローム数を作る
      if round == 'even':
        palindromic = int(str(num)+str(num)[::-1])
      else:
        palindromic = int(str(num)[0:-1]+str(num)[::-1])
      
      #　因数を初期化
      factor = minFactor

      # パリンドローム数が因数で割り切れて、なおかつ割った後の数が定められた桁数の場合パリンドローム数を返す
      while(factor <= math.sqrt(palindromic)):
        if palindromic % factor == 0 and len(str(int(palindromic/factor))) == digit:
          return palindromic
        else:
          factor += 1

# 999^2 = 998001以下の最大のパリンドローム数は997799なのでmaxは997
largestPalindromic2 = getLargestPalindromicMultiple2(997,3)
print(largestPalindromic2)

```
コード②の方が早くてコードもスッキリしてる印象

## Pythonで文字列を逆向きにして部分的に切り取る方法について
ややこしいので一旦`[::-1]`で逆向きにしてから切り取るのがおすすめ

```
# nohtyという文字列を切り取る
>>> str = 'python'
>>> str[::-1]
'nohtyp'
>>> str[::-1][:-1]　<-　おすすめ
'nohty'
>>> str[-1:0:-1]
'nohty'
```
Mac で、ZooKeeperのデータを可視化GUIツールで確認する

# 目的
Kafka / Hadoopなど、Zookeeperを使っているシステムがZookeeperに保存している値をもっと簡単にチェックしたい

# 方法

```
wget https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
unzip ZooInspector.zip
java -jar zookeeper-dev-ZooInspector.jar
```


<img width="567" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/bba55560-87cc-d7c4-65af-fcbedd5ba30b.png">

緑のPlayアイコンをクリックし、ZookeeperのURIを追加

<img width="675" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/d61b5cda-5fa1-c201-68f0-0142884268a7.png">

見たいノードを選んで、値が見れます。
<img width="889" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/a14c6ca8-7684-3d8b-6d36-a81f729608dc.png">

権限、メタデータも見れます。
<img width="889" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/5405c711-706f-7df7-ad18-6e1ec6622159.png">
<img width="887" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/7a941253-d25d-d655-579f-7b0b17de2850.png">

## Zookeeper InsectorでHDF/HDPの情報を見てみる
### KafkaがZKに保存した情報
Kafkaのクラスタ情報、Broker情報などがZKに保存されています。
<img width="1092" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/b1140756-9f0f-83fb-ac93-606b5d3616e7.png">


実際のデータを見て、
Kafka 1.0以後はConsumerのデータをZKから除外した、ということをより深く理解しました。

### NiFiがZKに保存した情報
HDFのNiFiとZookeeperの関係もこれで確認出来ます。
<img width="1300" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/4bc4f1dc-3557-158a-e028-4d6f654867a4.png">

ここでわかるのは、ZKにはPrimary Nodeの情報と、Coordinator Nodeの情報以外、
Primaryノードに限定したコンポネントProcessorの情報もZKに保存されています。

<img width="1030" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/10fd26fb-a45f-0d92-3216-85e0dab0de7e.png">
RaspberryPi アルミケース

RaspberryPi3　B+にアルミケースを組みました。

2018年11月17日現在
Aliexpressでケース単体978円
ファン、ヒートシンク　1212円
USBアダプターセット　1585円です。

![Raspi-case-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/347f1149-3533-50e2-ba1c-3b137c032526.jpeg)
取り付ける時は、上蓋と片側の仕切りを外します。
![Raspi-case-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/acdc2cdd-0d71-cc0b-1909-d5349ace7c06.jpeg)
組み立てる前に、ヒートシンクを取り付けましょう。
![Raspi-case-3-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/458efee5-8d57-f7f5-6b32-8e9d1935acb1.jpeg)

![Raspi-case-3-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/38b99903-d3b8-00a5-b92e-3400df29086a.jpeg)
![Raspi-case-4-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/ea61bc4e-3d05-f0f4-d851-77c9c6c23f9f.jpeg)
![Raspi-case-4-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/d7f73ecb-13b4-7b74-0ac7-fc122e8a77dc.jpeg)
ファンがセットですが、パンチングプレートの穴の径と合いません。
つけるときは、リーマーで穴を大きくする必要があります。
![Raspi-case-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/9468bfe5-533c-4597-326c-a439bf7ae68d.jpeg)
クライアントサイドから考えた、HTMLをインクルードする3つの方法

Webサイトを構築するにあたり、ヘッダーやフッター、解析タグ等の共通部分を、一括で管理したいですよね。
そんなときは、共通部分を別ファイルに切り分け、別途管理するかと思います。

今回は、HTMLをインクルードするにあたり、**どのような方法があるか？**と、**どう使い分けるか？**をまとめました。

## HTMLをインクルードする方法
HTMLをインクルードする方法は、以下の3種類に分けられるかと思います。

- プリプロセッサーでの静的挿入
- クライアントサイドでの動的挿入
- サーバーサイドでの動的挿入

それぞれの特徴や、メリット・デメリットを解説考えていきます。

### プリプロセッサーでの静的挿入
プリプロセッサー（テンプレートエンジン）を使い、開発時は別ファイルとして挿入し、ビルドした本番用ファイルはHTMLベタ書きになる方法です。

- EJS
- Pug

このあたりがメジャーですね。

#### メリット
- 静的なため高速
- ハンドリングしやすい

結果として静的なHTMLファイルになるので、パフォーマンスは優れています。
また、フロントエンドの開発環境で完結できるので、出し分け等もしやすいです。

#### デメリット
- 修正時、差分が大量に出る

数ページなら気にならないかもしれませんが、数十〜数百ページになると、一個のインクルードファイルの変更が、挿入されているすべての静的HTMLファイルへの変更になってしまうので、Git等で差分がめっちゃでちゃいます。

### クライアントサイドでの動的挿入
JavaScriptを使用し、クライアントサイドで動的に要素を生成する方法です。

- document.createElement & element.appendChild
- jQuery .html()
- Vue.js コンポーネント
- React JSX
- HTML Modules for Web components

JavaScriptでかけるので、フロントエンド的な自由度はかなり高いですね。

#### メリット
- 修正時の差分は、インクルードするファイルだけでOK
- ハンドリングしやすい

プリプロセッサーと比べると、ブラウザ側で動的に挿入されるので、修正や更新時の差分は最小限で済みます。
また、こちらはプリプロセッサーと同じですが、フロントエンド側で制御できるので、ハンドリングはしやすいです。

#### デメリット
- ブラウザへの負担が大きい

ブラウザ側でレンダリングするので、表示速度等は少し不利になる可能性があります。

### サーバーサイドでの動的挿入
サーバーサイドで事前にレンダリングしておき、クライアントサイドでは静的な扱いとする方法です。

- SSI
- PHP include
- ユニバーサルJavaScript SSR

#### メリット
- 修正時の差分は、インクルードするファイルだけでOK
- ブラウザへの負担が少ない

クライアントサイドでの動的挿入と同様に、変更・更新時の差分は最小限で済みます。
また、サーバーサイドでレンダリングを済ませておくため、ブラウザへの負担は少ないです。

#### デメリット
- サーバーの対応状況により、使いないことがある
- サーバー側に負担がかかる

サーバー環境によっては使えないものもあるので、事前に確認しておく必要があります。
（ここを忘れると、痛い目にあいます。。）
また、当たり前ですが、サーバーサイドでレンダリングすれば、その分サーバーに負荷がかかります。

### 使い所
上記を踏まえて、どういった使い分けが適切なのか、考えてみました。

#### プリプロセッサーでの静的挿入
- 少しでも速く！
- ページ数が少ない
- 本番サーバーを握っている（お客さんやシステム担当者にファイル納品する場合は、差分が多いとちょっと嫌ですよね）

#### クライアントサイドでの動的挿入
- ページ数が多い（コミット時の差分を減らしたい）
- サーバーの仕様が不明
- サーバーサイドでレンダリングすることができない
- クライアントサイドで動的に変化させたい

#### サーバーサイドでの動的挿入
- ページ数が多い（コミット時の差分を減らしたい）
- サーバーサイドでレンダリングすることができる
- サーバーが強力

こんな感じですかね。

それではみなさん、Enjoy HTML Include!!
正規表現 `$^` は何にマッチするか（アンカーの正しい理解に向けた確認）

エディターなどにおいて**空行**にマッチさせるとき、正規表現で **`^$`** というのを使う。この正規表現の意味は雑に言えば「行頭があり1文字も無く行末がくる」というものである。 `^` や `$` は正規表現のアンカーという機能で、文字列中でとある特徴を持つ位置にマッチする。

では、このアンカーを**逆順**に書いた正規表現 **`$^`** は何にマッチするか？

## 答え
一般的な正規表現エンジンなら、これも空行にマッチする。つまり **`^$` と全く同じ**である。

```bash:grep（拡張正規表現）
echo '' | grep -E '^$' && echo "matched."
echo '' | grep -E '$^' && echo "matched."
```

---

「一般的な」と書いたのは、そうでないものも存在するから。例えばアンカーの効力を失って普通の文字にマッチすることがある。このような動作は本記事の対象外とする。

```bash:grep（基本正規表現）
echo '' | grep '^$' && echo "matched."
echo '!$^"%(#&)' | grep -o '$^' #=> $^
```

## ありがちな間違い
「何にもマッチしない」と思わなかっただろうか。

その場合は恐らく次のように考えたと思う。「行末**の後に**行頭がくる行、なんて条件が破綻している。」

もし行頭でなく適当な文字（ `$a` など）だったら、その考え方はだいたい正しい。行末の後ろにあるのは改行文字（か文字列終端）なので、普通の文字がくることはあり得ない。

この考え方の何が問題かというと、アンカーに対して「○○の後に」とヘタに順序を意識してしまったことである。アンカーは文字列の位置にマッチするのであり1文字も読み進めない[^zwa]ため、同じ位置から何事もなかったかのように次の正規表現パターンを検査する。一方で `a` のように文字列を読み進める正規表現に対しては順序を意識する必要がある。

> あるいは、そもそも文字列の位置という考え方に慣れていないのかもしれない。エディターでカーソルが縦棒だとわかりやすいが、文字と文字の間が位置である。部分文字列（エディターでいう範囲選択）として見る場合、その長さは0。

それを踏まえて `$^` を正しく解釈すれば次のようになる。「行末**であり**行頭**である**位置が存在する行、それは空行だけである。」

## まとめ
アンカーは文字列の位置にマッチする。その言葉の裏には「マッチしても文字列を読み進めない」という意味があり、同じ文字列位置から次の正規表現パターンを検査することになる。そのため**連続するアンカー同士の順序を入れ替えても意味は変わらない**。アンカーだけでなく、先読みや後読みと呼ばれる機能も同じである[^capture]。

なお、同じ意味になるからといって `$^` と書くのは混乱の元なのですべきでない。可読性を考えて書くべきである。

[^zwa]: そのためアンカーなどを「ゼロ幅アサーション」と呼ぶことがある
[^capture]: さすがに先読みの中でキャプチャー・後方参照を利用していたりしたら、順序は重要だと思う
大阪府立大学高専　土井研究室＠Qiita

#概要
[公式ホームページ](http://www2-doi.ct.osakafu-u.ac.jp)は、大阪府立大学法人が管理するCMSサイトにあります。
Qiitaページの[電子空間分室](https://qiita.com/tmdoi/items/6f2599620aaa938cf6f8)もあります。
このページには、簡単なシーズ紹介や講演や参加イベントの記録をまとめています。

#講演
##講演予定
- 2019.02.07 IoT/福祉機器関係 [告知HP](http://www.m-osaka.com/jp/mobio-cafe/detail/001889.html)
- 2019.02.14 ICT/IoT/Robot/AI関係 [告知HP](http://www.city.tondabayashi.lg.jp/soshiki/36/19224.html)
　[■Qiita・リンク](https://qiita.com/tmdoi/items/fa5723a95aab781fd8ee)
- 2019.03 ICT/IoT/Robot関係
- 2019.春 Society5.0関係

#講演実績
- 2019.01.30 IoT関係
- 2018.12.11 ICT,IoT,AI関係 [告知HP](http://www.osaka.cci.or.jp/event/seminar/201811/D22181211013.html)　[■Qiita・リンク](https://qiita.com/tmdoi/items/7c117c09255a1bb1e62a)
- 2018.12.06 Robot関係 [■Qiita・リンク](https://qiita.com/tmdoi/items/2ba27b2ec27cf906317b)
- 2018.12.04 IoT関係　 [■Qiita・リンク](https://qiita.com/drafts/2b53d075d951ba03acac)
- 2018.10.19 Society5.0関係 [告知HP](https://www.osakafu-u.ac.jp/event/evt20181019_2/)　[■Qiita・リンク](https://qiita.com/tmdoi/items/18333ec3adaec5b41625)

#イベント
##参加予定イベント
- 2019.06~2019.08 [第19回レスキューロボットコンテスト](https://www.rescue-robot-contest.org/19th-contest/)
- 2020 WRS2020

##参加イベント実績
- 2018.12.15 第３回廃炉想像ロボコン [公式HP](http://www.fukushima-nct.ac.jp/~fdecomi/conte5.html)
- 2019.08.10 レスキューロボットコンテスト [公式HP](https://www.rescue-robot-contest.org/)
GCPにSSH接続する、そして Tcp SSH Forwarding を可能にする

こんにちは、chlochanです。GCPにはいままで "SSH → ブラウザウインドで開く" の機能を使ってSSH接続していましたが、今日は通常の方法でGCPにSSH接続できる様にします。以下を参考にさせていただきました。
https://qiita.com/nnahito/items/dbe6fbfe347cd66ae7e6

#Tcp SSH Forwarding を可能にする
SSH ポートフォワーディングでVNCを使うのが主な目的なので、まず SSH フォワーディング が出来るように、VMの /etc/ssh/sshd_config の AllowTcpForwarding 設定を確認します。

```
AllowTcpForwarding yes
```
上記の様に、yes となっている必要があります。デフォルトは yes なので、no になってさえいなければコメントアウトされていてもOKです。

#鍵を作って双方に設定する
sshで接続する場合、クライアント側でssh-keygenで鍵を作ります。公開鍵と秘密鍵の２つが同時に作られます。公開鍵はサーバー側に置いておく鍵で、作ったときには "xxxx.pub" という感じで、"pub" という拡張子がついたファイル名で作成されます。"authorized_keys" というファイル名に変更して .ssh の下に置いておきます。もし既にあった場合は、authorized_keys に追加します。そしてもう一方の秘密鍵は、クライアント側の鍵です。秘密鍵はその名の通り、アクセスする人以外には秘密にして保持しておく必要があります。**秘密鍵を保持する方であるクライアント側で**以下の様に鍵を作ります。Windowsの場合も PowerShell で同様に作れます。

```bash
$ ssh-keygen -t rsa -C ユーザー名
```
実行するとパスワードを聞かれます。**万が一秘密鍵が持ち出されたときのことも考え、パスワードは念の為に設定します**。id_rsa（秘密鍵）と id_rsa.pub（公開鍵）というファイルが作成されます。そして、公開鍵をサーバーの .ssh に置き、その後以下を行います。

- 公開鍵（authorized_keys）のパーミッションを600にする。
- .sshフォルダのパーミッションを700にする。
- id_rsa.pubをauthorized_keysに結合し、id_rsa.pubを削除する。

なので、以下のコマンドを実行します。

```bash
$ cd ~/.ssh/
$ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ chmod 700 ~/.ssh
$ rm id_rsa.pub
```
そして、クライアント側から、秘密鍵を使って、サーバーにSSH接続します。ユーザー名を chlochan 、サーバー(VM)の外部IPアドレスを 101.23.45.67 とし、サーバーのポート 5901 を、クライアントのポート 1234 で接続する場合は以下のコマンドとなります。さらに -C をつけると圧縮がオンになりますが、VNC の様にすでに圧縮された通信の場合は効果が薄いかもしれません。

```bash
ssh -i 秘密鍵ファイル chlochan@101.23.45.67 -N -L 1234:101.23.45.67:5901
```
この状態を図にすると以下の様になると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307576/30f32d14-0686-0579-1e37-b751b812287f.png)
#ポート5901を閉じる、そして22を別のポートに変更する
次に、VMのファイアウォール設定を変更します。上記の図の様に、ポート5901番はVM内部で閉じているので、外部に対しては開けて置く必要は無くなったので閉じます。内部向けには必要です。そしてSSHのポートも22番はウェルノウンポートで一般的にSSHのポートと認知されており、常に攻撃の対象になっているので、使っていない違うポート番号に変更します。ちなみにlogを見ると、VMを起動したとたんにすぐにSSHのポート22へのアタックが開始されていました。
タスク管理ツールについて検討


プライベートでtrelloを使っているがjiraを使うかどうか
一旦、気楽にメモしていく

* ショートカットキー
* オンプレミス


2018年 Trelloを使う時にデフォルトで入れるべきChrome拡張機能【随時更新】 - Qiita
https://qiita.com/webazarashi/items/1099cd39d31a1474226a

Trello（トレロ）vs Jira（ジラ）比較 ｜ リックソフト
https://www.ricksoft.jp/atlassian/trello/trello-compare.html

Jira の価格 - 1 ユーザーあたりの月間および年間サブスクリプション料金
https://ja.atlassian.com/software/jira/pricing?tab=self-hosted

オンプレミス jira docker - Google 検索
https://www.google.co.jp/search?num=100&ei=TifxW9DrFpKv0PEPic2b2Ag&q=%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E3%83%9F%E3%82%B9+jira+docker&oq=%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E3%83%9F%E3%82%B9+jira+docker&gs_l=psy-ab.3...132554.133135..133478...0.0..0.155.832.0j6......0....1..gws-wiz.......0i8i30j33i160.KGb7q3WIPGU

cptactionhank/atlassian-jira - Docker Hub
https://hub.docker.com/r/cptactionhank/atlassian-jira/

Ubuntu 18.04 LTSにDockerを使ってGitLabとMattermostを導入してみた - いろいろ試してみる
http://imamachi-n.hatenablog.com/entry/2018/04/29/193718

Official Atlassian support for JIRA on Docker
https://community.atlassian.com/t5/Jira-questions/Official-Atlassian-support-for-JIRA-on-Docker/qaq-p/568641

自分のAWSにJIRAのサーバー版をインストールできる？ - Atlassian コミュニティ
https://www.ricksoft.jp/qa/questions/6980359/%E8%87%AA%E5%88%86%E3%81%AEaws%E3%81%ABjira%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%89%88%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B

JIRA アプリケーションのインストール - アトラシアン製品ドキュメント
https://ja.confluence.atlassian.com/adminjiraserver073/installing-jira-applications-861253011.html

jiraに関する新着投稿 - Qiita
https://qiita.com/tags/jira/items

俺でもわかるJIRAのインストール - Qiita
https://qiita.com/gamisan9999/items/45589dc8805eeb45fd96
pythonでヒストグラム作成

numpy と　matplotlibを使ってヒストグラムを作る

```python

#インポート
import numpy as np
import matplotlib.pyplot as plt

#データ作成
golf = np.array([110,107,121,137,87,92,104,129,98,99,139,82,105,100,114,122,109,94,106,111])

#描写
plt.hist(golf,range=[80,140],bins=6)
plt.grid(True)
plt.show()
```
大阪商工会議所　中小製造業のためのＩｏＴ技術導入セミナーのリンク集

#概要
- 日時：2018/12/11 15:30-17:30
- 会場：[大阪商工会議所](https://www.osaka.cci.or.jp/godai/)
- [セミナーのHP](http://www.osaka.cci.or.jp/event/seminar/201811/D22181211013.html)

#講演タイトル
- 中小企業のICT/IoT/AI導入についての勘所

#ICTの動向
- [経済産業省　資料　２０１７．３](http://www.chusho.meti.go.jp/koukai/kenkyukai/smartsme/2017/170329smartsme05.pdf)

#IoTの実例集
- [スマートIoT推進フォーラム](https://smartiot-forum.jp/iot-val-team/iot-case)
- [ロボット革命イニシアチブ協議会]（https://www.jmfrri.gr.jp/info/rri/380.html ）
- [日立システムズ](https://www.hitachi-systems.com/ind/fs/pioneer/report/report01/)
- [東芝のIoT](https://www.toshiba.co.jp/iot/usecase/index_j.htm?utm_source=google&utm_medium=cpc&utm_campaign=search)
- [FANUC](https://www.fanuc.co.jp/ja/product/video/field.html)
- [三菱電機](http://www.mitsubishielectric.co.jp/news/2017/1107-a.html)
- [ファナック・三菱電機・DMG森精機](https://www.nikkei.com/article/DGXMZO33095290Y8A710C1000000/)

# 精密プレス工業　カウンタ　動画
- [精密プレス工業](https://www.youtube.com/channel/UC-Mg3os-eI3AKRDs0ffMPYQ)
- [打点カウンタ：基本動作](https://www.youtube.com/watch?v=N-AbjdU-BFw)
- [レーザー加工機：タイマ](https://www.youtube.com/watch?v=euLpMJSWL28)
- [スポット溶接：実際の映像](https://www.youtube.com/watch?v=QtY1P7T86Oo)
Docker覚え書き


Homebrewで下記をダウンロード

docker
docker-machine

ターミナルから下記をダウンロード
virtualbox

```bash
$ brew cask install virtualbox
```

docker-toolbox

```bash
$ brew cask install docker-toolbox
```

ターミナルでテスト環境をたてる

```bash
$ docker-machine create --driver virtualbox test1229
(docker-machine start test1229)
```

テスト環境へ接続

```bash
$ docker-machine ssh test1229
```

mysqlをダウンロード

```bash
$ docker pull mysql:8.0
```

mysqlを起動

```bash
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
```

コンテナIDを確認

```bash
$ docker ps
```

docker execコマンドで接続

```bash
$ docker exec -it e857aab5734a bash
$ mysql -u root -p
```
Azure Storage Emulator 5.8.0.0でAzure Durable Functionsが実行できない問題を解消する方法

[Azure Durable Functions](https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-overview)のアプリケーションをローカルで開発する場合、Azure Storage Emulatorを使うことを推奨されています。

- [Durable Functions 拡張機能とサンプルをインストールする - Azure | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-install)
- [Azure ストレージ エミュレーターを使用した開発とテスト | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-emulator)

# エラーが起きた
しかし、2018/11/18時点で最新のAzure Storage Emulator 5.8.0.0では、Azure Durable Functionsの実行時（デバッグ含む）に下記のようなエラーが起きます。

```
Azure Functions Core Tools (2.2.32 Commit hash: c5476ae629a0a438d6850e58eae1f5203c896cd6)
Function Runtime Version: 2.0.12165.0
[2018/11/17 6:32:07] Building host: startup suppressed:False, configuration suppressed: False
[2018/11/17 6:32:07] Reading host configuration file 'D:\src\yuta\func\durable-functions-anti-pattarns\durable-functions-anti-pattarns\bin\Debug\netcoreapp2.1\host.json'
[2018/11/17 6:32:07] Host configuration file read:
[2018/11/17 6:32:07] {
[2018/11/17 6:32:07]   "version": "2.0"
[2018/11/17 6:32:07] }
[2018/11/17 6:32:34] A host error has occurred
[2018/11/17 6:32:34] Microsoft.WindowsAzure.Storage: Server encountered an internal error. Please try again after some time.
```

本来なら関数が読み込まれ実行エンドポイントが用意されるわけですが、「Microsoft.WindowsAzure.Storage: Server encountered an internal error. Please try again after some time.」となり、止まってしまいます。

<img width="830" alt="2018-11-17_15h32_47.png" src="https://qiita-image-store.s3.amazonaws.com/0/1136/acb4dcd6-c5fd-5d49-2768-7af89e781632.png">

# 原因
この問題に関して、すでにIssueが上がっています。

[Unable to run Durable Functions with Azure Storage Emulator v5.8 · Issue #474 · Azure/azure-functions-durable-extension](https://github.com/Azure/azure-functions-durable-extension/issues/474)

> I think this might possibly be a problem with extensions that use web hooks.

Issueにはこのように記載されており、Webhook、つまりHTTPトリガーの関数で起きるだろうとのこと。  
実際、私の環境でもHTTPトリガーの関数の実行時にエラーが発生しました。

# 対策
IssueはOpen状態のため根本解決には至ってないと思いますが、暫定的な対策が提示されています。  
`local.settings.json`というローカル開発時の設定ファイルに `"AzureWebJobsSecretStorageType": "files"` を追記するようです。

初期状態の`local.settings.json`に追記した状態は下記になります。

```json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "AzureWebJobsSecretStorageType": "files"
  }
}
```
Amazon API GatewayでAPIの不具合を再現


アプリケーションでAPIの不具合時のテストをしたいことってあると思います。


# 結論

Amazon API GatewayのMock機能を使うと、あらゆるクエリに対して一律のエラー系のステータスコードを返却でき、APIの不具合を再現可能できる。


# 手順

API Gatewayのリソースとパスはすでに作成済みとします。作成は[こちら](https://qiita.com/Keisuke69/items/0852d536110b2fa6e087)などが参考になります。


### 1.統合リクエスト


統合リクエストでMockを選択し、`statusCode`に返却したいステータスコードを指定します。デフォルトは200ですが、今回は不具合を再現したいので500をセットすることにします。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/81805/c30aea80-1ab6-cd0c-1265-f466a6be1aad.png)


```
{"statusCode": 500}
```


### 2. メソッドレスポンス

メソッドレスポンスに返却したいステータスコードを追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81805/5145c6d6-f8eb-01e7-0cf3-d355314357a8.png)




### 3. 統合レスポンス


結合レスポンスのマッピングテンプレートに、返却値を設定


![image.png](https://qiita-image-store.s3.amazonaws.com/0/81805/c8976323-0623-b38c-d7bc-2b7f27852e82.png)




### 4. 確認


テストを実行し、期待する返却値が得られることを確認します。




<img width="966" alt="Pasted_Image_2018_11_20_11_26.png" src="https://qiita-image-store.s3.amazonaws.com/0/81805/ad005c05-f1e4-1460-ed48-8bdf1f739654.png">



![image.png](https://qiita-image-store.s3.amazonaws.com/0/81805/fbdfcd31-15b0-34ab-c81e-d5bf1fde142e.png)


ステータス`500`で、設定したレスポンスが返ってきました。
Qiitaの「いいね」を「ハラショー！」に変える

[Qiitaの「いいね」を「すごーい！」に変える](https://qiita.com/xsota/items/3f534d6ef71a4424fbc2)を見て，これはいい！と思い流用しようとしたものの，残念ながら参考元のソースが古いのか，`manifest.json`の`content_scripts.matches`のURLが古かったりそもそもセレクタが無かったりしたので，なんやかんやでアイデアだけ拝借，今のQiitaに合わせました．
~~とは言ってもCSS使える人じゃないので，一部できずに挫折してます~~
というわけで本題！

# ハラショー！(エリチ派)
Qiitaの「いいね！」を「ハラショー！」に変えるChrome拡張を作りました．
自分が投稿した記事は↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56006/3bf1f5a6-1146-df96-bb49-a53be90d1fce.png)
他ユーザーが投稿した記事は↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56006/6ff72f5f-8a80-fc18-768e-1b13cb7a0915.png)

コメント部分も変えてます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56006/d0e05551-2723-2887-7323-c133817d4874.png)

ソースは↓

```css:harasyo.css
div.it-Footer_actions > div.it-Footer_like > div > button > span {
    font-size: 0px;
}

div.it-Footer_actions > div.it-Footer_like > div > button > span::after {
    font-size: 1.6rem;
    content: "ハラショー！";
}

div.commentHeader > div.commentHeader_metadata.pull-right > div.LikeButton.LikeButton--small > button > span:nth-child(2) {
    font-size: 0px;
}

div.commentHeader > div.commentHeader_metadata.pull-right > div.LikeButton.LikeButton--small > button > span:nth-child(2)::after {
    font-size: 11px;
    content: "ハラショー！";
}

div.it-Footer_actions > div.it-Footer_like > div > span.LikeLabel__text {
    font-size: 0px;
}

div.it-Footer_actions > div.it-Footer_like > div > span.LikeLabel__text::after {
    font-size: 16px;
    content: "ハラショー！";
}
```

```json:manifest.json
{
    "manifest_version": 2,
    "name": "Qiitaハラショー！",
    "description": "Qiitaのいいねをハラショー！に変えます。ハラショー！",
    "version": "1.0",
    "content_scripts": [
        {
            "matches": ["https://qiita.com/*"],
            "css": ["harasyo.css"]
        }
    ]
}
```

# 使い方

1. `harasyo.css`と`manifest.json`のファイルを保存したディレクトリを用意します
2. ChromeのURIに`chrome://extensions/`と入力して，拡張機能を開きます
3. 右上にあるディベロッパーモードをオンにします
4. 1.で保存したディレクトリをドラッグ&ドロップ
5. ハラショー！

# やりこみ要素

* CSSにあるdivとか多分消せると思いますが，そこまでの熱意がないのでやめました(~~Chromeの開発者ツールを使ってセレクタ抽出するという手抜き工事しました~~)
* マイルストーンにあるやつと自分がコメントしたいいね！ですが，数字といいねが同一タグ内にあるので，`harasyo.css`の内容(元のフォントサイズを0にしてその後に文字を追加するやり方)をそのまま使ったら数字ごと消えて駄目でした
* この拡張機能を追加すると，右上の拡張子ボタン`Q`のアイコンが追加されたので，そこで表示する内容を設定できたらと思いましたが，そこまでの熱意がないのでやめました(再燃したらするかもしれない)
rmagickのinstallをやろうとしてハマった件

# 起こった事象

rmagicをbudle installしようとすると

```
An error occurred while installing rmagick (2.16.0), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.16.0'` succeeds before bundling.
```

というエラーが起こる

# 原因はImageMagick7

rmagicがまだImageMagick7に対応していないのが原因。

# 対処

```
# 念のため確認
$ ls -al /usr/local/bin/convert
lrwxr-xr-x  1 tweeeety  tweeeety  42  3 23 22:36 /usr/local/bin/convert -> ../Cellar/imagemagick/7.0.7-27/bin/convert

# 6をインストール
$ brew install imagemagick@6

# 最初にlinkをはずしておく
$ brew unlink imagemagick

# imagemagick@6をリンクする
$ brew link --force imagemagick@6
```

ただinstallするだけでなくヒモ付をしないといけない。
nerdtreeでファイルやディレクトリ名の先頭が表示されない

# こんなときの対処法
![スクリーンショット 2018-11-18 16.58.31.png](https://qiita-image-store.s3.amazonaws.com/0/208338/fad3cfeb-0d3a-edc2-325f-afe7579587cf.png)


ディレクトリの名前がうまく表示されていない。こちらのissueによれば環境ごとに設定が必要らしい。

[Missing first character in tree structure](https://github.com/scrooloose/nerdtree/issues/916)

そこで``.vimrc``に上記issueにある通りに記述する。

```vim
let NERDTreeNodeDelimiter = "\t"
```

なおった。

![スクリーンショット 2018-11-18 17.01.20.png](https://qiita-image-store.s3.amazonaws.com/0/208338/836239e4-5b07-30d1-ce5b-1670cbe4bbce.png)
Vueでレイアウトを変更する

# はじめに
NUXTを使用すればレイアウトを変更する仕組みがあるようですが、
Vue CLIで作成したプロジェクトのレイアウトを変更できるようにしてみる。
レイアウトの変更方法は[こちら](https://itnext.io/anyway-heres-how-to-create-a-multiple-layout-system-with-vue-and-vue-router-b379baa91a05)を元にさせて頂いております。

# 環境
```
$ node -v
v8.9.4

$ vue -V
3.1.1
```

# 準備
[こちら](https://github.com/whoshino/vue-sample/tree/master/layout)からCloneする。
※TypeScriptで作成しています。

# 内容
1. プロジェクトを実行すると、ログイン画面が表示される。(と言ってもただのペラの一枚ページです。)
2. loginを押すとホーム画面に遷移する。

ログイン画面とホーム画面でレイアウト（ナビーバーの有無）を切り替えています。

## 説明
1 ルータでメタフィールドを持たせ画面によってレイアウトを変更できるようにする。

``` router.ts
export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'login',
      meta: { layout: 'none'},
      component: () => import('./views/Login.vue'),
    },
    {
      path: '/home',
      name: 'home',
      component: Home,
    },
    ...
```

2 レイアウト用のコンポーネントを作成する

``` DefaultLayout.vue
<template>
  <div id="default">
    <!-- ナビとかフッターのコンポーネントを追加したりする。 -->
    <div id="nav">
      <router-link to="/home">Home</router-link> |
      <router-link to="/about">About</router-link> |
      <router-link to="/">Logout</router-link>
    </div>
    <router-view/>
  </div>  
</template>
```

``` NoneLayout.vue
<template>
  <div id="none">
    <router-view/>
  </div>  
</template>
```

3 レイアウト用のコンポーネントを定義

``` main.ts
...

import DefaultLayout from '@/layout/DefaultLayout.vue';
import NoneLayout from '@/layout/NoneLayout.vue';

Vue.component('default-layout', DefaultLayout);
Vue.component('none-layout', NoneLayout);

...
```

4 メタフィールドをみてcomputedでレイアウトを変更

``` App.vue
<template>
  <div id="app">
    <component v-bind:is="layout"/>
  </div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';

@Component
export default class App extends Vue {
  private defaultLayout: string = 'default';

  get layout(): string {
    return (this.$route.meta.layout || this.defaultLayout) + '-layout';
  }
}
</script>
```

# その他
Gitのサンプルプロジェクトは以下の設定で作成しました。

```
Vue CLI v3.1.
? Please pick a preset: Manually select features
? Check the features needed for your project: TS, Router, Vuex, Linter
? Use class-style component syntax? Yes
? Use Babel alongside TypeScript for auto-detected polyfills? No
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a linter / formatter config: TSLint
? Pick additional lint features: Lint on save, Lint and fix on commit
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? In package.json
? Save this as a preset for future projects? No
```
[GPU]機械学習基礎 Anaconda Tensorflow(Keras)でMnist文字認識

#導入楽になったTensorFlowの中のKeras使う

基礎の基礎。とりあえず体験として備忘録。
少し前までTensorflowをGPUで使う環境作るの少しだけ面倒だったんですけどAnacondaで普通に使えるようになったようなので試しの記事を作成します。

普通に[Anaconda](https://www.anaconda.com/)をインストール

その後仮想環境作ります。

`Environment -> create
▶ボタン押して　open terminal`

```
conda install tensorflow-gpu
```

言うまでもないですが、入ってなかったら
conda install matplotlib
などで入れておきましょう。

入力すると普通に使えるようになる。
バージョンもあっているものに自動でダウングレードするとのことで素晴らしい。

```mnist.py
import tensorflow
from tensorflow import keras
%matplotlib inline
import matplotlib.pyplot as plt

# Mnistをダウンロードして分けてくれる
(x_train, y_train),(x_test, y_test) = keras.datasets.mnist.load_data()

# 正規化 小数にするので.0忘れずに
x_train, x_test = x_train / 255.0 , x_test / 255.0

```

0~255までの数値入っているので正則化で255で割るとよいです。.0つけないとほぼ0になりますので注意。

条件を設定していく。Flatten()でデータを1次元化
Dense 512　中間層512 活性化関数をrelu
Dropout 20％減らすことで偏り減らす。
Dense 10 10個のノードに。多クラス分類なのでsoftmaxにしてみる。
1分類ならsigmoidでも。


model.compileでモデルと最適化手法を結びつける。

```mnist.py
model = keras.models.Sequential([
    keras.layers.Flatten(),
    keras.layers.Dense(512, activation='relu'),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
```

epochを増やしたり、lossを変えたり、optimizer変えると結果が変わります。とりあえずadam。※SGDとかRMSpropとかあります。

One-Hot-Encodingでないのでcategorical_crossentropyでなく
sparse_categorical_crossentropy

metrics=['accuracy']入れるとaccuracyでて便利。

```
poch 1/5
60000/60000 [==============================] - 5s 85us/step - loss: 0.0299 - acc: 0.9904
Epoch 2/5
60000/60000 [==============================] - 5s 84us/step - loss: 0.0270 - acc: 0.9918
Epoch 3/5
60000/60000 [==============================] - 5s 83us/step - loss: 0.0246 - acc: 0.9925
Epoch 4/5
60000/60000 [==============================] - 5s 86us/step - loss: 0.0226 - acc: 0.9931
Epoch 5/5
60000/60000 [==============================] - 5s 89us/step - loss: 0.0203 - acc: 0.9936
```
こんなだけで十分ですね。99%正解。


```Mnist.py
model.evaluate(x_test,y_test)
```

```
10000/10000 [==============================] - 1s 55us/step
[0.11360306663459632, 0.9701]
```

97%です。
[Android]CUIでgradleに対応したAndroidプロジェクトの作り方

#はじめに
ちょっとしたテスト用のプロジェクトを作るのに毎回AndroidStudio立ち上げるのが手間だったので、
CUIでさっくり作れる環境を準備しようと考えてました。
同じところで躓かないように備忘録がてらこちらにまとめていこうと思います。

#開発環境
・OS : Windows 10
・Android SDK Tools 25.2.5
・JDK 1.8.0 Update 77
※NVIDIA CodeWorks for Android (Version 1R7)を使用して環境を構築しました。

#検証内容
```CreateProject.bat
@echo off

rem gradleプラグインバージョン
set GradleVer=2.3.0

rem androidSDKバージョンID(id4=OS 8.0.0)
set SdkVerId=4

rem プロジェクト名
set ProjName=GradleTest

rem 出力パス
set Output="%~dp0%ProjName%"

rem パッケージ名
set Package=jp.domain.%ProjName%

rem アクティビティ名
set Activity=MainActivity


rem 同名のフォルダを削除
rd /s %ProjName%

rem プロジェクト作成
android create project -k %Package% -a %Activity% -t %SdkVerId% -n %ProjName% -p %Output% -g -v %GradleVer%

pause
```
こちらのバッチでプロジェクトはすんなり作れました。
続いてビルドできるか確認します。

プロジェクト直下でコマンドプロンプトからビルドバッチを実行してみたところエラーが出ました。

調べたところgradle-wrapper.properties内のgradleバージョンが1.12になっており、
build.gradleの設定と噛み合わなくてエラーになっているようです。
下記修正を加えて再度ビルドを試みます。

```gradle-wrapper.properties
#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

# 修正後
distributionUrl=http\://services.gradle.org/distributions/gradle-3.3-all.zip

# 修正前
#distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
```

まだエラーが出ます。
今度はbuild.gradleの書き方が古いらしい。
下記のように修正します。

```build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
    }
}
apply plugin: 'android'

android {
    compileSdkVersion 'android-26'
    buildToolsVersion '26.0.1'

    buildTypes {
        release {
            // 修正後
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            // 修正前
            //runProguard false
            //proguardFile getDefaultProguardFile('proguard-android.txt')
        }
    }

    // lintでもエラーが出るのでlintOptionsを追記
    lintOptions {
        abortOnError false
    }
}

```

これでビルドが通りAPKファイルが無事生成できました。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/75533/4719fbe6-22c3-c53d-0d66-ded5159db4e3.png)

#最後に
もしかしたらもっと簡単にできる方法があるかもしれませんが、
基本的にはこちらの方法でほぼまかなえると思います（思いたい）。
ここから自分なりにブラッシュアップしていこうと思います。

#参考リンク
・[虹とトルネード | AndroidコマンドでGradleプロジェクトを作る](http://caad1229.hatenablog.com/entry/2015/04/25/195643)
・[Android Gradle plugin release notes | Android Developers](https://developer.android.com/studio/releases/gradle-plugin)
・[stack overflow | Gradle build: Execution failed for task ':app:lint'](https://stackoverflow.com/questions/36860021/gradle-build-execution-failed-for-task-applint)
・[stack overflow | Android Studio Could not find method runProguard() for arguments?](https://stackoverflow.com/questions/27233800/android-studio-could-not-find-method-runproguard-for-arguments)
Dockerの -v や --volume オプションはわかりづらいから、 --mount を使おう

# 背景と目的
dockerのボリューム周りを見るときに、 `-v` や `--volume` オプションが使用されていることがあるのですが、bindなのかvolumeなのか分かりづらいところがあります(個人的な感想)。
なので、これからは `--mount` を使っていこう！というちょっとしたメッセージングです。

## `--mount`って？
`--mount` は、key=value形式でvolumeの指定をするフラグです。使用例は、こんな感じ。詳細は、[こちら](https://docs.docker.com/storage/volumes/#choose-the--v-or---mount-flag)にあります。

```bash
docker run --name ubuntu01 -d -it \
--mount type=volume,src=myvol,dst=/vol \
ubuntu /bin/bash
```

`--mount` はもともと [swarm service](https://docs.docker.com/engine/reference/commandline/service_create/) で利用可能なフラグでしたが、 **Docker 17.06** からスタンドアロンのコンテナでも使えるようになりました。

> New users should try --mount syntax which is simpler than --volume syntax.

また、公式では新規の人たちは `--mount` を使ってくれよな！と言っていますし、わかりやすいので僕もこちらが好きです(最近知った...)。

## `-v` や `--volume` を `--mount` に置き換える
それでは、今まで使っていたオプションを `--mount` に置き換えます。

### ホストとコンテナ間でデータを同期させる
ホストとコンテナ間でデータを同期させたいときは、 `--mount type=bind,src=<パス>,dst=<パス>` を設定しましょう。

早速置き換えてみます。

```bash:-v
docker run --name ubuntu01 -d -it \
-v $(pwd)/mydir:/vol \
ubuntu /bin/bash
```

```bash:--mount
docker run --name ubuntu01 -d -it \
--mount type=bind,src=$(pwd)/mydir,dst=/vol \
ubuntu /bin/bash
```

### コンテナにボリュームをマウントする
コンテナにボリュームをマウントしたいときは、 `--mount type=volume,src=<ボリューム名>,dst=<パス>` を設定しましょう。

早速置き換えてみます。

```bash
docker run --name ubuntu01 -d -it \
-v myvol:/vol \
ubuntu /bin/bash
```

```bash
docker run --name ubuntu01 -d -it \
--mount type=volume,src=myvol,dst=/vol \
ubuntu /bin/bash
```

正直好みの部分もありますが、オプションの内容がわかりやすいのはいいことだと思うので、公式にしたがって設定してみるといいと思います。また、DockerのVolumeについて、公式ページで結構わかりやすく書いてあると思いますので、興味がある方は一読してみるとよいかもしれません。

### 参考
- [Use volumes](https://docs.docker.com/storage/volumes/)
- [Use bind mounts](https://docs.docker.com/storage/bind-mounts/)
フリーランチなんてものはない

定理と呼ばれるものの中にも、「無限の猿定理」とか「ブラックホール脱毛定理」とか変わった名前のものがあります。今回は「ノーフリーランチ定理」というものを取り上げて、プログラミングにもある程度適用できるのではないかということを考えてみました。

## 本来の定理の内容

今はちょうど機械学習がブームとなっていますが、何かを探索するようなアルゴリズムは、機械学習以前にも多々ありましたし、これからも増えて行くことと思います。ただ、フリーランチ定理は、そのような探索アルゴリズムについて、大きな示唆を与えています。

> コスト関数の極値を探索するあらゆるアルゴリズムは、全ての可能なコスト関数に適用した結果を平均すると同じ性能となる

つまり、あらゆる問題に「これ1つで済む」ような、汎用的な手法はない、ということです。

## プログラミングの場合

プログラミングの場合も、「プログラミング言語」や「ライブラリ」は星の数ほどありますが、ノーフリーランチ定理と同様の仮定ができるのではないかと考えています。

* 他の選択肢より明らかに不便なもの→選ばれず消滅するか、少なくとも主流にはなれない
* 他の選択肢より明らかに便利なもの→一時的には有利になるけど、遅からず同等の機能が他にも普及していってベースラインが上がる

そういう前提で考えると、プログラミング言語もライブラリも**適材適所**で、合った場所に使えば便利だけれど、合わない場所で使おうとすれば無駄に負担がかかることもある、と考えています。

* 環境の問題…組み込み系ではCかアセンブラしかない、という環境もありえますし、ブラウザ内でJavaScriptやAltJS以外の言語を使うのはまだまだハードルが高いです。
* 想定範囲の問題…フレームワークなどでは、「フレームワークで想定した範囲内のコード」は本当に快適に書けるものの、その想定の枠外へはみ出そうとすれば、普通にやる以上に手間がかかってしまう、なんて例もあります。

「ハンマーを持つものにはすべてが釘に見える」なんていうことわざもありますが、言語やライブラリなどの環境で行き詰まったときには、無理にその中でなんとかするのではなく、別なものを導入するというのがいい選択肢となるかもしれません。
Clovaスキル初公開の私が受けたリジェクト内容一覧

# あらまし
LINE BOOT AWARDS 2018に向けて初めてスキルを公開しました。その時に食らったリジェクト内容を公開します。
Clovaスキルを公開する前にこの記事を参考にしていただけたらと思います。
さらに、[Clova審査一発通過のための注意点](https://qiita.com/h-takauma/items/3147b5df2b50f3858a26)の記事がとても参考になります。

大方は[デザインガイドライン](https://clova-developers.line.me/guide/)に記載があるためこちらを読めばリジェクトはグッと減ります。

# スキル名・呼び出し名
## 単語1語以上使っているか
デザインガイドラインにあるように単語1語のスキル名はClovaスキルでは許可されていません。
必ず単語を組み合わせてスキル名を作成しましょう。

私の考えていたスキル名、「ヤンデレちゃん」は残念ながらリジェクト対象でした。
__デザインガイドの参考ページ__
https://clova-developers.line.me/guide/Design/Design_Guideline_For_Extension.md#DefineInvocationName

## 呼び出し名の音声認識結果の揺らぎはないか
呼び出し名に揺らぎがある場合、対話モデルのテスト>発話履歴で認識結果を確認し呼び出し名(サブ)として設定しておきましょう。
呼び出し名の揺らぎが大きいと呼び出し名(サブ)でも補正できなくなってしまうため決定するときは十分検討しましょう。

私の場合、上記からスキル名を「ヤンデレちゃん」から「あなたのヤンデレちゃん」に変更しましたが、スキルの呼び出しの揺らぎが大きいと判断されたようです。
ただ、Clovaは「ヤンデレ」の言葉に反応するため「ヤンデレ」自体の言葉の揺らぎより「あなたの」に揺らぎが大きかったと判断し、「ヤンデレちゃんトーク」に変更しました。
__Clovaデバイスでの音声認識結果の確認方法__
https://clova-developers.line.biz/guide/DevConsole/Guides/CEK/Device_Test_Extension.md#clovaデバイスでテストする

# Extensionの説明(ユーザー向け)
## Clovaの呼び出しフレーズに「ねぇClova、」が入っているか
サンプル発話を記載する際に、Clovaの呼び出しフレーズを入れる場合には、「ねぇClova、」を使用しなければいけません。
「Clova、」だとリジェクト対象です。代表サンプル発話でも同様です。こちらはリジェクト内容としてよく見かけますね。

## LINE用語を正しく使えているか
Botを追加する旨を記載する際に、「友だち追加」と記載しないといけません。
「友だち」はLINE用語です。「友達追加」と記載するとリジェクトされます。

# ExtensionとLINEの連携
## LINE通知条件がユーザーに伝わっているかどうか
LINEの通知の条件はExtensionの説明(ユーザー向け)へ記載するか、ユーザーへ伝わりにくい条件の場合、審査担当者へのコメントへLINE通知の確認方法を記載しましょう。

私のスキルの場合、ヤンデレちゃん以外を褒める、例えば「ツンデレちゃん可愛い」と2回話すとLINEが通知される仕様のためユーザーに伝わりにくくなってしまっていたようです(詳しくは[こちら](https://qiita.com/nori0__/items/e558db4fcbeb45edf891))。
審査担当へのコメントでLINE通知方法を記載しました。

## ClovaからLINE通知が来ることをユーザーに知らせているか
ExtensionとLINEの連携の利用条件を満たしていないとリジェクトされます。
私の場合、デザインガイドの「4.ユーザーが該当のボットからメッセージが来ると理解できること」の条件を満たしておらずリジェクトされてしまいました。
LINEを送信するときは、その旨を「スキルの発話」でユーザーに知らせるような仕様にしなければいけないようです。

私のスキルの場合、以下の対話フローでLINE通知が来ていました。
ユーザー「ツンデレちゃん可愛い」
ヤンデレちゃん「ふーん…」
(ヤンデレちゃんがLINEを送る)
これでは、ユーザーがいつLINE通知が送られたか把握できません。

よって、以下のように対話フローを変更しました。
ユーザー「ツンデレちゃん可愛い」
ヤンデレちゃん「ふーん…」
ヤンデレちゃん「あ、LINE送りますね。後で見ておいてください。」
(ヤンデレちゃんがLINEを送る)
これでユーザーがヤンデレちゃんからLINEが送られたことが把握できます。

__デザインガイドの参考ページ__
https://clova-developers.line.biz/guide/CEK/Guides/Link_Messaging_API.md#Conditions