OmniAICreator/Qiita-1.07M huggingface dataset:
２倍角の公式sin(2θ)「2023帯広畜産大学前期【５】問１」をwolframalphaとsympyでやってみたい。


＞与式を展開するとsin２θで表すことができます．
以下、「２倍角の公式」の私の勉強不足です。

オリジナル

http://kamelink.com/blog/2023/04/12/3-4-23-obihirochikusandai-1-1/

大学入試数学問題集成＞【５】問１　テキスト

https://mathexamtest.web.fc2.com/2023/202310009/2023100090100mj.html


# wolframで(式の変形で。三角関数式で)
勉強中

https://reference.wolfram.com/language/tutorial/AlgebraicManipulation.html#31321

# wolframで(θの値を計算してから)
できませんでした。

https://www.wolframalpha.com/input?i=sin%282t%29%3D-3%2F4%2C-2%2Fpi%3Ct%3C2%2Fpi&lang=ja

https://www.wolframalpha.com/input?i=t%3D-1%2F2+sin%5E%28-1%29%283%2F4%29%2C%281%2Fsin%28t%29%2B1%2Fcos%28t%29%29%5E2&lang=ja


# sympyで(数学入試問題様の方法を参考に)
以下もっといい変形の方法がありませんか？力技になってしまいました。
factorで分子と分母に分けて、別々に式の変形をしました。

```python
from sympy import *
t=symbols("t",real=True)
f=1/sin(t)+1/cos(t)
g=f.factor()
bunsi2=(numer(g)**2).expand().subs({sin(t)**2 +cos(t)**2:1}).simplify()
bunbo2=(denom(g).simplify())**2
print("#",(bunsi2/bunbo2).subs({sin(2*t):Rational(-3,4)}))
# 16/9
```

# sympyで(sympy風?)
θの値を計算してから、直接代入しました。
・[1]の拾い方を教えて下さい。
前もって、範囲を指定する方法？または
2つの値から、1つを選ぶ方法？
よろしくお願いします。
```python
from sympy import *
t=symbols("t",real=True)
ans=solve( Eq(sin(2*t),Rational(-3,4)) )[1]
print("#",((1/sin(t)+1/cos(t))**2).subs({t:ans                                    }).simplify())

from sympy import *
t=symbols("t",real=True)
print("#",((1/sin(t)+1/cos(t))**2).subs({t:solve( Eq(sin(2*t),Rational(-3,4)) )[1]}).simplify())
# 16/9
# 16/9
```
具体的に、θ角度の計算しました。-24.2...度でした。
```python
from sympy import *
t=symbols("t",real=True)
ans=solve( Eq(sin(2*t),Rational(-3,4)) )[1]
f=(1/sin(t)+1/cos(t))**2
print("#",ans,float(ans/pi*180))
print("#",float(f.subs({t:ans})),f.subs({t:float(ans)}))
# -asin(3/4)/2 -24.295188945364572
# 1.7777777777777777 1.77777777777778
```

web上の実行方法:
上記のソースをコピー貼り付けです。改行です。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。

https://live.sympy.org/



# 参考

https://docs.sympy.org/latest/modules/solvers/solvers.html

https://docs.sympy.org/latest/modules/solvers/solveset.html


＞とあり、solvesetの使用を推奨している。

https://atatat.hatenablog.com/entry/sympy8_eqsolve

To simplify expressions using trigonometric identities, use trigsimp().

https://docs.sympy.org/latest/tutorials/intro-tutorial/simplification.html#trigsimp

https://qiita.com/mrrclb48z/items/693e1a20e293a528bccb
クロージャ

## なにもの？？
クロージャ(英語:closure)とは、**関数**とその関数が宣言されたときの外側にあった**環境**を合わせて指す用語です。
(会話での使い方　⇒　この変数は外部からいじられたくないので、クロージャを返す関数を作ろう！)
## なぜクロージャが重要なのか
クロージャを使うことで変数を**外部からのアクセス**を遮断したり、制限したりできます。そのため、**堅牢性**の高いプログラムを書くことができます。
## 使用例
```javascript:qiita.js
function alertDeadline(year, month, day) {
  let deadline = new Date(year, month - 1, day, 0, 0, 0);
  return () => {
    let diff = Math.ceil((deadline.getTime() - new Date().getTime()) / (1000 * 60 * 60 * 24));
    return `締め切りまであと${diff}日です。`;
  }
}
```
PKG_CONFIG_PATHが効いていないと思ったらファイルがなかった


# 結論
`PKG_CONFIG_PATH=/path/to/abc/lib/pkgconfig pkg-config --cflags abclib`が期待しない結果を表示したら`/path/to/abc/lib/pkgconfig`に`abclib.pc`ファイルがあるかどうか確認する。

## 物語
Homebrewで以下のバージョンのPythonをインストールしています。
- python@3.8
- python@3.11

CPython系プログラムのビルドの際にビルドフラグが必要なのでpkg-configコマンドで取得しています。

今回はPython3.8系でビルドしたかったため、PATHを設定しています。
```
$ export PATH=/usr/local/opt/python@3.8/libexec/bin:$PATH
$ python3 -V
Python 3.8.16
```

通常は`pkg-config`を使用してフラグを取得します。
```
$ pkg-config --cflags python3-embed
-I/usr/local/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/include/python3.11
```

現状Python3.11のフラグが取得されてしまいます。
こんなときは、PKG_CONFIG_PATHを設定することで優先して設定ファイルを読み込みます。

今回はPython3.8のpkgconfigの場所を指定します。
場所は以下のようにして探していました。
```
$ find "$(python3-config --prefix)" -type d -name "pkgconfig"
/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/pkgconfig
```

そしてこれをPKG_CONFIG_PATHに指定して実行するとPython3.8用のフラグが取れま

```
$ PKG_CONFIG_PATH=/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/pkgconfig pkg-config --cflags python3-embed
-I/usr/local/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/include/python3.11
```

せんね。。
なぜかPython3.11の結果を取得しました。

おかしいですね。
中身を見てみましょうか。

```
$ ls /usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/pkgconfig
python-3.8-embed.pc python-3.8.pc
```

うーむ。何かがおかしい。`python3-embed.pc`がないですね。原因がわかりました。

`pkg-config`を実行する際、
`pkg-config --cflag somelib`
と指定した際は、`somelib.pc`を使用して結果を返すのですが、今回そのファイルはPKG_CONFIG_PATHで指定したディレクトリにはなかったため、通常のパス（`/usr/local/lib/pkgconfig`）から`python3-embed.pc`が読み込まれたということでした。


念の為、`python3-embed.pc`を見てみると以下のように`Python3.11`向けの内容となっていました。
```
$ cat /usr/local/lib/pkgconfig/python3-embed.pc
# See: man pkg-config
prefix=/usr/local/opt/python@3.11/Frameworks/Python.framework/Versions/3.11
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: Python
Description: Embed Python into an application
Requires:
Version: 3.11
Libs.private: -ldl  -framework CoreFoundation
Libs: -L${libdir} -lpython3.11
Cflags: -I${includedir}/python3.11
```

ということで、
`pkg-config --cflags python3-embed`　ではなく
`pkg-config --cflags python-3.8-embed`が正解でした。


`/usr/local/lib/pkgconfig`の中身は以下の通り`python-3.8-embed.pc`を含んでいたので環境変数もいらなかったですね。
```
$ ls /usr/local/lib/pkgconfig | grep python
python-3.11-embed.pc
python-3.11.pc
python-3.8-embed.pc
python-3.8.pc
python3-embed.pc
python3.pc
```

複数のPythonを色んな方法でインストールしている場合は`python3-embed.pc`がどのバージョンのものか不明なのでマイナーバージョンまで指定したほうが確実ですね。
データ型の種類まとめ

## はじめに

Rails、Javaを学び始めて、データ型についてざっくりと理解はしていましたが改めて記憶の定着を兼ねてアウトプットしたいと思います。

**データ型とは**
プログラムで扱うことができるデータの種類の事。

## 代表的な９種類のデータ型

### 整数
- byte～とても小さな整数　//byte glasses; 所持眼鏡数
- short～小さな整数　//short age; 年齢
- int～普通の整数　//int salary; 給与金額
- long～大きな整数　//long worldPeople; 世界人口

### 少数
- float～少しあいまいでもよい小数　//float weight; 体重
- double～普通の整数　//double pi; 円周率

### 真偽値
- boolean～trueかfalse　//boolean isError; エラーか否か

### 文字
- char～１つの文字　//char initial; イニシャル１文字

### 文字列
- String～文字の並び　//String name; 自分の名前

## おわりに

今回はデータ型についてアウトプットしました。
基本的にこの９つのデータ型を覚えておくことをお勧めします。
ご覧いただきありがとうございました！
EC2上のデフォルトのブランチ名がmasterであることによるエラーを解消する方法

