OmniAICreator/Qiita-1.07M huggingface dataset:
Symfony 2で既存テーブルをEntityに自動生成する

何が面白くてPHP5系のSymfony2系をやってるのか　ってのはさておき。。。

ちょっとSymfony2にてEntity生成時に詰まった部分を纏める

|Symfony ver|PHP ver
|:-:|:-:|
|Symfony2.7|PHP5.3|

# Entity 生成
基本的にSymfony2のDocumentにも記載されているよう以下コマンドで行う

```ruby:terminal
php bin/console doctrine:mapping:import {Bundle名} xml
php app/console doctrine:mapping:import {Bundle名}
php app/console doctrine:generate:entitites --no-backup {Bundle名}
```

### custom repository を利用したい場合

`php bin/console doctrine:mapping:import {Bundle名} xml`
を実行してしまうと

`{Bundleディレクトリ}/Resources/config/doctrine`配下に各テーブル毎のxmlファイルが出力されてしまい
各Entityに記述されているannotationの制御が効かなくなる。という状態になってしまう。

なら、xml出力せずに以下コマンドだけでやればいいかな。
と思い実行。


```ruby:terminal
php app/console doctrine:mapping:import {Bundle名}
php app/console doctrine:generate:entitites --no-backup {Bundle名}
```

…

Entityの生成は出来たが、
getter、setterがセットされない…なぜ…

と数時間Google先生に必死に効くも、この理由はわからなかった。

ので最終的に以下の形式のコマンドを纏めて実行することでカスタムリポジトリを利用するようにした

```ruby:terminal
php bin/console doctrine:mapping:import {Bundle名} xml
php app/console doctrine:mapping:import {Bundle名}
php app/console doctrine:generate:entitites --no-backup {Bundle名}
rm -rf {Bundleディレクトリ}/Resources/config/doctrine
```

あまり納得がいかないがこれでカスタムリポジトリが利用できるから良しとする。


一回だけうまく行ったパターンがあった（xmlを出力せずにgetter setterが付くようにEntity生成）が、完全に同じようにもう一度試したら二回目はうまくいかなかった。

きっとなにか原因があるのだろうが、これ以上時間割くことを諦めた。。
テーブル数が多すぎるのかもしれない（素晴らしい実績のあるレガシーコードだからもう綺麗にすら出来ないので諦めた）


この事象に関して知見があるお方がいましたら是非コメント頂けると助かります…。（僕が納得するという意味で）
簡単な臭いセンサーを作るまでの道のり

この記事はobniz Advent Calendar 2019 12日目の記事です。
https://qiita.com/advent-calendar/2019/obniz


##はじめに
センサを使って臭いを検知するサービス。
タバコやアルコール、生活の中の臭いを簡単に検知して街中をグラフィック化してみたいと思いました。

まず手始めに 「臭いを検知してみる」ということで、秋葉原やAmazonで購入できる
臭いセンサTGS2450を使ってみましたが、注意書きに稼働時間が長いと壊れますとか、
ブレッドボード使って抵抗入れないといけないとか。初心者にはなかなか敷居が高いです。

AliExpressで仕入れた(届くのに1か月以上かかった)フィガロ社のTGS2602(ADコンバータ付き)であればM5Stackやobnizで簡単に接続して使えます。

##接続例
取りあえず、臭いを検知したら圧電ブザーがなる仕様です。
臭い検知状態になるまでに約60秒ほど予熱します。
予熱が完了するとドレミファソラシドが流れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/57089986-8530-d557-bac4-d383f3b77256.png)

###臭いセンサ側
IO0:GND
IO1:DOut
IO2:AOut
IO3:VCC

###圧電ブザー側
IO10:signal:10
IO11:gnd:11


##ソース
```Server.js
'use strict';
const express = require('express');
const Obniz = require('obniz');
const PORT = process.env.PORT || 3000;
var obniz = new Obniz("obnizID");

const app = express();
obniz.onconnect = async function () {
    obniz.display.clear();
    obniz.display.print("YONETSU...");

    //GROVEのMQ3ガスセンサのライブラリを使用する
    var mq3 = obniz.wired("MQ3", {vcc:3, gnd:0, do:1, ao:2});

    //圧電スピーカーの接続
    var speaker = obniz.wired("Speaker", {signal:10, gnd:11});

    //予熱が必要になる環境によるが60秒～120秒必要
    await mq3.heatWait(60);
    obniz.display.clear();
    //臭いを取れる準備が出来たら画面でお知らせ
    obniz.display.print("OK-!!");

    //臭いを取れる準備が出来たら音で
    speaker.play(262); //ど
    obniz.wait(500);
    speaker.play(294); //れ
    obniz.wait(500);
    speaker.play(330); //み
    obniz.wait(500);
    speaker.play(349); //ふぁ
    obniz.wait(500);
    speaker.play(392); //そ
    obniz.wait(500);
    speaker.play(440); //ら
    obniz.wait(500);
    speaker.play(494); //し
    obniz.wait(500);
    speaker.play(523); //ど
    obniz.wait(500);
    speaker.stop();
 
    while(true) {
          
        mq3.onchangedigital = function(value) {
            if(value==true){
                //臭いを検知後、再度図れる状態になった処理
                obniz.display.clear();
                obniz.display.print("OK--!!");
            }else{
                //臭いを検知した時の処理
                obniz.display.clear();
                obniz.display.print("GYA---!!");
                speaker.play(9000);
                obniz.wait(1000);
                speaker.stop();
            }
        }
        await obniz.wait(100);
      }
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);

```

