OmniAICreator/Qiita-1.07M huggingface dataset:
Specification of Ethernet State Manager, No.415, AUTOSAR 21-11 (194) CP

Specification of Ethernet State Manager, No.415, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/classic/21-11/AUTOSAR_SWS_EthernetStateManager.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|:--|
|API |Application Program Interface
|BSW |Basic Software
|BswM |Basic Software Mode Manager
|ComM |Communication Manager
|DEM |Diagnostic Event Manager
|DET| Default Error Tracer
|EcuM |ECU State Manager
|Eth| Ethernet Controller
|EthTrcv |Ethernet Transceiver
|EthSM |Ethernet State Manager
|EthIf| Ethernet Interface
|SchM |BSW Scheduler
|SoAd |Socket Adapter
|OA |TC10 Open Alliance TC10 specification (see [19])
## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] AUTOSAR General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] Specification of AUTOSAR COM
AUTOSAR_SWS_COM.pdf
[5] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[6] Specification of Communication Stack Types
AUTOSAR_SWS_CommunicationStackTypes.pdf
[7] Specification of Communication Manager
AUTOSAR_SWS_ComManager.pdf
[8] Requirements on Mode Management
AUTOSAR_SRS_ModeManagement.pdf
[9] Basic Software Module Description Template
AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[10] Specification of the Ethernet Interface
AUTOSAR_SWS_EthernetInterface.pdf
[11] Requirements on Ethernet in AUTOSAR
AUTOSAR_SRS_Ethernet.pdf
[12] Specification of Standard Types
AUTOSAR_SWS_StandardTypes
[13] Specification of Diagnostic Event Manager
AUTOSAR_SWS_DiagnosticEventManager.pdf
[14] Specification of Default Error Tracer
AUTOSAR_SWS_DefaultErrorTracer.pdf
[15] Specification of Basic Software Mode Manager
AUTOSAR_SWS_BSWModeManager.pdf
Specification of Ethernet State Manager
AUTOSAR CP R21-11
10 of 55 Document ID 415: AUTOSAR_SWS_EthernetStateManager
[16] Specification of Basic Software Mode Manager
AUTOSAR_SWS_SocketAdapter.pdf
[17] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[18] Specification of TcpIp module
AUTOSAR_SWS_TcpIp.pdf
[19] OPEN ALIANCE Sleep/Wake-up Specification Version 2.0 (Rel Feb 21, 2017),
http://www.opensig.org/Automotive-Ethernet-Specifications/
Requirements on I-PDU Multiplexer, No.181, AUTOSAR 21-11 (193) CP

Requirements on I-PDU Multiplexer, No.181, 2-21-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SRS_IPDUMultiplexer.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|:--|
|contained I-PDU| I-PDU being transported inside a Container I-PDU
|Container I-PDU |I-PDU serving as the Container collecting several I-PDUs to be transported together (e.g. in one frame)
|dynamic part |According to the value of the selector field some parts of the I-PDU have a different layout. These parts of the I-PDU that can contain different signals are called dynamic part. The dynamic part must not necessarily be contiguous.
|Multi-PDU-to-Container Mapping |Multi-PDU-to-Container Mapping means using the same Container I-PDU with more than one contained I-PDU. To be able to recognize each I-PDU at reception a header containing an ID and the length is placed in front of each contained I-PDU.
|multiplexed I-PDU I-PDU |multiplexing means using the same PCI of an I-PDU with more than one unique layout of its SDU. A selector field is a part of the SDU of the multiplexed I-PDU. It is used to distinguish the different layouts of the multiplexed I-PDUs from each other
|PCI |"Protocol Control Information" A description can be found in AUTOSAR_EXP_LayeredSoftwareArchitecture [3].
|PDU |"Protocol Data Unit" A description can be found in AUTOSAR_EXP_LayeredSoftwareArchitecture [3].
|PduR |Module that transfers I-PDUs from one module to another module. The I-PDU Router can be utilized for gateway operations and for internal routing purposes.
|SDU |"Service Data Unit" A description can be found in AUTOSAR_EXP_LayeredSoftwareArchitecture [3].
|selector field |The selector field is part of a multiplexed I-PDU. It consists of contiguous bits. The value of the selector field selects the layout of the multiplexed part of the I-PDU.
|static part| Some parts/signals of the I-PDU may be the same regardless of the selector field. Such a part is called static part. The static part must not necessarily be contiguous.

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Standardization Template
AUTOSAR_TPS_StandardizationTemplate
[2] Glossary
AUTOSAR_TR_Glossary
[3] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture
[4] Specification of Communication
AUTOSAR_SWS_COM
[5] Requirements on AUTOSAR Features
AUTOSAR_RS_Features
[cURL] PHPにてAWSから外部へPOSTする

CRMシステムのHubSpot導入にあたり社内システムで活用しているAWSから売上実績を定期的にHubSpotへAPIで投げる案件があり、Node.jsで仕組みを作った矢先、導入環境に合わず（？）phpで書くことに。phpでバックエンドと思ったものの案外すっきり出来たので、忘れないうちに~~メモ書き~~投稿。

# MySQLへの接続

mysqlに接続。そして取ってきたデータをAPI用の配列にプッシュ。HubSpotのAPIは10件/回の上限のため10件に達したらAPIで投げるようにする。

```PHP:php
<?php
    $cn252 = new mysqli("****.rds.amazonaws.com", "user", "password", "db");
    if ($cn252->connect_error) {
        echo $cn252->connect_error;
        exit();
    } else {
        $cn252->set_charset("utf8");
    }

    $sql = "SELECT...";
    $rs = $cn252->query($sql);

    $ary = []; //返り値を格納
    $c = 1;

    while ($item = $rs->fetch_array()) {
      $ary[] = array('id'=> $item['contact_id'],'properties'=> array('col'=> $item['val']));  
      if($c % 10 == 0){
        Hs_update($ary);
        $ary = [];          
      }    
      $c++;
    }

    if($c % 10 != 0) Hs_update($ary);

```

# cURLにてAPIへデータを投げる

cURLはphpの関数を使ってセットして終了。
JSONの成型といい、1行1行書いてPOSTするなどjsとの違いに少し苦戦。

```PHP:php
    function Hs_update($ary){       
        $data_json = json_encode(array('inputs'=> $ary));
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_URL, 'https://api.hubapi.com/crm/v3/objects/contacts/batch/update?hapikey=<APIKEY>');
        $result=curl_exec($ch);
        echo 'RETURN:'.$result;
        curl_close($ch);        
    }
```

# PHPにてcURLでGETする方法

今後の参考にGETする方法も出来るようにしておく。

```PHP:php
<?php
$url="https://api.hubapi.com/crm/v3/objects/contacts?limit=10&archived=false&hapikey=<API KEY>";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
$result = json_decode($response,true);

for($i = 0; $i < count($result['results']); $i++){
    echo $result['results'][$i]["id"] . "<br>\n";
}

curl_close($ch);

```

配列の中に配列があり所定の値を取るのに苦戦したものの、HubSpotの顧客情報を取得する方法が出来て一先ず安心。
Specification of Wireless Ethernet Driver, No.798, AUTOSAR 21-11 (192) CP

Specification of Wireless Ethernet Driver, No.798, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_WirelessEthernetDriver.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# 用語(terms)

|Term|Description|
|:--|:--|
|FCS| Frame Check Sequence
|EthIf| Ethernet Interface (AUTOSAR BSW module)
|Eth |Ethernet Driver (AUTOSAR BSW module)
|ISR |Interrupt Service Routine
|MCG |Module Configuration Generator
|WEth| Wireless Ethernet Driver (AUTOSAR BSW module)
|WEthTrcv| Wireless Ethernet Transceiver (AUTOSAR BSW module)


## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] AUTOSAR Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[2] AUTOSAR General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[3] AUTOSAR General Specification for Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[4] Specification of Communication
AUTOSAR_SWS_COM.pdf
[5] Specification of Ethernet Interface
AUTOSAR_SWS_EthernetInterface.pdf
[6] Specification of Wireless Ethernet Transceiver
AUTOSAR_SWS_WirelessEthernetTransceiverDriver.pdf
[7] Specification of ECU State Manager
AUTOSAR_SWS_ECUStateManager.pdf
[8] Specification of Ethernet Driver
AUTOSAR_SWS_EthernetDriver.pdf
[9] BSW Scheduler Specification
AUTOSAR_SWS_Scheduler.pdf
[10] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[11] Specification of Memory Mapping
AUTOSAR_SWS_MemoryMapping.pdf
[12] Specification of Standard Types
AUTOSAR_SWS_StandardTypes.pdf
[13] Specification of Default Error Tracer
AUTOSAR_SWS_DefaultErrorTracer.pdf
[14] Specification of Diagnostics Event Manager
AUTOSAR_SWS_DiagnosticsEventManager.pdf
[15] Requirements on Vehicle-2-X communication
AUTOSAR_SRS_V2XCommunication.pdf
Specification of Wireless Ethernet Driver
[16] IEC 7498-1 The Basic Model, IEC Norm, 1994
[17] IEEE 802.11-2012
[18] Intelligent Transport Systems (ITS); Harmonized Channel Specifications for Intelligent Transport Systems operating in the 5 GHz frequency band between access layer and network and transport layer ETSI TS 102 724 V1.1.1 (2012-10)

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　20220527
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【PHP】ファイルのアップロード方法

PHPを学習中です。
ファイルのアップロード方法について、備忘録として残します。

### 1. 【HTML側での処理】データ送信フォームを作成する

```php:form.php
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>HTML内でのPHP処理</title>
</head>
<body>
<form enctype="multipart/form-data"  action="upload.php" method="POST">
<input type="hidden" name="name" value="value" />
アップロード: <input name="user_file_name" type="file" />
<input type="submit" value="ファイル送信" />
</form>
</body>
</html>
```

上記コードを記述すると、このように表示されます。

![スクリーンショット 2022-05-27 16.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/1e78bfda-486e-a3f8-2a87-c9664923f4f2.png)

