OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習について

#はじめに
今回は，よく耳にする機械学習について，自分なりにまとめてみた．
というものの，ちょっとした事情から予め機械学習に触れてはいた．だがしかし，ある程度の知識はあるけれどもまだフワッとした知識が目立つので，ここらで一つ，自分の知識まとめをしようと思った．
本記事は機械学習の大まかな知識を，自分なりの言葉でまとめていければ，と思う．

#機械学習とは
そもそも機械学習とは何か，ここをはっきりさせておこう．

>機械学習(Machine Learning: ML)は，明示的な指示を用いることなく，その代わりにパターンと推論に依存して，特定の課題を効率的に実行するためにコンピュータシステムが使用するアルゴリズム及統計モデルの科学研究である．
(参照wiki: https://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92)

・・・難しいですね．一言でまとめるとしたら，「コンピュータがデータ群から学習し，課題を効率的に実行できるようなシステム」といった感じですかね．
システム例として身近なものだと，スパムメールフィルタが挙げられる．スパムメールなどには一定の規則(メールアドレスが同じ，文面が同じ 等)が存在するため，その規則を推測し迷惑メールボックスに振り分けていく，といった形を取っている．

##機械学習のカテゴリ分け
一口に機械学習といえど，やはり用途や目的によって部分的に異なっていく．
ということで，まずはそれぞれを説明する前に，こんなカテゴリ分けになることを先にみておきましょう．
![スクリーンショット 2020-04-21 15.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363473/d85098e3-7152-f950-7acb-603be2fbbbac.png)

それぞれを今回は大まかにまとめてみるが，その前にまずは`教師あり学習`と`教師なし学習`の違いを先にまとめる．

まず`教師あり学習`だが，これは予め入力と出力をセットで機械に学習をさせ(これを教師データ，訓練データなどという)，出力がわからない入力に対して出力を予想する，といった機械学習手法のことである．つまりは，予想問題をいっぱいやって傾向を読み対策を立て，答えがまだわからない本番問題に取り組む，受験と同じようなものだろう(この例えは如何なものか...)．
次に`教師なし学習`だが，これは先と違うということなので，ラベルがついていない入力データ群を用いて機械に学習させる手法である．ここから教師なし学習では，入力データの隠れたパターンや規則を機械が見つけ出すことを目的としている．つまり，目的とする出力などはなく，学習結果なども簡単には期待値や正解を出すことができない．先の例で例えるとしたら，ぶっつけ本番試験に臨み，その場で今回の問題の傾向を見つけていくようなものかな(この例えは...)(ちゃんと受験勉強はしておきましょうね)．

###回帰
教師あり学習手法の一つである，`回帰`．具体的な目的として，回帰は連続的な出力結果を得たい時に用いる手法である．
例えば，株価を予測していきたい時は過去の株価の変動データを元に今後の株価の値を連続的に判断して予測を立てていきます．これが`回帰`の手法となります．
一言で言うと「入力データの連続値を線で予想する」といった感じですかね．
(某流行りのゲームでもカブ価予測は回帰を使えるのでしょうか？)

###分類
教師あり学習手法の一つである，`分類`．具体的な目的として，分類は離散的な出力結果を得たい時に用いる手法である．
例えば，アヤメの種類を予測する時に，花弁の長さや幅といった離散的な値から，このアヤメはAと言う種類に分類される，と言うように予測を立てていきます．これが`分類`の手法となります．
一言で言うと「入力データの離散的な値からグループ分けを予想する」といった感じですかね．

###クラスタリング
教師なし学習手法の一つである，`クラスタリング`．具体的な目的として，未知のデータ群から特徴によってCluster(集団)を見つける手法である．
もちろん，教師なし学習のためラベルを与えるなどは一切しない．そのため，複数のグループ分け種別などが予測されるが，それをまたもう少し細かく制御していくことで，適正なClusterを見出していく．
年齢や性別，嗜好性などからClusterを作成し，それぞれのClusterに適したメールを送信する，といったレコメンデーションやマーケティングなどに用いられたりする．

###次元削減
教師なし学習手法の一つである，`次元削減`．だが，これは少し今までとは異なる．
機械学習における「次元」だが，これはいわゆる要素のことと考えてもいい．様々な要素からなるデータを学習させていくのだが，その中でも重要度が低い要素があったとしたら，その要素は学習から省いても学習結果に問題ない事になる．この作業が次元削減のことだ．
いろいろな要素を加味して機械学習を行いたい，といった気持ちはわかるがいらない情報(ノイズ)を入れてもそれはただの無駄．そう言うのをなくしましょうね，といったものが次元削減のことである．
もちろん当たり前だけど，重要な要素は削減したりしないように！

`+α知識`
「どの変数を削減するのか」→「削減した結果どう影響が出るのか」といったことは，教師データとして存在しないため，その観点から教師なし学習に分類されることになります．
また削減したモデルを用いて，教師あり学習にもう一度つっこんで学習させる，と言うことも機械学習ではよくある手法．つまり，こんな感じで分析をする前処理としても利用されるため，そういったところからなんか難しい，応用テクニックとして感じてしまう...

#まとめ
今回は大まかな形で機械学習についてまとめてみた．
うーん，やっぱり言葉にして説明するってのはなかなか難しいな，とすごく思いました．
次回からはそれぞれの学習手法について掘り下げていくので，そこでもっと言語化を図れるようにしていこうと思います．
作らせるより、読ませる（読解する）ほうが教育としてよいかもしれないと思った

#新人向けの研修をやって思った
目的通りのことを伝えようと思ってもなかなか難しい。
理解したかどうかも個人差があるし、うまく伝えられたかも不安だ。
「伝わっただろう」では独りよがりだし、アンケートは実施したが実際のところはどうだろう？

所属会社はIT系ではないので、新人研修で教える中で比較的難易度が高いのはExcel関数の使い方。
厳密にいえば、複数の組み合わせをするなどの「使いこなし方」と言えるかもしれない。

だけどそんなものが、一日・二日で身につくでもなく、かといってやらないわけにもいかない。
そこで色々考えた結果、コードレビューの考え方は実務的かつ模範解答としてよいのではないかと思った。
そしてこれは、プログラム研修でも同じことではないかなと思ったのでQiitaで書いてみる。

##考えることは重要である
なので、研修では当然ある程度の説明をしたあとは「自分たちで作る」という時間を与える。
という研修を行うところがほとんどではないだろうか。

理由は、
　・学んだことを実践できるかの確認
　・「考えてみる」ということが重要性によるもの

誰だってそうする、俺もそうする。

##では質はどうだろう？
「じゃー、みんなやってみよう！　わからないところがあったら聞いてね」
という感じでやる際、質は度外視で行うことが前提になる。
できるほうが稀と思っておいた方がいいぐらいの感覚でやっていると思う。
初期の段階ではそれも必要ではあると思うのだけど。

でも会社は実戦で使えるレベルまで引き上げることを期待している。
この矛盾をどう埋めたものか。

##銃口を敵に向けて撃て、それで敵は倒せる
実戦とは果たしてそういうものだろうか？
理論・概要を教えたら戦場に放り込む。生きて帰れたら一人前だ。

ふと自分のやり方を振り返ってみたら、そんなことをやっているように思えた。

実際、Excel関数を利用して何かやるとするならば、
　　①受領データをシステムに登録する（CSVとか？）
　　②システムに正しく取り込まれているか、出力する
　　③１と２のデータをぶつけてチェックする
みたいなことは比較的どんな会社でもやることがあるパターンだと思う。

労務だと、一部の社員に手当を払うときなど、
　　①支払われた社員のチェック
　　②それ以外の社員に金額のってないかのチェック
の両方が必要になったりするので、１と２の総量には差が生じる。

そうしたときに、VLOOKUPなんか使うと容易に「#N/A」が発生するし、個別以外にも総額があっているか等、目線の変化も必要になる。エラーはどう処理しておくといいのか、突合結果をどう評価する？
そういうのが実戦利用だと考えると、

**新卒がすぐにできるかそんなもん**

という結論に至ったからだ。
できるのは経験者か、生まれながらの戦闘種族か何かだと思う。
仮にできたとしても、OJTで３～６ヵ月ほどしてからだろう。

##コードレビュー式教育
通常コードレビューは、間違いや不具合といった問題を解消し品質を高めるために行う作業で、レビューアーとなる人はそれなりに知見のある人でなければならない。
それを新卒にやらせるのはどうなのだろうか？という疑問もあると思うが、目的が違うので問題ない。

限りなく模範解答に近い考え方を読み解くという行為は、本人の視野を広げるのに役に立つ。と思う。
少なくとも「こういうところに気を付けて作ってね」と何度も教えるより、「こういうところに気を付けて作るとこうなるのか」を覚えるところにシフトしていったほうが理解は伸びないだろうか。
この工程でも「考える」ということは実践できる。

ならば、作ったものに赤ペンつけるよりは、効果が期待できそうに思える。
逆転の発想。実戦で使えるものを作らせたいなら、実戦で使っているものを見せればいい。

なにもコードの全て、ツールの全ての動きを最初から理解する必要なんてない。
一部でいいので読むことができれば、徐々に全体を掴んでいけるはずだ。



##そういうわけで研修方針を変えて実践する
良くも悪くも、ある程度の結果が出たら、また記事にしたいと思います。
【Salesforce】簡単にCSSを反映する方法

#はじめに

最近業務で書き始めたSalesforceのVisualforceについて記載します。
まだ始めたばかりの初心者なので、もし認識違い等あればコメントでご連絡いただけますと助かります。

#本記事の対象
- Visualforceを始めたばかりの1週間前の私
- Visualforce初心者
- VisualforceでCSSを簡単に反映したいと思っている方

#VisualforceにCSSを反映する

VisualforceにCSSを反映する方法は、3通りあります。

**①HTMLベタ書き**


```html
<head>
  <style type="text/css">
     p{
        color:#fff;
        background-color:#000;
       }
  </style>
</head>
```

**② 外部Stylesheet(自作)を呼び出し**

　あることは知っているけど、やり方等詳細はわからないので飛ばします
　公式サイトには書いてあるっぽい…？

https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/apps_css_external_platform.htm



**③　外部Stylesheet(Salseforce公式)を呼び出す**
　この存在を`1週間前の私に教えてあげたい`ってことで、`今回のメイン`です。

　Salseforceには公式のStylesheetなるものが存在しています。
　何者かというと、以下の一文を追加して、後は公式のクラス名を当てはめれば勝手にCSSが反映されます。
　https://www.lightningdesignsystem.com/

```css

<apex:stylesheet value="{!URLFOR($Resource.SLDS, 'styles/salesforce-lightning-design-system.min.css')}"/>

```



## たとえば余白（margin）を付けたい場合

①「Search」に「margin」と入力して検索します
https://www.lightningdesignsystem.com/

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413382/2a97a518-98e8-831b-81ad-68a73602b021.jpeg)


