OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでGCSを使ってみた

## やること
ベーシック認証を通してrequestsでデータ取得をし、CSVの形でGCSに格納する

## 前提
以前作成した下記記事の環境からスタート

https://qiita.com/sh19982580/items/11a918da6d1a03ddf265

## GCSコンソール

GCSのコンソール上で「バケットを作成」
※今回は名前が`test`
その下の階層に「フォルダを作成」
※こちらも名前が`test`

## コード
まずは、ローカルでCSVファイルを確認
requirements.txt

    requests
    google-cloud-storage

上記2つを追加、`pip install -r requirements.txt`

CSVファイルを格納しておく`download`フォルダを作成しておく

app.py

    import os
    from flask import Flask
    import requests
    from requests.auth import HTTPBasicAuth
    from google.cloud import storage

    ID = "ooooooooo"
    PASS = "xxxxxxxx"

    app = Flask(__name__)

    @app.route("/")
    def test():
        
        # データ取得
        response = requests.get(
        "URL",  
        auth=HTTPBasicAuth(ID, PASS)
        )
        
        # csvの形になっているか確認
        with open("downloadフォルダ「パスのコピー」/test.csv", mode='w') as f:
            f.write(response.text)

        return "ok"

    if __name__ == "__main__":
        app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

- ターミナル1で`python3 app.py`
- ターミナル2で`curl http://localhost:8080`
先ほど作成した`download`フォルダに`test.csv`として格納されていればOK！

## GCSに格納
確認用の`# csvの形になっているか確認`の部分は削除して、そこに下記を記入する

    # Google Cloud StorageにCSVとして格納
    client = storage.Client()
    bucket = client.get_bucket("test")
    blob = bucket.blob(f'test/test20220606.csv')
    blob.upload_from_string(
        response.text,
        content_type='text/csv')

- ターミナル1で`python3 app.py`
- ターミナル2で`curl http://localhost:8080`
GCSのコンソールで確認！
バケット:`test`フォルダ名:`test`ファイル名:`test20220606.csv`
のように入っていればOK！
※念の為にダウンロードしてみると○

## 最後に
今回、初めてGCSを使ったので備忘録としても作成しました。
Cloud Schedulerと連動させると一定の時間に実行してくれるので便利です！
もし、Cloud Schedulerからデータを送る場合はPOSTにするので下記のように変更するだけで良いです。

    @app.route("/",  methods=['POST'])

## 参考文献

https://xxbxxqxx.com/post/172/

https://note.nkmk.me/python-file-io-open-with/

https://qiita.com/ao-show/items/89975420080f576f43eb

https://yyuuiikk.org/entry/718
【統計基礎】なぜ最小"二乗"法か？

# はじめに
統計や機械学習の入門書では必ずといって良いほど登場する「単回帰分析」。
これは説明変数$x$と目的変数$y$の間の関係を$$ y = ax + b $$と推定するものだが、このような関係式を求めるために「最小二乗法」を使うのが普通だ。

しかしながら、なぜ最小"二乗"法なのかを説明している教科書は少ないと思う。
誤差を最小化したいのであれば、「最小絶対値法」でも「最小四乗法」とかでも良いのではないか？

本記事では、よく知られた「最小二乗法」がなぜ標準たり得るのかを解説する。

想定読者としては、
- 統計・機械学習の勉強を始めたばかりの人
- 一通り入門書を読み終わった程度の人
- 回帰を使ったデータ分析は行っているが、背後にある理論には自信がない人

あたりを考えている。

数式がメインの説明になり、本記事を全部理解しようとすると大学1～2年程度の数学は必要になるが、大事なのは「__よく使われている最小二乗法にはちゃんとした理論的基盤が存在する__」ということであり、数式は追える人だけ追えばよいと思う。

# 最小二乗法のおさらい
先述の通り、単回帰分析とは説明変数と目的変数の関係を $y=ax+b$ という関係式で推定するものである。
$$ (x_1, y_1), ~(x_2, y_2), ~\cdots, ~(x_n, y_n) $$というデータが得られているとすると、単回帰分析による $y_i$ の予測値 $\hat{y}_i$ は $$ \hat{y}_i = ax_i + b $$ であるので、誤差 $e_i$ は$$ e_i = y_i - \hat{y}_i = y_i - ax_i - b $$となる。

よって最小二乗法は、$$ \sum_{i=1}^n e_i^2 = \sum_{i=1}^n (y_i - ax_i - b)^2 $$を最小化するように $a$ と $b$ を決定する。

と、ここで、疑問がひとつ。

__全体の誤差を最小化したいのであれば、二乗である必然性はないのではないか？__

誤差は負になり得るので、$e_i$ の単純な和をとるのは流石に不適だとしても、

最小絶対値法
$$ {\rm minimize} ~\sum_{i=1}^n |y_i - ax_i - b| $$
や、
最小四乗法
$$  {\rm minimize} ~\sum_{i=1}^n (y_i - ax_i - b)^4 $$
でも特に問題ないのではないか。

# 最尤法
さっそく答えを書くと、キーワードは「最尤法」である。
最尤法とは、おおざっぱに言うと「__与えられたデータが（ある仮定のもとで）一番それっぽく見えるパラメータを選ぶ__」方法である。
ググればいくらでも解説は出てくるので、最尤法自体の説明は割愛するが、最小二乗法とは「誤差を正規分布と仮定した最尤法」なのである。

## 最尤法からの最小二乗法の導出
単回帰モデルにおいて、誤差 $e_i$ が互いに独立に平均0、標準偏差 $\sigma$ の正規分布に従うと仮定すると、誤差 $e_i$ の確率密度関数は
$$ PDF(e_i) = \frac{1}{\sqrt{2\pi}\sigma} {\rm exp} \left(-\frac{e_i^2}{2\sigma^2}\right) = \frac{1}{\sqrt{2\pi}\sigma} {\rm exp} \left(-\frac{(y_i - ax_i - b)^2}{2\sigma^2}\right)$$
となる。

データ $$ (x_1, y_1), ~(x_2, y_2), ~\cdots, ~(x_n, y_n) $$ が得られているときの尤度関数 $l ~(a, b)$ は
$$ l ~(a, b) = \prod_{i=1}^n ~\frac{1}{\sqrt{2\pi}\sigma} {\rm exp} \left(-\frac{(y_i - ax_i - b)^2}{2\sigma^2}\right) $$

最尤法の定石として、対数尤度関数をとり、
$$ L ~(a, b) = \log l ~(a, b) = n\log\left(\frac{1}{\sqrt{2\pi}\sigma}\right) -  \frac{1}{2\sigma^2} \sum_{i=1}^n (y_i - ax_i - b)^2$$
これを最大化する $a$、$b$ が求めるものである。
右辺第1項、および $\Sigma$ の係数は $a$、$b$ に無関係なので、結局
$$-\sum_{i=1}^n (y_i - ax_i - b)^2$$
を最大化、すなわち
$$\sum_{i=1}^n (y_i - ax_i - b)^2$$
を最小化する $a$、$b$ を求めればよい。__これは最小二乗法そのものではないか。__

つまり、__最尤法による回帰係数の決定方法は最小二乗法と一致する。__

これこそが、最小二乗法が最小"二乗"法たり得る所以なのである。

# まとめ
以上のように、最小二乗法が実は最尤法と一致していたことを見ることができた。
この性質ゆえ、数ある「全体的な誤差が小さくなるように回帰係数を決める方法」の中でも最小二乗法が妥当とされているのだろう。
【Eclipse, Ant】jre less than 1.8 is not supported への対応

## 背景
- 古いJava Antプロジェクトのビルドで発生
- 実行環境も古い JRE で動いているため、古いバージョン(1.6)でビルドする必要があった

## 環境
- Eclipse 2022
- Java 6
- Ant 1.10

## Eclipse 設定
- Eclipse (build.xml -> 構成 -> JRE)
:::note info
ワークスペースと同じJREで実行 (jdk1.6 にしない)
:::
- Eclipse (build.xml -> 構成 -> クラスパス -> Antホーム)
:::note
デフォルトのまま
:::

## build.xml の設定
- パラメータ設定
```xml:build.xml
	<property name="javac.source"  value="1.6"/>
	<property name="javac.target"  value="1.6"/>
	<property name="javac.compiler"  value="javac1.6"/>
	<!-- jdk6 の javac へのパス -->
	<property name="javac.executable"  value="c:/Program Files/Java/jdk1.6.0_45/bin/javac"/>
```

- コンパイル設定 (環境に合わせて下さい)
source, target, compiler, executable, fork の設定を入れる
```xml:build.xml
	<!-- compile -->
	<target name="compile" depends="clean">
		<mkdir dir="${build.class.dir}" />
		<javac destdir="${build.class.dir}"
			debug="on"
			deprecation="on"
			optimize="on"
			classpathref="build.classpath"
			includeAntRuntime="false"
			encoding="UTF-8"
			source="${javac.source}"
			target="${javac.target}"
			compiler="${javac.compiler}"
			executable="${javac.executable}"
			fork="true"
		>
			<src path="${build.src}" />
		</javac>
	</target>
```

