OmniAICreator/Qiita-1.07M huggingface dataset:
[py2rb] 多重継承の３

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 多重継承 (Python)
https://qiita.com/superrino130/items/364d856e08cff0e501d3

https://qiita.com/superrino130/items/41f18544f92857ed0228

移植するにあたり、多重継承は`Ruby`の`ミックスイン`で行こうと思っていました。
`__init__`のないクラスをモジュールにする予定でしたが、これでは避けられないようですので、委譲により多重継承を表現できればと思います。
# forwardable (Ruby)
```ruby
require 'forwardable'

class A
  def initialize(s)
    @s = s
  end

  def putsa(o)
    puts "#{@s}は#{o}です"
  end

  def putsd()
    puts "呼び出されたクラスは#{self.class}です"
  end
end

class B
  def initialize(s)
    @s = s
  end

  def putsb(o)
    puts "#{@s}は#{o}です"
  end

  def putsd()
    puts "呼び出されたクラスは#{self.class}です"
  end
end

class C
  extend Forwardable

  def initialize(*args, **kwargs)
    @a = A.new(kwargs['A'])
    @b = B.new(kwargs['B'])
  end

  def_delegators :@a, :putsa, :putsd
  def_delegators :@b, :putsb, :putsd
end

c = C.new('A' => '好きな食べ物', 'B' => '好きな飲み物')
c.putsa('みかん')
c.putsb('コーヒー')
c.putsd()

p C.ancestors

# output
好きな食べ物はみかんです
好きな飲み物はコーヒーです      
呼び出されたクラスはBです       
[C, Object, Kernel, BasicObject]
```
https://qiita.com/superrino130/items/8b11389a5fbef06ba870

学習したばかりの`forwardable`を使用した例です。
メソッドが重複した場合、後の`  def_delegators :@b, :putsb, :putsd`が優先されるようです。
また、`ancestors`にクラス`A`も`B`も検索されませんので、`super`で呼び出したりとかはできないものと思われます。
# delegate (Ruby)
```ruby
require 'delegate'

class A
  def initialize(s)
    @s = s
  end

  def putsa(o)
    puts "#{@s}は#{o}です"
  end

  def putsd()
    puts "呼び出されたクラスは#{self.class}です"
  end
end

class B
  def initialize(s)
    @s = s
  end

  def putsb(o)
    puts "#{@s}は#{o}です"
  end

  def putsd()
    puts "呼び出されたクラスは#{self.class}です"
  end
end

class C
  def initialize(*args, **kwargs)
    @a = SimpleDelegator.new(A).new(kwargs['A'])
    @b = SimpleDelegator.new(B).new(kwargs['B'])
  end

  def method_missing(name, *args)
    [@b, @a].each do |x|
      if x.respond_to?(name)
        return x.method(name).call(*args)
      end
    end
    raise "メソッド #{name} が見つかりません"
  end
end

c = C.new('A' => '好きな食べ物', 'B' => '好きな飲み物')
c.putsa('みかん')
c.putsb('コーヒー')
c.putsd()

p C.ancestors

# output
好きな食べ物はみかんです
好きな飲み物はコーヒーです      
呼び出されたクラスはBです       
[C, Object, Kernel, BasicObject]
```
https://docs.ruby-lang.org/ja/latest/class/Delegator.html

もう一つの`deletagor`を使用した例です。
メソッド数が多い場合は、こちらの方が楽かもしれません。
# メモ
+ Python の 多重継承の３ を学習した
+ 百里を行く者は九十里を半ばとす
生物系のためのR超入門 (9) 【自作関数の定義】

# 0. はじめに
Rにデフォルトで入っている関数やパッケージに含まれる関数は、引数を指定するだけで様々な処理を行ってくれる、大変便利なものですよね。
しかしながら、時には自分で関数を定義したい、長いコードを短くまとめたい、ということがでてくると思います。今回はそんな自作関数の定義についてまとめます。
第6回や第11回の記事でも自作関数を定義する機会が登場しているので、気になる方はご覧ください。

https://qiita.com/Surku/items/ae16d444d6c22b0dc4e6

https://qiita.com/Surku/items/6e8987cec529474abe0c

## 0-1. この記事の到達目標
- 自分で新しく作った関数を定義できる

## 0-2. 初めて登場する関数
- `sprintf(%sを含んだ文字列,第2引数)`
    - 第2引数を文字列として解釈し、第1引数の%sの部分に入力します。

# 1. とりあえず作ってみる
新たに関数を定義する際には`function(){}`を使います。`()`には引数を、`{}`には関数が行う処理内容を記述します。

例として、「任意の数を3乗する計算」について考えます。
まず、この関数を**cubed**と命名します。
変数は「任意の数」1個だけなので、`()`には引数を1個、ここではxとしていますが変数名はなんでもOKです。
`{}`にはxを変数として「3乗する計算」のコードを書きます。

```R
> cubed<-function(x){
+     x^3
+     }
```

これで自作関数の定義は完了し`cubed()`という関数が誕生しました。
あとは今まで通り、引数に数を指定するだけで利用可能です。
この関数はセッションが続く限り有効で、再起動等すると再定義が必要になることがあります。スクリプトファイル等に保存することをおすすめします。

```R
> cubed(3)
[1] 27
> cubed(0.1)
[1] 0.001
> cubed(27)
[1] 19683
```

# 2. 引数を2つ以上指定する場合
引数を2つ以上指定したい場合も、前項とほとんど同様です。`function(){}`の`()`に引数をカンマで区切って指定します。

例として「任意の数を任意乗する」関数を作ってみましょう。引数に底としてxを、冪指数としてnを指定しています。

```R
> exponentiation<-function(x,n){
+   x^n
+ }
```

この関数は引数を2つ指定、と定義したので引数が1つだけだとエラーになってしまいます。
ちゃんと引数を2つ入れてあげると、しっかり動いてくれます。

```R
> exponentiation(1)
 exponentiation(1) でエラー: 
   引数 "n" がありませんし、省略時既定値もありません 
> exponentiation(2,3)
[1] 8
> exponentiation(10,-1)
[1] 0.1
```

# 3. こんにちはゲストさんをつくる
引数に任意の名前を指定すると、その人へ挨拶してくれる、ただし名前の指定がなかった場合「ゲストさん」として挨拶する関数を定義したいと思います。

そのためには、まず`sprintf()`関数の使い方を説明します。
これは文字列等を扱うときに便利な関数で、第1引数に特別な入力文字`%s`を含んだ文字列を指定し、第2引数に別の文字列を指定すると、`%s`に入力されます。
特別な入力文字にはいくつか種類があり使い分けがあるのですが、今回は割愛します。
百聞は一見に如かず、コードを見ていただくと第2引数に**太郎**を指定すると、`%s`の部分に太郎が入力されています。太郎を**花子**に変えることも容易にできます。

```R
> sprintf("こんにちは %s さん", "太郎")
[1] "こんにちは 太郎 さん"
> sprintf("こんにちは %s さん", "花子")
[1] "こんにちは 花子 さん"
```

ここまでを、とりあえず`function(){}`で定義しておきます。

```R
> Hello<-function(name){
+   sprintf("こんにちは %s さん", name)
+ }
+ > Hello("太郎")
[1] "こんにちは 太郎 さん"
```

引数に名前の指定がなかった場合は「ゲスト」と表示させたいのですが、このまま引数に何も指定しないとエラーが出てしまいます。
では、どうすればよいかといいますと、`function(){}`の`()`内であらかじめ指定しておきます。こうすることで名前の指定がない場合に「ゲスト」と表示させることができます。

```R
> #引数に何も指定しないとこのままではエラー
> Hello()
 sprintf("こんにちは %s さん", name) でエラー: 
   引数 "name" がありませんし、省略時既定値もありません

> #()で予め指定しておく 
> Hello<-function(name="ゲスト"){
+   sprintf("こんにちは %s さん", name)
+ }
> Hello()
[1] "こんにちは ゲスト さん"

> #もちろん名前の指定があった場合はその人の名前になる
> Hello("太郎")
[1] "こんにちは 太郎 さん"
```

自作関数を定義できるようになることで、なんだか幅が広がったような気がしますね！

# 4. 次回

https://qiita.com/Surku/items/36121c0d1dba84a5ceb7
Stringtieから出力されたGTFでLiftoffを使うには

# Stringtieとは

STARなどのRNA-seqをマッピングしたBAMファイルから、新規転写物やアイソフォームを調べるツール。

https://kazumaxneo.hatenablog.com/entry/2017/08/23/230717

# Liftoffとは

ゲノムとGTFが揃っているゲノムから、他のゲノムにアノテーションを移すソフト。

https://kazumaxneo.hatenablog.com/entry/2020/06/27/212805

# 問題

Stringtieで作ったGTFファイルではgeneというfeatureがなく、Liftoffに怒られる。

# 解決法

```{bash}

# AugustusのUtilで使える。そのほかにもgffreadなど。不要かも？
# LiftoffはそもそもGTFも読める

gtf2gff.pl <reference.gtf --out=reference.gff3

#geneのfeatureがないなら、transcriptとexonのfeatureを読ませればいいじゃない！

echo > liftoff_test.txt
echo transcript >> liftoff_test.txt
echo exon >> liftoff_test.txt

#Liftoff実行、「-f」optionで指定。「-p 」optionはスレッド数、お好みで。
liftoff -p 8 -o output.gff -f liftoff_test.txt   ./query.fasta reference.fa -g ./reference.gff3


```
vistaでphotoshop その4

