OmniAICreator/Qiita-1.07M huggingface dataset:
AWSサービス一覧(2021年)　気になったやつだけ

自分のためにAWSサービス一覧をざくっと理解したいので、勉強用の備忘録として何回かに分けて書こうかと思います。
というか、AWSサービス一覧のページはいっぱいあり、以下のページが最新情報としてはよい。
【2021年】AWS全サービスまとめ
https://dev.classmethod.jp/articles/aws-summary-2021/#toc-196

じゃ、上記をみればいいじゃんという話になるけど、
私が何をするかというと、上記サマリーページをサマリーしていこうかと、自分が覚えやすいように。

AWSサービスのカテゴリ分けとしては下記の形になるにかなと。
全部網羅するのはめんどくさいで、とりあえず、こんな感じでやっていこうかと。

##インフラ編
URL(1/2):https://qiita.com/get-latest-information/items/6e9d4cf97f27be8da436
URL(2/2):https://qiita.com/get-latest-information/items/2a883774143f8b323dcf
(Updated:2021/05/18)

1. コンピューティング
1. コンテナ
1. ストレージ
1. データベース
1. 移行と転送
1. ネットワーキングとコンテンツ配信
1. VMware Cloud on AWS

##アプリ編
URL:https://qiita.com/get-latest-information/items/03fcedec8fbae8d5a3f6
(Updated:2021/05/18)

2. 開発者用ツール
2. モバイル
2. ビジネスアプリケーション
2. アプリケーション統合

##管理とセキュリティ編
URL:To be updated

3. 管理とガバナンス
3. セキュリティ、IDおよびコンプライアンス

##機械学習・ロボット編
URL:To be updated

4. Machine Learning
4. 分析
4. TensorFlow on AWS
4. ロボット工学

##その他
URL:To be updated

5. ブロックチェーン
5. 衛生
5. メディアサービス
5. 拡張現実(AR)とバーチャルリアリティ(VR)
5. ゲーム開発
[Ruby]特異メソッドの定義方法には2種類ある！

# はじめに
まずは、特異クラスや特異メソッドとは何か分かるでしょうか？？
タイトルにある通り、特異メソッドの定義方法には2種類あり、`特異クラス定義式による方法`と`特異メソッド定義式による方法`があります。
名前はなんとなく分かるけど、使い方が分からないとか、その逆もあることかと思います。
習得すれば、強力な武器になると思うので、ぜひ覚えていってください！

# 特異メソッドとは
特異メソッドとは１つのインスタンス固有のメソッドのことを指します。
特定のインスタンスに特別な性質を持たせたい場面に活躍します。

## 特異メソッドの定義方法

```ruby
# helloオブジェクトを作成
hello = 'hello'

# helloオブジェクトにsayメソッドを作成(特異メソッド)
def hello.say(count = 1)
  count.times { print self } # ここでのselfは「hello」となる
end

hello.say(2) #=> hellohello
```

`Object#define_singleton_method`メソッドを使用して、特異メソッド作成することも可能です。

```ruby
class Foo
  class << self
    def class_name
      to_s
    end
  end
end

# helloという特異メソッドを定義
Foo.define_singleton_method(:hello) do
  "Hello! #{class_name}"
end

# helloメソッドを呼び出し
Foo.hello #=> "Hello! Foo"
```

# 特異クラスとは
あるオブジェクトに特異メソッドを定義した際に、そのメソッドが定義されるクラスが特異クラスです。
通常のクラスとは違い、特異クラスはあるオブジェクトだけが使用するクラスです。`(主にselfオブジェクトであることが多いです)`
そのため、特異クラスからオブジェクトを作成したり、サブクラスを作成することは禁止されています。

## 特異クラスの定義方法

```ruby
# helloオブジェクトを作成
hello = 'hello'

# この中で定義されたメソッドはすべて「hello.メソッド名」の特異メソッドとなる
class << hello
  def say(count = 1)
    count.times { print self } # ここでのselfは「hello」となる
  end
end

hello.say(2) #=> hello, world
```

## class << selfの解説
`class 〜 end`の間に定義することで、インスタンスがアクセス可能なインスタンスメソッドが定義されますが、`class << self 〜 end`の間に書くことで、クラス自体にメソッドが定義されます。

```ruby
class Foo
  def hello
    puts 'hello'
  end

  class << self
    def sample
      puts 'sample'
    end
  end
end

# Fooクラスのインスタンスを作成
foo = Foo.new

# fooインスタンスにはhelloが定義されているので実行される
foo.hello #=> hello

# fooインスタンスではsampleメソッドにアクセス出来ない
foo.sample #=> NoMethodError

# Fooクラスのクラスメソッドなので正しく実行される
Foo.sample #=> "sample"

# Fooクラスのインスタンスメソッドなので、クラスではアクセス出来ない
Foo.hello #=> NoMethodError
```

# 終わりに
特異クラスや特異メソッドについての理解が深まりましたでしょうか？
理想は使いこなすことですが、足掛かりになればと思います。
共に頑張って習得しましょう！！
Rails Tutorial   Gimei で行った変更が反映されなかったときしたこと-memo-

ユーザーのサンプルデータを外国人の名前から日本人の名前にしようと思ったとき
seeds.rb からサンプルデータをGimei gem を使って変更したが

``` 
rails db:seed

rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
```

このようなエラーが出たので

```
rails db:reset
rails db:seed
rails db:migrate
```
の順にやったが変わらず

```
$ rails db:drop
$ rails db:create
$ rails db:schema:load
$ rails db:seed
$ rails db:migrate
```
でうまくいった。

参考
https://qiita.com/suzuki-koya/items/02d5e349bff179c44454
PHPとMySQLでIPアドレスごとのスクリプト実行回数を記録する

突然Ｗｅｂページのアクセスが増えた！！！
よく分からないリクエストが多発している！！！！！
もしかしてbotでは？？？？？？？？
怖い！！！！助けて！！！！！！！！！！！

そんな時は訪問者のＩＰアドレスを取得して、スクリプト実行ごとに実行回数を記録すればよい。
特定のアドレスから異様な数のアクセスがあれば、そのアドレスはbotやスクリプトを使っているかもしれない。

```saveIP.php
    $host = "hostname";
    $db = "dbname";
    $username = "username";
    $pass = "password";

    $dbh = new PDO("mysql:host=$host; dbname=$db; charset=utf8", $username, $pass);

    $ip = ip2long($_SERVER["REMOTE_ADDR"]);//IPアドレスを取得して数値に変換

    $sql = "INSERT INTO table (ip, num) VALUES ($ip, 0) ON DUPLICATE KEY UPDATE SET num = num+1 WHERE ip=$ip";//IPアドレスがDBになければ挿入、既存ならnumを1増やす
    $req = $dbh->query($sql);
```
DBに`table`というテーブルがあり、`ip(ユニーク)`、`num`というカラムがあるという前提である。

一定時間ごとに一定以上のアクセスがあれば、リクエストされた内容を拒否すればよい。
erb でコメントアウトする方法

.erb のファイルを編集するとき<%= %>で囲まれた行が、ctrl + / でコメントアウトされないので調べてみた。 

"#"を "<%" と "=" のあいだに入れるだけでした。 

```application.html.erb
<%#= debug(params) if Rails.env.development? %> 
```

ほかにも方法があるみたいです。

・Ruby の複数行コメント =begin ... =end を使う方法

```
<% =begin %>
   ...
<% =end %>
```

・if false で囲う方法 

```
<% if false %>
   ...
<% end %>
```


参考
https://ja.stackoverflow.com/questions/43321/html-erb%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E6%96%B9%E6%B3%95
【AWS】ピアソンVUEでAWS認定資格をオンライン受験すると不合格でも再受験が無料らしい

日本国内在住者の受験限定で、Pearson VUE のオンラインプロクタリングで受験すると、1回目の受験が不合格でも、2回目の受験が無料になるそうです。

