OmniAICreator/Qiita-1.07M huggingface dataset:
新年あけましておめでとうございます。


# 2020年、新年あけましておめでとうございます。
仕事が忙しく、なかなか更新できなかったのですがアウトプットがとても大事ということが最近痛感し始めてきたのでブログやSNSやLTを頑張る一年にしたいと思います。



## どうでも良い報告ですが、統計検定2級に受かりました。


やった勉強法としては最新の公式問題集3週、東京大学出版の統計学入門をぼろぼろになるまで読みました。
ただ実際に手を動かして計算をしたほうが覚えが早かったかなと言う印象です。

PBTで一回落ちて、CBTで受かりました。
ただ、CBTは過去問が多い印象だと聞いていたので、2012年からの過去問を2周くらいときました。

基本的にはPBTのほうが簡単な印象を持ったので、PBTを狙って、CBTを受けるならメルカリ等で2012年からの問題集を購入したほうがいいかな。
という感じです！

前年度の報告はNDAが許す限りまだまだしたいことや共有したいことがたくさんあるのですが、仕事関係なく自分が楽しいことを追求して共有したいなとも、また今年もよろしくおねがいします！
GitHubにpush出来なくなった Permission denied（SSH key パーミッションエラー 　）解決法

AWS の構築中に本来はサーバーでの作業を、（タイムエラーに気がつかず？）
間違えてローカルで設定変更をしてしまったようで、
後に 
####ローカルからいつも通り　git push　してパーミッションエラーとなった。以下解決方法の１つを残す。####

---


```.ssh/config
$ git push -u origin master　　実行後↓パーミッショエラー内容

　git@github.com: Permission denied (publickey).
　fatal: Could not read from remote repository. ...

```

##＜今回の解決方法＞##

GitHub にて設定済みの　SSH keys に関する（つまりrsa.pemのcat/中身）　rsaキーをローカルに設定し直す。
（★GitHub　> settings > [SSH and GPG keys]をクリックして設定したSSHキー）

<img width="263" alt="スクリーンショット 2020-01-11 23.54.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/f8d600ab-201e-6f20-4db2-2f57eec929d9.png">


①ローカルにて、　.SSH フォルダに★とペアとなる _rsa　ファイルがあるのを確認。
　
②ローカルにて、　.SSH フォルダ > config に下記を記載

```
Host github.com
      HostName        github.com
      IdentityFile    ~/.ssh/GitHubに設定したキーと同じファイルの_rsa  　←  ここだけ各自変更
      User            git



例
Host github.com
      HostName        github.com
      IdentityFile    ~/.ssh/githubkye_rsa   　　　
      User            git

```


＜接続確認＞

```
＄ ssh -T git@github.co
　
  Hi 自分のgithubユーザー名! You've successfully ....

```
設定完了。これでpush可能。
code-server オンライン環境篇 (7) git 上のcompose を EC2上に展開する