#概要

vistaでphotoshopやってみる。
九九やってみる。

#写真

![test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ac13a7a7-2e8b-38ec-117f-074a5203204d.png)


#サンプルコード

```
var cr = String.fromCharCode(13);
var str = "";
var i;
var j;
i = 0;
j = 0;
for (i = 1; i < 10; i++)
{
	for (j = 1; j < 10; j++)
	{
		str += i * j;
		str += " ";
	}
	str += cr;
}
//alert(str);
preferences.rulerUnits = Units.PIXELS;
var doc = documents.add(500, 500);
var layers = doc.artLayers;
var layer1 = layers.add();
layer1.kind = LayerKind.TEXT;
layer1.textItem.contents = str;
layer1.textItem.size = 20;
layer1.textItem.font = "TelopMinPro-E";
layer1.textItem.justification = Justification.LEFT;
layer1.textItem.color.rgb.red = 0;
layer1.textItem.color.rgb.green = 0;
layer1.textItem.color.rgb.blue = 255;
layer1.textItem.horizontalScale = 90;
layer1.textItem.position = Array(50, 50);
var pngOpt = new ExportOptionsSaveForWeb();
pngOpt.format = SaveDocumentType.PNG;
pngOpt.optimized = true;
pngOpt.interlaced = false;
pngOpt.PNG8 = false;
var filePath = new File("/Users/ore/test3.png");
app.activeDocument.exportDocument(filePath, ExportType.SAVEFORWEB, pngOpt);
alert("ok");



```

以上。
Franka 制御プロトコル

## FrankaControlProtocol 仕様準拠

### nut_touch_cartesianpose.cpp

```
sudo ./nut_touch_cartesianpose robot-ip-address port
```
指定ポートにパケットを受信した後で、1msec周期で送信元の指定ポートにRobotStateを送信する。
対応コマンドは以下。
rc_begin : 何も処理しない。送信元IPアドレスを判定するために使う。
rc_RobotState : RobotStateをコンソールに表示する。表示項目は送信項目と同じ。
rc_CartesianPose : 受信データをfranka::CartesianPose outputに設定する。
rc_CartesianPose_init : 初期待機位置姿勢に移動する。
rc_CartesianPose_drag : 受信データを目標位置姿勢としてサイン波駆動で移動する。
rc_CartesianPose_relative : 受信データをrobot_state.O_T_EE_dに加算してoutputにする。
rc_end : プログラムを終了する。
送信するRobotStateの項目は以下。
O_T_EE,O_T_EE_d,tau_J,q,q_d,dq,dq_d,joint_contact,cartesian_contact,tau_ext_hat_filtered,theta,dtheta

### nut_robotsimu.cpp

```
./nut_robotsimu port
```
指定ポートにパケットを受信した後で、1msec周期で送信元の指定ポートにRobotStateを送信する。
対応コマンドは以下。
rc_begin : 何も処理しない。送信元IPアドレスを判定するために使う。
rc_RobotState : 何も処理しない。
rc_CartesianPose : 受信データをO_T_EE,O_T_EE_dに設定する。
rc_CartesianPose_init : O_T_EE,O_T_EE_dをゼロクリアする。
rc_CartesianPose_drag : 受信データをO_T_EE,O_T_EE_dに加算する。
rc_CartesianPose_relative : 受信データをO_T_EE,O_T_EE_dに加算する。
rc_end : 何も処理しない。
送信するRobotStateの項目は以下。
O_T_EE,O_T_EE_d,tau_J,q,q_d,dq,dq_d,joint_contact,cartesian_contact,tau_ext_hat_filtered,theta,dtheta
全ての初期値はゼロとする。各項目の最終要素は1msec毎に変化する値となっている。
GitLabRunnerを使ったcfn-lint


そのものズバリな話である。
IaCを実現する上で、静的チェックは重要である。

# lint一覧 for CFn template
まずはIaCだが、今回はCloudFormationで作っているので、CFn templateに使えるLintの一覧である。去年の段階の調査なので若干古い部分もあるかもだが、そこまで変わらないだろうと思いそのまま掲載する。
結論をいうと、cfn-lintが有効と考えられたので、これを利用することとした。

| ツール | 概要 | 使用感 |
|:-----------|:------------|:------------|
| AWS CLI(validate-template)| 構文チェック            | yaml,jsonの形式的チェックに留まる         |
| cfn-lint                  | 構文チェック＋α         | 有効なチェックと考えられる      |
| cfn-nag                   | セキュリティチェック     | セキュリティチェックの内容が厳しく、利用しそうな設定であってもエラー判定される。またCFnのコメントにも日本語を入れるとエラーになる。         |
| cfn-guard                 | ルール・ポリシーのチェック| デフォルト設定が無くルールの作成から必要。また整備も難しい。          |


# cfn-lintの概要
AWS謹製のLintツールである。
https://github.com/aws-cloudformation/cfn-lint

概要は以下参照
https://aws.amazon.com/jp/blogs/news/git-pre-commit-validation-of-aws-cloudformation-templates-with-cfn-lint/

# 動作イメージ

例と同じように、pre-commitとする案もなくもないけど、Commitの際でもそんなに困らなくね？というわけでこんな感じ。
マネージドだとCodeBuildで動作させるんだけど、GitLab-Runnerが既に存在するので、こんな感じ。
結果はGitLab上で参照したいのでArtifactに格納させる。

```.gitlab-ci.yml
stages:
  - test
test-template:
  # public ECRを利用する。
  image: public.ecr.aws/sam/build-python3.8:latest
  stage: test
  tags: 
    - docker
  before_script:
    - pip install --quiet cfn-lint
  script:
    # E3012は誤判定が多いので外す。
    - cfn-lint --template ./template/**/*.yml -r ap-northeast-1 -i E3012 -f junit > ./template/template.cfn-lint.xml
  artifacts:
    reports:
      junit: ./template/template.cfn-lint.xml
```
vistaでphotoshop その3

#概要

vistaでphotoshopやってみる。
zundokoやってみる。

#写真

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c8532fc6-108f-8c21-b587-777c32c6d465.png)


#サンプルコード

```
var cr = String.fromCharCode(13);
var str = "";
var i;
var j;
i = 0;
j = 0;
while (i < 4)
{
	k = Math.random();
	if  (k < 0.5)
	{
		str += "zun ";
		i++;
		j += 4;
	}
	else
	{
		str += "doko ";
		i = 0;
		j += 5;
	}
	if (j > 20)
	{
		str += cr;
		j = 0;
	}
}
str += "doko ki yo shi!!";
//alert(str);
preferences.rulerUnits = Units.PIXELS;
var doc = documents.add(500, 500);
var layers = doc.artLayers;
var layer1 = layers.add();
layer1.kind = LayerKind.TEXT;
layer1.textItem.contents = str;
layer1.textItem.size = 20;
layer1.textItem.font = "TelopMinPro-E";
layer1.textItem.justification = Justification.LEFT;
layer1.textItem.color.rgb.red = 0;
layer1.textItem.color.rgb.green = 0;
layer1.textItem.color.rgb.blue = 255;
layer1.textItem.horizontalScale = 90;
layer1.textItem.position = Array(50, 50);
var pngOpt = new ExportOptionsSaveForWeb();
pngOpt.format = SaveDocumentType.PNG;
pngOpt.optimized = true;
pngOpt.interlaced = false;
pngOpt.PNG8 = false;
var filePath = new File("/Users/ore/test2.png");
app.activeDocument.exportDocument(filePath, ExportType.SAVEFORWEB, pngOpt);
alert("ok");



```


以上。
DockerのPostgreSQLに接続できない



# 事象・事前切り分け

- Docker上に構築したPostgreSQLにパスワードが合っていないとエラーが出る
- psqlコマンドでDocker環境内からのアクセスには問題ない事を確認した

# 解決

Docker上に構築したPostgreSQLデータベースへの接続(A5SQL)が上手く行かず
↓
当初パスワードが違うとのエラーでDocker側のパスワード設定を確認するもパスワードは合っている
↓
原因を調べたところ接続側(Windows)にもPostgreSQLが動いておりポートが同じ(5432)で干渉していた
↓
Windows側のPostgreSQL Serviceを止めて対応で解決できそうだが、職場PCの為不可
↓
docker-compose.ymlを以下の様に変更して、Dockerイメージを再作成

```dockerfile
version: '3.1'
services:
  pg:
    image: postgres:latest
    ports:
      - "5433:5432" ←"接続からの接続ポート:DockerのPostgreSQLポート"なので左のポートを変更
    enviroment:
      - xxxx
```

↓

```
docker-compose up
```

↓

***無事起動***
ウェブサイト作成用備忘録・２１号：javascriptのuse strictの適用範囲の疑問点について

最近はJavaScriptの学習が進み、自分で一からコーディングを行うだけではなく、公開されているwebサイトのソースコードの内容や構造を読み取る練習も行っています。

今回はJSファイルの読み取り中に見つけたuse strictの意味を下記のリファレンスで調べた時に感じた疑問点と、その回答を自分用の備忘録として残しておこうと思います。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Strict_mode