#### ポイント
・enctype=”multipart/form-data”によりデータのエンコード（暗号化）を行います。
[（参考）multipart/form-dataとは](https://www.yoheim.net/blog.php?q=20171201)
・actionでPHPのURLを指定することで、指定したURLに対してformの送信を行います。
・type=”hidden”と書くことで、送信の際に入力内容を表示させないようにします。
・name=”name”で指定したname属性を持つ、value=”value”の値を送信します。
・input name=”userfile”で、アップロードしたいファイルをname属性で指定しています。
・type=”file”で、ファイルをアップロードすることを指定しています。



### 2. 【PHP側での処理】アップロードされたファイルを本来格納したい場所へ移動させる




```php:upload.php
<?php
$temporary_file = $_FILES['user_file_name']['tmp_name']; # 一時ファイル名
$true_file = $_FILES['user_file_name']['name']; # 本来のファイル名

# is_uploaded_fileメソッドで、一時的にアップロードされたファイルが本当にアップロード処理されたかの確認
if (is_uploaded_file($temporary_file)) {
    if (move_uploaded_file($temporary_file , $true_file )) {
        echo $true_file . "をアップロードしました。";
    } else {
        echo "ファイルをアップロードできません。";
    }
} else {
    echo "ファイルが選択されていません。";
}
var_dump($true_file);
?>
```


#### ポイント
・アップロード自体は、PHPスクリプトが呼び出された時点で終わっており、既にファイルとしてサーバ上に存在しています。
・ただし、存在すると言っても、サーバ上の一時的な場所に保管されているだけなので、このファイルを本来格納したい変数に移動させる必要があります。
・PHPでは＄_FILES[]にアップロードされたファイルに関する各種データが入る仕組みになっています。
・ファイル名は、inputタグの方で付けたuser_file_nameなので、$_FILES[user_file_name]となります。
・＄_FILESは連想配列です。
・一時的にサーバ上に保管されているファイル名は「tmp_name」とルールで決められています（tmpはtemporaryの略です）。
・同じく本来のファイル名は「name」とルールで決められています。
・「tmp_name」の中身を「name」に移動させることで、ファイルの移動ができます。



### 3. 実際にファイルをアップロードしてみる

![スクリーンショット 2022-05-27 17.19.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/6b0f8f44-b20d-9c03-35c7-c7fbd3f7eca8.png)

ファイルをアップロードさせることができました。
またvar_dumpの結果もしっかり出力されています。
Unity ビルド エラー解消 System.ComponentModel.Win32Exception (2): No such file or directory

# 結論
1. Python 2.7 を install
1. PreBuildProcessing にて python にパスを通す

# 環境
- macOS Monterey 12.4
- Unity Editor 2020.3.26f1

# 手順
## 1. Python 2.7 を [install](https://www.python.org/downloads/macos/)
インストラーにしたがってボタンを押してくだけ
https://www.python.org/downloads/macos/

## 2. PreBuildProcessing にて python にパスを通す

プロジェクト内に以下のスクリプトファイルを配置

```
#if UNITY_EDITOR_OSX
using UnityEditor;
 using UnityEditor.Build;
 using UnityEditor.Build.Reporting;
 using UnityEngine;
 
 public class PreBuildProcessing : IPreprocessBuildWithReport
 {
     public int callbackOrder => 1;
     public void OnPreprocessBuild(BuildReport report)
     {
         System.Environment.SetEnvironmentVariable("EMSDK_PYTHON", "/Library/Frameworks/Python.framework/Versions/2.7/bin/python");
     }
 }
#endif
```

以上で解消しました。

# 参考

https://answers.unity.com/questions/1893328/getting-systemcomponentmodelwin32exception-2-no-su.html

# 考察
- 多分、macOS のバージョンを上げたことで、 python 2.7 が消えた。 
- Unity Editor がなんらかの形で python 2.7 を参照しているのでエラーがでた。
- ので手動でインストールしてそのパスを教えて上げた

ちなみに windows 機のほうではとくに問題なくビルドしたので、 mac の環境依存なのは間違いなさそうです。

※ もしかして別に 2.7 じゃなくてもパスさえ通せば 3系でもいいのだろうか ... :thinking:
URIとは

# URI(記述法）
情報やデータといったリソースを識別するための記述法
コンピュータが扱うリソースの他に人、会社、書籍をリソースで表すことができる。
```リソースが存在する場所```を表したものを```URL```という。
場所の情報の他にリソースを取得する方法が記述されている。
Webサイトの場所を示す際に利用されている。
URIのうち場所は問わず```リソースの名前```を示すものを```URN(Uniform Resource Name)```という。
ISBNコードなどを使ってURNを記述できる。
```
https://guides.rubyonrails.org/getting_started.html
```
URIでリソースを特定する。
```
https:
```
スキームという。
# リクエストURI
URIはリクエスト行のメソッドに続いて記述され、```リクエストURL```と呼ばれる。
リクエストURIにはURIを全て含める```絶対URI形式```とURIの一部を含める相対URI形式がある。
```
https://guides.rubyonrails.org/getting_started.html
```
URIでリソースを特定する。

# パーセントエンコーディング
利用できur文字は定められている。
それは予約文字と非予約文字だ。
予約文字とは特定目的で用いるため予約されている。
なのでその目的以外は使えない。
逆に非予約文字とは数字、アルファベットなどのこと。
これらは自由にURIに使える。
非予約文字でも予約文字でもない文字をURIに使用するときは```パーセントエンコーディング```と呼ばれる方法を用いてその文字を変換する必要がある。
表示できない文字のため１６進数に変換する。
```%xxx```というふうになる。

googleで"あいうえお"と検索
それをコピーすると
```
https://www.google.com/search?q=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A&rlz=1C5CHFA_enJP937JP937&sxsrf=ALiCzsazjEP8nCZruG3ajBTGdsDtkxBUDg%3A1653638461921&ei=PYWQYpOfN5fG2roPh8ejoAQ&ved=0ahUKEwjTse-om__3AhUXo1YBHYfjCEQQ4dUDCA4&uact=5&oq=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A&gs_lcp=Cgdnd3Mtd2l6EAMyBwgAEIAEEAQyDQgAEIAEELEDELEDEAQyBwgAEIAEEAQyEwgAEIAEELEDEIMBELEDEIMBEAQyDQgAEIAEELEDELEDEAQyBwgAEIAEEAQyEwgAEIAEELEDEIMBELEDEIMBEAQyBwgAEIAEEAQ6BwgjEOoCECc6BAgjECc6DQgAEIAEELEDEIMBEAQ6CggAEIAEELEDEAQ6EQgAEIAEELEDEIMBELEDEIMBOgoIABCxAxCxAxBDOhAIABCxAxCDARCxAxCDARBDOgQIABBDOgcIABCxAxBDSgQIQRgASgQIRhgAUJYGWM0QYJMhaAFwAXgAgAGZAYgBiAWSAQMwLjWYAQCgAQGwAQrAAQE&sclient=gws-wiz
```
わからないが```%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A```が"あいうえお"をエンコーディングで表しているのではないか？
UniTaskのTaskをキャンセル

# UniTaskでTaskをキャンセルする


```C#
using UnityEngine;
using System.Threading;
using Cysharp.Threading.Tasks;

class Hoge{
private CancellationTokenSource _cts;
private CancellationToken _ct;
private int num = 0;

async void Start(){
//CancellationTokenSourceのインスタンスを生成
_cts = new CancellationTokenSource();
//_ctsのTokenを生成
_ct = _cts.Token;
//引数でTokenを渡す
num = await GetInt(_ct);
Debug.Log(num);
}

private async UniTask<int> GetInt(CancellationToken cancellationToken = default)
{
    //他のメソッドの処理を待つ
    await UniTask.WaitWhile(() =>
    {
        //キャンセルの処理
        cancellationToken.ThrowIfCancellationRequested();
        //ReturnBoolInMethodからTrueが返ってきている間はWhileを実行する
        return ReturnBoolInMethod();
    });
    return 1;
}

private void Cancel(){
//Cancelのメソッドを実行すると今実行しているタスクをキャンセルできる
_cts.Cancel();

//キャンセルTokenを再生成することで複数回キャンセルすることができる
_cts = new CancellationTokenSource();
_ct = _cts.Token;
}
```
PyTorch : CUDAのメモリ不足によるエラーを解決する

作成日：20210313
言語：Python
記事の用途：自分用メモ

## 概要
CUDAのメモリ不足に関連するエラーで時間を取られることが何度かあったので、未来の自分のために解決方法をまとめておく。

### エラーメッセージ例

```code:
RuntimeError: CUDA error: out of memory.
```


## 環境

環境：
Python 3.6.10 :: Anaconda, Inc.
PyTorch Version:  1.7.1
Torchvision Version:  0.8.2

GPU：
NVIDIA-SMI 430.34
Driver Version: 430.34
CUDA Version: 10.1

※ Google ColaboratoryからローカルGPUのランタイムに繋げて使っている。

## トラブルシューティングの前に

メモリ使用率を確認するには、

```code:
nvidia-smi
```
の出力をみる。


## 対処法
### 対処法1.　まずはランタイムを再起動しよう

解決する時は、まずはランタイムを再起動してみる。大体これで直る。
特に、今まで問題なく回っていたのに、ある時

```code:
RuntimeError: CUDA error: out of memory.
```

と出てきたら、何かの操作でメモリが埋まってしまった可能性がある。
再起動後、もう一度 `nvidia-smi` で確認して、メモリが空いていたら、この時点で解決。

私は再起動をせずにネット記事を漁り始め、半日を無駄に潰しました。


### 対処法2.　プロセスを消す

何らかの事情でランタイムの再起動ができない場合や、再起動してもメモリが解放されなかった場合は、`kill`コマンドでメモリを圧迫しているプロセスを消す。

```code:
kill [PID]
```
　

メモリ解放については下の記事を参照した。

https://qiita.com/miyamotok0105/items/033b850a205f958808e9

https://www.think-self.com/machine-learning/pytorch-out-of-memory/

`kill`コマンドについては下の記事を参照した。

https://eng-entrance.com/linux-command-kill




## エラー発生場所の具体例

### 具体例1.　torchinfo.summary() で RuntimeError

```python:error_torchinfo_summary.py
from torchinfo import summary
summary(model, (1, 3, 224, 224))
```

でCUDAのRuntimeErrorが出た。

```code:
summary(model)
```

とinputを指定せずに実行するとエラーは出ない。
次に、GPUを介さなければ良いだろうと考えて、

```code:
summary(model.to('cpu'), (1, 3, 224, 224))
```

とやってみたが、『CUDAの』RuntimeErrorが出る。→ ん？？？

どうやら、`torchinfo.summary`は、問答無用でモデルをGPU上に移動させているらしい。加えて、複数のGPUが利用可能な場合でも、1枚目のGPU上で動作するらしい。たとえば、

```code:
summary(model.to('cuda:2'), (1, 3, 224, 224))
```

のように、メモリ空いているGPUの番号を指定しても、指定したGPUには入っていない模様。

（おそらくtorchinfoにはGPUを細かく指定するオプションが存在するのだと思う。
しかし、私はここまで分かったところで上記の「ランタイムを再起動」して1枚目のメモリを空けた。そして解決した。したがって、torchinfoの詳細については調べていない。）

torchinfo.summaryについては下の記事を参照した。

https://qiita.com/tand826/items/ae3349495944048fd120

### 具体例2.　model.load_state_dict() で RuntimeError

```code:
model.load_state_dict(torch.load(modelname))
```

でcudaのランタイムエラーが出た時は、モデルがCPUで保存してあることを確認する。

モデルをGPUで保存してしまうと、読み込みの時にGPUのメモリを経由するので、メモリが足りなくなる場合がある。この問題を回避するために、モデルの保存時に、cpuに下ろしてから保存しておくと良いらしい。


model.load_state_dict()については下の記事を参照した。

https://katakori3.hatenablog.com/entry/2021/02/01/132525


## 備考
::: note warn
作業時に記録をきちんと残していなかったので、エラーメッセージや解決の流れ等、不正確な記述があると思われる。ご留意されたい。
:::

また、賢者の皆様からのコメント・訂正等も歓迎します。



## 参考リンク（再掲）
1. 対処法2、プロセス消去について
1-1. `kill`コマンドでメモリ解放
https://qiita.com/miyamotok0105/items/033b850a205f958808e9 
https://www.think-self.com/machine-learning/pytorch-out-of-memory/ 
1-2. `kill`コマンドの説明
https://eng-entrance.com/linux-command-kill 

2. エラーの具体例について
2-1. `torchinfo.summary()`について
https://qiita.com/tand826/items/ae3349495944048fd120
2-2. `model.load_state_dict()` 時のRuntimeErrorについて
https://katakori3.hatenablog.com/entry/2021/02/01/132525

## 更新履歴
20220713 `kill`コマンドを用いたメモリ解放について、記述を追加しました。また、見出しを整理しました。
Oracle Analytics Cloud 予測機能～誰にも聞けない基礎の話～　その２

皆さんこんにちは。
その１では、Oracle Analytics Cloud にあらかじめ搭載されている３つのモデルの結果の違いについて画面ショットで見ていきました。
今回はもう少し掘り下げて、見ていきたいと思います。

Oracle Analytics Cloud についている予測のモデルはいったいどんなもの？
季節性ARIMA/ARIMA/ETSと予測に種類があるようだけれどこれはいったい？
と疑問符がついている方がいると思います。それぞれ、モデルの違いについて検索してみると

ARIMAは、自己回帰和分移動平均モデルの略 
ETSは、指数トリプルスムージングの略

既に何語を話しているのかわからない。。。もうくじけそうです。
回帰？聞いたことある。自己？和分？移動平均はなんとなくわかる。
指数トリプルスムージング？何言ってるの？

はっきり言って、機械学習のモデルの検索をすると、めちゃくちゃ難しく解説してある情報は検索するとたくさん出てきます。読み方を忘れたような数式もたくさん専門用語で開設されています。
大学で勉強した人は分かるのでしょうが、サイトを読んでも一行ごとに理解不能な言葉が出てきます。
そこで、一つ一つ紐解いていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/e451a8bd-4e0e-2a3b-4aca-e738c1826a76.png)

早速、一行目の回帰分析でつまづきました。
回帰分析は、Excelなどでもできますが、求めたい要素の値に対し、他の要素がどの程度影響を与えているかを分析する手法です。売上の予測など、様々な場面で活用されます。

分かったような、分からないようなと思ったので色々検索すると埼玉県のホームページにとてもわかりやすいサンプルが掲載されていました。

求めたい要素：体重
他の要素：身長
というように身長がどの程度体重に影響を与えているかを解析する手法ということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/34247a31-197a-d193-bef1-7b16d632e44f.png)
出典：埼玉県のホームページ
https://www.pref.saitama.lg.jp/a0206/toukeifaq/q7-1.html

