OmniAICreator/Qiita-1.07M huggingface dataset:
【PowerShell】SendGrid Web API でメール送信

ここではPowerShellを使用しているが、Javaなど他の言語ならライブラリが用意されているので、そちらを使う方が簡単だと思われる。

# APIキーを取得する
SendGridのダッシュボードへログインし、左側のメニューで「API Keys」を選ぶ。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/e5906489-d423-ec20-3ad6-af6d0ab1fb63.png)

APIキー自体は、作成直後の画面からしか取得できないので注意。キーを無くしてしまった場合は、作り直さなくてはいけない。

APIキーにつける権限は、「Mail Send」のみあればOK。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/33a2552b-2af2-f055-43de-cf12e92e3d87.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/b6f3d415-185d-ff0e-cc6d-8ad5f31f0459.png)

# Web API の仕様

[SendGrid v3 API Documentation の Mail Send](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send)

# PowerShell
`Invoke-RestMethod`を使う。

```powershell:サンプル
function main() {
    
    # 添付ファイルを読込み、Base64でエンコードする
    $attach = "01.png"
    $attachContent = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes($attach))

    $url = "https://api.sendgrid.com/v3/mail/send"

    # ヘッダーの内容はAPIキーとcontent-typeでほぼ固定
    $headers = @{
        "authorization" = "Bearer [APIキー]"
        "content-type" = "application/json"
    }

    $body = @{
        "personalizations" = @(
            @{
                "to" = @(
                    @{"email" = "aaa@example.com" }
                )
            }
        )
        "subject" = "件名テスト"
        "content" = @(
            @{"type" = "text/plain"
              "value" = "本文テスト"}
        )
        "attachments" = @(
            @{
                "content" = $attachContent
                "filename" = "01.png"
            }
        )
        "from" = @{"email" = "sender@example.com"}
    }

    # オブジェクトをJsonへ変換する。その際、Depthを指定して、深い階層も変換されるようにする。
    $bodyJson = $body | ConvertTo-Json -Depth 20

    # JsonをUTF-8へ変換する。変換せずにPOSTすると、日本語が文字化けする。
    $bodyBytes = [System.Text.Encoding]::UTF8.GetBytes($bodyJson)

    $res = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $bodyBytes
}
```

上記サンプルは決まり切ったメールを送る場合に使える。
関数化して、宛先、本文、添付ファイルを指定できるようにしたバージョンは、下記GitHubに作成しておいた。
https://github.com/vicugna-pacos/ps-mail-sendgrid