use strict の意味については上記のリファレンスを読んだ方がずっと分かりやすいと思うので、本題の疑問点から…

> この構文には、著名なサイトを悩ませた落とし穴があります。それは、競合しないスクリプトをむやみに連結できないことです。Strict モードのスクリプトと非 Strict モードのスクリプトを連結することを考えてみてください。連結後のスクリプト全体が strict になるのです! これは逆も言えます。非 Strict のスクリプトと Strict のスクリプトを連結すると非 Strict になります。もちろん、スクリプトの連結は決して理想的なものではありませんが、どうしても必要な場合は、機能ごとに Strict を有効にすることを検討してください。

引用文の中の「競合しないスクリプトをむやみに連結できない」の一文をはじめて読んだ段階の自分はそもそも「スクリプトを連結するって何だ…？」から始まり、
**スクリプトを連結する＝複数の人が作成したコードを一つのJSファイルの中にまとめておく事？**
なのか、
**スクリプトを連結する＝HTMLファイルに複数のscriptタグを作成したり、複数の外部JSファイルを読み込む事？**
なのか、判断がつきませんでした。

仮に後者が「スクリプトを連結する」事だとすると、グローバルスコープではなくて、最初から狭い適応範囲の関数の文頭にuse strictを書いた方が良いのでは…？？など、疑問が絶えませんでした。

上記の疑問を解決するには、グローバルスコープにuse strictを記述した際に、どこからどこまでの範囲にstrictモードが適用されるのかを調べる事で解決すると考えた自分がたどり着いたサイトが…コチラ

https://wp-p.info/tpl_rep.php?cat=js-application&fl=r13

> ただし、ちょっと注意点がありJavaScriptを外部ファイルで読み込ませ、そこに『"use strict"』を記述した場合はその外部ファイル内のみ、script要素を使ってインラインで『"use strict"』を記述した場合はそのscript要素内のみが『strictモード』の対象となります。

探している答えはこのページに大体書いてありました。とても助かります。

更に、何故複数のスクリプトを統合する必要があるのかについても記載されていました。

> 最近のウェブサイト構築では通信負荷とファイル容量を下げつつレンダリング速度を向上させる目的で複数のJavaScriptを結合してさらにそれを圧縮してから公開するといった手法が取られています。

ここまでの疑問と回答をまとめると

**スクリプトを連結する　＝　複数のJSファイルを一つにまとめる**

**use strictは記述された範囲の中でだけで適用される機能**

```html

<script>
"use strict"; 
// このタグ内はstrictモード
</script>
 
<script>
//　このタグ内は通常のJavaScript
</script>
 
<script src="strictモードのJSファイル"></script><!-- このファイル内はstrictモード -->
<script src="通常のJSファイル"></script><!-- このファイル内は通常のJavaScript -->

```

ということが分かりました。

…初歩的な事だとは思うのですが、小さな事でも疑問が解決するとスッキリとした気持ちになるので、これからも引き続き色々調べていこうと思っています。
vistaでphotoshop その2

#概要

vistaでphotoshopやってみる。
fizzbuzzやってみる。

#写真

![test0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e671137d-b585-37ce-eef0-247e3dac4dcf.png)


#サンプルコード

```
var cr = String.fromCharCode(13);
var str = "";
var i;
for (i = 1; i <= 100; i++)
{
	if (i % 15 == 0)
	{
		str += "FizzBuzz ";
	}
	else if (i % 3 == 0)
	{
		str += "Fizz ";
	}
	else if (i % 5 == 0)
	{
		str += "Buzz ";
	}
	else
	{
		str += i + " ";
	}
	if (i % 10 == 0)
	{
		str += cr;
	}
}
//alert(str);
preferences.rulerUnits = Units.PIXELS;
var doc = documents.add(500, 500);
var layers = doc.artLayers;
var layer1 = layers.add();
layer1.kind = LayerKind.TEXT;
layer1.textItem.contents = str;
layer1.textItem.size = 20;
layer1.textItem.font = "TelopMinPro-E";
layer1.textItem.justification = Justification.LEFT;
layer1.textItem.color.rgb.red = 0;
layer1.textItem.color.rgb.green = 0;
layer1.textItem.color.rgb.blue = 255;
layer1.textItem.horizontalScale = 90;
layer1.textItem.position = Array(50, 50);
var pngOpt = new ExportOptionsSaveForWeb();
pngOpt.format = SaveDocumentType.PNG;
pngOpt.optimized = true;
pngOpt.interlaced = false;
pngOpt.PNG8 = false;
var filePath = new File("/Users/ore/test0.png");
app.activeDocument.exportDocument(filePath, ExportType.SAVEFORWEB, pngOpt);
alert("ok");



```


以上。
Colabで日本語対応したspaCyを動かしてみる