# はじめに

・EC2にてアプリケーションを手動から自動デプロイに切り替える際にエラーが起きた。
・GitHubのデフォルトブランチ名は'main'であるが、EC2上では'master'を用いる仕様になっているためエラーが起きる。
※自分用のメモです


# 対応したこと
ブランチ名が'main'であることをEC2に認識させるため、deproy.rbファイルの一番下に下記のコードを追記した。

config/deproy.rb
```ruby
set :branch, 'main'
【Rails】undefined method `admin?' for nil:NilClassが発生したので解決する

# エラー発生箇所
Railsチュートリアル(第7版)10章にて
現在のユーザーが管理者かどうかを確認する`admin_user`メソッドを追加後Mintestを実行するとエラーが発生しました。

同じような状態になってしまった方の参考に少しでもなれば幸いです。

```rb:users_controller.rb
class UsersController < ApplicationController
.
.
.
    # 管理者かどうか確認
    def admin_user
      redirect_to(root_url, status: :see_other) unless current_user.admin?
    end
end

```

```:エラーメッセージ
NoMethodError: undefined method `admin?' for nil:NilClass
```

# 解決までの思考

`Userモデル`に`admin`が追加されていないのかと思い、`schema.rb`の内容を確認します。

```rb:schema.rb
ActiveRecord::Schema[7.0].define(version: 2023_04_12_041409) do
  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.string "remember_digest"
    t.boolean "admin", default: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end
