OmniAICreator/Qiita-1.07M huggingface dataset:
nodebrewでインストールができない

nodebrewで複数のバージョンを入れるときエラーが出たのでメモ

#環境
MacBookPro 13inch
MacOS High Sierra 10.13.2

nodebrew 0.9.8
python 3.6.2

#発生した問題
```
$ nodebrew install v0.6.1
```

を実行したところ

```
Fetching: https://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz
######################################################################## 100.0%
Traceback (most recent call last):
  File "/Users/*********/.nodebrew/src/v0.6.1/node-v0.6.1/tools/waf-light", line 157, in <module>
    import Scripting
  File "/Users/*******/.nodebrew/src/v0.6.1/node-v0.6.1/tools/wafadmin/Scripting.py", line 146
    except Utils.WafError, e:
```

 というエラーをはいた

Scripting.pyがよくないとのこと

#解決法
調べてみたところ、どうやらScripting.pyはpython2.xらしい
そこでpython 2.7に変更してみたところ

```
Fetching: https://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz
######################################################################## 100.0%
Checking for program g++ or c++          : /usr/bin/g++ 
Checking for program cpp                 : /usr/bin/cpp 
Checking for program ar                  : /usr/bin/ar 
Checking for program ranlib              : /usr/bin/ranlib 
Checking for g++                         : ok  
Checking for program gcc or cc           : /usr/bin/gcc 
Checking for gcc                         : ok  
Checking for library dl                  : yes 
Checking for openssl                     : not found 
Checking for function SSL_library_init   : not found 
Checking for header openssl/crypto.h     : not found 

```
となった
次はopenSSLの開発ツールがないためインストールに失敗した

残念。

###追記

openSSL入っているはずなのになあと思っていたらMacのデフォルトで入っているopenSSLとhomebrewでインストールしたopenSSLがあり、デフォルトの方を参照していたためうまく動いていなかった
PATHの優先度をhomebrewの方を優先させることでうまく動いた
ざっくばらんメモ_22：kaggle recruit, coursera

###kaggle recruit challenge
最近あまり時間が取れず、あまり進捗はなし。
しかしkernelがいくつか更新されており、
最近公開されている手法をいくつかアンサンブルで
組み合わせ、重み付けを変えるなどしていた所、
最終的に0.478 (164位) を達成。
時間はないときは他人の手法をアンサンブルするのは
一つの手っ取り早い手法の一つかもしれない。
しかしForum Discussionにもあったが、アンサンブルしているとはいえ、
public leader boardに強く依存した重み付け調整をしたので、過剰適合の
恐れが強い。