②使いたいMarginを選んで、`divタグ`をコピー
　赤枠で囲った部分をクリックしてもコピーはできる🙆
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413382/591bbd52-920e-0bcb-c985-dc020832153c.jpeg)


③先程コピーした`divタグ`を使用したい部分に記載する
　普段書く`Class名`と同じように指定すればOK
　なので、`pタグ`などに指定してもOK

``` html
（記載例）

<div class="slds-m-around_xxx-small">
   <h1>テスト</h1>
</div>
```

##よく使うやつ
個人的に良く使うやつ

Margin（**外側**の余白）
https://www.lightningdesignsystem.com/utilities/margin/#site-main-content

Pdding（**内側**の余白）
https://www.lightningdesignsystem.com/utilities/padding/#site-main-content

ccenter（画像とかテキストを**中央に揃える**）
https://www.lightningdesignsystem.com/utilities/alignment/

grid（画像の横並び **レスポンシブにも対応**）
https://www.lightningdesignsystem.com/utilities/grid/#site-main-content

table（みんな大好き？テーブルさん）
https://www.lightningdesignsystem.com/components/data-tables/#site-main-content

#最後に
これを知っているだけで、開発工数が縮まると思います

Salesforceに興味がある方は、`trailhead`がおすすめみたいです！
https://trailhead.salesforce.com/ja/home
プロキシの切り替えを簡単に行えるアプリをHTA(VBS)で作ってみた

#経緯
先日身内の職場でSurfaceが配布された。しかし職場の人間（当人も含めて）プロキシについて理解しておらず、ポータブルPCなのにも関わらずだれも社外で使えないという意味の分からない状態になっているそうなので簡単にプロキシの切り替えを行えるアプリをVBSで制作した。
#仕様・外観
<h3>仕様</h3>
プロキシ名とポートを自分で設定出来る。自由度が高く、ブラウザ等から設定変更するよりスムーズに操作出来る（はず）。
<h3>外観</h3>
![sdf.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624501/178a167e-31ed-08cf-d728-9e487a7dd8ef.png)


#コード
```vbs:change_proxy.hta
<html>
<head>
<meta charset = "UTF-8">
    <title>change_proxy</title>
</head>
<script language="vbscript">
' 画面サイズ変更
Sub Window_OnLoad
  Window.ResizeTo 540,330
End Sub
</script>

<body>
<form name="form1">

<p><br>
<input type="radio" name="rd" />プロキシ有効化<br></p>

<p>プロキシ名:ポート
<input type="text" name="text1" value="xxx.ne.jp:8080" />

</p>
<input type="radio" name="rd" checked />プロキシ無効化<br></p>
<input type="button" value="変更"
onClick="subGo()" />


<textarea name="kekka" cols="30" rows="4"></textarea>
</form>

  <script language="VBScript">
Sub subGo()

'値を取得
strKekka = "値を" & document.form1.text1.value & "に変更しました" & vbcr

'ボタンの値を取得
For i = 0 To document.form1.rd.length - 1
if document.form1.rd(i).checked then
loops = i + 1
end if
Next
if loops = 1 then
strRadio = "有効"
elseif loops = 2 then
strRadio = "無効"
end if

strKekka = strKekka & "プロキシは" & strRadio & vbcr



'値を返す
document.form1.kekka.value = strKekka


Dim objShell:Set objShell = CreateObject("WScript.Shell")
base = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\"

If strRadio = "有効" Then

objShell.RegWrite base + "ProxyEnable", 1, "REG_DWORD"
    objShell.RegWrite base + "ProxyOverride", "<local>"
    objShell.RegWrite base + "ProxyServer", document.form1.text1.value
Else

 objShell.RegWrite base + "ProxyEnable", 0, "REG_DWORD"
End If
End Sub
</script>
</body>
</html>
```
#参考
https://tanamon.hatenablog.jp/entry/20090417/1239935940
matpplotlibでNanのデータを無視して線でつなぐ

# プロットしたいNaNの入ったCSVデータ
下記のような不等間隔な時刻ごとのデータが入ったCSVファイルのデータをプロットしたいとします。
bar1からbar4がデータ。途中で抜けがあります。

| ﻿time   | data1 | data2 | data3 | data4 |
|--------|------|------|------|------|
| 0      | 449  | 449  | 445  | 440  |
| 510.1  |      |      | 445  | 442  |
| 530.1  | 420  |      |      |      |
| 730.1  |      | 410  |      |      |
| 1430.1 | 412  | 425  | 424  | 421  |

これをそのままプロットすると、空白部分でmatplotlibの線が切れて、ブチブチのグラフになります。
直線でつながるようにしたって話です。

# そのままデータフレームにしてプロットしてみる
``` python
import pandas as pd
df = pd.read_csv("data.csv")
print(df)
```
なにも考えずにread_csvでデータフレームに入れると、空白部分がNaNになります。

|   | time   | data1 | data2 | data3 | data4 |
|---|--------|-------|-------|-------|-------|
| 0 | 0.0    | 449.0 | 449.0 | 445.0 | 440.0 |
| 1 | 510.1  | NaN   | NaN   | 445.0 | 442.0 |
| 2 | 530.1  | 420.0 | NaN   | NaN   | NaN   |
| 3 | 730.1  | NaN   | 410.0 | NaN   | NaN   |
| 4 | 1430.1 | 412.0 | 425.0 | 424.0 | 421.0 |

```python
import matplotlib.pyplot as plt
markers1 = ["d", "o", "v", "^", "<", ">", "1", "2", "3", 
            "4", "8", "s", "p", "*", "h", "H",  "x", "D", "|", ","]
fig0 = plt.figure(figsize=(8.2,8))
ax = fig0.add_subplot(111)

ax.set_ylim(390,450)

for i in range(4):
    ax.plot(df["time"], df["data"+str(i+1)], marker=markers1[i], label="data"+str(i+1))
ax.legend(bbox_to_anchor=(1.01, 1., 0., 0), loc='upper left', borderaxespad=0.,)
```

それをmatplotlibでプロットすると線が切れて表示されます。全部つないでほしい。
![nan0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43609/620d83d6-74e5-95c9-26ad-70ef87fe1804.jpeg)

# どうするか？
プロットする段階でNaNをdropnaで削除してからプロットします。"time"列のデータは全部埋まっていて、dropnaで消えないので、予めindexにしておきます。

```python
df = pd.read_csv("data.csv",index_col=0)

fig0 = plt.figure(figsize=(8.2,8))
ax = fig0.add_subplot(111)

ax.set_ylim(390,450)

for i in range(4):
    ax.plot(df["bar"+str(i+1)].dropna(how='any'), marker=markers1[i], label="data"+str(i+1))

ax.legend(bbox_to_anchor=(1.01, 1., 0., 0), loc='upper left', borderaxespad=0.,)
```
つながりました。

![nan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43609/b09477ee-fe12-173a-2214-692082210932.jpeg)

# 補足
+ ちなみにgnuplotでやると、最初のCSVをプロットしただけで、そのまま全部つないでくれました。
+ データフレームのinterpolateでやると、NaNは無視して補間してくれますが、time列のデータ間隔を反映して補間するなんてことはしないので、今回の場合は適用できません。