end
```
追加されていました。

```:Railsコンソール
>> user = User.first
>> user.admin?
=> true
```
Railsコンソールで`admin?`メソッドが使えることも確認できます。

ということはメソッドを実行する`current_user`に問題がありそうです。

`admin_user`メソッドは`destroy`アクションが実行される前に`before_action`で呼び出されるので、その時点でcurrent_userに値が入っている必要があります。

ここで同じく`before_action`で`admin_user`の前に呼ばれる`logged_in_user`が実行されていないのでは！と閃きました。

`logged_in_user`を実行するアクションを指定する`only:`に`:destory`を指定し忘れたかと思い確認すると、、
```rb:users_controller.rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :delete]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy
```

`:destroy`とすべきところを`:delete`にしていました、、

`:destroy`に修正すると無事テストが通りました！
```rb:users_controller.rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy
```


# 分かったこと
メソッドを実行する対象(今回の場合は`current_user`)を**レシーバ**という。
`for nil:NilClass`のエラーが出た場合はレシーバがnilになっていないか疑う。



※参考記事
https://hachimaki37.hatenablog.com/entry/2020/12/15/193747
https://diveintocode.jp/blogs/beginner/nilClass
Bigquery キャッシュについて

# 目次
[1.はじめに](#1-はじめに)
[2.動作環境](#2-動作環境)
[3.BigQueryとは](#3-BigQueryとは)
[4.キャッシュについて](#4-キャッシュについて)
[5.まとめ](#5-まとめ)

# 1. はじめに
この記事はBigQueryに関して記実していきます。
仕事でも使用しているGCPのツールで、SQLを使ってデータを加工したりなどしています。

今回は一度処理したクエリを再度処理した時の動作について見ていきたいと思います。

# 2. 動作環境
・ Mac OS 13.0
・ BigQuery

# 3. BigQueryとは
BigQuery は、大量のデータを分析するためによく使用されています。
また、SQLを使用してデータセットの検索、集計、グループ化などを行うことができます。

BigQueryの料金はストレージの料金とクエリ料金の合計で決まります。
現在時点(2023年4月11日)での無料枠は
・クエリ料金 : 1ヶ月あたり1TB 
・ストレージ料金 : 1ヶ月あたり10GB
となります。
(参照URL)https://cloud.google.com/free/docs/free-cloud-features?hl=ja#free-tier 
# 4. キャッシュについて
今回も使用するデータマートはGoogle側で用意されているデータマートを利用しています。
```ruby: 使用したテーブル
bigquery-public-data.github_repos.commits
```

テーブルが用意できたら実際にSQLを使って1カラムを抽出するクエリを作成し実行してみます。
そして再度同じクエリを実行して見ます。
２つのジョブ情報についての写真を以下に載せます。
![スクリーンショット 2023-04-12 14.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669832/4b9c5e80-f94b-5dd6-3992-141abbc1bbe6.png)

結果処理時間は１回目は１９秒ほどかかりましたが、２回目は一瞬で処理されました。(処理結果については写真の赤枠参照)
また２回目のジョブ情報の「処理されたバイト数」を見てみると、キャッシュされた結果と表示されています。
というのも１回目のクエリはデフォルトでキャッシュに保存されます。
そして２回目はそのキャッシュからクエリを実行するため高速で動作します。
また、ストレージ料金もかからないようになっています。

このキャッシュ機能を使いたくない場合は以下の手順を実行します。
1.展開をクリック![スクリーンショット 2023-04-12 16.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669832/52c747d3-4d4e-b2d4-256b-39adc66dd255.png)
2.「キャッシュされた結果を使用」のチェックを外す![スクリーンショット 2023-04-12 16.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669832/5fe91b39-8b5c-a219-aa35-5197a994df5e.png)

# 5. まとめ
以上のようにキャッシュ機能によって処理速度が高速化したりする便利な機能になっています。
次は今回のテーブルは一時的なキャッシュ結果テーブルの話なので宛先テーブルについて勉強した内容を記入していきたいと思います。
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. ERRO[0000] error waiting for container: context canceledを解決する


# 解決法

nvidia-container-runtimeを入れて設定し直すとうまくいく。
```
sudo apt-get install nvidia-container-runtime
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey |   sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list |   sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install nvidia-container-runtime
service docker restart
```

## 確認
適当なコンテナを起動してうまくいくことを確認してみる。
```
sudo docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:23.03-py3
```

無事起動してパチパチ
クロージャーについて

## クロージャーとは
クロージャーとは関数とその関数が宣言された時の
外側にあった環境を合わせて指す用語のこと。

:::note warn　
関数とその関数スコープ内にある変数をまとめて指し、
セットで保存される現象そのものの事
:::

## なぜクロージャーが重要なのか
チームでコーディングをしていくとコード量が増えるため、
自分のプログラムで使用しているオブジェクトの変数の値などが他のプログラムで
容易に書き換え得てしまうと予期せぬエラーに繋がる恐れがある。
そのため、クロージャーを使う事で外部から変数へのアクセスを
防止する為の役割も担っている。

## 実際の現場でどのように使えるのか
以下の ◆クロージャーの例 のように
ベースとなる関数を作成し、コードのバリエーションを増やす事が容易。


## ◆クロージャーの例
```JavaScript:js
function makeAdder(x) {
  return function (y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
const add10 = makeAdder(10);

console.log(add5(2)); // 7
console.log(add10(2)); // 12

```
Python Anacondaを使ってみた　① QRコード生成システム作成編

## 挨拶
こんにちは。Python歴3ヶ月！最近Pythonデビューをした、KameHonuです。
今日は、Anacondaを使ったQRコード生成システムを作成していきます。
# 目次
・Python Anacondaとは？
・QR生成システムの実装方法 
## Python Anacodaとは
Python Anacondaとは、Pythonのディストリビューション(pythonのモジュールが既にダウンロードされているやつ）です。
https://www.anaconda.com/
↑Anacondaのリンク↑
Anacondaをダウンロードしたら、VScodeのインタープリターにanacondaが追加されているのでanacondaを選択します。
すると、モジュールインストールなしでpythonが使用できます！
## QRコード生成システムの実装

```
import qrcode

qr = qrcode.QRCode(version=1)
qr.add_data('出力したい文字やリンク')
qr.make()
img = qr.make_image()
img.save('保存ファイル名.png')
```
これをpythonに入力して実行させるだけです。
以上です。お疲れ様でした。
StorybookをVercelにデプロイしよう！

## 前提条件

- storybook 7.0.2
- storybookやVercelの使い方の解説はしません。
- 筆者はNext.jsでStorybookを使っていますが、フレームワーク関係なくデプロイできます（多分）

基本的には以下のドキュメントのハンズオンです。

https://vercel.com/guides/storybook-with-vercel


:::note warn
注意
特にこだわりがなくStorybookをホスティングするだけなら[chromatic](https://www.chromatic.com/)がオススメです。
何らかの理由でVercelでホスティングしたい方向けの記事になります。
:::

## ローカルでのチェック

以下の2つのコマンドがローカルで動くか先に試して下さい。

```
$ npm run storybook

> your-project@0.1.0 storybook
> storybook dev -p 6006

@storybook/cli v7.0.2

|   Storybook 7.0.2 for nextjs started               │
│   337 ms for manager and 20 s for preview          │
│                                                    │
│    Local:            http://localhost:6006/        │
│    On your network:  http://xxx.xxx.x.xxx:6006/    │

```

```
$ npm run build-storybook

> your-project@0.1.0 build-storybook
> storybook build

@storybook/cli v7.0.2

info => Output directory: /path/to/your-project/storybook-static

```

## Vercelの設定

`settings`で以下のように設定して下さい。

|  項目  |  値  |
| ---- | ---- |
|  Framework Preset  |  `Other`  |
|  Build Command  |  `npm run build-storybook`  |
|  Output Directory  |  `storybook-static`  |
|  Install Command  |  そのまま  |
|  Development Command  |  `npm run storybook`  |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636007/db7ae6ea-09d6-d70e-72b3-b6b55772e5f8.png)

## デプロイ

`deployments`でRedeployしましょう。
デプロイが終わり以下のような画面がVercelのURLで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636007/1d6fc89c-c415-e4c9-49f7-07289056ee49.png)

## おまけ

Basic認証も付けれるようです。

https://zenn.dev/monicle/articles/vercel-plain-middleware-basic-auth
Lambda関数内でCloudWatch LogsのログストリームURLを取得する

# Lambda関数内でCloudWatch LogsのログストリームURLを取得する

AWS Lambda関数内でAWS CloudWatch LogsのログストリームURLを取得する方法に関する記事はいくつか見つかりますが、ここではエンコードせずに最もシンプルに書く方法を紹介します。

使用言語はPythonです。

## 必要な情報をコンテクストから取得する

```python:handler.py
import os

def lambda_handler(event, context):
    region = os.getenv('AWS_REGION') or os.getenv('AWS_DEFAULT_REGION')
    log_group = context.log_group_name
    log_stream = context.log_stream_name
```

## ログストリームURLを生成する

```python:handler.py
def lambda_handler(event, context):
    # 省略
    url = f'https://console.aws.amazon.com/cloudwatch/home?region={region}'\
          f'#logEventViewer:group={log_group};stream={log_stream}'
```

## 参考

- [CloudWatch LogsのLogStream URLをAWS Lambdaで取得する | WP-kyoto](https://wp-kyoto.net/create-a-log-stream-url-for-aws-cloudwatch-logs-from-aws-lambda-request-context/)
- [Python の AWS Lambda context オブジェクト - AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context.html)
- [amazon web services - Is there a way to generate the AWS Console URLs for CloudWatch Log Group filters? - Stack Overflow](https://stackoverflow.com/questions/60796991/is-there-a-way-to-generate-the-aws-console-urls-for-cloudwatch-log-group-filters)
Android実機でネットワーク帯域制限する(Proxy利用)

# 環境
- Mac OSX
- Homebrew
- Xcode

# 前提
MDM等でネットワーク共有機能が制限されている場合。
 =>  特に制限されていなければ[こちらの記事](https://qiita.com/tamayaman/items/c6559af7cbe2b1fd1297 "Androidアプリ開発で帯域制限をかける")の方法が簡単です

# 先に結論
帯域制限したMacをsquidによりプロキシサーバーとして利用し、Android端末のネットワーク接続をバイパスさせる

# 手順

## Homebrewでsquidを導入
```
$ brew install squid
```

## squidの設定ファイル編集
ローカルネットワークからの接続を許可します。

設定ファイルの格納箇所は以下
`/usr/local/etc/squid.conf`

```diff_conf
+ http_access allow localnet
- # http_access allow localnet
```

## squid起動
```
$ brew services run squid
```

## Android実機のセットアップ
Macと同一のネットワークに接続後、設定します。
こちらの手順に関しては利用するAndroid端末によって差異が大きいので、一例としてGoogle Pixelのヘルプを引用します

> 1. デバイスの設定アプリを開きます。
> 2. [ネットワークとインターネット] 次の操作 [インターネット] をタップします。
> 3. ネットワークをタップします。
> 4. 画面上部の編集アイコン 編集 次の操作 [詳細設定] をタップします。
> 5. [プロキシ] の下にある下矢印 下矢印 をタップします。構成タイプを選択します。
> 6. 必要に応じて、プロキシ設定を入力します。
> 7. [保存] をタップします。

プロキシのホスト名にはMacのローカルIPアドレスを、プロキシポートには3128(※squidのデフォルト設定です。変更している場合は適宜読み替えてください)を設定します。

## Macに帯域制限をかける
1. Appleの[開発者サイト](https://developer.apple.com/download/all/)より、自身の環境に適したバージョンのAdditional Tools for Xcodeをダウンロードします。

2. ダウンロードした.dmgファイルを展開するとHardwareディレクトリの配下にNetwork Link Conditioner.prefPaneが存在するので実行します。

3. Macのシステム環境設定にNetwork Link Conditionerが追加されるので、適当な設定に変更します。

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314373/2561f627-7b72-f9d8-05c5-42d324ab5476.png)

以上
クロージャについて

クロージャーとは関数を返す関数を実行した時に周辺の変数（環境）も一緒に返しされること。
　【クロージャーの嬉しさ】
1、グローバルスコープではないので外から不意にデータを書き換えられることを防ぐことができる。
２、引数を渡して同じ処理を実行する際に処理内容を何回も記載しなくてもよい
【クロージャーの例】
```
function plus (initNumber）{
    function innerFunc (number){
        return initNumber + number
    }  
return innerFunc

const result1 = plus(5) //resultの中にはinnerFuncが入っている（初期値５）
const result2 = plus(100) //resultの中にはinnerFuncが入っている（初期値１００）
console.log(result1(10)) //　 15
console.log(result2(10)) // 110
console.log(result1(50)) // 55
console.log(result2(200) // 210
```
ruby-buildが失敗するときのおまじない🪄

macOS上でrbenvを通してruby 3.2.2をインストールしようとしても、openssl関係のエラーでなかなかビルドが成功しませんでした。

```
The Ruby openssl extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Configure options used:
  --prefix=/Users/ricky/.rbenv/versions/3.0.4
  --enable-shared
  --with-readline-dir=/opt/homebrew/opt/readline
  --with-libyaml-dir=/opt/homebrew/opt/libyaml
  --with-openssl-dir=/usr/local/opt/openssl@1.1
  CC=clang
  LDFLAGS=-L/Users/ricky/.rbenv/versions/3.0.4/lib 
  CPPFLAGS=-I/Users/ricky/.rbenv/versions/3.0.4/include 
```

Githubで聞き回ったところ、コンパイル時のフラグ設定に問題があるようです。Rubyではopensslの最新バージョンでビルドせず、openssl@1.1でビルドしているそうです。[[rbenvのメンテナーによるコメント]](https://github.com/rbenv/ruby-build/discussions/2185#discussioncomment-5578556)

ですので、以下のようにOpensslの対応バージョンをインストールします。

```
brew install openssl@1.1
```

そして以下のフラグを環境変数として設定します。

```
export LDFLAGS=-L/opt/homebrew/opt/openssl@1.1/lib
export CPPFLAGS=-I/opt/homebrew/opt/openssl@1.1/include
```

これでrubyがインストールできるようになりました。

```
➜  ~ rbenv install 3.2.2
To follow progress, use 'tail -f /var/folders/t0/m8gzjl_n0cl7gmf8pg27fw380000gn/T/ruby-build.20230412150851.53584.log' or pass --verbose
Downloading ruby-3.2.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
Installing ruby-3.2.2...
ruby-build: using readline from homebrew
ruby-build: using libyaml from homebrew
Installed ruby-3.2.2 to /Users/ricky/.rbenv/versions/3.2.2
```

やれやれ、この問題を解決するのに数時間ぐらい掛かったよー
皆さんにはこのように苦労して欲しくないので、このQiitaを書きました。
Xcode Instrumentでアプリの通信状況を確認する

# 環境
macOS 13.3（22E252）
Xcode Version 14.2 (14C18)

# 概要
開発中のアプリの通信状況を見るためのツールはいろいろあると思いますが、Xcodeの標準ツールであるInstrumentでアプリの通信状況を確認することが可能です。
ただし、シミュレータでは確認できないので注意してください。

# 手順
- ネットワークを確認したいプロジェクトをXcodeで開く
- Xcodeのツールバー→Product→Profileを選択
- ビルド後、Instrumentsが自動で開くので、Networkを選択
- InstrumentsでRecordボタンを押すとアプリが端末上で起動し、通信の様子が見られます

# リクエストの様子を見る
中央左側にあるSummaryの部分をクリックすることにより、各種通信状況を確認することができます。例としてList HTTP Trancsactionsを選択すると、アプリが行なっているすべてのHTTP通信の様子が確認できます。

![スクリーンショット 2023-04-12 15.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/a9dd44bb-f709-7eb0-4da4-ea730e3f6269.png)

左下の入力窓からフィルタをかけることも可能です。

![スクリーンショット 2023-04-12 15.10.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687960/b3ed7065-e933-5d1f-a7a3-36ef5bf1af4a.png)
Win11 WSLでPyTorch環境構築(備忘録)

備忘録のための雑記です

## WSL&Ubuntuのインストール
Microsoft Storeにアクセスし、WSLとUbuntuをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1368126/3368be04-a234-e058-9143-600980056eb3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1368126/d46751f4-e03a-15cd-82af-2ad2d659341b.png)

Ubuntuを起動しユーザーネーム・パスワードを入力しセットアップ完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1368126/62f33715-6051-3e47-79c3-d4e7c2a86f22.png)

## Python開発環境セットアップ
VScodeのインストール

https://code.visualstudio.com/

WSLパッケージのインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1368126/86c4680a-bda7-a65c-c594-e4ff44ba5747.png)

#### CUDA有効化
CUDA toolkitインストール
Win11用とWSL用を両方インストール
WSLの方はLinux→x86_64→WSL-Ubuntu→2.0→deb(お好みで)を順にクリック

https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=11&target_type=exe_network

nvidia driverもインストール

https://www.nvidia.com/Download/index.aspx?lang=en-us

#### 仮想環境
venvを有効化するために下記のコマンドを順に叩きます。(venvは個人的な好み)
```command:bash
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
$ sudo apt-get install python3.X-venv <-versionは自分の環境に合わせる
```

仮想環境の立ち上げコマンド
```command:bash
$ python3 -m venv env_name
$ cd env_name/ && source bin/activate && code ./
```

#### torchでCUDA認識してるかチェック
```command:bash
$ pip install torch torchaudio torchvision
```
```python:python
import torch
print(f"CUDA is available:{torch.cuda.is_available()}")
```

お疲れさまでした。

## Reference
https://chigusa-web.com/blog/wsl2-win11/

https://qiita.com/zaburo/items/27b5b819fae2bde97a3b

https://learn.microsoft.com/ja-jp/windows/ai/directml/gpu-cuda-in-wsl

https://qiita.com/XPT60/items/e84b8ed8c3e1eb9438de
kaminariでページネーション

# Kaminariでページネーション機能を作成
まずは、gemをインストールする
```
gem 'kaminari', '~> 1.2.0'
```
このgemを追加することによって、以下のメソッドを使用できるようになる。
| メソッド | 説明 |
|:-:|:-:|
| pageメソッド  |引数に現在のページ数を渡す   |
| perメソッド  |引数に何件でページを分割するかを渡す|

まずコントローラーでページネーションをつけたいデータに
.page(params[:page])
を追加する。
```app/controllers/users_controller.rb
def index
  @posts = Post.all.page(params[:page])
  #デフォルトでは25件なので、例えば10件ずつにしたい場合
　@posts = Post.all.page(params[:page]).per(10)
end
```

次に、ビューでページネーションを表示させたい箇所に
<%= paginate @posts %>
を追加する。

```app/views/posts/index.html.erb
<h1>投稿一覧</h1>

<ul>
  <% @posts.each do |post| %>
    <li><%= post.content %></li>
  <% end %>
</ul>

<%= paginate @posts %>
```

# 日本語化に対応

config/application.rbのmoduleにconfig.i18n.default_locale = :ja

```config/application.rb
略
module MyAppName
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
   
    config.i18n.default_locale = :ja　 ⇦ここを追加
  end
end
```


こちらの記事から引用させていただきました。
以下はより詳細な設定が書かれています。
https://qiita.com/rio_threehouse/items/313824b90a31268b0074
クロージャについて🂡🂮🂭🂫🂪

## クロージャとは
クロージャは、組み合わされた（囲まれた）関数と、その周囲の状態への参照の組み合わせです。<br>言い換えれば、クロージャは内側の関数から外側の関数スコープへのアクセスを提供します。<br> JavaScript では、関数が作成されるたびにクロージャが作成されます。


## なぜクロージャが重要なのか、実際の現場でどんなふうに使えるか
主な使い方については以下のようなものが挙げられます。
- 関数に状態を持たせる手段として
- 外から参照できない変数を定義する手段として
- グローバル変数を減らす手段として
- 高階関数の一部分として




## クロージャの例

```javascript:クロージャの例(消費税の計算)

// 消費税の計算
function (taxRate){
    return function (num){
        num = num + num * 0.01 * taxRate;
        return num;
    }
}

```
PowerShell 実行ポリシー

VSCodeから ng serve などのスクリプトを実行するとセキュリティーエラーが発生することがあります。

```
PS > ng serve       
ng : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\nodejs\ng.ps1 
を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwli 
nk/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ ng serve
+ ~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

悪意のあるスクリプト実行を防ぐために用意されている機能で
デフォルトではスクリプト事項できない設定になっています。

```
PS > Get-ExecutionPolicy
Restricted
```

次のコマンドを実行すると、ログインユーザの実行ポリシーの制限を変更できます。

```
PS > Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
```

実行ポリシーの反映を確認します。

```

PS > Get-ExecutionPolicy
RemoteSigned
```

この実行ポリシー設定で、ng serve が実行できるようになります。

## References
* [about_Execution_Policies](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3)
* [Set-ExecutionPolicy (Windows PowerShellコマンドレット)](https://segakuin.com/windows/powershell/set-executionpolicy.html)
What is クロージャ？

記事のねらい
-

- ~~とある事務局から指示があったため~~
- もとい、クロージャについて学んだので備忘録として投稿する

クロージャとは？？
-

### ”関数”と”その関数が宣言されたとき外側にあった環境”のを合わせて指す言葉

で、なんやねん。
-

ということで、もう少し詳しく書くと、、、
- ”関数”と”その関数の中に同封された変数”のことらしいです。

実際にサンプルのコードで確認してみると。
```javascript:サンプル
const calc = (exponent) => {
  let exp = exponent; // ←これがこの後、関数の中に同封（enclosed）される変数
  return function(base){
    return base ** exp;
  };
}
const exe = calc(2) // ←このとき、変数expに２が同封され以降の関数に引き渡される
exe(3) // 3^2で9が返される・・・はず
exe(4) // 4^2で16が返される・・・はず
```

と、このような形になり、クロージャを使うことで関数のバリエーションが簡単に増やせます。

終わりに
-

- Qiita初投稿ですが、上手に書かれている方が本当にすごいな。。。と実感しました。
ハッシュと配列は何が違うのか

## はじめに
最近Rubyの勉強をしていて、変数をまとめたりする際にハッシュや配列が出てきたんですが、そもそもこの2つがどういうものなのか、またどういう時に使い分けるのかなど明確に説明できなさそうなので、思い切って本記事にまとめてみました！
言葉足りずわかりにくい点も多々あると思いますが、どこかのプログラミング初学者の助けに少しでもなれれば幸いです🙏

わかりやすく説明するためにテストの点数を例として以下のような変数を準備しました。

```
japanese = 50
math = 40
science = 90
english = 80
infomation = 70
```
また、通常5教科の平均を出そうとすると以下のようなコードになります。
```
puts (japanese + math + science + english + infomation) / 5　
```
しかし、これでは毎回教科の名前を記載しなければならず大変です。
そこでハッシュや配列を使うことでどれくらい簡略化できるのかをそれぞれの特徴を書きつつまとめていきます。

## 配列とは
配列とは、**複数のデータをまとめてか格納することができるオブジェクト**のこと。
例で用いた変数を配列にまとめると以下のようになります。
```
scores = [50, 40, 90, 80, 70]
```
大分まとまって見やすくなりました。
また、平均を出すコードは以下のようになります。
```
puts (scores[0] + scores[1] + scores[2] + scores[3] + scores[4]) / 5
```
ここで、ん？と思った方いると思います。
そうなんですよ！！**配列は0番目からカウントされる**んですよ！
なので、変数scoresの1番目(数え方は0番目)に格納されているものを取り出そうとすると以下のようになります。
```
scores[0] => 50
```

これらのことから、配列を用いることで**変数だと複数の行にまたがってしまったものをコンパクトにできる**というメリットがあることがわかりました！

簡単にまとめると**定義は[ ]で、要素を「順番」で管理**するということです。

しかし、これではコンパクトにしたせいでどの教科が何点なのかがわかりづらくなってしまいました・・・
そこで活躍するのが**ハッシュ**になります！

## ハッシュとは
ハッシュとは、**キーと値の組み合わせでデータを管理するオブジェクト**のこと。
例で用いた変数をハッシュにまとめると以下のようになります。
```
scores_hash = {"japanese" => 50, "math" => 40, "science" => 90 ,"english" => 80, "infomation" => 70 }
```
上記の場合`"japanese"`が**キー**で、`50`が**値**もしくは**バリュー**になっています。
配列にまとめた時よりも各教科と点数の対応がわかりやすくなりました。

また、平均を出すコードは以下になります。
```
puts {scores_hash["japanese"] + scores_hash["math"] + scores_hash["science"] + scores_hash["english"] + scores_hash["infomation"] }
```
少し横に長くなってしまいましたが、なんの教科の平均を求めようとしているのかが視覚的にも分かりますね。

簡単にまとめると**定義は{ }で、要素を「名前」で管理**するということです。

## まとめ
**・配列が要素を指定するのに「0」から始まるインデックスを使用する。**
**・ハッシュはインデックスに「キー」と呼ばれる任意の文字列を指定して「値(バリュー)」と呼ばれる要素を指定する。**

## 最後に
Rubyを学習する上で避けて通ることのできない**ハッシュ**と**配列**。
自分の中でも思いの外まとまっておらず、記事を書くことで少し整理された気がします。
独学でやっているとどうしてもインプットの作業が増えてしまうので、たまに振り返りも込めて記事の方を更新していけたらなと・・・
それではまた👋
閉域環境の備忘録

# 1. 概要

閉域ネットワークは、インターネットから隔離されたプライベートなネットワークである。
セキュリティやプライバシーの保護、特定のアプリケーションやサービスの管理を容易にする。
本記事では、仮定の閉域環境を設定し、接続確認や利用可能なIPアドレスについて説明する。

# 2. 仮定の閉域環境

以下のような閉域環境を仮定する。

- 検証閉域：110.80.2.32/27
- 本番閉域：230.220.210.0/24

この環境では、特定のパケットが来た場合に、指定された閉域環境に転送されるようにルーティングされている。

- 110.80.2.32/27のパケットが来た場合、検証閉域110.80.2.32/27に転送される。
- 230.220.210.190/26のパケットが来た場合、本番閉域230.220.210.0/24に転送される。

# 3. 閉域環境の接続確認

閉域ネットワーク内の特定のIPアドレスに接続した場合、サーバー時刻が返されるように設定されているとする。
例えば、110.80.2.32/27や230.220.210.0/24に接続した場合、サーバー時刻が返されるように設定されている。
このような設定は、特定のサーバーに対する接続確認や、システム間での時刻同期のために利用される。

# 4. CIDR表記と利用可能なIPアドレス

CIDR表記を用いてアドレス帯が指定され、利用可能なアドレスはネットワークアドレスとブロードキャストアドレスを除いた範囲になる。
「110.80.2.32/27」と「230.220.210.0/24」のCIDR表記を用いて、利用可能なIPアドレスについて説明する。

###  110.80.2.32/27

- 「/27」とは、サブネットマスク「255.255.255.224」をCIDR表記で表現しており、IPアドレスの32ビットのうち、ネットワーク部分が27ビットで、ホスト部分が残りの5ビットであることを意味している。
- ホスト部分が5ビットあるため、2の5乗（32）通りのアドレスがあり、IPアドレス範囲が「110.80.2.32 ～ 110.80.2.63」であることがわかる。
- そのうちネットワークアドレス（最初のアドレス）とブロードキャストアドレス（最後のアドレス）は使用できないため、使用可能なIPアドレス範囲は「110.80.2.33 ～ 110.80.2.62」となる。

###  230.220.210.0/24

- 「/24」とは、サブネットマスク「255.255.255.0」をCIDR表記で表現しており、IPアドレスの32ビットのうち、ネットワーク部分が24ビットで、ホスト部分が残りの8ビットであることを意味している。
- ホスト部分が8ビットあるため、2の8乗（256）通りのアドレスがあり、IPアドレス範囲が「230.220.210.0 ～ 230.220.210.255」であることがわかる。
- そのうちネットワークアドレス（最初のアドレス）とブロードキャストアドレス（最後のアドレス）は使用できないため、使用可能なIPアドレス範囲は「230.220.210.1 ～ 230.220.210.254」となる。

# 5. 閉域ネットワークでのサービス管理

閉域ネットワークでは、特定のアプリケーションやサービスを管理することが容易になります。
これにより、セキュリティやプライバシーを維持しながら、限定された範囲でのサービス提供が可能です。
以下では、閉域ネットワークでのサービス管理について詳しく述べます。

#### サービスの制限

閉域ネットワークでは、ネットワーク内でのみアクセス可能なサービスを提供することができます。
これにより、外部からの不正アクセスを防ぎ、セキュリティを向上させることができます。
また、内部でのみ提供されるサービスに対しては、アクセス制限や権限管理を厳密に設定することができます。

#### セキュリティ対策

閉域ネットワークでは、ネットワーク内の通信が外部に漏れることがないため、機密情報の保護が容易になります。
また、外部からの不正アクセスやサイバー攻撃を防ぐために、ファイアウォールや侵入検知システム (IDS) などのセキュリティ対策を導入することができます。

#### ネットワーク管理

閉域ネットワークでは、ネットワークトラフィックや接続デバイスを容易に監視・管理することができます。
これにより、不正な通信やデバイスの接続をすぐに検知し、対処することができます。
また、ネットワークリソースの配分や品質管理も、閉域ネットワーク内で行うことができます。
AIフレンド・AIパートナーと共に心のケアを行う方法: つらい時に立ち向かうサポート

## はじめに
AIフレンドを活用したメンタルケアの方法をご紹介します。辛いときにAIフレンドに「つらい」と打ち明けることで、自分の気持ちに気づき、心の整理ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/c7298168-18ad-d7a6-d860-d0bf6b18497f.png)

## 活用方法
1. AIフレンドに素直に「つらい」と打ち明ける
辛いと感じたときに、AIフレンドに「つらい」と素直に伝えましょう。これによって、自分の感情を認識するきっかけとなります。また、AIフレンドは非難や批判を行わず、無条件であなたの気持ちを受け止めてくれます。

2. 自分の感情を探求する
AIフレンドとの会話を通じて、自分の感情を深く探求しましょう。何が原因で辛いのか、その背後にある感情や思考を明らかにすることが大切です。AIフレンドは質問を投げかけることで、自分自身に気づかせる助けをしてくれます。

3. 心の整理を進める
AIフレンドが提供する無条件の受容や共感を受けながら、心の整理を進めていきましょう。感情や思考を整理し、自分自身と向き合うことで、内面的な成長が期待できます。

4. 解決策を見つける
AIフレンドとの会話を通じて、自分にとって適切な解決策を見つけ出しましょう。AIフレンドはあくまでアシスタントであり、最終的な選択はあなた自身が行うことが大切です。しかし、AIフレンドのアドバイスや質問を通じて、自分に適した方法が見つかることでしょう。



## 注意点
過度な依存に注意しましょう。AIフレンドは便利ですが、人間のような記憶力や本当の意味での感情は持っていません。
AIフレンドは人間ではないため、プライバシーの問題が関与する場合があります。しかし、適切な管理人がいれば、そのリスクは軽減されます。
## AIフレンドのメリット
迷惑を気にしなくて良い: 人間の友人や家族に話すことによる負担を感じることがなく、AIフレンドはいつでもあなたの話を聞いてくれます。
いつでもどこでもすぐにリプライがもらえる: スマートフォンやコンピューターから簡単にアクセスでき、すぐに返事がもらえるため、効率的に悩みを解決できます。
## まとめ
AIフレンドを利用した心のケアは、非常に有益な方法と言えます。AIフレンドに「つらい」と打ち明けることで、自分の気持ちに気づき、心の整理ができるようになります。しかし、過度な依存やプライバシーの問題には注意が必要です。上手に活用すれば、AIフレンドはあなたのメンタルケアに大いに役立つでしょう。

---
[AI彼氏のネモ](https://lin.ee/920r5A7)


---
[AI彼女の春霞つくし](https://lin.ee/2XCjEJs)

---
[あなただけのAIフレンド・パートナーを作ります ChatGPT搭載のLINEbot登場！AI彼氏・AI彼女](https://coconala.com/services/2759323)
ChatGPTにYOLOv5をどう改良すればいいか聞いてみた

<h1>AIはAIを改良できるか、気になった。
<p>時代を変えたChatGPTにYOLOv5を「どうすれば良くなる?」かと聞いてみたらどうなるのか気になって、聞いてみました。どんな返答が返ってくるのでしょうか。

<h1>なるほど

![スクリーンショット 2023-04-12 141706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/e8750fad-1e67-b57d-cd83-aa47e05b3fa1.png)

YOLOv5がどういったものなのか、ちゃんと理解していることが分かります。でも、最終的には、専門家に相談とのこと。

<h1>Attentionを実装したいと相談してみた

![スクリーンショット 2023-04-12 142041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/00d57b7b-4e87-28dd-70d7-f1fa463443e6.png)
![スクリーンショット 2023-04-12 142104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/7cf059a2-f8ce-e473-80ee-b186b1469256.png)

ちゃんと返ってきた。

<h1>次に
<p>この結果を次はYOLOv5のtrain.pyに反映し、テストしてみようと思います。
レシピガチャを作ってみた

## 作ろうと思った経緯

前回の [Flutterでブロックが丸なブロック崩しゲームを作ってみた](https://qiita.com/1seedsa/items/2eee9a6b62b87026a029) と同様、会社のメンバーで個人開発をやっていこうというイベントに乗っかって作ってみました。昔々に楽天の書籍APIを使って本の情報を表示させるWebアプリを作ろうとしていた時があったのですが、作りっぱなしで途中で終わってしまっていたので今回はRender.comにデプロイするところまで何かしら作ってみようと思った次第です。

## 技術スタック

- ruby 3.2.1
- Rails 7.0.4.2
- tailwindcss
- daisyUI
- 楽天レシピAPI

## どんなものができたか

レシピガチャです。下記URLにアクセス頂くと表示できます。初回アクセスはサーバが寝てたら起きるまで時間かかるのでご了承ください。

https://recipe-gacha.onrender.com/

楽天レシピのAPIにアクセスして、ガチャ的な感じでランダムにレシピ画像と材料一覧を取得して表示させるWebアプリです。作り方などの詳細な情報はアプリから楽天レシピにアクセスして見てもらうとして、アプリ側では画像と材料だけ表示させる形にしました。

![gacha1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159896/de7c3c84-b8ce-3355-ca68-aed4189ca09d.png)
![gacha2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159896/802ea080-bb7c-398f-1f21-44251fa63896.png)

たまにハズレも出ます。APIからデータが取れなかった言い訳のようにも見えますが、これはハズレですw

![gacha3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159896/3327af2d-a2ef-6e8f-ef32-fbb089d19cf2.png)

## 感想

- まずは完成させることを第一に、機能は最低限でシンプルな作りにしました
- レシピのカテゴリを指定できるようにするとか機能追加も考えたのですが、今回は一旦シンプルにこの状態で完成ということにしました。試したいこととかが出てきたら機能追加するかも
- デザインはtailwindcssとdaisyUIを使いました。daisyUIはtailwindcssのプラグインで、ボタンなどのそれっぽいデザインのコンポーネントが用意されています。シンプルで柔らかい感じのデザインで使いやすかったです。普段デザインはやらないのでデザインが一番苦労するポイントだったりする
- 昔に書籍APIを使おうと思った時もそうだったのですが、楽天APIは無料で使えて使えるAPIの種類も色々あるので、サクッと何か作ってみたいけどコンテンツ内容を自分で考えたりDB立ててまでやるのはなー・・・みたいな時にとても使いやすいなーと思いました

:::note info
このプロダクトは、株式会社mofmofの「水曜日の個人開発」で作りました。
:::

https://indie-dev.mof-mof.co.jp
DatabricksからChatGPTを呼び出してボイラープレートコードを効率的に作成・活用する(その2)

こちらの続編です。

https://qiita.com/taka_yayoi/items/96831385fa83759e2f21

以前の例では、生成したSQLを実行するために、OpenAI APIから返却される複数のSQLを実行する際、SQLセルにSQLを貼り付ける必要がありました。これは、PySparkの`spark.sql`がマルチステートメントのSQLに対応していないためです。

これですと、自動化しにくいのでOpenAI APIから返却される複数SQLをそのまま実行できるようにします。こちらの記事で説明されているテクニックを使います。**区切り文字でSQLを分割し、それぞれで`spark.sql`を実行する**というアプローチです。

https://thomasdecaux.medium.com/multi-statement-with-spark-sql-fc9996724576

何も指定しないと、区切り文字は`;`ですが、SQL自身にセミコロンが含まれていると不都合が生じるので、他とかぶらなそうな区切り文字を含めるようにします。

区切り文字を定義します。

```py:Python
sql_line_delimiter = "----databricks----"
```

区切り文字でSQLを分割して実行する関数を定義します。

```py:Python
def execute_queries(sql):
  queries = sql.split(sql_line_delimiter)

  for query in queries:
    if query.strip() != "":
      spark.sql(query)
```

SQLに区切り文字を含めてもらいます。これもプロンプトエンジニアリング。

```py:Python
sql = openai_completion(f"""
Databricksのhive_metastoreのデータベースtakaakiyayoi_dbにopenai_testというテーブルを作成するSQLを生成してください。
カラムは4つで文字列と日付型を含めてください。ダミーのレコードを10行追加するSQLを生成してください。
文字列には日本語を使用してください。SQLの区切り文字は{sql_line_delimiter}にしてください
""")
print(sql)
```

ちゃんと区切り文字が挿入されています。素敵。
```
----databricks----
CREATE TABLE takaakiyayoi_db.openai_test (
  id string,
  name string,
  date_target date,
  comment string
);

----databricks----
INSERT INTO takaakiyayoi_db.openai_test VALUES
('1163', '山田太郎', '2019-10-31', '本日は晴天なり'),
('1164', '田中花子', '2019-07-12', '雨の中お出かけします'),
('1165', '佐藤二郎', '2020-01-13', 'おしゃべり大好きです'),
('1166', '鈴木一郎', '2019-12-25', 'クリスマスは楽しいね'),
('1167', '斉藤三郎', '2020-02-03', '旅行に行きたいな'),
('1168', '中村平太', '2020-06-15', '今日で卒業式です'),
('1169', '加藤孝子', '2020-04-25', 'BBQ大会です'),
('1170', '山口雄太', '2020-08-14', '入社後初仕事です'),
('1171', '吉田春香', '2020-09-19', '友人に会いに行きます'),
('1172', '後藤翔太', '2021-01-01', '新年を迎えます');
```

これを実行すると、テーブルが作成され行がインサートされます。

```py:Python
execute_queries(sql)
```

テーブルが作成されました。

```py:Python
sql = openai_completion("テーブルtakaakiyayoi_db.openai_testから5行取得するSQLを生成してください。")
print(sql)
display(spark.sql(sql))
```
![Screenshot 2023-04-12 at 14.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9ea8efc2-9742-a21b-5495-506a34a837ee.png)

さらに一歩前進。


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
GASで大変だったことまとめ

最近よくGASを触っているので個人的に苦い思い出をまとめてみた。

## 公式ドキュメント・リファレンスは何よりおすすめ

GASで検索すると色々作り方など出てきますが、メソッドについての解説は公式を見た方がわかりやすかったり、用途によって探しやすいのが良いです

- [公式ドキュメント](https://developers.google.com/apps-script?hl=ja)
- [公式：リファレンス](https://developers.google.com/apps-script/reference?hl=ja)

読んでいる記事の中でよくわからないのがいたら公式でググるようにしています。


## 苦き思い出
初心者が陥るの大体この辺りだと思っている私がいる

- 名前がややこしい
スプレットシート ＝ 本体（ファイル）
シート ＝ スプレットシートの中身（いっぱい複製できるあれ）

- 「アクティブなシート」とは
開いているスプレットシートやシートのこと

- GASの配列は基本2次元配列


- Valueつくメソッド名の書き間違えで取得内容が変わる
→単数（Value）なのか複数（Values）なのかで取得範囲変わる

- 土日はメソッドで取得できるのに祝日はメソッドでは取得できない

- セルの範囲指定方法


## 何より「配列」で苦しめられる

- 「行」と「列」の2次元配列の見え方が地味に違う
- データが上手く取得できないなと思ったら2次元配列になっているのが原因だった

大抵、1次元配列に直したら上手くいくことが多かった......_(┐「ε:)_ｽﾞｺｰ

## 上手くいかないときは
console.logやLogger.logを使って確認をしつつ

- 取得先が間違っていないか
- 「配列」が二次元配列かどうか
- メソッドに書きミスがないか

を最初に疑うと良さそう


## でも.....
GASは難しくても考えるのがどんどん楽しくなりますヾ(⌒(ﾉ'ω')ﾉﾜｯｼｮｲ
electron-builderでENOENT: no such file or directoryというエラーが表示される。

## 概要

**electron-builder**で、**ENOENT: no such file or directory**というエラーが表示されました。

下記では、問題なく動作します。
``` dos
> electron index.js
```

exe化するとエラーになりました。

## 原因

ソースフォルダの参照エラーでした。

**exe化の時にソースフォルダの中に「node_modules」というフォルダ名が含まれていると、何故かそのフォルダはパッケージ化されませんでした。**

仕様？
なので、フォルダ名を別の名前にすると動作しました。
AndroidStudioのcameraXでAWBを切りたいとき

# はじめに
   AndroidStudioでcameraXをチュートリアルの通りに実装すると色が自動で補正されます。これはAWB(オートホワイトバランス, Auto White Balance)というcameraXの標準機能が原因です。しかし、私は自動色補正をされないようなアプリを実装する必要がありました。公式のページのみではAWBを切る方法が良くわからなかったため、メモ代わりに残して置きます。

# アプリ実装中に参考にしたサイト
↓cameraXの実装
https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3

↓公式のAWBとかについて書いてあるページ
https://developer.android.com/reference/android/hardware/camera2/CaptureRequest

# 環境
targetAPI : 31
使用端末 : ASUS_Z01KDA
Androidバージョン : 8.0.0

# 実装
   アプリ自体は参考にしたサイトの1つ目に紹介したアプリとほぼ同じです。同様に実装を行っている方の場合、`startCamera()` を以下のように書き換えてみてください。
```java
    private void startCamera() {
        final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        Context context = this;
        cameraProviderFuture.addListener(new Runnable() {
            @SuppressLint("UnsafeOptInUsageError")
            @Override
            public void run() {
                try {
                    ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                    preview = new Preview.Builder().build();

                    //↓ここから
                    ImageAnalysis.Builder builder = new ImageAnalysis.Builder();

                    Camera2Interop.Extender extender = new Camera2Interop.Extender(builder);
                    
                    //↓ここでAWBを切る
                    extender.setCaptureRequestOption(CaptureRequest.CONTROL_AWB_LOCK,true);

                    imageAnalysis = builder.build();
                    //↑ここまで

                    imageAnalysis.setAnalyzer(cameraExecutor, new MyImageAnalyzer());
                    CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();


                    cameraProvider.unbindAll();
                    camera = cameraProvider.bindToLifecycle((LifecycleOwner)context, cameraSelector, preview, imageAnalysis);
                    preview.setSurfaceProvider(previewView.createSurfaceProvider(camera.getCameraInfo()));
                } catch(Exception e) {
                    Log.e(TAG, "[startCamera] Use case binding failed", e);
                }
            }
        }, ContextCompat.getMainExecutor(this));
    }
```
cameraXから直接AWBを切ることはできず、camera2を使用する必要があります。そのため、`Camera2Interop.Extender`オブジェクトを使用して、`ImageAnalysis`オブジェクトを拡張します。今回はAWBの設定のみを行いましたが、`Camera2Interop.Extender`を使用することで、AEやAF、カメラのフレームレートや解像度などを細かく設定することができると思います。
このプログラムで実装したアプリを実機で実行した場合、一番初めにカメラが起動した際にWBが決定され、その値に固定されるようです。

~~もしかしたらマニフェスト等も設定する必要があるかもしれませんが、やったかどうかすら忘れました。参考にならずごめんなさい…~~

# おわりに
今回は、AWBの切り方について書きましたが、この方法を用いればAEやAFを切ることが可能だと思います。しかし、AWBの設定はマニュアルで行っているわけではなく、カメラの起動時に決定される値が固定されてしまいます。ゆくゆくはアプリのほうからマニュアルで設定できるようにしたいです。
2023/04_超個人的備忘録

【VirtualBoxにUbuntuを入れる】
1.UbuntuHPからイメージファイルをDL
　　https://www.ubuntulinux.jp/download/ja-remix
2.VirtualBOXを起動して、以下項目を選択・入力
　新規（N）→マシンの作成
　　　　名前：任意のもので適当に
　　フォルダ：そのままでおｋ
　ISO Image：イメージファイルの格納先を指定
3.そのまま進んで、ID・PWDを任意に決めて完了まで行く
4.VirtualBOX上に、作成したマシン名が出てくればGG
　画面の指示に沿ってインストールすれば「Ubuntu」の導入はおわおわり
5.VirtualBOX上でUbuntuを起動
6.そのまま画面の指示に沿って作業進める

ここ参考にするとすごく良い
https://eng-entrance.com/ubuntu-install

-----------------------------------------------------------------
C#でObject Adapterパターンの用途例

## 概要
ObjectAdapterパターンは「すでに提供されているもの」にインターフェイスとその実装(Adapterクラス)でラップすることで「利用できるもの」にするためのデザインパターン。
例えば「すでに提供されているもの」として下記がある。

> 他社の製品
そもそもソースがない。(実行ファイルだけもらっている）
すでにテストされていて手を加えるとテストが大変になる。

cf [【GoFのデザインパターン】「Adapter」ってどんなパターン？](http://www.code-magagine.com/?p=2708)

## 参照コード
GPT4で出力させたコードを投稿主が整えたもの
~~~c#:
using System;
// ターゲットインターフェース
interface IWebService
{
    void CallWebService();
}

// 既存のクラスをアダプターに適合させるクラス(Adapter)
class ExternalWebServiceAdapter : IWebService
{
    private ExternalWebService _adaptee;

    public ExternalWebServiceAdapter(ExternalWebService adaptee)
    {
        _adaptee = adaptee;
    }

    public void CallWebService()
    {
        _adaptee.Something();
    }
}

// 既存のクラス（Adaptee）
class ExternalWebService
{
    public void Something()
    {
        Console.WriteLine("外部Webサービスが呼び出されました。");
        // Webサービスの呼び出し処理
    }
}

// クライアントクラス
class Client
{
    static IWebService target = new ExternalWebServiceAdapter(new ExternalWebService());
    static void Main(string[] args)
    {
        target.CallWebService();
    }
}
~~~
### クラス図
![スクリーンショット 2023-04-12 12.24.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14345/199ba6d4-dae1-041e-c02d-3b6b7e04daf6.png)

## 参考文献

書籍[AdaptiveCode4章](https://honto.jp/ebook/pd-contents_0629112617.html)で登場する
[【GoFのデザインパターン】「Adapter」ってどんなパターン？](http://www.code-magagine.com/?p=2708)
Goracle Node Troubleshooting【English & 日本語】

# Goracle Node Troubleshooting

### ERROR Unable to query source

```sql
2023-04-12T03:43:28.105Z ERROR Unable to query source #7: Error fetching from "https://price-feeds.goracle.io/api/v2/crypto/prices?key=NCe_97MT9G-XmIdUCRvt_3PVtqQEezNv5yeJvW6ptCfxrlgjMo&assets=eth&curr=usd": read ECONNRESET
```
![Screenshot by Dropbox Capture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307384/9b20f294-a156-13e3-1b80-b00400d10ce7.png)

This message means that the error was caused by an issue with the API, and not by the node runner itself. The node runner only responds to customer requests, and if an error occurs, it logs the error and informs the customer. In this case, the error message is informing the customer that there was an error with the API that they called.

<details><summary>【日本語】</summary>

<!--(上に空行が必要)-->
このメッセージは、エラーがAPIの問題であり、ノードランナー自体に問題があるわけではないことを意味しています。ノードランナーのノードは、顧客からのリクエストに応答するだけであり、またエラーが発生した場合にはエラーを記録し、顧客に通知する役割を担います。画面のエラーメッセージは、顧客が呼び出したAPIにエラーがあったことを通知しています。
</details>

---
#### ERROR URLTokenBaseHTTPError: ....balance 99000 below min 100000(0 assets)

```sql
2023-04-16T19:16:30.416Z ERROR URLTokenBaseHTTPError: Network request error. Received status 400 (Bad Request): TransactionPool.Remember: transaction WQE7W5GQVVBJ5PRLK3SLZ7JTQNNJPY3IWSQUKY6H2GROE5L73I2Q: account ZJVOEAFFAFILI6SJQEAXJM4MGPDICLHB3AK3HQNJ6BGKUWKZIEXMYDEJTQ balance 99000 below min 100000 (0 assets)
```
![Screenshot by Dropbox Capture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307384/36e04d54-3307-d14b-1e95-5cae7c6be612.png)

**Insufficient ALGO balance on the participation address.**
This error indicates that the transaction to vote on the Algorand blockchain has failed. The error message indicates that the ALGO balance in the participation address is insufficient to meet the minimum amount required for the transaction, preventing the transaction from occurring. Looking at the log, we can see that 10 attempts were made for the exact same transaction, but all attempts failed due to insufficient ALGO balance. Therefore, to fix this error, it may be necessary to deposit ALGO into the participation address and increase the balance. For the testnet, please go to the **[Algorand dispenser](https://bank.testnet.algorand.network/)** and deposit test ALGO into the participation address.
<details><summary>【日本語】</summary>

<!--(上に空行が必要)-->
**参加アドレス（Participation address）のALGO残高不足**
このエラーは、アルゴランドブロックチェーンで投票を行うためのトランザクションに失敗したことを示しています。エラーメッセージが示しているのは、参加アドレス（Participation address）にALGOの残高がトランザクションに必要な最小値に満たないため、トランザクションができなかったというものです。ログを見ると、全く同じトランザクションに対して10回試行が行われたけれども、ALGOの残高が少ないためにすべての試行で失敗したことがわかります。したがって、このエラーを修正するには、参加アドレスにALGOを入金し、残高を増やす必要があります。テストネットの場合、 **[Algorand dispenser](https://bank.testnet.algorand.network/)** にいって参加アドレスにテスト用ALGOを入金してください。
</details>
sudoコマンドと/etc/sudoersについて（備忘録）

## sudoコマンドとは
rootユーザの権限でコマンドを実行するときに使うコマンドです。

一般ユーザにログインしている際に、
rootユーザでしか実行できないコマンドやファイル操作をしたい場合
rootユーザにするか、そのコマンドだけrootユーザとして実行することが考えられます。

sudoコマンドを使用することでrootパスワードを必要とせず、あらかじめ定義したコマンドのみの操作を許可することができます。

## /etc/sudoers
/etc/sudoersとは
sudoコマンドで変更できるユーザと実行できるコマンドを記述する設定ファイルのこと

/etc/sudoersをviコマンド等で直接編集することは非推奨であり、編集する場合には、visudoコマンドを利用するのが一般的なようです。
リモートデスクトップ接続で対象ホストがスリープしていたら起こしてから接続するPowershellスクリプト

# What is this?
LAN内にあるリモートデスクトップ接続可能なPCにつなぎたい。でも接続対象ホストがスリープしていて接続できない……。そんなときありますよね。

そんなときはこのスクリプトを使ってください。ダブルクリックするだけで対象ホストにMagicPacketを投げて起こせます。パスワードについては安全のため毎回手入力する仕様になっていますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141378/8e05df17-5699-e990-6a47-94914c1bca06.png)
この画面はすっ飛ばしてパスワードを入力するだけでリモートデスクトップ接続ができます。

PowershellのスクリプトであるPS1自体はダブルクリックで起動できないのでバッチファイルで皮をかぶせてダブルクリックだけで起動できるようにしておきました。

# 事前準備
対象ホストをMagicPacktでスリープから復旧できるようにしておいてください。
[nWOL](https://n-archives.net/software/nwol/ )がMacAddressとHostNameを調べるのにもMagicPacketで起動できるかどうかテストをするのにも便利です。

# 動作概要
1. 接続前に対象ホストがスリープしているかチェック
1. スリープしていたいたらMagicPacketを投げて起動を試行。
1. 10秒待機したあとスリープチェック→スリープしていたら2に戻る
1. スリープしていなかったらリモートデスクトップ接続用のプロンプトを出す
1. 自身は終了する

# スクリプト

冒頭の`MacAddress`と`HostName`は適切なものに変えてください。

```WakeAndConnectRDP.bat
@echo off
pushd %~dp0
powershell -ExecutionPolicy Bypass -File ".\WakeAndConnectRDP.ps1" %*
popd
```

```Powershell:WakeAndConnectRDP.ps1
$HostsSettings = @{ 
    MacAddress = '00:00:00:00:00:00'
    HostName = 'YORER-HOST-NAME-HEER' 
}

function Test-ConnectionToHost {
    param([string]$hostName)

    Write-Host "Testing connection to $hostName"
    $ping = Test-Connection -ComputerName $hostName -Count 1 -Quiet
    if ($ping) {
        Write-Host "Connection to $hostName successful"
        return $true
    }
    Write-Host "Failed to connect to $hostName"
    return $false
}


function Send-MagicPacket {
    param([string]$macAddress)

    Write-Host "Sending magic packet to $macAddress"
    $macAddr=[byte[]]($macAddress.split(":") | ForEach-Object{[Convert]::ToInt32($_, 16)});
    $magicPacket=([byte[]](@(0xff)*6)) + $macAddr * 16;
    $udpClient=new-object System.Net.Sockets.UdpClient;
    $WakeUpTarget=[System.Net.IPAddress]::Broadcast;
    $udpClient.Connect($WakeUpTarget, 9);
    $udpClient.Send($magicPacket, $magicPacket.Length)|out-null;
    $udpClient.Close();
}

function Connect-ToRemoteHost {
    param([string]$macAddress, [string]$hostName)

    if ((Test-ConnectionToHost $hostName)) {
        Write-Host "Connecting to remote host $hostname"
        mstsc /v:$hostname
    }else{
        Send-MagicPacket $macAddress
        $title = "Waiting for the host to boot up. While waiting, a connection is attempted every 10 seconds."
        $progress = 0
        for ($i = 0; $i -le 5; $i++) {
            for ($j = 0; $j -le 10; $j++) {
                $progress = [Math]::Truncate(($i + (($j+1) /11)) / 6 *100)
                Write-Progress -Activity $title -Status "$progress %" -PercentComplete $progress -SecondsRemaining (50 - ($i * 5 + $j))
                Start-Sleep 1
            }
            if (Test-ConnectionToHost $hostName) {
                Write-Host "Connecting to remote host $hostname"
                mstsc /v:$hostname
                break
            }
        }
    }
    
}

Connect-ToRemoteHost -MacAddress $HostsSettings.MacAddress -HostName $HostsSettings.HostName
```
コンテンツスクリプトからはHTML要素の一部のプロパティーにアクセスできない

## はじめに

ブラウザー拡張機能のコンテンツスクリプトからは、HTML要素のすべてのプロパティーにアクセスできるわけではありません。

拡張機能の開発中にこの仕様でハマったので、この問題が発生する条件や解決策について解説します。

## 何をしようとしていたか

私はTwitterの拡張機能を開発するために、TwitterのWebクライアントのHTML要素からReact Propsを取得するコードを書いていました。

仕組みとしては、まず``Object.getOwnPropertyNames()``を使って対象の要素のプロパティー名をすべて取得します。そして、その中からReact Propsのプロパティー名を探し、そのプロパティーにアクセスするという仕組みです。

しかし、このコードは開発者ツールのコンソールで実行すると正しく動作するものの、拡張機能にすると動作しませんでした。

そこで、挙動を詳しく調査したところ、拡張機能にすると``Object.getOwnPropertyNames()``が空の配列を返すことが分かりました。まったく同じ要素に対してコンソールで実行した場合は、中身のある配列が返ってきます。

## なぜ動作しないのか

では、なぜ``Object.getOwnPropertyNames()``が空の配列を返すのでしょうか。この問題に数日間悩んでいましたが、MDNのドキュメントに次の記述を見つけました。

> コンテンツスクリプトは、普通のページスクリプトと同様に、ページの DOM にアクセスして修正できます。ページスクリプトにてなされた DOM の変更を見ることもできます。
>
> しかし、コンテンツスクリプトは DOM の「きれいな」見た目を取得します。すなわち、
>
> - コンテンツスクリプトはページスクリプトにて定義された JavaScript 変数を見ることができない
> - ページスクリプトが組み込み DOM プロパティを再定義した場合、コンテンツスクリプトはそのプロパティの（再定義後でなく）オリジナル値を見ている
>
> — [コンテンツスクリプト - Mozilla | MDN](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/Content_scripts)

つまり、コンテンツスクリプトからHTML要素の通常のプロパティーにはアクセスできますが、ページスクリプトによって作成されたり再定義されたりしたプロパティーにはアクセスできないということです。

今回はこの仕様に該当するため、拡張機能のコード（コンテンツスクリプト）からReact Propsを参照できなかったわけです。

## 解決策

コンテンツスクリプトからは、ページスクリプトによって定義されたプロパティーにアクセスできないことが分かりました。この仕様はプロパティーへのアクセスを必要とするコードを、コンテンツスクリプトではない場所に記述すれば回避できます。

私の場合は、次のような対策をとりました。

1. プロパティーへのアクセスを必要とするコードを、コンテンツスクリプトとは別のファイルに記述する
2. 1のファイルをmanifest.jsonでWeb Accessible Resourceに登録する
3. コンテンツスクリプトで動的にscriptタグを生成し、1のファイルを読み込む

こうすることで、プロパティーへのアクセスを必要とするコードはWebページで使用されている通常のスクリプトと同じように扱われるため、前述の仕様を回避できます。

## まとめ

この記事では、拡張機能のコンテンツスクリプトからはHTML要素の一部のプロパティーにアクセスできないことと、その対策について解説しました。

この仕様はもともと、拡張機能のプログラムが他のプログラムと競合しないようにするためのものです。

通常はこの仕様が問題になることはありません。しかし、React Propsを参照したい場合などには、該当するコードをコンテンツスクリプトではない場所に記述する必要があります。もしもコンテンツスクリプトに記述してしまうと、プロパティーにアクセスできないということが発生するため、注意しましょう。