OmniAICreator/Qiita-1.07M huggingface dataset:
EC2 インスタンスの作成手順

マネジメントコンソールへログインし、EC2のダッシュボードへ移動します。

##インスタンスの作成
1.EC2>インスタンスのダッシュボードへ移動し、「インスタンスの作成」ボタンをクリック。
<img width="506" alt="スクリーンショット 2020-01-14 6.11.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/bdd4d82c-d5da-7645-25cf-9b3167aa50b5.png">

2.次にマシンの選択。初学者の方は基本的の無料利用枠の下記のマシンを選択。
<img width="1633" alt="スクリーンショット 2020-01-14 6.14.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/ebef1576-b75d-3af4-d9c7-b14fb4387c12.png">

3.インスタンスタイプの選択。こちらも無料利用枠でデフォルトで設定されている「t2.micro」を選択しましょう。
<img width="1659" alt="スクリーンショット 2020-01-14 6.17.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/c57d9e73-2078-2a8c-0421-8a732fcac4f5.png">

4.インスタンスの詳細を設定しましょう。
※VPCを先に設定したりしますがまだ設定してないのでデフォルトのVPCを利用します。後ほど設定します。
<img width="1021" alt="スクリーンショット 2020-01-14 6.20.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/0c6a5ef0-9aa4-85fc-bd62-1ed9b0e5c3d0.png">

5.ストレージの追加。ここも基本的に変更を加える箇所はないので次へ
<img width="1535" alt="スクリーンショット 2020-01-14 6.24.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/41fb0e4f-be77-db7b-bb83-564fc61e20b9.png">

6.タグの追加。名前を割り振りましょう
<img width="1313" alt="スクリーンショット 2020-01-14 6.29.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/27515078-5d36-e9b9-3b96-cc00c31bf11c.png">

7.セキュリティグループの設定。webサーバにつなげるために「HTTP」「HTTPS」も追加します。
<img width="1666" alt="スクリーンショット 2020-01-14 6.31.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/15f7c417-8dbb-8509-c6f0-b9f56bd341e4.png">

8.最後に作成するインスタンスの詳細が出るので確認しましょう。
また、起動ボタンを押したらSSH接続する際に必要なキーペアの作成画面が出るので作成しましょう。
作成後インスタンスを作成できます。
※キーペアの作成画面は今回は省かせていただきます。<img width="1672" alt="スクリーンショット 2020-01-14 6.38.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/bdec3c61-a294-8d8b-15fa-dc8541f110a0.png">

作成が完了しました。
<img width="1670" alt="スクリーンショット 2020-01-14 6.43.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/e93c28c5-78e9-88ce-b431-97fbf857b25f.png">

「running」になることを確認しましょう。
<img width="1439" alt="スクリーンショット 2020-01-14 6.46.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246337/1ad0bbdc-6d70-60e4-fe87-4dfd47b91a5f.png">


インスタンスが無事作成できました！！
VSCode便利ショートカットキー集

忘れてもすぐ思い出せるようにメモ


## カッコ内を選択

ctrl+shift+cmd押したまま、左押してから右押す

```
ctrl + shift + cmd + right/ctrl + shift + cmd + left
```

## 高速移動

option押しながら右左で区切りのいいところまで高速移動できる

```
option + right/left
```
SC03EへAndroid7.1をインストール

#SC03EへAndroid7.1をインストールする手順
いろんなところに情報があったおかげで、そんなに難しくはなかった。個人的にはファミリーリンクをどうしても使いたくて、Android7以上が必要だった。odinというツールがWindows限定なのでWindows必須。

##参考にしたサイト
ROOT化＋Android7インストール
http://etsux.hatenablog.com/entry/2019/10/22/214002

Android7インストール前の初期化
https://mitsmits.com/2019/04/07/sc03e-cm13/

##ダウンロードリンク
1. adbで接続するためのUSBドライバ https://samsungodin.com/SamsungUSBDriver/USB_Drivers_1.5.27.0.rar
なぜかセットアップ途中でインストールを失敗するけど、ドライバはきちんとインストールされているようで、インストール後にUSBをさしなおせばOKだった。
2. adb https://dl.google.com/android/repository/platform-tools_r29.0.5-windows.zip
3. オリジナルROM https://doc-0k-4o-docs.googleusercontent.com/docs/securesc/5lm42mri6hnet1djbq6afec80dsfc7bu/s842jqn5d5ms8j0ktucidvafhr1dihv9/1578924000000/13328048127095319133/00994235551905654966/0Byf30eD0ZzXcU05KazktZDExRTQ?e=download&authuser=0
4. ROOT化ROM https://doc-14-4o-docs.googleusercontent.com/docs/securesc/5lm42mri6hnet1djbq6afec80dsfc7bu/gi7o57tk243p8i3r3848f1f49gjucb6f/1578924000000/13328048127095319133/00994235551905654966/0Byf30eD0ZzXcUTNkQ3diWDM4VUk?e=download&authuser=0&nonce=46jop38vkehre&user=00994235551905654966&hash=3led8fms27mch0ek91r9olagqj2eld39
5. Odin https://odindownload.com/download/Odin3_v3.14.1.zip
6. Android7 http://download1515.mediafire.com/n4s880kbhdng/igu2yqcd1tpvkhn/lineage-14.1-20191104-UNOFFICIAL-sc03e-felica-magisk.zip
まだ某掲示板ではSC03E用のカスタムROMを開発してくれている人がいるみたい。
7. Google APP https://jaist.dl.sourceforge.net/project/opengapps/arm/20200111/open_gapps-arm-7.1-pico-20200111.zip
picoでインストールしておいてから、日本語のyoutubeとか、google photoとかを入れたほうが良い感じ。

##注意事項
Android7をインストールする前に、上記参考サイトを無視して/Systemとかを消さなかったためかphotoが動かなかった。再度消してから動かすとphotoも動いた。
SIMを入れていないので、モバイルネットワーク周りはわからないけど、普通にAndroid4.3のスマホがAndroid7にアップデートされて今のところ重いとか不安定とかなさそうなのでびっくり。
河のみでそのプレイヤの聴牌YN（タンヤオ河限定）

# ※この記事は2020年に作成しました
#概要
タンヤオのみを狙っていくエージェントから河のデータを取った。聴牌の時の河のデータ5000個と、ノーテンの時の河のデータ5000個の計10000個取った。

このデータ18個のデータを18×34の630個のワンホットベクトルにして3層ニューラルネットワークで聴牌YNの判定を行った。

中間層は315次元、validation_split=0.2とした。
以下に作成した3層ニューラルネットワークの図を示す。
<img width="391" alt="kawa630.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436155/22d90c9f-c65a-e967-fd69-47d3dec38c93.png">

#結果
テストデータに対する正解率は約52%になった。聴牌とノーテンのデータが5000個ずつなので、ランダムに選んだとしても50%の確率で当たる。よって、ほとんど学習できてないことがわかる。


#作成したプログラム

```python
# coding: UTF-8
import csv
import numpy as np
from keras.utils import to_categorical
from keras.models import Sequential,Model
from keras.layers import Dense,Conv2D,MaxPooling2D,Dropout,Flatten,Activation,BatchNormalization
from keras.optimizers import Adam
from keras.layers import Dense,Input
from keras.callbacks import TensorBoard
from keras import optimizers,regularizers
np.set_printoptions(threshold=100000)
data = 5000#5000

x_trainTP = np.loadtxt("C:/sqlite/tanyao_TPkawa.csv",delimiter=",")
x_trainTP = np.delete(x_trainTP,slice(data,None),0)

x_trainNT = np.loadtxt("C:/sqlite/tanyao_NTkawa.csv",delimiter=",")
x_trainNT = np.delete(x_trainNT,slice(data,None),0)

kawa = np.vstack((x_trainTP,x_trainNT))

kawa630 = np.zeros((data*2,630))
for i in range(data*2):
    for j in range(18):
        kawa630[i,(j*35)] += 1

for i in range(data*2):
    for j in range(18):
        if kawa[i,j]!=0:
            hai = int(kawa[i,j])
            kawa630[i,((j*35)+hai-1)] += 1
            kawa630[i,(j*35)] -= 1

#print(kawa630.shape)

label = np.zeros((data*2,1))
for i in range(data):
    label[i] += 1
label = to_categorical(label,2)
#print(label)

#前処理ここまで
model = Sequential()

input_data = Input(shape=(630,))#入力層
hidden_layer = Dense(315, activation='relu')(input_data)#中間層
output_layer = Dense(2, activation='softmax',kernel_regularizer=regularizers.l2(1e-4))(hidden_layer)#出力層
#Hidden_output = Model(input = input_data , output = hidden_layer) #中間出力用
model = Model(input = input_data , output = output_layer)#入力から出力

#最適化アルゴリズムAdam、損失関数
model.compile(
    optimizer=Adam(lr=0.01),
    loss='categorical_crossentropy',
    metrics=['accuracy'],
)
#http://localhost:6006/
#tensorboard --logdir=./logs
#tsb = TensorBoard(log_dir='./logs')
history_adam=model.fit(
    kawa630,
    label,
    batch_size=256,
    epochs=100,
    verbose=1,
    shuffle = True,
    validation_split=0.2,
    #callbacks=[tsb]
)
```
山洋パワコンのモニタシステム開発

