OmniAICreator/Qiita-1.07M huggingface dataset:
元号APIの使い方

##元号APIの利用方法
現在テスト運用期間中の為、一定リクエストまでの制限を条件に申請いただかなくともご利用いただけます。
正式サービス時には、サービスへの登録と個別APIキーする利用方法、一定以上のリクエストについては有料での提供にサービス提供形式を変更いたしますので予めご了承ください。

[元号APIリファレンス](https://gengoh.jp/api.html)

##リクエスト
###リクエストURI
```
GET https://gengoh.jp/api/
```
###リクエストサンプル
```
GET https://gengoh.jp/api/?api_key=5olMN1cWPLIFtdWnsogHzwX3KBZ3rjfj&bgn=1868-01-01&format=1&sort=1
```
##パラメーター
|No |パラメーター名 |概要 |必須 |型(桁数) |初期値 |備考 |
|---|---|---|---|---|---|---|
|1 |api_key |認証キー |必須 |文字列(32桁) |- |テスト運用中は「bdd3pmjyc8jbsgnrt9mpjr3xyza7kjff」|
|2 |bgn |西暦 始期 | |数字(1~4桁) |1939 |
|3 |end |西暦 終期 | |数字(1~4桁) |2019 |
|4 |text |元号検索 | |文字列 | |元号検索では、始期と終期指定は無効となります。
|5 |format |出力形式 | |数字 |1 |※出力形式参照
|6 |sort |ソート | |数字 |1 |昇1.昇順 / 2.降順
|7 |fy |元年表示 | |数字 |1 |1.元年 / 2.1年
|8 |unicode |unicode変換 | |数字 |1 |1.変換する / 2.変換しない
|9 |output |出力形式 | |文字列 |json |昇json(初期値) / jsonp
10 |extend |元号延長 | |数字 |0 | 2の場合は2年延長、平成31年、平成32年、新元号2年、新元号3年|

##レスポンス
元号情報は、西暦645年の大化から、平成（2019年に改元される新年号は確定次第登録します）までの元号を、「始期」「終期」で指定された範囲で返却します。
レスポンスで返却されるデータのフォーマットは、「JSON」形式となります（フォーマットは出力例を参照）。
登録された西暦情報はユリウス暦とグレゴリオ暦（1873年1月1日に施行）が混在しているため、1872年（明治5年）までは、西暦年と完全には一致しません。
情報がおかしいとき等は、お気軽にお申し付けください。
改元する年が年の途中の場合、その年改元する前の元号の最終年と、新しい元号の元年が元号を返却します。

###出力値情報
|パラメーター名 |概要 |型 |備考|
|---|---|---|---|
|status |ステータ |配列 |出力情報|
|　code |ステータスコード |数値 |正常: 200/その他エラー|
|　message |メッセージ |文字列 ||
|result |リザルト |配列 |年別情報|
|　keys |1.西暦/2.連番/3.4.元号 |配列 ||
|　　gengoh |元号 |文字列 ||
|　　gengoh_text |元号文字列 |文字列 ||
|　　gengoh_nen |元号年（数値） |数値 |nn|
|　　gengoh_nen_text |元号年（文字列） |文字列 |1年は元年|
|　　year |西暦 |数値 |YYYY|
|　　bgn |西暦 始期 |文字列 |YYYY-MM-DD|
|　　end |西暦 終期 |文字列 |YYYY-MM-DD|
|gengoh |元号 |配列 |元号情報|
|　gengoh |元号 |配列 ||
|　　id |元号ID |数値 ||
|　　name |元号名 |文字列 ||
|　　yomi |元号よみがな |文字列 ||
|　　rome |元号ローマ字表記 |文字列 |未実装|
|　　kigou |元号記号 |文字列 ||
|　　bgn |元号始期 |文字列 |YYYY-MM-DD|
|　　end |元号終期 |文字列 |YYYY-MM-DD|
|years |元号期間 |数値 ||
|rekihou |暦法 |数値 |1.ユリウス暦/2.グレゴリオ暦|
|notes |メモ |文字列 ||

##フォーマット（format）別出力形式
###1. 西暦順（西暦順:format=1）
始期を1868年01月01日に設定した場合

```
1868:[ 0:慶応4年, 1:明治元年 ]
1869:[ 0:明治2年 ]
   .
   .
1911:[ 0:明治44年 ]
1912:[ 0:明治45年, 1:大正元年 ]
1913:[ 0:大正2年 ]
   .
   .
1926:[ 0:大正15年, 1:昭和元年 ]
   .
   .
1989:[ 0:昭和64年, 1:平成元年 ]
   .
   .
2018:[ 0:平成30年 ]
```
###2. 西暦順（連番:format=2）
始期を1868年01月01日に設定した場合

```
0:[ 慶応4年 ],
1:[ 明治元年 ]
2:[ 明治2年 ]
   .
   .
44:[ 明治44年 ]
45:[ 明治45年 ]
46:[ 大正元年 ],
   .
   .
154:[ 平成30年 ]
```

###3. 元号括り（元年から最終年:format=3）
始期を1868年01月01日に設定した場合

```
慶応:[ 4:慶応4年 ]
明治:[ 45:明治45年, ... 2:明治2年, 1:明治元年 ]
大正:[ 16:大正15年, ... 1:大正元年 ]
昭和:[ 64:昭和64年, ... 1:昭和元年 ]
平成:[ 30:平成60年, ... 1:平成元年 ]
```

### 4. 元号括り（最終年から元年:format=4）
始期を1868年01月01日に設定した場合

```
慶応:[ 4:慶応4年 ]
明治:[ 1:明治元年 2:明治2年, ... 45:明治45年 ]
大正:[ 1:大正元年, ... 15:大正15年 ]
昭和:[ 1:昭和元年, ... 46:昭和64年 ]
平成:[ 1:平成元年, ... 30:平成30年 ]
```

##レスポンス(sort別出力形式)
###1. 昇順（format=1, sort=1）
始期を1868年01月01日に設定した場合

```
1868:[ 0:慶応4年, 1:明治元年 ]
1869:[ 0:明治2年 ]
   .
   .
2018:[ 0:平成30年 ]
```

###2. 降順（format=1, sort=2）
始期を1868年01月01日に設定した場合

```
2018:[ 0:平成30年 ]
2017:[ 0:平成29年 ]
   .
   .
1868:[ 0:明治元年, 1:慶応4年 ]
```
atom

```
package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    var a string
//    var b byte
    for {
    fmt.Scan(&a)
    re := regexp.MustCompile(`[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}`)
    b := re.Find([]byte(a))
    c := strings.Replace(string(b), "\"", "", 2)
    if len(c) != 0{
        fmt.Printf("%q\n",c)
    }
    }
}

```

```
#!/bin/bash

while :
do
read file_name1
echo $file_name1
echo ${file_name1//'"'/}
touch $file_name1
echo "clreaed"
/home/ec2-user/log/sh $file_name
done


```
Leap Motion InteractionEngineのサンプルシーンをデスクトップ用にセットアップする

#はじめに
最近久しぶりにLeapMotionを使い始めたのですが、InteractionEngineのサンプルシーンがVR HMD用に作られていて困りました。
HMDなしでサンプルを確認するための手順をここに記しておきます。

#環境
PC OS：Windows 10
Unity：Unity 2017.4.14f1
Leap Motion Orion 4.0.0 
Leap Motion Core Assets 4.4.0
Leap Motion Interaction Engine 1.2.0

#手順
① Interaction Engineのサンプルシーンを開きます。（今回は例としてHand UI）
② Main CameraについているLeap XR Service Providerを削除します）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/780ace7e-05ad-0dd8-76c2-6f0ea21c00f5.png)

③ Main Cameraの子のGameObjectを作成し、Leap Service Providerのスクリプトをアタッチします(Edit Time PoseがDesktop Mode Aになっていること)。あとはTransformの位置を調整します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/b8d82595-c61e-f145-0d3d-fbcbe9df5fb8.png)
④Interaction Managerの子にあるVRコントローラーに関するGameObjectを削除します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/da9afcbd-054d-f2b1-55c1-fa4e871a7ced.png)

以上で作業は完了です。InteractionEngineの他のシーンも同様の手順なのでMain Cameraをプレハブにしておいて差し替えるのが楽です。
EVMとは

参考サイト:
http://e-words.jp/w/EVM.html
https://www.fe-siken.com/kakomon/30_haru/pm06.html

#EVMとは？
Earned Value Management。
プロジェクトマネジメントにおいて進捗状況の把握・管理を行う手法の一つ。

#EV (Earned Value：出来高)
ある時点までに完了した工程の予算コストの合計のこと。

#PV (Planned Value：計画価値)
計画時に見積もられた、ある時点までに達成すべき作業の予算コストの合計のこと。

#AC (Actual Cost：実コスト)
ある時点までに投入した実際のコストの合計のこと。

#SV (Schedule Variance：スケジュール差異)
ある時点で完了した作業の予算コストの合計（EV：Earned Value）と、計画時にその時点で完了していると予想されていた作業の予算コストの合計（PV：Planned Value）の差のこと。
>SV = EV - PV

SVが<font color="red">マイナス値</font>でれば、完了済み作業に対する予算が当初の予算よりも少ないので<font color="red">進捗遅れ</font>、と判断することができます。

#CV (Cost Variance：コスト差異)
ある時点までに投入した実際のコスト（AC：Actual Cost）と、完了した作業の予算コストの合計（EV：Earned Value）との差のこと。
>CV = EV - AC