少し長くなってきたので今回はこの辺りで終了します。もう少し頑張りましょう！
【Unity】【VSCode】トラブルまとめ

**Unity** + **Visual Studio Code**(以下**VSCode**) にて
たまーにトラブルが起こり、そのたびに調べるのですが、イマイチ情報が出てこないものがあったので情報をまとめています。
また、何かあるたびに追記していく予定です。

# インテリセンスが効かなくなった
## 問題の内容
例えば、"game"まで入力したのに"gameObject"と出てこない。
<img width="300" alt="not_working_intellisense.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649407/9ec1d5c4-4980-5ac5-4d57-d603295c6aa4.jpeg">

## 解決方法
検索したらいろいろ出てくるのですが、自分の調べではパッと出てこなかったことを紹介。
### その1
まずは**OmniSharp**のログを確認しましょう。
下画像のように **表示** → **出力** を選んでログ出力ウィンドウを開きます。
<img width="300" alt="show_output.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649407/9f8e3989-198a-b9e1-30ac-8d2e2ac09f57.jpeg">
↓のようなウィンドウが出現するはず。
<img width="300" alt="output_default.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649407/e7e42bd1-d053-ed43-fdd2-93b9893c6f55.jpeg">

「**タスク**」となっているところ(_もしかしたら人よっては違うかも_)をクリックして
「**OmniSharp Log**」に変更。
<img width="300" alt="output_change_omnisharplog.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649407/5fc7fb73-6e29-6aa0-596b-3b75122fafc5.jpeg">

入ってる.NETのバージョンが低いので高いの入れてね的な事を言われてます。
<img width="300" alt="output_omnisharplog.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649407/13ba5a37-dfb3-b4b9-db9e-095c704c29bd.jpeg">

ということで↓から **.NET SDK** の **6.0.1** の **最新(SDK 6.0.101)** をインストール
※ とりあえずログに出ている最低バージョンにした。
https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0

はい、出ました。
<img width="300" alt="working_intellisense.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649407/945ac2a1-1f3a-a6fe-af5e-f231dbfb94b5.jpeg">
もしかしたらUnityやVSCodeをいったん閉じないといないかもしれないです。
自分はSDKのインストール前に閉じてました。

以上

### その2
パッケージマネージャから **Visual Studio Code Editor** をアップデートしたら直る時もありました。
<img width="300" alt="vscode_editor_update.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649407/16780f91-6bce-526a-4303-ce9fbd032e9b.jpeg">

以上
Brave で .eth ドメインは https には対応していない?

Brave でいつのまにか .eth ドメイン直打ちでアクセスできるようになっていました
(Cloudflare 経由)

http://lighttransport.eth/

http://vitalik.eth/

が, brave で直接見れます. :tada:

## https はまだ...?

![Screenshot from 2022-05-27 16-28-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/2b5fec89-c5a2-fa37-99a6-993a7e0bdce5.png)


ただ, https アクセスには対応していません.
eth ドメインによっては, 証明書 warning が出ます.

`lighttransport.eth` は warning 出ました :cry:
(`vitalik.eth` は人気があるためか, 証明書 warninig から除外されているっぽい)


.eth.link 経由ですと, https で繋がります.
【Nuxt.js】DockerやNginxを使用した開発でもホットリロードを行う

# この記事について
Nuxt.jsで開発中、Nuxt.jsのみの開発ではホットリロードが自動でできるようになっているかと思いますが、DockerやNginxを使用するとホットリロードできなくなる場面がありましたので、対処法を記載したいと思います。

# 環境
|内容|バージョン|
|---|---|
|node|16.14.2|
|nuxt|2.15.8|

# 結論
`nuxt.config.js` や環境変数に以下を追加したことろうまく動作しました。

```nuxt.config.js
export default {
  // これでDockerやNginx使用時でもserverMiddleware以外はホットリロード可能となりました（実際にはポーリングによって定期的にソースの変更チェックを行っている）
  watchers: {
    webpack: {
      ignored: /node_modules/,
      poll: true,
    },
  },
}
```

以下の環境変数の追加によってserverMiddleware側もホットリロード可能となりました。

```.env
CHOKIDAR_USEPOLLING=true
```