###Robotics: Perception@Coursera
Visual SLAMをざっくりと速習できる教材を探していた所、
あまりよさげなのは見当たらず、唯一Courseraに[Robocics: Perception](https://www.coursera.org/learn/robotics-perception)という
コースがペンシルバニア大の提供であったので受講することにした。
このコースは一か月を想定し、最初の一週間は無料、それ以後は
毎月30ドルかかるとのこと。遅れずに進めば30ドルで済む。安い。
まず最初の週を終えたが、ここでは3次元空間がカメラを通した２次元空間でどのように見えるかの基本的な理論を学べる。
授業は基本的にわかりやすいが、スライドが時々分かりづらかったり、幾何学的な説明を教授が身振り手振りで教えようとするのだが、
微妙にわかりにくい時があったりもした。全体としては現状は満足。
また間に何度かクイズがあり、最後にはコーディングエクササイズをして課題を提出する必要がある。
すべてのカリキュラムをクリアするとcertificateも貰えるよう。なんの役に立つかはまだ分からない。
Dataflow SDK 2.x for JavaでSpannerIOを使うとjava.lang.NoSuchFieldErrorエラーになる問題を回避する

タイトルの通りだけど、Dataflow SDK 2.2.0でCloud Spannerへのアクセスをしようとしたとき、良く分からないエラーが出たので調べたことと解決方法を備忘録的に記事にしておく

### 問題のエラー

```
Exception in thread "main" java.lang.NoSuchFieldError: internal_static_google_rpc_LocalizedMessage_fieldAccessorTable
        at com.google.rpc.LocalizedMessage.internalGetFieldAccessorTable(LocalizedMessage.java:82)
        at com.google.protobuf.GeneratedMessageV3.getDescriptorForType(GeneratedMessageV3.java:109)
        at io.grpc.protobuf.ProtoUtils.keyForProto(ProtoUtils.java:127)

```

いやしかし指定したフィールドちゃんとあるし。型も間違っていないはず。

### 原因
調べると、以下のissueにもあるように grpc-google-common-protos 0.1系におけるバグらしい
https://github.com/GoogleCloudPlatform/cloud-bigtable-client/issues/1225
Dataflow SDK 2.2.0で依存関係に含まれている grpc-google-common-protos が 0.1系であるのが原因のようだ

### 解決方法
grpc-google-common-protos の1.x系をpom.xmlに追加して0.1系を上書きする

```
    <dependency>
        <groupId>com.google.api.grpc</groupId>
        <artifactId>grpc-google-common-protos</artifactId>
        <version>1.0.0</version>
    </dependency>
```

依存関係の問題なのでSDKのバージョンが上がればそのうち修正されると思うけど
Ubuntu 16.04 で Open vSwitch がちゃんとブリッジしない

# 概要

`/etc/network/interfaces` に Open vSwitch の設定をしても，読み込まれない(順番が違う)ので，仕方ないので起動時にupするようにしたメモ．

*前提として設定済みであることが必要．*

```/etc/rc.local
ifup --allow ovs `ifquery --allow ovs --list`

exit 0
```

```/etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local compatibility

[Service]
Type=oneshot
ExecStart=/etc/rc.local
# disable timeout logic
TimeoutSec=0
#StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target
```

```bash
$ systemctl enable rc-local.service
```

post-down はしらん．

# 参考リンク
- https://qiita.com/kwi/items/32d5bc29a71cdfefc8df
- https://qiita.com/msrks/items/5201ae15d0e1f8de5946#ubuntu-1604
binasciiを使ってみる for Python3

# Python3で、binasciiの利用

Note:執筆中...各種説明に更新あり...。

binasciiは、バイナリと ASCII コード化されたバイナリ表現との間の変換を行うための多数のメソッドが含まれており、モジュールは C で書かれた高速な低水準関数である。

##　今回の使用例
とりあえず、全角アルファベットを半角に変換するというものを作ります。

```python3:h2t.py
t = "azAZ10１8９ＡＺアンあ-ぱ＃＄ジャズっしょ!"
lt = list(t)
l = len(t)
ll = [lt[i].encode('utf-8').hex() for i in range(len(lt))]
d = t.encode('utf-8').hex()

def z2h(d):
    ba = bytearray(d, 'utf-8')
    dm = memoryview(ba)
    dh = t.isalnum()
    return ba, dm, dh

print('TEXT: {}, LEN: {}'.format(t, l))
print(lt)
print(ll)
print(d)
ba, dm, dh = z2h(d)

print('LIST:{}, TYPE:{}'.format(ba, type(dm)))
print(bytes(dm))
sdm = str(bytes(dm))
bu = []
for i in range(len(ll)):
    bu.append(ll[i].replace('efbc9', ''))
print(bu)
ss = ''
for i in range(len(bu)):
    try:
        ss += uh(bu[i]).decode('utf-8')
    except:
        ss += bu[i]
print(ss)
print('ss: {}, dh: {}'.format(ss.isalnum(), dh))

print('TEXT: {}, LEN: {}'.format(t, l))
print(lt)

bu = [ll[i].replace('efbc9', '') for i in range(len(ll))]
print('{} => {}'.format(ll, bu))

ss = ''
m = map(str, d)
bs = '{}'.format(''.join(m))
s = uh(bs).decode('utf-8')
for i in range(len(bu)):
    try:
        ss += uh(bu[i]).decode('utf-8')
    except:
        ss += bu[i]
print(s)
print(ss)

print(ss == s)
```
### 実行結果
```

TEXT: azAZ10１8９ＡＺアンあ-ぱ＃＄ジャズっしょ!, LEN: 25
['a', 'z', 'A', 'Z', '1', '0', '１', '8', '９', 'Ａ', 'Ｚ', 'ア', 'ン', 'あ', '-', 'ぱ', '＃', '＄', 'ジ', 'ャ', 'ズ', 'っ', 'し', 'ょ', '!']
['61', '7a', '41', '5a', '31', '30', 'efbc91', '38', 'efbc99', 'efbca1', 'efbcba', 'e382a2', 'e383b3', 'e38182', '2d', 'e381b1', 'efbc83', 'efbc84', 'e382b8', 'e383a3', 'e382ba', 'e381a3', 'e38197', 'e38287', '21']

617a415a3130efbc9138efbc99efbca1efbcbae382a2e383b3e381822de381b1efbc83efbc84e382b8e383a3e382bae381a3e38197e3828721

LIST:bytearray(b'617a415a3130efbc9138efbc99efbca1efbcbae382a2e383b3e381822de381b1efbc83efbc84e382b8e383a3e382bae381a3e38197e3828721'), TYPE:<class 'memoryview'>
b'617a415a3130efbc9138efbc99efbca1efbcbae382a2e383b3e381822de381b1efbc83efbc84e382b8e383a3e382bae381a3e38197e3828721'

['61', '7a', '41', '5a', '31', '30', '1', '38', '9', 'efbca1', 'efbcba', 'e382a2', 'e383b3', 'e38182', '2d', 'e381b1', 'efbc83', 'efbc84', 'e382b8', 'e383a3', 'e382ba', 'e381a3', 'e38197', 'e38287', '21']
azAZ10189ＡＺアンあ-ぱ＃＄ジャズっしょ!

ss: False, dh: False

TEXT: azAZ10１8９ＡＺアンあ-ぱ＃＄ジャズっしょ!, LEN: 25
['a', 'z', 'A', 'Z', '1', '0', '１', '8', '９', 'Ａ', 'Ｚ', 'ア', 'ン', 'あ', '-', 'ぱ', '＃', '＄', 'ジ', 'ャ', 'ズ', 'っ', 'し', 'ょ', '!']

# ll ➡︎ buに変換
['61', '7a', '41', '5a', '31', '30', 'efbc91', '38', 'efbc99', 'efbca1', 'efbcba', 'e382a2', 'e383b3', 'e38182', '2d', 'e381b1', 'efbc83', 'efbc84', 'e382b8', 'e383a3', 'e382ba', 'e381a3', 'e38197', 'e38287', '21'] => ['61', '7a', '41', '5a', '31', '30', '1', '38', '9', 'efbca1', 'efbcba', 'e382a2', 'e383b3', 'e38182', '2d', 'e381b1', 'efbc83', 'efbc84', 'e382b8', 'e383a3', 'e382ba', 'e381a3', 'e38197', 'e38287', '21']

azAZ10１8９ＡＺアンあ-ぱ＃＄ジャズっしょ! #s
azAZ10189ＡＺアンあ-ぱ＃＄ジャズっしょ! #ss

# sとss比較結果
False
```

<!-- link's -->

[ba]:https://docs.python.jp/3/library/binascii.html?highlight=binascii#module-binascii
Laravelでキューに入れたジョブを実行する

#経緯
laravelでjobを作成したのですが、hundleメソッドが実行されないという状況になりました。
[公式ドキュメント](https://readouble.com/laravel/5.3/ja/queues.html)をきちんと読めばわかることでしたが、意外と手間取ってしまったので整理しておきます。

#やること
##キューのワーカを起動する
以下コマンドでキューワーカを起動します。
`php artisan queue:work`
これによってキューの実行を行えます。

##キューの名前を指定しているとき
キューのdispatch の際、キューの名前を以下のように設定できます。
`dispatch((new job())->onQueue('otherQueue'));`

この場合は以下のようにキューのワーカを起動します

`php artisan queue:work --queue=otherQueue`

###その後やること
こちらを参考に各種設定の書き換えを行います
https://qiita.com/tosite0345/items/a92367e8129d2be4ad53

###リリース時に気をつけること
公式ドキュメントにも記載がありますが、[supervisor](http://supervisord.org/index.html)を利用して永続化する必要があるみたいです。

##おまけ：デバッグの仕方
jobについても普通のデバッグと一緒で、logファサードによってログの出力ができます。
それとは別で、jobがキューに積まれたかの確認をするには、キューテーブルを作成することで状態を確認できます。

以下手順でキュー管理用のテーブルが作成されます。

```
php artisan queue:table

php artisan migrate
```
考察 > UI > 情報の伝えかた > 良い例から良くない例

(技術)情報の伝え方に関するメモです。


## 必要な時に、必要なだけの情報が得られる

### 記述での情報 (最良)

- 視聴者が再読しやすい
- 再読しながら、関連情報を別途見ることができる
- 視聴者が単独で読むことができる

### 動画での情報 (場合によっては良)

- 検索しにくい
- 動画で分かりやすい情報もある
    - IDEの使い方
    - コンポーネントの使い方
    - クッキー生地の作り方
        - クリーム色、固さ
    - 調味料を入れるタイミング

### 口頭での情報 (ないよりは良い)

- 視聴者が記録を必要とする
    - 「記録の訓練」という言い訳
- 視聴者の理解に合わせた情報の開示は難しい

## 必要な時に、必要でない情報も含めて得られる

### 記述での情報 (ないよりは良い)

- 必要な情報を探しにくい

### 口頭での情報 (自分で探す方が良い場合がある)

- 限られた時間で得られる情報が少ない
- 話者の気分転換としての役割はある

## 必要でない時に、必要でない情報が得られる

### 口頭での情報 (ない方が良い)

## 必要な情報が得られない

### 記述も何も残っていない (良くない)

- xxxさんの頭の中にだけあります
    - 属人化
    - 秘伝のたれ
    - 聞いてくれれば、答えるよ + 忙しいから後で


## 適宜検討する

(未来の自分も含めて)視聴者にとって最良の方法を考えつつ情報を伝えよう。
VisualStudioCodeでFira Codeを使う

遅ればせながらVisualStudioCodeを使い始めました

VisualStudioCodeはリガチャー(合字)に対応しているらしいので、Fira Codeにしなきゃダメでしょってことでやってみた

![VisualStudioCode-Fira Code.PNG](https://qiita-image-store.s3.amazonaws.com/0/89027/62f87fbd-715b-8186-2f90-471eb52ca5a5.png)


うぅーんリガチャーされていい感じになってますね

## 作業ログ
1. [FiraCode](https://github.com/tonsky/FiraCode)からFira Codeフォントダウンロードする
0. ダウンロードしてきたFira Codeをインストールする
0. VisualStudioCodeを起動する
0. [Control]+[Shift]+[P]を押す
0. settくらいまで入力すると「基本設定：ユーザー設定を開く」が出てくるのでそれを開く
0. ユーザー設定に

```
{
    // FiraCodeに含まれない文字はMeiryoUIを使う
    "editor.fontFamily": "'Fira Code','Meiryo UI'",
    "editor.fontLigatures": true,
    "editor.fontSize": 16,
}
```
を書き足す
ssh_exchange_identificationと言われてknown_hosts消したりhosts.allowいじっても直らない時に確認してほしいこと

タイトルの通りなのですが、SSHを使用してどこかへ接続しようとした時に`ssh_exchange_identification: Connection closed by remote host`と言われて接続できないことがあります。

ググると

- `known_hosts`を消す
- `/etc/hosts.allow`を書き換える

といった対処法がヒットするかと思いますが、それを試しても直らない時に確認してほしいことです。

(この記事は`~/.ssh/config`を使っていて、かつ`ProxyCommand`で多段SSHしている人しか役に立たないと思われます。当てはまらなかったら残念ながら多分別の原因です…)

# 結論
先に結論を述べると、**接続先マシンのIPアドレス本当にあってる?**というのを確認しましょう。

接続先のマシンのIPが何らかの原因で変わってしまっているパターンもあると思うので確認しましょう。(私はこれでした)

# どういうことか
普通にSSHを使用していて、sshdの上がっていないマシンに接続しようとすると

```
ssh: connect to host 192.168.1.10 port 22: No route to host
```

のようなメッセージが表示されます。

しかし、多段SSHをしていてかつ踏み台のサーバーへはSSH可能な場合には、

```
ssh_exchange_identification: Connection closed by remote host
```

が表示されてしまいます。

ここで接続先のマシンのIPがおかしいのでは?と気がつけばすぐ解決するような内容なのですが、軽く躓いたので同じ目に遭った人が解決してくれるといいなぁということで書いてみました。誰かのお役に立てたら幸いです。
キーボードが英字の時のメモ

Win10でキーボードが英字から日本語にした時のメモ貼らせて頂きます。

デバイスマネージャー＞キーボード＞標準　PS/2キーボード
を右クリック
ドライバーの更新
コンピューターを参照してドライバーソフトウェアを検索
コンピューター上の利用可能なドライバーの一覧から選択します
互換性のあるハードウェアを表示　の　チェックを外す
右側の　標準PS2キーボード　から
日本語PS2キーボード(106\109キー　Ctrl+英数）

にして次へ

で再起動後日本語になりましたっ
Choreonoidのライブラリを使って運動学を計算する

前回はロボットモデルファイルを読み込みリンク情報を取得する方法について書きました.今回は順運動学・逆運動学の計算をしてみます.

## 環境
OS: ubuntu 16.04 LTS
version: choreonoid-1.6.0

## サンプルコード
今回のケースでは，腰を基準として左足先の位置をz軸へ変位させた場合の逆運動学を計算します．

```cpp:kinematics.cpp
#include <iostream>
#include <cstring>

#include <cnoid/Body>
#include <cnoid/BodyLoader>，
#include <cnoid/JointPath>

using namespace std;
using namespace cnoid;

// Degree -> Radian
double deg2rad(double degree)
{
    return degree * M_PI / 180.f;
}

// Radian -> Degree
double rad2deg(double radian)
{
    return radian * 180.f / M_PI;
}

int main()
{
    BodyLoader bodyloader;

    std::string model_path("/usr/share/choreonoid-1.6/model/SR1/SR1.body");
    BodyPtr robot = bodyloader.load(model_path.c_str());

    JointPathPtr lleg = getCustomJointPath(robot, robot->rootLink(), robot->link("LLEG_ANKLE_R"));

    robot->joint(14)->q() = deg2rad(-20);
    robot->joint(16)->q() = deg2rad(40);
    robot->joint(17)->q() = deg2rad(-20);

    lleg->calcForwardKinematics();

    for(int i=13;i<19;i++)
        cout << rad2deg(robot->joint(i)->q()) << endl;
    cout << "\n";

    Vector3d ref_pos = robot->link("LLEG_ANKLE_R")->p();
    Matrix3d ref_rot = robot->link("LLEG_ANKLE_R")->R();

    ref_pos.z() += 0.01;
    if(lleg->calcInverseKinematics(ref_pos, ref_rot)){
        for(int i=13;i<19;i++)
            cout << rad2deg(robot->joint(i)->q()) << endl;
    }

    return 0;
}
```

前回同様，モデルファイルをまず読み込みます．

ここで出てきたJointPathPtrですが，BodyPtrと同様でJointPathクラスを扱うためのポインタになります．JointPathクラスはリンク間の親子関係や順序を設定し運動学を計算する部分です．なのでこのクラスを呼び出して関数を叩くことで内部で逆運動学計算をすることができます．  

getCustomJointPath関数はベースリンク，目標リンクを指定し，その間のリンク関係を定義します．第一引数がBodyPtr，第二引数がベースリンク，第三引数が目標リンクです．

以降から運動学の計算に移ります．

逆運動学を計算するために膝を少し曲げておきます．関節角度の操作は以下のようにして行うことが可能です．

```cpp
robot->joint(関節ID)->q() = 関節角度(ラジアン)
```

関節角度を入れたら，リンクの位置・姿勢を更新するために順運動学計算をします．デフォルトではfalseですが，trueにすると速度・加速度の更新までやってくれるみたいです．

```cpp
void JointPath::calcForwardKinematics(bool calcVelocity = false, bool calcAcceleration = false)
```

続いて逆運動学の計算です．逆運動学の計算は以下の関数を呼び出せばOKです．

```cpp
bool JointPath::calcInverseKinematics(const Vector3& end_p, const Matrix3& end_R)
```

第一引数に目標リンクの位置，第二引数に目標リンクの姿勢を入れることで逆運動学を計算することが出来ます．choreonoidでは中のベクトルや行列はEigenを使用しているので以下のようにしてリンクの位置・姿勢を抜き出して目標位置・姿勢を入れてたものを関数の引数として入れることが可能です．

```cpp
// 対象リンクの位置・姿勢を抜き出す．
Vector3d ref_pos = robot->link("LLEG_ANKLE_R")->p();
Matrix3d ref_rot = robot->link("LLEG_ANKLE_R")->R();

// 位置の変位
ref_pos.z() += 0.01;

// IK演算に失敗したらfalseを返す
lleg->calcInverseKinematics(ref_pos, ref_rot);
```

上記のサンプルをコンパイルして実行すると，逆運動学計算前の左足の角度と計算後の角度が表示されます．

## まとめ
choreonoidのライブラリを使用して運動学の計算をしてみました．次は重心ヤコビアンあたりを...
PhpSpreadsheetのwrapperをとりあえず整備しました

# PhpSpreadsheetのwrapperをとりあえず整備しました

## PhpSpreadsheet
ぼちぼち、PHPExcelからPhpShpreadsheetへの移行をどこかでやらねば的な何かががが  
前身のPHPExcel用のwrapperである[PHPExcelWrapper](https://github.com/satthi/PhpExcelWrapper)も対応せねば

## ということで

~~自分のために~~[対応しました](https://github.com/satthi/PhpSpreadsheetWrapper)

## 移行作業
ほぼクラスを置き換えるだけで対応可能だったので普通に楽勝でした。  
ただ現在動いているプロジェクトを置き換えるとなると、列の連番の振り方が、1番からになっているのであまりお勧めしない。  
**なぜ変えたし**  
後テスト書いててよかった。
gitでtag(new)とtag(old)の差分を出力する

## 概要
リリースごとにタグを発行していますが、そのタグの間で差分を出力したかったので作業メモを残す。

＜出力したい差分＞
・修正されたファイルの一覧 （list.txt）
・各ファイルの修正内容　（diff.txt）
・修正されたファイル一式 （diff.tar.gz）

## 修正ファイルの一覧
修正ファイルの一覧を「list.txt」に書き出す。

```sh:ターミナル
# tag1からtag2で修正されたファイルの一覧を出力する
$ git diff --name-only --diff-filter=AMCRD tag1 tag2 > ./tmp/list.txt
```

## 各ファイルの修正内容
修正内容を「diff.txt」に書き出す。

```sh:ターミナル
# tag1とtag2の差分を出力する
$ git diff --diff-filter=AMCRD tag1 tag2 > ./tmp/diff.txt
```

## 修正されたファイル一式
修正されたファイルを一式「diff.tar.gz」に圧縮して出力する。

```sh:ターミナル
# tagとtagの間の差分ファイルを出力する
$ git archive --format=tar.gz --prefix=diff/ tag2 `git diff --name-only --diff-filter=AMCR tag2 tag1` -o ./tmp/diff.tar.gz
```

## 上記一式をスクリプト化する

```sh:ターミナル
# 作業フォルダ作成
$ mkdir tmp

# 対象を指定する
$ TAG1='hoge-old'
$ TAG2='hoge-new'

# tag1からtag2で修正されたファイルの一覧を出力する
$ git diff --name-only --diff-filter=AMCRD ${TAG1} ${TAG2} > ./tmp/list.txt

# tag1とtag2の差分を出力する
$ git diff --diff-filter=AMCRD ${TAG1} ${TAG2} > ./tmp/diff.txt

# tagとtagの間の差分ファイルを出力する
$ git archive --format=tar.gz --prefix=diff/ ${TAG2} `git diff --name-only --diff-filter=AMCR ${TAG2} ${TAG1}` -o ./tmp/diff.tar.gz

# 差分ファイルを解凍する
$ cd ./tmp/
$ tar zxvf diff.tar.gz
```

## 参考サイト

* [gitでtagとtagの間の差分を出力する](http://dormouse666.hatenablog.com/entry/2015/11/02/180031)
* [git diff でファイル名のみ表示する](https://qiita.com/imai/items/09b8a72e5f8c34b432e8)
* [git archiveでgzip以外の圧縮フォーマットを使用する](https://qiita.com/habu1010/items/53e9f22abf593a20bbd1)
Raspberry Pi に Avahi で 接続する

ラズベリーパイに IP アドレスでなく ホスト名で接続する方法です。ラズベリーパイは、モバイルルーターから DHCP でアドレスを取得しています。

Arch Linux から、次のように接続できるようにします。
pansy は、ラズベリーパイのホスト名です。

```bash
ssh pansy.local
```

## ラズベリーパイ側のソフトのインストール

```bash
sudo apt install avahi-daemon
```

デーモンの動作確認

```text
$ systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
   Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled)
   Active: active (running) since Mon 2018-01-29 11:10:48 JST; 16min ago
 Main PID: 1546 (avahi-daemon)
   Status: "avahi-daemon 0.6.31 starting up."
   CGroup: /system.slice/avahi-daemon.service
           ├─1546 avahi-daemon: running [pansy.local]
           └─1547 avahi-daemon: chroot helper
```

## Arch Linux 側のソフトのインストール

```bash
sudo pacman -S avahi
sudo pacman -S nss-mdns
```
/etc/nsswitch.conf の編集

```text
hosts: files mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return]
 dns myhostname
```

そして、avahi-daemon の再起動

```bash
sudo systemctl restart avahi-daemon
```

参考ページ
[archlinux Avahi](https://wiki.archlinux.jp/index.php/Avahi)
firebase-toolsのfirebase loginをCloud9でやるためには？

自分用メモ。

## 困るところ

```
firebase login
```

をやろうとすると

```
$ firebase login
? Allow Firebase to collect anonymous CLI usage and error reporting information? No

Visit this URL on any device to log in:
https://accounts.google.com/o/oauth2/auth?client_id=5..........&redirect_uri=http%3A%2F%2Flocalhost%3A9005

Waiting for authentication...
```

ログインして〜。と言われる。

ログインすると、

localhost:9005は見つかりません、と言われる。

Cloud9のマシンは、ログインをしたPCから見てlocalhostではないからだ。

## リダイレクトURLを変えることはできない

https://yusukeiwaki-xxxxxx.c9users.io:9005/ をリダイレクトにしようとしても、
`Redirect URL mismatch` っていってリダイレクトはできない。

## 結論：むりやりポートフォワードすればいい

ローカルマシンで、

```
ngrok tcp 22
```

でとりあえず一時的に22番ポートをあけて

Cloud9 側から

```
ssh 0.tcp.ngrok.io -p 15243 -R 9005:localhost:9005
```

のように、ngrokのポート番号指定でSSHリモートポートフォワードすれば、

```
Waiting for authentication...

✔  Success! Logged in as y.........@gmail.com
```

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!　ってなります。
Tableau Server on Linux をZabbixで監視する

Tableau Server 10.5のリリースと共にLinux版が使えるようになりました。
Serverを立てる際には監視もしたいと思いますが、Zabbixで監視するにはテンプレートが必要です。
しかしながら、Windows版しかないのでLinux版で監視が使えるようにテンプレートを作成しました。
参考にしたテンプレートは
https://community.tableau.com/docs/DOC-7683
です。

Zabbix 3.2で確認をしています。テンプレートは
https://github.com/crosspoints/zabbix_tableau_server_linux
で公開しています。
本テンプレートを使用して、grafanaで視覚化すると以下のようになります。

![2018-01-29_10h51_38.png](https://qiita-image-store.s3.amazonaws.com/0/125907/e4f1acb7-2e65-26ce-9637-d2521681f43f.png)
Kotlinチートシート: Generics編

元の記事 → [Swift to Kotlinチートシート](https://qiita.com/alt_yamamoto/items/d545309093baa53a539e)

# functionのGenerics
```Kotlin
fun <T> get(arg: T): T {
   return arg
}
```

# classのGenerics
```Kotlin
class Bar<T> {}
```

# Generics型の制約

```Kotlin
class Bar<T: View> {}
```

複数制約を設ける場合は where で書く。

```Kotlin
class Bar<T> where T: View, T: TypeCode {}
```

何も制約を設けない場合は Any? 扱い。
以下のケースではKClassのTがnullを許容しないので、少なくとも optional を外して、T: Anyにしないとコンパイルが通らない。

```Kotlin
fun <T: Any> get(type: KClass<T>) : T {
    return type.java.newInstance()
}
```

# Generics型のインスタンス化
Generics型のインスタンス化はできないっぽい。
以下のようにTypeを受け取ってオブジェクトを作ることはできる。

```Kotlin
fun <T: Any> get(type: KClass<T>) : T {
    return type.java.newInstance()
}
```

# Genericsのワイルドカード
Javaで言う Class<?> は アスタリスクを使って Class<*>のように書く。
このアスタリスクはout Any?を表す。
out なのでGenerics型は戻り値にしか使えない。


# Generics Typeからクラスオブジェクトを取得する
T::class のように Genericsの型からクラスオブジェクトを取得するのは、基本的に無理。

```Kotlin
inline fun <reified T>foo() {
    System.out.println(T::class)
}
```
上記のようにfunction を inline にしてGenericsの型に reified をつけるとクラスオブジェクトを取得できるが、inlineのファンクションは色々と制限があり、使うのが難しい場合がある。

また、今のところクラスに指定したGenericsパラメータからはクラスオブジェクトを取得する術がないっぽい。

```Kotlin
class Foo<T> {
   fun test() {
      // ここで T::class を使うすべがない
   }
}
```
# declaration-site variance

Genericsパラメーターを制約付きWildcardにしたい場合、型の前に out を記載する。

```Java:Java
List<? extends Number> b = a;
```

```Swift:Swift
val b: ArrayList<out Number> = a
```

詳細は以下に書いているがまだちゃんと理解できていない。
https://kotlinlang.org/docs/reference/generics.html#variance
会社で少し盛り上がった Project Euler をやってみる 006

# Problem 006

> 最初の10個の自然数について, その二乗の和は,
> `1**2 + 2**2 + ... + 10**2 = 385`
> 最初の10個の自然数について, その和の二乗は,
> `(1 + 2 + ... + 10)**2 = 3025`
> これらの数の差は `3025 - 385 = 2640` となる.
> 同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.

---

# Answer 006 (Python)

```python3
class Problem6:

    LIMIT = 100

    def main(self):
        l = range(1, self.LIMIT + 1)
        print((sum(l) ** 2) - (sum(i * i for i in l)))


if __name__ == '__main__':
    p = Problem6()
    p.main()
```
---

# (参考) Project Euler とは

[Project Euler](https://projecteuler.net/) はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。

サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。

また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
Python3で変数を積み上げる方法をご教示いただけないでしょうか

変数の積上げはPythonで可能でしょうか。

分析で使うデータの形が悪く、加工して使おうとしています。もし方法やアイデアをお持ちでしたらアドバイスいただけないでしょうか。

▽今のデータ(CSVのイメージで記載)
ID,M201701,M201702,M201703

1,33,44,55

2,66,77,88

▽加工後に実現したい形

※変数名をvarとnumにしていますが何でもよいです
※varという名前でID以外の変数名を積上げ、値の数値も積上げる、変数を積み上げたのでIDは3行になる

ID,var,num

1,M201701,33

1,M201702,44

1,M201703,55

2,M201701,66

2,M201702,77

2,M201703,88

M201701,M201702,M201703の3つの変数を例で記載していますが、実際には30近くあり、今後も増えていきます。
そのため、

ID,M201701
と
ID,M201702
と
ID,M201703

の3つのテーブルを作って縦に連結するという方法はあまり現実的ではないと思いました。

また行も4000くらいあります。Pythonで自動的にデータ加工できたら楽なので、もし可能ならご教示いただきたく。
よろしくお願いいたします。
JavaのOptionalで値存在時/非存在時の処理を書く際の指針

JavaのOptionalで値存在時/非存在時の処理を書く際、次の3つのメソッドを使用することができます。

* `Optional.isPresent()`
* `Optional.ifPresent()`
* `Optional.ifPresentOrElse()`（Java 9以降）

どういう場合にどのメソッドを使うべきか、僕なりの指針を考えてみました。

## 各メソッドの仕様
### Optional.isPresent()
`Optional.isPresent()`は、値が存在する場合は`true`、存在しない場合は`false`を返すメソッドです。
if~else文と組み合わせて使うことで、従来のnullチェックの構文をほぼそのまま置き換えることができます。
もっとも、そのような使い方は**「ただnullチェックを置き換えただけで、Optionalを使う意味がない」**とも言われています。

```java
final Optional<String> foo = Optional.ofNullable("foo");

if (foo.isPresent()) {
	System.out.println("foo=" + foo.orElse(""));
} else {
	System.out.println("foo is null");
}
```

### Optional.ifPresent()
`Optional.ifPresent()`は、値が存在する場合は引数で指定した関数（Consumer）を実行するメソッドです。
値が存在しない場合の処理を記述できず、**関数内でブロック外の変数を書き換えられない**という制約があります。

```java
final Optional<String> foo = Optional.ofNullable("foo");

foo.ifPresent(f -> System.out.println("foo=" + f));
```

### Optional.ifPresentOrElse()
`Optional.ifPresentOrElse()`は、値が存在する場合は引数で指定した1個目の関数（Consumer）を実行し、存在しない場合は引数で指定した2個目の関数（Runnable）を実行するメソッドです。
値が存在しない場合の処理を記述できますが、**関数内でブロック外の変数を書き換えられない**という制約があります。

```java
final Optional<String> foo = Optional.ofNullable("foo");

foo.ifPresentOrElse(f -> System.out.println("foo=" + f), () -> System.out.println("foo is null"));
```

## フローチャート
どういう場合にどのメソッドを使うべきかのフローチャートです。

<!-- TODO: フローチャートをdraw.ioで作り直す -->
![https://qiita-image-store.s3.amazonaws.com/0/132608/149d5aab-1032-6390-c4b1-01f209874ec4.png](https://qiita-image-store.s3.amazonaws.com/0/132608/149d5aab-1032-6390-c4b1-01f209874ec4.png)

基本的には`Optional.ifPresent()`を使用し、ブロック外の変数を書き換えたい場合や、値が存在しない場合の処理を記述したい場合のみ他のメソッドを使うのがよさそうです。

## 参考リンク
*  [Optional (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html)
* [で、結局 Optional のインスタンスに対して ifNotPresent 的なことをやりたいときはどうしたらいいんですか？](https://qiita.com/mdstoy/items/e62eda1efad7d122f431)
Pythonで0から99までのランダムな整数のリストを標準ライブラリのみを使用して作成する

## numpyは使わずにランダムな整数のリストを作る

調べてみたらnumpyを使ったサンプルはたくさん出てきたのだけど、意外と標準ライブラリのみを使用したパターンが見当たらなかったので、自分用メモとして残しておきます。


```python
import random
random.sample(list(range(0, 100)), k=100) # ---> [70, 33, 4, 73,...
```

## 参照

[9.6. random — 擬似乱数を生成する Python - 3.6.3 ドキュメント](https://docs.python.jp/3/library/random.html)
昔の人はどんなダジャレを本のタイトルに仕込んだのか

* [【たのしいな】様々なコマンド達を何も考えずにつないで遊ぶ - Qiita](https://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72#-dajarep)
* [文章からダジャレのみを抜き出すコマンドを作ってみた - Qiita](https://qiita.com/kurehajime/items/a922d42dff5e0f03d32c)
* [青空文庫APIサーバーのご紹介 - Qiita](https://qiita.com/ksato9700/items/626cc82c007ba8337034)

を組み合わせて青空文庫からタイトルを取得してダジャレを検出します！

# コマンド

```bash
curl -s "http://pubserver2.herokuapp.com/api/v0.1/books?limit=0" | jq -r .[].title | dajarep -d
```

csvで配布されているより1000件ほど少ないですが、14000ほどのjsonが取得できました。
zip解凍してcsvをパースしたり、スクレイピングよりはるかに楽なのでこちらで。

# 結果

```
大雪山二題[ダイ]
悦しき知識[シキ]
人生・文章習練の書[ショ]
社会主義者に非ず[シャ]
東京万花鏡[キョウ]
蕗のとうを摘む子供等[トウ]
三ツ星さん[サン]
先生と生徒[セイト]
ノーベル小伝とノーベル賞[ショウ]
花と人の話[ハナ]
小説集「秦の憂愁」後記[シュウ]
小説「墓場」に現れたる著者木下氏の思想と平民社一派の消息[シャ]
便なき幼児のうたへる歌[ウタ]
スタンレー探検隊に対する二人のコンゴー土人の演説[タイ]
〔最も親しき友らにさへこれを秘して〕[トモ]
三匹の小熊さん[サン]
三匹　の　こぐまさん[サン]
「現代戯曲全集第十七巻」の跋に代へて[ダイ]
蜜柑山散策[サン]
作家としての小酒井博士[サッカ]
粟田口霑笛竹（澤紫ゆかりの咲分）[サキ]
粟田口霑笛竹（澤紫ゆかりの咲分）[サキ]
怪談会の怪異[カイ]
真の愛国心[シン]
「満洲国各民族創作選集」選者のことば[シュウ]
従軍五十日[ジュウ]
図書館法を地方の万人の手に[ホウ]
元禄時代小説第一巻「本朝二十不孝」ぬきほ（言文一致訳）[イッチ]
はなしの話[ハナシ]
中村地平著「長耳国漂流記」[チョ]
女の話・花の話[ハナ]
明治哲学界の回顧[カイ]
明治哲学界の回顧[カイ]
怪談会　序[カイ]
或社会主義者[シャ]
花の話[ハナ]
寛永武道鑑[カン]
凡神的唯心的傾向に就て[シン]
唯心的、凡神的傾向に就て（承前）[シン]
愛読書の印象[ショ]
桜さく島[サク]
桜さく島[サク]
心霊研究会の怪[カイ]
今年心を動かした事[コト]
今年改良したき事[コト]
社会生活の純潔性[セイ]
人間性・政治・文学（１）[セイ]
『労働戦線』小説選後評[セン]
美しき死の岸に[キシ]
パンの会の回想[カイ]
マルチン・ルターの小信仰問答書[ショ]
三山居士[サン]
ある崖上の感情[ジョウ]
```

読みが間違っていそうなものもありますね。
軽く韻を踏んだり、頭とお尻をあわせているものが多いでしょうか。
こうして挙げると狙ったものもあるように見えてきます。

ちなみに対象をよみがな(title_yomi)にした結果がこちら

```
さっかとしてのこさかいはかせ[サッカ]
おううちほうのシシおどりとししくよう[シシ]
クリスマスのおくりもの[クリ]
```

がっつり減りました…不思議。
Gitlab：10.3でサポートされたmermaidを使ってシーケンス図を書いてみる

シーケンス図ほんと大事ですよね。
複雑な処理について会話する際に図が無いとメモリ不足で三つ四つ前の登場人物が頭から消えてしまいます。

エクセルで図を起こしてメンテナンス地獄や見た目こだわり地獄にはまった事があるので、plantumlみたいなコードで図を起こせるツールが大好きです。

gitlab上で書けたら良いのになぁと思っていたところ10.3でmermaidとかいうjs？がサポートされたらしいので使ってみました。

# コード
```
```mermaid
sequenceDiagram;

participant A as ユーザー
participant B as Webアプリ
participant C as AD




A->>B:リクエスト
  alt トークンを持っている
    alt 有効期限内（7日=168時間）
      B -->> B:リクエスト継続
    else 期限切れ
      B -->> A:ログインフォーム遷移
    end
  else トークンを持っていない
    B -->> A:ログインフォーム遷移
  end

A->>B:ログインリクエスト [id, pass]
  alt idが登録されている
   B -->> C:認証リクエスト
    alt idとpassの組み合わせが正しい
      C -->> B:200
      B -->> B:トークン発行
      B -->> A:200 & トークン
    else idとpassの組み合わせが正しくない
      B -->> A: 401
    end
  else idが登録されていない
    B -->> A: 401
  end
```　
```

# 結果
![mermaid_sequence.png](https://qiita-image-store.s3.amazonaws.com/0/107536/f67ba9bb-ea03-7fed-e2b2-0e14c1796772.png)


# 感想
* 図が大きくなると一つ一つの要素が小さくなって見えなくなるので、plantumlでsvgファイルとplファイルの両方を作成しておくのが良いかも

* 使い捨てとかパッと書きたい時に書ける便利さはある

# 追記
* 破線と実線には確か意味があるので使い分ける必要がある
* qiitaでもサポートされてくれないかな
Cyberduck で .htaccess などの不可視ファイルを表示しました

ロリポップ！の WordPress 管理画面にアクセスしようとしたら、.htaccess によるアクセス制限がかかっていました。

# ロリポップ！のアクセス制限
<img width="50%" alt="WordPress ログイン画面へのアクセス制限" src="https://qiita-image-store.s3.amazonaws.com/0/1624/7974454a-eebc-7660-70d4-f9476e4a9825.png">

どうやらロリポップ！では .htaccess を使用したアクセス制限を行っているようです。

# Cyberduck から .htaccess が見えない

こんな機能があるのかあと Cyberduck から見てみると、.htaccess が見つかりません。
ロリポップ！のいうように .htaccess があるのか確認してみようと考えました。

# ロリポップ！の管理画面から .htaccess を確認

ロリポップ！の[マニュアル](https://lolipop.jp/manual/blog/wordpress-htaccess/)によるとロリポップ！の管理画面からも FTP が用意されています。ロリポップ！管理画面の FTP から確認すると .htaccess ファイルを確認できました。

# Cyberduck の設定ではないか
ロリポップ！の FTP から見えるのに、Cyberduck では見えない。
つまり、Cyberduck の設定である可能性があります。

# Cyberduck の設定
`Cyberduck > 環境設定 > ブラウザ` から `'.'で始まるファイルを表示` にチェックを入れます。

しかし、これでは .htaccess は見えませんでした。何故？？

表示の方を見るとらしき項目がありました。

`Cyberduck > 表示 > 不可視ファイルを表示` を選択します。

# Cyberduck から確認
Cyberduck で　.htaccess が見えました。やった(☝ ՞ਊ ՞)
TouchDesigner LUTでカラーグレーディング

タイトル通りなのですが、俺も気軽におしゃれなフィルターかけたいぜ〜と思っていたらデフォルトの機能でありました。

[OpenColorIO TOP](https://www.derivative.ca/wiki099/index.php?title=OpenColorIO_TOP) の`File Transform`タブの`Use Transform`をOnにして`File Source`に適用させたい.CUBEファイル等を指定します。

![OpenColorIO-qiita.png](https://qiita-image-store.s3.amazonaws.com/0/58558/0daa97bf-21a1-34a4-a8dd-e8fda36d2a1f.png)

以下は左が元画像で、右が[35 Free LUTs for Color Grading Videos](https://www.rocketstock.com/free-after-effects-templates/35-free-luts-for-color-grading-videos/)からダウンロードした`Zed 32.CUBE`を適用させたものです。

![OpenColorIO2-qiita.png](https://qiita-image-store.s3.amazonaws.com/0/58558/aa4d53fb-322e-efc1-e627-2dd62c01742f.png)

[GPUImage](https://github.com/BradLarson/GPUImage)でLUTを扱ったものを見たことがあったのでGLSL書くものと思い[フォーラムにあった.tox](http://derivative.ca/Forum/viewtopic.php?f=22&t=7866&p=29662&hilit=lookup#p29662)のような感じでやろうとしていたことろ、[Instagram](https://www.instagram.com/p/BefaCDJlnVh/)でそれOpenColorIOでできるよと教えてもらいました。先の.toxの場合は`MovieFileIn`にLUTを指定するため.CUBEは使えないので、そのまま使用できるのはありがたいですね。

他にも設定あるのかもしれませんが、Premiereで適用させた場合と変わらないように見えたのでこれでいいのかな。何かあったら追記したいと思います。
[[Premiere Pro] LUTの適用の仕方 ｜Vook note(ヴックノート)] (https://vook.vc/n/91)
論文まとめ：Spatially Supervised Recurrent Convolutional Neural Networks for Visual Object Tracking

#はじめに
G. Ning氏らが2016年7月に発表した Spatially Supervised Recurrent Convolutional Neural Networks for Visual Object Tracking をまとめてみた。

arXivのリンクはこちら
[1] https://arxiv.org/abs/1607.05781

著者らの解説サイトはこちら
[2] http://guanghan.info/projects/ROLO/
demo video が幾つかあります。

#概要
-  visual object tracking タスクで CNN と LSTM を用いた新しいアプローチ
-  CNNからの特徴量と位置情報の履歴を利用する
-  既存の候補領域を用いた手法と比べた場合、CNN 部分と LSTM 部分両方において回帰問題として解くのが特徴的
-  結果、様々な data sets において低い演算コストながら state-of-the-art な精度となった

# tracking タスクの定式化
`Xt`を t 時の input frame、`Bt`を t時の object の位置とする。`t-1`までの位置と`t`までの入力画像から`t`時の位置を推定する。

```math
p(B_1, B_2, \cdot \cdot \cdot,B_T | X_1, X_2, \cdot \cdot \cdot,X_T) = \prod^T_{T=1} p(B_t | B_{<t}, X_{\leq t})
```

#提案モデル（ROLO）
### モデルの概略
ざっくり言うと以下の図。
<img width="786" alt="スクリーンショット 2018-01-29 4.47.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/94ce50f2-78ad-3656-78ca-0e1d2b575091.png">
各時刻の frame を YOLO に入れ、中間層からの特徴量、および出力層からの矩形情報（位置）を取り出し、それを LSTM に入れる。

これにより現在の矩形情報（位置）を推測する。詳細のアーキテクチャは以下。
<img width="849" alt="スクリーンショット 2018-01-29 4.47.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/a03448fb-f623-e21f-b3d3-48db8c75c7fa.png">

### Phase 1 CNNで事前学習
最初に trditional な CNN（VGG-Netとか？）で事前学習させる。

具体的には ImageNet の 1,000クラス分類で学習させ、おおよその object に対して特徴量を検出できるようにする。（Figure 2 の点線の部分。）

### Phase 2 YOLOで特徴量と矩形情報を抽出
次にこれを YOLO の architecture で学習させる。YOLO は S X S の各グリッドに対してB個の矩形を推定する。そのそれぞれが矩形のx座標、y座標、縦h、横w、確からしさcを有する。また各グリッドは C 個のクラスに対するチャンネルも有するので、結局 YOLO の出力は

```math
S \times S \times (B \times 5 + C)
```

のテンソルとなる。しかし今回のモデルでは確からしさとクラスの部分は使わないので、

```math
B_t = (0,x,y,w,h,0)
```

とする。

中間層から抜き出す特徴量`Xt`としては、最初の全結合 4,096 次元を使用する。

### LSTMで時系列処理
`Xt` と `Bt` をLSTMへ入れ、`t`時刻の矩形を推定させる。平均二乗誤差でLossを求め、Adamで学習させる。

```math
L_{MSE} = \frac{1}{n} \sum^n_{i=1} ||B_{target} - B_{pred}||^2_2
```

### Alternative Heatmap
例えば、オクルージョンがある場合、YOLOからの出力 (0,x,y,w,h,0) を直接 LSTM に放り込むと

```math
(0,0.8,0.4,0.1,0.1),(0,0.81,0.41,0.1,0.1), \dots ,(0,0.83,0.42,0.1,0.1)
```

ときたものが急に`(0,0,0,0,0)`となったりするのでよろしくない。

そこで YOLO の出力を 32 x 32 の Heatmap に変換してから LSTM に放り込む。

LSTM からの出力および target も 32 x 32 の Heatmap とし、平均二乗誤差を計算する。

```math
L_{MSE} = \frac{1}{n} \sum^n_{i=1} ||H_{target} - H_{pred}||^2_2
```

# 結果
###汎化性能
まず以下の Figure 4 の (a) と (b) では、ground truth は顔の領域となっている。しかし YOLO の学習データである VOC には顔はない。よって、顔（を含む）領域を tracking していることから、ROLO は汎化性能があるといえる。

また YOLO に比べて ROLO モデルは安定的に領域を検出している。

<img width="927" alt="スクリーンショット 2018-01-29 4.47.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/8ed0b642-107d-f8f7-7112-500840c105d7.png">

### occulution
次に occulution に対する頑健性の検証。Figure 5 の上側は途中で車が木に隠れてしまっている。YOLO は完全に見失っているが、ROLO は検出している。

下側は人の体の一部が車に隠れる場面。ROLO の方が検出領域がより ground truth に近い。

<img width="927" alt="スクリーンショット 2018-01-29 4.47.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/e92f9f99-b97c-7d91-48db-d25b1f8aca87.png">

### 他のモデルと性能比較
AOS で他のモデルと比較。各データセットに対して最もよい結果が緑、２番目が赤。ROLO は総じて性能がいい。
<img width="935" alt="スクリーンショット 2018-01-29 4.48.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/6b259dfd-aecd-da1c-ad74-54cc0dbd7885.png">
今更ながらニューラルネットワーク(MNIST)

　pythonなどに素晴らしいNNのフレームワークがあるのですが、イマイチ理解できないので、随分と前からC++ templateの勉強がてらNNをフルスクラッチしてます。CUDAの学習なども併せて行うと頭がパンクするのでC++AMPでGPUを利用しています。[github](git@github.com:coelacanthus/CppAmpNeu.git)

　C++ templateを使うことにしたので、NNモデルは以下の様に型として定義しています(C++ templateに苦戦)。各ノードの入出力に間違いがあればコンパイル時に分かるって寸法です。しかし、パラメータを色々試しながら最適なモデルを探すことが多いと思いますので実用性ないと思います。

```C++:TestMnist.cpp

	using InputShape = IOShapeDef<BATCHSIZE, MnistDataLoader::HEIGHT, MnistDataLoader::WIDTH, 1>;

	using MnistSeq = Sequence <
		InputShape,

		Convolution<32, Size2d<5>>,
		ConvolutionBias<>,
		Activation<Relu>,

		MaxPooling<Size2d<2>>,

		Convolution<64, Size2d<5>>,
		ConvolutionBias<>,
		Activation<Relu>,
		
		MaxPooling<Size2d<2>>,
		Flatten<>,

		Dropout<Float<5, 10>>,

		FullConnection<128>,
		FullConnectionBias<>,
		Activation<Relu>,

		FullConnection<10>,
		FullConnectionBias<>
	>;

	using ModelType = NeuralNetworkModel<BATCHSIZE, MnistSeq, SoftmaxCrossEntropyMulticlass, Adam>;
	auto spModel = ModelType::create(gpu);
	spModel->optimizer->learningRate = float_type(0.001);
	spModel->ready(Random, float_type(-0.1), float_type(0.2));

```

　FullConnectionやConvolutionalなどの各ノードの実装は以下の様にdetailsネームスペースで記述され、グローバル空間で利用し易い形(入力型(前のノードの出力型)が省略できる)にしたクラスがあります。

```C++:Neu.h
namespace details {
    template<typename InputShapeT, int TOutputChannels, typename KernelSizeT, typename 
    KernelStrideT = Stride2d<1>>
    struct Convolution : base::WeightedNode
    {
      //(実装略)
    };
}

template<int TOutputChannels, typename KernelSizeT, typename KernelStrideT = Stride2d<1>, int TTag = -1>
struct Convolution
{
    constexpr static const int Tag = TTag;

    template<typename InputShapeT>
    using Impl = details::Convolution<InputShapeT, TOutputChannels, KernelSizeT, KernelStrideT>;
};
template<int TOutputChannels, typename KernelSizeT, typename KernelStrideT = Stride2d<1>, int TTag = -1>
using Conv = Convolution<TOutputChannels, KernelSizeT, KernelStrideT, TTag>;

```

　一部のノード(BatchNormalize)などはちゃんと動いているのか怪しいので、書いたもののコメントアウトされています。

　仮想通貨マイニングにせよDNNにせよ良いGPUが欲しい今日この頃です。
PHPでツリー構造のデータを構築する

#はじめに
データベースなどに保存されているレコードからツリー構造を作成する必要があったため作成。
これで作ったデータはechoなどで書き出すとツリー構造になって出力される。

jsonで出力して、[jsTree](https://www.jstree.com/)に渡すと手軽にjavascriptでツリーが作れる。

#データについて
元となるデータの構造はあまり関係ないので、ノードごとに自身のIDと親のIDを保持していれば構築できる。

```php:サンプルデータ
$data = array(
  'a' => array(
    'parent' => 'b',
    'data' => ノードのデータ
  ),
  'b' => array(
    'parent' => '',
    'data' => ノードのデータ
  )
)
```

#サンプルコード
```php:tree.php
public static function tree($data)
{
  $tree = array();
  $index = array();

  // 単純な２次元配列をツリー形式に変換
  foreach($data as $id => $value){
    $index[$id] = array(
      // 自身のユニークなID
      'id' => $id,
      // 親のノードID
      'parent' => $value['parent'],
      // 子ノードを保持するための配列
      'children' => array(),
      // 元々のデータを持たせるなど以降は適当
      'data' => $value
    );
  }

  // 親子関係を割り当て
  foreach($index as $key => $value){
    // 他のノードの子ノードになっている場合
    // ついでに循環参照になっていないかも確認
    if(array_key_exists($value['parent'], $index) && $value['parent'] != $value['id'])
    {
      // リファレンス渡し
      $index[$value['parent']]['children'][] = & $index[$key];
    }
    // ルートノードの場合
    else
    {
      $tree[] = & $index[$key];
    }
  }

  return $tree;
}
```
ParcelをVue開発に使ってみよう

#Parcelすごい。Webpackさよなら！

※2019年3月10日、最新バージョンにアップデートしてチェックした結果、設定がほぼ必要なくなりました。boilerplateはいらないんじゃないってくらいです。

でも、Reactは簡単に設定出来ましたが、Vueはそうでもなかったのでboilerplateを作成してみました。
https://github.com/fri13th/vue-parcel-example
Vue + Vuex + VueRouterの動作を確認しました。

#設定方法

``` bash
git clone https://github.com/fri13th/vue-parcel-example.git
cd vue-parcel-example
yarn
yarn start
``` 

意外といろんなパッケージが必要でした。

#Parcelで設定できなかったこと

* typescript
* Routerによるコード分割が動作しない。
* SCSSに@font-faceが動作しない。


#その他
やっぱりParcelは便利でした。みなさんも是非使ってみてください。
BitZeny のマイニングの集計を行う

漢なら BitZeny のマイニングの集計を行い, 税計算に活用したいですね!

やりましょう!

## 前提条件

* ブロックチェーンに記録されたトランザクションで集計を行います.
* プールマイニングの場合, 報酬はプールマイニングから自動で払い出され, ブロックチェーンに刻まれた情報を元に集計を行います(プールに報酬が溜まったままで払い出されていない状態の残高は考慮しない).
* マイニング用にひとつのアドレスを使っていて, 交換所で変えたトランザクションは無いものとします.


## 集計する.

BitZeny 用の Insight(ブロックチェーン解析ソフト) サービスが立ち上がっています. ありがとうございます.

https://zenyinsight.tomotomo9696.xyz/ 

以下の REST API を GET で叩くと, アドレスのすべての取引履歴を JSON で取得することができます.

```
https://zenyinsight.tomotomo9696.xyz/api/txs/?address=XXXXX
```

JSON のレイアウトは ZChain とだいたい同じです(ZChain のほうが Bitcoin Insight を拡張したようですね). 

https://qiita.com/syoyo/items/07e6f6360eaf6db94e17

を参考に, python スクリプトを書きます.

```
#!/usr/bin/env python
# 
import json
import os
import sys
import datetime

# Set your BitZeny address.
MY_ADDR = 'XXXXXXXXX'

def findReceivedAmount(b, addr):
    amount = 0.0

    for vout in b['vout']:
        if MY_ADDR in vout['scriptPubKey']['addresses']:
            amount += float(vout['value'])

    return amount

def main():
    j = json.loads(open("data.json").read())

    print("timestamp, date, amount")

    # for each block
    for b in j['txs']:
        timestamp = b['time']
        # print(b['timestamp'])

        # find received amount for my account
        amount = findReceivedAmount(b, MY_ADDR)
        textualdate = datetime.datetime.fromtimestamp(timestamp)
        print("{0}, {1}, {2}".format(timestamp, textualdate, amount))      

main()
```

```
timestamp, date, amount
1517149933, 2018-01-28 23:32:13, 0.14967285
1517143276, 2018-01-28 21:41:16, 0.14737623
1517138526, 2018-01-28 20:22:06, 0.13828271
1517125319, 2018-01-28 16:41:59, 0.13137248
...
```

Voila! 無事集計できました.

## ZNY/JPY の日毎の価格を取得する

取得価額を得るため, ZNY/JPY の日毎の価格を CryptoCompare API で取得します.

https://qiita.com/syoyo/items/21d7353f854303f7fe02

```
date, open, high, low, close, ave
2017-02-15, 0.007055, 0.007055, 0.007055, 0.007055, 0.007055
2017-02-16, 0.007181, 0.007181, 0.007181, 0.007181, 0.007181
2017-02-17, 0.007286, 0.008501, 0.007286, 0.008501, 0.0078935
2017-02-18, 0.008509, 0.008509, 0.007293, 0.008509, 0.007901
2017-02-19, 0.008481, 0.01212, 0.007269, 0.01212, 0.0096945
2017-02-20, 0.01232, 0.01232, 0.008627, 0.008627, 0.0104735
2017-02-21, 0.009158, 0.009158, 0.007849, 0.007849, 0.0085035
2017-02-22, 0.007809, 0.009111, 0.007809, 0.007809, 0.008459999999999999
2017-02-23, 0.008128, 0.009482, 0.008128, 0.008128, 0.008805
2017-02-24, 0.008171, 0.06128, 0.008171, 0.01089, 0.0347255
2017-02-25, 0.01049, 0.01311, 0.00918, 0.01049, 0.011145
2017-02-26, 0.01078, 0.01078, 0.01078, 0.01078, 0.01078
2017-02-27, 0.01091, 0.01227, 0.01091, 0.01091, 0.01159
2017-02-28, 0.01122, 0.01262, 0.009817, 0.01122, 0.0112185
2017-03-01, 0.01165, 0.01165, 0.01019, 0.01019, 0.01092
2017-03-02, 0.01052, 0.01352, 0.01052, 0.01352, 0.01202
2017-03-03, 0.01392, 0.01392, 0.01237, 0.01237, 0.013145
...
```

Voila! 無事 ZNY/JPY の日毎の価格を取得できました!

## TODO

* 日毎の価格とマイニングの履歴とのマッチングを取り, 移動平均法で取得価額の計算を行う.
CentOS7 Nginx リンク 403 forbiddenエラー

## 状況
/var/wwwをwebserverのホームフォルダにして
/home/user_name/wwwというフォルダを作成して
/var/wwwの下にシンボリックリンクを貼って飛ぶということ。

## 原因
CentosあるあるのSELINUXだった。
SELINUXをdisabledにしないと、リンクを飛ぶことが許されない。

## SELINUXをオフ

`$ sudo vim /etc/selinux/config`

```:/etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled #←ここ
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```
  

環境構築終わってから気づいたが
ここを参考にすれば、スムーズに環境構築できるかもしれない。
参考：
[YumでNginxセットアップ+PHP-FPM](https://qiita.com/nagomu1985/items/31f7a24ee406826721e0)
Redisのメモリ検証

# はじめに
他のRedis構築に関するページは以下をご参考ください。
[Redis構築のまとめ](https://qiita.com/ono-soic/items/d63ac849ebccee68b5bc)

Redisを実際に稼働させるために、メモリが最大値を超えた時にどのような挙動をするのか把握しておかなければいけない。
実際にメモリを超えさせてみたのと、設定についてまとめる。

# 環境
CentOS 6.8
Redis 3.2.5(当時の安定バージョン)

検証サーバのスペック(freeコマンド等で確認)

| 名称 | 値(KB) |
|:--|:--|
| MemTotal | 1914220 |
| MemFree | 410616 |
| Buffers | 230088 |
| Cached | 1031656 |
| SwapCached | 0 |
| Active | 699296 |
| Inactive | 638120 |

# maxmemoryを超えたときの挙動
参考)[Redisのメモリが最大を超えた場合の挙動](http://gaishimo.hatenablog.com/entry/20121216/p1)

redis.conf内でmaxmemoryの設定を行うことができる
maxmemoryを超えたときの挙動はmaxmemory-policyの設定によって異なる

| policy | maxmemoryを超えた時 | 削除対象 | 削除優先度 | 見解 |
|:--|:--|:--|:--|:--|
| volatile-ttl | 既存の一部データが削除され、キーが追加される | 有効期限(expire)が設定されているデータ<br>→有効期限は「ttl [ket]」で確認出来る | 有効期限が古い順 |  maxmemory-sampleが設定できる<br>→maxmemoryを超えた時に削除するキーの個数 |
| volatile-lru | 既存の一部データが削除され、キーが追加される | 有効期限(expire)が設定されているデータ | 有効期限が古い順(LRUアルゴリズムに従って削除優先度を決める) |  maxmemory-sampleが設定できる |
| volatile-random | 既存の一部データが削除され、キーが追加される | 有効期限(expire)が設定されているデータ | ランダム | maxmemory-sampleは1らしい |
| allkeys-lru | 既存の一部データが削除され、キーが追加される | 全てのキー | 有効期限が古い→期限がないキー | maxmemory-sampleが設定できる<br><br>削除対象に「キューを貯めるキー」が入ってしまうので、好ましくない(randomも同様) |
| allkeys-random | 既存の一部データが削除され、キーが追加される | 全てのキー | ランダム | maxmemory-sampleは1らしい |
| noeviction | 上書きされずmaxmemoryエラーが出る |   |   | 上書きされず処理が止まってしまうので好ましくない |

### 検証時の要件
・メモリが最大になった時にエラーで処理停止は望ましくない
・古いデータより直近の変更履歴の方が優先度が高いので古いデータを削除して新しいデータを差し込むようにしたい

上記からmaxmemory-policyには「volatile-ttl」を設定。

# 最大値はどれくらいか検証
| 検証サーバのメモリ | 2GB |
|:--|:--|
| Redisのused_memory | 1085729200(1.09GB) |

サーバの約半分のメモリを使用することができる。(その後はmaxmemoryを超えた時と同じ挙動をした)

# 参考ページ
[Redisのメモリ使用確認方法](https://qiita.com/strategyMTG/items/7b0e2e49a2ee3c265f8d)
[Redis監視/分析ツールまとめ](http://rest-term.com/archives/3045/)
[巨大なデータを使うRedisの運用まとめ](https://qiita.com/satoshi03/items/e970627b6ef3448e96fd)
[Redisのメモリが最大を超えた場合の挙動](http://gaishimo.hatenablog.com/entry/20121216/p1)
[maxmemory-policyに何を設定するべきか](https://siguniang.wordpress.com/2012/03/19/redis%E3%81%AEmaxmemory-policy/)
[メモリ圧縮設定について](http://redis-documentasion-japanese.readthedocs.io/ja/latest/topics/memory-optimization.html)
[Redis使うときは見積もりの2倍の容量が必要！？](https://qiita.com/y_matsuwitter/items/4fc43a53d2ac24f7783e)

ちなみに検証はJmeterを使用して行った
[Jmeterの利用方法](https://keis-software.com/2013/09/02/jmeter-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%951-ramp%EF%BC%8Dup%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%95%B0%E3%80%81%E3%83%AB%E3%83%BC%E3%83%97%E5%9B%9E%E6%95%B0%E3%81%AE%E8%AA%A4/)
BIG-IP ve for AWSで遊ぼう

# はじめに
AWS上にBIG-IP veをデプロイしてみます。

# トライアルライセンスの入手
ライセンスの入手は[こちら](https://f5.com/products/trials/product-trials)から。90日のDownload a free trialを選びましょう。アカウントが無い人はRegister for your trialから、既に持っている人はLog inから。キーは30分以内に発行されます。

# 構成の検討
キーが発行されるまでの間にアドレス設計をしておきます。将来2台のBIG-IPを冗長構成で使うことも考え、以下の4つのサブネットを用意しました。

| サブネット名       | CIDR| 用途|
|:-----------------|:------------------|:------------------|
| Public             |              10.0.1.0/24 |WAN側インターフェース       |
| Private           |            10.0.2.0/24 |   LAN側インターフェース       |
| HA          |             10.0.3.0/24|        HA用インターフェース        |
| Management               |   10.0.4.0/24 |     Management用インターフェース        

# インスタンスの作成
EC2のインスタンス画面から、Launce Instanceでインスタンスの作成を行います。

## AMIの選択
左側のメニューから「AWS Marketplace」を選び、「big-ip」で検索します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/45a1d6d8-9675-40d6-4298-e1205f13638c.png)

何やらたくさん出てきますが、トライアルライセンスを使いたいので選ぶのは「BYOL (Bring Your Own License)」のものです。BYOLにもGood/Better/Bestの3種類があります。これは[機能の差](https://www.f5.com/pdf/licensing/good-better-best-licensing-overview.pdf)で、GoodはLTMのみ、Betterはそれに加えてDNSとAFM、BestはASMとAPMも含めた全ての機能が使えるようになります。しばらくはLTM部分の検証のみに使う予定なので、今回は「Good」を選びました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/1aba70ca-5948-7f90-9dc8-ec58a3cffc42.png)

## インスタンスタイプの選択
とにかく安く作りたかったので、選択肢の中で一番安いt2.mediumを選択しました。

## インスタンス詳細
NICの設定は要注意です。最初に作成したNICがBIG-IP上でManagement用のものになるため、Managementセグメントを指定します。IPは10.0.4.11にしました。接続用にIPv4 Public IPもつけておきます。
ストレージはデフォルトのままです。

## セキュリティグループ
初期設定でtcp/8443への接続が必要になります。「Create a new security group」を選ぶと自動的にルールを作ってくれるので、これを使いましょう。

# 待つ
インスタンスの起動を待ちます。。。

# 接続
インスタンスが起動したら、AWSの秘密鍵を使ってadminユーザでSSHアクセスをします。tmosシェルが出てくるので、modifyコマンドでadminユーザのパスワードを変更します。

```Text:BIG-IP
admin@(ip-10-0-4-11)(cfg-sync Standalone)(NO LICENSE)(/Common)(tmos)# modify auth user admin password <password>
```

変更できたら次はブラウザから、https://<IP_Address>:8443にアクセスしてGUIで操作をします。adminユーザ、先ほど変更したパスワードでログインができますので、ライセンスを投入していきます。

# ライセンス投入

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/756458c1-0968-4217-35c3-5ffb7f6970b0.png)

ログインするとライセンスが無いと表示されていますので、「Activate」を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/26604469-9d4a-d704-e4ea-320519950aa9.png)

f5から送られてきているトライアルキーを入力して「Next...」を選択。ソフトウェア利用許諾を読んで「Accept」をします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/3bef5538-4794-ce8e-4adf-f8fcde650708.png)

少し待つとライセンス認証が完了し、無事3ヶ月のトライアルができるBIG-IP veが誕生しました！

# 終わりに
BIG-IPは高価なのでなかなかラボ環境を揃えるのが難しいので、トライアルライセンスで勉強ができるのは嬉しいですね。次回は2台目のデプロイと冗長構成、その後はiruleなども試していきたいところです。
PWAに関する雑記 〜Safariも本格的にPWA対応してきたよ〜

# 概要
iOS11.3(β版)でSafariがService WorkerとWeb App Manifestに対応した。(あとPayment Request APIとかも)
Service WorkerはTP版で対応してたのであんまり驚きないのだが、Web App Manifestまで対応してくるとは!

# iOS11.3(β版)をインストールして確認した所感
気が向いたら画像とか載せるけどとりあえず箇条書き

* Add to homescreenした時のUXがChromeよりも残念な感じ
    * 下記はdisplayをstandalone以上にしたときの動作
        * そもそもstandaloneとfullscreenに差が無い(そもそもiOSのアプリはすべてfullscreen)
            * iPhoneX用に上の部分もscreenになるのかと期待したがそんなことはなかった
        * minimal-uiもbrowserと同じ(Safariが開く)だった
            * まあChromeもminimal-uiを実装したのは63からだし・・・
    * 「戻る」が出来ない
        * PWA自体はSPAにするなり、ナビゲーション機能つけるなりすればいいと思う
        * ただ他のサイトに行ったときどうすればいいの？（戻ってこれなくなる）
    * Pull to refreshが出来ない
        * (Androidの)Chromeは出来ます
            * safariはそもそもPull to refresh無いね
        * Webアプリ側で実装しろってことですね
        * Twitter Liteは実装してた
    * iPhoneXだとナビゲーションバーに何も表示されなくなる
        * 地味にツライ


と結構UX的にはまだまだ残念な感じだった。(まあβ版だしね)


# まとめ
~~まだ、PWAに振り切れないというかアプリ市場が成功しているAppleさんの葛藤を感じた。~~

![ダウンロード.jpeg](https://qiita-image-store.s3.amazonaws.com/0/65939/bde71770-adb1-4ddf-dc06-c9746066b7ff.jpeg)
iOSのホーム画面にLINEのURLスキームのショートカットを作る

#経緯

LINEのBOTを作成してるとき、テストの文字列を手打ちするのがめんどくさかったので、URLスキームのショートカットを作成していた。

URLスキームのショートカットを作るのがめんどくさくなったので、簡単にiOSのホーム画面にショートカットを作れるようにしてみた。

キーワード
iOS URLscheme Line 

#LineのURLスキームを調べる。
[公式サイト](https://developers.line.me/ja/docs/messaging-api/using-line-url-scheme/)よりテキストメッセージを送るURLスキームとBOTのIDを指定してテキストメッセージを送るURLスキームを見つける。

テキストメッセージを送るURLスキーム
`line://msg/text/?{text_message}`

BOTのIDを指定してテキストメッセージを送るURLスキーム
`line://oaMessage/{LINE_id}/?{text_message}`

#iOSのホームアイコンを作る
昔ながらの`<meta name="apple-mobile-web-app-capable" content="yes" />`を使ってiOSのホームアイコンを作成するHTMLを作成

title：アイコンのタイトルとなるテキストデータ
image：Base64でエンコードしたアイコン画像データ
URLscheme：line://で始まるURLスキーム
subURLscheme：https://line.me/R/で始まるURLスキーム（lineがインストールされていない場合にAppStoreに移動するためのリンク）


```
<!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta name="viewport" content="minimum-scale=1.0, width=device-width, maximum-scale=1.0, user-scalable=no" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <style>
        </style>
        <title>${title}</title>
        <link rel="apple-touch-icon" href="${image}" />
        <script type="text/javascript">
          if( window.navigator.standalone ){
            document.write('<meta http-equiv="refresh" content="0;URL=${URLscheme}">');
            document.write('<h2>now loading.</h2>');
            setTimeout(()=> location.href="${subURLscheme}",100);
          } else{ 
            document.write('<h2>シェアボタンをタップして「ホーム画面に追加」ボタンを押してください。</h2>');
          }
        <\/script>
      </head>
      <body>
      </body>
    </html>
```

#アイコン画像を作る
SVGでLineっぽいアイコンを作って、任意の白抜き文字を表示させる。
Canvasで描画してPngのBase64イメージデータを取得する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81968/9f115ab8-900a-ddd6-d97e-2a046a3a7fe5.png)

```
<svg xmlns="http://www.w3.org/2000/svg" version="1" viewBox="0 0 456 456">
  <path fill="#00c200" d="M0 0h456v456H0z"/>
  <path d="M393 220a84 84 0 0 0 1-23c-4-71-77-127-166-127-92 0-167 59-167 133 0 67 63 123 145 131 5 1 8 5 8 10l-4 32c0 7 7 12 13 9 69-34 111-68 135-98 5-5 20-25 23-31 6-11 10-24 12-36z" fill="#fff"/>
  <text xmlns="http://www.w3.org/2000/svg" x="10" font-size="100" fill="#00c200" font-weight="bold">
    <tspan x="10" dy="1em" stroke-width="5" stroke="#fff" stroke-linejoin="round">1行目</tspan>
    <tspan x="10" dy="">1行目</tspan>
    <tspan x="10" dy="1em" stroke-width="5" stroke="#fff" stroke-linejoin="round">2行目</tspan>
    <tspan x="10" dy="">2行目</tspan>
    <tspan x="10" dy="1em" stroke-width="5" stroke="#fff" stroke-linejoin="round">3行目</tspan>
    <tspan x="10" dy="">3行目</tspan>
    <tspan x="10" dy="1em" stroke-width="5" stroke="#fff" stroke-linejoin="round">4行目</tspan>
    <tspan x="10" dy="">4行目</tspan>
  </text>
</svg>

```

#フォームを作成して完成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81968/53f9f51c-dd93-ce81-d49f-d6090ad8ef40.png)
[GitPageで公開中](https://ranran999.github.io/lineUrlScheme/)