⑥ESP-WROOM-02にRS485ボードを追加する

さてESP-WROOM-02にRS-485インターフェースを取付け、ライブラリを使い、山洋さんのパワコンと通信するお話です。

取りかかる前の状況は、９台のパワコンがSLAVEで１台のLCD パネルがMASTERとなっていました。このLCDパネルを私が作るマイコンで置き換えるのが目標です。

参考にさせていただいたのは、「https://javatea.adiary.jp/0116」です。
amazonで購入した「EasyWordMall MAX485 RS-485 TTL－RS-485モジュールコンバータ 」が同じような配線で使えました。
このとき私の手元にあったのは、Arduino UNO,電子太郎ESP-WROOM-02開発ボードでした。


![MAX485a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290178/5c903676-c72d-631c-dd49-32de8d35b808.jpeg)

このページに書かれているとおり、
・DI (data in) to pin 11
・RO (receive out) to pin 10
・DE (data enable) and RE (receive enable) jumpered together and to pin 3
・Vcc and Gnd connected

の様に接続しました。ここで忘れてはいけないことが…。RS485の終端抵抗です。
この装置はRS485の終端に位置することになりますから、100～120Ωの抵抗を信号線AB間に入れておきます。

Arduinoのライブラリで「MODBUS」を検索すると、５つものライブラリがヒットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290178/71b9b874-4a5e-6263-02c7-18de00bf1415.png)

私が使うのはMODBUS RTU MASTERですから、上から３つが候補になりました。
いろいろ試行錯誤の結果、ModbusMaster by Doc Walkerのものを使いました。
(https://www.arduinolibraries.info/libraries/modbus-master)

⑦ESP-WROOM-02プログラミング
Modbus通信では、
・マスタがスレイブにコマンドを発行
・スレイブがマスタにコマンドに対する回答を返す
を繰り返します。今回はスレーブが１～９まであるので、さらにコマンドの
パターンが３通りあります。
下の表は山洋パワコンのレジスタ情報です。
1回目の通信はレジスタC000～C002
2回目の通信はレジスタC100～C10F
3回目の通信はレジスタC020～C03F

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290178/52e5b8f6-d5db-d65a-1a42-83f0890b8adc.png)
（この表は私が予想した物です、参考までにお使い下さい）
グラフに欲しいのは、その時間における発電量Wと累積の発電量Whですから、ここまでたくさんのデータは必要ないのですが、取れるデータはすべて記録したくなり、なかなか膨大なデータが蓄積されてしまいました。
グラフを記録する時間幅は10分程度あれば一日の発電量の変化をきれいに表示出来ると考えたので、パワコンとの通信間隔を10分としたところ、多少遅れが出てしまい、11分後に記録されてしまったりして困ることになりました。
そもそもデータの取得時間はマイコン側のタイマではなく、サーバでデータがINSERTされたときにしてしまったので、１～９のデータの登録時間がそれぞれずれてしまっていて、グラフにするときに上手くないのです。さらに先ほどの10分間隔
に上手く載らないデータが発生すると10分間データが存在しないところが生じて
しまいます。これは今後の改良点として、マイコンの方で10分分のデータを蓄積し、10分毎にサーバにPOSTするようにしようかと考えています。

このあとは田渕さん、デルタさんのパワコンについて、グラフのかきかたについて、辺りを説明できたらと思います。
チームでのゲーム制作について～感想とコード～

#はじめまして感想会

こんにちわ！**佐藤**です。
今回はじめてのチーム制作だったのですが、完成品と自分たちとの想像したゲームが全く違うものになってしまいゲーム作りって難しいなと感じました。
次は絶対に計画性をたててしっかり制作に取り組みたいです。