# 参考
[Nuxt - The watchers property](https://nuxtjs.org/docs/configuration-glossary/configuration-watchers/)
[Next.js + Docker 開発で Hot Reload を有効化する](https://www.ikkitang1211.site/entry/2020/10/11/213824)
locについて

locは行と列のラベルを指定

DataFrameオブジェクト.loc['行ラベル’,'列ラベル’]

例をいくつか挙げる。
コロナウイルスへの４つの試験薬がある。その試験薬を用いるときに陽性、陰性をそれぞれダミー変数とし、陽性を１，陰性を0とおく。

②試験薬(T1,T2,T3,T4)と結果(陰性陽性)

T1=[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0]
T2=[0,0,1,1,0,1,0,1,1,0,1,1,0,0,1,0]
T3=[1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,1]
T4=[1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0]
r=[1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0]

data2={'T1':T1,'T2':T2,'T3':T3,'T4':T4,'result':r}

df2=DataFrame(data2)
df2
---------------------------------------------


	T1	T2	T3	T4	result
0	1	0	1	1	1
1	1	0	1	1	1
2	1	1	1	1	1
3	1	1	1	0	0
4	1	0	1	0	0
5	1	1	0	1	0
6	1	0	0	1	0
7	1	1	0	1	0
8	0	1	0	1	1
9	0	0	1	1	1
10	0	1	0	1	1
11	0	1	0	1	1
12	0	0	0	1	1
13	0	0	1	0	0
14	0	1	0	0	0
15	0	0	1	0	0

----------------------------------------------
X=df2.loc[:,'T1':'T4'].values # DataFrameオブジェクト.loc['行ラベル’,'列ラベル’]
Y=df2['result'].values        #DataFrameオブジェクト.loc['行ラベル’,'列ラベル’]

Xの場合
行ラベル、つまり、今回でいうと0~15
列ラベル、つまり、T1~T4までを選択している。注意　’T1’:'T2':'T3':'T4'←これは誤り（：の記号は～の意味を表すので誤り）
Javaでnullのフィールドをレスポンスに表示

調べてもすぐ出てこなかったのでメモ。

表示させないようにするのはこちらですが…

```
@JsonInclude(JsonInclude.Include.NON_EMPTY)
```

nullや空文字でも表示させたいときはこう書く。

```
@JsonInclude(JsonInclude.Include.ALWAYS)
```
【PHP】fgetcsv()関数でCSVを読み取る方法

PHP7技術者認定初級試験に向けて学習中の身です。
備忘録として残します。

### 1. csvファイルを作成

```php:sample.csv
1,"りんご,バナナ",フルーツ
2,オレンジ,フルーツ
```

fgetcsvを使えば、こうしたCSVのデータを配列として読み込むことができます。
まずは1行だけ読み込む方法から。
読み込んだ値をvar_dump関数で出力します。

### 2. newfile.phpファイルを作成

```php:newfile.php
<?php
$fp = fopen("sample.csv", "r");

$data = fgetcsv($fp);
var_dump($data);

fclose($fp);
?>
```

### 3. 実行結果(コンソール)

```
array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(19) "りんご,バナナ"
  [2]=>
  string(12) "フルーツ"
}
```
1行目のデータがカンマ区切りで配列として出力されました。
でも1行目のデータだけ出力できても困ります。
そこで次に全てのCSVデータを読み取って出力する方法を書いていきます。
方法としては、while文でCSVのデータを1行ずつ繰り返し読み取ります。

### 4. newfile.phpファイルを修正

```php:newfile.php
<?php
$fp = fopen("sample.csv", "r");

# テーブルタグを作成し、テーブルヘッダーで見出しを作る
echo '<table border="1">
      <tr>
      <th>ID</th>
      <th>フルーツ</th>
      </tr>';

# while文でCSVファイルのデータを1つずつ繰り返し読み込む
while($data = fgetcsv($fp)){
    // テーブルセルに配列の値を格納
    echo '<tr>';
    echo '<td>'.$data[0].'</td>';
    echo '<td>'.$data[1].'</td>';
    echo '</tr>';
}

# テーブルの閉じタグ
echo '</table>';

fclose($fp);
?>
```

ブラウザで表示してみます。

### 5. ブラウザで表示

![スクリーンショット 2022-05-27 15.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/ff4ef201-9806-cb2c-937f-b317050935be.png)

このように全てのCSVデータを配列として読み取り、テーブルで整えて表示させることができました。
CBL-Mariner/Linux にアクセスしてみる

CBL-Mariner/Linux というのは、Microsoftが作ってるLinuxディストリビューションのこと。

そしてWSL2の本体はCBL-Mariner/Linux。

普通にWSLにアクセスすると、WSL上にインストールされたディストリビューション（Ubuntuととか）にログインすることになるけど、以下のオプションでCBL-Mariner/Linuxにアクセスできる。

```
wsl --system
```

OSのディストリビューションを確認してみる。

```
$ cat /etc/os-release
NAME="Common Base Linux Mariner"
VERSION="1.0.20210224"
ID=mariner
VERSION_ID=1.0
PRETTY_NAME="CBL-Mariner/Linux"
ANSI_COLOR="1;34"
HOME_URL="https://aka.ms/cbl-mariner"
BUG_REPORT_URL="https://aka.ms/cbl-mariner"
SUPPORT_URL="https://aka.ms/cbl-mariner"
```

普段はCBL-Marinerにアクセスすることはないけど、CBL-Mariner側でしか起動してないプロセスもある。
uncompyle6 change recursionlimit

in installed python sub folder "Lib\site-packages\uncompyle6\bin"
modify uncompile.py from:
```
if __name__ == '__main__':
    main_bin()
```
to:
```
if __name__ == '__main__':
    sys.setrecursionlimit(10000)
    print("Python Recursive Limitation = ", sys.getrecursionlimit())
    main_bin()
```

python -m uncompyle6.bin.uncompile  -o . ui.pyc
VPCフローログ調査Athena

* DATABASE作成
* TABLE作成
* PARTITION作成
後、以下

```
SELECT
  from_unixtime(starttime, 9, 0) AS starttime_jst,
  from_unixtime(endtime, 9, 0) AS endtime_jst,
  interfaceid,
  sourceaddress,
  destinationaddress,
  sourceport,
  destinationport,
  protocol,
  numpackets,
  numbytes,
  action,
  logstatus,
  sublocationtype
FROM <DATABASE>.<TABLE>
WHERE <PARTITION>
AND (sourceaddress = '<IP>' OR sourceaddress = '<IP>') 
AND destinationaddress = '<IP>'
AND from_unixtime(starttime, 9, 0) >= cast('2099-12-31 12:12:12 +09:00' as timestamp with time zone)
AND from_unixtime(starttime, 9, 0) <  cast('2099-12-31 12:12:12 +09:00' as timestamp with time zone)
ORDER BY starttime;
```
Specification of Module E2E Transformer, No.650, AUTOSAR R21-11(191) CP

Specification of Module E2E Transformer, No.650, 2021-11

https://www.autosar.org/fileadmin/user_upload/standards/classic/21-11/AUTOSAR_SWS_E2ETransformer.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
no

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] AUTOSAR Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[2] AUTOSAR General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[3] AUTOSAR General Specification for Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[4] AUTOSAR Specification of SW-C End-to-End Communication Protection Library
AUTOSAR_SWS_E2ELibrary.pdf
[5] AUTOSAR Specification of RTE
AUTOSAR_SWS_RTE.pdf
[6] AUTOSAR Requirements on E2E
AUTOSAR_RS_E2E.pdf
[7] AUTOSAR E2E Protocol Specification AUTOSAR_PRS_E2EProtocol.pdf
[8] System Template
AUTOSAR_TPS_SystemTemplate.pdf
[9] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[10] General Specification of Transformers
AUTOSAR_ASWS_TransformerGeneral.pdf
[11] AUTOSAR Glossary
AUTOSAR_TR_Glossary.pdf
[12] Software Component Template
AUTOSAR_TPS_SoftwareComponentTemplate.pdf
[13] SOME/IP Protocol Specification
AUTOSAR_PRS_SOMEIPProtocol.pdf
[14] ISO 26262-6:2018 www.iso.org
refとforwardRef 、 useImperativeHandleについて調べた時のノート

## この記事の内容
Reactは基本操作しか知らない人が、`forwardRef`と`useImperativeHandle`が出てくるコードを修正した時にわからないことを調べた記事です。

## 主な参考文献
公式ドキュメント。本記事のコードはここにあったものを引用し、状況に応じて多少アレンジしています。
- [useRef](https://ja.reactjs.org/docs/hooks-reference.html#useref)

この記事も丁寧で助かった
- [forwardRef と useImperativeHandle](https://numb86-tech.hatenablog.com/entry/2019/12/06/122217)

## refオブジェクト
コンポーネントがマウントされたときからアンマウントされるときまで存在し続ける、書き換え可能なオブジェクトのこと。`useRef()`を使って作成。（ついでに、[renderとマウント・アンマウントの違いが曖昧だったので調べ](https://qiita.com/tanutanu/items/abfecdf37fc3cef5c8e4)ました。）

↓こんなふうに作るよ
```react
const refContainer = useRef(initialValue);
```

↓こんなふうに使うよ
```react
function TextInputWithFocusButton() {
  const inputEl = useRef(null); // 1. refオブジェクトを作成
  const onButtonClick = () => {  //3. inputEl.currentで下記のinput要素にアクセスできる
    // `current` points to the mounted text input element
    inputEl.current.focus();
  };
  return (
    <>
      <input ref={inputEl} type="text" />  {/* 2. ref属性でinputElを指定すると */}
      <button onClick={onButtonClick}>Focus the input</button>
    </>
  );
}
```
`<input ref={inputEl} /> `のように、React（ここでは`<input />`）に refオブジェクトを渡した場合、ReactはDOMノードに変更があるたびに .current プロパティをその DOM ノードに設定する。

`useRef`は値を中に保持しておくことができる。
-> **関数コンポーネントを再レンダーした際に、前回のレンダー時のデータを取得することが可能**

## forwardRef

React.forwardRefは`ref`オブジェクトを**配下のツリー**の別のコンポーネントに受け渡す React コンポーネントを作成します。

↓こんなふうに使うよ
```jsx
const FancyButton = React.forwardRef((props, ref) => ( // 2. FancyButtonが第二引数のrefに入っている
  <button ref={ref} className="FancyButton">
    {props.children} //3. "Click me!"の文字の入った buttonができる
  </button>
));

const App = () => {
  const ref = React.createRef();
  return(
    <FancyButton ref={ref}>Click me!</FancyButton>; // 1. FancyButtonコンポーネントを呼び出すと
  )
};
```

この機能を利用すると、親コンポーネント（ここでは`App`）側から子コンポーネント内の要素を操作することができる。

## useImperativeHandle
useImperativeHandle は ref が使われた時に親コンポーネントに渡されるインスタンス値をカスタマイズするのに使います。

↓こんなふうに使うよ
```jsx
const FancyInput = (props, ref) => {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => { // `focus()`メソッドを作っている
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} type="text" ... />;
}

const WrapperFancyInput = React.forwardRef(FancyInput);

const App = () => {
  const inputRef = useRef();
  const onClick = () => {
    inputRef.current.focus();  // FancyInput内のinputにフォーカス
  };

  return (
    <div>
      <WrapperFancyInput ref={inputRef} />
      <button type="button" onClick={onClick}>
        click
      </button>
    </div>
  );
}

```

この例では、`<WrapperFancyInput ref={inputRef} />` をレンダーする親コンポーネント（ここでは`App`）は inputRef.current.focus() (←`FancyInput`内に記したメソッド)を呼べるようになります。


## 感想
複雑なコンポーネントの実装中。ここで調べたことが役に立つと良いなーと思いつつ、簡単に終わります。
multipassでHyper-V上に作ったubuntu VMに、Tera Termから接続してみる

# はじめに

　multipass shell サブコマンドで、コマンド・プロンプトやPowerShell（Windows Terminal）から接続するといろいろ不都合を感じたので、使い慣れている[Tera Term](https://ttssh2.osdn.jp/)から接続したいと思いました。

# 参考記事

　[multipassのVMにsshで接続 · hnakamur's blog](https://hnakamur.github.io/blog/2019/10/21/access-multipass-vm-via-ssh/)
　こちらの記事が大変参考になりました。

# 手順

## multipassのid_rsaファイルを特定する

　参考記事によると、id_rsaファイルは「C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd\ssh-keys」にあるとのこと。　確かにあった。
　【追記：2023/06/27】version 1.12に更新したら、もう**この場所には保存されていなかったので、この方法は使えなくなってしまいました**。こちらの記事の方法を試してください：[multipassのVMにubuntuでログインするときのパスワードってどうするの？ \- Qiita](https://qiita.com/michieru/items/581ed3bdce2f100b1487)
　これを当たり障りのない場所にファイルコピーしておく。　「id_rsa」ってファイル名だとどこの何に対するファイルなのか、あとからわからなくなるため、参考記事を参考に「multipass.id_rsa」ってファイル名にしておいた。
　複数のVMを立てていたら、ここに複数のid_rsaファイルが作られたりするのだろうか。

## TeraTerm Menuに追加する

　こんな感じで追加した。
　鍵ファイルの指定で、前段で特定したid_rsaファイル「multipass.id_rsa」を指定する。
　ホスト名は、`multipass list`コマンドで知り得るIPv4アドレスとした。
![Snap_20220527_144213_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/57ae5c11-4dee-01c1-8e8a-1725ab345151.png)

# つながった

　Tera Termを使うことでコピペしやすくなるしウィンドウサイズも好きな大きさにできるので、大助かりです。
Reactのマウントとレンダリングの違いが曖昧だったので調べてみた

## この記事の内容
Reactでの開発中`useRef`について調べていた時、マウントとレンダリングの関係を理解しないと難しいなと感じたので、調べてみました。

## 結論
↓この記事の内容が秀逸すぎて、これ以上にわかりやすい説明はないと思う

https://de-milestones.com/react-mount-rendering/#:~:text=%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AF%E3%80%81%E6%9C%80%E5%88%9D%E3%81%ABReact,%E3%82%8B%E9%9A%9B%E3%81%AB%E3%82%82%E5%8B%95%E3%81%8F%E3%80%82

↓上記記事中で引用されていたこちらの図も素敵

https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/


でも、自分の言葉でもまとめてみる

##　マウントとは

DOMツリーに要素を追加していくこと。ツリーから要素を削除していくことをアンマウントという。

## レンダリングとは

現在のPropsとStateを元に、Reactがコンポーネントに対して、それらがどのように見えるべきなのかを尋ねるプロセス。つまり、DOM要素の表示に必要な情報を色々読み込むこと。

## 合わせると...

レンダリングはマウントの間に行われるが、情報アップデートの際にもレンダリングは行われる
【PHP】fopen()関数とfgets()関数を使い、ファイルを開いて取得する流れ

PHP7技術者認定初級試験に向けて学習中の身です。
備忘録として残します。


### 1. txtファイルを作成

```php:test.txt
===== ===== ===== ===== =====
これはテスト用のテキストファイルです
===== ===== ===== ===== =====
```

### 2. open.phpファイルを作成

```php:open.php
<?php
$fp = fopen("test.txt", "r");
// ファイルを1行ずつ取得する
while ($line = fgets($fp)) {
    echo "$line\n";
}

// ファイルを閉じる
fclose($fp);
?>
```

### 3. 実行結果

```
===== ===== ===== ===== =====

これはテスト用のテキストファイルです

===== ===== ===== ===== =====
```


fopen("test.txt", "r");
この部分は、第一引数にファイル名、第二引数にモードを記載しています。
"r"とは、下記の通りテキストファイルの読み込み用のモードです。



```php:fopen()関数で使用することのできるモードのうち、試験に出やすそうだと考えるもの一覧
r	テキストファイルの読み込み
w	テキストファイルの書き込み（上書き）
a	テキストファイルの書き込み（追加）
rb	バイナリファイルの読み込み
rb+　　バイナリファイルの読み込み書き込み　※ファイルが存在しないと警告を発し、falseを返す
wb+ バイナリファイルの読み込み、書き込み　※ファイルが存在しなくても大丈夫
wb	バイナリファイルの書き込み（上書き）
ab　　　　バイナリファイルの書き込み（追加）
xb　　　　バイナリファイルの書き込み
xb+　　　　バイナリファイルの読み込み、書き込み
```



## 補足（feof関数）

ファイルが最後まで読み込まれたか確認するための関数。
読み込む系のモードを使う際はこちらも使った方が良い。

```php:open.php（feof関数を使用したバージョン）
<?php
$fp = fopen("test.txt", "r");

var_dump(feof($fp));

while ($line = fgets($fp)) {
    echo "$line\n";
}

var_dump(feof($fp));

fclose($fp);
?>
```


```php:実行結果
bool(false)
===== ===== ===== ===== =====

これはテスト用のテキストファイルです

===== ===== ===== ===== =====
bool(true)

===== ===== ===== ===== =====

これはテスト用のテキストファイルです

===== ===== ===== ===== =====
```

fgets関数でファイルを読み込んだ後で真偽値のtrueが返っており、読み込まれたことが分かります。
Oracle Analytics Cloud 予測機能～誰にも聞けない基礎の話～　その１

皆さんこんにちは。
Oracle Analytics Cloud には予測の機能がついているけれど、これはいったい何を基に予測しているの？という疑問についてご紹介したいと思います。

まずはAnalytics Cloud の予測機能の画面を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/51226e3b-02d5-a134-76a6-b55cd0efd47d.png)

結果セットが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/bce5afec-8aab-ba86-f5d5-389135e90786.png)

機械学習のモデルのところがデフォルトで季節性ARIMAモデルが選択されています。
季節性ARIMA？？
となるかと思いますので、まずは別のモデルに切り替えてみたいと思います。

ARIMAモデルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/59d8ddcd-2c23-217a-224f-c9b7ddce05d5.png)

違いがよくわかりませんね。
次のモデルを試してみます。ETSモデルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/ef3a37a1-25bc-d49a-6788-32f49eb8447e.png)

予測結果が変わりました。
モデルによって予測データが変わるようです。
次回はモデルの違いについてもう少し見ていきたいと思います。
wsl2 ubuntu デスクトップ環境のサービス類をインストール


# WindowsのWSL2を有効にする（手順1）

## Linux 用 Windows サブシステムを有効にする
powershellを管理者で起動し、以下コマンドを入力し、Linux用サブシステムを有効にします。

`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart`

## 仮想マシンの機能を有効にする
powershellを管理者で起動し、以下コマンドを入力し、仮想マシン機能を有効にします。

`dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart`

## Linux カーネル更新プログラム パッケージをダウンロードする
以下からLinuxカーネル更新プログラムパッケージをダウンロードし、管理者で実行し、インストールを実施します。
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

## WSL 2 を既定のバージョンとして設定する
powershellを管理者で起動し、以下コマンドを入力し、WSL2を既定のバージョンに設定します。

`wsl --set-default-version 2`

# WSL2上にUbuntuをインストールする（手順2）
Microsoft Storeを起動し、Ubuntuをインストールします。この操作でWSL2上にUbuntuがインストールされます。UbuntuのGUI環境はこの後の手順の中でインストールします。

# Windows上にxWindowサーバソフトウェアを導入する（手順3）
xWindowはLinuxの画面転送サービスみたいなものです。Ubuntuの画面をWindows10に転送するためにwinsows10上にxWindowサーバサービスをインストールします。

起動すときの設定はデフォルトで構わないがここがポイント
「Disable access control」にチェックを入れます。チェックを入れないと、外部からのXプロトコルを拒否します。

常時Linuxデスクトップアプリ使うなら、StartUpにしておく

## xLaunchのインストール
Windows10にて以下をDLし、管理者権限で実行しインストールを行います。
https://sourceforge.net/projects/vcxsrv/

# ubuntuにデスクトップ環境のサービス類をインストールする
## Ubuntuにデスクトップ環境のサービス類をインストールします。

```
sudo apt update -y
sudo apt upgrade -y
sudo apt install -y libgl1-mesa-dev xorg-dev xbitmaps x11-apps
sudo apt -y install ubuntu-desktop
```
UbuntuのXServerClientを設定する

`echo 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '\''{print $2}'\''):0.0' >> ~/.profile`
一旦Ubuntuを終了させます

`$ wsl.exe -t Ubuntu`
WindowsPCのアプリからUbuntuを再度起動します。

その後、Ubuntuで以下コマンドを実行するとWindowsのXlaunch経由でUbuntuのGUIが表示できます。

`$ sudo service x11-common start && sudo service dbus start && gnome-shell --x11 -r`

…終了させ方がわからず焦る
どうやってWindowsに戻るかわかる人いたら教えてください

参照
https://karst459.com/190/
AWS CLIでCloudflare R2を扱う

CloudflareにはwranglerというCLIがあるのだけれど、慣れたAWSCLIで扱いたいこともあるかな、ということで。

# Cloudflare R2のcredentialsを取得する。

左側のカラムからR2（ベータ版）を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554633/934bac32-7ed8-23d8-a7f2-c211d8fe4d3b.png)

画面右に表示れている「アカウントID」を控えておく。
これは後ほど、APIのエンドポイントの設定で必要になる。
控えたら、次はその上にある「R2 API トークンの管理」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554633/df8f9819-399a-84e5-30e8-72a10e664b33.png)

他と区別できるような適当なトークン名を記入、アクセス許可はEditを選択して「APIトークンを作成する」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554633/eb93900d-4ce2-f31b-0640-03123f04358d.png)

