OmniAICreator/Qiita-1.07M huggingface dataset:
突然「多要素認証／二要素認証を検討して」と言われたら

# 0. はじめに

上司やお客様から突然「多要素認証／二要素認証を検討して」と言われた場合、どうしますか？
いずれ弊社（オープンソース・ソリューション・テクノロジ株式会社）のような専門ベンダに連絡するとしても、その前に、ベースの知識を得ておくためにWeb上で情報を探してみるのではないでしょうか。

多要素認証／二要素認証の基本的な考え方については既に多くのウェブページで解説されてますが、実現のための検討観点についてはあまり情報がないかも...という印象です。

というところで本記事では、SE様のように多要素認証／二要素認証を導入なさる側の皆様を意識し、
導入検討時にベース知識を得るための情報源となるべく執筆します。
もし記事をお読みくださったら、ベンダ候補として弊社も加えていただけますと嬉しいです。


# 1. 検討観点１：どのような多要素認証にするか

多要素認証の一要素目は従来と同様パスワードによる認証だとして（必ずしもパスワードでなくてもよいですが。）、二要素目としてどのような認証を実現すると良いでしょうか。弊社OpenAMで既に用意されているものから代表的なものを挙げるだけでも結構あります。

|#|二要素目認証に使えるもの|説明|
|---|---|---------|
|1|クライアント証明書による認証|　あらかじめユーザ端末にクライアント証明書を入れておき、認証時にユーザ端末から認証サーバへクライアント証明書＆署名が送付される。<br>　認証サーバは証明書＆署名を検証することで正しいユーザであることを確認する。|
|2|送付されたワンタイムパスワードで認証（SMS, LINE, email）|　ユーザが所有するSMS, LINE, emailアカウント宛てに、認証サーバがワンタイムパスワードを送付する。<br>　このワンタイムパスワードの入力をもって正しいユーザであることを確認する。|
|3|ワンタイムパスワード生成器と連動した認証|　ハードウェアまたはソフトウェア（Google Authenticatorなど）のワンタイムパスワード生成器をユーザに所持してもらい、生成用の鍵を認証サーバとあらかじめ共有しておく。<br>　生成器に表示されたワンタイムパスワードの入力をもって正しいユーザであることを確認する。|
|4|<b>FIDO2/WebAuthn（HOT!!）</b>|　FIDO2仕様に準拠したデバイス（Windows, Android, iOS, 専用USBデバイス, etc...）をユーザに所持してもらい、あらかじめ鍵情報などを認証サーバとの間で紐づけ登録しておく。<br>　認証サーバでの認証時にデバイスの利用が促され（多くの場合はデバイス上で指紋認証などの認証を伴う）、その成功をもって認証サーバとしても正しいユーザであると確認する。|

このように様々ある二要素目認証の選択肢から、どれを選ぶと良いでしょうか。
その検討材料となる情報として、主に以下のようなものが考えられます。

|#|二要素目認証を選択する際に検討材料となる情報|情報の例|二要素目認証の選定に与える影響例|
|---|---|---------|---------|
|1|アプリケーションの重要性|・全く個人情報を扱わない<br>・個人情報やユーザの資産を扱う<br>・...etc|・そもそも二要素認証を実施するのか？<br>・重要性がユーザ次第であれば、二要素認証をオプション化する？<br>・個人情報を扱うなら最低でもワンタイムパスワード生成器での二要素認証を必須とする？<br>・...etc|
|2|ユーザ層、扱うユーザ情報|・閉じたユーザ層／誰でもアカウント作れるユーザ層<br>・電話番号や住所をサーバ側で持っている？<br>・...etc|・閉じたユーザ層であればクライアント証明書も適用可能？<br>・ユーザ層様々であれば、使い勝手の良いものを優先し、かつ、いくつかの認証方法から選択可能にする？<br>・住所情報をサーバ側で持っているのであれば、ハードウェアのワンタイムパスワード生成器を送付可能？<br>・...etc|
|3|掛けられるコスト|・〇〇〇〇万円<br>・△△△万リラ<br>・...etc|・クライアント証明書を使う場合、発行コストに耐えられるか？<br>・ハードウェアのワンタイムパスワード生成器を使う場合、配布コストに耐えられるか？<br>・...etc|


# 2. 検討観点２：実現方法

ざっくりとでも何を実現するか決まったら、どのように実現するかも検討するかと思います。
以下のように大別してみます。

|#|実現方法|内容|
|---|---|---------|
|1|自社開発|　実現したい多要素認証／二要素認証の機能を自社開発する形です。<br>　全くの私見ですが、コストに見合った成果や安全性が得られるかは微妙なところだと思います。|
|2|多要素認証／二要素認証のソフトウェアを導入|　世の中に多要素認証／二要素認証の機能を提供しているソフトウェアがあるので、それを導入する形です。<br>　適用したいソフトウェアが他社製だった場合、適用の可否から検討する必要があるなど留意点もあります。|
|3|シングルサインオンのソフトウェアを導入|　弊社OpenAMもそうですが、シングルサインオンのソフトウェアには、多要素認証のための仕組みも備わっていることが多いです。<br>　SAMLやOpenID Connectといった標準仕様によってアプリケーションと認証連携接続できるので、（将来のアプリ追加時も含め）アプリとの接続性という面でも比較的安心です。|


# 3. 検討観点３：運用

パスワードのみの認証に比べ、多要素認証の運用は多かれ少なかれ複雑になります。
利用者にとって＆管理者にとって実用に耐えられる運用が可能か、という観点を早期に検討しておく必要があります。
運用検討が必要な主な点を以下に記します。

|#|実現方法|内容|
|---|---|---------|
|1|新規ユーザ作成時の運用|・発行時にユーザに渡さないといけないものは？（クライアント証明書？ハードウェアのワンタイムパスワード生成器？）<br><br>・ワンタイムパスワードの鍵登録やFIDO2デバイスとの紐づけ登録を行う場合、どのように安全に行うか？（登録作業が可能な端末をIP等で制限する？1段階目パスワード初期化と合わせて時限的に行えるようにする？eKYCの実現？...etc）<br><br>...etc|
|2|平時の運用|・ハードウェアのワンタイムパスワード生成器を使用する場合、定期的な時刻調整や電池切れへの対応が必要。<br>・クライアント証明書の場合は、証明書の有効期限への対応などが必要。<br>・FIDO2デバイスの場合、利用しなくなった端末の紐づけ情報の削除や、新たに利用する端末の紐づけ手段の用意などが必要。<br>・...etc|
|3|ユーザ端末紛失時の運用|・ユーザ自身または管理者による鍵情報などの削除手段などが必要。|


# 4. おわりに

上記までに記してきましたように、多要素認証の検討にあたっては、「どのような多要素認証にするか」「どのように実現するか」「実用性に問題ない運用が可能か」など、様々な検討を行う必要があります。

詳細を詰めるのは弊社のような専門ベンダと一緒に行うとしても、まずは大枠でも良いので、これら観点での検討をしておくとスムーズにプロジェクトを進められると思います。
BootstrapVueのb-tableでセル内にHTMLを書きつつclassも指定する方法

#まえがき
　経験者の多いBootstrapをVue.jsで使える便利なUIフレームワークのBootstrapVue。今更これか・・・、と言いつつも使っている人は多いかと思います。そんなBootstrapVueのテーブルであるb-tableコンポーネントで、セル内にHTMLを使いつつセルそのものにclassを当てる方法を備忘録代わりにまとめておきます。


#解決策
- Fieldの配列にstringだけ入れた場合は、実はkeyに値が入っているだけのオブジェクトと同じになるよ
- だからkeyに項目名を入れればHTMLを書きつつclassも指定できるよ。

```javascript

fields:['名前','種類','全長']

// これは上と同じ扱い
fields:[
        {
          key: '名前',
        },
        {
          key: '種類',
        },
        {
          key: '全長',
        },
    ]

```
あとはclass/thClass/tdClassを追加すればセルにclassを指定できる。

## 具体例

```javascript
fields:[
        { // 普通に表示したい時
          key: 'name',
          label: '名前',
          class: 'hoge huga',
        },
        { // セル内にHTMLタグを書きたいけどclassも指定したい時
          key: '種類',
          class: 'hoge huga',
        },
        // 文字列で指定。keyだけ指定と同じ。
        '全長',
    ]

```

#参考資料

