OmniAICreator/Qiita-1.07M huggingface dataset:
FirebaseでSMS認証(Nuxt, Vue.js)

ドキュメント見るの辛い人向けに置いておきます。

## 1.Firebaseのコンソールで電話番号認証を許可

AuthenticationタブからONにするだけです

これでアプリケーションで使えるようになります

### 料金体系

Sparkプランは1万/月でいけるので、試しにテストしてみたかったり小規模なサービスではこれで十分かと思います

1万を超過するようなログイン、登録が発生する場合はBlazeプランにあげたほうが確実です。

Blazeプランの場合は従量課金制度で1万を超過した分に対して1件あたりの金額がかかってきます。

[料金を確認](https://firebase.google.com/pricing/?hl=ja)

![スクリーンショット 2020-02-07 13.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/4db14c90-22f0-7ddc-3e2a-819a03b30f5a.png)



## 2.reCAPTCHAで認証を設定

主に不正行為を防止する目的でこれ設定する必要があります。

例えばよくある画像を選んでロボットではないことを確認するアレです。

    //任意の言語を渡すとreCAPTCHAの言語が自動的に変わります
    firecase.auth().languageCode = 'jp'

最近ではユーザーの操作を必要としないreCAPTCHAもあるのですが、firebaseはそれもサポートしています

今回はチェックボックスにチェックするいつものreCAPTCHAを使います

    <template>
      <div>
        <a
          id="sign-in-button"
          @click="sendMessage()">
          <span>ログイン</span>
        </a>
        <div id="recaptcha-container"/>
      </div>
    </template>
    
    <script>
    import firebase, { auth } from 'firebase'
    
    export default {
      data () {
        return {
          recaptchaVerifier: null,
          recaptchaWidgetId: null,
          confirmationResult: null,
          verificationCode: null
        }
      },
      mounted () {
        this.recaptchaVerifier = window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', {
          'size': 'normal',
          'callback': responseToken => {
             // reCAPTCHA solved
           }
        })
        
        this.recaptchaWidgetId = await this.recaptchaVerifier.render()
      }
    }

これでreCAPTCHAのdivがrenderingされます

この `recaptchaVerifier` は signIn時の引数で利用するので保持しておきます

![スクリーンショット 2020-02-07 16.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/027843b4-6c27-ccbb-3c04-d598d17b7b40.png)



## 3.SMSへのコード送信処理

電話番号は国際番号(+81) + 電話番号で入力されたものを利用します

ここでは決め打ちしていますが、本来はinputタグを用意してそこに入力したものをv-modelなどを利用して取得してきます

    
    async sendMessage() {
      // ダッシュボードからホワイトリストにいれてテストすることが可能です
      const phoneNumber = "+818099999999"
      try {
        this.confirmationResult = await firebase.auth().signInWithPhoneNumber(
          phoneNumber, this.recaptchaVerifier) // ここで先ほどのreCAPTCHA認証を利用します
      }
    }
    

問題なく送信された場合はconfirmationResultにverificationIdが返ってくるのでそれをユーザー認証に使います

## 4.SMSで届いたコードを入力させてログイン

3で実施したcofirmationResultとSMSに送信されたコードを利用して実際にユーザーを認証させます

※htmlにはないですが、認証コード入力欄と確認ボタンみたいなものがある前提です

    // verificationCodeはv-modelなどで指定しているユーザーが入力した認証コード
    if (this.confirmationResult && this.verificationCode) {
      try {
        const result = await this.confirmationResult.confirm(this.verificationCode)
        const user = result.user // これでユーザーを取得できる
       } catch (e) {
         // 認証コードが間違っている
       }
    }

以上で電話番号で認証をとることが可能です
【FaunaDB】ドキュメントデータベースの新規作成


FaunaDBのデータベースの**コンソール**での作り方について書き残します！
今回は**ドキュメント型**のモデルのでの作成になります。

<font color="Red">**今回は書き残しなので、少しづつ編集していきます。**</font>

## 作成手順
- **[NEW DATABASE]**から新規のDBを作ります。
![スクリーンショット 2020-02-07 16.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/fd834233-b9c4-ed9d-9744-86ed257b318d.png "スクリーンショット 2020-02-07 16.56.27.png")

- Databaseの名前を設定して、**[SAVE]**を押します。
![スクリーンショット 2020-02-07 16.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/ef3346d6-4fa7-8676-7c15-f5cc18d7e1a2.png "スクリーンショット 2020-02-07 16.56.50.png")

- データベースは作成されるので、その中にCollectionを作ります。
**[NEW COLLECTION]**から新規のCollectionを作成します。
![スクリーンショット 2020-02-07 16.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/f12705d9-07db-edda-600d-b81a1e2f4e1f.png "スクリーンショット 2020-02-07 16.57.15.png")

- Collectionの名前を設定して、**[SAVE]**を押します。
![スクリーンショット 2020-02-07 16.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/e718dc30-6bd8-a958-05c5-39a700317d8b.png "スクリーンショット 2020-02-07 16.57.38.png")

- Collectionが作成されて、同時にIndexが作成されます。
![スクリーンショット 2020-02-07 16.58.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/d068c66f-dd41-3039-f3c4-94e22610679d.png "スクリーンショット 2020-02-07 16.58.27.png")

- 次にCollectionの中にDocumentを追加するので**[NEW DOCUMENT]**を押します。
![スクリーンショット 2020-02-07 17.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/3da12be0-c971-c508-b8d6-2c6715b84625.png "スクリーンショット 2020-02-07 17.22.37.png")

- JSON形式でデータを追加して、**[SAVE]**を押します。
![スクリーンショット 2020-02-07 17.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/1ccfba68-61af-00d7-1935-ead87dbb9ab3.png "スクリーンショット 2020-02-07 17.23.01.png")

- Collectionの中にDocumentが追加されます。
![スクリーンショット 2020-02-07 17.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/ca191da1-6af2-0afd-97ee-c5a0f328310d.png "スクリーンショット 2020-02-07 17.23.33.png")


## まとめ
ここまででDatabaseからDocumentsまでの作成が出来ました。
FaunaDB自体の機能が結構奥が深いので、徐々に書いていこうと思います！
【Laravel】デフォルトの管理画面に左メニューをサクッと設置

最近Laravelはじめました。

Laravelにはデフォでユーザ管理機能が存在しますが、そのログイン後の画面はコンテンツエリアのみのレイアウトとなってます。これをよくある固定左メニュー＋コンテンツエリアのレイアウトにしてみます。



（完成形）
![スクリーンショット_2020-02-07_17_26_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151314/05776e10-159f-8775-aa2c-68f2c5bd8784.png)


<h3>0. 管理機能の有効化</h3>

ver5系では`php artisan make:auth`コマンドでユーザ管理機能がセットアップできたのですが、６系の場合は以下のリンク等を参考にセットアップしてください。