「トークンが正常に作成されました」が確認できたら、下記の２つの値を控えておく。
（重要。警告も表示されるが、これらは後で確認することはできない）

- アクセスキーID
- シークレットアクセスキー 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554633/9880592c-acc9-25a2-c06f-1de38484c3f9.png)

# AWS CLIの設定

`~/.aws/cli`に先程のアクセスキーIDとシークレットアクセスキーを記述する。
（aws configureで設定してもOK）

```
[r2]
aws_access_key_id     = <アクセスキーID>
aws_secret_access_key = <シークレットアクセスキー>
```

あとはprofileでこれを指定して、endpointにCloudflareのURLを指定してやればOK。

```
aws s3 ls --profile r2 --endpoint-url https://<CloudflareのアカウントID>.r2.cloudflarestorage.com
```

# .bashrcにfunctionの定義（任意）

毎度毎度ｅｎｄｐｏｉｎｔを記述するのは面倒なので、エイリアス的なものを用意しておくと便利。
↓のような関数を.bashrcに記述しておいた。

```
function r2() {
 /usr/local/bin/aws s3 "${@}" --profile r2 --endpoint-url https://<CloudflareのアカウントID>.r2.cloudflarestorage.com
}
```
 
# その他
API Keyを発行した直後は401が返ることがあるかも？
その時はコーヒーでも飲んでくれば使えるようになってるはず（ぐらいの時間感）
Arduino IDE 2.0 RC6 日本語対応版 を使ってみた