# おまけ：Web API vs SMTP
[Web API or SMTP Relay: How Should You Send Your Email? | SendGrid](https://sendgrid.com/blog/web-api-or-smtp-relay-how-should-you-send-your-mail/)

Web APIの方をお勧めされている。
オイラー・マスケローニ定数が出て来る定積分

# 概要

以下の積分の値を求めてみます。

```math
\int_0^\infty e^{-x} \ln (x) dx
```

# STEP 1

まずは$e^{-x}$の定義に立ち返ります。

```math
e^{-x} = \lim_{N \rightarrow \infty} \left( 1-\frac{x}{N} \right)^{N}
=\lim_{N \rightarrow \infty} \left( 1-\frac{x}{N} \right)^{N-1} \underbrace{\left( 1-\frac{x}{N} \right)}_{N \rightarrow \infty で1} 
=\lim_{N \rightarrow \infty} \left( 1-\frac{x}{N} \right)^{N-1} 
```

となりますので、元の式は

```math
\lim_{N\rightarrow \infty} \int_0^N \left( 1-\frac{x}{N} \right)^{N-1} \ln (x) dx
```

のように書けます。積分範囲を$[0, N]$に変形していることに注意してください。

# STEP 2

$U = 1-x/N$と置換して変形します。$dU = -dx/N$として

```math
\int_0^N \left( 1-\frac{x}{N} \right) \ln (x) dx 
= \int_0^1 U^{N-1} \ln (N(1-U)) (-N) dU = N \int_0^1 U^{N-1} \ln (N(1-U)) dU 
= N \ln (N) \int_0^1 U^{N-1} dU + \int_0^1 U^{N-1} \ln (1-U) dU
```

# STEP 3 

$\displaystyle{\ln (1-U) = \sum_{k=1}^\infty \frac{U^k}{k}}$を用います。

```math
N \ln (N) \left[ \frac{U^N}{N}\right]_0^1 - N \int_0^1 U^{N-1} \sum_{k=1}^\infty \frac{U^k}{k} dU
=\ln (N) - N \int_0^1 \sum_{k=1}^\infty \frac{U^{k+N-1}}{k} dU 
=\ln (N) - N \sum_{k=1}^\infty \left[ \frac{U^{k+N-1}}{k(k+N)} \right]_0^1
=\ln (N) - \sum_{k=1}^\infty \left( \frac{1}{k} - \frac{1}{N+k}\right)
```

# STEP 4

後ろの級数部分を以下のように分解します。

```math
\sum_{k=1}^\infty \left( \frac{1}{k} - \frac{1}{N+k}\right) 
=1 - \frac{1}{N+1} + \frac{1}{2} - \frac{1}{N+2} +\frac{1}{3} - \frac{1}{N+3} + \cdots \frac{1}{N} - \frac{1}{2N} + \frac{1}{N+1} - \frac{1}{2N+1} + \cdots
```

するとどうでしょうか、打ち消せる項があることがわかります。

```math
\therefore \ \int_0^N \left( 1-\frac{x}{N} \right)^{N-1}\ln (N)dx = 
 \ln (N)-\sum_{k=1}^N \frac{1}{k}
```

# STEP 5

これの$N\rightarrow \infty$極限をとったものがもともとの求めたかった式の値です。

```math
\int_0^\infty e^{-x} \ln(x) dx
= \lim_{N\rightarrow \infty} \left( \ln(N) - \sum_{k=1}^N \frac{1}{k}\right)
= -\gamma
```

この$\gamma$がオイラー・マスケローニ定数(Euler-Mascheroni constant)で、およそ0.5772...という値です。

# 参考動画

https://www.youtube.com/watch?v=80_fNEflUdw
MySQLでFunctionを作成するために気を付けること

自分でやっていた際に起こったこと。

MySQLにFunctionを作成しようとしたところ、以下のエラーが発生した。

>ERROR 1418: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

こんなエラーは見たことなかったので調べたところ、意外にも原因がすぐに分かった。
SUPERまたはCREATE ROUTINE(ALTER ROUTINE)権限を持つ必要があるらしいのだが、「log_bin_trust_function_creators」を有効にすることでFunctionを登録できるようになるらしい。
有効にするやり方は以下。

>mysql>SET GLOBAL log_bin_trust_function_creators = 1;

ちなみにmy.infに記述をしておくと起動時にlog_bin_trust_function_creatorsが有効になる。

>vi /etc/my.cnf log_bin_trust_function_creators=1

あースッキリ。
DynamoDBTableアノテーション使用時の注意点

DynamoDBTableアノテーションを使ったモデルクラスを作るときは、
・引数無しのコンストラクタが必要
・Getter/SetterはAttributeかどうかに関係なく基本的に対で必要。片方しかないと
```com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: クラス名[set/getの後の名前]; could not unconvert attribute
```で怒られる
・Getter/Setterのどちらか片方しか必要ない場合は@DynamoDBIgnoreを付ける

Tipsとして、Lombokの@NoArgsConstructorと@Dataを使うことをお勧めする。
Electronでホットリロード開発をしたい！


# はじめに

Electronなどを使っていると
いわゆる**ホットリロード機能**がほしくなります。

このホットリロードとは、
現在自分の扱っているElectronのディレクトリ以下にファイル変更があった場合、自動検知して、もう一度ファイル変更をそのまま実行し
いちいちCtrc-C、起動を自分でやらなくてよい！
という機能です。
うれしい。


Vue CLIなどや、Webpack --watchモードなどが特に有名だったりする気がします。

# 方法

ホットリロード機能を使うにはまず

```
npm install electron-reload
```

をnpmで入れてください。
electron-reloadは、ファイル変更を検知して自動更新するパッケージです。

その後、Electronのエントリポイントのファイルに
以下のような記述を行います。

```javascript:main.js
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
const ipcMain = electron.ipcMain;
const fs = require('fs');

/*
*
* 第一引数がおそらく監視したいディレクトリフォルダ
* 第二引数がおそらくElectronの実行フォルダ
*
* */
require('electron-reload')(__dirname, {
    electron: require('${__dirname}/../../node_modules/electron')
});

let mainWindow = null;

app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

```

コメント文のあるrequire('electron-reload')の行を書くだけで
ホットリロードがうまく起動するようになります。


ただし、第２引数では、自分の環境では

- グローバルにElectron
- 自分のプロジェクトにローカルのElectron

の両方を取り入れています。
そのため、第2引数では、自分のプロジェクトのローカルのElectronを指定しています。

# 効果

エントリポイント、つまりメインプロセスのmain.jsに変更を行うと、Electron自体再実行されるらしく、すべてのウィンドウプロセスが消去されて自動で完全終了、完全再起動が実行されます。

ウィンドウプロセス、つまりindex.html側などの各ウィンドウのファイルを修正すると、メインプロセスには影響が出ないため、完全再起動にはならず、差分修正で非常に早いです。

# まとめ

結構便利だけど、main.jsのメインプロセスの修正だと、コメント文を少し直しただけでいちいちアプリが消える->付くが繰り返されるので面倒っちゃ面倒
（研究室のパソコンが重いので辛い、家でなら全然大丈夫そう）
GASを用いたgmail自動配信プログラムについてお悩みがございます

初めまして。
gasを用いてリストにあるメールアドレス宛に自動でメール送信を繰り返すというプログラムを組み実行しています。
しかし、400件手前でメール送信が止まってしまい、対象セルの色が変わり”完了”と入力される、という最終動作が行われてしまいました。
メールの配信時間を見ると、最初の1通から400通目の間で18分ほど差がありました。
gasの制限時間である6分で送れる数が400通という認識でよいのでしょうか…？


以下コードとなります。

var listSheet=mySheet.getSheetByName('XXXX'); 
  var listLastRow=listSheet.getLastRow();
var Sender="XXX";
var subject="XXX";
var mailContents="XXX";

for(var i=2;i<=listLastRow;i++){
          var listColumnArray = listSheet.getDataRange().getValues();
          var listAddressCell = listColumnArray[0].indexOf("XXXX")+1;
          var Email=listSheet.getRange(i,listAddressCell).getValue();
          try{
          GmailApp.sendEmail(Email,Subject,mailContents,{name:Sender});
          }catch(e){
          }
          }
    ss.getRange(1,2).setValue("完了").setBackground("gray");
markdownでテーブルを表現

ただのメモです。
ドキュメント作成の時に

```
|Network Type| Interface #1 | Interface #2 |
|:----------:|:----------:|:----------:|
|web|eth1|eth0|
|intra|eth1|eth1-1|
```


```markdown

```
|Network Type| Interface #1 | Interface #2 |
|:----------:|:----------:|:----------:|
|web|eth1|eth0|
|intra|eth1|eth1-1|
```

```
Advanced 4.検索を追加してみる、引き続き各ページを作ろう

- トップページ(with 検索機能) /
- 都道府県の詳細ページ 'prefectures/:id' (done)
- ホテルの詳細ページ 'hotels/:id' (done)
- レビューの一覧  'hotels/:id/reviews' (done)
- レビューを新規作成  'hotels/:id/reviews/new (done)
- レビューを作る  POST 'hotels/:id/reviews' (done)
- レビューの詳細 'hotels/:id/reviews/:id' (done)
- 予約を新規作成 'hotels/:id/reservations/new' (done)
- 予約を作る 'hotels/:id/reservations' (done)
- お問い合わせ /contacts/new, /contacts/:id (done)


# 1. Topページを作成しよう

ホテルの一覧ページ(/hotels)のを作成し、下記の設定を加えて
http://localhost:3000/
にアクセスしたときにホテルの一覧ページが表示されるか確認しよう

```config/routes.rb
root 'hotels#index'
get 'hotels', to: 'hotels#index'
```


# 2. トップページの検索機能をRansackで実装してみよう

## 2.1. 検索機能ってどんなもの?
http://ransack-demo.herokuapp.com

## 2.2. 実際に実装する前に?
「rails 検索機能 gem」などとGoogle検索して、「ransack」がよく使われていることを確認し、
「ransack gem」とGoogle検索して、下記のGithubにアクセスしよう。
https://github.com/activerecord-hackery/ransack

下記を参考にして実装してみよう。
https://github.com/activerecord-hackery/ransack#simple-mode

** Coachより 実際にアプリケーションを設計するときにGithubを使うことを説明しよう。Githubを使うときはGetting StartedやInstallationやUsage見る。英語に慣れないうちは「ransack 使い方」などと検索し、出てきた日本語サイトを参考にするでも可。

## 2.3. 実際に実装してみよう
ホテル名で検索すると、検索されたホテルのみが表示されるように機能を作成してみよう。

```Gemfile
gem 'ransack'
```


- 時間が余ったら
  - Advanced 2の都道府県機能
  - Advanced 3の予約機能
  
を実装しよう。
Advanced 3.演習、各ページを自分で作ってみよう

- トップページ(with 検索機能) /
- 都道府県の詳細ページ 'prefectures/:id' (done)
- ホテルの詳細ページ 'hotels/:id' (done)
- レビューの一覧 
- レビューを新規作成
- レビューを作る
- レビューの詳細
- 予約を新規作成 'hotels/:id/reservations/new'
- 予約を作る 'hotels/:id/reservations'
- お問い合わせ /contacts/new, /contacts/:id (done)
 
# 1. レビュー機能をつくっていこう

## 1.0. 各ページのRESTful APIを考えてみよう

- レビューの一覧
- レビューを新規作成
- レビューを作る
- レビューの詳細



###  レビューの一覧
<img width="959" alt="reviews_index.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496885/aa772f19-9119-672d-01dc-5cc64a8c8bef.png">


### レビューを新規作成
<img width="960" alt="reviews_new.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496885/e4e6d82e-d2af-9f6e-191b-3c42816108ec.png">


### レビューを作る

### レビューの詳細
<img width="958" alt="reviews_show.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496885/7f23ac62-d8cb-1e19-cff7-c4200d449e71.png">

Basic 6.を参考に下記を進めてみよう
https://qiita.com/rainbowaffro/items/f480c3e158d7aa67124f#4-%E4%BC%9A%E7%A4%BE%E3%81%AB%E7%B4%90%E3%81%A5%E3%81%8F%E3%82%B9%E3%82%BF%E3%83%83%E3%83%95%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%84%E3%81%93%E3%81%86
## 1.1. モデル作る

### 指定できるカラムの型
- string : 文字列
- text : 不定長文字列（改行あり）
- integer : 整数
- float : 浮動小数点数
- decimal : 精度の高い小数
- date : 日付
- time : 時間
- datetime : 日時
- timestamp : タイムスタンプ
- binary : バイナリデータ
- boolean : Boolean

## 1.2. routing足す
## 1.3. controller作る
## 1.4. view作る

# 2. (時間が余ったら)予約機能を作ってみよう

### 予約を新規作成
<img width="960" alt="reservations_new.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496885/555a0d8a-6e31-8609-626c-bcdccd05c887.png">

### 予約の確認画面
<img width="958" alt="reservations_show.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496885/6e669041-a158-00fd-876e-cc2636fb8e30.png">


Basic 6.を参考に下記を進めてみよう
https://qiita.com/rainbowaffro/items/f480c3e158d7aa67124f#4-%E4%BC%9A%E7%A4%BE%E3%81%AB%E7%B4%90%E3%81%A5%E3%81%8F%E3%82%B9%E3%82%BF%E3%83%83%E3%83%95%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%84%E3%81%93%E3%81%86
## 1.1. モデル作る
## 1.2. routing足す
## 1.3. controller作る
## 1.4. view作る
Echarts Resize

https://echarts.apache.org


```coffeescript
#Coffee
window.onresize = () ->
  $("[_echarts_instance_]").each () ->
    id = $(this).attr('_echarts_instance_');
    window.echarts.getInstanceById(id).resize()
```

```js
//JS
window.onresize = function() {
  $("[_echarts_instance_]").each(function(){
    id = $(this).attr('_echarts_instance_')
    window.echarts.getInstanceById(id).resize()
  })
}
```
Advanced 2.Gemを使って管理画面を作成する、設計説明

# 1. Gemの使い方を覚えよう。
管理画面を作る
https://github.com/sferik/rails_admin

* 実践的には、Gemなどのライブラリを使う際には、Getting Started. やInstallationと書かれているところを参考にして導入することがことが多い。

Installationを参考に管理画面機能を作って、データを追加してみよう。

* 今後のHotelProjectのデータはここから追加してください。

# 2. ホテルサイトの説明
- トップページ /
- お問い合わせ done
- 都道府県の詳細 'prefectures/:id'
- ホテルの詳細ページ 'hotels/:id'
- レビューの一覧 'hotels/:id/reviews'
- レビューを作る 'hotels/:id/reviews/new
- レビューを作る POST 'hotels/:id/reviews'
- レビューの詳細 'hotels/:id/reviews/:id'

# 3. ホテルの詳細ページ 'hotels/:id'
![localhost_3000_hotels_1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53443/fcbe97e3-a118-58b2-7ecd-d02b9a82608d.png)

Basic 5.を参考に下記を進めてみよう。
https://qiita.com/rainbowaffro/items/03635f98091b04d9e37e#5-%E8%A9%B3%E7%B4%B0%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

画像の追加機能については下記を参考。
https://qiita.com/rainbowaffro/items/4a921fcd3c2fbba28cad#4%E5%86%99%E7%9C%9F%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E6%A9%9F%E8%83%BD%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B

## 3.1. モデル作る
## 3.2. routing足す
## 3.3. controller作る
## 3.4. view作る

** Coachより: 所在地の書き方について説明しよう **
```
<%= hotel.prefecture.name %>
```

# 4. 都道府県の詳細 'prefectures/:id'
![localhost_3000_prefectures_47 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53443/6ef88fb4-44ad-8254-6be5-30ac999abc26.png)

Basic 6.を参考に下記を進めてみよう
https://qiita.com/rainbowaffro/items/f480c3e158d7aa67124f#4-%E4%BC%9A%E7%A4%BE%E3%81%AB%E7%B4%90%E3%81%A5%E3%81%8F%E3%82%B9%E3%82%BF%E3%83%83%E3%83%95%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%84%E3%81%93%E3%81%86
## 4.1. モデル作る
## 4.2. routing足す
## 4.3. controller作る
都道府県に紐づくホテルの一覧の呼び出し方は

```
@hotels = @prefecture.hotels
```

で呼び出せることを覚えておこう。

## 4.4. view作る
3Dプリンター(Dreamer)によるSTLファイルの出力

こんにちは．Ideagearの林です．
今回はSTLファイルをスライサーソフトを経由して3Dプリンターで出力，の流れについてまとめたいと思います．

#環境
3Dプリンター：Dreamer
スライサーソフト：FlashPrint(FLASHFORGE社のスライサーソフト)

PCはWindows10 64ビット版です．

#下準備

STLファイルを用意します．
CADソフトで制作してもいいですし，[こちら](https://www.yeggi.com/q/public+domain/)などサイトからダウンロードしてもいいです．

#スライサーソフトを使ってGcodeを作成
3Dデータを出力するためにプリンターをどう動かすかの命令が書かれたGcodeを作成します．
そのために用いるのがスライサーソフトです．

**1.STLファイルをFlashPrintで開く．**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/997b9064-228f-efd6-b496-fdca6517e62b.png)

用意したSTLファイルを選択して開きます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/d0dd7481-20d8-534a-7353-06748a1d87d8.png)


