OmniAICreator/Qiita-1.07M huggingface dataset:
【Windows】今すぐアンインストールするべきWindowsのプログラム12選（ニュース紹介）

技術ニュース漁りをしていたら

**[今すぐアンインストールするべきWindowsのプログラム12選](https://www.lifehacker.jp/2021/03/231356tag10-windows-programs-uninstall.html)**

という記事を発見。基になった記事はどうやらこれ

https://www.makeuseof.com/tag/10-windows-programs-uninstall/

海外の記事ですね。
さっそく**今すぐアンインストールするべきWindowsのプログラム12選**を転記

>1.QuickTime
2.CCleaner
3.PCクリーナー
4.uTorrent
5.Adobe Flash Player・Shockwave Player
6.Java
7.Microsoft Silverlight
8.ツールバーとブラウザ拡張機能
9.Coupon Printer for Windows
10.メーカーがプレインストールしたブロートウェア
11.Windows 10のブロートウェア
12.WinRAR

そうかJavaも不要なのか・・・

>Javaは独特のランタイムアプリで、デスクトップ上のJavaとブラウザ用のJavaプラグイン（セキュリティの問題があることで有名）の2つのコンポーネントがあります。
以前はかなり一般的でしたが、現在ではほとんどのWebサイトで使用されていません。この記事の執筆時点で、W3Techsは、0.02%未満のWebサイトしかJavaを使用していないとしています。
ChromeとFirefoxの最新バージョンはJavaをサポートしていないことから、Javaは以前よりもセキュリティ上の問題が少なくなっています。Android開発者かJavaに依存する特殊なソフトウェアのユーザーでない限り、Javaはアンインストールしたほうがいいでしょう。
アンストールしても、PCの使い勝手に違いを感じることはないはずです。

とのこと。詳しくはサイトを参照してください。

**参考リンク**
**[12 Unnecessary Windows Programs and Apps You Should Uninstall](https://www.makeuseof.com/tag/10-windows-programs-uninstall/)**
**[今すぐアンインストールするべきWindowsのプログラム12選](https://www.lifehacker.jp/2021/03/231356tag10-windows-programs-uninstall.html)**
【Heroku】デプロイしたときにおこるApplication error(code=H10)の対処法

#プログラミング勉強日記
2021年3月20日
ローカルでは動くのに、HerokuでデプロイするとApplication errorになってしまったので、その対処法を紹介する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/c41c733c-dcef-6813-daa2-b9887b320362.png)

#エラー内容
　まず書かれているように、`heroku logs --tail`でログを確認した。

```
2021-03-19T06:17:26.458574+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=videochat-sample.herokuapp.com request_id=48b111ba-aaf9-49c2-b454-ffb81ccb1fcb fwd="14.14.208.82" dyno= connect= service= status=503 bytes= protocol=https
```

　すると、code=H10でApp crashedと書いてある。

#やってみたこと
　ネットで調べてみると、Herokuを再起動すると書いてあった。

```
$ heroku restart -app アプリ名
```

　次に、起動してるプロセスを確認してそのプロセスを再起動することをやってみた。

```
$ heroku ps
$ heroku restart web.1
```
　どれをやっても動かなかった。

　Herokuのコンソールを見る方法があって、やってみたがそれでも見当たらなかった。

```:Herokuのコンソールを見る方法
$ heroku run console
```

#解決方法
　自分のコードの場合、`package.json`に誤りがあった。scriptの設定がデフォルトのままになっていた。これを直したら正しく表示された。

```json:package.json
{
  "name": "videochat-sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}
```

#参考文献
[Herokuでアプリが開けない！H10 App Crashed対処法メモ](https://mophie-blog.com/2020/08/16/app-erro-in-heroku-h10-app-crashed/)
[Heroku展開エラーH10（アプリがクラッシュしました）](https://www.it-swarm.jp.net/ja/ruby-on-rails/heroku%E5%B1%95%E9%96%8B%E3%82%A8%E3%83%A9%E3%83%BCh10%EF%BC%88%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%89/1070706931/)
THE文系の俺が機械学習コース無職転生〜 Part1

題の通り、続く限り書いていこうと思います。

まず自己紹介から

## 自己紹介
昭和63年生まれの３２歳です。
今まで接客等、人とダイレクトに関わる仕事しかしてこなかった人です。
令和３年の１月からプログラミングスクールに通い始めております。

## Qittaを書こうと思った理由
昨日(令和3年3月19日)参加した「DICday」というセミナーにて、スクール生の方がオススメされていたので。勢いだけはある自分としては、今がチャンスだという思いで書いてます。

## 今日は何書くの？
その昨日(令和3年3月19日)のセミナーにて勉強になったことを書いておこうと思います。(駄目だと言われたら即刻削除するので・・・)

## 勉強になったこと
昨日話して頂いた方は、Web系エンジニアの方でした。前職も少し経験があり、スクールに入校とのこと。
①セミナーに出たことととかQuiitaに載せてく
→意外とやってる人少なくて差別化になると

②GITHUBに草を生やし続ける
→間があると、「この人はスクールに入ってたからやっていただけの人なんだな・・・」と思われる可能性もある

③就活中はSNSで会社関係の人宛に潜っていく
→割と内情がちゃんと分かってしまい、会社の判別するのに助かったと

④ポートフォリオは同期とかと見せ合うのも大切
→共に過ごしてきた同期だからこそ、気兼ねなくアドバイスを言い合えてブラッシュアップ


今日のところは初めてなので、こんなところで・・・。

最後に、出来れば私みたいにこの世界に迷い込んだTHE文系の方がほっと胸を撫で下ろせるような記事を書いてみたい。

それでは。
[UnrealEngine初級]関数が使われている場所を検索する

#概要
関数が使われているブループリントの検索方法がわからなかったんですが、やり方がわかったので共有します:slight_smile:
#本文
調べたい関数ノードで右クリック。メニューからFindReferenceを選びます(My Blueprint上の関数でも大丈夫です)
![スクリーンショット (2064).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/33241d59-4b1f-c725-907b-4aadd2815142.png)
画面下のFindResultsに検索項目が出てきますが（表示されているブループリント内での検索なので）一つしか表示されません
ここで右側にある双眼鏡をクリックします
![スクリーンショット (2065).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0f49f9e8-63b7-2ca2-47d5-7ca647ed4900.png)
Find in Blueprintsが表示されます。これでブループリントを横断的に検索してくれます。
見たい項目をダブルクリックすると関数が使われているブループリントが表示されます
![スクリーンショット (2066).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1cb59f05-6bb1-0731-c713-d4bffeb45bbc.png)
#補足
逆に関数を定義している場所もこの流れで見れますが、Goto Definitionなら一発で表示されます。
![スクリーンショット (2067).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d25dbddb-cd9b-3cd7-37c5-2ba723d27b14.png)
conda環境にインストールしたパッケージのライセンスの種類を調べる方法

#はじめに
インストール済の conda パッケージのライセンスを調べる機会があり方法を調べてみたのでメモ。

厳密にライセンス条文を表示する方法ではなく、どんなライセンスの種類かを調べる方法である。

#pip でインストールしたもの
pipでインストールしたものについては、以下のように```pip show```コマンドで調べることができる。

```sh
$ pip show torch
Name: torch
Version: 1.7.0
Summary: Tensors and Dynamic neural networks in Python with strong GPU acceleration
Home-page: https://pytorch.org/
Author: PyTorch Team
Author-email: packages@pytorch.org
License: BSD-3
Location: c:\users\kimisyo\.conda\envs\openchem\lib\site-packages
Requires: future, typing-extensions, dataclasses, numpy
Required-by: torchvis
```

その結果、ラインセスの種類が License 行に出力される。


#conda でインストールしたもの
上の方法でpip, condaどちらでインストールしたももの概ね表示されるが、表示されないパッケージもまれにある。
その場合の方法を述べる。

まず```conda list```コマンドで、バージョン番号とビルド番号を調べる。

```sh

$ conda list |grep libuv
libuv                     1.40.0               he774522_0
```

次にパッケージ名とバージョン番号、ビルド番号を以下のように```conda search```コマンドに与える。

```sh

$ conda search libuv=1.40.0=h8ffe710_1 --info
Loading channels: done
libuv 1.40.0 h8ffe710_0
-----------------------
file name   : libuv-1.40.0-h8ffe710_0.tar.bz2
name        : libuv
version     : 1.40.0
build       : h8ffe710_0
build number: 0
size        : 330 KB
license     : MIT
subdir      : win-64
url         : https://conda.anaconda.org/conda-forge/win-64/libuv-1.40.0-h8ffe710_0.t
ar.bz2
md5         : cde4b3adfb81cfe28ac17b84e62ed93e
timestamp   : 2020-12-18 14:56:01 UTC
dependencies:
  - vc >=14.1,<15.0a0
  - vs2015_runtime >=14.16.27012
```

その結果、ラインセスの種類が licnese 行に表示される。

注意点としては、パッケージ名=バージョン番号=ビルド番号を指定しないと、全てのバージョン、ビルドが表示されてしまう点である。
M5StickC PlusでENV II （環境センサユニット）を動作させる

## 概要
```M5StickC Plus```で```M5Stack用環境センサユニット ver.2（ENV II）```の値を取得しようとしたところ、
ちょっと嵌ったので忘備録代わりにセットアップ方法を記載します。

## 参考URL
下記URLを参考にさせていただきました。
M5StickCで小型環境センサ端末を作る: https://ambidata.io/samples/m5stack/m5sitckc/

## 使用デバイス
https://www.switch-science.com/catalog/6470/

https://www.switch-science.com/catalog/6344/

## まとめ
|デバイス |型番 | 備考|
| - | - | - |
|ボード| M5Stick-C | M5StickC Plus互換のようです。 ライブラリは別途インストールが必要です <br />リポジトリ: https://github.com/m5stack/M5StickC-Plus|
|温湿度センサ| SHT30| 参考URLと異なります　リポジトリ: https://github.com/Risele/SHT3x|
|気圧センサ| BMP280| 参考URLと同じです|


## 手順
1. FTDI VCP Driverをインストールする。
1. Arduino IDEの「ファイル＞環境設定＞追加のボードマネージャーのURL」に ```https://dl.espressif.com/dl/package_esp32_index.json``` を追加する
1. 参考URLを参照し、ボードマネージャで「```esp32```」と検索して、「```esp32 by Espressif Systems```」をインストールする
1. Arduino IDEで```Ctrl+Shift+I```を押し、ライブラリマネージャに「```M5StickCPlus```」と検索して、「```M5StickCPlus```」をインストールする
1. ライブラリマネージャで「```bmp280 adafruit```」と検索して、「```adafruit BMP280 Library```」をインストールする
1. 温湿度センサのリポジトリからZIPファイルをダウンロードする
1. https://github.com/m5stack/M5StickC-Plus のリポジトリからZIPファイルをダウンロードする
1. 上記2つのZIPファイルをArduino IDEの「スケッチ＞ライブラリをインクルード＞ZIP形式のライブラリをインストール」する

※PC、Arduino IDEは適宜再起動してください。

## Arduinoスケッチ
参考URLから温湿度センサをSHT30に変更しています。

```c++
#include <M5StickCPlus.h>
#include <SHT3x.h>
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>

SHT3x sht30;
Adafruit_BMP280 bme;

void setup() {
    M5.begin();
    M5.Axp.ScreenBreath(10);    // 画面の輝度を少し下げる ----B
    M5.Lcd.setRotation(3);      // 左を上にする         ----C
    M5.Lcd.setTextSize(2);      // 文字サイズを2にする
    M5.Lcd.fillScreen(BLACK);   // 背景を黒にする

    Wire.begin();               // I2Cを初期化する
    while (!bme.begin(0x76)) {  // BMP280を初期化する
        M5.Lcd.println("BMP280 init fail");
    }
    
    sht30.Begin();
}

void loop() {
    sht30.UpdateData();
    float tmp = sht30.GetTemperature();
    float hum = sht30.GetRelHumidity();
    float pressure = bme.readPressure();
    double vbat = M5.Axp.GetVbatData() * 1.1 / 1000;  // バッテリー電圧を取得 ----D

    M5.Lcd.setCursor(0, 0, 1);
    M5.Lcd.printf("temp: %4.1f'C\r\n", tmp);
    M5.Lcd.printf("humid:%4.1f%%\r\n", hum);
    M5.Lcd.printf("press:%4.0fhPa\r\n", pressure / 100);
    M5.Lcd.printf("vbat: %4.2fV\r\n", vbat);
    delay(1000);
}
```

## 実際の出力

![t_DSC_0000_BURST20210320084614696.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125575/4b9eb4a4-066d-1ccf-0954-59e7b52d2011.jpeg)

## 背面
![t_DSC_0263.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125575/72e3de8c-ec2d-749b-63e5-c93948f909fc.jpeg)

## 免責
本記事によって起こる如何なる事象についても執筆者は一切の責任を負いません。
間違い等あるかもしれませんがご了承願います。
SDFを分割するスクリプトを作ってみた

#はじめに
SDFの解析でエラーになった際に、どのデータがおかしいのか解析したいときがある。そういった場合、SDFを適当に切り出してみて、トライアンドエラーをすることが、ごくまれに(数年に1回)ある。今回、そのタイミングが来たのでツールを作って残すこととした。

#仕様
- 何番目から何番目を取得するかをstartとendを指定すると、その間にあるデータを切り出し、別のsdfとして出力する。
- startを省略した場合は1, endを省略した場合は、sdfの一番最後を指定したものとする。
- デバッグ目的で使用することが多いため、RDKitなどインストールが面倒なツールは使わない。

#できたソース
こんな感じ。使い方はソースを見れば一目瞭然なので省略。

```sdf_cutter.py
import argparse

def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("-input", type=str, required=True)
    parser.add_argument("-output", type=str, required=True)
    parser.add_argument("-start", type=int, default=1)
    parser.add_argument("-end", type=int, default=None)
    args = parser.parse_args()

    buf = ""
    cnt = 0

    with open(args.input, "r", encoding="utf8") as fr:
        fw = open(args.output, "w", encoding="utf8")
        line = fr.readline()
        while line:
            line = line.rstrip()
            if line == "$$$$":
                cnt += 1
                if cnt >= args.start and (not args.end or cnt <= args.end):
                    fw.write(buf)
                    fw.write("$$$$\n")
                buf = ""
            else:
                buf += line + "\n"
            line = fr.readline()
        fw.close()


if __name__ == "__main__":
    main()
```

#おわりに

- scikit-learnのtrain_test_splitのSDF版を作っても面白いかも。需要はなさそうだけど...
Firebaseデプロイ時にエラーが発生した時の対処法

#はじめに

###対象者
  - Firebaseホスティングを使用してデプロイを試みたが、以下のエラーによって失敗した方

        HTTP Error: 404, Requested entity was not found.  


![スクリーンショット 2021-03-20 7.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016081/b93c99bc-ff70-4688-954b-c4d41fd2c0fd.png)


#試したこと-失敗①
###firebase-toolsの最新化

以下のリンクを参考してfirebase-toolsを最新化しましたが、僕はなぜか解決できませんでした。

     npm install -g firebase-tools

[【Firebase】deployがうまくいかない時の対処方法
](https://qiita.com/daichi_sugiyama/items/34a580c8e727e109f7ee)


#試したこと-失敗②
###.firebaseファイルの削除、再度初期化してデプロイ

firebaseはdeployを行うと、プロジェクト配下に .firebaseというディレクトリを掘り、cache情報を残します。そのため、このcache情報が邪魔してデプロイできないと推測し、.firebaseファイルを削除。再度初期化とデプロイを行いましたが、やはり失敗しました。


#試したこと-成功
###firebase.jsonにsiteを追加し、対象のプロジェクト（アプリ）の名前を記載

- firebase.jsonに"site"を追加
- 対象のプロジェクトの名前を記載
- 再度デプロイ 


![スクリーンショット 2021-03-20 8.18.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016081/83fbb8f3-8c75-19a5-0899-ed6fd50833d7.png)

![スクリーンショット 2021-03-20 8.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1016081/7fd6f0d0-e1a9-9144-68f8-df4e8b54ed3c.png)
Rails bundle install errrrrrrrror

## Gemfileに以下を入れて

```markdown
gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"
```

以下のコマンドを打つと、、、、

```markdown
docker-compose run web rails g model PostImage shop_name:text image_id:string caption:text user_id:integer
```

## エラー

```markdown
/usr/local/bundle/gems/bundler-2.2.15/lib/bundler/source/git/git_proxy.rb:223:in 
`allowed_with_path': The git source https://github.com/manfe/refile.git is not yet checked out. Please run
 `bundle install` before trying to start your application (Bundler::GitError)
ERROR: 1
```

⇨bundle installをしろ〜と怒られた〜。。

## 試したこと

以下のコマンドを実行。

```markdown
docker-compose build
```

⇨docker-compose buildでGemfileが更新がする＝bundle installと最初思っていたので、それ自体が間違いであった。

**Dockerfile**

```markdown
FROM ruby:2.7

RUN curl https://deb.nodesource.com/setup_12.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update && apt-get install -y nodejs yarn postgresql-client

WORKDIR /app
COPY ./src /app
RUN gem install bundler

RUN bundle config --local set path 'vendor/bundle'
RUN bundle install
```

## 解決方法

```markdown
docker-compose run web bundle install
```

⇨普通にやってみた。以下の通り成功した。

```markdown
Bundle complete! 21 Gemfile dependencies, 99 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```

そして、

```markdown
docker-compose run web rails g model PostImage shop_name:text image_id:string caption:text user_id:integer
```

成功！！

```markdown
Creating rails-meshitero_web_run ... done
Running via Spring preloader in process 19
      invoke  active_record
      create    db/migrate/20210319223106_create_post_images.rb
      create    app/models/post_image.rb
      invoke    test_unit
      create      test/models/post_image_test.rb
      create      test/fixtures/post_images.yml
```

勉強になりました。
頭が回っている朝のうちにエラー解消はすべきですな。

ありがとうございました。
VLC for AndroidのSingletonHolderについて

# はじめに
VLC for Androidのリポジトリ周りのソースを見ているとSingletonHolderというクラスを見つけたので調べてみた。


# 各種リンク

[アプリ](https://play.google.com/store/apps/details?id=org.videolan.vlc&hl=ja&gl=US)
[GitHub](https://github.com/videolan/vlc-android)
[公式サイト](https://www.videolan.org/index.ja.html)

# ソースコード

↓。コンストラクで生成するクロージャを渡して、初回アクセス時はそれを使ってインスタンスを生成して渡すようにしているのがポイント。後はスレッドセーフを保証。

```
open class SingletonHolder<T, in A>(creator: (A) -> T) {
    private var creator: ((A) -> T)? = creator
    @Volatile var instance: T? = null

    fun getInstance(arg: A) = instance ?: synchronized(this) {
        val i2 = instance
        if (i2 != null) i2
        else {
            val created = creator!!(arg)
            instance = created
            creator = null
            created
        }
    }
}
```
# 他のアプリのソース

WIP

# まとめ

別にこんなクラスはなくてもいいような気がするけど、ポカミスを避ける意味はあるのか？　
後はDIを使いたくないとか。
OAuth 2.0・OpenID ConnectでのEmbedded User-Agentの扱い

Googleは中間者攻撃対策として、OAuth 2.0のAuthorization RequestをEmbedded User-Agent（埋め込みブラウザ）を利用して実装することを禁止（ブロック）している。これに関連して、OAuth 2.0・OpenID Connect仕様やIDaaSのドキュメントを参考に、認可サーバー（IDプロバイダ）としてEmbedded User-Agentについてどのような扱いとすべきか（とその理由）を整理した。

## まとめ

* 3rd Partyからの認可（認証）リクエストでのEmbedded User-Agentの利用は、クライアントがユーザーのクレデンシャルにアクセスできてしまうため、3rd Partyでは禁止とすべき。
* 認可サーバー（OpenIDプロバイダ）視点では、審査等で落としたり、埋め込みブラウザをUser-Agentヘッダ等で検知してブロックするなど、開発者が（うっかり）Embedded User-Agentを利用しないように対策を取るとよい。
* ただし、HTTPリクエストである以上、UA偽装などをされてしまうと埋め込みブラウザからのリクエストをサーバー側で確実にブロックすることはできない。このため、当面（セキュリティソフトやプラットフォームで制限する仕組みが導入されない限り）は正規のクライアントで使われないように＋ユーザーがEmbedded User-Agentに対して警戒できるように、というのがセキュリティ的な意義となる。
* First Partyにおいても、攻撃を受ける範囲を狭める、クレデンシャル入力時のURLやTLS証明書の検証をユーザーに推奨できるため、Embedded User-AgentではなくExternal User-Agentを利用するのがよい。
* UX的には、External User-Agentを利用することで他のアプリとログイン状態を共有できたり、パスワードマネージャを利用できたり、というメリットがある。Android、iOSに関してはin-appブラウザを利用することでアプリ切り替えによるUX低下も解消できる。

## 調査メモ

### OAuth 2.0 (2.1 draft)

* [RFC8252 - OAuth 2.0 for Native Apps - 8.12.  Embedded User-Agents](https://tools.ietf.org/html/rfc8252#section-8.12)にはEmbedded User-Agentの使用は禁止（MUST NOT）という記載があるが、[OAuth 2.1 draft 01 - 9.20.  Embedded User Agents in Native Apps](https://tools.ietf.org/html/draft-ietf-oauth-v2-1-01#section-9.20)では非推奨というニュアンスの記載に留められている。
* Embedded User-Agentを禁止（非推奨）とする理由はどちらの仕様も同じで、アプリがユーザーのクレデンシャルにアクセスできてしまうため、となる。（典型的なWebViewでは、キーストロークの記録や、フォーム自動送信による同意回避、セッションCookieの取得も可能とのこと。）
* 3rd Partyに対してはもちろんであるが、First Partyに対しても、攻撃を受ける範囲（クレデンシャルを受け付けるI/F）を狭める、クレデンシャル入力時のURLやTLS証明書の検証をユーザーに推奨する、という意味合いがあるとのこと。
* ユーザービリティ的にはExternal User-Agentを使うことで他のアプリと認証状態と共有できるというメリットも挙げられている。

### Google

* Googleは中間者攻撃によるフィッシング対策として、WebViewやEmbedded Browser Framework（[Chromium Embedded Framework](https://bitbucket.org/chromiumembedded/cef/src)など）からのAuthorization Requestをブロックしている。
  * [Guidance to developers affected by our effort to block less secure browsers and applications](https://developers.googleblog.com/2020/08/guidance-for-our-effort-to-block-less-secure-browser-and-apps.html)
  * [Better protection against Man in the Middle phishing attacks](https://security.googleblog.com/2019/04/better-protection-against-man-in-middle.html)
  * [Modernizing OAuth interactions in Native Apps for Better Usability and Security](https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html)
* とはいえAuthorization Requestは本質的には単なるHTTPSリクエストとなるため、Embedded User-Agentを認可サーバーで確実にブロックするということはできないのでは、というコメントがQ&Aサイトに寄せられている。
  * [How can Google detect a request is from a WebView?](https://stackoverflow.com/questions/41801836/how-can-google-detect-a-request-is-from-a-webview)
  * [Webview Detection mechanisms?](https://www.researchgate.net/post/Webview_Detection_mechanisms)

### Auth0

* OAuth仕様を引き合いにEmbedded User-Agentsの利用は非推奨としている。
  * [Centralized Universal Login vs. Embedded Login - Security risks](https://auth0.com/docs/universal-login/universal-vs-embedded-login#security-risks)
* .NET用SDKでもWebViewでのログイン画面表示対応の要望はリジェクトされている。
  * [Feature Request: Add the ability to open Auth0 login in an embedded WebView #162](https://github.com/auth0/auth0-oidc-client-net/issues/162)
配列を使った数字の1行出力問題

paiza様のレベルアップ問題集で、配列を使って数字の1行出力のプログラムを作ってみました。


```c++
//
//  作成者　　乃木坂好きのITエンジニア
//  新規作成日   2021/03/20
//

#include< iostream >
using namespace std;


int main(void){

    int num;
    cin >> num;
    int data[num];
    for(int i=0;i<num;i++){
        int num2;
        cin >> num2;
        data[i] = num2;
    }
    for(int j=0;j<num;j++){
        cout << data[j] << endl;
    }
    
    return 0;
}
```
《舞姬》 – 浪漫主义流派重点核心知识点

<h3>《舞姬》 – 浪漫主义流派重点核心知识点</h3>
<hr />
发表于1890年，是森鸥外的处女作，也是日本近代文学中著名短篇小说。这个爱情悲剧告诉读者：一个自我觉醒的明治时期的青年是如何追求纯洁爱情和个性解放的。
《舞姬》是日本早期浪漫主义流派文学的先驱之作。
《舞姬》发表后一度在日本遭到非难，但影响甚大，被誉为“名作中的名作”。主要原因在于作品本身的艺术性。既采用日本传统的优雅文体，又吸收了西方的新文体，同时巧妙运用许多精炼的汉语词汇，使其融为和谐的一体，因此文章流畅而又华美。日本文艺评论家小田切进赞扬这种手法“给明治时期的文坛吹进了一股清新的风”。
<hr />
<h3>作家介绍：</h3>
森鸥外：1862－1922，东京大学医学部。浪漫主义流派先驱。出身岛根县藩主侍臣家庭，自幼受到良好国学，汉语和兰学教育。留学德国四年，除了在医学上深造之外，大量涉猎欧美文学名著。深受唯心主义哲学家美学思想的影响。终身担任陆军军医高级官职。代表作还有：《雁》《青年》《妄想》和历史小说《阿部一族》《涩江抽斋》《高濑船》等。
森鴎外「もろおうがい」：
1862－1922、東大医学部卒、ドイツへ留学する経験があり、
明治時代に小説家、また軍医として活躍していた。
ロマン主義の名家、
代表的な作品のほうは「雁・がん」「青年・せいねん」「阿部一族・あべいっぞく」「渋江抽斎・しぶえちゅうさい」「高瀬船・たかせぶね」などがあり。
1890年短編小説の「舞姫」を発表し、日本近現代文学の先駆者となり。
<hr />
<h3>作品梗概：</h3>
主人公太田丰太郎家教严格早年丧父天资聪颖，全靠母亲抚养成人。东京大学毕业后进入政府机关，一心搞工作，不料上级派他去德国留学。丰太郎来到眼花缭乱的欧洲大城市柏林学习法律钻研艺术，发誓无论身处怎样的花花世界，绝不为之所动。但随着时间推移，西方资本主义社会使他逐渐发生思想意识形态上的变化。于是将感受写成文章寄回日本，表示自己具备了“独立的思想。”
某天，丰太郎在一个旧教堂遇到美丽少女在哭泣，询问后得知这名叫爱丽丝的舞女父亲去世无钱安葬，向剧场老板借钱处理后事，没想到老板乘人之危对爱丽丝不怀好意。丰太郎出于同情将自己的怀表连同口袋里仅有的两三个马克一起给了爱丽丝。从此两人关系日渐密切，因此相爱了。
不久，日本留学生向其上司反映丰太郎频繁进出剧院，结交舞女。上司本来就认为他的学问已走入歧途，便通知大使馆将其免官撤职，命他立即回国。与此同时，丰太郎收到母亲病故的噩耗。身陷绝境的丰太郎和爱丽丝感情反而炽热起来，开始同居了。
然而丰太郎并没有忘记祖国和功名，心情总是抑郁。此时好友相泽谦吉陪同大臣访问柏林，他劝告丰太郎，为了恢复名誉和今后的前途，必须和爱丽丝断绝关系。丰太郎思乡之情和功名之心终于压倒了儿女情长，接受了朋友的忠告，不情愿的舍弃了爱丽丝，答应和大臣返回日本。
这一选择使其良心受到责备，一病不起，而怀孕的爱丽丝得知消息后精神失常。丰太郎留给爱丽丝母亲一笔赡养费，委托她照料爱丽丝。
在回国的海上，丰太郎感慨：“唉，世界上难得像相泽谦吉这样的良朋益友，可是，我心里对他至今仍然留着一点怨恨之情。”
yukicoder contest 287 参戦記

# yukicoder contest 287 参戦記

起きたら始まっていて、A問題を解いて、B問題をちょっと考えたら眠くなってまた寝てた. コンテスト後に起きてB問題を解いてみたらそこまでは難しくなかった.

## [A 1432 Not Xor](https://yukicoder.me/problems/no/1432)

yukicoder では珍しい ABC-A レベルの問題. 使っている言語のビット演算子を知っていれば難なく解けるでしょう.

```python
A, B = map(int, input().split())

print((A | B) + (A & B))
```

## [B 1433 Two color sequence](https://yukicoder.me/problems/no/1433)

連続部分列の右端を固定して考えると、そこを右端とした部分列で最大のものは、先頭から始まる部分列で最小を引いたもの(プラスの値で絶対値の最大狙い)か、最大を引いたもの(マイナスの値で絶対値の最大狙い). なのでそこまでの最小値、最大値、合計の変数を更新しながらループすることによって *O*(*N*) で解ける.

```python
N = int(input())
S = input()
a = list(map(int, input().split()))

result = 0
minv = 0
maxv = 0
v = 0
for i in range(N):
    if S[i] == 'R':
        v += a[i]
    elif S[i] == 'B':
        v -= a[i]
    result = max(result, abs(v - minv))
    result = max(result, abs(v - maxv))
    minv = min(minv, v)
    maxv = max(maxv, v)
print(result)
```
[UE4] Entrian Inline Watchを使用してUnreal Engineをデバッグ

# 概要
デバッグをちょっとだけ楽にする便利ツールを紹介します。ツールは以下のリンクから入手することができます。

http://entrian.com/

Entrian Source Searchを使用されている方には馴染みのページですが、今回紹介するのは**Entrian Inline Watch**という変数を値を表示するツールです。機能はただこの1点です。

以下の図を見ると変数`result`のとなりに`24`という数値が表示されていますが、これができるようになります。
![2021-03-20_03h14_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/3524b160-00fe-8a23-1ba9-34d5c1c27ae0.png)

30日間のフリートライアル期間中は無料で使用することができます。
それ以降は29ドル(3000円くらい)でライセンスを入手して使用することになります。

# メリット
![2021-03-20_03h45_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/38d06f08-53ab-61f1-ecf3-8843871ebd46.png)
**・デバッグで変数をスコープできる**の1点につきます。

これは副次的に以下の作用があります。

・毎回スコープしたい変数をウォッチに追加したりログに出力する手間が省ける
・複数の変数を同時に見ることができる
・変数のすぐ隣に表示されるので実値と変数の関連付けが楽
　→ コードとウォッチウィンドウの間を視線が行ったり来たりしなくて済む
・ウォッチウィンドウに出力しなくて済む
　→ つまりウィンドウを表示しなくて済むので別の情報を表示したりできるスペースが空く
・スコープが終わった変数(以下のケースでは`Object`)も覚えていてくれる
![2021-03-20_04h01_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/767ec150-ad19-cd8c-f58f-b0e3c09bf322.png)

地味に便利じゃないですかね？

# 使い方
リンクのページからツールをダウンロードします。
もしくは、Visual Studioの`[Extentions]->[Manage Extentions]`からインストールすることもできます。
![2021-03-20_02h33_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/e69f625f-9c73-ce50-cb7d-d497853e7182.png)

すでにインストール済みであれば、`[Tools]`の中にWatch表示、コンフィグ表示の2つがリストされています。
![2021-03-20_02h36_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/be3672e9-fe96-4f87-8037-f4e0bf675e90.png)

すでにWatch表示が有効となっている場合、以下のように変数が表示されます。
表示されない場合は`Shift+Alt+W`を押してWatch表示を有効にします。
**UE4の場合、Debug, Development, Testのビルド構成において利用**できます。
![2021-03-20_03h33_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/70a0f8c8-8971-97ea-5762-6f9c25e0a350.png)

# おすすめ設定
やれることは少ないですが、アセットパスなど長い値をスコープしたい場合は以下の設定を変更すると便利です。`[Tools]->[Entrian Inline Watch:Configuration...]`を選択すると以下の設定画面を表示します。

以下の赤枠部分は変数の表示文字数を設定するエリアです。
![2021-03-20_02h38_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/1d1317d1-9790-813f-c588-c0fd10316645.png)
デフォルトは20になっているので、20文字までしか表示しません（カーソルを合わせると全表示になります）。以下の例だと`Package`の変数はどのような内容が入っているか判断しづらいところです。
![2021-03-20_03h13_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/3cbb25f7-6a31-da61-6861-73baa85f0698.png)
文字数を調整しておくと、以下のようにカーソルを合わせずとも一目でEngineのアセットであることがわかります。
![2021-03-20_03h12_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/4298b442-2f7d-a4d2-f395-6b9cd87c5e5f.png)

便利でかつ無料で試せるのでぜひご活用してみてはいかがでしょうか。
ドメインとIPアドレスについて

#ドメインとIPアドレス

IPアドレスはInternet Protocol Adressの略で、インターネットにおける住所のことである。

IPアドレスは、IPｖ４とIＰｖ6がありIＰｖ4ではパソコンが世の中に普及して、アドレスが枯渇してしまっているので最近はＩＰｖ６に移行してきている。

ＩＰアドレスは数字が、たくさん並んでいるだけなので人間が扱うのに優しとは言えない。そこで、DNS (Domain Name System : ドメインネームシステム）というものが登場した。

ドメイン名を用いて、それをIPアドレスと紐づけることによって人にとって扱いやすくした。

ドメインもIPアドレスも重複してはいけない。なので、それぞれある組織が重複しないように管理を行っている。

IPアドレスは、[IANA](https://www.iana.org/) (Internet Assigned Numbers Authority) を頂点にその配下にそれぞれの地域ごとの組織が存在していてそこで管理している。

ドメインは、ICANN　（The Internet Corporation for Assigned Names and Numbers） が管理している。


##ドメインの構成

東京大学のWebサイトを例にとると

https://www.u-tokyo.ac.jp/ja/index.html
このURLのうち
u-tokyo.ac.jp
がドメイン名である。ac,jpはそれぞれ、TLDである。

URLは、IPアドレスのみでなくファイル名まで情報を含むので、URLはドメインの上位概念といえる。

「.ac」や「.jp」にあたる一番右側のブロックは、トップレべルドメイン（TLD）といわれている。TLDは、「国や地域に属するもの」と「属さないもの」の大きく二つに分類される。
acは、アカデミック、jpは日本を表している。一番左のu-tokyoが固有ドメインである。


##DNSサーバーについて

DNSサーバーは、ドメインに関する情報を管理していて、DNSによるデータの検索で最も重要な役割を担っている。




参考
マスタリングTCP/IP
[レンタルサーバーナレッジ](https://knowledge.cpi.ad.jp/basic-knowledge/ipip/#:~:text=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E4%B8%8A%E3%81%AB%E3%81%82%E3%82%8B%E6%A9%9F%E5%99%A8,%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82&text=%E3%81%BE%E3%81%9F%E3%80%81IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AF%E6%95%B0%E5%AD%97,%E3%81%8C%E3%80%8C%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%80%8D%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
https://xn--u8j7eobcu7j2kyg7f.jp/special/registrar/index.html
Rails rails-erd で ER図出力 ( Docker, alpine )

## はじめに

* Dockerで、`rails-erb`を使いER図を作成しようとしたが、**Graphviz**が必要だとErrorが出た時の対応
* 文字化け出力された時の対応

## やりたい事
`rails-erd`でER図を作成

## 環境
* Rails version: 6.1.3
* Ruby version: ruby 3.0.0p0 (2020-12-25 revision 95aff21468)[aarch64-linux-musl]
* mariadb:10.5.8

## やったこと

* `bundle exec erd` を実行するもError

```bash
# Error
bash-5.0# bundle exec erd
Loading application in 'rails_app'...
ruby/3.0.0 isn't supported by this pry-doc version
Generating entity-relationship diagram for 17 models...
Warning: Ignoring invalid model ActionText::RichText (table action_text_rich_texts does not exist)
Warning: Ignoring invalid model ActionMailbox::InboundEmail (table action_mailbox_inbound_emails does not exist)
Warning: Ignoring invalid model ActiveStorage::Attachment (table active_storage_attachments does not exist)
Warning: Ignoring invalid model ActiveStorage::Blob (table active_storage_blobs does not exist)
Warning: Ignoring invalid model ActiveStorage::VariantRecord (table active_storage_variant_records does not exist)
Warning: Ignoring invalid association :deliveries on User (uninitialized constant User::Delivery)
Warning: Ignoring invalid association :deliveries on Store (uninitialized constant Store::Delivery)
Failed: RuntimeError: Saving diagram failed!
Verify that Graphviz is installed and in your path, or use filetype=dot.
```

* Error対応: `graphviz`をインストール

```bash:Dockerコンテナ内
$ apk add --update --no-cache graphviz
```

* **再度実行**: PDF出力できたと思ったら文字化け。。。

```bash:Dockerコンテナ内
# Success
bash-5.0# bundle exec erd
Loading application in 'rails_app'...
ruby/3.0.0 isn't supported by this pry-doc version
Generating entity-relationship diagram for 17 models...
Warning: Ignoring invalid model ActionText::RichText (table action_text_rich_texts does not exist)
Warning: Ignoring invalid model ActionMailbox::InboundEmail (table action_mailbox_inbound_emails does not exist)
Warning: Ignoring invalid model ActiveStorage::Attachment (table active_storage_attachments does not exist)
Warning: Ignoring invalid model ActiveStorage::Blob (table active_storage_blobs does not exist)
Warning: Ignoring invalid model ActiveStorage::VariantRecord (table active_storage_variant_records does not exist)
Warning: Ignoring invalid association :deliveries on User (uninitialized constant User::Delivery)
Warning: Ignoring invalid association :deliveries on Store (uninitialized constant Store::Delivery)
Diagram saved to 'erd.pdf'.
```

* 参考記事を元にinstall. 中身はよう分からんです。

```bash:Dockerコンテナ内
$ apk add --update --no-cache msttcorefonts-installer \
                              fontconfig \
                              font-bitstream-type1 \
                              ghostscript-fonts \
                              ttf-freefont

$ update-ms-fonts && fc-cache -f && rm -rf /var/cache/*
```
## 再出力結果
無事文字化けせずER図出力できました 🙌

## 参考
* https://github.com/fgrehm/docker-graphviz/blob/master/Dockerfile
* https://bluepixel.hatenablog.com/entry/2020/06/20/161016
横からひゅっと出るアニメーションボタン。作り方とfloat x z-indexでつまずいたこと

横からひゅっと出てくるアニメーションのあるボタンを作りたくてCSSを書いてたのですが、悩みに悩んでやっとできたので記録します。floatとz-indexでハマってしまったのでそちらも最後に書いています。

ちなみにこちらのボタンです。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291576/2b3e96e3-1192-f8d4-45b4-a57c70ac2730.gif)


先に上記のコードを記載します。

```html:index.html
<a href="#" class="button"><span class="btn-text">Learn more &rarr;</span></a>
```

```css:style.css
.button {
  display: block;
  text-decoration: none;
  border-bottom: 1px solid #55c57a;
  width: 12rem;
  height: 4rem;
  line-height: 4rem;
  text-align: center;
  background: transparent;
  font-size: 1.6rem;
}
.btn-text {
  display: block;
  width: 100%;
  height: 100%;
  color: #55c57a;
  position: relative;
  z-index: 1;
}
.btn-text:before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  width: 0;
  display: block;
  background: #55c57a;
  transition: .5s;
  z-index: -1;
}
.btn-text:hover:before {
  width: 100%;
}
.btn-text:hover {
  color: white;
}
```

## 簡単に手順を記載
１、aタグ(.button)に、widthやheightを設定してボタンの枠を作ります。
２、aタグの子要素のspanタグ(.btn-text)に、テキストカラーだけ置いておきます。widthやheightは100%に。
３、バックグラウンドカラーを変える仕込みとして、before疑似要素で.btn-textにwidth0%を配置しておきます。
４、マウスオーバーしたら、３(.btn-textのbefore疑似要素)のwidthが100%になるようにします。アニメーションがかかる対象のものにtransitionプロパティを記載しておきましょう！z-indexは-1に。
５、.btn-textにマウスオーバーしたらテキストカラーが白に変わるように記載しておきます。

イメージ
![demo4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291576/9238b3b3-cfdf-289c-c30d-9be583e25d27.jpeg)


## つまずいたこと（floatの子孫要素にz-indexを指定する場合）
z-indexでつまずきました。
.btn-text:beforeは.btn-textの子要素になるので、z-index指定をしない状態だとマウスオーバーした時に.btn-text:beforeが一番上に来て、.btn-text:hoverで指定した白のテキストカラーが隠れてしまいました。
そこで.btn-text:beforeにz-index: -1;を指定したのですが、今度はどの要素よりも緑のバックグラウンドカラーが後ろに行ってしまい、、テキストカラーは白が見えるもののバックグラウンドカラーが見えず。

親要素を辿ると、２カラムにしたかったのでfloat指定をしてたんですよね。
調べると、float指定をした子孫要素は重なり順で結構手前に来るみたいで、、
（だから.btn-text:beforeにz-index: -1;を指定するとバックグラウンドが見えなくなってしまったのかな？）
結果.btn-textにz-index: 1を指定してあげるとうまくいきました。

ぼんやりとなんとなく理解できるけど、細かいところはよくわからず、、すみません(><)
ですがz-indexでつまずいた方、先祖要素にfloatがあるかを疑ってみて、その場合z-indexを指定したその親にもz-indexを指定するとなんとかなるかも...？？というTIPSでしたmm

ーーー
3/24 追記

横からひゅっと出るアニメーションボタン、もう一つ作る方法を見つけたのでメモ

```css:style.css
    button {
      color: white;
      background-image: linear-gradient(90deg, transparent 0%, transparent 50%, white 50%);
      background-size: 200%;
      transition: background-position .4s;
    }
    button:hover,
    button:active {
      background-position: -100%;
      color: black;
    }
```
こちらは、左半分が透明、右半分が白のバックグラウンドをボタンテキストの後ろに設置し、
バックグランドサイズを倍にしておいて、透明の部分だけを最初見せておきます。
マウスオーバーしたらポジションを左に動かすことで、左から白いバックグランドがひゅっと出現するのを表現できます。

※background-positionについて
https://developer.mozilla.org/ja/docs/Web/CSS/background-position
```background-position: 100%```は、```background-position: right```と同じ。右端を基準にという意味になる。
デフォルトでは``background-position: left``となっている（はず）
RGB / BGR classification はできるのか

## これはなに

入力された画像がRGB-orderかBGR-orderかを判定するモデルを作った話です。ただの悪ノリです。
自然画像であれば見分けがつくでしょうが、例えばただの真っ赤な画像があったとき、元が赤か青かなんて50%でしか当たらないので解けません。でもAIは最強なのでなんとかしてくれると信じて学習させます。

実行例↓
![実行例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103789/c4fa6de9-4133-9248-5718-20d62f4aa4b7.png)


## なぜつくったか

Pythonで画像処理をする際に、OpenCVやPillowを使用して画像を読み込むケースは多いかと思います。
特に何もせずOpenCVでRGB画像を読み込むと画像のチャンネルはBGR-orderになり、Pillowで読み込むとRGB-orderになります。

そのため、OpenCVを使用して学習したモデルをPillowを使ったコードに適用すると思った性能を発揮しなかったり、前処理としてデータセットの平均RGB値を画素から引こうと思って間違った計算をしてしまったりすることがあります。

これらは、処理しようとしている画像がRGBかBGRか判定できれば防げるはずです！なので入力された画像がRGB-orderかBGR-orderかを判定するモデルを作りましょう

## 学習方法

単純な教師あり学習をします。ある画像に対して、それがRGB-orderなら0、BGR-orderなら1というラベルを与えて、モデルに2値分類させればOKです。
1枚の画像からオンラインでRGB-order/BGR-orderに変換することができるのでデータセットは適当なもので良いです。普段私は超解像用のデータセットを使用することが多いのでDIV2Kデータセットを使用しました。評価は真面目にやっていませんがBSD100データセットを使用しました。

## 実装

repo: https://github.com/S-Nakamur-a/channel-order
pytorch lightningを使用しました。半精度学習が1行追加でできたり、バッチサイズをよしなにやってくれたり、ちょっと面倒な部分を簡単に出来るようにしてくれているのが好きです。
モデルはefficientnet_pytorchからEfficientNetを持ってくるだけにしました。
optimizerはAdam＋StepLRです。全く真面目にチューニングしていません。

## 結果

Urban100のLR画像100枚に対して、RGB-order / BGR-orderの2種類を作成し、両方共を正しくRGB / BGR判定できた場合のみを正解としたとき、precisionは67%でした。

正解できたパターン例はこんな感じです

![Screenshot from 2021-03-20 02-57-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103789/d9ea3b20-b35a-12b4-894f-2ad04863da55.png)

思ったより精度低いな...と思って間違いケースを見てみたのですが、白黒画像だったり下の画像のように人間にも判別できなかったりするようなものだったので納得です。いくつか「これはギリギリ判定できないか...?」というものも混じっていたのでまだ学習の余地はありそうです。

![Screenshot from 2021-03-20 02-52-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103789/4f1d47c9-f361-a480-26bf-5fcd9cd99cdf.png)

ちなみにvalidation accuracyは85%ほどだったのですが、学習時のaccuracyは「ランダムでRGB/BGRを変化させた画像1枚に対してRGB/BGRを当てられれば正解」で定義していたのでちょっと意味合いが違います。

## 考察

特に考察することもないんですが、まぁ出来ないものは出来ないよな、という気持ちと、空とか木とか人とか写ってるとやっぱり出来るんだなという気持ちです。
自己教師学習はデータセットの準備が簡単だから良いなぁという気持ちや、物体・テクスチャを認識した上でその自然な色合いを記憶する必要があるところがrotation classificationやJigsawのような自己教師で特徴表現学習するやつにちょっと似ているところがあるなという気持ちにもなりました。

## 結論

こんなモデルを作るより、チャンネル順序まで含めて型がある言語を使うか、自分でクラスを定義したほうがずっと健全だと思います。
僕は個人開発ではRGBImageとBGRImageというクラスを定義してOpenCVやPillowは隠蔽することでココらへんのミスを極力減らしています。ちょっと面倒なので良い方法を募集中です
Apple Silicon (M1) で Firebase Hosting を使おうとしたら firebase login で失敗した話を解決する

# 対象者
Apple Silicon (M1) を使って Firebase Hosting を使おうとして手順通りに作業していたら firebase login に失敗した僕のような方🧜‍♂️

# 動作成功した環境

* マシン: Mac mini(M1, 2020)
* OS: macOS Big Sur 11.2
* zsh: 5.8 (x86_64-apple-darwin20.0)
* nvm -v: 0.37.0
* npm -v: 7.6.3
* node -v: v15.12.0

# 結論

nodejs のバージョンを v15 以上にしましょう。これだけで解決します。

# 理由

nodejs v15 の CHANGELOG 参照。
https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V15.md#15.0.0

arm64 の対応をはじめていることがわかる。
つまり 記事を書いた現在 Stable は 14.16.0 なのだが、これを使うとハマる。


# ハマったときの話
## 1. ndenv 使ってたらハマった

まずは arm64 に対応した nodejs をバージョン管理できるものを入れましょう。
管理ツールは nvm でも nodenv でも構いません。
僕のように ndenv を使ってた方は arm64 に対応したパッケージがなくて BUILD FAILED します（少なくとも記事を書いていた現在は失敗した）

## 2. stable な node version 14 以前を使ってたらハマった

nodejs のホームに着地したら記事を書いている現在は stable が 14.16.0, latest が 15.12.0 だった。
普段なら latest を使うのだが、このときは他の人に依頼されたホームページをサクッと作りたかったので変にハマりたくなくて stable の 14.16.0 を採用した。
が、これが罠で `npm install -g firebase` までは成功するのだが、 `firebase login` で abort する。

最初は管理ツールのビルド時になんか失敗してるのかなーと思って管理ツールを変えてみたのだが、説明済みの通り問題は node の version にあるので成功するはずもなく...

結局訳分からなくて色々調べてたら CHANGELOG に行きついて、 latest ならいけるんちゃう？と思って試したらあっさりいけた。

# ツイート

この記事で一人でも多くの僕のような民が救われますように🐳
M1 Macでバックスラッシュを打つ

#開発環境
macOS Big Sur （バージョン11.2.3）
Macbook Air (M1, 2020)
チップ：Apple M1
メモリ：16GB
起動ディスク：Macintosh HD

#したいこと
TeXをする際に、バックスラッシュ \ を打ちたいが一々optionと同時押しが面倒なので、optionなしで ¥ キーのみで打ちたい

#方法
１．「Google日本語入力」をインストールする（インストールするには、「Google日本語入力」とGoogleで検索して、最初に出てきたサイトをクリックしてそのサイトの指示に従って操作を進めていけば良い）。

２．英数についてはGoogle日本語入力を用いることにする（キーボードのスペースキーの左隣にある英数を押した際に、パソコン画面の一番上にあるバー "メニューバー" に並んでいる記号の内 "A" と言う文字が青い背景に白字になっていればよい。そうでなければクリックして、出てきたメニューにおいて 「英数(Google)」を選択する）

３．以下に従って、Karabiner-Elementsで設定を行う
https://qiita.com/kunit/items/f6ec7e159d93002bfc48

４．設定後に再び英数についてGoogle日本語入力になっているか確認して、バックスラッシュが打てるか確認する


#ダメだった方法（入力ソースでの設定）
1.パソコン画面左上のリンゴのマークをクリックしてメニューを開き、「システム環境設定」をクリック

2.さらに「キーボード」→「入力ソース」→「"¥"キーで入力する文字」を「\（バックスラッシュ）」に設定
【VBS】IE自動ログインスクリプト【Webスクレイピング】

#1. はじめに
サービスへログインする際はIDやパスワードが必要になります。
職場では様々なサービスを使用しますが、それだとそのサービスの数だけID,パスワードを入力する必要があり面倒です。
なので今回は、IDやパスワードといった項目を自動で入力してくれるスクリプトを作成することでその手間を省いていきたいと思います。

#2. 概要
<b><目標></b>
スクリプトを実行することにより、指定のWebサービスへ自動ログインする。

<b><メリット></b>
ログイン画面でのIDやpasswdの入力の手間を省く。

<b><実現方法></b>
IEのWebスクレイピングを行うVBスクリプトを作成することで実現。

#3. VBSソースコード
以下スクリプトになります。
指定箇所をご自身の環境に合わせて変更して下さい。

```vb:IE自動ログインスクリプト
Option Explicit

    Dim objIE
    Dim el

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    '// IEを開く
    '※ [example.com]をログインしたいサイトURLに変えてください 
    objIE.navigate "example.com"
    
    '// ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100        
    Loop
    
    '// a要素にログインがあったらクリックする
    '※ 環境に合わせて【ログイン】を変えて下さい
    For each el In objIE.document.Links             
        if instr(el.innerText,"ログイン") then
            el.click
            exit for    
        end if
    next    
    
    '// ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100        
    Loop    
    
     '// IDとパスワードを入力する
     '※ Elementを環境に合わせて変えて下さい
     '※ valueをご自身のIDとpasswordに変えて下さい
     With objIE.document       
        .getElementsByName("login_element")(0).Value = "login_id" 
        .getElementsByName("password_element")(0).Value = "password"        
     End With     
     
    Dim objbutton
     
    '// button要素をコレクションとして取得
    '※ Elementを環境に合わせて変えて下さい
    Set objbutton = objIE.document.getElementbyid("button_id")

    objbutton.click

```

#4. まとめ
スクリプト実行の際、多少の画面遷移がありますがやはり自動でログインしてくれるというは便利なものです。
職場がIE環境の方は是非上記をスクリプトを試してみて下さい。
では以上で失礼します。
[Rails] metaタグを設定する方法

#metaタグとは
SEO対策のうちの１つで、設定することでサイト名やタイトル名などや、OGP設定、Google検索に載せたくないページを設定することができます。

#metaタグ設定方法
##gemをインストールする
`Gemfile` に以下を追記して、 `bundle install` します。

```:Gemfile
gem 'meta-tags'
```

##設定ファイルの作成をする
以下を実行すると、 `config/initializers/meta_tags.rb ` にデフォルトのファイルが作成され、titleの文字数制限やdescriptionの文字数制限などが編集できます。
デフォルトのままでもOKです。

```
$ bundle exec rails g meta_tags:install
```

##OGPの設定をする
OGPは、SNSのタイムライン上でURLがシェアされたときなどに表示されます。
`application-helper.rb` に以下を追記します。
[オプション（github）](https://github.com/kpumuk/meta-tags#allowed-options-for-display_meta_tags-and-set_meta_tags-methods)

```:app/helpers/application-helper.rb
module ApplicationHelper
  def default_meta_tags
    def default_meta_tags
    {
      site: 'サイト名',
      title: 'タイトル',
      reverse: true,
      separator: '|',   #Webサイト名とページタイトルを区切るために使用されるテキスト
      description: 'ページの説明',
      keywords: 'ページキーワード',   #キーワードを「,」区切りで設定する
      canonical: request.original_url,   #優先するurlを指定する
      noindex: ! Rails.env.production?,
      icon: [                    #favicon、apple用アイコンを指定する
        { href: image_url('favicon.ico') },
        { href: image_url('icon.jpg'), rel: 'apple-touch-icon', sizes: '180x180', type: 'image/jpg' },
      ],
      og: {
        site_name: 'サイト名',
        title: 'タイトル',
        description: 'ページの説明', 
        type: 'website',
        url: request.original_url,
        image: image_url('ogp.png'),
        locale: 'ja_JP',
      },
      twitter: {
        card: 'summary_large_image',
        site: '@ツイッターのアカウント名',
      }
      fb: {
        app_id: '自身のfacebookのapplication ID'
      }
    }
  end
  end
end
```

##metaタグを出力させる
`application.html.erb` の `<head>`内に以下を追記します。

```:app/views/layouts/application.html.erb
<head>
  <%= display_meta_tags(default_meta_tags) %>
</head>
```

##検索に引っかかって欲しくないページの指定をする
お問い合わせフォームなどの検索に引っかかって欲しくないページに `noindex: true` を設定します。

```:view
<% set_meta_tags noindex: true %>
```

[参考にしたサイト](https://creat4869.hatenablog.com/entry/2019/08/15/170109)
MacでBundle installでエラーが表示される

実行環境
---
macOS Big Sur
ruby 2.6.5

やりたいこと
---
アプリの依存関係をローカルにインストールすること

エラーの経緯
---
 rubyアプリをHerokuにデプロイしたかったので、Herokuの公式チュートリアルで指示通り進めていたときに、このエラーが発生しました。
 該当箇所は「アプリの依存関係を宣言する」。 ここまでで、`git clone`で公式の用意したサンプルアプリをローカルにインストールした上しています。
postgresqlの存在をしっかりローカルで確認した上で、今回の元凶 `bundle install`様が降臨されました。

実際のエラー文
---
```
takayamatoranosuke@ttmbp ~ % bundle install
Could not locate Gemfile
takayamatoranosuke@ttmbp ~ % cd dev
takayamatoranosuke@ttmbp dev % cd ruby-getting-started
takayamatoranosuke@ttmbp ruby-getting-started % bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 13.0.3
Using concurrent-ruby 1.1.8
Using i18n 1.8.9
Using minitest 5.14.4
Using thread_safe 0.3.6
Using tzinfo 1.2.9
Using activesupport 5.2.4.5
Using builder 3.2.4
Using erubi 1.10.0
Using mini_portile2 2.5.0
Using racc 1.5.2
Using nokogiri 1.11.2 (x86_64-darwin)
Using rails-dom-testing 2.0.3
Using crass 1.0.6
Using loofah 2.9.0
Using rails-html-sanitizer 1.3.0
Using actionview 5.2.4.5
Using rack 2.2.3
Using rack-test 1.1.0
Using actionpack 5.2.4.5
Fetching nio4r 2.5.7
Installing nio4r 2.5.7 with native extensions
Errno::EACCES: Permission denied @ rb_sysopen -
/Users/takayamatoranosuke/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/nio4r-2.5.7/.github/workflows/workflow.yml
An error occurred while installing nio4r (2.5.7), and Bundler cannot continue.
Make sure that `gem install nio4r -v '2.5.7' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  rails was resolved to 5.2.4.5, which depends on
    actioncable was resolved to 5.2.4.5, which depends on
      nio4r
```
このエラー文を見て「nio4rのエラーか！」と思いいろいろ調べたのですが、どうやら問題の本質は違うところにあったようです。


どうやって解決したのか？
---
以下のコマンドを入力+gemfile.lockの削除をしたところ、解決しました

```
$ ruby -v
$ rbenv uninstall 2.6.5(既にインストールされていた実行環境のバージョン)
$ rbenv install 2.6.5(再インストール)
$ ruby -v(インストールの確認)

$ which ruby
/Users/takayamatoranosuke/.rbenv/shims/ruby
$ which bundle（rubyとbundleが同じ場所にいることを確認）
/Users/takayamatoranosuke/.rbenv/shims/bundle

$ cd ~/my_app
$ rbenv exec gem install bundler
$ rbenv rehash
$ bundle install --path vendor/bundle
~~
Bundle complete! 13 Gemfile dependencies, 65 gems now installed.
Bundled gems are installed into `./vendor/bundle`
```
エラーの考察
---
おそらく、whichで確認したrubyとbundleの場所が違ったから起きた問題なのではないか、と考えています。
これはつまり、ローカル環境で自分が既にインストールしていたrubyと、サンプルアプリのrubyが違い、なおかつbundleが使っていたrubyは自分が既にインストールしていた方だった、ということがエラーを起こしていたものと考えられます。
Rubyにおける改行コードの削除について　chomp, chomp!

# はじめに
プログラムの外部からデータを入力する標準入力において、標準入力からデータを読み込む際に意識しなければならないのが**改行コード**です。
改行コードの削除について調べたので、備忘録としてまとめました。

# 改行コードの概要と種類
改行コードとは、改行を表す**制御文字**のこと。
~~テキストファイルは、文字コードが格納されたファイルですが、1行の終わりの位置に必ず改行コードが入っています。~~
標準入力でテキストデータ（文字列）を受け取る際、改行コードを行の区切りとみなすことができます。
試しに、ターミナルのirbモードで標準入力を実行すると、以下のように受け取った文字データには改行コード（\n）が含まれています。

```言語:ターミナル
irb(main):001:0> line = gets
おはよう
=> "おはよう\n"
```

改行コードはOSによって次のように異なります。

* \n：Unix系OS全般
* \r\n：Windows系OS
* \r：古いMac OS（9以前）

# 改行コードの削除
rubyで改行コードを削除する場合、以下2つのメソッドが使えます。

## chompメソッド
`文字列.chomp`
chompは、対象の文字列の末尾から改行コードを取り除いた文字列を生成して返します。
レシーバである文字列自体から改行コードを取り除くわけではありません。
なお、chompメソッドの対象になった文字列に、改行コードが含まれていない場合は、その文字列をそのまま返します。


```Ruby:Ruby
greeting = "こんにちは\n"
p greeting.chomp  # => "こんにちは"
p greeting  # => "こんにちは\n"

name = "タロウ"
p name.chomp  # => "タロウ"
```

## chomp!メソッド
`文字列.chomp!`
chomp!は、対象の文字列の末尾から改行コードを取り除きます。（破壊的メソッド）
なお、chomp!メソッドの対象になった文字列に、取り除く改行がなかった場合は nil を返します。

```Ruby:Ruby
greeting = "こんにちは\n"
p greeting.chomp!  # => "こんにちは"
p greeting  # => "こんにちは"

name = "タロウ"
p name.chomp!  # => nil
```

# 参考

* https://docs.ruby-lang.org/ja/latest/method/String/i/chomp.html
* https://docs.ruby-lang.org/ja/latest/method/String/i/chomp=21.html
* https://style.potepan.com/articles/27203.html
【Python】requestsでcookie情報を取得する（備忘録）

自分用メモ

# requestsのインストール
```
pip install requests
```

# requestsのインポート
```python
import requests
```

# requestsのオブジェクト作成
変数「url」にリクエスト対象のURLを指定

```python
url = "https://qiita.com"
session = requests.session()
response = session.get(url)
```

# cookieを取得
cookie情報すべてを取得
※Webスクレイピングする場合は大抵これが必要

```python
cookie = response.cookies
```

# cookieの任意項目を取得
cookie内の任意項目を指定して取得
※Webスクレイピングでcookie内にトークンがある場合などで必要

```python
item = response.cookies.get('_qiita_login_session')
```

# requestsでcookie情報を取得するまとめ

```python
import requests

# URLから、requestsのオブジェクト作成
url = "https://qiita.com"
session = requests.session()
response = session.get(url)

# cookieを取得
cookie = response.cookies

# cookie内の任意項目を指定して取得
item  = response.cookies.get('_qiita_login_session')
```

[参考（requests公式ドキュメント）](https://requests-docs-ja.readthedocs.io/en/latest/)

403 Forbiddenが出てHTML情報が取得出来なかった場合は以下参照
[403 Forbidden（You don't have permission to access）が出た場合の対処法](https://qiita.com/shinkai_/items/a99df2cb42c152bd458a)

以上
【Pycharm】仮想環境にライブラリを入れる方法

Pycharmで作ったPython仮想環境にライブラリを入れる方法が分からなかったので
調べたついでにメモ

##自分の環境##

Windows 10 10.0
PyCharm 2020.3.2 (Community Edition)
Build #PC-203.6682.179, built on December 31, 2020
Runtime version: 11.0.9.1+11-b1145.63 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
GC: ParNew, ConcurrentMarkSweep
Memory: 1979M
Cores: 32
Non-Bundled Plugins: com.kite.intellij

##やり方##

###1. 設定画面を開く###
FIle > Setteings　から開く
![pycharm open setteing2 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/17068c02-0630-6db4-bdcb-8191476b7185.png)

###2. ライブラリ追加する画面を出す###
設定画面が出てきたら「Python Interpreter」をクリック
そして下の方にあるプラスマークを押す
![pycharm lib1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/f58e8b4c-7a12-5689-fa85-4485631ccbba.png)

###3. ライブラリの追加###
上の検索バーで入れたいライブラリを検索
（今回はrequestsライブラリを入れる）

似たような名前のライブラリが出てくることも有るので、注意しながら対象を選択
そして「Install Pakage」をクリック
![pycharm lib4 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/c9c0a629-f9e3-bd20-e6af-a425c3c91608.png)

完了！！！
pyenvとvenvの必要最小限の利用方法

# はじめに

Python＋Djangoで開発をしているのですが、複数案件を担当していると案件によってPythonやDjangoやその他のライブラリのバージョンが異なります。
場合によっては、同じPythonのバージョンでも異なるライブラリのバージョンが異なるため、pyenvとvenvによるバージョン管理は非常に役に立ちっています。今回は必要最小限の機能に絞って利用方法を記載してみます。

# 実行環境
OS:macOS Big Sur(version 11.2.2)
シェル:zsh
or
OS:CentOS7
シェル:bash

# pyenv
pyenvを利用することで様々なバージョンのPythonを利用することが可能になります。
本記事の記載時点だと2.1.3~3.9.1までインストール可能です。

# pyenvのインストール
macの場合はHomebrewを利用してインストールできるようです。

```
$ brew install pyenv
```
Linuxの方などはgitで持ってくることができます。

```
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```

# シェルの設定ファイル編集
自身のログインシェルを`echo $SHELL`で確認しておきます。
zsh→.zshrc(.zsh_profile)
bash→.bash_profile
に以下を記載しています。vimで直接記載しても良いですが今回は簡略化のために`echo`を利用します。

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

最後に設定ファイル反映を反映します。

```
$ source .zshrc   #bashの方は .bash_profile
```

# pyenvで必要なバージョンのPythonをインストール
これまでの設定でpyenvが利用できるため、利用可能なPythonのバージョンを調べます。

```
$ pyenv install --list
```

○.○.○とリストに表示されるものがインストール可能です。
利用したいバージョンのpyenvをインストールします。

```
$ pyenv install 3.9.1   # 今回は3.9.1をインストール
```

# pyenvのバージョン切替
現在のバージョンを調べます。

```
$ pyenv versions
```
systemとインストールされたバージョンが表示されます。
「*」の横に記載のバージョンが現在のディレクトリで利用されるものです。

```
* system (set by /○○/○○.pyenv/version)
  3.9.1
```
利用するPythonのバージョンを切替します。
ディレクトリに応じて細かく分けたりもできますが、venvの利用が主目的のため今回は割愛。

```
$ pyenv global 3.9.1
```

もう一度`pyenv versions`で確認するとデフォルトバージョンが切り替わっています。(Pythonをインタプリタで起動しても確認できます)

```
  system 
* 3.9.1 (set by /○○/○○.pyenv/version)
```

これで利用したいバージョンでvenv仮想環境を作成する準備が整いました。

# venv環境の作成
venvはPython3系ではデフォルトで利用可能なので特にインストールなどは必要ありません(2系を利用されている場合はvirtualenvのインストールすることで似たようなバージョン管理が可能になります)。
仮想環境を作成したいディレクトリで以下を実行します。

```
$ python -m venv venv_project   #venv_projectは任意のプロジェクト名
```

配下にvenv_projectディレクトリができるので`cd venv_project`で移動し、仮想環境をアクティベート。

```
$ source bin/activate
```
実行に成功するとホスト名の前に表示されます。これで仮想環境にはいっています。

```
(venv_project)hostname$ 
```


仮想環境をアクティベートすることで、これからpipでインストールするライブラリはローカルの環境から分離して独立して管理することが可能です。
あとは自由に必要なバージョンのライブラリをインストールして利用してください。

最後にローカルに環境に戻る際はアクティベートを解除します。

```
$ deactivate   # プロジェクトディレクトリ配下でなくても実行可能
```

以上で最低限のpythonでのバージョン管理ができそうです。

# さいごに
pyenvもvenvもちゃんと理解すればもっと便利に利用できそう。
ただ、今回の手順を踏めばローカル環境は元の状態を保てるためバージョンでの衝突は防げるのではないかと思います。
どなたかの参考になりましたら幸いです。

# 参考ページ
- https://qiita.com/saikoro-steak/items/2e9b177fea202186bd2c
- https://cod-sushi.com/python-venv-usage/
【Rails】ControllerTestの基本形について

railsではテスト駆動開発という、「テスト→実装」でアプリケーションを手法があります。
今回はそのテスト駆動開発のテストの基本形を書いてみました。

<h2>基本形</h2>

```ruby:controller_test
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  test "should get home" do
    #homeに対してgetリクエストを送る
    get static_pages_home_url
     #リクエストに対して帰ってきた判定でテスト自体の成否を出す
    assert_response :success
  end

end
```

上記例では、ページ一つを表示させるリクエストに対して、そのレスポンスが正しく帰ってきているかを検証します。
このとき表示されたテンプレートの数を増やしてもいくのもありです。
これくらいざっくりでも、自動でテストコードが走るようになっているれば、リファクタリングする際の助けになると思いますし、仕様書を読む手助けになったりします。

まずはこの基本形からさらにテストを膨らませるのも良いんじゃないでしょうか。

<h2>参考</h2>
Railsチュートリ3章
https://railstutorial.jp/chapters/static_pages?version=6.0#sec-exercises_setting_the_root_route
Firestoreのドキュメントは、Where句では削除できません。

Firestoreに散りばめられたテスト用データ たち
どうやって削除したら良いのか。
SQLみたいにWhereで指定して、それにDeleteメソッドつなければいけるんじゃないか？


こういうのがしたかった。

```JavaScript
firebase.firestore().collection("projects").where("title","==","TITLE_TEST36").delete().then(() => {
        console.log("Document successfully deleted!");
    }).catch((error) => {
        console.log("Error removing document: ", error);
    });
```

どうやらダメらしい。

↓こんな感じにしたら、ちゃんとTITLE_TEST36を成仏させてくれた。

```JavaScript
var ref = firebase
      .firestore()
      .collection("projects")
      .where("title", "==", "TITLE_TEST36");
    let batch = firebase.firestore().batch();

    ref.get().then((snapshot) => {
      snapshot.docs.forEach((doc) => {
        batch.delete(doc.ref);
      });
      return batch.commit();
    });
```
もう8章まで来ちゃったけど、見えてきた対策とよく見た記事

##経緯
Railsチュートリアルを1日1章以上を終わらすことを目標にしている。
なので、できる限り時間を有効に使わなければいけない。
進捗も折り返し地点を過ぎ、これからさらに難易度が上がってくると思うので
やり方や、しょうもないつまづきポイントををここで整理しておきたい。


##見えてきた対策
進め方としては、３周する方法が堅実かなと。

①周目：流し読み
②周目：見様見真似でコード打ってみる
③周目：しっかり理解


今日たまたま会社でRailsチュートリアル3周した先輩の隣に座り、
経験者目線だとこのやり方が効率いいとアドバイス受け、やってみる。
ググってもそういう情報は出てくるが
確かに上から丁寧にじっくりやるより時間的にも精神的にも良いやり方だ。
ただしコピペに頼りすぎると後々痛い目に遭うので注意が必要だ(汗)



##お世話になってる記事
①``rails server``起動中にCtrl + C をせずターミナルウィンドウを閉じた。
vscodeで作業中に``cmd + q``（ブラウザ閉じる）を数回やる。
個人的にこの記事は何度もお世話になっております。

https://qiita.com/short/items/3a1cd6f505f92e578f8f


②今作業してるブランチから一旦離れて、別のブランチを確認したい。
だんだん難易度が上がってくるにつれてブランチの行き来する頻度が増えました。

https://qiita.com/beanbeenzou/items/7b8d3b7ca98855b1b37b


##最後に
どんなに工夫しても結局はいかに作業時間を捻出できるかだと思うので、
しばらくは頑張っていきます。