# 概要
自然言語処理用Pythonライブラリの[spaCy](https://spacy.io/)がv3.2から日本語対応し、公式の無料のオンラインコース (https://course.spacy.io/ja) も提供しています。

チュートリアルを見るだけではなくて、実際にGoogle Colaboratoryにて動かしてみましたが
執筆時のColabの環境ではすんなり動かなかったので、動くようにしたコードを共有します。

# Version確認
単なるVerison確認なら
`import spacy`
`print(spacy.__version__)`
でも良いのですが、`import`することによってupgradeがうまくできなかったので以下で確認します。

```python
>>> !pip show spacy
```

    Name: spacy
    Version: 2.2.4
    Summary: Industrial-strength Natural Language Processing (NLP) in Python
    Home-page: https://spacy.io
    Author: Explosion
    Author-email: contact@explosion.ai
    License: MIT
    Location: /usr/local/lib/python3.7/dist-packages
    Requires: srsly, requests, numpy, murmurhash, thinc, plac, wasabi, blis, cymem, catalogue, setuptools, tqdm, preshed
    Required-by: fastai, en-core-web-sm

Versionが2.2.4なのでUpgradeが必要のようです。
(ちなみに下記コマンドの引数に関して、U:Upgrade, q:quietの略らしいです。)

# Upgrade

```python
>>> !pip install -U spacy -q
```

    [K     |████████████████████████████████| 6.0 MB 4.5 MB/s 
    [K     |████████████████████████████████| 42 kB 1.2 MB/s 
    [K     |████████████████████████████████| 181 kB 58.8 MB/s 
    [K     |████████████████████████████████| 451 kB 44.0 MB/s 
    [K     |████████████████████████████████| 628 kB 48.1 MB/s 
    [K     |████████████████████████████████| 10.1 MB 18.9 MB/s 
    [?25h

再度Verison確認


```python
>>> !pip show spacy
```

    Name: spacy
    Version: 3.2.1
    Summary: Industrial-strength Natural Language Processing (NLP) in Python
    Home-page: https://spacy.io
    Author: Explosion
    Author-email: contact@explosion.ai
    License: MIT
    Location: /usr/local/lib/python3.7/dist-packages
    Requires: cymem, murmurhash, jinja2, typer, thinc, numpy, blis, tqdm, requests, packaging, preshed, langcodes, spacy-legacy, srsly, setuptools, pathy, pydantic, spacy-loggers, typing-extensions, wasabi, catalogue
    Required-by: fastai, en-core-web-sm
    
無事にv3.2になりました。

# 追加のinstall

spaCyのUpgradeだけではうまく動かせず、エラー文に`spacy[ja]`について書いてあったので追加でinstall

```python
>>> !pip install spacy[ja] -q
```

    [K     |████████████████████████████████| 2.2 MB 5.3 MB/s 
    [?25h  Building wheel for sudachidict-core (setup.py) ... [?25l[?25hdone
    
これで事前準備は完了です。

# nlpオブジェクトの作成


```python
# spaCyをインポート
>>> import spacy

# 日本語のnlpオブジェクトを作成
>>> nlp = spacy.blank("ja")
```

# Docオブジェクトの作成、tokenの抽出


```python
# nlpを用いて、テキストを処理することで作成
>>> doc = nlp("おはようございます!")

# Docからtokenを取り出す
>>> for token in doc:
        print(token.text)
```

    おはよう
    ござい
    ます
    !
    
これで簡単に動かすことができました！
Pythonで複数の動画を自動圧縮

#概要
画面キャプチャでとった動画たちがHDDの容量を圧迫しているので、圧縮したい。
容量の小さい動画(既に圧縮済だったりする)も混ざっているので、容量の大きい動画だけピックアップして圧縮するようにする。
圧縮にはffmpegというソフトを使うのが簡単そう。
Pythonからの操作もできるから、Pythonで書くことにする。

#ffmpegのインストール
https://nagaragawa-r.com/download-install-pass-ffmpeg/

ここの記述に従ってffmpegをインストールしてパスを通す。

#処理の流れ
  1. 動画ファイル名にスペースが入っているとエラーの原因になるので、これを取り除く。
  2. カレントディレクトリ中の .mp4 のファイルすべてのパスのリストを取得。
  3. for文で得られたリストを回す。動画の容量が1GB以上か判定し大きければ圧縮。
  4. 圧縮前の動画(思い通り圧縮できないかもしれないので一応とっておく)の名前を圧縮後と区別しやすいように変更。

#コード
```python
import glob
import os
import subprocess
#①
videos = glob.glob('./*.mp4')

#②ファイル名にスペースが入っているとエラーになるので、取り除いておく。
for video in videos:
    os.rename(video, video.replace(' ', ''))

#③
videos = glob.glob('./*.mp4')

count = 0
#ビデオの容量が1GB以上か判定し、大きければ圧縮
for video in videos:
    size = os.path.getsize(video)
    if size>1000000000:
        #④圧縮
        subprocess.call('ffmpeg -i '+video+' -crf 18 '+video[:-3]+'_圧縮済.mp4', shell=True)
        
        #⑤元動画の名前を変更する。消しやすいように、まとまって配置させるため番号をつける。
        os.rename(video, './'+str(count)+'_圧縮前_'+video[2:])
        count += 1
```
①まずは globでカレントディレクトリ内 mp4のパスすべてのリストを取得。
②リストのパスを使って mp4ファイル名からスペースを取り除くループを回す。
③ファイル名を変更したのでパスのリストも更新しておく。
④ffmpegの圧縮はシェルコマンドで行う。Pythonからシェルコマンドを呼び出すには subprocess.callを使う。
crfの値を変えると動画の品質を指定できる。
⑤圧縮前の動画ファイル名を分かりやすいように変えておく。番号を振っておくとソートしたとき並んで表示されるので成功確認した後で消すときにやりやすい。
0\_圧縮前\_元の名前.mp4 とか 1\_圧縮前\_元の名前.mp4 
みたいになる。

#結果
ものによっては容量が10分の1以下になった。
ffmpegってすごい。
vistaでphotoshop

#概要

vistaでphotoshopやってみる。
キャンバス作って、文字書いて、pngで保存する。

#写真

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d0bc0147-4622-40d4-f334-58c56a5f24af.png)

#環境

windows vista
photoshop cs2

#サンプルコード

```
//alert(app);
//alert(app.version);
preferences.rulerUnits = Units.PIXELS;
var doc = documents.add(300, 300);
var layers = doc.artLayers;
var layer1 = layers.add();
layer1.kind = LayerKind.TEXT;
layer1.textItem.contents = "hello photoshop!";
layer1.textItem.size = 30;
layer1.textItem.font = "TelopMinPro-E";
layer1.textItem.justification = Justification.LEFT;
layer1.textItem.color.rgb.red = 255;
layer1.textItem.color.rgb.green = 0;
layer1.textItem.color.rgb.blue = 0;
layer1.textItem.horizontalScale = 90;
layer1.textItem.position = Array(50, 50);
//alert(app.activeDocument);
var pngOpt = new ExportOptionsSaveForWeb();
pngOpt.format = SaveDocumentType.PNG;
pngOpt.optimized = true;
pngOpt.interlaced = false;
pngOpt.PNG8 = false;
var filePath = new File("/Users/ore/test.png");
app.activeDocument.exportDocument(filePath, ExportType.SAVEFORWEB, pngOpt);
//alert(app.activeDocument.path);
alert("ok");



```


以上。
TypeError: MiniCssExtractPlugin is not a constructorの解消方法

create-react-appで作成したTypescriptプロジェクトをnpm run buildした際に、
エラーが出て困った時に解消した方法です。

![1643256862064.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513332/ca0a5057-1578-dc90-2342-0f05c7d2e879.jpeg)



##エラーの内容
```
TypeError: MiniCssExtractPlugin is not a constructor
```

##原因
`mini-css-extract-plugin` がバージョン`2.5.0`にアップデートされたことでエラーが起きたようです。


##解消方法
今回は、`mini-css-extract-plugin`をバージョンダウンすることで解消できました！
同じエラーで困ってる方がいたら試してみてください！



```
npm i -D --save-exact mini-css-extract-plugin@2.4.5
```




##参考にしたサイト
https://github.com/facebook/create-react-app/issues/11930
SAM(CloudFormation)で修正のデプロイしたのにAPI Gatewayの変更が反映されない(REST API)

## 困っていたこと
既にデプロイ済みのAWS SAMスタックで、開発環境用にCORSの設定を緩める必要があって、API GatewayとLambdaのAllow-Originを`*`にしようとしました。（API GatewayはREST APIタイプ）

`sam deploy`した後、マネジメントコンソールで確認してみると、リソースには変更が反映されている模様。
きちんとAllow-Originが`*`になっている。

`リソース→アクション→CORSの有効化`
![スクリーンショット 2022-01-27 11.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/248180ff-00c6-9f5a-c300-655692c7464d.png)

## 解決！
先輩のアドバイスで、マネジメントコンソールでAPIを手動でデプロイしてみる。

`リソース→アクション→APIのデプロイ`
![スクリーンショット 2022-01-27 11.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/19117dfe-86db-b622-d470-4281f2a36336.png)

これでうまくいきました。
今回は問題は解決されたけど、sam deployしたのにAPI Gatewayだけ手動で再デプロイしないといけないって、一体全体どんな仕様なんだ！？

## ドキュメントを見てみる
[REST APIのドキュメント](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-deploy-api.html)では、それに近しい、下記のような注意書きが。
![スクリーンショット 2022-01-27 12.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/9f5ae16d-346e-6e5a-f65c-ec9c0ea7f1a2.png)

また、こんなドキュメントも↓

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/updating-api.html

今回はマネジメントコンソールでデプロイしましたが、CLIでもできそうですね。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-deployments.html

（参考）同じことで困った方々がいらっしゃる模様。
- https://suzuki-navi.hatenablog.com/entry/2020/12/17/214538
- https://qiita.com/gotousua/items/4efcf1ff068fcb83334e
「Goqoo on kintone」で Reactを使う方法

# 概要
Goqoo on kintone を使って、kintoneカスタマイズの React開発環境を構築する方法について書きます。

Goqoo on kintone については下記の公式記事を参照ください。
https://qiita.com/the_red/items/3222d8bf71c32d769060

# 環境

* macOS 10.15.7

# goqoo new

適当なディレクトリを作成して、下記を実行。

`npx goqoo new プロジェクト名`

「Frontend Framework」は (None) を選択。

プロジェクトが生成されたら、プロジェクトディレクトリにcdして、`git commit`します。

# goqoo generate

カスタマイズに必要な雛形のファイル等を生成します。

`npx goqoo generate app アプリ名`

```
$ npx goqoo generate app app305
✔ App name · app305
info Created src/apps/app305/index.ts
info Created src/apps/app305/hello.ts
```

srcディレクトリ以下はこんな感じになっています。

```
$ tree -L 3 ./src
./src
├── apps
│   └── app305
│       ├── hello.ts
│       └── index.ts
├── context.ts
├── example.ts
├── in-app
└── types.ts
```

# Reactパッケージのインストール
React関連のパッケージをインストールします。

package.jsonにパッケージを登録して、`npm install`します。

```
  "devDependencies": {
    "@types/bootstrap": "^5.1.0",
    "@types/react": "^17.0.15",
    "@types/react-dom": "^17.0.9",
・・・ 
  "dependencies": {
    "bootstrap": "^5.1.0",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
・・・
```

# TSXファイルの作成
アプリフォルダの「hello.ts」を書き換えます。

```hello.tsx
import type { IndexEvent } from 'types'
import * as React from "react"
import * as ReactDOM from "react-dom"

const App = () => (<span> Hello from Goqoo on kintone!!!!!!! </span>)

kintone.events.on('app.record.index.show', async (event: IndexEvent<any /* kintone.types.SavedXxxxFields */>) => {
  const container = document.getElementById('react-sample-container')
  ReactDOM.render(<App />, container)
  return event
})
```

# goqoo.config.js修正

「bundlerType:」を'react' に書き換えます。

```
const config = {
  // bundlerType: 'default',
  bundlerType: 'react',
```

# goqoo start
`npx goqoo start` して確認します。

![スクリーンショット 2022-01-27 13.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/1ad3fe89-4ce0-8892-84f7-b7b298e1dd92.png)

※事前にカスタマイズビューを作成して、`<div id='react-sample-container'></div>`を設定しておきます。
LaravelのartisanでDuring inheritance of ArrayAccessエラー

タイトルの通りの問題でちょっと躓きました。
日本語の記事がまだないようなので。

開発環境でLaravelのphp artisanコマンドを使ったらどのコマンドも以下のようなエラーが出るようになりました。

```
PHP Fatal error:  During inheritance of ArrayAccess: Uncaught ErrorException: Return type of Illuminate\Support\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset):
```

ちょっと調べてみたら以下ページがヒット：
https://github.com/maximebf/php-debugbar/issues/482

「そういえば、最近Ubuntuのapt upgradeしたな・・・」と思い、PHPのバージョンをチェックすると8.1になっていました。
（開発中のアプリはその時点まで何の不具合もなく動いていたので気づかなかったというw）

で、上記のページで回答されているようにcomposer updateしたら直りました。
以上^^
windows環境にてavifの一括jpeg変換

####事前準備
[avifdec.exe](https://github.com/AOMediaCodec/libavif/releases)をダウンロードして下さい。

####一括変換バッチ

```cmd:avif2jpg.bat
@echo off

cd /d %~dp0

:loop

if "%~1" == "" goto end

avifdec.exe "%1" "%~n1.jpg"

:next

shift

goto loop

:end

pause
```
上記、一括変換バッチとavifdec.exeを同一フォルダにコピーし
変換したいavifファイルをバッチファイルにコピー貼付けして下さい。
同フォルダにjpgファイルが作成されます。

:::note warn
avifdec.exeが日本語フォルダに対応していないみたいなのでコピー元フォルダ
作業フォルダ共に日本語で表記しないで下さい。
:::
Windows11,Anaconda3上でYOLOv5を動かしてみる(GPU編)

#目的
画像データから物体認識ができるYOLOv5をWindows上で試してみたので方法をまとめた。
[前回はCPUのみで実行していた](https://qiita.com/roxa/items/e735e8ceaeb326943674)ので、今回はGPUを使う方法を試してみた。
##環境
- CPU : Intel i7-10700F 8Core 16thread
- GPU : NVIDIA GeForce RTX 3060 (Mem 12GB)
- OS : Windows11
- Anaconda : 3
- Python : 3.9.7

##YOLOv5のダウンロード
ここは[CPU編](https://qiita.com/roxa/items/e735e8ceaeb326943674)と同じ。
https://github.com/ultralytics/yolov5 から git clone するか、zipファイルをダウンロードして展開しておく。

##PyTorchのバージョンを確認する
https://pytorch.org/ のページへ行き、
Install ボタンをクリックすると
START LOCALY の画面が表示されるので、

- PyTorch Build：Stable (1.10.1)
- Your OS：Windows
- Package：Conda
- Language：Python
- Computer Platform：CUDA 11.3
 
と選択すると下記が表示されるのでメモっておく。

- Run this command : conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

##Anacondaで環境作成
ANACONDA.NAVIGATORで仮想環境を新たに作成し、Terminalを開く。
そこでメモしておいたコマンドを下記のように実行することでPyTorchがインストールされる。

```
  conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
```

他にも必要なパッケージをインストールしておく

```
  pip install opencv-python
  pip install pandas
  pip install requests
  pip install PyYAML
  pip install tqdm
  pip install matplotlib
  pip install seaborn
```

##実行してみる
CPU編の時に作成した test.py のディレクトリへ移動し、実行する。
ソースはこちら https://github.com/roxa-delphi/yolov5_test/blob/main/test.py

```
cd (target-dirctory)
python test.py
```

すると下記のようにメッセージが出て、認識したものにマーカーが付いた状態で動画が表示された。ちゃんとGPUが認識出来ていることが分かる。

```
YOLOv5  2022-1-22 torch 1.10.1 CUDA:0 (NVIDIA GeForce RTX 3060, 12288MiB)
```

![0041_640.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/f46eb7aa-2e20-406c-b0e8-2ded5ff0fe31.jpeg)
60秒の動画の解析時間は

- CPUのみ : 157秒
- GPUあり :  40秒

と約3倍速いことを確認した。
GPUを使うことでリアルタイムに解析可能なことがわかった。

##おまけ
下記の2つのスクリプトも作ったのでgithubへ置いた。

* 動画ファイルを読み込み物体認識を行った結果をフレーム毎にJPEGで保存する
https://github.com/roxa-delphi/yolov5_test/blob/main/detectedFrameImage.py

* 動画ファイルを読み込み物体認識を行った結果を動画ファイルへ保存する
https://github.com/roxa-delphi/yolov5_test/blob/main/detectedMovie.py

##参考URL
Windows11,Anaconda3上でYOLOv5を動かしてみる(CPU編)
https://qiita.com/roxa/items/e735e8ceaeb326943674
iOSで画像の類似度を計算する

#iOSで画像間の類似度を数値化する方法です
<img src="https://user-images.githubusercontent.com/23278992/151288659-65fbc4e9-430d-43cc-a8d9-2f5cb808576d.jpg", width=200>
どちらが上の画像に似ている？
<img src="https://user-images.githubusercontent.com/23278992/151288656-cf66166a-57a3-45a0-89d4-b0aace934e80.jpg", width=200> <img src="https://user-images.githubusercontent.com/23278992/151288605-e97aeefe-a898-4942-85ca-448fc9931906.jpg", width=200>

#にている画像を探したい

#VisionFeaturePrintが使える
VisionFeaturePrintは、たくさんの画像で学習した機械学習モデルによって画像の特徴を数値に抽象化したものです。
その数値を比べることで、画像が似た特徴を持っているかがわかります。

#手順

画像からfeaturePrintを取得します。

```swift
do {
    let request = VNGenerateImageFeaturePrintRequest()
    let requestHandler = VNImageRequestHandler(ciImage: ciImage, options: [:])
    try requestHandler.perform([self!.request])
    guard let featurePrint = request.results?.first as? VNFeaturePrintObservation else { return }

} catch let error {
    print(error)
}
```

画像それぞれのfeaturePrintの間の差を計算します。

```swift
var distance = Float(0)
try featurePrint.computeDistance(&distance, to: baseFeaturePrint)
print(distance)
```

この画像を基準に、featurePrintの差を出してみます。数値が小さい方が、特徴が似ていると判断されています。

<img src="https://user-images.githubusercontent.com/23278992/151288659-65fbc4e9-430d-43cc-a8d9-2f5cb808576d.jpg", width=400>
↑BaseImage

<img src="https://user-images.githubusercontent.com/23278992/151288656-cf66166a-57a3-45a0-89d4-b0aace934e80.jpg", width=400>
松ぼっくり
distance: **28.104025**

<img src="https://user-images.githubusercontent.com/23278992/151288605-e97aeefe-a898-4942-85ca-448fc9931906.jpg", width=400>
リス
distance: **22.826147**

全体の色調は松ぼっくりの画像の方が似ていますが、きちんとリスという特徴を把握していることがわかります。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
vagrant up時にmutagenのエラーでこけた時の対処方法

##エラー内容
mutagen sync terminateでセッションを削除して以降、
vagrant up時にmutagenのファイル同期開始の所で以下のエラーを吐くようになりました。

```
==> default: [vagrant-mutagen] Starting mutagen project orchestration (config: /mutagen.yml)
Connecting to agent (POSIX)...                                                  
Error: unable to create synchronization session (app): unable to connect to beta: unable to connect to endpoint: unable to dial agent endpoint: unable to classify agent handshake error: unknown error condition encountered
==> default: [vagrant-mutagen] Failed to start mutagen project (see error above)
```
##対処方法
~/.ssh/configのvagrantによって追記された箇所を削除した所、エラーを解消できました。

```
# VAGRANT: aef8a32f9628733a8b1b1c076abc1577 (default) / 0be158ed-1049-407c-a0d9-7425165b708c
Host ...
# VAGRANT: aef8a32f9628733a8b1b1c076abc1577 (default) / 0be158ed-1049-407c-a0d9-7425165b708c
```
【Anaconda Powershell Prompt】右クリックメニューから開けるように設定

## 目的
Anaconda Powershell Promptを右クリックメニュー（コンテキストメニュー）から開けるように設定する

## 環境
+ Microsoft Windows 10.0.22000.318（21H2）
+ Windows PowerShell 5.1.22000.282
+ conda 4.11.0

## 準備
1. Anaconda Powershell Prompt を右クリック →「プロパティ」→「ショートカット」のタブを開く →「リンク先」に書かれているものをコピー（copy1とする）
1. Anaconda Powershell Prompt を右クリック →「プロパティ」→「ショートカット」のタブを開く →「アイコンの変更」→ アイコンのパスをコピー（copy2とする）


```:例
# copy1
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\Users\USERNAME\.pyenv\pyenv-win\versions\Anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\Users\USERNAME\.pyenv\pyenv-win\versions\Anaconda3' "
# copy2
%USERPROFILE%\.pyenv\pyenv-win\versions\Anaconda3\Menu\Iconleak-Atrous-PSConsole.ico
```
:::note info
「%windir%」を「C:\Windows」に変えないとエラーが出たが、環境によるかもしれない
:::

## 設定手順
「Windowsキー + R」→「regedit」を入力して実行
![スクリーンショット (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/84b9c293-c5ae-3b7a-c796-851178201299.png)

`コンピューター\HKEY_CLASSES_ROOT\Directory\Background\shell\`に移動
![スクリーンショット (88).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/f0407051-6420-6d87-759a-c8c31e5a578f.png)

「shell」を右クリック →「新規」→「キー」
![スクリーンショット (89).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/edb47322-ddcb-31a0-2e08-f559faec1d26.png)

フォルダ名を「AnacondaPowershellPrompt」などにする→「(既定)」を右クリック →「修正」
![スクリーンショット (90).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/7ebe7326-5b63-5b2b-3deb-4d7b6cf15051.png)

「値のデータ」を「Anaconda Powershell Prompt Here」などにする（右クリックしたときのメニュー名となる）
![スクリーンショット (91).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/064ca098-225c-c910-1a2e-6271d57b1f13.png)

「AnacondaPowershellPrompt」を右クリック →「新規」→「文字列値」→ 名前を「icon」にする →「icon」を右クリック →「修正」→「値のデータ」にcopy2を貼り付ける

「AnacondaPowershellPrompt」を右クリック →「新規」→「キー」→ フォルダ名を「command」にする →「(既定)」を右クリック →「修正」→「値のデータ」にcopy1を貼り付ける

最終的に以下のように設定されていればOK
![スクリーンショット (92).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/9e4b2ec9-9270-817b-9717-b4db8cff8fb7.png)
![スクリーンショット (93).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/ab1b9666-d395-56d9-f0dc-f89be8a0dd47.png)

## 確認
任意のディレクトリで右クリック → 「その他のオプションを表示」→「Anaconda Powershell Prompt Here」（アイコンが正しく設定されていることを確認）
![スクリーンショット (94).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/febb917f-3b30-2d69-b3ab-7f5252cbbfb8.png) 
カレントディレクトリが右クリックした場所と同じになっていることを確認（この例ではドキュメント）→ `conda -V` を実行してcondaのバージョンが表示されたらOK
![スクリーンショット (95).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/b332d28d-d52d-8cd9-8549-622c445ab8fe.png)

## 参考
https://gist.github.com/jiewpeng/8ba446acf329b1801bf91db767d179ea?permalink_comment_id=3128359#gistcomment-3128359
package.jsonのバージョン番号の書き方

# バージョン番号
セマンティックバージョニングのルールに従って記述します。
1.2.3(メジャー.マイナー.パッチ)のように記述します。


|位置|説明|
|---|---|
|メジャー|後方互換のない修正|
|マイナー|後方互換のある機能追加|
|パッチ|後方互換のあるバグの修正|
IE (IE11) の完全終了に関するメモ

まだIEをサポートしている案件などでIE対応について協議するためのリファレンスメモ。
(※2022年1月時点の調査内容なので、今後以下情報は 古くなる可能性があります）


## Microsoft 公式リリース

#### Windows 10 の Internet Explorer 11 デスクトップアプリは 2022 年 6 月 15 日にサポート終了 
https://blogs.windows.com/japan/2021/05/19/the-future-of-internet-explorer-on-windows-10-is-in-microsoft-edge/

以下抜粋：
> Internet Explorer 11 デスクトップ アプリケーションは 2022 年 6 月 15 日をもってサポートを終了いたします

> 法人で Internet Explorer をご利用されている場合は、Internet Explorer ベースの Web サイトやレガシ アプリを、組織内でご利用頂いている可能性があります。実際、企業が保有するレガシ アプリの数は平均で 1,678 個と言われています。IE モードを使用すれば、Internet Explorer 11 デスクトップ アプリケーションのサポート終了日以降も、Internet Explorer ベースで構築されている 組織内の Web サイトやアプリをMicrosoft Edge 上で利用できます。Microsoft Edge の Internet Explorer モードは、少なくとも 2029 年まではサポートする予定です。


```
2022/6/15 で IE11は使えなくなるけど、
Edgeの (IE互換モード) は 2029まで残すから、
社内イントラなど どうしてもIEを必要とするものは IEモードで見てね、ということのようです。
```



#### Internet Explorer 11 デスクトップ アプリケーションのサポート終了 – 発表に関連する FAQ
https://blogs.windows.com/japan/2021/05/19/internet-explorer-11-desktop-app-retirement-faq/

以下抜粋：
> 13) Internet Explorer 11 デスクトップ アプリケーションはデバイスから削除されるのですか。
> いいえ。IE モードが機能するためには IE 11 エンジンが必要であるため、IE 11 デスクトップ アプリケーションがデバイスから削除されることはありません。ただし、 2022 年 6 月 15 日に IE 11 デスクトップ アプリケーションのサポート終了時には、**完全に使用できなくなります**。

> 14) iexplore.exe がデバイスから削除されるのですか。
> いいえ、削除されません。アクセスしようとしても **IE 11 は開かずに、Microsoft Edge にリダイレクトされます** 。

> 1) IE 11 デスクトップ アプリケーションが 2022 年 6 月 15 日にサポートを終了した際、どのプラットフォームが影響を受けますか。
> この発表の **対象外 (影響なし)** となるのは次のとおりです。
> 以下で動作する Internet Explorer 11 デスクトップ アプリケーション:
> ・Windows 8.1
> ・Windows 7 ESU

```
↑を見ると
Windows7、Windows8.1 にすでに入ってるIE11は影響を受けない？
ただしWindows7は2020年に、Windows8については2023年1月に、OS自体の公式サポートが切れる 
```

https://www.microsoft.com/ja-jp/atlife/article-windows10-portal-eos.aspx

以下抜粋：
> Windows 7 
> 2020 年 1 月 14 日に の延長サポートを終了
> Windows 8.1 
> 2023 年 1 月 10 日 延長サポート終了



## 各企業のIE終了の公式リリース状況
公式サイト/サービスで IEのサポートを
https://qiita.com/hiro0218/items/f55dfe79294489c00e9e#%E3%82%B5%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC

を拝見すると、Amazon, Yahoo, Google、その他ITサービス系は多く、
国内のメーカーで は サントリー が出してますね。


## 国内の各企業の社内イントラ の移行状況
一方、社内専用のシステムなどでIE11に依存している国内企業の状況について書かれた記事

https://xtech.nikkei.com/atcl/nxt/column/18/01777/091000001/

以下抜粋：
> ユーザー企業は2022年6月までに「IEでしか動作しないWebアプリケーションを改修する」や「IEでしか動作しないWebアプリケーションを利用する際にはEdgeの『IEモード』を使うよう従業員に周知する」といった脱IEを済ませる必要がある

> 大手ITベンダーの脱IEに関する状況：
> 9社が「移行作業中」であり、IEのサポートが終了する2022年6月までに社内システムの改修を完了させる予定だと回答した。例えばNECは「クリティカルでないごく少数のシステムを除き、2020年3月末までに完了済み」という。富士通は「各事業領域で、グローバルで、対応するもの、捨ててしまうものを検討中であり、現時点では回答できない」とした。


## ちなみ
「Edge」がIEのバージョンと思われることが多いのですが、

```
IE   = Internet Explorer
Edge = Microsoft Edge
```

はそれぞれMicrosoft製ですが、別のブラウザなので、
「IE Edge」などの表現は正しくない。
LSTM層を使おうとしてエラーが出てから使えるようになるまで

##はじめに
keras で時系列データの機械学習してみようと構築しているとLSTMでエラーが出ました。いろいろ調べた結果numpyのバージョンを下げることで解決しました。その過程をまとめます。

####書いたコード
ひとまず簡単なmodelだけ一旦作成しようと以下のコードをとりあえず実行。数字は適当です。

```python 
from tensorflow.keras.layers import Dense, LSTM, Input, Embedding, Dropout 
from tensorflow.keras.models import Model 

nunits = 365
embedding_size = 100 
input_layer = Input(shape=(None,))
x = Embedding(1000, embedding_size)(input_layer)
x = LSTM(nunits)(x)
x = Dropout(rate=0.2)(x)
out = Dense(365, activation='softmax')(x)
model = Model(input_layer, out)
model.summary()
```

そうすると、![Screenshot from 2022-01-27 11-57-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499154/9c9556f0-c6b0-c700-ab4a-00fcb46468a3.png)

詰みました。
そこでnumpyのバージョンを下げればいいとの情報を耳にしたので、新たなLSTM用の仮想環境を作成し、そこでnumpy==1.19.1をインストール

###仮想環境の作成、その他諸々のインストール

```
conda create -n forLSTM python=3.7 ipykernel
```
ターミナルでこのコマンドを実行してforLSTMという環境を作成
そして、

``` 
conda activate forLSTM 
```
これでforLSTMに侵入
もろもろインストールしていきます。

```
conda install numpy==1.19.1
conda install tensorflow 
conda install keras 
```
この状態で最初のコードを実行してみると
![Screenshot from 2022-01-27 12-25-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499154/d4835306-b2d3-a743-128f-e07a5344758e.png)


きました！
vscodeでセルコーディングをしている際は、右のinteractiveと書いてある部分(呼び方がわからない）の右上や、画面の左下などにどの環境にいるかが書かれているので、そこまでちゃんと移行していないとまたエラーが出るので注意です。

###参考文献
[生成Deep Learning]
・David foster 著　
・松田晃一、小沼千絵　訳
・オライリージャパン
・2020年発行
C#でサクッと1行で現在日時をファイル出力する方法 (主にデバッグ用)

C# 6.0以降 (Visual Studio 2017 なら C# 7.0 ～ 7.3 らしい)

```hoge1.cs
File.AppendAllText(@"C:\hoge.txt", $"{DateTime.Now:F}\n");
```

`現在のコンテキストに '*' という名前が存在しません。`といったエラーが出たら、カーソルを合わせて、Alt+Enter (Ctrl+.)で、usingを自動追加してもらったらよいです。

それすらも面倒な人はこちら。

```hoge2.cs
System.IO.File.AppendAllText(@"C:\hoge.txt", $"{System.DateTime.Now:F}\n");
```

備考
---

- `2022年1月23日 12:34:56`といった感じに追記出力されます(末尾改行付き)。別のフォーマットで出したい人は、参考のリンク先を見てください。
- 追記ではなく上書きしたいなら、AppendAllText() → WriteAllText()
- 改行不要なら、末尾の`\n`を削除
- 他の情報も付与したければ、`{}`の外に記載
- `{}`を複数使えば別の場所に変数埋め込んだりできます。例：(int num; が既にあるものとして`$"{num}: {DateTime.Now:F}\n"*
- `\`ではなく`\\`でディレクトリを書きたいなら`@`を削除（`@`はエスケープシーケンスを利用しないための接頭）

参考
-----
日付や時刻を文字列に変換するには？：.NET TIPS - ＠IT
https://atmarkit.itmedia.co.jp/ait/articles/0408/27/news104.html

C#で簡単にファイル入出力 - Qiita
https://qiita.com/t_sato310/items/6c6ec79f4487a52b6b9e
VC++(Windows)で std::chrono の min,max が使えない

(`std::min()`とかで明示してもダメ）
どうやら、`min`と`max`が `Windows.h` で 関数定義ではなく `#define`で定義されているのが諸悪の根源っぽいです・・・。

回避するには以下

```sample.cpp
using namespace std;

#undef max
#undef min
				// ここで min(), max() を使う
				// 念のためここでは、Windows関係の関数を実行しないこと
#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif
```

ベタですが、`Windows.h`によって定義されている`min,max`を一旦定義解除して、やりたい事が終わったら再定義する感じです。
Githubのリポジトリにコマンドでファルをアップロードする方法

```
git init
git add .
git commit
git remote add origin git@github.com:shotaroonishi/{リポジトリ名}.git
git remote set-url origin git@github.com:onishishotaro/{リポジトリ名}.git
git push origin master
```

ちょくちょくGithubの仕様が変わってできない時もある。
javascriptでクエリストリングを取得する

クエリストリングは以下のコードで取得できます

```javascript
const queryString = window.location.search;
console.log(queryString);  // ?k=v&key=val&keyword=value
```

このままだと扱いづらいので、`URLSearchParams` を用いて変換します
ref: [URLSearchParams｜MDN](https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams)
＊[Can I use](https://caniuse.com/?search=URLSearchParams) によるとIEはサポート外ですが、御時世、既に無視して良いでしょう

```javascript
const queryString = window.location.search;
const queryParam = new URLSearchParams(queryString);
const kVal = queryParam.get('k');
console.log(kVal);   // v
const keyVal = queryParam.get('key');
console.log(keyVal);   // val
const keywordVal = queryParam.get('keyword');
console.log(keywordVal);   // value
```

`?=&` でごりごりしなくてヨシ！
Laravel参考サイトまとめ


Laravelで検索する時に便利なサイトを備忘録としてまとめました。
リファレンスが調べやすく、ドキュメントがユーザーにやさしい言語だなぁとまとめてみて思いました。

目次

[・なにはともあれ公式](#なにはともあれ公式)
[・PHPの文法を知りたい](#文法を知りたい)
[・GitHubのソースから検索](#ソース検索)
[・テスト書きたい](#テスト書きたい)
[・ライブラリのインストールや依存関係の管理](#ライブラリのインストールや依存関係の管理)
[・PHPカンファレンス](#カンファレンス)
[・その他おすすめ](#その他おすすめ)

# なにはともあれ公式

基本エラー内容をググったら検索できます。調べたいことがあるケースは、Laraveの公式ドキュメントが網羅性があり読みやすいです。一通り公式に目を通しておくと、他言語から移行する際に、スムーズに学びやすいです。[日本語](https://readouble.com/laravel/)と[英語](https://laravel.com/docs/8.x)がありますが、英語の方がより詳しい情報が載っています。下は、日本語の索引です。
![スクリーンショット 2022-01-27 11.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/541da45b-75ea-82b8-e590-2901fbd48b63.png)

# 文法を知りたい

PHPの文法がわからなければ、[PHP マニュアル](https://www.php.net/manual/ja/)を見るといいです。

# ソース検索
公式サイトです。
https://github.com/laravel/laravel

# テスト書きたい
テストを書く時は[PHPUnitマニュアル](https://phpunit.readthedocs.io/ja/latest/)が参考になります。

# ライブラリのインストールや依存関係の管理

ライブラリのインストールや依存関係を管理してくれる[Composer](https://getcomposer.org/doc/)の公式ドキュメントです。

# カンファレンス

[PHPカンファレンス](https://phpcon.php.gr.jp/2021/)に参加してみると、同じ言語を触っている人の悩みや課題、スキルの高さを身近に体験することができ、いい刺激になります。無料なのでぜひ!!



# その他おすすめ

公式以外のおすすめサイトは以下です。

詳細かつ実用的な情報が載っており、お世話になってます。
https://blog.capilano-fw.com/

最新のlaravel-newsが追えます。
https://laravel-news.com/

英語ですが、説明がわかりやすいです。
https://www.phptutorial.net/
Oculus Integration の LipSync 機能で、マイクで話した音素を直接取得する

Unityを使ってVRでアレなゲームを作成しています。
VRのゲームってコントローラーで操作するのが結構煩わしいので、「音声認識で操作出来たらいいなー」などと思いいろいろ調べたことを備忘録程度に書きます。
## やりたいこと/やったこと
Unity で Oculus Integration を使って Oculus Quest2 用のゲームを開発しています。
その際に喋った言葉を解析して操作をさせたいです。
喋った言葉を全部ひらがなに直すのは結構難しそうなので、簡易的に音素を取得して代用することにしました。
## Oculus VR での音声認識に関して
まず前提として、Oculus Quest2 のVRゲームで音声認識(喋った言葉をひらがなに変換する)はどうも結構難しそうです。

以下参考にした記事など

- [UnityEngine.Windows.Speech](https://docs.unity3d.com/ja/current/ScriptReference/Windows.Speech.DictationRecognizer.html)
    - よさげですがwindows端末でしか使えないようです。無念。
- [【Unity(C#)】OculusQuestでAndroidネイティブの音声認識機能を呼び出せるのか検証](https://qiita.com/OKsaiyowa/items/6d9b4115b2945aecb495)
    - Androidの機能を使っているようです。こちらもよさげですがVRでは使えないという結論(自分では検証してないのですが、、、)
- [【Unity(C#)】Watson API × OculusQuestで音声認識](https://qiita.com/OKsaiyowa/items/59805da08d0da1e392e8)
    - 完全に音声認識できていますが、Watson APIでお金かかりそうなのと、そもそも今回そこまでたくさんの言葉を認識させるつもりはないので今回はスルー。次回作あたりで使うかも

ということで途方に暮れていましたが、「LipSyncって音素は取得できているみたいだし、これの数値直接取得したら何とかなるのでは？」と思ってやってみたら音素の取得自体は結構簡単でした。

## LipSyncの音素取得
LipSyncの基本機能はデモシーン(Oculus > LipSync > Scenes > LipSync_Demo シーン)を参考にしました。
このシーンの中で重要なオブジェクトは InputType_Microphone で、僕のやりたいことはほぼここに詰まっているようです。

- OVRLipSyncContext
    - マイクで取得した音声の音素を解析して、frameにぶち込みます。解析の細かい内容は不明。とりあえずframeを抜き出せば音素量が数値で取得できる。
    - ご丁寧に GetCurrentPhonemeFrame という関数でほかのスクリプトから frame をそのまま取得させてくれる。
- OVRLipSyncContextMorphTarget
    - OVRLipSyncContextのframeの内容を、SkinnedMeshRendererに反映して口の動きを制御する。
    - 今回は誰かを喋らせるわけではなく、音素量を取得したいだけなので、特に必要ない。
というわけで、外から OVRLipSyncContext の frame を取得して音素を解析します。

## 自作スクリプト
```LipSyncContextGetter.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LipSyncContextGetter : MonoBehaviour
{

    private OVRLipSyncContextBase lipsyncContext = null;
    OVRLipSync.Frame frame;

    // Start is called before the first frame update
    void Start()
    {
        lipsyncContext = GetComponent<OVRLipSyncContextBase>();
    }

    // Update is called once per frame
    void Update()
    {
        // sil、PP、FF、TH、DD、kk、CH、SS、nn、RR、aa、E、ih、oh、ou
        frame = lipsyncContext.GetCurrentPhonemeFrame();
        for (int i = 0; i < 15; i++)
        {
            Debug.Log(frame.Visemes[i]);
        }
    }
}
```

今回はとりあえずここまで。
この方法で操作できたかどうかまた記事書く予定です。

せっかくだから前作のリンクを置きたいのだけど、QiitaってDLSiteのR18作品のリンクとか載せたら怒られるのかな、、、
SIMCOM社のSIM7080G・SIM7090Gで AWS IoT Core に接続


SIMCOM社の***SIM7080G・SIM7090G***を使って AWS IoT Core に繋がりませんでしたがやっとつながりました。

原因は AWS IoT Core の設定画面からダウンロードした
ROOT CA 証明書 では SIM7080G・SIM7090G を使って AWS IoT Core には接続出来ないと言うことでした。
代わりに
[How to Prepare for AWS’s Move to Its Own Certificate Authority](https://aws.amazon.com/jp/blogs/security/how-to-prepare-for-aws-move-to-its-own-certificate-authority/)
こちらからダウンロードした証明書を使います。
* Note: Amazon doesn’t own this root and doesn’t have a test URL for it. The certificate can be downloaded from here.
***here***の部分にリンクされています。

***myclient.crt***と***myclient.key***は***AWS IoT Core の設定画面***からダウンロードしたファイルとなります。

SIMカードは SORACOMのPlan-D を使いました。
接続出来たATコマンドのログを掲載します。
証明書類の登録は ***DOWNLOAD*** の文字が表示されたら 証明書のデータをコピペでターミナルに貼り付けてください。

下のログの中の ***ここにaws iot core の アドレス*** の部分に接続先の URL を書いてください。
""はいりません。

以下のログは ***SIM7080G*** でテストした時のログですが ***SIM7090G*** でも同じ動作になるのを確認しました。

```AT.log
at

OK
AT+CGDCONT=1,"IP","soracom.io"

OK
AT+CNCFG=1,1,"soracom.io"

OK
AT+COPS=1,2,"44010"

OK
AT+COPS?

+COPS: 1,2,"44010",7

OK
AT+CPIN?

+CPIN: READY

OK
AT+CNMP=38

OK
AT+CMNB=1

OK
AT+CSQ

+CSQ: 20,99

OK
AT+CGREG?

+CGREG: 0,1

OK
AT+CGNAPN

+CGNAPN: 1,"soracom.io"

OK
AT+CPSI?

+CPSI: LTE CAT-M1,Online,440-10,0x900E,152515091,30,EUTRAN-BAND1,276,4,4,-10,-100,-77,12

OK
AT+CNACT=0,1

OK

+APP PDP: 0,ACTIVE
AT+CNACT?

+CNACT: 0,1,"10.155.14.27"
+CNACT: 1,0,"0.0.0.0"
+CNACT: 2,0,"0.0.0.0"
+CNACT: 3,0,"0.0.0.0"

OK
AT+CFSINIT

OK
AT+CFSWFILE=3,"aws-class2-root.crt",0,1468,10000

DOWNLOAD

OK
AT+CFSWFILE=3,"myclient.crt",0,1220,10000

DOWNLOAD

OK
AT+CFSWFILE=3,"myclient.key",0,1675,10000

DOWNLOAD

OK
AT+CFSGFIS=3,"aws-class2-root.crt"

+CFSGFIS: 1468

OK
AT+CFSTERM

OK
AT+SMCONF="URL",ここにaws iot core の アドレス,8883

OK
AT+SMCONF="CLEANSS",1

OK
AT+SMCONF="KEEPTIME",180

OK
AT+SMCONF="CLIENTID","simmqtt"

OK
AT+CSSLCFG="CONVERT",1,"myclient.crt","myclient.key"

OK
AT+CSSLCFG="CONVERT",2,"aws-class2-root.crt"

OK
AT+SMSSL=1,"aws-class2-root.crt","myclient.crt"

OK
AT+CSSLCFG="sslversion",0,3

OK
AT+SMCONN

OK
AT+SMSUB="testpublish",1

OK
AT+SMPUB="testpublish",11,1,0

> hello world
OK

+SMSUB: "testpublish","hello world"
```

この2ヶ月位繋がらなくて色々やっていましたが
さすがにこれは自己解決は出来なかったと思います。

色々と情報を提供していただいた SIMCOM代理店の キャセイトラフィック様に感謝です。
さくらインターネット上でWordPressの内部転送設定をする

さくらインターネットのサーバ上でWordPressを運用しているのですが、ドメインルートURLにアクセスした際にサブディレクトリにインストールしたWordPressに内部転送したいと考えました。

>
例）以下のサイトにアクセス
https://example.com
以下のサイトに内部転送（表示されるURLは変わらない）
https://example.com/wp/

一番簡単なのはhttpd.confファイル内でmod_rewriteを利用した設定を行えばOKです。
※.htaccessでは[L]の設定が有効になりません。

```:httpd.conf
RewriteEngine On
RewriteRule ^wp/(.*) /$1 [L]
```

しかし、さくらインターネットで共有サーバを利用しているとhttpd.confは編集できません。
そのため、以下の手順でWordPress側で対応しました。

1. WordPressの管理画面上で「サイトアドレス」の設定を修正
1. index.phpと.htaccessファイルをルートにコピー
1. index.phpと.htaccess内のフォルダ記述を修正する

# WordPressの管理画面上で「サイトアドレス」の設定を修正
WordPressの管理画面にログインし、「設定」→「一般」を開きます。
「サイトアドレス」のところに記載されたURLをルートに書き換えます。
※「Word Pressアドレス」の方は修正しません。

![スクリーンショット 2022-01-27 11.38.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/247316e4-a4a2-3ad0-d594-d6a3f90db4c2.png)

# index.phpと.htaccessファイルをルートにコピー
sshまたはftpなどを利用して/wp/以下のindex.phpと.htaccessファイルを/にコピーします。

# index.phpと.htaceess内のフォルダ記述を修正する
コピーした/index.phpの以下の部分を修正します。

```php:index.php
// 修正前
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

// 変更後
require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
```

コピーした/.htaccess内で/wp/の記載がある部分も/に修正します。

```php:.htaccess
・・・
# 変更前
RewriteBase /wp/
# 変更後
RewriteBase /
・・・
# 変更前
RewriteRule . /wp/index.php [L]
# 変更後
RewriteRule . /index.php [L]
・・・
```

# まとめ
WordPressのプラグインなどを使ってキャッシュが効いているとすぐには反映しないので、キャッシュをオフにするなどして確認する必要があります。
必ずバックアップを取ってから行ってくださいね。

# 参考

https://www.nishi2002.com/4718.html

https://lpeg.info/html/htaccess_flag_code.html
ICAP とは

## 勉強前イメージ

ICMPとは違うよね。。。

## 調査

### ICAP とは

アイキャップと読み、 Internet Content Adaptation Protocolの略です。
プロキシサーバやキャッシュサーバが外部との連携を取れるためのプロトコルです。

### 外部連携って曖昧じゃない・・・？

どういうときに使用されるかと言うと、
プロキシサーバやキャッシュサーバがwebのコンテンツを取得する際に
ウイルスチェックのため、プロキシサーバやキャッシュサーバ → ウイルスチェックサーバ へコンテンツを送り確認してもらいます。
このコンテンツを送る際に利用しているのがICAPというプロトコルです。

しかし、外部との連携はウイルスチェックを行うサーバに送る以外にも
コンテンツのフィルタリングなど様々あることから 外部連携と言っている。

全体的にプロキシサーバなどが他のサーバの機能を利用するため情報を送る際に使用されるのが、ICAPという位置づけになりそう。

## 勉強後イメージ

プロキシサーバ内で完結してると思ってたけど、実はそうじゃないのね？
まぁ...そうか。。

## 参考

- [ICAP(アイキャップ)とは](https://livescamp.com/learn/icap)
- [ICAP](https://wa3.i-3-i.info/word13204.html)
- [ICAPとは](https://www.designet.co.jp/faq/term/?id=SUNBUA)
グラフィカルモデラーでアルゴリズムタブが表示されなくなった

QGISを色々といじっているのですが、本日QGISを立ち上げてフラフィカルモデラーを使用しようとしたら出た現象をメモ書きします。<br>バージョンは3.22で現状の最新版なので不安定なのかもしれません。

- モデルデザイナーは問題なく起動しました。![スクリーンショット 2022-01-27 9.37.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/94d90529-21cf-9a50-be1b-7e920704d2cd.png)

- ツールボックスのアルゴリズムタブ（メニュー）がありません。![スクリーンショット 2022-01-27 9.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/1b6cab2e-a1c1-04e8-d808-72fa74e43c90.png)
- 表示非表示のチェックボックスがグレーアウトしてしまっています。
![スクリーンショット 2022-01-27 9.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/5d8b0ec5-9d1d-7a35-6758-1373afdaffc7.png)

- 調べたのですがこの現象の解決方法がわかりませんでした。どなたかご存知でしたらおしえてください。
- 仕方がないのでアプリの再コピーをしました。（Macなので）
###結果なにも変わりませんでした。
どうやら設定のキャッシュデータがどこかに保存されているようですね。よくよく考えたらバージョンアップの時とか今までの設定がリセットされたらたまったもんじゃないので当たり前でした。
- 設定を全部消す
現状QGISに大したプラグインを入れていたわけでもないので設定フォルダを消してしまおうと思いました。ぶっちゃけどの設定がどれなのかわからないので。もしダメなら再インストールできるだろうということで
/Users/*user名*/Library/Application Support/QGIS
のディレクトリを消しました。
プラグインもきえました。
地理院地図やらgoogleMapsやらタイル画像の設定もきえました。

が
![スクリーンショット 2022-01-27 11.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/2fb7817c-06c5-6ad9-75d9-5997809d48ef.png)
元に戻りました。

Macのアプリのアンインストールも慣れてなかったので色々迷って時間がかかりました。。
[Macで不要なアプリを完全に削除（アンインストール）する3つの方法](https://www.drbuho.com/jp/how-to/uninstall-apps-mac)
Windowsは優しいOSだったんですね。

### 原因？
このモデルデザイナーのツールボックスウィンドウは別ウィンドウとして分離できるのですが、入力タブとアルゴリズムタブを分離したりくっつけたりしながら使ってました。最後どういう形でアプリを閉じたか覚えてませんがあんまり分離した状態でアプリを閉じない方がいいかもしれません（完全に予想ですが）
QGISはちょっと深くまでいくと途端に解説してるwebページがなくなるし、ドキュメントも欲しい情報がない時もあるので大変ですね。