## ビルド
- build.xml 右クリック -> 実行 -> Antビルド

## ビルドしてできた class ファイルの Java のバージョン確認
該当クラスファイルがあるディレクトリで
```console
$ javap -v <class名>
...
  minor version: 0
  major version: 50
...
```

major version:50 とあれば java 6 でビルドされています。

https://javaalmanac.io/bytecode/versions/

以上です、お疲れさまでした！
EC-cube2の開発・修正方法メモ

Laravelと比較しながらEC-cube2を読み解くメモ。


# アクションコントローラとURLの関係

修正対象のurlからコントローラを探すには

例えばURLが
http://example.local.com/admin/order/edit.php?
の場合だと

LC_Page_Admin_Order_Edit_EX.php

になる。
Laravelのようにアクションごとにメソッドは分かれておらず、一旦全部actionメソッドに集約されたあと、
actionメソッド内で一覧表示・新規作成・編集・検索・削除　などのモードを振り分けている。

ここに記述がない場合は継承元を直接編集してしまっているので_EXのない方を修正する。(data/classディレクトリはLaravelのvendorディレクトリに相当するフレームワーク本体なので絶対に変更してはいけないが、そんな綺麗な状態で残っている案件の方がレアケースだと思われる。)

# HTMLテンプレートの探し方

上記コントローラの

init関数で $this->tpl_mainpage とか書いてあるあたりでSmartyテンプレートを指定している場合が多い。
(laravel の　return viewの引数相当)
ただし処理の途中で書き換えているパターンもある。

# マスターデータの取得方法
mtb_ プレフィックスを持つマスタテーブルのデータを取得する場合、以下のようにしてまるっと取得できる。
EloquentのようなORMはなく、DBのデータは全部配列で取得することになる。

```
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrPref = $masterData->getMasterData('mtb_pref');
```

# 入力フォームのセット
入力フォームの値を出し入れするには
SC_Form_XXX_Ex クラスを使用する。

このFormクラスの中でHTMlのinputタグとのバインドやバリデーションルールを設定する。

例

```
$this->addParam('メモ', 'memo', STEXT_LEN, 'aKV', array('NO_SPTAB', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));

```

このクラスのインスタンスにsetValue関数を使って値を流し込んでいく。
こんな感じ。

```
        $objFormParam = new SC_FormOrderEditParam_Ex();
        $objFormParam->setValue('order_id', $_REQUEST['order_id']);
```
決まったメール作成作業を自動化！初心者のPower Automate Desktop活用！

こんにちは！
千葉県在住、商業デベロッパーの会社で新規事業の企画検討をしています。
様々な分野への知見を広げるために、絶賛エンジニア分野を勉強中です。

今回は**Power Automate Desktop**
通称「**PAD**」を活用し、メール作成業務の自動化に挑戦したので紹介したいと思います。

 ## 同じ内容を色んなところに入力する、あると思います。
私の部署は新規事業検討の傍ら、新規物件の開発窓口も兼務しています。
定期的に取引先会社から物件情報が送られてくるので、
1. エクセルの一覧ファイルに物件情報を入力
2. 関係者にメール共有（文面にしっかり物件情報をいれます）
2. 検討余地があればエクセルのフォーマットを使って試算（もちろん物件情報を入力）

というフローでそれぞれ同じ内容を入力する作業が発生します。（住所、面積、地図、物件情報etc）
特に１と２は毎回必ず発生する作業なので
少しでも楽に出来ないかなと考え**PAD**での自動化に挑戦しました！

 ## 完成品がこちら！！
まずはPADの画面から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667978/d76a1ae7-6a3f-7913-b429-7b3ba304b29c.png)
気づきましたよね？すごい**シンプル**です:sweat_smile:
本当は「**メールの送信画面まで立ち上げて→文面に自動入力されて→あとは宛先と添付ファイルを設定するのみ！**」
までやりたかったのですが、Gmail画面を動かそうとすると「拡張機能が必要です」（有料？）と言われ今回は断念。。
無理やり考えたのがこの**クリップボードに保存する策！**
これでペーストすればいいんじゃね？と思い実行したのがこちら！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667978/d246e262-5a17-5e1b-b714-f1d5506a35f4.png)
謎のカンマが。。。
これはエクセルから範囲指定で文字を引っ張っているから、セルとセルの間にカンマが入ってしまうみたいです。。
一つ一つの単一セルからテキストを取得して、メールに直接入力出来ればカンマは出現しないみたいです。。
が、**今回はこれで突っ走ります！！笑**
カンマなしで出来ている参考記事はこちらです！

https://qiita.com/sasakikoudai/items/3b66e1c321c5c5452d60

ちなみに引用しているエクセルはこれ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667978/b1038ab7-ae02-d587-690f-5a3142a7ab05.png)
B2からD17をPADで範囲指定しています。

```ruby:ソースコード
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $'''C:\\Users\\Desktop\\PAD用.xlsx''' Visible: True ReadOnly: True Instance=> ExcelInstance
Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: $'''B''' StartRow: 3 EndColumn: $'''D''' EndRow: 17 ReadAsText: True FirstLineIsHeader: False RangeValue=> ExcelData
Clipboard.SetText Text: ExcelData
Excel.CloseExcel.Close Instance: ExcelInstance
```
こちらのソースコードから皆さんも試せます！
是非ご参考に！

 ## 実際に使ってもらった！
早速このPADを**同じ仕事をしている直属の上司**に使ってもらいました！
ちょうどこの前、物件情報共有メールで指定項目が抜けていたことを指摘されたので、
効率化＋同じミスをしないように自動化ツールを作ったことも伝えています。

:grin:良い点
* シンプルに**作業時間が短くなるからすごい！**
* **入力ミス・漏れもなくなるね！**

:smiling_imp:いまひとつな点
* **指定エクセルに物件情報をコピペする作業も自動化して欲しい**（一度指定エクセルを開く必要がある）
* **カンマ、、どうにかならないかね**（さすがにそのまま送れない）

そう、見事に指摘されましたが、、
実は先程のエクセル画像下部の物件情報の表、
これは「物件情報一覧」という別のエクセルファイルからコピペしています。
新規に物件情報を取得する度に行を追加して管理するスタイルなのですが、
この「物件情報一覧」ファイルから**自動的に表を引っ張ってくるところまで自動化したいのです！**
あとはカンマもなくならないと実装は出来ませんよね。。

 ## 今後の本実装に期待！
個人的にも上司的にも、
部署の人数が少ない中なので、**単純作業となる業務は積極的に効率化**していきたいです。
もう少し勉強と経験を重ねて理想となる業務効率化を実現できるよう、頑張っていきます！

最後まで読んでいただきありがとうございました～:blush:
コネクションとセッションの違い

## 勉強前イメージ

んーサーバの中の話？
セッションはユーザ感じがある
コネクションは通信的な？

## 調査

### コネクション とは

TCPで通信を行う際に確立するデータの伝送路。
TCPはコネクション型プロトコルなので3wayハンドシェイクを行い、コネクションを確立する。
必要な送受信が完了すれば、コネクションを開放します。

### セッション とは

webサイトやアプリケーションにアクセスして、ログインを行いログアウトを行うまでのやり取りのことで
一つのwebサイトの中で複数のページにアクセスを行い、ログアウトしたとすると
複数のページを見た一連の流れを1セッションと考えます。

### コネクションとセッションの違い

- レイヤ
	- コネクション : トランスポート層
	- セッション: アプリケーション層
- 行うこと
	- コネクション : 1対1の通信を行うときのデータ伝送路。データ送受信が終われば開放される
	- セッション : ログインしてからログアウトするまでの一連の流れ。ログアウトしたら開放される

## 勉強後イメージ

ひとつひとつみればちゃん理解できるのに
くっつけると何だっけーってなっちゃう。

## 参考