[Laravel 6系でmake:authを使う方法](https://qiita.com/rei67/items/d6d0f5f6e58edbb17c09)
[Laravel6 備忘録 −ユーザー認証(Auth)−](https://qiita.com/sny_shinya/items/6a94c16fbb66cd9f06d7)

うまくセットアップできれば、`/resources/views`下に以下のファイルが生成されているはずです。
<b>home.blade.php</b>
今回は認証後の最初のビューであるこれを元に話をすすめます。

<h3>1. home.blade.phpから左メニューの元ネタをコピー</h3>
＜div class="col-md-12"＞から閉じの＜/div＞までをコピーします。

```html:/resources/views/home.blade.php
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-12">
            <div class="card">
        
        // 略

```

<h3>2. menu.blade.phpを新規作成</h3>
1でコピッたソースを貼り付けて、`col-md-12`を`col-md-2`に変更してお好みに応じてカスタマイズします。

```html:/resources/views/menu.blade.php
  <div class="col-md-2">
      <div class="card">
          <div class="card-header"><i class="fas fa-th-list"></i></i> MENU</div>
          <div class="card-body">
              <div class="panel panel-default">
                  <ul class="nav nav-pills nav-stacked" style="display:block;">
                      <li><i class="fas fa-user-alt"></i> <a href="#">XXXXXXXX</a></li>
                      <li><i class="fas fa-user-alt"></i> <a href="#">XXXXXXXX</a></li>
                      <li><i class="fas fa-user-alt"></i> <a href="#">XXXXXXXX</a></li>
                </ul>
              </div>
          </div>
      </div>
  </div>
```

<h3>3. home.blade.phpを修正</h3>
`col-md-12`を`col-md-10`に変更して、その直前の行に`@include('menu')`を。

```html:menu.blade.php
<div class="container">
    <div class="row justify-content-center">

        <!-- left menu -->
        @include('menu')

        <div class="col-md-10">
            <div class="card">
        
        // 略

```

ちなみに今回はこんなCSSをあててみました。

```css
.col-md-2 .card-body {
    padding:0;
}
.col-md-2 ul {
  padding: 0;
  position: relative;
}

.col-md-2 ul li {
  line-height: 1.8;
  padding: 0.5em 0.5em 0.5em 0.7em;
  list-style-type: none!important;
  background: -webkit-linear-gradient(top, #whitesmoke 0%, whitesmoke 100%);
  background: linear-gradient(to bottom, whitesmoke 0%, #dadada 100%);
  text-shadow: 1px 1px 1px whitesmoke;
  color: black;
}
```

以上、LaravelというようりBootstrapのグリッドシステムを利用した小ネタでした。今回は2:10でメニューとコンテンツエリアを分割しましたが、12（グリッドの個数は最大12）の範囲内で３分割なども可能です。
基本情報技術者　テクノロジ系　第9章 データ構造、アルゴリズム、プログラミング③



# 木

木構造では、データを格納する部分を接点(ノード)といいます。
構造的にデフォルトされた木を逆さまにした構造になっています。

親: 上位階層にある節点
子: 下位階層にある節点
根: 最上位の節点
葉: 子を持たない節点


## 二分木と多分木

## 二分木
一番最初の根で、分かれているのは二つまでの構造

###  ヒープ
データを並べ替える用途

### 二分探索木
データを検索する用途


## 多分木
根の部分で3っ以上に分かれている構造

### B木
データを検索する用途に使用

全ての葉が同じ階層にある構造です。

## 完全二分木とヒープ
上位から順に、かつ、同じ階層で左から詰まっている
構造を完全二分木をいいます。

ヒープは更に完全二分木に置いて
親>子　または　子<親
の条件が全て成立している木です。

### ヒープの条件

* 完全二分木であること
* 親子間に一定の大小関係が成立していること

## 二分探索木の条件
下記の条件を満たしていることが条件です。

* 節点の値< (節点の右についている全ての子の値)
* (節点の左についている全ての子の値)< 節点の値

## 木の巡回
データを順番に見ていくことを巡回するといいます。

### 幅優先探索
同じ階層の節点を優先して巡回します。

上から順　かつ　左から順です。

### 深さ優先探索
下位層の節点を優先して巡回します。

根からすぐ下に下に潜って行って、突き当たったら
一つ上に戻り下に、全て見終わっってたら上に戻って同じく・・・
という方法です。

#### 先行順
行きがけ順に行います。

#### 中間順
一旦一番下を処理してから途中の節点を処理していく

#### 後行順
一番下を優先
初心者がプログラミングで挫折しないための考え方 


Qiitaの皆さんこんにちは。Fumiyaです。😃

プログラミング学習の経験者で、プログラミング学習をやめたことがある、挫折したことがある人の数は、私達が想像する以上に多いようです。あるエンジニア育成スクールの調査によると、アンケート調査の結果、プログラミング学習を中断、挫折したことがある人が9割を占めることが分かっています。

プログラミングに挫折する理由というものは、実はある程度決まっています。大きく分けて、「環境構築」と「エラー」、そして「独学」です。

プログラミングを開始するためには、プログラミング言語やその他の必要なものをダウンロード、インストールする必要があります。これらの作業はプログラミングを行うための環境を作るということから、「環境構築」と呼ばれています。環境構築で挫折するケースが多いという事実があります。プログラミングの環境構築の手順は複雑なものが多く、特に初心者によっては一筋縄ではいかないところがあるようです。

人気言語の一つ、Ruby言語をWindowsオペレーティングシステムにインストールし、環境構築を行い、プログラミングを開始することができるようになるまでには、いくつものステップを踏む必要があります。

プログラミングの環境構築で挫折しない方法…それはつまり、環境構築のステップそのものを短くしてしまうことです。そのような理念から生まれたソフトウェアがあります。これを使うことで、プログラミングの環境構築の手間をたった一度のステップにまで短縮することが可能となります。それは、「Docker」です。現時点でプログラミングをある程度経験している方であれば、Dockerに挑戦して見ることは悪い選択ではありません。

実は、プログラミングを始めることはとても簡単です。Google検索で”Ruby REPL”などと検索してみてください。REPLは対話型実行環境、簡単な言い方をすると、プログラムのコードを、まるで人と対話するかのように、双方向的に実行できる環境のことを言います。

repl.it https://repl.it/languages/ruby
repl.it https://repl.it/languages/html

このプログラムは、Ruby言語で実行できる最も簡単なプログラムの一つです。このコードをコピー・アンド・ペーストし、”Run”ボタンをクリックしてプログラムを実行してみましょう。

```ruby 
puts "hoge"
```

![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_54a8ab77-28b5-43fe-bb03-c075d393789f.gif](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_54a8ab77-28b5-43fe-bb03-c075d393789f.gif)

環境構築を無事に行うことができたとしても、プログラミングにはエラーというものがあります。

あなたはもしかして、プログラミング学習中にエラーに遭遇した時、日本語でGoogle検索をしてはいませんか？プログラミングでは日本語はご法度です。英語ができない方は、Google翻訳を使ってでも、英語で検索してみましょう。

エラーの原因が特定のライブラリやフレームワークにあるということが分かりきっている場合、Google検索をするよりも、Github Issueを検索したほうが効率的な場合があります。

プログラミングのエラーの原因と対策についてお話しましたが、実はもう一つ、とても重要な要素があります。それは、「開発環境」です。

なぜ、WindowsやMacでプログラミングをすることは非推奨なのでしょうか。簡単に言うと、「WindowsやMacでプログラミングをするとエラーに遭遇しやすくなる」という理由があるからです。

プログラムの多くは、”Linux”で動作させることを前提に作られています。例えばRuby言語それ自体はWindowsやMacでも問題なく動作しますが、ここにnokogiriというライブラリをセットにして考えると、一気にWindowsやMacはエラーを出す確率が上昇します。

プログラミングで挫折しないために絶対に欠かしてはいけないこと、それは、 「プログラミングを心から楽しむ」 ことです。

厳しい言い方になりますが、好きじゃないプログラミングを嫌々やっているような人は、絶対に良いプログラマーにはなれません。

プログラミングをやめてしまう前に、一度自分とよく向き合い、自分が本心では何をやりたいと思っているのか、よく考えてみましょう。

<strong>この投稿は、長文を読んでいる時間がないQiitaの皆さん方向けに編集されたものです。全文は私のブログ(以下URL)でご覧いただけます。

<strong>[プログラミング学習で挫折しない方法](https://yuis-programming.com/?p=2240) (https://yuis-programming.com/?p=2240)

✓ この投稿が気に入ったら いいね！ や シェア をお願いします 😁
DataspiderからRest apiでSalesforceと接続

Dataspider接続する時にトークンコードを取得する時に、必ず

%3D%3D⇒==を変わって入力します

トークンコード：
aPrxKlcUBVrDN52gyfVWGDdpRlRjOUxrUI.MCg9jKcLIMxxxxxxxxxxA3vPI0OIckyb9Hw%3D%3D
⇊
aPrxKlcUBVrDN52gyfVWGDdpRlRjOUxrUI.MCg9jKcLIMxxxxxxxxxxA3vPI0OIckyb9Hw==

https://www.your_server.com/auth/add_oauth_token?code=aPrxKlcUBVrDN52gyfVWGDdpRlRjOUxrUI.MCg9jKcLIMUGtKdtWZhxxxxxxxxxxkyb9Hw%3D%3D
&state=014799b35985460aa79exxxxx557f5f

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/ded3c4f2-d3d0-c8d1-acd3-8b2ebd8840c7.png)


ネットワーク→rest api→認証→グローバルリソース
UnityAcceleratorをLinux上に立ててサービス化する

UnityAcceleratorをサーバに立てたときの備忘録

※Unity2019.3からアセットのキャッシュ管理にUnityAcceleratorの使用が推奨されており、
 UnityCacheServerの代替として必要となった

UnityAccelerator: v1.0.90+gd82184f
OS: AmazonLinux2 

## インストール

公式で用意されているインストールスクリプトを落として実行

```sh

curl https://unity-accelerator-prd.storage.googleapis.com/unity-accelerator-linux-installer.run --output unity-accelerator-linux-installer.run

sudo ./unity-accelerator-linux-installer.run --mode unattended

※ 「--mode unattended」オプションを付与するとデフォルト設定でのインストールになる
　付与しないと対話式カスタムインストールになるが入力項目がかなり多いので、特になければデフォルト推奨
```

## サーバ再起動時のサービス自動起動化

インストールスクリプト実行時にサービス登録されてるので有効化しておく

```sh

/sbin/chkconfig unity-accelerator on
```

## 対象ポートの変更

設定ファイルは/root/.config/unity-accelerator/に展開されている

```sh
vi /root/.config/unity-accelerator/unity-accelerator.cfg
→ProtobufPort、LastUsedProtobufPortを任意のポートに変更

service unity-accelerator restart
```




# 2022/6/20 追記：1.0.941でのインストール手順

バージョンアップによりインストーラが変わって手順も少々変更されていたので追記しておきます


UnityAccelerator: v1.0.941+gd82184f
OS: AmazonLinux2 

```
// rootになる
sudo su -
// インストールディレクトリを掘る
mkdir unity_accelerator_work
 
cd unity_accelerator_work
// インストーラダウンロード
wget https://storage.googleapis.com/unity-accelerator-prd/unity-accelerator-v1.0.941+g6b39b61-linux
chmod +x unity-accelerator-v1.0.941+g6b39b61-linux
// インストールJSON生成
./unity-accelerator-v1.0.941+g6b39b61-linux install --sample→install.jsonができる
 
// インストール
./unity-accelerator-v1.0.941+g6b39b61-linux install --json install.json
→ インタラクティブに聞かれるので適宜入力。「Admin Username」「Admin Password」はWebインターフェース用。
 
// config編集
vi unity-accelerator.cfg
→ AgentID、AgentName、ProtobufPort、LastUsedProtobufPortを適宜設定。ADBV2Enabledはtrueにする
 
// サービス再起動
systemctl restart unity-accelerator
```

## 参考サイト
https://docs.unity3d.com/2019.3/Documentation/Manual/UnityAccelerator.html
https://forum.unity.com/threads/accelerator-options.784514/
【基本情報】2進法（2進数）と8進数・１６進数の表記について

コーディング以外のシステム・業務関係を知る手段として**基本情報技術者試験**の内容が包括的に学べると聞き覗いてみたので、備忘録として書きます。
表現の不満や誤りなどがあれば仰って頂けると非常に助かります(^_^;)

# 2進法（２進数）とは
2進法とは、**「1」 と 「0」 の２つの数値のみで表された数字表現**のことで、その数を`2進数`と呼ぶ。
普段我々が使っているのは`10進法`と呼ばれ、0, 1, 2, 3, 4, 5, 6, 7, 8, 9 で表現されている。
(２、１０などのベースの数値のことを**基数**と呼ぶ)

10進法では9の次には繰り上がり10（1と0で表現）となるが、
2進法では1と0しか数字記号がないため、0　→　1　の次は繰り上がり10（10進法での`2`にあたる）
　

＜対比＞

| 2進数 | 10進数 |
|:--:|:--:|
| 1 | 1 |
| 10 | 2 |
| 11 | 3 |
| 100 | 4 |
| 101 | 5 |
| 110 | 6 |
| 111 | 7 |
| 1000 | 8 |
| 1001 | 9 |
| 1100 | 10 |
| 1011 | 11 |
| 1111 | 12 |

2進法はコンピュータを構成する論理演算（AND, OR, NOT）に加え、メモリの構成にも用いられるすべてのベースとされる。

#8進数と１６進数
8進数：　 0, 1, ..., 7 の８つの数字で表される。

16進数：　0, 1, ..., 9, A, B, ..., F の16の数字とアルファベットで表される。
桁が上がる表記としては、　0, 1, ..., F, 10(Fの次がないので桁上がり), ...19, 1A（9の次は）, 1B, ..., 1F, ..., FF, 100

IPポート番号やカラー表記(青：0000ff)などにも使われる。

　
[■色を16進表現で指定したい　<font color="#xxxxx">](http://www5e.biglobe.ne.jp/~komichan/html/htmlmain_color.html)
Chefを覚えるメモ(その1)

#ターゲット
このドキュメントはおかんにわかるような日本語で記載しています。
読み進めていけば、おかんがChefを使ってサーバを構築できるようになるという果てしない夢を実現するためのドキュメントです。

#アンチサーバー構築過激派の救世主
サーバーを作るのはすごくめんどくさい。
設定自体しんどいし似たようなことばっかり書いてあってすぐミスる。

そんなあなたにおすすめなのが「いいかんじにサーバの設定してくれるツールくん」、通称Chef(しぇふ)。

※なぜだかChefはお料理関連のお名前が多い。

　もしかしてユーザにわかりやすくしようとしたのかもしれないが、名前から内容が推測できなくて難易度が跳ね上がる仕様。
　(エンジニアはマジでこういう意味の分からない例えで初心者に寄り添ってるフリするのをヤメロ！
  AnimalクラスとかDogクラスとかいう文化は悪でしかない！)

#Chefができること
Chefに自主性はない。
ドラえもんじゃないので、Chef自身がいいかんじの設定値を考えてくれることはない。
設定したいサーバを勝手に探してくれることもない。
秘密道具なんてない。

でもChefは「言われたことをやる」ことに関しては超一流なのだ。
人間側が命令したことに対して、(良くも悪くも)忠実に遂行してくれる。

#ざっくり説明すると
まずはChefにサーバたち(今回は100台とする)を教える。
そんでもって、人間側が「ああしたいこうしたい」っていうメモ(Chefだとレシピっていう(笑))を書きだしておく。
そのレシピをChefに渡して、「さっき教えたサーバたちにこのレシピをバラまくのだ！」って指示する。
Chefはいそいそ100台にレシピをばらまく。

すると・・・いい感じに構成されたサーバ100台が出来上がっちゃうんだなこれが。
やったぜ。



→次回(その2)では、Chefをインストールして動かしてみるところまで書きます。
混合行列を可視化する

# 混合行列をヒートマップとして可視化する

```python
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
import seaborn as sns
import matplotlib.pyplot as plt
def result_heatmap(Y_test,Y_pred):
    print(accuracy_score(Y_test, Y_pred))
    cm = confusion_matrix(Y_test, Y_pred)
    print(cm)
    sns.heatmap(cm,annot=True, cmap='Blues')
```
[java] 例外をスローする

例外処理はjavaの基本であるが、認識違いをしていたので備忘録として残す。

##発生した問題
メソッドの呼び出し元に例外を投げたかったので、catchした例外をスローしようとすると、なぜかコンパイルエラーになっていた。

##実装
例えばタイムアウトエラーを投げる場合は以下の通りである。

~~~java
    public void foo(){
        try {
            fetch();
        } catch (SocketTimeoutException e) {
        }
    }

    public Integer fetch(){
        try {
            //Http通信
        } catch (SocketTimeoutException e) {
            throw e;//ここでコンパイルエラー
        }finally {
        }
        return number;
    }

~~~

##認識違い
throwのほかに
thorws句というのがあるがこれはcatch文と同じ働きがあると思っていた。しかし実際それがあるメソッドは**例外を投げる可能性がるメソッド**という意味であった。

そこで例外をスローしているメソッドにthrows句を付け足すとコンパイルエラーが消え、foo()でキャッチできるようになった。

##感想
基礎の基礎で躓くとは思わなかったが、今のうちに知れてよかった…
CsvHelper ver 13 からの仕様変更に注意

※CSVHelper は開発スピードが速いので、最新版では下のサンプルが動かないかもしれません。

c# で CSV を便利に扱えるライブラリ CsvHelper ですが、ver 13 から仕様変更があって、うっかりバージョンを上げるとはまります。

まずは、github の issues を一読。

https://github.com/JoshClose/CsvHelper/issues/1441

あと、change log も。

https://joshclose.github.io/CsvHelper/change-log/

従来のコードはこんな感じでしたが、

```c#

using (var csv = new CsvReader(reader))
{

}
```
ver 13 からは次のように書きます。

```c#
using System.Globalization;

using (var csv = new CsvReader(reader, CultureInfo.CurrentCulture))
{

}
```
Pythonで橋本環奈の画像を自動収集してみた！！

# スクレイピング

Webページから情報を自動で抽出する技術のことです
今回は橋本環奈さんの画像を検索エンジンの画像検索結果ページから自動で収集します

# 実装するもの

1. 画像検索結果のURLにアクセス
2. ページネーション
3. 画像のURLリスト取得
4. ダウンロード

詳細は以下の動画で紹介しています
https://youtu.be/gqzC0jHdpgw

英語版
https://youtu.be/XKrDqGPSfVw

# ソースコード

```python:scraping.py
import requests
from bs4 import BeautifulSoup
import urllib.request
import time

def scraping(url, max_page_num):
    # ページネーション実装
    page_list = get_page_list(url, max_page_num)
    # 画像URLリスト取得
    all_img_src_list = []
    for page in page_list:
        img_src_list = get_img_src_list(page)
        all_img_src_list.extend(img_src_list)
    return all_img_src_list


def get_img_src_list(url):
    # 検索結果ページにアクセス
    response = requests.get(url)
    # レスポンスをパース
    soup = BeautifulSoup(response.text, 'html.parser')
    img_src_list = [img.get('src') for img in soup.select('p.tb img')]
    return img_src_list


def get_page_list(url, max_page_num):
    img_num_per_page = 20
    page_list = [f'{url}{i*img_num_per_page+1}' for i in range(max_page_num)]
    return page_list

def download_img(src, dist_path):
    time.sleep(1)
    with urllib.request.urlopen(src) as data:
        img = data.read()
        with open(dist_path, 'wb') as f:
            f.write(img)
        
    
def main():
    url = "https://search.yahoo.co.jp/image/search?p=%E6%A9%8B%E6%9C%AC%E7%92%B0%E5%A5%88&ei=UTF-8&b="
    MAX_PAGE_NUM = 1
    all_img_src_list = scraping(url, MAX_PAGE_NUM)
    
    # 画像ダウンロード
    for i, src in enumerate(all_img_src_list):
        download_img(src, f'./img/kanna_{i}.jpg')


if __name__ == '__main__':
    main()

```
デザイナーのためのFish Shell入門(Mac編)

# 前置き
大抵の黒い画面が苦手って言う人ってコマンド覚えられないとか、なんか間違ったもの打つと怖いとか、ディレクトリの移動とかよくわかんないってなると思うんですよ。わかるわかる。そんなわけでデザイナーやコマンド叩き始めたけど難しいめんどくさい黒いのヤダヤダ怖いって人向けの記事です。

※ この記事は2018年に書きかけのまま発酵させていたものですが多分そのまま行けると思います。ダメだったら教えて。

## tl;dr（長すぎるから読みたくない）
1. Fish shellを使うとコマンドの打ち間違いとかが減るから使おう
2. まず[Homebrew](https://brew.sh/index_ja.html) をいれて
3. [Fish shell](https://fishshell.com/) をいれる
4. 黒い画面に `fish` って書いてreturnキーを押したら
5. おわり
6. VSCodeとか入れるといいよ（フロントエンド沼へ、ようこそ！）

## デザイナーを取り巻く昨今のあれこれ
最近はデザイナーもcui（ターミナル、コマンド、黒い画面と呼ばれしモノ）使わされることが増えてきましたね。コードも書く人なら特に。sass/scssとか使う環境だとか、タスクランナーが必要だとか。node.jsとか使ったり、Git使ったり。主にwebですね。
ただ、デフォルトだととても使いづらい。そしてプログラマーは環境整備までは面倒見てくれない事が多いです。わからないことがわからないので教えられないってのもありますね。しかたない。しかたなくねぇよ。

## 多数派はbash/zsh
コマンドラインの入門ってなるとデフォルトになってることが多いbashや、多数派に釣られてzshつかうと思うんですよ。ぼくはzsh。
bashやzshが悪いって言ってるわけじゃないです。設定すればいいでしょって話ですよね。
ただ、デザイナーがコマンドを触るとかそのくらいの感覚だとzshを導入して色々設定してっていうのが本当に最適かなぁってなると違うかなーって思うんです。もっと簡単に済ませられるはずだ。

## どうしろというのか
これをつかえ → [Fish shell](https://fishshell.com/)

# Fish shellをインストールしよう

## Homebrewを入れよう
[Homebrew](https://brew.sh/index_ja.html)* が入ってると便利ですよね。入ってる人は飛ばしていいです。

まずはターミナルを起動します。cmd + space とかで Spotlight を開き、Ter とか打てば出てきます。
これで黒い画面が開いたと思います。

次に [Homebrew](https://brew.sh/index_ja.html) を開き、ページ上部にあるコマンドを黒い画面に打ち込みましょう。
このステップ以降はもう怖いことはありません。大丈夫。一旦落ち着きましょう。リラックス。
途中で Y/n と表示されたら何も考えずに y でいいはずです。
一通り終わった気がしたら`brew -v`と打ってみてください。 Homebrew 2.x.x のように表示されていればOKです。
**Homebrew では他にNode.jsのバージョン管理など便利なものがたくさんあります。覚えておくといいでしょう。*
はい、怖い操作はここまでです。よく頑張りましたね。

## Fish shellを入れよう
黒い画面に `brew install fish` と入力します。
たまに Y/n と聞かれたら、何も考えずY でいいはずです。これでインストールは終わりです。簡単ですね。

## 外見を変えよう
黒い画面に `fish` と入力します。なんとなく黒い画面が変わった気がしましたか？
これで黒い画面は一時的にFishを使うように変更されました。
続いて `fish_config` と入力します。
`fish_config`と入力した時点でブラウザが自動で開いてるかもしれません。開いてない人は黒い画面に謎のファイルパスが出たと思います。出ましたか？ブラウザのURL欄にコピペしてみましょう。何か出ましたね。これがFishのコンフィグ画面です。

はい。なんとブラウザから編集できるんです。凄いですね。
さて、いくつかタブ分けされているのに気が付くと思います。基本使うのは2つまでかと。

1. Colors
  - シンタックスハイライトのパターンを設定します  
  - 見やすい色に変えましょう。もう黒い画面とは言わせません
1. Prompt
  - ディレクトリ名とか名前とか出るやつですね。ここもお好みで変えましょう
  - Gitを使っている場合、ブランチ名などを表示することが出来ます
 

これらを変更するだけでだいぶそれっぽくなります。

# 使ってみよう

まずは簡単に触ってみましょう。黒い画面を開いたら `fish` と入力してみてください。
これでfish shellに切り替わったはずです。

## ディレクトリを移動してみよう
黒い画面で `cd ` まで打って、Tabキーを押してみましょう。
はい、ディレクトリ名がずらっと出たかと思います。これは今黒い画面で開いている場所、つまりユーザー（あなた）のディレクトリ直下のはずです。
パス的には、ぼくであれば`/user/rTachibana`ですね。
ここで何かしらの文字を打ってからTabキーを押すと、存在するディレクトリの中からその文字を含むディレクトリないしファイルで絞り込めます。便利ですね。
これはコマンドでも利用できます。たとえば今いるカレントディレクトリ（場所）が知りたいときは`pwd`を使いますが、p を打った時点で予測で出ているはずです。これがFish shellを勧める理由です。
要は、あなたのコマンド入力を協力にサポートしてくれるわけです。この機能を使ってディレクトリの移動とかしていれば間違いを減らしつつ作業効率は上げられるはずです。

## コマンドの打ち間違いって怖いよね
上記でおわかりと思いますが、Fish shellを導入するだけで一気に難易度は下がるはずです。
なんか間違ったこと書いたらデータ吹っ飛びそうとか、黒い画面に疎いデザイナーさんはそう思うことも多いかと思います。仕方ないね。
ですが、最近は割とデザイナーにそういった操作を求めることも増えてるのが事実かと思います。デザイナーなのにGitを黒い画面で操作させられて苦労した人を知っています。それは極端かもしれませんが、多少触れたほうがいいのは事実。なので使いやすい環境を作ってしまいましょう。
ただし、間違ったコマンドを打ったらまずいかもという気持は大事にね。

## ついでにおすすめするもの
Mac使ってるエンジニアさんの大半はiTerm2っていう黒い画面を使ってると思います。あとはVSCodeっていうエディタが黒い画面内蔵みたいな便利ツールなので本当におすすめです。調べてみてね。
使い方を覚えた頃にはきっと、フロントエンド沼に足を踏み入れていることと思います。給料上がってるといいね。

おしまい。
【Xcode】StashとDiscardの使い方【Git】

#役割
###Stash
「とあるブランチで作業中だけど、いますぐやりたいことができた😓」

✅作業を一時的に待避させる。
✅待避させた作業を復元させる。

###Discard
「変更した内容を取り消したい😥」

✅xcodeの場合、選択したコードのみを取り消せる。
✅変更した1ファイル、全てのファイルを変更前に戻せる。

#git - stashの使い方

###✅作業を一時的に待避させる。

1.以下の画像のように、`Source control`を開く。
2.`Stash changes`を押す。
3.退避させた作業を保存完了👍
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/158b6ee2-e817-aa26-55d7-c9ff2b57697a.png)

###✅待避させた作業を復元させる。

1.`source control navigation`を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/e6e6fb87-f260-c270-1633-c77a6927de89.png)
2.`stashed changes`ファイルを開くと、退避させた作業が保存されているので選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/13a00170-f94a-26bf-2fff-8769f8937f42.png)
3.無事に復元できたら完了👍

#git - discardの使い方

###✅xcodeの場合、選択したコードのみを取り消す。
1.取り消したいコードの`青縦線`をクリックする。
2.変更したコードが青枠で囲われるので、`discard changes`を選択する
3.変更したコードが削除される👍
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/332c9936-671d-626d-0af4-a460fd98afe3.png)

###✅変更したファイルを変更前に戻す。
1.ファイル欄から、対象のファイルを右クリックし、`source control`を選択する。
2.`discard changes in ファイル名`を選択するとそのファイルの変更が全て取り消される👍
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/86fa3a1d-2246-6a41-c9ec-c0bf526038c2.png)

###✅全てのファイルを変更前に戻す。
1.xcodeの上部バーの`source control`を選択する。
2.`discard all changes...`を選択すると全てのファイルの変更が全て取り消される👍
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/158b6ee2-e817-aa26-55d7-c9ff2b57697a.png)

#参考
- https://qiita.com/chihiro/items/f373873d5c2dfbd03250
Railsでja.ymlが反映されない

railsにてja.ymlに追記をしたが反映されなかった


```ruby:ja.yml
#変更前（反映されなかったもの）
ja:   
    activerecord:
      attributes:
    　board:
          name: 名前
          title: タイトル
          body: 本文

#変更後
ja:   
    activerecord:
      attributes:
        board:
          name: 名前
          title: タイトル
          body: 本文
```

boardのインデントが問題で反映されなかったよう。
直したら反映された。
if __name__ == "__main__"ってなんだ

#if __name__ == "__main__":　の目的
一言で言うと、このPythonファイルが「**python ファイル名.py** というふうに実行されているかどうか」を判定するif文です。

```python
def main():
   print("Hello")
main()
```

```
$python hello.py
#>>>Hello
```

```
$import hello
>>>Hello
```

$import helloと書いただけでもプログラムが実行されてしまう...
これを防ぎたいので
if __name__ == "__main__"
と書いてる！！
UE4でテクスチャをアスペクト比そのまま張り付ける

以下のようにUE4でテクスチャをその縦横比そのまま貼り付けたかったのでやってみた。
もっと最適化できそうだけどとりあえずゴリゴリと。

![テクスチャ貼り付け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/c237cd3d-163b-412c-9aec-75854b4b4f02.png)

# マテリアルでする方法

## マテリアル本体

パラメータとして以下のものを渡す。

* WinWidth:ウィンドウの横サイズ（縦横の比率だけ使う）
* WinHight:ウィンドウの縦サイズ（縦横の比率だけ使う）
* TexWidth:テクスチャの横サイズ（縦横の比率だけ使う）
* TexHight:テクスチャの縦サイズ（縦横の比率だけ使う）
* Texture:テクスチャ

![material.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/3b434229-f445-bd2c-ea77-af962740334d.png)

[BluePrint](https://blueprintue.com/blueprint/a3153akc/)

## Blueprintでのマテリアルの設定

上のマテリアルを以下のように利用する。
スクショ中のStatic Meshは正方形のStaticMeshでx, yがそれぞれ縦横。

![material利用.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/f7942a03-8a06-0a41-9a16-d1801b2d4644.png)

# RenderTarget2Dに対してDrawTextureする方法

## DrawTextureを実施する関数

基本的にはマテリアルの方と同じことをしている（つもり）。

![drawtextureblueprint.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/379f8fc1-7e1c-eca4-2165-3bdff75073ce.png)

[BluePrint](https://blueprintue.com/blueprint/uf94ho1c/)

テクスチャのサイズ取得のために以下のようなC++コードを利用している。

```c++:MyUtils.h
#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Engine/Texture.h"
#include "MyUtils.generated.h"

UCLASS()
class TEXTUREASPECTRATIO_API UMyUtils : public UObject
{
	GENERATED_BODY()
	
public:
	UFUNCTION(BlueprintCallable)
	static bool GetTextureSize(const UTexture* Texture, FVector2D& Size);
};

```

```c++:MyUtils.cpp
#include "MyUtils.h"

bool UMyUtils::GetTextureSize(const UTexture* Texture, FVector2D& Size)
{
	if (!Texture->Resource)
	{
		return false;
	}

	Size.X = Texture->Resource->GetSizeX();
	Size.Y = Texture->Resource->GetSizeY();
	return true;
}
```

## 関数呼び出し元

上の関数を以下のような形で呼び出す。
スクショ中のCanvasは正方形のStaticMeshでx, yがそれぞれ縦横。

![drawRenderTarget2D.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/aa394dbd-b895-0588-be4c-9958aab7c45b.png)
Visual Studio Code + clasp で Google Apps Script 開発（Windows編)

## はじめに

Google Apps Script の開発するうえで、clasp を導入することでWebエディタでの開発に比べて開発効率が大きく向上します。

ここでは clasp の導入方法について説明していきます。

### 導入するメリット

- ソースコードがローカルに存在するので、バージョン管理が簡単！
- 好きなエディタで開発できる！
- コードハイライト
- より向上した Intellisense (自作のメソッドも Intellisense の対象に)
- JS5以降で導入された新しい機能が一部利用可能(clasp push した時に自動的に変換される)
    - アロー式
    - const/let による変数宣言
    - などなど
- TypeScript でプログラムを記述することも可能

## 大前提

1. Visual Studio Code をインストールします。
    - Visual Studio Code については省略。

1. Node.js をインストールします。
    - https://nodejs.org/en/download/ から環境にあったものをダウンロードし、インストールします。
    - `npm` コマンドにパスが通っていることを確認します。

        ```bat
        > npm --version
        6.12.1
        ```
        - 上記のようにバージョンが表示されればOKです。
        - コマンドが見つからない場合は、Node.js をインストールしたディレクトリに `npm.cmd` が存在するはずなので、環境変数 PATH に追加して再度上記コマンドを実行し確認します。

1. 以降のコマンド作業はすべて Visual Studio Code のターミナルから行います。
    - ショートカット(`Ctrl+Shift+@`)、またはメニューから `ターミナル - 新しいターミナル` を実行することで新しいターミナルが起動します。

## clasp のインストール

```bat
> npm install @google/clasp -g
...
+ @google/clasp@2.3.0
```

### clasp コマンドにパスが通っていることを確認

```bat
> clasp --version
2.3.0
```
- 上記のようにバージョンが表示されればOKです。
- コマンドが見つからない場合は、`clasp` へのパスを環境変数 `PATH` に追加して(コマンドプロンプトを一旦終了後に)再度上記コマンドを実行し確認します。

ここまでは最初に１回だけ行います。

---

## Google アカウントへログインする

Google アカウントにログインします。接続するGoogleアカウントが変わるごとに作業が必要です。

```bat
> clasp login
```

- インターネットブラウザが起動し、Googleの認証画面に遷移するので認証します。
- `%USERPROFILE%\.clasprc.json` に認証情報が保存されます。

## Google アカウントからログアウトする
```bat
> clasp logout
```
もしくは、`%USERPROFILE%\.clasprc.json` を削除します。

---

## Google Apps Script プロジェクトごとに必要な作業を行う

ここからは Google Apps Script プロジェクトごとに作業が必要です。

開発プロジェクトで使用するディレクトリを作成し、以降はこのディレクトリで作業します。
ここでは `C:\workspace` を作業ディレクトリとし、ソースは `./src` に保存するものとして話を進めます。

```bat
> mkdir C:\workspace\src
> cd /d C:\workspace
```

### npm を使う準備

```bat
> npm init -y
```

これで、作業ディレクトリに `package.json` が作成されます。

### Google Apps Script の定義ファイルをインストール

```bat
> npm install @types/google-apps-script -S
...
+ @types/google-apps-script@1.0.10
```
作業ディレクトリの `node_modules\@types\google-apps-script` 以下に定義ファイルがインストールされます。

### Google Apps Script に新しいプロジェクトを作成
    
```bat
> clasp create --type standalone --title testApp --rootDir ./src
```

実行すると作業ディレクトリに以下の２ファイルが作成されている。

- src/appscript.json
- .clasp.json

### appscript.json のタイムゾーン変更します。

```json
{
    "timeZone": "Asia/Tokyo",
    "dependencies": {
    },
    "exceptionLogging": "STACKDRIVER"
}
```

### Gooel Apps Script の編集画面を開く

```bat
> clasp open
```

### ローカルから Google Apps Script へ push

```bat
> clasp push
```
SPSS 備忘録

#mac os 用ヘルパーアプリケーションの設定

ヘルパーアプリケーションとは、SPSS modelerでstatisticsのノードを使う場合の設定です。

/Applications/IBM/SPSS/Statistics/26/SPSSStatistics.app/Contents/MacOS/stats

[windowsの場合は、IBM knowledge centerに記載があります。](https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_15.0.0/com.ibm.spss.modeler.help/helper_applications.htm)
例: C:\Program Files\IBM\SPSS\Statistics\26\stats.exe


#mac os catalinaでファイルが表示されない問題
[Mac 10.15 (Catalina) のセキュリティ強化に伴うSPSS Statistics環境の対応について-フォルダアクセス対応-](https://www.ibm.com/support/pages/mac-1015-catalina-%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%BC%B7%E5%8C%96%E3%81%AB%E4%BC%B4%E3%81%86spss-statistics%E7%92%B0%E5%A2%83%E3%81%AE%E5%AF%BE%E5%BF%9C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%AF%BE%E5%BF%9C)
【GCP】 GAE を使用してPythonウェブアプリケーション実行・デプロイ

## 始める前に
**1. GCPプロジェクトを作成**
Cloud shellを開いて次のコマンドを実行
`gcloud project create [your_project_id]`
**2. プロジェクトでAppEngineアプリケーションを初期化し、リージョンを選択**
`gcloud app create --project=[your_project_id]`
**3. 前提条件をインストール**
次のコマンドを実行して、Python 用の App Engine 拡張機能が含まれている gcloud コンポーネントをインストールします。
`gcloud components install app-engine-python`
:bulb:インストールされたコンポーネントリストを取得は次のコマンドを実行
`gcloud components list`
こんな風に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/a45833ee-2630-7680-b15d-621dce3c6399.png)
**4. サンプルアプリを準備**
Hello World サンプルアプリ リポジトリのクローンをローカルマシンに作成します。
`git clone https://github.com/GoogleCloudPlatform/python-docs-samples`

## ローカルマシン上で アプリ を実行する
**1. プロジェクトの外部のディレクトリに隔離された Python 環境を作成し、それを有効化します**
virtualenv [myenv] 環境が作成されたチェック
- virtualenv がインストールされるか確認 `pip3 list`
- 結果リストに[virtualenv]がない場合、インストール `sudo pip3 install virtualenv `
- virtual environmentを作成 `virtualenv myenv`若しくは`virtualenv -p python3 myenv`
- Active your virtual environment `source myenv/bin/activate`
:bulb: 更に[Pythonの仮想環境を設定](https://qiita.com/huong/items/262810e33e10363e3a2c)の記述を参考
**2. プロジェクト ディレクトリに移動し、依存関係をインストール**
`cd python-docs-samples/appengine/flexible/hello_world`
`pip freeze > requirements.txt`
`pip install -r requirements.txt`
**3. アプリケーションを実行**
`python main.py`
:interrobang: 以外のエラー発生
> ModuleNotFoundError: No module named 'flask'
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/e92520eb-ddff-441a-8db2-8bdbc654a6a8.png)


:bulb: 解決方法：次のコマンドを実行
`pip install flask`
**4. ウェブブラウザに次のアドレスを入力**
`http://localhost:8080`
## アプリをApp Engine にデプロイして実行する
**1. hello_world ディレクトリで次のコマンドを実行し、Hello World アプリケーションをデプロイ**
`cd python-docs-samples/appengine/flexible/hello_world`
`gcloud app deploy`
**2. ブラウザを起動し、http://YOUR_PROJECT_ID.appspot.com にアクセスしてアプリを表示**
`gcloud app browse`

## 参考記事
- [App Engine フレキシブル環境での Python のクイックスタート](https://cloud.google.com/appengine/docs/flexible/python/quickstart?hl=ja#deploy_and_run_hello_world_on_app_engine)
- [Hello World アプリ](https://github.com/GoogleCloudPlatform/python-docs-samples)
 - python-docs-samples/appengine/flexible/hello_world
- [How to install virtualenv](https://gist.github.com/Geoyi/d9fab4f609e9f75941946be45000632b)
- [move about gcloud command](https://cloud.google.com/sdk/gcloud/reference)
- [Setting up a Python development environment](https://cloud.google.com/python/setup?hl=ja#installing_the_cloud_client_libraries_for_python)
Rails チュートリアル 5.0（第4版）演習と解答(10.2.1)

# 演習内容
フレンドリーフォワーディングで、渡されたURLに初回のみ転送されていることを、テストを書いて確認してみましょう。次回以降のログインのときには、転送先のURLはデフォルト (プロフィール画面) に戻っている必要があります。ヒント: リスト 10.29のsession[:forwarding_url]が正しい値かどうか確認するテストを追加してみましょう。

# 解答

## test結果①　⇨　red
ログイン前にgetでrequestしたURLが、session[:forwarding_url]と一致していればOKじゃん！と考え、以下の記載にしましたが、あえなくred

```user_edit_test.rb
  test "successful edit with friendly forwarding" do
    get edit_user_path(@user)
    # forwarding_urlが正しい値かのチェック
    assert_includes session[:forwarding_url], edit_user_path(@user) 
    ・・・
```

以下の結果見ると`edit_user_path(@user)`はドメインなし、`session[:forwarding_url]`にはドメインありの絶対パスのため一致せず。

``` terminal
FAIL["test_successful_edit_with_friendly_forwarding", UsersEditTest, 0.437811752000016]
 test_successful_edit_with_friendly_forwarding#UsersEditTest (0.44s)
        --- expected
        +++ actual
        @@ -1 +1 @@
        -"/users/762146111/edit"
        +"http://www.example.com/users/762146111/edit"
```
## test結果②　⇨　green

上記①より`edit_user_path(@user)`の内容が、`session[:forwarding_url]`に含まれている、という条件で検証すればいいのでは？と思い[rails guide](https://railsguides.jp/testing.html)で条件満たすものないか探したところ、以下のassertがありました。

```
assert_includes( collection, obj, [msg] )
→　assert_include：objはcollectionに含まれると主張する。
```

というわけで以下のテストコードにしたところ、晴れてgreenとなりました。

```user_edit_test.rb
 test "successful edit with friendly forwarding" do
    get edit_user_path(@user)
    # forwarding_urlが正しい値かのチェック
    assert_includes session[:forwarding_url], edit_user_path(@user)
 ```
laravel6.0でのauthの実装

完全に自分用のメモです。

###composerでlaravel/uiをインストール
6系ではvue.jsやreactを使うにはuiコマンドによってインストールする必要がある。

```
$ composer require laravel/ui --dev
```
###authコマンドを実行

```
$ php artisan ui vue --auth
```
または

```
$ php artisan ui react --auth
```
###npmのインストール、ビルド

```
$ npm install

$ npm run dev
```
検証曲線をプロットするメソッド

# 検証曲線をプロットするメソッド
## input
- X_train:トレーニング特徴量
- Y_train:トレーニング目標値
- pipe: パイプライン
- param_range: 変化させたいパラメータの値が入った配列
- param_name: 変化させるパラメータ(<パイプライン上の処理名>__<パラメータ>)  
*パイプラインを出力することでパイプライン上の名前は確認できる。

## 検証曲線について
適切なパラメータを視覚的に探るためにパラメータを変化させた時の正確率を計測する。
（グリッドサーチも試すといい）

```python
from sklearn.model_selection import validation_curve
def draw_validation_curve(X_train,Y_train,pipe,param_range,param_name):
    train_scores, test_scores = validation_curve(
                    estimator=pipe, 
                    X=X_train, 
                    y=Y_train, 
                    param_name=param_name, 
                    param_range=param_range,cv=9)

    train_mean = np.mean(train_scores, axis=1)
    train_std = np.std(train_scores, axis=1)
    test_mean = np.mean(test_scores, axis=1)
    test_std = np.std(test_scores, axis=1)

    plt.plot(param_range, train_mean, 
             color='blue', marker='o', 
             markersize=5, label='training accuracy')

    plt.fill_between(param_range, train_mean + train_std,
                     train_mean - train_std, alpha=0.15,
                     color='blue')

    plt.plot(param_range, test_mean, 
             color='green', linestyle='--', 
             marker='s', markersize=5, 
             label='validation accuracy')

    plt.fill_between(param_range, 
                     test_mean + test_std,
                     test_mean - test_std, 
                     alpha=0.15, color='green')

    plt.grid()
    plt.xscale('log')
    plt.legend(loc='lower right')
    plt.xlabel('Parameter C')
    plt.ylabel('Accuracy')
    plt.ylim([0.8, 1.0])
    plt.tight_layout()
    plt.show()
    
```
flatpickr適用した要素を動的に追加しflatpickrを適用する

#やりたいこと
現在タイムピッカーに`flatpickr`を用いているのですが、
flatpickr適用した要素を動的に追加した際に、カレンダーがでない
`altInput`を`true`(自動的に`hidden`属性の入力欄を作り見た目と値を分離するオプション)の場合、片方に適用しないといけない等少してこずったのでメモです

#やりかた
flatpickrはインストール済み

```html:index.html
<input type="text" class="js-attachFlatpickr" name="date">
```

```js:app.js
flatpickr('.js-attachFlatpickr',{
    altInput: true,
    altFormat: "m月d日",
    dateFormat: "ymd",
    allowInput: true
})
```

上記のようにすると入力欄の表示は`m月d日`になりますが、送信した場合`ymd`の形式で送信されます

そして要素をコピーする場合、下記のようにすると適用はできます。
できます**が**入力欄が二つになります。

```js:app.js
let row = $('.js-attachFlatpickr');
let new = row.clone(true);
new flatpickr(row,{
    altInput: true,
    altFormat: "m月d日",
    dateFormat: "ymd",
    allowInput: true
})
new.insertAfter(row);
```

これは`altinput`を適用した場合、一つの`input`が下記のように自動的に変更されるためです

```html:index.html
<input type="hidden" class="js-attachFlatpickr" name="date">
<input type="text" class="js-attachFlatpickr input">
```

2つに増えた`input`にflatpickrを適用
→それぞれに`hidden`と見た目用の`input`ができる
→計4つになるが、見えているのは二つ
という状態になります

cloneして消します
`hidden`のほうに`name`があるのでそちらに適用しないと値が送られないです
rowをそもそも、hiddenのほうとるのでもいいかも

```js:app.js
let row = $('.js-attachFlatpickr');
let new = row.clone(true);
new.each(function(){
    if(this.type !== 'hidden'){
         $(this).remove();
    }
})
new flatpickr(row,{
    altInput: true,
    altFormat: "m月d日",
    dateFormat: "ymd",
    allowInput: true
})
row.insertAfter();
```
【DBeaver】【MySQL】Error: access denied for user 'root'@'localhost'の対処法

#概要
そもそもDBeaverとは
>マルチプラットフォーム対応のデータベースGUIツールで MySQL, PostgreSQL, MariaDB, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Derby など、多くのデータベースに対応しています。
Enterprise Edition では MongoDB, InfluxDB, Apache Cassandra, Redis, Apache Hive など NoSQL / BigData database にも対応しています。

>[TeamSQL もいいけど、 DBeaver もいいぞ](https://qiita.com/nanasess/items/609c7cda4adee344221c)より引用

今回、DBeaverからMySQLにアクセスしようとしたらタイトルに書いてあるエラーが出て、それが解決できたので自分がやったやり方を書きたいと思う。

#環境
DBeaver 6.3.0
MySQL 5.7
Windows10

#原因
ざっくり言うとMySQLにsudo無しでログインできるようにしたら解決した。
そもそも自分はMySQLにsudo無しでログインできるようになっていなかったのでそれが原因だった。

#やり方
ほぼこの記事の通りにやった。
[MySQL5.7でsudo無しでrootログイン](https://qiita.com/jack-oat/items/371986346dd969001612)

自分は途中でつまづいたところがあったので一応説明したいと思う。
まずはMySQLにsudoを使ってログインする。

```
sudo mysql -u root -p
```

MySQLにログインしたら下記コマンドを実行する。
`'`で囲まれたpasswordは自分で設定したものを打ち込む。
パスワードが生で見えるのでちょっと怖い。

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
```

それで自分はこれを実行したら下記のエラーが出た。

```
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```

自分はvalidate password プラグインを入れていたのでこのエラーが起こってしまった。なのでこれを取り除きたいと思う。
MySQLで以下を実行する。

```
mysql> uninstall plugin validate_password;
```

消せたかどうかはこれで確認できる。

```
mysql> SHOW VARIABLES LIKE 'validate_password%';
Empty set (0.00 sec)
```

最後に設定を反映するコマンドを実行して終了。

```
mysql> FLUSH PRIVILEGES;
```

以下を実行して入れたらsudo無しログイン成功

```
mysql -u root -p
```

これで自分はDBeaverからMySQLに接続できるようになりました。

#参照元
[TeamSQL もいいけど、 DBeaver もいいぞ](https://qiita.com/nanasess/items/609c7cda4adee344221c)
[MySQL5.7でsudo無しでrootログイン](https://qiita.com/jack-oat/items/371986346dd969001612)
[MySQL5.7のvalidate_passwordとかいうクソ機能殺す](https://thr3a.hatenablog.com/entry/20160229/1456727388)
localhostをスマホ実機で確認するBrowserSync

iPhoneなどスマホ実機でプレビュー確認したい場合、
開発中で自分だけ確認できればいい場合に使える方法をメモしておきます。
いちいちサーバーにUPするのが激しく面倒くさい…:frowning2:

BrowserSyncを使ってサーバーUPの手間を省いて確認できます。
Localの確認だけでなく、実機で確認できるとは便利です。


#環境準備

以下の2つの方法で確認URLがわかります。

##【方法1】開発PCと実機を同じWi-FiにつなぎIPアドレスにアクセス

Macの場合
IPアドレスの確認 `メニュー＞システム環境設定＞ネットワーク`

![cead211acff8cb4b0c64996e4db2586c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/cb091a60-22b2-d493-de71-5b0a09706eb9.png)

##【方法2】TerminalでAccess URLsを確認

```
[Browsersync] Access URLs:
 --------------------------------------
       Local: http://localhost:3000
    External: http://192.168.11.11:3000 ←確認URL
 --------------------------------------
          UI: http://localhost:3001 ←BrowserSync設定
 UI External: http://localhost:3001
 --------------------------------------
```

#まとめ

今まで
コードを書く→FTPソフトで更新したファイルをすべて手動でサーバーUP→リロード→確認

BrowserSync
コードを書く→ ~~FTPソフトで更新したファイルをすべて手動UP~~ →ライブリロード→確認

こうなります！！

1番面倒な手動でサーバーUPの工程が無くせて時間が大幅に節約できます。便利便利:v:
PHP出来るけど全然WordPressわからないので使ってみる（環境準備編）

僕はPHPだとLaravelはかなり熟知していると思ってます。
だがしかし、WordPressは全くわからない。
調べたり、ドキュメント見たり、ソースをみて追っていけばそりゃわかるでしょう。
でも昔からWordPressのソースコードぐちゃぐちゃであまり好きじゃなくて、投稿機能とか自分で作ればよくね？って思ってました。（今はきれいなのかな？）
あとプログラムがわからない人がとりあえず使うイメージが勝手にあって毛嫌いしてました。

しかし、案件でWordPressが多いのも事実ですし、ノンプログラマから「WordPressも使えないの笑」とか言われたら腹が立つので、ちょっとずつ出来るようにしようと思う今日このごろ。
でも普通の使い方はださいので
WordPress REST API + Nuxt.js とかで最初から一歩上の使い方をしたろうではありませんか！

というわけで環境構築から。

# 環境準備
環境構築はDockerでサクッと行きましょう。
`docker-compose.yaml`を用意して、

```yaml

version: '2'

services:
   db:
     image: mysql:5.7
     container_name: test-wp-db
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     image: wordpress:latest
     container_name: test-wp
     depends_on:
       - db
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
```

以下のコマンドで起動！（-dオプションはバックグラウンド実行）

```
$ docker-compose up -d
```

# アクセス
`http://localhost:8000` にアクセスするとWordPressの初期設定画面が出てきます。
設定をポチポチしてやれば準備完了！
環境準備はすごい簡単でした！
次は、WordPress REST APIを使っていきたいと思います。

# 参考
[docker-composeでwordpress環境をサクッと構築する](https://qiita.com/mom0tomo/items/7e611ac829863d4c5c82)
【Git】間違えてブランチを切ってpushしてしまったときの対処法

# 間違えてブランチを切ってpushしてしまったときに正しいブランチから切りなおす方法
```
$ git rebase --onto 新しく派生元にしたいブランチ名 間違えて派生元にしたブランチ名 派生したブランチ名
$ git push -f origin 派生したブランチ名
```
Unity で SQLite を使う基本的な使い方まとめ


#Unity で SQLite を使う基本的な使い方まとめ

Unity の更新がはやいのと Android が x64 対策でいろいろと設定方法が変わっているように思いました。
困ったのは、今でも `.so` ファイル形式をインポートして設定する方法がよく検索にあがることです。

Windows 環境だと `.so` ファイルをコンパイルして用意するのは、なかなか困難ですが、現在は `AAR` 形式を公式の SQLite.org からダウンロードして、そのままインポートすれば OK になってました。

記事にまとめたので、ショートカットをメモ。

- [Android/Windows 環境における SQLite の使い方の基本](https://shikaku-sh.hatenablog.com/entry/unity-how-to-use-sqlite-in-standalone-android)
- [SQLite の使い方（補足）](https://shikaku-sh.hatenablog.com/entry/unity-how-to-use-sqlite-add-to-that)
- [SQLite (Insert, Update, Select) のテスト](https://shikaku-sh.hatenablog.com/entry/unity-sqlite-test-insert-update-select)

# Android の 64 ビット対策

- [Android の 64 bit 対応と APK ファイルのテスト（アプリ対応）](https://shikaku-sh.hatenablog.com/entry/unity-android-app-ready-for-64bit-apk)

> Unity はビギナーなので、間違いがあったらすいません。（おしえてください）
Docker(+ Docker-Compose) に Redis を入れる

# Docker-Compose 環境に、Redis を入れる
今度は NoSQL として有名？な Redis を入れてみる。
NoSQL、Redisの詳しい話は、参考サイトを見てもらうとして。

## NoSQL って何？
- Not only SQL の略
  - 逆に、YeSQL なんてのもあるらしい

> [NoSQL - Wikipedia](https://ja.wikipedia.org/wiki/NoSQL)
> NoSQL（一般に "Not only SQL" と解釈される）とは、関係データベース管理システム (RDBMS) 以外 のデータベース管理システムを指す おおまかな分類語 である。関係データベースを杓子定規に適用してきた長い歴史を打破し、それ以外の構造のデータベースの利用・発展を促進させようとする 運動の標語 としての意味合いを持つ。 

## Redis って何？
- NoSQLデータベースの一つ
  - 今回の場合とかみたいに、KVS(キーバリューストア)として使われたりする
  - RDBと比べて高速で処理が出来たりする
     - RDBと組み合わせて使ったりもする

> [Redis - Wikipedia](https://ja.wikipedia.org/wiki/Redis)
> Redisは、ネットワーク接続された永続化可能なインメモリデータベース。連想配列、リスト、セットなどのデータ構造を扱える。いわゆるNoSQLデータベースの一つ。オープンソースソフトウェアプロジェクトであり、Redis Labsがスポンサーとなって開発されている。

## Redisをインストールする
### フォルダは作っておく

```
mkdir RedisTest
cd RedisTest
```

### docker-compose.yml を書く

docker-compose.yml の中身はコレ。

```docker-compose.yml
version: '3'

services:
  #Redis
  redis:
    image: "redis:latest"
    ports:
      - "6379:6379"
    volumes:
      - "./data/redis:/data"
```

後で気づいたんだけど、この「Volumes」の項目が、
『データの永続化』をする際にどこに保存しておくかの設定のようだ。

この項目が存在しない場合、 docker-compose down -> docker-compose up すると、
Redisのデータが消えます。Redisのデータは通常はキャッシュとして扱うようなので、
消えても良いのが理想らしいのだけど、意図するかどうかは意識した方が良さそう。

### Docker-Compose で Redis 起動

```bash
docker-compose up -d --build
```

### Docker起動確認

```
$ docker-compose ps
      Name                     Command               State                 Ports
----------------------------------------------------------------------------------------------
mysqltest_redis_1   docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp
```

### Redis 確認

```
$ docker exec -it mysqltest_redis_1 bash
root@ec5fc90e5ee3:/data# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
```

中身が無いのが確認出来た。データとかはこれから。

# 参考
- NoSQLについて勉強する。
  - https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1
- RDBMSの苦手な処理をカバーする、気の利いたNoSQL「Redis」
  - https://japan.zdnet.com/article/35063104/
- RedisとElastiCacheを分かりやすくまとめてみた
  - https://qiita.com/gold-kou/items/966d9a0332f4e110c4f8
- Redisの特徴について容易にまとめてみた
  - https://qiita.com/tomu28/items/8f13145bd8d45523a195
ビット演算による商(切り捨て)・余り計算

ビット演算は低級言語に近いのでどんな言語においても速い.
2 の n 乗での割り算で特に便利.

# 一般 (JavaScript)

商 : 割り算の解(小数)に対して 0 を OR 演算
(余 : % 演算子を使用, ビット演算じゃない)

```javascript:ex.17÷6の商と余り
q = (17/6)|0; // 商 = 2
r = 17%6 // 余り = 5
```

結局途中で小数が発生するからそんなに速くはないが, Math.floor よりは軽い.

# 2 の n 乗 (1, 2, 4, 8, 16...) での割り算の場合 (JavaScript, Python)
商 : 左へ n ビットシフト
余 : (2^n)-1 で AND 演算

```javascript:ex.17÷8の商と余り
q = 17>>3; // 商 = 2
r = 17&7; // 余り = 1
```
ちなみに

```javascript:バイナリ周り
// N bit のデータを格納するのに必要な byte 数は
byteLength = 1 + ((N-1)>>3);
// Uint8Array の先頭から N ビット目を取り出すには
bitN = uint8array[N>>3] & (1<<(N&7));
```
G SuiteとCloud Identity

雑記。
G Suite初心者、すごく混乱したのでメモ。

Cloud Identityのユーザー追加を試してみようと思った。
が、これってG Suiteのユーザー追加なのか？と悩みだす。
Cloud Identity Freeのユーザー追加は無料だけど、G Suiteだとお金がかかってしまう。。。

ドキュメントみてみたけど、ほぼ同じ。
- G Suiteでのユーザー追加：　https://support.google.com/a/answer/33310
- Cloud Identityでのユーザー追加：　https://support.google.com/cloudidentity/answer/33310

まぁ、￥６８０、最悪１食我慢すれば取り返せるだろうと、エイヤ！とユーザー追加。

めでたく、Cloud Identityのユーザーとして追加された模様。
メールなどの機能が限定されたユーザーが出来上がる。

・Cloud IdentityのユーザーのGoogleアプリパネル
<img width="356" alt="Google 2020-02-07 15-09-04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/774c2acc-340c-af34-b357-a0e4660c3b1d.png">

・G SuiteユーザーのGoogleアプリパネル
<img width="346" alt="ユーザーを個別に追加する - G Suite 管理者 ヘルプ 2020-02-07 15-09-28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/f1b2ae73-bb1f-e3f1-8b49-4d957d7f4b02.png">

のちのち、色々調べると、Cloud Identityユーザー追加時にG Suiteユーザーに自動的にライセンス付与するようにしておくと、Cloud Identityユーザー追加＝G Suiteユーザー追加になる模様。
デフォルトOFFっぽいですが、Cloud Identityユーザー追加時には確認しておいた方がよさそう。
<img width="911" alt="管理コンソール 2020-02-07 15-11-58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/94eee301-9998-f110-4ebb-ee7b4bec2494.png">
[jis]hhkbをmacで使用する時用のメモ

# HHKBをmacで使うことにしたのでその時のメモ
最近HHKBを買ったのではなく、使わず眠っていたので久々に引っ張り出してきました。
久々に使おうと思ったら結構悩んだのでメモを残しておきます。

## 用意するもの(準備)
- hhkb本体
- karabinar-elementsをダウンロード
  - macの方はこちらから( https://pqrs.org/osx/karabiner/ )

## 設定
<img width="1002" alt="スクリーンショット 2020-02-07 15.01.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163415/bbd4dc8e-ddf9-e204-909c-77b416622327.png">

ダウンロードしたkarabinar-elementsを開くとこんな画面が出てくるかと思います。(上の画像は自分の設定が入っているだけなのでデフォルトだと何もないです。)

自分は上記のように5つだけ設定しています。

では1行づつ見ていきます。

### caps_lock left_control
caps_lockはmacのキーボードだと一番左下にあるボタンです。
macにHHKB繋げるだけだとcontrolボタンがなくなってしまいます(自分が見つけられてないだけかも)。
controlボタンって結構使うから個人的には必須。
例えばターミナルでコマンドキャンセルするときとか。。(ctl+c)

脱線しましたが、理由はわかりませんがhhkbのcontrolボタンがcaps_lockボタンになっていたので
この設定にしました。

### international4 カナキー
international4はHHKBのスペースキーの左隣にある(\)←こんなマークのキーのことらしいです。
それをカナキーにしました。

### international5 英数キー
international5はHHKBのスペースキーの右隣にある()←こんなマークのキーのことらしいです。(マークはちょっと違うけど勘弁)
これは英数キーにしました。

### left_command left_option
left_commandはHHKBのinternational4キーの左隣にあるキーです。(altって書いてあるけどなぜかleft_commandになってる)
これをoptionキーにしました。

### left_option left_command
left_optionキーはleft_commandキーの左隣にある菱形のマークのキーですね。
これにはleft_commandを割り当てました。

## キーボード繋いでるときのmac自体のキーボード操作
自分はmacの純正キーボードの上にhhkbを置いているので純正キーボード操作は無効にしています。
設定方法は以下の画像のようにdevicesのタブを開いてスクショの項目にチェックを付ければokです！

<img width="997" alt="スクリーンショット 2020-02-07 15.16.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163415/52838583-b705-75a4-8277-8e2657de281c.png">

## まとめ
毎回PCを変えるとここらへんで若干時間取られるのでメモ程度に残しておきました。
よかったら参考にしてみてください。
【Python】リストの要素だけを並べて表示させる【縦並び、横並び】

#はじめに
オンラインでのプログラミング学習、スキルチェックなどで出力の方法が限定されていることが多々あると思います。
自分も答えは出ているのに思ったように出力できないことがあったので調べたことをまとめてみました。


#リストの要素を縦に並べて表示させる
[方法１]リスト内包表記の中にprint()を入れる

```ex.py
L = ["a","b","c","d"]

[print(i) for i in L]
```


[方法２]１文字ずつ文字列をスライスしてprint()を入れる

```ex.py
L = ["a","b","c","d"]

for i in L[0:]:
print(i)
```

いずれにしても実行結果は以下のようになります。
>a
b
c
d



#リストの要素を横に並べて表示させる
###.join()を用いることで空白を開けて表示させる


```ex.py
L = ["a","b","c","d"]

L=' '.join(L)
print(L)
```

実行結果は以下のようになります
>a b c d

`','.join`を用いると
>a,b,c,d

となるように.join()の前の''内の要素は自由に設定可能です。

###.join()を用いない方法
.join()を用いなくても出力することはできます。

```ex.py
L = [['a', 'b', 'c', 'd']]
print(*L[0])
```
実行結果
>a b c d


###数字（int値）で.join()は使えない
※リスト内の値がint値のみの場合.join()は使用不可（エラーが出ます）
このような時は、str値に変換してから.join()を使います

```ex.py
L_int = [1, 2, 3, 4]

L=[str(a) for a in L_int]
L=" ".join(L)
print(L)
```
実行結果は以下のようになります
>1 2 3 4

#最後に
今回記載した以外にも何か方法があれば教えてもらえると嬉しいです。