#### はじめに
Arduino IDE は 2.0 へのメジャー Update が進められている。Beta 版から RC（Release Candidate ）版になって、先日 RC6 で日本語を含む多言語メニュー対応となったので使ってみた。

#### ダウンロード
こちら　https://www.arduino.cc/en/software　 から Windows ZIP 版を選択。ファイル自体は 200 Mbyte あまりだが、展開すると最終的に 600 Mbyte くらいになる。
#### 起動画面
初期起動時は英語メニューなので File → Preference → Language　から JA を選択すると、めでたく日本語メニューとなる。
![Arduino1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996993/dab9cb73-c65c-beaa-f483-ee2a7a67458f.png)
この Preference のメニューから画面のモード（配色テーマ）選択することができる。とりあえずは default の Dark にしてある。
オリジナルの Arduino を始めとして STM32、ESP32/8266 などの主だったボード、OLED ディスプレイライブラリは登録されており、すぐに使うことができる。
![Arduino4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996993/4ab682b7-d850-fff8-1e9b-c377b91829fd.png)

#### コンパイルしてみる
いくつかの試用リポートでは L チカ程度の小さなスケッチが多いが、大きなファイルを試みる。ターゲットは Arduino を使う赤道儀コントローラ OnStep の ESP32 版のスケッチ OnStep ESP32（The MaESP Version3 ）。このソフトの詳細については、こちらの Wiki を参照されたい。
　https://onstep.groups.io/g/main/wiki/15166
ソースコードはこちらの Github からダウンロードできる。
　https://github.com/hjd1964/OnStep
ファイルは、いろいろ含めて 345 個、16 Mbyte の大きなものであるが、ボードメニューから ESP32 Devkit を選択して、問題なくコンパイルできた。
![Arduino2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996993/78bbeac0-51f9-8212-4119-b9119115922e.png)
バイナリをボードにアップロードするのも全く問題ない。
#### よく分からないこと
Arduino 2.0 を起動してタスクマネージャーで観察すると、バックグラウンドでなにかを色々とやっている。コンパイラよりも CPU を使っている感じ。
![Arduino5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996993/8aaa8b78-9712-d917-fb28-dc6764b4f4a6.png)
このように編集中の画面にカーソルを置くと、勝手に HELP （ 画面の例でいうと struct の HELP ）が表示される。けっこう邪魔だし、CPU資源の無駄遣いだと思うのだが、消す方法がわからない。

全体としては、かなり使いやすく、Beta版では実装されていなかったシリアルプロッタのあり、以前メインで使っていた Vre 1.8.8 には戻れなさそうだ。
任意のコミット間で変更を加えたGithubのユーザー一覧を取得する

ghコマンドだけ必要。こんな感じでできる。

```bash
$ gh api -H 'Accept: application/vnd.github.v3+json' /repos/IzumiSy/hoge-app/compare/commit1...commit2 | jq -r '.commits[].author.login | select(. != null)' | sort | uniq
```