**2.造形の設定**
造形範囲内のどこに出力するかや，向き，大きさを変えることができます．
複数のモデルを造形する場合，移動させて造形範囲内に収める必要があります．

モデルをクリックして選択し，左のツールで設定できます．
「移動」ツールにある「ベッドに置く」は底面を一番下(ベッド)に置き，浮かないようにしてくれるので便利です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/0e7d8276-a940-b26f-5fbc-ff54bd8c7774.png)

**3.サポート材の設定**
3Dプリンターも土台がないと，浮いたところに造形はできないので，ネズミ返しのように下に何もないところにはサポート材と呼ばれる土台を作る必要があります．

上部の「サポート材」を選択し「自動サポート」をクリックすると写真のように必要なところにサポート材が作られます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/ce5cb885-1c96-6e8b-c6db-0a5cc817221d.png)

**4.出力の設定**
上部の「戻る」をクリックすると，サポート材がモデルと一体化したデータになります．(保存するかどうかは任意でどうぞ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/243bf67d-4610-0fe5-2c65-b5fc1714936a.png)

上部の「スライス」をクリックして使用する樹脂の種類や設定を選びます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/dc98d56b-8938-9f93-5a03-14cfa8300b44.png)

「その他のオプション」から詳細設定ができます．
特に，充填率やスピードは必要に応じて変更することも多いです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/fc7c8ec6-1795-4e0c-249a-55e11b1aff38.png)

終わったら「OK」を押して保存します．
以下の画面が出た場合は，一層目に樹脂を薄く塗り，反りを防止するかの設定です．お好みでどうぞ．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/5079411a-5965-1ee9-7612-5566291d7270.png)

これで.gxのGcodeのファイルが出来ました．

#3Dプリンターで出力
前項でつくったGcodeのファイルを入れたSDカードをDreamerに接続します．
【初心者】pythonで０から Project Euler を解いてみた25

今回は、Euler25を解いていくっ！！！！
問題はここっ！！！
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2025
フィボナッチ数列ですねーーー
なんか最初のほうに似た問題ありましたね
###コード
```python
Fn = [1,1]
ter = 0
while True:
    Fn.append(Fn[ter] + Fn[ter+1])
    ter += 1
    if Fn[ter+1] > 10 ** 999:
        break
print(Fn)
print(len(Fn))
```
今回はリスト使ったらうまくできるんじゃねと思いリストを使いやりました
まず最初に問題で定義されていた[1,1]から始めました
そして作った数をリストに追加していくことにして解きました
かなり簡単できたんじゃかなと思いました:two_hearts:
複数の画像のMIMEタイプを変換する

# 複数の画像のMIMEタイプを変換する

## 目的