目次
[ローカル環境篇 1日目](https://qiita.com/kyorohiro/items/35bab591cd4a6b975c80) 
[オンライン環境篇 1日目 作業環境を整備する](https://qiita.com/kyorohiro/items/603d6ee693fc2300079e)

[オンライン環境篇 2日目 仮想ネットワークを作成する](https://qiita.com/kyorohiro/items/6f2452ec2a2fe3640979)

[オンライン環境篇 3日目 Boto3 で EC2 インスタンスを立ち上げる](https://qiita.com/kyorohiro/items/32c9b7f9ebfccbeb6ac5)

[オンライン環境篇 4日目 Code-Serverをクラウドで動かしてみる](https://qiita.com/kyorohiro/items/3701fc97f61e94c5ba95)

[オンライン環境篇 5日目 Docker 上で、code-server を立ち上げる](https://qiita.com/kyorohiro/items/ad9d5ac702bdebf93ad0)

[オンライン環境篇 6日目 自動化してみよう](https://qiita.com/kyorohiro/items/50e27fd170e377d7d9db)

[オンライン環境篇 7日目 git 上のcompose を EC2上に展開する](https://qiita.com/kyorohiro/items/d11d75a0207857497cc7)

...
オンライン篇 .. Coomposeファイルで構築

オンライン篇 .. K8Sを試してみる

...

魔改造篇 


# はじめに

前回までで、Docker を利用して、EC Instance 上に Code-Serverを立ち上げることができるようになりました。

今回は、github 上に、compose file から、EC2 Instance に立ち上げるまでをやってみます。

- 作成
- 停止
- 再開
- 削除
- 情報取得


新規の知識はないので、茶々っと作ってみてください。
汚くて良いと思います。

# 成果物例
https://github.com/kyorohiro/advent-2019-code-server/tree/master/app/docker_image_uploader_for_ec2

```
$ git clone https://github.com/kyorohiro/advent-2019-code-server.git
$ cd advent-2019-code-server/remote_cs04/
$ docker-compose build
$ docker-compose up -d
```

ブラウザで、`http://127.0.0.1:8443/` を開く。

<img width="1211" alt="Screen Shot 2019-12-24 at 0.39.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/dc06b338-2af1-a5cd-f594-4d9ca26a8a7e.png">


Terminal 上で

```bash:Terminal
$ pip install -r requirements.txt
$ aws configure 
..
..
```

EC2Instance を 作成

```
$ python main.py --create
```

EC2 情報を取得

```
$ python main.py --get
>>>> i-0d1e7775a07bbb326
>>>> 
>>>> 3.112.18.33
>>>> ip-10-1-0-228.ap-northeast-1.compute.internal
>>>> 10.1.0.228
>>>> {'Code': 16, 'Name': 'running'}
```

ブラウザー でアクセス


<img width="1216" alt="Screen Shot 2019-12-24 at 1.11.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/58a9b12e-929f-ec4f-de5b-33c2deded7a7.png">


<img width="1214" alt="Screen Shot 2019-12-24 at 1.06.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/420b0110-94a3-974f-96e9-929c9cfbe68c.png">


<img width="1209" alt="Screen Shot 2019-12-24 at 1.12.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/4262bbd4-7120-b96c-970f-705edf86808b.png">

できました!!

# 一時停止してみよう

```
$ python main_command.py --stop

```

EC2 Insntace を止めてます。
利用料金を安く抑えることができます。
EBS の Storage の使用量などはかかります。



# 再開してみよう

```
 python main_command.py --start
```

停止したものを再開できます。
IPアドレスが変わるので注意

# 削除しよう

```
# ec2 instance から logout
$ exit

# local の code-server 上で
$ python main.py --delete

```



# 次回

EC2ベースにする場合、あとは、解説するようなものはなく、作り込むだけだと思います。

ここまで出来れば、
クラウド上に、VSCode(Code-Server) を配置することは、もう出来ると思います。

VSCode に関係なく、 Docker Image 、 Composefile かした物なら何でも
クラウド上に置けますね。 


次回は　K8S編 or Fargate編　に入ります。
今までは自作してきましたが、
ありものを利用して、アレコレしていきます。


# コード

https://github.com/kyorohiro/advent-2019-code-server/tree/master/remote_cs06
研究室にSlackを導入するまで

もともと個人ブログにあげているものを少し修正したものです。

## きっかけ

私の所属してる研究室は元々連絡ツールとしてメーリングリストを使用していました。
夏にインターンに参加し，Chatworkを経験したことがきっかけで研究室の連絡ツールの移行を考えました。

## 導入前

#### ヒアリング
まず，先生や学生に必要性を感じるかどうかのヒアリングをしました。思ったよりもみんな好意的な反応でした。ててもしょうがないので，先生や学生に聞きました。割とみんな好意的な反応でした。
特に先生は一つのアドレスにあらゆる連絡が来ることが面倒に感じていたようです。

特に反対もなかったので準備を進めていきました。
#### ツールの選定
ツールはSlackとChatworkで迷っていたのですが以下の理由からSlackを選択しました。

- 研究室内の一部グループがSlackを既に使用していた。
- 研究室外でChatworkの無料利用枠を限界まで使っている人がいた。

機能面でも一応比較しましたが，研究室で使うレベルでは大きな差は出ないと思います。

#### ガイドラインの作成

どんな便利なツールでもルールなしで運用していたら崩壊しかねないです。とはいえチャットツールの運用については無知なので色んな会社，研究室の導入記事を読んで作成しました。

[50人規模の部門にSlackを導入してみた結果](https://qiita.com/comefigo/items/8fbc4e34c07d141e328a)
[Slackを導入するまでの話](https://developers.gnavi.co.jp/entry/2016/11/08/Slack_donyu)
[チャンネルの命名規則について](https://kuro-lab.xyz/slack-ch-naming-rules-fb30f8855b3c)
[チャンネル名のガイドラインを作成する](https://slack.com/intl/ja-jp/help/articles/217626408)

特にChannelの管理は参考にしました。管理者のみが投稿するread onlyなチャンネルやプレフィックスの作成は今振り返っても必要だなと感じます。見た目がきれいになります。

結果的にチャンネルとガイドラインはこんな感じになりました。(ぼかしは先生の名前です)
![channnel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387146/b40bcd14-0a2e-a367-930c-08d81426f373.png)
![guideline_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387146/14c8a260-d1c7-156f-1219-43168b0a169f.png)







ガイドラインはSlackのポスト機能を使って書き，\_read_only\_チャンネルに投稿しています。全員必ず追加される\_read_only\_チャンネルに投稿していれば必ず目を通してくれる**はず**だからです。

こういうものを読まない人が一定数いるのはメール時代からわかっていたことなので，あとからでもここ参照してくださいって言えるようにドキュメント化しておくことが大事ではないでしょうか。

準備が終わったのでメンバーをワークスペースに招待しました。
## 導入後
事前に口頭で言っていたのもあってみんなスムーズに移行してくれました。
私の研究室は週1で全員集まるゼミがあるので，そこで最後に全員と対面で確認。無事移行完了（ということに）しました。

移行できたのはよかったのですが，招待メールを送ってからゼミでの確認までの2週の間で使い方を見ていると「これはどうなんだろう」というものがちらほら。例えば，メンション機能を使わない，誰もリアクションも何もしないみたいな。

ある種仕方ない部分でもあります。チャットツールを使うのは初めてという人ばかりです。私も今回調べたからチャットツールを活かす運用法について知れただけです。
これは私が調べた運用法を共有する必要があるなと感じ，移行を確認すると同時にスライドで運用法を紹介しました。
※当日発表したものとは一部違います（名前隠したりしてる）。
[発表スライド(SpeakerDeck)](https://speakerdeck.com/sykt13/slackyun-yong-nituite-yan-jiu-shi-xiang-ke)

運用法をまとめるにあたり以下のサイトを参考にしました。

[全職種必見！9つのSlackお作法で慮り力の高いコミュニケーションを目指す](http://manualog.net/slack-rules-660)
[ディレクターとして、コミュニケーションを取る時に意識している５つのこと](https://developers.cyberagent.co.jp/blog/archives/5852/)
[VIVITAの slack 運用 & 整理術](http://blog.vivita.io/entry/2018/09/24/070000)

紹介をしてからチャンネル作成やリアクション機能の利用など少しずつ動き始めた気がします。


### 終わりに

スライドにも書きましたが，やはり**オープン**であることがメールとは違う点で大事にしていくべき点なのかなと思います。
3か月経過した現在、Slackの評判は上々です。
Unityで特定の日時にローカル通知する

# はじめに
[Unity Mobile Notifications Package](https://docs.unity3d.com/Packages/com.unity.mobile.notifications@1.0/manual)
こちらのiOS/Androidでプッシュ通知を実装できるパッケージを使ってiOSのプッシュ通知を行います。
![IMG_4691.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565573/3f9cd264-f9d3-4e45-60d2-5f2884eddef3.jpeg)


# インストール
『Package Manager』から『Mobile Notifications』をインストールします。
<img width="699" alt="スクリーンショット 2020-01-11 23.31.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565573/5c543e65-7d18-9bce-c1ba-505b8c6dccef.png">

#使い方
今回は2020年1月1日20時20分に通知を送る設定にしてます。
特定の日時に送る場合は『[iOSNotificationCalendarTrigger](https://docs.unity3d.com/Packages/com.unity.mobile.notifications@1.0/api/Unity.Notifications.iOS.iOSNotificationCalendarTrigger.html)』を参照します。

```c#:PushTest.cs
using System.Collections;
using System.Collections.Generic;
using Unity.Notifications.iOS;
using UnityEngine;
using System;

public class PushScript : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {

    }

    IEnumerator RequestAuthorization()
    {
        using (var req = new AuthorizationRequest(AuthorizationOption.Alert | AuthorizationOption.Badge, true))
        {
            while (!req.IsFinished)
            {
                yield return null;
            }

            string res = "\n RequestAuthorization: \n";
            res += "\n finished: " + req.IsFinished;
            res += "\n granted :  " + req.Granted;
            res += "\n error:  " + req.Error;
            res += "\n deviceToken:  " + req.DeviceToken;
            Debug.Log(res);
        }

    }
    
    // ボタンが押された際に呼び出される関数
    public void OnClickBtn()
    {
        var calendarTrigger = new iOSNotificationCalendarTrigger()
        {
            Year = 2020,
            Month = 1,
            Day = 1,
            Hour = 20,
            Minute = 20,
            Repeats = false
        };

        var notification = new iOSNotification()
        {
            // You can optionally specify a custom identifier which can later be 
            // used to cancel the notification, if you don't set one, a unique 
            // string will be generated automatically.
            Identifier = "_notification_01",
            Title = "Title",
            Body = "Scheduled at: 2020年1月1日20時20分",
            Subtitle = "This is a subtitle, something, something important...",
            ShowInForeground = true,
            ForegroundPresentationOption = (PresentationOption.Alert | PresentationOption.Sound),
            CategoryIdentifier = "category_a",
            ThreadIdentifier = "thread1",
            Trigger = calendarTrigger,
        };

        iOSNotificationCenter.ScheduleNotification(notification);
    }
}
```
Slack Appハッカソンvol.1で出たアイデア20件リスト by Slack翻訳アプリKiara



#はじめに

昨年に初開催したSlack Appハッカソン、
16人の参加でとても盛り上がりました。
Zapier/IFTTTを使ってNoCodingで自動化アプリを作りましたが、欲しいAppのアイデアが出るわ出るわ！
非常にクリエイティブな時間を過ごす事ができました。
今後もSlack Ecosystemに貢献すべく、
月一回開催したいと思います。是非またご参加ください！

弊社は自社でSlack向けの翻訳Chatbot Plugin、Kiaraを開発しており、
日本初のSlack Developer Chapter Leaderとしてリードエンジニア原田が頑張っております。
https://kiara-app.com/ (無料お試し版あり)
Slackと働き方革命に対するパッションから、今後も開発者コミュニティを盛り上げてまいります。

![1_VDw9q7k8Og-S-mZv0GUmsA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/594e10d3-68b1-8036-c412-a7b6bf559e60.jpeg)


#Slack App Idea

LSTMディープラーニング付きのPeom世代ボット

Gitthubアクション検出器

強化学習を備えたジョーク生成ボット

受信Gmailデータの感情分析（怒っている顧客の検出）

Trelloチケット出力分析

Finance FX売買ボット

見通しからSlack DMまで（IFTTTでは可能、Zapierでは不可能）

顧客への自動返信

GmailからSpreadSheetへ（構造化データとして分析できるように）

キュレーションRSS（任意のコンテンツ推奨APIで可能ですか？）

Googleカレンダーの新しい予定からプッシュ通知

Googleカレンダーが近づいている予定の前にプッシュ通知

LINEのニックネームと本物のIDチェッカー

UserLocalボットAPIを使用しようとしました

Google Dialogue Flowで試したい

Wit.aiとAPI.aiを試してみたい

翻訳ボット

新しいタスクと終了タスクに関するTrelloからの通知

レストラン検索ボット

自然言語処理によるTrelloの新しいタスクスクリーニング


#参照URL

Slack FXボット2 https://www.xe.com/apps/slack/

Slack FXボットhttps://slack.com/apps/AAW3F1ZU6-tempusfx-currency-bot

Googleカレンダーのデータから、リマインダーとしてGmailにプッシュします。あなたはこれをslack ver https://zapier.com/apps/email/integrations/google-calendar/209/send-a-reminder-email-before-google-calendar-events-startに変更できます。

Zapierの競合他社リストhttps://www.producthunt.com/alternatives/zapier

Zapier用Googleアプリスクリプトhttps://hooshmand.net/google-apps-script-zapier-bot-of-your-friend/amp/

NLPのための深い強化学習。私たちは冗談ボットを作りますか？ https://aclweb.org/anthology/P18-5007

教師なし学習によるジョーク生成論文https://www.aclweb.org/anthology/P13-2041

IFTTT + Slackの統合も面白いです！https://ifttt.com/slack

これがzapier + Slackの統合リストhttps://zapier.com/apps/slack/integrations/zapierです。
下記がqiitaのチュートリアルです。
https://qiita.com/daisuke-team-ai/items/856fe12f898abee34233

#KPT=振り返りと改善

キープ：アイデアの共有/建設的

問題：出席者が同じ目標を持っていなかった/短すぎる/目標設定/スキルレベルが低すぎる

試してください：Zapierレシピの組み合わせのアイデア/トピックまたは同じ目標/オンラインハッカソン/機械学習のより多くの実装
C++とC#のクラスの扱い方の違い

過去に実務でC++を触っていたときにクラスをnewでインスタンス化→要らなくなったらdeleteで削除というのを徹底していた。
で、最近Unity学習で触っているC#ではそういえばdeleteなんて書いたことねぇ・・・とふと思った。
※調べてみると、C#でのクラスインスタンスはclassの変数にnullをセットすると
C#のガベージコレクションという機能がもう使われてないと判断して削除してくれるらしい。

C++、C#のクラスにおけるインスタンス化、利用、削除の流れを書いたコードは以下。
やっぱり色々なんか使い方違う・・・

```cpp:C++でのクラスインスタンス〜削除のイメージ

// クラスをインスタンス化し、クラスのポインタ型変数にインスタンスのポインタを格納
ClassA* classA = new ClassA();

// int型のmember_aをコンソールへ出力
printf("%d¥n", classA->member_a);

// インスタンスを削除
delete classA;
```


```cs:C#でのクラスインスタンス化→削除のイメージ

// クラスをインスタンス化し、クラスの変数(あれ、ポインタじゃない？)に格納
ClassA classA = new ClassA();

// int型のmember_aをUnityのコンソールへ出力
Debug.Log(classA.member_a);

// インスタンスを削除
classA = null;
```

一番の違和感は、C++ではクラスをnewするとそのインスタンスのポインタが返ってきて、それをクラスのポインタ型変数に代入して、アロー演算子とかいうやつでアクセスする、という形なのに、C#ではポインタとか使った記憶がない。ちょっとまって。C#ではnewしたときに何が返ってくるの・・・？

そもそも[C#ではポインタを使うことが非推奨](https://www.sejuku.net/blog/103970)であるらしい(重大なバグにつながるかららしい。のっぴきならない事情があれば無理やり使うこともできるみたいだが)。・・・ということはそもそもnewしてもポインタなんかかえってきてるわけなさそう。

じゃあなにが返ってくるのか。それは・・・newした対象の[データ型による](https://ufcpp.net/study/csharp/oo_reference.html#type-category)らしく。C#の世界では、データの型に応じて、値型もしくは参照型に区分され、扱われるらしい。それはそのデータ型の変数を宣言したときも同等。


|newしたときに値型で返ってくる|newしたときに参照型で返ってくる|
|---|---|
|- 構造体<br>- 列挙型|- string<br>- object<br>- 配列<br>- クラス<br>- インターフェース<br>- デリゲート<br> |

クラスは参照型という扱いになるんですね。
【JavaScript】オブジェクトを要素に持つ配列で、条件に当てはまる要素を全削除する方法

## はじめに
JavaScriptの配列操作で、条件に当てはまる要素を全削除する方法を備忘録として記載します。

対象は**オブジェクトを要素に持つ配列**です。

## 環境
```yaml
OS: macOS Catalina 10.15.1
```
## 結論

```javascript
const array = [
  {id: 1, n: 1, m: 2},
  {id: 2, n: 1, m: 3},
  {id: 3, n: 1, m: 2},
];

//上記配列からnが1, mが2のオブジェクトを全削除する。
//つまり、nが1, mが2「でない」配列に置き換える

const newArray = array.filter(item => 
  !(item.n === 1 && item.m === 2)
); 
```

## 出力
```javascript
array;
// => [ { id: 1, n: 1, m: 2 }, { id: 2, n: 1, m: 3 }, { id: 3, n: 1, m: 2 } ] 

newArray;
// => [ { id: 2, n: 1, m: 3 } ] 
```

## おわりに
以下記事を参考に、自分用にメモさせて頂きました:bow_tone1:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [【JavaScript】配列から条件を満たす要素を全て削除する - Qiita](https://qiita.com/sirogane1013/items/b9ee2f829148b5d949f7)
JavaScript でURLのクエリ文字列を取得する

JavaScript でURLのクエリ文字列を取得する。

## 例

### 現在開いているページのクエリ文字列を取得する

`location`オブジェクトの`search`プロパティを利用する。

```js
const query = location.search;
```

### 正規表現を使って、URLを表す文字列からクエリ文字列を抽出する

クエリ文字列がない場合、定数`query`の値は空文字となる。

```js
const url = 'https://example.com?a=123';
const query = url.replace(/^.*?(\?|$)/, '$1');
```
【１】Nuxt.jsのサンプルアプリをFirebaseでホスティングする

## はじめに

Docker上で開発できるようにしたNuxt.jsアプリを、Firebaseにホスティングして公開できるようにします。

## 手順

### 新規のFirebaseプロジェクトを作成

さしあたりFirebase consoleで新規プロジェクトを作成する。下記あたりが参考になるはず。
https://qiita.com/yoshi0518/items/25af102845ba05545f98

作成完了すると、次のようなSDKスニペットを貼り付けるよう指示される。

```
<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="/__/firebase/7.6.2/firebase-app.js"></script>

<!-- TODO: Add SDKs for Firebase products that you want to use
     https://firebase.google.com/docs/web/setup#available-libraries -->

<!-- Initialize Firebase -->
<script src="/__/firebase/init.js"></script>
```

### Dockerイメージ、コンテナの再構築

firebase-tools、nuxtをインストールしておく。
せっかくなのでDockerイメージから作りなおす。

```diff
# 2020/01時点のLTSのnodeをもとにする
FROM node:12.14.1-alpine3.11

# 作業ディレクトリを/workにする
WORKDIR /work

# 必要なパッケージをあらかじめインストール
+RUN yarn install \
+  && yarn global add firebase-tools \
+  && yarn global add nuxt

# 環境変数の設定
ENV HOST 0.0.0.0
ENV PORT 80

# 80番ポートを公開
EXPOSE 80
```

あらためてイメージ、コンテナを作成。

```
docker build -t nuxt-image .
docker run -it --rm --name nuxt -p 80:80 -v $(pwd):/work nuxt-image sh
```

### Firebaseプロジェクトの初期設定

コンテナにログインした状態で、Firebaseにログインできることを確認。

```
firebase login --no-localhost
# ブラウザでログインしたあとに表示されるコードを入力する必要がある。
```

Firebaseのプロジェクトとして作成する。
いったん"Hosting"だけを指定して、さきほど作成したプロジェクトと連携させる。
またデプロイ元のディレクトリには `dist` を指定する。

```
cd /work/app
firebase init

? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices. 
Hosting: Configure and deploy Firebase Hosting sites

? Please select an option: Use an existing project
? Select a default Firebase project for this directory: <作成したFirebaseプロジェクト>

? What do you want to use as your public directory? dist
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
```

### ビルド、デプロイ

サンプルのNuxt.jsアプリがFirebaseと連携できるように、上述のSDKスニペットを利用する。
HTMLの `<head>` 属性は、nuxt.config.jsの `head` 内で指定することができる。

```diff
export default {
+    script: [{
+        src: "/__/firebase/7.6.2/firebase-app.js"
+      },
+      {
+        src: "/__/firebase/init.js"
+      }
+    ]
```

ビルドを行うとdistディレクトリにファイルが出力されるので、これをFirebaseへデプロイする。

```
nuxt build
firebase deploy
```

### コマンドを簡単にしておく

上記のコマンドをまとめてできるように、package.jsonに定義しておく。

```diff
  "scripts": {
    "test": "jest",
+    "deploy": "nuxt build && firebase deploy"
  },
```

## ここまで

https://github.com/koboriakira/sparrow-memo/tree/ver1.1
Hamlで式展開するときはイコールとかダブルクォーテーションとかいらんかった

なんかすごい無駄な書き方をしていたことに気づいたので、執筆します。
同じことしている人とかいないとは思いますが...。

# やりたいこと

- `last updated : 2020-01-11 15:00`と出力したい。
- `2020-01-11 15:00` の部分が動的に変わる。

# こう書いてた

```haml
= "last updated : #{@first_book.updated_at.strftime("%F %R")}"
```

# これでよかった

```haml
last updated : #{@first_book.updated_at.strftime("%F %R")}
```

# 気づいた経緯

経緯は書かなくてもいいかなと思ったのですが、せっかくなので。

まず、フッターにコピーライトで `© 2019-2020 Yoshida` みたいに出そうとして、
この `2020` の部分を動的にすれば、年明けてもメンテいらねえじゃんとか思ったのがきっかけでした。

それで、以下のように書きました。`get_this_year` はヘルパーです。

```haml
= "&#169; 2019-#{get_this_year} Yoshida"
```

すると、以下のように出力されてしまいました。
ヘルパーは想定通り動いているようですが、`©️` をうまく出せていません。

```
&#169; 2019-2020 Yoshida
```

困った私は、Rubyで `©️` を出すにはどうすればいいかググっていました。
しかし、これといったページにたどり着けず、発想を変えようとしました。
具体的には、ERBみたいに行頭にイコールとか使わずに書けねえものか、といった感じです。

```erb
&#169; 2019-<%= get_this_year %> Yoshida
```
この方向でググっていると、普通にHamlの入門的な記事にたどり着きました(笑)
先述した通り、以下のように書けばよいことがわかりました。
文字列結合したいときに、思考停止で `"hoge#{helper}"` と書いていました...。

```haml
&#169; 2019-#{get_this_year} Yoshida
```

# 参考
- [haml 書き方 まとめ for Rails - Qiita](https://qiita.com/shizuma/items/75b160bc43c65787f3a1)
データサイエンティストの為のおすすめコンペサイト

データサイエンティストを目指す人のキャリア形成に役立つ、コンペサイトを集めました

#Kaggle
![site-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/3ea5946e-e7bd-7186-b7f5-4b59cb79ff03.png)

データサイエンティスト界隈で有名なサイトです。
Kaggleと書いて「カグル」と読みます。
世界中のデータサイエンティストが毎日ここで腕を競ってます。
2017年3月8日にGoogleが買収しました。分析を依頼したい
大手企業が賞金をかけており、過去にはメルカリ、リクルートがコンペをしてました。

公式ページ
https://www.kaggle.com

#signate
<img width="170" alt="2020-01-11_23h17_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/00f6b426-d378-c1f9-09c9-3ccf855622fa.png">

日本のsignate社が運営しているコンペサイト、Kaggleに比べるとデータセット数はあまりないが、経済産業省やＮＴＴなど日本の企業が参加しているので、データに親近感があるのが特徴、やや問題が難しめ。

signate公式ページ
https://signate.jp


#probspace
<img width="122" alt="2020-01-11_23h33_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/63d44767-90e8-9642-eeb2-95415ade53ee.png">

「浮世絵作者予測」、「くずし字」などユニークなデータセットがあります。
またデータ数は少なめですが、参加しているデータサイエンティストのレベルは高いので、トピックなどは見てみる価値は十分にあるコンペサイトです。

公式ページ
https://prob.space

#atna
<img width="105" alt="2020-01-11_23h32_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533844/4dddc419-4aa5-b231-e57e-a3ced79cb80f.png">

データ解析・アルゴリズムソリューション・システム開発を行うベンチャー企業 atmaが運営しているコンペ。他のと違い、オンライン提出ではなく、会場に集まりリアルタイムでコンペを行う。定員割れが続いているので、参加したい方は、早めに申し込みを。

公式ページ
https://atma.connpass.com/

#nishika

「Brandearオークション！」 レコメンドエンジン開発でコンペ開催中。
ここは立ち上がったばかりですが、参加者少ないので逆に、狙い目かも。

公式ページ
https://www.nishika.com/
Firebase Hosting でのサイト公開手順メモ

Firebaseで導入時に操作する手順を残しておきます。
→ [firebase公式サイト](https://firebase.google.com/)

## 0. 事前準備
以下はすでに導入済みのものとして説明は省略します。

- node.jsのインストール
- ブラウザからfirebase公式サイトへログインしてプロジェクト作成

## 1. firebase tool（firebase CLI）のインストール
下記のコマンドでインストールします。

```terminal
npm install -g firebase-tools
```

インストール終わったら以下のコマンドで、firebase CLIから使えるコマンド一覧が確認できます。

```terminal
firebase
```

こちらはバージョン確認

```terminal
firebase --version
```

## 2. firebaseへログイン（Googleアカウントへの紐付け）
インストール後Googleアカウントへと紐付けをおこないます。

```terminal
$ firebase login
```
英語での質問が表示されますのでそのままEnterキーをクリックしてください。
するとブラウザでのログイン画面が立ち上がるので、Googleアカウントでログインします。

ログインできたら、以下でfirebase上のプロジェクト一覧が確認できます。

```terminal
$ firebase projects:list
```

プロジェクトID確認できるやつ

```terminal
$ firebase list
```

## 3. 初期化

事前にフォルダを作成して移動しておいてください。

```terminal
$ mkdir フォルダ名
$ cd フォルダ名
```

下記のコマンドで対象フォルダを初期化します。

```terminal
$ firebase init
```

プロジェクト指定まだの場合は指定するオプション

```terminal
$ firebase init --project=プロジェクトID名
```

コマンドライン上にどのサービスを使うのかなど質問がでてきますのでスペースで選択して答えていきます。

選択質問後はyesかnoで答えるいくつか質問がでてきますので答えていきます。

▼質問項目（確かこんな内容）

- 公開するファイルを格納したディレクトリ（初期設定はpublic）
- SPAかどうか（yesだとどのアクセスでも/index.html参照になる）
- 常にindex.html上書きかどうか
など

上記完了すると２つのファイルが生成されます。

- .firebaserc
- firebase.json

## 4. デプロイ

下記のコマンドでローカルにあるpublicフォルダ配下のファイルがfirebaseサーバ上にアップロードされます。

```terminal
$ firebase deploy
```
コンソール上に表示される、下記のようなURLで公開となります。
https://xxxx.firebaseapp.com
Arduino のバイナリの出力方法と逆アセンブルの方法のメモ

忘備録です。

# .hex の出力

Arduino IDE 1.8.10 の場合、「スケッチ」「コンパイルしたバイナリを出力」のメニューで、スケッチのあるディレクトリに .hex ファイルが生成される。

# 逆アセンブル

## mac の場合

```disassemble.sh
 $ /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-objdump -j .sec1 -d -m avr \ 
    sample.ino.with_bootloader.eightanaloginputs.hex > sample.asm
```

こんな感じでいける。(`/Applications` に Arduino IDE をインストールしている場合)

## Windows の場合

avr-objdump は下記にある。(`C:\Program Files (x86)\Arduino` に Arduino IDE がインストールされている場合)

```
C:\Program Files (x86)\Arduino\hardware\tools\avr\bin
```

# オンライン逆アセンブラ

下記に .hex ファイルを読ませてもできる。(このサイトはすごい)
- https://onlinedisassembler.com/

# 参考

- https://forum.arduino.cc/index.php?topic=71869.0
- http://www.jh4vaj.com/archives/8548
eclipseでの開発に便利なショートカット

# eclipseでの開発に便利なショートカット

#### 便利系

|コマンド|意味|
|:--|:--|
|`f3` or `ctrl押しながらクラスをクリック`|宣言を開く|
|`ctrl` + `shift` + `r`|リソースを開く|
|`ctrl` + `shift` + `t`|クラスを開く|
|`ctrl` + `shift` + `g`|ワークスペース内で変数やクラスの検索|
|`ctrl` + `shift` + `f`|コードフォーマット|
|`ctrl` + `shift` + `r`|名前変更|
|`ctrl` + `shift` + `o`|import文の編成|
|`ctrl` + `shift` + `F7`|ビューを切り替える|
|`ctrl` + `alt` + `g`|ワークスペース内でテキストの検索|
|`ctrl` + `o`|アウトラインを表示|
|`ctrl` + `t` or `F4`|クイック階層（型階層を開く）|
|`ctrl` +  `q`|最後の編集位置へ戻る|
|`ctrl` + `e`|タブを検索|
|`ctrl` + `space`|変数名の補完|
|`ctrl` + `d`|行削除|
|`ctrl` + `/`|コメントアウト|
|`ctrl` + `w`|ファイルを閉じる|
|`alt` + `a`|grep検索|
|`alt` + `Right` or `alt` + `Left`|戻る・進む|

#### デバック系
|コマンド|意味|
|:--|:--|
|`F5`|Step Into(一行実行。関数の中に入る)|
|`F6`|Step Over(一行実行。関数の中には入らない)|
|`F7`|Step Return(関数から抜ける)|
|`ctrl` + `r`|カーソルがある行まで実行|
WSLでプラグインがないと言われてredmine:plugins:migrateできない

WSL(Windows Subsystem for Linux)で、いつものノリでRedmineのプラグインをインストールしようとしたら、以下のようにうまくいきませんでした。

```bash
two-pack@two-pack-pc$ bundle exec rake redmine:plugins:migrate
Plugin two-pack-pc was not found.
```

調べてみると、WSLでは環境変数NAMEにホスト名が入っているようで、ホスト名のプラグインが指定したと見なされて、プラグインがないと言われてしまっていました。
Ubuntu 18.04 LTSをインストールした直後で確認したところ、以下のようになりました。

```bash
two-pack@two-pack-pc:~$ env | grep NAME
WSL_DISTRO_NAME=Ubuntu-18.04
NAME=two-pack-pc
LOGNAME=two-pack
```

以下のようにして、プラグイン名を明示してうまく行きました。

```bash
two-pack@two-pack-pc$ NAME=redmine_auto_assign_group bundle exec rake redmine:plugins:migrate
```
木構造に対する「再帰なし」深さ優先探索 (DFS)

次のような木を考えます。

![アートボード 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39266/ab135049-7c64-a3e4-04e4-a5852c71ad48.png)


深さ優先探索で「各ノードの子孫ノードの合計数」を求めることを考えます。

通常、深さ優先探索は再帰関数を使って書くと楽です。

```c
const std::vector<size_t> children[7] = {{5, 1}, {4}, {}, {}, {6}, {2, 3}, {}};
int64_t counts[7] = {0};

int64_t dfs(size_t node) {
  int64_t ret = 1;
  for (auto child: children[node]) {
    ret += dfs(child);
  }
  counts[node] = ret;
  return ret;
}

int32_t main() {
  dfs(0);
  std::cout << counts[0] << std::endl; //=> 7
  return 0;
}
```

しかし、言語や環境によっては

* 関数呼び出しが重い
* スタックの深さに制限がある
* グローバル変数を使用できない

などの理由により再帰関数を使いたくない場合があります (hakatashiが競技プログラミングで用いる言語Crystalなどがそうです)。

## 再帰なし深さ優先探索

幅優先探索のキューをスタックに置き換えると深さ優先探索になります。

```rb
children = [[5, 1], [4], [], [], [6], [2, 3], []]
stack = []
stack << 0

until stack.empty?
  node = stack.pop
  p node
  children[node].each do |child|
    stack << child
  end
end
```

[Wikipedia](https://ja.wikipedia.org/wiki/%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2#%E5%86%8D%E5%B8%B0%E3%81%AA%E3%81%97)にもこのタイプのアルゴリズムが載っています。しかしこのままだと今回のように子ノードの情報を用いてアルゴリズムをエイヤするのに不便です。

これを解消するために、まず必ず子が親の後に来るようにノードをソートします。

![アートボード 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39266/9c751b57-1061-feee-03ea-f884867e3a0b.png)

これは木を親から子への有向グラフとみなしたときのトポロジカルソートと同じですが、木の場合単純にDFSで訪れた順に積めばいいので楽です。

```rb
children = [[5, 1], [4], [], [], [6], [2, 3], []]
stack = []
stack << 0
sorted_nodes = []

until stack.empty?
  node = stack.pop
  sorted_nodes << node
  children[node].each do |child|
    stack << child
  end
end

p sorted_nodes #=> [0, 1, 4, 6, 5, 3, 2]
```

あとはこのノードを逆順に見ていけばDFSができます。

![アートボード 2 のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39266/df9d18a8-2bc2-7901-3eb4-ddc5bcb6b4df.png)

```rb
children = [[5, 1], [4], [], [], [6], [2, 3], []]
stack = []
stack << 0
sorted_nodes = []

until stack.empty?
  node = stack.pop
  sorted_nodes << node
  children[node].each do |child|
    stack << child
  end
end

counts = Array.new(7, 0)

sorted_nodes.reverse_each do |node|
  ret = 1
  children[node].each do |child|
    ret += counts[child]
  end
  counts[node] = ret
end

p counts[0] #=> 7
```

全方位木DPなどで今度は親から順に見て上げる必要がある場合はふたたび昇順にループします。
ときにはencoding.TextUnmarshalerの話を

飛ばねえホリネズミはただのホリネズミだ…

## うんざり

最近いろいろなプライベートプロジェクトに参加したりしてるんですが、
あっちにいってもこっちにいってもMarshalXXXだのString()だの実装するのDARUすぎませんか。
ここはJSONだからMarshalJSON実装して、こっちはYAMLだからMarshalYAML実装して…
アッ、素敵なHogeフォーマットなんてものを考えたんですね。じゃあMarshalHoge実装しなきゃですね（にっこり）

だいたいGoだとPrimitiveな型を`type Hoge int`とかやりがちなんで、
書くモンが多い多い。

```go
type Hoge int

func (h Hoge) MarshalJSON() ([]byte, error) {
...
}


func (h Hoge) UnmarshalJSON(raw []byte) error {
...
}

func (h Hoge) MarshalYAML() ([]byte, error) {
...
}

func (h Hoge) UnmarshalYAML(raw []byte) error {
...
}

func (h Hoge) MarshalHoge() ([]byte, error) {
...
}

func (h Hoge) UnmarshalHoge(raw []byte) error {
...
}
```

何を書かされてるんだ

## encoding.TextUnmarshalerで良くない？

いちいち新しいフォーマット作るたびに、

```go
type HogeUnmarshaler interface {
  UnmarshalHoge([]byte) error
}
```

とか新しいインターフェイスを作るだけじゃなくて、
**primitiveなものならencoding.TextUnmarshalerをサポートしてあげましょう**

環境変数パーサもArgs/Flagパーサも、オレオレプロトコルパーサーも、作るときには
**encoding.TextUnmarshalerのことを思い出してあげてください**。

## ついでに

encoding.BinaryUnmarshalerなんてもんもあります。
Gopherはかわいいですね。
【CentOS】シェルスクリプトでWordPressに必要なものを一発インストール

WordPressサーバを構築する度に、`Apache` `php` `MySQL`を入れるのがめんどくさかったので、いい方法がないかと思い調べていると、シェルスクリプトを使えば一発構築できそうなので、やってみました。
ただ、`MySQL`をいじるのに初期パスワードが必要で、その部分が実装できなかったので、`WordPress`に必要なものを入れてひとまず終了します。
(そのあたり詳しい方がいたらコメントくださると嬉しいです。)
あと、個人的に`fishシェル`が大好きなのでついでに入れます。

## 環境

* Azure CentOS(7.7)

AzureにまっさらなOSを起動した時を想定します。

## コード

```wordpress.sh
#!bin/bash

#yumのアップデート
yum -y update

#fishシェルのインストール
yum -y install epel-release #epelリポジトリのインストール
yum -y install fish #fishのインストール

#Apacheのインストール
yum install httpd.x86_64 -y  #apacheのインストール
systemctl start httpd  #apacheの起動
systemctl status httpd  #apache自動起動

#php7.3のインストール
yum -y remove php*  #デフォルトphpのアンインストール
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm #remiリポジトリのインストール
yum -y install --enablerepo=remi,remi-php73 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql #php7.3の必要なパッケージのインストール
cp /etc/php.ini /etc/php.ini.org #PHPのバックアップ
sed -i -e "s/date\.timezone =/date\.timezone = Asia\/Tokyo/g" /etc/php.ini  #timezoneを日本に変更
#設定を反映
systemctl restart httpd #httpdの再起動

#WordPressのダウンロード
wget https://ja.wordpress.org/latest-ja.tar.gz  #WordPressファイルのダウンロード
tar -xzvf latest-ja.tar.gz  #WordPressの解凍
rm latest-ja.tar.gz  #WordPressファイルの削除
cp -r wordpress /var/www/  #/var/wwwにwordpressファイルをコピー
chown -R apache.apache /var/www/wordpress #Apacheで読み込む

# /etc/httpd/conf/httpd.confのバックアップと編集
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org  #httpd.confのバックアップ
sed -i -e "s/\/var\/www\/html/\/var\/www\/wordpress/g" /etc/httpd/conf/httpd.conf
sed -i -e "s/Directory \//Directory \/var\/www\/wordpress/g" /etc/httpd/conf/httpd.conf
sed -i -e "s/AllowOverride None/AllowOverride All/g" /etc/httpd/conf/httpd.conf

#Apachenのバージョン非表示
sed -i -e "s/ServerTokens OS/ServerTokens Prod/g" /etc/httpd/conf/httpd.conf

#MarinaDBのアンインストール
yum -y remove mariadb-libs
rm -rf /var/lib/mysql/

#MySQLのインストール
rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum -y install mysql-community-server
systemctl start mysqld #mysqlの起動
systemctl enable mysqld #mysqlの自動起動

# httpd.confの反映
service httpd restart

exit 0
```

実行する時は`sudo bash wordpress.sh`で実行できます。
Mackerel設定

サーバ監視に欠かせないMackerelの設定のかんたんなサマリーです。

## APIキー
エージェントインストールなどに必要な情報はこちらを確認
https://mackerel.io/orgs/yoursite?tab=apikeys

## サーバへのエージェントのインストール
当該サーバにログイン後、以下コマンド入力。

```
  curl -fsSL https://mackerel.io/file/script/amznlinux/setup-all-yum.sh | MACKEREL_APIKEY='<YOUR_API_KEY>' sh
```

## 設定
必要あれば `/etc/mackerel-agent/mackerel-agent.conf` に設定を追記する。
ミドルウェアの監視などが可能。

## エージェントの起動

```
sudo /sbin/service mackerel-agent start
```

## サービスとホストの紐付け
Mackerelの管理画面からサービス名とホストを結びつける設定を行う
![Hosts · Frembassy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/bec59dff-e649-4824-bbd9-dc9f408551c3.png)

以上
golangで文字列からキー付きでsha256ハッシュ化する方法

# キー付きでハッシュ化

キー無しでハッシュ化する方法は以前記事([golangで文字列からsha256でハッシュ化する方法](https://qiita.com/mergit/items/ffdb405173dee651856d))を執筆したのですが、今回はキー付きでhash化する方法です。



```golang
// キー無しでSHA256
func getBinaryBySHA256(s string) []byte {
	r := sha256.Sum256([]byte(s))
	return r[:]
}

// キー有りでSHA256
func getBinaryBySHA256WithKey(msg, key string) ([]byte, error) {
	mac := hmac.New(sha256.New, getBinaryBySHA256(key))
	_, err := mac.Write([]byte(msg))
	return mac.Sum(nil), err
}
```


## サンプルプログラム

hash化は不可逆変換ですが、同じ文字列に対して、同じキーを使ってhash化すれば同じ値になります
暗号化とは違うのでお気をつけください

```golang
package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

func main() {
	key := "Hello, World"
	msg := "some message"

	b, _ := getBinaryBySHA256WithKey(msg, key)
	fmt.Println(b) // [0 216 92 122 115 159 23 115 167 90 110 26 246 24 65 143 147 100 227 21 198 33 167 226 128 220 121 229 179 78 59 33]
	fmt.Println(hex.EncodeToString(b)) // 00d85c7a739f1773a75a6e1af618418f9364e315c621a7e280dc79e5b34e3b21
}

func getBinaryBySHA256(s string) []byte {
	r := sha256.Sum256([]byte(s))
	return r[:]
}

func getBinaryBySHA256WithKey(msg, key string) ([]byte, error) {
	// hmac.New(string, []byte)なので、[]byte部分にgetBinaryBySHA256を使う必要はないですが、今回はサンプルとして使用しておきます
	mac := hmac.New(sha256.New, getBinaryBySHA256(key))
	_, err := mac.Write([]byte(msg))
	return mac.Sum(nil), err
}

```

https://play.golang.org/p/3A5jgoZ71vm
Linux OS のローカルリポジトリを作成する方法

いつもローカルリポジトリの作成方法を忘れてしまうので，備忘録のためメモする．

#ローカルリポジトリとは？
Linux OS で新しくツールをインストールしたいときに，yum やapt といったコマンドで用意されているリポジトリからパッケージをインストールするのが通常であると考えているが，何らかの事情でインターネットに接続できない場合だと，そのままでは用意されているパッケージが利用できない．

インターネット接続できないデバイスがパッケージを利用する方法として，インストールに使用したiso ファイルをローカル上に用意してyum の対象をそのiso ファイルにすることで，パッケージをインストールすることができる．
この方法がローカルリポジトリと呼ばれている認識である．

本記事では，そのやり方の一つを紹介する．

#実施手順
本記事では，私が実際に実施して作成できた手順を紹介する．その手順は，大まかには以下のとおりである．

1. iso ファイルをローカルに設置する
2. iso ファイルをマウントする
3. 設定ファイルを作成する
4. 設定が正しいかを確認する

#iso ファイルをローカルに設置する
ローカルにiso ファイルを設置する．今回は，/tmp に設置する．今回は，teraterm のscp 機能を利用した．

#iso ファイルをマウントする
次に，設置したiso ファイルをマウントする．今回は，/var/yum/localdvd というディレクトリを作成し，そこにマウントする．

```terminal:実行コマンド
# mkdir -p /var/yum/localdvd
# mount -t iso9660 -o loop /tmp/【iso ファイル名】 /var/yum/localdvd
```

#設定ファイルを作成する
マウントしたiso ファイルをローカルリポジトリとして利用する設定ファイルを作成する．

```terminal:実行コマンド
# vim /etc/yum.repos.d/localdvd.repo
```

```conf:/etc/yum.repos.d/localdvd.repo
[localdvd]
name=localdvd
baseurl=file:///var/yum/localdvd
enabled=1
gpgcheck=no
```

#設定が正しいかを確認する

以下のコマンドを実行し，パッケージのリストを表示させて設定が正しく反映されているか確認する．
正しく設定されていれば，リストの一覧が表示される．

```terminal:実行コマンド
# yum --disablerepo=\* --enablerepo=localdvd list
```

以後，yum install コマンドで，パッケージ一覧にあるパッケージがインターネット接続がなくてもインストール指定利用可能である．
Excel 備忘録

# 太字だけフィルタリングする方法

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/fa533033-ac3d-5c36-6f38-b2c2618f06db.png)




1. 最初に太字の部分のフィールドを選択(重要）する
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/268ae41c-6e09-6979-34c5-e8d134605192.png)


1. [検索と選択]--[置換]--[オプション]
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/b05e54e7-2d41-2e1d-e46b-ec491b2b4314.png)



1. 検索する文字列--書式--太字
   置換後の文字列--書式--太字　+　塗りつぶし(任意の色）
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/fcc4d212-a576-b91d-858c-bb48a44c308c.png)

太字の箇所のセルの色が変わるよ
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/e1831f7c-8309-0a23-f6ac-d422e78e2274.png)


1. [並べ替えとフィルタ]-[フィルタ]
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/2a987d6f-2eba-58cd-c3d5-f2705a84ef0f.png)


1. ドロップダウンをクリックして、[色フィルタ]で、色を選択する
1. フィルタした部分だけ必要ならフィールドを選択して「Alt+;」を押してコピーする![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/d1c61a8f-2028-1c8f-1064-c069a4f1dbb4.png)
![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/761b917c-d311-46f4-78ad-1704e524aade.png)
Jupyter学習ノート_004

## [Google colab](https://colab.research.google.com/) にgithubのノートブックを開く方法

以下の手順で実施します。

- 事前にgithubの[リンク](https://github.com/Giffy/MongoDB_PyMongo_Tutorial)を準備する
![MongoDB_PyMongo_Tutorial image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/feec8d8d-2273-8de6-c4e0-58358a84c75f.png)

- [Google colab](https://colab.research.google.com/) のメニューからノートブックを新規作成する
注意点：サーチする文字列はgithubのurlの一部（https://github.com/ **Giffy/MongoDB_PyMongo_Tutorial**）で十分です。
![search result](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/37b6aa80-ae24-38cb-fc6f-9694a66c913d.png)

- 安全のためGoogle driveにコピーしてから実行する方がいいです。
![warning](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/893d41a9-afc8-a821-e0b3-8fbc79728a94.png)
STM32L4 Discovery kit IoT node ~[WARN] WiFi firmware needs to be updated.~を攻略せよ

先日のIoT@Loft ハンズオン #2 - Amazon FreeRTOSを用いた量産向けIoTマイコンデバイス開発プロトタイピングで
STM32L4 Discovery kit IoT nodeをAWS FreeRTOSを使用する際にWiFiのファームウェアが古い為にエラーが出ました。
今回は、この解決手法であるInventek ISM 43362 Wi-Fi module firmware updateを書きます。

エラー画面は以下のようなものです。
![5-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b0556ac6-fa9e-4141-449a-ebdce59a34b6.jpeg)

````
5 6036 [Tmr Svc] WiFi firmware version is: C3.5.2.3.BETA9
6 6042 [Tmr Svc] [WARN] WiFi firmware needs to be updated.
````
STマイクロのHPからen.inventek_fw_updater.zipをダウンロードし解凍します。
https://www.stmcu.jp/design/hwdevelop/other/61563/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/616b6da6-4c21-b1c6-4cc8-f9bd9e36ee87.png)

InventekのHPから
 STM32L4 Discovery kit IoT node (B-L475E-IOT01A) ISM43362-M3G-L44-SPI-???????TM SPI Firmware (unzip for bin file)をダウンロードします。
https://www.inventeksys.com/iwin/firmware/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3869a68d-51ba-5ce6-bcec-1652e8954690.png)

全てを同じフォルダに入れた状態でupdate_Wifi_FW_C3.5.2.5.STM.batを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2b1ecaa5-57a5-abd2-0537-425b4d466f8c.png)

何回か、このまま進めていいですか?
と聞かれるのでEnterを押していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b75b2799-2d86-1472-ea9b-b3f26626ea5a.png)
最後は自動で終了します。

終了後、ファームを再度書き込みます。
今度は、しっかり、version is: C3.5.2.5.STMになっていますね。
![5-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/258d7e77-3591-2f31-db46-9f9a7e7c6271.jpeg)

````
4 8223 [Tmr Svc] WiFi firmware version is: C3.5.2.5.STM
5 8228 [Tmr Svc] WiFi firmware is up-to-date.
````
これで無事通信できるようになりました。

ハンズオンでこの問題が発生し、アップデートのページを見てもbatがどこにあるかわからないなど、大変苦労しました。
こういった問題が起きないように、Tipsをあげておきます。
【archlinux】package-queryのエラーが発生したときの解決方法

##pacman更新のときpackage-queryのエラーが発生したときの解決


##当時のエラー内容

```
package-query: error while loading shared libraries: libalpm.so.11
```

<br>

##解決策：package-queryを入れ直す

```
sudo pacman -Rdd package-query
cd /tmp
git clone https://aur.archlinux.org/package-query.git
cd package-query/
makepkg -si
ldd /usr/bin/package-query | grep libalpm.so

sudo pacman -Syuu --noconfirm
```

###参考サイト
https://is.gd/rM3gC6
Docker image をタグ指定で一括アップデートする

## ワンライナー

```sh
docker images | tail -n +2 | awk '{printf "%s:%s\n", $1, $2}' | sort | uniq | egrep -v '(<none>|my-image)' | xargs -P0 -L1 docker pull 
```

Rootless Docker ではない Ubuntu ユーザーは `sudo` を付けてください。

`tail -n +2` は `REPOSITORY:TAG` を除外するため。

`sort | uniq` は要らないです。動作確認で使った。

除外したいイメージは `my-image` のように追加していく。

`egrep` 後の結果は例えば以下のようになる。

```
alpine:3.11
debian:10-slim
node:12-slim
nvidia/cuda:9.2-base-ubuntu18.04
python:3.6-buster
python:3.6.9-slim-stretch
rust:slim-buster
tensorboard:latest
tensorflow/serving:latest
tensorflow/serving:latest-gpu
ubuntu:18.04
```

Pull が完了して不要になった `<none>` タグのイメージを一括削除するには `docker system prune` を実行すればオッケー。



## 参考

- [一括してDockerイメージを最新にアップデートしたい - Qiita](https://qiita.com/suin/items/5d65320ee9fb9596249f)
【itertools.permutations】Pythonで順列を出す方法

## モチベーション
[AtCoderの問題](https://atcoder.jp/contests/abc150/tasks/abc150_c)をやってて、"辞書順で何番目か"を出したい時、順列を求める必要があった。
例えば、a,b,c,d,eを使って単語を作るとする。
この時、

* 辞書順に並べると、abcdeは何番目か⇨勿論1番前
* じゃあdeabcは??⇨わからん

ってなったのでやり方を学んだので備忘録。

## 環境
* Python : 3.7.5

## やり方
itertoolsのpermutationsを使うとすごい簡単
以下のコードではa,b,c,d,eを使って単語を作り、"abcde","deabc"が何番目なのか確認してみる

## Code
```python

import itertools

abcde_list = ["a", "b", "c", "d", "e"]
A = list(itertools.permutations(abcde_list))
# →[('a', 'b', 'c', 'd', 'e'), ('a', 'b', 'c', 'e', 'd'), ('a', 'b', 'd', 'c', 'e'), ('a', 'b', 'd', 'e', 'c'), ('a', 'b', 'e', 'c', 'd'), ('a', 'b', 'e', 'd', 'c'), ('a', 'c', 'b', 'd', 'e').....

# tupleになってることに注意
abcde_tuple = ("a", "b", "c", "d", "e")
deabc_tuple = ("d", "e", "a", "b", "c")

abcde_num = (A.index(abcde_tuple))
# →0
deabc_num = (A.index(deabc_tuple))
# →90

```
***indexは0から始まってるのに注意。***
VirtualBoxにCentOSをインストールするときに参考にした記事と注意点のお話

## きっかけ
仮想マシンを使って簡易的なWebサイトを表示する社内ハンズオンに参加するにあたり、事前にVirtualBoxとCentOSのインストールをする必要があったので、実際に参考にした記事とそれでも引っかかった点についてまとめておきます。

## 環境
VirtualBox：6.1.0 r135406 
ホストOS：Windows 10
ゲストOS：CentOS 8.0 1905

## 参考記事
VirtualBoxのインストールとCentOSの基本的なインストール・設定方法はこちらの記事を参考にして作業を進めました。
[VirtualBoxにCentOSをインストール](https://qiita.com/tamago3keran/items/260899458959d3214dcf)

## 記事通りに進まなかった点
上記の記事を参考にさせていただき作業を進めたのですが、途中引っかかった点があり、かなり時間を取られてしまったのでこちらに記載しておきます。
もし今後同じ現象で立ち止まってしまった人の助けになればと思います。
浅い知識でなんとか対処したため、ご指摘等あればよろしくお願いします。


### CentOSのインストール先の容量不足
#### 問題
CentOSインストール時に指定するインストール先の空き容量が不足しているというポップアップが表示されて、先に進めなくなってしまいました。
初めての仮想マシンだったので空き容量を作ろうにもまずどこのストレージの空き容量を作ればいいのかもわからない状態でした。
#### 解決策
VirtualBoxで作成したCentOSの設定にあるストレージにより大きいサイズのハードディスクを作成して仮想マシンを起動し、インストール先に新しく作った方のハードディスクを指定することでインストールできるようになりました。
新しいハードディスクを作成するときに参考にした記事は[こちら](https://pc-karuma.net/virtualbox-add-hard-disk/)です。

### CentOSをインストールして再起動しても、またCentOSインストール画面になる
#### 問題
CentOSのインストールが完了し、仮想マシンの再起動をすると起動するCentOSを選択する画面が表示されるとあったのですが、いざ再起動をすると再びCentOSをインストールする画面になってしました。
インストール時になにか問題があったのかと思い、もう一度インストールし直したのですが、相変わらず再起動後はインストール画面になってしまい、完全にCentOS無限インストールループに陥ってしまいました。
#### 解決策
ネットで調べたところ同じ現象になっている人がteratailで質問しており、[こちら](https://teratail.com/questions/214897)を参考に解決しました。
方法としては、CentOSをインストールするためのISOファイル（序盤にダウンロードしたファイル）を削除するというもので、これがあるとひたすらインストール画面が表示されるようです。
なおこちらの現象は同じハンズオンに参加予定だった方も起きていたので、そういった方にこの記事が届きますように。。

## 終わりに
上で紹介しましたいくつもの記事を参考になんとかCentOSのインストールまで終了しました。
もっと良い解決策がありましたら、コメントでご指摘いただけますと幸いです。
今回のお話はここまでです。
第六回ドワンゴからの挑戦状 予選をPythonで解きたかった

### はじめに
こんばんは。前回のABC150は残念ながらunratedになってしまったので、レートの変動はないです。そして、学校で模試があるのでなかなか時間が取れずに記事を書けませんでした。模試が終わったら終わったらたくさん書きます(フラグ)
**今回はAしか解けませんでした。**B以降は期待値が出てきて問題の意味が理解できなかった。

###A問題
[問題](https://atcoder.jp/contests/dwacon6th-prelims/tasks/dwacon6th_prelims_a)

**考えたこと**
問題を見ると複数行の標準入力が必要で、実装を知らなかったので検索。
とりあえず、曲名と時間で分割して別のリストにした。あとは、どこで寝てしまったを調べるだけ。

```python
n = int(input())
s = []
for a in range(n):
    s.append(input().split())
x = input()

m_l = []
for i in s:
    m_l.append(i[0])

t = []
for j in s:
    t.append(int(j[1]))

m_s = n - m_l.index(x) - 1

ans = 0

for r in range(m_l.index(x)+1,n):
    ans += t[r]
print(ans)
```
分割したリストにするならdictでもできるのかなと思った。

###B問題
[問題](https://atcoder.jp/contests/dwacon6th-prelims/tasks/dwacon6th_prelims_b)

**考えたこと**
**できませんでした**。期待値の意味が分らなくてずっと考えていた。数Aの確率、場合の数も苦手で避けてきたので自業自得ではある。むしろ、それ以外ない。
操作の一行目の等確率で選ぶ意味を理解できなくて、random.choiceなのかなと思った()
コードはひどかったので載せません。TLEしたコードなんて載せても意味ないし。

###まとめ
確率の勉強します。明日のABC151もがんばります。
tailwindcssでfont-familyの設定をする

tailwindcssで日本語のフォントを含めたfont-familyの設定をしたいと思い調べたのでメモします。

## 方法
### 1. 使用したいfont-familyを記述
tailwind.config.js に以下のような形式で使用したいfont-familyを書きます。

例）

```js:tailwind.config.js
module.exports = {
  theme: {
    fontFamily: {
      body: [
        'Avenir',
        'Helvetica Neue',
        'Helvetica',
        'Arial',
        'Hiragino Sans',
        'ヒラギノ角ゴシック',
        'メイリオ',
        'Meiryo',
        'YuGothic',
        'Yu Gothic',
        'ＭＳ Ｐゴシック',
        'MS PGothic',
        'sans-serif'
      ]
    }
  },
  variants: {},
  plugins: []
};

```
（font-family は [Font-familyメーカー](https://saruwakakun.com/font-family)より生成）

なおスペースなどを含むフォント名の場合は以下のようにダブルクオーテーションで囲むと良いそうです。
(参考: https://tailwindcss.com/docs/font-family/#app)

```js
body: [
  '"Times New Roman"',
],
```

### 2. クラスを適用
上記のように設定すると、font-bodyというクラスが作られるので、それをbody要素に適応します。
例）

```html:index.html

<html>
<!-- ... -->
<body class="font-body">
  <!-- ... -->
</body>
</html>
```
これでうまくいくはずです。


## 余談
上の例では、tailwind.config.jsでfontFamily以下に`body`というkeyを用意しましたが、実はkeyの名前はなんでもいいらしいです。例えばkeyを`hoge`にした場合は、`font-hoge`というクラスが生成されます。
(参考: https://github.com/tailwindcss/discuss/issues/293)
できるリーダー(テックリード)になるためのトレーニング法④

## はじめに
うめりんです。前回は[思考整理のためのトレーニング](https://qiita.com/umerin/items/0fb085f4f948f706e14d)でした。
まだご覧になっていない方は、記事に順序性は無いので後からでもご参考にして頂ければと思います。

過去記事（①〜③）＋他処での投稿記事を整理してまとめた
技術書典7で初頒布の「できるエンジニアリーダーになるためのトレーニング法」がBOOTH／とらのあな にて取扱中です。
https://booth.pm/ja/items/1573718
https://ec.toranoana.shop/tora/ec/item/040030792842/
更に、技術書典8-2日目にて、新刊発売予定です。

## ④自らがボトルネックにならないように、仕事を渡せる／受け取れる形にしておく
ここで言う「ボトルネック」とは、流れを滞らせる箇所の意味で、数々のタスクを捌く上での阻害要因になることを指しています。
エンジニアに限らず、1メンバーからリーダーへステップアップをするためには欠かせない考え方や準備です。

##なぜ必要なのか？
リーダーになることは、1名以上のメンバーを束ねたチームを率いる役割を持つことを意味します。
そして一般的に、チームの外（上司や他職種／部署）からの依頼や、チームから外への報告や発信は、全てリーダーを介してやりとりする事が多いです。
単純に考えても最低2名以上の情報量を常にやりとりする（ハブになる）訳ですから、自分1人だけの作業で手一杯になっていたら回りません。

##具体的に何をすれば良いのか
まずは、自分以外の誰かに仕事を渡す場合に、どのくらいの情報量があれば良いかを常に考える癖をつけて下さい。

当然、渡す先の（受け取る側の）メンバの知識やスキルによって、必要な情報量が変わることは分かると思います。
だからこそ合わせて、誰がどのくらいの知識やスキルを持っているかも把握する必要があります。
チームが担う手作業の粒度では、リーダー自身しか出来ないタスクをゼロにすることが、目指すべき状態となります。


次に、他者の状況を把握する癖をつけて下さい。

ここで言う他者とは、最終的にはチーム外の人達にも及ぶのが理想ですが、まずはチームメンバとなる人達を想定して下さい。
状況把握の目的は、手が空いている／手が一杯になっている、どちらかの状態では無いことを認識することです。
手が空いている場合は、他のタスクを依頼しないと手持ち無沙汰となりチームのパフォーマンスが上がらないですし、手が一杯の時には他のタスクを受け取れないので、チーム外の人達からの依頼を断らなければいけない状態のはずだからです。


最後に、品質を確認する基準とタイミングを考えて下さい。

どの粒度で作業を依頼するかにもよりますが、多くの場合コーディング作業を任せているけれどソースコードのレビューでリーダーがレビューに時間を取られすぎて、リリースまでの時間が短縮できない状態になることが多くの現場で見られます。
コーディング規約レベルの指摘はまだマシな方で、要求仕様が曖昧なまま進めてしまい、実装が全部終わったタイミングで「そもそも仕様がおかしい」となってしまった場合には、大きな手戻りが発生する事になってしまいます。
他者へ依頼する場合には、必ず「この部分をここまでやって欲しい」という意図・ゴールイメージを持って依頼することが肝心です。

##おわりに
できるリーダーになるためには、できない（不慣れな）リーダーになる段階が必ずあり、不慣れでもリーダーになるためには、できるメンバであることが必須条件です。
自分の事すら出来ない人に他の人を含めたチームを任せることは、どのような業界や職種でも無いと思いますので、できるメンバになるためにも本記事の観点を活用して頂けますと幸いです。
はじめてのウェブサイト運用備忘録　第四弾

#独自ドメインを取得！
今回は、ロリポップから独自ドメインを取得する方法をご説明しようと思います。
とはいっても、ロリポップからドメイン自体を設定するのはそこまで難しくはありませんので、順を追って説明していきたいと思います。

#いざ、独自ドメインを取得しよう！
では、実際にロリポップ、そしてムームードメインを利用して独自ドメインを取得していきましょう！

##まずはロリポップへ
最初に、ロリポップのマイページから、独自ドメインを取得する画面まで移動しましょう。
そして、赤枠の部分をクリックしてください。
画面の例は下の画像をご覧ください。
<img width="500" height="auto" alt="screen1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556712/301439a7-7821-e334-3805-d88ff5c8cc87.png">
クリックすると、別タブでムームードメインへ移動しますので、そこからドメインの設定を始めてください。

##ムームードメインでドメインの決めよう！
ムームードメインに移動したら、このような画面が出てきます。
<img width="500" height="auto" alt="screen1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556712/e1b3d19f-cbb5-cd8b-27c7-32b12051f468.png">
この赤枠部分に、自分が取得したいドメインを入力して検索してみましょう。
そのドメインが使用可能かどうかが、次の画面でわかります。
<img width="500" height="auto" alt="screen1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556712/705f5ce7-d5c2-e53a-4373-6f7248545795.png">
この画像のように、使用可能なドメインを「カートに入れる」で購入することができるようになります。
ドメインの種類によって法人向け、個人向けがありますのでご注意ください。また、価格もそれぞれ大きく異なるので自分の目的に合わせたドメインを選択しましょう。

##ドメインを購入しよう！
カートに入れたドメインを確認して、購入の手続きを始めましょう。
以下は個人情報を含むため画像での説明はいたしません……。
ポップアップした画面に「お申込みへ」というボタンがあるので、そこから申し込みの作業を始めます。
その際、ムームードメインのアカウントを持っていなければユーザー登録が必要になります。
そこからはムームードメインの誘導に従って登録作業をしていきます。
DNSを選択する際には、ロリポップを選択することを忘れないようにしてください。
以上の設定が完了すると、ドメインの取得が完了します。

##ロリポップでドメインを設定しよう！
作成したドメインに、ロリポップからアクセスできるように設定しましょう。
下の画像の赤枠部分に情報を入力していきます。
<img width="500" height="auto" alt="screen1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556712/ad1af8c5-6e25-e193-2d89-fa8b7ef69062.png">
一番上の赤枠に取得したドメインを入力してください。
次に、公開するページを入れたフォルダを入力してください。このフォルダは、ロリポップで作成したドメイン直下にあるwebフォルダの下に自動で作成されます。ですので、自分でフォルダを作成する必要はありません。
また、このフォルダは作成しなくても自動で作成してくれるので空欄のままでも問題はありません。
最後に、準備ができたら一番最後の赤枠部分のボタンを押しましょう。
すると、ドメインが機能するようになります。

#最後に
ドメインを設定してから、大体一時間位でアクセスできるようになります。アクティブになるまではエラーがでるので不安だとは思いますが、これは待たないと仕方ありません……。
laravelでsqliteで接続していたDBをmysqlに切り替える方法

#前提条件
mysql -u rootで接続
テーブルはpostsテーブルを使用(id.titleのみの構造)
モデルはPost.php

```
mysql> desc posts;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| title | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
```

```
mysql> select *from posts;
+------+--------+
| id   | title  |
+------+--------+
|    1 | Yamada |
+------+--------+
```

```php:index.blade.php


  @forelse ($posts as $post)

  <tbody>
    <tr>
      
      <th scope="row">1</th>
      <td>  <a href="{{ action('PostsController@show', $post) }}">{{ $post->title }}</a>
</td>
      <td> <a href="{{ action('PostsController@edit', $post) }}" class="edit">[Edit]</a>
</td>
      
      <td> <a href="#" class="del" data-id="{{ $post->id }}">[x]</a>
      <form method="post" action="{{ url('/posts', $post->id) }}" id="form_{{ $post->id }}">
      {{ csrf_field() }}
      {{ method_field('delete') }}
    </form>
</td>

    </tr>
    @empty
@endforelse
```


#Postscontroller


```php:indexアクション
 public function index() { 
     $posts = Post::all(); 
     return view('posts.index', ['posts' => $posts]);
      }

```

#.env
.env変更後は$ php artisan config:cache実行

```php:sqlite接続時

DB_CONNECTION=sqlite

#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1 
#DB_PORT=3306
#DB_DATABASE=myblog
#DB_USERNAME=root
#DB_PASSWORD=
```

```php:mysql接続時　


#DB_CONNECTION=sqlite

DB_CONNECTION=mysql
DB_HOST=127.0.0.1  
DB_PORT=3306
DB_DATABASE=DB名
DB_USERNAME=root
DB_PASSWORD=
```

###database.phpは特に触らず

```php:config/database


  'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'myblog'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

```
表示されました！

![スクリーンショット 2020-01-11 20.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/517a0a36-c33f-309f-0046-16f38205c186.png)