jqでnullチェックをしないと[nullさんのアカウント](https://github.com/null)が取れてしまうので注意。
【Jetpack Compose】 Remember "remember"

## 目的
JetPack Composeで状態を保存するために用意されている"remember"ですが、これをRememberできない僕の脳のデバッグのために記事を書きます

## この記事でわかること
* rememberとは
* remember(ステートフル)のメリットさん

## 知っておいてほしいこと
* [コンポーザブルのライフサイクル](https://developer.android.com/jetpack/compose/lifecycle?hl=ja#lifecycle-overview)
  * **初回コンポーズ**によってコンポジションが作成されること
  * **コンポジション**とはUIが記述された箱のようなものであること
  * **再コンポーズ**でコンポーザブル関数を再度起動し、コンポジションを更新すること
* ステートフル、ステートレスについて
  * ステートフル: 状態を**保持している**という制約
  * ステートレス: 状態を**保持しない**という制約


## remember とは
[コンポーザブル内の状態](https://developer.android.com/jetpack/compose/state?hl=ja#state-in-composables)
> コンポーズ可能な関数は、remember コンポーザブルを使用して、単一のオブジェクトをメモリに保存できます。初回コンポーズの際に、remember によって計算された値がコンポジションに保存され、保存された値は再コンポーズの際に返されます。remember を使用すると、可変オブジェクトと不変オブジェクトの両方を保存できます。

### 要するにどういうこと？
* コンポジション内で保持しておける値
  * 再コンポーズが起こっても、それに耐えうる値
  * コンポジション内に保持しておけるということは、コンポジションが終了(構成の変更など)したら破棄される
    * それに耐える`rememberSaveable`というものもある
> rememberSaveable は、Bundle に保存可能なすべての値を自動的に保存します。その他の値については、カスタムのセーバー オブジェクトに渡すことができます。

ふむふむ、コンポジションという関数があったとして、rememberはその内部変数的な立ち位置的な感じかな？

いやー、でもなー。それだと
* テストとかも書きにくそうだしなぁ
* 内部的な値だから外部から手が出しづらそうだなぁ
* 内部変数だからどこで値が変化したか追わなきゃいけないなぁ

せや！

### viewModelみたいに外部で値を監視すればいいのでは?

### ・・・まあ、言いたいことはわかるんですが

### こんなコードで使えます
``` kotlin
@Composable
fun HelloContent() {
   Column(modifier = Modifier.padding(16.dp)) {
       var name by remember { mutableStateOf("") }
       if (name.isNotEmpty()) {
           Text(
               text = "Hello, $name!",
               modifier = Modifier.padding(bottom = 8.dp),
               style = MaterialTheme.typography.h5
           )
       }
       OutlinedTextField(
           value = name,
           onValueChange = { name = it },
           label = { Text("Name") }
       )
   }
}
```
<details><summary> 動作の画像</summary>

* 入力前
![スクリーンショット 2022-05-27 13.07.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990205/588e6c9f-bd40-95ae-d4bd-83f5cb471a39.png)

* 入力後
![スクリーンショット 2022-05-27 13.08.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990205/ab3eec72-de5f-bcef-c55d-605a244ed94f.png)

</details>
これは入力されている文字列を "Hello, &name!" としてリアルタイムで表示するコンポーザブル関数

1. OutlinedTextFieldで入力を検知し、nameに代入する
2. nameが空でなければ、Textを表示する

ざっとこんな流れで表示されることになる。

**全てがこの関数の中で完結**していて、nameの値を監視する必要もなければ、外部でいじる必要もないことがわかる

世界から切り離されてて管理が楽っぽい？（ように見える)

## ←結論←結論←結論←結論←結論
### rememberは外部から切り離されている場合において有効

基本的にはステートフルなこの形**ではなく**、ステートレスな形で外側に状態を持たせた方が管理がしやすい

ただrememberするべきなのは、rememberをあえて使うという道

内部だけで処理が終わる場合、その関数を丸ごと切り出せて管理が嬉しいかもよという話

**_心の片隅にRemember "remember"_**

## 参考
* [ステートフルとステートレスの比較](https://qiita.com/wind-up-bird/items/b210e294ecb147d67e2b)
* [Jetpack Composeにおける状態ホイスティング](https://tech.excite.co.jp/entry/2021/07/21/150000)
* [状態と Jetpack Compose](https://developer.android.com/jetpack/compose/state?hl=ja)
* [【Jetpack Compose】Stateと再Composeの仕組みを検証してみた](https://qiita.com/yasukotelin/items/fe1a36b3e8d9d21f9126)
ネットワーク解析で推定された特定のモジュールを抽出して可視化する

# モジュールの可視化

今回はWGCNAとigraphでネットワークを行った際に現れた特定のモジュールのみを取り出して、ノードやエッジの色・大きさ等で詳細な情報を可視化します。ここまでの流れはこちらのコードを参照してください。

https://qiita.com/yasainiki/items/688273d10743d0f80588

## 必要なパッケージとデータ

必要なパッケージとデータは以下の通りです。以前の記事を参照してください。

パッケージと用途
・igraph：ネットワークの計算
・visNetwork：グラフの可視化
・colorBlindness：カラーパレット

データ
・subnet：隣接行列をgraph.adjacency関数で変換したデータ
・m：fastgreedy.community関数でsubnetのモジュールを計算したデータ
 m$membershipに各変数(ノード）の所属するモジュールの番号が格納


## モジュールのネットワークデータの抽出

igraphのinduced_subgraph関数を使って、全体のネットワークからモジュールを構成するノードとエッジのみ取り出します。

```r
module_no <- 1 #取り出したいモジュールの番号

n <- induced_subgraph(subnet, m$membership == mo.s$module.ID[module_no]) 
```

## ノードの色の指定

ノードの色は、モジュールの色をベースに付けます。ここでは各ノードの強度に応じで5段階に分け、透過性のグラデーションをつけました。より多くのノードと強く結合したノードほど濃く表示されます。

```r
makeGradation <- function(x) { #透過性のグラデーションを作る関数
  grad <- c()
  opacity <- c("2A", "4C", "7F", "99", "B2")
  for (i in 1:5) {
    grad[i] <- paste(x, opacity[i], sep="")
  }
  return(grad) #5段階のグラデーションを出力
}

graph_Color = makeGradation(safeColors[module_no])[as.numeric(cut(strength(n), breaks	=	5))]

V(n)$color <- graph_Color

```

## ノードの大きさとエッジの幅の指定

toVisNetworkData関数を使ってvisNetworkに渡せるデータの形に変形しておきます。さらに、ノードの大きさをノードの強度、エッジの幅をエッジの重みで表現できるように指定しておきます。

```r
netv <- toVisNetworkData(n)

nodes <- netv$nodes
nodes$value <- strength(n)

edges <- netv$edges
edges$value <- edges$weight
```


## visNetworkによる可視化

最後にvisNetwork関数で可視化します。

```r
visNetwork(nodes, edges) %>%
  visIgraphLayout(layout = "layout_with_kk") %>%
  visNodes(shadow = list(enabled = TRUE, size=20)) %>%
  visOptions(highlightNearest = list(enabled = T, hover = T),
             nodesIdSelection = T)
```

モジュール１のみを可視化すると、このようなグラフが出てきます。インタラクティブなグラフになっていて、ネットワークの拡大縮小、特定のノードに接続するノードのみのハイライトなどが可能です。


![ダウンロード (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661056/05c758a3-026e-938a-1e91-5a6ce7f58807.png)

このように特定のモジュールのみを可視化することで、たとえばハブノードっぽいもの同士が比較的強く相関していることなどが可視化できて、ネットワーク全体を眺めていた時に映えられなかったより詳細な考察が可能となります。
C＃/ VB.NETでWordドキュメントとODTドキュメント間の相互変換を実現する方法

ODTドキュメント形式、つまりオープンドキュメント形式（Open Document Text）のことです。通常、ODT形式のファイルは、LibreOffice Writer、MS Word、またはその他のドキュメントエディタで開くことができます。ドキュメントを処理するときに、ODTを他の形式に変換したり、他の形式をODTに変換したりして、形式変換によってターゲットドキュメントを取得できます。この記事では、C＃およびVB.NETコードを使用して、ODTドキュメントとWordドキュメント間の相互変換方法を示します。

## 【プログラム環境】
このテストでは、[Free Spire.Doc for .NET](https://jp.e-iceblue.com/introduce/free-spire-doc-for-net.html)がプログラムに導入されます。Spire.Doc.dllファイルは次のユーザーから参照できます。

Free Spire.Doc for .NETをローカルに[ダウンロード](https://jp.e-iceblue.com/download/free-spire-doc-for-net.html)し、解凍してインストールします。インストールが完了したら、インストールパスの下のBINフォルダーでSpire.Doc.dllを見つけます。次に、Visual Studioで「ソリューションエクスプローラー」を開き、「参照」、「参照の追加」を右クリックして、プログラムへのローカルパスのBINフォルダーにあるdllファイルへの参照を追加します。

## 【フォーマットの変換】
変換するときは、次のことを実現するために3行のコードを操作するだけで済みます。

Documentクラスのオブジェクトを作成します。
Document.LoadFromFile(string fileName)メソッドを呼び出して、ソースドキュメントをロードします。
Document.SaveToFile(string fileName、FileFormat fileFormat)メソッドを使用して、ターゲットファイル形式として指定されたパスに保存します。

### 1.WordをODTに変換
**C#**
```
using Spire.Doc;

namespace WordtoODT
{
    class Program
    {
        static void Main(string[] args)
        {
            //Documentクラスのオブジェクトを作成する
            Document document = new Document();

            //Wordドキュメントを読み込む
            document.LoadFromFile("sample.docx");

            //ODT形式で保存する
            document.SaveToFile("ToODT.odt", FileFormat.Odt);
        }
    }
}
```
**VB.NET**
```
Imports Spire.Doc
 
Namespace WordtoODT
    Class Program
        Shared  Sub Main(ByVal args() As String)
            'Documentクラスのオブジェクトを作成する
            Dim document As Document =  New Document() 
 
            'Wordドキュメントを読み込む
            document.LoadFromFile("sample.docx")
 
            'ODT形式で保存する
            document.SaveToFile("ToODT.odt", FileFormat.Odt)
        End Sub
    End Class
End Namespace
```
### 2.ODTをWordに変換する

**C#**
```
using Spire.Doc;

namespace ODTtoWord
{
    class Program
    {
        static void Main(string[] args)
        {
            //Documentクラスのオブジェクトを作成する
            Document document = new Document();

            //ODTドキュメントをロードする
            document.LoadFromFile("test.odt");

            //Word形式で保存する
            document.SaveToFile("toWord.docx", FileFormat.Docx2013);
        }
    }
}
```
**VB.NET**
```
Imports Spire.Doc
 
Namespace ODTtoWord
    Class Program
        Shared  Sub Main(ByVal args() As String)
            'Documentクラスのオブジェクトを作成する
            Dim document As Document =  New Document() 
 
            'ODTドキュメントをロードする
            document.LoadFromFile("test.odt")
 
            'Word形式で保存する
            document.SaveToFile("toWord.docx", FileFormat.Docx2013)
        End Sub
    End Class
End Namespace
```
はい、今回のWordドキュメントとODTドキュメント間の相互変換は以上でした、最後まで読んでくださって誠にありがとうございました。