OmniAICreator/Qiita-1.07M huggingface dataset:
入力したtextの改行がviewで表示されない

#概要
text_areaで入力した文章に改行が入っていたのに、いざ投稿一覧でみてみると改行が反映されていない時の解決法について共有しておきます。

例えば、postのmessageに

------
xxx
yyy
zzz

----

と
入力したつもりが、投稿一覧で確認してみると

---
xxx yyy zzz

---

となってしまった時の対処法です。


#結論

```index.html.erb
<%= post.message %>
```

となっていた部分を

```index.html.erb
<%= simple_format(post.message) %>
```

としましょう。

#simple_formatとは？

>simple_formatは、改行文字を含むテキストをブラウザ上で表示させる時に使われるヘルパーになります。simple_formatの機能について簡単にまとめます。

>文字列を`<p>`で囲む
改行には`<br/>`を付与
連続した改行については`</p><p>`を付与

(他記事を参照)
リアルタイムチャットアプリ（Nuxt.js+firebase）を作ってみた

## リアルタイムチャットアプリ（Nuxt.js+firebase）
[デモ動画](https://youtu.be/OuhfIGIoe38)
[プレゼンスライド](https://docs.google.com/presentation/d/1tq3w_JTKOItHMCRZYfk3M8s9tLFdCcr_GUYXpspp8cU/edit#slide=id.g98cee3c082_0_507)
[ソースコード](https://github.com/yuyaamano23/Nuxt.js-real-time-chat-app)




## 開発背景
サポーターズ主催のサマーハッカソンvol.2に参加した際に作成しました。

## 結果
惨敗でしたが確実に成長しました！
参加してよかったです。
Dockerの容量について

# 概要
Docker学習のアウトプットとして、まとめます。
今回はDockerの容量についてです。

# 容量に注意
Dockerを使用しているとPCのハードディスクの容量を何十ギガと使用してしまうことがあります。
イメージやコンテナを削除してもDockerが削除したはずの容量を掴みっぱなしで容量が空かないことがあります。

# 対処方法
下記手順で容量を空けることができます。
ターミナルにて

```ターミナル
docker system prune
```
yes/noを聞かれるので、yesと入力しEnterキーを入力
ゴミ掃除をするためのコマンドなにります。

次に
Docker for Macアプリケーションの
Preference>Reset>Reset to factory defaults
を選択し、再起動を行う。

以上で完了。
vue-routerでのNavigationDuplicatedエラー

# NavigationDuplicatedエラーとは
vue-routerでの遷移時、現在いるrouteと同じrouteに移動しようとすると発生する。
このエラーで検索すると `router.push` などの戻りをcatchすることでエラーを出さない(無視する)方法を挙げている方がいるが、そもそも現在いるrouteと同じrouteに遷移する必要はないはずなので遷移しないというのが正しいんじゃないかなと思う。

# 遷移先が現在と同じrouteの場合遷移しない
```vue
<script>
export default {
	methods: {
		transition: function() {
			if (this.$route.name !== this.name) {
				this.$router.push({ path: 'home' })
			}
		}
	}
}
</script>
```
#### 名前付きルートの場合
```vue
<script>
export default {
	props: ['name'],
	methods: {
		transition: function() {
			if (this.$route.name !== this.name) {
				this.$router.push({ name: this.name })
			}
		}
	}
}
</script>
```
[Rails] warning: constant Gem::ConfigMap is deprecatedが発生したら

## はじめに
先日、Rails consoleを日本語対応させようとrbenvの環境をいじったら、誤ってRubyGemsのバージョンをアップデートしてしまいました。
すると、RubyGemsのバージョンアップ後に以下のような警告が発生してrubocopなどが正しくうごかなくなってしまいました。

```
/Users/hoge/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.16.4/lib/bundler/rubygems_integration.rb:200: warning: constant Gem::ConfigMap is deprecated
```

## 解決方法
RubyGemsのバージョンをupdate or downgradeして、bundlerのバージョンと相性のよいバージョンに合わせることで解決しました。
今回bundlerのバージョンが1.16.4だったので、rubygems-updateのバージョンを2.5.1にして、 ```$gem list rubygems-update``` を実行して解決しました。
bundlerのバージョンもアップデートして問題ない場合はbundlerとRubyGemsを最新バージョンにすることでも解決すると思います。

RubyGemsのバージョン変更は以下のサイトを参考にさせていただきました。
https://blog.ruedap.com/2011/02/21/ruby-gem-update-version-down
[Rust] Firefoxでrustdocの日本語がゴシック体になるバグ

本家 Rust リポジトリに [issue #76674](https://github.com/rust-lang/rust/issues/76674) を立てたのですが, Firefox のバグでは？ と言われて解決せずにクローズされそうなので, 日本語圏の Rust ユーザまたは Firefox ユーザのみなさまに助けていただきたいです.

# バグについて

issue ではスクショつきで説明しましたが, ここでも簡単に説明しておくと, Win10 上で, Chromium Edge で例えば https://docs.rs/koyomi/0.3.0/koyomi/fn.era.html を開くと日本語テキストも英語の場合と同じく明朝体で表示されるものの, Firefox ではなぜかゴシック体で表示されてしまいます. 普段 Firefox しか使わないのでこれが仕様だと思っていたのですが, Chromium Edge で表示してみてびっくりしました. 明朝体の方がずっとデザイン的に好ましいと思います.

issue ではブラウザのデフォルトフォントと書いてしまいましたが, どうもそうではなく, Source Han Sans に強制されているようにも見えます (いまいち自信がありません). 

また, この記事を書くにあたり Android (Pixel 4, Android 10) でも確認したところ, Google Chrome, Firefox for Android ともにゴシック体になりました (他サイトでは明朝体が使えるのでフォントが入っていない訳ではないはずです).

# 状況

この issue を目にした方から再現したという報告はいただきましたが, CSS を見る限りきちんと serif フォントが指定されているはずで, serif フォントにならないのはブラウザ (つまり Firefox) のバグなのではないか, ともコメントいただきました. 実際 Chromium Edge では正しく表示されているわけですから, 一理あります. ただ, 本当に Firefox のバグなのか, それとも rustdoc の CSS の問題 (例えば, フォントの指定が標準仕様通りではなく, 挙動がブラウザ依存になってしまっている可能性？) なのか, 私には CSS の知識がないためよくわかりません. Firefox のバグだとしてもどこでバグが発生しているのかわかりませんし, フォント関係の基本的なバグなら既に発見されて修正いるはずとも思います.

ブラウザのバグならば issue を閉じますか？ というコメントで応答が止まっているので, 今後どうなるかわかりません. 本当に Firefox のバグなら Rust 側の issue を閉じるのは妥当ですが, それが本当かどうかまだはっきりしませんし.

CJK 圏ユーザでなければ興味ないでしょうし, このバグの発生原因や問題の切り分けなど, 日本語圏のみなさまに助けていただけるととても嬉しいです. この記事へのコメントでも, issue へのコメントでもどちらも歓迎します.
VSCode(LiveServer)『拡張機能のホストが予期せずに終了しました。』- 完全な解決策

表題の通り、
VSCodeとその拡張機能である「Live Server」を使っていて、
ある日突然
『拡張機能のホストが予期せずに終了しました。』
というメッセージが表示されるようになって、
「Live Server」が機能しなくなる現象について
現状、検索しても直接的な解決策が出てこない状況のようですので
こちらで解決策を残しておきたい思います。

ただし、
わたしもほかの方も書いておられるいろいろな方策を試しましたが完全解決に至らず、
結局、
【VSCode自体をインストールしなおす】
で最終的に解決に至りました。

したがって、
現時点で根本的に解決する現実的な解決策として
【VSCode自体をインストールしなおす】
しかないと考えてよいと思います。
（ふんだんに時間/手間をかけて他の方法を探ることができる方は除きます）

ここで注意しなければならないのは
「インストールしなおす」といっても
VSCodeを単純にアンインストールして再度インストールしなおすだけではダメであり、
VSCodeをいったん「あとかたもなく」削除しなければならないということです。
具体的にはVSCodeのアンインストール後に、
『関連するユーザー設定や拡張機能の保存フォルダを削除』
することにより完全にVSCodeの痕跡を消し去ることが必要になります。
（新たにVSCodeインストールした後には、まっさらな状態＝デフォルト状態　で起動できるようにする。
→ 後述する他サイトの記事を参照）

この完全なアンインストールを行うための一連の手順が以下の記事に
非常にていねいに解説されていますのでこちらを参照されるとよいと思います。

『VS Codeをアンインストールするには』
https://www.atmarkit.co.jp/ait/articles/1810/12/news026.html
（＠IT様、かわさきしんじ様 および関係される各位に心から感謝いたします）


わたしはこの完全アンインストール後→再インストールの手順で完全解決に至りました。
ただ、どんな状況にも有効かどうかは保証の限りではありません。

この記事が同現象でお困りの方のお役に立てばうれしく思います。


※この記事を記した目的
「拡張機能のホストが予期せずに終了しました。」というエラーメッセージで検索される場合に
上のアンインストール方法の記事がヒットしない（同エラーメッセージがそのページ内に書かれていない）ため、
この記事にたどり着ける方が多くなるよう、ラッパー的な形で入口になればよいと考えました。


![Live Serve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267448/65686be5-a47b-452b-174e-009da71f5027.png)
フォント ガイドラインを作りmixinしよう

# 前提
- web開発
  - だけどネイティブアプリ、ゲーム開発などでも適用できそうな設計思想
- ReactなどのComponent指向開発
- styled-compmonents などのmixin機能を持つCSS in JSを使っている
  - SCSS, CSSの場合も考察

# 概要
「このプロダクトではこれしか使わない」というフォント関係の属性集合を作り、mixinし、フォント周りに秩序をもたらしていきましょう
今回は次の属性を定めていきます

- font-size
- font-weight
- line-height

これらは相互の関係性が非常に高い（ワンセットとして決めて問題ない）と思います
font-familyはもっと上層のbodyに一括指定している事が多いと思うので除きますが、使い分けたいならそれも対象にすると良いかもしれません
colorは流石に自由度が高すぎて一緒には集合化できないと思います。単に定数化で済ませるのが良さそうです

# 手順の例
## 1. フォント ガイドラインを作る
次のような集合を決めて作ります
これはAdobe XDでデザイナーさんに作ってもらった例です

- W: font-weight
- S: font-size
- L: 行送り

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50442/d55d778e-c73d-3d13-aeaf-4eacb15b6ed4.png  width=100%>

weightごとにまとめられています
https://note.com/lby/n/ne71f93c72702 にもある通り、XDの行送りとCSSのline-heightは異なるので変換が必要なことに注意です

## 2. mixin用styleを作る
styled-componentsを用いて次のようなファイルを作る

```typescript
import { css } from 'styled-components';

const w7 = 700;

export const fontGuideline = {
  pc: {
    w7s40: css`
      font-size: 40px;
      font-weight: ${w7};
      line-height: calc(55 / 40);
    `,
.
.
.
}
```

## 3. mixinする
```typescript
const HogeComponent = styled.div`
  ${fontGuideline.pc.w7s40}
`
```

# メリット
無限の組み合わせから有限の集合になることで、以下のメリットがあります

- font周りのスタイルに一貫性が保たれる
- XDなど、デザイナーの指定どおりになっているか確認しやすい
  - 無限の可能性があると、デザイナーの指定が正しいのか実は間違っているのかわからない。フォントガイドラインがあれば、そこになければ間違いだと分かる
  - 特にfont-heightは地味なので指定漏れ・間違いやすいが、集約しつつcalcを使うことで指定通り作りやすい
- エンジニアだけでなくデザイナーもどこをどういうフォントにするか意識しやすくなる


# 他の手法 Composition
Reactなどを使っていれば、以下のようにTypography Componentを作ってCompositionする方法もあります

- https://material-ui.com/components/typography/#typography
- https://ant.design/components/typography/ 

独自に作って適用すると次のような使用感になりそうです

```jsx
<TypographyW7S40>hogehoge</TypographyW7S40>
```

## スタイルのMixin vs ComponentのComposition
以下のような考えで、ComponentをCompositionするよりスタイルをMixinする方が良さそうと思っています

- 上記UI Componentのライブラリがそうなっているのは、単にComponentのライブラリとして画一的に便利な機能を提供するためであって、スタイルのライブラリではないから
- マークアップの構成は極力Semanticにした方が扱いやすく、デザインの関心は分離されて差し替え可能な状態で当ててあるだけ、というのが理想
- スタイルのためだけのElementが大量に現れてくるのはマークアップが肥大化して見づらいのでは？
- フォントの関心はweb開発のスタイルのどこにでも現れるアスペクトという感があるのでスタイル部分に自由に差し込みたい

# 他の場合どうするかの考察
## SCSS
http://www.sass-lang.com/documentation/at-rules/mixin
を使えば同じことができます

## CSS
素のCSS+HTMLでmixinする手法はclass指定しかないです

### デザイン専用のclassがマークアップのあちこちに挟まることを許容する派閥の場合
マークアップ上で明示的にclassでmixinすることで楽ができます
（もちろんCSS in JSも内部的にclassを使っていたりするが、それは隠蔽されている）

```css
.w7s40 {
  font-size: 40px;
  font-weight: 700;
  line-height: calc(55 / 40);
}
```

```html
<div class="hoge w7s40">hoge</div>
```

### 許容しない場合
css上ではなるべくセット同士が分かりやすいような名前で変数化して、
マークアップ上ではセマンティックなclass指定をして、
その中で1つずつ指定するしかないと思います

変数定義の例 (Special Thanks 同僚)：

```css
:root {
  --w7: 700;
  --w7s40: 40px;
  --w7s40h: calc(55 / 40);
}

/* semanticなクラス名 */
.hoge {
  ...
  font-size: var(--w7s40);
  font-weight: var(--w7);
  line-height: var(--w7s40h);
}
```

```html
<div class="hoge">hoge</div>
```

## CSS modules
`composes` が使えます
https://postd.cc/css-modules/ 
この場合もマークアップに適用するのはセマンティックなクラス名にして、その中で使うのが常套手段だと思います

scss-loaderなども導入してSCSSのmixinを使う方法もあります

# まとめ
横断的に現れるスタイルの集合作成 + mixinはいいぞ
React + TypeScript環境構築

React&TypeScriptの環境を2発で作るコマンドがあったのでメモ。

### 作り方

```zsh
yarn create react-app react-ts-project --template typescript
yarn add typescript @types/node @types/react @types/react-dom @types/jest
```

なんとなくドキュメントを読んでたら見つけた!

https://create-react-app.dev/docs/adding-typescript/

### いままでの作り方

↓を参考に作った。

https://qiita.com/yukitaka13-1110/items/f8b4ed8eff8f5ad36476

### ざっき

よくやる設定とか、グローバルなstoreの設定とか認証の実装とか、何回も書くのが面倒なのでテンプレ化したい。
備忘録(①csv.readerのAttributeError、②get_sheet_by_nameのDeprecationWarning、③.delete_colsが機能しない）

・今日の進捗
基本機能の確認として下図の処理を全部できるようにした。相変わらず細かいエラーが多い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721074/fc67255e-7780-41e8-5723-1f7bd49bb8d0.png)
発生したミスを忘れないように書いておく
①大文字小文字はキッチリと。

```python:入力
import csv
csvfile = open('/content/drive/My Drive/Colab Notebooks/testB.csv',encoding="shift-jis")
reader = csv.Reader(csvfile)
for row in reader:
print(row) 
```

```python:出力
AttributeError                            Traceback (most recent call last)
<ipython-input-14-bb1b8be4844f> in <module>()
      3 csvfile = open('/content/drive/My Drive/Colab Notebooks/testB.csv',encoding="shift-jis") 
----> 4 reader = csv.Reader(csvfile)
      5 for row in reader:
AttributeError: module 'csv' has no attribute 'Reader'
```

**csv.reader()** と **csv.Reader()** 、大文字小文字を間違えたのでAttribute Errorが発生。
csv.DictReaderから書き換えた時に頻発しそうなので覚えておく

②get_sheet_by_nameは使わないほうがいい

```python:入力
import openpyxl
wb=openpyxl.load_workbook('/content/drive/My Drive/Colab Notebooks/testB.xlsx')
wb.get_sheet_names()
```

```python:出力
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:3: DeprecationWarning: 
 Call to deprecated function get_sheet_names (Use wb.sheetnames).
  This is separate from the ipykernel package so we can avoid doing imports until
['Sheet1']
```
Deprecationは非推奨という意味。機能はするけどあんま良くないので使うなってことらしく、更に推奨の関数も書いてある。
言われてみれば分かりやすいが、バーっと出てきた文字列を見て「は？なんで？」ってなって無駄に時間を使った。
ちゃんと英語は読まないとダメだね、本当に・・・。

③ hogehoge.delete_cols コマンドのhogehogeの部分は変数名である

```python:入力（修正前）
import openpyxl
wb=openpyxl.load_workbook('/content/drive/My Drive/Colab Notebooks/testB.xlsx')
ws = wb.worksheets[0]
sheet.delete_cols(2)
wb.save('/content/drive/My Drive/Colab Notebooks/testC.xlsx')
```

ファイルは出力されたが、エクセルの2列目が削除できていなかった。
今見ると、色々なサイトをツマミ食いして完全におかしくなっている。

```python:入力（修正後）
import openpyxl
wb=openpyxl.load_workbook('/content/drive/My Drive/Colab Notebooks/testB.xlsx')
ws = wb.worksheets[0]
ws.delete_cols(2)
wb.save('/content/drive/My Drive/Colab Notebooks/testC.xlsx')
```
wb=openpyxl.load_workbook() で、xlsxのデータを変数wbに詰め込む
ws=wb.worksheets[0] で、wbの中のxlsxのデータから引数(0)頁目のワークシートのデータを変数wsに詰め込む
ws.delete.cols(2) で、ワークシートのデータwsに対し、列数2列目（引数）を削除する
wb.save() で保存して成功・・・あれ？ 

最終的に出力されたtestC.xlsxはちゃんと2列めが消えたデータになるのだが、何故だろう？
wsのデータはwbからコピーしてきたものなので、wb.saveをする前に、wbにwsのデータを戻さないと本当はダメな気がする。
ws=wb.worksheets[]を使った時点で、wsとwbのデータが同期しているんだろうか・・・？
調べて分からなければ、質問を書いてみるか・・・？

～～追記～～
配列は参照される、という回答をいただけたのリンクを貼付。
https://qiita.com/wellwell3176/questions/d42efcba6482528e1556
SublimeText3 Host key verification failedへの対処方法

環境
OS:Windows10
Editor:SublimeText3

サーバの再構築によりSFTP通信によって同期していたSublimeText3と
リモートサーバの接続でエラーが起こったため対処

##対処方法
ローカルに保存されたRSA2 KEYを削除する必要がある

①Windowsキー+Rでregeditと入力し、レジストリエディターを起動する

②下記の階層に保存されている対象となるIPアドレスを削除する

```
コンピューター\HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
```

③削除後にテキストエディターでSFTP通信を行うと同期に成功する
メディアクエリ　max-width min-widthややこしい

https://www.wakuwakubank.com/posts/443-html-css-media-query/

## スクリーンサイズが1000px以下の場合に適用

```css
@media screen and (max-width: 1000px)
```

## スクリーンサイズが768px以上の場合に適用

```css
@media screen and (min-width: 768px)
```

## モバイルファースト

最近はモバイルファーストが主流のため、クリーンサイズが拡大していくごとにスタイルを上書きする書き方、つまり**min-width**で記述していくのが主流
ADBで消した（無効化）アプリを戻す


```:bash
 adb shell pm uninstall -k --user 0 com.hoge.hoge
```
で消したアプリを戻したい

#1
ほとんどのデバイスではこれで復活できます:

```
adb shell cmd package install-existing com.hoge.hoge
```
#2
1のコマンドでは古いデバイスやWearOS(AndroidWear)でエラーが発生することがある様なのでこちらも使用できます:

```
 adb shell pm enable --user 0 com.hoge.hoge
```
Rubyを利用して、インターネット上のファイルをダウンロードし、ローカルに保存したい (注意点あり)

# 課題

Rubyを利用して、インターネット上のファイルをダウンロードし、ローカルに保存したい場合はどのようにすればよいでしょうか?

# 解決策

まずはテキストファイルの例です。[Wikipedia - HyperText Markup Language](https://ja.wikipedia.org/wiki/HyperText_Markup_Language)をHTMLファイルとしてダウンロードしたい場合は次のように書くと良いです。

```ruby
require 'open-uri'

uri_str = 'https://ja.wikipedia.org/wiki/HyperText_Markup_Language'
URI.open(uri_str) do |res|
  IO.copy_stream(res, 'HyperText_Markup_Language.html')
end
```

画像のようなバイナリでも同じです。[Wikipedia - Portable Network Graphics](https://ja.wikipedia.org/wiki/Portable_Network_Graphics)にPNGファイルの例としてあげられている画像をダウンロードしてみましょう。

```ruby
require 'open-uri'

uri_str = 'https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png'
URI.open(uri_str) do |res|
  IO.copy_stream(res, 'PNG_transparency_demonstration_1.png')
end
```

# 注意

`open-uri`ライブラリは`Net::HTTP``Net::HTTPS``Net::FTP`などのラッパーで、httpやhttpsのURLを一般的なファイルのように扱うことができます。このライブラリは`Kernel#open`を再定義するため、以下のように書くこともできます。

```ruby
require 'open-uri'

uri_str = 'https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png'
open(uri_str) do |res|
  IO.copy_stream(res, 'PNG_transparency_demonstration_1.png')
end
```

ただし、Ruby2.7からは`open-uri`により拡張される`Kernel#open`を使って、URIを開くのは非推奨になりました。上記のコードをRuby2.7で実行すると、以下のような警告が出ます。

```
warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open
```

警告が出るだけで動かなくなったわけではないのですが、`URI#open`や`OpenURI#open_uri`を利用することをお勧めします。

# 環境情報

```bash
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin18
```
mixhostサーバーにPython3をインストール

#経緯
mixhostを利用しているがpython3系が使えない。乗り換えも考えているが、、一度失敗しているがインストールをリトライしてみる

#結論
python3のインストールまで完了、実行は未実施。
簡単な.pyを作成して実行できれば完了とする

#ポイント
mixhostのシェルはbashなのでその点が参考サイトと異なる
具体的にはパス設定、pythonの切り替え時に設定するファイルが異なる

#手順
## ダウンロード可能なバージョンを探す
下記URLでバージョンを探す今回は3.7系を使いたいので3.7.9を選択
[https://www.python.org/ftp/python/](https://www.python.org/ftp/python/)

## wget でPython-3.x.x.tgzをダウンロード
事前に作業用のフォルダを作る。今回はホームディレクトリにpython3を作成
作業用のフォルダに移動する
ターミナルでwgetで対象のpythonをダウンロードする

```
$wget --no-check-certificate https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz
```

フォルダに"Python-3.7.9.tgz"がダウンロードされる

##ファイルを解凍

```
$tar zxf Python-3.7.9.tgz
```

"Python-3.7.9"フォルダが作成される

## インストール
"Python-3.7.9"フォルダに移動する
config実行

```
$./configure --prefix=$HOME/local/python/
``` 
　
make実行

```
$make
```
　
make install実行

```
$make install
```

##パスを通す
ホームディレクトの.bash_profileファイルに"$HOME/local/python/bin"を追加

```
PATH=$PATH:~~~~~~~~~:$HOME/local/python/bin
```
　
設定を反映するために下記コマンドを実行する

```
$source ~/.bash_profile
```
　
パスが通ったことを確認する

```
$which python3
~/local/python/bin/python3

$which pip3
~/local/python/bin/pip3
```

## python実行ファイルの切り替え
.bash_profileに下記を追加する

```
alias python='$HOME/local/python/bin/python3'
```
　
バージョンを確認する

```
$python --version
Python 3.7.9
```

#参考サイト
##インストール関連
[さくらレンタルサーバに Python3 をインストールする方法](https://notemite.com/python/python3-on-sakura-rental/)
##実行ファイルの切り替え
[デフォルトのPythonバージョンを2系から3系に変更する方法](https://create-fecundity.com/programming/linux-default-python-version-change/)
ターミナルに表示されるユーザー名とPC名を非表示にする方法

# なにこれ
ふと、ターミナルに表示される長ったらしいユーザー名の表示が邪魔だなーと思いました。
そこで非表示にする方法を探したら、コマンド3つで出来るので実際にやってみた系の記事です。

## before
![スクリーンショット 2020-09-17 12.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629015/279eea75-d694-03fe-4aa7-50994d67a8e8.png)

## after
![スクリーンショット 2020-09-17 12.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629015/dfa425f7-19e8-eea3-f896-e00a11592480.png)
超気持ちいい（古い）

# 実際にやってみよう

## 筆者の環境
**macOS Catalina 10.15.4**
Catalina以前のOSだと実行するコマンドが違うみたいです。
そこは各々で読み替えてください。泣

## 1、zshrcファイルを編集
viコマンドでファイルを開いて編集します。
#
```
vi ~/.zshrc 
```
zshrcファイルが存在しなかったら、下記のコマンドを叩いてください
#
```
touch .zshrc
```

## 2、実際に`.zshrc`ファイル内を編集する。
下記のコードを最下行に追加してください。
#
```
export PS1="%~ $ "
```

 - PS1
    - プロンプトの表示形式を定める環境変数
 - %~
    - 作業ディレクトリ（カレントディレクトリ）

## 3、編集内容を反映
#
```
source ~/.zshrc
```

## 結果
![スクリーンショット 2020-09-17 12.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629015/77d459a6-a909-6179-7220-667316489e6f.png)

しっかりユーザー名とPC名が消えてスッキリした！
カレントディレクトリが分かりやすくなったし、よしよし。
でも、深い階層のフォルダに行くと冗長になりそう〜

# 参考にさせていただいた記事
[ターミナルに毎回表示される長ったらしい表示を短くする](https://qiita.com/tonkotsuboy_com/items/b752a86cee7eaedf28da)

## おまけ
### 下記の画像のように、カレントディレクトリのみを表示する方法
`.zshrc`を下記のように編集
#
```
export PS1="%. $ "
```
![スクリーンショット 2020-09-17 17.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629015/010d949b-93ef-5471-ba43-1985efb62c75.png)

# 最後に
筆者はbashなどターミナルの知識があまりないので「もっとこの表現の方が良い」等がありましたら、何でも構いませんのでご指摘いただけますと幸いです。
SCLを利用してCentOS7にRuby 2.5をインストール

# はじめに
rubyのインストール方法を確立させるため、あれこれ試してみた。

# 手順

## 1.CentOSのSCLをインストールする

```:
# yum install -y centos-release-scl
```

## 2.開発者向けツールをインストールする

```:
# yum group install -y "Development Tools"
```

## 3.必要ライブラリをインストールする

```:
# yum install -y zlib-devel
# yum install -y ImageMagick ImageMagick-devel
```

## 4.ruby2.5をインストールする

```:
# yum install -y rh-ruby25 rh-ruby25-ruby-devel
```

## 5.ruby2.5のライブラリを共有ライブラリから読み込めるようにする

```:
# echo '/opt/rh/rh-ruby25/root/usr/lib64' > /etc/ld.so.conf.d/rh-ruby.conf
# ldconfig
```

## 6.ruby2.5へのリンクを張る

```:
# update-alternatives --display ruby
# update-alternatives --install /usr/bin/ruby ruby /opt/rh/rh-ruby25/root/bin/ruby 25 \
--slave /usr/bin/gem gem /opt/rh/rh-ruby25/root/bin/gem
# update-alternatives --display ruby
ruby -ステータスは自動です。
リンクは現在 /opt/rh/rh-ruby25/root/bin/ruby を指しています。
/opt/rh/rh-ruby25/root/bin/ruby - 優先度 25
 スレーブ gem: /opt/rh/rh-ruby25/root/bin/gem
現在の「最適」バージョンは /opt/rh/rh-ruby25/root/bin/ruby です。
```

## 7.rubyのバージョンを確認する

```:
# ruby -v
ruby 2.5.5p157 (2019-03-15 revision 67260) [x86_64-linux]
```




# トラブルシューティング

## 共有ライブラリエラーが表示される
```:
# ruby- v
ruby: error while loading shared libraries: libruby.so.2.5: cannot open shared object file: No such file or directory
```

### 原因
共有ライブラリにruby実行ファイルのライブラリが認識されていない。

### 対処

```:
# echo '/opt/rh/rh-ruby25/root/usr/lib64' > /etc/ld.so.conf.d/rh-ruby.conf
# ldconfig
```

# そのほか

## SCL(Software CoLlectioin)
RedHat社が提供するCentOS向けのパッケージ。yumと競合しない使い方ができるらしい。



# 参考

- https://qiita.com/witchcraze/items/c4d4f11d853081bb95ea
- https://qiita.com/Esfahan/items/0064d845ca6faf7f3d47
- https://tetsuyai.hatenablog.com/entry/20111201/1324792477
部分角丸カスタムView

自分用のメモなので解説はないです。

```RoundedCornersView.kt
import android.content.Context
import android.content.res.Resources
import android.graphics.Canvas
import android.graphics.Path
import android.graphics.RectF
import android.util.AttributeSet
import android.widget.FrameLayout

/**
 * 角丸View.
 */
class RoundedCornersView(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) {

    private val round = 5.toPx.toFloat()
    private val path = Path()

    init {
        setWillNotDraw(false)
    }

    override fun onDraw(canvas: Canvas) {
        path.addRoundRect(getRectF(canvas), round, round, Path.Direction.CW)
        // StartTop, EndTopだけ角丸にする.
        path.addRoundRect(getRectF(canvas), floatArrayOf(10f, 10f, 10f, 10f, 0f, 0f, 0f, 0f), Path.Direction.CW)
        canvas.clipPath(path)
        super.onDraw(canvas)
    }

    private fun getRectF(canvas: Canvas): RectF = RectF(canvas.clipBounds)


    private val Int.toPx: Int
        get() = (this * Resources.getSystem().displayMetrics.density).toInt()
}
```
GitHubのリポジトリを移行

## すぐに浮かんだ方法
```zsh
$ rm -rf .git
$ git init
# GitHubでリポジトリを作ってから
$ git remote add origin https://github.com/ユーザーID/リポジトリ名.git
$ git push origin master
```

この方法でも移行できますが、それまでの編集履歴は全て消えてしまいます。

## ちゃんと調べた
以下の2つの記事に書いてある内容を組み合わせればいけそう。

- [GitHubのリポジトリを別のOwnerに引き渡す - Qiita](https://qiita.com/do7be/items/fa845240bc58b2153a44)
- [gitのremote urlを変更する(レポジトリ移行時) - Qiita](https://qiita.com/minoringo/items/917e325892733e0d606e)

### 手順
- 移行元のリポジトリにアクセスし`Settings`ページを開く
- ページ下部の「DangerZone」内`Transfer`をクリック
- 移行先の`user名 or organition名`、`現在のリポジトリ名`を入力
- 必要に応じてorganization内のユーザーのアクセス権を設定
- ローカルのgit remoteを差し替え

```zsh
$ git remote set-url origin https://github.com/user_name_or_organization_name/project_name.git
```

### 注意点
- 移譲元と移譲先、両方のリポジトリの管理者でないといけない
- リポジトリのURLが変わってしまうので、デプロイ用ツール等の設定変更が必要な場合がある
Recoilでasync selectorできないメモ


- https://github.com/facebookexperimental/Recoil/issues/103 を追った
- `Async selector dependencies not recorded after first await`というバグ
- ソース 
    - https://github.com/facebookexperimental/Recoil/blob/master/src/recoil_values/Recoil_selector_OLD.js
    - `isPromise`条件分岐周りでなにかミスっていそう
- `This is a known bug that we are working on`とのこと。
  - たぶんここ(嘘かも) https://github.com/facebookexperimental/Recoil/blob/master/src/recoil_values/Recoil_selector_NEW.js
  - Async周りがいい感じに考慮されていそう
- getが非同期に取得するデータに依存しなければワークアラウンドできる
Eclipse MicroProfileのJAX-RS実装

MicroProfile実装で使われているJAX-RS実装の調査。今Jersey+Grizzlyを利用しているので、Jersey採用のプロダクトを触ってみようかなというところ。

|プロダクト|JAX-RS|
|:--------|:-----|
|Helidon|Jersey|
|Quarkus|RESTEasy|
|Payara MicroProfile|Jersey|
|WildFly|RESTEasy|
|Thorntail v2|RESTEasy|
|KumuluzEE|Jersey|
F#で標準入出力を扱う時にSystemは不要

.NET Core CLIでF#のプロジェクトを作成すると必ず`open System`の一行があり、標準入力から入力を受け付けたいという時、下記のように書きたくなってしまいがちです。というか書いてました。

``` Fsharp
open System
let input = Console.ReadLine()
```

しかし、Fsharp.Coreには`Console.In`, `Console.Out`をラップした`stdin`, `stdout`という関数があり、これらを使用すればわざわざSystemをOpenする必要がありません。

``` Fsharp
let input = stdin.ReadLine()
```

標準出力を扱う時は`printfn`を扱うことが多いかもしれませんが、以下のように書くことも可能です

``` Fsharp
"Hello, World!" |> stdout.WriteLine()
```

# 参考など
https://fsharp.github.io/fsharp-core-docs/reference/fsharp-core-operators.html#stdin
https://docs.microsoft.com/ja-jp/dotnet/api/system.console.in?view=netcore-3.1
IBM Cloud IaaS(Classic): PortalからサーバのPublic側のポートを閉じる

# はじめに （2020年9月時点の記事です）
IBM CloudのIaaS(Classic)のサーバには、"Public側"と"Private側"の2つのネットワークポートが存在します。この記事では、Portal上から"Public側"のポートを閉じる方法を記載します。


最初オーダーする時点で、"Private側"だけのサーバをオーダーすることもできますが、最初両方のポートをオーダーして構築し、構築後はセキュリティのために"Public側"のポートを閉じたいといったニーズもあると思います。簡単に設定できますので、ガイドいたします。

## ポータル上の操作

操作は非常に簡単です。
IBM Cloudのポータルから、サーバ(デバイス）の詳細を開きます。

Network Detailsの"Speed"の項目でプルダウンできますので、
Public側のポートに対して "Disconnected" を選択すればよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239309/586e006c-fe48-78fb-8c6b-4a7c2d59df2d.png)

動的に設定は反映されます。

以上です。
[rails]Webpacker configuration file not foundエラーの解決法

#環境
Rails 6.0.3.1
Vagrant 2.2.4
CentOS Linux release 7.7.1908 (Core)

#サーバを立ち上げると謎のエラーが

```
$rails s -b 0.0.0.0
```

```
 Webpacker configuration file not found /home/vagrant/work/arigatou/config/webpacker.yml. 
Please run rails webpacker:install 
Error: No such file or directory @ rb_sysopen - /home/vagrant/work/arigatou/config/webpacker.yml 
(RuntimeError)
```

どうやら「rails webpacker:install」を打てと書かれているので、やってみます。

```
$ rails webpacker:install
Yarn not installed. 
Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
```

すると、「Yarn」をインストールしてくださいと出てきたので、インストールします。

```
$sudo npm install -g yarn
```

念のため、本当にインストールされているか確認。

```
$yarn -v
1.22.5
```

Yarnがインストールされたので、再度「rails webpacker:install」を実行。
インストールが完了したことを確認できました。

```
$rails webpacker:install
(省略)
Done in 68.20s.
Webpacker successfully installed 🎉 🍰
```

これでサーバーを起動すると問題なく動きます。。

```
$rails s -b 0.0.0.0
=> Booting Puma
=> Rails 6.0.3.2 application starting in development 
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.6 (ruby 2.5.7-p206), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```
PHPの日付関連の文法

# はじめに
ついに、PHPのお勉強も本格的に始めちゃいました。
ささっと学びたかったので、成果物の制作と同時に文法も学習していくスタイルです(笑)

ということで、今回挑戦したのは、「**カレンダー**」の制作です。
カレンダーの制作を通して、「**日付**」に関するPHPの文法を学んでみたので、備忘録としてこちらに残そうと思います。

# タイムゾーンの設定
はじめにタイムゾーンを設定しておかないと、日付や時刻の表示が狂います!
日本の日付・時刻を表示するとして、

```
date_default_timezone_set('Asia/Tokyo');
```
上記のように、timezoneを'Asia/Tokyo'にsetすることで、日付・日時を日本のものに設定することができます。

# 今の年と月を求めてみる
それでは、今の年と月を求めてみましょう。

```
 $year = date('Y'); // 年
 $month = date('m'); // 月
```
上記のように、dateメソッドを使うことで、求められます。
引数の、Yは、YearのYなので、「年」が求められ、mは、monthのmなので、「月」が求められます。
他にも、
d -> 日(01〜31)
L -> 閏年かどうか
t -> 月の日数
などを求めることが可能です。
PHPには多くの、日付や日時に関する記述子があります。
また、記述子を使う際に気を付けることは、記述子を文字列として渡すことです!!
クウォーテーションを忘れないようにしましょう!!
eg.Y -> **date('Y')**

# 月末の日にちは何日??
お次に、今月末の日にちを求めていきます。
先ほど、月の日数を求める記述子、tを紹介しました。これを使って求めます。
->月の最終日は、月の日数の値

```
$endOfThisMonth = date('t');
echo $endOfThisMonth.'<br />'; // 30
```
引数に指定した月の日数を、変数$endOfThisMonthに格納していきます。
dateメソッドと日数を求めるtを使っていることがわかります。
たったこれだけで、今月は何日あるのかを知ることができます!

# 曜日って取得できるの??
曜日も取得可能です。同じく、dateメソッドを使うのですが、記述子が先ほどとは異なります。
今回は、wを使います。
記述子wは、曜日を0〜6の数値で返してくれます。
0 -> 日
1 -> 月
2 -> 火
3 -> 水
4 -> 木
5 -> 金
6 -> 土

今月最初の1日の曜日は、どれだったのか、調べてみましょう!

```
$firstDay = date('w', strtotime($year.$month.'01'));
echo $firstDay.'<br />'; // 2(2020年9月01日の場合)
```
dateメソッドに曜日を求める記述子w、strtotimeでタイムスタンプを用いて求めていることがわかります。
しかし、引数には見慣れないメソッド、strtotimeが入っています。
以下、公式による説明を引用しております。

>strtotime
(PHP 4, PHP 5, PHP 7)

>strtotime — 英文形式の日付を Unix タイムスタンプに変換する

>説明 ¶
strtotime ( string $datetime [, int $now = time() ] ) : int
この関数は英語の書式での日付を含む文字列が指定されることを期待しており、 now で与えられたその形式から Unix タイムスタンプ (1970 年 1 月 1 日 00:00:00 UTC からの経過秒数) への変換を試みます。 now が指定されていない場合は現在日時に変換します。

このように、strtotimeを使うことで、文字列形式だった日付をコンピュータが扱うことができるUnixタイムスタンプという数字の羅列に変えて操作するためのメソッドなんですね。
おそらく、メソッド名の由来も、
str -> string(文字列)
to -> to
time -> timestamp
「文字列からタイムスタンプへ」なのではないかと推測しました(笑)

話が少しそれましたが、strtotimeメソッドの引数に、先ほど求めた、年と月、月初の1日を表す01を渡すことで、現在の月の1日目の曜日を求めることができます。

# まとめ
このように、PHPでは簡単に日数を求めることができたりします!
また、記述子によっては、曜日も0〜6の数字ではなく、文字列で返してくれるものがあったりもするので、dateメソッドを使って日付を扱うととても便利だなーと感じました。
ささっとまとめちゃいましたが、読んでくださりありがとうございます!
時間があれば、記述子についても一覧でまとめてみたいですね。

理解不足等による間違いなどありましたら、コメント頂きたいです。
SourceTreeのターミナルから作業ツリー内の変更を全破棄、未追跡を全削除、メモ

Unityをアップデートしたら差分が山ほど出た

全部を破棄しようとして作業ツリー内をたくさん選択すると
SourceTreeが固まるのでコマンドラインからクリーンする。
同じく未追跡のファイルを全部削除しようとして全選択してから削除しようとすると固まるので
コマンドラインからクリーンする。

こちらの記事を参考にしました。
https://awesome-linus.com/2019/05/13/git-clean-untracked-files-delete/

■ターミナルを開く
　SourceTreeを開く→メニューの右上のターミナルアイコンがあるのでクリック


■コマンドラインから破棄対象ファイルを全削除

```
git checkout .
```

■コマンドラインから未使用ファイルを全削除

```
git clean -df
```
Laravel ToDoアプリチュートリアルで発生した エラーUnexpected data found. Data missing

#初めに
仕事でLaravelの知識が必要となり、下記リンクの良さげなチュートリアルをやっていまた。
https://www.hypertextcandy.com/laravel-tutorial-create-task

チュートリアル通りにやっていてもエラーってやっぱり起きるのですよね〜。。。

#環境
**上記リンクのチュートリアルはv5らしいです。私はv6だったので発生したエラーだと思われる。。。:persevere:**

```console
$ php artisan --version
Laravel Framework 6.18.40
```

:point_down:同じようなエラーです。。
[Laravel getFormattedDueDateAttributeでTrailing data のエラーが出た場合](https://qiita.com/kokogento/items/2e98e3cd81dc52a12f27)

#発生した問題
上記リンクのチュートリアル通りにやっても、**「タスクを保存する」の段階で**このようなエラーが発生しました。 

```console
Carbon\Exceptions\InvalidFormatException
Unexpected data found. Unexpected data found. Data missing (View: /Users/xxx/resources/views/tasks/index.blade.php)
```

#解決方法
https://qiita.com/koukonko/items/420a95e6e98915b8a38b
上記を参考に`TaskController.php`を編集したところ、正常に保存されて表示できました。 

```php:TaskController.php
//変更前
 $task->due_date = $request->due_date;
//変更後
 $task->due_date = $request->due_date = date('Y-m-d H:i:s');
```

```php:TaskController.php
/**
     * GET /folders/{id}/tasks/create
     */
    public function showCreateForm(int $id)
    {
        return view('tasks/create', [
            'folder_id' => $id
        ]);
    }

    public function create(int $id, CreateTask $request)
    {
        $current_folder = Folder::find($id);

        $task = new Task();
        $task->title = $request->title;
            // date('Y-m-d H:i:s')を追加！
        $task->due_date = $request->due_date = date('Y-m-d H:i:s');

        $current_folder->tasks()->save($task);

        return redirect()->route('tasks.index', [
            'id' => $current_folder->id,
        ]);
```
[OIDC]nonceを用いた検証の目的と攻撃および防御の流れ

# nonceを用いた検証の目的
リプレイアタックの防止。

## 事例
仮想通貨DAOの不正送金
https://coin-media.jp/18208

# 攻撃例
サービス：S
Sのバックエンドサービス：SB
攻撃ユーザー：X
被害ユーザー：Y

1. Sにおいて、YがSBの認可が必要なサービス（画面など）へアクセスする。
2. Sは、SBへYをリダイレクトさせる。
3. SBにおいて、Yが認証する。
4. SBにおいて、認可コードを発行し、YへSへのリダイレクトURLを返却する。
5. SBは、Sからの認可コードによるIDトークンの払い出しを受け付ける準備をする
6. Yは認可コードを用いて、IDトークンを得る。
7. 何らかの方法で、**XがIDトークンを窃取する。**
8. Xは、正規のリクエストとして、窃取したYのIDトークンを用いて、不正アクセスを行う。

# 攻撃防止の流れ
1. Sにおいて、YがSBの認可が必要なサービス（画面など）へアクセスする。
2. Sは、SBへYをリダイレクトさせる。**この時、SはリダイレクトURLにnonceを付加する。**加えて**Yのセッション情報にこのnonceを保存する**。
3. SBにおいて、Yが認証する。
4. SBにおいて、認可コードを発行し、YへSへのリダイレクトURLを返却する。
5. SBは、Sからの認可コードによるIDトークンの払い出しを受け付ける準備をする
6. Yは認可コードを用いて、IDトークンを得る。**このとき、トークンに含まれるnonceと2.でセッションの保存したnonceを比較し、一致しているか検証する。一致していたら、セッション情報のnonceを破棄する。**
7. **XがIDトークンを窃取する。**
7. Xは悪意をもって、IDトークンを用いたアクセスをSBへ行う。
9. Sは、渡されたIDトークンのnonceとYないしXのセッション情報で管理していたnonceと比較しようとするが、Yのセッションでアクセスされた場合は、nonceが削除済みもしくは不一致、Xのセッションでアクセスされた場合は不一致となる。  

※ここはユーザ特定方法によるが、cookieを用いたセッション管理をしているなら、不正アクセスをしてきたXのセッション情報に含まれるnonceとクエリパラメータのnonceの同一性検証になる。

## ポイント
* nonceは一回限り、ということ。
* nonceは衝突可能性の低いランダムな値。UUIDとか。

# nonceの語源
number used once
[悪意のある攻撃から身を守るには？](https://thinkit.co.jp/article/839/1)

# 参考サイト様
[OpenID Connectで使われるnonceパラメーターについて](https://tech-lab.sios.jp/archives/13087)
Rustのデータサイエンスで使えそうなもののメモとリンク集

# evcxr

pythonみたいにJupyterでインタラクティブに使いたいという場合におすすめ。
RustのREPLでJupyterでも使うことができる。cargoでインストールできる。

- 公式
  - https://github.com/google/evcxr
  - Jupyterのでの使い方　https://github.com/google/evcxr/tree/master/evcxr_jupyter
- 紹介記事
  - https://qnighy.hatenablog.com/entry/2018/09/29/190000
  - dockerでの環境構築　https://dev.classmethod.jp/articles/use-rust-in-jupyter-notebooks-with-evcxr/

### Tips
変数がグローバルで定義されるので、参照を借用するときにライフタイムのエラーが出ることがある。
対処法としては、セル全体をブロックで囲むか、関数化してしまうなど。

参考　https://github.com/google/evcxr/issues/109

# Plotters

Rustのグラフ描画ライブラリ。evcxr_jupyterでも使えるので、pythonのmatplotみたいな感じで使える。

https://docs.rs/plotters/0.3.0/plotters/
Jupyterでの使い方　https://plotters-rs.github.io/plotters-doc-data/evcxr-jupyter-integration.html
紹介記事　https://lab.mo-t.com/blog/rust-plotters

# serde
JSON, YAMLなどの読み書き

公式　https://serde.rs/
紹介記事　https://qiita.com/fujitayy/items/ed0033f8bb036d23710c

# 線形代数

rust-ndarray　https://github.com/rust-ndarray/ndarray
nadarray-linalg(ndarrayとセットで使う)　https://github.com/rust-ndarray/ndarray-linalg
nalgebra　https://www.nalgebra.org/

# 機械学習

デファクトスタンダードはまだなさそう(2020/09/17)。

### Neural Network (NN)
TensorFlow　https://github.com/tensorflow/rust
primitive-rust　https://github.com/primitiv/primitiv-rust
Juice　https://github.com/spearow/juice

### NN以外
rusty-machine　https://github.com/AtheMathmo/rusty-machine
rustlearn　https://github.com/maciejkula/rustlearn
どちらも更新止まってるっぽい？

# 応用事例

[Rust.Tokyo 2019](https://rust.tokyo/sessions#)

- エッジMLシステムをC/C++からRustへ移行した事例
- Rustによる数値計算の現状と課題

機械学習と数値計算の事例がそれぞれ紹介されている。発表スライドあり。

# その他
他の方がまとめたリンク集　https://qiita.com/legokichi/items/9f80e4e2e6313876061c
並列、シリアライズ、数学・計算の項目がデータサイエンスで使いそう。

※ [zenn](https://zenn.dev/exyrias/articles/f10232934ea72cbfa998)にも同じ記事を投稿しました。
LeetCode「200. Number of Islands」解説

# 概要
外資系では、エンジニアの面接でコーディングテストを行う企業が多いらしいです
そのコーディングテストの過去問のサイトがLeetCodeです
受ける予定はありませんが、勉強のために毎日1問解いています

# 問題
[200. Number of Islands](https://leetcode.com/problems/number-of-islands/,"Qiita")
難易度はMediumです

以下のような入力が与えられます
地図みたいなイメージで、1が陸、0が海を表します
隣接した陸で1つの島が作られます
求められる出力は、島の数です
以下の例では、左上、真ん中、右下に3つの島があるので、3が出力です

```python

Input: grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
Output: 3
```

# 解法
端から順に見ていって、以下を繰り返します
1. 島を見つけたら、その島の陸を、全て訪問済みにする
2. 島カウンターを1足す

```python:
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        
        #島の陸を全て訪問済みにする
        def check(i,j):            
            if grid[i][j]=="1":        
                #訪問済みにする        
                grid[i][j]="2"                
                #上下左右の隣接した陸を、再帰的に訪問済みにする
                if i-1>=0:
                    check(i-1,j)
                if j-1>=0:
                    check(i,j-1)
                if i+1<=len(grid)-1:
                    check(i+1,j)
                if j+1<=len(grid[0])-1:
                    check(i,j+1)                                            
        
        #島カウンター
        count=0
            
        #grid[0][0]から順に見ていく
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                #陸だったら
                if grid[i][j]=="1":
                    #島の陸を全て訪問済みにする
                    check(i,j)
                    #島カウンター1足す
                    count+=1                
        return count
                
```
JDK VerUpに伴うSecurityException

# 前提
Javaには、Cipherという暗号化/復号化を行うクラスが用意されているが、
デフォルトのままだとAESの鍵の長さは128bitしか使えなかった。
ただし、Javaのポリシーファイルを書き換えれば256bitまで使用することが可能となるため、
256bitまで使用可能となるJavaのポリシーファイルを別途インストールするHackが行われていた。

# 問題事象
8u261にJDKを上げてみたところ、起動はするものの、実行時エラーとして以下のようなExceptionが発生した。

```
Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
        at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:93)
        ... 113 common frames omitted
Caused by: java.lang.SecurityException: The jurisdiction policy files are not signed by the expected signer! (Policy files are specific per major JDK release.Ensure the correct version is installed.)
        at javax.crypto.JarVerifier.verifyPolicySigned(JarVerifier.java:336)
        at javax.crypto.JceSecurity.loadPolicies(JceSecurity.java:378)
        at javax.crypto.JceSecurity.setupJurisdictionPolicies(JceSecurity.java:323)
        at javax.crypto.JceSecurity.access$000(JceSecurity.java:50)
        at javax.crypto.JceSecurity$1.run(JceSecurity.java:85)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:82)
```
#　対処

以下のPolicyファイルのインストールを止める。それだけ。
- local_policy.jar
- US_export_policy.jar 

# 原因
> 2018年1月（8u161、7u171）以降、無制限のJava暗号化拡張機能（JCE）管轄ポリシーファイルがJDKにバンドルされ、デフォルトで有効になっています（JDK 暗号化ロードマップを参照）。
> 古いスタンドアロンjarの証明書は有効期限が切れています。使用すると、次の例外が表示されます。
https://www.oracle.com/java/technologies/javase/8u261-relnotes.html

2年前にこの制約なくなってたんだね…。知らなかったよ。
curlコマンドでSSL警告を無視する方法

curlでSSLの警告が出た場合

```
curl: (60) SSL: no alternative certificate subject name matches target host name 'example.com'
```

回避するには -k を追加して実行

```
curl -k https://example.com
```

-k の説明は

```
 -k, --insecure      Allow insecure server connections when using SSL
```

詳しい説明は

```
% man curl

       -k, --insecure
              (TLS) By default, every SSL connection curl makes is verified to be secure. This option allows curl to proceed and operate even for server connections otherwise considered insecure.

              The server connection is verified by making sure the server's certificate contains the right name and verifies successfully using the cert store.

              See this online resource for further details:
               https://curl.haxx.se/docs/sslcerts.html

              See also --proxy-insecure and --cacert.

```
【覚書】kintoneのFROM_TODAY()関数の使い方がよくわからなかったので調べた

## リファレンスはこちら
[FROM_TODAY(数字, 期間の単位)](https://developer.cybozu.io/hc/ja/articles/202331474-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97-GET-#from_today)

> 期間の単位に指定可能な文字列です。

そっかぁ……

## どう使えばいいのか

上記ページの説明だけだと私はピンと来ませんでしたが、**FROM_TODAY()は特定の日付を返す関数**として捉えるとわかりやすいです。

つまり：

#### 1週間後の日付が必要

- `FROM_TODAY(1, WEEKS)`

数字部分に渡した引数の量だけ、**未来**の日付を表現します。
支払日が向こう1週間以内に迫っている債務のレコードを探したいときに、`paymentDate <= FROM_TODAY(1, WEEKS)`のようにして利用できます。

#### 1週間前の日付が必要

- `FROM_TODAY(-1, WEEKS)`

数字部分の引数として負の数を渡すことで**過去**を表現できます。
直近1週間以内に購入した物品のレコードを探したいときに、`purchaseDate >= FROM_TODAY(-1, WEEKS)`のようにして利用できます。

## その他
私はFROM_TODAY()関数は少なくとも日付を表現するものであることまでは理解できました。
しかしながら、その日付の表現における時刻はどのように扱われているのかまではよくわかりませんでした。
どこかに詳しく書いてあるページがあったら教えてください。
Rust: Rocket の使い方 (その 2)

次のページを改造して、HTML と JSON を出力するようにしました。
[Rust: Rocket の使い方](https://qiita.com/ekzemplaro/items/f566b08513437a6d9bb5)

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	src/main.rs

						Sep/17/2020
*/
// --------------------------------------------------------------------
#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;

use rocket::response::content::Html;
use rocket::response::content::Json;

// --------------------------------------------------------------------
#[get("/")]
fn index() -> &'static str {
    let hello = "Hello, world!\n\nこんにちは\n\nSep/17/2020\n";

	hello
}

// --------------------------------------------------------------------
#[get("/")]
fn page_a() -> Html<&'static str> {
    let hello = "<h1>こんにちは</h1>";

	let page_a = hello;

	Html(page_a)
}


// --------------------------------------------------------------------
#[get("/")]
fn page_b() -> Html<&'static str> {

	Html("<html><h1>今晩は</h1></html>")
}

// --------------------------------------------------------------------
#[get("/")]
fn page_c() -> Html<&'static str> {
	let page_c = "<h1>さようなら</h1>";

	Html(page_c)
}


// --------------------------------------------------------------------
#[get("/")]
fn hello() -> Json<&'static str> {
	let str_json = "{ \"status\": \"success\",
		\"message\": \"Hello API!\"}";

	Json(str_json)
}

// --------------------------------------------------------------------
fn main() {
	rocket::ignite()
	.mount("/", routes![index])
	.mount("/page_a", routes![page_a])
	.mount("/page_b", routes![page_b])
	.mount("/page_c", routes![page_c])
	.mount("/api", routes![hello])
	.launch();
}

// --------------------------------------------------------------------
```

http://localhost:8000/
![rust01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/93dc763b-9654-eeb3-0166-f03fa95f61ca.png)

http://localhost:8000/page_a
![rust02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/455a1fc9-948d-8cb0-e65d-c1ef05345f2e.png)

http://localhost:8000/api
![rust03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0b5ea9aa-c5a3-758e-4fda-d37c106dbdd6.png)
[OIDC]stateを用いた検証の目的と攻撃および防御の流れ

※残念ながらテキストオンリーです。

# stateを用いた検証の目的
CSRF対策。

## 事例
ぼくはまちちゃん。

# 攻撃内容
## 窃取対象
・認可コードを含むリダイレクトURL

## 攻撃例

サービス：S
Sのバックエンドサービス：SB
攻撃ユーザー：X
対象者：Y

1~3までHTTPクライアントなどで実施する。

1. Sにおいて、XがSBの認可が必要なサービス（画面など）へアクセスする。
2. Sは、SBへXをリダイレクトさせる。
3. SBにおいて、Xが認証する。
4. SBにおいて、認可コードを発行し、XへSへのリダイレクトURLを返却する。
5. Xが認可コードを含むSへの**リダイレクトURLへの遷移を止める**。
6. SBは、Sからの認可コードによるアクセストークンの払い出しを受け付ける準備をする
7. 4.のリダイレクトURLをYへ何らかの方法で配布する。
8. YがリダイレクトURLにアクセスする。
9. **Yのセッション＋リダイレクトURL（に含まれるXの認可コード）**でSへアクセスする。
10. Sは、認可コードを用いて、SBからアクセストークンを得る。
11. Yは、SBの認可を受けたサービスを利用する。利用時におけるSBへの永続化情報（買い物かごとかストレージ情報とか）は、XのSBアカウントに反映される。

# 上記の防止例
## 攻撃防止の流れ
1. Sにおいて、XがSBの認可が必要なサービス（画面など）へアクセスする。
2. Sは、SBへXをリダイレクトさせる。**この時、SはリダイレクトURLにstateを付加する。**加えて**Xのセッション情報にこのstateを保存する**。
3. SBにおいて、Xが認証する。
4. SBにおいて、認可コードを発行し、XへSへのリダイレクトURLを返却する。
5. Xが認可コードを含むSへの**リダイレクトURLへの遷移を止める**。
6. SBは、Sからの認可コードによるアクセストークンの払い出しを受け付ける準備をする
7. Xは悪意をもって、4.のリダイレクトURLをYへ何らかの方法で配布する。
8. YがリダイレクトURLにアクセスする。
9. **Yのセッション＋リダイレクトURL（に含まれるXの認可コード）およびstate**でSへアクセスする。
10. Sは、クエリパラメータで伝搬してきたstateと**Yのセッション情報で管理していたstate**と比較し、不一致を検知。403エラーを返却する。
sort()メソッドの比較関数について~~0を返す場合の処理は必要？~~

[よしもと芸人もりたけんじ](https://gist.github.com/kenmori/1961ce0140dc3307a0e641c8dde6701d)
が作成した、JavaScript練習問題集に取り組んでいました。
その中の、問22でsort()メソッドを使う場面があり、自分の解答が解答例とは違っていたので
自分のやり方をここに書いておきます。
どちらが正しいか、どちらが現場で多く使われるかはちょっとわからないですが参考までに...。


#解答例
```js

/*問22
配列['e','a','k','B','c']を
大文字小文字区別なく順番通りにしてください。期待する値['a','B','c', 'e','k']*/

//回答例
let array = ['e','a','k','B','c'];
array.sort(function(a,b){
 return a.toUpperCase() > b.toUpperCase() ? 1 : -1 ;
});

//結果:['a', 'B', 'c', 'e', 'k']
```

##自分の解答

次に自分の解答です。

```js
let array = ['e','a','k','B','c'];
array.sort(function(a,b) {
    let A = a.toUpperCase();
    let B = b.toUpperCase();

    if(A < B) {
        return -1;
    }
    if(A > B) {
        return 1;
    }
    return 0;
});

//結果:["a", "B", "c", "e", "k"]
```

どちらも最終的な結果は同じですね。

両者の主な違いは**比較関数の違い?**でしょうか。

解答例の場合であれば以下の部分。

```js
//解答例の場合
function(a,b){
 return a.toUpperCase() > b.toUpperCase() ? 1 : -1 ; //「条件式? 式1 : 式2」

}
```
ここでは演算子の「?:」を使って条件式を表しています。
条件式がtrueの場合は式1を、falseの場合は式2を返します。

なので、下記のようにも書き換えられるでしょうか。

```js
//解答例の比較関数を書き換えると...
function (a, b) {
    if (a.toUpperCase() > b.toUpperCase()) {
        return 1;
    }
    //a.toUpperCase() <= b.toUpperCase()
    {
        return -1;
    }
};
```


そして自分の解答は以下のように比較関数を作成しました。それ以外は解答例と同じです。

```js
function(a,b) {
    let A = a.toUpperCase();
    let B = b.toUpperCase();

    if(A < B) {
        return -1;
    }
    if(A > B) {
        return 1;
    }
    return 0;
}
```

自分の解答の方では、function(a,b)が0を返した場合も条件式に含んでいます。
0を返したは場合は並べ替えはされずそのままになります。

>compareFunction(a, b) が 0 を返した場合、a と b は互いに変更せず、他のすべての要素に対してソートします。注意: ECMAScript 標準はこの振る舞いを保証していないため、一部のブラウザー (例えば、遅くとも 2003 年以前のバージョンの Mozilla) はこれを遵守していません。

[引用:Array.prototype.sort() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)


#まとめ
今回の場合はどちらも結果は同じなので、あまり気になりませんが
現場とかではしっかり0を返した場合も条件式に入れておく方がいいのかな。

ひとまず個人的にはsort() メソッドの理解は前より深まったから今はこのくらいでいいや〜。


それと今回は比較関数についての説明を省きましたが、個人的に少しつまづいた部分でした。

**「compare(a,b)のa,bって何を比較してんだ？？**

**aとb比較して-1返すってどう言うこと？？」**
などなど。~~（なんで自分はこんなに理解力が乏しいんだ...）~~

そんな方は是非以下のサイトをみるのをオススメします！　自分も初めから見つけられていれば...!!
漫画形式でとてもわかりやすくsort()メソッドについて解説されています（勿論それ以外も！）

[第14話：配列のソートと無名関数-マンガで分かる JavaScriptプログラミング講座](https://crocro.com/write/manga_javascript/wiki.cgi?p=sort_anonymous_function)
学習記録（2020/9/17）

##TCP/APを使ったネットワーク

![20200917-105737-6401876.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/723458/73388d82-18d8-4da6-be1a-981e7d62fe77.jpeg)

##ネットワーク上のサービス

![20200917-172504-6499139.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/723458/dfc59f56-feab-1c73-e83b-c25ed8026199.jpeg)


##電子メール
![20200917-172504-6415659.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/723458/86a6bd90-cf42-9662-efb9-8e5c975ce7ff.jpeg)

##セキュリティ
![20200917-172504-6103955.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/723458/f493b504-256d-ba13-178c-0b0651290b55.jpeg)
VSCodeのキーボードショートカットでJSDocとかを出す



探すのにちょっと苦労したのでメモ
ver1.49.0時点

# まえがき

変数名や関数名にマウスホバーすると出てくるアレが中々便利
![JSDoc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175446/bc569d77-3dcd-d0b6-303d-b3b2c721b167.jpeg)

便利だけどドキュメント見たい時に毎回マウス動かすのは面倒臭い

# どこで変えるの
左下の歯車 > キーボードショートカット > `showHover`で検索
![showHover.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175446/240ce1c1-fc36-a19c-0cb4-88c88d75738c.jpeg)

`editor.action.showHover`を好きなキーバインドに変更

確かにquick documentとかshow documentで探してたら見つからないよね……:cry:
RDS のコンソール表示で詰まった話

<概要>
RDSのDBエンジンの更新を実施しようと思ったのだが、
旧コンソールでは「DBエンジンのバージョン変更」が表示されず焦った。
>クラスター > クラスターの変更 > DBエンジンのバージョン変更　←これが表示されない。

サポートに問い合わせた所、IE11じゃあかんのらしい。IEEE!!!
Chrome , Firefoxでないとだめだそうな。

>IE をご利用いただいており、旧 RDS コンソールが表示された状態であることを確認いたしました。
誠に恐れながら、現状 IE11 では RDS の新コンソールをご利用いただくことができず、このため新 RDS コンソールにて実装されている機能を使用することができません。
クラスターのエンジンバージョンの変更につきましても、旧コンソールでは対応しておらず、新コンソールまたは AWS CLI などを使用する必要がございます。

>このため、大変恐れ入りますが、現在ご利用いただいております IE 以外の Google Chrome や Firefox などのブラウザをご利用いただくことで、新 RDS コンソールにアクセスでき、またクラスターのエンジンバージョンの変更が可能となるかご確認いただけますでしょうか。
ローカルで使っているWebアプリを外部公開してみた

SEなので、仕事ではもちろんですが、プライベートでもプログラミングをしてはアプリ開発しています
ですが、ほぼほぼ「自分が使えればいいやー」くらいの、あらゆる意味でかなりお粗末なアプリです
せっかく[Vue+GitHub Action+GitHub Pages+Slackを使ってCIを構築した](https://qiita.com/LunaChevalier/items/910e3bf624b394e86216)ので、適当にローカルで使っているWebアプリを見繕って外部公開してみました

# 公開したWebアプリ
![vue-2.6.11](https://img.shields.io/badge/vue-2.6.11-brightgreen) ![bootstrap-4.5.2](https://img.shields.io/badge/bootstrap-4.5.2-brightgreen) ![fortawesome-5.14.0](https://img.shields.io/badge/fortawesome-5.14.0-brightgreen)
[カレーの具材がガチャれるアプリ](https://lunachevalier.github.io/)です
アプリ名は特につけてないので、そのまま「[カレー具材ガチャ](https://lunachevalier.github.io/)」にしました
URLもGitHub PagesのURLそのままです

見た目修正や機能追加で、もうちょっといい感じになったら、ちゃんとしたアプリ名をつけて、ドメインを取得してカスタムします

# 縛り
そのまま公開したら結局自分しか使えないので、以下の制約を設けました

## 誰かが扱える様にする

[誰でも扱える様にする](#誰でも扱えるよう準備正確かつ素早く反映できる環境にする)のは、デザインやUI、UXの勉強が必須(だと思う)なので、とりあえずは私以外の誰かが説明無しで使えるレベルにしました
具体的には以下のことをしました

* デザインを当てる
    * 「ガチャで出てくる具材」「具材の個数」「ガチャるボタン」「ガチャ結果」が最低限わかるようにする
    * 色合いやテーマはとりあえずスルー(なので、見た目がカレーっぽい雰囲気がない)
    * デザインそのものは極力CSS(今回はless+bootstrapなどのcssパッケージ)だけで実現する
* 簡単なアイコンをつける
    * ローカルでは文字だけだったので、つまらなく感じやすそう&かなり見辛い
    * [fontawesome](https://fontawesome.com/)を使用したが、パーツ不足なのでsvgでアイコン自作するかパッケージを追加する予定(svgは未対応)

## 誰でも扱えるよう準備、正確かつ素早く反映できる環境にする

とはいえ外部公開するので、使って頂いたユーザから何らかのご意見をもらえると思います(バグや要望など、より扱いやすくなる種になるもの)
基本的にしたことは[CIの構築](https://qiita.com/LunaChevalier/items/910e3bf624b394e86216)です

# 技術的なこと

ここからは[縛り](#縛り)にある内容を実現する上で、躓いたところやそれの対応方法、モヤモヤしているところを書き出しています
最終的なソースコードは[こちら](https://github.com/LunaChevalier/lunachevalier.github.io)で公開しています

## コンポーネントでimportしているのに、スタイルが反映されない問題

1コンポーネントに1ファイルのlessファイルを用意していますが、インポートしているのにも関わらずlessファイルにかかれているスタイルが反映されませんでした
その時のlessファイルは↓になります

```less
// 反映されない
.class-name {
  color: blue;
}
// 反映されない
#id-name {
  color: red;
}
// これは反映された
div {
  color: green;
}
```

ディベロッパーツールを開いて、cssのセレクタとクラス名、ID名を確認したら、反映されないcssのセレクタにだけランダムっぽい文字列がサフィックスされていました
イメージとしては↓になります(その時のcssを保存し忘れたので、細かいところが誤っているかもしれません・・・)

```css
.class-name__hogehoge_ {
  color: blue;
}
#id-name__hogehoge_ {
  color: red;
}
div {
  color: green;
}
```

https://developers.karte.io/docs/understand-css-modules を見ると、`:global(.class-name)`で書くとcss側のサフィックスが抑制されるので、これを臨時で反映して、スタイルが反映されるようにしました
ですが、毎回これをするのは面倒なので、今のうちに止めたいです(`html`側でサフィックスされないのが問題?)

```less
:global(.class-name) {
  color: blue;
}
:global(#id-name) {
  color: red;
}
```

## 抽選対象の具材アニメーションがカクつく問題

抽選対象の具材とガチャ結果部分にアニメーションを付けていますが、抽選対象の方だけアニメーションがカクつきます
[Vue.jsのトランジション](https://jp.vuejs.org/v2/guide/transitions.html)にある`<transition>`をガチャ結果の方に、`<transition-group>`を抽選対象の方に使っているので、`<transition-group>`がカクついていることになります
カクつくこと以外は期待通りのアニメーションをしている気がするので、とりあえずは保留にしていますが、もうちょっと滑らかに動かせないのかは模索しています

# 最後に

vueの[公式ガイド](https://jp.vuejs.org/v2/guide/index.html)が充実していたので、vue起因によるつまづきはほとんどありませんでした
むしろ今までおろそかにしていたcss部分で色々躓いてた気がします
准备基本情报技术者试验的童鞋有吗？

好不容易找了个上市公司的正社员工作，因为学历是成人学历。
签证又是企业内转勤签证。
结果企业内转勤签证变更为技人国签证失败。

因为考过了基本情报技术者试验就可以申请工作签再无限制了，所以正在挣扎准备中。
我学得非常痛苦。

请问有在一起准备这个考试的朋友吗？大家相互交流一下。
我的微信1019354192@qq.com
CentOS7 メールキャッチャーを導入する

# 目的

- MailCatcherの実装方法をまとめる。

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | CentOS 7 (7.8.2003) |
| ハードウェア | Dell Studio 1537 |
| プロセッサ | Intel(R) Core(TM)2 Duo CPU     P8400  @ 2.26GHz |
| メモリ | 4 GB DDR3 |
| グラフィックス | 不明 |

# 前提条件

- 下記、または下記に準ずる方法でCentOS7のPCが構築されていること。
    - [Cent0S7をPCにインストールする](https://miriwo.hatenablog.com/entry/2020/08/09/144030)

# 前提情報

- 本説明で実行するコマンドは特筆しない場合、CentOS7のPCにssh接続を行い実行する物とする。

# 読後感

- MailCatcherを起動しブラウザから確認することができる。

# 概要

1. Rubyのインストール
1. 使用パッケージのインストール
1. MailCatcherのインストールと起動
1. 確認

# 詳細

1. Rubyのインストール
    1. 下記コマンドを実行してRubyをインストールする。

        ```terminal
        $ sudo yum install ruby
        ```
1. 使用パッケージのインストール
    1. 下記コマンドを実行してruby-develをインストールする。

        ```terminal
        $ sudo yum install ruby-devel
        ```
    1. 下記コマンドを実行してgcc-c++をインストールする。

        ```terminal
        $ sudo yum install gcc-c++
        ```
    1. 下記コマンドを実行してsqlite-develをインストールする。

        ```terminal
        $ sudo yum install sqlite-devel
        ```
1. MailCatcherのインストールと起動
    1. 下記コマンドを実行してMailCatcherをインストールする。

        ```terminal
        $ gem install mailcatcher
        ```
    1. 下記コマンドを実行してMailCatcherを起動する。

        ```terminal
        $ mailcatcher
        ```
1. 確認
    1. ブラウザで下記にアクセスする。
        - [http://127.0.0.1:1080](http://127.0.0.1:1080)
    1. 下記のページが表示されることを確認する。

    ![MailCatcher__0_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9c1cb580-82d5-b992-1d3e-c6204fd2b089.png)

# 参考文献

- [LaravelでMailCatcherを利用してテストメールを送信する](http://vdeep.net/laravel-mailcatcher)
- [MailCatcher 公式](https://mailcatcher.me/)
- [MAILCATCHERを使ったメール送信テスト](https://laravel10.wordpress.com/2015/02/23/mailcatcher%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%83%86%E3%82%B9%E3%83%88/)
- [https://github.com/estelora/mailcatcher-demo](https://github.com/estelora/mailcatcher-demo)
- [https://erorr.org/217/](https://erorr.org/217/)
- [https://wiki.rookie-inc.com/development/mailcatcher](https://wiki.rookie-inc.com/development/mailcatcher)
- [https://www.d-wood.com/blog/2013/05/22_3674.html](https://www.d-wood.com/blog/2013/05/22_3674.html)