##動画
https://youtu.be/hrhfyrGjdQg
[![TGS2602](http://img.youtube.com/vi/hrhfyrGjdQg/0.jpg)](http://www.youtube.com/watch?v=hrhfyrGjdQg)

##次回予告
次は臭いを検知したら喋らせる仕様を追加していきます。
google-home-notifierかなぁ
GCP CloudbuildでTimeoutエラーの対応

GCPのCloudbuildはタイムアウト時間のデフォルトが10分となります。
特に指定しない場合、10分以上かかるビルドはタイムアウトエラーとなります。

それを解決するため、timeoutだけを指定したら済みます。
ただし、いくつか注意はあります。

- timeoutは最大24時間（1日）で指定できます。
- Cloudbuildスクリプトがモジュール化される場合、モジュールごとに指定しないといけない。片方だけ指定する場合、残りのモジュールはタイムアウト10分のデフォルトのままとなります。

サンプルを投稿致します。

フォルダ構成

```sh
cloudbuild_timeout
├── _base
│   └── cloudbuild.matlab.R2019b.yaml
├── dev
│   └── cloudbuild.matlab.R2019b.yaml
└── dockerfile
    └── Dockerfile.matlab.R2019b
```

dev　→　_baseをコールする構成となっています。
この場合は両方のスクリプトで　timeoutを指定します。

```sh:dev/cloudbuild.matlab.R2019b.yaml
steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args: [
      'builds', 
      'submit',
      '--config=_base/cloudbuild.matlab.R2019b.yaml',
      '--substitutions=_GCR_PROJECT=project-abc123,_GCR_REGION=asia.gcr.io',
      '.'
  ]
timeout: 3600s
```

```sh:_base/cloudbuild.matlab.R2019b.yaml
steps:

# docker build
- name: 'gcr.io/cloud-builders/docker'
  dir: .
  args: [
         'build',
         '-t', '${_GCR_REGION}/${_GCR_PROJECT}/${_GCR_IMAGE_NAME}:${_GCR_TAG}',
         '-f', 'dockerfile/Dockerfile.matlab.R2019b',
         '--cache-from', '${_GCR_REGION}/${_GCR_PROJECT}/${_GCR_IMAGE_NAME}:${_GCR_TAG}',
         '.'
        ]
        
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", '${_GCR_REGION}/${_GCR_PROJECT}/${_GCR_IMAGE_NAME}']

timeout: 3600s

substitutions:
  # # Image name
  _GCR_IMAGE_NAME: matlab-r2019b
  # # Image tag
  _GCR_TAG: latest
  # # KMS Key location to decrypt private key

```


<br>
ご覧して頂き、どうも有難う御座います!
DSS Ben
CentOS8でDisplayPortのデイジーチェーン（数珠繋ぎ-MTS）は出来た（人柱報告）

#環境
CentOS8 
Ryzen7 3700X
Geforce 1660SUPER
ドライバ：nvidia 440.36
デイジーチェーン元：Dell UltraSharp 24 InfinityEdge U2417H 23.8インチ 
デイジーチェーン先：Dell モニター 23インチ S2319HS
####デイジーチェーンとは
PC → モニタ → モニタという接続をすること。
モニタ ← PC → モニタという接続ではない。
DisplayPortの機能の類で、モニタが対応していないといけない（少なくとも<font color=red>DP出力のある</font>モニタでないといけないし、MST対応でないといけない。INが2つあっても片側から出力させるようなものではない。）
#特に何かするほどもなく、うまくいった
上記環境にて、https://qiita.com/iCyP/items/b85f41ffaeed52ac26b7 のとおりセットアップした。
U2417HのMTSをONにしてOSを起動したら問題なく認識し、拡張ディスプレイとして表示された。ubuntuでディスプレイを一度休止状態から復帰させると認識するというハックが数年前に投稿されていたようだが、今ではそうでもないらしい。（起動状態でモニタのMST設定をOFF->ONにしたらフリーズした位はあった
[Screenshot from 2019-12-10 18-02-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21368/6b66f800-2a94-c4a8-5e6c-3f9cafbdf0b5.png)


p.s.
環境の違うwin10機も当然認識した。
報告需要？あんまりないんじゃないですかね・・・ケーブルは減るけど数珠繋ぎしたいモニター1はMST対応じゃないといけないし、それは安くでは見たことないし、、、電源ケーブルは別だし。
Microsoft Learn 11日目

12月は、毎日 [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) を受講していこうという記録。
※受講後に書き込むので公開に間に合わないこと多々あります(アドベントカレンダーの意味ｗ)

12/11 は
**Azure アカウントを作成する**
 - 演習 - Azure アカウントを作成する
 - Understand Azure billing
 - アカウント間での Azure サブスクリプションの譲渡

を受講。以下、簡易メモ。

# Azure アカウントを作成する
ここのセクションは日本語未対応のユニットが多かった。 Google 翻訳で強制的に日本語翻訳して乗り切る。

## 演習 - Azure アカウントを作成する
Microsoft Learn SandBox あるし、2つもアカウントいらんがな...と思いつつ、
教科書(Learn ドキュメント)の忠実な僕なので作ろうとした！
まぁ、こうなるよね。ってことで、作ったことにして、次へ進む。
![azure-learn-signup.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141029/ec51b6c4-f641-2edf-5f08-01ca5cd6bfa9.png)

## Understand Azure billing
### Azure サブスクリプション
サインアップすると、デフォルトで Azure サブスクリプションが作成される。
VM のような Azure リソースを作成するとき、属するサブスクリプションを識別するので、VM を使用すると使用量が毎月集計されて請求がくる仕組みになっている。

### 追加の Azure サブスクリプションを作成する
リソースまたは請求管理の目的で追加のサブスクリプションを作成することも可能。
ただし、サブスクリプションにはいくつかの厳しい制限があるので、考慮する必要があるときもある。

### ニーズに合わせて課金をカスタマイズする
複数のサブスクリプションを、請求書セクションに整理できる。
請求書セクションとはつきに発生した料金を示す請求書の明細のこと。
利用場面としては、組織に単一の請求書が必要でも、部門、チーム、プロジェクトごとに料金を整理するときなど。

## アカウント間での Azure サブスクリプションの譲渡
多くの大規模組織は、エンタープライズ契約を通じて Azure サブスクリプションを購入している。
通常、各ビジネスユニットにサブスクリプションを割り当てている。
場合によっては、1つの請求先アカウントから別の請求先アカウントにサブスクリプションを転送する必要がある。

## Azure Active Directory を使用したアクセスの認証
ここのページ、何故か前セクションの内容(アカウント間での Azure サブスクリプションの譲渡)になっていた。バグか？？？
とりあえず、飛ばして次。

## Azure のサポート オプション
上記同様。はよ直してくれ。
【AWS・Tello】声でドローンを操作してみたPart2

# はじめに
この記事は
[ドローンを活用した避難勧告システム](https://qiita.com/sk_nimo/items/56ede90072105e14497d)
の第三章です．
製作背景などはそれを参照してください．

また，本章の内容は以下の内容が前提なので，まだ読まれていない方はまずそちらをご覧ください．
第一章[【AWS・Tello】ドローンをクラウド上で操作するシステムの構築](https://qiita.com/sk_nimo/items/d0ab81024f76004112c2)
第二章[【AWS・Tello】声でドローンを操作してみたPart1](https://qiita.com/sk_nimo/items/a98d6cd82d3e5d980504)

# システム構成図

<img width="872" alt="system.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234751/457cb524-c9ad-6611-4ace-5000d97f7ecf.png">


# Lambda

lambdaのコードを書いていきます．
といっても完成形書いたので載せます．Alexa Skills Kit SDK for Python のドキュメントが分かりにくくコード書くのに苦労しました笑
https://github.com/shoda888/alexa2tello/blob/master/lambda_function.py
冗長なコードがあるかもしれないのでその時はPRください！

## 抜粋して説明
__session_attributes__：セッション中に保持できる変数群
今回はslot名を保持させています．今回，距離と方向がセットで入力されるべきところをどちらか一つしか言わなかった場合に言わなかった方について再度訊ねるようにしています．その際既に言った項目についてセッション中に短期記憶させる必要があり，session_attributesはそれに用いています．（126~128行目でsession_attributesをリセットさせたかったのですが，リセット方法がわからず，無理やりNoneを代入しています．簡単にリセットできる方法をご存知の方教えて下さい:pray:）

```python
session_attr = handler_input.attributes_manager.session_attributes
slots = handler_input.request_envelope.request.intent.slots
```

__resolutions__： エンティティ解決(←名前だけじゃピンときませんね)
slot値に対してその同意語を設定している場合，それらを一つのグループIDとして認識させたい時があります．例えば，「うえ」というslot値に対して「上昇」「上方」という同意語を登録した場合，それらをグループIDとして「up」を登録しておけば，「上昇」と言った場合でも「うえ」と言った場合でもID「up」として認識することができます．つまりドローンにコマンドとして送信する時，「上」と言った場合でも「上昇」と言った場合でも「up」を送信できるように組み込めます．

```python
direction = slots["direction"].resolutions.resolutions_per_authority[0].values[0].value.name
```

## IoTCoreとの通信

```python
iot = boto3.client('iot-data')
def publish(msg):
    # トピックを指定
    topic = 'test/pub'
    # メッセージの内容
    payload = {
        "message": msg
    }  

    try:
        # メッセージをPublish
        iot.publish(
            topic=topic,
            qos=0,
            payload=json.dumps(payload, ensure_ascii=False)
        )
        return True
    
    except Exception as e:
        print(e)
        return False
```
以上！
ちなみにlambdaに，IoTCoreへのpublishを許可するポリシーをアタッチしたロールを指定するようにしてください．(じゃないと通信できません)
subscriberの方のコードは前章前々章の内容をそのまんま参考にすればドローンと通信できるようになります．

# まとめ
　動画で完成形を見てみましょう．
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/FKotpW1kJiw/0.jpg)](https://youtu.be/FKotpW1kJiw)

次の章では画像から何か判断してドローンにフィードバック制御するようなシステムを構築しましょう．
「[画像解析された人の姿勢などの情報から状態を推定し，通知するシステムの構築](https://sho-d-blog.com/tech/278/)」
SpringBootでDI最速体験

所要時間　初心者15分。ベテラン5分。

## 目的

Springフレームワークを扱う上で、重要技術かつ定番技術であるDIに最速で触れる。

## 概要

#### ０．作業前提
SpringBootでHello Worldするところまで準備する。
参考） [SpringBoot体験](https://qiita.com/Makiron2019/items/9dbe559f8269ac05ec31)

#### １．注入元クラス(Bean)を作成する
シンプルに文字列「Hello World!! from Bean.」を返すメソッドを実装したクラスを用意したらOK。

#### ２．コンフィギュレーションクラスを作成する。
アノテーション <code>@Configuration</code> を付与したクラスとする。
「１」で作成したクラスを返すメソッドを実装し、このメソッドにアノテーション <code>@Bean</code> を付与する。

#### ３．Restコントローラーにフィールドインジェクションして注入クラスのメソッドを呼び出す
型を注入クラスとしたローカル変数を追加し、アノテーション <code>@Autowired</code> を付与する。
リクエストマッピングしたメソッドを、注入クラスの文字列を返すメソッドの呼び出し結果を返すように修正する。

## 手順詳細

## 所感
DI設定の類いは多岐にわたるため、業務で実践する際はもっとしっかり考えないと話にならないが、シンプルな構成で捉えることで大まかなアーキテクチャが把握できた。
その昔Strutsを学習したときにも思ったことだが、「設定ファイルでやっていること、設定ファイルに書くこと」に注目すれば、フレームワークが何を自動化、機能提供してくれるのか輪郭が見えてくると思う。
FlutterでFCMを使ってプッシュ通知を受け取る

FlutterにPush通知を送り特定のページを開く機能について書いていきたと思います。
プッシュ通知でキャンペーン告知をしてプッシュ通知を開いたら特定のページに遷移する挙動になります。

今回は[firebase_messaging](https://pub.dev/packages/firebase_messaging)を使用します。

アプリでプッシュ通知を受け取る設定は下記のリンクからお願いします。
[Android プッシュ通知](https://firebase.google.com/docs/cloud-messaging/android/receive?hl=ja)
[iOS プッシュ通知](https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja)

## プッシュ通知を受け取る
プッシュ通知を押して、アプリが起動した時に`data`を受け取り処理したいので、MaterialAppのあとに遷移するページの`initState()`でプッシュ通知の値を受け取っています。

[PushNotifyLaunchについてはこちらから確認してください](https://pub.dev/packages/firebase_messaging#receiving-messages)

```dart:main.dart
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

@override 
void initState() {
 _firebaseMessaging.requestNotificationPermissions(
    const IosNotificationSettings(
      sound: true,
      badge: true,
      alert: true,
    ),
  );

  _firebaseMessaging.onIosSettingsRegistered
      .listen((IosNotificationSettings setting) {
    debugPrint('Settings registered: $setting');
  });
}

Future<void> _pushNotifyLaunch() async {
  _firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) async {
      // それぞれの処理
    },
    onResume: (Map<String, dynamic> message) async {
      // それぞれの処理      
    },
    onLaunch: (Map<String, dynamic> message) async {
      // それぞれの処理
    },
  );
}
```


## プッシュ通知で受け取ったページへ遷移する
上で受け取った`data`からページのパスを取得して遷移します
弊アプリではfromUrlにパスを渡して、返り値としてWidgetを返すコードを書いています。

```dart:fcm_provider.dart
Future<void> onLaunch(
  BuildContext context,
  Map<String, dynamic> message,
) async {
  String uri;
  if (Platform.isAndroid) {
    uri = splitUriToPath(message['data']['path']);
  } else if (Platform.isIos) {
    uri = splitUriToPath(message['path']);
  }
  if (uri?.isNotEmpty ?? true) {
    await Navigator.of(context).push(
      MaterialPageRouter(
        builder: (context) {
          return fromUrl(uri);
        }
      ),
    );
  }
}
```


## 最後に
Flutterでpush通知を受け取り、特定のページを開くことまでできました。
ただ、アプリが起動した時に送られてきた値をもとにページを遷移させているだけなので、アプリがバックグラウンドに待機ときにDartだけでプッシュ通知を受け取って、特定のページへ遷移される方法がわからないのでもしご存知のかたがいましたらコメント欄なりTwitterなりで教えていただけると幸いです。
~~常に待ち受けておく方法も考えてみたのですが、訳合ってなかなか試せてないです...~~
~~解決方法がわかり次第記事にします~~


## おまけ 【簡単なテスト方法】
FCMTokenがわかれば下記のスクリプトでプッシュ通知が送れます。
テストをしてみたいときは下記のコードをコピペして使ってみてください。
Firebase からサーバーキーとプロジェクトのIDは必要になりますがターミナルからサクッと送れるのでおすすめです

```shell
#!/bin/sh

curl -X POST \
--header "Authorization: key=${サーバーキー}" \
--header "project_id: key=${送信者 ID}" \
--header Content-Type:"application/json" \
https://fcm.googleapis.com/fcm/send \
-d @- << EOF
{
  "notification": {
    "body": "this is a body",
    "title": "this is a title"
  },
  "priority": "high",
  "content_available": true,
  "data": {
    "click_action": "FLUTTER_NOTIFICATION_CLICK",
    "id": "1",
    "status": "done",
    "path": "{URLスキーム}"
  },
  "to": "$stoken"
}
EOF
```

[サーバーキー]と[送信者 ID]は、
Firebase管理画面の左上にある[プロジェクトの概要]→歯車アイコン選択→プロジェクトを設定
[Settings]画面の[Cloud Messaging]タブ
プロジェクト認証情報の項目にあります。
UI設計の時に参考になるサイト

はじめに
---
アプリのUI設計について色々と悩むので、UIを考える際に参考にするサイトをまとめました。

UI/UXデザイン
---

- [UI/UXとは？知っておきたいUI/UXデザイン50の知識](https://saruwakakun.com/design/tips/ui-ux)
 - 実例をまじえて紹介。実際のUIと説明が見比べられるのでわかり易い


- [説得力を上げよう！デザインに役立つ心理学](https://medium.com/@sakamotokyon/%E8%AA%AC%E5%BE%97%E5%8A%9B%E3%82%92%E4%B8%8A%E3%81%92%E3%82%88%E3%81%86-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AB%E5%BD%B9%E7%AB%8B%E3%81%A4%E5%BF%83%E7%90%86%E5%AD%A6-4784bc088c1c)
 - 心理学に基づいて説明されていて、良いことが良いわけではないということが理解できる

アプリ初回起動デザイン（User Onboarding）
---
- [定番パターンだけじゃない！サービスに最適化されたUser Onboarding](https://medium.com/@sakamotokyon/%E5%AE%9A%E7%95%AA%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A0%E3%81%91%E3%81%98%E3%82%83%E3%81%AA%E3%81%84-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AB%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9Fuser-onboarding-1a8e57a363af)
 - User Onboardingに関して、実例をまじえて紹介
 - 各サービスがどのように定着させようとしているかがわかる

- [UIデザイナー必見！ アプリの導入画面で使われる主な４つの手法](https://hajipion.com/1358.html)
 - 導入画面で良く使われる手法についてわかりやすく説明

- [インスピレーションを刺激するモバイルアプリのチュートリアル](https://goworkship.com/magazine/onboarding-inspiration-mobile-apps/)
 - チュートリアルデザインの実例を数多く紹介

- [アプリの導入画面「ウォークスルー」のデザインで気をつけたい５つのこと](https://uxmilk.jp/53524)
 - ウォークスルーのデザインをどの様に設計するか解説

- [アプリの初回起動時の体験設計を考える](https://goodpatch.com/blog/app-to-start-ux/)
 - オンボーディング体験をどうすべきかについて説明

ボタンデザイン
---
- [UIデザインを紐解く。これだけは押さえたいボタンデザインのポイント](https://liginc.co.jp/280820)
 - ボタンデザインについて説明。ボタンと認識してもらうためには考える必要がある内容
Springboot HikariCPの設定値の変え方

# 概要
SpringBoot を使っているときに、DB周りのチューニングが必要になり、
その時に行った設定についてのメモ。

コネクションプールはデフォルトのまま HikariCP を利用。

# 環境
* SpringBoot：2.1.3.RELEASE
* Oracle Database 12c

# 詳細
application.ymlの記述内容を以下のように変更する。
今回変更した内容は、コネクションタイムアウトまでの時間とプールサイズの変更。
```spring.datasource.hikari``` 以下の部分が対象箇所。

```yaml:application.yml
spring:
  datasource:
    url: 【DB接続先URL】
    username: 【DB接続スキーマ】
    password: 【DB接続パスワード】
    driverClassName: oracle.jdbc.OracleDriver
    testOnBorrow: true
    validationQuery: SELECT 1 FROM DUAL
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      connection-timeout: 60000                  # Default: 30000 (30 seconds)
      connection-test-query: SELECT 1 FROM DUAL
      minimum-idle: 50                           # Default: same as maximumPoolSize
      maximum-pool-size: 500                     # Default: 10
```

# まとめ
調べるとすぐ出てくるけど、意外と知らない内容だった。

もっと細かい設定をしたい場合は、以下のリンク先の情報が参考になる。
　https://github.com/tokuhirom/java-handbook/blob/master/spring/hikaricp.md
ServiceNow-Choiceの値をUI Policyで出しわけたい時

[ServiceNow](https://www.servicenow.co.jp/)開発における実装上の課題と解決法を書いておきます。

- 課題は、実装上で実際にぶち当たった方法論です。
- 問題は、OOTB(Out of the box)環境において再現可能であることを前提にします。

それでは行ってみましょう。

#課題
Choice listの値を、他のFieldの値に応じて動的に出しわけたい
##課題
incidentテーブルのCategoryフィールドの値を変更すると、SubCategoryフィールドに出る選択肢が動的に変化すること

### 画像
![FireShot Capture 139 - INC0009009 - Incident - ServiceNow - dev95965.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/d89a0b40-c056-d1a5-cfee-d7647f156cab.png)


## 1.スクリプトで実装する場合
- g_form.addOption()
- g_form.removeOption()

をUI Policyで活用する。
条件付け
![FireShot Capture 141 - UI Policy - ServiceNow - dev95965.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/31e0800c-d60a-46cc-e82f-7c8bfb917ba3.png)
スクリプト

```javascript
function onCondition() {
        //要らないものを削除
	g_form.removeOption('subcategory','operation_system');
	g_form.removeOption('subcategory','cpu');
        //いるものを追加
        g_form.addOption('subcategory','email');
}
```
終始、このノリで書ける。

## 2.OOTBで行う場合
subcategoryフィールドのdictioaryを開いて、そこにあるdependentタブにdependentフィールドが指定できるので、categoryを指定。
そして、下の関連リストにsubcategoryの全量を指定。
関連リストの一番右にdependencyカラムが存在するので、そこでCategoryの対応するvalueを指定すること。

こちらのほうがOOTBベースの実装である。
Firebase Cloud Functionsでデフォルトで使える環境変数

2020/12/10追記
Node.js 12系や10系のGA版の情報は以下URLよりご確認ください！
https://zenn.dev/moga/articles/firebase-functions-env-vars

## 前提
- 2019/12/09現在の情報です
- Firebase Cloud Functions
    - GCPのCloudFunctionsではない
- Runtime Node.js 10
    - Node.js 10はBetaなのでご注意を

## TL;DR
- Nodejs 8で取れてた環境変数が10系だと取れない可能性があるので気をつけよう
- Nodejs 10では[こいつら](https://qiita.com/_mogaming/items/edd6024ca0cdd8d3cd93#%E4%BD%BF%E3%81%88%E3%82%8B%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E4%B8%80%E8%A6%A7)が使えるぞ

## ドキュメント
- [FirebaseのEnvironment configuration](https://firebase.google.com/docs/functions/config-env#use_environment_configuration_to_initialize_a_module)
- [GCPのMigrating Cloud Functions to newer Node.js runtimes](https://cloud.google.com/functions/docs/migrating/nodejs-runtimes#nodejs-10-changes)

## 環境変数とは
Node.jsだと `process.env` で取れるやつの話です。こいつは、FirebaseやGCP側が予め設定しておいてくれる変数が存在します。
下記のようにすれば自分でも設定できます。

```bash
firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"
```

## 経緯

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">process.env.FUNCTION_NAMEがundefinedになるなあと思ってたらNode.js 10 からはK_SERVICEを使えと書いてあった。知らなかったー。<a href="https://t.co/cAxR40YnqO">https://t.co/cAxR40YnqO</a></p>&mdash; mogaming | 実験 (@_mogaming) <a href="https://twitter.com/_mogaming/status/1203928952466657281?ref_src=twsrc%5Etfw">December 9, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 使える環境変数一覧
実際にNode.js 10のRuntimeでFirebase Cloud Functionsをデプロイして、`process.env` の中身を書き出してみました。 デプロイ時の関数名は`SampleFunction`、regionは`asia-northeast1`です。一部`***`でマスクしてます。あくまで2019/12/09現在で取れたものなので、今後取れなくなる可能性があります。

```json
{
  "NO_UPDATE_NOTIFIER": "true",
  "FUNCTION_TARGET": "SampleFunction",
  "NODE_OPTIONS": "--max-old-space-size=256",
  "NODE_ENV": "production",
  "PWD": "/srv/functions",
  "HOME": "/root",
  "DEBIAN_FRONTEND": "noninteractive",
  "PORT": "8080",
  "K_REVISION": "2",
  "K_SERVICE": "SampleFunction",
  "SHLVL": "1",
  "FUNCTION_SIGNATURE_TYPE": "http",
  "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "OLDPWD": "/srv",
  "_": "../start-functions-framework",
  "FIREBASE_CONFIG": "{\"projectId\":\"***\",\"databaseURL\":\"***\",\"storageBucket\":\"***.appspot.com\",\"locationId\":\"asia-northeast1\"}",
  "GCLOUD_PROJECT": "***",
  "VIPSHOME": "/target"
}

```

ドキュメントに書いてあるとおり、いろいろ取れなくなったり名前が変わったりしています。 GCP側のドキュメントには `GCLOUD_PROJECT` はセットしないって書いてありますが、[ここに書いてあるとおりFirebase側がセットしてくれている](https://firebase.google.com/docs/functions/config-env#automatically_populated_environment_variables)ようです。
MT5でLocal Network Farmを使おう！

Local Network Farmにつながらないやんけ！って問題にぶち当たったので、解決手順。


セキュリティ上いじったほうが良いところがあったので、すでにつながってるよ！って人もどうぞ。
基本的にはウィンドウズのファイアウォールの問題で、複数のMT5をインストールしている場合に起こりやすそうな問題です。

参考にしたサイト：
[metatrader5.com:ストラテジーの最適化](https://www.metatrader5.com/ja/terminal/help/algotrading/strategy_optimization)
[mql5.com:MQL5クラウドネットワークを使った速度アップ](https://www.mql5.com/ja/articles/341)
[mql5.com:Tester agent issus: Local Network Farm doesn't work](https://www.mql5.com/en/forum/76797)


#1. MT5側の設定 - 使われる側
###「ツール」→「ストラテジーテスター エージェントマネージャー」
下みたいな画面が現れます。
①上の方にIPアドレスがあるので、メモするなり記憶するなりしましょう。
②必要な部分を「追加」しときましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/14ae26b3-b383-c485-c64d-d4eacd878150.png)
③これが終わると、Windowsを再起動した後もMetaTesterが立ち上がってくれて、テストをバックグラウンドで実行してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/ae2cd880-6312-93af-c806-e0abf382a169.png)



#2. MT5側の設定 - 使う側
###右クリックから「追加」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/308a15ba-2894-c78f-8e25-4769c6c15967.png)
###さっきメモったIPアドレスを入れて「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/f52f977c-3220-e8c8-7ada-d5db8140c2be.png)
###見つかったら、「完了」（自分のPCだと「ハードウェア」の項目は表示されない模様）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/21824a6a-502c-9f34-61e6-82a616b80eb8.png)


#3. Windowsの設定 - 使われる側
###セキュリティの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/57167832-615b-e0b1-74e1-8799290f182f.png)

###Windowsセキュリティ→Windowsセキュリティを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/4d1dd69d-d01d-79b7-f21b-41c7d8a55b05.png)

###ファイアウォールとネットワークの保護
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/b9b530e4-a87d-7427-de7f-3023c357164b.png)

###詳細設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/2137bf7c-8a61-689a-734c-f4a156447d7e.png)

###MetaTrader5 Strategy Tester Agentをダブルクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/c194f5a3-2843-e742-72b7-652153766ccd.png)

###こんな画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/dbc8d085-0548-65c5-1695-c406d299ba93.png)

###「プロトコルおよびポート」で必要なポートだけを開放するようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/5fd71466-9215-90a2-47d7-ba7fef06ee00.png)

###それでもつながらない場合は、「詳細設定」タブ→プロファイルをパブリックにして「適用」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/09a939f0-09e7-c271-0dd0-f0841aa0ddb7.png)

###複数台MT5をインストールしている場合は、起動させたいやつに指定を書き換えましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/fb877ef5-342a-d382-308b-ed57c144cbab.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/105945a8-c606-b1d8-ea8e-0c7ff0d3aafe.png)
Matlab 9.7 R2019b 稼働RuntimeのDockerイメージビルド

*Matlab 9.7 R2019b は 2019年11月リリースで、この記事投稿時点は最新バージョンとなっています。*


### Dockerfile準備

```sh:Dockerfile.matlab.R2019b
# Download and install Matlab Compiler Runtime v9.7 (2019b)
#
# This docker file will configure an environment into which the Matlab compiler
# runtime will be installed and in which stand-alone matlab routines (such as
# those created with Matlab's deploytool) can be executed.
#
# See http://www.mathworks.com/products/compiler/mcr/ for more info.

FROM debian:10-slim

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -q update && \
    apt-get install -q -y --no-install-recommends \
    xorg \
      unzip \
      wget && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
    
# Install the MCR dependencies and some things we'll need and download the MCR
# from Mathworks -silently install it
RUN mkdir /mcr-install && \
    mkdir /opt/mcr && \
    cd /mcr-install && \
    wget -q http://ssd.mathworks.com/supportfiles/downloads/R2019b/Release/2/deployment_files/installer/complete/glnxa64/MATLAB_Runtime_R2019b_Update_2_glnxa64.zip && \
    unzip -q MATLAB_Runtime_R2019b_Update_2_glnxa64.zip && \
    rm -f MATLAB_Runtime_R2019b_Update_2_glnxa64.zip && \
    ./install -destinationFolder /opt/mcr -agreeToLicense yes -mode silent && \
    cd / && \
    rm -rf mcr-install
```

Matlab runtimeパス　/opt/mcr/v97

### Dockerfileイメージビルド

```sh
# タグ指定でイメージビルド
docker build -t matlab-r2019b:latest -f Dockerfile.matlab.R2019b .
```

<br>
ご覧して頂き、どうも有難う御座います!
DSS Ben
AWS re:invent 2019まとめ＆オススメの周り方

AWS re:invent2019に参加してきたので、そのまとめとオススメの周り方を綴ります。
実際の参加しての感想や来年以降参加される方への参考になれば

# はじめに
会場となるVenetian(ベネチアン)
![IMG_0898.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/673ea78c-544f-63c3-640d-f510d0dc92fb.jpeg)

- re:invent自体初めての参加
    - 一人参加
- 私の英語力
 - 読み書きなら調べながら何とか
 - スピーキング、リスニングは苦手
- AWSの理解力
    - EC2やS3などは使ったことはあるが、知らない、使ってないサービスも多くある状態
- 参加したセッション
    - 「builder session」や「workshop」など実際に手を動かすセッションを予約
    - <b>何年もreinventに参加している方から、「ずっと聞いているだけの通常のセッションより」も「現地でしか出来ない、手を動かしながら学べるセッション」の方が良いと聞いて</b>
        - 分野としてはMachine LearningやMedia系のセッションを多め登録

# まとめ
![IMG_0859.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/f43e980b-29c4-41dc-a74c-8f4d3858e58d.jpeg)

- 今回新たに発表された内容
    - 今回新たに発表された内容について絵はAWSやClassmethodさんが纏めているので、そちらを参照↓
    - AWS
        - https://aws.amazon.com/jp/new/reinvent/
        - https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-reinvent-2019update-2019/
    - Classmethod
        - https://dev.classmethod.jp/cloud/aws/aws-reinvent-2019-keynote-day-1/
- 参加したセッション
    - Keynote
    - <b>Builder Session</b>
        - 1セッション1時間程度
        - 最大6名程度
            - 参加できる人数が少ないこともあってか、一番予約が取りづらかった気がする
        - 特定のサービスやアーキテクチャについて説明を聞いて、実際に手を動かして学べるドキュメントももらえる
        - 少人数制で説明を受けるため、不明な点があればその場で直接質問することが出来る
    - <b>Workshop</b>
        - 1セッション2時間程度(Builder Sessionよりも長め)
        - 何卓かのテーブルに分かれて作業を行う
        - こちらも親切なドキュメントやチュートリアルがあり、分からなければ質問できるスタッフさん何人かいる
        - 立ち上げから実際に触って試すことが出来るものをdeployまでを一貫して行う
    - 全体を通して
        - セッションの難易度は以下の3つに分かれており、基本的には「300 - Advanced」、「400 - Expert」に参加したが、ドキュメントなども手厚かったため、そこまで不安になる必要はないと感じた(もしかしたらセッションによってバラツキはあるかもしれない)
            - 200 - Introductory
            - 300 - Advanced
            - 400 - Expert
            
- Expo
![IMG_0887.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/355d0657-dd30-ec16-7070-94fce1c307ea.jpeg)
    - スポンサーブース
        - Datadog,GitHub,PagerDuty,Newrelicなどよく聞く会社から、日本にいると馴染みのない会社まで多く存在している
        - AWSの祭典というのもあってか、データ分析系のサービスや会社が多い気がした
        - 英語が苦手でも親切に教えてくれるので、積極的に質問した方が良い
    - AWS Village
        - AWSの各サービス(EC2,Machine Learning,Media, etc..)のエキスパートが常駐していて、直接質問出来る
        - 実際に動く製品があるとアドバイスももらいやすい

# 感想＆学び
- 全体
    - 参加して間違いなく良かった
    - 会場の熱を感じることができ、現地の方との会話も含めサービスやアーキテクチャの知見を得られた
        - 次回はGamedayやSecurity Jamに参加したい
        - https://reinvent.awsevents.com/learn/hacks_jams/
- セッション
    - <b><font color="red">事前に聞いていた通り現地でしか出来ないような参加型のセッションに出て良かった</font></b>
    - <b><font color="red">せっかくなのでAWSやExpoといった(普段中々会う機会がない)方と話した方が良い</font></b>
    - 予約していないセッションだと開始一時間前に並んでも入れないこともあるので、事前にどのようなセッションを見て回るのか計画的に決めておくと楽
        - セッションの予約開始と同時に人気のセッションは埋まってしまうので、早めに予約はしておく
- 英語
    - (出来るに越したことはないが)会話が苦手でも、向こうが分かるように説明してくれるので何とかなる
- 便利tips
    - ホテル
        - 滞在中は移動に多くの時間を使うため、体力温存のためにも会場からなるべく近い方が良い
        - 咳をしている人や体調を崩している人も結構いた
    - 食事
        - 会場にて朝、昼、晩と食事が出る
        - 個人的にはカップ麺なども持っていくと良いと思う
    - ネット環境
        - 会場(ホテル)ではwifiを使用できる
        - スマホに関してはsimを事前に買っておくと便利
            - https://www.amazon.co.jp//dp/B07KVSPQ7P
            - 10日間で3000円もしない程度
    - 移動
        - Lyft便利
超高速I/Oを実現するDBならElastiCacheを使おう

#超高速アクセスElastiCache
前回は同様のNoSQLである，DynamoDBについて取り上げました．

今回はDynamoDBとの違いを基に，ElastiCacheについて取り上げます．

DynamoDBがわからない人，そもそも非SQLがわからない人はこちらから読み始めてね．

##特徴
DynamoDBよりもさらに高速
ただ，容量の制限があります

一時的にデータを格納して処理を行うことで，こいつの真価を発揮する．

##エンジンが二つ
ElastiCacheの特徴として，2つの種類のエンジンが用意されています．
1.memcached
簡易版と覚えてください．
バックアップや暗号化がありません

2.Redis
暗号化やバックアップ，対応サポートなど丁寧
構築は1よりも若干めんどい

###作り方
![スクリーンショット 2019-12-10 17.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/001e6abb-34e6-7273-ed6f-fb0598477e5f.png)
Redisの場合結構設定が多いです．

![スクリーンショット 2019-12-10 17.41.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/4c445c7c-836f-9f7d-4cf8-659dd07e641f.png)
マルチAZは複製作成
サブネットはIPの細分化

![スクリーンショット 2019-12-10 17.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/38d55e9a-fb86-971e-87b2-a96c171357b8.png)

![スクリーンショット 2019-12-10 17.41.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/1a276746-a9ba-a9e8-194b-a2948aac28a2.png)
暗号化やバックアップ，メンテナンスしたいものにチェックして終わり

これらいらないなら，memcachedで名前決めるだけで終わり．
Google検索のオプションをまとめてみた。

#はじめに

独断と偏見で、
エンジニア、プログラマーさんに役に立つ検索オプションをまとめてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215645/fe31a694-7469-0081-6e87-c1c3e10a2155.png)

##完全一致検索 `"キーワード"`
`""`で検索したい単語を囲みます。

```
"Los Ingobernables de Japón"
```

##ワイルドカード検索 `*ワード`
正規表現と同じです。
うろ覚えで思い出せない箇所に`*`(アスタリスク)を入れて検索できます。

```
芥川*
```

##特定のキーワードを除外 `-キーワード`
`-`の後ろとキーワードの間は空けません。くっつけて書いてください。

```
apple -iphone
```

##OR検索 `キーワード1 OR キーワード2`
`OR`は半角大文字です。

```
新日本プロレス OR 全日本プロレス
```

##AND検索 + OR検索 `キーワード3 (キーワード1 OR キーワード2)` 
通常のAND検索と区別するためにOR部分は`()`でくくります。

```
長州力 (新日本プロレス OR 全日本プロレス)
```

##キーワードを本文に全て含む `allintext:キーワード1 キーワード2`
複数のキーワードが本文内に**全て**含まれるサイトを検索します。

```
allintext:vue.js flask
```

###キーワードを本文に含む `intext:キーワード`
キーワードが本文内に含まれるサイトを検索します。
それって通常の検索とほぼ変わらないような。。
(title部分の検索を除外はできます)


##キーワードをタイトルに全て含む `allintitle:キーワード`
複数のキーワードがタイトルに**全て**含まれるサイトを検索します。

```
allintitle:deep nvidia ubuntu
```

###キーワードをタイトルに含む `intitle:キーワード`
キーワードが1つでもタイトルに含まれるサイトを検索します。


##URLにキーワードを全て含む `allinurl:キーワード`
複数のキーワードがURLに**全て**含まれるサイトを検索します。

```
allinurl:nakayama kinnikun
```

###URLにキーワードを含む `inurl:キーワード`
キーワードがURLに含まれるサイトを検索します。

##特定のサイト内で検索 `site:URL`
特定のサイトにしぼって検索できます。ドメインのパスを絞っていけばその分検索範囲を狭めることができるので便利です。

```
site:qiita.com 筋トレ
site:qiita.com/akinko 筋トレ
```

##関連サイトを検索 `related:URL`
実感ですが、よく似たサイトが検索されました。

```
related:qiita.com
```

##直近のキャッシュを表示 `cache:URL`
通常は削除されてしまったサイトは見ることができませんが、キャッシュを取られている場合は、その時点のページを見ることができます。
ページによっては、フォーマットが崩れたり、一部見られなかったり、スマホレイアウトになったりしますが、内容は十分把握可能です。

```
cache:yahoo.co.jp
```

##ファイルを検索 `filetype:拡張子`
特定のファイルに絞り込んで検索します。jpg、xlsなどはもちろん、confなども検索できます。

```
filetype:conf nginx
```

##数値の範囲 `数字..数字`
ピリオド2つを間に挿入します。
バージョン、単位や年代など幅を持って調べたいときに便利です。

```
ubuntu 14..16
```

##日付指定 `before:日付` `after:日付`
特定の日以前、以降の情報だけを検索したい時に便利です。
日付はハイフン(-)でも、スラッシュ(/)でもOKですし、一桁の月日は0ありでも、0無しでもOKです。
例:
- 2018-5-5
- 2018/5/5
- 2018/05/05

```
MongoDB after:2019/12/10
MongoDB before:2019-8-9
```

また、月日は省略可能です。
注意点として、その年は含まれないようです。
例:after:2018
2018年は含まれず、2019年と、それ以降が検索対象となる。

```
PyTorch after:2018
```

以上、googleの検索オプションでした。

#おまけ
GUIで細かく検索できるアドバンス検索も用意されています。

##アドバンスド検索
https://www.google.com/advanced_search

##画像用のアドバンスド検索
https://www.google.com/advanced_image_search

##Google検索演算子ページ
google公式でも使い方を紹介しています。
https://support.google.com/websearch/answer/2466433

#おわりに
働く時間の中で、調べてる時間ってどれくらいなんでしょうか?
個人的には労働時間の30%以上は費やしている気がします。
もし、
効率的に検索できて検索にかける時間が10%でも短くなったら、年間どれだけの時間が節約できるのだろうか?100時間以上?
それが、一生だとどれくらい節約できるんでしょうか?

効率よくさっさと調べて楽したいですね。
Atmega 量産書込みについて


こんにちは

やましょうです。

#前置き
今年はちょっとお仕事で大量のAtmegaを書込む作業が発生しました。
atmegaを大量に書く場合 romライターで書込むわけですけど、
作業が多いのが難点ですよね。

#実際の書込作業手順
* 全ERACE
* eeprom部の書込み
* rom部の書込みbinやhex
* フューズ部の書込み
* 読み出し禁止書込み (*lock *)の書込み

上記をたとえば、Atmel Studioを用いて書いた場合。
作業をどっか飛ばすあり得そうですし、これが100台とかでもやましょう的にはやりたくない作業ですよね。

#純正の書込みatprogram.exeを使う。

```
C:¥Program Files (x86)¥Atmel¥Studio¥7.0¥atbackend¥atprogram.exe
```
にあると思います。

#書込みツールはパラレルライターAvrDoragonを使う。
別にpickit4や、atmel-iceでも良いとは思いますが、フューズビットを間違えた場合に
戻せなくなるので、私はAvrDorgronを使いました。

https://www.digikey.jp/product-detail/ja/microchip-technology/ATAVRDRAGON/ATAVRDRAGON-ND/1124251

なんかディスコンになった様な気がする。春には購入できたのですが。


#書込み基板を作る。
こんな感じの基板を作る。
![IMG_1420.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/cf903c27-2c1a-5537-3a14-12c5d74afe36.jpeg)


#バッチを使って書込む
https://github.com/qa65000/AtmelProgram/
にデータはあります。

```
echo off
echo Erace Start!
atprogram -t avrdragon  -i HVPP -d ATmega328P -l log.txt  chiperase
if  errorlevel 1 goto :err
echo Proram eeprom  Start!
atprogram -t avrdragon  -i HVPP -d ATmega328P -l logeeprom.txt  program -ee -f EEpromIntelHex.hex  --verify
if  errorlevel 1 goto :err
echo Program Start!
atprogram -t avrdragon  -i HVPP -d ATmega328P -l logrom.txt  program -f ProgramFlash.hex  --verify
if  errorlevel 1 goto :err
echo FUSE START!
atprogram -t avrdragon  -i HVPP -d ATmega328P -l logfuse.txt  write  -fs --values FFD1FF  --verify
if  errorlevel 1 goto :err
echo LOCK Start!
atprogram -t avrdragon  -i HVPP -d ATmega328P -l logfuse.txt  write  -lb --values c0 --verify
echo ALL PROECESS completed successfully..

goto :eof


:err
echo Error!!!!
echo Error!!!!
echo Error!!!!

:eof
echo on
```

実行して、ALL PROECESS completed successfully..が出れば問題なし。
Error!!がでればそのic書込失敗。


#改良予定
icソケットだけ見ていると、書込中かどうかわからないので、書込途中にソケット開けちゃう事件が発生
LEDを付けた改良版を作ろうと思う。


以上
やましょうでした。
Db2 SQL3125W エラー時

#はじめに
Db2のテーブルにデータをインサートする際、
用意したデータは、データ型も長さも合っているのに下記エラーが出る場合

#原因
ブランクがNULLにturncateされている可能性があります。

```
SQL3109N  The utility is beginning to load data from file "sample.del".
SQL3125W  The character data in row "1" and column "8" was truncated because
the data is longer than the target database column.
```

#解決法
`KEEPBLANKS`オプションを使ってInsertしてみましょう。

```
db2 load from delfile3 of del
   modified by keepblanks
   insert into table1
```

##参照

- [LOAD command](https://www.ibm.com/support/knowledgecenter/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0008305.html)
- [IMPORT command](https://www.ibm.com/support/knowledgecenter/en/SSEPGG_10.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0008304.html)
最新版のCLTをインストール済にもかかわらず、brewに「CLTをUpdateしろ」って怒られる場合の対処法

## 現象
brew doctorを実行すると、下記のようなWarningが出力される。

```
% brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: A newer Command Line Tools release is available.
Update them from Software Update in System Preferences or
https://developer.apple.com/download/more/.
```

System Preferenceで更新を確認しても、すでに最新。Xcodeも最新版。謎。
<img width="670" alt="Screen Shot 2019-12-10 at 17.27.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80589/7111c0b9-aed6-4317-f002-f74727810026.png">


この際のバージョン情報は下記のような感じ

```
% brew --config
HOMEBREW_VERSION: 2.2.1
ORIGIN: https://github.com/Homebrew/brew
HEAD: 2fe99bd9823fadea1cf918b1ed8366de7f40d336
Last commit: 28 hours ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: 9f1e6ddd2b9bf2e1df1d82c7da9187ff674ddfda
Core tap last commit: 4 hours ago
HOMEBREW_PREFIX: /usr/local
CPU: quad-core 64-bit skylake
Homebrew Ruby: 2.6.3 => /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby
Clang: 11.0 build 1100
Git: 2.24.0 => /usr/local/bin/git
Curl: 7.64.1 => /usr/bin/curl
macOS: 10.15.1-x86_64
CLT: 1100.0.33.8
Xcode: 11.2.1
```


## 原因
XCodeとセットのCLTを導入している場合、何らかのきっかけでバージョン不整合が生じる模様。

## 対処法
単体版のCLTを導入する。
Warningに従って https://developer.apple.com/download/more/ にアクセスし、最新CLTのdmgをダウンロード -> インストールする。
<img width="700" alt="Screen Shot 2019-12-10 at 17.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80589/2cf5acb4-219e-5e66-7e17-cb1c023d50f2.png">

導入後、CLTのバージョンが更新されていることを確認

```
% brew --config
HOMEBREW_VERSION: 2.2.1
ORIGIN: https://github.com/Homebrew/brew
HEAD: 2fe99bd9823fadea1cf918b1ed8366de7f40d336
Last commit: 28 hours ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: 9f1e6ddd2b9bf2e1df1d82c7da9187ff674ddfda
Core tap last commit: 4 hours ago
HOMEBREW_PREFIX: /usr/local
CPU: quad-core 64-bit skylake
Homebrew Ruby: 2.6.3 => /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby
Clang: 11.0 build 1100
Git: 2.24.0 => /usr/local/bin/git
Curl: 7.64.1 => /usr/bin/curl
macOS: 10.15.1-x86_64
CLT: 11.2.0.0.1.1571444319 # <----- 更新されてる
Xcode: 11.2.1
CLT headers: 11.2.0.0.1.1571444319
```

Warningも解消されてる。

```
% brew doctor
Your system is ready to brew.
```
Amplify Consoleの通知をSlackに流す

Amplify Consoleには通知メールを設定する機能があります。ビルドジョブの開始、終了のタイミングで登録したメールアドレスにメールを送信してくれます。ただ、通知はありがたいんですがメールだけなのが辛い。最近だと開発ではチャットを使っていて Amplify Console からの通知もチャットに流したくなりました。
試してみたらできたのでその紹介です。

# TL;DR
Amplify Consoleの通知メールはSNSを使っているので、そのSNSのトピックをSubscribeすればLambdaの起動もできて、そこからチャットにメッセージを送信できたりします。
Slack, Idobataへ通知するLambdaは [Serverless Application Repositoryに公開](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:296017205998:applications/amplify-console-notification) しています。

# Lambdaを起動するまでの流れ

1. Amplify Consoleの通知メールで一旦、メールアドレスを設定する。
2. アドレスを設定するとSNSのトピックが作成される。
3. 上記のトピックを購読するLambdaを作成する。
4. Amplify Consoleでビルドを実行する
5. トピックを購読しているLambdaが起動する。

## Amplify Consoleの通知メールを設定する

最初に、Amplify Consoleで通知メールを設定します。下の画像のようにメールアドレスとブランチを指定します。
1つ目の通知先メールアドレスが登録されると、通知に使われるSNSトピックが作成されます。AWSコンソール上でもトピックが作成されているのが確認できます。

<img width="1132" alt="email_notifications.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98847/517bf38b-66d4-b811-2e4c-9d6b6bc17902.png">

## 通知メールを確認する

通知メールを設定すると、登録したメールアドレスに次のようなメールが届きます。
ここにSNSトピックのARNが書かれています。このSNSトピックを購読すればLambdaも起動できます。

<img width="932" alt="subscription_confirmation.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98847/c3867dae-0d50-6186-907f-cd7c246aa7fd.png">

なお、`Confirm subscription`のリンクはクリックしてもしなくてもいいです。

## Lambdaを作成する

メールに書かれていたSNSトピックのをトリガーにしてLambdaを作成します。
SNSイベントのメッセージをチャット(Slack, Idobata)に送信するLambdaを作成しました。
作成済みのものは [Serverless Application Repositoryに公開](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:296017205998:applications/amplify-console-notification) しているので試すならそちらが簡単です。

ソースコードはGitHubに置いてあるので興味のある方はcloneするなりしてセットアップしてください（ソースコードからの細かなセットアップ方法はREADME.mdをみてください）。
https://github.com/fossamagna/amplify-console-notification

Lambdaを作成したら最初に設定したメールアドレスは削除してしまって構いません。

# 動作確認

Amplify Consoleで対象のリポジトリをビルドしてみてください。ビルドジョブの開始と終了（成功/失敗）のタイミングでチャットに通知されるようになります。

Slackだと次のように通知されるはずです。
<img width="718" alt="スクリーンショット 2019-12-10 13.06.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98847/51a61055-730a-8d42-0c45-97e6285ebb04.png">

# まとめ

- Amplify Consoleからの通知メールはSNSだ。
- SNSトピックを購読すればLambdaも起動できる。
- [amplify-console-notification](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:296017205998:applications/amplify-console-notification) を使うとSlack, Idobataに簡単に通知できる。
prop(‘disabled’, false)を使ってもdisabled属性が消えない問題

# やりたいこと
jQueryで、

```js
e.preventDefault();
```
を使った後にsubmitボタンにdisabled属性が付いてしまうので、これを

```js
prop('disabled', false)
```
を使って削除したい。

# 上手くいかないコード

```js
$(document).on('turbolinks:load', function(){
  $('#new_item').on('submit', function(e){
    var child_category = $("#child_category").val();
    var grandchild_category = $("#grandchild_category").val();
    if(child_category == "---" || grandchild_category == "---"){
      e.preventDefault();
      alert('カテゴリを選択してください');
      $('input[name="commit"]').prop('disabled', false);
    }
  })
})
```

実行結果は以下の通りで、なぜかdisabledが消えてくれません。
[![Image from Gyazo](https://i.gyazo.com/ad59ee119a91176edec9ea3436a5c1e5.gif)](https://gyazo.com/ad59ee119a91176edec9ea3436a5c1e5)

※他にもattrを使ったりremoveAttrを使ったり、いろいろ試してみましたが、何をやっても上手くいきませんでした。
※console.logで確認したところ、propメソッドが効いていないわけではないようでした。disabled属性はfalseになっているにも関わらず、disabledが残ってしまうという現象が起きます。


# 上手くいったコード

```js
$(document).on('turbolinks:load', function(){
  $('#new_item').on('submit', function(e){
    var child_category = $("#child_category").val();
    var grandchild_category = $("#grandchild_category").val();
    if(child_category == "---" || grandchild_category == "---"){
      e.preventDefault();
      $.ajax({
      }).done(function(){
        alert('カテゴリを選択してください');
        $('input[name="commit"]').prop('disabled', false);
      }).fail(function(){
        alert('ajax失敗');
      })
    }
  })
})
```

実行結果は以下の通りで、disabledが消えてくれるようになりました。
[![Image from Gyazo](https://i.gyazo.com/2de0b880767afd78a420d0f6e3c62994.gif)](https://gyazo.com/2de0b880767afd78a420d0f6e3c62994)

ajaxをはさむことによってなぜか正常に作動しました。
理由はよくわかっておりませんが、とりあえずこれで動くようになりました。
Windows版SourceTreeで選択したxmlファイルをAndroid Studioで開けるようにする。

windows PCでバージョン管理にSourceTreeを用いてAndroid開発をするにあたって、javaファイルやkotlinファイルは「現在のバージョンを開く」「選択のバージョンを開く」で開かれるデフォルトのエディタがAndroid Studioであり問題がないが、xmlファイルはブラウザが開いてしまいずっと不便に思っていた。
そこでxmlをAndroid Studioで開けるようにしたが、検索してもmacでのやり方しか出てこず色々ハマっててこずったので共有。

※題名・目的は「xmlファイルを開く」だけに焦点を絞っているが、これで作ったカスタム操作は全ての拡張子のファイルに対して実行可能で、実行された全ての拡張子のファイルをASで開こうとします。

# 環境
OS : Microsoft Windows 10 Pro
SourceTree ver : 3.1.2.3027
Android Studio ver : 3.5.2

# 共通の大まかな流れ
1. batファイルの作成
1. そのbatファイルを「カスタム操作」として登録

# 詳細
## xmlファイルもASで開ける版「現在のバージョンを開く」を作成
### batファイル作成

```openNowVerAS.bat
echo  %1
set FILE_NAME=%1
call "C:\Program Files\Android\Android Studio\bin\studio64.exe"  %FILE_NAME%
```
### カスタム操作として登録
ツール > オプション > カスタム操作 > 追加

メニュー表示名 : 現在のバージョンをASで開く(自分がわかれば何でも良い)
実行するスクリプト : 先ほど作ったopenNowVerAS.batのpath
パラメータ : $FILE



## xmlファイルもASで開ける版「選択のバージョンを開く」を作成
### batファイル作成

```openThisVerAS.bat
echo  %1
echo  %2
set FILE_NAME=%1
set COMMIT_ID=%2
set FILE_EXPAND=%~x1
git show %COMMIT_ID%:%FILE_NAME% > "C:\Users\(ユーザーネーム)\AppData\Local\Temp\%COMMIT_ID%.temp.%FILE_EXPAND%"
call "C:\Program Files\Android\Android Studio\bin\studio64.exe"  "C:\Users\(ユーザーネーム)\AppData\Local\Temp\%COMMIT_ID%.temp.%FILE_EXPAND%"
```
### カスタム操作として登録
ツール > オプション > カスタム操作 > 追加

メニュー表示名 : 選択のバージョンをASで開く(自分がわかれば何でも良い)
実行するスクリプト : 先ほど作ったopenThisVerAS.batのpath
パラメータ : \$FILE $SHA (順番が大事。逆にしちゃダメ。batファイルに実行時にこの順番で引数として渡されるため。)



#注意点・ハマった事
## 「選択のバージョンをASで開く」の方はHistoryの特定のコミットの中のファイルを右クリックした時に出てくる「カスタム操作」からは選べない。(選択肢として出てこない。)
画面上部のツールバーの操作>カスタム操作からしか選べない。これに気づくまでとても時間がかかって時間を無駄にしてしまった。
※「現在のバージョンをASで開く」の方はファイルの右クリック>カスタム操作からも選べる。この挙動の差はパラメータに$SHAがあるのが関係しているっぽい。

## 「選択のバージョンをASで開く」はたくさんのテンポラリファイルを生む。
この方法でやると、「選択のバージョンをASで開く」を一回実行するたびにC:\Users\(ユーザーネーム)\AppData\Local\Temp\以下に1個テンポラリファイルが生まれる。(正確には、過去に同じコミットの同じファイルに対して実行した事がある場合は上書きされるので増えない。)誰も消してくれないので定期的にチェックして手動で自分で消す必要あり。



# 参考にしたもの
https://jj-blues.com/cms/wantto-exeinbatfile/
http://www.kuma-de.com/blog/2017-04-18/7296
http://orangeclover.hatenablog.com/entry/20101004/1286120668
http://capm-network.com/?tag=Windows%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%A4%89%E6%95%B0
https://www.bulblub.com/2015/12/11/sourcetree-pick-yours/
Python3.7とDjango3.0をインストールする（CentOS）

##はじめに
2019/12/2にDjango3.0が正式リリースされた。
Pythonのサポート対象が3.6、3.7、3.8となり、色々とアップデートがあったみたい。
なので触ってみようと思うが、その前にインストール手順について書いていきたい。

せっかくなのでPython3.7を入れようとしたが思ったより苦戦したので備忘録として。。。

##Python3.7のインストール
なにはともあれPythonのインストールを行う。
環境はCentOS7、yum updateをしたのみのサーバである。

まずPythonインストールにあたり必要な小物たちをインストールする。

```centos:server
[root@django ~]# yum install gcc zlib-devel libffi-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libuuid-devel xz-devel
```

python3.6はyumでインストール可能だが今現在(2019/12/10)だと3.7はリポジトリに入っていないみたいなので、パッケージを落としてきてインストールする必要がある。

```centos:server
[root@django ~]# curl -O https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
[root@django ~]tar xf Python-3.7.3.tgz
[root@django ~]cd Python-3.7.3
[root@django Python-3.7.3]./configure
[root@django Python-3.7.3]make
[root@django Python-3.7.3]make altinstall
```

インストールが終わったら実行PATHの追加を行う。

```centos:server
[root@django Python-3.7.3]visudo
・・・・
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
・・・・

##最後の:/usr/local/binを追記している
```

これで設定が終わったはずなのでバージョン確認を行う。

```centos:server
[root@django ~]python3 -V
-bash: python3: コマンドが見つかりません
```

**F〇〇K**
Python3.6だとデフォで出来たはずだが今回のようなインストールの形だと自分でいじらないといけないみたいだ。
python3で起動するようシンボリックリンクの設定をを行う。


```centos:server
[root@django Python-3.7.3]# which python3.7
/usr/local/bin/python3.7

[root@django Python-3.7.3]# ln -s /usr/local/bin/python3.7 /usr/bin/python3
[root@django Python-3.7.3]# python3 --version
Python 3.7.3
```

**yeah**

ついでにpipのバージョン確認も行おう。

```centos:server
[root@django ~]pip3 -V
-bash: pip3: コマンドが見つかりません
[root@django ~]pip -V
-bash: pip: コマンドが見つかりません
```

**Jesus Christ**
お前もか・・・調査して手動でいれることにする。

```centos:server
[root@django ~]curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
[root@django ~]python3 get-pip,py
[root@django ~]pip3 -V
pip 19.3.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
```

今回は↑のような対応をしたが設定をいじるだけでもいけるらしい。
[いまさらながら、Python3.7をCentOS/RHEL 7に導入する。](https://qiita.com/Sakieda/items/07e060b25420d642159d)

##Django3.0のインストール
では最後にDjango3.0をインストールする。

```centos:server
[root@django ~]pip3 install Django
・・・
Successfully installed Django-3.0 asgiref-3.2.3 pytz-2019.3 sqlparse-0.3.0
[root@django ~]
```

**おけまる**
無事インストールできた。

##次へ向けて
pythonの対応バージョンが変わったのでじゃあ入れたことのない3.7を入れようとしたら思ったより時間がかかってしまった。おそらく3.8も似たような対応になると思われる。
次の記事でDjango3.0を実際に触ってみようと思う。
大量のswitch-case文をExcelで量産する方法

#環境・前提
- Excelが好きだ。オートフィルが好きだ。
- 脳が疲れていてswitch-case文しか思いつかない。

#使用例
「市町村コードを入力すると市区町村名を返してくれる処理」を大量のswitch-case文で書く場合で説明します。
[総務省 - 全国地方公共団体コード](http://www.soumu.go.jp/denshijiti/code.html)

#Excelの書き方（Ruby編）
1. F2セルに`="when """&A2&""" then puts """&C2&""""`を記入します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274934/ba9fa216-4b28-315a-5b2d-daeff1333717.png)
1. F2セルの右下の■（フィルハンドル）をダブルクリックします。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274934/cce7c145-53f9-8539-3116-b55c90db1af5.png)
1. 選択範囲のセルをコピーします。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274934/3a39a2c4-d314-0fb2-e2b2-631fab41af31.png)
1. エディターにペーストします。
![3-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274934/c4d59360-08ea-dc2f-e3a7-e2dcc91e6952.png)


やりました!!これで一気に1700行あまりを書ききりました!!
あとはendで閉じれば完了です。

#行を分けたいときのExcelの書き方（c言語編)
先程のRuby編では1行にすべての処理を記載しました。~~これでは可読性が下がりますね。~~複数行に分けてswitch-case文を量産する方法にも触れます。

1. 行を増やします。参考:[EXCEL 1行おきに行挿入する方法](https://excelkamiwaza.com/row_insert.html)
1. H2セルに`="case "&A2&":"`、H3セルに`="printf("""&C2&""");"`、H4セルに`break;`と記入します。入力した3つのセルを選択状態にします。
![aa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274934/dce46fa9-30f6-2cfc-8627-aac47571a2f3.png)
2. 右下の■（フィルハンドル）をダブルクリックします。
![bb.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274934/2a11bfbd-7393-3663-d144-658684b34193.png)
1. 選択範囲のセルをコピーし、エディターにペーストします。
![dd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274934/6140e4f7-8550-f7f8-b2d5-d80beb21a251.png)

成し遂げました!!たったの4ステップで5300行あまりのswitch-case文を量産完了です。
(動かして気づいたのですがc言語は0から始まる数値は8進数と認識されるのでエラーになります。）

#さいごに
本当に大量のswitch-case文は必要かどうか胸に手をあてて考えましょう。（僕はこれ以外思いつきませんでした...）
Notionでヘッダー画像を設定する

[アルプ株式会社](https://thealp.co.jp/)でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2019](https://qiita.com/advent-calendar/2019/notion) 10日目のエントリです。
9日目は[Notionでリンクブロックを作る](https://qiita.com/pictiny/items/32a868130432d7b405e1)でした。

# ページヘッダー
Notionのページ上部には`Cover`と呼ばれるスペースがあり、そこに画像を設定することができます。
[Page icons & covers](https://www.notion.so/Page-icons-covers-be694b07c6284ee3800bd71dde495981)

<img width="741" alt="ページヘッダー1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/a195dc1a-7e39-c226-fce4-9602b80c0d5c.png">

ページタイトルの上部、ページアイコンの下部にある**Add Cover**を押すとランダムな画像が設定されます。

<img width="367" alt="Screen Shot 2019-12-10 at 17.10.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/9054c52e-0323-bc24-d2d5-4a78c6778bf1.png">

カバーの右下にある**Change Cover**を押すと画像を選択するメニューが表示されるので、好きな画像を設定できます。

<img width="615" alt="Screen Shot 2019-12-10 at 17.10.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/bce78753-72b2-f79c-cdcb-ffa425bbc74a.png">

画像アップロードや画像リンクから設定できるだけでなく、[Unsplash](https://unsplash.com/)と連携しているのが嬉しいですね！

# まとめ
カバーを設定するとページが一気に映えます。
トップページなどの重要なページに設定しておくとページの認知が上がるのでおすすめです。