[公式ソース](https://pages.awscloud.com/Global_TrainCert_Japan_Online_Proctoringja.html)

>2021年5月1日から2021年7月31日の AWS 認定の受験で、ピアソンVUEのオンラインプロクタリングを指定して予約する際に、プロモーションコード「AWS2021JP」を入力して適用するだけです。試験も試験監督員も日本語が選択いただけます。1回目の受験が不合格の場合には、2021年9月30日までの同試験の再受験（2回目）が無料になります。このプロモーションは日本国内在住者のみご利用いただけます。その他のプロモーションコードならびにバウチャーチケットの併用はできません（バウチャー支払い不可）。利用規約が適用されます。

でも、既に受験して合格実績のある人は、受験料半額クーポンを持っていると思うので、
これ併用出来ないからちょっと残念。

初めて受験される方などはこの機会に利用するのは良いかもしれませんね。
Javaの配列とリスト配列で配列の要素を数える方法が違います

Javaで配列とリスト配列で配列の要素を数える方法が違います。

配列の場合は

```java
public class Main{
   public static void main(String[] args){
       String[] data = {"test1","test2","test3"};
       for(int i=0;i<data.length;i++){
          System.out.println(data[i]);
       }
   }
}
```


に対し、リスト配列では

```java
import java.util.*;

public class Main{
   public static void main(String[] args){

      ArrayList<String> data = new ArrayList<String>();
      data.add("test1");
      data.add("test2");
      data.add("test3");
      for (int i=0;i<data.size();i++){
          System.out.println(data.get(i));
      }
   }
}
```

になります。配列ではlengthプロパティに対し、リスト配列ではsize関数になります。
注）今回は配列がlengthプロパティでリスト配列がsize関数を使うのか混同する知り合いの方向けに作成したため、拡張for文については割愛させていただきます。
「inputコマンドを利用して.texファイルを分割している文書」をVSCodeのLaTeX Workshopでうまくコンパイル(タイプセット)出来なかったのを解決した。

#はじめに

論文を書くのに $\LaTeX$ を使いますが、エディタは TeXShop を使っていました。
多少不満があったところ、VSCode + LaTeX Workshop (+ latexmk) が良さそうだと思い乗り換えようとしたんですが、タイトルの通りつまずき、検索してもなかなか対処法が見つからず、試してみた方法が当たりだったのでメモしておきます。

ちなみに VSCode + LaTeX Workshop (+ latexmk) の環境構築自体で主に参考にしたサイトです。
[VSCode で最高の LaTeX 環境を作る](https://qiita.com/rainbartown/items/d7718f12d71e688f3573)
[VS Code で LaTeX の執筆環境を整える](https://ichiro-maruta.blogspot.com/2019/12/vs-code-latex.html)

この記事は環境構築がほぼ出来た後でうまくいっていない人を対象にしています。

#先に結論

メイン以外の `.tex` ファイルをサブディレクトリに入れるようにする。

#環境

`macOS Big Sur: 11.3.1`
`Visual Studio Code:1.56.2`
`LaTeX Workshop:8.18.0`

#現象

次のようなディレクトリ構造と内容の文書があったとします。
(僕は`latexmkrc`をここに置いてますが、ホームディレクトリに置く方法とかもあるので今は無視して大丈夫です。`latexmk` は内部で `uplatex` というコマンドを実行する設定にしています。)

```
test-document/
├─ latexmkrc
├─ main.tex
└─ sub.tex
```

```main.tex
\documentclass[12pt,a4j]{ujreport}

\begin{document}

ここは main.tex です。

\input{sub}

\end{document}
```

```sub.tex
ここは sub.tex です。
```

この状態で LaTeX Workshop に Build させると、
`uplatex main.tex` だけでなく
`uplatex sub.tex` まで実行してしまいます。

`sub.tex`には`\begin{document} \end{document}`が無いので当然エラーが出て、Build のたびに邪魔くさいです。

#対処法

メイン以外の `.tex` ファイルをサブディレクトリに入れるようにします。

```
test-document/
├─ latexmkrc
├─ main.tex
└─ input/
   └─ sub.tex
```

```main.tex
\documentclass[12pt,a4j]{ujreport}

\begin{document}

ここは main.tex です。

% ディレクトリ移動に応じて書き換える。
\input{input/sub}

\end{document}
```

```input/sub.tex
ここは sub.tex です。
```

すると LaTeX Workshop の Build で
`uplatex main.tex`
のみが実行されるようになり、無駄なエラーが無くなります。

#おわりに

この方法に気付くまで数時間掛かってしまいました…
ディレクトリ構造を変えずに済む方法を知ってる方がいたら是非コメントで教えてください。
ちょっとつまずきましたが、VSCode + LaTeX Workshop の環境はかなり快適です。
まだの方はぜひ試してみては。

##追伸

`\usepackage[draft]{graphicx}`
<参考 [LaTexの使い方 (中級編)](https://www.library.osaka-u.ac.jp/doc/TA_LaTeX2.pdf)>

とすると画像を枠だけで表示するようになってコンパイルが爆速になります。
文章の編集中におすすめです。
OData Edm と JDBC Types とのデフォルトの型マッピング (於 Oiyokan v1.14)

OData Edm と JDBC Types のデフォルトの型マッピングを Oiyokan v1.14 では以下のように定義しています。

* 自力で REST API 実装をされる方の参考になればと思います。
* なお、Oiyokanでは JSON ファイルを編集することによりマッピングの挙動を上書き変更することができます。

| Edm type           | JDBC type       | h2 type   | PostgreSQL       | MySQL     | SQLSV2008      | ORCL18    |
| ------             | ------          | ------    | ------           | ------    | ------         | ------    |
| Edm.SByte          | Types.TINYINT   | TINYINT   | (N/A)            | TINYINT   | TINYINT        | (N/A)     |
| Edm.Int16          | Types.SMALLINT  | SMALLINT  | smallint (int2)  | SMALLINT  | SMALLINT       | SMALLINT  |
| Edm.Int32          | Types.INTEGER   | INTEGER   | int      (int4)  | INTEGER   | INT            | INT       |
| Edm.Int64          | Types.BIGINT    | BIGINT    | bigint   (int8)  | BIGINT    | BIGINT         | (N/A)     |
| Edm.Decimal        | Types.DECIMAL   | DECIMAL   | decimal(numeric) | DECIMAL   | DECIMAL        | DECIMAL   |
| Edm.String         | Types.CHAR      | CHAR      | char    (bpchar) | CHAR      | CHAR           | CHAR      |
| Edm.String         | Types.VARCHAR   | VARCHAR   | varchar          | VARCHAR   | VARCHAR        | VARCHAR   |
| Edm.String         | Types.CLOB      | CLOB      | text             | TEXT      | TEXT           | CLOB      |
| Edm.Boolean        | Types.BOOLEAN   | BOOLEAN   | bool (Types.BIT) | BOOLEAN   | BIT(Types.BIT) | (N/A)     |
| Edm.Single         | Types.REAL      | REAL      | real    (flort4) | REAL      | REAL           | REAL      |
| Edm.Double         | Types.DOUBLE    | DOUBLE    | double precision | DOUBLE    | FLOAT(53)      | FLOAT     |
| Edm.Date           | Types.DATE      | DATE      | date             | DATE      | DATE           | DATE      |
| Edm.DateTimeOffset | Types.TIMESTAMP | TIMESTAMP | timestamp        | TIMESTAMP | DATETIME2      | TIMESTAMP |
| Edm.TimeOfDay      | Types.TIME      | TIME      | time             | TIME      | TIME           | (N/A)     |
| Edm.Binary         | Types.VARBINARY | VARBINARY | bytea            | VARBINARY | VARBINARY      | RAW       |
| Edm.Binary         | Types.BLOB      | BLOB      | bytea            | BLOB      | VARBINARY      | BLOB      |

- Edm.Guid は Oiyokan v1.14 ではサポートされていません。
- [Salesforce Connect (OData 4.0) で利用する場合の注意点はこちらの記事を参照](https://qiita.com/igapyon/items/33a67cc972e0f881226b)。
- Oiyokan 自体については、[まずはこちらの記事を参照](https://qiita.com/igapyon/items/3fbdb0f3d3520a54f2a9)。

from: [github v1.14.20210510 OiyoMapJdbcEdmUtil.java](https://github.com/igapyon/oiyokan/blob/v1.14.20210510/src/main/java/jp/oiyokan/util/OiyoMapJdbcEdmUtil.java#L52)

> * 更新: 2021-06-06
> * 初出: 2021-05-16
[AtCoder] ABC 190 C - Bowls and Dishes

https://atcoder.jp/contests/abc190/tasks/abc190_c

いろいろ制約がたくさんですが、$2^K$通りを調べればよく、Kも最大で16なので全探索してしまいます。
2つのうちのどちらかを選び続ける実装で、自分は再帰を使いがちなんですが他にいい方法はあったりするのだろうか。
全部の選択が終わったら満たされる条件の数を計算して最大値を求めています。
言語はC++(GCC 9.2.1)でAtCoderのコードテストで確認しています。

```c++
#include <bits/stdc++.h>
using namespace std;

int N, M, K;
vector<int> A(101), B(101), C(16), D(16);

int maxCondition(vector<int> E, int index) {
  if (index == K) {
    int count = 0;
    for (int i = 0; i < M; i++) {
      if (E[A[i]] && E[B[i]]) count++;
    }
    return count;
  }

  int count1, count2;
  E[C[index]]++;
  count1 = maxCondition(E, index+1);
  E[C[index]]--;
  E[D[index]]++;
  count2 = maxCondition(E, index+1);

  return max(count1, count2);
}

int main() {
  cin >> N >> M;
  
  for (int i = 0; i < M; i++) {
    cin >> A[i] >> B[i];
  }

  cin >> K;

  for (int i = 0; i < K; i++) {
    cin >> C[i] >> D[i];
  }
  
  vector<int> E(101, 0);
  cout << maxCondition(E, 0) << endl;
}
```
MySQLで開発する前にsqliteで軽く検証してみる

#概要
公式ドキュメントではMySQLでやってねっていうけど、sqliteの方が初心者開発者には優しいのでは？と思い、記事にしていきます。今回は短い記事になると思います。

#開発環境
vscode
mac
djagno=3.2.1
python=3.9.1

#きっかけ
MySQLの中身を見たいけど、何かインストールしないといけない。でも面倒。。。
いつかは入れるけど、今はそんなに使わないしなぁと思い、色々調べたらvscodeでは、何もインストールせずにsqliteの中身を確認できるとのことだったので、試してみました。

#内容
vscodeでコマンドパレットというのはご存知でしょうか？
pythonのインタプリタとかを指定するために使っているとは思いますが、DBにうまく値を入れられているかを確認するためにも使えます！コマンドパレットの開き方は、vscodeの「表示」をクリックして、すぐ下にコマンドパレットがあります。または、シフト+command+pでも開くことができます。開けたら、`sqlite`と打ってみましょう。そしたら、予測に`SQLite:Open Database`と出てくると思いますので、それを押します。そうしたら、`db.sqlite3`と出てくるので、それも押します。これで準備完了です。この`SQLITE EXPLORER`が今回の紹介したいものになります。
![スクリーンショット 2021-05-16 19.01.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456093/97ffbf07-3040-aeeb-4895-fc4ecce7c874.png)
migrateしたら、ここに新しいtableができるので、右クリックで`show table`をして確認してみてください。私の場合はこんな感じです。![スクリーンショット 2021-05-16 19.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456093/02f95746-8cd1-b1af-5fc9-03ee3df74be4.png)
vscodeを使っている人はかなり簡単にできるので、試してみてください。
複数人でterraformを扱う際に気を付ける事

#複数人でterraformを扱う際に気を付ける事
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/d7791108-ec33-6634-6db6-12c5624d9d1b.png)








#上の図の補足
上の図の補足をします。
10:00前の時点では、AさんとBさんのtfstateファイルは同じ状態だったとします。
Aさんが10:00にAWS上にリソースAをデプロイする為、terraform applyを実行したとします。
するとAWS上にはリソースAがデプロイされ、AさんのtfstateにはリソースAがデプロイされたことが記録されます。
この時点でAさんとBさんのtfstateファイルに差異が生まれます。
すると10:05という同じ時間にterraform planを行ったとしてもAさんとBさんの結果は異なり、
Bさんがterraform applyを実行しようとすると既にAWS上にリソースAは存在する為、エラーが発生します。

#-解決法- backend設定①
terraformには複数人で作業をするための設定としてbackend設定が存在します。

```:provider.tf
terraform {
  backend "s3" {
    bucket = "tfstate-test"
    key    = "tfstate"
    region = "ap-northeast-1"
  }
}
```
予め、S3上でtfstate-testという名前のバケットを作成しておき、terraform initを実行します。
これでtfstateファイルを複数人で共有することができます。


#-解決法- backend設定②
上記の設定だけでは、複数人が同時にapplyやdestroyすることを防げません。

そこでまず、dynamodbをデプロイしてください。

```:main.tf
resource "aws_dynamodb_table" "terraform-state-lock" {
  name           = "tfstate_lock"
  read_capacity  = 1
  write_capacity = 1
  hash_key       = "LockID"

  attribute {
    name = "LockID"
    type = "S"
  }
}
```

その後、backend設定を以下のように書き換えます。

```:provider.tf
terraform {
  backend "s3" {
    bucket = "tfstate-test"
    key    = "tfstate"
    region = "ap-northeast-1"
    dynamodb_table ="tfstate_lock"
  }
}
```

これで、terraform applyやterraform destroyを実行する際にはtfstateファイルがロックされ、複数人が同時にapplyやdestroyすることができなくなります。
GAS TypeError: output.append is not a function が出る場合の対応方法について

#はじめに
こんにちは。システムエンジニアのDiavoloです。

GASでWEBアプリを作成する場合、地味に嵌りがちなエラーの回避方法を記事にします。GASのWEBアプリの作成コードを参考にして、GASを作成し実行したときに、「TypeError: output.append is not a function」というエラーが出てしまうことがあります。
昔に書かれた記事のソースコードはChrome V8 ランタイム以前のものがあったりします。output.appendはChrome V8 ランタイムを有効にするとエラーになりますので、GASの設定をoutput.appendはChrome V8 ランタイムを無効にするとエラーが出なくなります。

#ソースコード
###Chrome V8 ランタイム無効の場合には、このソースコードで問題ありません

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
  <!-- 先程作成したコード.gsのfunction getData()をコールする -->
  <? var data = getData()?>

  <!-- getData()で取得してきたデータがdataに格納されていますので、これを出力する -->
  <table border=1>
    <?
      for(var i=0; i < data.length; i++){
        output.append('<tr>');
        output.append('<th>' + data[i][0] + '</th>');
        output.append('<th>' + data[i][1] + '</th>');
        output.append('<th>' + data[i][2] + '</th>');
        output.append('</tr>');
      }
    ?>
  </table>
  </body>
</html>
```
### Chrome V8 ランタイムを有効にする場合には、こちらのソースコードになります

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
  <!-- 先程作成したコード.gsのfunction getData()をコールする -->
  <? var data = getData()?>

  <!-- getData()で取得してきたデータがdataに格納されていますので、これを出力する -->
  <table border=1>
    <?
      for(var i=0; i < data.length; i++){
        output._=('<tr>');
        output._=('<th>' + data[i][0] + '</th>');
        output._=('<th>' + data[i][1] + '</th>');
        output._=('<th>' + data[i][2] + '</th>');
        output._=('</tr>');
      }
    ?>
  </table>
  </body>
</html>
```
#まとめ
##TypeError: output.append is not a function が出る場合以下のいずれかの方法を試してください
###①GASのChrome V8ランタイムを無効にする
###②output.appendをoutput._=に変更する

この記事に掲載したソースコードについては、私の記事から抜粋しています。良かったら覗いてみてくださいませ！！
[GoogleAppsScriptとGoogleスプレッドシートを連携したWEBアプリケーションを作成してみた【第二回】](https://qiita.com/Diavolo/items/6b08a87bbd89c97cdd0f)
Qt C++ 3Dグラフ表示 散布図で各座標ごとに色違い。 QtDataVisualization

#実行サンプル
x, y, z の3次元座標の3Dグラフ　散布図(scatter)を表示する。
各点で、それぞれ違う色にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423803/d0ef14b0-b14b-b588-6839-02c87927275b.png)


※プログラムのベースは記事：「Qt C++ 3Dグラフ表示 QtDataVisualization」　の通り
　https://qiita.com/taiko1/items/8f696e3a58f9ebadf944
※マウス操作でズームのみ可能。
※視点移動(=グラフ回転）はスライダーでする。（マウス操作はできない。）
※今時点のソースコードでは、スライダーを動かすと先にズームしていたのものが
　初期の位置に戻ってしまう。
　これから調べて、方法がわかれば修正するが
　それまでは、まず回転をスライダーでする→ズームするの順番で見たい位置を見る操作になる。

#実行環境
windows10
Qt5.9
VisualStudio2019

#実行手順
通常通り　QtCreatorでコード作成して、実行する。


#ソースコード
https://github.com/sakurataiko1/Qt_Cplus_DataVisualization/tree/main/QtDataVisual_my_3Dscatter_color

#コードのポイント

■　MainWindow.cpp でのreset でデータ追加され、その後色設定する。

```
    m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray);   
    m_graph->seriesList().at(0)->setBaseColor(Qt::red); //ポイントの色設定 (単一色の場合)
```


#参考資料
参考：
■　3D　立方体の自動回転表示　（マウス操作：ズームあり、視点移動なし）
https://github.com/fengfanchen/Qt/tree/master/3D%20move%20rotation

■　3D　objファイルから散布図でデータ表示（マウス操作：ズームあり、視点移動なし）
https://blog.csdn.net/qq78442761/article/details/103678544
https://github.com/fengfanchen/Qt/tree/master/3DScatter%20Demo

■　参考：Qt付属のExampleコード
　・サンプル　customplot　（マウス操作：ズームあり、視点移動なし？）
　・サンプル　bars (視点移動=グラフ回転）
　　↑スライダーで視点移動（マウス操作ではない。）

■　散布図で各点、色違いでの表示
https://stackoverflow.com/questions/44329125/q3dscatter-how-to-add-a-point-with-a-different-color-to-a-point-cloud  


#今後の参考予定
■　マウス操作での視点移動のサンプル
　見つかっていない。これから調べる。

■　グラフ表示を参考にする
　Qt公式　サンプル surface 

■　1つのグラフ領域(Axis)に2つ以上のグラフを描く 
　→https://forum.qt.io/topic/92510/overlapped-surface3d-and-scatter3d/8
  →Qt公式サンプルcustomitems　
  　https://doc.qt.io/archives/qt-5.9/qtdatavisualization-customitems-example.html
  →Qt公式サンプルrotation も参考になるかもしれない。
Route53で取得したドメインをWixで利用する方法

# はじめに
ドメイン周りの知識がなかったこともあり、
Route53で取得した独自ドメインをWixで使用するのに少し苦戦したため、方法を残しておく。

# Route53で取得したドメインをWixで利用する方法
基本的にWixの**既存のドメインを追加**にある、**登録済みのドメインを接続**の指示に従う。
**ネームサーバーを置き換えます**という手順で注意が必要で、
Route53のネームサーバーを変更するには、
Route53のダッシュボードから**[ドメイン](https://console.aws.amazon.com/route53/home#DomainListing:)**に移動し、該当するドメインを選択したあと、
**ネームサーバーの追加/編集**から変更することができる。
私はホストゾーンの設定のみを変更していたため、うまく行かなかった。。。
nvm-windowsでnode.jsのバージョン管理をする【Windows】

Node.jsのバージョン管理をwindowsPCでやりたくなったので入れ方を備忘録として。
どなたかの参考になれば幸いです:baby_tone2:

#手順

windowsはnodistが有名っぽいんですが、
以前なぜかめちゃくちゃ苦戦したのでnvmを入れてみます！

※正確にはnvm-windowsというMacで使うnvmのwindows版みたいなやつです。
nvm-windows：https://github.com/coreybutler/nvm-windows

##とりあえずアンインストール

現状普通に入っている場合はややこしくなるのでいったん削除します。
（```$node -v```でバージョン出てきたら入っていて、
　特にバージョン管理入れてなければベタだと思います）

スタート（左下のWindowsアイコン）
→ 設定（歯車アイコン）
→ アプリ
→ アプリと機能

出てくるリストにNode.jsがあるはずなのでそちらをアンインストールでOK！

## nvm-windowsのインストール
https://github.com/coreybutler/nvm-windows/releases
こちらのGitHubにダウンロードリンクの記載がありますので、
**nvm-noinstall.zip**をダウンロードします。
中に**nvm-setup.exe**が入っているので、素直にインストールを進めます。

終わったら```$nvm version```でバージョンを確認して、数字が出ればOK！


```
$nvm version
1.1.7
```


## Node.jsのインストール

インストール済みのNode.jsの確認が```$nvm list```、
インストールできるNode.jsの確認が```$nvm list available```でできます。

```
$nvm list available

|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    16.1.0    |   14.17.0    |   0.12.18    |   0.11.16    |
|    16.0.0    |   14.16.1    |   0.12.17    |   0.11.15    |

～省略～

This is a partial list. For a complete list, visit https://nodejs.org/download/release
```

LTS（推奨版）は**14.17.0**とのことですので、14.17.0をインストールしましょう。
```$nvm install [使いたいバージョン]```でインストールします。

```
$nvm install 14.17.0

～省略～
Installation complete. If you want to use this version, type
nvm use 14.17.0
```

インストール済みリストでも大丈夫そうです！

```
$nvm list
    14.17.0
```


## 使用バージョンの指定
```$nvm use [使いたいバージョン]```で指定ができます。
「デバイスに変更を加えることを許可しますか？」みたいなのが出てくるので通します。

```
$nvm use 14.17.0
Now using node v14.17.0 (64-bit)
```

インストール済みのリストと、Node.jsのバージョンを確認してみます。

```
$nvm list
  * 14.17.0 (Currently using 64-bit executable)

$node -v
v14.17.0
```
リストには*マークがついて使用してるよーというのがわかるようになり、
Node.jsのバージョン確認では選んだものが出るようになりました！

ちなみにnpmもしれっと大丈夫でした。

```
$npm -v
6.14.13
```

## バージョン切り替え

試しに最新版も入れて、切り替えてみます。

```
// インストール
$nvm install 16.1.0

～省略～
Installation complete. If you want to use this version, type

nvm use 16.1.0

// インストール済みリスト確認
$nvm list

    16.1.0
  * 14.17.0 (Currently using 64-bit executable)

// 使用バージョンの指定
$nvm use 16.1.0
Now using node v16.1.0 (64-bit)

// インストール済みリスト選択確認
$nvm list

  * 16.1.0 (Currently using 64-bit executable)
    14.17.0

// Node.jsのバージョンを確認
$node -v
v16.1.0
```
インストール → 切り替え → 確認を通してみましたが無事切り替わってますね！

## バージョン削除
さて、最新版は用済みなので削除です。
```$nvm uninstall [削除したいバージョン]```で削除します。

```
// 使用バージョンの指定
$nvm use 14.17.0
Now using node v14.17.0 (64-bit)

// インストール済みリスト選択確認
$nvm list

    16.1.0
  * 14.17.0 (Currently using 64-bit executable)

// 16.1.0をアンインストール
$nvm uninstall 16.1.0
Uninstalling node v16.1.0... done

// なくなってることを確認
$nvm list

  * 14.17.0 (Currently using 64-bit executable)
```

こちらも問題なく削除できました！

#まとめ
環境設定苦手マンでも躓かずできたのでスムーズでうれしいですね！
切り替えのときに確認が出るのが面倒ですがそれ以外はシンプルで分かりやすいです！

#使ったコマンドまとめ

| コマンド | 用途 |
|--------------|--------------|
|$node -v|Node.jsのバージョン確認|
|$npm -v|npmのバージョン確認|
|$nvm version|nvmのバージョン確認|
|$nvm list|インストール済みのNode.jsの確認|
|$nvm list available|インストールできるNode.jsの確認|
|$nvm install [使いたいバージョン]|Node.jsのインストール|
|$nvm use [使いたいバージョン]|使用バージョンの指定|
|$nvm uninstall [削除したいバージョン]|バージョンの削除|


ありがとうございました:sunglasses:
CFD/CAE基礎理論の独学用の推薦図書

## 投稿の動機

CFD/CAEソフトを使うことの難しさを関数電卓や表計算ソフトと同等だと勘違いしている人が多いように感じたため，CFD/CAEソフトの操作を覚えるのと並行して読んだほうが良いと考える本を紹介します．
自分が読んだ本の中で取捨選択した結果です．自分が未だ読んでいない本の中にも良書があるはずです．

## 想定読者

下記の箇条書き条件に全てに当てはまる人．

* CFD/CAEソフト自体の研究者や開発者ではなくユーザーとして使っている人．
* これまで数値計算理論を学んだことが無い人あるいは専門書を読んだことがない人，たとえば、FVM(有限体積法)やFEM(有限要素法)という技術用語の意味を理解していない人．
* 下記に例示する超基本的な技術用語の意味を知らない方
 * CFD：緩和係数，収束基準，乱流モデル．
 * CAE：応力の特異点，ガウス積分点の解，節点解，要素解．

## 推薦図書

#### 選定方針

* 想定読者で記載したように数値計算という専門分野に関わりがなかった人へ紹介する本のため，数値計算の専門書を含みません．
* CFD分野では流体力学の基本知識が，CAE分野では材料力学の基本知識が前提になっています．その専門分野に関わりのない人は，先に学習してください．
* 線形代数学(行列)，テンソル数学，連続体力学の基本知識も必要でが，その分野の本の紹介はいたしません．わからないことが出てくる都度，調べるという作業をしてください．(大学等で講義資料が公開されている場合があるのでweb検索をしてください．)


#### CFD
- [OpenFOAMによる熱移動と流れの数値解析（第２版）, 森北出版](https://www.morikita.co.jp/books/book/3624)
の中の「理論編」、約30ページ分
 - 下の本を読むための準備運動みたいな内容です。
- [数値流体力学, 森北出版](https://www.morikita.co.jp/books/book/2389)

#### CAE

- [<解析塾秘伝>有限要素法のつくり方! -FEMプログラミングの手順とノウハウ, 日刊工業新聞](https://pub.nikkan.co.jp/books/detail/00002756)


#### CFD/CAE共通(材料力学，流体力学，伝熱工学などの基礎工学)

- [＜解析塾秘伝＞CAEを使いこなすために必要な基礎工学！
現場技術者の構造解析、熱伝導解析、樹脂流動解析活用ノウハウ, 日刊工業新聞](https://pub.nikkan.co.jp/books/detail/00003109)


#### CFD/CAE共通(実践活用，Verification&Validation)

- [有限要素法解析ソフト Ansys工学解析入門, 旺文社](https://www.ohmsha.co.jp/book/9784274226090/)
- [工学シミュレーションの品質保証とV&V, 丸善](https://www.maruzen-publishing.co.jp/item/b294408.html)
【GAS】UNIXTIMEをyyyy/mm/dd型に変換する

# 【GAS】UNIXTIMEをyyyy/mm/dd型に変換する
はじめましてやまやです。

### 概要
GoogleAppScriptでUNIXTIMEをyyyy/mm/ddの形にしたい方向けに書かれた記事です。

### 経緯
今回、自分の場合、BigQueryでデータを抽出してスプレッドシートへ出力した際にUNIXTIMEになってしまった為、それをyyyy/mm/dd型に変えたくて書きました。

### コード
```
function myFunction() {
  var unixtime = 1560000000; //UNIXTIMEを入力する
  var unixtimeMultiply = new Date(unixtime*1000); //UNIXTIMEを秒からミリ秒へ変更
  var conversionDate = Utilities.formatDate(unixtimeMultiply, 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm:ss'); //フォーマット変える
  resultValue = conversionDate;
}
```
kaggleをやるときに使うライブラリ集（NLP）

# この記事について

kaggleに取り組むときに使ったライブラリについてまとめた備忘録。
取り組んだコンペは、[CommonLit Readability Prize](https://www.kaggle.com/c/commonlitreadabilityprize)。

# ライブラリ集

## [wandb](https://github.com/wandb/client)

学習モデルの可視化や管理ができるサービス [Weights & Biases](https://wandb.ai/home) のクライアントアプリ。学習結果のアップロードができる。

## [Missingno](https://github.com/ResidentMario/missingno)

欠損値を可視化するライブラリ。dataFrameを渡すと、欠損位置を2次元マトリクスで表示してくれる。

## [rich](https://github.com/willmcgugan/rich)

ターミナルの出力フォーマットを変更できる（richにできる）ライブラリ。日本語にも対応している。

## [Textstat](https://github.com/shivam5992/textstat)

テキストの統計情報を計算するライブラリ。読みやすさ、複雑度合いグレードレベル（アメリカでドキュメントにつけられる難易度の指標）を算出できる。
【初心者でもわかる】2枚の画像を重ねる3つの方法

# どうも7noteです。画像をテキストや文字に重ねたいときに使える3つの方法を解説
どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/image_overlap/
double selection sort までpython で書いてみた

[wiki の選択ソート](https://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%BD%E3%83%BC%E3%83%88)を見たところ
最小最大を同時の確定させるロジックのことを
double selection sort

と呼ぶらしいことを知った
初めて知った・・・お勉強タイムなのでこれを今日は書いてみることにしました
とらあえずは昇順ソートと降順ソートを書いてみまして
これらを同時に行う感じですが・・・
最小　と　最大　が入り組んだ場合の考慮が必要だったのですが
もっとスマートに書けるのではないかな。
残課題となりました。


```python:selection_sort_asc
#昇順（最小値を先頭に移動）
def selection_sort_asc(A):
    for i in range(len(A)):
        min = i
        for j in range(i+1, len(A)):
            if A[j] < A[min]:
                min = j
        A[i], A[min] = A[min], A[i]
```

```python:selection_sort_desc
#降順（最大値を先頭に移動）
def selection_sort_desc(A):
    for i in range(len(A)):
        max = i
        for j in range(i+1, len(A)):
            if A[j] > A[max]:
                max = j
        A[i], A[max] = A[max], A[i]
```


```python:selection_sort_asc2
#昇順（最大値を最後尾に移動）
def selection_sort_asc2(A):
    for i in range(len(A)):
        max = len(A)-1-i
        for j in range(len(A)-1-i):
            if A[j] > A[max]:
                max = j
        A[len(A)-1-i], A[max] = A[max], A[len(A)-1-i]
```

```python:double_selection_sort
#昇順（最小値を先頭に、最大値を最後尾移動、両方同時に移動）
def double_selection_sort(A):
    for i in range(len(A)//2):
        min = i
        max = len(A)-i-1
        for j in range(i,len(A)-i):
            if A[j] < A[min]:
                min = j
            if A[j] > A[max]:
                max = j
        A[len(A)-1-i], A[max] = A[max], A[len(A)-1-i]
        if min !=len(A)-1-i:
          A[i], A[min] = A[min], A[i]
        else:
          A[i], A[max] = A[max], A[i]
```

```python:実行結果
LL = [7,4,3,17,14,13, 11, 12,15, 1, 2,5]
L=LL
print("src",L)
# src [7, 4, 3, 17, 14, 13, 11, 12, 15, 1, 2, 5]

double_selection_sort(L)
print("double_selection_sort",L)
# double_selection_sort [1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 17]

L=LL
selection_sort_asc(L)
print("selection_sort_asc",L)
# selection_sort_asc [1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 17]

L=LL
selection_sort_desc(L)
print("selection_sort_desc",L)
# selection_sort_desc [17, 15, 14, 13, 12, 11, 7, 5, 4, 3, 2, 1]

L=LL
selection_sort_asc2(L)
print("selection_sort_asc2",L)
# selection_sort_asc2 [1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 17]

L=LL
double_selection_sort(L)
print("double_selection_sort",L)
# double_selection_sort [1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 17]

exit()
```
Git補完 ~その1~

#Gitを使う際に地味に知っておくと良いコマンド

##エイリアスをつける
```ruby:alias
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.co checkout
#この様にエイリアスを設定しておくとコマンドを効率よく打つことができる
```
※もし、--globalをつけないと現在のプロジェクトに対してのみconfigファイルに設定される

##Gitで管理したくない情報の管理について

gitでバージョン管理したくないファイルを管理する方法
バージョン管理したくないファイルとは
例：パスワードやサーバ情報、キャッシュなど自動生成されるファイル
**.gitigonre**ファイルに書く

```
index.html
#指定したファイルを除外したい時

/root.html
#ルートディレクトリを指定したい時

dir/
#ディレクトリ以下を除外したい時

//.css など
#/以外の文字列にマッチさせる場合
```
Linux基本的なコマンド

# 基本的なコマンド
progateとLinux標準教科書で学習しましたが、忘れた時に情報拾いに行くのが手間なのでメモします。


## ファイルやディレクトリの参照

```
ls [オプション] [ファイル]
```
**オプション**
**-a**　.で始まる隠しファイルも全て表示 
**-l**　長形式で出力（Long） 
**-t**　新しい順にソート（Time） 
**-r**　逆順にソート（Reverse）

オプションはまとめられる

```
$ ls -la
```
　

## ファイルのコピー

```
cp [オプション] [コピー元] [コピー先]
```
**オプション**
**-i**　上書き時に確認問い合わせが来る 
**-r**　ファイルのみでなくディレクトリ内の全てのファイル・ディレクトリにコピーを行える
**-p**　古い情報を保持したままコピー
　

## ファイルの移動

```
mv [移動元] [移動先]
```
**オプション**
**-i**　移動時に確認問い合わせが来る 
**-f**　強制的に実行
　

## ファイルの削除

```
rm [ファイル名]
```
**オプション**
**-i**　削除時に確認問い合わせが来る 
**-f**　強制的に実行
**-r**　ディレクトリを対象にする
　

## 現在のディレクトリの表示

```
pwd
```
Print Working Directoryの頭文字。
　

## ディレクトリの変更

```
cd [ディレクトリ名]
```
cd ..で一つ上の階層に戻れる
　

## ディレクトリの作成

```
mkdir [ディレクトリ名]
```
**オプション**
**-p**　指定されたディレクトリの上位のディレクトリも作成する

実行例

```
$ mkdir -p dir1/dir2/dir3
```
これでdir1/dir2/dir3まとめて作成できる
　

## ディレクトリの削除

```
rmdir [ディレクトリ名]
```
**オプション**
**-p**　指定されたディレクトリの上位のディレクトリも削除する

ディレクトリが空の場合のみ使用可能
中にファイルが存在する場合はrm -fを使い削除する
　

## 特別なディレクトリ
- カレントディレクトリ (.)
- 親ディレクトリ (..)
- ホームディレクトリ (~)
- ルートディレクトリ (/)

**ホームディレクトリ**
ログイン直後の作業開始位置となるディレクトリで、ユーザーごとに異なる

**ルートディレクトリ**
ディレクトリ改装の最上位階層
　

## ファイルの内容を表示

```
cat [ファイル名]
```
**オプション**
**-n**　行番号を付加して表示
　

## ページャを使った表示

```
more [ファイル名]
less [ファイル名]
```
catコマンドでは長すぎる場合はどちらかを使いその後コマンド入力する
　

## ファイルの検索

```
find [パス] -name [ファイル名]
```

例えば/projectにあるtestという名前のファイルを検索したい時はこのように入力

```
$ find /projects/ -name test
```
　

## コマンドのパスを表示

```
which [コマンド名]
```

例えばcatコマンドを表示したい時

```
$ which cat
/bin/cat
```
　

## コマンドの使い方を表示

```
[コマンド名] --help
```
　

## コマンドのマニュアルを表示・検索

```
man [コマンド名]
```

**オプション**
**-k** 単語検索できる
Vue.js開発で役に立つVSCode拡張機能

## Vue.js開発でVsCodeに追加した拡張機能
最近、Vue.js開発でVsCodeを使用することが多いため、
便利に感じた拡張機能を紹介します。

## 追加した拡張機能8選
1.[Live Server](https://github.com/ritwickdey/live-server)
HTMLやCSSの修正で自動的にブラウザがリロードしてくれるツールです。
Live Serverを使うと効率良く開発ができるようになります。

2.[Vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur)
Vue開発には必須のツールです。
Veturを使うと、Vueの開発に役立つ様々な機能が用意されているため非常に便利です。
スニペットやフォーマットチェックなどVueに特化した拡張機能です。

- シンタックスハイライト
- スニペット
- Emmet
- コードチェック（linting/Erorr Check）
- オートコンプリート

3.[Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
ソースコードを自動で整形してくれるツールです。
自動で整形してくれるため、タブのサイズや位置、さらにセミコロンやシングルクォーテーションなども整形してくれます。

4.[Auto rename tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)
開きタグと閉じタグのセットを自動で整形してくれるツールです。
作業中の無駄なミスを減らすことができます。
divタグからaタグに変更したときに自動でaタグに変化してくれます。

5.[Auto close tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag)
VsCodeは自動でタグを閉じてくれるのですが、
閉じタグのタイミングというか場所が変更できなくてイライラします。
そんな時はこのツール。使いやすいタイミングで閉じるようにするとストレスなく作業できます。

6.[brackets pair colorizer](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)
タグや色付けされる括弧を変更できるツールです。
初期設定では色付けされる括弧は「()」「[]」「{}」の3種類だけなので、「<>」などHTMLで使用するタグに変化がありませんので、追加すると見やすくなります。

7.[beautify](https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify)
コードフォーマット(整形)してくれるツールです。
javascriptやJSON, CSS, Sass, HTMLコードを選択し、command palletからBeautifyを実行すると綺麗に整えてくれます。

8.[Vue Peek](https://marketplace.visualstudio.com/items?itemName=dariofuzinato.vue-peek)
選択したコンポーネントやファイル名について、参照されるファイルにすばやくジャンプしたり、ファイルを覗いたりすることができます。
`import`先とかに素早く飛べるので便利です。

## まとめ
Vs Codeの拡張機能がすごく充実していて勉強になりました。
作業効率や色々と調べながら作業できたので楽しかったです。

以下のpackを参考にしています。
◇VSCode+Vue.jsを使用するならインストールするべき拡張機能と設定
https://iwb.jp/vscode-vuejs-extensions-install-settings/

## 参考文献

◇Live Server
https://life-care.site/programming/liveserver_install_how_to_use

◇Vetur
https://johobase.com/vue-js-visual-studio-code-vetur/

◇Prettier
https://ma-vericks.com/vscode-prettier/

◇Auto rename tag
https://tech.pjin.jp/blog/2020/04/27/vscode_extension_auto_rename_tag/

◇Auto close tag
https://usagi-post.com/ja/archives/1091

◇brackets pair colorizer
https://blog.proglus.jp/4255/

◇beautify
https://capotast.co.jp/article/detail/8/
【p5js】P_1_0_01 四角いアート

四角の色がマウスの位置で変化する

http://www.generative-gestaltung.de/2/sketches/?01_P/P_1_0_01

```javascript:qiita.rb
'use strict';

/**
 * 初期設定
 */
function setup() {
  //キャンバスを作成する
  createCanvas(720, 720);
 
  //カーソルを非表示にする
   noCursor();

  //初期カラー
  colorMode(HSB, 360, 100, 100);

  //四角はセンターにする
  rectMode(CENTER);

  //ストロークをOFFにする
  noStroke();
}

/**
 * 描画設定
 */
function draw() {

  //背景色
  background(mouseY / 2, 100, 100);

  //塗りつぶす（背景色とずらすために、360とする）
  fill(360 - mouseY / 2, 100, 100);

  //四角の大きさを変える
  rect(360, 360, mouseX + 1, mouseX + 1);
}

/**
 * キー入力で画像として保存する
 */
function keyPressed() {

    //ｓがキー入力されたらタイムスタンプで保存
    if (key == 's' || key == 'S') saveCanvas(gd.timestamp(), 'png');
}
```
Lenovo Z6 Pro ROM焼き まとめ

# はじめに

Lenovo Z6 Pro ( zippo ) にカスタムROMを焼く、いわゆるROM焼きの手順です。
中華端末はだいたい同じようなので、他の機種にも応用できます。

初心者向けには書いていません。自分用のメモです。
開発環境の用意があり、adb / fastboot は利用できることが前提です。


# 準備するもの

* Android端末のUSBドライバー
* Adb
* Fastboot
* sn.img ( bootloader unlock file )
* QFIL (Qualcomm Flash Image Loader )
* Stock ROM ( L78051_CN_11_5_381_Q_Stable )
* vbmeta.img ( Stock ROM の中に入ってます）
* Custom Recovery ( twrp-3.4.0-1-zippo-mauronofrio.img )
* Custom ROM ( 好きなものを拾ってくる )


# 手順
文鎮化している状態でもEDL（Emergency Download ）が起動すれば修復できます

![len1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21236/f512ead1-b89e-0374-c02e-e5a8405d9def.png)


## Stock ROM （純正ROM）に戻す
純正の modem ディレクトリーなどが必要なため、一旦純正ROMを焼く必要がある。

1. QFILを起動する。
1. ① LoadContentをクリックして、Stock ROM 内の content.xml を開く。
1. ② 端末をUSB接続して EDL モードで起動する。
1. ③ SelectPort をクリックして接続ポートを選択する。
1. ④ Download Content をクリックして完了するまで待つ。
1. Failed などと表示されたら失敗。
Stock ROM が合っていて失敗する場合は成功するまで繰り返す。
1. 成功したら端末の初期設定を済ませ、開発者モードを有効にする。

## Bootloader をアンロックする
初回や、何らかの理由で Bootloader が locked になっている場合は、この作業が必要。
申請URL
https://www.zui.com/iunlock

![len2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21236/f145957b-7d48-c07b-6b6a-bf63e0e259f7.png)

1. 申請する。
1. メールで sn.img が送られてくる。
1. adb
1. fastboot で起動して下記コマンドでアンロック。
1. 再起動。

```shell
fastboot flash unlock sn.img
fastboot oem unlock-go
fastboot reboot fastboot
```

## カスタムリカバリーを入れる

1. vbmeta.img を適用して、ブート検証（AVB）を無効にする。
1. カスタムリカバリーを焼く。
1. カスタムリカバリーを起動。

```shell
fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img
fastboot flash recovery twrp-3.5.2_10-0-zippo.img
fastboot reboot recovery
```

## カスタムROMを焼く

1. TWRP を起動する。
1. Data がマウント出来ないので Wipe -> Format Data -> yes と入力 -> Enterキー
1. Backup からバックアップを取っておく。（必要に応じて。）
1. Wipe する Wipe -> Advanced Wipe -> Cache, System, Data にチェック -> 実行（スワイプ）
1. ROM を焼く Install -> ROM を選ぶ -> 実行（スワイプ）
1. 上記の完了画面から Wipe Cache/Dalvik -> 実行（スワイプ） ※これを忘れると Boot loop 突入
1. 上記の完了画面から Reboot System をタップして完了。

再起動する前に OpenGaps や magisk を焼いてもいいです。


# ROM 焼き情報リンク

* [Telegram - Lenovo Z6 Pro Fucking Arsenal](https://t.me/s/z6proarsenal)
* [XDA - Lenovo Z6 Pro ROMs, Kernels, Recoveries, & Other D](https://forum.xda-developers.com/f/lenovo-z6-pro-roms-kernels-recoveries-other-d.10655/)

# ファイル個別リンク

* [TWRP ( 2021-10-20 時点の最新版は 3.5.2-10 )](https://twrp.me/lenovo/lenovozippo.html) 
* [Device Firmware ( ROM によっては必要 ) ](https://osdn.net/projects/lineageos-for-zippo/releases/p17514)
* [ZUI Camera ( 多眼カメラを利用するための公式App )](https://osdn.net/projects/lineageos-for-zippo/releases/p17942)


# カスタム ROM 個別リンク
* [Pixel Experience](https://t.me/s/z6proarsenal?q=pixelexperience)
* [lineageos-for-zippo](https://osdn.net/projects/lineageos-for-zippo/releases/p17614)
* [crDroid](https://t.me/s/z6proarsenal?q=crdroid)
* [Evolution X](https://forum.xda-developers.com/t/rom-11-zippo-unofficial-evolution-x-daylight-04-05-2021.4244883/)

# 編集履歴
2021-05-16 初版
2021-10-21 一部新しい情報へ書き換え
関数を評価する前もしくは評価した後のセルの値が欲しい

# 関数を評価した後の値が欲しい

Apache POIでセルの値を取得する際、「セルに関数が含まれている場合は関数を評価した後の値が欲しい」とします。書き方はいろいろあるのですが、おおよそ以下のようにすればよいです。

```java
// WorkBookオブジェクトからFormulaEvaluatorを生成する。
FormulaEvaluator formulaEvaluator = book.getCreationHelper().createFormulaEvaluator();

// CellのCellTypeを取得する。Cellが関数を含む場合は関数の評価後のCellTypeを取得する。
CellType cellType = (cell.getCellType() == CellType.FORMULA) ? formulaEvaluator.evaluateFormulaCell(cell) : cell.getCellType();

// CellTypeにあわせて値を取得する。ここではサンプルとして文字列型を取得している。
if (cellType == CellType.STRING) {
    String stringCellValue = cell.getStringCellValue();
    doSomething(stringCellValue);
}
```

# 関数を評価する前の値が欲しい / 関数そのものが欲しい

上とは違って、セルに含まれている関数そのものが欲しい場合は、`Cell::getCellFormula`を利用します。

```java
if (cell.getCellType() == CellType.FORMULA) {
    String cellFormula = cell.getCellFormula();
    doSomething(cellFormula);
}
```

# 動作確認環境 (pom.xmlより抜粋)

```xml
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.0.0</version>
</dependency>
```
redirect_back(fallback_location: root_url)で常にエラーが発生していた話

## 前提

rspecでmod操作をチェックすることができるようになったので、確認ダイアログが表示される操作の統合テストを追加した。（`data: { confirm: "削除してよろしいですか？" }`の部分）

しかしその際に、エラーが発生したので、その修正に軌跡をここに記しておくこととする。

ちなみに、RSpecで確認ダイアログを操作するコードは以下を参考にしました。ありがとうございました！！

https://qiita.com/at-946/items/403d85d45cb02615c323

## 結論
遷移の前のページが削除される操作の場合、`redirect_back`という指示は適切ではない。

### エラーの原因とその修正
テストした箇所と、エラーが発生していた部分、その修正。

```ruby:app/views/works/show.html.erb
:
<% if current_user?(@work.user) %>
	<div class="work--settings">
	  <span class="delete_btn field__negative">
	    <%= link_to "削除する", work_path(@work), method: :delete, data: { confirm: "削除してよろしいですか？" } %>
	  </span>
	</div>
<% end %>
:
```

```ruby:app/controllers/works_controller.rb
 class WorksController < ApplicationController
	:
   def destroy
     @work.destroy
     flash[:success] = "削除しました。"
-    redirect_back(fallback_location: root_url)
+    redirect_to root_url
   end
	:
```

```ruby:spec/system/works/create_work_spec.rb
require "rails_helper"

RSpec.describe "Create or delete work", type: :system, js: true do
  let(:user) { create(:user) }
  let(:work) { create(:work, user_id: user.id) }

  it "delete work" do
    sign_in user
    visit work_path work
    within(".work--settings") do
      expect(page).to have_selector "span.delete_btn"
      page.accept_confirm do
        click_link "削除する"
      end
    end
  end
end

```

```:エラーコード
Create or delete work
  delete work (FAILED - 1)

Failures:

  1) Create or delete work delete work
     Failure/Error:
       @work = Work.includes(
         [
           :user,
           comments: :user,
           image_attachment: :blob,
           illustrations: [photo_attachment: :blob],
         ]
       ).find(params[:id])
     
     ActiveRecord::RecordNotFound:
       Couldn't find Work with 'id'=3313
     # ./app/controllers/works_controller.rb:15:in `show'

     :

     # ------------------
     # --- Caused by: ---
     # Capybara::CapybaraError:
     #   Your application server raised an error - It has been raised in your test code because Capybara.raise_server_errors == true
     #   /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/session.rb:160:in `raise_server_error!'

Finished in 5.17 seconds (files took 3.93 seconds to load)
1 example, 1 failure
```

## 原因

原因は削除操作にて、`redirect_back(fallback_location: root_url)`という、`redirect_back`の操作を行っていた事に由来します。

https://railsdoc.com/page/redirect_back

```ruby:app/controllers/works_controller.rb
 class WorksController < ApplicationController
	:
   def destroy
     @work.destroy
     flash[:success] = "削除しました。"
-    redirect_back(fallback_location: root_url)
+    redirect_to root_url
   end
	:
```

`fallback_location`というオプションは遷移前のページのURL取得する操作でした。しかし、遷移の前のページ(今回でいう`works/show.html.erb`)が削除される操作の場合は、そもそも`redirect_back`という指示は適切なはずがなく、エラーが発生していました。
ちなみにこの修正は、以下の記事を参考にしました。ありがとうございました！

https://qiita.com/100010/items/3ae5dea25e85b0cbf1ee

つまり、自分のアプリケーションにはエラーが発生するコードが、常に内在していた、と言うことになります。情けない、、
改めてテストの重要性に気付かされました。

今回の記事は以上です、最後まで読んでいただきありがとうございました！！
Cloud9の開発前準備(容量削減)

##はじめに
Cloud9にて開発を実施していく中でディスク不足が原因で様々な問題を引き起こしてしまったので、開発着手前に事前に設定しておくべき内容を記載しておきます。
ディスク不足によるエラーに関しては以下内容をご参照ください。
https://qiita.com/YotaHamasaki/items/a7ce6bc4039607e3a389
https://qiita.com/YotaHamasaki/items/a9b2093eeee44057aeef

##設定内容
①dockerイメージの削除
②メモリの解放
③swap領域設定
④ボリュームの追加


①dockerイメージの削除
ワークスペース作成時にはdockerイメージが初期状態で入っています。
これが容量を大きく圧迫しているので、dockerにて環境構築しない場合、削除してしまった方が良いと思います。
コマンドは以下になります。

```
$ docker rmi `docker images -q`
```

②メモリの解放
メモリの容量不足によりプログラム実行時にエラーが発生することがあるので、こちらも実施しておいた方が良いと思います。

```
$ sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
```

③swap領域設定
swap領域はHDD上の仮想的なメモリで、実メモリの使用量を超えた分を一時的に書き出す場所です。
こちら領域の設定をしておきましょう。

```
$ sudo dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
$ sudo chmod 600 /var/swap.1
$ sudo mkswap /var/swap.1
$ sudo swapon /var/swap.1
$ sudo cp -p /etc/fstab /etc/fstab.ORG
$ sudo sh -c "echo '/var/swap.1 swap swap defaults 0 0' >> /etc/fstab"
```

④ボリュームの追加
HDDの容量不足を防ぐために、HDDの容量追加を行います。
これはEC2インスタンスの設定変更にて、ボリュームを増やすことで実現します。
この手順としては以前記事にしていたので、そちらをご参照いただければ幸いです。
https://qiita.com/YotaHamasaki/items/a7ce6bc4039607e3a389
そしてインスタンスタイプの変更ができたら、次はターミナル上で以下コマンドを入力して、HDDの容量が設定した容量となります。

```
$ sudo growpart /dev/xvda 1
$ sudo resize2fs /dev/xvda1
```

無駄な容量を喰わないように開発前から準備する大切さを学びました。
マーケの人に向けてアプリの裏側を簡単に説明する

# はじめに
**今回の目標**:
プログラミングのこととか全く知らんけど、エンジニアと関わることになっちゃった！
しかも、ミーティングに出るけどエンジニア同士の会話全く意味わからん！

せめてアプリの動きの全体像くらいわかればなぁ〜って人に向けてアプリの裏側をざっくりと解説していきたいと思います。
※当たり前ですが、厳密言えば間違っているところもありますのでよろしくおねがいします

# 覚えるべき3つのワード
アプリの裏側を理解するために必要な3つのワードがあります
- 「クライアント」 -> アプリの見た目を作るもの
- 「サーバー」 -> クライアントに欲しい情報を提供するもの
- 「データベース」 -> ユーザーのデータなどを保存する場所

## 画面を作るって何？
画面を作るという話ですが具体的にどんな感じのことしてるねん！
って話ですが、例えばQiitaのマイページを例に考えると、、、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/8d42fc09-1fa0-d771-8176-cb0825d5daf0.png" width="350px">
↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/ccbfea06-85c3-02bf-8065-c34bac8e5edd.png" width="350px">

もちろんデザインをするのは当たり前なんですが、それにプラスしてデータを入れるための箱を用意するようなものだと思ってください。


## 全体を把握する
![スクリーンショット 2021-05-16 14.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/ae24a75e-d4aa-ff2a-8dc1-6747aa405940.png)
先程覚えるべき3つのワードのかんたんな全体図です
クライアントとサーバーが直接連携して、サーバーとデータベースが直接連携しているような感じです

ここで思うのはクライアントとデータベースで直接連携することはないの？という話だと思うのですが、基本的に無いものと思っていもらって大丈夫です。
基本的にデータベースにはサーバーを仲介してデータを持たせたりするという感じで覚えてください。

## 余談：そもそもとして
そもそもとしてなんですが、アプリケーションを作ろうとしたときに1つのプログラミング言語で書くことって殆どないんです。
もちろん無理やり書こうと思ったらできなくもないと思うのですが、９９．９９９%以上のアプリケーションは複数の言語で書かれています。

クライアントの部分をｰ>javascript 
サーバーの部分をｰ>java
データベースの部分を->SQL
（あ、javaとjavascriptはオーストラリアとオーストリアくらいの大きな差がありますｗｗｗ）

みたいな感じでかき分けることが多いですね。
もちろんどんなアプリを作りたいかによってその言語の種類も変わってきます。

とにかく、アプリを作るときにはたくさんの言語を知ってる必要があるからいろんなタイプのエンジニアがいるんだよ〜！ってことを覚えてもらえると嬉しいです。



# Qiitのプロフィールを表示するまで
話は戻りまして、具体的に先程のQiitaのプロフィール画面を表示させるとき裏側はどんなことをしているかを説明していきたいと思います。
![スクリーンショット 2021-05-16 16.17.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/9a117585-f0e6-c15c-3095-9aa7be173708.png)
まず一番重要なのはアプリケーションは

「リクエスト」と「レスポンス」

によって成り立っているということです。
基本的にはクライアントから「リクエスト」（〇〇というデータをくれ！！！）というのにたいして
サーバーが「レスポンス」（欲しいデータこれやろ〜とデータを渡す）を返す。
これを行っていく中でアプリケーションを作っていきます

具体的な例を話すと。。。
![スクリーンショット 2021-05-16 16.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/1d59a59f-2bf9-e6cf-a27c-13fb9cf3f2cb.png)
この図のように
クライアント：「マイページに必要なデータを下さい！」というリクエストを出す

それに対して

サーバー「名前：”こーすけ”、id名：”takehanKosuke”、画像のURL：”`https://hoge`”、 ....」

というような形でデータを返します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/b7f2fd52-8b66-218a-fa40-f7ee8e1c98f3.png" width="350px">
そしてそのデータをもとに先程のデータを入れる箱（赤っぽいところ）に対応するデータを入れることで

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/4a95f1f9-66b6-88bb-7005-42d2831bd724.png" width="350px">

というような画面を表示しています。
以上が簡単なアプリケーションの裏側です！

改めて整理すると、、、
1, マイページを開く画面に行く
2, クライアントはサーバーに「マイページに必要なデータを下さい！」というリクエストを出す。
3, それを受け取ったサーバーは「名前：”こーすけ”、 id名：”takehanKosuke”、 画像のURL：`https://hoge`」というような形でレスポンスを返す
4, クライアントはそのレスポンスのデータをもとに画面をつくって表示する

というような４ステップが行われています。

# まとめ
- 「クライアント」「サーバー」「データベース」の３つにざっくり別れている
- クライアントは見た目を作る
- サーバーはクライアントの欲しい情報を提供する
- データベースはユーザーデータや投稿したデータを保存する
- データのやり取りは「リクエスト」と「レスポンス」によって行われる

以上が簡単なアプリケーションの裏側です！
少しでも参考になれば幸いです
Raspberry Pi Picoでモータを動かす⑧（PIOで動かす⑥）

[前回](https://qiita.com/fmax/items/02ecd5990443489ae319)でようやく指定回数CW/CCWで回すということが（分解能1/4だが）一応できた。
今回は**仕事投げっぱなしのダメ上司ムーブ**をIRQを使って少しマシにしようと思う。

## IRQとは
IRQとはハード関連のプログラムやマイコンのファームウェアを書く人にはおなじみの割り込み要求(Interrupt ReQuest)と呼ばれるものである。
CPUが何かのトリガで動く際に、ずっと無限ループなどで監視（ポーリング）していると他の作業ができなくなる。
そのため、以下のような仕組みで「割り込み作業」を実行することでCPUの使える時間を増やす。

割り込み元が割り込み要求(IRQ)を発行する
↓
CPUは割り込みが入った際に一旦メインの作業を停止し、作業中の情報を退避する
↓
CPU側で割り込み関数を実行する
↓
CPUが作業中の情報を元に戻し、割り込みが入った際に止めていた場所から再開する

割り込み処理はマイコンを使う上で必須の機能だが、複雑になるため可能ならば余り使いたくない機能でもある。
今回のように処理待ちでは使わざるおえないため仕方なしに使っていく。

### コード
実際のコードは下記になる。

```
from rp2 import PIO, StateMachine, asm_pio
import time
from machine import Pin

from rp2 import PIO, StateMachine, asm_pio
import time
from machine import Pin

@asm_pio(set_init=(PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW), out_shiftdir=PIO.SHIFT_LEFT, autopull=False)
def cw_ccw():
    wrap_target()
    
    pull()
    out(y, 1)
    out(x, 31)
    label("continue")
    jmp(not_y, "cw")
    jmp("ccw")
    label("return")
    jmp(x_dec, "continue")
    irq(1)
    
    wrap()
    
    label("cw")
    set(pins, 0b1001)[3]
    set(pins, 0b0011)[3]
    set(pins, 0b0110)[3]
    set(pins, 0b1100)[3]
    jmp("return")
    
    label("ccw")
    set(pins, 0b1100)[3]
    set(pins, 0b0110)[3]
    set(pins, 0b0011)[3]
    set(pins, 0b1001)[3]
    jmp("return")

irq_flag = False
def set_flag():
    global irq_flag
    irq_flag = True
    print("set_flag:" + str(irq_flag))

PIO(0).irq(lambda pio: set_flag())

cw_ccw = StateMachine(0, cw_ccw, freq=2000, set_base=Pin(2))
cw_ccw.active (1)
cw_ccw.put(0x100) # CW
while True:
    if irq_flag:
        irq_flag = False
        break

cw_ccw.put((0b1 << 31) + 0x100) # CCW
while True:
    if irq_flag:
        irq_flag = False
        break    
cw_ccw.active(0)
```

動作させると回転が終わったと同時に逆回転が始まるという制御になる。
「終わりました」と報告されたらすぐに次の仕事をアサインするようになりちょっとはダメ上司感が減った。

内容としては回転が終了した時点でirq(1)で割り込み要求を発行し、PIO(0).irq(lambda pio: set_flag())でset_flag()を割り込み関数として登録している。
割り込み関数set_flag()内でglobal宣言したirq_flagを変更している。
メインループ内で無限ループを作成し、irq_flagがTrueになるまで待っている。

注意したいのは同時に割り込みが発生するなどしてirq_flagに同時にアクセスに行くと**値が壊れる**こと。
今回は同時に割り込みが入ることは無いため問題ないが、実用上は排他制御が必要になることに注意したい。
KICAD　フットプリントに3Dを追加する方法

KICADのPcbnewで目的のフットプリントを選択（右からシンボルをドラッグ）して右クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914522/b1e70721-4811-9155-1fce-9dfb75a6659e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914522/4f7521e2-e44a-0231-16e1-24635c94363c.png)

フットプリントのプロパティーが開く
3つ目のタブが3D設定用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914522/fd4e2de5-4f34-6f5d-2bd1-24e74dd3e250.png)

中ほどにある＋アイコンをクリックしてからその右にあるフォルダアイコンをクリックして3Dデータを選択の画面を出す。
ultralibrarian等から落としてきた3Dのファイルを読み込む。落とす際は　.step　の形式を選ぶ　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914522/3200b3a0-482f-7226-8124-49656920b951.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914522/afc4401e-fa8d-13b0-8bb8-f15ce83221f2.png)
Adblockの影響でYouTubeのページ移動ができないときの対処法

私は普段Google Chromeを使っており、Adblockの拡張機能を入れています。
YouTubeの広告もAdblockでブロックされるのですが、ページ移動時に「インターネットに接続してください」と表示され、スムーズに画面遷移することができませんでした。

ページを再読み込みすればいちおうページ表示/動画再生できるのですが、毎回のページ遷移ごとにF5を押すのは面倒なので、何とかしたい。。と思い対処してみました。

## 事象

毎回のページ遷移時に以下の画面が表示されてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298706/d799fa6a-9f5d-027f-8036-42117ea8db9c.png)

動画ページだけでなく、トップページや探索ページでも同様です。
ページを再読み込みすればお目当てのページは表示されます。

## 原因と対処法
要はAdblockが広告だけでなく、YouTubeの機能提供に必要なURLまでブロックしてしまっているのだろうと考えました。
AdblockによってブロックされているYouTubeページの中から、ブロックすべきでないページを抽出し、Adblockのブロック対象外ページに設定しました。

* ブロックすべきでないページを抽出　・・・　Google ChromeのデベロッパーツールでNetworkタブを確認
* Adblockのブロック対象外ページに設定　・・・　[Adblockのフィルタ文のチュートリアル](https://help.eyeo.com/en/adblockplus/how-to-write-filters,How to write filters)を参照

## 結論
以下の手順で解消できました。

1. Chrome拡張機能のAdblockアイコンをクリックし、歯車マークから設定画面へ移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298706/9af42a31-5db0-c605-5797-024403b5fe67.png)


1. [カスタマイズ]ページの[あなたのフィルタを手動で編集]セクションへ移動し、「編集」ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298706/32dc5750-a619-2c34-fde0-82a4fe472aec.png)


1. 入力欄の末尾に以下の行を追加して「保存」ボタンを押す

```
@@||youtube.com/youtubei/v1/next?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8^$xmlhttprequest
@@||youtube.com/youtubei/v1/browse?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8^$xmlhttprequest
@@||youtube.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8^$xmlhttprequest
@@||youtube.com/youtubei/v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8^$xmlhttprequest
@@||youtube.com/youtubei/v1/notification/get_notification_menu?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8^$xmlhttprequest
@@||youtube.com/youtubei/v1/account/account_menu?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8^$xmlhttprequest
```

## 備考
正確なところはわかりませんが、許可リストに追加したURLはどうやらそれぞれ以下のような役割を持っているようです。

* youtube.com/youtubei/v1/next　・・・　動画ページへの遷移のリクエスト
* youtube.com/youtubei/v1/player　・・・　遷移した動画ページのプレイヤーを実行するリクエスト
* youtube.com/youtubei/v1/browse　・・・　動画以外のページへの遷移のリクエスト
* youtube.com/youtubei/v1/search　・・・　検索結果表示のリクエスト
* youtube.com/youtubei/v1/notification/get_notification_menu　・・・　通知メニュー表示のリクエスト
* youtube.com/youtubei/v1/account/account_menu　・・・　アカウントメニュー表示のリクエスト

動作や安全性を保証するものではありませんので、試される方は自己責任にてお願いします。

## 環境情報
* Google Chrome　・・・　バージョン: 90.0.4430.212（Official Build） （64 ビット）
* AdBlock　・・・　4.33.0バージョン

## 参考リンク
* How to write filters　https://help.eyeo.com/en/adblockplus/how-to-write-filters