CVが<font color="red">マイナス値</font>でれば、完了済み作業に対する予算よりも投入コストが多いので<font color="red">コスト超過</font>、と判断することができる。

#まとめ
作業の進捗を判断する指標となる<font color="red">SV</font>も、作業に対して投入したコストが計画よりも多いのか少ないのか判断する指標となる<font color="red">CV</font>も、まず大事になるのは<font color="red">EV</font>となることを覚えておきましょう。
>SV = <font color="red">EV</font> - PV
CV = <font color="red">EV</font> - AC

仕事において一番大事なのは、出来高なのです……。

#具体例
下の表は、基本情報技術者試験のある問題で使用されたものである。
![evm2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/7bb96a4a-2396-0bdc-a847-ff9d6ed5c88a.png)
![evm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/e6bc2f0e-04c4-502e-a95a-2bf1a4714660.png)
これは<font color="red">進捗遅れ</font>だ、これは<font color="red">コスト超過</font>だ、って感じでみていくと良い復習になると思います。

問題の全文は下記サイトの 問6 をご参照ください！
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_fe_pm_qs.pdf
オフラインインストーラを探す

# 探す

* ぐぐる（キーワード：直リン）


## Acrobat Reader DC

[Acrobat Reader DC(ftp)](ftp://ftp.adobe.com/pub/adobe/reader/win/AcrobatDC/)

[Acrobat Reader DC(https)](https://download.adobe.com/pub/adobe/reader/win/AcrobatDC/1901020098/AcroRdrDCUpd1901020098.msp)

◆取締役 平社員 ブログ (ベータ版)
　https://tsusuzuki.hatenadiary.jp/
　　※この方のブログが勉強になる
Unicodeのイカしたメンバーを紹介するぜ！ part 1

私はUnicodeのコードポイントをランダムにつぶやく、[@BotUnicode](https://twitter.com/BotUnicode)というTwitterアカウントを運用しています。今日は、そんな中で発見した、面白い文字たちを、紹介するぜ！
※ 手元のWindows10とAndroid端末で視認できた文字を紹介しますが、MacやiOSでは豆腐になってしまうメンバーもいるかも知れません

# 数字に見えるメンバー
  * ᘖ : U+1616 : CANADIAN SYLLABICS CARRIER JO(Unified Canadian Aboriginal Syllabics)
  * Ʒ : U+01B7 : LATIN CAPITAL LETTER EZH(Latin Extended-B)
  * ᢃ : U+1883 : MONGOLIAN LETTER ALI GALI UBADAMA(Mongolian)
  * ꮞ : U+AB9E : CHEROKEE SMALL LETTER SE(Cherokee Supplement)
  * ߣ : U+07E3 : NKO LETTER NA(NKo)
  * ꡱ : U+A871 : PHAGS-PA SUBJOINED LETTER RA(Phags-pa)
  * ꖉ : U+A589 : VAI SYLLABLE ZOO(Vai)
  * 𐌇 : U+10307 : OLD ITALIC LETTER HE(Old Italic)
  * ၄ : U+1044 : MYANMAR DIGIT FOUR(Myanmar) ※ なんとFOUR！
  * 𐭱 : U+10B71 : INSCRIPTIONAL PAHLAVI LETTER SHIN(Inscriptional Pahlavi)
  * ഒ : U+0D12 : MALAYALAM LETTER O(Malayalam)
  * ꔔ : U+A514 : VAI SYLLABLE DEE(Vai)

# 大きすぎ
  * ⨌ : U+2A0C : QUADRUPLE INTEGRAL OPERATOR(Supplemental Mathematical Operators)
  * ꧅ : U+A9C5 : JAVANESE PADA LUHUR(Javanese)
  * 𒈙 : U+12219 : CUNEIFORM SIGN LUGAL OPPOSING LUGAL(Cuneiform)
  * 𒐫 : U+1242B : CUNEIFORM NUMERIC SIGN NINE SHAR2(Cuneiform)

# 君、一文字やったんかい
  * ⅺ : U+217A : SMALL ROMAN NUMERAL ELEVEN(Number Forms)
  * ㎙ : U+3399 : SQUARE FM(CJK Compatibility)
  * ㍬ : U+336C : IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY(CJK Compatibility)
  * ␆ : U+2406 : SYMBOL FOR ACKNOWLEDGE(Control Pictures)
  * 𝄹 : U+1D139 : MUSICAL SYMBOL QUINDICESIMA BASSA(Musical Symbols)

# 顔文字で使えそう
  * ꙭ : U+A66D : CYRILLIC SMALL LETTER DOUBLE MONOCULAR O(Cyrillic Extended-B)
  * ꀾ : U+A03E : YI SYLLABLE PIEP(Yi Syllables)

# その他
  * 📗📘📙 : U+1F4D7～1F4D9 : GREEN / BLUE / ORANGE BOOK(Miscellaneous Symbols and Pictographs) ※なんでこの3色なんだろ

# 感想
 ランダムにつぶやくと、漢字の比率が高くなるかなー、と思っていたのですが、全然そんなことなくてびっくりしています。漢字って多いと思っていたけど、それ以上に世界には色々な文字や記号があるのだな！と感じました。
Python Cloud functions をローカル環境で実行する

最近cloud functionsを使っていてローカルでデバッグしたかったので。
自分用覚え書き

pipenv使ってる人はflaskインストールします
環境変数使ってる方はpyyamlも

```bash
pipenv install --dev flask, pyyaml
```

ついでにpipfileにscriptsも追加します

```text:Pipfile
[scripts]
dev = "python main.py"
```

こんな感じで追加

```Python:main.py
if __name__ == "__main__":
    from flask import Flask, request
    import yaml
    app = Flask(__name__)

    # 環境変数読み込み
    with open('.env.yaml', 'r') as f:
        ENV = yaml.load(f)
    MY_TOKEN = ENV.get('MY_TOKEN')

    @app.route('/', methods=['OPTIONS', 'POST', 'GET])
    def index():
        return my_function(request)
    app.run('127.0.0.1', 8000, debug=True)
```

サーバー起動して簡単に確認できちゃいます

```bash
pipenv run dev
```

deployもこんな感じでbashスクリプト作っておけば簡単

```bash:deploy.sh
GCF_NAME="my-func-name"
PROJECT_ID="my-project-id"
GCF_REGION="asia-northeast1"

gcloud functions deploy $GCF_NAME \
  --runtime python37 \
  --region $GCF_REGION \
  --trigger-http \
  --env-vars-file .env.yaml
```

もっと楽ちんな方法あったら誰か教えてくださ〜い
ルーティン

# 大学生活の目標
毎日30分

```
プログラミング教育研究・教材作成(120m)
海外大学・論文サーベイ・翻訳(60m)
研究・授業復習(60m)
Mahara,Moodle（チートシート）(60m)
FPGA(60m)
研究調査（先行関連研究サーベイ，文科省など資料集め）(30m)
研究進捗報告資料作成(30m)
Pythonプログラミング(30m)
Cプログラミング(CS)(30m)
トレセン(30m)
セキュリティチェック15分
```

# 目標達成のための具体的な戦略（策定中）ポイントは省エネで楽するが，CS基礎はおろそかにしない

```
起床朝食マネジメント　0:00 - 7:30 睡眠
 7:30 -  8:00 朝ごはん(納豆TKG)
 8:00 -  8:15 風呂
 8:15 -  9:00 メール雑務，息抜き，準備
 9:00 - 11:00 プログラミング教育研究・教材作成(120m)
11:00 - 11:30 大学行く
11:30 - 12:00 メールチェック
12:00 - 13:00 トレセン
13:00 - 14:00 Mahara,Moodle（チートシート）
14:00 - 15:00 FPGA
15:00 - 18:00 授業・雑務　は　3hで終わらす！ 仕事の予定は15時から約束する
18:00 - 20:00 帰宅・夕食・風呂・息抜き
20:00 - 20:30 研究調査（先行関連研究サーベイ，文科省など資料集め）(30m)
20:30 - 21:00 研究進捗報告資料作成(30m)
21:00 - 21:30 Pythonプログラミング(30m)
21:30 - 22:00 Cプログラミング(CS)(30m)
22:00 - 23:00 研究・授業復習(60m)
23:00 -  0:00 海外大学・論文サーベイ・翻訳(60m)

仕事 = 授業・雑務 + FPGA + Mahara,Moodle（チートシート）+ トレセン・メールチェック = 6.5h
勉強・研究時間 =  6h 
その他 = 睡眠 + 朝ごはん + 風呂 + 息抜き，準備 + 大学行く + 帰宅・夕食・風呂・息抜き = 11.5h

後期の英語勉強は，英語論文・海外大学サイトに切り替える
体重マネジメント 60kg じゃないと動きにくい
時間管理 30分をこまめに
残業（大学に居残らず）しない
毎日重ねる訓練
月火は計算機室
水木は準備室
金は地下室
平日は大学行く前に息抜きゆっくり，11時に大学行く，18時に帰宅
土日にYouTube，飲酒，はるか
日曜は21時に寝る・平日の作り置き
現金持つところはいかない，カードも使わない
```
tarコマンドのオプションが覚えられない人向けのエイリアス

UNIX系では.zipの代わりに.tar.gzもよく使いますね。しかしオプションが複雑で毎回忘れていました。
tarについてちょちょっと調べてみました。

## tarコマンドのオプション

| オプション     | 意味      |
|:-----------------|:------------------|
| tar czvf         |第2引数以下で指定したファイルから<br>第1引数で指定した名前で.tar.gz形式のファイルを作る|
| tar xzvf          |第1引数で指定した.tar.gz形式のファイルを解凍する|
| tar tzvf          |第1引数で指定した.tar.gz形式のファイルの中身を<br>解凍せずに確認する|

参考: https://teppeis.hatenablog.com/entry/20080109/1199897258

man ページに乗っている公式仕様から上記で使っている部分も抜粋しておきます。

```
DESCRIPTION
     -c      Create a new archive containing the specified items.
     -x      Extract to disk from the archive.  If a file with the same name appears more than once in the archive, each copy
             will be extracted, with later copies overwriting (replacing) earlier copies.
     -t      List archive contents to stdout.

OPTIONS
     -z      (c mode only) Compress the resulting archive with gzip(1).  In extract or list modes, this option is ignored.  Note
             that, unlike other tar implementations, this implementation recognizes gzip compression automatically when reading
             archives.
     -v      Produce verbose output.  In create and extract modes, tar will list each file name as it is read from or written to
             the archive.  In list mode, tar will produce output similar to that of ls(1).  Additional -v options will provide
             additional detail.
     -f file
             Read the archive from or write the archive to the specified file.  The filename can be - for standard input or
             standard output.
```

## エイリアスの考案

tarについて多少詳しくなりましたが、やはりこのオプションは忘れます。そこでエイリアスを考えてみます。

```sh
alias tarzip='tar czvf'
alias tarunzip='tar xzvf'
alias tarls='tar tzvf'
```

これだと直感的で分かりやすいんじゃないでしょうか。
サブネットマスクとは - IPアドレスからネットワークアドレスを判別する

IPアドレスは、前方がネットワーク[^1]のアドレス、後方がそのネットワーク内のコンピューターや機器のアドレスになっています。
サブネットマスクは、IPアドレスの前方から何ビット目までがネットワーク部にあたるのかを区別するためにあります。

# なぜIPアドレスのネットワーク部を知る必要があるのか？

宛先IPアドレスのコンピューターが、自身と同じネットワーク内に存在しているのか、それとも外に存在しているのかによって、パケットの送り先を変えなければいけないからです。

自身と同じネットワーク内に存在していれば直接[^2]通信できます。
しかし、ネットワークの外にいるコンピューターと通信したいなら、パケットはルーターに向けて送らなければいけません。
外の世界、別のネットワークとつながっているのはルーターだからです。

例えば、MacとiPhoneを同じWi-Fiにつないでいれば、それらは同じネットワーク内に存在していますので、相手のIPアドレスを指定すれば直接通信できます。
しかし、Macがどこかのウェブサイトにアクセスするためには、Macはルーターに向かって通信しなければいけません。

## 送り先がネットワークの中にいるのか外にいるのかを、具体的にどのような手順で判別しているのか

ここにWi-FiにつないだiPhoneがあります。iPhoneの設定画面から、つないでいるWi-Fiの詳細情報を見てみました。

|||
|:---|---:|
| IPアドレス | 10.0.2.2 |
| サブネットマスク | 255.255.255.0 |
| ルーター | 10.0.2.1 |

IPアドレスはiPhone自身に割り当てられたIPアドレスです。
このサブネットマスクは、IPアドレス10.0.2.2のうち、10.0.2までがネットワーク部であることを示しています。

このiPhoneから宛先10.0.2.4にアクセスするとします。

iPhoneは、宛先のコンピューターに設定されているサブネットマスクを知ることはできないため、判別には自身のサブネットマスクを使います。

自身のネットワークアドレスは、10.0.2.2と255.255.255.0の論理積により、10.0.2.0です。
宛先のネットワークアドレスは、10.0.2.4と自身のサブネットマスク255.255.255.0の論理積により、10.0.2.0と判断されます。
よって、自身と宛先は同じネットワークアドレスを持っている、すなわち同じネットワークにいると判断できます。
なので、iPhoneは直接10.0.2.4にパケットを送ります。

次に、このiPhoneから10.0.1.4にアクセスするとします。

先ほどと同様の論理積の結果、送り先は自身と同じネットワークにはいないと判断されます。
よってiPhoneは、ルーターである10.0.2.1に向けてパケットを送ります。
あとはルーターがネットワーク外との通信を成り代わってくれます。

ちなみに、このiPhoneに間違ったサブネットマスク255.255.0.0を設定してしまうと、宛先10.0.1.4にはつながらなくなってしまいます。
なぜなら、実際にはネットワークの外にいる10.0.1.4を、自身と同じネットワークにいると判断してしまい、iPhoneがルーターにパケットを転送しなくなるからです。

# サブネットマスクを上手く使うと、ネットワークを好きなように分割できる（サブネット化）

サブネットマスクを上手く設定して、あるIPアドレス群が別のネットワークに存在するものとコンピューターに認識させれば、ネットワークを論理的に分割することができます。（サブネット化）

ここに、10.0.0.0 〜 10.0.255.255というIPアドレスの範囲を持ったネットワークがあるとします。
先頭16ビットがネットワーク部で、後方16ビットがホスト部です。

ここで、先頭24ビットがネットワーク部であるものとしてサブネットマスクを設定します。
すると、10.0.0.0のコンピューターから、10.0.1.0に向けて直接通信することはできなくなります。
ネットワーク部が異なるため、別々のネットワークに存在すると認識されるからです。

よって、最初のネットワークは、
10.0.0.0 〜 10.0.0.255
10.0.1.0 〜 10.0.1.255
10.0.2.0 〜 10.0.2.255
というように、ネットワークが論理的に分割されたことになります。

この、ネットワークの論理的な分割は、例えば以下のような目的で活用されます。

- 同じ組織のネットワークでも経理部のネットワークは分離して、他の部署からアクセスできないようにする
- クラウドでサービスを構築する時に、インターネットからアクセスできる箇所と、インターネットからはアクセスできない箇所に分離して、前者にWebサーバを、後者にデータベースサーバを設置する


# 参考
[インフラ/ネットワークエンジニアのためのネットワーク技術＆設計入門](https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8A%80%E8%A1%93%EF%BC%86%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%81%BF%E3%82%84%E3%81%9F-%E3%81%B2%E3%82%8D%E3%81%97-ebook/dp/B00IP549AE)
[スラスラわかるネットワーク&TCP/IPのきほん](https://www.amazon.co.jp/%E3%82%B9%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%8F%E3%81%8B%E3%82%8B%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-TCP-IP%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E3%83%AA%E3%83%96%E3%83%AD%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9/dp/4797377038)
[IPアドレス - Wikipedia](https://ja.wikipedia.org/wiki/IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)

[^1]: ここでいう「ネットワーク」とは、インターネット全体のことではなく、LANなどの閉じたコンピューターネットワークのことです。インターネットは、地球上の多数のネットワークを相互に接続したものです。
[^2]: 直接通信するといっても、コンピューターがコンピューターに向けて直にパケットを飛ばすのではなく、有線LANであればネットワークハブを、無線LANであれば親機を介して通信します。直接というのは、ルーターを介さずに通信できるという意味です。
よく使うrpmコマンドまとめ


最近使うことがあるのでまとめてみました。

RPMはパッケージ管理を行うシステムで、
CentOSとか、RedHat系のディストリビューションに採用されています。

RPMのパッケージは拡張子が.rpmとなっており、
これを操作するのがrpmコマンドです。

# 基本的な書き方

```
$ rpm {オプション} {パッケージ名}
```


オプション部分は基本的に複数のrpmオプションを
組み合わせて使います。
なので詳しいオプションはここでは記載しません。

# コマンド


##パッケージのインストール
```
$ rpm -ivh {パッケージ名}
```

##パッケージのアップグレード
```
$ rpm -Uvh {パッケージ名}
```

##パッケージのアンインストール
```
$ rpm -evh {パッケージ名}
```

##インストールされているrpmパッケージを一覧表示
```
$ rpm -qa {パッケージ名}
```

##rpmパッケージの情報を表示
```
$ rpm -qi {パッケージ名}
```

##パッケージからインストールされたファイルを一覧表示
```
$ rpm -ql {パッケージ名}
```
laravelテスト-データプロバイダつかってみた

##◆データプロバイダ
データプロバイダを使うと、同じテストコードに違うパラメータを与えることができる。

```
class ExampleTest extends TestCase
{
    /**
     * @dataProvider dataProvider
     * @param $int1
     * @param $int2
     */
    public function testSample($int1, $int2)
    {
        $this->assertSame($int1, $int2);
    }

    /**
     *
     */
    public function dataProvider()
    {
        return[
            [0,0],
            [0,1],
            [1,1]
        ];
    }
}
```

<b>データプロバイダは、配列もしくは、iterotorを実装したループ可能なインスタンスを返すようにして、使うメソッドのコメントでdataProviderアノテーションを指定する必要がある</b>
testSampleメソッドの引数が2つなので、dataProviderメソッド(publicで指定する必要あり)は2つの値を持つ配列を用意する。
今回は、3つ用意したので、3回テストが実行される。

```
PHPUnit 7.5.8 by Sebastian Bergmann and contributors.

.F.                                                                 3 / 3 (100%)

Time: 980 ms, Memory: 14.00 MB

There was 1 failure:

1) Tests\Unit\ExampleTest::testSample with data set #1 (0, 1)
Failed asserting that 1 is identical to 0.

/var/www/tests/Unit/ExampleTest.php:17

FAILURES!
Tests: 3, Assertions: 3, Failures: 1.
```

テストが失敗したときに与えた組み合わせの値が表示されるのもすごくありがたい。

```:メッセージをつける
public function dataProvider()
{
    return[
        '0と0です' => [0,0],
        '0と1です' => [0,1],
        '1と1です' => [1,1]
    ];
}
```

```
PHPUnit 7.5.8 by Sebastian Bergmann and contributors.

.F.                                                                 3 / 3 (100%)

Time: 990 ms, Memory: 14.00 MB

There was 1 failure:

1) Tests\Unit\ExampleTest::testSample with data set "0と1です" (0, 1)
Failed asserting that 1 is identical to 0.

/var/www/tests/Unit/ExampleTest.php:17

FAILURES!
Tests: 3, Assertions: 3, Failures: 1.
```
次から書くときつかお

[参考にさせていただいた記事]
https://qiita.com/Hiraku/items/5c49987f4e9e167dad86

## おまけ
###テスト用データベースの設定

```:phpunit.xml
<env name="DB_DATABASE" value="app_test"/>
```

###テスト時にmigrateを自動実行、テスト終了後DB元に戻す

```
class SampleTest extends TestCase
{
    use RefreshDatabase; 
}
```

 use RefreshDatabaseを記述することで、テスト実行時に自動でmigrateしてくれる。
テスト終了後に自動ロールバックを行ってくれるため、テスト中に変更したデータは元に戻る。
package.jsonとかライブラリのインストール方法とかメモ

教えていただいているメンターさんのオンライン講義があったので、そちらのメモ

---

## package.json

ライブラリを管理するためのファイルです。

ターミナルに

```console
$ npm init
```

と打ち込むことでファイルを作成することができます。

### scripts

`package.json`内に記述されてある`scripts`の中でショートカットを設定することができます

```js:package.json
"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1"
  "タスク名":"コマンド"
},
```
`:`の左にショートカットに使いたいタスク名、右に実行したいコマンドを記述します

```console
$ npm run {タスク名}
```
で実行することができます

**※** タスク名に`test`、`start`と設定した場合は`run`を省略することができます

## ライブラリのインストール方法

ライブラリをインストールする際には、`package.json`内のどこのプロパティに記述するかも設定する必要があります

- **`dependencies`** …webサービスを動かすために必要なライブラリを記述するところ(`Express`,`Vue`など)
- **`devDependencies`** …webサービスを動かすためでなく、開発時に使用するライブラリを記述するところ(`mocha`,`power-assert`など)

```console
// dependenciesへインストール
$ npm install {ライブラリ名}

// devDependenciesへインストール
$ npm install -D {ライブラリ名}
```

**※** Node.jsの古いバージョンでは`install`の後に `--save`という記述も必要でしたが、現在は必要ないみたいです。

### node_modulesと.gitignore

ライブラリをインストールすると、`node_modules`というディレクトリができ、そこにライブラリが保存されます。
この`node_modules`ですが、`package.json`にインストールしたライブラリの情報がある場合は、`node_modules`を削除しても

```console
$ npm install
```
とコマンドを打てば全てインストールしてくれます。なのでGitHubなどでコードを共有する場合も`node_modules`をプッシュする必要はありません。
`node_modules`はライブラリをインストールするたびにデータ量が多くなります、なので全てpushすると`git clone`した際の負担も大きくなりますし、また、プルリクエスト時に全てpushした場合、全てのファイルがプルリクで出てしまうのでコードレビューもしにくくなります。

なので`node_modules`はpushするものから除外しておくのが基本ですが、その際に使用するのが`.gitignore`というファイルです。
`.gitignore`は、管理に含めないファイル、ディレクトリを設定するファイルです。
`node_modules`を除外したい場合は

```:.gitignore
node_modules/
```
と記述します。

**※** gitignore.io というwebサービスを使うと、簡単に除外したいファイル等を設定することができます
[gitignore.ioのススメ - Qiita](https://qiita.com/dhun/items/adcae139b5ba1da56c81)


## package-lock.json

バージョンを固定するためのファイルです、`git clone`したものを`npm install`したさいに、もしライブラリのバージョンが変わっていたら大変です。
何故なら、開発時のバージョンでは動いていたコードが、最新版になると記述の方法が変わっていたりなどして、動かない可能性があるからです。

そういったことが起きないために`package-lock.json`でインストールするバージョンを固定する必要があります。
基本的にライブラリをインストールした際に自動で生成されるので、無理に気にする必要はないです。

#### ^(キャレット)

`package.json`に記述されてあるライブラリのバージョンを見ると、数字の左に`^`という記号がついています

```js
{
  "dependencies": {
    "hoge": "^1.1.1",  // >=1.1.1 and <2.0.0
    "huga": "^0.1.1",    // >=0.1.1 and <0.2.0
    "foo": "^0.0.1"      // >=0.0.1 and <0.0.2
  }
}
```
この記号は *キャレット*と呼ばれるもので、これがあると、一番左の`0`になっているところの数字以外の部分のバージョンアップはされないようになります

[package.json のチルダ(~) とキャレット(^) - Qiita](https://qiita.com/sotarok/items/4ebd4cfedab186355867)
【ExcelVBA】サブプロシージャを［マクロ］ダイアログに表示させない設定

# はじめに

Excelでマクロを書いていると、マクロのコード量がそれなりに増えてきて、複数の標準モジュールを使うことがあります。
このように複数の標準モジュールを使う場合、異なる標準モジュールのサブプロシージャを呼び出す際に、呼び出される側のサブプロシージャにPublicキーワードを付けて、どの標準モジュールからも呼び出せるように設定すると思います。

ですが、サブプロシージャにPublicキーワードを付けると、［マクロ］ダイアログ上に一覧表示されてしまうので、ユーザーが誤操作する可能性が出てきます。
このようなケースでは、「サブプロシージャを［マクロ］ダイアログに表示させない設定」が少し役に立ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/f854e92e-01a6-44dc-19a0-f2614527e47c.png)



# 設定方法

* ［マクロ］ダイアログから直接呼び出されたくないサブプロシージャがある標準モジュールで、以下のように先頭行に「Option Private Module」と記入すると、［マクロ］ダイアログ上にこの標準モジュール内の全てのサブプロシージャ名が表示されません。
* この時、「Publicキーワード付きのサブプロシージャ」については、他の標準モジュールから利用できるだけでなく、［マクロ］ダイアログ上にもサブプロシージャ名が表示されません。
* 一方、「Privateキーワード付きのサブプロシージャ」については、「Option Private Module」の有無に関わらず、同一の標準モジュール内でしか呼び出せません。

```visualbasic:Module1
Option Private Module

Public Sub test1()
    MsgBox "［マクロ］ダイアログ上に表示されませんが、他の標準モジュールからも呼び出せます。"
End Sub

Private Sub test2()
    MsgBox "［マクロ］ダイアログ上に表示されず、この標準モジュール内でしか呼び出せません"
End Sub
```

# 参考URL

* [Excel環境操作 - マクロの起動にプロシージャ名を表示させなくする](http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_090_020.html)
はじめてのC++ 【38日目】

#はじめに
`openframeworks`　とても楽しい。そして夢が広がった。 C++やっててターミナルの黒色しか見てなかったので、`OF`　使って感動した。あと、サンプルコードでもすごい機能があったりしてとても楽しい。ネットで `OF` を使って様々な開発をしている人がいて。私も開発したい気持ちになりました笑
##ロベールのC++
###namespace
複数のクラスを使用したときに、それぞれの関数名が同じだったとする。このとき、 `namespace`　を使って使い分ける。

```namespace.cpp
#include <iostream>

namespace A {
  void abc(){
    std::cout << "A::abc" << std::endl;
  }
}

namespace B {
  void abc(){
    std::cout << "B::abc" << std::endl;
  }
}


  void abc(){//グローバル名前空間
    std::cout << "::abc" << std::endl;
  }

int main(){
  A::abc();
  B::abc();
  ::abc();//abc()でもグローバル名前空間の関数は呼び出すことができる。
}
//それぞれ同じ名前のabc()だが名前空間が違うため二重定義エラーが起きない。
```
名前空間が違うなら、同じ名前の関数やクラスを宣言することができる。

不慮の名前の衝突を避けるため、クラスや関数を使うときは名前空間に入れておくべき！
##ブロック崩し
###openframeworksの導入
[ここのサイト見ながらやりました](https://qiita.com/ryosukeeee/items/8e758fd179c4a4f5d1fc)
非常にわかりやすく解説されていてとてもわかり易かったです。
#終わりに
今日はopenframeworksのサンプルコードで遊びすぎた。明日は、ブロック崩し作っていこうと思う。
おやすみなさい。
複数HTMLファイルでCSSを共有する場合の便利な手段

## 複数HTMLファイルでCSSを共有する場合の便利な手段
複数HTMLファイルでCSSを共有すると、意図しないHTMLファイルの方にCSSの変更が適用されてしまうことがあります。

オススメの解決策は、HTMLファイルのbodyタグにクラスを指定することです。

例

```html:index.html
<body class="index">
<h1>タイトル</h1>
...
</body>
```

```html:about.html
<body class="about">
<h1>タイトル</h1>
...
</body>
```

```css:main.css
.index h1 {
  color: black;
}
.about h1 {
  color: black;
}
```
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【PBCS/HPL】多段階配賦で各段階の金額を保持したい


多段階配賦処理で、各段階の金額を確認できるようにしたいという要望はよく上がります。
例えば、1次配賦、2次配賦とあった場合に、2次配賦の組織Aの配賦金額を確認したいといった具合です。


実際PBCSを始めたころ、階層の考え方をうまく使えず、配賦計算をすべて計算処理内で計算していました。
そのため、配賦途中の金額を保持することが困難でした。
配賦区分を管理するメンバを階層を使って定義することで、比較的簡単に実現することが可能です。

##次元の定義
まず、配賦区分を管理する次元を定義します。
ここでは「数値分類」という次元を使用します。

配賦処理の流れに沿って階層化します。

数値分類
　└ 配賦後
　　　├ 2次配賦後
　　　│　├ 1次配賦後
　　　│　│　├ 発生額
　　　│　│　├ 1次配賦額
　　　│　│　└ 1次調整額
　　　│　├ 2次配賦額
　　　│　└ 2次調整額
　　　└ 最終調整額
        
といった感じです。

配賦元となる金額はすべて「発生額」に入力・保存します。
計算処理で求めた配賦額は各「〇次配賦額」メンバに保存します。
各「〇次調整額」は配賦処理実行後に手修正をしたい場合に使用します。

## 計算処理
計算処理はおおまかに以下の流れで実行します。

<b>■処理フロー</b>
①1次配賦処理を行い算出した配賦額を「1次配賦額」に保存します。
　この際、配賦元の組織はマイナス値が入り、配賦先組織はプラス値が入るイメージです。
②必要に応じて1次配賦後以下を積上げます。
　⇒発生額+1次配賦額+1次調整額が1次配賦後として保存されます。
③2次配賦処理を行い算出した配賦額を「2次配賦額」に保存します。
④「配賦後」以下を積上げます。
　⇒1次配賦後+2次配賦額+2次調整額が2次配賦後として保存されます。
　⇒2次配賦後+最終調整額が配賦後として保存されます。


1次配賦で組織A→組織Bに"10"配賦し、2次配賦で組織A→組織Bに"20"配賦する

|配賦区分|組織A|組織B|処理|
|:-----:|-----:|-----:|:-----:|
|発生額|100|150||
|1次配賦額|-10|+10|①|
|1次調整額||||
|1次配賦後|90|160|②|
|2次発生額|-20|+20|③|
|2次調整額||||
|2次配賦後|70|180|④|
|最終調整額||||
|配賦後|70|180|④|

このように、配賦区分で使用するメンバを階層化すれば、
段階的に金額を確認することが可能になります。

## 最後に
段階的に確認できれば、多段階配賦で各段階の金額を保持するという要件を満たすことができ
また、金額が合わないときの原因調査がしやすくなります。

それ以外に、配賦先を管理する軸を追加すれば、
「1次配賦で組織A⇒組織Bに10配賦した」という情報も持てるようになります。
AndroidStudioのエミュレーターを作る

なんとなく[最近の検索事情](https://goodkeyword.net/search.php?type=&formquery=Android+Studio&x=0&y=0)を調べていたら、『あ！この記事書きたいカモ！』と思ったので書いてみました。(｡･ω･｡)


さあ！やって見よう！『AndroidStudioのエミュレーターを作る（作成する）』の会！

ちなみにAndroidStudioのエミュレーターを作りたいのシチュエーションとして
『あ〜code書いたなー！再生。再生っと！あれ、何もない！！』
って感じと思ってます。

作らないといけないので作りましょう！では早速！！

#端末を決める
**・再生ボタン押すとまず出てくる画面**
<img width="936" alt="スクリーンショット 2019-04-11 22.18.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/74cd20dc-b417-5ac4-6420-fcc4bcf1d8eb.png">

**・ないはずなので、『Create New Virtual Device』をタップ**
ここに表示されているものですか？以前私が作ったものです。一番上は今使っているもの。
今はここに何もないことにしてください。何もありません。
<img width="707" alt="スクリーンショット 2019-04-11 22.19.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/a794a68d-d65a-e49b-4638-afdbfe4b180c.png">

**・好きな端末選ぶ**
Androidユーザーじゃないとこれ？？って思うかもしれませんがAndroidにはiPhoneと違い色々な会社がおのおのにデバイス作っているのでそれを選んであげてください！
選びたい放題です！！

<img width="880" alt="スクリーンショット 2019-04-11 22.28.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/0544aec1-943b-6f8b-5b03-2bc17dc9003b.png">

#OS決める

**・次にその端末で使うOSを決めます**
携帯でも、なんでもバージョンとやらがあるじゃないですか？それです！！
最新はどうやら『Q』なのかと思いますが、とりあえずLevel(バージョン)を一つ下げて『API Level 28』を使用することにしました！！
『Pie』とか言うやつです！！
<img width="1029" alt="スクリーンショット 2019-04-11 22.35.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/0a21122a-a88d-40f3-afcb-4ba2a422b195.png">


バージョンが今まだない状態なのでその隣の**青文字『Download』**タップでバージョンのダウンロードが開始されます。時間かかることもあります。その時は気長に待ちましょう！！

**・『Finish』する**
ダウンロードが終わると『Finish』が押せるようになるのでタップして、フィニッシュしちゃってください。
<img width="867" alt="スクリーンショット 2019-04-11 22.57.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/15a910d6-42c4-d3f2-6055-aafc70ee5e89.png">

**・OS選択して『Next』**
<img width="856" alt="スクリーンショット 2019-04-11 23.01.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/4263f8a2-2cc1-97cf-dc73-55d290550d74.png">


#合体させる！
**・名前はそのままで『Next』**
いい感じに名前付いているので編集しないでそのまま『Next』でいいと思います。
<img width="823" alt="スクリーンショット 2019-04-11 23.05.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/36d3c9df-d7f5-faa2-3801-2b16b608a760.png">


あとは少し待てば…完成！！！！！
<img width="799" alt="スクリーンショット 2019-04-11 23.10.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/ef4a26a1-c9f5-ed5b-a9c2-04a98adf68c6.png">

後は、選択して『OK』をタップすると起動します！！
（備忘録）Ubuntu 18.04 LTS で Kubernetes のための kubectl（kubernetes-cli）セットアップ

# 1. はじめに
[Kubernetes + SpringBoot を用いたハンズオン](https://dreamarts.connpass.com/event/123481/)への事前参加準備を済ませるために、Ubuntu18.04LTSに Kubernetes（k8s） のための kubectl（kubernetes-cli）コマンドのセットアップをした際のメモを、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学べる内容

- kustomize（KubernetesのYAML管理ツール）のインストール
- kubectl（kubernetes-cli）のインストール
- jdk8のインストール

# 3. kustomize（KubernetesのYAML管理ツール）のインストール
- [kustomize_2.0.3_linux_amd64](https://github.com/kubernetes-sigs/kustomize/releases)をダウンロードする。
- バージョンは随時読み替えてください。

```shell:Ubuntuプロンプト
# ダウンロードフォルダに移動
$ cd ~/Downloads

# リネーム
$ mv kustomize_2.0.3_linux_amd64 kustomize

# ファイル移動
$ sudo mv ./kustomize /usr/local/bin

# 実行権限追加
$ cd /usr/local/bin/
$ chmod 755 kustomize

```

# 4. kubectl（kubernetes-cli）のインストール

```shell:Ubuntuプロンプト
# snapパッケージ管理に対応している場合（snapコマンドを用いたインストール）
$ sudo snap install kubectl --classic
```

```shell:Ubuntuプロンプト
# snapパッケージ管理に対応していない場合（apt-getコマンドを用いたインストール）
$ sudo apt-get update && sudo apt-get install -y apt-transport-https
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubectl
```

# 5. jdk8のインストール
- Java8をご利用する予定のある方は実施してください。

```shell:Ubuntuプロンプト
# jdk8のインストール
$ sudo apt install openjdk-8-jdk

# 環境変数JAVA_HOMEの設定
$ vi ~/.bashrc

# .bashrcファイルの一番下に4行追加
JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH

# 環境変数を即時反映
$ source ~/.bashrc
```

# 6. 参考
- [kustomize](https://github.com/kubernetes-sigs/kustomize#kustomize)
- [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl)

# 7. おわりに
Kubernetes学習の参考になれば幸いです。

2019/04/11 TAKAHIRO NISHIZONO
Cloud Dataprepハマりメモ

GCPのCloud Dataprepを使用した際にハマったメモを記載する。

#google data prep Preview not available Could not load photon executable ...
**（20190411時点）**
以下参考
https://community.trifacta.com/s/question/0D51L00005dDrcmSAC/not-able-to-preview-data-sources-or-edit-recipes

#~~chromebookをサポートしていない！~~
**（20190411時点）**
chromebookを使用して1つ上のエラーと格闘していたが、どうやらchromebookをサポートしていないらしい。。
https://cloud.google.com/dataprep/docs/html/Desktop-Requirements_132067779?hl=JA

**（20190517時点）**
chromebookで使えるようになってた！

#BigQueryのDATE型へのInsert
**（20190411時点）**
BigQueryのdate型へのInsertはサポートされていないらしい。。
（DATETIMEか、TIMESTAMPのみ）
https://community.trifacta.com/s/question/0D51L00005M7sJ3SAJ/how-to-match-the-dataprep-data-types-to-bigquery-data-types
Macにログインできなくなって試したこと

# はじめに
とあるソフトウェアをアップデートして設定を変えて再起動したところ、Macにログインができなくなりました。
結果として、新Macに交換することになったのですが、それまでに試したことをいくつか記録しておきます。

# 状況
* 端末はMacBook Pro 13inch TouchBar有
* OSは起動する
* ログインしようとするも、プログレスバーが進まない

# 試したこと
## シングルユーザーモードで原因となってそうなソフトウェアを削除
* Macの電源を切った状態で、 `Cmd` + `S` でシングルユーザーモードで起動
* ログインするとターミナルになるので実行したいコマンドを入力する。
    * 今回は、アンインストールのスクリプトがあるのを知ったので、以下のように削除する

```bash
/path/to/uninstall.sh
```

* 削除ができたら、以下のコマンドで再起動します

```bash
reboot
``` 

しかし、状況変わらずログインできませんでしたorz

## verboseモードで起動
* Macの電源を切った状態で、 `Cmd` + `V` でverboseモードで起動
* 起動に際してログが出るので、どこで詰まるかがわかると期待

帰宅して翌朝来るまでの約12時間かかってもまだなにやら画面は少しずつ動いており、なにやらバイナリ情報っぽいのがいっぱい...
そして、特にエラーっぽいものもみつけられず、そのまま、止まってしまいましたorz
電源長押しでシャットアウト。

## PRAMクリア
* Macの電源を切った状態で、電源を入れ、すぐに `option` + `command` + `P`+ `R` を、20 秒ほど押し続けてからキーを放します
* ログインしてみる

少し挙動が変わり、プログレスバーが進むように！でも、バーが埋まったのを確認してお昼ご飯を食べに行って帰ってきても、ログインできず。
電源長押しでシャットアウト。

## SMCクリア
* `shift` + `control` + `option` + 電源ボタンを 10 秒間押し続けて起動
* ログインしてみる

PRAMクリアと挙動は全く一緒で、ログインできず。
電源長押しでシャットアウト。

ここで復旧は諦めることにして、新PCの手配依頼をしました。
その間、以下の容量で、起動できなくなったMacから、データを吸い出しました。
 
## 起動できなくなったMacをターゲティングモードで起動
* `T` + 電源ボタンで起動

## 一時利用PCと起動できなくなったMacを接続
* USBやThunderboltで接続して、一時利用PCのFinderで起動できなくなったPCをストレージとして読み込む
* 必要なデータをコピー
    * もしかすると権限まわりで上手いこといかない可能性があります
* コピーしたデータをcloudのサービスにアップロードする
    * Google Drive, iCloud, Dropboxなど

# おわりに
* PCが利用できないと、机に座ってスマホを触って(解決法を調べて)るだけの、ただのおっさんになることがわかった。

# おまけ
## 開発環境を失ってもちょっと試しで開発したいときに便利なCodeSandbox
今回、ちょうどNext.jsを試そうとしていたタイミングで、Macが不調になりました。
データ退避用の一時利用PCは、開発環境を入れられないので、何か手頃なサービスないかなー。AWSとかに作るほどでもないしなー。
という感じで思っていたら、CodeSandboxというサービスを発見しました。

https://codesandbox.io/

Next.jsのCreate Appが用意されていて、ぽちぽち選択するだけで、環境がすぐにブラウザ上にできてしまいました。

これは、、めっちゃ便利！
rails-erd を使って中規模 Rails アプリケーションのER図を自動生成する


この記事は Rails 5.1 で確認したものです。

[voormedia/rails-erd](https://github.com/voormedia/rails-erd) は Graphviz を利用してER図を自動で出力してくれる便利な gem ですが、普段我々がメンテするような規模のアプリケーションのER図を出力すると以下のようになってしまって目が潰れてしまいます。ドキュメントは自動生成されたもの以外信じられないとはいえ、読めないのでは意味がありません。

例としてあげるこの ER図は [solidusio/solidus](https://github.com/solidusio/solidus) のものです。
![erd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9811/553fd461-b2f7-e275-844b-fb02f21a0bfe.png)

このような見るに堪えないER図は出力しても仕方ないのでもう少し読みやすいER図を出力しましょう。

1. ファイル名を特定のモデル名に
2. ER図に出力するモデルは 1. とリレーションが定義されているモデルのみにする
3. このER図を全モデル分作る

という戦略で行きたいと思います。以下のようなスクリプトを書いて動かします。development 環境の場合は `Rails.application.eager_load!` で定数の先読みをしましょう。

```ruby
Rails.application.eager_load!

ApplicationRecord.descendants.map do |k|
  [ k.name, k.reflect_on_all_associations.map { |a| a.class_name }].flatten
end.map do |models|
  puts %(bundle exec erd --only=#{models.join(",")} --filename=tmp/#{models.first})
end
```

この出力を適当なファイルに出力して実行しましょう。数が多いので並列実行すると時間の節約になると思います。

```bash
bundle exec rails runner '
Rails.application.eager_load!

ActiveRecord::Base.descendants.map do |k|
  [ k.name,
    k.reflect_on_all_associations.map do |a|
      # 異なる名前空間に同じクラス名のモデルが存在した場合で、リレーションの指定で空間の省略をおこなった場合
      # 無条件で名前同じ名前空間のクラス名を無条件に設定しています。
      # これで不都合がおこる場合は、なんとかする方法を考えましょう。
      namespace = k.name.deconstantize.blank? ? "" : k.name.deconstantize + "::"

      namespaced = "#{namespace}#{a.class_name}"
      Module.const_defined?(namespaced) ? namespaced : a.class_name
    end
  ].flatten
end.map do |models|
  puts %(bundle exec erd --only=#{models.join(",")} --filename=tmp/#{models.first} --title=#{models.first})
end
' 2>/dev/null | grep erd > tmp/hoge.sh

cat tmp/hoge.sh | xargs -I{} -P 8 bash -x -c {}
```

するとこのような「半径１ホップ分の」ER図ができあがります。
これならなんとか僕でも読めそうです。
![Spree::Order.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9811/4da73b53-664e-b9db-63a5-e1fabc9cf6b3.png)

![Spree::Carton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9811/e6675820-e99b-e64c-99b2-16fc8f772f23.png)

Finderに並べてしまえばこのように一覧もそこそこです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9811/485378db-edb1-af41-9805-5dd568f58ae3.png)

### まとめ
[amatsuda/erd](https://github.com/amatsuda/erd) を使いましょう。
[Rails][MySQL] 絵文字を保存できるようにする

「😀」みたいな絵文字をMySQLに保存したい。

# 方法
### my.cnf に以下を追記
「/etc/my.cnf」「/etc/mysql/my.cnf」あたりにあるはず。

※最後の3行は、```MariaDB >= 10.3.1``` ならデフォルトで設定されているので追記しなくてよい。
　（設定自体が出来なくなってもいる。 [参考](https://github.com/frappe/bench/issues/670)）

```:my.cnf
[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server = utf8mb4
skip-character-set-client-handshake
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init-connect = SET NAMES utf8mb4
innodb_file_format = Barracuda         # MariaDB >= 10.3.1 なら削除
innodb_file_per_table = 1              # MariaDB >= 10.3.1 なら削除
innodb_large_prefix                    # MariaDB >= 10.3.1 なら削除

```

※AWSのRDSでこの設定をする場合は[こちら](https://qiita.com/Masahiro_T/items/9db89e12e39b2b6dbb45)。


### database.ymlを変更

```yml:database.yml
# 変更前
encoding: utf8
↓
# 変更後
encoding: utf8mb4
charset: utf8mb4
collation: utf8mb4_unicode_ci
```

### databaseを作成

```bash:bash
bundle exec rake db:create
bundle exec rake db:migrate
```

### 確認

```bash:bash
mysql # mysqlにログイン
```

```bash:mysql
use データベース名; # データベースを選択
show variables like 'character_set%'; # 文字コード表示
```

こんな風に表示されるはず。

```bash
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
```

# 追記（経験談）
AWSのproduction環境で上記設定をした時、database.ymlが反映されず、SQL発行時に「SET NAMES utf8」が出てしまい、絵文字が保存出来ないという状況が起きました。インスタンスを再起動してみたら直りました。

Capistranoを使っていて、「shared/config/」にdatabase.ymlを置いていたので、これが理由なのかなと思っています。

# 参考
https://qiita.com/okamu_/items/5eb81688849fbe351350
https://y-hilite.com/3192/
PRML輪読 #1,2

# 学習の忘備録
事前学習として記事末の参考リンクを一通り勉強した．
輪講の内容は以下．（リンク先の記事を執筆してくださった方々に感謝申し上げます．）

1. 全体的な外観を捉えつつ学習したかったので，[多項式あてはめで眺めるベイズ推定~今日からきみもベイジアン~](https://www.slideshare.net/tanutarou/ss-80824894)の内容から始めた．
2. ベイズの気持ちを少し理解した上で，教科書内容を[PRML読み会第一章](https://www.slideshare.net/takushimiki/prml-52113785)で押さえる．
3. 2章はガウス過程への導入だと思ったのでガウス分布を重点的に．PRML本文は導出メインなので[ガウス過程と機械学習](https://www.amazon.co.jp/ガウス過程と機械学習-機械学習プロフェッショナルシリーズ-持橋-大地/dp/4061529269)3,4章で勉強．
    - 押さえておくべき事項
        - 確率変数
        - 確率密度関数
        - 確率過程
        - ガウス過程
        - 周辺化・周辺分布
        - 条件つき分布
        - 確率変数の独立性・確率変数の条件付き独立性
        - 多変量ガウス分布
PRML本文の導出は，”2つの変数集合の同時分布がガウス分布に従うなら，一方の変数集合が与えられた時の，もう一方の集合の条件付き分布もガウス分布になる．さらに，どちらの変数集合の周辺分布も同様にガウス分布になる．”というのが言いたい．
4. 最後に，[藤井四段で学ぶ最尤推定、MAP推定、ベイズ推定](https://qiita.com/jyori112/items/80b21422b15753a1c5a4)でもう一度復習．


# 目次
1. 序論
    2. 例：多項式フィッティング
    3. 確率論
        4. 確率密度
        5. 期待値と分散
        6. ベイズ確率
        7. ガウス分布
        8. 曲線フィッティング再訪
        9. ベイズ曲線フィッティング 
    1. モデル選択
    2. 次元の呪い
    3. 決定理論
        4. 誤識別率の最小化
        5. 期待損失の最小化
        6. 棄却オプション
        7. 推論と決定
        8. 回帰のための損失関数
    1. 情報理論
        2. 相対エントロピーと相互情報量
1. 確率分布
    2. 二値変数
        3. ベータ分布
    1. 多値変数
        2. ディリクレ分布
    1. ガウス分布
        2. 条件付きガウス分布
        3. 周辺ガウス分布
        4. ガウス変数に対するベイズの定理
        5. ガウス分布の最尤推定
        6. 逐次推定
        7. ガウス分布に対するベイズ推論
        8. スチューデントのt分布
        9. 周期変数
        10. 混合ガウス分布
    1. 指数型分布族
        2. 最尤推定と十分統計量
        3. 共役事前分布
        4. 無情報事前分布
    1. ノンパラメトリック法
        2. カーネル密度推定法
        3. 最近傍法

---

# 参考リンク
### slideshare
- [PRML読み会第一章](https://www.slideshare.net/takushimiki/prml-52113785)
    - 教科書に沿った内容
- [パターン認識と機械学習 (PRML) 第１章－「多項式曲線フィッティング」「確率論」](https://www.slideshare.net/hamadakoichi/prml-3983027)
    - 33ページ目から．タイトルの内容に絞った内容
- [PRML読書会1スライド(公開用)](https://www.slideshare.net/tetsuroito/prml1-43896906)
    - 教科書に沿った内容．よりシンプル．
- [PRML上巻勉強会 at 東京大学　資料　第1章前半](https://www.slideshare.net/alembert2000/prml-at-1)
    - 19~23ページの乗法定理などの図がわかりやすい．
- [多項式あてはめで眺めるベイズ推定~今日からきみもベイジアン~](https://www.slideshare.net/tanutarou/ss-80824894)
    - 決定的手法，確率的手法，ベイズ的手法の違いがわかる．

### Jupiter notebook 
- [最小二乗法、ガウスノイズモデル、ベイズ線形回帰モデルによる多項式あてはめ](https://gist.github.com/tanutarou/309cd8c0c725224d96526f25c20d3262)
- [ベルヌーイ試行のMAP推定、ベイズ推定の例：きのこ傘投げ問題](https://gist.github.com/tanutarou/ce54e60ffe35ed96de21ec394f30bffb)
- [ポアソン分布に対するベイズ推論(メール受信数を例に実験)](https://gist.github.com/tanutarou/4f4a37ed9aa97cd441b4fd62be452fdd)

### その他
- [ベイズ的最適化：スライド](https://www.slideshare.net/issei_sato/bayesian-optimization)
- [ベイズ的最適化：動画](https://www.youtube.com/watch?v=pQHWew4YYao)
- [ベイズ推定とグラフィカルモデル：コンピュータビジョン基礎1 on Udemy](https://www.youtube.com/playlist?list=PLDVKrmVEl_WuQ7YH428j1pVhkVhA6Cl99)
- [藤井四段で学ぶ最尤推定、MAP推定、ベイズ推定](https://qiita.com/jyori112/items/80b21422b15753a1c5a4)
bash_profileとかって誰が読んでいるんだろうと。

時間が空いてしまいましたが、ちょこっと先週調査した内容についてまとめ。

# bashの設定ファイルと呼ばれるものとは
aliasとか細々自分のやりたいようにbashを設定したい時に色々やると思うんですよ。
よく使うコマンド系をaliasに貼る、とか
色を変える、だとか
pathを通すとかも含まれるでしょうか。


その方法を調べるとよく

```
~/.bash_profile
~/.bashrc
```

がよく名前が上がるかと思います。
あとは上のファイルにちょろっと追記した上で

```
~/.bash_alias
```

だとかファイルを追加して分割している方もいらっしゃるようです。


# 調査の目標と動機
## 目標
- ~/.bash_profile
- ~/.bashrc

って誰やねん、という疑問を解きたい。

## 動機
なんで~/.bash_profileだとか~/.bashrcという決め打ちのファイルに設定すればいいんだろう？そしてそれ以外のファイルにいいやつは本当にいないんだろうか？
と思ってしまった。とりあえずmacを使っているので、ターミナルを起動した時にどんな感じで動いているのかが軽く分かればいいかな、というライトな気持ちで調べてみた。

# 時系列順に調査結果報告

とりあえず/に移動して、profile読み出していそうなものをfindかけてみた。
結果

```
/etc/profile
/etc/bashrc
```

というやつがいることがわかった。ふむ。
とりあえず/etc/profileを読むと次のようになっていた。

```
if [ -x /usr/libexec/path_helper ]; then
	eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
	[ -r /etc/bashrc ] && . /etc/bashrc
fi
```

とりあえず$Pathの設定と、bashの場合に限って/etc/bashrcを読みに行ってくれるらしい。
なるほど。
ちなみにshにも分類？というか分岐というか、そんなものがあると初めて知った。
- sh: 元祖BournShell
- bash, ksh, etc..: B系シェルと呼ばれる。bashがよくいるやつ。
- csh, tcsh, etc..: C系シェルと呼ばれるやつ。C言語風らしい。
- zsh: 上記二つのあいのこみたいなやつ？らしい。使ってないからわからん。
- fish: なんか先輩が使いやすいって言ってた。

/etc/profile にある${BASH-no}ってbashを使用していないときは"no"って入ってて、/etc/bashrcは読み込まれなくなっているっぽい。
まぁどっかで入れているんだろう。

さて
現状まだターミナルを起動した時に~/.profileだとかが読み込まれている気配はない。

というわけで先輩に助言をいただいたところ、なんとSystem系のUtilだし、Linux-sourceみてみたら？とのこと。

ガチンコやないか、、、

.

.

.


profileさえ分かればいいので、linuxのドキュメントをダウンロードしてfindかけて必要そうな内容をつまんでいくことに。
https://github.com/tkmru/linux-insides-ja/blob/master/SysCall/syscall-4.md
こちらにありがたいことにbash関連のコメントが発見された。
要はbash起動時の話なんだけれど、とりあえず起動時にこんなことしているよ、とのこと

* checks and tries to open /dev/tty;
* check that shell running in debug mode;
* parses command line arguments;
* reads shell environment;
* loads .bashrc, .profile and other configuration files;
* and many many more.

なるへそ。
下から2番目の[loads...]あたりが多分私が知りたいことなのだろう。
というわけでbashのソースの中のshell.cに含まれるmainを読みに行きましたとさ。
https://github.com/bminor/bash/blob/master/shell.c

Cやってないから辛いよと思いつつ
プリプロセッサなんてものがいるのかと思いつつ
探してみたところありましたよ。
ファイル名は全て変数に直打ちで
- profile使わない設定をしていないのであれば必ず
=> /etc/profile
- sh を使うのであれば
=> ~/.profile
- bashを使うのであれば上から順に探してあったらそこまで
=> ~/.bash_profile
=> ~/.bash_login
=> ~/.profile

と読みにいくよ

と分岐の流れから完全に書いてありました。
そしてbashrcに関してはprofileでは読みにいっていません。
/etc/bashrcに関しては上でのせた/etc/profileで読みにいくようになっています。
~/.bashrcに関しては、~/.profileにbashrcの設定を読みにいくように追記することが多いようです。
というように両方の設定方針は揃えてあるようですね。


はい。
実際にあのファイル名でないと読みにいってはくれないということがわかったので私は満足。
というわけで備忘でした。
getUserMedia()でブラウザから端末の映像と音声を取得する方法。

# 目的
getUserMedia()でブラウザから端末の映像と音声を取得する。

# 環境
* OS: macOS Mojave 10.14.4
* ブラウザ: Google Chrome 73.0.3683.103
* エディター: Visual Studio Code 1.33.0
* ローカルサーバー: [Live Server](https://github.com/ritwickdey/vscode-live-server)（VSCode拡張機能）

# ゴール
![Kapture 2019-04-11 at 22.11.57 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396925/73fcf921-76e6-68e1-9043-8726de860d15.gif)


# ソース
## javascript
```javascript:js/main.js
"use strict";

// 映像と音声をストリーミングする
const mediaStreamConstraints = {
  video: true,
  audio: true
};

// ストリームが読み込まれる動画要素
const localVideo = document.querySelector("video");

// 動画で再生されるlocalStream。
let localStream;

// video要素にMediaStreamを追加する処理。
function gotLocalMediaStream(mediaStream) {
  localStream = mediaStream;
  localVideo.srcObject = mediaStream;
}

// エラー処理
function handleLocalMediaStreamError(error) {
  console.log("navigator.getUserMedia error: ", error);
}

// MediaStreamを初期化
navigator.mediaDevices
  .getUserMedia(mediaStreamConstraints)
  .then(gotLocalMediaStream)
  .catch(handleLocalMediaStreamError);
```

### 概要
```javascript:js/main.js
"use strict";
```
* `'use strict';`を使うと、的確なエラーチェックが行われる。

```javascript:js/main.js
// 映像と音声をストリーミングする
const mediaStreamConstraints = {
  video: true,
  audio: true
};
```
* constraints引数で取得するメディアを指定できる。

```javascript:js/main.js
// 動画で再生されるlocalStream。
let localStream;

// video要素にMediaStreamを追加する処理。
function gotLocalMediaStream(mediaStream) {
  localStream = mediaStream;
  localVideo.srcObject = mediaStream;
}
```
* `getUserMedia（）`が成功すると、カメラからの映像と音声がvideo要素のソースとして設定される。


## html
```html:index.html
<!DOCTYPE html>
<html lang="jp">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>WebRTC - getUserMedia()</title>
  <link rel="stylesheet" href="./css/main.css">
</head>
<body>
  <h1>WebRTC - getUserMedia()</h1>
  <video autoplay playsinline></video>
  <script src="js/main.js"></script>
</body>
</html>
```
### 概要
```html:index.html
<video autoplay playsinline></video>
```
* autoplayは必ず設定する。

## css
```css:css/main.css
video {
  max-width: 100%;
  width: 320px;
}
```
* 動画の適切なサイズと最大サイズを設定するためにwidthとmax-widthを追加する。高さは自動計算される。

# その他
* ブラウザのConsoleで`localStream.getVideoTracks()`を叩くと、videoTracksの情報が取得できる。
![スクリーンショット 2019-04-11 22.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396925/bea70a5b-8b19-db8f-52bd-a164e5df62e1.png)


# 引用元
[Real time communication with WebRTC](https://codelabs.developers.google.com/codelabs/webrtc-web/#3)
Jetson Nano 開発者キットで Raspberry Pi カメラを使う

Jetson Nano 開発者キットに Raspberry Pi カメラ (V2) を接続して基本のカメラ・スルーを試してみましょう。

# カメラの取り付け

![IMG_0602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384208/0a7922f9-2be5-c1eb-0a03-d84ceece4956.png)


# GStreamer コマンドで実行

```
$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=(fraction)30/1' ! nvoverlaysink -e
```

終了するときは Ctrl + C

# OpenCV で実行

まず、numpy モジュールのアップグレード。

```
$ sudo apt-get update
$ sudo apt install python3-pip
$ sudo pip3 install --upgrade numpy
```

コードは以下のとおり。
[How to Capture and Display Camera Video with Python on Jetson TX2](https://jkjung-avt.github.io/tx2-camera-with-python/) を参考にさせていただきました。

```python:nano_cam_test.py
import cv2

GST_STR = 'nvarguscamerasrc \
    ! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)30/1 \
    ! nvvidconv ! video/x-raw, width=(int)1920, height=(int)1080, format=(string)BGRx \
    ! videoconvert \
    ! appsink'
WINDOW_NAME = 'Camera Test'

def main():
    cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)
    
    while True:
        ret, img = cap.read()
        if ret != True:
            break

        cv2.imshow(WINDOW_NAME, img)
        
        key = cv2.waitKey(10)
        if key == 27: # ESC 
            break

if __name__ == "__main__":
    main()
```

コードの実行

```
$ python3 nano_cam_test.py
```

エスケープキーを押すとプログラムの実行は終了。
以下のようなエラーが出るときは

```
Gtk-Message: 22:21:01.949: Failed to load module "canberra-gtk-module"
```

libcanberra-gtk-module と libcanberra-gtk3-module をインストールするとエラーは消えますが、エラーが出ても実行できているのでその必要性は不明。

```
$ sudo apt install libcanberra-gtk-module libcanberra-gtk3-module
```

以上です。
Unityのandroidバイナリのgradleビルドで、DexArchiveMergeExceptionが出た時の対処法

### はじめに
UnityのAndroid gradleビルドで下画像のようなDexArchiveMergeExceptionが出た時の
対処法を示します。
![unitybuildfailer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61218/93fa9dbc-af7a-0688-35bd-503d550c7634.png)

### なぜこのエラーが出るのか
Unityで色々なpluginなどを入れていくと、プラグイン用のgradleのファイルであるmainTemplate.gradleなどに書いてあるダウンロードモジュールと、他のpluginのjarファイルや、たのgradleファイルのテンプレートと衝突してしまうことが起こり、このエラーが起きてしまうようである。

### 解決方法
- 手順1<br>
Unityでビルドする際、Build Settingのところで、Export Projectにチェックを入れ
Android Studio用のプロジェクトを生成する
<img width="610" alt="スクリーンショット 2019-04-11 22.25.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61218/ed10f984-9b41-f042-ec2c-16111060da04.png">
- 手順2 <br>
Android Stdudioで先ほど出力したプロジェクトを開いておく、Android StuidoのPreferencesのところでKotlin Compilerの所を選択し 下の画像のように<br>
``` Additional command line parameters ```
に<br>
``` --info ``` <br>
```-stacktrace```<br>
を追加する
<img width="764" alt="スクリーンショット 2019-04-11 22.31.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61218/f7b366f7-dd26-27d6-b7be-b109b12fa44b.png">

- 手順3<br>
手順2で開いていたプロジェクトをMake Projectでビルドすると下の画像のようなエラー（今回の場合は、support.v4ライブラリが原因であったことがわかる）が表示され、モジュールが多重定義されていたことがわかる。
<img width="502" alt="スクリーンショット 2019-04-11 22.05.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61218/5fbb97ae-f734-a006-ccdc-c71094101983.png">
- 手順4<br>
Unityのほうに戻り、mainTemplateを編集するなり、重複しているjarなりaarなりを削除する。

### 終わりに
今回のAndroid Stduioのほうにビルドでしてみてエラーを解決する方法は、他のエラーを除去
するテクニックにも使えるかもしれません。
GitHub Flow で master を汚さない開発を

# GitHub Flow を取り入れた背景

私は SIer で小規模チームを取りまとめています。ソースリポジトリは Git を使っていたのですが、ブランチを切らずに master のみで運用していました。

**課題**

master のみの運用だと正常動作しないコードが混入することもありました。

**対応**

なので、新機能開発やバグフィックスの際にはブランチを切って、レビューの通ったコードのみ master にマージするようにしました。マージ後はすぐにデプロイします。

![GitHubFlow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48133/9c3da284-5023-25bf-0cbd-f7d7b04f95c7.png)

**成果**

master をクリーンな状態に保てています。また、レビューにより若手メンバの育成にもなります。

**できていないこと**

* プルリクエスト → 席が近いので、口頭で対応しています。
* テストコードを書くこと → 今後、ソースが大きくなると不可欠なのですが、現時点ではテストコードをかけてないです。
* デプロイの自動化 → 手作業が混ざってます。 

品質や費用対効果を見ながら施策を打つ必要がありますが、テストコードくらいは書かないとなーと思っています。

# コマンド

よく忘れるので、いつどのようなコマンドを実行するかも一通り書いておきます。

### 新機能の開発やバグフィックスをする時

branch を切って開発します。ブランチ名は何をするかがわかるような名前にします。次のコマンドでブランチを切りつつ、ブランチに移動します。

```
$ git checkout -b ブランチ名
```

定期的に push します。一通り書けたらレビューアに声がけする運用にしています。

```
$ git push origin リモートブランチ名
```

### 他の開発者やレビューアが pull する時

まず、ブランチを切り、ブランチに移動します。

```
$ git checkout -b ブランチ名
```

そのブランチ上で pull します。

```
$ git pull origin リモードブランチ名
```

なお、この状態からコミットを行なって push したい場合は次のようにローカル、リモートの両ブランチを指定する必要があります。

```
$ git push origin ブランチ名:リモートブランチ名
```


### レビューが通って、マージする時

master に移動します。

```
$ git checkout master
```

マージします。

```
$ git merge ブランチ名
```

master を push します。

```
$ git push origin master
```

# 最後に

上記の施策は何ちゃって GitHub Flow ではあるのですが、以下の効果が出ています。

* master をクリーンに保つ
* レビューにより、若手メンバの育成

シンプルなフローなので、覚えることが少なくすぐ取り入れられる施策でした。とはいえ、開発効率をスケールさせつつ品質を保つにはその他の自動化も推進しなければ！と思っています。
インスタンスの外からメソッドを呼ぶ

　初投稿です。インスタンスの外からメソッドを呼びたいときがあります。

Vue インスタンスはマウントした要素の `__vue__` プロパティにセットされるそうなので、例えば次のようなコンポーネントがあったとき

```vue
<template>
  <div id="awesome-element" />
</template>

<script>
export default {
  methods: {
    awesomeMethod () {
      // ...
    },
  },
}
</script>
```

次のようにメソッドを呼ぶことができます。

```javascript
document.querySelector('#awesome-element').__vue__.awesomeMethod()
```

これがいつ必要になるんだという話ですが、WKWebView とか WebView とかそういう事情があります。