```python
print(pd.read_csv("data.csv").interpolate())
```

|   | time   | data1  | data2  | data3  | data4  |
|---|--------|-------|-------|-------|-------|
| 0 | 0.0    | 449.0 | 449.0 | 445.0 | 440.0 |
| 1 | 510.1  | 434.5 | 436.0 | 445.0 | 442.0 |
| 2 | 530.1  | 420.0 | 423.0 | 438.0 | 435.0 |
| 3 | 730.1  | 416.0 | 410.0 | 431.0 | 428.0 |
| 4 | 1430.1 | 412.0 | 425.0 | 424.0 | 421.0 |

data1の510.1のところをみると、ここは元はNaNでしたが、449と420の平均値434.5になってます。今回の場合は0, 510.1, 530.1の間隔を考慮して補間する必要があります。

gnuplot最強ってことがわかっただけなきもしなくもない。。。
１、pipの再インストール

winpython　pip使用時のエラー対策で、pipを再インストールした。

```python
pip list
```
pip使用時、下記のエラーがよく出ている。ネットに調べると、"PATHが汚くなってます。"大体書いています。pipを再インストールすると対応できたので、メモします。

```python
Fatal error in launcher: Unable to create process using '""c:\program files\python36\python.exe"  "C:\Program Files\Python36\Scripts\pip.exe" '
```

既存pipの削除：

```python
python -m pip uninstall pip
```