前回、『[拡張子とMIMEタイプが異なる画像を一覧表示する](https://qiita.com/shioharu_/items/f93ffd84c288dd896f11)』で抽出したファイルの一覧をもとに、
目的のMIMEタイプへ変換します。(今回はjpegです)

## 概要

- PHPファイルを置いてブラウザから実行できるようにする
- imagejpeg()、imagepng()、imagegif()などの関数で任意のMIMEタイプへ画像を変換し、別ファイルとして出力する

## 詳細

```toJpeg.php
<?php
// 変換ファイル名(ここに前回の抽出したファイルの一覧のファイル名を記載する)
$image_list =[
    'hoge.jpg',
    'fuga.jpg',
    'moge.jpg',
];

// 変換ボタンが押下されたとき
if (isset($_POST['action']) && $_POST['action'] === "change") {
    // 処理時間の計測
    $time_start = microtime(true);
    foreach($image_list as $file_name) {
        // 変換元
        $from_path = '/var/www/hoge/image/'.$file_name;
        // 変換後の出力先
        $to_path = '/var/www/hoge/toJpeg/image/'.$file_name;
        $image = @imagecreatefrompng($from_path);
        // 変換したいMIMEタイプの関数を使用して変換(今回はimagejpeg)
        imagejpeg($image, $to_path);
        imagedestroy($image);
    }

    // 更新完了メッセージを設定してリダイレクト
    $time = microtime(true) - $time_start;
    $_SESSION['message'] = "変換が完了しました(".$time."秒)<br>";
    header('Location: /toJpeg/');
    exit;
}

?><html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta charset="utf-8">
    <title>画像のMIME変換</title>
    <script type="text/javascript">
        <!--
        function send(){
            document.check.submit();
            document.getElementById("change").disabled = "true";
            document.getElementById("change").value = "処理中";
        }
        // -->
    </script>
</head>
<body>
<h1>カテゴリバナー画像のMIME変換</h1>
<ul>
    <li>画像のMIMEタイプを変換し、/toJpeg/imageへ出力します</li>
</ul>
<?php if(isset($_SESSION['message'])) { ?>
    <?php echo $_SESSION['message']; unset($_SESSION['message']); ?>
<?php } ?>
<form name="check" action="" method="post" enctype="multipart/form-data">
    <p><input type="button" id="change" value="変換" onClick="send()" /></p>
    <input type="hidden" name="action" value="change"/>
</form>
</body>

```

## 補足
・画像枚数が多いときはタイムアウトに注意(検証用の環境に画像を落としてから実行するなどしましょう)
・変換元がgit管理外の場合など、変換元が消失した場合に損害が出ることに備えて変換元とは別の場所に出力しています
tweepyを使ったtwitterデータ取得1



# twitterからデータ取得やってみる








## ■背景・目的
- 背景
    - Twitterを使ったデータ分析をやりたいものの、どのようなデータが取得できてるかわからないので、データ取得をまずやってみる




- 目的
    - まずはtweepyで実装して、以下を明らかにしたい
        - twitterのAPIを使って取得したデータはどのような形式か←今回はここ
        - API取得したデータの前処理方法
        - 加工データを使ったデータ分析







 
## ■nikeとadidasという単語を含むツイートを保存する 
```python:twitter_api1.py
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream

#twitter apiの認証情報を別ファイルに保存し、インポートする
import get_data.twitter_credentials as credentials
# リスナーと認証オブジェクトを生成し、Streamオブジェクトに渡してあげると、ツイートを読み込める
class TwitterStreamer():
    """
    ライブのツイートをストリーム処理するクラス
    """
    def __init__(self):
        pass


    def stream_tweets(self,fetched_tweets_filename,hash_tag_list):
    # This handles Twitter authentication and the connection to the Twitter Streaming API
        listener = StdOutListener(fetched_tweets_filename)
        auth = OAuthHandler(credentials.consumer_key, credentials.consumer_secret)
        auth.set_access_token(credentials.Access_token, credentials.Access_secret)
        stream = Stream(auth, listener)
        stream.filter(track=hash_tag_list)



#streamListenerを継承して、新たにリスナーオブジェクトを作成
class StdOutListener(StreamListener):
    """
    基本のリスナークラス：受け取ったツイートをそのまま出力する
    """
    def __init__(self,fetched_tweets_filename):
        self.fetched_tweets_filename=fetched_tweets_filename


    def on_data(self,data):
        try:
            print(data)
            with open(self.fetched_tweets_filename,'a') as tf:
                tf.write(data)
            return True
        except BaseException as e:
            print("Eror on data: &s" % str(e))
        return True

        print(data)
        return True

    def on_error(self, status):
        print(status)

if __name__ =="__main__":
    hash_tag_list=["nike","adidas"]
    fetched_tweets_filename="tweets.json"


    twitter_streamer=TwitterStreamer()
    twitter_streamer.stream_tweets(fetched_tweets_filename,hash_tag_list)```
  
```python:twitter_credentials.py
#token取得方法は参考リンクを確認
consumer_key="コンシューマーキー"
consumer_secret="コンシューマー秘密"

Access_token="アクセストークン"
Access_secret="アクセスシークレット"

```

##

## ■わかったこと
- Streamクラスにauthとlistnerを突っ込み、streamオブジェクトでツイートストリームを取れる。（日本語の単語だとなぜか遅いけどなんで？）
- JSONで値が返ってくるので、JSONの前処理してから、データ分析する流れになりそう


## ■疑問、課題点
-　いまのところなし
 
## ■改善点


## ■参考
-  参考動画
    - https://www.youtube.com/watch?v=wlnx-7cm4Gg


- トークン取得
    - http://kageura.hatenadiary.jp/entry/2018/01/02/Twitter%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E7%AD%89%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95%E3%81%A8Direct%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8
DjangoでImageFieldに画像をプログラムから追加する

DjangoのImagefieldに画像をフォームではなくプログラムから追加してみようとおもって詰まったのでメモ

用意するモデルはこんな感じ

```python
class Picture(models.Model):
    image = models.ImageField(upload_to='hoge')
```
こいつに画像。例えばサーバー上に既にある画像とかを紐づける

```python
from django.core.files import File

img = Picture()
img.image.save('file_name',File(open('file_path','rb')))
```

あんまよくわかってないけどとりあえずできたのでよし....
何か良くない部分があればご指摘していただけると嬉しいです
AWS ソリューションアーキテクト-アソシエイトに約1週間で合格した話

AWS認定ソリューションアーキテクト-アソシエイト（以下、SAA）に合格したので、何か残しておこうかと思い記事にしてみました。
正直この手の記事はあちこちにあり、個々の事前知識量や実業務での利用有無などにより万人にベストなものというのは存在しないと思うので、あくまでこれから受験する方や興味のある方が参考にする資料の選定に役立てばいいかなという程度です。

インフラ系の経歴
-
- 趣味程度でPythonをちょっと触れるくらいで業務での開発経験は無し。
- オンプレでLinuxサーバー数台、ルーターの設定を1年前くらいに初めて構築。
- AWSは上記と同じくらいの時期に単純構成のVPC、サブネット、EC2を興味で構築。
- AzureやGCPも上記のちょっと後に似たような構成で構築（業務半分、趣味半分）。
- どんなものかとクラウドプラクティショナー（以下、CP）の試験を受ける為に1ヶ月ほど勉強し、去年12月に受験するも不合格。（後で確認したところ、あと1問正解で合格だったんじゃないかという状態だった）
- 業務でAWSのcodeシリーズを使用したCI/CD環境の構築構築を約4ヶ月実施。

受験するに至った経緯
-
委託先からせっかくAWSを触っているし、実績がないから資格取っといたほうがいいんじゃない？ということで、以前にCPをあと少しというところだったこともあり、リベンジすることに。

それが数日後にCPは持ってても仕方ない、業務に最低必要なのはSAAだからそっち取りなさい、1ヶ月で。
ということになり、正直取れる自信はなかったがそちらを受験することに。

更に数日後、委託先からSAAはちょっと無理っぽいからCPまず取って、それからSAA取ったらということに。でもSAAの期限は前と変わらず1ヶ月後ね。

ということで最終的にCPとSAAどちらも受験することに。
しかも初めに設定された日付まで時間がなくなっていたので、2週連続で受験することに。

参考にした資料
-
 **CP**
去年の12月に受験した際は試験対策書籍がなく、公式のトレーニングで動画を見たりホワイトペーパーを読むしかなかったが、今回改めて探してみるといくつか書籍があったので、その中で下記を電子書籍で購入し通勤時などに読んだ。
Codeシリーズを利用したCI/CD環境の構築をしていたこともあってか、以前に比べると全体を理解できていて、小テストも難しいと感じることなく解けていた。

「AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー」
https://www.sbcr.jp/product/4797397406/

CP再受験についてはこれのみ。
公式の模擬試験もあるが、既に本試験も受けていて感覚は掴めているので不要と判断。

 **SAA**
CPの延長上にあるとはいえ短い時間の中で、しかもどういった事が問われるのかなどわかっていない状況で、たまたま見かけ藁にもすがる思いで購入したのがこちら。

「これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け21時間完全コース）」
https://www.udemy.com/aws-associate/

文章だけではなかなか頭に入らないので、動画なら希望あるかと。
更に期間限定で破格になっていたので即購入。
内容としては、SAAに最低限必要な知識の概要の説明とそれを実現する為に必要なサービスの構築のハンズオン、間々に小テストと模擬試験3回分という構成。
初心者が実務でもすぐに構築できるようにというのが強い感じで試験対策に使えるのは小テストと模擬試験かなというイメージ。
ハンズオン内での説明は言い回しや別に説明しなくてもとか、間違ってはいないだろうけど操作方法で気になるところが多々あり、手作り感満載です。

以下の書籍を別に受けて合格していた人がもっていたので借りてみました。

「徹底攻略 AWS認定ソリューションアーキテクト アソシエイト教科書」
https://book.impress.co.jp/books/1118101069

いわゆる黒本というやつらしいです。
CPの勉強中に軽く見てみましたが、CPで紹介した書籍とたいして内容が違わなかったので間にある小テストを実施したくらいでほぼ読まずに返却。
小テストもなんとなく理解できていたので、これはいけるかも？という希望が。

SAAはCP受験後あまり時間がなかったこともあり、公式の模擬試験は受けませんでした。

いざ受験
-
その前に、受験会場ですが「PSI」と「ピアソン」というところから選べるようになっていますが、PSIは基本平日のみ場所もあまり多くありません。土日に受験したくて比較的多くの場所から選択できるのはピアソンのようなので、いつどこで受けたいかによってどちらも確認してみるといいかと思います。

CPについては、前回より理解度が増していることもありある程度合格できそうな自信を持って回答できたこともあり、見直し含めて30分～40分ほどで終え無事に合格できました。

SAAについては、受験前までにサンプル問題によりレベルがバラバラだったこともありますが、そこそこいけるんじゃないかという気持ちもありました。
が、実際の問題はそれらの更に上を行くレベルの問題たちで、いくつかは全く聞いたことのないサービス名が出てきたりという状況で、途中申し込みしたレベル間違えたかな？と思うほどでした。
一通りを1時間ほどで終え、分からないながらもどこか問題の中にヒントがないかと時間ギリギリまで再チェック。
ドキドキでしたが「合格」の表記で肩の荷が降りた感じでした。
それにしてもあの合否結果画面もう少し変えてほしいなと。
ボタンポチポチしていってたらスルーしてしまいそうなところにひっそりとあるんですよね。

最後に。
-
選択式の試験であることで、わからなくてもどれか選択しておけばまぐれで正解になることもありますし、問題分に適切なサービスであったり設定を的確に知っておかなくてもなんとなくで合格できてしまいます。
自分自身勉強や問題集を解いていて、この資格が取れたからといって特に未経験者が実業務で活躍できるかというとそれは有り得ないと思っています。
ただ、実業務でAWSを利用していたり、これから仕事につく上で必要ということであれば、AWS上に存在する主要サービスを理解するいい機会になるはずです。
Rails[6.0] 1 つのコントローラーで 3 つ以上のレイアウトを使い分ける

# はじめに

1つのコントローラーでレイアウトを使い分ける方法はいくつかあります。
今回は**3つ以上**使い分ける場合の方法を記事にします。

# その 1.`layout`メソッドと`render`メソッドの`:layout`オプションを使う

コントローラー全体のレイアウトを指定したい場合は`layout`メソッドを使用します。
例えば、`app/views/layouts`内の`main`レイアウトを指定する場合のコードは以下のようになります。

```ruby
class UsersController < ApplicationController
  layout 'main' # コントローラー内の全てのアクションにmainレイアウトを指定する

  def index
  end

  def new
  end

  def show
  end

  def edit
  end
end
```

また、一部のアクションにのみ指定したい場合は`:except`,`:only`オプションが使えます。

```ruby
layout 'main', expect: :new # new以外にレイアウトを指定する
layout 'main', only: %i[show edit] # show, editにレイアウトを指定する
```

ただ、この`layout`メソッドは **複数記述されていると最後の`layout`メソッドのみ適応されます。**
なので下記のようなコードは期待通りに動きません。

```ruby
class UsersController < ApplicationController
  # indexにはmainレイアウト、show,editにはsubレイアウトを指定したいけど
  # 実際は
  # layout 'sub', only: %i[show edit]
  # しか適応されない!

  layout 'main', only: :index # mainレイアウトをindexに指定
  layout 'sub', only: %i[show edit] # subレイアウトはshow,editに指定

  def index
  end

  def new
  end

  def show
  end

  def edit
  end
end
```

この場合は`render`メソッドの`layout`オプションで、アクションごとにレイアウトを指定する方法も併用します。

```ruby
render layout: 'main'
```

このコードも合わせた、3つ以上のレイアウトを指定するコードは下記になります。

```ruby
class UsersController < ApplicationController
  layout 'sub', only: %i[show edit] # show,editにsubレイアウトを指定する

  def index
    render layout: 'main' # indexアクションにmainレイアウトを指定する
  end

  def new
  end

  def show
  end

  def edit
  end
end
```

# その 2.`layout`メソッドの引数にシンボルを渡す

先ほどの`layout`メソッドの引数にシンボルを渡すことで、シンボルで指定されたメソッドを呼び出せます。

```ruby
class UsersController < ApplicationController
  layout :switch_layout # switch_layoutメソッドを呼び出す

  def index
  end

  def new
  end

  def show
  end

  def edit
  end

  private

  # アクションと勘違いされないようにprivateメソッドとして定義する
  def switch_layout
    case action_name
    when 'new' then 'main'
    when 'show', 'edit' then 'sub'
    end
  end
end
```

この方法は実際にリクエストが処理されるまでレイアウトが確定しないのが特徴です。
なのでアクションに限らず、様々な条件でレイアウトを指定することができます。

# まとめ

個人的にはその2の方法がシンプルで改修もやり易いと感じました。

何か直すべき点、間違った記述があればコメント等で指摘していただければと思います。

# 参考文献

[Rails Controller で layout を複数呼び出す](https://qiita.com/oieioi/items/3d1a561c2e626506e82d)
https://railsguides.jp/layouts_and_rendering.html
Googleの新しいバージョンのAIY VisionとVoice Kitには、Raspberry Pi Zero WHが付属しています

Googleは、Raspberry Pi Zero WH SBCをバンドルしたAIY Voice Kit（50ドル）とAIY Vision Kit（90ドル）の新しいバージョンを発売しました。 GoogleはAIY Projects向けのAndroidアプリもリリースしました。

GoogleとTargetは、Raspberry Pi Zero WH SBCをバンドルした、音声ボイスエージェントと視覚ニューラルネットワーク処理開発向けのGoogleのAIYプロジェクトキットの更新された、より完全なバージョンを発売しました。 さらに、Googleの既存のAIYボイスキットとAIYビジョンキットのユーザーは、すべての新旧AIYキットで動作するAndroidコンパニオンアプリをダウンロードできるようになりました。

![微信截图_20190416134402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/d8fcbb16-d363-7d8c-bed4-9f9e629f4bed.png)

Googleの2018バージョンのAIY Voice Kit（左）とAIY Vision Kit,ここで入手できます: https://store.gravitylink.com/global

以前と同様に、50ドルのボイスキットを使用すると、音声制御のスピーカーを作成できます。90ドルのビジョンキットを使用すると、人や物の認識を学習するカメラを作成できます。キットには、それぞれGoogle AssistantとTensorFlowテクノロジーをサポートするHATボードが統合されています。

![rpi_zerowh-thm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/fe5f3667-c80d-8e79-0866-db740efb7af8.jpeg)

RPi Zero Wに加えて、新しいキットにはUSBケーブルと事前にプロビジョニングされたmicroSDカードが追加されています。更新されたAIY Vision Kitには、Raspberry Pi Camera v2もバンドルされています。

新しいキットには、Raspberry Pi ZeroおよびZero Wと同じ1GHz ARM11ベースのBroadcom BCM2836 SoCおよび512MB RAMが搭載されたRaspberry Pi Zero WH、および同じCypress CYW43438 802.11n / Bluetooth 4.0チップが搭載されています。 ZeroW。ZeroWHモデルは、プロトタイピングを容易にするためにはんだ付けされた40ピンGPIOヘッダーを追加する点が異なります。

![rpi_rpicam_v2-thm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/8db615cc-5f3a-8181-5942-1e2f3a6377ae.jpeg)


オリジナルの45ドルのAIYビジョンキットは、処理の多くがキットのVisionBonnet pHATボードにオフロードされていたため、RPi Zero Wでうまくいきました。 VisionBonnetには、IntelのMovidius Myriad 2 VPUプロセッサのバージョンであるMovidius MA2450が組み込まれています。 VisionBonnetでは、プロセッサはニューラルネットワーク用にGoogleのオープンソースTensorFlowマシンインテリジェンスライブラリを実行します。このチップは、最大30フレーム/秒の視覚認識処理を可能にします。

新しいビジョンキットには、RGBアーケードスタイルのボタン、ピエゾスピーカー、マクロ/ワイドレンズキット、段ボールの筐体を提供するオリジナルキットのすべてが含まれているようです。また、フレックスケーブル、スタンドオフ、三脚取り付けナット、接続コンポーネントも入手できます。

![微信截图_20190910110235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/61247fa5-e724-1fa9-6f37-091ddcbc744e.png)


新しいAIY Voice Kitには、同じVoice Bonnet HATとVoice HATステレオマイクボードが含まれているようです。 昨年5月に発表されたVoice Kitは、Google Assistant SDKとGoogle Cloud Speech APIへのアクセスを提供し、Googleの検索エンジンクラウドサービスにリンクされた音声応答とAI機能を備えたデバイスを有効にします。 キットはMagPi購読者に無料で送られ、現在20ドルで入手できます。 新しいキットには、同じ4Ωスピーカー、ワイヤ、マイクロスイッチ、アーケードボタンが含まれているようです。

![微信截图_20190910110221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/67839a17-6c2c-4f1a-aec3-51bbf8fdf98e.png)

新しいGoogle AIY Projects Androidアプリは、ワイヤレスのセットアップと構成を効率化します。 あるいは、モニター、キーボード、およびマウスでRaspberry Piを接続することもできます。 また、Googleは「近日公開予定」のiOSおよびChromeコンパニオンアプリにも取り組んでいます。

AIYのWebサイトは改善されたドキュメントで更新されました。これにより、「若いメーカーが構築を開始し、習得しやすくなります」とGoogleが言います。 このサイトには、AIYキットで動作するように設計されたニューラルネットワークのコレクションを紹介する新しいAIYモデルエリアが含まれています。 さらに、開発者は特別なAIY Projects Hackster.ioサイトにアクセスできます。
AWS 無料枠だからって安心しないで..

#はじめに
新卒2年目。アプリ側の開発ばっかりに着手してきたため、
>自分「基盤側の知識もちゃんと付けないとなぁ。」

という風に思い、最近流行りのAWSでクラウド無料枠(12ヵ月間)の存在を知り、無料だから色々使ったろ！と何も考えずAWSのサービスを使用し、気づかぬ間に<b>利用料金の請求されてしまった情けないお話です。
<br>
#無料枠だから無制限に使えるわけではない！！
私はAWSを使いだした当初無料枠のことを、**12ヵ月間何しても無料ですよ！！**と勘違いしていました。恥ずかしい。


料金の請求された後に公式ページを調べたところ、AWS側が無料で提供しているサービスはいくつかに限定され、その中でもこの範囲内の利用なら無料で提供するよー。というものでした。以下リンクの無料枠の詳細に記載されています。

**<p><a href="https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc">AWS クラウド無料利用枠</a>**
![無料枠.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491964/c78c3d04-d871-c465-7016-11b8db8e58b8.png)


#実際にAWSに~~カモられた~~請求された料金

**$0.57**が現時点で支払いが確定している金額です。(2019/09/**時点)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491964/06797bb2-dd3b-2884-4690-e8734ea35b3a.png)

料金的にはこれくらいなら全然構わないのですが、無料枠なのに料金を発生させてしまったことに対して抵抗は感じてしまいました。そして利用料の内訳ですが明細を見ると

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491964/c6a30a3e-27d8-c773-c0c9-acad0a75cfb8.png)

どうやらRoute53が割合が一番高いみたいですね。先ほど載せた無料枠の詳細ページで検索してみると

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491964/74d7c10c-fcc2-fee1-8e6b-5f61bb50841f.png)

チーン..。
Route53の料金表を見ると、ホストゾーンごとに 0.50 USD/月かかる料金体制になっていました。ちゃんと事前に調べないとダメですね。

#さいごに
これからAWSを実際に動かしながら勉強したい！と思っている方も多くいると思っているので、無料枠を作成してAWSのサービスを使用する際には事前に使用するサービスが無料枠の対象か、対象外ならどのくらいの料金が発生するのかを調べておくことを推奨します。**~~やっぱり一緒にカモられましょう。~~**
Laravelマルチ認証でセッション用テーブル、設定を分ける(Laravel6で確認済み)

Laravelの**マルチ認証**で、デフォルトのユーザ認証と管理画面用認証を実装したとします。
マルチ認証自体の実装については他の方がたくさん書いております。

セッションに関する設定、例えば

- セッションＩＤを保存するときのクッキー名称
- セッションを保存するテーブル名称
- セッションのlifetime

などは
`config/session.php`
にまとめて記載されており、１つしか設定をかけません。

管理画面のセッション有効期限は変えたい、セッションテーブルは分けたい・・
などの要件もあると思います。

ここでは**デフォルトのユーザ認証**と追加で実装した**管理画面用認証**が別々のセッションテーブルを利用するようにしてみます。

## 環境
Laravel6.0.0
MySQL5.7
XAMPP7.2.17

## 方針
管理用のＵＲＬパターン
/admin～
の場合だけ、セッションの設定を上書きして実行する

## 手順

### 上書きするConfig設定内容
1. session.cookie （セッションIDを保管するクッキー名称）
2. session.table　（セッション情報が格納されるテーブル名称）

### .envへ設定値の追加
環境毎に設定するもなので、まずは.envファイルに設定したい値を定義していきます。

```:.env
SESSION_COOKIE_ADMIN=auth-admin
SESSION_TABLE_ADMIN=sessions_admin
```

### configファイルへの追記
configディレクトリに何でもよいので自分の設定用としてphpファイルを作成します。
`config/const.php`

```php:config/const.php
return[
    // 管理画面用のクッキー名称、セッションテーブル名
    'session_cookie_admin' => env('SESSION_COOKIE_ADMIN', Str::slug(env('APP_NAME', 'laravel'), '_').'_session'),
    'ssession_table_admin' => env('SESSION_TABLE_ADMIN'),
]
```

### 設定ファイルをキャッシュ
私の場合、設定ファイルを変更した場合は必ずキャッシュしているので今回もキャッシュしておきます。
`php artisan config:cache`

これで設定値の定義自体は完了しました。次は具体的にどのように設定を上書きしていくかです。

### 設定を上書きする
修正対象ファイルは
`app\Providers\AppServiceProvider.php`

boot()メソッドに以下を追記する

```php:app\Providers\AppServiceProvider.php
    public function boot()
    {
        // 管理画面用のクッキー名称、セッションテーブル名を変更する
        $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
        if (strpos($uri, '/admin/') === 0 || $uri === '/admin') {
            config([
                'session.cookie' => config('const.session_cookie_admin'),
                'session.table' => config('const.ssession_table_admin'),
            ]);
        }
    }
```

これで/admin以下へのアクセス時にセッションを利用する場合には上書きした設定値が採用されるはずです。

### ポイント
* session.phpについて
    * config/session.phpの中にif文を書ければ早いが・・。config:cacheで設定をキャッシュするとこのif文は実行されない。
    * （厳密にいうとconfig:chaceを実行した瞬間だけ実行される。意味なし）
    * なので、この設定ファイルに書くのは得策ではなさそう。
* 上書きを実行する場所について
    * コントローラ側での上書きでは順番的に遅いのでapp\Providers\AppServiceProvider.phpで始めに上書きしました。
    * 設定値の読み出しにはenv関数ではなく、config関数を使います。設定をキャッシュしている場合、env関数はnullを返すからです。

#### 参考
https://qiita.com/PKunito/items/a8300db38ce7d6949106
Android Studioバージョン毎のインストール@Ubuntu

Androidアプリ開発でAndroid Gradle Pluginの最新バージョンを試してみたいときあると思います。  
でも現行バージョンも残してやりたいって場合、複数のAndroid Studioを共存できます！

ここから最新のAndroid Studioをダウンロード
https://developer.android.com/studio/?hl=ja

使っているOSで自動でインストール形式が判定されるはず。
Linuxはtarですね。

ダウンロードして適当な場所に置きます。
私は以下にバージョン毎に置いています。

```
/opt
```

tarを解凍します。

```
$ tar xzvf android-studio-ide-191.5791312-linux.tar.gz
```

`android-studio` というディレクトリー名で解凍されますが、バージョン毎に管理したいので、`android-studio35`とかに変更しておきます。

`android-studio/bin/studio.sh`を実行すれば、Android Studio起動しますが、ランチャーから起動できるように登録していきます。

いろいろ設定方法あるみたいですが、私は以下の場所に.desktopファイルを置いています。

```
/home/higekick/.local/share/applications/android-studio.desktop
```
中身はこんな感じです。

```
higekick@x1-cbn:~/.local/share/applications$ cat android-studio35.desktop 
[Desktop Entry]
Version=1.0
Type=Application
Name=android-studio35
Comment=This is android studio3.5
Icon=/opt/android-studio35/bin/studio.png
Exec=/opt/android-studio35/bin/studio.sh
Path=
Terminal=false
StartupNotify=false
Categories=
```
`opt`以下に置いた各ファイルのパスを設定します。たいてい前のバージョンの.desktopを作っておけば毎回コピーしてバージョンの部分を変更するだけです。

これでランチャーから起動できるようになるはずです。
前のバージョンと区別できるように、`/opt/android-studio35/bin/studio.png`のアイコンにこんな感じでバージョンを書いたりしています。
![studio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152641/3cd1c186-53bf-b1bf-5828-9928d84246bf.png)
DockerでWagtail開発環境構築

こんにちは！
現在インターン中の大学三回生です。
今回はDockerでWagtailの開発環境？を構築する方法を紹介します。

##ファイル・ディレクトリの準備
まず、ファイルとディレクトリの準備をしましょう。
一つディレクトリを作成してそのなかに以下の３つのファイルを作ってください。
`Dockerfile`
`docker-compose.yml`
`requirements.txt`
以上を完了すると以下のような状態になります。

```
.
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

```
そしてファイルの中身を以下のように書いていきます

###Dockerfile
```
FROM python:3
 ENV PYTHONUNBUFFERED 1
 RUN mkdir /code
 WORKDIR /code
 ADD requirements.txt /code/
 RUN pip install -r requirements.txt
 ADD . /code/
```
###docker-compose.yml
```
version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    stdin_open: true
    tty: true
    depends_on:
      - db
```
###requirements.txt
```
wagtail
psycopg2    
```

##Dockerコンテナを起動させて開発環境構築
はい、上記に書いたことまた、今から書くことはコピペなので全然わからないです。笑
とりあえず書いていきます！

1.  `docker-compose up -d`でコンテナを起動させます。
2.  `sudo docker exec -i -t コンテナ名 bash`でコンテナの中に入ります。
3.  `wagtail start mysite`でmysiteというプロジェクトが作成されます。
4.  `python manage.py migrate`でデフォルトのデータベースを作成できます。
5.  `python manage.py createsuperuser`でスーパーユーザーを作ります。
6.  `python manage.py runserver 0.0.0.0:8000`で開発用のサーバーを立ち上げて完了です。

http://localhost:8000

にアクセスすると以下のような画面になります。
![Screenshot from 2019-09-02 17-41-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348284/f3a2e0bd-a4a2-d220-4ef2-194840a2c950.png)

最後まで読んでいただきありがとうございます。
今回の内容は参考文献に乗せているものをそのまま書いただけなので参考文献もぜひみてください。

##参考文献
　[docker-wagtail](https://github.com/kevinhowbrook/docker-wagtail)
Pythonでループ内の最大値を求める場合の速度比較[if, max, list, set, numpy]

# はじめに
Project Eulerの問題を解いていると、ある条件下で答えが最大となるものを解答することが多いと感じました。
大体forやwhileのループで回した中で最大を出すのですが、毎ループごとにifで比較するのとlistなどに追加して最後にmax()で最大値を取得するのどっちが早いのだろうと疑問に思ったので試してみました。

# 試したもの

- ループごとにifで判定する
- ループごとにmax()で判定する
- listに追加していき、ループ後にmax()
- setに追加していき、ループ後にmax()
- numpy.ndarrayにnumpy.appendで追加していき、ループ後にmax()

追記：numpy.appendはこれまでlist.appendと同じように使ってしまっていた自分への戒めとして計測してみました。

# 条件
`for i in range(10 ** 8):`で1億回ループを行い、最も大きいiを判定(答えは9999999)

```Python
def testA():
    # ループごとにifで大小比較
    max_num = 0
    for i in range(10 ** 8):
        if max_num < i:
            max_num = i
    #print(max_num)

def testB():
    # ループごとにmaxで大小比較
    max_num = 0
    for i in range(10 ** 8):
        max_num = max(max_num, i)
    #print(max_num)

def testC():
    # listにappendその後max判定
    ls = []
    for i in range(10 ** 8):
        ls.append(i)
    max(ls)

def testD():
    # numpy.ndarrayにappendその後max判定
    # このやり方は非常に問題のあるやり方なので普通は使わない
    arr = np.empty((0,))
    for i in range(10 ** 5):
        arr = np.append(arr, i)
    np.max(arr)
    #print(np.max(arr))

def testE():
    # setにaddその後max判定
    st = set()
    for i in range(10 ** 8):
        st.add(i)
    max(st)
    #print(max(st))
``` 

setやnumpy.ndarrayも同様に。
**numpy.appendを使ったtestDは不適切な例として作成しました。**

# 結果
結果としてループごとにif文で判定が最速、次点でlistとなりました。

| 条件              |       実行時間     |
|:-----------------|------------------:|
| ifで判定          |           7.894秒 |
| maxで判定         |          19.869秒 |
| list             |          12.700秒 |
| set              |          23.937秒 |
| numpy.ndarray    | 10**6でも600秒以上 |

# 考察
個人的に、今回の結果で少し意外だった点は`ifの代わりにmaxで判定を行うとlist.append()より遅い`ということです。
理由としては、maxは引数に配列を与えても最大値を取り出せますが、その分単純な2値の比較では無駄が多いということが考えられます。
また、`setがlistの倍近く遅い`ということもわかりました。これはlistへの要素追加が末尾に追加するだけであるのに対し、setでは重複しないように処理する必要があるからなのではないかと考えます。
よく言われていることですが、`numpy.append()は他の方法とは比較にならないほど遅い`ということが改めてわかりました。長さが変わる配列を扱う場合には一度listに変換したほうが良いでしょう。

# 結語

- ループ内での最大値を求めるにはifが早い。
- 2値の比較ではmax()は使わない。
- numpy.appendは使わない。appendするならlistに変換。

以前のコードでは対して気にせずnumpy.append()を多用していましたが、今後は気をつけていこうと思います。
もしifより早い方法があればご教授願います。
`return "エラーメッセージ"` はやめてくれ

戻り値としてエラーメッセージを返す関数・メソッドはやめてください。

例えば、こんなファイルの内容をチェックする関数です。

```ruby
# ファイルの内容が正しいかチェックする関数
def check_file_format(path)
  return 'ファイルが存在しません' unless File.exist?(path)
  contents = File.read(path)
  return 'ファイルが長すぎます' if contents.lines.size > 500
  return 'シバンを書いてください' if contents.lines.first.starts_with('#!')
  return '行末に空白があります' if contents.lines.any? { |l| l.ends_with?(' \n') }
  # 以下チェックが続く
end

# 関数を使う側（WEB版）
class FileController < ApplicationController
  def check
    @error_message = check_file_format(params[:path])
  end
end

# 関数を使う側（CLI版）
def main
  error_message = check_file_format(params[:path])
  puts(error_message)
end
```

こういった関数は、以下のような要望が出てきた時点で破綻します。

> 「ファイルが長すぎます」と指摘されて直した後、「行末に空白があります」と指摘されるのは面倒です。初めから両方を出すことはできませんか？

戻り値を「エラーメッセージ」から、「エラーメッセージのリスト」に変えればいいって？ ええ、あなたがこの関数を呼び出している、２００か所を全部直してくれるなら。

# どうするべきだったのか？

エラーメッセージは、生文字列ではなく、クラスでラップして返しましょう。
クラスになっていれば、コンストラクタの引数を増やしたり、メソッドを足したりして、将来の変更に耐えることができます。

```ruby
class Result
  def initialize(message)
    @nessage = message
  end

  def message
    @message
  end
end

def check_file_format(path)
  return Result.new('ファイルが存在しません') unless File.exist?(path)
  contents = File.read(path)
  return Result.new('ファイルが長すぎます') if contents.lines.size > 500
  return Result.new('シバンを書いてください') if contents.lines.first.starts_with('#!')
  return Result.new('行末に空白があります') if contents.lines.any? { |l| l.ends_with?(' \n') }
  # 以下チェックが続く
end
```
PHP 文字列

##指定した文字で分割
```php
explode(分割文字,文字列);

```
##一文字ずつ分割
```php
str_split ( 分割対象文字列) ;

```

##文字の切り取り
```php
substr(文字列, 開始位置, 切り取る長さ);

```

##置き換え
```php
str_replace(置き換え前文字,置き換え後,文字列);

```
##文字検索
```php
strpos(文字列,検索文字);
//見つからない場合はfalse
//検索だけならif( strpos() !==false)を使用
//見つかった場合は対象位置を数字で返す
```
PHP 配列

##配列の作成
```php
変数　=array(要素,要素,要素);
変数　=[要素,要素,要素];
```

##配列の追加
```php
配列名[] = 値
```
##配列の出力
```php
print_r(配列名);
```

##配列の要素を削除
```php
unset(配列名[要素数]);　
```
##要素の数を数える
```php
count(配列名);　
```

#指定した要素で埋める
```php
array_fill(最初のindex,要素数,値);　
```

##連想配列の作成
```php
変数　=array(キー名1=>値1,
           キー名2=>値2,
           キー名3=>値3);
```

##２次元配列の作成
```php
変数　=array(配列1,配列2,配列3);
```
Kubernatesのダッシュボードをローカル環境に導入

# ダウンロード

```bash

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
```

# 起動

```
$ kubectl proxy
Starting to serve on 127.0.0.1:8001
```

ブラウザでアクセス
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/


# トークンを調べる

```bash

$ kubectl -n kube-system get secret
NAME                                             TYPE                                  DATA   AGE
deployment-controller-token-9b4gr                kubernetes.io/service-account-token   3      56m


// deployment-controller-token-xxxxを表示させる
$ kubectl -n kube-system describe secret deployment-controller-token-9b4gr
Name:         deployment-controller-token-9b4gr
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: deployment-controller
              kubernetes.io/service-account.uid: 590984b7-xxxx-xxxx-xxxx-xxxxxxxxxx

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9
// これがトークン
```
Chat Botを作ってみる2

今度はIntentを使って、よりAIっぽいチャットボットを作る。

#スキルの作成
これは前回と同じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/1ee66f69-d289-541f-7dd8-09b342083ca3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/ac14ba50-fd2b-8ab2-127b-8b0e45f31b15.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/badce2ba-8a4d-6e5d-0490-71da6d55caa7.png)

#Intentの作成
Entityは登録したワードしか判断しないけど、Intentは登録したワードを基に入力した文章を解釈してくれるらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/a85dc91e-ff41-7b85-1194-8d7d1011fc7c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/3df9f6be-4da4-580a-5073-0560780a522e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/c89c3a0c-386f-0c06-6801-99845529c79d.png)
ここでは予約に関するワードを複数登録する。
関連するワードを10個以上（目安）登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/82658d5f-91c3-9af6-f1e3-6468b728ab95.png)
同様に、購入に関するIntentも作成した。

#返答（Dialog）の作成
Entityとほぼ同様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/65be9435-3bf5-a437-f8b8-097d8f975cca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/5d5fc8de-d1c6-6e44-1edf-a34cf2a26a8e.png)

#結果の確認
簡単に作ってみたけど、思ったよりもちゃんと判別してくれいる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/d2eacd1e-da08-9f99-15d0-1db42ebba8a9.png)
laravel eloquent withでソートしたい時

初心者が書いた記事ですので、ご容赦ください。

### 結論
一度、普通に取得して、collectionのsortBy()を使用すればできます。

### 前提
いい例が思いつきませんが。hasOneとbelongToの関係のものがあるとします。
仮に `boyfrindsテーブル` と `girlfrindsテーブル` とします。
それぞれ `nameカラム` を持っております。

model側でリレーションシップは設定してあるとします。

### 実現したいこと
`boyfrinds` を `girlfrinds.name` でソートして取得したい

### 始めにやったこと（上手くいきませんでした）

```php
$boyfrinds = Boyfrind::where('boyfrind_id', $boyfrind_id)
    ->with('girlfrind')
    ->orderBy('girlfrind.name', 'asc')
    ->get();
```

### 解決しました
```php
$boyfrinds = Boyfrind::where('boyfrind_id', $boyfrind_id)
    ->with('girlfrind')
    ->get();

$boyfrinds = $boyfrinds->sortBy('girlfrind.name')->values();
```

参考
https://laravel.com/docs/6.0/collections#method-sortby
MySQL8にJavaで接続する

# はじめに
今かかわっている仕事で、Java7→Java11、MySQL5.5→MySQL8.0に変更することになったのでそのためのメモです。

# ドライバを入手する
Mavenリポジトリから、8.xのものを選んで取得してください。

https://mvnrepository.com/artifact/mysql/mysql-connector-java

私はGradleなので、以下の通り書き換えました。

```gradle
    implementation  "mysql:mysql-connector-java:8.0.17"
```

# ドライバ名の変更

変更前：com.mysql.jdbc.Driver
変更後：com.mysql.cj.jdbc.Driver

# URL

変更前：jdbc:mysql://localhost:3306/test
変更後：jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9&rewriteBatchedStatements=true

まだちゃんと理解できてませんが、いろいろと後ろに追加する必要があるようです。
serverTimezone=GMT%2B9は日本のタイムゾーン「GMT+9」を指定するようですね。

# 最後に
いろいろ変更が多すぎて大変です・・・
phpstormってデフォルトで矩形選択できるんだ

今まで矩形選択でテキストのフォーマットを整形する時は
Windowsの時はサクラエディタ
Macの時はAtomでプラグイン入れて
という感じでやってました。

が、
phpstorm触ってたら普通にデフォルトで矩形選択できるんだ！？と気づきました。
のでメモです。

![スクリーンショット 2019-09-10 11.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/63c0b30f-fcef-93d9-2802-a60dc4d69490.png)

矩形選択した箇所で
「Option」キー（Macの場合）を押しながらカーソル移動
で矩形選択モード状態になります。
（Windowsの時はAltキー）
![スクリーンショット 2019-09-10 11.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/2bcbcb99-3db1-a568-6848-93d54067a0bb.png)
あとは入力・削除など調整するだけ
![スクリーンショット 2019-09-10 11.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/ae32c584-92a7-c261-acfa-a764c8680f09.png)

Escキーで矩形選択を解除できます。
acrodistをコマンドラインで使う

```
acrodist /j "C:\Program Files (x86)\Adobe\Acrobat 8.0\Acrobat\Settings\PDFX1a 2001 JPN.joboptions" /f c:\Users\ユーザー名\Desktop\aaa.eps
```
/J　ジョブオプション（フルパス）
/f　ファイル指定（フルパス）
Splunkのダッシュボード内にフリーコメント用のメモパネルを作る

ダッシュボード内にフリーコメント欄を作成したくなったら
---
- simpleXMLのままパネルにてフリーコメントを作成
- htmlコンバートしなくても良い→**簡単**


How to
---
以下のようなxmlをダッシュボードに記述して保存

```xml:sample.xml
<dashboard>
  <label>test</label>
    <row>
    <panel>
        <html>
        <p>フリーコメント</p>
        <ul>
          <li>パネルの中に"＜html＞、＜/html＞"で囲ってあげれば、html codeで記載ができる</li>
          <li>簡単なメモ程度にもってこい</li>
          <li>Splunk標準のsimpleXMLからhtmlコンバートしなくても書けて楽</li>
        </ul>
      </html>
    </panel>
  </row>
</dashboard>
```

こうなる
----
<img width="1068" alt="スクリーンショット 2019-09-10 11.05.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/18894d97-dd4c-ba1f-0899-d235215538cd.png">

サーチ結果のパネルと並べるとこんな感じ
---
<img width="1505" alt="スクリーンショット 2019-09-10 11.09.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/18f69e7a-f233-724d-8a70-e3403922ade3.png">
バッチファイルにドラッグアンドドロップした時のファイル名の扱い方

%1でファイル名を取得
%~n1で拡張子より前のファイル名を取得
%~p1は上記の%~n1にパスを含む

例）拡張子をdatに変更するコマンド

```
rename %1 %~n1.dat
```

例）epsやpsファイルをpdfに変換するコマンド

```
gswin32c -dNOPAUSE -dBATCH -dEPSCrop -sDEVICE=pdfwrite -sProcessColorModel=DeviceCMYK -dPDFSETTINGS=/prepress -sOutputFile=%~p1.pdf -f %1
```
参考サイト】
【Windows】[バッチファイルの引数 at softelメモ](https://www.softel.co.jp/blogs/tech/archives/2140)

複数ファイルをバッチファイルにドラッグアンドドロップの場合

```
@echo off
for %%f in (%*) do (
gswin32c -dNOPAUSE -dBATCH -dGraphicsAlphaBits=4 -dEPSCrop -sDEVICE=jpeg -r500 -sOutputFile=%%~pnf.jpg -f %%~pnxf
)
```
【参考サイト】
[ドラッグ＆ドロップでファイル名を取得する | 初心者SEのとりあえずメモ日記](https://memo.morelents.com/batch-drag-drop/)
メモ：Deviseのメールの認証トークンの長さを変更する

この記事は
===

* Deviseの超細かい小技のメモです

やりたかったこと
===

* Deviseにはユーザ仮登録メールやパスワード再発行メールを送信する機能があります（ConfirmableとかRememberableとか）
* これらのメールには認証トークン付きのリンクが記載されていて、これをクリックすることで本人確認が実施される構成になっています
* やりたかったのは、セキュリティのレギュレーション上、この認証トークンの長さを32文字にしたかったです
    * デフォルトは20文字

対応方法
===

* 色々調べましたが設定はありません
* [この辺](https://github.com/plataformatec/devise/blob/master/lib/devise.rb#L496)のメソッドで文字列生成されています
* 仕方がないのでモンキーパッチ当てて解決しました

```ruby:config/initializers/devise_ext.rb
module Devise
  def self.friendly_token(length = 32)
    # To calculate real characters, we must perform this operation.
    # See SecureRandom.urlsafe_base64
    rlength = (length * 3) / 4
    SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')
  end
end
```

終わりに
===

* せっかくパラメータをオプションにしてるんだから、どこかで設定できるようにしてほしいなー
GhostscriptでFontをOutline化してPDF保存する

```
gswin32c -dNOPAUSE -dBATCH -dNoOutputFonts -dEPSCrop -sDEVICE=pdfwrite -dPDFX -sProcessColorModel=DeviceCMYK -dPDFSETTINGS=/prepress -sOutputFile=sample.pdf -f sample.eps
```

dNoOutputFonts を付ければいいっぽい
Renovateの設定ファイルの書き方が正しいか確認する方法

`renovate.json`の書式が[Renovateの設定書式](https://docs.renovatebot.com/configuration-options/)に則っているか確認（いわゆるValidation）するには、設定ファイルが含まれる開発ディレクトリで以下のコマンドを実行します。

```
$ npx --package renovate -c 'renovate-config-validator'
```

`npx`による実行なので、`renovate`パッケージのインストールは不要です。

書式に問題がなければ以下のように確認した設定ファイルパスと`OK`が表示されます。

```
Validating .github/renovate.json
Validating config.js
OK
```

誤りがあれば、以下のようにどの設定ファイルのどの部分にエラーがあるか表示されます。

```
Validating .github/renovate.json
.github/renovate.json contains errors:

[
  {
    "depName": "Configuration Error",
    "message": "Invalid configuration option: mui"
  }
]
```

これらを実行したコマンド・パッケージのバージョンは以下のとおりです。

```
$ node --version
v10.16.0
$ npx --version
6.9.0
$ npm view renovate
renovate@19.40.2 | AGPL-3.0 | deps: 61 | versions: 3249
```