OmniAICreator/Qiita-1.07M huggingface dataset:
Windows8上でPHPのメールが送信できない（Connection Closed Gracefully）

#背景
　最近、バイト先で「ローカルネットワークで動いているサイトからGmailを使いたい」とお願いされて、[こんな感じ](https://qiita.com/mimuro_syunya/items/29c3bc435bb23018729a)で環境を構築しました。そして、いざGメールを送信してみると、なぜか失敗してしまいます。
　自宅のWindows10のパソコンでは正常に動くのに、、、
色々見ると、XamppのSendmailフォルダにあるerror.logは

```
Connection Closed Gracefully
```

とばかり書かれています。つまり、Sendmailが正しく動作していないみたいですね。
でも、直訳すると

"接続は正常に閉じられました"

です。はぁ～(*´Д｀)

このエラーコードを元に調査した結果、「Windows8がいけないらしい」とか、「Sendmailが使えない」、「stuunelをインストールすればいい」とかの記事がいくつか出てきました。以下の2つのサイトを試しましたが、だめでした。

・[【エラー解決方法】Windows8でxamppのsendMailが使えない！？を解決する方法](https://amg-solution.jp/blog/3854)

・[Windows8にXAMPPを配置してgmailをsendmailで送信](https://m-shige1979.hatenablog.com/entry/2015/06/10/080000)

しかし、以下のstack overflowというサイトの英語質問&解答を試したら解決しました！

・[sendmail.exe opens on sending mail](https://stackoverflow.com/questions/24514432/sendmail-exe-opens-on-sending-mail)

解答者のYahya Uddinさん、ほんとに感謝しています！

※追記
公式ページにも書いてありました。
・[fake sendmail for windows](https://www.glob.com.au/sendmail/)
>
issues running on windows 8+
http://stackoverflow.com/q/21337859 details a workaround for this which involves running sendmail.exe in "windows xp sp 3" compatibility mode as administrator.

#原因
　どうやら、バイト先のパソコン（Windows8）で動かす場合、Sendmailの権限の設定とかを少し変えてやる必要があるみたいです。

#解決方法
　まず、XamppのSendmailフォルダにある「sendamail.ini」を右クリックします。

![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/f0f0cc9f-b75e-c44e-717f-7969e45ba4cd.png)
　そして、「プロパティ」を開いて、
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/f6c186c0-9f4d-b595-2c0d-bbccdcaa58df.png)
　「互換性」タブの「すべてのユーザーの設定を変更」をクリックします（この時にパスワードを求められますので入力してください）
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/f6f26add-d66d-2636-7115-df5968391df1.png)
　そして「管理者としてこのプログラムを実行する」にチェックをして、
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/7679d339-dbbb-8604-1b81-6c82a3f244bd.png)
　「互換モード」をWindows7から「Windows XP (Service Pack 3)」に変更します。
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/eed975ef-d842-ea52-a38f-9e890acc0496.png)
　最後に「適用」をクリックして終了です。
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/b4f486a8-d928-e44d-2717-81ba8fe7ccd6.png)
一応Apacheの再起動をしてPHPのメール送信をしてみてください。解決するかもしれません。

#最後に
　このエラーにだいたい5時間くらいとられました。お金にしてだいたい6000円ですね。もったいない。全然記事が無いので、気づくのに時間がかかりました。結果、英語の記事に答えがありましたねｗ
もっと英語勉強しなきゃ。。。

それでは！
サーマルプリンターなどのPOS機器を制御する何通りかの方法

**これは「C#によるPOS開発入門（的な）」と称して連載している記事の1つです。他は[こちら](https://qiita.com/Automatic9045/items/0c8d05e1aa6255f7bd1c)**