下記の[参考ページに](https://packaging.python.org/tutorials/installing-packages/#use-pip-for-installing)、get-pip.pyをダウンロードして、python get-pip.pyで実行すると、再インストール完了です。(英語で読みづらいので、「get-pip.py」で検索できます)

```python
python get-pip.py
```

参考（英語）：
https://packaging.python.org/tutorials/installing-packages/#use-pip-for-installing

目次　[非IT業種のITメモ](https://qiita.com/ousrok/items/135734b5f66afb497253)
Composerを更新しようとしたら「SHA384 is not supported by your openssl extension, could not verify the phar file integrity」で失敗する

# 事象

コマンド `composer selfupdate` を実行してComposerの更新を試みたところ、以下のエラーが発生する

```
[UserName: laravel]$ composer selfupdate
Updating to version 1.10.5 (stable channel).
   Downloading (100%)


  [RuntimeException]
  SHA384 is not supported by your openssl extension, could not verify the phar file integrity


self-update [-r|--rollback] [--clean-backups] [--no-progress] [--update-keys] [--stable] [--preview] [--snapshot] [--set-channel-only] [--] [<version>]

[UserName: laravel]$
```


# 原因

利用しているComposerのバージョンが古く、正常に更新が行われない。

【 同一事象の GitHub Issue 】
[SHA384 is not supported by your openssl extension, #7802](https://github.com/composer/composer/issues/7802)


# 対応

公式ページ [Download Composer](https://getcomposer.org/download/) の手順に従い、composer.pharをダウンロードする。
以下はバージョン1.10.5の例。

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

公式ページ [Installation - Linux / Unix / macOS](https://getcomposer.org/doc/00-intro.md#globally) の手順に従い、インストールする。
以下はグローバルインストールの例。

```
mv composer.phar /usr/local/bin/composer
```

Composerのバージョンを表示させ、正常にインストールされたかを確認する。

```
[UserName: bin]$ composer --version
Composer version 1.10.5 2020-04-10 11:44:22
[UserName: bin]$
```
BVE5 JR神戸線データ エラーの対処方法

2019年秋に公開された、鉄道シュミレーターBVE5のJR神戸線データ。
とてもリアルに播磨路を駆け抜けられる一方、プレイしようとすると「オブジェクト参照がオブジェクト インスタンスに設定されていません」とエラーが出てしまいます。
本記事ではそのエラーへの対処方法について書かせていただきます。

#1. 路線データをダウンロードする
mackoy様制作のBVE 5.7 がダウンロードされていることを前提に進めていきます。

[こちらのサイト](https://kumoha12.web.fc2.com/JRKobe/Index.html)からJR神戸線の路線データをダウンロードします。
次に、[こちらより](https://kumoha12.web.fc2.com/Common.html)Nagoya_Common 共通ストラクチャパックをダウンロードします。
すでにダウンロードをされた方も念のため、最新版のNagoya_Commonであるかご確認をお勧めします。

#2. 4GBパッチをダウンロードする
[こちらから](https://ntcore.com/?page_id=371)4GBパッチをダウンロードします。これをインストールすることにより、プレイできるようになります。
上記リンクからアクセスし、*" Download the 4GB Patch "*をクリックします。
<img width="650" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/0f845435-f288-57fc-2302-6087f6689670.png">

#3. 4GBパッチを解凍・展開する
エクスプローラー(Windowsの場合)の" ダウンロード "から4GBパッチが無事ダウンロードさせたことを確認し、ダブルクリックします。
以下のような表示が出たなら、" **はい** "を選びます。
<img width="650" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/6382fabb-f38e-b63a-de18-dbc4bdc6d404.png">
次にどのファイルにパッチするかを選ぶよう表示されます。**PC > ローカルディスク(C:) > Program Files(×86)**を選択します。
<img width="650" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/336a41c5-0563-1aec-bce0-cf08a3680fa5.png">
たくさんあるフォルダーの中から、" **mackoy** "を選びます。
<img width="650" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/f5e47b4b-c5b7-2079-9e9f-2f47f3e575e4.png">
" **BveTs5** "を選択し…
<img width="650" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/76cae40b-1645-cdbb-1e34-8a6cf8e199c6.png">
" **BveTs5** "をクリックして右下の開くを押します。
<img width="650" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/f2df3cdb-6cbf-72df-96fd-ea2d85c5269c.png">
無事完了したとのメッセージが出るので、OKにします。
すると、" **BveTs.exe.Backup** "というファイルが出現します。
コレで完了です。
<img width="650" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/68f65b45-1105-6102-a887-f573a025529f.png">

最終的にまとめると…
PC > ローカルディスク(C:) > Program Files(×86) > mackoy > BveTs5 > BveTs, BveTs.exe.Backup
という配置になっていれば良いです。(Windows10では、この配置での動作を確認)

#4. 動作確認
各シナリオファイルに車両を指定して、プレイをしてみます。
エラーなくロードでき、かつ大阪駅が表示されれば成功です！
また、データ量が多いので、プレイ画面より右クリック→設定から" 描画距離と処理速度 "を短い/速い方にすることや、" テクスチャーフィルター "の倍率を低くすることでパソコンへの負荷を減らせます。もちろんその分、ストラクチャーがガクガクしてしまいますが…

#参考サイト
ヤフー知恵袋 [ベストアンサーの回答](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10214867810?__ysp=QlZFIOelnuaIuOe3mg%3D%3D)

#最後に
このような臨場感あふれるデータを制作してくださった、JR神戸線制作チームの みくれち様、樽ﾓﾄ様、Mi5000様、南條様、サハ209様、摂津ライナー様、なっぱ様に感謝の意を表させていただきます。
本当にありがとうございます。

では、
「戸締めよし！　信号よし！　出発進行〜！」
dockerコンテナのIPアドレスを見る

起動中のdockerコンテナのIPアドレスなどを見る。

```
> docker inspect コンテナ名 or コンテナID
[
    {
        "Id": "a58cf841ba7f25af53ff2d71ac9d7ad00c0f363436297525df44e07765aae2a1",
（省略）
                    "IPAddress": "192.168.0.2",
（省略）
    }
]
```
Object destructuring / Javascript 

## オブジェクトから値を取り出す方法

例えばJavascriptのオブジェクトから値を取り出すときどのように取り出しますか。

```js
const product = {
  destination: 'hawaii',
  price: 59800,
  stock: 20
}
```

私は今まで以下のようにしていました。

```js
const dst = product.destination
const price  = product.price
```
これでも問題なく出力されます。

```js
console.log(dst, price)
>> hawaii 59800
```

## ショートハンド
再定義するのが冗長な感じがするので、以下のようなショートハンドで記載可能です。
destinationにdstを割り当てる

```js
const { destination: dst, price } = product
```
同じ結果が得られます。

```js
console.log(dst, price)
>> hawaii 59800
```

順を追って書き直すとイメージしやすいです。

```js
// 1. {}という変数にproductオブジェクトを定義
const {} = product
```

```js
// 2. 
const { destination, price } = product

console.log(destination, price)
>> hawaii 59800
```

```js
// 3. 新しい変数への割り当て
const { destination: dst, price } = product

console.log(destination, price)
>> エラー "ReferenceError: destination is not defined ~~~"

console.log(dst, price)
>> hawaii 59800
```

## プロパティの追加
また、既存のオブジェクトにないプロパティの追加も可能です。

```js
const { destination: dst, price, rating } = product
```

このままだとエラーが出ます。

```js
console.log(dst, price, rating)
>> hawaii 59800 undefined
```

ratingに5という値を入れてみましょう

```js
const { destination: dst, price, rating = 5 } = product
```

```js
console.log(dst, price, rating)
>> hawaii 59800 5
```
ratingが表示されました。

## 関数の引数として取り出す

```js
const addHotel = (hotel, myProduct) => {
  const { destination: dst, price } = myProduct; 
  console.log(hotel, dst, price)
}

addHotel('yhrm Hotel', product)

>> yhrm Hotel hawaii 59800
```

または、引数に直接記載します。

```js
const addHotel = (hotel, { destination: dst, price }) => {
  console.log(hotel, dst, price)
}

addHotel('yhrm Hotel', product)

>> yhrm Hotel hawaii 59800
```

## まとめ

整理すると

1. ショートハンドとして書ける
2. 新しい変数名の割り当てができる
3. 既存のオブジェクトにないプロパティを追加できる

---

## 参考
- [The Complete Node.js Developer Course (3rd Edition)](https://www.udemy.com/course/the-complete-nodejs-developer-course-2/)
- [Destructuring assignment](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
- [Destructuring objects in JavaScript](https://medium.com/podiihq/destructuring-objects-in-javascript-4de5a3b0e4cb)
カメラとRaspberry Pi(Jetson)と機械学習を利用した スマート畑盗難防止カメラ　要件定義　アイディア

##カメラとRaspberry Pi(Jetson)と機械学習を利用した スマート畑盗難防止カメラ

###構成

　Raspberry pi　５台

　1台（管理機　送信用）は　iot用のsim　管理者画面 webからも見れる


　4台（子機）　無線アンテナを取り付ける　赤外線カメラをつける　人感センサーをつける 

####要件定義
畑に設置し、畑を監視する。警告音を鳴らす。証拠映像を撮る
1台1万以下のラズベリーの構成にする
無線Lanアンテナをラズベリーに取り付け、無線ルーターを使わないようにしコストを減らす。ラズベリーだけで通信網を作る
Dockerとノウハウを販売するビジネスモデルも考えてみる
赤外線カメラ、人感センサーを主力に使う。カメラ画像中心の機械学習型にしない。
センサーを使いCPUの負荷を軽くする。詳細映像からは機械学習で判断する
すべてのRaspberry piを無線中継器にする。無線中継器同士をつなぐ　
子機はteslowflowやopenCVを動かす (DellのTPUをつけて速度を上げる　機械学習ソフトは静的言語のものを使い速度を上げる）
機械学習強い端末JetSonの導入も考える

#####センサー
赤外線センサーと人感センサーで検知する
センサーが反応したら
カメラを動かす　－　映像を機械学習で自分かどうか検知　－　自分と関係者じゃないないなら　ー　メールと現場画像をスマホに送る　
Lineやslack Mailなど　スマホアプリにPushする
アプリからブザーがなる　
現場のRaspberry Piもブザーが鳴る仕組み

#####通信構成
管理機SIM　－　無線アンテナ付き子機　－　無線アンテナ付き子機のカメラとセンター　ー　一番遠い畑

無線アンテナ付き子機同士で通信網を作る

管理機はSIMから必要なデータを上げる

無線アンテナ付き子機は中継器としての機能もある

USB接続の無線アンテナが販売されてあり、Raspberry piにつなぐことができる。広範囲につなぐことができる

Raspberry piの無線中継化はネットで調べてみると簡単にできる。無線中継器同士がつながっているか確認するソフトが必要
#####機械学習
静的言語の機械学習ソフトを使いCPUの負荷を軽くする。
学習モデルデーターセットをダウンロードで取得し適用するモデル。畑のデータなどはプライバシーにかかわるのでアップロードはしない。エッジAIにする
テンプレートなる学習モデルをどこかの農家に協力してもらい学習データー生成する。それを配信しダウンロードするモデル
センサーで取得できるデータはセンサーで優勢的に取得する。機械学習だけですべてやろうとしない

#####害獣検知機能
害獣かどうか機械学習で検知する。害獣だった場合は、警告音をならす。モデルガンのトリガーをモーターを回転させて引く BB弾を発射する

#####ソフト面
- 盗難にあっても大丈夫な仕様　データーの暗号化
- 各子機の撮影画像の確認が必要　送信テスト　
- 管理機にmysqlなどdbをいれて一元管理できる仕組み
- 子機自体がアクティブになっているかわかる仕組み
- データを管理する管理機で専用デスクトップアプリで見れるようにする
- データを管理アプリにしない。実機が盗難された時のため。ネットに依存しない
- データやアプリはバイナリーにできるものが望ましい。
- 管理機に家からVNCではいれるようにし管理画面を操作できる

#####ハード面
- 現場で確認できるモニターが必要
- 熱水雨風雪土ほこりに耐えられる仕様
- 衝撃につよい仕組み
- 市販のUSBカメラで使える
- USBSSDが使える
- 望遠カメラで高いところから監視
- 広角レンズで広い範囲を撮影-
- JetSonのような機械学習に強い端末を一台用意するのもあり、補助用に使う

#####コスト
Raspberry piは一台5千円でセンサーは千円程度などで人件費を含めても1台1万円内に収める。

#####ビジネスモデル

Dockerとノウハウを売るだけの売り方

環境設定したDockerを売ります。あとは部品を買い説明書通りに組み立ててください

Dockerに環境をインストール　プログラムや管理アプリ、インストールソフト、環境設定を用意しておく ノウハウ　説明書PDF

インストールされたDockerとノウハウを販売する。

カメラは市販のUSBのWebカメラ　USB接続のSSDを買って組み立ててくださいスタイル

####その他
　[スマート防犯カメラ](https://qiita.com/raspberryPiLove/items/44ded568020498d988d4)
　[スマート介護カメラ](https://qiita.com/raspberryPiLove/items/9f70c96383e7ccdfcc62)
　[スマート畑盗難防止カメラ]
(https://qiita.com/raspberryPiLove/items/24e81cebde33eb8c8366)

　スマート育児カメラ
　スマート園児カメラ
　スマート小学生カメラ
　スマート病院用カメラ
　スマート害獣カメラ
　スマートペットカメラ
　スマート酪農カメラ
　スマート牧場カメラ
　スマート田んぼ畑監視カメラ
　スマートお留守番カメラ
VSCodeでLaTeXを使えるようにした時のメモ

# なにをしたいか
- VSCodeでLaTeXを使えるようにした時のメモ
- ただし環境はUbuntu16

# 手順
#### tex-liveをインストール

```
sudo apt-get install texlive-full
```

#### LaTeX Workshopをインストール
- VSCodeにてCtrl+X
- LaTeX Workshopをインストール

# 実際に動かす
- Ctrl+sで保存するとともにPDF化
- Ctrl+Shift+vでview
- VSCode内で見るよう選択
基本的なコマンド

#はじめに
コマンドは、フロントエンドやバックエンドをされる方もおそらく避けては通れないだろう。
今回は、特に押さえておきたいコマンドを幾つか紹介したいと思う。

##lsコマンド
lsコマンドは、ファイルやコマンドの一覧を確認するコマンドだ。list segmentsの略で、それぞれの頭文字のlとsを取って、lsとなっている。


```Linux:Code
$ls
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341167/77cc66b2-29d6-da2f-db82-1ca081554e87.png)

上の画像よりlsと打つだけで、ファイルやディレクトリ（一般的にはフォルダ）の一覧を表示することができる。

##cdコマンド
cdコマンドは、今いるディレクトリから移動するコマンドだ。作業しているディレクトリを変更する。change directoryの略で、それぞれのcとdの頭文字を取ってcdとなっている。

```Linux:Code
$cd ディレクトリ名
```
もし、cdの後に何もなしで実行すると、ホームディレクトリへ移動することとなる。環境構築する際に、注意しておきたいところ。

##pwdコマンド
pwdコマンドは、今いるディレクトリを絶対パス（フルパス）で表示してくれるコマンド。

```Linux:Code
$pwd
```
HTMLファイルにてjsファイルやCSSファイルの読み込みする時に使う。

##まとめ
おおよそ基本的なコマンドを整理する形で記してみた。ただ、ここは補足が必要だと感じられた際是非コメントをいただけるとありがたい。
そこから所々修正する予定。
深層学習／BLEUスコア

#1.はじめに
　今回は、自然言語処理で生成した文章の評価方法の１つである、BLEUスコアについてまとめます。

#2.BLEUスコア
　**BLEU**スコア(Bilingual Evaluation Understudy)は、翻訳タスクで使われる評価方法です。簡単に言うと、機械が生成した文が、どれだけ人間が翻訳した文に似ているかを測定します。その原理は、２つのシンプルな考え方に基づきます。

**１）modified n_gram precision**
　機械の翻訳文に、人間の翻訳文にある単語がどれだけ網羅されているかの率$P_n$が高いほど良い評価とします。

**2) brevity penalty**
　機械の翻訳文の単語数 **c** が人間の翻訳文の単語数 **r** より短いと modified n_gram precision が実力以上に良くなってしまうので、$e^{(1-\frac{r}{c})}$というペナルティ項を設けます。

![スクリーンショット 2020-04-21 14.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/45a099d7-a2b1-2253-92e8-36070c05464a.png)

これが、BLEUスコアの式です。$W_n$は、適当な重みです。
同一のRadioGroupに入っているRadioButtonを画面上の自由な位置に配置したい

#概要
Androidの標準APIで提供されている`RadioButton`と`RadioGroup`。

複数の`RadioButton`を1つの`RadioGroup`の中に入れ子にすれば、その中で同時に一つだけが選択可能になる、とここまではいいのだが、`RadioButton`は自由に配置することが許されない。

#なんでRadioButtonは自由に動かせない？
ドキュメントでもなんでも見ればわかるのだが、`android.widget.RadioGroup`は**`android.widget.LinearLayout`を継承している**ため。

LinearLayoutが何だかはみんな知ってるでしょう。
つまり横1列か縦1列にしか並べられないということ。

なんでやねん！！
#解決策
ということで、作っちゃいました。そういうクラス。

```java:FreeRadioGroup.java

import android.util.Log;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

public class FreeRadioGroup {

    private List<RadioButton> registeredRadioButtons = new ArrayList<>();

    public FreeRadioGroup(){

    }

    public void addChild(RadioButton rb){
        if(registeredRadioButtons.contains(rb)){
            Log.w("FreeRadioGroup", "RadioButton already registered. Abort registering");
        }else {
            registeredRadioButtons.add(rb);
            rb.setOnCheckedChangeListener(OCL);
        }
    }

    public void removeChild(RadioButton rb){
        if(!registeredRadioButtons.contains(rb)){
            Log.w("FreeRadioGroup", "RadioButton is not registered. Abort unregistering");
        }else {
            registeredRadioButtons.remove(rb);
            rb.setOnClickListener(null);
        }
    }

    public int getSelectedButtonIndex(){
        for(int i=0,n=registeredRadioButtons.size();i<n;i++){
            if(registeredRadioButtons.get(i).isChecked()){
                return i;
            }
        }
        return -1;
    }

    @Nullable
    public RadioButton getSelectedButton(){
        for(int i=0,n=registeredRadioButtons.size();i<n;i++){
            RadioButton r = registeredRadioButtons.get(i);
            if(r.isChecked()){
                return r;
            }
        }
        return null;
    }

    private final CompoundButton.OnCheckedChangeListener OCL = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if(registeredRadioButtons.contains((RadioButton)compoundButton) && b){
                for(RadioButton r : registeredRadioButtons){
                    if(r.equals((RadioButton)compoundButton)){
                        continue;
                    }
                    r.setChecked(false);
                }
            }

        }
    };

}

```

とりあえず丸コピして使っていただいて構いません。

`addChild(RadioButton rb)`で登録したい`RadioButton`を登録すると、登録したものの中で同時に1つだけが選択される仕組み。

逆になんでこれが公式に実装されてないのか疑問に思うレベルで必要だと思うのだが……。
#現状の問題点
・ボタンの状態が変わった時に呼ばれるリスナーを他に登録しようとすると上書きになってしまうため使えない

自分が使う分には今のところこれで困ってないので、時間があるときに考えておきます。あるいは何かいい方法があったらコメントで教えて頂ければと。OnClickの方は普通に使えるのでそれだけで済むのであれば問題ないはず。
Androidエミュレータの日本語化（Android9）

## 設定アプリを起動
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/d7d6841c-3033-f72d-4e6d-8ad487b2932e.png" />

## 設定の一番下にあるSystemを開く
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/d837fc64-757f-f14b-5ad1-caa8f76e970e.png" />

<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/61626692-4e93-bbd6-d7c3-7afa5d6e74da.png" />

## Languages & inputを選択
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/7942cc53-a898-3818-9a5c-8bc3dfff3cba.png" />

## Languagesを選択
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/c593a9c8-7745-a0f1-5030-01496cd41066.png" />

## Add a Languageを選択
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/430dc7b4-1192-2a96-d87e-e1ef01ecf9d8.png" />

## Add a Languageの下の方にある「日本語」を選択
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/d4798566-b64b-50fa-996e-c7abfd0caa4d.png" />


<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/d1c5426d-d661-7ed6-75e4-055924a43c78.png" />

## Language pregerencesで日本語をいちばん上にする

<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/dfde1f37-af4b-36e7-b438-7fdcb3c485fe.png" />

## この状態になったら完了
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148354/d40725a8-c49d-79c3-b8b5-327955639923.png" />
rails-erd 設定（Rails6対応）

## rails-erdの導入
```rb:Gemfile
group :development do
  gem "rails-erd"
end
```
## Rails6.0以降の場合は以下を設定
```rb:config/environments/development.rb
config.eager_load = true
```
## 実行
```terminal
bundle exec erd
```
## おすすめ実行オプション
```terminal
bundle exec erd --attributes=foreign_keys,content #外部キーを明らかにし、他のカラムも表示
```
## 参考
- [rails-erd](https://github.com/voormedia/rails-erd)
- [rails-erdのオプション](https://voormedia.github.io/rails-erd/customise.html)
- [【Rails6】gem `rails-erd`を使おうとしたらエラー`Warning: Ignoring invalid association`](https://qiita.com/terufumi1122/items/aeef1c27b53138c05d44)
TCPについて

#TCP (Transmission Control Protocol)
トランスポート層のプロトコルの１種
##特徴
・データをセグメントに分けて送受信し、確実に届けるために送信速度や
再送の手配など通信における大きな役割をはたす。
・信頼性は高いが転送効率は低い


##上記を理解するための知識↓
###ポート番号
tcp/22:SSH
tcp/25:SMTP
tcp/80:HTTP
tcp/443:HTTPS

###3way hand shake
通信を受け取る前の挨拶。

###シーケンス番号
通信を行う際にばらしたパーツのパーツ番号

###フロー制御
通信の制御。まとめて送ったり、混雑してたら、１つずつ送るように制御する。

チェックサム
データが破損してないかチェックする

参考
https://www.slideshare.net/sasakipochi/tcp-80894969
ありがとうございました。

###インターネットプロトコルの階層構造

HTTP
TCP
IP
Ethernet
200421学習記録：htmlの忘れがち・苦手なところ


TechAcademyでhtml,cssの復習

https://techacademy.jp/my/php/laravel/html-css#chapter-1

よくわすれていること

◆html

▼<head>内
・<!DOCTYPE html>と宣言すること。
・htmlタグの中には```<html lang="ja">```と書き日本語で書かれているページだと宣言する。
・全てのHTMLファイルのhead要素内には、```<meta charset="UTF-8">```を決まり文句として書いておくこと。
・link要素はスタイルシート(CSS)など、外部ファイルを参照する際に使用します。
<link rel="stylesheet" href="https://techacademy.jp/common/style.css">

```
<head>
    <meta charset="UTF-8">
    <title>HTML文書の基本</title>
    <link rel="stylesheet" href="https://techacademy.jp/common/style.css">
    <meta name="description" content="文書の説明は検索エンジンの検索結果ページに表示されるため、タイトルと並びSEO上非常に重要です。">
</head>
```

▼構造タグの使い方

HTML文書を記述していると、どのタグを使うべきか？で悩むことがよく出てきます。例えば、nav要素やarticle要素、header要素、footer要素はわかりやすく使いやすいものですが、抽象的なsection要素やdiv要素は使い所がいまいちわかりません。正解はあるでしょうか？
↓
nav要素やarticle要素、header要素、footer要素などの使い所がわかりやすいタグは積極的に使っていきましょう。

```
<!-- headまで省略 -->
<body>
    <header>
        <!-- ここにヘッダーが入ります -->
    </header>
    <div>
        <aside>
            <!-- ここにサイドバーが入ります -->
        </aside>
        <article>
            <!-- ここに本文が入ります -->
        </article>
    </div>
    <footer>
        <!-- ここにフッターが入ります -->
    </footer>
</body>
```
Elasticsearchの部分更新方法(備忘録)

Elasticsearchのクエリって難しい？というか、
あまり使わないから忘れてしまうので備忘録として記しておきます。

## 部分更新方法

_update_by_queryを使用する前提で行きます。

```
-X Post [host:port]/{index}/_update_by_query -d{
"query" : 
{
    ....    //この部分では更新したい情報を検索する。(
},
"script" : 
{
    "lang" : "painless",//ここは多分painlessで固定
    "inline" : "ctx._source.memo=params.sample",//ここでscriptを書くことが可能*1のような物
    "params" : //引数としてinlineに渡したい情報
    {
        "sample" : "sample"
    }
}
```

```
*1)script例
def pref = new HashMap();
def town = new HashMap();
for (int i = 0; i < ctx._source.pref.length; i++){
	pref = ctx._source.pref[i];
	if(pref.name =='Tokyo'){
		for(int l = 0; l < pref.town.length;l++){
			if(pref.town[l].name=="Nakano"){
				pref.town[l].populations++
			}
		}
	}
}
```

### 終わりに

Script部分でinner_hitsを使ってしまいたくなりますが、使えないそうです。
参考)https://github.com/elastic/elasticsearch/issues/29182
Amazon Linux2のEC2にCloudWatchのLogAgentを導入する

まいど。ゆうべはお楽しみでしたね。
[AWS東京リージョンで発生した障害について(4.20)
](https://cafe-dc.com/security/aws-tokyo-region-outage-summary-20200420/)

CloudWatchやSQS,Lambda辺りが対象だったようなので
ウチのEC2やS3とかには特に影響無かったようですが、
逆に言うと古き良きサーバマネジメントしか出来てないという事実を突きつけられました。
世の中どんどん進化してるので上記のようなサービスも知ってないといけないなぁと痛感。

ということで昨日障害が起きたサービスを一つずつ理解しようと思い、
CloudWatchから触ってみることにしました。

#そもそもCloudWatchとは何なのか

調べりゃ分かることなんで詳細は書きませんが要は監視ツールです。
コンソールにあるのでインスタンスを持ってたら見れるでしょう。

![スクリーンショット 2020-04-21 11.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/ffdfa32b-ddc3-f08f-bf24-447ebf29e65e.png)

## log取りを導入してみる

とりあえずapacheのaccess_logを収集出来るようにしてみようということで
他の記事や公式資料を参考にしてみましたがなんかsetup.pyが対応してないような？
AmazonLinux2はyumから導入出来るようなのでそっちの手段を使います。
[EC2 Linux インスタンスの起動時に CloudWatch Logs エージェントをインストールして設定する](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/EC2NewInstanceCWL.html)

```sh
yum install awslogs
```

/etc配下にawslogディレクトリが切られるので中のconfを編集
IAMでCloudWatchLogsFullAccessを割り当てたユーザのアクセスキーを追加し、
EC2のawscli経由でCloudWatchLogにアクセス出来るようにしておく。

```conf:awscli.conf
[plugins]
cwlogs = cwlogs #これはなんだ、分からん
[default]
region = ap-northeast-1 #regionを変更
#以下awscliのアクセスキー情報
aws_access_key_id=XXXXXXXXXXXXX 
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXX
```

```conf:awslogs.conf
#色々書かれてるが一番下にmessagesの定義が書いてるのでこれを参考にする
[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages

#↓今回これをこうした
[/var/log/httpd/access_log]
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/access_log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/httpd/access_log

```

サービスを開始...systemctlの書き方をなかなか覚えられない...

```sh
service awslogsd start
```

動作してるのを確認
![スクリーンショット 2020-04-21 12.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/d5d04ce1-0c81-7eab-df44-3bfa6a8767ac.png)

access_logが更新されるように適当に作ったWebページにアクセスしてコンソールを見る。

![スクリーンショット 2020-04-21 13.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/b9fdea06-54e4-9b04-86c8-1be26d96f7bd.png)

出てた。けど名前なんとかならないのか。

```conf:awslogs.conf
[Apache-access_log] #多分識別子なだけなので任意
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/access_log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = shindev-log　#ここを変える
```

サービスを再起動して再確認

```
service awslogsd restart
```

![スクリーンショット 2020-04-21 14.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/732dc34c-c5d7-2703-ab99-4754a56314b4.png)

行けた。
グループ単位で他のログを取ってみる。
なんでもいいんだけどerror_logを追記、ついでにlog_stream_nameを変更してログファイル単位で分別する形にした。

```conf:awslogs.conf
[Apache-error_log]
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/error_log #対象ファイル
buffer_duration = 5000
log_stream_name = shindev-ec2-error_log #ここを変更
initial_position = start_of_file
log_group_name = shindev-log #ここは同じ
```

こうなりました。

![スクリーンショット 2020-04-21 14.37.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23195/3c693de5-b848-77cb-f2d4-8faf13fdb186.png)

使い方大体分かったような気がする。

**終わり。**
ReactiveCommand の Subscribe で悩んでいた時の解決法

#答え
[ こちらのサイトが参考になりました ](https://blog.kazuakix.jp/entry/2015/06/28/233439)

```C#
using System;
```

ラムダを受け取る Subscribe の拡張メソッドは System 名前空間で定義されているんだそうです。ほげぇ。


#そもそもなんで？
以前はXamarin.Formsで開発していたのですが、
Xamarinの新規コードを書く際はすでにusing System:されているため、なんの意識もせずにできるものだと思ってました。
今回はXamarinとは無関係のWPF開発だったので…。
ここ最近、参照先を設定する等もVisual studioの便利機能でぱぱっと解決してたので単なる考慮不足です…。


#参考にしたサイト
[ 【C#】ReactiveProperty全然分からねぇ！って人向けのFAQ集【修正済】 ](https://qiita.com/YSRKEN/items/5a36fb8071104a989fb8)
laravel 【ページの表示フロー】

どのようにlaravelのページが表示されているのかを見ていきたいと思います。

まずは新規のプロジェクトを作成します。プロジェクト名を blog とします。
`laravel new blog
cd blog
php artisan serve`

まずはこの図の`Access〜show`を頭に入れておくと理解しやすいと思います。
![3AE1D46A-51B1-4461-B705-DB36A7032905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453557/e1d5a0f4-15b3-0630-12fa-712801af8996.png)

#ルーティング

```php:routes/web.php
Route::get('/', function () {
    return view('welcome');
});
```

|HTTPメソッド|パス|アクション|
|--:|--:|--:|
|GET|/|クロージャー|

関数の中でwelcomeビューを表示するようにしています。
HTTPメソッドやパスの組合せに応じたアクションを実行するのが、Routing の役割です。

#ビュー

```php:resouces/views/welcome.blade.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        ...
        <title>Laravel</title>
        ...
    </head>
    <body>
        <div class="flex-center position-ref full-height">
            ...
            <div class="content">
                <div class="title m-b-md">
                    Laravel
                </div>
                ...
            </div>
        </div>
    </body>
</html>
```
http://localhost:8000/ にアクセスした時に表示されるHTMLです
Laravel では bladeというテンプレートエンジンを使って、ビューファイル（HTMLテンプレート）からHTMLを生成しています。

#コントローラ

`php artisan make:controller WelcomeController
`
としてコントローラを作りindexメソッドを追加しましょう

```php:app/Http/Controllers/WelcomeController.php
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
 
class WelcomeController extends Controller
{
    public function index()
    {
        return view('welcome');
    }
}
```
indexメソッドはview関数を実行し、その戻り値を返しています。
viewの戻り値がブラウザへのレスポンスになります

Routing 設定のアクションをクロージャーからコントローラに変更します。

```php:routes/web.php
//Route::get('/', function () {
//    return view('welcome');
//});
Route::get('/', 'WelcomeController@index');
```

|HTTPメソッド|パス|アクション|
|--:|--:|--:|
|GET|/|WelcomeControllerクラスのindex メソッドを実行する|


#まとめ

このことから
`Route::get('/', 'WelcomeController@index');`
ルーティングでアクセスするコントローラを決め、実行されると
コントローラのindexメソッドからwelcome.blade.phpを表示命令し
welcome.blade.phpが表示されるのが分かります。

簡単にですが一連の流れを覚えておくとイメージしやすいかと思います。
スクリーンショットの保存先を変更する方法


今回、スクリーンショットの保存先がデスクトップになってしまっているのでダウンロードファイルの中に新しくスクリーンショットを保存する様のファイルを作成し、そこに保存したいと思います。



事前準備としてDownloadsの中にScreenshotファイルを作成します。

下記コマンドを入力。

```
defaults write com.apple.screencapture location ~/Downloads/Screenshot/
```



```
killall SystemUIServer
```

終わり。
Java基礎

char型の計算はunicodeになる
https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF
表の数値は16進数

int型の小数は切り捨て
計算後にdouble型に代入するとx.0になる

import
サブパッケージを取り込みたい場合は記述する
import java.util.*;
import java.util.logging.*;

主な例外
・0除算
・配列の存在しない要素数にアクセスする
・ユーザの入力間違い
・存在しないファイル指定
・DB接続失敗
・不正な値のポインタ参照

ArrayListについて
Javaプログラムではデータ量が不特定であることが多いため、固定長配列よりも可変長配列であるArrayListが使われることが多い

ファイル入力
ファイル名のみ指定した場合、プロジェクト直下を参照する

```Java
Scanner sin = new Scanner(new File("Sample.txt"));
```

Eclipse
Eclipseの標準出力で文字化けした場合
ウインドウ > 設定 > 一般 > ワークスペース
テキスト・ファイル・エンコードをUTF-8にする（ソースコードの文字コード）
デフォルトのutf-8
変更するとeclipseが検証中になるので、終わるまで待ってから実行する

このファイルも１行追加する（不要か？）
eclipse.ini
-Dfile.encoding=utf-8

実行 > 実行構成 > 共通タブ > エンコード
utf-8

エディターのコメントが文字化けする場合
ウインドウ > 設定 > 一般 > 外観 > 色とフォント
テキスト・フォントのをConsolas以外にする（ＭＳゴシックなど）

Eclipseのコンソールで標準入力する場合、全角のテンキーだと本来の半角にならないため、Integer.parseIntなどでエラーになることがある

「this」キーワードは「オブジェクト自身の」という意味

変数を右クリック、参照で参照先の検索、宣言も同じ

JSPタグライブラリについて
https://qiita.com/chenglin/items/16860d194eda96815c19
https://qiita.com/sculptcat/items/53d1a3a2d3b973354085

Calendar.MONTHは0から始まる
https://qiita.com/Masa_Kado/items/9de05be15f6c20cf213b

スクリプトレットからEL式に変換
```Java
<c:set var="EL式の変数" value="<%= スクリプトレットの変数 %>" />
```

EL式からスクリプトレットに変換
```Java
String test = (String)pageContext.findAttribute("test");
```
アーカイブってどっちの意味？


データベースのとってログは非常に大事です。データファイル同等、それ以上に大事かもしれません。
だからこそログファイルの仕組みについてはちゃんと理解しておく必要があります。
故意的ではなくても、削除してはいけないログファイルを削除してしまったら・・なんて考えるだけでも恐ろしいですね:confounded:
どのDBMSでもログファイルはあり、基本的な考え方は同じですが、DBMSによってこのログファイルの使われ方・動きは異なります。
今回は超基本的なDb2のログファイルの種類とその動きについて備忘録として残します。

#DBのログの種類
####・アクティブログ
一言でいうと、現在DBMSによって使用されているログファイルのことです。
メモリーからディスクへの書き込みがまだ行われていない処理内容でCOMMIT済みの処理、未COMMITの処理を含むログファイルです。
このアクティブログはクラッシュリカバリーの際に使用されるファイルであり、このログファイルは絶対に削除してはいけません。削除してはいけないというよりも、ユーザーはこのファイルを触らない！という感覚の方がいいかと。

####・アーカイブログ
現在Db2によって使用されていないログ・ファイルのことです。
ファイルに含まれている処理内容がすべてCOMMIT済みになり、ディスクへの書き込みも完了しているログファイルのことを言います。


#アクティブログの種類
アクティブログにも種類があり、1次ログ(LOGPRIMARY)と2次ログ(LOGSECOND)があります。
種類といっても、ファイル自体は同じであり、アサインされるタイミングとその使われ方に違いがあります。
####1次ログ
データベースのactivate時に一括して用意されます。 
基本的に1次ログ内でおさまるようなファイルサイズ・ファイル数を指定しておくことが推奨されます。
ただ、あまりにも大きい数を指定するとデータベースのactivateに時間がかかることがありますので注意してください。 


####2次ログ
1次ログがすべて使用されていて、再利用できない時に使用します。
1次ログがactivate時に一斉に用意されるのとは異なり、2次ログは必要になる度に1つずつ用意されます。
この2次ログファイルも使い尽くしたときにトランザクションログフルが発生しSQLが失敗します。

 

#アーカイブするとは？
ログをアーカイブするというのは広義的な意味を持っていて、正確にいうと２つの処理をさします。

・ログファイルがクローズする
・クローズされたログファイルがアーカイブログパスにコピー

どちらの意味で使用しているかはケースバイケースです。
恥ずかしながら、私は最初は、後者の意味だけをアーカイブというのだと勘違いしておりました:sweat:


#アーカブログの種類
アーカイブの意味が２つあるため、どちらの意味のアーカイブ処理を行われたログファイルなのかによって、アーカイブログの名前も正確にいうと分かれます。

・オンラインアーカイブログ
アクティブログがいっぱいになり、かつファイルに含まれている処理内容がすべてCOMMIT済みになり、ディスクへの書き込みも完了したログファイルのことを言います。
つまり前者のファイルのクローズという意味のアーカイブ処理が行われたログファイルのことを言います。
オンラインアーカイブログはアクティブログパスに存在し、アーカイブログパスへコピーする対象となります。

・オフラインアーカイブログログ
アクティブログパス以外の場所（アーカイブログパス）にコピーされたアーカイブログファイルのことを言います。
つまり後者の意味のアーカイブ処理が行われたログファイルのことを言います。


#アーカイブが実行されるタイミング
####ログファイルがクローズされるタイミング
基本的には、ログ･ファイルがいっぱいになり、書かれている更新がCOMMITされればクローズされます。
ただし、ログファイルがいっぱいにならずとも、以下の場合にMOログファイルはクローズされます。

・データベースが非活動化されたとき
・オンライン・バックアップの取得
・ARCHIVE LOG コマンドの実行
・SET WRITE SUSPEND コマンドの実行

####アーカイブログパスにコピーされるタイミング
オンラインアーカイブログがアーカイブパスへコピーされるタイミングは非同期であるため、クローズ後すぐに同期されるわけではありません。


#オンライン・アーカイブログのメンテナンスの必要性
オンラインアーカイブログは、アーカイブログパスにコピーされた後、アクティブログパスにそのまま残ります。ただしユーザーがこのオンライン・アーカイブ・ログをメンテナンスする必要はありません。
なぜなら残されたアクティブログファイルは、他のアクティブログがいっぱいになり、新たにログ・ファイルが必要になったときに、リネームされて再利用されるからです。

ただここで再利用されるのは1次ログとしてアサインされていたオンラインアーカイブログだけであることに注意してください。
基本的にDb2は1次ログとして指定したファイルだけでログの書き出し・アーカイブ、再利用を行います。
1次ログでは足りないときに、2次ログをアサインするので、一時的に2次ログがアサインされ使用されたとしても、その後1次ログ内だけでログの書き出し・アーカイブ・再利用をしようとします。

では、2次ログとしてアサインされたオンラインアーカイブログログはメンテナンスする必要はあるのでしょうか？
結論からいうと、こちらもメンテナンス不要です。データベースがdeactivateされるタイミングで削除されます。

#まとめ

ここまで書いたことをまとめるとこんな感じです。


・Db2で作成・使用されるログにはアクティブログとアーカイブログがある

・アーカイブログとはその名の通りアーカイブされたログファイルのことであるが、アーカイブには２つの意味があり、どちらの意味のアーカイブ操作なのかによってアーカイブログの名前が異なる。

・１つ目のアーカイブの意味はファイルのクローズという意味で、クローズされたログファイルをオンラインアーカイブログという

・２つめのアーカイブの意味はアーカイブログパスにオンラインアーカイブログをコピーするという意味で、アーカイブログパスにコピーされたログファイルをオフラインアーカイブログという

・オンラインアーカイブログは、アーカイブパスへのコピーが行われた後もそのままアクティブログパスに残るが、メンテナンスは不要



最後まで読んでいただきありがとうございました！


#参考情報
[DB2 LUW] ログ・ファイルがアーカイブされるタイミング
https://www.ibm.com/support/pages/node/501221
AmazonLinux2 に HUGO の開発環境を作る

HUGO の開発環境を AmazonLinux2 上に構築しなくてはならなくなったのでメモ
(Homebrew でハマるかと思ってメモったらめっちゃ楽に入ってしまったｗ)

## 準備
Amazon Linux2 のインスタンスを作成
ec2-user でログイン

update は適当に
git を入れておく
`sudo yum install git`

# 参考にするサイト
[Homebrew](https://docs.brew.sh/Homebrew-on-Linux)
[Homebrew - install](https://brew.sh/index_ja)
[Install Hugo](https://gohugo.io/getting-started/installing/)

## Homebrew - install

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

エンターで開始

## Homebrew - bash_profile への追記

```bash
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
```

一応念の為、再ログインして確認

```bash
brew -v
```

バージョンが出れば OK

## HUGO - install

```bash
brew install hugo
```

確認

```bash
hugo version
```

バージョンが出れば OK

## (おまけ) VSCode の Remote-SSH 使うなら

settings.json に以下を追記

```
"terminal.integrated.shellArgs.linux": ["-l"]
```

追加した PATH が反映されるようになる

## (おまけ) GitHub への接続設定

`id_rsa`をアップロード

```bash
mv id_rsa ~/.ssh/
chmod 600 ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa
ssh -T git@github.com
```

##(おまけ) port forward の設定
以下のいずれかの設定をしておくと、`hugo server`時に
`localhost:1313`でポートフォワーディングされる。
すごく楽ｗ

###.ssh/config に設定する場合

該当の host に以下を追記

```
LocalForward 127.0.0.1:1313 127.0.0.1:1313
```

###Tera Term に設定する場合

手元の Tera Term で、
設定 → ssh 転送 → 追加
`ローカルポート 1313 空`と`リモート側ホスト 空 1313`
monologを使ってロギング

#

monologを使用して、ログの取得・記録の機能を追加することになったので、備忘録としてまとめます。

##monologとは
phpのロギングのためのライブラリ。
ハンドラーによって、ファイル・メール受信・ソケット・データベースといった様々なWebサービスに記録することが可能。
PSR-3の[インターフェース](https://www.php-fig.org/psr/psr-3/)を実装している。
そのため、PSR-3を使用するフレームワークでは利用が容易。Symfony、Laravelでは標準で実装されている。


##monologの導入

基本的な使用方法のまとめ


####インストール


composerを使用してインストール

    $ composer require monolog/monolog

上記を実行

または

```composer.json
{
    "require": {
        "monolog/monolog": "^2.02"
    }
}
```

composer.jsonに記述し、インストール


    $ composer inastall


####使いかた

基本的な使い方は以下の通り
（[monolog](https://github.com/Seldaek/monolog)の[ドキュメント](https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md)より引用）


```testlog.php

<?php

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

// add records to the log
$log->warning('Foo');
$log->error('Bar');

```

まず、チャネル(Loggerインスタンス)を作成する。
インスタンス作成時にチャネル名を引数として渡す(上記の場合'name')。チャネル名はログの場所に合わせて付けることで、複数のLoggerがある場合に抽出するなどの操作が容易になる。


作成したチャネルにpushHandlerでログの目的に合わせてハンドラーをセット。
StreamHandlerはmonologでファイル記録用の基本的なハンドラー。
上記の場合、第1引数はログを記録するファイルのパス、第2引数はログレベル（ログレベルの初期値はLogger::DEBUG）
ハンドラは複数持たせることができるので、複数の記録の機能を持たせることができる。

ログの記録の際は、レベルを指定できる。上記ではwarningレベルでFooを、errorレベルでBarを書き込みしている。


###やってみた

今回やりたかったこと、「APIからのレスポンス結果（$result）を一定期間分ファイルに記録する」を試してみた。（レスポンス結果の取得については割愛）

ハンドラーはStreamHandlerを継承したRotatingFileHandlerを使用。
RotatingFileHandlerは1日に1つのログファイルを作成、古いファイルは削除することができるので、一定期間のログを残す場合に便利。



```response.php

use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;

-----------

// Create a handler
$handler = new RotatingFileHandler('/logs/response', 30);

// create a log channel
$log = new Logger('response');
$log->pushHandler($handler);

// add records to the log
$logger->info(json_encode($result,JSON_UNESCAPED_UNICODE));

```

logsフォルダにresponseというファイル名で、30日分の記録を保存するようにハンドラーを設定。
infoレベルでログを記録（レスポンスがjson形式で返ってくるので、json_encodeしている）。


結果、logsフォルダにはlogs\response-2020-03-31といった日付ごとのファイルが作成された。
ファイルの中には日時、チャネル名、ログレベル、ログ内容　の順で記録される。

↓ファイル内はこんな感じで記録されます

```
[2020-03-31 14:55:18] response.INFO: {"response":"{\"records\":[{\"date.............
[2020-03-31 14:55:20] response.INFO: {"response":"{\"records\":[{\"date.............
```



##monologを試してみて
今回は簡易的な内容で試したが、もともとmonologはかなり高機能なロギングのライブラリなので、
ハンドラーに持たせるフォーマッターで出力形式もいろいろなものが選択でき、プロセッサーでログレコードに追加などの操作もできる。
使いこなすことができれば、かなり便利そうだなという印象でした。
【機械学習に役立つ3つのAWSサービス】SageMaker・Athena・Glueについて解説

AWSで機械学習を行うときに、役に立つサービスを紹介します！


なお当記事の読者として、以下の知識がある方を想定しています。
・ EC2、S3及びRDSといったAWSの基本的な機能
・ 機械学習のおおまかな流れについて
・ Jupyter notebookとは？

この記事では、特に使用頻度の多い「SageMaker」「Athena」「Glue」の三つのサービスについて、それぞれの特徴と使用場面をざっくり理解していただけたらと思います！


## AWSで機械学習を行うメリット

- ライブラリを標準装備しているため、環境設定を行う必要がない
- 学習に時間がかかる場合でも、インスタンスの性能を引き上げることで高速化が可能
- 既にAWSを使っていて、S3などのストレージに学習データがある場合、処理がスムーズ
- データベースや学習の実装、デプロイまでを一貫してAWS上で行うことができる

ローカルマシンではなく、AWS上で機械学習を行うことで、このようなメリットがあります。

## SageMaker
機械学習を行う際、多くの人がJupyter notebookを使うことでしょう。
SageMakerとは、AWSのインスタンス上でJupyter notebookを使用できるサービスです。

<img width="1440" alt="スクリーンショット 2020-04-21 11.46.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616177/5cec2eab-a0e1-2839-11be-dd05c8c971b9.png">


SageMakerを使うことで、クラウド上でnotebookでの学習を完結することができます。
SageMaker上でコードを書きながら実行することもできますし、ローカルで作成したnotebook形式のファイルを読み込んで動かすこともできます。

また、組み込みアルゴリズムを利用できたり、作成したアルゴリズムの保存、モデルに関する分析など、機械学習に役立つ様々な機能がついています。

## Athena
容量無制限のストレージであるS3は、「ファイルの置き場」としてよく使われます。
機械学習をする際、学習にこのS3内のデータを使いたいという場面があるでしょう。
このような場合に役に立つのが**Athena**というサービスです。

Athenaは、S3内のデータをSQLのクエリで操作できるサービスです。
S3内にあるファイルに対し、スキーマを定義すれば、SQL文を実行するだけで必要なデータを取り出すことができます。

「S3のファイル内の膨大な情報から、数種類のデータだけ取ってきて機械学習にかけたい」というときは、Athenaで必要な部分だけ出力したCSVを作ることができます！

## Glue
Athenaはとても便利ですが、S3内のファイルがスキーマを定義できないほど散らかっている場合は困ってしまいます。
そういった場合、まず散らかったS3のデータをある程度使いやすい形に加工して別ファイルとしてS3に保存し、その上でAthenaを使用したいですよね。ここで活躍するサービスが**Glue**です。

Glueは、RDSやS3といったストレージ内のデータを加工したり変換するためのサービスです。
S3内のデータを加工してS3に再び保存する場合にも使えますし、RDS内のデータをS3に変換するといったデータ変換にも使うことができます。

「機械学習を行うために、ファイルの形をまとめて整えてあげたい」という際はGlueを使ってみてください！

## まとめ
- 「SageMaker」はクラウド上でJupyter notebookが使え、さらにAWSオリジナルの機械学習に役立つ便利機能もついてくるサービス
- 「Athena」はS3のファイル内のデータをSQLクエリで操作できるサービス
- 「Glue」はRDSやS3内のデータを機械学習に使いやすい形に加工するのに役立つサービス
ShellScript 備忘録

#はじめに

こちらではshellscriptの基本的操作から紹介したいと思います。

備忘録も兼ねているので少しずつ増やしていきたいと思います。

#基本

まずは基本的なところから

よだんですが１行目のはShebangというものでスクリプトを指定しているらしいです。
へー

```sh:test.sh
#!/bin/sh

#コメントアウト

echo "Hello, World!"
```
権限の変更

```
$ chmod 755 test.sh
```

実行結果

```
$ ./test.sh
Hello, World!
```

#楽したい
ここではアプリ起動をする時めんどいものを楽しようというものです。
shellで実行できるものはたいてい実行できる


例：MySQL
とりあえず普通に実行

```
$ mysql -u [user名] -p

Enter password:

mysql> 
```

いちいちユーザー名とパスワード入力が面倒、、、、

まず一番シンプルに

```sh:sql.sh
#!/bin/sh
mysql -u [ユーザ名] -p[パスワード]
#-pの横はスペース開けないように
```

これで実行してもいいけどこれだとユーザ名とパスワード変更するたびにその部分sql.shを変更しなければならない...（１行だけだからそんなに手間はないと思うけども。。。）
なのでそこだけ別ファイルに読み込んでみる。

###別ファイルから読み込む

```text:test.txt
HELLO=hello
```

```sh:test.sh
#!/bin/sh

. ./test.txt
echo $HELLO
```
実行
権限の変更するのを忘れずに！！

```
$ ./test.sh 
hello
```

別ファイルから読み込んでいるのがわかると思います。


##実行してみる

では実際別にして読み込んで実行みましょう

```conf:sql.cnf
USER=[ユーザ名]
PASS=[パスワード]
```

別にcnfにする必要ないですが形から入る感じで

```sh:sql.sh
#!/bin/sh
. ./sql.cnf

mysql -u $USER -p$PASS
```
実行結果

```
$ ./sql.sh 

mysql> 
```

#まとめ
いかがだったでしょうかパッと思いつくところでここまでですが
また効率のいい方法見つけたり思いついたら書いていきたいと思うます。
Spring Boot dependency, application.properties 設定

```pom.xml
<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
	        <groupId>org.apache.tomcat.embed</groupId>
	        <artifactId>tomcat-embed-jasper</artifactId>
	    </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
```

```application.properties
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test1
spring.datasource.username=xxxxx
spring.datasource.password=xxxxx

spring.devtools.livereload.enabled=true
```