#制作で使ったプログラム
ホラーってなんだって考えたときにパズルだったんですよね。
という事でパズルを考えるうえで参考にさせていただいたのが**[OKsaiyowa](https://qiita.com/OKsaiyowa/items/2c5bdecc1edb5eea6eb0)**さんのシンプルなパズルの入れ替えロジックです！
んでこちらがゲームに合うように代えさせていただいたコードです！どぞ！


+ ```csharp
public class slidepuzzle : MonoBehaviour
{
   int x_MoveCount = 1;
    int z_MoveCount = 1;
    Vector3 thisObjPosition;
    Vector3 saveThisObjPosition;

    void Update()
    {

        if (Input.anyKey == false)
        {
            return;
        }

        thisObjPosition = this.gameObject.transform.position;
//左
        if (Input.GetKeyDown(KeyCode.LeftArrow) && x_MoveCount > -1)
        {
//位置を保存
            saveThisObjPosition = this.gameObject.transform.position;
            thisObjPosition.x -= 1;
//位置を変更
            this.gameObject.transform.position = thisObjPosition;
            x_MoveCount -= 1;
        }
//右
        if (Input.GetKeyDown(KeyCode.RightArrow) && x_MoveCount < 1)
        {
            saveThisObjPosition = this.gameObject.transform.position;
            thisObjPosition.x += 1;
            this.gameObject.transform.position = thisObjPosition;
            x_MoveCount += 1;
        }
//上
        if (Input.GetKeyDown(KeyCode.UpArrow) && z_MoveCount < 1)
        {
            saveThisObjPosition = this.gameObject.transform.position;
            thisObjPosition.z += 1;
            this.gameObject.transform.position = thisObjPosition;
            z_MoveCount += 1;
        }
//下
        if (Input.GetKeyDown(KeyCode.DownArrow) && z_MoveCount > -1)
        {
            saveThisObjPosition = this.gameObject.transform.position;
            thisObjPosition.z -= 1;
            this.gameObject.transform.position = thisObjPosition;
            z_MoveCount -= 1;
        }
    }

    void OnTriggerEnter(Collider other)
    {
        //衝突してほしいゲームオブジェクトでなければ抜ける
        if (other.gameObject.tag == "cube")
        {
//接触したときにパズルの位置が入れ替わる
            Debug.Log("hit");
            other.transform.position = saveThisObjPosition;
        }
        //other.transform.position = saveThisObjPosition;
    }
}
```
どうだったでしょうか？参考にする際はぜひOKsaiyowaさんの方のコードを見ていただくと非常にわかりやすいと思います！
というわけで見ていただいた方ありがとうございました！！！！
ActionView::MissingTemplate in Groups#newエラーの解決例

# 1.どんなエラー？
renderメソッドで表示しようとしている、viewファイルがありませんという内容です

筆者の場合は同じgroupsフォルダ内のformというファイルで記載したものを引用しnewファイルで表示しようとしていました。（下記参照）


###### ＜エラー文＞

<img width="1280" alt="スクリーンショット 2020-01-14 2.23.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/42958b46-3b8d-d311-8b2f-d849f2b8f474.png">

###### <エラーに関係したgroupsフォルダ内のファイル>

```haml:new.html.haml
.chat-group-form
  %h1 新規チャットグループ
  = render partial: 'form', locals: { group: @group }
```

```haml:form.html.haml

= form_for group do |f|
  .chat-group-form__errors
    %h2 10件のエラーが発生しました
    %ul
      %li nameを入力してください
  .chat-group-form__field
    .chat-group-form__field--left
      = f.label :name, class: 'chat-group-form__label'
    .chat-group-form__field--right
      = f.text_field :name, class: 'chat__group_name chat-group-form__input', placeholder: 'グループ名を入力してください'
  .chat-group-form__field.clearfix
    / この部分はインクリメンタルサーチ（ユーザー追加の非同期化のときに使用します
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
      %label.chat-group-form__label{:for => "chat_group_チャットメンバー"} チャットメンバー
    .chat-group-form__field--right
      / グループ作成機能の追加時はここにcollection_check_boxesの記述を入れてください
      = f.collection_check_boxes :user_ids, User.all, :id, :name
      / この部分はインクリメンタルサーチ（ユーザー追加の非同期化のときに使用します
  .chat-group-form__field.clearfix
    .chat-group-form__field--left
    .chat-group-form__field--right
      = f.submit class: 'chat-group-form__action-btn'

```



# 2.原因
　構文を確認してみるとどこにも間違いがないため、悩んでいたところ、ありました、**partial: 'form'**という一文が。
　partialというのはフォルダ内の"部品名となっているファイル"を引用しますよという意味があり、通常のファイルに対してpartialという縛りを増やすと読み込みを行いません。
　つまるところpartialで参照したファイルのファイル名は"部品"であることを意味する**'_(アンダーバー)'から始めなければならない**のです。

# 3.解決方法
結論としてはpartialを使って呼び出すファイルは"_(アンダーバー)"から始まるファイル名とすればエラー要因の一つが取り除かれるということになります。

ちなみに筆者の場合の例を確認してみましょう。上記に添付した筆者のファイル名を見てみるとformのファイル名が部品の形となっていませんね。なので**form.html.haml→_form.html.haml**とすることによりエラー文は解消されます。
【EV3 x Python】mjpg-streamerを使ってPCにカメラ映像をストリーミングする．

# 概要
ev3からmjpg-streamerを使ってカメラ映像をストリーミングする手順を紹介します．ev3devではソフトウェアの導入のみでストリーミングサーバーをセットアップできます．PC側でOpenCVを使って映像を表示するコードを作ります．

# 前提
* PC : mac (macOS Mojave 10.14.6)
* EV3 (ev3dev)
* vscode 
* opencv-pythonインストール済み

# MJPG-streamerのインストール
MJPG-streamerをインストールためにapt-getを使いますが，デフォルトの設定のまま，メモリ不足で失敗することがあるのであらかじめスワップ領域を作成してください．やり方はこの記事を参考に作成してください！
[【EV3 x Python】スワップ領域を作成する方法](https://qiita.com/RYoTA1209/items/71d0efeae59930fbcf6b)

そもそもターミナルの開き方がわからない方は↓
[【EV3 x Python】SSH接続をする](https://qiita.com/RYoTA1209/items/6d02fa837f5c70c9daa6)

ターミナルで以下のコマンド上から入れていく.パスワードを聞かれたら`maker`

```bash
$ cd ~
$ sudo apt-get install -y cmake libv4l-dev libjpeg-dev imagemagick
$ git clone https://github.com/jacksonliam/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ make
$ sudo make install 
```

# MJPG-streamerを実行
```bash
$ cd ~/mjpg-streamer/mjpg-streamer-experimental/
$ ./mjpg_streamer -o "output_http.so -w ./www" -i "input_uvc.so"
```

# PCのブラウザでev3にアクセスすると画像が表示される
EV3を接続しているPCのブラウザでhttp://ev3dev.local:8080 にアクセスするとストリーミングのページが開かれます．
<img width="778" alt="スクリーンショット 2020-01-14 2.38.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/b6f09b28-9c43-1415-ac8f-028359f940ef.png">
汚い部屋でごめんなさいｗ

# Pythonで映像を映し出すスクリプトを組む

```python:streaming.py
from cv2.cv2 import VideoCapture,waitKey,imshow,destroyAllWindows

# 映像が送られてくるリンクを指定する.
cap = VideoCapture("http://ev3dev.local:8080/?action=stream")

# リンクが開けなかった場合
if not cap.isOpened():
    print("Cannot open a video capture.")
    exit(-1)


while True:
    # escキーが押されたらループ終了
    k = waitKey(1)

    if k == 27:
        break

    # 送られてくる映像のフレームを取得する
    ret, frame = cap.read()
    
    # もしフレームが取得できなかった場合
    if not ret:
        continue

    # フレームを表示する
    imshow("EV3 Streaming", frame)

# キャプチャーの開放&ウィンドウを閉じる
cap.release()
destroyAllWindows()
```

## 実行結果
<img width="752" alt="スクリーンショット 2020-01-14 2.42.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/bf3aa25a-ca0e-884b-31e5-3f1a58dfcd86.png">
**汚い部屋ですみませんm(_ _)m**
【EV3 x Python】SSH接続をする

# 概要
`apt-get`や直接pythonファイルを実行させたいときに使わなければいけないときにev3にssh接続したいことがあるでしょう．本記事ではvscodeの拡張機能を使った方法とターミナルを使った方法を紹介します．

# 環境
* PC : mac (macOS Mojave 10.14.6)
* EV3 (ev3dev)
* vscode (`ev3dev-browser`インストール済み)

# 1.vscode使う方法
**`ev3dev-browser`**を予めインストールされていることを前提に話を勧めていきます．インストールがお済みでない方は先にインストールしてください．
[https://marketplace.visualstudio.com/items?itemName=ev3dev.ev3dev-browser](https://marketplace.visualstudio.com/items?itemName=ev3dev.ev3dev-browser)

## 1.1 まずはev3に接続
### 'Click here to connect to a device'をクリック
<img width="383" alt="スクリーンショット 2020-01-14 2.00.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/576c5161-09cf-0a64-8974-0315d16d5f74.png">


### 'ev3dev bridge'をクリック
<img width="720" alt="スクリーンショット 2020-01-14 2.02.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/2c898f70-e9a5-8a64-f708-958fe641e3ee.png">

### ev3devの横に緑の丸が表示されれば接続済み
<img width="211" alt="スクリーンショット 2020-01-14 2.03.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/b56b750c-fc70-a2c1-d605-0553096a6b3a.png">

## 1.2 SSH接続
### ev3dev-browser内の`ev3dev`を右クリックして`Open SSH Terminal`をクリック
<img width="340" alt="スクリーンショット 2020-01-14 2.05.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/33a6ba7b-3afa-9f4b-1d38-57d979b4fd51.png">

### 完了！
ウィンドウ下部にターミナルが開きます．
<img width="1362" alt="スクリーンショット 2020-01-14 2.07.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/db7d907e-0d53-8206-75bc-9702b07363aa.png">

# 2.ターミナルを使う方法

## ターミナルを開く
<img width="69" alt="スクリーンショット 2020-01-14 2.11.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/da5270ea-f26b-71e8-c2ed-a10efed2809d.png">

## sshコマンド
```bash
ssh robot@ev3dev.local
```
パスワードを聞かれたら`maker`と打ち込む（プライバシ保護のため文字は表示されないが入力はできているので問題ありません）

```bash

Linux ev3dev 4.14.117-ev3dev-2.3.4-ev3 #1 PREEMPT Thu May 9 15:13:01 CDT 2019 armv5tejl
             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/

Debian stretch on LEGO MINDSTORMS EV3!
Last login: Mon Jan 13 17:07:26 2020 from fe80::3c15:c2ff:fe3d:7364%usb0
robot@ev3dev:~$
```
この画面が表示されればOK
LambdaでCloudWatchLogsのログ保存期間を変更する

# 0. 筆者環境

AWS Lambda: Python 3.8

# 1. 概要

今回はCloudWatchLLogsの特定のロググループに対してログ保存期間の変更が必要になったので、
他環境への汎用も考えLambdaを叩けば一括で変更できるような仕組みを作った。

# 2. 使い方

Lambdaを作成、Lambdaの環境変数に以下を設定し実行。

days: 変更したいログ保存期間
pattern: 変更したいロググループの名前(正規表現)
region: 対象のリージョン(東京リージョンならap-northeast-1でよい)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237765/a0d9bdde-49aa-713b-e79e-af691b0f2c0e.png)



# 3. こーど

Gistにあげることにしました。
簡素なコードなので以下挙動の概要のみ。

1. ロググループを全て取得(get_Loggroups)
2. ログ保存期間とロググループのlist作成(create_Policies)
3. ログ保存期間設定(set_Logretention)

https://gist.github.com/tunalight/63d2f5260563de5103f844a1f4010b3d
GASで翻訳API作成してLaravelで叩くまで

# はじめに

この記事では

GASで英語から日本語に翻訳するAPIを作成しLaravelで結果を取得までします

## GASを作成

こちらの記事を参考に作成しました
[3 分で作る無料の翻訳 API with Google Apps Script](https://qiita.com/tanabee/items/c79c5c28ba0537112922)

## controllerを作成

一部抜粋

``` TransController.php
    public function index() {
        
        $transApiUrl = '公開したAPIのURL';
        $transSource = 'en'; // 翻訳前の言語
        $transTarget = 'ja'; // 翻訳語の言語
        $transText = "Hello"; // 翻訳する文字

        $transApiUrl .= '?text=' . urlencode($transText);
        $transApiUrl .= '&source=' . $transSource;
        $transApiUrl .= '&target=' . $transTarget;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $transApiUrl);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $res = curl_exec($ch);
        curl_close($ch);



        return $res;
    }
```
GASの翻訳APIを叩く際に翻訳するテキスト量が多い際に
`Moved Temporarily
The document has moved here.`

と出ることがあります
これは

`curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);`
この記載を追加することで回避できます

## 叩いてみる
APIの配下にcontrollerを作成したので
ルーティングを以下に追記

``` api.php
Route::get('trans', 'Api\TransController@index')->name('trans');
```
`http://127.0.0.1:8000/api/trans`にアクセス

## 結果

```
{"code":200,"text":"こんにちは"}
```
離散フーリエのプログラムを自作した

離散フーリエ変換(DFT)のプログラムを自分で作ってみました。
フーリエ変換は大学3年生の時に授業でやったのですが、昔のことなので忘れてしまいました(sinやcosや積分が出たような気がする程度)。
化学系出身ということもあり、DFTといえば密度汎関数理論の方を思い浮かぶタイプの人ですが、google教授にいろいろ教わりながらやりました。
結論としては、だいぶ簡単でした。

#離散フーリエ変換
wikipedia先生曰く
$$ F(t)=\sum_{x=0}^Nf(x)e^{-i \frac{2\pi tx}{N}} $$
ここで、Nは任意の自然数(データ数？)、eはネイピア数、iは虚数単位、πは円周率、tは周波数です。

これをプログラムに落とし込んでいきます。
まずは適当に三角関数を足し合わせたものを作ります。
周波数が9で振幅1の正弦波と、周波数18で振幅2の正弦波を重ねました。
$$ y(x) = \sin(9×2\pi x)+2\sin(18×2\pi x)$$

グラフ描画はpandasのplotを使いました。

```python:dft.py
%matplotlib inline
import numpy as np
import pandas as pd
import math
import cmath

sintest = np.zeros(1000)
x = np.zeros(1000)
for i in range(0,1000):
    sintest[i] = math.sin(i*(9*2*cmath.pi)/1000)+2*math.cos(i*(18*2*cmath.pi)/1000)
    x[i] = i/1000

df = pd.DataFrame([x,sintest]).T
df.columns = ["X","Y"]
df.plot(x="X",y="Y",grid = True,legend = False)
```
↓作った関数
<img width="377" alt="スクリーンショット 2020-01-18 20.27.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391077/4f869488-b438-59b2-db9a-1654114d9c11.png">




これをフーリエ変換します。wikipedia先生の式をそのままコードにします。

```python:dft.py
result = np.zeros(sintest.shape[0])
N = sintest.shape[0]
for i in range(0,N):
    temp = 0j
    for k in range(0,N):
        temp = temp + sintest[k]*cmath.exp(-1j*2*pi*i*k/N) 
    result[i] = abs(temp)
result_pd = pd.DataFrame(result)
result_pd.plot(logy=False,grid = True,xlim = [0,100])
```
<img width="391" alt="スクリーンショット 2020-01-14 1.29.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391077/71a2f8de-f35a-205c-a687-966998cc56a7.png">


ちゃんと9と18にピークが立ちました。ピーク比も振幅比と一致しています。

#感想
たったの数行で離散フーリエ変換ができるとは思わなかったです。もう少し難しいと勝手に思っていました。
次は高速フーリエ変換をしたいです。

#おまけ(為替データの離散フーリエ変換)
為替データをフーリエ変換することで「いつ外貨を売買すれば儲かるか」を調べるため、2020年1月17日4時10頃から20時50分頃までのUSD/JPYの為替データをフーリエ変換してみました。
周波数が1min<sup>-1</sup>でピークがあり、それ以外の成分は小さいです。
1分間の変動なんてほとんどが0.5銭未満なので、スプレットを支払う機械にしかなりません。

(そもそも1分のサンプリング周期なのに周波数1min<sup>-1</sup>の成分ってどんな意味があるんだ・・・)

<img width="384" alt="スクリーンショット 2020-01-17 21.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391077/04da9c90-fe26-838d-e76b-9de109ba3489.png">
iOS13のアップデート対応してみた

久々のQiita投稿です。最近はもっぱらブログに投稿していたので、おざなりになってました。ブログもおヒマなら覗いてみて下さい。
[くま's Tech系Blog](https://kumaskun.hatenablog.com/)

最近はiOS13対応をしているので、まとめてメモしたいと思います。

####①モーダル表示の変更
最初に一番驚いたのがこれです。

かなり中途半端になっていて、下の画面が少しみえます。

しかも、前面に出ている画面を下げると下の画面が表示されます。これだと、遷移時に更新とかするのに大変です。

Appleはこういうモーダル構成に今後していきたいということですかね？

<img width="287" alt="20200113141248.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/dcfdbeed-3696-f148-71ea-67f6e0bfb1f3.png">

これに関しては、UIModalPresentationStyleにautoが追加され、デフォルトのモードが`auto`となっていることで発生しています。(今までは`fullScreen`がデフォルトでした)

なので、`fullScreen`にすれば問題ないはずです。

```
viewController.modalPresentationStyle = .fullScreen
```

もしくは、stroryboardで設定している場合は変更すればいいはずです。

<img width="251" alt="20200113142003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/c4c9653e-37aa-ac74-1067-25d7464314a6.png">

####②Segemetの変更

iOS13では`UISegmentedControl`の見た目が変更されます。

今までは`tintColor`を使っていましたが、tintColorに依存しなくなったので、色を設定していてもデフォルトに戻ります。

これは、`selectedSegmentTintColor`を使うことで変更できます。

文字の色を変更する場合は下記のようにしないといけません。

```
// 選択されている場合の文字の色
 setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .selected)
// 選択されていない場合
 setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], for: .normal)
```

また、選択されていない場合の背景色がグレーになっているかと思いますが、これは背景が単色のimageを設定すれば解消されます。(文字の色と合わない場合があるので)

```
// 背景に単色画像を設定
setBackgroundImage(UIColor.clear.toImage(), for: .normal, barMetrics: .default)
setBackgroundImage(UIColor.red.toImage(), for: .selected, barMetrics: .default)
```

この場合はtintColorを設定していても` .normal`と`.selected`両方の設定がないと反映されません。(むしろtintColorはいらない気がします)

####③FontのBoldが変更
iOS13でBoldが以前より少し太くなっています。

これによって、ラベルがはみ出したり、全て表示されないといことがあるので、幅を広げたりする必要性がありそうです。(太字を直せるか微妙なところだし、そもそも新しい太字で進めるべきな気がしてきた...)

今のところこんな感じですが、まだまだあります。(ダークモードとか)
そこまで大幅な修正はあまりなさそうですが、2020年4月までにXcode11で開発しないといけないため、そろそろ開発し始めないといけなさそうですね。

####参照
[iOS13対応をまとめてみた](https://qiita.com/OkamotoHaru/items/0f285e399ed3fc44ea99)
[iOS 13における必須対応について](https://techracho.bpsinc.jp/yoshi-k/2019_08_28/79514)
[iOS13でUISegmentedControlの見た目をカスタマイズする](https://qiita.com/gaussbeam/items/7945f04310f155d4e7a4)
[ios13から日本語フォントのboldがより太くなるケース](https://qiita.com/a_t/items/484f7ad52e8c9fd18903)
Bash カスタマイズ

## 説明

できる人のターミナル環境はとてもやりたいことが実行しやすく、そしてかっこよくカスタマイズされていた。

自分もそれを目指していくための、メモ。

## 手順

### STEP①
`.git-prompt.sh` をダウンロードして、ユーザルートに配置

<ダウンロードURL>
https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh


### STEP②
以下の追記する

```
# wget -O .git-prompt.sh https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
source ~/.git-prompt.sh

# Gitブランチの状況を*+%で表示
GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM=auto


#########################
# 出力の後に改行を入れる
#########################

function add_line {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}
PROMPT_COMMAND='add_line'


###############
# 最後にexport
###############

ESC="\[\e["
END="\]"
RES="\[\e[m\]"
OFF="0;"
BOLD="1;"
BLACK="30m"
RED="31m"
GREEN="32m"
YELLOW="33m"
BLUE="34m"
PURPLE="35m"
CYAN="36m"
WHITE="37m"

# export PS1='${ESC}${PURPLE}${END}\u${RES}@${ESC}${GREEN}${END}\h${RES} ${ESC}${BOLD}${BLUE}${END}\W${RES} \[\e[1;36m$(__git_ps1 "(%s)")\[\e[0m\] \n$'
export PS1='\[\e[1;35m\]\u\[\e[m\] @\[\e[1;32m\]\h\[\e[m\] \[\e[1;33m\]\W\[\e[m\] \[\e[1;36m$(__git_ps1 "(%s)")\[\e[0m\] \n$ '
```

以下のようなターミナルになる
（あとではる）

## 参考
[【Bash】ターミナルのプロンプトのカスタマイズ方法まとめ](https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60)

[bash の prompt をカスタマイズする - Qiita](https://qiita.com/white_aspara25/items/935d789ec6b242e37e87)

[bashのプロンプト(･･･$で表示されるやつ)の表示を変更する - Qiita](https://qiita.com/kkenya/items/f7cb4b8787e7ac27a46d)

[gitのブランチ名をターミナルで表示できるようにする - Qiita](https://qiita.com/lemtosh469/items/334ff76366e054a3a3aa)
Docker で楽々複数MySQL立ち上げ

# はじめに

この記事はDockerのMySQLの公式イメージを使って複数のMySQLを立てるのがゴールです

参考記事 
[dockerでmysqlを使う]
(https://qiita.com/astrsk_hori/items/e3d6c237d68be1a6f548)

## 利用するもの

 - Docker for Mac

[DockerをMacにインストールする（更新: 2019/7/13）](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)

- シェルスクリプト

## 作成したシェルスクリプト
Docker for Macを入れたあと
公式のイメージを利用して

- mysql5.6
- mysql5.7
- mysql8.0

この三つをpullします

pullした後にそれらを起動します

``` mysql.sh

docker pull mysql:5.6 && docker pull mysql:5.7 && docker pull mysql:8.0
docker run --name mysql5.6 -p 3356:3306 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.6
docker run --name mysql5.7 -p 3357:3306 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7
docker run --name mysql8.0 -p 3380:3306 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=pass -d mysql:8.0

```

作成したシェルスクリプトを実行

## MySQLに接続してみる

```
$ mysql -uroot -h127.0.0.1 -p -P3357
```

-Pの部分を 
5.6を使いたかったら3356
5.7を使いたかったら3357
8.0を使いたかったら3380
にすれば使い分けることができます

``` .sh
docker run --name mysql5.6 -p 3356:3306 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.6

```
-pの内容を変えればポート番号を変えれますし

MYSQL_USER=root
MYSQL_ROOT_PASSWORD=pass

ここをいじればユーザー名とパスワードを変えれます
MicroK8sでContourを利用する

## はじめに

他に似た記事がなかったので備忘録。

Ingressを使ったバーチャルホスト運用をする中で、CI/CD上でバーチャルホストを新たに増やして、試験デプロイするようなイカした環境を構築したかった。
一つのIngressリソースの中でバーチャルホストを動的に増減させようとすると、Manifestのspec.rulesの書き換えする必要があるが、kubectlコマンドやテンプレートエンジンがうまく使えず、思っていた以上に簡単ではなかった。
何か良い方法はないかと探していたところ、ContourのHTTPProxyリソースが使えそうだったので試してみた。

## 環境
- Ubuntu 19.04
- MicroK8s v1.15.7
- Contour v1.10

## インストール

### 事前準備

MicroK8sのingressアドオンはLoadBalancerの替りとしてNodeの80/443を奪ってしまうので、MicroK8sのアドオンで入っているingressを無効化しておく。

``` bash
$ sudo microk8s.disable ingress
```

### Contourをインストールする

公式の[Getting Started](https://projectcontour.io/getting-started/)を頼りにしてインストールを進める。

デフォルトだとtype: LoadBalancerのServiceが必要だが、MicroK8sでのLoadBalancerの配置は難しい上に、1つのワーカノードしかなくLoadBalancer不要なので、MicroK8sのingressアドオンと同様な構成にすることで、解決を図った。

具体的にはデプロイManifestの一部を、type: ClusterIPのServiceにNodeのIPをexternalIPsに付与する形に変更した。

``` bash
$ wget https://projectcontour.io/quickstart/contour.yaml

$ vi contour.yaml
・・・
apiVersion: v1
kind: Service
metadata:
  name: envoy
  namespace: projectcontour
spec:
  ports:
    - port: 80
      name: http
      protocol: TCP
    - port: 443
      name: https
      protocol: TCP
  selector:
    app: envoy
  type: ClusterIP
  externalIPs:
    - ＜NodeIP＞
・・・

$ kubectl apply -f contour.yaml
```

## 使い方

http://my-application.＜ドメイン名＞/ でnginxを公開するサンプルは下記の通り。

``` yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-application
  namespace: my-namespace
  labels:
    app: my-application
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-application
  template:
    metadata:
      labels:
        app: my-application
    spec:
      containers:
        - name: my-application
          image: nginx
```
``` yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-application
  name: my-application
  namespace: my-namespace
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: my-application
  type: ClusterIP
```
``` yaml
---
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: my-application
  namespace: my-namespace
spec:
  virtualhost:
    fqdn: my-application.＜ドメイン名＞
  routes:
    - conditions:
        - prefix: /
      services:
        - name: my-application
          port: 80
```

複数アプリケーションを同じクラスタにデプロイする際に、アプリケーションごとにHTTPProxyリソースを記載できるので、Ingressリソースのように一つのManifestをこねくり回さなくて良くなり、Manifest管理が楽になった。
また、IngressリソースだとNamespaceを超えたServiceを利用する際はExternalNameを使ったServiceをさらにもう一つ作る必要があった[^1]が、HTTPProxyはNamespaceを跨いでHTTPProxyを配置できるので、その考慮も不要になった。

## まとめ

1. 自前LoadBalancerを用意しなくてもContourのHTTPProxyが利用できた
2. Single Node KubernetesでのHTTPProxyは超便利！！

[^1]: [Ingressでクロスネームスペースでのロードバランシング](https://qiita.com/murata-tomohide/items/0538d03abde5c7ab94dd)
要件定義初心者のための要件定義指南

要件定義初心者の自分が、要件定義を日々行っていく中で、大事だなと感じたことを記事にしていこうと思います。

要件定義の話に入る前に、以下のような例を出しておきます。

## 要件定義はRPG
ドラ○エやファイナル○ァンタジーのようなRPGを思い浮かべてください。
RPGの主な流れとして、
`勇者`が`魔王`を倒して、`世界平和にする`
このような構成になっていると思います。

これを`目的`・`目標`・`手段`に当てはめてみます。(様々な当てはめかたがあると思いますが)

`目的`：`世界を平和にする`
`目標`：`魔王を倒す`
`手段`：`勇者のレベルを上げる`

以上を踏まえて本題に入っていきます。

## 要件定義

まず初めに、用語を定義しておきます。

`クライアント` : ここでは、営業さん、webディレクターさん等、エンジニアに`要求`を持ってくる人達のことを指すとします。


そもそも要件定義とは`クライアントの要求`に対して、`クライアント`と`エンジニア`で認識合わせを行い、どう対応するのかを決めていくものです。

ここで、`クライアントの要求`に関して言及すると、多くの場合`クライアントの要求`は上のRPGの話でいうところの`目標`である場合がほとんどです。

例を挙げて説明すると
***競合他社には掲載されている情報を自社サイトにも掲載してほしい***
という要求がクライアントから来たとします。これは`目標`に該当しています。
この`要求`の裏には、
***他社サイトにある情報をしっかりと自社サイトでも提供し、他社サイトに流れてしまうのを防ぐ***
という`目的`があります。

この`目的`を飛ばして、`目標`の部分がエンジニアに`要求`として降ってくる場合が多いです。

重要なのは、***なんのためにそのタスクを行うのか・そのタスクを達成するとどんなメリットがあるのか***という`目的`の部分をしっかりと聞き出す事です。

ただ言われた`目標`の部分を遂行しているだけでは、根本的な問題解決にはならないしエンジニアのリソースの無駄遣いになりかねません。

***`目標`の裏にある、`目的`のヒアリングを行う。***
これが要件定義の第一段階です。

### エンジニアは手段の提案のプロ
`目的`のヒアリングを行いお互いに認識を合わせた後は、その`目的`に即した`目標`を達成するための`手段`をどうするか決めていきます。

システム関連では、***エンジニアは手段の提案のプロであるため***、クライアントの`要求`に対して最適な`手段`を提案できなければなりません。

最適な`手段`を提案するためには、様々な技術に精通しておかなければならず、そのためには日々新しい技術に触れ続け、***自分の引き出しを可能な限り広げておく***ことが必要です。

自分もまだプログラミング初心者で要件定義の際、この技術の引き出しの少なさに悩んでいます。
しかしこればかりはもう、地道に積み重ねていくしかないと思います。


##　まとめ
というわけで、要件定義をする上で需要なことをまとめると
***相手の要求の裏にある`目的`の部分をしっかりと聞き出し、その対応策を考える。
最適な対応策を提案するために日々自分の技術に磨きをかけ、
自分の提案できる`手段`の引き出しを広げていく。***
だと思います。

以上でこちらの記事を締めくくります。

ご閲覧ありがとうございました。
M5Stack用の指紋センサを使ってみた時のメモ

##概要
M5Stack用の指紋センサを買ってみたので、動かすまでのメモを書きました。
＊結果的には、指紋センサを正しく動かすことはできなかったのですが、備忘録までに書いています。

###初期設定

基本的にはこちらのクイックスタート通りに進めればhello worldの出力まではできます。
https://docs.m5stack.com/#/en/quick_start/m5core/m5stack_core_get_started_Arduino_MacOS
[![Image from Gyazo](https://i.gyazo.com/f9997ee716987cf042fb160e068e1ed5.png)](https://gyazo.com/f9997ee716987cf042fb160e068e1ed5)

###指紋センサのライブラリを使ってみる
今回使うのはこちらのセンサです。

[![Image from Gyazo](https://i.gyazo.com/9d4067accefdf8b5cf65c62f9477f3bf.png)](https://gyazo.com/9d4067accefdf8b5cf65c62f9477f3bf)


ArduinoIDEを用いて、スケッチ例を開きます。
ファイル→スケッチ例→M5Stack→Unit→FingerPrint
で該当のスケッチを開けます。
[![Image from Gyazo](https://i.gyazo.com/9bc9259e7a169af6c9e60957fe2085c9.png)](https://gyazo.com/9bc9259e7a169af6c9e60957fe2085c9)
このような画面になります。

###結果は？
[![Image from Gyazo](https://i.gyazo.com/b53de2b644fa779060276f16d77aa8ce.png)](https://gyazo.com/b53de2b644fa779060276f16d77aa8ce)

このように指紋をセンサに設置させながらAボタンを押したのですが、望んだ結果は出力されず、まだ使いこなせていないのを露呈してしまいました。
もし、動くようになりましたら追記します。
JavaScript勉強の記録その20: alertとconfirmを使ってメッセージボックスを表示

#alertを使ってメッセージボックスを画面に表示する

alert('表示したいメッセージ')とすることで、画面に以下のようなメッセージボックスを表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/cfc4732b-0652-6398-2882-5acdd6f38d9f.png)

```index.js
alert('このページはまだ準備中です');
```

#confirmを使って画面にメッセージボックスを表示

confirm('表示したい内容')とすることで、OKかキャンセルかどちらかを選べるメッセージボックスを表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/5c9a2dd5-5040-0cc2-96ba-c6b2fbdc6867.png)

alertとの大きな違いとしては、confirmは返り値としてBooleanを返してくれますので、ユーザがOKを選んだ時と、キャンセルを選んだ時で違う処理を実行することができます。例えば記事管理アプリを作っていたとして、なんらかの記事を削除する際などに使えるかと思います。　

```index.js
const answer = confirm('本当に削除しますか？');

if (answer) {
  console.log(answer); //OKを選んだ時はコンソールにtrueと表示される
} else {
  console.log(answer); //キャンセルを選んだ時はコンソールにfalseと表示される
}
```
build.gradle.ktsでdevelopmentOnlyが使えなかった・・・


# 経緯

リファレンス見ながらSpring Bootの勉強中
https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/#using-boot-devtools

devtoolsを入れるとクラス変更したときに勝手に再起動してくれるっぽい

そーいや入れてなかったな・・・

リファレンスだと

```gradle
configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}
dependencies {
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}
```

ほほーん

よっしゃいっちょ書いてみるかー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/12327aed-a2a1-c917-ec57-388c3bf318cb.png)


**おや・・・？**

# build.gradleとbuild.gradle.ktsとで書き方が違うっぽい

元々Spring Initialzrでもkotlinだとエラーになってたっぽいね
issue挙げられてた

https://github.com/spring-io/start.spring.io/issues/146

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/1521f477-0129-8c8c-3e47-9bb4987e388c.png)

いえーい
itertoolsを用いた要素の組み合わせの取得

複数のリストの内容の組み合わせ一覧を取得するために、itertools.productというメソッドを使用すると非常に便利


```
Input = ["Docment","StyleSheet","Value"]
Output = ["XML","Shema","DTD"]
Action = ["Read","Write","GetRoot","EditSubELM","EditDescELM","Append","Insert","Iterate","Find","Format"]

writeObj = list(itertools.product(Input,Output,Action))

with open("write.txt","w") as writer:
    writer.write(str(writeObj))
    writer.close()
```

出力結果は次の通り。
```
('Docment', 'XML', 'Read')
('Docment', 'XML', 'Write')
('Docment', 'XML', 'GetRoot')
('Docment', 'XML', 'EditSubELM')
('Docment', 'XML', 'EditDescELM')
('Docment', 'XML', 'Append')
('Docment', 'XML', 'Insert')
('Docment', 'XML', 'Iterate')
('Docment', 'XML', 'Find')
('Docment', 'XML', 'Format')
('Docment', 'Shema', 'Read')
('Docment', 'Shema', 'Write')
('Docment', 'Shema', 'GetRoot')
('Docment', 'Shema', 'EditSubELM')
('Docment', 'Shema', 'EditDescELM')
('Docment', 'Shema', 'Append')
('Docment', 'Shema', 'Insert')
('Docment', 'Shema', 'Iterate')
('Docment', 'Shema', 'Find')
('Docment', 'Shema', 'Format')
('Docment', 'DTD', 'Read')
('Docment', 'DTD', 'Write')
('Docment', 'DTD', 'GetRoot')
('Docment', 'DTD', 'EditSubELM')
('Docment', 'DTD', 'EditDescELM')
('Docment', 'DTD', 'Append')
('Docment', 'DTD', 'Insert')
('Docment', 'DTD', 'Iterate')
('Docment', 'DTD', 'Find')
('Docment', 'DTD', 'Format')
('StyleSheet', 'XML', 'Read')
('StyleSheet', 'XML', 'Write')
('StyleSheet', 'XML', 'GetRoot')
('StyleSheet', 'XML', 'EditSubELM')
('StyleSheet', 'XML', 'EditDescELM')
('StyleSheet', 'XML', 'Append')
('StyleSheet', 'XML', 'Insert')
('StyleSheet', 'XML', 'Iterate')
('StyleSheet', 'XML', 'Find')
('StyleSheet', 'XML', 'Format')
('StyleSheet', 'Shema', 'Read')
('StyleSheet', 'Shema', 'Write')
('StyleSheet', 'Shema', 'GetRoot')
('StyleSheet', 'Shema', 'EditSubELM')
('StyleSheet', 'Shema', 'EditDescELM')
('StyleSheet', 'Shema', 'Append')
('StyleSheet', 'Shema', 'Insert')
('StyleSheet', 'Shema', 'Iterate')
('StyleSheet', 'Shema', 'Find')
('StyleSheet', 'Shema', 'Format')
('StyleSheet', 'DTD', 'Read')
('StyleSheet', 'DTD', 'Write')
('StyleSheet', 'DTD', 'GetRoot')
('StyleSheet', 'DTD', 'EditSubELM')
('StyleSheet', 'DTD', 'EditDescELM')
('StyleSheet', 'DTD', 'Append')
('StyleSheet', 'DTD', 'Insert')
('StyleSheet', 'DTD', 'Iterate')
('StyleSheet', 'DTD', 'Find')
('StyleSheet', 'DTD', 'Format')
('Value', 'XML', 'Read')
('Value', 'XML', 'Write')
('Value', 'XML', 'GetRoot')
('Value', 'XML', 'EditSubELM')
('Value', 'XML', 'EditDescELM')
('Value', 'XML', 'Append')
('Value', 'XML', 'Insert')
('Value', 'XML', 'Iterate')
('Value', 'XML', 'Find')
('Value', 'XML', 'Format')
('Value', 'Shema', 'Read')
('Value', 'Shema', 'Write')
('Value', 'Shema', 'GetRoot')
('Value', 'Shema', 'EditSubELM')
('Value', 'Shema', 'EditDescELM')
('Value', 'Shema', 'Append')
('Value', 'Shema', 'Insert')
('Value', 'Shema', 'Iterate')
('Value', 'Shema', 'Find')
('Value', 'Shema', 'Format')
('Value', 'DTD', 'Read')
('Value', 'DTD', 'Write')
('Value', 'DTD', 'GetRoot')
('Value', 'DTD', 'EditSubELM')
('Value', 'DTD', 'EditDescELM')
('Value', 'DTD', 'Append')
('Value', 'DTD', 'Insert')
('Value', 'DTD', 'Iterate')
('Value', 'DTD', 'Find')
('Value', 'DTD', 'Format')
```
tensorflowがimportできない問題がVC++ Redistributableを入れたら解決した

#はじめに
いきなり解決してしまって、なにがカギだったかわからないのですがだれかの参考になれば、と書き残しておきます..
## 開発環境
- Windows 10
- Python 3.6.1
- tensorflow 2.1.0


## どういう問題が発生していたか

```
 File "C:\Users\~~~~\imp.py", line 343, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```
って感じの怒られ方をしていました。
pipenvを疑っていたのですがanacondaでやっても同じだったのでそういう問題ではないのだろう、と見当をつけました
## 結論
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
ここからMicrosoft Visual C++ Redistributableをダウンロード、導入したところ解決しました。
これがクリティカルだったのかはわからないのですが、これくらいしか心当たりません。
## 経緯と所感
dllがないって言われていたので、[Dependencies](https://github.com/lucasg/Dependencies)で依存関係調べて力業で解決しようとして、要求されたVC++を入れたところいきなりimportが成功しました。
たしかに"tensorflow windows" とかで調べているとVC++2015 という文字列が視界の隅に入っていた気がするのですが、[公式のドキュメント](https://www.tensorflow.org/install)で見た覚えがない気がします..僕の読解力不足でしょうか..
imp.py 等で検索した人の手助けになれば..
テスト投稿

設計　リンクメモ

設計：
https://qiita.com/Saku731/items/741fcf0f40dd989ee4f8?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=ed02eb8ba2-Qiita_newsletter_396_01_22_2020&utm_medium=email&utm_term=0_e44feaa081-ed02eb8ba2-35469397

良いコードの書き方：
https://qiita.com/alt_yamamoto/items/25eda376e6b947208996




レスポンシブデザイン リンクメモ
https://qiita.com/kenz_firespeed/items/5cab42ad323913957935
https://developers.google.com/web/fundamentals/design-and-ux/responsive?hl=ja
https://seolaboratory.jp/89410/
https://www.kagoya.jp/howto/webhomepage/responsive/
https://webbu.jp/responsive-design-575
https://ultimate-ez.com/2014/03/29/3572/
LaTeXで書いたレポートをGitLabで管理して、GitLab-CIすることのメリット


- 自分の環境じゃなくてもコンパイルできることを確信しながらTeXをかける。
- ほかのパソコンからもブラウザで今の進捗状況を確認できる。
- バックアップにもなるのでリスクを減らせる。

$\LaTeX$
ホバー可能かどうかによってスタイルを変更する

# はじめに

CSSでスタイルを定義する際、クリック/タップ可能な領域は、「カーソルをホバーさせることができるか」に応じて変更したい場合があります。これは例えば、マウスカーソルが使えない場合はタップ可能であることを認識させるデザインにしたい、タップ可能領域を大きくしたい、などのケースが考えられます。

# ホバー可能か否かでスタイルを変更する

ホバー可能かどうかにおいて異なるCSSを適用したい場合、 `max-width` などのメディアクエリを使用して「スマホっぽいサイズ」かどうかで識別しようとしても、Viewportのサイズはデバイスによって様々であるため確実ではありません。そこで役に立つのが、 [hover](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover) メディアクエリです。

`hover` は、ユーザーの入力方法が要素をホバー可能かどうかを識別するメディアクエリであり、以下のように使用することが可能です。

```css
@media (hover) {
  .something {
    /* ホバー可能な場合に適用するスタイル */        
  } 
}

@media  (hover:none) {
  .something {
    /* ホバーできない場合に適用するスタイル　*/
  } 
}
```

# その他の方法

ここで説明したのは `hover` を使う方法ですが、その他の方法として [pointer](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/pointer) メディアクエリを使用する方法も考えられます。これは、ユーザーが持つポインティングデバイスの正確さを識別するメディアクエリであり、マウスなどの正確なポインティングデバイスを使っている場合は `pointer: fine`、指などのタッチスクリーンを使っている場合は `pointer: fine` として定義することができます。


# 参考
- [Using Media Queries For Responsive Design In 2018](https://www.smashingmagazine.com/2018/02/media-queries-responsive-design-2018/)
英語論文をpdfからコピペしてGoogle翻訳に入れたい

#1.概要
論文をpdfからコピペし、Google翻訳したいときに使用するもの。
出力したconv.htmlを開いて右クリックから翻訳する。
急遽必要だったためめちゃくちゃ適当に作成。メンテの予定も無し。

#2.ソースコード

```python
"""
論文をpdfからコピペし、Google翻訳したいときに使用するもの。
.txtのパスを与えると_conv.htmlで出すのでchromeで開いて右クリックから翻訳する。

・やってること
pdfでctrl + A して貼り付けると改行が無駄に入って上手く翻訳してくれないので
それを回避する。
"""

import sys
import os

filepath = sys.argv[1]

# ---テキストをGoogle翻訳用に加工
with open(filepath, "r", encoding="utf-8") as f:

    lines = f.readlines()
    newlines = []
    lenbuf = []  # lineのlenのバッファ
    for line in lines:
        if len(line) >= 2:
            if line[-2] == ".":  # 末端がピリオドなら改行を入れる
                line = line[:-1] + "<br>"
            else:  # そうじゃないならスペース入れる
                line = line[:-1] + " "
        newlines.append(line)
        lenbuf.append(len(line))
f.close()

# ---改行を入れた方がよさげだったら改行を入れる(line長さの平均*0.8を閾値にする)
ave_len = sum(lenbuf) / len(lenbuf)
for n, linelen in enumerate(lenbuf):
    if linelen < ave_len * 0.8:
        newlines[n] = newlines[n] + "<br>"

# ---_conv付けて保存
savepath = os.path.splitext(filepath)[0] + "_conv.html"

with open(savepath, "w", encoding="utf-8") as f:
    f.writelines(newlines)
```
CFnの戻り値(Ref,Fn::GetAtt属性)が少しわかったので共有


#CFnの戻り値(Ref,Fn::GetAtt属性)の説明

###戻り値とは、指定されると何かしらの値を返してくれる値と言うイメージです。
自動販売機でボタン押すと指定したものに準じて、飲み物を提供してくれる的な感じ？いい例が浮かびません(笑)

###GetAttはリソースごとに決められている物理ID(*)を引っ張ってくる感じです
なので**リファレンスを見に行かないとわかりません。**
Fn::GetAtt属性リファレンスです。
 >パラメータ
logicalNameOfResource
必要な属性を含むリソースの論理名 (論理 ID とも呼ばれます)。

>attributeName
必要としている値のある、リソース固有の属性の名前です。各リソースタイプで使用できる属性の詳細については、リソースの参照ページに説明されています。

CFnのテンプレートの中で決めたリソース名のことを論理名と言います。
attributeNameはリソース固有の属性名で、**指定されると物理IDとして返してくれます**
(※)物理IDとはリソースが作られたときにAWSによって割り振られたIDのこと。下記画像で言うとこのネットワークインターフェイスID
![スクリーンショット 2020-01-14 0.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544328/b8911aef-564b-9b92-5fe4-4e9d243cdb7a.png)


###!RefはCFnのテンプレートの中で決めたリソース名の物理IDを返します。

Ref属性リファレンスです。

>組み込み関数 Ref は、指定したパラメータまたはリソースの値を返します。

>パラメータの論理名を指定すると、それはパラメータの値を返します。

>リソースの論理名を指定すると、それはそのリソースを参照するために通常使用できる値を返します (物理 ID)。

以上を踏まえてEIPをを関連付けするときの方法を見ていきます。
下記は”AWS::EC2::EIP”リファレンスの引用です。
ここに表示されているものが戻り値（参照値）になります。
リソース（例　AWS::EC2::EIP）ごとに決まっています。他のリソースで!GetAttで指定されると参照されます。
>戻り値

>Refは
Elastic IP アドレスを このリソースの論理 ID を組み込みの Ref 関数に渡すと、Ref は次を返します: 。

>For more information about using the Ref function, see Ref.

>Fn::GetAtt
Fn::GetAtt 組み込み関数は、このタイプの指定された属性の値を返します。以下には、利用可能な属性とサンプル戻り値のリストが示されます。

>Fn::GetAtt 組み込み関数の使用方法の詳細については、「Fn::GetAtt」を参照してください。

>AllocationId
Amazon VPC で使用するアドレスの割り当てを表すために AWS によって割り当てられた ID。この値は、VPC の Elastic IP アドレスに対してのみ返されます。たとえば、eipalloc-5723d13e と指定します。


##例）
```
Resources:
  ControlPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc      
  AssociateControlPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId: !GetAtt ControlPortAddress.AllocationId　（読み：論理IDのAllocationIdという戻り値を参照）
      NetworkInterfaceId: !Ref controlXface（読み:論理名（controlXface）で作成された物理ID(※)を値として利用する）

controlXface:（これが作られたときに物流IDが付与される）
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId: !Ref SubnetId
      Description: Interface for controlling traffic such as SSH
      GroupSet: 
      - !Ref SSHSecurityGroup
      SourceDestCheck: true
      Tags:
      - Key: Network
        Value: Control
```

参考
[AWS::EC2::EIPAssociation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html)
[AWS::EC2::EIP](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html)
[Ref](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)
[Fn::GetAtt](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html)
SQLのUNIONについて③

またUNIONの話です、すみません。
今回はUNIONを使用する際の注意点について。

UNIONを使用するとき気を付けなければならないのは、
結果の数と型は一致させなければならないということです。
今回は、以下の二つのテーブルを使用します。

|コード |動物の名前 |
|:-----|:-----|
|0001   |犬
|0002   |猫
|0003   |うさぎ

|動物の名前| 
|:-----|
|きつね   |
|たぬき   |

これらのテーブルを、これまでのようにUNIONを使って検索しようとするとエラーになってしまいます。
以下のように、テーブル②も2列になるようにすれば正常に使用することができます。

|コード |動物の名前| 
|:-----|:-----|
|0004   |きつね   |
|0005   |たぬき   |

このように修正したテーブルに対してUNIONを使用すると、以下のような検索結果になります。

|コード |動物の名前 |
|:-----|:-----|
|0001   |犬
|0002   |猫
|0003   |うさぎ
|0004   |きつね   |
|0005   |たぬき   |
2019年に読み終えた書籍

2019年は2018年とほぼ同じく、あまり本を読まなかった1年でした。読み終えた書籍は合計24冊、定期刊行誌は合計21冊でした。

## 技術書: 10冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | Jim Blandy 他 | [プログラミングRust](https://www.amazon.co.jp/exec/obidos/ASIN/4873118557/x7edimv35x-22/) |
| 2 | Sarah L. Harris 他 | [ディジタル回路設計とコンピュータアーキテクチャ 第2版](https://www.amazon.co.jp/exec/obidos/ASIN/4798147524/x7edimv35x-22/) |
| 3 | スコット メイヤーズ 他 | [Effective C++ 第3版](https://www.amazon.co.jp/exec/obidos/ASIN/4621066099/x7edimv35x-22/) |
| 4 | 国野 亘 | [超特急Web接続!ESPマイコン・プログラム全集](https://www.amazon.co.jp/exec/obidos/ASIN/4789847047/x7edimv35x-22/) |
| 5 | 日経Linux編集部 | [ラズパイマガジン 2019年2月号](https://www.amazon.co.jp/exec/obidos/ASIN/4296101862/x7edimv35x-22/) |
| 6 | κeen 他 | [実践Rust入門](https://www.amazon.co.jp/exec/obidos/ASIN/4297105594/x7edimv35x-22/) |
| 7 | サム・グレゴリー 他 | [ディープフェイク：恐るべき合成動画技術（インタビュー）](https://www.amazon.co.jp/exec/obidos/ASIN/B07VRVPD6F/x7edimv35x-22/) |
| 8 | Dustin Boswell 他 | [The Art of Readable Code（Kindle版）](https://www.amazon.co.jp/exec/obidos/ASIN/B0064CZ1XE/x7edimv35x-22/) |
| 9 | 小野 輝也 | [Rustで始めるネットワークプログラミング（Kindle版）](https://www.amazon.co.jp/exec/obidos/ASIN/B07SW2GXVF/x7edimv35x-22/) |
| 10 | 有賀 康顕 他 | [仕事ではじめる機械学習](https://www.amazon.co.jp/exec/obidos/ASIN/4873118255/x7edimv35x-22/) |

## 技術同人誌: 9冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | こしあん | [DeepCreamPyで学ぶモザイク除去](https://note.mu/koshian2/n/naa60d5c9ebba) |
| 2 | Kenta IDA | [M5Stackではじめる組み込みRust](https://booth.pm/ja/items/1569213) |
| 3 | naotaco | [Rust on Bare-metal Raspberry Pi](https://booth.pm/ja/items/1318760) |
| 4 | naotaco | [Rust on Bare-metal Raspberry Pi Vol.2](https://booth.pm/ja/items/1575818) |
| 5 | ぽんず堂 | [NATSによるPub/Subメッセージング入門](https://ponzdou.booth.pm/items/1562371) |
| 6 | 電気羊 | [YubikeyとOpenSSLで作る電子認証局](https://booth.pm/ja/items/1573781) |
| 7 | 天野勝 | [ダメふりかえりを撲滅する3つのヒント](https://booth.pm/ja/items/1565910) |
| 8 | ひかる黄金わかめ帝国 | [GraphQLスキーマ設計ガイド](https://booth.pm/ja/items/1576562) |
| 9 | castaneai | [よくわかるgRPC](https://booth.pm/ja/items/1557285) |

## 実用書: 4冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | 荻野 淳也 | [心のざわざわ・イライラを消す がんばりすぎない休み方 すき間時間で始めるマインドフルネス](https://www.amazon.co.jp/exec/obidos/ASIN/4866510501/x7edimv35x-22/) |
| 2 | ダン アリエリー | [アリエリー教授の「行動経済学」入門 -お金篇-](https://www.amazon.co.jp/exec/obidos/ASIN/4152097604/x7edimv35x-22/) |
| 3 | 岸見 一郎 他 | [嫌われる勇気―――自己啓発の源流「アドラー」の教え](https://www.amazon.co.jp/exec/obidos/ASIN/4478025819/x7edimv35x-22/) |
| 4 | ダグ・レモフ 他 | [成功する練習の法則 最高の成果を引き出す42のルール](https://www.amazon.co.jp/exec/obidos/ASIN/4532198720/x7edimv35x-22/)

## 小説: 1冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | 村上 春樹 | [騎士団長殺し 第2部 遷ろうメタファー編](https://www.amazon.co.jp/exec/obidos/ASIN/4103534338/x7edimv35x-22/) |

## 定期刊行誌: 21冊

| No | タイトル | 期間 |
|---:|---|---
| 1 | [日経エレクトロニクス](https://tech.nikkeibp.co.jp/media/NE/) | 2019年1月号〜2019年11月号 |
| 2 | [TOPPOINT](https://www.toppoint.jp/) | 2019年1月号〜2019年10月号 |
JavaScript勉強の記録その19: Dateオブジェクトを使って現在時刻を取得

#Dateオブジェクトを利用して現在時刻を取得

new Date()としてあげると、現在時刻に関するデータを持つオブジェクトを生成することができます。
Dateオブジェクトには標準でいくつかのメソッドが用意されてあり、日時に関するデータを取得することができるようになっています。

```index.js
const d = new Date();
console.log(d);
//=>Mon Jan 13 2020 23:59:08 GMT+0900 (日本標準時)
```
#getFullyearメソッド
以下の例では、生成されたDateオブジェクトがもつ西暦の情報を取得しています。

```index.js
const d = new Date();
console.log(d.getFullYear());
//=>2020
```
#getMonthメソッド
読んで字の如しですが、月に関する情報を取得します。
たた注意する点としては、JavascriptのgetMonthメソッドで返ってくる値は、0は1月を表し、1は2月を表します。
したがって、返ってくる値に+1としてあげることで、現在の月を表すことができます。

```index.js
const d = new Date();
console.log(`${d.getMonth() + 1}月`);
//=>1月
```
#getDateメソッド
日付に関する情報を取得します。

```index.js
const d = new Date();
console.log(`${d.getDate()}日`);
//=>14日
```
#getDayメソッド
曜日に関する情報を取得します。
こちらも注意が必要で、日曜日は0 月曜日は1 火曜日は2という感じで返ってきます。

```index.js
const d = new Date();
console.log(d.getDay()); 
//=>2
```

#そのほか時間に関するメソッド　
時間に関するメソッドは以下となっています。

```index.js
console.log(d.getHours()); //0~23時
console.log(d.getMinutes()); //0~59分
console.log(d.getSeconds()); //0~59秒
console.log(d.getMilliseconds()); //0~999ミリ秒
```