OmniAICreator/Qiita-1.07M huggingface dataset:
一部のktxを使うにはJava8対応が必要

DX向上のためにAndroidプロジェクトに[ktx](https://developer.android.com/kotlin/ktx?hl=ja)を導入しようとしたのですが、以下のように**JVM target 1.6にしろ**というエラーに遭遇したので、なぜこのエラーがでるかと言う原因と解決策をちょっと調べてみました。

```terminal
Cannnot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper 'jvm -target' option
```

## JVM target って何

Androidプロジェクトに含まれる.javaや.kotlinファイルはapk生成時に`javac`や`kotlinc`によって.class拡張子のバイトコードにコンパイルされるのですが、この.classファイルを実行する仮装環境がJVMです※1 ※2。

そして、このJVMのtargetというのはつまりはJavaプラットフォームのバージョンのことであり、ここでは**Java8を指定しろ**、と言うことだと思います。
(**Java8のバージョン文字列が1.8**です ※3)

## 何で1.8指定(Java8)が必要なの？

これは、いくつかの**ktxライブラリがJava8に依存しており、かつgradleのデフォルトのJVM targetが1.6**だからです。

例えば `fragment-ktx` の1.2のリリースノートには以下のように明記されています※4

> The Kotlin dependant libraries of this version (fragment-ktx,fragment-testing) **target Java 8 programming language bytecode**. Please read [Use Java 8 language features](https://developer.android.com/studio/write/java8-support) to learn how to use it in your project.

一方で、jvm tergetに関しては以下となっており、**デフォルトでは1.6指定になっている**のがわかります※5。

> Target version of the generated JVM bytecode (1.6, 1.8, 9, 10, 11 or 12), **default is 1.6**

## ktx以外でもJava8が必要なライブラリは結構ある

例えば**WorkManager**の`2.1.0`でも
> work-runtime-ktx では今後、Java 8 が必要になります

とあります※6し、JetpackComposeでも必要だったと思います。

## どうやってJVMtargetを変えるの

developersにある通り、各モジュールのbuild.gradleで以下のように指定できます。
https://developer.android.com/studio/write/java8-support?hl=ja

```gradle

android {
      ...
      // Configure only for each module that uses Java 8
      // language features (either in its source code or
      // through dependencies).
      compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
      }
      // For Kotlin projects
      kotlinOptions {
        jvmTarget = "1.8"
      }
    }
```
`compileOptions`がJavaコンパイラ向けのJava8対応、`kotlinOptions` がKotlinコンパイラ向けのJava8対応です。

## 参考
※1. Javaコードが動くのはJVM環境ですが、AndroidアプリはJVMではなくARTというランタイムで実行され、そのために.classファイルはclasses.dexというdexファイルに圧縮変換されてapkに含まれます。AndroidアプリがJVMを含んでいるわけではないです

dexファイルについては別途記事を書いたので参照してください。
https://qiita.com/nichiyoshi/items/46f44001358fbafd85a5

※2 https://www.javatpoint.com/difference-between-jdk-jre-and-jvm
※3 https://www.oracle.com/technetwork/jp/java/javase/jdk8-naming-2157130-ja.html
※4 https://developer.android.com/jetpack/androidx/releases/fragment#version_120_2
※5 https://kotlinlang.org/docs/reference/using-gradle.html#attributes-specific-for-jvm
※6 https://developer.android.com/jetpack/androidx/releases/work#2.1.0
引数マスターになろう！（初級編）

###引数をマスターしよう！
引数使いこなせるようになると、とても強いです！！！
練習あるのみ、手と頭を動かして頑張りましょう！！！

〜全問題共通条件〜
・defを利用してメソッドを定義すること
・引数を利用すること

##問題①

ターミナルで入力したネタのお寿司を作ってください。

```Ruby:ターミナルの出力結果
好きなネタを入力してね！
#たまご←ターミナルで入力
たまごのお寿司だよ！へいお待ち！
```

<details><summary>問題①答え</summary><div>

```ruby

def sushi(neta)
  puts "#{neta}のお寿司だよ！へいお待ち！"
end

puts "好きなネタを入力してね！"
neta = gets.chomp
sushi(neta)
```
</div></details>

##問題②

ターミナルで入力したネタのお寿司を作ってください（次は2貫だよ！）。

```Ruby:ターミナルの出力結果
好きなネタを２つ入力してね！
#たまご←ターミナルで入力
#いくら←ターミナルで入力
たまごといくらのお寿司だよ！へいお待ち！
```
<details><summary>問題②答え</summary><div>

```ruby
def sushi(neta,neta2)
  puts "#{neta}と#{neta2}のお寿司だよ！へいお待ち！"
end

puts "好きなネタを2つ入力してね！"
neta = gets.chomp
neta2 = gets.chomp
sushi(neta,neta2)
```
</div></details>

##問題③

文字列オブジェクトと数値オブジェクトを引数で使う問題です。
最後にお寿司の値段も出してあげましょう。

```Ruby:ターミナルの出力結果
好きなネタは何だい？
[0]たまご:100円
[1]サーモン:150円
[2]いなり:200円
#0←ターミナルで入力
たまごを何貫食べたいかい？
#40←ターミナルで入力
たまご寿司へいお待ち！合計4000円だよ！
```
今回は少し記述が多いので、こちらを雛形に利用してください。
※☆☆☆の部分に記述が必須です。

```Ruby:雛形
def sushi(☆☆☆)
  puts "☆☆☆を何貫食べたいかい？"
  ☆☆☆
  puts "☆☆☆寿司へいお待ち！合計☆☆☆円だよ！"
end

puts "好きなネタは何だい？\n[0]たまご:100円\n[1]サーモン:150円\n[2]いなり:200円"
choice = ☆☆☆

  if choice == 0
    ☆☆☆
    sushi(☆☆☆)
  elsif  choice == 1
    ☆☆☆
    sushi(☆☆☆)
  elsif choice == 2
    ☆☆☆
    sushi(☆☆☆)
  else
    puts "ないよ！！！出禁だよ！！！"
  end
```

<details><summary>問題③答え</summary><div>

```ruby
def sushi(neta,yen)
  puts "#{neta}を何貫食べたいかい？"
  sum = gets.to_i * yen
  puts "#{neta}寿司へいお待ち！合計#{sum}円だよ！"
end

puts "好きなネタは何だい？\n[0]たまご:100円\n[1]サーモン:150円\n[2]いなり:200円"
choice = gets.to_i

  if choice == 0
    tamago = "たまご"
    yen = 100
    sushi(tamago,yen)
  elsif  choice == 1
    salmon = "サーモン"
    yen = 150
    shshi(salmon,yen)
  elsif choice == 2
    inari = "いなり"
    yen = 200
    sushi(inari,yen)
  else
    puts "ないよ！！！出禁だよ！！！"
  end
```
</div></details>
プロジェクト作成と書き込み

# はじめに
e2studioでのプロジェクト作成とRenesas Flash Programmeでの書き込み方法についての記述．マイコンボードはGR-CITRUSとする．ハードウェアマニュアルの参考先はHM ＊.＊.＊と表記する（例：HM 3.3.4ならばハードウェアマニュアルの3.3.4節を参考）．

# プロジェクト作成

1. e2studioを起動
2. ファイル > 新規 > C/C++ project でプロジェクト作成（もしくは，ようこその Create a new C/C++ project） 
![home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/c4b0c18b-4344-8961-8874-3826aaab4d15.png)
3. テンプレート「Renesas CC-RX C/C++ Executable Project」の選択![tempPJ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/47ad3e9a-c579-f64d-15bb-c32605a3cb32.png)
4. プロジェクト名の設定![PJname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/47393c6e-c070-0e2d-6a2c-d2217a41d780.png)
5. ターゲット・デバイスの設定．「...」ボタンより選択できる．＊[GR-CITRUSの搭載マイコン](https://www.renesas.com/jp/ja/products/gadget-renesas/boards/gr-citrus.html#map)はRX631（R5F5631FDDFP 100pin QFP）
![target.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/e19b34be-cf63-4c9e-a75b-17efd59f5735.png)
6. 「終了」でプロジェクト作成を終了．srcフォルダのプロジェクト名.cにmain関数がある．![PJcomp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/ca39ede1-c056-4877-09ec-e653a5ba0902.png)

# ビルド

### ブートモード
マイコンに書き込むために，内蔵フラッシュメモリ書き換えプログラム（ブートプログラム）が動作するモードにする必要がある．(HM 3.3.5)．以下の図のように，MDまたはJP1と書かれたジャンパの部分を接続させてからリセットボタンを押す．
![jump.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/1094dabf-4992-0103-53a9-b2df861ceec5.jpeg)


### ビルド設定
出力ファイル形式をモトローラSに変更する．

1. プロジェクトフォルダを右クリックしてプロパティを開く
2. C/C++ビルド > 設定 > Converter > 出力 を選択
3. ロード・モジュール・コンバータを実行するにチェックを入れて，出力ファイル形式にモトローラSを指定する
4. 「適応」させて閉じる

![mot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/b7eb16d2-6b84-5446-46f7-790a5871b8d3.png)

### ビルド
トンカチマークかctrl+Bでビルドする．コンソールにBuild Finishedが表示されたらビルド完了![bild.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/4c4efb78-5e5c-5d01-e55b-7c5e1853bf1b.png)

# 書き込み

### 書き込み設定

1. Renesas Flash Programmeを起動
2. ファイル > 新しいプロジェクトの作成 を選択
3. マイクロコントローラにRX63xを選択
4. 任意のプロジェクト名と作成場所を指定する．
5. 通信ツールに USB Direct を選択
6. 「接続」＊このときマイコンと接続していないとエラーとなる
![flashNew.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/7c385a1d-2212-be65-68a1-ddfcdbf0292e.png)

### 書き込み

1. 作成したプロジェクトの中にあるHardwareDebugフォルダの中に生成されている*.motファイルを参照する
2. スタート
![flash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520158/44ad9bc1-bde9-dba7-d692-96249563d4ba.png)


# 参考文献

- RX631開発 プロジェクトの作成 ＜e2 studio編＞https://ccwo.hatenablog.jp/entry/2016/08/17/184540
- RX631開発 プロジェクトの作成 ＜Renesas Flash Programer編＞https://ccwo.hatenablog.jp/entry/2016/08/17/191425
- [e2 studio 統合開発環境 ユーザーズマニュアル 入門ガイド](https://www.renesas.com/jp/ja/doc/products/tool/doc/014/r20ut4374jj0100-e2studio.pdf)
go-redisのSMEMBERSの挙動

```go
package main
  
import (
        "fmt"
        "github.com/go-redis/redis"
)

func getRedisClient() (*redis.Client) {
        client := redis.NewClient(&redis.Options{
                Addr:     "localhost:6379",
                Password: "", // no password set
                DB:       0,  // use default DB
        })
        return client
}

func main() {
        rc := getRedisClient()
        //key := "sonzaisurukey"
                // ok
        key := "sonzaishinaikey"
                // ng

        v := rc.SMembers(key)
        fmt.Printf("v(%d):%v,%v\n", len(v.Val()), v.Err(), v.Val())

        if v.Err() != nil {
                fmt.Print("error is not nil\n")
        }
        if v.Err() == redis.Nil {
                fmt.Print("redis.Nil is coming\n")
        }
}
```

* keyがあってもなくてもエラーにはならない。なくても要素数は0で返る。
【Excel】IPアドレスの各オクテット・Prefixを抜き出す関数

##目的
IPアドレス管理の効率化
ネットワークエンジニアの働き方改革

##前提
- IPアドレスはA1セルに記載されている。
- B1セル～F1セルを計算用に使用する。
- Prefixあり・なしの両方のIPアドレスに対応する。
    - Prefixありの場合、Prefix長を抜き出す。( / なし)
    - Prefixなしの場合、空白を返す。

##関数
B1セル：1オクテット目
`=LEFT(A1,FIND(".",A1)-1)`

C1セル：2オクテット目
`=MID(LEFT(A1,FIND(".",A1,LEN(B1)+2)-1),LEN(B1)+2,3)`

D1セル：3オクテット目
`=MID(LEFT(A1,FIND(".",A1,LEN(B1&C1)+3)-1),LEN(B1&C1)+3,3)`

E1セル：4オクテット目
`=SUBSTITUTE(RIGHT(A1,LEN(A1)-LEN(B1&C1&D1)-3),"/"&IFERROR(MID(A1,FIND("/",A1)+1,3),""),"")`

F1セル：Prefix
`=SUBSTITUTE(RIGHT(A1,LEN(A1)-LEN(B1&C1&D1&E1)-3),"/","")`

おまけ：抜き出した各数値を結合する関数
（E1をE1+1にして、対向の機器に割り当てるときなどに使う）
`=B1&"."&C1&"."&D1&"."&E1&IF(F1="","","/"&F1)`

##イメージ
![ip1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/d20b26f1-60c4-180a-9045-22e3008ed5da.png)

##追記：Prefix表記から、サブネットマスクを出力させる関数
A1セルのPrefixのサブネットマスクを表示する。/16～/32までに対応。ついでにワイルドカードマスクも。
本当はIPアドレスのようにオクテットごとに1セルを使うのが楽だが、どうしてもひとつのセルに収める必要があり、関数をガチガチに組んで実現。

###サブネットマスク：
`=IF($A1="","",IF(RIGHT($A1,2)*1=16,"255.255.0.0",IF(RIGHT($A1,2)*1>24,"255.255.255."&256-2^(7-MOD(RIGHT($A1,2)-1,8)),"255.255."&256-2^(7-MOD(RIGHT($A1,2)-1,8))&".0")))`

インデントをつけてみる。

```vb
=IF($A1="","",
    IF(RIGHT($A1,2)*1=16,"255.255.0.0",
        IF(RIGHT($A1,2)*1>24,
           "255.255.255."&256-2^(7-MOD(RIGHT($A1,2)-1,8)),
           "255.255."&256-2^(7-MOD(RIGHT($A1,2)-1,8))&".0"
           )
       )
   )
```

###ワイルドカードマスク
`=IF($A1="","",IF(RIGHT($A1,2)*1=16,"0.0.255.255",(IF(RIGHT($A1,2)*1>24,"0.0.0."&2^(7-MOD(RIGHT($A1,2)*1-1,8))-1,"0.0."&2^(7-MOD(RIGHT($A1,2)*1-1,8))-1&".255"))))`
構造はサブネットマスクと同じ。

※はじめにA1セルが空白かを確認しているのは、この関数を複数行にずらっとコピーして使うことを想定しているため。これがないと空白行に対して`#VALUE`を返すので美しくないし、セルの数だけRIGHTを処理してしまうため遅くなるかも、と思っている。
※Prefixは`RIGHT($A1,2)`で取得している。RIGHTの結果は文字列として返されるので、そこから\*1して数字の大小が比較できるようにしている。上記画像のように別セルでPrefixだけ出力されているなら、`RIGHT($A1,2)*1`を`$F1`に置き換えてもOK。

###Prefixの値(F1セル)からサブネットマスクを一発出力
`=IF($F1=0,"0.0.0.0",IF(INT(($F1-1)/8)>=1,"255."&IF(INT(($F1-1)/8)>=2,"255."&IF(INT(($F1-1)/8)>=3,"255.",""),""),"")&256-2^(8-(MOD($F1-1,8)+1))&IF(INT(($F1-1)/8)<3,".0"&IF(INT(($F1-1)/8)<2,".0"&IF(INT(($F1-1)/8)<1,".0",""),""),""))`

```vb
=IF($F1=0,"0.0.0.0",
    IF(INT(($F1-1)/8)>=1,"255."&
        IF(INT(($F1-1)/8)>=2,"255."&
            IF(INT(($F1-1)/8)>=3,"255."
            ,"")
        ,"")
    ,"")&
    256-2^(8-(MOD($F1-1,8)+1))&
    IF(INT(($F1-1)/8)<3,
        ".0"&
        IF(INT(($F1-1)/8)<2,".0"&
            IF(INT(($F1-1)/8)<1,.0",
            "")
        ,"")
    ,"")
)
```

※/0～/32だと、全部で33種類。オクテット数４×各オクテット８パターンの処理だと、ひとつ足りない。そのため、/0を特殊パターンとして、最初に判別している。

###追記_20201205：Prefixなしのネットワークアドレス(A1セル)から、一つ目のホストアドレスを出力
`=LEFT($A$1,FIND("Γ",SUBSTITUTE($A$1,".","Γ",LEN($A$1)-LEN(SUBSTITUTE($A$1,".","")))))&MID($A$1,FIND("Γ",SUBSTITUTE($A$1,".","Γ",LEN($A$1)-LEN(SUBSTITUTE($A$1,".",""))))+1,3)+1`

```vb
=LEFT($A$1,
    FIND("Γ",
        SUBSTITUTE($A$1,".","Γ",
            LEN($A$1)-
            LEN(UBSTITUTE($A$1,".",""))
        )
    )
)&
MID($A$1,
    FIND("Γ",
        SUBSTITUTE($A$1,".","Γ",
            LEN($A$1)-
            LEN(SUBSTITUTE($A$1,".",""))
        )
+1,3)
+1
```


参考：http://blog.excel-sys.com/Entry/165/
#AWS の ElasticBeanStalk + awscli の eb use コマンドでデフォルトの環境を切り替える

list で環境リストを見て、use で切り替えられる

```
$ eb list
Ex-env
* puppeteer

$ eb use Ex-env

$ eb list
* Ex-env
puppeteer


```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2691








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
micro:bitで子供とプログラミングの勉強をはじめる準備

# モチベーション
2020年から公立小学校でもプログラミング教育が必修化されるということで、小学校一年生の息子を持つ私も、家で子供と一緒にプログラミングをやってみようと思っています。
というのは建前で、プログラミング教育ということにすれば家で電子工作をする大義名分になるというのが本音です。

# ターゲット
PCや最近だとタブレットでもプログラミングはできますが、子供は将来ロボットを作りたいとのことなので、どうせなら最終的には何か動くようなものをターゲットにすると良いかなと思い本屋さんで眺めていたところ、`micro:bit`というものがあることを知りました。
micro:bitはイギリスのBBCが開発したものらしく、PythonでのプログラミングやScratchのようなグラフィカルなプログラミング環境（ブロックエディター）もあるのでプログラミングの教材としてはなかなか優秀そうなのでこれをターゲットとすることにしました。
https://microbit.org/ja/

# 準備
micro:bitでプログラミングを行うために最低限必要そうなものとして以下のものをそろえました。

### micro:bitの本
手づくり工作をうごかそう！ micro:bitプログラミング   石井 モルナ 
https://www.amazon.co.jp/dp/B07BFQ95G6

特にこれといった理由はなく、本屋で目についたものです。
プログラミング自体はネット上の情報だけでも十分そうですが、子供と工作することを考えると何か一緒に本を見ながらやった方がやりやすいと思い購入しました。

### micro:bit 本体、ケース、電池ボックス

いずれもスイッチサイエンスで購入。
https://www.switch-science.com/catalog/5263/
https://www.switch-science.com/catalog/5306/
https://www.switch-science.com/catalog/5277/

はじめようキットみたいなものもありますが、microUSBケーブルは手持ちのものがあるので、本体以外で専用で必要そうなものとして電池ボックスと透明のケースを購入。
![IMG_1486.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530369/a972dfef-a076-5cec-6d45-e76a836dd82b.jpeg)
![IMG_1487.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530369/69187b14-3949-f9b7-a721-6dfb88919502.jpeg)

電池は単４電池を２本使用。
電池ボックスのコネクタは一旦本体に差し込むと抜けなくなる模様。
ケースには基板の片側を先に入れ、反対側を爪にグッと押し込むと「カチッ！」と嵌ります。

<del>買ってすぐの状態では何もプログラムされていないようで、電池ボックスの電源をONにしても何も起きません。</del>
単に電池の方向を間違っていただけでした。購入時の状態では、ボタンとmicro:bitに内蔵のセンサー・LEDをテストするプログラムが入っています。
英語の指示がLEDの表示で流れてくるので、それに従ってボタンを押したり、振ったり・傾けたりといった感じでテストを行います。

まずはLEDを光らせるところからやってみようと思います。
#AWS ElasticBeanStalk サーバー への ssh 接続で Host key verification failed. ERROR: CommandError - An error occurred while running: ssh.

# エラー

- AWSに限らずよくあるフィンガープリント違うってやつ
- AWSで環境更新した後にIPアドレスは同じだけどサーバー自体は更新されているのでエラーが出るとか？



```
$ eb ssh
INFO: Attempting to open port 22.
INFO: SSH port 22 open.
INFO: Running ssh -i /Users/yumainaura/.ssh/pup.pem ec2-user@XXX.XXX.XXX.XXX
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Please contact your system administrator.
Add correct host key in /Users/yumainaura/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/yumainaura/.ssh/known_hosts:1
ECDSA host key for XXX.XXX.XXX.XXX has changed and you have requested strict checking.
Host key verification failed.
ERROR: CommandError - An error occurred while running: ssh.
```

# 対策

ローカル環境の known_hosts で該当のIPアドレスの行を消して保存する

```
$ vim ~/.ssh/known_hosts
```

# そんなサーバー知らねえよ！
俺達の関係はやり直しだ！って状態にする。

# やり直し

フィンガープリントあーゆーおーけー？って効かれるのでYES!YES!YESって応える

```
$ eb ssh
INFO: Attempting to open port 22.
INFO: SSH port 22 open.
INFO: Running ssh -i /Users/yumainaura/.ssh/pup.pem ec2-user@XXX.XXX.XXX.XXX
The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is SHA256:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'XXX.XXX.XXX.XXX' (ECDSA) to the list of known hosts.
Last login: Sat Nov  9 00:51:57 2019 from YYY.YYY.YYY.YYY
 _____ _           _   _      ____                       _        _ _
| ____| | __ _ ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
|  _| | |/ _` / __| __| |/ __|  _ \ / _ \/ _` | '_ \/ __| __/ _` | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
                                       Amazon Linux AMI

This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
[ec2-user@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]
```

# 怪しく光るAWSとフィンガープリントの世界へようこそ

指紋...つけた...?

![image](https://user-images.githubusercontent.com/13635059/68520031-1fec6900-02d8-11ea-9fc4-069431460063.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2690








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
プログラミングパラダイムとは

## はじめに


未来電子テクノロジーでインターンをしているmaesayaです。


プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

##主なプログラミングパラダイムの種類

プログラミングパラダイムは大きく分けて命令型、宣言型があり、
命令型には「手続き型」、宣言型には「関数型」「論理型」があります。

##命令型
C#、、C++、Java、Ruby、PHP、Python等があります。

##宣言型
SQL等があります。

##オブジェクト指向とは

何種類もの「モノ（object）」を用意して、それぞれの「モノ」や「モノができる役割」を表現していくやり方です。
これは同じようなモノを作りやすいので、大人数で開発するときに便利であると言えるでしょう。

##まとめ
プログラミングパラダイムには他にも様々なものがあります。プログラミング言語の勉強の選択する時は、それぞれのプログラミングパラダイムの特徴や言語の得意分野を把握してからやるようにしましょう。
Ubuntu18.04、CUDA10、cuDNN7のDocker Imageでcmakeを使う方法

## 記事の目的
仕事にてUbuntu16.04用に作成していたcmakeを使用するDockerfileが使用できず、色々と修正したのでそれの備忘録もかねて記載する。

## 前提環境
<b>Docker Image</b>
10.1-cudnn7-devel-ubuntu18.04

## Ubuntu18.04用のDocker Image使用時の注意点

Ubuntu 18.04用のDocker Imageを使用して、Dockerfileを回す際にタイムゾーンが聞かれることがある。
その際には以下の文字列をDockerfileの上のほうに記載をすることでタイムゾーンが聞かれることがなくなる。

```Dockerfile:Dockerfile
ENV TZ=Asia
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
```

## cmakeインストール時の注意

Ubuntu18.04、CUDA10系でcmakeを使用する際は、`apt-get install cmake`をしてしまうと3.10.Xがダウンロードされてしまい、
cmake時に `CUDA_cublas_device_LIBRARY`でエラーが吐かれてしまうので、以下の方法で回避する。

1. [CMakeダウンロードページ](https://cmake.org/download/)からshファイルのリンクをコピー
2. Dockerfileに以下を記載（今回はcmake-3.14.7-Linux-x86_64.shを使用）

```Dockerfile:Dockerfile
RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.7/cmake-3.14.7-Linux-x86_64.sh && chmod +x cmake-3.14.7-Linux-x86_64.sh
RUN echo y | ./cmake-3.14.7-Linux-x86_64.sh
RUN mv cmake-3.14.7-Linux-x86_64 /opt && echo y | ln -s /opt/cmake-3.14.7-Linux-x86_64/bin/* /usr/bin
```

## 参照
[Docker Hub](https://hub.docker.com/r/nvidia/cuda/)
[CMake Download](https://cmake.org/download/)
[Dockerfileタイムゾーン設定](https://serverfault.com/questions/683605/docker-container-time-timezone-will-not-reflect-changes)
NextJS で Route.push() が動作しない問題

## 各種バージョン

```config
"react": "^16.10.2",
"next": "^9.1.1",
"@zeit/next-css": "^1.0.1",
"@zeit/next-sass": "^1.0.1",
```

## 背景

[Issue](https://github.com/zeit/next.js/issues/9335)

こんな問題にぶつかった。

要するに `next/router` の提供する `Router` を用いた通常画面遷移ができないと言うもの。

Issueでも書いたように

```typescript
Router.push('/'); // not work
// Router.push({ pathname: '/' }); // not work
// router.push({ pathname: '/foo' }); // go to 404 page
// window.location.assign('/'); // work
// Router.push('/error', '/'); // work
```

と言う状態になる。
重要なのはこれがIssueに書いたような **tokenを用いた処理でなくても生じる** と言うこと。

どうやら、 `next-css` を 使うときに生じるらしい。

## 解決策

- 全てのファイルに `stylesheet` を設置する
- `pages/_app.tsx` に `stylesheet` を設置する

筆者は2つ目の方法で暫定的解決をした。

具体的には以下のようだ。

```typescript:_app.tsx
import * as React from 'react';

// {... import some modules}

/**
 * must import stylesheet here for some reason
 * [issue](https://github.com/zeit/next.js/issues/9335)
 */
import '../styles/style.scss';

```

## 考察

Nextが未だに持つ問題の1つで、暫定的対策として上記の解決策をする必要がありそう。
[Issue](https://github.com/zeit/next-plugins/issues/282)
#AWS で ElasticBeanStalk サーバーに ssh 接続するコマンドを確認するには awscli の eb ssh コマンドで INFO ログを見れば良いじゃない

 eb ssh コマンドのログで ssh コマンドがそのまま表示されるので、次回からそれを利用すれば良い

# eb ssh

```
$ eb ssh

INFO: Attempting to open port 22.
INFO: SSH port 22 open.
INFO: Running ssh -i /Users/yumainaura/.ssh/pup.pem ec2-user@XXX.XXX.XXX.XXX

Last login: Sat Nov  9 00:29:48 2019 from YYY.YYY.YYY.YYY
 _____ _           _   _      ____                       _        _ _
| ____| | __ _ ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
|  _| | |/ _` / __| __| |/ __|  _ \ / _ \/ _` | '_ \/ __| __/ _` | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
                                       Amazon Linux AMI

This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
```

# 野生のssh

```
$ ssh -i /Users/yumainaura/.ssh/pup.pem ec2-user@XXX.XXX.XXX.XXX

Last login: Sat Nov  9 00:31:18 2019 from YYY.YYY.YYY.YYY
 _____ _           _   _      ____                       _        _ _
| ____| | __ _ ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
|  _| | |/ _` / __| __| |/ __|  _ \ / _ \/ _` | '_ \/ __| __/ _` | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
                                       Amazon Linux AMI

This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2688








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Go言語でJSONデータを構造体への変換無しでネイティブに操作する

#概要

Go言語でJSON データを取り扱う場合、通常は「構造体にアンマーシャリング」→「構造体の状態で計算」→「JSONにマーシャリング」という個人的には面倒だと思われる操作をするのが基本。なので、構造体に都度都度変換するのではなく、JSONのまま処理変換を完結できるライブラリを使いたい、というのが動機。bitly の go-simplejson というライブラリがあるんだけど、Slice や Array の操作、検索には不十分だった(と思った)ので、そこらへんを強化すべく自分で機能を拡張して公開。その後、Matthias Schneider さんによりにフォーク＆HTMLなどのパース機能拡張が施された。今回は一番の発展形と思われるSchneiderさんの版を紹介する。


#利用方法

簡単ですが以下に記す。
### ライブラリをクローン

```
% go get github.com/mschneider82/go-simplejson
```

### Go言語の中でimport宣言
```
import (

"github.com/mschneider82/go-simplejson"

...

)
```


### APIリファレンス

以下URLを参照

・ https://godoc.org/github.com/mschneider82/go-simplejson


またリポジトリや検証用コードはこちら確認のこと。

・ https://github.com/mschneider82/go-simplejson

フォーク元となった自分が作成した分はこちら。個人的にはこんなリポジトリを「見つけてくれてありがとうございました！(c)井上小百合」としか言いようがない。

・ https://github.com/gdaisukesuzuki/go-simplejson

# 参考にしたサイト
・ https://github.com/bitly/go-simplejson
url短縮でお馴染みの bitly のGithub リポジトリ。今回紹介したGo言語によるJSON操作ライブラリも大元はここからフォークした。
・ https://qiita.com/TalesofFox/items/5c147a19a9ae5c41f41a
@TalesofFox さんによる、bitlyのgo-simplejson紹介ページ。自分もこのページでライブラリの存在を知った。
#AWS 初心者だけど ElasticBeanStalk で アプリケーションと環境を作成してみる

# Console

![image](https://user-images.githubusercontent.com/13635059/68518540-b36d6c00-02cf-11ea-91ec-40ed0424113a.png)

# 新しいアプリケーションを作成

![image](https://user-images.githubusercontent.com/13635059/68518643-35f62b80-02d0-11ea-9115-2b44a73ca3bb.png)


# 環境を作成

アプリケーションが環境を持つという構成っぽい。

![image](https://user-images.githubusercontent.com/13635059/68518570-dd269300-02cf-11ea-96b0-d59e71ca0bed.png)

node プラットフォームを選んで環境を作ってみる

![image](https://user-images.githubusercontent.com/13635059/68518588-f0d1f980-02cf-11ea-84b8-f1651e50a82c.png)

# 作成中

![image](https://user-images.githubusercontent.com/13635059/68518624-1101b880-02d0-11ea-91a8-081997df68b0.png)

# アプリケーションと環境の関係

アプリケーションが環境を持つというより、アプリケーションを環境にデプロイするということっぽい。

なるほど、僕らがよく知っている構成じゃないか。

![image](https://user-images.githubusercontent.com/13635059/68518726-96856880-02d0-11ea-9acc-ca243ae3de80.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2687








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
dbpediaの研究 その23

#概要

dbpediaが難解なので、手出してみる。
c#で、取得してみた。

#サンプルコード

```
public class Hello {
    public static void Main() {
        string url = "http://ja.dbpedia.org/sparql";
        System.Net.WebClient wc = new System.Net.WebClient();
        System.Collections.Specialized.NameValueCollection ps = new System.Collections.Specialized.NameValueCollection();
        ps.Add("query", "SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}");
        byte[] resData = wc.UploadValues(url, ps);
        wc.Dispose();
        string resText = System.Text.Encoding.UTF8.GetString(resData);
        System.Console.WriteLine(resText);
        System.Console.WriteLine("Hello C#");
    }
}
```

#成果物

https://paiza.io/projects/CFao5m4qT2fueQcyYNhX4Q

以上。
dbpediaの研究 その22

#概要

dbpediaが難解なので、手出してみる。
vb.netで、取得してみた。

#サンプルコード

```
imports system.net
imports System.Text
imports System.io

public class compiler
  shared function Main as integer
    Dim url As String = "http://ja.dbpedia.org/sparql"
    Dim wc As New System.Net.WebClient
    Dim ps As New System.Collections.Specialized.NameValueCollection    
    ps.Add("query", "SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}")
    Dim resData As Byte() = wc.UploadValues(url, ps)
    wc.Dispose()
    Dim resText As String = System.Text.Encoding.UTF8.GetString(resData)
    Console.WriteLine(resText)
    Console.WriteLine ("XXXXXXXX")
    return 0
  End function
end class
```

#成果物

https://paiza.io/projects/9aoaaQK7EhIXBhEZDlMIZw

以上。
有機ＥＬキャラクタディスプレイ SO1602 操作用Pythonライブラリを AdaFruit 仕様で実装(Raspberry Pi 向け)

#概要

秋月電子などから販売されている、SO1602有機ELキャラクタディスプレイ(16文字×2列)はキャラクタ表示に便利だし、Arduino や RaspberryPi などで動作させるための実装は、C言語やPythonそれなりにある。それでも、BME280などのI2C経由で操作するセンサーと組み合わせるときには、Adafruit が提供している、CircuitPython のお作法に則って記述するのが見た目統一されている気がする。
なので、SO1602向けに必要なライブラリをCircuitPython風というかAdafruit風に書いて公開してみた。

#SO1602の製品情報
秋月電子さんのHPなどに、SO1602を用いたディプレイモジュールの製品やデータシートなどが記載されている。
・ http://akizukidenshi.com/catalog/goods/search.aspx?search=x&keyword=%97L%8B%40%82d%82k%83L%83%83%83%89%83N%83%5E%83f%83B%83X%83v%83%8C%83C%83%82%83W%83%85%81%5B%83%8B%81%40%82P%82U%81%7E%82Q%8Ds&image=%8C%9F%8D%F5

#利用方法
### ライブラリをクローン

まずは、SO1602 のライブラリをクローンする（名前をAdafruit っぽくしてるが、見た目揃えただけでAdafruit社とは無関係）

```
% git clone -b v0.1 https://github.com/gdaisukesuzuki/Adafruit_CircuitPython_SO1602
% cd Adafruit_CircuitPython_SO1602
```

### インストール
```
% python3 setup.py build
% python3 setup.py install
```

自分の個人的趣味だが、自分はこんな風にビルド＆実装してる。

```
% python3 setup.py bdist_wheel
% sudo pip3 install dist/adafruit_circuitpython_so1602-0.1-py3-none-any.whl -U -V 
```

### 動作確認

python3 の動作確認はこんな感じ。カタカナも表示可能。

```
import time

import board
import busio

import adafruit_so1602

# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
SO1602 = adafruit_so1602.Adafruit_SO1602_I2C(i2c)

SO1602.writeLine(str="SO1602ナンダヨ!",line=0,align="left")
SO1602.writeLine(str="ΩΩΩ<ナ、ナンダッテー!?",line=1,align="left")

```

### 簡単ですが、メソッドの紹介を

初期化含め動作は CircuitPython っぽくしている。

```
SO1602 = adafruit_so1602.Adafruit_SO1602_I2C(i2c)
```

初期化の際に、以下のようにスレーブアドレスを別に設定したりカーソル表示や点滅の有無を設定することも可能。

```
SO1602 = adafruit_so1602.Adafruit_SO1602_I2C(i2c=i2c, address=0x3c, cursor = True, blink = False)
```

文字列表示させる場合、　"line"で表示行(0 or 1)、"align"で左右詰めを設定。

```
SO1602.writeLine(str="SO1602ナンダヨ!",line=0,align="right")

```

そのほかメソッドは以下のとおり

```
SO1602.displayOn(cursor = True/False, blink = True/False) #ディスプレイOn
SO1602.displayOff()                                       #ディスプレイOff
SO1602.displayClear()                                     #ディプレイを全消去
SO1602.returnHome()                                       #カーソルをホームに
```


# 注意すること
・ 秋月電子からは、SO1602の他にも「XX1602シリーズ」と言うべき、様々なLCDなどのキャラクタディプレイを販売している(SC1602、AQM1602、ACM1602等)。動作検証はしてないが、I2C接続ならスレーブアドレスの設定を変更すれば動くかもしれない。
・SO1602は有機ELなので消費電力が結構大きい(50mA)。そのためなのか? 他I2C接続センサと直列に繋げると、動作不安定になる。なので、そのような使い方をする場合「PCA9306」「PCA9515AD」などを、 I2C バスのリピーターのような形として間に挟むべき。

# 参考にしたサイト
・ https://github.com/YoutechA320U/RaspberryPi_Python_so1602_lib
@YoutechA320U さん(qiita にアカウントはなさそう・・・)の GitHub 。大いに参考した（つうか基本部分はほぼここのパクリ）
・https://qiita.com/uhey22e/items/14d3e1d95d6ddc90fb2c
@uhey22e さんによる解説。こちらも大いに参考になった。SO1602操作の際のコマンドがほぼ網羅されている。
・ https://www.denshi.club/pc/raspi/raspberry-pilcd.html
電子工作推進プロジェクトさんのブログ（レジスタ操作の参考に。データシート見ればよいけどが、必要な箇所を早くつまみ食いするため）
・ http://akizukidenshi.com/catalog/g/gP-08277/
自分が動作検証に使用した有機ELモジュールの製品紹介(秋月電子)

# GitHub
・https://github.com/gdaisukesuzuki/Adafruit_CircuitPython_SO1602
dbpediaの研究 その21

#概要

dbpediaが難解なので、手出してみる。
python3で、取得してみた。

#サンプルコード

```
import json
import urllib.request

url = 'http://ja.dbpedia.org/sparql'
data = {
    "query": "SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}",
}
headers = {
    #'Accept': 'application/sparql-results+json',
    'Content-Type': 'application/x-www-form-urlencoded',
}
req = urllib.request.Request(url, urllib.parse.urlencode(data).encode('ascii'), headers, method='POST')
with urllib.request.urlopen(req) as res:
    body = res.read()
print (body.decode('UTF-8'))


```

#成果物

https://paiza.io/projects/psgoopgZrAHcT3D5497_gg

以上。
dbpediaの研究 その20

#概要

dbpediaが難解なので、手出してみる。
python2で、取得してみた。

#サンプルコード

```
import urllib
import urllib2

url = "http://ja.dbpedia.org/sparql"
params = {
    "query": "SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}"
}
params = urllib.urlencode(params)
req = urllib2.Request(url)
#req.add_header('Accept', 'application/sparql-results+json')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
req.add_data(params)
res = urllib2.urlopen(req)
r = res.read()
print r
```

#成果物

https://paiza.io/projects/6TlUuPyTTsGFbeIQj5P9HQ

以上。
Git操作まとめ 〜Gitのインストールとセットアップ

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。

## Gitのインストール
Gitを使うには、インストールする必要があります。

- インストール用のコマンド

```shell
sudo apt-get install git
```

- Gitがインストールされたかどうかの確認

```shell
dpkg -l git
```

---
## 初期設定
Gitを使用する前に、使用者の名前とメールアドレスを登録しておくと便利です。
Gitの設定項目は、HOMEディレクトリの隠しファイル'.gitconfig'に保存されます。

Gitをインストール後、設定を行っていない場合は、隠しファイル'.gitconfig'はまだ作成されていないはずです。
確認したい方は、以下のコマンドか、Nautilusの"隠しファイルを表示する"にチェックを入れて確認することができます。

また、.gitconfigが作成されたあとであれば、そのファイルをテキストエディタで開いて編集することも可能です。

```shell
ls -la
```

### 名前、メールアドレスの登録

```shell:名前の登録
git config --global user.name "(あなたの名前)"
```
```shell:メールアドレスの登録
git config --global user.email "(あなたのアドレス)"
```

上記のコマンドで、名前とメールアドレスを登録することができます。
登録ができたかどうかを確認してみます。

```shell:確認用コマンド
git config -l
```
```shell:実行結果
user.name=xxxxxx(あなたの名前)
user.email=xxxxxxxx@gmail.com(あなたのアドレス)
```

この表示が確認できれば、お使いのPCでGitを操作した時にその名前とアドレスが登録されるようになります。

### Gitメッセージの色分け
ターミナルでGitの作業をしているとき、文字色が単一だと見づらいことがあります。
なので、メッセージの色分けもしておくと作業がはかどります。
設定は以下のコマンドで行なえます。

```shell
git config --global color.ui true
```

Gitの設定は他にもたくさんありますが、Gitを始めたばかりのときは、このくらいの設定から始めて、必要に応じて追加していけばいいかと思います。
Gitの設定についてまとめた記事もありますので、そちらも見てみてください。
[Git操作まとめ 〜Gitをターミナルで使う場合の設定(git config)](https://qiita.com/tsweblabo/items/918cbed88f00215c4800)

---

### 本記事目次ページ
[Git操作まとめ](https://qiita.com/tsweblabo/items/6aec9d022c08954f5024)
dbpediaの研究 その19

#概要

dbpediaが難解なので、手出してみる。
curlで、取得してみた。

#サンプルコード


```
curl --data-urlencode 'query=SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}' http://ja.dbpedia.org/sparql  1>log.json 2>/dev/null

cat log.json

```

#成果物

https://paiza.io/projects/EFwYnqFqthjwI6XfAIS-YQ

以上。
【Logstash】UiPathログ用grokパターンを勝手に解説

以前投稿した[【UiPath】ロボット稼働率を見える化する（Orchestrator無し）](https://qiita.com/UmegayaRollcake/items/2dfd681a84e1c0cfce4d)の続編です。

ExcelじゃなくElastic Search + Kibanaでカッコ良くログ可視化しようと思い、宮一 良彦さんというスゴい方の[Medium記事](https://medium.com/@miyaichi/%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%92logstash%E3%81%A7%E9%9B%86%E3%82%81%E3%82%8B-82f79591dc8)を参考にさせていただいたのですが、ES初心者の自分にはLogstashのfilter周りの設定（特にgrok filter）を理解するのに時間がかかりました。

色々調べてようやく理解できたので、同じように悩まれてるES初心者の方の参考になると思い、失礼と知りながら補足解説させていただきます。

解説対象、設定引用元＞
[ロボットのログをLogstashで集める](https://medium.com/@miyaichi/%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%92logstash%E3%81%A7%E9%9B%86%E3%82%81%E3%82%8B-82f79591dc8) > 設定 > logstash.conf のfilterパート

# filterでやっている事のざっくり解説
まずUiPathの実行ログ１行は
`①15:19:44.0976 ②Info ③{"message":"XXXX の実行が開始しました","level":"Information",...}`

- ①タイムスタンプ（ただし時分秒のみ）
- ②ログレベル（Info/Error/...）
- ③ログメッセージやタイムスタンプ、マシン名などの詳細情報の詰まったJson

のように大きく3ブロックで構成されているので、それぞれをfield1, field2, field3という変数に分解しています。
ここのmatchパターン
`match => { "message" => "(?<field1>(\S+)) (?<field2>(\S+)) (?<field3>(.+))" }`
は次の章で解説します。

そして分解した③のfield3をJsonパースしてESに渡し、後はJson中のタイムスタンプのフォーマット指定やタイムゾーン指定をしたり、ESに送り込む必要が無いField(message, field1, field2, field3, path)を除去しています。

# grokのmatchパターン解説
`match => { "message" => "(?<field1>(\S+)) (?<field2>(\S+)) (?<field3>(.+))" }`
を解説します。

[ES公式 : Grok filter plugin](https://www.elastic.co/guide/en/logstash/6.6/plugins-filters-grok.html) > Custom Patterns によると
`(?<field_name>pattern)`
と定義すれば元のmessageのうちpatternに合致した部分をfield_nameに格納してくれる、と。
じゃあpatternである`\S+`とか`.+`って何なの？となる。

[Regular Expressions (Regex)](https://www.ntu.edu.sg/home/ehchua/programming/howto/Regexe.html) を参照

1. まず`\s`は半角スペース、改行、タブ、改ページ( \n\r\t\f)いずれか１文字を指す
2. `\S` 大文字反転で逆の意味→半角スペース、改行、タブ、改ページでない１文字
3.  `\S+` +は１文字以上の繰り返し→半角スペース、改行、タブ、改ページを含まない文字列

となる。
`.`は"改行でない１文字"を指すので、同様に`.+`は"改行を含まない文字列"になる。

field1, field2が`\S+`で、field3だけ`.+`なのは、field3の対象となるJsonの中に半角スペース等が入ってくる事を想定されているのだと思います。（ユーザーがLog Messageアクティビティで出力したメッセージも入ってくるので）

こうしてログ①②③それぞれのブロックを都合よく取り出せるという事です。う～ん、なるほど。

ちなみにApacheのログなど、よく世の中で使われるpattenはデフォルトで定義されているし、自前で新規patternを定義して名前を付ける事もできます。
参考 > [Grok patterns](https://streamsets.com/documentation/datacollector/latest/help/datacollector/UserGuide/Apx-GrokPatterns/GrokPatterns_title.html)

# Logstash結果
設定の意味が理解できたので、上記Medium記事に従ってLogstash経由でESにフォルダに溜まったログををまとめて送り込んでみました。

Indexが作成され、Json内の各Fieldが反映されています。
![Index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/fcfefa3d-713b-dfd5-9ac3-57dd8b98809a.png)

Discovery画面でレコード(Document)の存在も確認できたので、ようやく可視化の準備が整いました。
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/78b17cc1-1d28-fbab-b746-81f22dea3b5a.png)


---
今回はここまで。
思い通りにESにデータを入れてくには正規表現の理解が大事って事がわかりました。

ちなみに可視化・効果測定という意味ではForward IIIで見た[UiPath Insights](https://www.uipath.com/ja/product/rpa-insights)を非常に期待しており、サービスとしてReadyになったら会社でぜひ検証したいと思います。
Mac の /tmp ディレクトリで AWS の eb init で エラーが ( Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization )

# /tmp で

```
$ eb init
Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
```

これは動く

```
$ eb init --interactive

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) ap-east-1 : Asia Pacific (Hong Kong)
20) me-south-1 : Middle East (Bahrain)
(default is 3):
```

# ~/tmp

だと普通に動く

# /tmp

Mac のこのディレクトリはいろいろとなんだかおかしい気がするが？

```
$ ls -la /tmp
lrwxr-xr-x@ 1 root  admin  11 Oct  9 19:25 /tmp@ -> private/tmp
```

[Where’s the Temp Folder on Mac OS? How to Find & Open the Mac Temporary Directory](http://osxdaily.com/2018/08/17/where-temp-folder-mac-access/)

なんなんだろうな

まあ権限問題だろう

root admin のものっぽいし

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2685








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[GAS]スクリプトからトリガーをセットする話

# スクリプトからトリガーをセットする話(事業台帳ベストプラクティス)
スクリプトからトリガーをセットしたい場合ってありますよね。
まぁ、Qiitaとかにも載ってると思うんですが、さらっとまとめておきました。

## サンプルコード

```javascript
// スプレッドシートkey
var book = SpreadsheetApp.openById("<spreadshet_key>");
var sheet = book.getSheetByName("<sheet_name>");

// フォームkey
var form = FormApp.openById("<form_key>");

function setTrigger(){
  // 実行者が持っているこのスクリプトでのトリガーを全削除
  var allTriggers = ScriptApp.getProjectTriggers();
  for( var i = 0; i < allTriggers.length; ++i ){
    ScriptApp.deleteTrigger(allTriggers[i]);
  }//for_i

  // これを実行している人のメールアドレス
  var email = Session.getActiveUser().getEmail();
  if( email === "<mail_address>"){
    // 正常処理
    // Slackにでも投げておこう
    send_slack("トリガーセットしたよ～");
  }else{
    // 異常検知処理
    // slackにでも投げておこう
    send_slack(email+"がトリガー欲しいってさ。断ったけどね。");
    return ;
  }//if

  // スプレッドシートが開かれたとき
  ScriptApp
  .newTrigger("<function_name>")
  .forSpreadsheet(lib.bookForms)
  .onOpen()
  .create();

  // フォーム送信時
  ScriptApp
  .newTrigger("<function_name>")
  .forForm(form)
  .onFormSubmit()
  .create();

  //夜1時に作動
  ScriptApp
  .newTrigger("<function_name>")
  .timeBased()
  .atHour(1)
  .everyDays(1)
  .create();

  //毎週日曜_9:00
  ScriptApp
  .newTrigger("<function_name>")
  .timeBased()
  .atHour(9)
  .everyWeeks(1)
  .onWeekDay(ScriptApp.WeekDay.SUNDAY)
  .create();

  return ;
}//func_setTrigger
```

## スクリプトで設定した経緯
事業台帳時には、1つのスクリプトで10個弱のトリガーを保有するという鬼のようなことをしておりまして、
- 手動で設定するのはめんどくさい  
- 手動で設定すると絶対間違える
- なにより、スクリプトが重いかつ複雑すぎてエラーでトリガーが度々吹っ飛ぶ

という理由から、スクリプトで行っておりました。

### onFormSubmit や onOpenを使わない理由
`onFormSubmit`や`onOpen`という関数名にして、[Simple Trigger](https://developers.google.com/apps-script/guides/triggers/)を設定するという方法がありますし、使える状況であればこちらを使うことを推奨します。
ですが、事業台帳時代にいつのタイミングかわからないですが、`onOpen`がうんともすんとも言わなくなってしまった・・・という悲しい過去があります。
`onFormSubmit`もフォームをいっぱいつなぎこんだりしていたせいなのか・・・うまく動作せず、営業活動を一時的にストップさせてしまったりしました。
これがトラウマで、スクリプトで明示的に一つひとつ設定するのを習慣にしています。

### トリガーを削除できる
トリガーを削除できるというのも実は一つ大きなポイントでした。
手動で付けると、他の人がトリガー設定したときにわけわかんなくなちゃったり、ちょっと実行時間変えよ～と思ったとき関数探してー・・・みたいなことをしなくてはいけないので。

- トリガー設定ダブリを防ぐ
- 付与してはいけない人に付与しない(そして勝手に持ってたら削除するため)
- 後々の運用の手間を減らす

という理由でトリガー削除と特定の人のみの付与を行っていました。

## 参考
[Class TriggerBuilder](https://developers.google.com/apps-script/reference/script/trigger-builder)
[Class SpreadsheetTriggerBuilder](https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder)
[Class FormTriggerBuilder](https://developers.google.com/apps-script/reference/script/form-trigger-builder)
[Class ClockTriggerBuilder](https://developers.google.com/apps-script/reference/script/clock-trigger-builder)
JavaScript初歩知識3 アラート確認&flag

# アラート確認&flag
- 今回はアラート確認とflagを使った処理をまとめました。
## ポップアップウィンドウの表示

- アラート表示

```js
    alert(表示するもの);
            "文字列" ex) alert("おはよう");//ダイレクトに入力した時
            "変数名" ex) alert(cnt);//変数の中の値が表示される
            "文字列"+変数名 ex) alert("cnt="+cnt)//jsで+は文字列を連結するときに使う
```
- JavaScriptの間違えやすいところ

```js
    a=1;
    b=4;
    c=a+b
    ___
    alert("a+b="+a+b); // +が連結とみなされるため、(14)となってしまう
    alert("a+b="+(a+b)); // 5

```
___
## flagを立ててボタンを制御する

```js
    // グローバル変数定義
// html文書がロードされた瞬間に実行される
//変数の定義しかかけないエリア
alert("グローバル変数の定義");
var val;
val flag = 0;//ボタンが押されたあとに効かなくする※flag(フラグ)を立てる。最初は0を代入。


// オンロードイベント
// <body>に指定された各エレメントが表示され準備が整ったら実行される
window.onload = function (){

	alert("オンロードイベントが起きました");
	for(var i = 0; i < 2; i++){//jsの変数には$は記述しない
		document.getElementById("tx" + (i + 1)).value = "";
	}
}

function f1(){//ここはプログラムをコピーする項目で1番目のボタンの処理
	if(flag == 1) return;//return命令のあとに数を記述しなくても良い。flagが0ならあとの処理を行い、1ならばあとの処理をしない。
	flag = 1;//ボタンを押すとflagが1になる。
	val = document.getElementById("tx1").value;//tx1の中身がvalに代入
	document.getElementById("tx2").value = val;//tx2がvalに代入
	document.getElementById("b1").value = "押さないで";//b1ボタンに押さないで
	document.getElementById("b2").style.left = "300px";//文字数が変化するので隣のボタンとぶつからないように
	alert("テキストボックスの内容がコピーされました。");
}

function f2(){//コメント内は簡略化した記述方法
	document.getElementById("tx1").style.color = "orange";
	document.getElementById("tx2").style.color = "purple";
	document.getElementById("tx1").style.left = "200px";
	document.getElementById("tx2").style.top = "120px";
}
```
## 別の記述方法(for文を使わない)

```js
    // グローバル変数定義
// html文書がロードされた瞬間に実行される
//変数の定義しかかけないエリア
alert("グローバル変数の定義");
var val;
var flag = 0;//ボタンが押されたあとに効かなくする※flag(フラグ)を立てる。最初は0を代入。
var t1,t2;


// オンロードイベント
// <body>に指定された各エレメントが表示され準備が整ったら実行される
window.onload = function (){

	alert("オンロードイベントが起きました");

	t1 = document.getElementById("tx1");
	t2 = document.getElementById("tx2");
	t1.value = "";
	t2.value = "";
}

function f1(){//ここはプログラムをコピーする項目で1番目のボタンの処理
	if(flag == 1) return;//return命令のあとに数を記述しなくても良い。flagが0ならあとの処理を行い、1ならばあとの処理をしない。
	flag = 1;//ボタンを押すとflagが1になる。
	val = t1.value;//tx1の中身がvalに代入
	t2.value = val;
	document.getElementById("b1").value = "押さないで";//b1ボタンに押さないで
	document.getElementById("b2").style.left = "300px";//文字数が変化するので隣のボタンとぶつからないように
	alert("テキストボックスの内容がコピーされました。");
}

function f2(){//コメント内は簡略化した記述方法
	var t1 = document.getElementById("tx1");
	var t2 = document.getElementById("tx2");
	t1.style.color = "orange";
	t2.style.color = "purple";
	t1.style.top = "120px";
	t2.style.left = "200px";
}
```
python  で #AWS の eb CLI コマンドを使うには pip install awsebcli -> そして eb init してみる

pip install eb ではないっぽい

[awsebcli · PyPI](https://pypi.org/project/awsebcli/)

# 設定してみる

`eb init`

# リージョンを選ぶ

自分のAWSコンソールにログインすると、URLになぜか us-east-2 オハイオが選ばれているので、てきとうにそちらを選んでみる

他のリージョンを選んでも良いかもしれないが、とりあえず

https://us-east-2.console.aws.amazon.com/console/home?region=us-east-2#

```
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) ap-east-1 : Asia Pacific (Hong Kong)
20) me-south-1 : Middle East (Bahrain)
(default is 3): 14
```

# SECRET と ID を入力

# アプリケーション名を入力


```
Enter Application Name
(default is "tmp"):
```
デフォルトがローカルのカレントディレクリメイになってるが、特に深い意味はないはず、好きなものを入力する

# iam のエラーが発生

このSECRET/IDの組み合わせは、他のAWSサービスにだけ権限を絞った設定にしておいたので、権限エラーが起こったようだ

```
ERROR: NotAuthorizedError - Operation Denied. User: arn:aws:iam::842696858454:user/sqs is not authorized to perform: elasticbeanstalk:CreateApplication on resource: arn:aws:elasticbeanstalk:us-east-2:842696858454:application/tmp
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2684








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[SQL][Treasure Data][Presto] メールアドレスのバリデーションをSQLでかける。

## そもそも
Invalid e-mail addressエラーという悲しいエラーがMarketoで吐かれている。
つまり、私たちは、打ち間違え諸々に対して、正規表現を用いて

- 省いたり
- すげかえたり

してあげねばならない。

## というわけで
わかりやすさのために、除外すべきものを抽出する形でクエリを書いていく。

### 前処理
テーブルの想定は、

- contacts TBL
    - id: PK
    - type_id: type of contact information
    - contact: telno, email, etc

```.sql
with
  emails as(
    select
      contacts.id as id
      , regexp_replace(contacts.contact,' |　|\s|\t','') as contact
    from
      contacts
    where
      contasts.type_id = 5 -- email
  )

```
空白系を片っ端から消しておく。

### 入門編 - like -
まぁ、難しいこともできるが、たいがいのやつはこいつで省ける。

```.sql
select
  *
from
  emails
where
  not emails.contact LIKE '%_@__%.__%'
```

- @前に文字がある
- @入ってる
- @の後に文字がある
    - そんで . がある
    - .で終わってない

### 入門編 - regexp_like - 
Treasure Dataはなんてったって、この関数がよい。
like も悪くはないんだけど、もう少しカスタマイズしたくなることあるよね。

```.sql
select
    *
from
  emails
where
  not regexp_like( emails.contact, '.+@.+\..+')
```

要件は、likeと同じ。

### 確認編 - full outer join -
どちらも同じレコードが抽出できていることを確認しよう。

```.sql
with
  emails as(
    select
      contacts.id as id
      , regexp_replace(contacts.contact,' |　|\s|\t','') as contact
    from
      contacts
    where
      contasts.type_id = 5 -- email
  )
  , cte_like as (
    select
      emails.id as id
      , emails.contact as contact
    from
      emails
    where
      not emails.contact LIKE '%_@__%.__%'
  )
  , cte_regexp as (
    select
      emails.id as id
      , emails.contact as contact
    from
      emails
    where
      not regexp_like( emails.contact, '.+@.+\..+')
  )

select
  cte_like.contact
  , cte_regexp.*
from
  cte_like
  full outer join
    cte_regexp
    on cte_like.id = cte_regexp.id
where
  cte_like.id is null
  or cte_regexp.id is null
```

人生初のfull outer joinに挑戦だ。
full outer joinなんてもののありがたみをここで初めて知るだろう。

### 中級編 - ちょっと分かる人用 -
はい、かっこよくできました。

```.sql
select
  emails.id as id
  , emails.contact as contact
from
  emails
where
  not regexp_like(emails.contact, '^[a-zA-Z0-9.!#$%&*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+$')
```

## まとめ
入門編で十分いける。
そして、そもそもSQLでバリデーションすることはオススメの方法ではない。
見直すべきところは別にある。

そして、上記があっているかどうか、保証はできない。
少なくとも、私の環境で目検はした、くらいのもの。

## 参考
- [stack overfolw - Sql script to find invalid email addresses](https://stackoverflow.com/questions/801166/sql-script-to-find-invalid-email-addresses)
- [Email Address Regular Expression That 99.99% Works. Disagree?](https://emailregex.com/)
    - ほぼ参考にしたけど、一部、
        - SQLで動きやすいよう
        - 最後が . で終わらないよう
    - ちょっとだけ書き換えた
AWS での多エレメント認証 (MFA) の使用

#はじめに
セキュリティ対策はいつでもどこでも十分対応する必要があります。
特に重要な情報管理ではID/PWでログインだけは危ないと思われます。

ID、PWの強度設計は強化するほか、多エレメント認証 (MFA) の使用でリスクを低減できます。

#MFAとは
MFAはMulti-Factor Authenticationです。「多要素認証」、「多エレメント認証」など
よくある「二段階認証」もMFAの一種です。

#MFAの種類
- 仮想 MFA デバイス
電話やその他のデバイスで動作し、物理デバイスをエミュレートするソフトウェアアプリケーションです。時間同期されるワンタイムパスワードアルゴリズムに基づいて 6 桁の数値コードを生成します。
たとえばGoogleの認証システムアプリケーションです。

- U2F セキュリティキー
コンピュータの USB ポートに接続するデバイスです。

- ハードウェア MFA デバイス
専用デバイスで時間同期されるワンタイムパスワードアルゴリズムに基づいて 6 桁の数値コードを生成します。

- SMS テキストメッセージベース MFA
電話のメッセージに６桁のコードを送信します。Facebookなど導入しているサービスが多いです。

#AWSとGoogleの認証システムの連携例
##セキュリティ認証情報から設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/5cfbdfdf-0e46-c3a0-cce7-e50cfc413909.png)

##MFAの有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/76e03718-586d-fd2b-69c4-0eba0f52339c.png)

#仮想MFAデバイスを選択してGoogleの認証システムアプリからQRコードをスキャン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/178ea0ba-2677-40a4-6721-27bd87f1ec5c.png)

##二つのコードを入力したら連携完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/7b34899d-ba3a-33de-85e7-11378155f403.png)

##Google認証システムのコード生成イメージ
![Screenshot_20191109_104442_com.google.android.apps.authenticator2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/d65d66a3-1c99-c79a-eb37-a587d38b3b62.jpeg)

##ログインしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/78d7c494-e6e9-73b0-02fe-5d6af884a130.png)

これでID/PWだけではログインできません。最悪ID/PW漏洩でも被害を避けられます。
※MFA導入してもPWの定期変更をしたほうが良いと思います。

以上
VPN接続によるグローバルIP付与サービスが利用できない時の確認事項（Ubuntu）

# 確認事項
 - WindowsPC等別のPCからPPTP接続が可能であること
  - この時点で接続できない場合は「***ルーターの設定***」および「***プロバイダーの提供サービス***」も確認する必要がある

# 目次
 1. 問題発生の経緯
 2. 利用端末・ツール
 3. 問題個所の解説
 4. 用語整理
 5. 参考サイト

# 問題発生の経緯
 - 目的：外部ネットワークからRaspberry Pi3 にアクセスし、同一LAN内に設置したWindowsPCの電源を入れる
 - 方法：グローバルIPを付与して、Raspberry Pi3 にSSH接続可能な状態にして、wakeonlanコマンドにてWindowsPCの電源を入れる
 - 問題：「マイIP」（PPTP）にてRasbperry Pi3へグローバルIP付与を試みるが、VPNサーバへの接続ができない

# 契約状況（[こちら](http://kiriwake.jpne.co.jp/)から確認可能）
  - [v6プラス](https://www.jpne.co.jp/service/v6plus/) を利用しているプロバイダーと契約している（ドコモ光 GMOとくとくBB等）

# 利用端末・ツール
 - 対象PC
  - Raspberry Pi3
  - OS：Ubuntu 18.04 LTS
  - PPTPクライアントツール：pptp-linux または mpd5（インターリンク社 提供のツールに同梱）
 - 検証用PC
  - OS：Windows 10 Pro
  - PPTPクライアントツール：標準搭載のツール（「VPNの設定」から設定可能）

# 問題個所の説明
- v6プラス（IPoEサービス）の場合、***IPv4アドレスがGNATされている***
- GNATされている場合、グローバルIPアドレスが割り当てられず、PPTP接続ができない

# 用語整理
- [IPoE](https://www.ntt.com/business/services/network/internet-connect/ocn-business/ftth/know.html)：IP over Ethernet、IPv6アドレス空間で接続事業者（VNE）を介してインターネットに接続する。
- GNAT：？？？
- V6プラスで主流のトンネリングの方式：MAP-E / DS-Lite / 464XLAT
- JPNE：日本ネットワークイネイブラー株式会社、「v6プラス」の提供事業者

# 参考サイト
- https://bike8615.blogspot.com/2017/11/v6_20.html
- https://digifla.net/ipv6plus/
golangでの自分のためのお作法まとめ

# 命名規則
 - 基本的には、[Effective Go](https://golang.org/doc/effective_go.html#names)に則り記載する。
 - 変数やメソッド名は基本的にキャメル・パスカルケースにする。
 - ファイル名についてはスネークケースにする。

# error handling
 - 基本的には、[go blog](https://blog.golang.org/error-handling-and-go)

## 参考サイト
[ゼロ値を使おう #golang](https://qiita.com/tenntenn/items/c55095585af64ca28ab5)
[プログラミング言語の命名ルールとgolangにおける傾向について](http://xblood.hatenablog.com/entry/2019/01/28/213223)
[Goのtestを理解する in 2019](https://budougumi0617.github.io/2019/10/30/go-testing2019/)