OmniAICreator/Qiita-1.07M huggingface dataset:
PHPとMySQLの接続方法をいろいろ比較した


昔PHPの学習をしていた時、PHPとデータベースの色々なDB接続方法を調べたのでそれを纒めました。
かなり古い実装方法も記載してある為、万一この記事を参考にする場合は、非推奨と書かれていない方法で実装することをオススメします。

##mysql_connect関数を使う(非推奨)
公式サイトによると、``mysql_connect``は PHP5.5.0で非推奨になり、PHP 7.0.0で削除されています。
よほど古いサイトの改修などに関わる時以外は使う事はまず無いでしょう。
他にも[ほとんどのmysql関数](https://www.php.net/manual/ja/ref.mysql.php)が非推奨または削除となっています。


```php:mysql_connect
// DBへ接続
$link = mysql_connect('localhost', 'user_name', 'password');
if(!$link){
    die("データベースの接続に失敗しました");
}

// データベースの選択
$db_selected = mysql_select_db('db_name' , $link);
if(!db_selected){
    die("データベースの選択に失敗しました");
}

// クエリの実行
$query  = "SELECT * FROM TABLE_NAME";
$result = mysql_query($query);

// 表示処理
while($row = mysql_fetch_assoc($result)){
    echo $row["name"];
}

// 接続を閉じる
mysql_close($link);
```
**使用関数**

- mysql_connect()
- mysql_select_db()
- mysql_query()
- mysql_close()

##mysqli関数(オブジェクト指向)

``mysql_connect``が削除されたのでその代替方法として用意されているのが``mysqli``関数です。
``mysqli``関数は``オブジェクト指向``と``手続き型``の２パターンでの実装が可能です。これは``mysql_connect``からの移行を配慮して後方互換の為に残しておいたものらしいので、基本的にはオブジェクト指向の方で実装すれば良いかと思います。

```php:mysqli【オブジェクト指向】

// DBへ接続
$mysqli = new mysqli('localhost', user_name, password, db_name);
if (mysqli_connect_error()){
    die("データベースの接続に失敗しました");
}

// クエリの実行
$query = "SELECT * FROM TABLE_NAME";
$stmt  = $mysqli->prepare($query);
$stmt->execute();

// プリペアドステートメントに変数をバインドする
$stmt->bind_result($name, $email);

// 表示
while($stmt->fetch()){
    echo $name;
    echo $email;
}

// 接続を閉じる
$mysqli->close();
```
**使用関数一覧**

- mysqli()
- mysqli_connect_error()
- prepare()
- execute()
- bind_result()
- fetch()
- close()

##mysqli関数(手続き型)
```php:mysqli【手続き型】

// DBへ接続
$link = mysqli_connect('localhost', user_name, password, db_name);
if(!$link){
    die("データベースの接続に失敗しました");
}

// クエリの実行
$query = "SELECT * FROM TABLE_NAME";
$stmt  = mysqli_prepare($link, $query);
mysqli_stmt_execute($stmt);

// プリペアドステートメントに変数をバインドする
mysqli_stmt_bind_result($stmt, $name, $email);

// 表示
while(mysqli_stmt_fetch($stmt)){
    echo $name;
    echo $email;
}

// ステートメントを閉じる
mysqli_stmt_close($stmt);

// 接続を閉じる
mysqli_close($link);

```

**使用関数一覧**

- mysqli_connect()
- mysqli_prepare()
- mysqli_stmt_execute()
- mysqli_stmt_bind_result()
- mysqli_stmt_close()
- mysqli_close()

##PDOを使用する
PDOとは``PHP Data Objects``の略で、PHPからデータベースのアクセスを抽象化してくれるものです。PDOで実装したソースコードは``mysql``に依存しないので、他のデータベースに移行する場合も比較的容易になります。
特に理由が無ければPDOで実装すると良いかと思います。

```php:PDO
$dsn      = 'mysql:dbname=db_name;host=localhost';
$user     = 'user_name';
$password = 'password';

// DBへ接続
try{
    $dbh = new PDO($dsn, $user, $password);

    // クエリの実行
    $query = "SELECT * FROM TABLE_NAME";
    $stmt = $dbh->query($query);

    // 表示処理
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        echo $row["name"];
    }

}catch(PDOException $e){
    print("データベースの接続に失敗しました".$e->getMessage());
    die();
}

// 接続を閉じる
$dbh = null;
```

サンプルソースにある``query``はSQLを一行だけ実行する場合に使用します。
複数行まとめて実行する場合は``exec``を使用します。
``PDO::exec()``は複数行まとめて実行で``PDO::query()``一行実行です。

**使用関数一覧**

- query()
- fetch()
- die()

#まとめ
以前調べた時もmysql_connectは非推奨だったけど、いつの間にか完全に削除されてしまってました。
今はPDOを使用するのがベターな選択かと思いますが、その時の主流に合わせて最適な実装方法選択する必要があると思いました。
Mac上でVirtualBoxをインストールして、CentOS 8を構築した時の詰まった点

#はじめに
Linuxの勉強のため、Mac上でVirtualBoxをインストールして、CentOSを構築することにした。
[MacでVirtualBoxを使ってCentOS 7をインストールしてみた](https://qiita.com/nooboolean/items/de4e6bbae5df040177af)
上記記事がインストールする上でとても参考になったが、CentOSがバージョン８になった影響もあり、いくつか内容が異なる点があった。今回は詰まった点や異なった点を中心に書きたいと思う。（すでに他の記事で載っているものは一部割愛する。）

#スペック
・MacBook Pro 2017
・MacOS 10.13.6
・CentOS 8.1.1911
・Virtualbox 6.1.4

#詰まった点①　CentOSでどれをダウンロードすればいいのか

[公式](https://www.centos.org/)にアクセスし、CentOSのインストールにてGet CentOS Nowをクリック。

<img width="1088" alt="スクリーンショット 2020-04-15 18.31.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/5629a36a-a3c1-3410-e4f5-dfeb61f00117.png">

その際、CentOS Linux DVD ISOとCentOS Stream DVD ISOでどっちをクリックすればいいか迷う。

<img width="1079" alt="スクリーンショット 2020-04-15 18.33.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/436740f3-67d7-658b-cbce-f4bbc25610e8.png">

https://hackers-high.com/linux/centos8-installation/
上記サイトによると「CentOS LinuxはCentOS 7 までのような、従来型のリリース」「CentOS Streamはいわゆるローリングリリース（更新が頻繁にリリースされるリリースモデル）」とのこと。
基本的には「CentOS Linux」を選んでおけば間違いとのことで、こちらを今回はダウンロード。


#詰まった点②　Mirror Listどれ選べばいいのか
https://cpoint-lab.co.jp/article/201910/12210/
上記サイトにて「“The following mirrors in your region”にリストされているリンクが自分のPCからネットワーク的に近いサーバーになりますので、この中から一つからダウンロードすればOKです。

個人的にはIIJのサーバー( http://ftp.iij.ad.jp/pub/linux/centos/…… )がおすすめです。」
とのことでIIJを選択。（ただ他のサイト見ていても、日本だったらどれでもOKそう）


#詰まった点③　CentOSダウンロード後、開こうとすると「CentOSマウントできるファイルシステムがありません」と表示される
https://teratail.com/questions/208840
上記URLの内容参照。「設定→ストレージ仮想光学ディスクファイルを選択… を選択→CentOSのISOファイルを選択」
仮想環境内のストレージファイルを選択することにより、CentOSを入れることが可能になる。
<img width="771" alt="スクリーンショット 2020-04-15 19.52.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/23f14deb-5f47-9926-d9ec-a7ecfedb17d1.png">


#詰まった点④　CentOSインストール後に再起動しても初期画面に戻る
https://qiita.com/4EAE_Learner/items/01cd1a63aa7f5022c7d4
上記URLを参照。初期だと起動時のブートメディアが光学→ハードディスクの順に担っている。しかしハードディスク→光学の順に入れ替えることで、無事CentOS8の画面が立ち上がる。
PHPでの文字の表示とHTMLタグにPHPを埋め込んだ

初投稿。
Qiitaの使い方のテストを兼ねて投稿します。

```php:test.php
<p><?php print('phpを勉強'); ?></p>
<a href="<?php print('https://dmk7.info'); ?>">タグにphpを埋め込んだ</a>
```
【RSpec・Modelsテスト】画像を複数投稿するカラムを持つモデルでのテストデータの作り方・テストの通し方


####環境
carrierwave
rails 6.2.0
capybara                3.28.0
rspec-rails
rails-controller-testing 1.0.4
factory_bot_rails

##前提
- @postというモデルがある。
- @postモデルは@userが投稿する。
- @postモデルは次のカラムを持つ。 

| 　　型　  　|  カラム名 |   
|:-----------------|-------
| string    |  name   |      
| text      | content |      
| string    |  picture|   
| string    |  user_id|   

- pictureカラムには画像が複数はいる。（つまり複数投稿できる。）

- FactoryBotと書くのを省略するため、以下を記述します。

```spec/rails_helper.rb
~~省略~~
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods  #記述する
end
~~省略~~
```
##postモデルのバリデーション
postモデルのバリデーションは以下の通りです。

```app/model/post.rb
class Post < ApplicationRecord
  belongs_to :user 
  has_many :pictures, dependent: :destroy
  mount_uploaders :picture, PictureUploader
  serialize :picture, JSON  #pictureはjson型です
  validates :user_id, presence: true
  validates :content, presence: true
  validates :name, presence: true
  validates :picture, presence: true
end
```

##今回通したいテスト
今回通したいテストはこちらです。

```spec/models/post.spec.rb
require 'rails_helper'

RSpec.describe Post, type: :model do

  it "name、content、picture、user_idがある場合有効である" do
    post = create(:post)

    expect(post).to be_valid
  end
  end
```

##factoryを使ってテストデータを作成する

```spec/factories/posts.rb
FactoryBot.define do
  factory :post do
    user_id {"1"}
    name { "test" }
    content { "tester" }
    picture { [ Rack::Test::UploadedFile.new(Rails.root.join( 'app/assets/images/test.png'), 'app/assets/images/test.png')  ]} #画像はjson型なので[]で画像データを囲む必要がある。
    association :user #@postモデルは@userが投稿するので、関連付けを定義する。
  end
end
```
※テストデータのカラムは必ず { }　で括ってください

###詳細説明

####画像を投稿する様のテストデータを作成
app/assets/imagesにテストデータとしてtest.pngを配置します。


####Rack::Test::UploadedFile.new(Rails.root.join()オブジェクト


Rack::Test::UploadedFileを指定すればRailsでは画像として認識してくれます。
Rack::Test::UploadedFileの引数として画像のパスをRails.root.joinで指定します。

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Use-test-factories

####投稿する画像がjson型の場合は[]で画像データを囲む

投稿される画像の型はjson型なので画像データを[]で囲む必要があります。
[]がない状態でテストをすると```path name contains null byte```と表示されテストが通りません。

####アソシエーションの定義
@postは@userが投稿するので、ファクトリ内で```association :user ```を定義する必要があります。


参考URL
https://qiita.com/tanegashiman/items/9dcd872e3d84dca2d57c
Nuxt.jsでアイコンとスタイルをカスタマイズしたGoogle mapを埋め込む

nuxt.jsを使った案件でGoogle mapをカスタマイズする必要があり、アイコンもスタイルも変更〜という記事が意外と見つからなかったので覚え書きです。
初学者向け。

方法は色々あると思いますが、今回は[vue2-google-maps](https://www.npmjs.com/package/vue2-google-maps)を使ったやり方を紹介します。

# ファイル構成

```
assets
 ∟ img
  ∟ pin.png
pages
 ∟ map
  ∟ index.vue
plugins
 ∟ vue2-google-maps.js
nuxt.config.js
```
# 手順
[vue2-google-maps](https://www.npmjs.com/package/vue2-google-maps)の手順の中にある[Example project by Alexander Lichter](https://codesandbox.io/s/31j9l75xjm)を参考にしていますので、まずは一度目を通すことをおすすめします。

## vue2-google-mapsをインストール

まず最初に`nuxt.config.js`があるディレクトリに移動し、` npm i vue2-google-maps`でvue2-google-mapsをインストールします。（npm推奨とのこと）

## plugins/vue2-google-maps.jsを作成
`plugins`ディレクトリに`vue2-google-maps.js`を作成します。
Google map APIキーは[Google Map Platform](https://cloud.google.com/maps-platform?hl=ja)で取得しましょう。
キー作成時に登録するURLと実際にマップを表示させるURLが異なるとエラーになるので注意してください。

``` ruby:plugins/vue2-google-maps.js
import Vue from 'vue'
import * as VueGoogleMaps from 'vue2-google-maps'

Vue.use(VueGoogleMaps, {
  load: {
    key: 'Google map APIキー',
    libraries: 'places'
  }
})
```

## nuxt.config.jsを編集
続いて`nuxt.config.js`に下記の内容を加えます。

``` ruby:nuxt.config.js
export default {
  plugins: [
    '~/plugins/maps.js'
  ],
  build: {
    transpile: [/^vue2-google-maps($|\/)/]
  }
}
```


## Google mapを表示させたいページにコードを追加する
`<GmapMap></GmapMap>`にマップが表示されるので、好きな場所に挿入してください。

``` ruby:pages/map/index.vue
<template>
  <div>
    <GmapMap
      :center="{lat:35.681214, lng:139.767050}" //中心に表示させたい座標
      :zoom="16" //地図の縮尺（数字が大きいほどズームされる）
      v-bind:options="options"
      map-type-id="terrain"
    >
      <GmapMarker
        :key="index"
        v-for="(m, index) in markers"
        :position="m.position"
        :clickable="true"
        :draggable="true"
        :icon="{url: require('~/assets/img/pin.png')}" //カスタムアイコン
        @click="center=m.position"
      />
    </GmapMap>
  </div>
</template>
<script>
  export default {
    data () {
      markers: [
        { position: { lat:35.681214, lng:139.767050 } }, //ピンを表示させたい座標
        { position: { lat:12.345678, lng:123.456789 } } //ピンを複数場所に表示させたい場合はこのように繋げればOK（上段の末尾に,をつけること）
      ],

      options: {
        styles: [
          // 任意のスタイル
        ]
      }
    }
  }
</script>
```

カスタムアイコンを使わない場合、`<GmapMarker />`内の` :icon="true"`とすると見慣れた赤いピンが表示されます。

任意のスタイルには、[Create map style](https://mapstyle.withgoogle.com/)のような便利なサイトで簡単にjsonを生成できるので、それをコピペします。

**コピペする際の注意点**
eslintを入れている場合、そのままだとエラーが大量に検出されてしまいます。
下記のように、プロパティ名のクォートは外して、値のダブルクォートはシングルクォートに変更してください。

```
{
  elementType: 'geometry',
  stylers: [
    {
      color: '#f5f5f5'
    }
  ]
}
```

以上で、オリジナルのgoogle mapが表示されるはずです！
vueはまだまだ勉強中なため不備があるかもしれません。。ご了承ください。
Dockerで立ち上げたGitLab MattermostでMattermost CLIを利用する

## はじめに
どうも！生産技術部のエンジニアです。Mattermostでチームを削除する際に、Mattermost CLIを利用する必要がありました。Mattermost CLIを利用する手順を紹介します。

## 環境
```bash
$ mattermost-cli version
Version: 5.14.0
Build Number: 5.14.2
Build Date: Fri Aug 30 20:20:48 UTC 2019
Build Hash: 817ee89711bf26d33f840ce7f59fba14da1ed168
Build Enterprise Ready: false
DB Version: 5.14.0
```

## Mattermost CLIコマンドの使い方
コンテナの中に入り、Mattermost CLIを実行するため、コンテナ名を最初に取得する。

```bash
$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                                                    NAMES
4d4ad6e1cce0        gitlab/gitlab-ce:latest       "/assets/wrapper"        2 weeks ago         Up 2 weeks (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8001->8001/tcp, 0.0.0.0:4022->22/tcp   gitlab_gitlab_1
af2b84a72d28        gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   2 weeks ago         Up 2 weeks                                                                                                      gitlab_runner_1
```
コンテナ名が確認出来たら実際に中に入り、Mattermost CLIを実行する。

```bash
# コンテナの中に入る
$ docker exec -it gitlab_gitlab_1 bash
# Mattermostユーザになる
root@10:/# su - mattermost
# bashを起動する
$ bash
# 下記フォルダに移動し、cliコマンドでversion情報を取得
mattermost@10$ cd /opt/gitlab/embedded/service/mattermost
mattermost@10:/opt/gitlab/embedded/service/mattermost$ /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/mattermost/env/ -P -U mattermost:mattermost /opt/gitlab/embedded/bin/mattermost --config=/var/opt/gitlab/mattermost/config.json version
    :
   (略)
    ：
Version: 5.14.0
Build Number: 5.14.2
Build Date: Fri Aug 30 20:20:48 UTC 2019
Build Hash: 817ee89711bf26d33f840ce7f59fba14da1ed168
Build Enterprise Ready: false
DB Version: 5.14.0
```
## エイリアスの設定
CLIコマンドが長いため、[GitLab#mattermost-command-line-tools-cli](https://docs.gitlab.com/omnibus/gitlab-mattermost/#mattermost-command-line-tools-cli)を参考に、エイリアスを設定する。
**※公式に記載されている-uオプションは、エラーが出たため削除しました。**

```bash:~/.bashrc
$ alias mattermost-cli="cd /opt/gitlab/embedded/service/mattermost && /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/mattermost/env -P -U mattermost:mattermost /opt/gitlab/embedded/bin/mattermost --config=/var/opt/gitlab/mattermost/config.json $1"
```

### 例）チーム一覧を取得
エイリアスを張った`mattermost-cli`コマンドでチームの一覧を取得してみます。

```bash
$ mattermost-cli team list
bench
elec
training
tomoyuki
```
Azure Web Apps にデプロイした ASP.NET Core アプリのレスポンスヘッダを制御する

# Azure Web Apps にデプロイした ASP.NET Core アプリのレスポンスヘッダを制御する

\# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.201), ASP.NET Core 3.1 (3.1.3) となります.

セキュリティ監査とかでヘッダを制御しないといけない人向け.

まず、そもそも Azure Web Apps ではアプリは IIS 上にホスティングされるので、IIS の設定で制御できる. IIS の設定は当然 web.config です.

```xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By"/>
        <add name="X-Custom-By-Configuration" value="USO800"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>
```

これで X-Powered-By を消しつつ、X-Custom-By-Configuration というフィールドをレスポンスヘッダに追加できます.

コードでやりたい場合には Startup.cs の Configure の中で

```csharp
app.Use((context, next) =>
{
    context.Response.Headers["X-Custom-By-Code"] = "USO800";
    return next.Invoke();
});
```

みたいに書けば、X-Custom-By-Code というフィールドをレスポンスヘッダに追加できます.
アトラシアンの「小さなチームの大きな夢をかなえる無料サービス」をいろいろ登録してみた

初めてQiitaに記事を書きます。

# はじめに

2020年3月末に退職しまして、これまで使ってきたソフトウェアの開発環境（Jira/Confluence/Bitbucketなど）を使えなくなったので、新しく環境整備することになりました。

# サービス選択

アトラシアン製品は10名までの少人数チームの場合、1製品10ドルのサーバー版か、1製品あたり月10ドルのクラウド版のどちらかで（日本だと10ドルじゃなくて1,200円）、サーバー管理作業はサービス提供用の環境だけにしたかったので（少人数チームだと社内用のインフラくらいは楽したいので）、クラウド版を選んできました。

で、2020年3月のこのニュース。

アトラシアン、JiraやConfluenceなど期限なく無料提供開始。10名以下のチームに
https://www.publickey1.jp/blog/20/jiraconfluence10.html

We’re making our remote-friendly software products available for free
https://www.atlassian.com/blog/announcements/atlassian-cloud-remote-friendly-tools-free-small-teams

日本語ブログはこちら。

リモートワークを支援するアトラシアン製品を無償で提供
https://www.atlassian.com/ja/blog/atlassian-cloud-remote-friendly-tools-free-small-teams

> 本日より、Jira Software、Confluence、Jira Service Deskおよび Jira Core のクラウド版を無償で利用することができます。これまでに無償ライセンスを提供してきたTrello、BitbucketおよびOpsgenieにこれらの製品が加わることにより、あらゆるチームにコラボレーションを促進する優れた機能セットを提供します。これらの無償製品へは、www.atlassian.com/ja/free よりアクセス可能です。

Jiraは使うとして、Confluenceの代わりに[Notion](https://www.notion.so)とか、BitbucketじゃなくてGitHubかGitLabとか、Jiraとは別の会社の製品を使おうかなとか思ったんですが（すべて使えなくなるのは困るなという漠然とした不安）、JiraもConfluenceも2005年くらいからずっと使ってるし、同じ会社のサービスの方が連携させるの楽だし、これまで通りの環境をあらためて整えていくことにしました。

# 小さなチームの大きな夢をかなえる無料サービス

ひとまず、

小さなチームの大きな夢をかなえる無料サービス
https://www.atlassian.com/ja/software/free

に載っている、

- Jira Software
- Confluence
- Bitbucket
- Jira Service Desk
- Jira Core

を登録してみました。

Jira Coreは勢いで登録してしまいましたが、Jira Softwareに含まれている気がするので、無意味だったかも。
まだ、僕一人しか使ってないので、Jira Coreは誰も使っていないことになっている…

<img width="955" alt="subscription.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/6910c3fb-3ea5-ff50-2a2e-71165bc42948.png">

無料で使い続けられるのは、あとTrelloとOpsGenieとStatuspage（Statuspageを見落としていたので、2020年5月13日追記）。

Trelloは、ソフトウェアエンジニア以外との課題管理に使ってましたが、また必要になったらでいいやと今回は登録せず。

OpsGenieは、Essentialsプランを14日間無料トライアル後に無料版になるので、しっかり試すときのために取っておくことにしました。すぐに監視・通知が必要ではないし。

ちなみに、これまではPagerDutyを使っていました。かなり前から使っていて、契約当時の安い価格で使えていたので、OpsGenieに乗り換えて同価格のプランにすると使えない機能があったので、これまでは乗り気じゃなかったんですが、あらためて見るとOpsGenieの方が便利そうな感触です。

Statuspageは、Site24x7やUptime Robotを使ってました。ステータスページ目的じゃなくて、外形監視目的ですが。
コヒーレントポテンシャル近似 (CPA)

# 一般論
　不規則系の理論研究で非常によく使われる近似手法の1つ：CPA (coherent potential approximation) についてまとめておく[^1]．

## 基本事項
　次のハミルトニアン$\mathcal{H}$で記述される1粒子問題を考える：
$$\mathcal{H}:=\sum\_{k\alpha\alpha'}|k\alpha\rangle(\hat E_k)\_{\alpha\alpha'}\langle k\alpha'|+\sum\_{i\alpha\alpha'}|i\alpha\rangle(\hat V_i)\_{\alpha\alpha'}\langle i\alpha'|,\tag{1}$$ここで$|k\alpha\rangle$と$|i\alpha\rangle$はそれぞれ波数$k$とサイト$i$によって指定される1粒子状態であり，$\alpha$は状態を指定するために必要なその他の量子数の集まりとする．$\hat E_k$と$\hat V_i$は遷移確率振幅を表し，ハット記号は$\alpha$を添字とした行列になっていることを意味する．また，
$$|i\alpha\rangle=\frac{1}{\sqrt{N}}\sum_k \mathrm{e}^{\mathrm{i}k R_i}|k\alpha\rangle,\tag{2}$$の関係にある．$R_i$はサイト$i$を表す位置ベクトル，$N$は全サイト数である．$k$や$R_i$は空間の次元に合わせて適当なベクトル量であるとする．
　この模型において，オンサイトエネルギ$\hat v_Q$を持つ$M$種類のイオン$Q=1,2,\ldots,M$が不規則に配置され，$\hat V_i$がこのどれかの値を確率 (または濃度) $c_Q$で取るものとする．この問題をCPAで扱うとき，コヒーレントポテンシャル$\hat\Sigma(z)$は次の連立方程式 (CPA条件) から決定される：
$$\hat G(z)=\frac{1}{N}\sum_k\frac{1}{z\hat 1-\hat E_k-\hat\Sigma(z)},\tag{3a}$$$$\hat G(z)=\sum_Q c_Q\frac{1}{\frac{1}{\hat G(z)} -\hat v_Q+\hat\Sigma(z)},\tag{3b}$$ここで，$\hat G(z)$は局所Green関数，$\hat 1$は単位行列であり，また
$$\sum_Q c_Q=1,\tag{4}$$である．コヒーレントGreen関数は
$$\hat G_k(z)=\frac{1}{z\hat 1-\hat E_k-\hat\Sigma(z)},\tag{5}$$である．

## 数値計算法
　CPA条件 (3) は，いわゆるself-consistent方程式となっており，非常に簡単な場合以外では数値計算によってのみ解くことができる．ここではTurekらの手法[^2]を紹介する．多少アレンジされているが[^3]，$n$回目のイタレーションに用いる漸化式は$$\hat\Sigma_n=\hat\Sigma_{n-1}+\frac{1}{\hat G_{n-1}}-\left(\sum_Q c_Q\frac{1}{\frac{1}{\hat G_{n-1}}-\hat v_Q+\hat\Sigma_{n-1}}\right)^{-1},\tag{6a}$$$$\hat G\_n=\frac{1}{N}\sum_k\frac{1}{z\hat 1-\hat E_k-\hat\Sigma\_n},\tag{6b}$$である．ここで，第$n$回目のイタレーションで得られるコヒーレントポテンシャルを$\hat\Sigma_n$，それを用いた局所Green関数を$\hat G_n$と書いた．
　具体例として，エネルギ$\epsilon$におけるコヒーレントポテンシャルの遅延成分を求めることを考えよう．

1. 初期値：$\hat\Sigma\_0$を与える．例えば，$\hat\Sigma\_0=\sum\_Q c\_Q \hat v\_Q-\mathrm{i}\delta\hat 1$とする．$\delta>0$は十分小さい実数とする (ここで「遅延」という情報が入る)．
1. $\hat G_0=\frac{1}{N}\sum_k\frac{1}{\epsilon\hat 1-\hat E_k-\hat\Sigma_0}$を計算する．ここで$\epsilon$の情報が入る．
1. $\hat\Sigma_1=\hat \Sigma_0+\frac{1}{\hat G_0}-\left(\sum_Q c_Q\frac{1}{\frac{1}{\hat G_0}- \hat v_Q+\hat\Sigma_0}\right)^{-1}$を計算する．
1. $\hat G_1=\frac{1}{N}\sum_k\frac{1}{\epsilon\hat 1-\hat E_k-\hat\Sigma_1}$を計算する．
1. 以下同様．

上記のイタレーションを，$\hat\Sigma_n$の変化が十分小さくなるまで続ける．コヒーレントポテンシャルの先進成分を求めるときは$\delta<0$に選べば良い．


# 具体例

簡単に解ける問題や適用例．
手で解ける，またはMathematicaでお手軽に数値計算できるような例を追記予定．

[^1]: 解説文献は論文，和・洋書と多数ある．例えば，松原武生編「物性I─物質の構造と性質　新装版　現代物理学の基礎6」，岩波書店 (2011)，p. 407 (米沢富美子担当の付録) がある．付録なのでコンパクトである．最近出た和書では同じく米沢富美子の「不規則系の物理――コヒーレント・ポテンシャル近似とその周辺」，岩波書店 (2015) がある．こちらは岩波での誤植が修正＆大幅に加筆された結果，1冊の本になっている．手っ取り早くCPAを理解したい者 (または使いたい者) には向かない．CPAに至る歴史や数学的根拠に興味がある者向け．

[^2]: I. Turek, V. Drchal, J. Kudrnovsky, M. Sob, P. Weinberger, _ELECTRONIC STRUCTURE OF DISORDERD ALLOYS, SURFACES AND INTERFACES_, Kluwer Academic Publishers (1997), p. 299.

[^3]: private communication.
1分でgolangでHello World を表示する。

# 環境
docker for windows
PowerShell

# コマンド

```
>docker pull golang
>docker run --name golang -it golang /bin/bash
root@*******:/go# git clone  https://github.com/go-training/helloworld.git
root@*******:/go# go run helloworld/main.go
Hello World!!
```

# 備考
docker for windowsが入っていないと時間がかかります。
リモートデスクトップを使ってスマホ一台でラズパイに接続する

#経緯

近頃話題の某COVID-19の影響で、私の学校も遠隔授業になるかもしれないということで、~~とても喜ばしい~~非常に残念です。
さて、弊校の授業ではRaspberry Piを使うのですが、あいにく私の自宅にはモニターがありません。PCでリモートデスクトップ接続を行うことで操作はできますが、せっかくなのでスマートフォン一台で完結できないかな...ということでやってみました。(学内(初心者)向け記事ですので細かい点などにはご容赦ください)


##準備するもの
- Raspberry Pi
- Micro SDカード
- Androidスマートフォン(Micro SDカードが刺さるもの)
- [ Microsoft Remote Desktop](https://play.google.com/store/apps/details?id=com.microsoft.rdc.android)


##筆者の実行環境
- Raspberry Pi 3B
- TOSHIBA製MicroSDカード 32GB
- One UI 2.0(Android 10)
- Microsoft Remote Desktop(8.1.79.421)    

##作業を始める前に
当然ですがラズパイ、スマホ共に電源を切りましょう。データが飛ぶ可能性があります

##MicroSDカードの抜き差し
これができない人が一定数いるので一応解説しておきます。![17ACC48D-2CB8-435A-A6CF-1969EF3F8E12.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543144/f6cfeeec-c2e3-09a5-da69-f63d643f1e8d.jpeg)

まずスマートフォンにはどこかにこういう穴といかにも抜けそうなスロットがあると思います。その穴に手ごたえがあるまで安全ピンなどを押し込めば勝手に出てきます(一応スマホに付属しているはずです)

##ネットワークの設定
もちろん普通に設定してもよいですが、今回はスマホだけで行うので、MicroSDカードに直接設定を書き込むことで実現します。
https://mascii.github.io/wpa-supplicant-conf-tool/ にアクセスして、ネットワーク設定用のファイルを作ってください(詳しい使い方は[こちら](https://qiita.com/mascii/items/a43d71572e1919e56398))
できたファイルをMicroSDカードのルートディレクトリ(一番上の階層)に貼り付けます
**このときに注意なのですが、**ダウンロード時に拡張子が~.conf.txtのように付け足されている場合があるので必ず確認して、.txtの部分を削除して下さい。
また、勝手にいろいろフォルダができると思いますが、何かあっても面倒なので削除しておくことをお勧めします。
終了したらMicroSDカードをラズパイに刺しなおして終了です。

##接続
まずはラズパイを電源に接続します。
そのあとにRemote Desktopアプリを起動し、右上の+マークからDesktop→ADD MANUALYを選択します。
その後にホスト名などの項目を入力し、右上のSAVEを押して保存します。
するとホーム画面に設定したウィンドウが出るので、そこを押して接続します
あとはIDとパスワードの入力を求められる画面になれば成功です。
このときのログインIDとパスワードは、デフォルトではUser:pi、Password: raspberryとなっているので、それでログインしましょう。
##余談
設定自体はMicroSDカードの刺さる端末でないと無理ですが、その後はiOS端末などでも接続が可能です。iPadあたりで使うのが無難だと思います。

##詰まったとき
-ネットワーク設定のファイルの作成からやり直す(typoなど)
-ホストなどの設定を見直す
-ラズパイが死んでないか確認する

##感想
操作性が悪い
GR バックエンドの Plots.jl で日本語かけるでキュ！

# 本日は

- Plots.jl GRバックエンド(デフォルトではこれのはず) で日本語がタイトル，ラベルにつけられたことを確認できました.
- Julia 公式 Slackの `plotting` チャンネルで GR.jl の開発者のコメントを眺めてたらできるかもとということで試したら無事できたという経緯があります.
- 動作環境は 2018 MacBook Air です．

# 動かそう

普段のロジックに

- `ENV["GKS_ENCODING"]="utf8"` 
- `fontfamily="serif-roman"` (← 明示する必要なかった）

を入れておけば良さそう．

```julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.4.0 (2020-03-21)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> # Plots, GR のバージョンを確認
(@v1.4) pkg> st Plots GR
Status `~/.julia/environments/v1.4/Project.toml`
  [28b8d3ca] GR v0.48.0
  [91a5bcdd] Plots v0.29.9
julia> ENV["GKS_ENCODING"]="utf8" # 最初に行う
"utf8"
julia> using Plots
julia> plot(randn(10),title="ゴマちゃん日本語できたよ",xlabel="x軸だよ",ylabel="y軸だよ",fontfamily="serif-roman")
julia> backend() # Plots のバックエンドを確認
Plots.GRBackend()
```

## 補足

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Plots.jl Version 1.0 has been released! <br><br>Congrats to the core JuliaPlots team and all of the contributors over the years that helped get the package to where it is today. <br><br>Read more about the release here: <a href="https://t.co/2zH0acHnRB">https://t.co/2zH0acHnRB</a></p>&mdash; The Julia Language (@JuliaLanguage) <a href="https://twitter.com/JuliaLanguage/status/1247519089033125890?ref_src=twsrc%5Etfw">April 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- 上で試した Plots.jl は古かったので．Pkg REPL に入って

```julia
(@v1.4) pkg> add Plots@1.0.8
```

をすることでバージョンを切り替えられます．

```julia
(@v1.4) pkg> st GR Plots
Status `~/.julia/environments/v1.4/Project.toml`
  [28b8d3ca] GR v0.48.0
  [91a5bcdd] Plots v1.0.8
```

この場合でも同様です

# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135978/065c784c-c0b7-8ce5-8432-42bb4934114d.png)

これで気兼ねなく日本語の説明もかけますね．
ScrollView配下のExpandableListViewが展開できない


# 概要

折りたたみ式のViewを作りたいときにたまーに使う[ExpandableListView](https://developer.android.com/reference/android/widget/ExpandableListView)ですが、ScrollView配下にあるとうまく展開されず

parentとchildそれぞれのadapterにデータが正常にセットされているのに・・・

原因はListViewを継承しているので、これ自身がスクロールすることが可能
そのため、スクロールできるものにスクロールできるものが入るのが落とし穴というわけでした・・

`ScrollView in ListView`とかでググるとまさにこの問題が多く出てくるのですが、今回はExpandableListView自体にスクロールさせる必要は皆無であったため、スクロール自体をなくす方向で修正

# 実装

```kotlin
class NonScrollExpandableListView : ExpandableListView {

    constructor(context: Context) : super(context)

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
        context,
        attrs,
        defStyle
    )

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        val expandSpec =
            MeasureSpec.makeMeasureSpec(View.MEASURED_SIZE_MASK, MeasureSpec.AT_MOST)
        super.onMeasure(widthMeasureSpec, expandSpec)
        val params = layoutParams
        params.height = measuredHeight
    }
}
```
子Viewにわたすサイズ自体を明確に指定してあげるということですね

これをXMLにて入れればうまく展開できました



# 参考
https://stackoverflow.com/questions/18813296/non-scrollable-listview-inside-scrollview
【Docker】環境構築について

#導入のメリット
 コンテナの中に環境を作って開発をする事で、同じ開発環境を簡単に複数人で共有できる為、各ローカル環境での差による調整が必要ない。
例えば、mac、windows、Linuxを使う人が一緒に開発をする場合でも、それぞれでDockerを入れておけば同じ環境をすぐに立ち上げられる。
その便利さからエンジニアはDockerを使えて当たり前、という風になっている。
#homebrew のインストール

Macの場合、rubyのインストールを初め、その他パッケージのインストール、管理に、homebrewをインストールします。ターミナルにて下記コマンドを入力。
>　ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

#Docker のインストール
続いて、Dockerのインストールを先程のhomebrewで行います。
>brew update
brew install caskroom/cask/brew-cask
brew cask install docker

#Docker の操作
- Docker のイメージ構築、コンテナ構築と起動

>docker-compose up --build

- Docker での開発を中断

>docker-compose stop

- 動作停止と、同時にイメージやボリュームを削除する

>docker-compose down

- 動作再開　Dockerコンテナを起動

>docker-compose up 


# 参考

この記事は以下の情報を参考にして執筆しました。


- [【簡単】MacにHomebrewをインストールする方法と基本的な使い方](https://fukatsu.tech/homebrew)
- [docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f)

# 終わりに
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございます。
ALB + EC2 httpdで構築したサーバーにiPhoneでのみアクセスできない時

# 事象
ALB + EC2 httpdで構築したWebサーバーに、iPhoneでアクセスをすると
「このサイトにアクセスできません」
って怒られた。SafariでもChromeでもダメ。
PC・Androidは問題なくアクセス可能。

# 結論
HTTP/2で通信すると上記事象が発生しうるので、HTTP/1.1にする。

# 手順
### 1. ALBのHTTP/2の無効化
EC2 -> ロードバランサー -> ALBを選択 -> 説明 -> 属性の編集 -> HTTP/2 有効化のチェックを外す。

### 2. httpd.confの設定確認
```httpd.conf
<IfModule mod_http2.c>
    Protocols h2 h2c http/1.1
</IfModule>
```

ここを、以下に書き換える。

```httpd.conf
<IfModule mod_http2.c>
    Protocols http/1.1
</IfModule>
```

書き換えたら、httpdを再起動してiPhoneで確認。
Vuetify2.x 色々カスタマイズしたいときのTips

## はじめに

以前 [Vuetify2.x でよく使うUIComponents まとめ](https://qiita.com/is_ryo/items/6bfa55599becd2f35879) という記事を書きました。
私はずっとVuetifyを使っていて、基本的に用意されているUIコンポーネントを組み合わせてWebアプリの画面を作っています。
上記の記事でも紹介しているように、Gridデザインや、Tableやカレンダーといった、自前でやろうと思うとちょっとつらいな…と思うようなUIをコンポーネントとして用意してくれているのでとても便利です。
基本的にそれで事足りるのですが、デフォルトの設定を使っていると、「かゆいところに手が届かないな…」と感じる時があります。みなさんもありませんか？
そんなときのカスタマイズの方法を書いていこうと思います。

## セッティング

### Vue

VueCLIでVuetifyをインストールしていきます。

```terminal
$ vue add vuetify
...
✔  Successfully installed plugin: vue-cli-plugin-vuetify

? Choose a preset: Configure (advanced)
? Use a pre-made template? (will replace App.vue and HelloWorld.vue) No
? Use custom theme? Yes
? Use custom properties (CSS variables)? Yes
? Select icon font Material Design Icons
? Use fonts as a dependency (for Electron or offline)? No
? Use a-la-carte components? Yes
? Select locale Japanese
```

src直下にstylesディレクトリ作成して、その下に `variables.scss` を置きます。
詳しくは [SASS variables - Vuetify](https://vuetifyjs.com/ja/customization/sass-variables/) を見てください。

### Nuxt

`@nuxtjs/vuetify` をインストールします。

```terminal
$ npm i -D @nuxtjs/vuetify ( or yarn add -D @nuxtjs/vuetify )
```

`nuxt.config.js` にVuetifyを追加します。

```js:nuxt.config.js
...
export default {
  buildModules: [
    '@nuxtjs/vuetify'
  ],
  vuetify: {
    customVariables: ['~/assets/variables.scss'],
    treeShake: true
  }
}
```

### (おまけ)TypeScriptで書くときの注意

tsconfig.jsonのtypesにVuetifyを追加しないとうまく補完が効かないので注意

```json:tsconfig.json
{
  "compilerOptions": {
  ...
    "types": [
      "vuetify"
    ]
  ...
  }
}
```

## スタイルの上書き

Vuetifyでは各コンポーネントのスタイルを変数で定義しています。
[https://vuetifyjs.com/en/customization/sass-variables/#variable-api](https://vuetifyjs.com/en/customization/sass-variables/#variable-api)

また設定されている変数を各Vueファイルで直接classを指定して上書きすることは非推奨です。
[https://vuetifyjs.com/en/customization/sass-variables/#importing-in-variable-files](https://vuetifyjs.com/en/customization/sass-variables/#importing-in-variable-files)

`variables.scss` で変数を上書きして対応します。下記は一例です。

```scss:variables.scss
$font-size-root: 14px; // 基本のフォントサイズ default:16px
$btn-text-transform: lowercase; // ボタンの文字を小文字にする default:uppercase
```

## Slotを使う

スタイル以外にもカスタマイズしたいなーと感じる瞬間ありませんか？
例えばv-data-tableのheaderの部分とか、v-tree-viewとかとか…
そんなときはSlotをうまく使ってカスタマイズしていきます。
下記はv-treeviewのlabel部分をv-list-itemにする例です。

```vue:sample.vue
<template>
  v-treeview
    slot(name="label" v-bind="{ value, open }")
      v-list-item(dense)
        v-list-item-content
          v-list-item-title {{value.title}}
          v-list-item-subtitle {{value.subtitle}}
          v-spacer
        v-list-item-action
          v-btn(@click="action") action
</template>
```

各コンポーネントがどのような名前付きslotを持っているかは各ページのAPIに書いてあります。[(参考)v-treeviewのAPI](https://vuetifyjs.com/en/components/treeview/#api)

## さいごに

すごく簡単ではありましたがVuetifyのコンポーネントをカスタマイズする方法を紹介しました。
私と同じように「デフォルトのままだとちょっと物足りないな…」と感じたら、簡単なカスタマイズから始めてみてはいかがでしょうか？
ではまた！！！
【Socket通信（Java）】初めてSocket通信を実務で実装した感想

Socket通信を初めて実務で実装する機会があったので、感想と使用技術をメモしておきます。過去に独習していた時には、ぴんとこなかったのですが、さすがにデータ仕様書をみて実装すると体感することができました。

##1. Socket通信概要
サーバー・ソケットとクライアント・ソケットの２種類あるようですが、今回は、クライアント・ソケットのみを使用しました。
感想は、JavaのSocket Apiがあるけれど、結局、バイトストリームのやり取りか・・・と言うものでした。
データ仕様書にも、「データA：xxxバイトから4バイト」みたいな記載でしたし。

下記記事群を参考にさせていただきました。
@Hyman1993さん
[Java通信APIのまとめ（一）Socketの使い方](https://qiita.com/Hyman1993/items/a3aaabbb2e83580d68d2)
@Ginさん
[TCPのストリーム通信の切れ目・区切りについて](https://qiita.com/Gin/items/620f4a7bec246004ee89)


##2. バイトオーダー
設計書に「データはリトルエンディアンで格納されている」との記載がありました。Socket通信初心者の私には何の事やらチンプンカンプンでした

@mikanbakoさんの記事を参考にさせていただきました。
[ByteBufferの複製には、バイトオーダーの再設定が必要](https://qiita.com/mikanbako/items/15ae3654911fe59eb44e)

#####2.1.ポイントは２点。
- 読み込みデータを処理する為には、データ仕様書規定のバイト配列毎に数値や文字列に変換する必要がある。
- データがリトルエンディアンであれば、ByteBufferクラスへの複製時にリトルエンディアンを指定する必要がある。
Ex. byteBuffer.order(ByteOrder.LITTLE_ENDIAN)

#####2.2.記事からの抜粋

```java:LittleEndianSample.java
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class LittleEndianSample {
    public static final void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(Short.BYTES);

        // リトルエンディアンの16ビット整数。下位バイトが0x11、上位バイトが0x22。
        buffer.order(ByteOrder.LITTLE_ENDIAN)
            .put((byte) 0x11)
            .put((byte) 0x22)
            .rewind();

        System.out.printf("0x%x\n", buffer.getShort());
    }
}
```
tensorflow-gpu導入メモ

#はじめに

[④] (https://qiita.com/yohiro/items/d376f44fe66831599d0b), [⑤] (https://qiita.com/yohiro/items/3abaf7b610fbcaa01b9c), [⑥] (https://qiita.com/yohiro/items/e9e80183e635e0ac4894), [⑦](https://qiita.com/yohiro/items/dc764a986acec6e5681e)でsklearnやsvmをかじってみたので、今度はTensorFlowをかじってみようと思い、その導入メモ。幸い、GPU搭載パソコンを所有しているため、GPU版のtensorflowを導入してみる。

参考教材：[【画像判定AIアプリ開発・パート1】TensorFlow・Python・Flaskで作る画像判定AIアプリ開発入門](https://www.udemy.com/course/tensorflow-advanced/)

#自分の環境
- Windows 10
- Anaconda3インストール済
- GeForce GTX 1060搭載

#導入要件

https://www.tensorflow.org/install/gpu?hl=ja
公式より、tensorflowに必要な要件は以下の通り
![cap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571638/d0a66d2f-a1f2-aba9-f9ba-4f4f519f3cf1.png)


GPUドライバさえ揃えてしまえば口述のコマンド一発でインストールできるっぽい。
ので、まずはドライバをアップデート。

##GPUドライバアップデート
まずはデバイスマネージャを起動し、「ディスプレイアダプター」の対象となるGPUを右クリ→「ドライバーの更新」をクリック
![cap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571638/fad2b448-a404-f260-5ad4-12211b13da9c.png)

「ドライバー　ソフトウェアの最新版を自動検索」を押せば後は自動でアップデートしてくれる。

##tensorflow-gpuのインストール
Anacondaの環境から以下のコマンドを実行

```
conda install tensorflow-gpu
```

##インストールの確認
Anacondaの環境から

```
python
```
と入力した後、

```
import tensorflow
```
と入力する。そうすると

```
2020-04-15 18:35:41.872948: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll
```
と表示され、インストール成功してるっぽい模様。

#はまったところ
教材に従ってCUDAやcuDNNなどを個別にインストールしようとしていたが、CUDAをインストールしようとしたところ下記ページと同様の「Visual Studio Integrationで失敗」という症状になりインストールできなかった。

[Windows端末にCUDAをインストールする際に、「Visual Studio Integration」のインストールに失敗する場合](https://qiita.com/rhene/items/2a2eac7d1c0a8edc3ac5)

結局、先述のコマンドでtensorflow-gpuに必要なものを自動で構成してくれるらしいので、CUDAやcuDNNの個別インストールは未実施。
ジェネリックスのワイルドカード

ジェネリックスのワイルドカード
````
//ワイルドカードでAと指定してあげると、BはサブクラスなのでBもOK
//super Aにすると上限を決める事ができるなのでAだけ。
class A{}
class B extends A{}


public class Main {
    public static void main(String[] args) throws Exception {

    //?を付けるとなんでもOK ただしオブジェクト型で返す必要がある
    //ワイルドカードは？でも入れられるのは基本ヌルだけ呼び出し専用
    //
     
     //List<?> list=new ArrayList<Number>();
     //List<String> list=new ArrayList<String>();
      //list.add("hello");
     List<Integer> list=new ArrayList<Integer>();
     list.add(100);
     
     
     test(list);//引数が？だと何が入っているかわからないからエラーになる可能性がある
    }
     //？　ナンバー型かナンバーのサブクラスを使用しているクラスだけは受け付ける
     //境界パラメーターの例　インテジャー型はナンバー型のサブクラスだからOK
     
     //ワイルドカードでAと指定してあげると、BはサブクラスなのでBもOK
//super Aにすると上限を決める事ができるなのでAだけ。
//ワイルドカードで上限下限を決める事ができる
     private static void test(List<? extends Number> list)
     {
         for(Object obj:list){
             System.out.println(obj.toString());
         }
     }
    
}
MacにPython, Jupyter Notebook, BeautifulSoup4, Seleniumを用いたスクレイピング環境を構築

新しいMacBook Proを買ったので、個人的備忘録としてPython, BeautifulSoup4関連の環境構築で参考にした記事をメモします。
きっとこの通りにやれば他のMacでもひとまず問題なくいけるはず、、

## MacBookについて
OS　　　　　macOS Catalina 10.5.13
プロセッサ　2.6 GHz 6コアIntel Core i7
メモリ　　　16 GB 2667 MHz DDR4

## 目指す環境
- Python3でBeautifulSoup4を使ってスクレイピングできる
- Pythonのバージョン管理をできるようにしておく
- JavaScriptで動くサイトも見れるよう、SeleniumとChrome Driverが使える

## Homebrewのインストール
まっさらなPCなので、、
[MacにHomebrewを導入する方法](https://qiita.com/balius_1064/items/ac7dff5ef10eaf69996f)

##Python, virtualenvのインストール
Virtualenvも含め、[macOSにPython3及びPython仮想環境virtualenvを導入](https://qiita.com/thatbin/items/3ebdfc415d0c30d2f8f6)

##Jupyter Notebook の環境構築
[はじめるJupyter Notebook](https://qiita.com/icoxfog417/items/175f69d06f4e590face9)

##BeautifulSoupのインストール
入門も含め、[PythonとBeautiful Soupでスクレイピング](https://qiita.com/itkr/items/513318a9b5b92bd56185)

##Selenium, ChromeDriverのインストール
[[selenium向け] ChromeDriverをpipでインストールする方法（パス通し不要、バージョン指定可能）](https://qiita.com/hanzawak/items/2ab4d2a333d6be6ac760)

#最後に
本当に初心者のようなまとめを書いてしまいました。
これから、スクレイピングで収集したデータをデータベースに貯めていけるようにします、、
BLA_VENDOR=Intel10_64lp(等)でビルドされたshared objectはRTLD_GLOBALを指定してロードしないと落ちる（回避成功）

Intel10_64lp(等)でビルドされたshared objectをRTLD_LOCALでロードすると、「Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.」となって落ちます。
静的リンクまたはRTLD_GLOBALでロードすれば問題ありません。
しかし、Pythonモジュールのロードはsys.setdlopenflagsでグローバルに書き換えないといけないので、実用的には厳しいと思われます。

https://gitlab.kitware.com/cmake/cmake/issues/20491#note_719552

BLA_VENDOR=Intel10_64lp(等)は、CMake 3.13以降で自動的に優先されます。
CMake 3.17ではBLA_VENDOR=Intel10_64_dynが使えます(これを使えば解決します)が、明示的に指定しなければなりません。優先順位の変更はしないという返信を受けているので、shared objectに対してfind_package(BLAS)するときは自分で気をつけるしかなさそうです。

demo: https://github.com/cielavenir/cmake_intel_blas

```
[C] load blas user statically
ans=[ [ 2.10e+01, 3.36e+02, 7.08e+01]; [ -6.40e+01, 5.14e+02, 9.50e+01]; [ 2.10e+02, 3.10e+01, 4.75e+01] ]
[C] load lapack user dynamically
ans=[ [ 2.10e+01, 3.36e+02, 7.08e+01]; [ -6.40e+01, 5.14e+02, 9.50e+01]; [ 2.10e+02, 3.10e+01, 4.75e+01] ]
[Python] load blas user [cdll]
Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
[Python] load blas user [cdll] with modifying dlopenflags
ans=[ [ 2.10e+01, 3.36e+02, 7.08e+01]; [ -6.40e+01, 5.14e+02, 9.50e+01]; [ 2.10e+02, 3.10e+01, 4.75e+01] ]
[Python] load blas user [module]
Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
[Python] load blas user [module] with modifying dlopenflags
ans=[ [ 2.10e+01, 3.36e+02, 7.08e+01]; [ -6.40e+01, 5.14e+02, 9.50e+01]; [ 2.10e+02, 3.10e+01, 4.75e+01] ]
```

----

まああれです、openraveです。あっちはfind_package(LAPACK)ですが、同様の事象を抱えています。

## 200820

以下のコード片をfunc.cppに挿入することで問題を回避することができました。

```
#include <dlfcn.h>
__attribute__((constructor)) static void fixcmakemkl(){
	dlopen("libmkl_intel_lp64.so",RTLD_LAZY|RTLD_NOLOAD|RTLD_GLOBAL);
	dlopen("libmkl_intel_thread.so",RTLD_LAZY|RTLD_NOLOAD|RTLD_GLOBAL);
	dlopen("libmkl_core.so",RTLD_LAZY|RTLD_NOLOAD|RTLD_GLOBAL);
}
```

[libdlについていろいろ調査](https://github.com/cielavenir/miniarc/blob/master/lib/getmodulefilename.c)している最中に[RTLD_NOLOADを発見](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/dlopen.3.html)しました。libdlは奥が深い(まあランタイムなんてみんなそうか)。
[jq] jqでcsvをjsonへ変換

# 概要

jqコマンドを利用して1行目がヘッダ行のcsvをjsonのハッシュ配列へ変換する。

# コマンド

```
$ cat sample.csv | jq -s -R '[split("\n")[]|select(length > 0)|split(",")|map(gsub("^\\s+|\\s+$";""))]|.[0] as $header | .[1:]|map([ $header, . ]|transpose|map({"key": (.[0]//""), "value": (.[1]//"")})|from_entries)'
```

**sample.csv**

```
record1,record2,record3,record4
L1R1,L1R2,L1R3,L1R4

L2R1,L2R2,L2R3,L2R4
  L3R1,L3R2  ,  L3R3  ,L3R4
L4R1,L4R2,,
,L5R2,L5R3
```  

**output**

```
[
  {
    "record1": "L1R1",
    "record2": "L1R2",
    "record3": "L1R3",
    "record4": "L1R4"
  },
  {
    "record1": "L2R1",
    "record2": "L2R2",
    "record3": "L2R3",
    "record4": "L2R4"
  },
  {
    "record1": "L3R1",
    "record2": "L3R2",
    "record3": "L3R3",
    "record4": "L3R4"
  },
  {
    "record1": "L4R1",
    "record2": "L4R2",
    "record3": "",
    "record4": ""
  },
  {
    "record1": "",
    "record2": "L5R2",
    "record3": "L5R3",
    "record4": ""
  }
]
```

# 解説

```
# CSVファイルをjqに読み込み
$ cat sample.csv | jq -s -R '

    # 読み込んだcsvファイルから空行を除いて、各値の前後の空白を取り除き、[ [ "record1", "record2",..],["L1R1", "L1R2",..],..]の形に変換 
    [split("\n")[]|select(length > 0)|split(",")|map(gsub("^\\s+|\\s+$";""))]|

      # 1行目をヘッダー行として[ "record1", "record2",..]の形で保管しつつ、2行目以降をmapに送り1行ずつ処理する
      .[0] as $header | .[1:]|map(

        # ヘッダーと処理対象の行を一旦[ [ "record1", "record2",..],["L1R1", "L1R2",..] ] にまとめ、transposeで [ ["record1", "L1R1"], ["record2", "L1R2"] ]の形に変換する
        [ $header, . ]|transpose|

        # 各レコード、1項目目をkey,2項目目をvalueのハッシュへ変換する。 [ ["record1", "L1R1"],.. ] を [ { "key": "record1", "L1R1" },..]へ変換
        map({"key": (.[0]//""), "value": (.[1]//"")})|

        # 最後にfrom_entriesで目的のハッシュに変換する
        from_entries
      )'
```
nuxt.js+typescript環境で　Property '$bvModal' does not exist on type~ とエラーが出てビルドできない問題をごり押しで解決

# 問題
nuxt.js+typescriptでbootstrapVueを使っていた時の事、ビルドしようとしたら以下のようなエラーが表示されてビルドできない。

```console:
Property '$bvModal' does not exist on type 'CombinedVueInstance<Vue, unknown, { formatDateTime(date: Date): string; formatName(uid: string): string; deleteTopic(id: string, name: string): Promise<void>; }, { idNum: string; deletePermission: boolean; "name/names": any; }, Readonly<...>>'.
```
モーダルの制御に使う$bvModalがvueインスタンスに存在しない型だとかなんとか。

# 対処法
##多分正しいやり方
ちゃんと型を定義する。
###4/21追記
コメントをヒントに型定義を追加。tsconfig.jsonのtypesに"bootstrap-vue/esm"を追加する。

```json:tsconfig.json
    "types": [
      "@types/node",
      "@nuxt/types",
      "bootstrap-vue/esm"
    ]
```

コメントをくださった@jay-esさんに感謝

##今回のやり方
Vueインスタンス側(this)をany型にダウンキャストして型の定義を不要にする。
Typescriptの利点をすべて捨てるような方法だけどこれでビルドできる。

```typescript:hoge.ts
(this as any).$bvModal.hide(ebi)
```
誰か正しい解決策を教えてほしい。

#参考資料
[Property 'xxx' does not exist on type CombinedVueInstance ? #8721](https://github.com/vuejs/vue/issues/8721)
Athenaでは複数のS3ロケーションを指定できないのでその対応方法

# Athenaでは単一のディレクトリしかS３を指定できない
2020年4月現在Athenaでは複数のS3ディレクトリ（ディレクトリは存在しないが便宜上ディレクトリと呼びます）を指定できません。
扱うデータを集中させればいいのですが、場合によってはそう行かないこともありえます。

例えば以下のようなデータ構成があります。

```
s3://bucket_name/2019/05/01/foo/1.csv
s3://bucket_name/2019/05/02/foo/1.csv
s3://bucket_name/2019/05/03/foo/1.csv
...
s3://bucket_name/2019/05/01/bar/1.csv
s3://bucket_name/2019/05/02/bar/1.csv
s3://bucket_name/2019/05/03/bar/1.csv
```

上記のような構造で、`foo`テーブルと`bar`テーブルを作成したいのだが、単一のディレクトリを指定するとどうしても両方のファイルが混ざります。
同一形式のファイルであればSQLで対応すればできなくはないかもしれませんが、ミスも発生するので避けるべきです。
外部システムがこのようなディレクトリ構造でファイルを作成していたため対応が必要となりました。

##対応方法
該当ファイルを別ディレクトリにコピーすることで対応もできますが、ファイル数が大きくなると時間も費用もかかってしまいます。
こういった場合はパーティションを利用するとなんとかテーブルを分けられます。
テーブルをパーティションを利用したもので作成します。

``` sql:create_foo.sql
CREATE EXTERNAL TABLE `foo_and_bar`(
  `id` int, 
  `name` string)
PARTITIONED BY ( 
  `year` int, 
  `month` int,
  `day` int,
  'type' string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket_name/'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'transient_lastDdlTime'='1586756612')
```

これに対してパーティションを加えていきます

```sql:add_partition.sql
ALTER TABLE foo_and_bar ADD PARTITION (year='2019',month='05', day='01', type='foo') location 's3://bucket_name/2019/05/01/foo/1.csv'
ALTER TABLE foo_and_bar ADD PARTITION (year='2019',month='05', day='02', type='foo') location 's3://bucket_name/2019/05/02/foo/1.csv'
...
```

今回は日付のパーティションも加えています。これで作成した`foo_and_bar`テーブルに対してwhere句でtypeを指定すればfoo配下のファイルだけ参照が可能となります。
毎回fooを指定するのが大変な場合、ここから更に新しいテーブルを作成します。

```sql:create_foo.sql
CREATE TABLE foo
WITH (
format='PARQUET',
external_location='s3://bucket_name/foo'
) AS
SELECT * FROM foo where type = 'foo'
```

これでfooだけのファイルが存在するディレクトリが作成され、fooだけのテーブルも作成可能となります。

## 関連記事
[AthenaでCSVファイルからParquet形式へ変換](https://qiita.com/YujiHamada3/items/711945d84b27b079ad38)
[Athenaで後からパーティションを追加する](https://qiita.com/YujiHamada3/items/ebdc624af51932e1aa03)
HttpClientをマルチスレッドで使用するとソケット枯渇する

# HttpClientインスタンスは1つにし、MaxConnectionsPerServerを適切に設定する
HttpClientの利用でソケット枯渇しないように、using (var httpClient = new HttpClient())のようにインスタンスを使い捨てにせずにprivate static HttpClient _httpClient = new HttpClient();でインスタンスを使いまわす記事がありますが、これはシングルスレッドでの処理では効果がありますが、マルチスレッドの高負荷環境ではソケット枯渇が発生します。

ソケット枯渇発生についての詳細は、他の方の記事にが参考になりますので、ここでは割愛しますが、MaxConnectionsPerServerのデフォルトがint.MaxValueで接続数が実質無制限のため、
次のように明示的に接続数を設定する事が必要です。

```C#
private static HttpClient _httpClient = new HttpClient(new HttpClientHandler
{
    MaxConnectionsPerServer = 4
});
```

# Azure Stotage ライブラリ内のHttpClientの接続数
Azure StorageのBLOBやQueueのAPI処理でも先の原因でソケット枯渇が発生します。
(Azure FunctionsのQueueTriggerなどマルチスレッドで処理する環境では高負荷時にSocketException発生します)
Azure Stotage ライブラリのv9.4.1からCloudBlobClientやCloudQueueClientコンストラクタにDelegatingHandlerパラメータが追加されていますので、次のようにハンドラを実装し接続数を指定すると良いようです。

(.Net Core v3.0, Microsoft.Azure.Storage.Blob(v11.1.3), Microsoft.Azure.Storage.Queue(v11.1.3)で確認)

```C#
public class HttpClientInjectionHandler : DelegatingHandler
{ 
    private bool IsFirstCall = true;
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (IsFirstCall)
        {
            var handler = (HttpClientHandler)InnerHandler;
            handler.MaxConnectionsPerServer = 5;
            IsFirstCall = false;
        }

        return base.SendAsync(request, cancellationToken);
    }
}
```

```C#
private static CloudStorageAccount _storageAccount = CloudStorageAccount.Parse(@"Connection String...");
private static CloudBlobClient _blobClient = new CloudBlobClient(_storageAccount.BlobEndpoint, _storageAccount.Credentials, new HttpClientInjectionHandler());
```

# Azure Storage ライブラリのバージョン メモ
## ~v9.3.3: WindowsAzure.Storage
```C#
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
```
  
## v9.4.0~v11: Microsoft.Azure.Storage.Blob
```C#
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
```
 
## v12 azure.Storage.Blobs 
v11までとクラス名が異なる。v12にはコンストラクタにDelegatingHandlerパラメータが無いまま。 
    ~v11:CloudBlobClient 
    v12~:BlobServiceClient 

# 参考文献
  - [YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE](https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)
  - [HttpClientをマルチスレッドで運用する場合の注意点](https://qiita.com/skitoy4321/items/dc6bd2b62b62c2414642)
  - [.NET(Framework)のHttpClientの取り扱いには要注意という話](https://qiita.com/nskhara/items/b7c31d60531ffbe29537)
ジェネリックス

ジェネリックスのサンプル＜T＞が置き換え出来るのがポイント
TでもEでもほげでもOK
````

//オブジェクト指向　factoryの考え方
import java.util.*;
import java.util.ArrayList;


//＜＞はインスタンス生成するタイミングで型を強制する！ジェネリックス
//TはなんでもOKEとかほげとか、サンプルというクラスはTで置き換えできるんだな
//インスタンス生成時に型パラメーターに置き換わる
class Test<E>{//Eで置き換えろよー
    private E val;
   
   public E getVal(){return val;}
   public void setVal(E val){this.val=val;}

}

//ジェネリックスの例
//NULLを弾くような汎用クラスを作成できる
class SampleList<T>{
    private List<T> list = new ArrayList<>();
    
    public void add(T value)
    {
        if(value==null){
            return;
        }
        else{
            this.list.add(value);
            
        }
        
    }
    
    public T get(int index){
        return this.list.get(index);
    }
    
    public int size(){
        return this.list.size();
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        
     Test<String> sample=new Test<String>();//ジェネリックスで型の強制をする
     
     //ジェネリックスの有効活用方法
     SampleList<String> list=new SampleList<String>();
     list.add("A");
     list.add(null);
     list.add("B");
     list.add("C");     
     
    for(int i=0; i<list.size(); i++)
    {
        System.out.println(list.get(i));
    }
       
    }
}
Lorentzian型状態密度とGreen関数

# 概要
次の量：
$$\rho(E):=\frac{1}{\pi}\frac{W}{E^2+W^2},\tag{1}$$
に対して
$$G(z)=\int_{-\infty}^\infty\mathrm{d}E\frac{\rho(E)}{z-E},\tag{2}$$
を計算しよう．$E\in\mathbb{R}$はエネルギ，$W>0$はパラメータ，$z\in\mathbb{C}, \Im z\neq 0$である．また，
$$\int_{-\infty}^\infty\mathrm{d} E\rho(E)=1,\tag{3}$$
となるように規格化されている．結果は，
$$G(z)=\frac{1}{z+\mathrm{i}W\mathrm{sgn}(\Im z)},\tag{4}$$
である．

# 導出
留数定理．
Matplotlibで図同士の間隔を調整する

[一覧表に戻る](https://qiita.com/h398qy988q5/items/4af78a3afe73b6f38419)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/94b1d57c-bcd1-80f9-095f-658c900acfa1.png)

```
import matplotlib.pyplot as plt
%matplotlib inline

plt.subplots_adjust(wspace=0.4,hspace=0.6)

plt.subplot(2,2,1)
plt.scatter(1,1)

plt.subplot(2,2,2)
plt.scatter(1,1)

plt.subplot(2,2,3)
plt.scatter(1,1)

plt.subplot(2,2,4)
plt.scatter(1,1)
plt.show()
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/4604afda-dbf5-ad6f-bdd6-a75430da2eec.png)

```
import matplotlib.pyplot as plt
%matplotlib inline

plt.subplots_adjust(wspace=0.15,hspace=0.15)
min = 0.8
max = 1.2

plt.subplot(2,2,1)
plt.scatter(1,1)
plt.tick_params(bottom=False,labelbottom=False)
plt.xlim(min,max)
plt.ylim(min,max)

plt.subplot(2,2,2)
plt.scatter(1,1)
plt.tick_params(bottom=False,labelbottom=False,left=False,labelleft=False)
plt.xlim(min,max)
plt.ylim(min,max)

plt.subplot(2,2,3)
plt.scatter(1,1)
plt.xlim(min,max)
plt.ylim(min,max)

plt.subplot(2,2,4)
plt.scatter(1,1)
plt.tick_params(left=False,labelleft=False)
plt.xlim(min,max)
plt.ylim(min,max)
plt.show()
```
ネットワークの話

日々の勉強のアウトプット用です。

#LANとWANの話
そもそもLANはLocal Area Networkの頭文字からきており、近距離でネットワークのことを言います。
それに対してWANはWide Area Networkの頭文字からきており、遠距離間でのLANを繋ぐネットワークを意味しています。

コンピュータがデータをやり取りする方法は専用回線方式と交換方式があります。
専用回線方式はコンピュータ同士が直接回線でつなげる方式に対し、交換方式は回線の間に交換機のようなものを置くことで3台以上のコンピュータとの通信を可能にした方式です。
なお、交換方式には回線交換方式とパケット交換方式の2種類があります。

回線交換方式は送信元のコンピュータから送信先のコンピュータへの経路に交換機で繋ぐ方式です。
パケット交換方式は通信データをパケットという単位に分割し、それを交換機が適切な送信先に送る方式です。

LANの接続形態(トポロジー)はスター型、パス型、リング型の3種類ある。

スター型：ハブから放射線状にコンピュータに接続する方式です。
バス型：1本のケーブルに多くのコンピュータを接続させる方式です。
リング型：多くのコンピュータをリング状に繋げる方式です。

#インターネットとそれを構成する装置(用語集)

SMTP(Simple Mail Transfer Protocol)：インターネット環境において、クライアントからサーバにメールを送信したり、サーバ間でメールを転送するのに用いられるプロトコル。

サブネットマスク：IPアドレスをネットワークアドレスとホストアドレスに分割し，複数のより小さいネットワークを形成するために使用する32ビット(IPv4では)のビット列。

プロトコル：ネットワークを通じてコンピュータ同士が通信するための約束事。

OSI参照モデル：プロトコルを7つの階層に分けたモデル。上位層からアプリケーション層、プレゼンテーション層、セッション層、トランスポート層、ネットワーク層、データリンク層、物理層がある。

HDLC手順：OSI基本参照モデルのデータリンク層のプロトコルで高効率・高信頼性を目指した伝送制御手順の一種です。同期制御に任意のビットパターンを連続して送信可能なフラグ同期方式を採用し、パリティでは検出できないバースト誤りも検出可能であるCRC方式を採用している。また、HDLC手順はデータリンク層のプロトコル。

MIME：Multipurpose Internet Mail Extensionの略。ASCII文字しか使用できないSMTPを利用したメールで、日本語の2バイトコードや画像データを送信するための仕組み。

リピータ：物理層の中継機能を果たす装置。ケーブルの流れる信号を増幅させる。

セグメント：無条件にデータが流される範囲。

ブリッジ：データリンク層の中継機能を果たす装置。流れてきたパケットのMACアドレス情報を確認した後、必要があれば他のセグメントへパケットを流す。

MACアドレス：ネットワークカードに付いている番号。イーサネット通信で利用される。

ゲートウェイ；トランスポート層以上が異なるネットワーク間でプロトコル変換での中継機能を果たす装置。プロトコルの差異をこの装置が吸収・変換してお互いの接続を可能にする。
LaravelでMySQLに接続しようとした際に起きたエラー(SQLSTATE[HY000] [2002] Connection refused)

```
  Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel_db and table_name = migrations and table_type = 'BASE TABLE')
```
上記のようなエラーが出ました。

##主の環境
・MAMP環境
・PHPとLaravelは最新

##行ったこと
```
DB_CONNECTION=mysql
DB_HOST=localhost:8889
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=root
```

**DB_HOST=**の部分を**localhost:8889**
に変更したらうまくいった。
ネット上に記載されていることを一通り試してみたがうまくいかずダメもとでHOSTの部分をphpmyadminに記載されていたサーバーのホスト通りに.envに記載したらうまくいった。
›![スクリーンショット 2020-04-15 17.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518141/d4570930-7aa0-a9c1-8305-1099a255bd1c.png)
参考になればと思います。