- [通信で使う「コネクション」と「セッション」の言葉の違いとは](http://rpapaweb.com/nw-con-set/)
- [TCPコネクション 【TCP connection】 TCPセッション](https://e-words.jp/w/TCP%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.html)
webスクレイピングについて 情報を抽出するのは違法? 調べてみました



https://www.octoparse.jp/blog/10-myths-about-web-scraping/

詳しくは上記のサイトを見ていただけると幸いですが

一部を転記します

## Webスクレイピング

Web上に公開されている情報の中から特定のデータだけを自動抽出する「Webスクレイピング」が注目されています。
Webスクレイピングを活用することで、個人や企業活動のあらゆるビジネスシーンで業務効率化や、付加価値の創造に役立ちます。

Webサイトから自動的にデータを集めるWebスクレイピングを使えば作業効率を飛躍的に効率化します。
しかし、「そもそもWebサイトから情報を抽出するのは違法ではないか？」といった疑問を持つ方は特に多いでしょう。

結論として、Webスクレイピングそのものに違法性はありません。
データ分析を目的とし、新たに自社のデータベースとして活用する場合には問題ないとされています。

Webデータの活用は、民間に限らず政府も行っています。
たとえば、総務省では平成元年に消費者物価指数（CPI）の調査にWebスクレイピングの活用を発表しています。

参照：消費者物価指数（CPI）へのウェブスクレイピングの活用について


一方、抽出したデータを勝手に公開する著作権侵害や、Webサイトの利用規約にスクレイピング行為について言及されている場合は違法とみなされ、法的措置をとられる可能性もあります。Webスクレイピングで、気を付ける必要があるのは以下の3つです。

Webサイトの利用規約に違反する（利用規約で触れている場合は違反になる）
サーバに過度の負荷をかける（アクセス不能になり業務妨害にあたる）
著作権を侵害する（抽出したデータを無断で公開・販売するなど）

https://www.bunka.go.jp/seisaku/chosakuken/seidokaisetsu/gaiyo/chosakubutsu_jiyu.html


### Webスクレイピング活用法
Webスクレイピングは、現在さまざまな分野で広く使用されています。
見込み客の獲得、価格チェック、
ビジネス市場分析に加えて、
学生はGoogle scholarから研究を行うこともできます。
不動産業者は住宅研究を行い、住宅市場を予測することができます。

また自社ブランドを宣伝するには、
YoutubeインフルエンサーやTwitterのエバンジェリスト（伝道者）を見つけることもできます。
あるいは、ニュースメディアとRSSフィードをスクレイピングすることによって、
効率的・効果的にニューストピックを集めることも可能です。

AWSでも使用する方法があります

https://qiita.com/satsukiya/items/b9d02abd7fa96cd59355


論文関係の活用として

https://qiita.com/k-yoppi/items/9a347714c1b265275eb1?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items

等があります@k-yoppi様のgit見ましたがとてもすごいシステムで
参考にさせていただいております
注意点としてはWindowsの場合は、CP932へ変換しようとするため、
CP932に変換出来ない場合は、UnicodeEncodeError例外が発生するみたいです

https://qiita.com/butada/items/33db39ced989c2ebf644

環境を共有しやすいDocker の活用なども視野に入れることをお勧めします！

https://chigusa-web.com/blog/windows%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89/
ERROR: The Compose file './docker-compose.yml' is invalid because

#### docker-compose up --build -d で ERROR: The Compose file './docker-compose.yml' is invalid because　が出た時
```
WARNING: The JUPYTER_HOST_PORT variable is not set. Defaulting to a blank string.
WARNING: The MINIO_ROOT_USER variable is not set. Defaulting to a blank string.
WARNING: The MINIO_ROOT_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The MLFLOW_HOST_PORT variable is not set. Defaulting to a blank string.
WARNING: The MYSQL_USER variable is not set. Defaulting to a blank string.
WARNING: The MYSQL_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The MYSQL_DATABASE variable is not set. Defaulting to a blank string.
WARNING: The MYSQL_ROOT_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The MINIO_HOST_PORT variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.mlflow.ports contains an invalid type, it should be a number, or an object
services.jupyter.ports contains an invalid type, it should be a number, or an object
services.minio.ports contains an invalid type, it should be a number, or an object
```

原因：
ディレクトリ構成が間違っている OR ファイルが足りていないことがある。
例えば、隠れファイル(ls -laコマンドで表示される)の「.env」など忘れがち。
【Jquery】Jqueryのdetach(デタッチ)の使い方

# コード
```html
<h1 class="aaa">あああ</h1>
<h1 class="bbb">いいい</h1>
<p>
<button id="button1">ボタン1</button>
<button id="button2">ボタン2</button>
<button id="reset">リセット</button>
</p>
<p>
<button id="button11">1戻すよ</button>
<button id="button22">2戻すよ</button>
</p>
```


```javascript
let result;
const reset = $('.aaa,.bbb').detach();
reset.prependTo('body'); 

$('#button1').on('click', function() {
  if($('h1').hasClass('aaa')){
    result1 = $('.aaa').detach();
  }
})
$('#button2').on('click', function() {
   if($('h1').hasClass('bbb')){
   		result2 = $('.bbb').detach();
   }
})

$('#button11').on('click', function() {
    result1.prependTo('body'); 
})
$('#button22').on('click', function() {
    result2.prependTo('body');
})

$('#reset').on('click', function() {
   reset.prependTo('body'); 
})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/cebf6752-c9b0-b6b0-5256-b2c1e777eeef.png)
仮想化ソフトを作るサンプルコードがAppleから公開されていた

WWDC22のセッションビデオで題名が気になったので流し見をしてみたが、実はAppleから仮想化ソフトを作るサンプルコードが公開されていたことを初めて知ったのでメモしておきます。
[Create macOS or Linux virtual machines - WWDC22 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2022/10002/)

# サンプルコード

- [Running Linux in a Virtual Machine | Apple Developer Documentation](https://developer.apple.com/documentation/virtualization/running_linux_in_a_virtual_machine)
macOS 11.0+
Xcode 12.4+

- [Running macOS in a Virtual Machine on Apple Silicon Macs | Apple Developer Documentation](https://developer.apple.com/documentation/virtualization/running_macos_in_a_virtual_machine_on_apple_silicon_macs)
macOS 12.0+
Xcode 14.0+ Beta

- [Running GUI Linux in a virtual machine on a Mac | Apple Developer Documentation](https://developer.apple.com/documentation/virtualization/running_gui_linux_in_a_virtual_machine_on_a_mac)
macOS 13.0+ Beta
Xcode 14.0+ Beta

**もちろん、AppleのサンプルコードではWindowsには対応してないと思います。**


# macOS13の新機能 
[macOS 13 Venturaでは、VirtualizationフレームワークがRosettaをサポートし、Intel LinuxアプリがARM Linux仮想マシンで実行可能に。](https://applech2.com/archives/20220607-running-intel-binaries-in-linux-vms-with-rosetta.html)
> RosettaをサポートしたmacOS 13 VenturaのVirtualizationフレームワークでは、Intel MacアプリがApple Silicon Mac上で実行できるのと同じように、Intel LinuxアプリをApple Silicon上のARM Linux仮想マシンで動作させることが可能になるそうです。


これまで自分で仮想化ソフトを作ろうを考えたことがなかったので、調べたことがなかったが、このサンプルコードを使えば Parallels や UTM のような仮想化ソフトの超簡易版アプリが自分で作れそう。

まさか自分がソースコードから仮想化ソフトを作れるとは思ってもなかったのでちょっと衝撃を受けた。
ClamAV まとめ

インストールおよび設定

```
# yum --enablerepo=epel install clamav clamav-update clamd
# freshclam
# vim /etc/freshclam.conf
```

以下を有効にする。

```
UpdateLogFile /varf/log/freshclam.log
LogTime yes
PidFile /var/run/freshclam.pid
```
もし、logwatch を使っている場合は、以下を実行する。

```
# vim /etc/logwatch/conf/logfiles/clam-update.conf

LogFile = /var/log/freshclam.log
```
ClamAV の更新確認

```
# freshclam
```
定期的に更新しログに取る。

```
# vim /etc/cron.d/clamav-update
====
## Adjust this line...
MAILTO=root

# 0  */3 * * * root /usr/share/clamv/freshclam-sleep > /dev/null
30 */3 * * * root /usr/bin/freshclam >> /var/log/freshclam.log
====
```

```
# vim /etc/sysconfig/freshclam
FRESHCLAM_DELAY=disabled-warn
```

それとも、以下の方法にして、cron の方を消してみるのはどうだろうか。ダブルでやっておけば安心なので、残しておいてもいいですけど。

新規ファイルの作成。 /usr/lib/systemd/system/clam-freshclam.service
以下の設定で、1日に4回アップデートを試みます。

```
# Run the freshclam as daemon
[Unit]
Description = freshclam scanner
After = network.target

[Service]
Type = forking
ExecStart = /usr/bin/freshclam -d -c 4
Restart = on-failure
PrivateTmp = true

[Install]
WantedBy=multi-user.target
```

freshclam サービスの有効化と実行

```
systemctl enable clam-freshclam.service
systemctl start clam-freshclam.service
```

以下を編集

```
# vim /etc/clamd.d/scan.conf

====
LogFile /var/log/clamd.scan
LogTime yes
PidFile /var/run/clamd.scan/clamd.pid
LocalSocket /var/run/clamd.scan/clamd.sock
# User clamscan

ExcludePath ^/proc/
ExcludePath ^/sys/
ExcludePath ^/dev/
ExcludePath ^/swap.file
====
```

起動設定

```
# systemctl start clamd@scan
# systemctl status clamd@scan
# systemctl enable clamd@scan
# ln -sfv /etc/clamd.d/scan.conf /etc/clamd.conf
```

Web からアクセスできるようにする。

```
# usermod -aG clamscan apache
# usermod -aG virusgroup apache
# id apache
```

PrivateTmp の設定
これやらないとうまくいかないところなのだが、うーーん、と言う感じ。

```
# vim /etc/systemd/sysetm/php-fpm.service.d/php-fpm.service
====
[Service]
PrivateTmp=false
====
```

SELinux 設定

```
# getsebool -a | grep antivirus
antivirus_can_scan_system --> off
antivirus_use_jit --> off

#setsebool -P antivirus_can_scan_system 1

# getsebool -a | grep antivirus
antivirus_can_scan_system --> on
antivirus_use_jit --> off

# setsebool -P httpd_can_sendmail 1
```

サービス再起動

```
# systemctl restart php-fpm
# systemctl restart httpd
# systemctl restart clamd@scan
```

いずれにしろ、以下は確認する必要がある。

```
# systemctl status clamd@scan
# systemctl status clam-freshclam
```

ところで、logwatch が clam-update とか freshclam のアップデート状況を補足できないようで、うるさく言ってくるので、以下の処置をおこなった。

```
# vim /etc/logwatch/conf/ignore.conf

feshclam
clam-update
If you use a different log file
 you may need to restart it
For example
 If you are logging using syslog
Other options
```

なお、メモリは、1G 程度は必要となるため、インスタンスのメモリは 4G 以上のものが必要となるでしょう。

（参考）
freshclam
https://linux-audit.com/install-clamav-on-centos-7-using-freshclam/
擬似ウィルス
https://downloadcenter.trendmicro.com/index.php?regs=jp&prodid=1424

なお、運用を始めてしばらくして、clamd が古いと言われて freshclam ができない問題が、AWS の EC2 で発生しました。この問題への対応は、以下のリンクを参考にしてください。

[Packages excluded due to repository priority protections の解決方法](https://qiita.com/intrajp/items/9e083e295f69b0a2d318)
PHPの学習メモ

|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|

PHPを初めて使う。学習のメモを残しておきたい。開発環境は、WindowsでEclipse（Pleiades）を使っている。PHPは、スクリプト言語であり、インタプリタとして動作する。最近のPHPは、かなりオブジェクト指向的に記述できる。
- 開発環境(Windows)：PHP 7.4.29、MySQL 5.6.46、Eclipse 2022-06 (4.24)
- 本番環境(CentOS Stream 8)：PHP 7.4.19、MySQL 8.0.26

## PHP関連の投稿：
- [PHPでAPCuを使って共有メモリにキャッシュを実現する方法](https://qiita.com/taconana/items/0f78a831dab2c2e1cf58)
- [PDOとPDOStatementを掩蔽し、実行したSQLのログを出力する方法](https://qiita.com/taconana/items/087738529fbf6e65ab80)
- [PHPのforeachでは、多くの場合、参照渡しの方がいい？](https://qiita.com/taconana/items/e1a568de0b39b60c4dce)
- [PHPで「お問い合わせ画面」を実装してみた](https://qiita.com/taconana/items/5dd35e155f28e7be89ad)
- [PHP7.4でEnumライクなものを実装してみた](https://qiita.com/taconana/items/c24449518eb661164d72)
- [PHPの連想配列でUndefined indexを出さない実装：あなたはどちら派？](https://qiita.com/taconana/items/99826db816810384e8d5)
- [PHP7.4のクラス継承で注意すべきこと：バグなのか、仕様なのか？](https://qiita.com/taconana/items/0ca7f99f5fdf8aeec3dc)
- [PHP7.4で、$_SESSIONとACPuはどのようにキャッシュされるのか](https://qiita.com/taconana/items/506480ab3af77a3d824a)
- [PHPのforeachで参照渡しを使った後は、unset()しておこう！](https://qiita.com/taconana/items/7d7b422aae66c632a628)
- [行数を節約するvar_dump()を書いてみた](https://qiita.com/taconana/items/5cafacc6bb8229e97d3f)
- [xdebugがPHP環境に入っているかどうかでvar_dump()の出力形式が変わる](https://qiita.com/taconana/items/8f4af816ad528677c332)
- [WindowsにXAMPP 7.4とWordPress 6.0をインストールする手順](https://qiita.com/taconana/items/a2723155ce47275df17e)
- [WordPressのSQLをトレースしてみた](https://qiita.com/taconana/items/5fa6d015d32a0daddfa9)
- [WordPressでのショートコードの使い方](https://qiita.com/taconana/items/64a9d6bf4c917cbbfdd4)
- [WindowsにMODX Evolutionをインストールしてみた](https://qiita.com/taconana/items/a93351b4f84a8700f8fd)
- [MODXの独自タグ(エレメント)の使い方](https://qiita.com/taconana/items/f602f8b7d5d390e30443) 

## その他の投稿：
- [CentOS8.xでのJavaサーバーサイド構築](https://qiita.com/taconana/items/e45f19e83c825a9ba75e)
- [CentOS Stream 8でのPHP7.4の動作環境構築](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a)
- [その他](https://qiita.com/taconana/items/55e4ea3283f2fa82a670)

|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|
Goのpackage github.com/mattn/go-sqlite3 is not a main packagetとかいうエラー

go初心者です。
go1.18 darwin/arm64を使っています。

このエラーの解決方法(個人的に)を残したいと思います。

①brew なりでsqlite3をインストールします。

②自分のPJのディレクトリでgo mod initします。
```
go mod init github.com/mattn/go-sqlite3 
```
③go.modのあるディレクトリでgo mod tidyをします。
```
go mod tidy
```

これで使えるようになるはずです。
Azure Cognitive Search の地味に便利な新機能「インデックスの別名」

# はじめに
組織内に貯まっている大量な構造化・非構造化データから、新たな価値を見出すためのフルマネージド全文検索サービスである [Azure Cognitive Search](https://www.youtube.com/watch?v=9GcjFofXdd0) を使えば、誰でも簡単に AI 搭載検索エンジンを開発することができます。今回は「[インデックスの別名(index alias)](https://docs.microsoft.com/azure/search/search-how-to-alias?tabs=rest)」というプレビュー中の機能について紹介します。

# インデックスの別名
これまで、アプリケーション開発者は使用中の Azure Cognitive Search のインデックス名が変更された場合、参照先 REST エンドポイントを書き換えるためにアプリケーションを停止する必要がありました。そこでこの「インデックスの別名」機能を使ってマッピングテーブルを作成しておけば、アプリケーション側の変更は不要になります！

やりかたは、以下の変更用の REST API を使ってマッピング情報を作成するだけです。

```bash
POST /aliases?api-version=2021-04-30-preview
{
    "name": "my-alias",
    "indexes": ["hotel-samples-index"]
}
```
このように登録すると、インデックス名に `my-alias` を指定できるようになります。この別名をアプリケーション側で呼び出しましょう。別名が使えるのはクエリとインデックス作成のみとなっているので注意。

# VSCode の Azure Cognitive Search 拡張機能はいいぞ
VSCode ユーザーには朗報ですが、Azure Cognitive Search は [VSCode の拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurecognitivesearch)を使うとめちゃくちゃ便利にコントロールすることができます。

![create-alias-vscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/9ed024d4-082c-2385-4f35-0a6d797946f4.png)

こんな感じで、別名も直接 VSCode 上から登録編集できるようになりました。ほかにも[VSCode の拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurecognitivesearch)を使うと、これまで Postman などを使って管理していたことが、図のようにサブスクリプションに紐づく形で系統的に管理できるようになるのでオススメです。ここから直接インデックスにデータを登録もできます。まぁスキルセットについては、「[デバッグセッション機能](https://qiita.com/nohanaga/items/26355ffba58ba4c71c6e)」が GA したということで、そちらを使って作成いただくのがよいかと思います。

Azure Cognitive Search 拡張機能でどこまでできるかはまた別の機会に解説したいと思います。

# 参考
[Azure Cognitive Search でインデックスの別名を作成する](https://docs.microsoft.com/azure/search/search-how-to-alias?tabs=vscode)
[Azure Cognitive Search のデバッグセッションを使ってカスタムスキルを追加しよう](https://qiita.com/nohanaga/items/26355ffba58ba4c71c6e)
SASS（SCSS）でHEXをRGBに変換する

ニッチな需要だとは思いますが…。Bootstrapの色定義を上書くうえで必要になったので。

## 関数を作るしかなかった
```scss
@function convertColorHexToRGB($value:#55c500) {
    @return (red($value),
        green($value),
        blue($value));
}
// 85, 197, 0

```
`convertColorHexToRGB(yourColor)`みたいな感じでお使いください。

## 念のため解説
### 使っている関数
- [red関数](https://sass-lang.com/documentation/modules/color#red)
- [green関数](https://sass-lang.com/documentation/modules/color#green)
- [blue関数](https://sass-lang.com/documentation/modules/color#blue)

代入された色の`red`, `green`, `blue`の値をそれぞれ返してるだけです。

## さいごに
リファレンス読んでたらもうちょいスマートに出来そうだったけど目的は果たせてるのでこれでよしとしましょう。おしまい。
logrotateが急に動かなくなった

# 前置き

logrotate設定できたはずやのに動かんor今まで動いてたのに動かなくなったってハマった人の助けになればと思って書いています。
logrotate、たまにしか触らないので挙動を忘れて思い出すのに困りますよね。。。

備忘録も兼ねて引っかかったポイントとそれに伴って問題点を見つける方法をメモしておこうと思います。


# そもそもdry-runをしましょう

動かない時はとにもかくにもdry-runしてデバッグしましょう。ログをみれば大抵のことがわかります。
ありがちなミスを挙げるとすると
- ファイルのパーミッションの問題
- 親ディレクトリのパーミッションの問題([この記事](https://recruit.gmo.jp/engineer/jisedai/blog/logrotate/)が参考になります。)
- そもそもローテーション対象パスをtypo...

こんなもんでしょうか。

あと、個別設定ファイルを実行してうまくいっても、`/etc/logrotate.conf`に`dateext`とかデフォルト値と違っていてなおかつ個別設定ファイル上で記述していないグローバルな設定が書いてあると挙動がかわってきます。
最終テストは`logrotate -d /etc/logrotate.conf`でやっとくべきです。これで私が今回やられました。

# ローテション対象ログの存在するディレクトリにあるファイル名に気をつけよう

この記事を書いたきっかけです。`logrotate.conf`だけに`dateext`(ローテーション時にファイル末尾に日付をつけてくれる)が書いてあることと、古いファイルがよくない名前で置いてあったのが原因でした。

## 実例

**設定**
- `logrotate.conf`には`dateext`の記述あり。
- `HOGE`を管理する`logrotate.d/HOGE`には`dateext`の記述なし。さらに`delaycompress`の記述あり。


```:ローテーション対象ファイル群
HOGE.log
HOGE.log-20200602
HOGE.log-20220602.gz
```

という**ファイルだけ**が同一ディレクトリ上にあるとしましょう。
このHOGEというファイルに関する`logrotate.d`以下の設定ファイルには`dateext`が書いていませんが、親設定ファイルである`logrotate.conf`には書いてありました。
なのでlogrotateは`HOGE.log-YYYYMMDD`というフォーマットのファイルを世代管理対象とします。
また`delaycompress`があるので一世代前は圧縮しません。
そのためlogrotateはたまたま一世代前にあたる`HOGE.log-20200602`というファイルを圧縮しようとします。もちろんこのファイルはlogrotateが管理して作成したものではないです。
しかし、既に`HOGE.log-20220602.gz`があるため作成に失敗するということが発生します。

つまり、logrotateが作ろうとしているファイルと同じ名前のファイルが既にあるとlogrotateは動作をやめてしまいます。
(間違って置いたログファイルを上書きされては困るので安全な動作ですね。)

ちなみに`logrotate.d/HOGE`だけでdry-runしたときは`dateext`が効きません。
つまり`HOGE.log.1`という名前で世代管理をしようとするのでローテーションに成功します。

この組み合わせで私は混乱してしまいました。

おそらくログの置いてあるディレクトリ上で以前だれかがログファイルを解凍してそのまま放置していたせいでこの現象がおきてしまったのでしょう。。。涙

## 結論

ログの置いてあるディレクトリ上でファイルを解凍して作業をしないように、、、。
`.gz`なら`zcat`と`less`を組み合わせて使ったりで対処しましょう。もしくはローカルにコピーして作業しましょう。

# おまけ

今回、anacronで実行していたのでlogrotateの実行ログをリダイレクトしてファイルに実際本番で実行時の挙動を保存して確認しようと思ったら、logrotateのログは標準エラー出力で吐かれていました。(少しでも失敗したときだけなのかもしれませんが。)
もし毎回logrotateのログを保存したい場合はご注意を。
【Unity】WebGL + iOSで動画が閲覧できない場合に試してみること

# はじめに
WebGL + iOS環境でのみ動画が閲覧できない問題でハマってしまった際に調べた内容を記録します。


# 確認項目
### 1. VideoClip
Unity公式によるとVideoClipからのビデオ再生には対応していませんので、URLを指定する方法で動画を再生することになります。

https://docs.unity3d.com/ja/2019.4/Manual/VideoSources-FileCompatibility.html

### 2. CORS(Cross-Origin Resouces Sharing)
動画を配置しているサーバーの設定で他ドメインのサーバーからのメディアのアクセスをブロックする様に設定されている場合は許可する必要があります。
同じドメインに配置する場合は気にしなくても問題ありません。

### 3. 動画フォーマット
iOSでは同じ拡張子でも再生できないフォーマットが存在しているため、iOS上で再生できる動画なのか確認する必要があります。

詳細は以下のページを参照のこと

https://so-zou.jp/web-app/tech/html/element/multimedia/video/

https://deep-space.blue/web/822

※2023/08/27追記
`H.264(且つプログレッシブ),音声AACのmp4ファイル`だと再生できる傾向にあります。

https://qiita.com/kazuki_kuriyama/items/04420e3b6b81a675f6a1

### 4. JS側のvideoタグの設定
WebGLのVideoコンポーネントがアタッチされたオブジェクトはHTMLのvideoタグが割り当てられるのですが、videoタグの設定によっては動画を再生に影響が出るようです。

Unityでは以下のファイルにvideoタグの設定が記述されているため、以下のサイトと照らし合わせて修正してください。
`Unity\Hub\Editor\[Unityバージョン]\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\lib`

https://qiita.com/kinshist/items/f775a7253f36be5cf2ed

※関連Fourum

https://forum.unity.com/threads/unity-webgl-video-player-doesnt-play-on-ios-mobile.930420/

### 5. 画面タップ
Safariのセキュリティ制約により、一度画面をタップしないと動画を再生することができません。

### 6. ホスティングサーバーの設定
サーバー側でiOS用サファリで使用されているQuickTimeへの動画配信をブロックしている可能性がある。
.htaccessのファイルを編集することで直るケースもありますが、ホスティングサービスを利用している場合は管理者へ確認が必要です。

https://highmoon-miyabi.net/blog/2019/03/17_000550.html

### 7. iPhoneの低電力モード
低電力モード中は動画が自動再生されないようです。

### 8. VideoPlayer - Mute設定
Safariのセキュリティ制約上、音声が有効な場合ブロックされてしまうため、自動再生したい場合は音声をMuteにする必要がある。
~~また、AudioOutputModeはDirectOutPutに設定しておくこと。~~
AudioOutputModeはNoneの方が良いです。
※音声を出したい場合は音声ファイルと動画ファイルは別で保管して読み込みましょう。

### 9. HTMLからVideoタグのテクスチャを受け取る

Videoコンポーネントを使わずに、jslib経由でテクスチャを受け渡しすることで動画再生させることも可能です。
以下のリポジトリをご参照下さい。

https://github.com/KazukiKuriyama/unity-webgl-video-ios
【基本情報技術者】IPアドレスのクラス

基本情報技術者試験の分野「IPアドレスのクラス」についてご紹介いたします。

## IPアドレスのクラス
IPv4で、IPアドレスは、2進数32ビットで表現されていて、32ビットの中を**ネットワーク部とホスト部に分けて管理**している。
**ホストは、ネットワーク上のサーバや端末のこと**を言う。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/0908d9ff-4698-1d6d-811f-f8147b74b952.png)
ホスト部では、そのホストが属しているホスト部をすべて「0」にしたネットワークアドレス、同じネットワークに同一の情報を送信するためのホスト部をすべて「1」にしたブロードキャスアドレスをクラスA～Cで**ホスト2台分**使用している。
**※使用可能なホスト数を計算する際は、2台分引く。**
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/a5b17e03-d486-3a4e-f553-ecaf63bcfd95.png)
**32ビットを8ビット単位**にネットワーク部とホスト部を何ビットずつで構成するのかで、クラス分けをしている。
### クラスA
クラスAは、**ネットワーク部8ビット、ホスト部24ビットで構成します。**
ネットワーク部の**先頭ビットは「0」から始まり、10進数では、「1～127」で始まるIPアドレスです。ホスト部を24ビットで表現するため、一つのネットワーク内で識別できる最大ホスト数台数は、2²⁴－2台となる。**
### クラスB
クラスBは、**ネットワーク部16ビット、ホスト部16ビットで構成します。**
ネットワーク部の**先頭ビットは「10」から始まり、10進数では、「128～191」で始まるIPアドレスです。ホスト部を16ビットで表現するため、一つのネットワーク内で識別できる最大ホスト数台数は、2¹⁶－2台となる。**
### クラスC
クラスCは、**ネットワーク部24ビット、ホスト部8ビットで構成します。**
ネットワーク部の**先頭ビットは「110」から始まり、10進数では、「192～223」で始まるIPアドレスです。ホスト部を8ビットで表現するため、一つのネットワーク内で識別できる最大ホスト数台数は、2⁸－2台となる。**
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/590b9c91-4346-14bc-8460-10771f2b11ec.png)

### クラス毎のプライベートIPアドレスの範囲
クラスAは10.0.0.0～10.255.255.255 
クラスBは172.16.0.0～172.31.255.255 
クラスCは192.168.0.0～192.168.255.255

### 例題
平成29年度春期　午前問34
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/43dace41-69d1-2a25-2c29-4317619bcacf.png)
ア.クラスA　イ.クラスB　ウ.クラスC　エ.クラスD

IPアドレスクラスを判別するには、対象となるIPアドレスの上位8ビットに注目
（.は8ビット単位で区切られている。）
IPv4におけるA～Dの各アドレスクラスは、以下のようにIPアドレスの先頭4ビットによって区別されています。

クラスA　先頭ビットが0 (先頭8ビットの10進表記が0～127)
クラスB　先頭ビットが10 (先頭8ビットの10進表記が**128～191**)
クラスC　先頭ビットが110 (先頭8ビットの10進表記が192～223)
クラスD　先頭ビットが1110 (先頭8ビットの10進表記が224～239)

よってクラスBとなり、答えは**イ**となる。
M5Paper: タッチパネルの使い方

```text:touch_counter.ino
// ---------------------------------------------------------------
//	touch_counter.ino
//
//						Jun/09/2022
// ---------------------------------------------------------------
#include <M5EPD.h>

M5EPD_Canvas canvas(&M5.EPD);

int	value = 0;
int	ncount = 0;
int	point[2]; 
// ---------------------------------------------------------------
void setup() {
  // put your setup code here, to run once:
	M5.begin();
	M5.EPD.SetRotation(90);
	M5.TP.SetRotation(90);
	M5.EPD.Clear(true);
	canvas.createCanvas(540, 960);
	canvas.setTextSize(5);


	canvas.fillTriangle(200, 300, 300,300, 250,200, WHITE);
	canvas.drawRect(200, 200, 100, 100, WHITE);
	
	canvas.fillTriangle(200, 500, 300,500, 250,600, WHITE);
	canvas.drawRect(200, 500, 100, 100, WHITE);
	
	canvas.drawString(String(value),200,400);

	canvas.drawString("ncount = " + String(ncount),50,50);
	canvas.pushCanvas(0,0,UPDATE_MODE_DU4);

	Serial.printf("ncount = %d\r\n",ncount);
	Serial.println("*** setup *** end ***");
}

// ---------------------------------------------------------------
void loop() {
  // put your main code here, to run repeatedly:

	if(M5.TP.avaliable()){
		if(!M5.TP.isFingerUp()){
			if (finger_get_proc())
				{
				value_hantei_proc();
				canvas.drawString(String(value) + "  ",200,400);
 				canvas.pushCanvas(0,0,UPDATE_MODE_DU4);
				}
			}
		}
}

// ---------------------------------------------------------------
bool finger_get_proc()
{
	bool is_update = false;
	M5.TP.update();
	tp_finger_t FingerItem = M5.TP.readFinger(0);
	if ((point[0] != FingerItem.x) || (point[1] != FingerItem.y))
		{
		is_update = true;
		ncount++;
		Serial.printf("ncount = %d\r\n",ncount);
		canvas.drawString("ncount = " + String(ncount),50,50);
		point[0] = FingerItem.x;
		point[1] = FingerItem.y;
		Serial.printf("Finger ID:%d-->X: %d 	Y: %d	Size: %d\r\n", FingerItem.id, FingerItem.x, FingerItem.y , FingerItem.size);
		}

	return is_update;
}

// ---------------------------------------------------------------
void value_hantei_proc()
{
	if ((200 <= point[0]) && (point[0] <= 300))
		{
		if (point[1] <= 300)
			{
			value++;
			}
		else if (500 <= point[1])
			{
			value--;
			}
		}
}

// ---------------------------------------------------------------
```

Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/12a64c5b-0bbf-4e13-ec98-958fc42677f4.png)


![IMG_20220609_172300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/54f84d57-2120-61d3-3e9a-c9f2771c725b.jpeg)
scipy.stats ジャック・ベラ検定 jarque_bera

# scipy.stats ジャック・ベラ検定 `jarque_bera`

データが尖度と歪度からみて，正規分布にしたがっているかを検定する。

サンプルサイズが 2000 以上の場合にのみ十分な近似ができる。小標本の場合には $\alpha$ エラーが大きくなりがちである。

`jarque_bera(x)`


```python
from scipy.stats import jarque_bera
import numpy as np

np.random.seed(123)
x = np.random.normal(50, 10, 2000)
jarque_bera(x)
```




    Jarque_beraResult(statistic=4.35459209387323, pvalue=0.11334760325001603)




```python
from scipy.stats import t
np.random.seed(123)
y = t.rvs(df=1, size=2000)
jarque_bera(y)
```




    Jarque_beraResult(statistic=84777241.15223904, pvalue=0.0)




```python
np.random.seed(123)
z = t.rvs(df=30, size=2300)
jarque_bera(z)
```




    Jarque_beraResult(statistic=6.215613681021044, pvalue=0.0446988796913278)




```python
from scipy.stats import shapiro
shapiro(z)
```




    ShapiroResult(statistic=0.9990779161453247, pvalue=0.29000625014305115)




```python
d = [58, 63, 83, 10, 62, 41, 41, 31, 54, 44, 31, 34, 35, 15]
jarque_bera(d)
```




    Jarque_beraResult(statistic=0.1860725636063782, pvalue=0.911160441152622)
embulk-output-bigqueryインストール時にRuby version >= 2.5でエラーになる問題

コンテナにembulkをインストールしようとした際に以下のエラーが出て、embulk-output-bigqueryのインストールに失敗した。

```
#16 10.54 ERROR: Error installing embulk-output-bigquery:
#16 10.54 jwt requires Ruby version >= 2.5.
```
エラーメッセージにもあるように、原因としてはembulk-output-bigqueryが依存しているjwtのバージョンが22/6/6より2.4.0に上がったことで、要求Ruby versionが旧来の2.1から2.5に上がったことが原因。
https://rubygems.org/gems/jwt/versions/2.4.0

https://zenn.dev/hiroysato/articles/35a26bbe466f0b
> Embulk 0.9.23に入っているJRubyのバージョンは9.1.5.0で、Ruby 2.3互換となっており

と記述があるように、Embulkの0.9系に入っているRubyは2.3系なので2.5を要求するjwtのインストールに失敗した。

根本的にはEmbulkのバージョンを0.10系に上げるべきだが、一旦動くようにしたいなら事前に旧来のバージョンである2.3.0のjwtを事前にインストールしてあげれば良い。

```shell
embulk gem install jwt:2.3.0
embulk gem install embulk-output-bigquery
```
ファミリーベーシックのキーボードをUSBキーボードにしてUSBキーボードをファミリーベーシックに接続する

# ファミリーベーシックのキーボードをUSBキーボードにしてUSBキーボードをファミリーベーシックに接続する

[ファミリーベーシックのキーボードをUSBキーボードにする](https://qiita.com/BUBUBB/items/f1b1518d88e6827b9967)ことが出来たら、逆もやってみたくなり、[USBキーボードをファミリーベーシックのキーボードにする](https://qiita.com/BUBUBB/items/5e529ae68f9f83394a09)を作った。

ここまでくると、当然次は「ファミリーベーシックのキーボードをUSBキーボードにしてUSBキーボードをファミリーベーシックに接続する」こともやってみたくなるのが人情だ。

というわけでやってみた。

<img alt="FKBUSBFC.png" width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/cc459e91-67c9-7d8f-efd7-b3b55f30ac7b.png">

当然成功した。

何の意味もないが、もともとの記事も今更ファミリーベーシックの記事があっても何の意味もないわけで、別に問題はないだろう。

Qiitaのコミュニティガイドライン、

- エンジニアにとって再利用性・汎用性の高い記事を書こう
- みんなが読んでも理解できる記事を書こう

に反している気もする。
CloudFunctionsにdeployしてエラーの場合

# エラー内容

```
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function fail
```
こんな感じで具体的な内容がわからない場合

# 原因

具体的な内容がわからない場合は、プログラムが悪い。今の所、それしか原因がなかった。
## 原因詳細１
引数が間違えていた
トリガーがGCSやpubsubの場合

```python
def hogehoge(event, context):
```

トリガーがhttp(s)の場合

```python
def hogehoge(request)
```

引数を取らないでやる処理の場合、ついつい引数無しで作ってしまっていた。

## 原因詳細２

requirements.txtの内容が不足している

ついつい忘れてしまう。

これはちょいちょい追加していきます。
MRTK3のエディタでのInput simulationを試してみる


# 環境

- Unity 2021.3.4
- MRTK3
  - https://github.com/microsoft/MixedRealityToolkit-Unity/tree/mrtk3
  - Commit: 213d736241e163a3bf9effbde3467e86d488720b

## MRTK3 の必要環境

- Unity 2020.3.35以上なので留意

![R](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/25b26b2d-c2fd-0639-e9a7-d803d8fcdc9f.png)


# 背景

- MRTK3がPublic Previewがリリースされたので触りはじめてみる
  - プレビュー版ということに留意
  - General Availabilityは、2022年の秋、冬予定とのこと
  - General Availabilityまで、2～4週間隔でアップデートがあるとのこと

- MRTK + HoloLens アプリ開発者にとって、Input Simulationの高速操作は必須技術で、MRTK3で変更があったようなので試す
- MRTK3がPublic Previewになり、お祝いの気持ちを込めた投稿（内容が薄くて申し訳ない）

# 準備

- 手っ取り早く、MRTK3を体験したい場合は、GitHubのサンプルを見るのがよさそうだ

- 以下の `GitHub` のリポジトリを `Clone`
  - https://github.com/microsoft/MixedRealityToolkit-Unity/tree/mrtk3
- `mrtk3` ブランチをチェックアウト

```
git clone https://github.com/microsoft/MixedRealityToolkit-Unity.git
git checkout mrtk3
```

- UnityProjectsフォルダ以下にあるMRTKDevTemplateをUnityのプロジェクトに追加
- 適当なシーン（今回の試したのはCanvasExampleシーン）を開く


# マウス操作でシミュレーションしやすくなった

- ボタンを押すだけでなく、ドラッグなどもできるようになったようだ

![mrtk3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/0409b9bb-fc99-aab8-a95b-f62cf7788288.gif)

# キーバインドに変更があった

## 操作方法の大きな変更点(筆者にとって)

![simulation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/76fa5e7b-85dc-2706-3dc3-f6ee3518ac36.gif)

- 左手を表示するには、`Left Shift`を押しづつける（MRTK2と同様）
- MRTK2では、`Left Shift`と`Left Ctrl`を押し続けてマウスを動かすと で手を回転できた（以下のように）
　　- ![mrtk27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/2e887914-2f8a-8ea3-6c07-32d0f64fcbba.gif)
- MRTK3では、`Left Ctrl`は、右手用のキーになった
- MRTK3では、代わりに`Left Alt`を使うようだ（ただし、操作感が異なる）

## 手の回転

- `Left Shift`を押したまま、`F` を押すと手を回転できるようになった
  - （ハンドメニューの表示に使えるかもしれない、未確認）
  - 2022/7/13追記： `F` キーで、ハンドメニューの表示ができた

![handmenu](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/89181506-dc35-ea59-4ddf-92d6d7ccfcdf.gif)

## キー操作がまとまっているページ

- キー操作については、以下にまとまっているが、すべてを理解、習得するのは根気が必要かもしれない

https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/mrtk3-input/packages/input/input-simulation

# 感想

- まだ全然触れていないが、MRTKのUIをマウスで操作しやすくなったのは、かなり開発が捗りそうだ
- （Input simulationで手を表示して、複雑な操作を行うのは、過去の話になるのかもしれない）

# おまけ（MRTK + HoloLens エンジニアの苦悩）

- MRTK + HoloLens で開発をはじめたとき、Input Simulationの操作方法を見て
  - 「この特殊操作、本当に覚えないといけないの？」と懐疑的であった
  - （HoloLensエミュレーターと操作方法が異なる点もあり）
- 開発していくなかで、Input simulationのありがたさを感じるようになり
  -  以下のような操作も簡単にできるようになった
  - 「左手を表示して」
  - 「左手の手のひらをカメラの方に向けて」
  - 「ハンドメニューを出して」
  - 「左手をラッチして」
  - 「右手を表示して」
  - 「右手の位置を奥側に移動して」
  - 「人差し指でハンドメニューのボタンを押す」
  ![tech](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/101d8794-7913-1342-ed2f-703faffbdec1.gif)
  - （MRTK3では、不要な技術になってしまったのかもしれない）

- 今後も、ビルドして実機でのテスト、Holographic Remoting Playerを使って実機でのテスト、Input Simulationで実際にボタンを押すテスト、ハンドメニューのボタンを押したことにするEditor拡張、UnitTestでのテストなどを使い分けて効率的にテストしていく


# 参考にしたサイト

https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/mrtk3-overview/
[jQuery]ヤッツィを作った

ヤッツィというゲームをブラウザでできるようにしてみた。
~~BGAでやればよくない？~~

【操作方法】
①「ダイスを振る」ボタンを押す（□□□□□に1～6の数がランダムに与えられる）
②ダイスを振りなおすかセクション（スコア）を決定するフェイズ
・スコアを決定する場合は「This Score」列のセルをクリックする
・ダイスを振りなおす場合は、ダイス（□）をクリックして選択した後、「ダイスを振る」ボタンを押す。
（ダイスを振りなおせるのは2回まで）
③上記を、全てのセクションが埋まるまで続ける（計13ラウンド）

<p class="codepen" data-height="810" data-default-tab="result" data-slug-hash="dydgVWq" data-user="yulianess23" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yulianess23/pen/dydgVWq">
  Yahtzee</a> by yulianess23 (<a href="https://codepen.io/yulianess23">@yulianess23</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


特に解説することもないですが、できるだけ判定を簡単に（わかりやすく）する工夫だけしたかった部分。

```javascript
var dice = [];
var sum = 0; // ダイスの合計値
var vals = [0, 0, 0, 0, 0, 0, 0]; // 各目の個数
var pair = [0, 0, 0, 0, 0, 0]; // ペアの数
$(".dice").each(function(i, e) {
    var v = $(e).text();
    sum += parseInt(v);
    vals[v]++;
    dice.push(v);
});
$.each(vals, function(i, v) {
    pair[v]++;
});
```

最初はPHPでやってたけどCodepenで表示させるためにjavascript化したのでやや冗長。
PHPだと以下。

```php
$sum = array_sum($dice);
$acv = array_count_values($dice);
$pair = [1=>0,2=>0,3=>0,4=>0,5=>0];
foreach ($acv as $v) $pair[$v]++;
```

また、ストレートの判定はパターン数が少ないのでソート＆重複削除でパターンと直接比較する等。
TECH CAMP 4日目　~HTML,Ruby on Rails~

# 学習内容
- HTML
　- `background-image`
- Ruby on Rails
　- テーブル、レコード、カラム
　- マイグレーション
　- モデル
　- コンソール
　- ActiveRecord



# 苦労したこと、改善
- 背景だけを透明にしたかったが、中身も透明になってしまっていた。
```html
<div class="main">
  <div class="text1">text1</div>
  <div class="text2">text2</div>
</div>
```
```css
.main{
/*CSSのbackground-imageにURLを入力して背景画像を表示させようとした。*/
backgorund-image:url();
opacity:30%;
}
```
背景だけでなく中身も透明になってしまうので、ウェブで調べてCSSをこのようにしました
```css
.main{
backgorund-image:url();
opacity:30%;
position:relative;
z-index:1;
}
.text1{
positioin:absolute;
z-index:2;
}
.text2{
position:absolute;
z-index:3;
}
```
しかし、変わらず中身も透明のままでした。（なぜうまくいかなかったのか調査中）
回答例を見ると
```html
<div class="main">
      <div class="hero">
<!--HTML内で画像を表示させていた-->
        <img class="image" src="hero.jpg">
　　　　　　　　　　　　　　　　<div class="items">
           <div class="text1"></div>
           <div class="text2"></div>
        </div>
      </div>
    </div>
```
```css
.hero{
positioin:relative;
}
.image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 30%;
}
.items{
position:absolute;
}
```
だいぶ端折ってますが、こんな感じでz-indexなど使わずにできていました。
改善：背景だからといってbackground-imageを使うしかないと思い込んでそれに執着していました。少し見方を変えて今知っている技術で応用できないかを考える。より柔軟なアイデアを出せるようにしたいと思いました。
React Nativeでエラーハンドリングする(SWRを使った方法)

今作っているサービスはExpoで開発しています。

今回は、Expo(ReactNative)でのREST APIにおいて、200番台以外のステータスコードが返ってきた時にエラーダイアログをユーザーに提示します。

こんな感じ(雑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/c1268eee-2fa4-bbc5-40b8-7ac347a59737.png)

## 使うもの
- axios@0.27.2
- SWR@1.3.0
- Expo 45

## 方法
`useSWR`をラップすることで、エラー時のイベントハンドラ(=`onError`)にエラー時の処理を書くことで、全リクエストのエラー時の処理を共通化できます。

*今回は、ヘッダーの付与はRecoilで保持しているJWTを参照するので、`header`も共通設定してます。

アクセストークンの付与は下記の記事を参考にしました。
https://zenn.dev/yuitosato/articles/b3b3d22accdaa3

fetcherはヘッダーを引数に取る関数にします。

```typescript
// useFetch.ts
export const useFetch = <T>(
  key: unknown[] | string,
  fetcher: (headers: AxiosRequestHeaders) => Promise<T>,
  config?: SWRConfiguration
): SWRResponse<T, Error> => {
  const { accessToken } = useAuth()
  // ヘッダー付与
  const headers = {
    Authorization: accessToken,
  }

  const configOption: SWRConfiguration = {
    shouldRetryOnError: false,
    // エラー時の共通処理
    onError: (e) => {
      console.error({ url: e.url, statusCode: e.status, message: e.message })
      Alert.alert(`データの取得に失敗しました: ${e.status}`)
      throw e
    },
    ...config,
  }
  return useSWR([headers, typeof key === 'string' ? key : [...key]], fetcher, configOption)
}


```

### axiosのエラーのハンドリングについて
axiosのバグなのか、よくわかりませんが、そのままだとステータスコードが取得できないので、カスタムエラーを投げるようにしてます。このIssueでも報告されてますが、なんだこれ？

https://github.com/axios/axios/issues/4311

```typescript
// axios.ts
export const axiosClient = axios.create({
  timeout: 3000,
  headers: {
    'Content-Type': 'application/json',
  },
})

axiosClient.interceptors.response.use(
  (res) => {
    return res
  },
  (e: AxiosError) => {
    const error = new Error(e.message)
    // NOTE: なぜかtoJSON()後でないとstatusがundefinedになってしまう(axiosのバグ？)
    error.status = e.toJSON().status
    error.url = e.config.url
    throw error
  }
)

```

## useFetchの使い方
普通のuseSWRと同様にuseFetchを使ってあげます。

エラー時はErrorオブジェクトが返ってくるので、コンポーネントごとのハンドリングも可能です。

```tsx
export const HomeScreen = () => {
  const { data, error } = useFetch('news', fetchArticles)
  return (
    <>
      {!data ? (
        <ActivityIndicator />
      ) : (
        <View>
          <FlatList
            data={data.articles}
            horizontal={true}
            renderItem={({ item }) => <CardItem item={item} />}
          />
        </View>
      )}
    </>
  )
}
```

まだ実装初期の段階なので、場合によってはStateで管理したほうがいいパターンもあるかもしれないし、react-boundaryを使う方法もありです
が、 [このような理由](https://ja.reactjs.org/docs/error-boundaries.html)で見送り中です(イベントハンドラ内のエラーがキャッチできないのがつらい)

https://github.com/carloscuesta/react-native-error-boundary

いい方法があったら教えてください。
リモートデスクトップを使用してデスクトップの高音質＆ノートPCで手軽にテレビを見る

# はじめに

めんどくさがりやななのたんです。

リモートデスクトップ機能を利用した、変な至福なテレビの視聴方法を紹介します

ちなみにABEMAやYoutube、VODサービス等でも同様のことは利用できます

:::note info
グラフィックカードの機能による著作権保護を利用しているテレビハードウェアでは
正しく視聴できません

それ以外にも正しく視聴できない例は存在すると思います
:::

# なぜこうしたの？

- 高音質化のハードルとして、光デジタルミキサーが非常に高価なため
- LANオーディオを目指そうとするも安易に導入しようとすると音声の遅延がひどいため

# 使用したもの

- IO-DATA GV-NTX2
- テレキングリモート＆テレキングプレイ
- ノートPC
- 高音質化した自作デスクトップWinProPC (NVIDA GTX-960、USB-SB、光デジタルオーディオ、ハイレゾ対応等）
- USB-Cから接続する外付けディスプレイ
- [MS製リモートデスクトップアプリ](https://apps.microsoft.com/store/detail/microsoft-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88-%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97/9WZDNCRFJ3PS?hl=ja-jp&gl=JP)

:::note info

仮想マシン重視のPCであるため、何気にグラフィックカードが古かったりします
:::

# 簡易的な配線経路

```video.txt
（アンテナ）
|
（GV-NTX2）
|
（デスクトップ）
|
（ノートPC）
```

```audio.txt
（アンテナ）
|
（GV-NTX2）
|
（デスクトップ）
|
（サウンドユニットやデジタルアンプ）
|
（スピーカー）
```

# リモートデスクトップの設定

従来のリモートデスクトップでも存在する設定ですが
リモートオーディオでなくホストオーディオで再生するだけです

# リモートデスクトップでテレビを見ると？
遅延やずれは存在しませんが、高音質を犠牲としてfpsが下がります

# リモートデスクトップを使うと更に楽になっていたこと

- デスクトップのディスプレイの位置を変える必要がなくなり、100%ごろ寝環境で楽に高音質に視聴できるようになった
- 切り替え可能なキーボードを利用しているものの、切り替えを一切意識する必要がなくなった

# 著作権についての注意

これは利用環境の向上を目的としており、著作権違法の助長を行っているわけではありません。
あえて公表しておきますが、これを利用することにより、テレビがキャプチャ可能になってしまいます。
個人で使用する録画する範囲超えた利用は決して行わないでください
【エラー解決/Rails/devise/Careywave】ArgumentError in Users::Registrations#edit【editでプロフィール画像をプレビュー表示させる】

## 初めに

deviseの編集ページで、プロフィール画像をプレビュー表示させる時に以下のエラーが出ました。


```
ArgumentError in Users::Registrations#edit
Can't resolve image into URL: undefined method `to_model' for #<ImageUploader:数字>
Did you mean?  to_xml
```
今後のため、解決方法を記録しておこうと思います。


## 使用したもの
Ruby on Rails
JavaScript
devise
Careywave(uploader)

## エラー内容
ArgumentError in Users::Registrations#edit
![スクリーンショット 2022-06-09 15.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655769/9ce25225-893f-25a9-c790-8fcf7a5266ea.png)

直訳
```
UsersのRegistrations#edit　　引数エラー

画像をURLに解決できません：＃<ImageUploader：0x00007fb52739e868>の未定義のメソッド `to_model'
もしかして？ to_xml
```

## 解決方法

こちらの記事を参考にさせていただきました。
<a href="https://mophie-blog.com/2020/08/24/argumenterror-in-usersindexin-rails-5-2/">エラー解決！「ArgumentError in Users#index」in Rails 5.2</a>

```erb
<%= image_tag current_user.image, id: :img_prev %> 
↓
<img src="<%= current_user.image %>" id ='img_prev'>
```


## 解決に辿り着くまで検証したこと

##### 以下はエラーにあった際の考え方です。ご興味がありましたらご覧ください！

```erb
1行目　　<% if current_user.image.present? %>
２行目　　<%= image_tag current_user.image, id: :img_prev %> #エラーが表示された箇所
```

:red_circle: データが格納されているか確認
→current_user.imageは正しく格納されている

:red_circle: １行目の「current_user」ではエラーが出ていないため、この記述はOK
→データは正しく格納されているので、表示方法に問題がある？

:red_circle: 表示方法について考える
・引数エラーということだったのでimage_tag以降の「current_user.image, id: :img_prev」をかっこで囲む
→文法エラーになる

:red_circle: uploaderに関する引数エラー、image_tagの表示方法を検索する
→そこで<a href="https://mophie-blog.com/2020/08/24/argumenterror-in-usersindexin-rails-5-2/">エラー解決！「ArgumentError in Users#index」in Rails 5.2</a>の記事を見つける

## 原因

image_tagの表示方法が異なっていたことでした。
以下の表記に変更したところ、ユーザーのプロフィール画像を編集ページに表示することができました。


```
<%= image_tag current_user.image, id: :img_prev %> 
↓
<img src="<%= current_user.image %>" id ='img_prev'>
```
Railsのバージョン違いによって表示方法が変わるようでした。

## まとめ

最後までご覧下さりありがとうございました。
エラーは学びが多いので、今後も解決するまでの過程を積極的に残していきたいと思います。

初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

こちらの記事がどなたかの参考になりましたら幸いです。
Reactでreact-burger-menuでの背面のスクロールを抑制する

## react-burger-menuライブラリ
Reactアプリに簡単にハンバーガーメニューを実装できるものらしいです。
↓公式のリンクを貼っておきます

https://github.com/negomi/react-burger-menu

## はじめに
react-burger-menuを使ってハンバーガーメニューを実装したが、メニューを開いている時にも背面がスクロールされてしまっています。
ライブラリの標準のonStateChangeプロパティを使ってメニューを開いている時だけスクロールを止めるようにした方法をメモします。


↓ハンバーガーメニュー開いてる時にスクロールすると、背面のbody要素もスクロールされちゃってきもちわるい
![sidebarnotwork.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364026/bad8956a-234b-8299-80ca-3bdbeadf17e5.gif)

## やりたかったこと
### ①メニューを開いているときに、背面のページをスクロールさせたくない
### ②メニューを閉じたらスクロールできる。

## どうやるか
・メニューを開いている　メニューを開いていないという状態をどうにか取得して

<dl>
  <dt>メニュー開いている時</dt>
  <dd>→body要素を固定</dd>
  <dt>メニュー開いてないとき</dt>
  <dd>→固定を解除</dd>
</dl>
ってすれば行けそうな感じがします。

幸い、今回使っているreact-burger-menuにはstate（状態）を渡してくれる標準のプロパティが用意されてたのでこれを使う。

## onStateChangeプロパティを使用
↓onStateChaneにコールバックを渡してその中でstateを受け取れるよう。

```js
var isMenuOpen = function(state) {
  return state.isOpen;
};

<Menu onStateChange={ isMenuOpen } />

```
:引用 https://github.com/negomi/react-burger-menu#state-change

## 要素の固定

これは、普通にoverflowプロパティに"hidden"を渡せばいけそう。
```css
overflow = "hidden"
```

## 要素の固定の解除
これは、overflowプロパティに"scroll"を渡せば戻る
```css
overflow = "scroll"
```


## 実装内容
stateの状況ごとにoverflowプロパティを更新する処理を、コールバック関数内に記述して、onStateChangeプロパティに渡しておく。

```js
  const isMenuOpen = (state) =>{
      //メニューが開いているとき
      if (state.isOpen) {
        document.body.style.overflow = "hidden";
        return () => {
          document.body.style.overflow = "auto";
        }
      }

     //メニューが開いていないとき
      document.body.style.overflow = "scroll";
      return () => {
        document.body.style.overflow = "auto";
      }
  }

return (
    <Menu onStateChange={ isMenuOpen } />
)
```

## 終わりに
ハンバーガーメニューを開いる状態でスクロールしても要素が動いていないことが確認できました。

![sidebarwork.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364026/364ff65c-030c-1efb-ca09-a12eacf080e2.gif)