[BootstrapVue公式ドキュメント](https://bootstrap-vue.org/docs/components/table )
Laravelでxamppのmysql接続

laravelを用い何度もxampp内のmysqlへ接続を試みたが


mysql : 用語 'mysql' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくだ 
さい。
発生場所 行:1 文字:1
+ mysql -u root
+ ~~~~~
    + CategoryInfo          : ObjectNotFound: (mysql:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

無駄。
よくエラーを確認すると
Suggestion [3,General]: コマンド mysql は見つかりませんでしたが、現在の場所に存在します。Windows PowerShell は、既定では、現在の場所からコマンドを読み込みません。このコマンドを信頼する場合は、".\mysql" と入力してください。詳細については 
、"get-help about_Command_Precedence" と入力してヘルプを参照してください。

ということで.\mysql と打ったら解決。
G検定勉強方法


G検定2021#1を受験したので勉強方法について以下メモ。

本格的に勉強した期間は2週間。

あと、このサイトが良い。
https://qiita.com/Ringa_hyj/items/88691e738bb36bc3dabf

####0．G検定 勉強開始前の状況
以下の本を読んでいた。あと、E資格受験のために機械学習はちょろっと勉強していた。

https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E5%85%88%E3%81%AB%E3%81%82%E3%82%8B%E3%82%82%E3%81%AE-%E8%A7%92%E5%B7%9DEPUB%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A/dp/4040800206/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1616463902&sr=8-1

####1．情報収集、書籍で勉強
ネットで調べたところ、どうやら公式テキストは読んでおいた方がよさそうということで購入。これはとりあえずさっと読むだけにした。章末の問題は一応やって、間違えたところだけ戻って勉強した。公式テキストは網羅性がないとのことなので、そんなに深入りせずに短時間で次へ。

https://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4798157554/ref=asc_df_4798157554/?tag=jpgo-22&linkCode=df0&hvadid=280479698370&hvpos=&hvnetw=g&hvrand=901061308394819968&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009310&hvtargid=pla-525639118005&psc=1&th=1&psc=1

問題集は、黒本と呼ばれるものより、以下の方が最新っぽくて良いとのことだったのでこちらを購入。G検定では割と時事問題も出るようなので、新しい情報が載っていそうな問題集にした。こちらも深入りせずに1周だけ実施。わからないところだけ復習するスタイル。

https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%85%89%E5%A4%AA%E9%83%8E/dp/429711609X

####2．模試にトライ
ここまでで1週間経過。なんとなく雰囲気がつかめたので模試を実施。模試は無料で受けられるのが2種類あった。Study-AIのやつとDive Into Examのやつ。

https://study-ai.com/generalist/

https://exam.diveintocode.jp/exam

とりあえず、Study-AIの方を受けたら、大体70%位の正答率。わからないところを復習。

####3．AI白書を買う、あとnoteで記事購入
時事問題が問題集にも、Study-AIの模試にも含まれていないので不安になり、AI白書 2020年度版をKindleで購入。
各種法律とXAIに関わるところを読む。

https://www.amazon.co.jp/%EF%BC%A1%EF%BC%A9%E7%99%BD%E6%9B%B8-%EF%BC%92%EF%BC%90%EF%BC%92%EF%BC%90-%E5%8D%98%E8%A1%8C%E6%9C%AC-%E7%8B%AC%E7%AB%8B%E8%A1%8C%E6%94%BF%E6%B3%95%E4%BA%BA%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8E%A8%E9%80%B2%E6%A9%9F%E6%A7%8B-AI%E7%99%BD%E6%9B%B8%E7%B7%A8%E9%9B%86%E5%A7%94%E5%93%A1%E4%BC%9A-ebook/dp/B085RKWNPB/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=AI%E7%99%BD%E6%9B%B8&qid=1616477914&s=books&sr=1-1

AI白書は分量多めでどこを記憶しておけばいいのか、手間がかかるので、手っ取り早く学べそうな以下のnote記事を購入。
これでなんとなく少し安心感を得る。十分かどうかは不明。

https://note.com/nanaya_onikage/n/n9eda7f64d299

####4．再度、模試を実施
試験日前日にDive Into Examを実施。正答率は90%くらいだが、結構わからないところがあったので復習。
こちらの模試は試験にもでるような良問が多かった印象。

https://exam.diveintocode.jp/exam

なんとなく不安でネットを漁ったところ、以下の問題集を発見。
やってみたが、わからな過ぎてめちゃくちゃ不安になる。このレベルの問題が出たらムリ、、と諦める。

https://www.simulationroom999.com/blog/g-test-measures-problem-collection/

####5．試験当日
PCなど特に設定不要だけど、念のため確認してから、試験に臨む。
結果は2週間後！
Source tree リポジトリへpushしたブランチを削除方法

１．削除したいブランチの一層前のブランチへ切り替える
２．左画面からのブランチ名を右クリックで削除する
３．リモートのタグの中からリポジトリ上である該当なブランチ名を右クリックで削除する
終了
【Swift】WKWebViewで最初(任意)のページに戻る


##はじめに
webviewの開発でトップページに戻りたい処理があったので
任意のページに移動する方法メモ

参考(https://kimagureneet.hatenablog.com/entry/2019/03/07/141955)

```Swift
//backForwardListで前後にあるページリストを取得
//backForwardListのbackListで前にあるページリストを取得
let list = wkWebView.backForwardList.backList
    //index out of range対策
    if list.count > 0 {
       //ページ移動するごとに後ろにappendされていくので、
       //最初のページに戻りたいときはlist[0]を指定する
       //nページ前とか任意のページならこの部分をいじれば良い
       wkWebView.go(to: list[0])
    }
```
bashおよびスクリプト

こんにちわ!　現在LinuC102学習中の[@darry6335](https://twitter.com/darry6335) です。
今日はシェルスクリプトに関して学習しました。

---
### 1.bashとは？
bashとはBourne Again Shellを略した名前で、シェルの一種である。コマンド言語でシェルスクリプトの作成が可能で、大抵のLinuxディストリビューションに標準で入っている。他のシェルとしては、tcsh,zshなどがある。
### 2.入力規則
1行目の宣言は、"#!/bin/bash"と記述する。(SHELLの実行ファイルのPATH)
スクリプトを解釈するシェルを指定。（シバンorシェバン）
~~シバンを記述しないと、bash機能は使用できない。~~
シバンを指定していないスクリプトに関しては、実行権限のあるユーザ、ないユーザで動作が異なる。
### 3.コメントアウト
行頭に#を付けることで、スクリプトを無効化し、コメントと解釈される。
### 4.変数
変数の宣言は、英数字かアンダーバーを用いて記述可能だが、数字から始まる変数の宣言はできない。
### 4.1. 特殊変数

|変数|表示するもの|
| :-: | - | 
|$0|ファイル名| 
|$1...(連番)|引数|
|$@|引数をspaceで区切って出力|
|$*|引数をspaceで区切って出力|
|$#|引数の数|
|$?|直前の処理の成否|
|$$|シェルのPID|

### 5.改行コード
異なる改行コードは使用できない。
つまり、Linuxで作成したシェルスクリプトをWindowsで使い回しできないということ。
Windowsの改行コードは、CR+LF
Linuxの改行コードは、LF

---
### 制御構文で指定できる条件式

---
### testコマンド
シェルスクリプトでは、testコマンドを使い条件式を評価することで
ファイルの有無や種類を判定したり数値や文字列を比較したりするコマンドで、真偽値を返す、bash内部コマンドである。

---
### ファイルやディレクトリの判定オプション
|条件式|意味|
| :-: | - | 
|-f ファイル名|ファイルが存在| 
|-d ディレクトリ名|ディレクトリが存在|
|-e ファイル/ディレクトリ|ファイル/ディレクトリが存在|
|-r ファイル/ディレクトリ|ファイル/ディレクトリが読み取り可能|

---
### 数値を判定する条件式
|条件式|意味|
| :-: | - | 
|A -eq B|AとBが等しい|
|A -ne B|AとBが等しくない|
|A -it B|AがBより小さい|
|A -le B|AがB以下| 
|A -gt B|AがBより大きい|
|A -ge B|AがB以上|

---
### その他論理式での判定
|条件式|意味|
| :-: | - |
|!条件式|NOT|
|条件式1 -a 条件式2|AND|
|条件式1 -o 条件式2|OR|
|-n 文字列|文字列の長さが0ではない|

---
### 変数にコマンドの実行結果を代入する書式

---
~~~
変数名=`コマンド`
変数名=$(コマンド)
~~~

### script記述ルール
1.処理の終わりは ;; を指定する（case文）
2.bash scriptの条件分岐では、構文のキーワードを逆にしてプログラムを終了させる。
・if~fi
・case~esac

---
## 制御構文（条件分岐）
【If文 書式】

~~~
#!/bin/bash
if 条件式
then
   実行文1
else
   実行文2
fi
~~~

--- 
### 四則演算とcase文
exprコマンドを使用し、四則演算の結果を出力できる。
↓参考サイト
[exprコマンドとは?? @IT参照](https://www.atmarkit.co.jp/ait/articles/1712/28/news019.html)

---
【case文 書式】

~~~
#!/bin/bash
case 変数名 in
     値1) 値1の時の処理;;
     *)   どの値にも合致しなかった場合の処理;;
esac
~~~
※case文の終わりには esac を指定する

---
## 繰り返し構文
【for文 書式】

~~~
#!/bin/bash
for 変数名 in
    do
       echo $変数名
    done
~~~

【while文 書式】

~~~
while 条件式
      do
      繰り返す処理
      done
~~~

---
## 関数の利用
function文を用いて関数を定義する

【function文 書式】

~~~
fuction 関数名() {　　#functionは省略可能
        処理
Return 値
}

//関数の呼び出し ()は不要
関数名 引数list
~~~

↓参考サイト
[関数の使用方法](https://shellscript.sunone.me/function.html)

---
### スクリプトのデバッグ
bash実行時にオプションをを指定する
bash -v : 実行するコマンドを出力
bash -x : 実行するコマンドや変数の代入など、処理内容を出力

### シバンにオプション追加
-> それ以降は常にデバッグ情報を出力する

~~~
#!/bin/bash -x
~~~

### setコマンドのオプションで囲む
-> 部分的にデバッグを行える

~~~
set -x
i=0
set +x
~~~

---
### trapコマンドの利用
スクリプト内にtrapコマンドを記述することで
割り込みシグナルに対応する挙動を変更することができる。

【trapコマンド】
シグナルを受け取った際の動作を設定、表示する
-> Ctrl+C,Z などキードードからの割り込みシグナルを受け取った時の動作を、
trapコマンドで変更することができる。

[参考 trapコマンドとは？](https://www.atmarkit.co.jp/ait/articles/1907/25/news010.html)
[参考 Linuxのシグナルとは？](https://www.atmarkit.co.jp/ait/articles/1708/04/news015.html)

---
Pyinstallerで生成したEXEファイルを実行するとPermissionErrorが出るときの対策

業務改善ツール作成中に起こった出来事に関して備忘録として残しておきます。

#動作環境
Windows 10
python 3.8.5
PyInstaller 3.6
avast

#発生した問題

```filesavetest.py

result="hogehoge"
with open("hoge.txt",'w',encoding="UTF-8", errors="") as f:
    f.write(result)
```

コンソールから実行した場合特にエラー等出ずに、正常な動作をするが、
上記のFile I/Oを含むプログラムをpyinstallerで作成したexeファイル(単一ファイル)で
実行すると以下のようなエラーが出る


```error
Traceback (most recent call last):
  File "filesavetest.py", line 2, in <module>
    with open("hoge.txt",'w',encoding="UTF-8", errors="") as f:
PermissionError: [Errno 13] Permission denied: 'hoge.txt'
[11656] Failed to execute script filesavetest
```

#解決方法
pyinstaller実行時にウィルス対策ソフト avastのアバストシールド制御を一時的に止めてから、
pyinstallerで生成したEXEファイルでは、上記のエラーは発生しなくなりました。

#追記
・avastのシールド制御が復活するとまた使えなく(上記のPermissionError)なった。
・右クリックメニューの管理者権限で実行するをした場合でも、上記のエラーが発生
Go（ver1.16.2) でgodocを使えるようにするための手順

## godocとは？
Go言語は、**godoc** というコマンドがあります。このコマンドのおかげでgolang.orgのパッケージのドキュメントをオフラインで閲覧することが出来ます。

## 前提条件

#### 環境
- OS : macOS Big Sur バージョン11.2.1

- Go : 1.16.2 darwin/amd64


#### 状態
Goをインストールしたときに、一緒にインストールされるはずのgodocコマンドが使えない。

####やりたいこと
godocを使って、オフラインでドキュメントを閲覧したい。またWebサーバーとして起動して、ブラウザ上で確認したい。

## 手順

go get コマンドでgodocコマンドをインストールします。

```shell
$ go get golang.org/x/tools/cmd/godoc
```


$GOROOT/binのパスを通す。

```shell
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

以下引用
> GOROOT/binをPATH環境変数に追加しているのは、godocのコマンドのインストール先がここになるから。（通常は、GOPATH/binにインストールされるらしい）

これでgodocコマンドが使えるようになりました。


http://localhost:3000/ にアクセスして、確認してみましょう！！！


```shell
godoc -http ":3000"
```


![スクリーンショット 2021-03-23 14.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/1501ee4f-12eb-a7e3-e5a7-743240c55013.png)

オフラインで閲覧することが出来ました！！！(わーい）

## まとめ
今回は、Goをインストールすると一緒にインストールされるはずのgodocコマンドが、ver1.16.2ではインストールされていませんでした。
そこで下記の手順を踏まえて、godocコマンド使える状態にしました。

1. go getでgodocコマンドをインストール
2. $GOROOT/binのパスを通す（godocのコマンドのインストール先がGOPATH/binではなく、GOROOT/binであることを踏まえる）

以上です。
最後まで読んでいただき、ありがとうございます！

## 参考リンク
https://ascii.jp/elem/000/001/243/1243667/
https://qiita.com/megu_ma/items/2066aef2f8c7f0ce2cc3
railsアプリケーションの立ち上げ方

##注意

初投稿です！！
プログラミングもスクール卒業してから祖母が亡くなって１ヶ月半くらいブランクありの軽鬱病初心者プログラマーなので
間違いやミスがある記事になると思います！
なので信用はしないでください！自分自身アウトプットのつもりの記事なので、、、
もちろん間違い、ミスを指摘してくださるのは大歓迎です！よろしくお願いいたします！
#アプリ作成

```
% cd ~/test_app
% rails _6.0.0_ new test -d mysql
```
まずアプリを作成したいディレクトリに移動し
railsとnewの間にrailsのバージョン、new後ろに作りたいアプリケーションの名前 
-dの後ろにmysqlの様なデータベース管理システムなどのオプションを置きます
注意点としては、半角スペースを忘れない事と同じアプリ名は作れないことくらいだと思います

#データベース作成

```
% cd test
% rails db:create
```
アプリを作成後にアプリのディレクトリに移動してdb:crateコマンドでデータベース作成できます
この際createする前にdatabase.ymlを変更してデータベースの設定を変えれます
僕はまだ文字コードをutf8に変えるぐらいしかした事ないです
変える理由は下記url参照
https://yokonoji.work/utf-8mb4　
#Githubへpush
ここまででアプリを作成したので、ここからgithubにpushをします
ターミナルでするやり方もあるのですが、今回はgithub desktopを使います

手順は以下のとおりです。

#####1,GitHub Desktopを用いてローカルリポジトリを作成する
![スクリーンショット 2021-03-23 2.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877913/750d8266-0ebc-72b1-f1b1-797e02673150.png)
上画像の通りGitHub Desktopの画面左上にあるcurrent RepositoryをクリックするとAddボタンが現れるのでボタンをクリックしてください、その後Add Existing Repositoryを押して設定したい
ファイルを選択してローカルリポジトリ完成です
#####2,first commitまたはinitial commitというコミットメッセージでcommitする
![スクリーンショット 2021-03-23 2.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877913/f75f7ecb-0c30-b2d0-18d3-72b3671822b3.png)
チェックマークがたくさん表示されている画面が出ると思うので特に理由がなければチェックマークには触れず、そのまま左下の（画像だとcommit to masterの青いボタンの上）にfirst commitまたはinitial commitというコミットメッセージを書いて青いボタンを押してcommitしましょう

#####3,アプリケーションのリモートリポジトリを作成する
![スクリーンショット 2021-03-23 2.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877913/add73084-31c1-d040-b9ed-8f6f2af13ca4.png)
publish repositoryを押すと画像の画面が表示されるので名前と説明を設定して
Keep this code privateのチェックボックスで他の人に見れるように公開するかしないかを決めれるので設定して
青いボタンのPublish Repositoryを押してリモートリポジトリを作成完了です！

#その他
ここまでrailsアプリケーションの立ち上げとしては終了です。
でもなんか終わり方がスッキリしないので（終わり方が分からない、、、）
これから初心者がアプリを作っていく中で開発をサポートしてくれるかもなgemを紹介します
###Rubocop
Rubocop（ルボコップ）はRubyの静的コード解析ツールです。「インデントが揃っていない」「余分な改行・スペースがある」などを指摘してくれるのでケアレスミスが減らせるかもです。
###pry-rails
Railsにおけるデバッグ用のGemです
デバッグとはバグを見つけることです。
pry-railsを追加するとbinding.pryという機能を使える様になります。
binding.pryという記述をソースコードの中にすると、binding.pryが存在する箇所でRailsの処理を一時停止し、その状態でコンソールを起動できます。

この二つのgemは上で説明したアプリの立ち上げ方をやった後にすぐに入れれば便利に使えます
ただ絶対に必要というわけでもないと思うので本人の自由です。
あと最後に知っとくと便利なキーボードを少しだけ
#キーボード
色々紹介したいのですが、もしかしたら知らなかもしれないけどやっぱり知ってるかもしてないなキーボードボタンをご説明します
###　->|　タブキー
macだとキーボードの一番左列のcontrolキー上にあります、このボタンでターミナル操作でディレクトリ移動する際に使用するcdコマンドが少し便利になります。ターミナルを開きcdだけ入力しその後タブキーを押してみてください、するとそのディレクトリ下のファイルやディレクトリの一覧が表示されかつタブキーを連打することで自分の移動したいディレクトリを選択しエンターキーを押して移動できます。
つまり一々ディレクトリの名前を入力せずとも、スペルミスにイラつくことなくスマートに移動できるというちょっぴり便利なボタンです。
###　右下の上下左右の矢印ボタン
上に同じくターミナル操作での話なのですがこの矢印ボタンの上下を使うことでターミナルで使ったコマンドの履歴を確認することができ、加えてこの履歴から選択して同じコマンドを実行できるので、わざわざコマンドを入力せずとも一度使ったコマンドならばスマートに実行できるわけです！
これは知っとくとかなり便利です！

#最後に
これで本当に終わります無駄に長くなりました
自分なりにサイト開発に便利だったサイトを並べます
###cssで参考
https://see-ss.com/

https://codepen.io/abxlfazl/details/VwKzaEm
###背景画像とかボタンの画像とか
https://www.photo-ac.com/


他にも紹介したことが色々あったのですけど、エンジン切れなので初投稿はこれくらいにしときます。書き始める前は全然やる気なかったんですけどやり始めると意外に止まらなかったですね、、、。
今後もこれくらいの勢いで書いていきたいと思います！
最後まで見てくださった方ありがとうございました！
カラムの削除方法


ターミナルで下記を記述します。

```
rails g migration Removeカラム名Fromテーブル名 カラム名:型名
rails g migration RemoveNameFromTweets name:string （例） 
```
その後DBに下記で反映させます。

```
rails db:migrate
```
以上で削除完了です。
Open CVの実行でエラーが出る場合の対策

Open CVの実行の際

```
qt.qpa.plugin: Could not find the Qt platform plugin "cocoa" in,,,,
```

というエラーが出て実行できない事があります。

この場合、QTというライブラリとの競合の可能性があります。
エラーが出て実行できない場合以下の対策を行ってください。

Open CVのアンインストール

```
pip uninstall opencv-python
```

ヘッドレス版（GUI）を含まないOpen CVのインストール

```
pip install opencv-python-headless
```

以上で実行できるはずです。
IT業界「払い出し」の意味



つづり・読み：払出・払出し・はらいだし

今までの経験。クライアントごとに意味が違う。

用例 | 意訳
----|--------
アカウントの払い出し | アカウントを発行して。
アカウントの払い出し | アカウントを発行して、そのアクセス情報を提供して
アカウントの払い出し | アカウントを発行して、そのアクセス情報を提供して。そして、そのアカウントは、発行した対象 (代理店 and/or エンドユーザー) 以外はアクセスできないようにしておいて (ほとんどのケース)
サーバーの払い出し | (AWSなどのパブリッククラウド環境限定) サーバーを構築して、アクセス情報を提供して (ほとんどのケース)
サーバーの払い出し | (AWSなどのパブリッククラウド環境限定) サーバーを構築して、アクセス情報と納品書・仕様書な形にして納品して
サーバーの払い出し | (AWSなどのパブリッククラウド環境限定) サーバーを構築して、IPアクセス制限して、アクセス情報と納品書・仕様書な形にして提出して。
UE4でARCoreのAugmented Facesを使ってみた

#はじめに

昨年の12月25日、UE4でARCoreのAugmented Facesを使用した仮装アプリをリリースしました。

https://play.google.com/store/apps/details?id=com.avant.android.facemaskar

作成するにあたり、結構難しかったので備忘録として手順など残しておきます。
ARCoreが使用できる端末は限られてますが、「こんなのが作れるんだな」といった参考にでもインストールしていただけると嬉しいです:baby_tone1:

※Androidプロジェクト開発設定の手順は省きます。

#開発環境
windows10
Unreal Engine4.25
ARCoreバージョン1.7
実機(AQUOS sense3 SHV45)

#プロジェクト作成

https://developers.google.com/ar/develop/unreal/augmented-faces/developer-guide

上記リンクからサンプルプロジェクトをダウンロードし、Unrealのクイックスタートを参考にしてプロジェクトを作成。


#マテリアル作成
Materialsのファイルを開き、あらかじめ用意していたテクスチャをドラッグ&ドロップでインポート。
今回はこれをインポートしました(目があたるであろう部分は透過処理済み)。
![present.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/1b15b354-e41c-079b-0efe-a278035c5aae.png)

インポートしたテクスチャを右クリックすると、マテリアルを作成するアクションが表示されるのでそれを選択。
できたマテリアルをクリックするとこういう画面が表示されるはず。
![マテリアル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/2b84d323-fe90-37f7-7bb3-223b901fc867.png)

まずマテリアルのノードを下記画像のようにつなぎ直し、左上の適用をクリック。
![mat_node.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/b9769961-b8fc-7c32-fe38-fba346e967c6.png)
ビューポートに表示されているマテリアルがちゃんと透過処理されていることが確認できる。

次に左側に表示されている詳細一覧内のマテリアル欄で一部項目を下記のように変更。
Blend Mode > Translucent
Two Sided > チェック入れる

マテリアルの設定は以上なので適用をクリックしてから保存。

#ブループリント(BP)
HandheldARBPフォルダから今度はBlueprintsフォルダを開く。
右クリック > ブループリントクラス

![BP.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/11c58f00-97c0-94e7-610a-04b85116e652.png)
なんかいっぱいありますが今回はActorを選択して作成。


![BP02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/86837c49-9a7b-9ff8-8157-45a209ab650e.png)
作成できたらコンポーネントを追加。
コンポーネントを追加 > GoogleARCoreFaceMesh

右側の詳細はARFaceMesh欄だけいじります。
Auto Bind to Local Face Mesh > チェック入れる
Transform Setting > Tracking Only
Face Material > さっき設定したマテリアル

コンパイルしてから保存。

#画面周り
Main画面を作成したいので、コンテンツのところで
右クリック > ユーザーインターフェース > ウィジェットブループリント

できたものを開くとデザイナー画面が最初に表示されるので、右下の矢印を引っ張って縦画面サイズに変更します(今回は縦画面想定なので)。
![デザイナー画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/97b40c77-fb34-caf1-e6a0-54dc5602c44d.png)
適当にボタンを画面に配置します。
このとき、右上に表示されている白いお花みたいなマークをボタンの上に配置しておくと、画面の比率を変更したときにアイテムの配置を維持しつつ変更できます。

ボタンの詳細をスクロールしていくと、下のほうにイベントの欄が出てくるので、On Pressedの+をクリック。
![グラフ画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/d0de73e1-8933-f69e-afc1-c0c3d2676948.png)
グラフに遷移し、先ほどのOn Pressedのイベントが追加されているのが確認できる。


![SpawnActor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/841b755c-e344-51b3-b8fa-d1f82ea4032b.png)
上記のように検索をかけると「クラスからアクタをスポーンします」といったアクションが出てくるので、これをOn Pressedと繋がるように配置する。

Classに自分が作成したアクタをセットし、Return Valueから「変数へ昇格」をクリックすることでアクタのセットができる。
完成形はこんな感じ。
![ボタンノード.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/902d9871-76ec-321a-bc3a-4f96a61dbc96.png)
忘れずにコンパイルしてから保存する。



![Top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/24bb35b9-3432-8a85-f77d-6fe89b541bcc.png)
最初の画面に戻り、上部にあるブループリントからレベルブループリントを開く。
下記のようにノードを作成すると起動時にさっき設定したボタンが表示され、Augmented Facesが利用できるようになる。
![Main.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191639/b15dbfb8-0299-165e-5be8-08b791152dd1.png)
VSCodeで縦線を引いてFortran規格による制約を把握しやすくする

小ネタです．

# 概要
Fortranでは，規格によって１行の文字数やモジュール名，変数名の長さが決まっています．
１行の文字数に関しては，コンパイラの独自拡張によってその制限を回避できますが，１行に長々と書いても読みにくいだけなので，ある程度の長さを超えないよう，基準を設けるのが最近の風潮です．

統合開発環境では，１行の長さの上限を超えると文字の色を変えてくれるなどの機能が用意されていますが，VSCode向けのFortran関係の拡張に，そのような機能はありません．
そこで，VSCode自体の機能を利用して縦線を引き，１行の長さの目安を設ける事にします．

# VSCodeの設定
まず，VSCodeを開き，ファイル→ユーザー設定→設定の順に選択し（あるいはショートカットキー`Ctrl+,`で），設定を開きます．

次に，rulersを検索し，出てきた`Editor: Rulers`の項目を設定します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/cf08f0cb-313b-aefb-9947-9dce89345dd6.png)

設定するには，`settings.json`を編集する必要があります．当該項目にある[settings.json で編集]のリンクをクリックすると，`settings.json`が開きます．このとき設定に必要な項目が自動で追記され，数字（何文字目に線を引くか）を記入，保存するだけで設定が完了します．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/c2299b41-c92e-01d8-84e6-a78099bda11e.png)

複数の縦線を引くには，複数の数字をカンマで区切って入力します．

# 縦線を引く文字数
著者は，**70**文字，**72**文字，**132**文字目に縦線を引いています．
72文字は固定形式での文字数，132文字は自由形式での文字数です．コンパイルオプション等で拡張できますが，概要で述べたように目安として利用しています．

では70文字は何か？というと，モジュール名の長さ制限を確認するための設定です．Fortranでは，変数等の長さに63文字という制限があります．これに，モジュールの宣言`module`6文字+空白` `1文字の計7文字を足して，70文字としています．

モジュール名が63文字を超えることはそうは無いのですが，下図のように[Fortran Package Manager](https://github.com/fortran-lang/fpm)のフォルダ構造を反映したモジュール名の付け方と，数値計算独特の長い計算手法名が合わさると，超えてしまうこともあります．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224040/5caf74cd-3531-c69c-b5e7-b72223c3a24d.png)
文字コードとプログラムテキスト

プログラムを書いていてコメントで混乱することがある:

a.c

```c
// 機能
int function;

void f(void)
{
  if (function) {
    puts("表題");
    // ...
  }
}
```
b.c

```c
/*
 * 条件をﾁｪｯｸする
 */
void g(void)
{
  puts("｢ｺﾝﾆﾁﾊ｣");
}
```

原因は a.c を Shift-JIS, b.c を JIS(ISO-2022-JP) でコーディングしたためだった.

コメントの他にも, 上のように文字列に日本語を指定して混乱する人もいるかもしれない.

今時 JIS は使わないし, 文字列に日本語を指定したりすることはないという人は一番上の部分だけ注意したらよいと思う.

せっかくなのでこれらの問題を gcc で修正するパッチを作成した.

[gcc のパッチ](http://khasegawa.html.xdomain.jp/GNU_tool/string_and_comment_bug_fix.diff "string_and_comment_bug_fix.diff")

[パッチの当て方](http://khasegawa.html.xdomain.jp/GNU_tool/cc1_lex2.2021.03.22.jp "cc1_lex2.2021.03.22.jp")

本当に大切なのは, あなたの gcc にパッチを当てることではなくて気を付けるポイントを覚えておくことだと思う.

[文字コードとプログラムテキストについての覚書]
(http://khasegawa.html.xdomain.jp/char_code/index.html "index.html")
～ 出力 ～ チートシート

#目次

[出力が複数行で各行に１つずつの場合](#出力が複数行で各行に１つずつの場合)　`[print(mat[i]) for i in range(len(mat))]`
[出力が複数行で各行に複数の場合](#出力が複数行で各行に複数の場合)　`[print(*mat[i]) for i in range(len(mat))]`
[コメント付きで出力する場合](#コメント付きで出力する場合)　`print('hoge {0} piyo {1} huga'.format(A,B))`

[出力が１つのみの場合](#出力が１つのみの場合)　`print(ans)`
[出力が１行で複数の場合](#出力が１行で複数の場合)
　出力が１行で数個の場合　`print(X,Y)`
　出力が１行で多数の場合　`print(*mat)`

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#出力が複数行で各行に１つずつの場合

```python:output.py
[print(mat[i]) for i in range(len(mat))]
```

```python:出力例
>>> 0
>>> 1
>>> 2
```

１行で簡単に表せる
そもそもこういうタイプの入力はあまりAtcoderでは見ない気がするけど.....

```python:output.py
for i in range(len(mat)):
  print(mat[i])
```
これでも同じですね（各行に数個ずつの場合とかはこっちでやる）


#出力が複数行で各行に複数の場合

```python:input.py
[print(*mat[i]) for i in range(len(mat))]
```

```python:出力例
>>> 1 2 3
>>> 4 5 6
>>> 7 8 9
```

やってみたら一応１行で書けたけど、ここまでくるともう何がなんだか...


```python:output.py
for a in mat:
  print(*a)
```

こっちの方がわかりやすい（個人的見解）
コピペせずに自分で打つならこっちかな

```python:input.py
[print(*mat[i], sep='') for i in range(len(mat))]
```

```python:出力例
>>> ###
>>> #.#
>>> ###
```

Atcoderでよくある`#`と`.`で地図とかを表すような出力用

```python:output.py
for a in mat:
  print(*a, sep='')
```

一応こっちでも空白なしの場合を載せておく

```python:output.py
for a in mat:
  print(*a, sep=',')
```

```python:出力例
>>> 0,1,2
>>> 3,4,5
>>> 6,7,8
```

これも`''`の内部をいじると文字同士の間を変えられる

#コメント付きで出力する場合

```python:output.py
print('試合結果は {0}-{1} でした'.format(X, Y))
```

```python:出力例
>>> 試合結果は 33-4 でした
```

Atcoderだと使わないけど、個人開発とかする時にはよく使うので載せておく

#出力が１つのみの場合

```python:output.py
print(ans)
```
多次元配列とかでも`print()`に入れさえすれば大体出力できちゃうのですごい

#出力が１行で複数の場合

##出力が１行で数個の場合

```python:output.py
print(X,Y)
```
`,`で全部つなぐだけ

##出力が１行で多数の場合

```python:output.py
print(*mat)
```

```python:出力例
>>> 0 1 2 3 4 5
```

これ結構便利（特に２次元配列の時にforと組み合わせるときれいに表示できる）

```python:output.py
print(*mat, sep='')
print(*mat, sep='+')
```

```python:出力例
>>> 012345
>>> 0+1+2+3+4+5
```

`''`の内部をいじると文字同士の間を変えられる

```python:output.py
mat=''.join(mat)
print(mat)
```

```python:出力例
>>> abcdef
```

配列の要素が`str`の場合使える（intとかだとエラー吐く）

```python:output.py
mat='+'.join(mat)
print(mat)
```

```python:出力例
>>> a+b+c+d+e+f
```

これも`''`の内部をいじると文字同士の間を変えられる
自明だけど文字列とかを空白を開けず連結して出力したいときは`mat=''.join(mat)`
homebrewのインストールで詰まったところ。

Macを買い換えたのでhomebrewをインストールしようとしたところ、詰まったので忘備録です。

# 詰まったところ
基本的には以下のコマンドでうまく行くはずが、、、

```python
brew install docker
brew cask install docker
open /Applications/Docker.app
```

これやると２行目でError: Unknown command: caskと出てきます。
**caskってなに？笑**
調べてみると、GUIアプリをCLIでダウンロードできるようにしたものだそうです。
一般的にはPCで何かアプリ（google chromeやlineなどなど）をダウンロードしようとすると、そのサイトに行って、ダウンロードしてインストールするという流れを踏まなければなりません。
それをコマンドで一発でやろうというのがhomebrew-caskらしいです。めっちゃ便利ですね。

でも調べてみると、homebrew-caskはhomebrewをインストールすると自動で入るっぽい？というか標準であるようです。
さらに調べてみるとエラーの原因はコマンドがアップデートされていたことでした。。

# 結論
旧コマンド

```python
brew cask install docker
```

新コマンド

```python
brew install docker --cask
```

これで解決できました！
Rails flashメッセージにエラー文を記載し改行したい

#やりたいこと
フォームでのエラー文をflashメッセージを用いて下記のように表示したい

```
お届け先の内容に不備があります
・住所は1文字以上で入力してください
・郵便番号は不正な値です
・宛名は1文字以上で入力してください
```

#方法
モデル名はorderで@orderにエラー文がある場合

```ruby:controllers
flash[:danger] = "お届け先の内容に不備があります<br>・#{@order.errors.full_messages.join('<br>・')}"
```
```erb:view
<% flash.each do |key, value| %>
  <p class="alert alert-<%= key %>">
    <%= sanitize value, tags: %w(br) %>
  </p>
<% end %>
```

#内容
```:@order.errors.full_messagesの中身例
["住所は1文字以上で入力してください", "郵便番号は不正な値です", "宛名は1文字以上で入力してください"]
```
@order.errors.full_messagesの中身は上記のように格納されているため、配列の要素をjoinを用いて結合する。
その際に、区切り文字に"\<br>・"とするとflashメッセージは以下になる

```:flashの中身例
お届け先の内容に不備があります<br>・住所は1文字以上で入力してください<br>・郵便番号は不正な値です<br>・宛名は1文字以上で入力してください
```
これを、viewに\<br>を改行を意味するものであると認識させた上で、表示させたいためsanitizeを用いる
今回は\<br>のみ許可している
（sanitize：　文字列内の指定したHTMLタグや属性を許可するもの）

```erb
<%= sanitize value, tags: %w(br) %>
```

#完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/20fb2be6-59fc-3106-d965-6600928f1226.png)
Ruby on Rails について 初心者用

記事内容移転しました。

[O.R.Develop Website
Ruby on Railsについて 初心者用](https://oldriver-develop.com/articles/show/7/Ruby%20on%20Rails%20%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%EF%BC%88%E5%88%9D%E5%BF%83%E8%80%85%E7%94%A8%EF%BC%89)
【Rails6】画面の左上に出てくる〇〇msの消し方

#こいつ
![F3rRloyc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076062/f3a4f304-4c5c-3acf-224a-602dc6455336.jpeg)

#消し方
どうやら表示速度等のパフォーマンスを測定するrack-mini-profilerと言うgemが標準で入っていることで表示されているみたいなので、そいつを削除かコメントアウトで非表示にできます。

````ruby:Gemfile
group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 4.1.0'
  # Display performance information such as SQL time and flame graphs for each request in your browser.
  # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md
  gem 'rack-mini-profiler', '~> 2.0' ←こいつを削除かコメントアウト。
  gem 'listen', '~> 3.3'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
end

````

はぁ〜〜すっきりした〜〜〜〜〜〜。

###参考
[rails6にて表示されるミリ秒を消したい](https://teratail.com/questions/319982)
[Railsのパフォーマンス調査でrack-mini-profilerを使ってみました。](https://techblog.gmo-ap.jp/2020/06/08/rack-mini-profiler/)
【Git】git addの取り消し方法

#プログラミング勉強日記
2021年3月23日

#git addの取り消し方法

##ファイル・ディレクトリを指定して取り消す

```:addの取り消し方法
$ git reset HEAD ファイル名/ディレクトリ名
```

##addしたすべてのファイル・ディレクトリを取り消す方法

```:addしたときに追加されるすべてのファイルを取り消す
$ git reset HEAD .
```

##一番最初のaddを取り消す方法
 一番最初に実行したgit addを取り消したい場合は、HEADの参照がないので`git rest`が使えない。なので、以下の方法で行う。

```
$ git rm --cached ファイル名・ディレクトリ
```

```:ディレクトリ内のすべてのaddを取り消す
$ git rm --cached -r ディレクトリ名
```

<b><注意></b>
`git rm　〇〇`でキャッシュを付け忘れると、どこにも保存していないファイル自体を消してしまう。なので、`--cached`オプションを必ず付ける。

#参考文献
[git add の取り消し、add したファイルを戻す git reset のやり方](https://blog.77jp.net/git-add-how-to-cancel-git-add-and-return-the-added-file-to-its-previous-state)
[git add の取り消し方法と、関連コマンドまとめ](https://www-creators.com/archives/1282)
Cake.Frostingについて

# はじめに

CakeBuild-1.0.0より、今まで別プロジェクトだったCake.Frostingがマージされ、
公式で正式にサポートされるようになった。
今回はこれについての記事を書こうと思う。

* [CakeBuildの解説記事](https://qiita.com/skitoy4321/items/e76b178dd7fca1fbbd8f)
* [CakeBuild公式サイト](https://cakebuild.net)
* [Cake.Frostingのセットアップ手順](https://cakebuild.net/docs/getting-started/setting-up-a-new-frosting-project)

なお、今回はCake.Frosting-1.1.0で検証した。

# Cake.Frostingとは何か

簡単に言うと、CakeBuildをコンソールアプリケーションとして実行できるフレームワークの事である。
感覚としては[NukeBuild](https://nuke.build/)に近いものがある。

## メリット

* ブートストラッパーが不要
    * 従来は実行するための起点として、Cake.exeが必要で、そのセットアップのためにbuild.ps1やbuild.shが必要だった
    * 普通のコンソールアプリなので、ビルドさえできれば実行可能
* カスタム実行環境の作成が容易
    * 頑張ればWPFをフロントエンドにしてビルド等も(やる価値があるかは別にして)?
* IDEのサポートを標準で受けられる
    * 従来はコード補完やデバッグのため、専用アドインのインストール等、専用のステップを踏む必要があった

## デメリット

* 既存の`.cake`が使用できない
    * 構文的にも異なるものになるため
    * スクリプトのインポート等もできない
    * 拡張nugetパッケージは使用可能

# セットアップ

基本的には[公式の手順](https://cakebuild.net/docs/getting-started/setting-up-a-new-frosting-project)に沿って進めればいい。
ここで最低限やらなければならない点は以下のようになる

* C#コンソールプロジェクトの作成
    * もしかしたらWPF等もいける?
* Cake.Frostingパッケージのnuget参照
* [Cake拡張](https://cakebuild.net/extensions/)を使いたい場合、nuget参照を加える
* `Cake.Frosting.FrostingContext`クラスを継承したContextクラスの作成
    * ビルド時の値の共有等に使われる
* `Cake.Frosting.CakeHost`の生成とセットアップ
    * 通常使うのは`UseContext<T>()`だが、その他にも色々設定が可能
* `Cake.Frosting.FrostingTask<T>`クラス、あるいは`Cake.Frosting.AsyncFrostingTask<T>`を継承したTaskクラスの作成
    * `.cake`でいう所の`Does`を`void Run(T context)`あるいは`async Task Run(T context)`で実装する
    * Runの中では、cake拡張の機能(MSBuild等)は、全てcontextの拡張メソッドとして実行する
    * 他の`IsDependentOn`や`ContinueOnError`等のタスク設定については、属性やメソッドオーバーライド等で設定する
    * 全ての設定をカバーしているかは未調査

とりあえずこれだけ行えば最低限の実行はできる

# 実行

基本的にコマンド引数の書式は従来のものと同一となる。以下のように実行する

`dotnet run --project [path/to/frostingproject.csproj] -- [cakeに渡す引数]...`
この方式で実行する時、**ワーキングディレクトリがcsprojのあるディレクトリに移ることに注意する**
デバッグビルドやリリースビルドはこの際特に関係ない。

また、`dotnet build [path/to/frostingproject.csproj]`でビルドした後、`dotnet [path/to/built.dll] [cakeに渡す引数]`とすることも可能

cakeに渡す引数に関しては、従来のものと変わりはない。

# タスクの設定について

今のところで確認できているものを記載する。

## 属性で設定できるもの

1.0.0の時点で確認できるものについて記述する

* Task名: `Cake.Frosting.TaskName(string)`
* 依存するタスク(IsDependentOn): `Cake.Frosting.IsDependentOn(Type)`
* 依存されるタスク(IsDependeeOf): `Cake.Frosting.IsDependeeOf(Type)`
* タスク失敗時に続けるかどうか(ContinueOnError): `Cake.Frosting.ContinueOnError`

## メソッドのオーバーライドで設定できるもの

* 成功、失敗に関わらず実行する(Finally): `void Finally(T context)`
* 失敗時に実行する(OnError): `void OnError(Exception e, T context)`
* 実行するかどうか、実行時に決定する(ShouldRun): `bool ShouldRun(T context)`

# 終わりに

cakebuildの大きな特徴であるcakeによる手軽な実行という利点は損なわれるものの、
アドオン無しでIDEのフルサポートを受けられることと、多数存在するプラグインを使用可能というのは大きな利点だと思う。
また、cake.exeのDL等、準備が従来のものと比べて少なくなる点も大きい。
ただ、過去資産の流用があまりできないという所は結構障壁にはなるかもしれない。これは自分の中で宿題にしておく。

nukebuildとの使い分けに関しては、今のところ好みの問題と言えそう。
ただ、Frostingの方はカレントディレクトリの取り方が若干引っかかりそう。
Ubuntu 20.04 でAzure ML (Python SDK)を使うと.NET Coreのエラーが出る場合の対処法

# 初めに
Ubuntu 20.04でAzure ML Python SDK (v1)の一部クラスを使う際に、.NET Coreが存在していないというようなエラーが発生します。
ドキュメントのコードを修正しながら実行する必要があったので備忘録としてメモします。

※ちなみに私が試行しているのは下記サンプルノートブックです。
[Distributed PyTorch with DistributedDataParallel](https://github.com/Azure/MachineLearningNotebooks/blob/master/how-to-use-azureml/ml-frameworks/pytorch/distributed-pytorch-with-distributeddataparallel/distributed-pytorch-with-distributeddataparallel.ipynb)
PyTorchのDistributedDataParallelを使って画像データを対象に分散トレーニングを行うサンプルです。

# 問題
私の場合はWSL環境でDatasetクラスを使用した際に下記エラーが発生いたしました。

エラーメッセージ：

```error
NotImplementedError: Linux distribution ubuntu 20.04 does not have automatic support.
.NET Core 2.1 can still be used via dotnetcore2 if the required dependencies are installed.
Visit https://aka.ms/dotnet-install-linux for Linux distro specific .NET Core install instructions.
Follow your distro specific instructions to install `dotnet-runtime-*` and replace `*` with `2.1`.
```

実行コードとエラーのイメージ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/8d673d3e-7ab7-0d58-3dec-21f94c9658f9.png)

# 対処法
エラーメッセージを参考に、.NET Core ランタイムのインストールを行います。
実行コマンドは[こちらのドキュメント](https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-)を参考に、エラーメッセージに合わせて修正して実行しました。

Microsoft package signing keyとパッケージリポジトリの追加を行います。

```bash
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
```

.NETランタイムをインストールします。ASP.NET Coreサポートは必要ないので、`dotnet-runtime-2.1`として実行します。

```bash
sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-runtime-2.1
```

# 結果
先ほどはエラーが発生していたコードが無事に実行できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/f75e7e5d-c664-d872-61d9-2daa28169ebb.png)

# 参考
[Install the .NET SDK or the .NET Runtime on Ubuntu](https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu)
人智を超えた将棋ソフトにもてあそばれてみる

# はじめに
Ubuntu ２０．０４で将棋AIソフトをプレイできるようにする、２通りの手順へのリンクをご紹介します。

# 環境
私が将棋AIのプレイを検証した環境は以下のとおりです。

- Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz
- メモリ：　DDR4　32GB
- OS：　Ubuntu 20.04

# やねうら王編
「Mono」を使って「将棋所」から「やねうら王」がプレイできる環境を構築します。
「将棋所」とはGUIを提供する将棋ソフトです。将棋エンジン（思考ルーチン）を変更できる仕組みになっているため、AIコンピュータ同士で戦わせることもできます。
「やねうら王」は、WCSC29(世界コンピュータ将棋選手権/2019年)において優勝した実績ある将棋エンジンです。
やねうら王をプレイするための手順は次のリンクを参照ください。

**リンク:** [【やねうら王をプレイする】](https://daimaohsx.dip.jp/wordpress/2021/03/16/lets-play-with-shogi-software-that-transcends-human-intelligence-yaneuraou/?preview_id=1142&preview_nonce=dfa4e6c679&preview=true)

# GPS将棋編
「Wine」を使って「GPS将棋」が動作する環境を構築します。
Wineとは、Windowsの実行形式のファイルを直接、Linux PC上で動作させることのできるミドルウェアです。
GPS将棋は、東京大学大学院総合文化研究科の教員・学生達によるコンピュータ将棋のプログラムです。世界コンピュータ将棋選手権で２度に渡り優勝している実力派で、ソースコードとデータはオープンソースとして公開されています。
GPS将棋は、Windowsで動作する将棋のグラフィカルユーザーインターフェース（GUI)ソフトウェア「ShogiGUI」にバンドルされています。
ここでは、Ubuntu 20.04上で、Wineを活用してShogiGUIを動作させ、GPS将棋と対戦できるようにします。
GPS将棋をプレイするための手順は次のリンクを参照ください。

**リンク:** [【GPS将棋をプレイする】](https://daimaohsx.dip.jp/wordpress/2020/07/26/try-playing-with-shogi-software-that-surpasses-human-intelligence/?preview_id=527&preview_nonce=e5df771f92&preview=true)
img2pdfについて

#png画像をPDFにまとめたい！

画像をpdfファイルをにしたい時ってありますよね
調べてみると、img2pdfが便利そうで

https://qiita.com/daikan_murata/items/e1c38db8b41d141f12d8

を参考にさせてもらい作ってみました。
けど、ちょっと自分の環境では、問題があったのでそれをメモしておきます。

#問題が...

先程のサイトを参考に

```python:pdf.py
import os
import img2pdf
from PIL import Image

if __name__ == '__main__':
    pdf_FileName = "/tmp/png/output.pdf"
    png_Folder = "/tmp/png/"
    extension  = ".png"

    with open(pdf_FileName,"wb") as f:
        
        f.write(img2pdf.convert([Image.open(png_Folder+j).filename for j in os.listdir(png_Folder)if j.endswith(extension)]))
```

を作ってみたのですが、
画像の名前が○○1.pngなどの連番にしてたのですが、
なぜかpdfにしようとすると順番がバラバラに....

そこでsortedを使用して並び替えて見ました。

```python:pdf.py
import os
import img2pdf
from PIL import Image

if __name__ == '__main__':
    pdf_FileName = "/tmp/png/output.pdf"
    png_Folder = "/tmp/png/"
    extension  = ".png"
    listfolder = os.listdir(png_Folder)
    sortfolder = sorted(listfolder, key=lambda s: int(re.search(r'\d+', s).group()))

    with open(pdf_FileName,"wb") as f:
        
        f.write(img2pdf.convert([Image.open(png_Folder+j).filename for j in sortfolder if j.endswith(extension)]))
```

に変えたら順番通りになりました。
以上
Nuxtのerrorメソッドをグローバルに呼び出す方法

### 経緯

グローバルなエラーハンドリングでも無く、APIが失敗したタイミングでエラーページへ遷移させたかった。
見つかる方法が`fetch`メソッドの引数から受け取る等vueの中からアクセスする方法ばかりで困っていたらグローバルに`error`メソッドにアクセスする方法を発見
備忘録として残す

### 方法

```ts
window.$nuxt.error({ statusCode: 500 })
```
Tailwindのtext-color, text-sizeが効かなくなった。

Tailwind.config.jsのextend内ではなく、theme内にcolorsとfont-sizeを追加したことが原因でした。

Tailwindのデフォルトの色やサイズを使用しつつ、独自のスタイルを追加したい時はextend内に書くようにします。

```
// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        'regal-blue': '#243c5a',
      }
    }
  }
}
```
or条件の関数（excel）

人生初めて作成して苦戦したのでメモ

=IF(OR((COUNTIF(セルA,"*char*")=1),(セルA="decimal")),"(","")
→セルAがcharを含む文字列　又は　decimalを含むなら　"("を付け、含まないなら 空文字を入れる
Route::postにするとなぜか「The GET method is not supported for this route. Supported methods: POST.」が出る。

#目次
[1.何が起きた？](#何が起きた？)
[2.解決策はこれ！](#解決策はこれ！)

#何が起きた？
Laravel8にて、アップロード画面のルート設定で以下の記述を書いたところ、タイトルのように「<font color="red">**The GET method is not supported for this route. Supported methods: POST.**</font>」のエラーが。。。

```web.php
Route::post('ctrl.upload', [CtrlController::class, 'uploaded']);
```

原因を探るが、どれを試してみても効果なし。

しかもLaravelのエラー画面が教えてくれる場所は「vendor/laravel/framework/src/Illuminate/Routing/AbstractRouteCollection.php:117」で、そこちゃうねん（多分）。

頭をひねること数時間、最後は
「うわ、こんなしょうもないことで。。。」
と原因に気づきました。

そうは思ってもプログラム書いてるとこんなこと日常茶飯事。
そんなわけで、備忘録も兼ねて同じトラップ（？）にハマった人のために残しておきます。

#解決策はこれ！

```web.php
Route::get('ctrl.upload', [CtrlController::class, 'upload']);
Route::post('ctrl.upload', [CtrlController::class, 'uploaded']);
```

分かりますよね？

そうです、**Route::getをpost**の前に追加しただけです。

ちなみに自分の場合は、getはすでに書いてるもんなーという確認（記憶）ミスでした。

ひとりプログラマだから誰も教えてくれない環境つらたん。

#Route::getとRoute::postの違い
これ、初心者だとよくある勘違いなのですが、今回のアップロード画面でのget/postを分かりやすく言えば、
~~getは**すでに存在するデータを取得する**ために使い、
postは**前のページからデータを受け取る**ために使います。~~
getは**アップロード画面を取得（upload）**するために使い、postはアップロード画面で「アップロードする」を押すことで**指定の送信先ルート（uploaded）**へアップするデータを送信するために使います。
2021.06.25に@Grandpaさんからご指摘があったので修正しました。
（文章苦手なんで誰か校正入れて〜）


上記の違いを流れに沿って説明すると、
1. 最初はアップロードするデータを何も選択（または入力）していないので、受け取るデータがないため**Route::get**を使用。
2. アップロードするデータを選択（または入力）し、アップロードをクリック。
3. アップロードされたデータの名前（ファイル名や入力値）を表示したいので、前のページからデータを受け取るために**Route::post**を使用。

という流れになります。

---

ちなみに、もともとは「upload()」という関数をコントローラーに作っていたのですが、中身はデータを受け取った後の処理だけが書かれていたので、これを「uploaded()」に変更し、データを何も選択していない状態の初期画面用に新たに「upload()」を用意しました。
新しい「upload()」にはデータの名前を表示するための$resultに対して、

```CtrlController.php
public function upload()
{
  return view('/ctrl/upload', ['result' => '']);
}
```
とだけ記述してあります。

最後のが役立つかは謎ですが、とりあえず解決した人がいれば嬉しいです。

じゃーねー(^o^)ﾉｼ
ドラえもんのひみつ道具コエカタマリンをARで再現した

ドラえもんで出てくるコエカタマリンをARで作りました。
壁や物にぶつかると落下し、床に散らばります

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">コエカタマリンをARで使えるアプリをリリース！<br>文字が壁にぶつかったり、床に転がったりします<br><br>ここからインストール↓<a href="https://t.co/w1xXxBwJtc">https://t.co/w1xXxBwJtc</a><a href="https://twitter.com/hashtag/%E3%83%89%E3%83%A9%E3%81%88%E3%82%82%E3%82%93?src=hash&amp;ref_src=twsrc%5Etfw">#ドラえもん</a> <a href="https://twitter.com/hashtag/%E3%81%B2%E3%81%BF%E3%81%A4%E9%81%93%E5%85%B7?src=hash&amp;ref_src=twsrc%5Etfw">#ひみつ道具</a> <a href="https://t.co/I24KDs5lbv"></a></p>&mdash; <a href="https://twitter.com/Brian3546/status/1374657565775175687?ref_src=twsrc%5Etfw"></a></blockquote></script>

<img width="300" alt="ezgif-6-a1d03b6fc52d.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006690/fecc97a8-06b0-e1f3-c7fe-b589bd8722cf.gif">


#コエカタマリンとは
しゃべった言葉が3Dの文字として口から飛び出すというひみつ道具です

<img width="500" alt="smp_b973680652edf2b4d26a7b949ae1f9b7.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006690/72d9820b-e052-1951-bbeb-f8be1ac6bbea.jpeg">
<img width="500" alt="200516A.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006690/db4c6ce5-7316-17ca-0ebd-c169c41b67de.jpeg">

#機能
-　マイクボタンを押しながら喋ると、しゃべった言葉が立体の文字になり飛び出します
-　テキストを入力して立体文字を表示させることもできます
-　録画機能
-　iosのみ

#仕組み
###開発環境
Unity
ARFoundation
ARKit

###音声認識
SFSpeechRecognizerを使用しました
GithubにUnityでSFSpeechRecognizerを使えるコードがあったのでそれを利用しました
[Speech-And-Text-Unity-iOS-Android-master](https://github.com/PingAK9/Speech-And-Text-Unity-iOS-Android)

###3D文字生成
自分で作れると思ったけど思っていたより難しくアセットを使いました
[FlyingText3D](https://assetstore.unity.com/packages/tools/particles-effects/flyingtext3d-3627)

#感想
やっぱりLiDARだと平面の認識早いなー
ぜひLiDARがついているiOS端末で遊んでみてください

インストールはこちらから↓↓
[コエカタマリンAR](https://apps.apple.com/us/app/%E3%82%B3%E3%82%A8%E3%82%AB%E3%82%BF%E3%83%9E%E3%83%AA%E3%83%B3ar/id1558320255)
<img width="200" alt="za5RsaxybGY6UNE1616466996_1616467044 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006690/571ce21f-03f7-2689-d738-2c0558a6fe83.png">
ラズパイでATEM Streaming Bridgeと同じ機能を試してみた

# はじめに

ATEM Streaming Bridgeと同じ機能をラズパイ(Raspberry Pi 4 Model B)で実現してみたメモです。

## ATEM Streaming Bridgeとは

ATEM Mini製品(Pro/Pro ISO/Extreme/Extreme ISO)から映像をネットワーク経由(RTMP)でリモートのATEM Streaming Bridgeへ送信することができ、ATEM Streaming BridgeではHDMIで映像を出力することができます。3つの接続方法から選択することができます。

- 直接ネットワークケーブルで接続
- ローカルネットワークで接続(ストリームキーの設定の有/無を選択可)
- インターネット経由で接続

![ExDSeuyVEAAL58H.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/984e0327-febc-a1ef-69e4-bb1f4693867f.jpeg)

![スクリーンショット 2021-03-23 10.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8f1e2b62-22bf-05f9-ee85-9ff9b95d22b7.png)

製品マニュアルはこちら。
https://documents.blackmagicdesign.com/UserManuals/ATEM_Mini_Manual.pdf

## ラズパイで実現する方法

元ネタはこちら。

https://aaronparecki.com/2020/09/07/7/raspberry-pi-streaming-server

<iframe width="560" height="315" src="https://www.youtube.com/embed/MtETl23cnOA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 比較結果

Camera 1がオリジナルの映像で、Camera 2がATEM Streaming Bridgeから出力した映像、Camera 3はラズパイの画面です。

ATEM Streaming Bridgeは遅延がほとんどありませんが、ATEM Mini製品しか繋がらない制約があります。(OBS Studioからは繋がらない。)
ラズパイはATEM Mini製品、OBS Studioから繋がりますが、遅延が大きいです。(3〜5秒程度ありました。)

<iframe width="560" height="315" src="https://www.youtube.com/embed/7G6ENtw9wnQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 手順

## 0. /boot/config.txtの変更 (オプション)

元ネタではconfig.txtを変更していますが、既に問題なくディスプレイ表示できていれば変更しなくても問題ありません。

```txt:config.txt
#disable_overscan=0
#hdmi_group=2
#hdmi_mode=16
```

## 1. アプリケーション(パッケージ)のインストール

ATEM Streaming Bridgeと同じ機能を実現するために必要なアプリケーション(パッケージ)をaptコマンドでインストールします。インストールが完了した時点でNginxは起動します。

- Nginx
- Nginx RTMP module
- OMXPlayer

```bash
$ sudo apt update
$ sudo apt install omxplayer
$ sudo apt install nginx libnginx-mod-rtmp
```

## 2. Nginxの設定変更

NginxがRTMPを受信できるようにし、RTMPを受信した際にOMXPlayerを起動する設定を追加します。

### 2-1. /etc/nginx/nginx.confの変更

Nginxの設定ファイル(nginx.conf)にRTMPを受信する設定を追加します。

```bash
$ sudo vi /etc/nginx/nginx.conf
```

```text:nginx.conf
rtmp {
      server {
           listen 1935;
           application live {
                live on;
                record off;
                allow play 127.0.0.1;
                deny play all;
                exec omxplayer -o hdmi rtmp://127.0.0.1/live/$name;
           }
      }
}
```

### 2-2. Nginxの設定を反映

-tオプションで設定内容に問題がないことを確認し、問題がなければ-sオプションで設定を反映(リロード)します。

```bash
$ sudo nginx -t
$ sudo nginx -s reload
```

## 3. HDMI出力する権限の追加

NginxがRTMPを受信してOMXPlayerを起動します。OMXPlayerが映像をHDMIへ出力させるために、www-dataユーザにvideoサブグループを追加します。

```bash
$ sudo usermod -aG video www-data
```

# まとめ
現状ではどちらも一長一短ありますが、ニーズや利用シーンに合わせて手段を選択できるといいですね。
では、良き配信ライフを！
SendGridとmailgunを比較

## 比較の観点

- 値段
- バウンス対策
- 時間単位（秒、分、時間、日）の送信上限
- 日本語サポート
- 固定IPアドレス

両サービスとも便利な機能があるが、今回は触れず、上記の観点から比較していく。

## 無料プラン

### SendGrid

- バウンス対策
    - ソフトバウンス：
宛先がメールを受け付けない場合、
Deferredイベントを発生させる。
メールが受け付けられるまで最長72時間自動的に再送を続ける。
再送間隔は徐々に長くなる。
一定時間経過しても受け付けられなかった場合、
宛先アドレスをブロック（Block）リストに登録して、
Blockイベントを発生させる。
    - ハードバウンス：
宛先アドレスをバウンス（Bounce）リストに登録し再送は行わない。
Bounceイベントを発生させる。
バウンスリストの確認と削除

- 送信上限
    - 12,000通／月（秒、分、時間、日あたりの上限なし）

- 日本語サポート
    - 問い合わせ◯
    - ドキュメント◯

- 固定IPアドレス
    - 使用できない

### mailgun

- バウンス対策
    - SendMailとほとんど同じ。違いは、Mailgunが72時間ではなく、最大24時間自動的に再送信すること。

- 送信上限
    - 5,000通／月（秒、分、時間、日あたりの上限なし）

- 日本語サポート
    - 問い合わせ△（Google翻訳を介してやりとり）
    - ドキュメント✕

- 固定IPアドレス
    - 使用できない


##### 両サービスともに、無料プランでは固定IPアドレスを使用できない。要件として固定IPアドレスが必須となっている場合、有料プランで対応する。

>共有IPについて　（SendGrid公式ドキュメントから引用）
複数のお客様でIPアドレスを共有するプランでは、原因となったアカウントの特定や対処、解除申請をSendGrid社にて実施いたします。
共有IPアドレスを利用する場合、他のお客様による送信の影響を排除することはできないためDeny Listへの掲載リスクは常に存在します。
掲載された場合、SendGrid社では解除に向けた原因究明、対処を速やかに実施いたしますが、解除するかどうかはDeny List側の判断になるため早期解決は保証できません。また、掲載原因に対する対処が完了するまでは、再発の恐れがあるため別のIPアドレスへも変更されません。
悪意のあるメールが送信されてしまうと、
・そのメールを受信した第三者に対して損害が発生する可能性があること
・送信に利用されたIPアドレスだけでなく、SendGridサービス自体の信頼性を損ねること
から、対応は慎重に行われ、解決までには一定の時間を要すること、ご理解くださいますようお願いいたします。
上述の理由から、根本的な解決策として、お客様専用のIPアドレスを占有できるProプランのご利用をお勧めしております。

## 有料プラン

固定IPアドレスが使用できる最安プラン

### SendGrid

- 値段
    - 10,000円

- バウンス対策
    - 無料プランと同じ

- 送信上限
    - 100,000通／月
    - 上限超過時0.106円／通
    - スループットはおよそ30,000メッセージ／秒

- 日本語サポート
    - 無料プランと同じ

- 固定IPアドレス
    - 使用できる

### mailgun

- 値段
    - $80

- バウンス対策
    - 無料プランと同じ

- 送信上限
    - 100,000通／月
    - $ 0.80 / 1000のメール 情報
    - $ 1.20 / 100の検証

- 日本語サポート
    - 無料プランと同じ

- 固定IPアドレス
    - 使用できる


## まとめ

要件として固定IPアドレスが必要かどうか、月にどのくらい送信するのかによってプランを変更する。
日本語サポート面から基本SendGridを選択するが、値段を重視するとmailgunの選択も見えてくる。
【OmniAuth】　脆弱性　Resolving CVE 2015 9284 について【Rails】

# 【OmniAuth】　脆弱性　Resolving CVE 2015 9284 について【Rails】

Railsでアプリ開発をしていたら、GitHubからセキュリティに関する警告が…

https://github.com/omniauth/omniauth/wiki/Resolving-CVE-2015-9284

上記に対する具体的な対応方法を記載しているサイトが少なかったので、載せておこうと思います。

↓大変参考になりました。ありがとうございます。
https://zenn.dev/koshilife/articles/b71f8cfcb50e33

---------------------------------------



ふむ…。
内容はよくわからないけど、OmnAuthのgetをそのままにするとだめなんですね。

対処法はバージョンアップデートでは対応していなく、個人でRailsを弄るそうです。

書いてある手順通りにやれば大丈夫そうですね！



---------------------------------------



ps.開発してエラーに当たって調べてを繰り返ししていますが、本当にQiita等の記事に助けられています。後世の為に記録を残してくださっているエンジニアの先輩方に感謝感激です。
Rspec　モデルの異常系単体テストコードについて

## 初めに
学習のメモがわりに残していきます。
前提として、RSpec,FactoryBotの導入は済んでいる。
実際にファイルに記述するところからスタートします。
## 単体テストコードの用語について
単体テストコードの用語を説明しながら進んでいきます。今回はユーザーの新規登録機能について書いていきます。
### describe 
descibeとはテストコードのグループ分けを行うメソッドのことです。
どの機能に対してテストを行うかを分けdo~endの中に記述します。
例
![](https://gyazo.com/105545748b21ddd31189c5472a345376.png)

### it
itもグループ分けを行うメソッドです。itの場合はdescribeで分けたグループをより詳細に分けます。itで分けたグループのことをexampleとも呼びます。こちらもdo~endの中に記述します。
例
![](https://gyazo.com/b800b9f1641c1c6ca9c0f619ae8facf8.png)
### Valid?
valid?はバリデーションを実行させてエラーがあるかどうか判断するメソッドです。
エラーがない場合はtrueをある場合はfalseを返します。またエラーの内容を示すメッセージを生成します。

### errors
errorsとはインスタンスにエラーがある場合その情報を示してくれます。このときfull_messgesメソッドを使用します。
full_messagesメソッドを使用することによってどのようなerrorsが出ているのかを確認できます。

### エラーメッセージの確認
早速エラーメッセージの確認をしていきます。今回はemailが空の時は登録できないことを検証します。
なので@user.email=""と書きemailが空であることを示します。
そのあとはbinding.pryを使用して確認します。
![](https://gyazo.com/b36d21396f0871a406ade283a195d856.png)

ターミナル上で

```
bundle exec rspec spec/models/user_spec.rb
```
と打ち込むと以下の画像のように止まります。
![](https://gyazo.com/8e83db741f90987acab8422fff3fe23f.png)
コンソール上に@user.vaild?と打ち込むとfalseとでます。
@user.errors.full_messagesと打ち込むと以下の画像のようにエラー文が出てきます。
![](https://gyazo.com/85f31f98dd8fc6e7cd41ac813c940270.png)
あとはエラー文をコードに以下の画像のように打ち込みます。
![](https://gyazo.com/59074fa7e200bd8ad90338e04ec6d123.png)
最後にターミナル上で

```
bundle exec rspec spec/models/user_spec.rb
```
と打ち込み正常に動作したら完成です。
Google SpreadSheet で上位5個の平均を計算する

#TL;DR

次の式で計算できます。

```
=ARRAYFORMULA(AVERAGE(LARGE(<計算範囲>, {1, 2, 3, 4, 5})))
```

例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397748/760d0106-7842-1ce9-6c48-93b134386b88.png)


# やっていること
## 素朴な方法

手間を惜しまずに書くなら以下のようになります。
`AVERAGE(LARGE(<計算範囲>, 1), LARGE(<計算範囲>, 2), LARGE(<計算範囲>, 3), LARGE(<計算範囲>, 4), LARGE(<計算範囲>, 5))`
しかし、非常に式が長いので見づらいですし、修正も大変です。そこで配列リテラルと ARRAYFORMULA 関数の出番になります。

## 配列リテラル

スプレッドシートでは `{a, b, c, ...}` という表記で配列リテラルを使うことができます。
配列は、数の並びです。
例えばA1セルからA3セルにかけて 1,2,3 という数が並んでいたら、セル名で `A1:A3` とするのと、直接値を使って `{1,2,3}` とするので同じ配列が得られます。

## LARGE 関数

`LARGE(<計算範囲>, n)` という表記で、計算範囲内で上位 n 番目に大きい値を取得することができます。
通常は n には単体の数値が来ます。

## ARRAYFORMULA 関数

ARRAYFORMULA 関数では、配列を引数として取らない関数を配列の各要素に適用させたい場合に役に立ちます。
イメージとしては次のようになります。

1. 配列の要素ごとに関数を適用する  
`LARGE(<計算範囲>, {1,2,3,4,5})`   
-> `{LARGE(<計算範囲>, 1), LARGE(<計算範囲>, 2), LARGE(<計算範囲>, 3), LARGE(<計算範囲>, 4), LARGE(<計算範囲>, 5)}`
2. 計算結果の配列を集約して1つの数値を返す  
`ARRAYFORMULA(AVERAGE({LARGE(<計算範囲>, 1), LARGE(<計算範囲>, 2), LARGE(<計算範囲>, 3), LARGE(<計算範囲>, 4), LARGE(<計算範囲>, 5)}))`  
-> 上位5つの平均値

map reduce の知識がある人は、1番が map 関数、2番が reduce 関数に相当すると理解できると思います。

# 終わりに

間違っていたらご指摘いただけると幸いです。

# 参考リンク

- [Summing top three values in a column from a Google sheet | Stack Exchange](https://webapps.stackexchange.com/questions/100411/summing-top-three-values-in-a-column-from-a-google-sheet)
初心者の初心者による初心者のための配列プログラム作成問題1です

今回は初心者の初心者による初心者のための配列プログラム作成問題を一部公開します。
仕事でプログラムを教えている関係で全ての問題を公表できませんことをご了承ください。

課題
・int型の配列に「7 4 5 8 2 6」の6個の配列を作り、配列の長さを出力するプログラムを作成してください。

ヒントは配列の長さはJavaの場合はlength関数を、python3の場合はlen関数、C++の場合はsize()関数、C#はLength関数、PHPの場合はcount関数を使います。