#1. はじめに
POSの機器を制御する方法は何通りかありますが、その方法について基礎的な情報がネット上に全くと言って良いほど無かったので、ここで説明しようと思います。実際のコーディングについては、[こちらの記事](https://qiita.com/Automatic9045/items/64073010955ceb8928be)でPOS for .NETで制御する方法について説明しているので、良ければ合わせて参考にして下さい。

POS開発について勉強し始めた当時、私に教えてくれるような人など周りにいなかったため、ここに書いてあるのはサンプルやマニュアルの見ながらの完全独学な知識です。「ここ良くないよー」という所があれば教えて下さると泣いて喜びます。

#2. この記事の対象読者
- POS開発に興味があるが、やったことは無くやり方も知らない人
- 面白そうだったので感熱プリンターを買ってみたものの、動かし方が分からず途方に暮れている人

#3. サーマルプリンター・カスタマーディスプレイの場合
制御する方法は大きく分けて4通りあります。

- 地道にコマンドを送信する方法
- [WPS](https://www.google.com/search?q=windows+printing+system)準拠ドライバーを使用する方法
- メーカー独自のDLLからドライバーを呼び出す方法
- 統一規格に準拠したドライバーを使用する方法

## 地道にコマンドを送信する方法
一番初めに提供された方法であり、かつ最も低水準な方法です。
シリアルポート・パラレルポートにコマンドを送信して、機器を直接制御します。C#の場合は`System.IO.Ports.SerialPort`を利用します。

各メーカーで独自のコマンドを制定していることが多いです（例……スター精密: スターグラフィックモード/スターラインモード等、EPSON: ESC/POS、SATO: SBPL）。コマンドは基本的に[ASCII](https://ja.wikipedia.org/wiki/ASCII)で表されます。
権利の関係でサンプルを掲載することが出来ません。メーカーのマニュアル等を参照して下さい。ESC/POSのリファレンスは[こちら](https://reference.epson-biz.com/pos/reference_ja/)です。

## WPS準拠ドライバーを使用する方法
メーカーがWPS準拠のドライバーを提供している場合は、`System.Printing`からドライバーを制御することが出来ます。
が、こんな業務用のごついプリンターを`System.Printing`で動かすのって、何かカッコ悪くありません……？　そう思うのは私だけでしょうか。
この方法のサンプルはそこら中にあると思うので割愛します。

## メーカー独自のDLLからドライバーを呼び出す方法
WPS準拠のドライバーをメーカー独自のDLLから呼び出して制御する、という形態をとっているものもあります。
メーカーがSDKを提供している場合は、このパターンが一番多い印象です。

## 統一規格に準拠したドライバーを使用する方法
コマンドを送信して機器を直接制御する場合、メーカーによってコマンド体系が違うため、POSアプリケーションを開発・販売するには制御処理を機器のメーカー別に何種類も準備する必要がありました。
そこで、制御コードの統一規格を設け、機器メーカーにその規格に準拠したドライバーを提供させることで、どのメーカーの機器も同一のコードで制御することを可能にしました。こういった規格の1つがOPOS（POS for .NET[^1]）です。

[^1]: POS for .NETは、OPOSを.NETで実装したものです。

#4. キャッシュドロアの場合
制御する方法は、ドロアの接続方式によって変わります。

### モジュラーケーブル（ドロアキックケーブル・DKD）接続の場合
電話の接続にも使われる6ピンのケーブルでサーマルプリンターに接続し、サーマルプリンターから信号を送信することでキャッシュドロアを開けます。

- PCからコマンドを送信する方法
- サーマルプリンターでの印刷時にドロアを開くよう設定する方法
- WPS準拠ドライバーを使用する方法
- メーカー独自のDLLからドライバーを呼び出す方法
- 統一規格に準拠したドライバーを使用する方法

### USB接続の場合
PCにUSBケーブルで直接接続するタイプも存在します。

- PCからコマンドを送信する方法
- WPS準拠ドライバーを使用する方法
- メーカー独自のDLLからドライバーを呼び出す方法
- 統一規格に準拠したドライバーを使用する方法

この他にLAN接続のタイプ等もありますが、あまり多くはありません。

各方式の詳細は「サーマルプリンター・カスタマーディスプレイの場合」の項を参照して下さい。

#5. バーコードリーダーの場合
PCに読み取ったバーコードの情報を送信する方式で2種類に分けられます。

- シリアル通信としてやりとりする場合
- キーボードをエミュレートする場合

## シリアル通信としてやりとりする場合
`System.IO.Ports.SerialPort`で接続し`DataReceived`イベントを待機することで、読み取ったバーコードの情報を取得します。

## キーボードをエミュレートする場合
読み取ったバーコードの情報がキーボード入力されます。

#6. 終わりに
この記事以外にもPOS開発関連の記事を投稿しています。もし良ければ[こちら](https://qiita.com/Automatic9045/items/0c8d05e1aa6255f7bd1c)からどうぞ。
resourcesとresourceの違いについてまとめてみた

Railsで何らかのリソースに対するCRUD処理を行うためのルーティングを生成する方法として、resourcesメソッドとresourceメソッドがあるので、今回はその違いについてまとめてみました。

## resourcesとは
resourcesメソッドは、コントローラーの7つのアクション（index、show、new、create、edit、update、destroy）をひとまとめにしたメソッドで、複数のリソースに対するCRUD処理を行うためのルーティングを生成します。

```:config/routes.rb
Rails.application.routes.draw do
 resources :games
end

#リソース名が複数形
```
上記のように記載すると、7つのアクション（index、show、new、create、edit、update、destroy）全てを設定したことと同じになります。
確認のため、ターミナルにて`rails routes`コマンドを入力してみると、以下のルーティングが生成されています。

```:ターミナル
   Prefix Verb   URI Pattern               Controller#Action
    games GET    /games(.:format)          games#index
          POST   /games(.:format)          games#create
 new_game GET    /games/new(.:format)      games#new
edit_game GET    /games/:id/edit(.:format) games#edit
     game GET    /games/:id(.:format)      games#show
          PATCH  /games/:id(.:format)      games#update
          PUT    /games/:id(.:format)      games#update
          DELETE /games/:id(.:format)      games#destroy
```
リソースが複数なので、/gamesに対するGETリクエストが返すのはリソースの一覧画面（indexアクション）であることが分かると思います。

## resourceとは
resourceメソッドは、コントローラの７つのアクション（index、show、new、create、edit、update、destroy）に対して、`indexとid付きのパスが生成されません。`
resourceは、ただ１つのリソースに対するCRUD処理を行うためのルーティングを生成します。

```:config/routes.rb
Rails.application.routes.draw do
 resource :game
end

#リソース名が単数形
```

こちらも確認のため、ターミナルにて`rails routes`コマンドを入力してみると、以下のルーティングが生成されています。

```:ターミナル
   Prefix Verb   URI Pattern          Controller#Action
 new_game GET    /game/new(.:format)  games#new
edit_game GET    /game/edit(.:format) games#edit
     game GET    /game(.:format)      games#show
          PATCH  /game(.:format)      games#update
          PUT    /game(.:format)      games#update
          DELETE /game(.:format)      games#destroy
          POST   /game(.:format)      games#create
```
こちらの場合は、リソースは1つだけなのでurlに:idを含む必要がありません。そして、一覧画面（indexアクション）が必要ないので、/gameに対するGETリクエストはそのリソースの表示（showアクション）であることが分かると思います。

## まとめ
「resourcesメソッド」はidが付与されているので、複数あるリソースの中からidを用いて特定のリソースを絞り込むことができます。

その一方で「resourceメソッド」にはidが付与されないので、リソースを絞り込まない状況で使用します。

まとめると、複数存在するリソース（商品やユーザーなど）では「resources」を使用し、１つしか存在しないリソースには「resouece」を使用します。
Macでバッチファイルを作成🐱

#はじめに
今私は[データサイエンス100本ノック](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)をやっています！
この100本ノックでは学習をする環境を構築できるDockerが用意されているのでとっても簡単に始められます！😊
pandasでデータやDataFrameを扱うのに慣れたい！という方にとってもおすすめです！


##バッチファイルとは
バッチファイルとは、実行できるコマンド列を記述したテキストファイルのことです。
Macで使えるバッチファイルの拡張子は「.command」になります。

バッチ処理とは複数のコマンドを順次実行することです。
つまり、バッチファイルに上からコマンドを書いていけば、その順番で実行してくれます！
頻繁に実行する処理の一連の流れをバッチファイルに記述しておけば、
いつでもまとめてその処理を実行できます😎

##バッチファイルを作成した経緯
冒頭に簡単だと言っていたDockerでの環境構築、、、
もちろんとっても簡単なんですが、
ディレクトリを移動して、docker-composeをbuildして、できたdocker imageを起動して、、、というのがめんどくさくなってしまいました😭

そこでコマンドですべて完結する処理ならバッチ処理が可能だと思いつき、バッチファイルを作成しました！

##バッチファイルの作成！
今回やりたい処理はこちら💪

```bash
#デスクトップに移動
$ cd Desktop
#デスクトップのdockerfileが置いてあるディレクトリに移動
$ cd 100knocks-preprocess
#ビルド
$docker-compose up -d --build 
#ビルドされたdocker imageを起動
$docker run -it (docker image名)
```

ここまでの処理をバッチファイルに書いていきます。
基本バッチファイルの処理はルートディレクトリから出発になります。
今回は問題ないですね。

###ファイルの作成と編集

```bash
#test.commandという名前のファイルを作成
touch test.command
#vimで中身を編集
vi test.command
```
vimはiを押すと編集ができます。
編集が終わったらesc を押してコマンドモードにして
:wqで保存して終了！

###test.commandの中身
今回の場合はこんなかんじで編集
さっきのやりたい処理をそのまま書いただけです！

```test.command
cd Desktop
cd 100knocks-preprocess
docker-compose up -d --build 
docker run -it (docker image名)
```

###編集内容の確認
```bash
#test.commandの中身を閲覧
cat test.command
```
自分のやりたいように書かれていればOK!

##バッチファイルの実行

bashかzshを使っていれば以下のコマンドで実行可能です☺️

```bash
#バッチファイルを実行
bash test.command
```
これでこの一つのコマンドだけで全てのコマンドが実行されるようになりました！！🙌
便利なので是非、バッチファイルつくってみてください！😎
QIIME2を使ってOTU（微生物）のカウントデータをテキストファイルで得る

微生物解析パイプライン「QIIME2」を使った解析で、[公式のチュートリアル](https://docs.qiime2.org/2020.6/tutorials/moving-pictures/)では、fastqファイルから門や属レベルのカウントデータは得ることができるが、OTUのカウントデータの取得方法が載っていない。

しかし近年はOTUレベルでの解析も盛んに行われており、必要だと思うので、調べてみた。


【利用ソフト（OS）】
VirtualBox
QIIME2 2019.10 (VirtualBox用のもの)　詳しくは→[Installing QIIME2](https://docs.qiime2.org/2020.6/install/)

（Dockerが流行ってるので今後はVirtalBoxからDockerにシフトする可能性はある。。。）

##サンプルデータの取得
前提条件として、[公式のチュートリアル](https://docs.qiime2.org/2020.6/tutorials/moving-pictures/)に従って、table.qzaは持っているものとします。

サンプルデータは以下のリンクから取得してください。
[download table.qza](https://docs.qiime2.org/2020.6/data/tutorials/moving-pictures/table.qza)

##OTUデータのエクスポート
.biomという形式のファイルに出力します。"feature-table.biom"というファイルが同じディレクトリに生成されます。

```html:QIIME2
qiime tools export --input-path table.qza --output-path ./
```


##テキストファイルへの変換
biomファイルのままでは普通の解析（OTUの名前とカウントが載ったテーブルを用いた解析）ができないので、biomをtsvファイル（.txtのようなテキストファイル）に変換

```html:QIIME2
biom convert -i feature-table.biom -o feature-table.tsv --to-tsv
```

[参考にさせていただいたサイト（英語）](https://forum.qiime2.org/t/exporting-and-modifying-biom-tables-e-g-adding-taxonomy-annotations/3630)

これで、以下のようなテキストファイルが得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682014/4d933b6f-2156-2a3d-7d16-4a3c12b24246.png)

1列目がOTU名（ID）、2行目がサンプル名ですね。
データフレーム処理をするのに1行目は邪魔だと思うので、ここは手動で消しちゃってもいいと思います。

今後はこれを用いた解析のやり方をどんどん上げていきます。
コードレビュー時に意識しておきたい3つのポイント

チームの規模や上場しているかどうかなどによっても大きく変わるのですが、
コードレビューは誰がするかではなく、**何を意識してコードレビューをするか**をチームで明確にする必要があると思っています。
（ここでは監査関連の話や承認フローは気にせず、おおよそ5~10人くらいのチームの想定）

もちろん誰がという部分においても、エンジニアとして一定の知識や理解は最低限必要ですが、**何を意識してコードレビューをするか**の共通意識をチームできちんともってコードレビューすることが必要だと感じているので自分が気をつけていることを記載します。

今回はレビュアー、レビュイーのメンタル面に対するケアに関しては省略&別で書き残します。(大事)

# 意識する３つのポイント

## 可読性の向上

チームで開発するにおいて、可読性をあげていくことはほぼ必須です。

常日頃からメンバーが意識して開発することが大切ですが、レビュアーから指摘されることで気づくことも多いと思います。

- 無駄な処理を書いていないか
- メソッドにするなど共通化・抽象化できるところはないか
- 変数名など明らかにおかしいところはないか

ただ、可読性の向上を意識するあまり開発者の力量を考慮しない指摘やリファクタの提唱はナンセンスですし、リリース前日とかであればまずはリリースすることを優先して指摘をIssue化しておくなどの策をとることを心がけるようにしています。

## バグを引き起こすコードの発見

どう見ても明らかにバグっていたり、動かないコードは論外として(そもそもPR出してはいけないレベル)
コーディングしている中で自分では気づきにくいバグを引き起こしそうな書き方をしているケースがあります。

そういう時はコードレビューで、冗長になっている部分を第三者の観点からすくい上げることができるといいかなと思っています。

また、コードの変更点(Diff)だけを見ていたとしたら、気づかないバグも潜んでいる可能性があります。
そういった見えない部分を俯瞰してレビューするようにしています。

## 技術知識の共有

既存のコードがすべて正しいということは全くなく、言語によっても変わりますが結構なスピードでデファクトは変化していきます。

エンジニアとしてアンテナを常にはり、技術のキャッチアップをすることは重要ですが、日々の業務に忙殺されて思うように時間がとれないということもあると思います。

ならそれをコードレビューの場を借りて解決していきましょうということです。
新しい知識をチームに還元していくことで、メンバーはそれを吸収しさらに強くなります。

もちろんそこで発生する新しい書き方を採用するかどうかの議論もチームとして大切なものです。


## 最後に
個人的にはコードレビューのタイミングで一行ずつしらみつぶしに見て、「この書き方はイケてないので〜」、「前も言いましたが〜」と指摘する必要性は時と場合によりますがないと思っていて、上記のポイントを全員が意識することでチーム全体のレベルが上がってくると思います。

レビュイーは最初から可読性やバグを引き起こしにくいコードを書く意識をもつようになり、自分がレビューするならこう指摘するだろうなという客観的な見方ができるようになってきます。

ここで述べた内容は本当に基本的なことなのですが、コードレビューに関するチーム内の共通認識は比較的ないがしろにしがちです。
特にレビュイーはレビュー時にストレスフルになりがちなので、まずはレビューの最低限意識するポイントをきちんと共有するところからはじめましょう！
macOSのアップデートをブロックする方法

macOSのあるアップデートをブロックしたがるユーザーは以下の方法を参考するのが良きと思う。
terminalを立ち上げ、`softwareupdate --help` を実行すれば、softwareupdateというコマンドの情報が表示される。
その情報によれば、`softwareupdate --ignore <label>`はアップデートのブロックを果たせるコマンドである。そして、`<label>`はどこで探せるかと言えば、ファイル`Library/Preferences/com.apple.SoftwareUpdate.plist`をXcodeを使って開けばよし。`Identifier`というキーは上の`<label>`である。
hashについて ruby

# ハッシュとは
ハッシュは配列のインデックス部分をキーというものに置き換わり、バリュー（値）をそのキーに紐づいてデータを管理してくれるものです。

簡単にデータの集計とかをやってくれるので、配列でデータ集計するよりお手軽です。
例えば、下記のような処理を書いて、ユーザーのリストのようなプレーンテキストがあったとします。

```hash.rb
name_count = {}
STDIN.each do |line|
    line.chomp!
    count = name_count[line] ||  0

    name_count[line] = count + 1
end

p name_count

name_count.keys.sort.each do |name|
    value = name_count[name]
    puts "#{name}が#{value}個発見されました"
end
```

```logfile
Joutarou 
Noriaki
Polnareff
Avdol
Joutarou 
Noriaki
Joseph
Igy
Joutarou 
Noriaki
Joutarou 
Polnareff
Avdol
Joutarou 
Joseph
Joseph
Polnareff
Avdol
Joseph
Igy
Joutarou 
Igy
Joutarou 
Igy
Joutarou 
Noriaki
Joseph
Igy
Noriaki
Joseph
Igy
```

実行してみます。

```
$ ruby hash.rb < logfile
{"Joutarou "=>8, "Noriaki"=>5, "Polnareff"=>3, "Avdol"=>3, "Joseph"=>6, "Igy"=>6}
Avdolが3個発見されました
Igyが6個発見されました
Josephが6個発見されました
Joutarou が8個発見されました
Noriakiが5個発見されました
Polnareffが3個発見されました
```

出力結果の1番上にあるのが、ハッシュのデータそのものになります。キーとバリューがセットになって作られているのがわかります。

# ハッシュで複数のバリューを持たせたい・・・
　データを管理する方法として、先のコードでやったように集計も楽であることから配列のように一気に順番に出す以外で使うことがあるようなデータを取り扱う場合、ハッシュの方が便利にように思います。
　配列でインデックスに複数配列を作ることもできますが、データ内へのアクセスの面倒さや、コードにした時の可読性にも難があります。ハッシュであれば、その両方をクリアできるように思います。例えば、ユーザー名に対して、今月のログイン数と、累計のログイン数のデータをセットで持たせたい場合、ハッシュの中にハッシュを組むことで、分かりやすくデータを管理することができます。1つのキーにハッシュが紐づいているというイメージです。

```hash_hash.rb
access_hash = {
    "Joutarou"  => 1,
    "Avdol" => 3,
    "Kakyouin" => 2,
    "Joseph"  => 8
}
  
  ruikei_hash = {
    "Joutarou" => 12,
    "Avdol" => 12,
    "Kakyouin" => 100,
    "Joseph" => 22
  }
  
  matome_hash = {}
  
  access_hash.keys.each do |name|
    matome_hash[name] = {
      "access" => access_hash[name],
      "ruikei" => ruikei_hash[name]
    }
  end
  
  p matome_hash
  
  p matome_hash["Joutarou"]["ruikei"]

  matome_hash.keys.sort.each do |name|
    value = matome_hash[name]["access"]
    puts "#{name}が#{value}です"
  end
```

出力結果は下記になります。

```
$ ruby hash_hash.rb
{"Joutarou"=>{"access"=>1, "ruikei"=>12}, "Avdol"=>{"access"=>3, "ruikei"=>12}, "Kakyouin"=>{"access"=>2, "ruikei"=>100}, "Joseph"=>{"access"=>8, "ruikei"=>22}}
12
Avdolが3です
Josephが8です
Joutarouが1です
Kakyouinが2です
```

## まとめ
データのアクセスのしやすさと、見易さが際立っていると思います。便利ですね。
第5回エクセルでペーパーレス化に挑戦!

今まで技術検証が中心でしたが、今回は業務経験をもとに抽象化した運用改善のアプローチについてまとめてみようと思います。

## なぜペーパーレス化をやろうと思ったのか？
(理由)
現場では、ping疎通結果などのエビデンスを紙で印刷する文化が根付いている。
~~この令和の時代に２世紀前の昭和かよって心の中では思っています。。~~

しかし印刷の間違いや、ラインマーカーの塗り間違えによりもう一回印刷をしなければならないので時間と手間がかかっていた。
とくにIPアドレス払い出し時のping応答結果では、少ない時は5個ほどだが、多い時は
**40個ほど一気に払い出す**ことがあり、ラインマーカーでping応答結果を全部塗るのは時間とコストがかかっていました。
そこで**ペーパーレス化に取り込もうキャンペーン**をチームで始めようとリーダーに提案を行いました。

**※本記事の内容は、実務で得た知見をもとに再現・一般化したものです。実際の業務とは異なる構成・データを使用しています。**

## どんな改善を提案したのか？
###改善前
ping疎通結果とshow ip arp結果のログを印刷し、**ping疎通結果、show ip arp結果すべてをラインマーカーで塗る。**

###改善後
ping疎通結果とshow ip arp結果のログをエクセルに直接貼り付け、**関数と条件付き書式で色塗りとIPアドレス払い出し数の集計を自動化**　→　結果ペーパーレスを実現。

【内容】
エクセルの条件付き書式にて
→**指定の文字列**を含むセルに色を塗る

| 特定の文字列       |       行の色 |    行の色    |
|:-----------------|------------------:|:------------------:|
| ping            |              黄色に変化 |
| Success rate is 0 percent           |            黄色に変化 | 
| show ip arp(show arp)            ||        水色に変化        |
|  0   Incomplete           ||        水色に変化        |

さらにセルにも

 - 文字列**ping**の結果数は`=COUNTIF(A1:A1000,"*ping*")`

 - 文字列**show ip arpの**結果数は`=COUNTIF(A1:A1000,"*show ip arp*")`

上記2つの関数を登録。

それが↓です

![ping.arp結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/319c348c-2b3b-1631-b078-c319e4898f4e.png)



セルのA1にログを張ることで
**指定の文字列を含む行の色が反転**し、**文字列の数を自動でセルにカウント**します。

## このファイルを作成した結果
カウントミスなくping結果から何個のIPアドレスを払い出したのかすぐわかり
データに結果を残すことでペーパーレス化の実現に成功。

## 次回予告
次回も、実務経験で得た気づきをもとに、再現・検証した改善プロセスをご紹介する予定です。
ゆっくりGo vol.1

#前書き
Python、R、Fortran90、C#、Processing、等々さわってきた結論として、

CとFortranからは逃れられない定めにあると悟りました

Goで土台を築くことに……

そして、後輩たちに布教するんだ……ふへっ

#学ぶ上で用意した物
Go Tour
https://go-tour-jp.appspot.com/

スターティングGo言語
https://www.amazon.co.jp/dp/B01FH3KRTI/

#本題
Go Tourのforまで学んで思ったことについて

##導入

@yoskeoka 氏が [WindowsにGo言語をインストールする方法まとめ]
[WindowsにGo言語をインストールする方法まとめ]:http://qiita.com/drafts/c686397e4a0f4f11683d

とまとめてくださっているので、導入**には**苦労しませんでした

と言うのも、入れろ入れろと煩く言われたウイルス対策ソフトの影響で、

挙動が不安定になり、

```hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello world\n")
}
```
の `go run` や `go build` に数分かかる、フリーズしかける、など

酷い目に遭いました

うーん、初歩的!

##気に入っている所
```import.go
//----------------
import (
	"fmt"
	"time"
)
//----------------
```
importを枠内に書くので見やすい

`()`で囲むところもポイントが高い

```type.go
//----------------------------
func add(x int, y int) int {
	return x + y
}
//-----------------------------
```
型を変数の後ろで定義する所が最初は違和感だったけれど、

`xが整数`と素直に読める事を考えると、素晴らしい!になった(小並感)

```while.go
//-------while--------------------------
func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
//-------infinite-----------------------
func main() {
	for {
	}
}
//---------------------------------------
```
whileを利用した所、infiniteを利用した所など、

非常に分かりやすくて、すこすこのすこ!

##ぐぬぬ……な所
```func.go
//----------------------------------------
func swap(x, y string) (string, string) {
	return y, x
}
//----------------------------------------
```
戻り値の型の定義が、引数の隣なので忘れそうで怖い

```loop.go
//----------------------------------------
func main() {
	sum := 0
	var i int = 0
	for ; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}
//----------------------------------------
``` 
暗示的な型には`:=`を、明示的な型には`var`を利用するのですが、

for文の変数に対して型を明示的するやり方が分からない件について

上の書き方で、`var i int` を `var i float64` に変えると、

<font color="red">**mismatched types int and float64**</font>

と返ってきたので、一応成功していそうです

**態々そんなのする必要ある?は禁句**

#本日のまとめ
この言語、個人的にすこすこのすこてぃっしゅ!

明日はMethods and interface に突入したいね!
CodeBuildのビルドログの日本語化

# CodeBuildのログがこんな感じで日本語化されないことに悩んでいた。

```
xxxx.common.exception.ExceptionConfigResolverTest > ConfigMap????????:resolve????????????????????????? PASSED

xxxx.common.exception.ExceptionConfigResolverTest > ???null??????:exception?null???????????????????? PASSED

xxxx.common.exception.ExceptionConfigResolverTest > ???????????????:??????????????? PASSED

xxxx.common.exception.ExceptionConfigResolverTest > ???????????????(??????????????):??????????????? PASSED

xxxx.common.exception.ExceptionConfigResolverTest > ????????????????:????????????????? PASSED
```

UnitTestのAssertは流石に日本語で書いてあるのも多く文字化け解消したいんだけど…。
      
# 結論
こんな感じにすればよい。(AWS CLIは今回関係ない)

```buildspec.yml
phases:
  install:
    runtime-versions:
      java: corretto11
    commands:
      - yum update -y
      - chmod +x ./gradlew
      - touch gradle.properties

      - |
        cat <<EOL > gradle.properties
        org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m
        EOL
      - pip install --upgrade pip
      - pip install --upgrade awscli
      - yum -y install ibus-kkc vlgothic-* glibc-locale-source glibc-langpack-en
  pre_build:
    commands:
      - localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
      - export LANG="ja_JP.UTF-8"
      - export LANGUAGE="ja_JP:ja"
      - export LC_ALL="ja_JP.UTF-8"
```

# 途中色々   
https://debugroom.github.io/mynavi-doc-draft/automation_infra_devops/automation_infra_devops_codebuild_local.html

当初このままローカライズしようと思ったら、AmazonLinux利用していたのでそのままでは使えない。
どっちかというとCentOS経由なので↓を参考にする。
      
https://qiita.com/YuukiMiyoshi/items/f389ea366060537b5cd9

ここに書いてあるように、 `ibus-kkc`と`vlgothic-*`のFont周りのみをインストールすることとし、localdefを利用すると、

```
[Container] 2020/07/29 10:12:06 Entering phase PRE_BUILD
[Container] 2020/07/29 10:12:06 Running command localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
character map file `UTF-8' not found: No such file or directory
default character map file `ANSI_X3.4-1968' not found: No such file or directory

[Container] 2020/07/29 10:12:06 Command did not exit successfully localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 exit status 4
```

こんな感じのエラーが出る。
これを対処するには`glibc-locale-source`と`glibc-langpack-en`のインストールも必要なようだった。（少なくともruntimeがCorreto11を利用している場合は。）

# やったね！
```
xxxx.common.exception.ExceptionConfigResolverTest > ConfigMapがない場合の挙動:resolve時にマップがないログを出力しデフォルト値を返却する PASSED

xxxx.common.exception.ExceptionConfigResolverTest > 引数がnullの場合の挙動:exceptionがnullであるログを出力しデフォルト値を返却する PASSED

xxxx.common.exception.ExceptionConfigResolverTest > マップ定義がありヒットする場合:対応したログレベルが返却される PASSED

xxxx.common.exception.ExceptionConfigResolverTest > マップ定義がありヒットする場合(継承関係の順番を間違えたとき):対応したログレベルが返却される PASSED

xxxx.common.exception.ExceptionConfigResolverTest > マップ定義がありヒットしない場合:デフォルトのログレベルが返却される PASSED
```
初心者によるプログラミング学習ログ 385日目

#100日チャレンジの385日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
385日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業⇩<br><br>●就寝前筋トレ5分、キンドル読書 10分<br>●ブログ1記事作成<br>●プログラミング学習385日目 2h<br>・メンターの課題<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1288199818586669056?ref_src=twsrc%5Etfw">July 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Xcode 11でビルドしたアプリをiOS 14 betaシミュレータ上で動かす方法


最初の1分ほどの手順で、それ以降はXcode 11からiOS 14 betaシミュレータを直接選び、アプリ(iOS 13 SDK)を実行することが可能になります。

何か問題や気付いたことがありましたらコメントで教えていただけると助かります。

## 準備

* macOS Catalina 10.15.6
* Xcode 12 beta 3
* Xcode 11.5

:link: [More Downloads for Apple Developers](https://developer.apple.com/download/more/)
このApple公式ダウンロードサイトからXcode 12 betaとXcode 11のxipファイルをダウンロードしてインストールしています。
ビルドを行うXcodeバージョンは11.5でなくてもOKです(Xcode 11.6が現時点で最新)。
App Store版のXcodeでは試していないため有効かわかりません。

xipファイルから解凍した各Xcodeは以下の通りに配置しリネームしてあります。
* Xcode 12 beta 3: /Applications/Xcode12-beta3.app
* Xcode 11.5: /Applications/Xcode.app

各Xcodeの初回起動時に`Command Line Tools`をインストールするダイアログが表示されるので、各Xcodeのバージョンに対応する`Command Line Tools`をインストールしておいてください。


## 手順

#### 1. Xcode 12 betaを起動

`Command Line Tools`のバージョンを指定します。

```sh
sudo xcode-select -s /Applications/Xcode12-beta3.app
```

 (別法でメニューから指定することもできます Preference > Locations > Command Line Tools)


#### 2. beta版シミュレータアプリを起動

新規プロジェクトでも何でもいいので、iOSアプリを実行しbeta版シミュレータアプリを起動します。

![Screen Shot 2020-07-29 at 18.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/727d703f-90b0-a87c-5471-e85769245e9d.png)

![Screen Shot 2020-07-29 at 18.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/3402893d-61e5-1f8a-e96a-8dd6a47c7d2f.png)

#### 3. Xcode 12 betaを終了

このとき、beta版シミュレータアプリは起動させておきます。

#### 4. Xcode 11を起動

Command Line Toolsのバージョンを指定します。

```sh
sudo xcode-select -s /Applications/Xcode.app
```

これで先程起動させたbeta版シミュレータが、より古いバージョンのXcodeから選択＆実行できるようになりました :tada:

既存のプロジェクトでは以下の画像のようになります。

![Screen Shot 2020-07-29 at 18.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/75030680-47c2-edf6-e0e9-c4a445e1b55e.png)


## 別法

:link: [Test iOS Build from Production Xcode on Beta iOS Simulators](https://lostmoa.com/blog/TestIOSBuildFromProductionXcodeOnBetaIOSSimulators/)
別の方法として、Xcode 11でビルドしてiOS 13のシミュレータ上にあるアプリの保存場所をActivity Monitorアプリで特定。それをドラッグ・アンド・ドロップでiOS 14 betaのシミュレータの画面上に移すという方法が紹介されていました。これは少し面倒くさいですね。
Rustのsoftfloatライブラリ比較

# はじめに
softfloatライブラリとは浮動小数点数演算をソフトウェア的に実装したものです。
通常の単精度（32bit）や倍精度（64bit）の浮動小数点数演算はRustでサポートされており、ハードウェアで高速に実行されます。
しかし、それ以外の精度（例えば16bitの半精度や128bitの四倍精度）を使いたい、丸めの仕方を厳密に制御したい、といった要求には対応できません。そのような場合に、（当然ハードウェアで実行するよりはるかに遅くなりますが）ソフトウェア実装の浮動小数数演算ライブラリを使うことができます。

Rustのsoftfloatライブラリには以下のようなものがあるので、使い勝手やパフォーマンスを比較してみました。

* [softfloat-sys](https://crates.io/crates/softfloat-sys/)
* [simple-soft-float](https://crates.io/crates/simple-soft-float)
* [rug](https://crates.io/crates/rug)

# softfloat-sys
[Berkeley SoftFloat](https://github.com/ucb-bar/berkeley-softfloat-3)というCのsoftfloatライブラリのバインディングです。
-sysとついている通り、Cの関数をそのまま提供します。
（RustのCバインディングでは-sysというクレートでCの関数をそのまま提供し、別クレートで安全なラッパーを提供するのが一般的です）

```rust
let a = 0x12345667;
let b = 0x76543210;
let a = softfloat_sys::float32_t { v: a };
let b = softfloat_sys::float32_t { v: b };
let d = unsafe { softfloat_sys::f32_add(a, b) };
assert_eq!(d.v, 1985229328);
```

すべて`unsafe`なので、そのまま使うのはちょっと厳しい感じです。

# simple-soft-float
Rust実装のsoftfloatです。
型やトレイトがちゃんとしているので扱いやすいです。

```rust
let a = 0x12345667;
let b = 0x76543210;
let a = simple_soft_float::F32::from_bits(a);
let b = simple_soft_float::F32::from_bits(b);
let d = a.add(&b, None, None);
assert_eq!(*d.bits(), 1985229328);
```

# rug
厳密にはsoftfloatというより任意精度演算ライブラリです。Cの[GMP](https://gmplib.org/)/[MPFR](https://www.mpfr.org/)を使って任意精度の浮動小数点数演算をサポートしています。
（他にも任意精度整数や有理数のサポートもあります）

```rust
let a = 0x12345667;
let b = 0x76543210;
let a = rug::Float::with_val(24, f32::from_bits(a));
let b = rug::Float::with_val(24, f32::from_bits(b));
let d = a.add(b);
assert_eq!(d.to_f32().to_bits(), 1985229328);
```

こちらもRustっぽく使えるようになっているので使い勝手的には問題ないと思います。
たたし、IEEE754形式のビットパターンを扱う方法が見つかりませんでした。
値の初期化は`f32`,`f64`から行うようで、例えば直接四倍精度の値を得る方法がなさそうに見えます。
（一応MPFRの内部表現形式を直接触ることはできそうですが、それも違う感じが…）

# パフォーマンス
半精度から四倍精度までの加算・乗算・除算のパフォーマンスを比較してみました。
（適当な値での計算1回だけなので、そんなに厳密な比較ではないです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84296/e3eeaf6c-8873-0c35-eff8-a000a7d77c72.png)

グラフの縦軸が**対数**だということにご注意ください。見ての通りsimple-soft-floatが圧倒的に遅いです。
もともとsimple-soft-floatのコンセプトは「速度より可読性」ということなので2桁ほど遅いことは覚悟していましたが、5桁も遅いとは思いませんでした…。

今回使ったコードはこちらになります。
https://github.com/dalance/softfloat_bench

# まとめ
どれも一長一短といったところでしょうか。
パフォーマンスが必要ならsoftfloat-sys一択なので、`unsafe`だけケアした簡易ラッパーを作って使うのが良さそうです。
遅くてもいいならsimple-soft-floatが使いやすいと思います。
自動機能テストツールである「UFT」の歴史を調べてみた

UFTとは、MicroFocus社が提供するテスト自動化ツールです。
「Unified Functional Testing」が正式名称ですが、公式でも「**UFT**」と呼んでいます。
以前は「**QTP**」という名前で提供されていたので、「あぁ、QTPね」ってなる人もいるかと思います。

私は2017年12月からこの「**UFT**」を使い、GUIテスト実行の自動化に携わってきました。

最近UFTについて人に話す機会が多いので、簡単な歴史について記述したいと思います

# はじめに ～ QTP(UFT)とは～
UFTについて知らない人もいるかと思うので、簡単にどのようなツールなのかを簡単に紹介します。

UFTはWebやGUI,APIアプリケーションの機能テストを自動でテストすることができる（有償）ツールです。
VBScriptでのコーディングしての自動テストコードを記述することが可能で、
プログラミングが出来ない人にもキャプチャ＆リプレイ、キーワード駆動での自動テスト実装が可能となっています。

Seleniumといった無償ツールとは違い、有償ツールなのでサポートが充実している反面、
あまり情報が世の中に出回っていなく、何かトラブルが発生した時に苦労します（苦労しています...）

よりUFTについて詳しく知りたい方がいましたら、以下のリンクにアクセスしてみてください。

[**Unified Functional Testingとは**](https://www.google.com/search?rlz=1C2EJFC_enJP908JP908&source=hp&ei=I04UX-XQBoKemAX_15fADg&q=Unified+Functional+Testing&oq=Unified+Functional+Testing&gs_lcp=CgZwc3ktYWIQAzICCAAyAggAMgQIABAeMgQIABAeMgQIABAeMgQIABAeMgQIABAeMgQIABAeOg4IABDqAhC0AhCaARDlAlDxwgJY8cICYOzIAmgCcAB4AIABZ4gBZ5IBAzAuMZgBAKABAqABAaoBB2d3cy13aXqwAQY&sclient=psy-ab&ved=0ahUKEwil7pyqudnqAhUCD6YKHf_rBegQ4dUDCAk&uact=5)

# UFTの歴史 ～ざっくり紹介～

Mercury Interactive社が1998年開発し、Hewlett-Packard社が2007年に買収。その後2017年にMicroFocus社が部門買収をした。

|日付|概要|備考|会社|
|:-:|:-:|:-:|:-:|
|1998/05-2001/08|Astra Quick Test V1.0をリリース|Astra Quick Test v1.0 to v5.5|Mercury Interactive社|
|2003/09-2006/4|QuickTest Professional(**QTP**)をリリース|QuickTest Professional v6.5 to v9.0をリリース|Mercury Interactive社|
|2007/02-2014/09|HP-QuickTest Professional(**QTP**)|HPがMercury Interactive社を買収|Hewlett-Packard社(HP)|
|2014/10-2017/09|名称をUnified FuncationalTesting (**UFT**)に変更(ver.12~)|QTP Ver.9が最後。以降はUFTと名前を変えた|Hewlett-Packard社(HP)|
|2017/09-現在|Unified FuncationalTesting (**UFT**) (ver.14.5~)|MicroFocus社がHPのソフトウェア部門を買収した|MicroFocus社(MFE)|


#　おわりに
ざっくりとUFTの歴史について記載しました。
と言っても年表を書き出しただけになるので、今後はUFTのテクニカルな部分について記事を投稿させていただきます。

# 参考サイト・ページ
Wikipedia：https://en.wikipedia.org/wiki/Micro_Focus_Unified_Functional_Testing

QTPからUFTへ：https://docsplayer.net/56108760-Qtp%E3%81%8B%E3%82%89uft%E3%81%B8.html
MacでHEICファイルを一斉変換

iPhoneから写真を共有してもらった時にHEICファイルだとまだ取り回しが悪いのでjpegへ変換する。一個くらいならプレビューでjpegエクスポートでもいいけど面倒なので一斉変換。

```bash
for f in *.HEIC ; do sips --setProperty format jpeg $f --out `basename -s .HEIC $f`.jpg; done
```

sips知らなかった...
jpegのサイズをもう少し下げたい場合はsipsのoptionでlow指定する。これで十分。

```bash
for f in *.HEIC ; do sips -s format jpeg -s formatOptions low $f --out `basename -s .HEIC $f`.jpg; done
```
かんたんログイン機能を実装する

転職するに当たってポートフォリオを作った。採用の人に見てもらう為にはなるだけストレスなくアプリの機能が見れるようにしておくべきである。そこでボタン一つでログインができる機能を実装したので共有したいと思います。

前提として、通常のログインなどのアカウントのロジックにはsorceryというgemを使っているものとして説明していきます。

結論から書くと以下のコードで簡単ログインが実装できます。

```app/controllers/guestuser_sessions_controller.rb
  def create
    # 引数の条件に該当するデータがあればそれを返すfind_by(attributes)、なければ新規作成create(attributes, &block)
    @user = User.find_or_create_by(email: 'guest@example.com') do |user|
      # パスワードをランダムで生成する。GithubbにソースコードをあげるときにPWの漏洩が防げる。
      user.password = SecureRandom.urlsafe_base64
      # 作成したユーザーの名前
      user.user_name = "ゲストユーザー"
    end
    # ログインさせる
    auto_login(@user)
    redirect_to todo_tasks_path(@user), notice: 'ゲストユーザーでログインしました'
  end

```


ログイン機能を実装してるのでuser_sessionn_controller.rbとかもあるかと思いますので、そっちに書いてもよかったんですがどっかで一つの場所に処理を書きすぎるのはダメだぞぉって言ってたなと思ってゲストログイン用のコントローラーを作りました。

rails g controllerってやつでパパッとね。

あとはルーティングとビューを設定してやれば実装完了です、簡単ですね。

```routes.rb
  # 簡単ログイン
  resources :guestuser_sessions , only: :create
```

```app/views/user_sessions/new.html.slim
= link_to 'かんたんログイン', guestuser_sessions_path, method: :post,class: 'btn btn-success'
```
流れとしては、
１、ゲストログイン用のコントロラーを作る
２、ゲストログインの処理をコントローラーに書く
３、ビュー側での処理を書く
４、ルーティングを設定する
５、ゲストログインできるようになる。

こんな感じですね。

バチくそに詰まったところとしては、
skip_before_action :login_requiredでログインの要求をスキップし忘れてたせいで永遠にログイン画面に行ってたことがあったので、忘れずに設定しましょう。


参考

https://yukitoku-sw.hatenablog.com/entry/2020/02/05/221212
https://qiita.com/tktk0430/items/4fe69c8efcb6a9c26ca5
https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104
https://note.com/john01/n/n4c7d00d585fd#SnGXV
https://qiita.com/aiandrox/items/65317517954d8d44d957#ゲストユーザーログイン
https://docs.ruby-lang.org/ja/latest/method/SecureRandom/s/urlsafe_base64.html
https://qiita.com/4geru/items/e9c6545eb211124f153d
https://qiita.com/taimuzu/items/0a21738d018f475d63ae
複数モデルにデータを保存したい

某メルカリのコピーサイトを作成中。
商品の画像登録にて、複数の画像登録となるとカラムが増えて美しくないので
別モデルでimageテーブルを作成することに

#fields_for
>form_for内で異なるモデルを編集できるようになる。

例：Productモデルに紐付くImageモデル

これを使うとform_withとかで別モデルに保存とかできるようになるっぽい
アソシエーションとかで紐づいてることが前提


#Model
product(商品)とimageは１対多
`accepts_nested_attributes_for` で一緒に保存したいモデルを指定

```product.rb
class Product < ApplicationRecord
  has_many :images
  accepts_nested_attributes_for :images
end
```

<br>
imageとproduct(商品)は多対一となってます
複数保存する場合は `mount_uploaders` と複数形にする必要があるので注意

```image.rb
class Image < ApplicationRecord
  belongs_to :product
  mount_uploaders :image, ImageUploader
end
```


#Controller
newアクションで `build`  を使用することでfield_forが使用可能に

###build
>親モデルとアソシエーションを組んでいる子モデルのインスタンスを生成できるメソッド

みたいです。ちなみにhas_many(1対多)であれば

`インスタンス変数.子モデル.build`

で問題ありませんが、belongs_to や has_one では .build の表記では使えないらしく

`親モデル.build_子モデル` 　例) @product.build_image

となるそうです

```products.controller.rb
  def new
    @product = Product.new
    @product.images.build
  end

  def create
    @product = Product.create(product_params)
  end

  def product_params
    params.require(:product).permit(images_attributes: {image: []})
  end
```
またパラメーター内では
`モデル名_attributes:` と記述します

これも送るデータが一つか複数かで記述が変わり、一つの場合は

`images_attributes: [:image]`

こんな感じ

#View
```html.haml
    .Contents
      = form_with model: @product, html: {class: "Form"}, local: true do |f|
        .InputPhoto
          .InputPhoto__DropArea
            = f.fields_for :images do |c|
              = c.label :image
              = c.file_field :image, multiple: true
```

これでとりあえず画像の保存は完了！

次はjqueryか...
<br>
参考記事
https://qiita.com/kouuuki/items/5daf2b5f34273d8457f7
https://qiita.com/nakasato_minami/items/5015319292c9f8a93f34
https://qiita.com/mihou/items/2d7504c0bf98d07a95c3
ありがとうございました！！！
PHPで大容量CSV書き出しを高速で処理する

CSVエクスポートでLaravelが用意するStorageクラスでファイル作成してループして1行ずつ書き込みすると無茶苦茶重いというか時間がかかったのでもっと早く出来ないかと調べた結果をメモ。

# 参考サイト

[【PHP】大量データをfputcsvで瞬時にCSVファイル出力する方法](https://ondwn.com/blog-20190723/)

# 環境

FW: Laravel 6.x
PHP: 7

# どのぐらい早いか

### 条件
レコード数: 50,000件
テーブルデータサイズ : 5.4MB
※PCのスペックとかもあるだろうけど、開発環境はDocker for Mac使っています。

### 結果
実行時間1回目: 16.8 sec
実行時間2回目: 25.2 sec

# サンプルコード

```php:UserController.php
public function export() {
    $users = new App\User::all();

    $filePath = storage_path(sprintf('app/%s.csv', date('ymd_hisu')));

    $stream = fopen('php://temp', 'w');

    $header = $users->first()->getFillable();
    mb_convert_variables('SJIS-win', 'UTF-8', $header);
    fputcsv($stream, $header);

    foreach ($users as $user) {
        $line = $user->toArray();
        mb_convert_variables('SJIS-win', 'UTF-8', $line);
        fputcsv($stream, $line);
    }

    rewind($stream);
    $content = stream_get_contents($stream);
    file_put_contents($filePath, $content);
    fclose($stream);

    return response()
            ->download($filePath, sprintf('サンプル%s.csv', now()->format('YmdHis')))
            ->deleteFileAfterSend();
}
```
Macにzshをインストール

2020年3月25日深夜以降？にqiita問題があった為、
2019年頃の本記事を3月29日にqiitaから削除し他サイト移行を検討した。

その後、問題なくなったのでテストとして本記事のみ戻してみる。

MacOS 10.9
zsh 5.7.1 -> 5.8　2020年3月上旬　更新

MacOSが公式にzshを採用したのでzshを入れる。

#１．注意点

bash同様zshは重要な基本ソフトである。
安易にbrew install zshを推奨しているサイトが多い。
homebrewトラブル時に対処できない場合を避けるため
homebrewでなく手動でzshをインストール。

#２．ダウンロード

公式
公式ページの右のダウンロードの下のソースから手動でダウンロード。
[ZSH - THE Z SHELL](http://zsh.sourceforge.net/)

ダウンロードのリンク。
[ZSH - Source download (http://zsh.sourceforge.net/Arc/source.html)](http://zsh.sourceforge.net/Arc/source.html)

コマンドでダウンロードする場合。

```
$ curl -LO https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz
```
#３．ビルド

```
$ tar Jxvf zsh-5.8.tar.xz
$ cd zsh-5.8
$ ./configure --enable-multibyte
$ make
（$ make check　実行してもしなくても良い。MBairで二分くらい）
$ sudo make install
```


/bin/zshは消さないこと。

#４．zsh-completionsインストール省略。

zsh-completionsは非標準コマンドを補完できるようになる素敵なプラグインだが、zshはbashの代替なのでしばらくインストールしない。

公式
GitHub - zsh-users/zsh-completions: Additional completion definitions for Zsh.
https://github.com/zsh-users/zsh-completions

[brewのzsh-completionsを使ってzshの補完を強化する - Qiita](https://qiita.com/maru_cc/items/4dfaa99be7bf95cf68bb)

#５．bash の設定を引き継ぐ

重要
[zshの設定ファイルの読み込み順序と使い方Tipsまとめ - Qiita](https://qiita.com/muran001/items/7b104d33f5ea3f75353f)

上の URLには、読み込み順として次のようになる。
    global) /etc/zshenv
    local ) ~/.zshenv
    global) /etc/zprofile
    local ) ~/.zprofile
    global) /etc/zshrc
    local ) ~/.zshrc
    global) /etc/zlogin
    local ) ~/.zlogin

よって、bash_profileの出力先はzprofileでなく.zshenvとする。

cat .bash_profile >> .zshenv

cat .bashrc >> .zshrc

#６．.zshrc .bashrcで異なる点はプロンプトとhistoryと補完機能だけで後は互換。

```
# --------
# ZSH
# --------
# 補完機能
autoload -Uz compinit
compinit
zstyle ':completion:*' menu select

# --------
# ZSH history
# --------
alias hi='history -30'
# 履歴ファイルの保存先
export HISTFILE=${HOME}/.zsh_history
# メモリに保存される履歴の件数
export HISTSIZE=10000
# 履歴ファイルに保存される履歴の件数
export SAVEHIST=100000
# 重複を記録しない
setopt hist_ignore_dups
# 開始と終了を記録
setopt EXTENDED_HISTORY
# --------
# ZSH prompt
# --------
# promptinitを使う場合はこちらを読み込む
# 利用可能なpromptの設定を見る
# $ prompt -l
# promptを設定する
# $ prompt [prompt名]
# promptを独自で変更
# PROMPT='%m:%F{green}%c%f %n%# '
PROMPT='%F{yellow}%c%f $ '
```

プロンプト
[とりあえずZshを使えば良いんだろう？ - Qiita](https://qiita.com/ktr_type23/items/3eb782f98c7a5f4c60b0)

#７．Macでログインシェルを確認/変更

$　sudo vim /etc/shells
/usr/local/bin/zsh を追加する

$ chsh -s /usr/local/bin/zsh

ログインシェルにzshを使ってない場合は
source ~/.zshenv
source ~/.zshrc

ログインシェルにzshを使っている場合は、ログアウト。(又は再起動)

[Macでログインシェルを確認/変更するいくつかの方法](https://rcmdnk.com/blog/2015/05/25/computer-mac-bash-zsh/)

以上

--
Material-UI の Dialogのスタイルを変更する方法

## はじめに
Material-UIで画像をモーダルで表示したい時に、やり方を探したのでメモとして残します。

## やり方
`PaperProps`にstyleを渡す。

```tsx
import { Dialog } from "@material-ui/core";

...
const [showingDialog, setShowingDialog] = useState(false);
...

<Dialog
  onClose={() => setShowingDialog(false)}
  open={showingDialog}
  scroll="body"
  PaperProps={{
    style: {
      backgroundColor: "transparent",
      boxShadow: "none",
      textAlign: "center",
    },
  }}
>
  <img src="image url" />
</Dialog>
...
```
【Python初心者】このフォルダにどんなファイルがあったっけ？」となった時に、1行で検索する。


結論
-----
```python:結論
os.listdir(path) 
```


きっかけ
---------
Downloadsに入っている書類を一覧にしたいなと思ったところが始まりです。



各論
-------

```python:pathを調べる
#方法1 option+command+C
#Macならファイルを選択しながら「option」「command」「C」を押すと”絶対PATH”が得られる
#例：/Users/"ユーザ名"/Downloads/"あるファイル名"'

#方法2
#ファイル名検索をする
#勉強中
```


```python:listdirでファイル・フォルダを取得する

#今回は、Downloadsのデータを取得する
import os
path = '/Users/username/Downloads'
files = os.listdir(path)
for file in files:
    print(file)
```

追加:glob()も便利
------------

```python:拡張子(.pdf)を指定してファイル名を調べたい
import glob
path = '/Users/username/Downloads'
print(glob.glob(path+'/*.pdf'))
```


現在に限って検索したい場合

###現在のファイルのパスを調べたい（絶対パス）

```python:カレントディレクトリ
import os
print(os.getcwd())
```

例えば、私はspyderでpythonを書いているので、

>/Users/username/.spyder-py3

と返ってきます。




###現在のファイル内を拡張子(.py)を指定して調べたい（ファイル名）

```python:拡張子を指定
import glob
glob.glob('*.py')
```

/Users/username/.spyder-py3のファイルの中には

>untitled0.py
temp.py
template.py
history_internal.py
history.py

が入っていると返ってきました。

globの便利な使い方はこちら
[Pythonで条件を満たすパスの一覧を再帰的に取得するglobの使い方](https://note.nkmk.me/python-glob-usage/)
サイトのフォーム制作必要なタグについて(HTML)

###サイトのフォーム制作必要なタグについて(HTML)
##お問い合わせフォームなどの制作に必要なタグ一覧
今回は、サイトのお問い合わせフォームなどに必要なタグをまとめて行こうと思う。
前の記事で書いたタグなどは今回割愛する。

##formタグ
formタグはお問い合わせなどのフォームを作る時に使う。
他の記事を見てみると、別にformタグで囲わなくてもこの後記述する、inputタグやtextareaタグは使えるので用途によって使い分けるといい。
またHTML5からform属性を持たせることで、formタグの外にあってもform要素と関連付けることもできるようになっている。

##inputタグ
inputタグは、様々なtype属性がありtext,submit,reset,passwordなど使う目的によってtype属性を持たせるといい。type属性の種類に関してはまた別の記事に書く。

##textareaタグ
textareaタグは、お問い合わせの本文など長文が予想されるところに配置するべきタグ。plaaceholder属性を持たせることで書いて欲しい内容の案内文などを予め入れておくこともできる。

##labelタグ
labelタグは、inputやtextareaなどのタグに足して見出しをつける時に使うタグである。見出しをつけたいタグにid属性を指定してlabelタグのfor属性にそのid属性の属性値を入れることで自分の指定したタグに見出しをつけることができる。

##filedsetタグ
filedsetタグは、フォームの内容を個人情報とお問い合わせ内容などカテゴリーで分けて見やすくすることができるタグである。

##legendタグ
legendタグは、filedsetタグによってグループ化されたフォームの入力項目にタイトルをつけるためのタグである。

##selectタグ
selectタグは、製作者側で用意した項目を選んでもらう時に使うタグ。optionタグを使って項目を増やすことができる。また、optionタグの項目が増えた場合にはoptgroupタグを使って選択肢をカテゴリーで分けることもできる。
slackのtimes導入のすすめ

# timesってなに？

---

## timesとは
slackの機能とかそういうのではないのですが、
各々が個人のチャンネルを持ち、自由に発言していく場(channel)です。

呟くことに特に制限はなく、様々なことを呟くことができます。

---

channel名などは自由ですが
times_名前とかが一般的ですかね。

最近では多くの企業で導入されているらしく
結構流行っている(?)流行っていた(?)らしい

---

### 例

---

例えば

- 日々の勉強の成果
- 日報
- その日の出来事、週末の過ごし方など
- 業務内容などで感じた優先度が低い疑問点など
- etc..

---

<img width="545" alt="スクリーンショット 2020-07-31 13.33.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163415/a926d2f3-605d-ca84-61fd-9777ccb7435d.png">

---

こんな感じで比較的自由に呟くことができます。
(もちろんtimesを作るのも、呟くのも自由です。)

---

## なぜいいか？

---

なぜtimesがいいかというと個人的には圧倒的にコミニュケーションの部分が強いのかなと思っています。

timesは基本的には個人がその時々の出来事や、気分やメモなどを目的として呟くのですが
public channelなので他の人も自由に見ることができ、意見などを交換することなどもできます。

---

業務に直接関係しないような内容など、緊急を要さない話などを呟くことでより詳しい人と議論し、
話し合うことで解決策を見出すこともできるかと思います。
また、チームのchannelではないので重要なchannelが汚れることもないのでおすすめです。

---

また、times channelを活用することでその人のレベル差や、
どこが得意、不得意かをわかるようになったり、
個人個人の考え方などもわかるため色々といい影響があると思います。

---

## 注意点

---

注意点としては呟くことが自由なために
会社や人によっては遠回しの悪口や、批判などを書いてしまう場合があることです。

なんの解決にもならない批判や悪口はやめましょう。

---

## 終わり
serde_json::from_strでlife timeの問題が出た場合

### 問題
`serde_json::from_str`に与える文字列の参照のライフタイムが変換後のインスタンスのライフタイムよりも短い場合にコンパイルできない。

### 解決方法
https://serde.rs/lifetimes.html に説明があって、こういう場合は、デシリアライズ後の型で`HRTBのDeserializeOwned`（= `for<'de> Deserialize<'de>`）を実装して、代わりに`serde_json::from_reader`を使えば動く。

この関数は`std.io.Read`を取るので、`String`や`&str`を`as_bytes()`で`&[u8]`などして、`std.io.Read`を実装している型に変換して使う。

HRTBは`for 'a`が`∀ 'a`のような感じで`'a`の全ての可能性を網羅するという特殊なトレイト境界で、実際には実行時の`&self`の文脈でライフタイムを決めてくれる仕組みらしい。ここではそういう形では使われていないが、Closure向けに作られたとどこかで読んだ。
https://doc.rust-lang.org/nomicon/hrtb.html

### 例

```rust
fn sample<T>() -> T
where T: for<'de> Deserialize<'de> 
{
  let body = "some json source &str";
  serde_json::from_reader(body.as_bytes()).unwrap()
}
```
Financial Services Cloud の操作方法⇒Financial Services Cloud を使用したクライアントリストの拡大⇒クライアントの総計値を追跡する

１．複数の総計値とトレンドを一目で把握するための最適な方法はどれですか?
２．顧客の総計値を追跡するためのカスタムダッシュボードを作成する場所はどこですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/b3340711-f392-0e01-5e5e-be3bc4cd94d5.png)
TerraformでCloudFrontにACL(AWS WAF)を定義するときのエラー対処方法

## エラー内容

TerraformでCloudFrontにWeb ACLを付与しようとした際にプロビジョニングエラーが発生しました。


```terraform
resource "aws_cloudfront_distribution" "sample" {
  web_acl_id = ${var.waf_web_acl_id} # ex) bbbbbbbb-xxxx-yyyy-zzzz-aaaaaaaaaaa
}
```

```bash
Error: error creating CloudFront Distribution: InvalidWebACLId: Web ACL is not accessible by the requester.
        status code: 400, request id: 1815419a-666c-4b68-8bbe-10a5b77
```

## 対応策

#### AWS WAF v2を使用している場合

AWS WAF v2を使用している場合、`web_acl_id`にACL **ID**を指定するとエラーとなります。
そこで、V2ではACLの**arn**を指定します。

```terraform
resource "aws_cloudfront_distribution" "sample" {
  web_acl_id = ${var.waf_web_acl_arn} #ex) arn:aws:wafv2:us-east-1:xxxxxxxxx:global/webacl/xxxxxxxxxx/xxxxxxxxxxx",
}
```

#### AWS WAF v1を使用している場合

AWS WAF v1を使用している場合にエラーが出る場合はTerraformを実行するIAMユーザーの権限不足が考えられます。
`waf:GetWebACL`権限を付与します。  

【参考】[AWS SDKからWAF付きのCloudFrontを作成する時に、’Web ACL is not accessible by the requester.’が出た時の対応覚書](https://qiita.com/drafts/e5e233e02be0ed1d2365/edit)

## 参考

- [AWS SDKからWAF付きのCloudFrontを作成する時に、’Web ACL is not accessible by the requester.’が出た時の対応覚書](https://qiita.com/drafts/e5e233e02be0ed1d2365/edit)  
- [Terraform 公式](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_distribution#web_acl_id)
AWS Toolkit for Visual Studio Codeでアクションが実行できない

初歩的すぎて、こんなミス起きる方が少ないのか、情報がなく１時間くらい嵌ったので投稿します...（初投稿）

## エラー発生から原因追及まで
AWS Toolkit for Visual Studio Codeを使って「Create new SAM Application」を実行すると
`Unable to find SAM CLI. It is required in order to work with Serverless Applications locally.`
とエラーが。

SAM CLIインストール済みなんですが...

python3.7でインストールしていたので、python3.8入れて再度インストールしてみた → 無事解消されない(^^

コンソールに出てる通り、コマンドパレットからAWS:View AWS Toolkit Logs見てみた
`「ユーザー設定に書き込めません。ユーザー設定を開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。」`
→vscode開いた時点でエラー出力されてる...
→setting.jsonが原因？？？

## 原因
setting.jsonにエラーがある
→aws cliのlocation情報を書き込めないため、vscode上ではaws cliが存在しない状態になっていた

## 解消方法
setting.jsonのエラーを解消するのみ。

よくあるエラー：「,」がないとか
私の場合：`"window.zoomLevel": +0.5`が原因... +は不要ですね(^^
（前から~が出てるのには気づいてたけど放置してた←）
（多分書き込んだ当時は文字サイズ大きくしたかったのに、できずに放置←）
AWS Free Tier limit alert が来て焦った件

## AWS Free Tier limit alert
こんな内容のメールが来てびっくりしました。

>AWS Free Tier usage limit alerting via AWS Budgets
Dear AWS Customer,
>
Your AWS account 8*********** has exceeded 85% of the usage limit for one or more AWS Free Tier-eligible services for the month of July.
>
| AWS Free Tier Usage as of 07/27/2020|AWS Free Tier Usage Limit|
|:-----------------|------------------:|
|641.0 Hrs|750 hours of Amazon EC2 Linux t2.micro instance usage|

今月７５０時間の上限のうち、641時間使用してますよ〜
注意してくださいね〜

という内容で、まずは一安心。
24h x 31 = 744hなので
750hを超えることは無いかと思います。

ただちょっと心配だったのでEC２を一旦停止しました。
その覚書として

## Elastic IP の関連付けを解除
AWS マネジメントコンソールの画面から
サービス > コンピューティング > EC２ を選択

左側のタブから
ネットワーク&セキュリティ > Elastic IP を選択

該当するElaxtic IP のチェックボックスにチェックが入っていることを確認して

アクション > アドレスの関連付けの解除 > アドレスの関連付けの解除

## Elastic IP の開放(**これをしないと請求が来ます。**)
先ほどと同様に

アクション > アドレスの関連付けの解除 > アドレスの開放

この解放を行わないと請求が来ます。

## EC２インスタンスの停止

左側のタブから
インスタンス > インスタンス を選択

該当するインスタンスID のチェックボックスにチェックが入っていることを確認して

アクション > インスタンスの状態 > 停止

インスタンスの状態がstoppingからstoppedになればOKです。
これでインスタンスは停止できたので請求はされないかと思います^^
安心安心♪

## 再開方法
1. Elastic IP 作成
2. Elastic IP 関連付け
3. EC２インスタンス 起動
2. Capistrano 設定
3. Capistrano 実行
aspidaのeslintプラグインを作りました

## はじめに
aspida、使ってますかー?
私は愛用しています。プロジェクト数はあんまり多くないですが…

aspidaというのはTypeScript向けのシステムで、簡単に特徴とメリットを説明しておくと、REST APIの型定義をファイルに記述しておくことで、補完の効くオブジェクト形式で使えるというものです。 型安全の幸せな世界が待っています。 ([aspida - GitHub](https://github.com/aspida/aspida))

## 問題:間違いに気付かない
aspidaを使っていると少し困ったことに遭遇します。
定義ファイルは次のような見た目なのですが、TypeScriptネイティブの機能を利用しているため、余計なプロパティがあってもエラー等が出ません。

```typescript
export interface Methods {
  get: {
    query: {
      key: value;
    };
    resbody: { // resBodyの間違い!
      key: value;
    };
  };
}
```

私の場合、間違ったコードを書いては原因が分からず、何度もaspidaのソースを見にいきました。[^1]

[^1]: デバッグのために配布されたライブラリのソースを見にいくことはおすすめしません。上級者向け[^2]です。
[^2]: 自分で上級者を名乗らない!(素振り)

- 間違ったプロパティが存在したときエラーを発生させるようPull Requestを出してもよかったのですが、意図して余計な要素を置いている可能性もありますし、迂闊に変更するべきではないと考えました。
- エディタで編集しているその場でフィードバックが欲しいと考えました。

## 解決:eslintプラグインを開発しました!
eslintなら先の要件を解決することができます。
こちらがnpmパッケージです: [eslint-plugin-aspida - npm](https://www.npmjs.com/package/eslint-plugin-aspida)
開発途中ですが、テストが足りてないだけで実用に問題はないはずです。

### 使いかた
他のプラグインと同様ですが、一応記載しておきます
#### インストール
npmパッケージなので、まずはインストールをします。

```bash
$ npm install -D eslint-plugin-aspida # npmを使う場合
$ yarn add -D eslint-plugin-aspida # yarnを使う場合
```

#### 設定
`.eslintrc.js`にプラグインの読み込み設定をします。

```diff
    "plugins": [
+     "aspida",
    ]
```

recommended設定を読み込みます。全ての機能が有効になっています。

```diff
    "extends": [
+     "plugin:aspida/recommended",
    ]
```

これだけで幸せなaspida生活が待っています。ぜひ使ってください。
Ubuntu18.04に超速でLumenを入れたい


#### phpのインストール
sudo apt install php

・php -v

```
PHP 7.2.24-0ubuntu0.18.04.6 (cli) (built: May 26 2020 13:09:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.24-0ubuntu0.18.04.6, Copyright (c) 1999-2018, by Zend Technologies
```
こだわりが無いのでOS標準のリポジトリのものです。

#### Composerのインストール（PHPのパッケージ管理ソフトみたいなやつ）
sudo apt install composer

```
$ composer -V
Composer 1.6.3 2018-01-31 16:28:17
```

#### php-zipのインストール
`sudo apt install php-zip`
※これがないとLumen-installerで解凍できないって怒られる。

#### php-unitのインストール
`sudo apt install phpunit`
※これがないと「composer create-project laravel/lumen」でプロジェクト作るときにコケます。

#### Lumenのインストール
`composer global require "laravel/lumen-installer"`

#### パスを通す(これをしないとlumenコマンドが使えません。)

`echo 'export PATH=$HOME/.config/composer/vendor/bin:$PATH' >> ~/.bashrc`

```
$ lumen -V
Lumen Installer 1.3.0
```

#### プロジェクトを作ってみる（testapi）

```
$ composer create-project laravel/lumen

(省略)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating optimized autoload files
```

```
$ php artisan -V
Laravel Framework Lumen (7.2.1) (Laravel Components ^7.0)
```
入ったっぽい。



### lumen new では？

```
$ lumen new testapi

In NewCommand.php line 39:

  The Lumen installer requires PHP 7.3.0 or greater. Please use "composer create-project l
  aravel/lumen" instead.
```

PHP7.3以上って怒られてしまった…。


### とにかく起動したい

`php -S 0.0.0.0:5000 -t public`
これでデバックモードみたいなものが起動する。（停止はCtrl+C）
ポートはいくつでもOK。(とりあえず5000で受付する)

これでブラウザ立ち上げて、
`http://127.0.0.1:5000` もしくは`http://localhost:5000`にアクセス。

そうするとLumenのバージョンだけが表示される。
Apacheに噛ませたりするのはまだわからないけど、ここから弄り倒すのだ。

---
まだ18.04使ってるわけですが、そろそろ20.04にしようかな。。。
What is Laravel?"Laravelについて簡単に説明"

##Hi, tehere!
プログラミング歴3ヶ月のMackeyがLaravelとは何か、
備忘録もかねてLaravel初心者目線で説明いたします！

##1. Laravelとは？
"Laravel"とはphpのフレームワークのことです。
イメージとしては、「骨組み」、「枠組み」、「構造」と捉えて頂けたらと思います。
このフレームワークを利用することにより、目的のアプリケーションなどをゼロから開発する必要がなくなります。クラスやメソッドなどが多く用意されているため、開発工程を大幅に短縮できるのです！

##2. Laravelでできることは？
Google Chrome, Internet Explorer, Safariなど、インターネットを介して情報を見たり入力したりするシステムなら、ほとんど作成可能だと思います。
また、多機能なフレームワークが揃っているのでWebアプリケーション全般に向いていると言えるのではないでしょうか。
※因み筆者はLaravelフレームワークを利用して、掲示板を作成しています。

##3. MVCモデル
Laravelでは「MVCモデル」というものを採用しています。
処理をModel(データ処理)、View(画面表示)、Controller(全体の制御)の各機能に分けて、パーツ(機能)ごとに開発を行っていくものです。
※簡易的ではありますが、機能ごとの動きを図にしてみたので参考までに。
<img width="1273" alt="スクリーンショット 2020-07-17 21.07.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611445/68b9e18b-fc44-4829-0e3e-a31d3c842555.png">

##4. パッケージ管理
パッケージ管理に関してはComposerを使います。
Composer(パッケージ管理)とは、開発をする際に必要となるライブラリやパッケージを管理・インストールするものです。コマンド１つで必要なものが全て揃うものです。

##5. Eloquent ORM と Migration
Webアプリケーションの開発ではデータベースの操作が必然的に付き物です。
データベースで保存したデータを取得して表示したり、データを更新して常に新しい状態を保たせる操作があります。
Eloquent ORMとは、データベースとモデルにリレーションを持たせて、データを柔軟に扱えるようにする機能です。
Migrationは、テーブル定義の仕組みを持っており、テーブル定義に対する変更内容が書かれるファイルが生成されることでデータベースの変更や管理が簡単にできます。Modelを作成する際にmigrationを使います。

##6. 終わり
Laravelに関する説明を簡単にしてみました。
近日中に”実装の流れ”についても初心者目線で簡単に説明できたらと思います！！
拝読ありがとうございました:)

Bye!