OmniAICreator/Qiita-1.07M huggingface dataset:
ブラウザ上でコード補完つきの機械学習開発環境を構築する

Webブラウザ経由でどこからでもアクセスできてVisual Studio Codeのようにコード補完もしっかりあり、ついでにCPU/GPUも両方つかえる機械学習の開発環境。そんな駅から徒歩3分オートロックの家電付き物件並みの環境を構築する方法を解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/68674335-1edc-c438-2d89-a79778ccb9db.png)


Amazon SageMaker Studio Labを機械学習の開発環境として使用し、文字通りIDEのサーバーである[Code Server](https://anaconda.org/conda-forge/code-server)をStudio Lab上で起動します。これにより、Studio Lab内にあるJupyter NotebookをIDEで編集できます。
Amazon SageMaker Studio Labのアカウント登録手順は[Amazon SageMaker Studio Lab の使い方](https://github.com/aws-studiolab-jp/awesome-studio-lab-jp/blob/main/README_usage.md)を参照してください。`code-server`を使う上で大事なポイントとしてTerminalがありストレージがついています。無料/メールアドレスのみで利用できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/ba49adc8-1269-651c-472d-79e6126801d2.png" width=600>

## 環境構築手順

Amazon SageMaker Studio Labにログインしたら次の手順を実行します。

1. File > New > からTerminalを起動する
2. `conda install -c conda-forge code-server`を実行し`code-server`をインストールする
2. `PASSWORD=xxxxxx code-server --auth password`を実行し`code-server`をパスワード認証つきで起動する。
   * `xxxxx`は任意の(セキュアな)パスワードを設定してください
2. `https://yyyyy.sagemaker.aws/studiolab/default/jupyter/proxy/8080/`にアクセスする。
   * `yyyyy`は、利用しているStudio Labによって異なります。ブラウザのURL欄を確認してください。
   * パスワードの入力が求められるので設定したパスワードを入力してください。

ブラウザからアクセスすると次のような画面が出ていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/48f8ba9f-f233-8cae-f4d8-534f404ab5e2.png)

`code-server`のコマンドを実行したTerminalは次のような出力がされています。

```
(studiolab) studio-lab-user@default$ PASSWORD=xxxxx code-server --auth password
[2022-05-24T11:48:51.793Z] info  code-server 4.4.0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[2022-05-24T11:48:51.794Z] info  Using user-data-dir ~/.local/share/code-server
[2022-05-24T11:48:51.809Z] info  Using config file ~/.config/code-server/config.yaml
[2022-05-24T11:48:51.809Z] info  HTTP server listening on http://127.0.0.1:8080/ 
[2022-05-24T11:48:51.810Z] info    - Authentication is enabled
[2022-05-24T11:48:51.810Z] info    - Using password from $PASSWORD
[2022-05-24T11:48:51.810Z] info    - Not serving HTTPS 
```

ここからはVisual Studio Codeと使い勝手はほぼ同じです。Pythonの拡張をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/584fa08a-861c-2a11-c7ef-706ee1418575.png)

Studio Lab上のファイルシステムが連携されており、Notebookを開くことができます。KernelもStudio Labで作っていたものに切り替えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/c22d1ee9-ab11-b419-591c-a015e8fc06aa.png)

## コード補完

PyTorchの実装例ですが、ちゃんと補完されてきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25990/7b16963f-e5c4-1041-fc97-0601c9d621cd.png)

## 結論

手元のPCのスペックが足りなくても十分なリソースの開発環境が用意できるのは、機械学習を学ぶ個人だけでなくハンズオンなどでも便利です。コードの補完が効いた開発環境でぜひ機械学習を学んでいただければと思います！Studio Labで学べる教材は次のページで紹介しています。

[SageMaker Studio Lab Community](https://github.com/aws-studiolab-jp/awesome-studio-lab-jp)

良い機械学習学習ライフを！
Specification of LIN Transceiver Driver, No.257, AUTOSAR R21-11(163) CP

Specification of LIN Transceiver Driver, No.257, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_LINTransceiverDriver.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
|Channel| A channel is a software exchange medium for data that are defined with the same criteria.
|ComM |Communication Manager
|Det |Default Error Tracer
|Dio/DIO |Digital input output, one of the SPAL SW modules
|EcuM |ECU State Manager
|ECU |Electronic Control Unit
|Frt |Free Running Timer
|Gpt| General purpose Timer
|ICU| Interrupt Control Unit
|ISR |Interrupt Service Routine
|LinTrcv| Lin Transceiver Driver
|MCAL|Micro Controller Abstraction Layer
|n/a|Not applicable
|PDU| Protocol Data Unit
|SBC |System Basis Chip; a device, which integrates e.g. LIN and/or LIN transceiver, watchdog and power control.
|SPAL |Standard Peripheral Abstraction Layer
|SW| Software
|SPI| Serial Peripheral Interface
|SPI Channel |A channel is a software exchange medium for data that are defined with the samecriteria: configuration parameters, number of data elements with same size and data pointers (source & destination) or location. See specification of SPI driver for more details.
|SPI Job A |job is composed of one or several channels with the same chip select. A job is considered to be atomic and therefore cannot be interrupted. A job has also an assigned priority. See specification of SPI driver for more details.
|SPI Sequence| A sequence is a number of consecutive jobs to be transmitted. A sequence depends on a static configuration. See specification of SPI driver for more details.

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

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] Requirements on LIN
AUTOSAR_SRS_LIN.pdf
[5] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[6] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[7] Specification of LIN Driver
AUTOSAR_SWS_LINDriver.pdf
[8] Specification of LIN Interface
AUTOSAR_SWS_LINInterface.pdf
[9] Specification of ECU State Manager
AUTOSAR_SWS_ECUStateManager.pdf
[10] Specification of Standard Types
AUTOSAR_SWS_StandardTypes.pdf
[11] Specification of Communication Stack Types
AUTOSAR_SWS_CommunicationStackTypes.pdf
[12] Basic Software Module Description Template
AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
M1 MacOSにtensorflowをinstall

# M1 Macにtensorflowをインストール



## インストール失敗

普通にpipでインストールしようとすると失敗する。

```shell
$ pip install tensorflow  

ERROR: Could not find a version that satisfies the requirement tensorflow (from versions: none)
ERROR: No matching distribution found for tensorflow
```


## インストール方法

`tensorflow-macos`をインストールする。

```shell
pip install tensorflow-macos
```

## 使用する

使用する際は`import tensorflow-macos`ではなく`import tensorflow`で良い。
`import tensorflow-macos`ではSyntaxErrorとなる。


```python
import tensorflow as tf

input_shape = (4, 28, 28, 1)
x = tf.random.normal(input_shape)
y = tf.keras.layers.Conv2D(6, (3, 3), activation='relu', dilation_rate=2, input_shape=input_shape[1:])(x)

print(y.shape)
```
簡単な例題を実行したが、動作は特に問題なさそう。


## 参考

https://developer.apple.com/forums/thread/686926
【C#】ラムダ式で楽してChain of Responsibilityパターンを書こう

 
# この記事の目的
Chain of Responsibilityパターンでコードを書きたいけど、
仕組みを一から作るのは面倒というときに使えるC#の汎用クラスを書いてみたので紹介します。

作成した汎用クラスに、ラムダ式で具象処理を投げることで、少ないコード量で
Chain of Responsibilityパターンを実装します。
# Chain of Responsibility汎用クラス
```C#
    public class ChainAction<T>
    {
        public Action<T> Action { get; set; }
        public Func<T, bool> CanInvoke { get; set; }
    }

    public class ChainOfResponsibility<T>
    {
        List<ChainAction<T>> ChainActions { get; set; } = new List<ChainAction<T>>();

        public ChainOfResponsibility<T> Next(ChainAction<T> chainAction)
        {
            ChainActions.Add(chainAction);
            return this;
        }

        public void Invoke(T value)
        {
            foreach(var chainAction in ChainActions)
            {
                if (chainAction.CanInvoke(value))
                {
                    chainAction.Action(value);
                    return;
                }
            }
        }
    }
```

# 使用例
```C#
int testInt = default(int);
var chain = new ChainOfResponsibility<int>();
var chainAction1 = new ChainAction<int> { Action = x => testInt = x + 1, CanInvoke = x => { return (x == 100); } };
var chainAction2 = new ChainAction<int> { Action = x => testInt = x + 2, CanInvoke = x => { return (x == 200); } };
var chainAction3 = new ChainAction<int> { Action = x => testInt = x + 3, CanInvoke = x => { return true; } };
chain.Next(chainAction1).Next(chainAction2).Next(chainAction3);
chain.Invoke(200);
Assert.AreEqual(testInt, 202); // 単体試験メソッド 結果はOKになる
```

# 使用方法
１．ChainOfResponsibilityクラスのインスタンスを生成します。
　　ジェネリックの型<>には処理したい変数の型を書いておいてください。
```C#
var chain = new ChainOfResponsibility<int>();
```
２．ChainActionクラスを作成しましょう。
　　Actionプロパティには、実際に行う処理を入れてください。
　　CanActionプロパティには、Actionプロパティに入れた処理を、実行するかどうか判定する式を入れてください。
```C#
// 読みやすくするために改行してみた
var chainAction1 = new ChainAction<int> {
        Action = x => testInt = x + 1,
        CanInvoke = x => { return (x == 100); }
};

// 別に１行で書いてもいい
var chainAction2 = new ChainAction<int> { Action = x => testInt = x + 2, CanInvoke = x => { return (x == 200); } };

// 最後に実行するメソッドはCanInvokeでそのままtrueを返しておくといいかも
var chainAction3 = new ChainAction<int> { Action = x => testInt = x + 3, CanInvoke = x => { return true; } };
```
３．手順１で生成したChainOfResponsibilityクラスのNextメソッドを実行していきます。
　　Nextメソッドの戻り値でChainOfResponsibilityクラスが返ってくるので、
　　そのままNextで指定できます。
　　（よく見る書き方です。これがやりたかった……）
```C#
chain.Next(chainAction1).Next(chainAction2).Next(chainAction3);
```
４．最後にInvokeメソッドで実行です。
　　引数に処理したい変数を入れてください。
```C#
chain.Invoke(200);
```

# あとがき
Chain of Responsibilityパターンは、デザパタ本通りに書くと
仕組みを作ったり、具象処理ごとにクラスを作成しないといけなかったりしてコード量が多くなります。
省略できる書き方があると楽できていいですね。
SchemaSpyでDocker上のMySQLデータベースの設計書を生成する

# はじめに
SchemaSpyでDocker上のデータベースに接続して設計書を生成する。
すでに色々なところに記事はあるが、情報が多すぎて混乱したのでシンプルに自分用にまとめる。

# 環境
- Windows10
- mysql-connector-java-8.0.28
- schemaspy-6.1.0

# 設計書生成
## フォルダ構成
```
.
┣ initdb.d
    ┗ table.sql
┣ docker-compose.yml
┣ mysql-connector-java-8.0.28.jar
┣ schemaspy.properties
┗ schemaspy-6.1.0.jar
```

## SQL
SQLのファイル名は何でも良い。
内容も作成さえできれば何でも良いが、今回は主キー、外部キー、インデックス、ビューについて見れるようなサンプルにした。

```sql:table.sql
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE IF NOT EXISTS mydb;
USE mydb;

CREATE TABLE `teams` (
    `id` INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` VARCHAR(50)
);
CREATE INDEX `idx` ON `teams`(`id`);

CREATE TABLE `users` (
    `id` INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` VARCHAR(50),
    `age` INT,
    `team_id` INT,
    CONSTRAINT `fk_team_id` FOREIGN KEY(`team_id`) REFERENCES `teams`(`id`)
);
CREATE INDEX `idx1` ON `users`(`id`);
CREATE INDEX `idx2` ON `users`(`team_id`);

CREATE VIEW `my_view`(
    `user_id`,
    `user_name`,
    `user_age`,
    `team_name`
) AS
SELECT
    u.id,
    u.name,
    u.age,
    t.name
FROM
    `users` u
    INNER JOIN
        `teams` t
    ON  u.team_id = t.id
;
```

## docker-compose

```yml:docker-compose.yml
version: "3"

services:
  db:
    image: mysql:latest
    ports:
      - "3306:3306"
    volumes:
      - "./initdb.d:/docker-entrypoint-initdb.d"
    environment:
      MYSQL_ROOT_PASSWORD: root
```

## プロパティファイル

```properties:schemaspy.properties
# DB種類
schemaspy.t=mysql

# JDBCドライバ場所
schemaspy.dp=mysql-connector-java-8.0.28.jar 

# DBホスト
schemaspy.host=127.0.0.1

# DBポート番号
schemaspy.port=3306

# データベース名
schemaspy.db=mydb

# DBスキーマ名
schemaspy.s=mydb

# ユーザ名
schemaspy.u=root

# ユーザパスワード
schemaspy.p=root

# 出力先
schemaspy.o=output
```

## コマンド
MySQL立ち上げ
`$ docker-compose up`

SchemaSpy起動
`$ java -jar schemaspy-6.1.0.jar -vizjs`

# 作成された内容
## 全体画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212284/7c4bb412-9e5f-6eda-8a1a-7ede277d45a7.png)

## テーブル
主キーやインデックスも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212284/26a71763-7d31-a01f-1566-3ad0260c8dbb.png)

## ビュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212284/bba03b4e-84fa-15a0-2ccb-3d279730cda8.png)

## ER図
主キーと外部キーの関係性も見やすい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212284/f55b8b49-f80d-1f7f-a9b0-38bc6b7ce320.png)
Gitの裏側のフローを1枚の図へ

## Gitの裏側
[Gitのコミットの裏側で起こっていること](https://made.livesense.co.jp/entry/2017/08/22/080000)の内容を読み、
理解を深めるために1枚の図でフローを自分用に起こしてみた。
![git裏側.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2296212/42d81dea-592b-c3be-6326-55fe267b3cd1.png)


## 参考リンク
[Gitのコミットの裏側で起こっていること](https://made.livesense.co.jp/entry/2017/08/22/080000)
[Gitのコミットハッシュ値は何を元にどうやって生成されているのか](https://engineering.mercari.com/blog/entry/2016-02-08-173000/)
【SpringBoot】SpringSecurityでCORSの設定

SpirngSecurityでCORSの許可方法は以下の処理になります。

```java:WebSecurityConfig
	/**
	 * HTTP Security設定
	 */
	@Override
	protected void configure(HttpSecurity http) throws Exception {
        //そのほか記述については省略してます

		http.cors();
	}


	/**
	 * CORS設定
	 */
	@Bean
	CorsConfigurationSource corsConfigurationSource() {
		
		CorsConfiguration configuration = new CorsConfiguration();
		
		//CORSで許可する値を設定
		//許可するURIを設定　レスポンス側のURI
        configuration.setAllowedOrigins(List.of("http://localhost:3000"));
        
        //許可するメソッドを設定　GET,POST,PUT,DELETE
		configuration.setAllowedMethods(Arrays.asList("GET", "POST"));

		//許可するヘッダーを設定　Content-Type等、、、
		configuration.setAllowedHeaders(Arrays.asList("*"));
		
		//cookieの取得を許可
		configuration.setAllowCredentials(true);

		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		source.registerCorsConfiguration("/**", configuration);
		return source;
	
```
カリー化で一部の引数を固定して関数を複製する

### カリー化とは

> カリー化とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること（あるいはその関数のこと）である。

文字だけでは全然わからないと思うのでコードで解説します。


下記のように引数を２つ受け取る関数があるとします。

```javascript
sample(arg1, arg2) {
  console.log(`引数１：${arg1}, 引数２：${arg2}`)
};

sample('りんご', 'ぶどう');
// => 引数１：りんご, 引数２：ぶどう
```

これはみんなおなじみの普通の関数。

`sample`という名前で関数を定義し、`arg1`と`arg2`という二つの引数をとっています。

このときに、引数１だけを固定して、引数２だけを変えて何回かこの関数を呼び出したい場合、上記のままだとこうなります。

```javascript
sample('りんご', 'ぶどう');

sample('りんご', 'スイカ');

sample('りんご', 'ドラゴンフルーツ');
```

なんか冗長ですよね、、、

１つ目の引数の`りんご`を何回も呼び出すのがなんか気持ち悪い、、

具体例が下手くそすぎて申し訳ないのですが、
このように一部の引数を固定して、残りの引数を動的に変更させたい場合、カリー化が役に立ちます。

```javascript
// 普通の関数
sample(arg1, arg2) {
  return `引数１：${arg1}, 引数２：${arg2}`
};

// カリー化
curryingSample(arg1) {
  return (arg2) => {
    console.log(`引数１：${arg1}, 引数２：${arg2}`);
  }
};

const fixedAppleFunc = curryingSample('りんご');

fixedAppleFunc('ぶどう');
// => 引数１：りんご, 引数２：ぶどう

fixedAppleFunc('スイカ');
// => 引数１：りんご, 引数２：スイカ

fixedAppleFunc('ドラゴンフルーツ');
// => 引数１：りんご, 引数２：ドラゴンフルーツ

```

ここでもう一度最初の説明文を載せます。

> カリー化とは、複数の引数をとる関数(`sample()`)を、引数が「もとの関数の最初の引数(`arg1`)」で戻り値が「もとの関数の残りの引数(`arg2`)を取り結果を返す関数(`curryingSample()内でreturnされているアロー関数`)」であるような関数(`curryingSample()`)にすること（あるいはその関数のこと）である。


本当に具体例が下手すぎて恐縮なんですが、最初よりは理解が深まったと思います笑


### おまけ

自分が実際に実務でこのカリー化を使った時は、`map()`で指定するコールバック関数にこのカリー化した関数を使いました。

```javascript
curryingFunc(arg1, arg2) {
  return (arg3) => {
    // 処理
  }
};

const fixedArgumentsFunc = curryingFunc('固定したい引数１', '固定したい引数2')

const results = array.map(fixedArgumentsFunc);

```

こんな感じで、`map()`で回す値だけを動的に変えたいときに使いました
【Pytorch】リスト内にTensorがあってリスト全体のtensorが欲しい時

# はじめに
記事にするようなことではないかもしれませんが先日このようなことを聞かれたので、せっかくだからと記事にしました。

# リスト内にtensorがあるとき
これを
```.py
list = [tensor([-0.4514, -1.5478,  0.6651]), tensor([ 0.6520, -0.8339,  1.5253])]
```
こうしたいとき
```.py
x = tensor([[-0.4514, -1.5478,  0.6651],
        [ 0.6520, -0.8339,  1.5253]])
```

# 解決策
```.py
x = torch.stack(list)
```

`torch.stack()`に投げてあげるだけでtensorが入ったリストを勝手に2x3行列にしてくれる。
AtCoder ABC252 C - Slot Strategy を　総当たりと解説通りに解く

<font color=red>今回はリールの長さ及び登場する絵柄の種類が10と固定されていますが、これを$m$とします。</font>

https://atcoder.jp/contests/abc252/tasks/abc252_c

これを以下の2つの解き方で解きます。

- 1: 解けるまでの時間を愚直に総当たりする解法 O(n^2m^2))
- 1-2: 1を少し工夫した解法O(nm^2)
- 2: 解説通りの解法 O(max(nm, m^2))

# 1: 解けるまでの時間を愚直に総当たりする解法 O(n^2m^2)
本問題の条件では、揃える文字$x$を決めたとき、$n$本のリールそれぞれを使ったかを覚えておくことで以下のように解くことができます。
- STEP1: 今の時間をcurtimeとする。この時、各リールのindexが`curtime % 10`の位置の文字が使える(curtimeでボタンを押すと、その数値が表示される)
- STEP2: 使っていない各リールを見ていき、使えるリールがあるなら使う(使えるリールが複数あった場合、どのリールを使っても結果は変わりません)
- STEP3: すべてのリールを使い終わったらその瞬間のcurtimeがその数をそろえる最小時間

この時の計算量を考えます。今、$x$ですべてのリールを揃えたいとすると、あるリールを使った次にほかのリールで$x$が揃えられる最悪のケースは、入力例2のようにすべてのリールが同じだと$m$回時間進まなければ使えません。各リール$n$本に対して各時間で確認するので、次の使えるリールを探すのに最悪$nm$の時間がかかります。すべてのリール$n$本を揃えないといけないので、$O(n^2m)$で$x$をそろえるときの時間が求められます。
これを、揃える文字$x$を$m$種類に対して処理するため、全体の計算量は$O(n^2m^2)$です。

https://atcoder.jp/contests/abc252/submissions/31918134

# 1-2: 1を少し工夫する O(nm^2)
さて、1はSTEP2が工夫できます。`使えるリールが複数あった場合、どのリールを使っても結果は変わらない`ので、最初から数$x$を選んだ時に各indexで使えるリールの本数を覚えておけば良いです。これによって使えるリールがあるかを判定する必要はなくなります。

この時の計算量は、`各リール$n$本に対して各時間で確認する`が不要になるので$O(nm^2)$です。

https://atcoder.jp/contests/abc252/submissions/31933266

# 2: 解説通りの解法 O(max(nm, m^2)) 
https://atcoder.jp/contests/abc252/editorial/3997

解説通りです。ある数$x$を揃えたいとき、全リールのindexに$x$が存在する個数をcnt[index]とします。indexに$x$がある1つ目のリールをそろえるには時刻$index$で揃えられます。そのような2つ目のリールを揃えられるのは時刻$m$後なので$index + 1 \times m$です。そのindexに$x$があるリール全てをそろえるのには、時刻$index + (cnt[index]-1) \times m$です。各indexについてこの時刻を計算し、そのmaxが$x$を揃えるのにかかる最小の時間です。これをすべての$x$について試行すればいいです。
事前に$O(nm)$でcntを計算したあと、$m$個の数字についてindexが0から$m$まで調べれば良いです。$O(max(nm, m^2))$ です。

https://atcoder.jp/contests/abc252/submissions/31933469
PostgreSQL  --   CopyManagerで高速コピー

postgreSQL でテーブルをコピーするとき、javaからCopyManagerを使うと速いらしいので、検索してみたが、一回ファイルに落とすサンプルばかりで、直接コピーしてるものがなかなか見つからなかったので、誰かの役にたつかなっと思い投稿してみました。
↓ の ソースは、前半コピー元テーブルにファイルからコピーして、後半、コピー元テーブルからダイレクトにコピー先テーブルへコピーします。
ポイントはコピー元テーブルからの読み込みで、PGCopyInputStream()を使用しますが、その時CopyManager()で使用するコネクションとは別のコネクションをもう一つ用意しないとダメってところです。
ここで、結構ハマりましたが、よくよく考えるとinとoutで同じファイルディスクリプタを使えないのと同じ理屈でした。



	public static void main(String[] args)  throws Exception {
        if(args.length!=4) {
            System.out.println("Please specify database URL, user, password  and file on the command line.");
            System.out.println("Like this: jdbc:postgresql://localhost:5432/test test password file");
            return;
        }
        System.out.println("Loading driver");
        Class.forName("org.postgresql.Driver");

        System.out.println("Connecting to " + args[0]);
        Connection con = DriverManager.getConnection(args[0],args[1],args[2]);
        Connection con2 = DriverManager.getConnection(args[0],args[1],args[2]);
        con.setAutoCommit(false);
        con2.setAutoCommit(false);

        Statement statement = con2.createStatement();
        statement.executeUpdate("TRUNCATE member");
        statement.executeUpdate("TRUNCATE member2");
        con2.commit();

        String inSql = "COPY member to STDOUT WITH CSV";
        String outSql = "COPY member2 FROM STDIN WITH CSV";
        String inSqlFromFile = "COPY member FROM STDIN WITH CSV";

        System.out.println("Copying text data rows from stdin");
        CopyManager copyManager = new CopyManager((BaseConnection) con);
        FileReader fileReader = new FileReader(args[3]);
        copyManager.copyIn(inSqlFromFile, fileReader );
        con.commit();

        System.out.println("Copying  data rows from member to member2");
        PGCopyInputStream pgIn = new PGCopyInputStream((PGConnection)con2, inSql);
        copyManager.copyIn(outSql, pgIn );
        con.commit();
        con.close();
        con2.close();
        System.out.println("Done.");
	}
アットマーク規則

# はじめに
CSSで使われている`@media @import @charset @page `について、個人的にまとめておきます。


## `@media`について
>よく目にするであろうアット規則が @media があり、メディアクエリを作成するために使用されます。メディアクエリは CSS スタイルを提供する条件を使用します。

引用:[MDN-アットマーク規則](https://developer.mozilla.org/ja/docs/Learn/CSS/First_steps/How_CSS_is_structured#rules)

特定のメディア（レスポンシブデザイン等）にCSSをあてたい時に使用されるものですね。
また、JSの`window.matchMedia`の使用の際に、メディアクエリの条件からレスポンシブデザインの判定等を行う際にも使用でき、条件に合わなくなった際にイベントリスナーを設定することも出来るようです。

## `@import`について
>@import はスタイルシートを別の CSS スタイルシートにインポートします。

引用:[MDN-アットマーク規則](https://developer.mozilla.org/ja/docs/Learn/CSS/First_steps/How_CSS_is_structured#rules)

`@import`は外部CSSを読み込むためのみたいです。使用方法は`@import url(hoge.css);`のようにURIを後に記述すればいいみたいです。また制約としては`@charset`がある場合は`@charset`の後に記述する必要があるようです。

## `@charset`について

外部スタイルシートの文字コードを指定します。
例　`@charset "UTF-8";`
`@charset`はCSS内の先頭に1つだけ記述することができるようです。（他の内容を先は書けない）

## `@page`について

印刷時におけるページの余白（マージン）や改ページ位置等のページ設定を行う指定です。
以下ブラウザの互換性。互換性に関してはいまいちのようですが、使用することはあるのでしょうか…。
![eeeeee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632871/855d0673-7338-7c46-03aa-58399445a10f.png)
Reactでcanvasを操作しても何も描画されない時はuseEffectのせいかも？

canvasを使うプロジェクトに参加していて、デバッグ用のためにページの描画後に一回きり、空白のcanvasに対して図形を追加する処理を、`useEffect`により実行しようとしました。しかし、画面上には何も表示されず、数時間を溶かしました。

## TL;DR

`useEffect`上でcanvas操作をするには、レンダリングのタイミングと操作の順番に配慮する必要があることがわかった。

## 再現

期待したこと：とにかくなんでもいいから図形がcanvas上に描かれること
現実：何も表示されない

```:子コンポーネントのjsxの帰り値
return <>
  <canvas id='bar-canvas' />
</>
```

```:そのコンポーネント内でのcanvasのTSからの操作
useEffect(()=>{
    const canvas = document.getElementById('bar-canvas') as HTMLCanvasElement
    const ctx = canvas.getContext('2d')
    ctx.rect(10, 10, 150, 100);
    ctx.fill();
}, [])
```

## 問題の特定

- console.logで`canvas`の中身をロギング
    - オブジェクト自体は出力されるので正しく定義されていることを確認
- Chrome DevToolsで<canvas>タグがDOMに存在されることを確認
    - CSSプロパティも特に非表示にしている、などは確認できなかった
- Canvasが何かに埋もれて隠れているのか？
    - `useEffect`内にCanvas画像をダウンロードするコードを挿入し、出力された画像を確認
    - 画像も空白だったので、この可能性はないと判断

```:canvasを画像としてダウンロードしてみる
    setTimeout(
      ()=>{
        const link = document.createElement('a');
        link.download = 'filename.png';
        link.href = (document.getElementById('bar-canvas') as HTMLCanvasElement ).toDataURL()
        link.click();
      }
      , 3000)
```
- canvasをuseEffectで操作しているのが良くないのか？
    - useEffect内でのcanvas操作のコードを`setTimeout`でラップして時間を置いてからcanvas操作がされるようにした
    - **無事、画面に図形が描画された**

## 問題の原因について考える

おそらく`useEffect`の描画のタイミングの問題なのか？
Googleで`useEffect canvas` と検索すると、以下のSOの記事を発見した。

https://stackoverflow.com/questions/71100553/react-wont-draw-anything-in-the-canvas-in-useeffect

レンダリングのタイミングと、操作のタイミングの順番が大事なようだ。上の記事によると、これは`useEffect`自体の問題ではなく、元のJavaScript/HTML自体が持つ特性に過ぎないとのこと。Reactを使うにせよ、使わないにせよ、レンダリングとcanvas操作のタイミングには注意すべきということだそうだ。

とはいえ、Reactではどう解決したらいいのか、ということは上の記事に書いているので、そちらを参照されたい。

## 自分の場合の解決法

自分の場合、`useEffect`を使っていたのは、デバッグのためだけであった。そもそも`useEffect`で図形を表示するのではなく、特定のイベントがあったときに図形を表示する、ということが自分のやりたいことであって、そのイベントはコンポーネントの描画時から時間が経ってから発生するので、**当面必要に迫られるまで解決しないことにしてuseEffectを削除する、というのが、解決法になった。**

## わからないときにどうすればいいのか？
経験上、何がわからないのがわからない、というときは、そもそも何らかのレイヤーの知識がごそっと抜けていることが多い。今回の例でいえば、useEffectとレンダリングのタイミングの関係や、canvasとレンダリングの関係などの知識が全くなかったので、そこに問題が生じていたという考え自体に至らなかった。

### 一つの視点：どんな仮説が立てられるか？

これは良くあるアプローチですが、これがうまく行くかどうかは、自分の知識に依存します。もし知識が初めからあるのであれば、仮説を立てて、順番に可能性を検証していくことが最短でしょう。しかし、そうでない場合には、全く先に進めないこともあります。

#### 利用可能性ヒューリスティック

このような認知バイアスが人間にはあり、「利用可能性ヒューリスティック」と呼ばれています。自分に身近な知識が、可能性の列挙に影響してしまうということです。

https://www.jumonji-u.ac.jp/sscs/ikeda/cognitive_bias/cate_d/d_02.html

では、どうすればいいのか、今回2時間以上浪費したので、自分なりに対策を考えました。それは、**行き詰まったときには、自分の知識になるべく依存しないような視点を持つこと**です。


### もう一つの視点：動いているコードから、自分が何を変更したのか？
今回は、 **もともと動いていたコードの例を、自分でuseEffect内に挿入した、という差分がありました。** もしこのことを早く認識していれば、`useEffect canvas`とGoogle検索して、最短で答えに辿り着いたかもしれません。特に、今回のような「エラーは出ないけど、期待通りに動かない」という、情報が少ない場合は、自分が何をしでかしたのか、を理解することが、唯一の情報源になる気がします。

行き詰まった時は、VSCodeの機能で差分でも眺めてみてはいかがでしょうか？

それでは、ごきげんよう！
jQueryをReactでラップ

Reactの公式チュートリアルの「他のライブラリとのインテグレーション」を読む。

# 可能だけど、ベストではない

Reactの内部表現に反してライブラリが直接DOMを書き換えなどを行った場合は、Reactは混乱してしまって回復できない。
ReactでjQuery（他のライブラリ）を使う場合、Reactによる更新がjQuery（他のライブラリ）によって追加されたDOMノードと競合しないように気を付ける必要がある。
Reactでラップすることで他のライブラリを使うことはできる。
**Reactは他のライブラリによって追加されたDOMノードを触らないことが重要。**

> React は、React 以外のものが DOM に加えた変更を認識しません。React は自身の内部表現に基づいて更新内容を決定します。もし同じ DOM ノードが別のライブラリによって操作された場合、React は混乱してしまい、回復する方法がありません。

> これが可能だからといって、これが React アプリケーションに最適なアプローチであるという意味ではありません。可能な限り React コンポーネントを使用することをお勧めします。React コンポーネントは React アプリケーションで簡単に再利用でき、また多くの場合、それらの動作や外観をより細かくコントロールできます。

jQueryのライブラリであるChosenを使用する例

```react
class Chosen extends React.Component {
  
  componentDidMount() {
    this.$el = $(this.el);
    // ref 経由で渡された <select> ノードで Chosen を初期化
    this.$el.chosen();
    // jQueryのchangeイベント時に値を受け取る
    this.handleChange = this.handleChange.bind(this);
    this.$el.on('change', this.handleChange);
  }

  componentDidUpdate(prevProps) {
    // jQueryで追加したDOMに変更を知らせる(propsの変更に応じてDOMを手動で更新)
    if (prevProps.children !== this.props.children) {
      this.$el.trigger("chosen:updated");
    }
  }

  componentWillUnmount() {
    // jQueryのchangeイベント時に値を受け取る
    this.$el.off('change', this.handleChange);
    // ref 経由で渡された <select> ノードで Chosen を破棄
    this.$el.chosen('destroy');
  }
  
  // 値の変更を受け取るメソッド
  handleChange(e) {
    this.props.onChange(e.target.value);
  }

  render() {
    return (
      {/* ReactがjQueryで追加したDOMに触れないようdivでラップする */}
      <div>
        <select className="Chosen-select" ref={el => this.el = el}>
          {this.props.children}
        </select>
      </div>
    );
  }
}  );
}
```
python if 文を利用した　臨床データ処理　適応疾患が右と左で別れる場合

臨床データを利用するソースコードを作成しています

適応疾患が左の時と右の時でそれぞれ　特徴量を変更する仕組みなのですが

テストデータに含まれる適応疾患が　

左しかなかったり

右しかなかった場合

動かない仕組みとなってしまったため以下のソースコードを作りました

#"ここに実施したい処理を入れる"

の部分に実施したい処理を入れたら完成です

```
c_code = "Shift-JIS"
#左とする
num = 'Left'
#疾患〇〇 だけフィルタする
disease = ''

image_file_path = './input/Test_data_input/input_data.csv'
image_file_path2 = './input/columns/columns.csv'
with codecs.open(image_file_path2, "r", c_code, "ignore") as file:
        dfpp_c = pd.read_table(file, delimiter=",")
test_columns = dfpp_c
#columns_name =test_columns.columns
#df = pd.read_csv(image_file_path,encoding="SHIFT_JIS",header=None)
df = pd.read_csv(image_file_path,encoding=c_code,header=None)
columns_name =test_columns.columns
columns_name
df.columns = columns_name

df_only = df
df_filters=df_only[df_only.疾患別リハ==disease]
#print("df_filters",df_filters)
#　疾患別リハ　選べるようにする　
disease_df=df_filters.drop(['疾患別リハ'], axis=1)

df_or=disease_df
left_disease=df_or[df_or["部位診断"] == "左"]
left_disease
print(len(left_disease))
len_left=len(left_disease)

Right_disease=df_or[df_or["部位診断"] == "右"]
Right_disease
print(len(Right_disease))
len_Right=len(Right_disease)

all_len = len_left * len_Right

if all_len > 0 :
        print("leftとrightどちらもデータがあります")
        #"ここに実施したい処理を入れる"
elif len_Right == 0:
        print("len_left　だけで解析を実施します")
        #"ここに実施したい処理を入れる"
elif len_left == 0:
        print("len_right　だけで解析を実施します")
        #"ここに実施したい処理を入れる"
else:
        print("例外がおこりました")
```


こちらのサイトを参考にしました

https://www.headboost.jp/python-else-if/

上記のままだと使用しにくいため関数に変更
```
def make_len_data():
        #20220401 変更部分　文字コードを一括で選べるようにした
        c_code = "Shift-JIS"
        #左とする
        num = 'Left'
        #脳血管疾患等 だけフィルタする
        disease = '脳血管疾患等'

        image_file_path = './input/Test_data_input/input_data.csv'
        image_file_path2 = './input/columns/columns.csv'
        with codecs.open(image_file_path2, "r", c_code, "ignore") as file:
                dfpp_c = pd.read_table(file, delimiter=",")
        test_columns = dfpp_c
        #columns_name =test_columns.columns
        #df = pd.read_csv(image_file_path,encoding="SHIFT_JIS",header=None)
        df = pd.read_csv(image_file_path,encoding=c_code,header=None)
        columns_name =test_columns.columns
        columns_name
        df.columns = columns_name

        df_only = df
        df_filters=df_only[df_only.疾患別リハ==disease]
        #print("df_filters",df_filters)
        #　疾患別リハ　選べるようにする　
        disease_df=df_filters.drop(['疾患別リハ'], axis=1)

        df_or=disease_df
        left_disease=df_or[df_or["部位診断"] == "左"]
        left_disease
        print(len(left_disease))
        len_left=len(left_disease)

        Right_disease=df_or[df_or["部位診断"] == "右"]
        Right_disease
        print(len(Right_disease))
        len_Right=len(Right_disease)

        all_len = len_left * len_Right
        return all_len,len_Right,len_left

all_len,len_Right,len_left=make_len_data()

if all_len > 0 :
        print("leftとrightどちらもデータがあります")
        
elif len_Right == 0:
        print("len_left　だけで解析を実施します")
elif len_left == 0:
        print("len_right　だけで解析を実施します")
else:
        print("例外がおこりました")
```
Specification of SPI Handler/Driver, No.38, AUTOSAR R21-11(160) CP

Specification of SPI Handler/Driver, No.38, 2021-11

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


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

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

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

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

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

# 用語(terms)


|Term|Description|
|:--|:--|
|DET| Default Error Tracer – module to which errors are reported.
|DEM |Diagnostic Event Manager – module to which production relevant errors are reported.
|SPI |Serial Peripheral Interface. It is exactly defined hereafter in this document.
|CS| Chip Select
|MISO |Master Input Slave Output
|MOSI| Master Output Slave Input
|EB| Externally buffered channels. Buffers containing data to transfer are outside the SPI Handler/Driver.
|IB| Internally buffered channels. Buffers containing data to transfer are inside the SPI Handler/Driver.
|ID |Identification Number of an element (Channel, Job, Sequence).
|Channel |A Channel is a software exchange medium for data that are defined with the same criteria: Config. Parameters, Number of Data elements with same size and data pointers (Source & Destination) or location.
|Job |A Job is composed of one or several Channels with the same Chip Select (one chip select = one external device). A Job is considered atomic and therefore cannot be interrupted by another Job. A Job has an assigned priority. Depending on the configuration, the CS may be kept asserted for the whole job (so for all the Channels) or released for each data frame at SPI bus level.
|Sequence| A Sequence is a number of consecutive Jobs to transmit but it can be rescheduled between Jobs using a priority mechanism. A Sequence transmission is interruptible (by another Sequence transmission) or not depending on a static configuration.
|Data frame| A data frame is the physical frame of bits on the SPI bus in relation with SpiDataWidth.


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[2] General Requirements on SPAL
AUTOSAR_SRS_SPALGeneral.pdf
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] Specification of Default Error Tracer
AUTOSAR_SWS_DefaultErrorTracer.pdf
[5] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[6] Requirements on SPI Handler/Driver
AUTOSAR_SRS_SPIHandlerDriver.pdf
[7] Specification of Diagnostic Event Manager
AUTOSAR_SWS_DiagnosticEventManager.pdf
[8] Glossary
AUTOSAR_TR_Glossary.pdf
[9] Specification of MCU Driver
AUTOSAR_SWS_MCUDriver .pdf
[10] Specification of PORT Driver
AUTOSAR_SWS_PORTDriver
[11] Basic Software Module Description Template,
 AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[12] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList
[13] Specification of Standard Types,
AUTOSAR_SWS_StandardTypes.pdf
[14] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
OCIの無償環境（Always Free）の注意点

前回、Oracle Cloud Infrastructure（**OCI**）を無償で使用できるAlways Freeの登録について書きましたが、Always Freeを申し込むと自動的に1か月のトライアル（3万円分のクレジット付）も申し込んだ事になり利用できます。
1か月経過又は3万円分利用してしまうとトライアルは終了してAlways Freeの環境になりますがその際に注意点があるため、記載しておきます。

### 選べるシェイプが違う
仮想サーバであるコンピュートはAlways Free環境と有償環境（トライアル含む）で選択できるシェイプが違います。
Always Freeで選べるシェイプは有償環境では選べません。

まず、プロセッサですが、下図の右側2つしか選べません。
![series.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/6fadf504-25bb-49a9-43ba-c8e947ca6c5b.jpeg)

右の**専門と前世代**の中を見てみるとAlways Freeは次のようになります。
![e2micro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/82cf9d6c-ea68-09ad-2119-eaf3291beb98.jpeg)
**VM.Standard.E2.1.Micro**というシェイプ唯一が選択できます。
これに対して有償環境の場合、**専門と前世代**の中は下図のようにたくさんあります。
![shape.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/bee099a5-10bd-fcf2-5827-89585325c51e.jpeg)
この中にAllways Freeであった**VM.Standard.E2.1.Micro**はないというのがわかります。

つまり、1か月（又は300ドル分）使ってトライアルが終了した段階でAlways Freeで使えるシェイプが無い為、使い続ける事ができません。

では、シェイプシリーズのAmpereの方だと大丈夫かというと、選択できるリソース範囲が違います。
![ampere.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/0cd73fcb-dd0b-fac3-8fc4-d5b3dcfe6c64.jpeg)
無償で収まる範囲で作成していない場合は先ほどと同様に使い続ける事が出来ないため注意が必要です。

### Windowsが選べない
Windowsはライセンス料の関係で無償で使う事はできません。![名称未設定-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/f49fc18d-8497-4a0a-081c-c1b440fd8ece.jpeg)
Windowsのチェックボックスにチェックすると上図のようなアップグレードを促すメッセージが出ます。

あくまで無償で使えるのは「Always Free対象」とマークがついているものだけです。


# Ampereの注意点
こう書くとAmpereで使うとトライアルが切れても使い続ける事ができそうで良さそうではありますが、ここでも注意点があります。
### 使えるOS
AmpereではAlways Free対象であるCentOSを使う事ができません。
CentOSを選択した状態ですとシェイプ選択のチェックボックスがグレーアウトしてしまいます。
![am-os.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/9265b28d-b9ec-03f4-d643-06b692a888d1.jpeg)
ubuntだと大丈夫でしたがなんででしょうか…

### 使えるリージョン
Always Free環境を申し込む時にホームリージョンを選択しますが、現在はその時に注意メッセージで東京リージョンはAmpereのリソースが逼迫しているようなメッセージが出ます。

試しに東京リージョンのAlways Free環境でAmpereインスタンスを作ろうとしたらやはりダメでした。
![error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/7d858556-87be-5cd6-2bef-f19ec277df43.jpeg)


そこでリージョンを大阪に変えて作ろうとしたところ、別リージョンにアクセスするためには有料アカウントにアップグレードする必要がありました。
有料アカウントにアップグレードしても、Always Free対象のリソースだけ使っていれば課金は発生しないため、注意しながら使えば無償のまま使い続ける事ができます。

## 有償アカウントへのアップグレード方法
有償アカウントへのアップグレードは上部に常に出ている「アップグレード」を押すと申し込みページに飛びます。
![名称未設定-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/d8cbff61-5bd7-e636-3c56-0d843ce72c81.jpeg)

申し込みページではクレジットカード情報を入力し、Pay As You Goの下の方のチェックボックスにチェックを入れ、「アカウントのアップグレード」ボタンを押下すると完了です。
![名称未設定-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/8f442c0d-9469-7cda-5897-3498d0a4738f.jpeg)
上の図は申し込みを完了した後にキャプチャーしたものなので「アカウントのアップグレードは進行中です」と書かれています。
このようにアップグレードは数時間～数日程度かかるため、余裕をもって手続きをした方が良いと思います。
（私は丸2日かかりました）

アップグレードしないと色々と制限事項があるため、無償で使い続ける場合でもアップグレードする事をおススメします。

以上、Always Free環境の注意点でした。
ソフトウェア開発

## ソフトウェア開発工程
<b><font color = blue>システム要件定義</font> [上位工程]
↓
<font color = blue>ソフトウェア要件定義</font>
↓
<font color = blue>システム設計</font>
↓
<font color = blue>ソフトウェア設計</font>
↓
<font color = blue>実装・構築</font>
↓
<font color = blue>テスト</font>[下位工程]
## ソフトウェア開発手法
### ウォータフォールモデル
<b>上位工程から下位工程へ進めていく開発手法
特徴：
・スケジュールが立てやすい
・各工程が完了してから次の工程へ行く
・各工程終了時に綿密にチェックする。
欠点：
・開発途中で利用者の要件を取り入れ辛い
・仕様変更が発生するとそれにかかるコストと時間が膨大になる
・最後の工程で不具合が発生すると後戻り作業が増える
### アジャイル開発
<b>「短いサイクルで、動作するプログラムを作成する」という作業を繰り返し、変化の激しい経営環境や利用者の要件を随時取り入れながら、段階的にシステム全体を完成させていく。
特徴：
・ソフトウェアの作成を優先
・利用者の要件を素早く取り入れる
・仕様変更に柔軟に対応できる
### XP
<b>アジャイル開発の一つ
<font color = blue>イテレーション</font>(1~2週間)という短いサイクルで、動作するプログラムを作成することを繰り返す。
二人一組でプログラミングをする(<font color = blue>ペアプログラミング</font>)。
ソフトウェアの保守性を高めるため、改善を繰り返す。外部仕様を変更することなく、プログラムの内部構造を変更する(<font color = blue>リファクタリング</font>)
コードの結合とテストを継続的に繰り返す(<font color = blue>継続的インテグレーション</font>)
テストケースを先に設定してから、そのテストを通過するプログラムを作成する(<font color = blue>テストファースト</font>)
### スクラム開発
<b>アジャイル開発の一つ
<font color = blue>スプリント</font>と呼ばれる固定した短いサイクル(1~4週)で、動作するプログラムを作成する
優先順位が高い順に作成。
毎日のミーティング(<font color = blue>デイリースクラム</font>)を重ねる。
### プロトタイピングモデル
<b>システム開発の早い段階から試作品(<font color = blue>プロトタイプ</font>)を作成して、利用者の確認を得ながら開発を進めていく開発手法。
### スパイラルモデル
<b>システムをさらに独立性の高いサブシステムに分割し、サブシステムごとに要件定義や設計、開発、テストを繰り返しながら段階的にシステムを完成させていく開発手法。
### リバースエンジニアリング
<b>既存のプログラムを解析して、プログラムの仕様と設計書を取り出す開発手法
## DevOps
<b>開発部門と運用部門が緊密に連携してシステムの改善を進めようという考え方。
### CMMI
<b>システム開発組織におけるプロセス成熟度を評価するモデル。<font color = blue>統合能力成熟度モデル</font>と訳される。
SpeechRecognitionでの文字起こしを試してみた。

# 目的
SpeechRecognitionを使って、文字起こしをしてみたかったので、試してみました。

# 開発環境
Python version:3.9.7
OS: windows 10.0
Anaconda:conda 4.11.0

# ライブラリのインストール
SpeechRecognitionとpyaudioをインストールします。
SpeechRecognitionは、音声入力のライブラリ、pyaudioは、マイクロホンのからの入力に必要です。

## SpeechRecognitionのインストール
SpeechRecognitionをインストールします。
```pip install SpeechRecognition```

## pyaudioのインストール

pyaudioをインストールします。
```pip install pyaudio```

すると、下記のようなエラーが発生しました。

```terminal
Collecting pyaudio
  Downloading PyAudio-0.2.11.tar.gz (37 kB)
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: pyaudio
  Building wheel for pyaudio (setup.py) ... error
  error: subprocess-exited-with-error

  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [17 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build\lib.win-amd64-3.9
      copying src\pyaudio.py -> build\lib.win-amd64-3.9
      running build_ext
      building '_portaudio' extension
      creating build\temp.win-amd64-3.9
      creating build\temp.win-amd64-3.9\Release
      creating build\temp.win-amd64-3.9\Release\src
      C:\Program Files (x86)\Microsoft Visual 
```

このエラーですが、pythonのversionとpipでインストールするpyaudioのversionが合っていないため、生じているようです。[こちら](https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio)から対応するpyaudioのversionをダウンロードします。私の環境では、pythonのversionは、3.9ですので、 ```PyAudio-0.2.11-cp39-cp39-win_amd64.whl```を選択しました。

ファイルをダウンロードしたディレクトリに移動し、下記コマンドを入力します。
 ```pip install  PyAudio-0.2.11-cp39-cp39-win_amd64.whl```

```
Processing c:\users\xxx\downloads\pyaudio-0.2.11-cp39-cp39-win_amd64.whl
Installing collected packages: PyAudio
Successfully installed PyAudio-0.2.11
```
Successfullyが出るとインストールは成功しています。

# 音声認識
下記サイトのプログラムをそのまま使用し、試してみました。
[SpeechRecognitionを使って音声入力からテキスト化する自動議事録を作ってみた](https://qiita.com/daiarg/items/ff1b9f91d0804e6a8f18)

すると、簡単に文字起こしができました。もう少し文字起こしのスピードが速くなると便利だなぁ。。

# リンク
pyaudioのエラーの対処のため、こちらも参考にさせていただきました。

[【Python】PyAudioがインストールできない場合の対処法（Windows）](https://education.r-jc.jp/python/pyaudio%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95%EF%BC%88windows%EF%BC%89/)
Specification of COM Based Transformer, No.662, AUTOSAR R21-11(157) CP

Specification of COM Based Transformer, No.662, 2021-11

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


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

AUTOSAR 21-11, 140文書読んだ。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] Glossary
AUTOSAR_TR_Glossary
[2] General Specification of Transformers
AUTOSAR_ASWS_TransformerGeneral
[3] Specification of RTE Software
AUTOSAR_SWS_RTE
[4] Specification of Communication
AUTOSAR_SWS_COM
[5] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral
[6] Requirements on Transformer
AUTOSAR_SRS_Transformer
[7] System Template
AUTOSAR_TPS_SystemTemplate
[8] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral
Oracle Analytics Cloud：分析用のデータをととのえる。データセットに表を追加する。

はじめに
---
Oracle Analytics Cloud(OAC)で分析をして、分析の対象となるデータセットに表を追加したいとなることがあります。対象となるデータセットについて表を追加してみます。

「データセットを作成する」の記事で作成したSALES表にはPROD_IDだけでどのような商品名か？商品はどのカテゴリに分類されるのか？が見たいとなることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/23150468-2698-7b28-2b25-7520d818fd90.png)


データセットを開く
---
データセットSALESに表を追加します。
OACのURLにアクセスします。上部にSALESと入力し、Enterキーを押下すると、データセットSALESが表示されます。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/afe6e0a0-e620-f244-c16d-e90f9394a318.png)

SALESの下部右側にマウスカーソルをあてると、…アイコンが表示されるので、クリックし、メニューがでてきたら開くをクリックします。
※SALESをダブルクリックすると、ワークブックの作成画面に遷移するので、間違えたら左上部の←アイコンをクリックし、戻ります。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/587ce164-ba0a-9cc6-0c65-39fa7f6728d6.png)

データセットに表を追加する
---
SALESが開いたら、下部の結合ダイアグラムをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1be49755-4024-4d5e-4335-5e79799d5e28.png)

接続名myadw2の左▼をクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/9a29b86f-6f74-a855-11f0-49df219f1ced.png)

スクロールダウンし、SHJPを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/9bd1b31e-a9ce-a934-17d3-4467b4bc5e07.png)

SHJPの左▼をクリックして展開し、追加したい表PRODUCTをダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ef33ae9d-aa72-08c4-5a88-6f1654da22d9.png)

SALESの右に追加した表PRODUCTが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a95258de-2c23-9980-3a73-179482568cf4.png)

PRODUCT表にはSALES表にあるPROD_IDと同じ列PROD_IDがあるので、自動で結合されました。
結合アイコンをクリックすると、結合条件が見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fec84a13-0e1d-addc-1d52-586a3243ff11.png)

明細表に、「グレインの保持」を指定しておきます。SALESにマウスカーソルを合わせ、右クリックします。グレインの保持をクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b100c023-5046-e65d-a768-061414699c94.png)

データセットを保存します。データセットの保存アイコンをクリックし、上書き保存します。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0c71eab0-7308-c4da-8d3c-1ec8d0de0aee.png)

以上で、データセットに表が追加されました。マルチデータセットという機能で、複数の表からなるデータセットが作成できるようになっています。AutoInsightという機能を利用する際にはグレインの保持を明細表/ファクト表がある表にセットしておきます。
Specification of LIN Driver, No.72, AUTOSAR R21-11(155) CP

Specification of LIN Driver, No.72, 2021-11

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


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

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

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

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

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

# 用語(terms)
|Term|Description|
|:--|:--|
|AUTOSAR |Automotive Open System Architecture
|COM|Communication
|ECU |Electronic Control Unit
|EcuM |ECU Manager
|DEM |Diagnostic Event Manager
|DET |Default Error Tracer
|ISR |Interrupt Service Routine
|LIN |Local Interconnect Network (as defined by [16])
|MCAL| MicroController Abstraction Layer
|MCU| Micro Controller Unit
|OS |Operating System
|PDU |Protocol Data Unit. Consists of Identifier, data length and Data (SDU)
|PID| Protected ID (as defined by [16])
|PLL| Phase-Locked Loop
|RAM| Random Access Memory
|RX |Reception
|SCI| Serial Communication Interface
|SDU |Service Data Unit. Data that is transported inside the PDU
|SFR| Special Function Register
|SPAL| Standard Peripheral Abstraction Layer
|SRS| Software Requirement Specification
|SW| Software
|SWS |Software Specification
|TP| Transport Layer
|TX |Transmission
|UART| Universal Asynchronous Receiver Transmitter
|XML| Extensible Markup Language
|Id| Identifier


## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] Specification of Standard Types
AUTOSAR_SWS_StandardTypes.pdf
[5] Specification of Default Error Tracer
AUTOSAR_SWS_DefaultErrorTracer.pdf
[6] General Requirements on SPAL
AUTOSAR_SRS_SPALGeneral.pdf
[7] Requirements on LIN
AUTOSAR_SRS_LIN.pdf
[8] Specification of LIN Interface
AUTOSAR_SWS_LINInterface.pdf
[9] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[10] Specification of MCU driver
AUTOSAR_SWS_MCUDriver.pdf
[11] Specification of Diagnostic Event Manager
AUTOSAR_SWS_DiagnosticEventManager.pdf
[12] Specification of ECU State Manager
AUTOSAR_SWS_ECUStateManager.pdf
[13] Basic Software Module Description Template,
AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[14] Specification of LIN Transceiver Driver,
AUTOSAR_SWS_LINTransceiverDriver.pdf
[15] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[16] ISO 17987:2016 (all parts), Road vehicles – Local Interconnect Network (LIN)
小ネタ：Marpでスライド作成する際に、リンクの色を変える方法

# 色を変えたい動機
仕事で[Marp](https://marp.app/)を使ってスライド作成する際、背景色を暗めに設定して作成するのですが、デフォルトのリンクの色が青で、見づらくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/a2c7a2cc-a4a3-1ed0-59f4-e99fdba13ce3.png)

これを変えたいと思って調べたことのメモです。

# 結論
Marpのstyleを設定するところで変えることができます。

# やり方
styleの設定で`a:link`で`color`を定義すればおｋです。
（CSSいじるのと一緒ですね、、、）

```
---
marp: true
theme: default
backgroundColor: #787878
color: white
paginate: true
style: |
    section.title {
        justify-content: center;
        text-align: center;
    }
    footer {
        color:white
    }
    section {
        justify-content: start;
    }
    a:link {
      color: #8af0b6
    }
    section::after {
        color: white;
    }
---
# ほげ
- [qiitaのHP](https://qiita.com/)
```

↑の結果はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/863293e3-63ba-3dd4-8177-2beaa6f709b1.png)
[Solidity] 配列・マッピングの用途

![Solidity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/c4e167e6-4ffd-9705-c467-bc383c972715.png)



いつもはflutterを書いているのですが、ブロックチェーンに興味をもち勉強を始めました。
アウトプットのために書こうと思います。
自分用のメモにも使います。

今回は、配列とマッピングの用途についてです。

# 配列のあれこれ

## 長さが決まっている配列


```solidity

pragma solidity >= 0.4.0 < 0.8.9;

contract Array {
    //uint型(整数)のリスト型
    uint [] numbers = [1,2,3,4,5];

    //リストを出力する
    function getNumbers() public view returns(uint[] memory) {
        return numbers;
    }

    //配列の長さを出力する
    function getNumberLength() public view returns(uint) {
        return numbers.length;
    }

    //数字を配列の後ろに追加する
    function addNumber(uint _number) public {
        numbers.push(_number);
    }

     //一番後ろの配列を削除できる
    function popNumber() public {
        
        numbers.pop();
    }
}

```

## 注意点

```solidity
pragma solidity >= 0.4.0 < 0.8.9;

 uint [] numbers = [1,2,3,4,5];

  //リストの数字を追加する
    function addNumber(uint _number) public {
        //以下のものはエラーになる
        numbers[5] = _number;
    }

```


## 長さが決まっている配列

```solidity

pragma solidity >= 0.4.0 < 0.8.9;

contract Array2 {
　　　　　　　 //数字がない場合は、「０」入る
    uint [6] numbers = [1,2,3,4,5];
    //->[1,2,3,4,5,0]


    //リストを出力する
    function getNumbers() public view returns(uint[6] memory) {
        return numbers;
    }

    //指定した配列番号（_index）の数字を指定した数字(_number)に変える
    function modifiyNumber(uint _index, uint _number) public {
        numbers[_index] = _number;
    }
}
```

# 注意点
```solidity

    function modifiyNumber(uint _index, uint _number) public {
        //データを削除したい場合は、_numberを０にするといい
        numbers[_index] = _number;
    }


```


## Map型

Map型は、アドレスやアドレスの残高の際に使用します。

```solidity

pragma solidity >= 0.4.0 < 0.8.9;

contract Mapping {

    mapping(address=>uint) balance;

    //送った人の残高を変える(今回はプラスする)
    function addBalance(uint _toAdd) public returns(uint){
        balance[msg.sender] += _toAdd;
        return balance[msg.sender];
    }

    //指定したアドレスの残高をみる
    function getBalance(address _adreess) public view returns(uint) {
        return balance[_adreess];
    }

}


```

## 注意点

```solidity

  //関数を実行した人のアドレスの取得
  balance[msg.sender] += _toAdd;

```



# 最後に

まずは基本からやっていこうと思っています。
修正点があれば、コメントください！！
運用・保守の現場で感じた、Linuxの知識の必要性

# 運用・保守の現場で感じた、Linuxの知識の必要性

　半年間システムの運用、保守業務を行い感じた知識不足により、困ったこと、こうしておけばよかったことを記事にしようと思います。

## こんな人に読んでほしい

・運用、保守業務に携わっている人
・単純作業に慣れ、自身が替えの効く作業者になっていそうな気がする人
・時々開発者の会話で分からないことがある人
・昨日の自分よりも成長したい

## この記事を読んで行動すれば得られること

・オプティマルデザイナー(＊1)になれる
・開発の方との会話、指示内容が分かる
・主体的に作業が行える
・経験が確実に次の現場で役立つ

少しでも当てはまったり、感じることがあればぜひ読んでいただきたいと思います。

## 運用・保守（オペレーター）の業務とは

　運用・保守の業務とは、システムの監視を行い、スケジュールの管理やエラー対応を行うことでシステムを安全に運行させていくことを言います。
開発者と、運用、保守を行う作業者は別で、基本的な仕事の流れとしては開発者から、依頼書が渡されその指示書通りに作業をするのが、オペレーターの仕事です。

## 現場で感じた作業者感

　実際の現場では指示書通りの作業をすれば良く、コマンド入力作業も、記載通りに入力し確認項目をチェックするだけの作業です。言わば誰でもできる作業で、上のポジションを取らないとずっと作業者のままということです。


## 現場でおきた悲劇

　そんな中現場で自分の知識不足を実感する出来事がありました。
夜間勤務の際、手順書に無いエラーが出て、開発担当者電話を掛けた時のことです。

自分：「○○で、○○というエラーが出て〇〇〇〇〇…」
開発者：「そしたらコマンド実行画面からpingコマンド打ってもらっていい？」
自分：「ping？」

何も知識がなかった自分はpingコマンドとは何ぞや？という状態になってしまい、上席と電話を代わることとなってしまいました。

結局その対応は上席が対応し、終了しましたが、私の知識不足で、上席の方にも対応していただくことになり、開発者の方も、深夜遅い時間に長い時間対応いただく結果となってしまいました。

みなさんの現場でも、上司の言った内容が理解できなかった、など似た事象が起きたことは無いでしょうか？

## 分かればチャンス

　しかしこの経験をしたことで、学べたことが3つあります。
①	コマンドの知識があるだけで、開発者と会話が理解できる
②	回りのオペレーターも意外と知らない人が多い
③	分かれば周りの人と差別化できる
この3点は特に感じたことです。オペレーターは日々指示書通りの作業を行っているので、歴が長い人でもよく分かってない方もいました。

これは非常にチャンスだと感じました。
自分自身の成長だけでなく、周りの人とも差別化を図ることができます。
運用保守の業務は特に慣れてくると単純作業になるため、自分から学習しないと、成長も止まってしまいます。
　
　これをきっかけに、足りなかった知識に加え、現場でよく使うコマンドの知識は[Linux標準の教科書(無料)](https://linuc.org/textbooks/linux/)を使い学習しました。結果として、現場の上司や、開発担当の方との会話も少しずつ分かるようになり、現場でも任せてもらえる幅が増えてきました。

## 今からでも遅くないぜひ挑戦を！

　これから運用の現場に行く方、すでにいる方、その他の方も、ぜひLinuxの知識を入れておくことをお勧めします。現場では苦い経験もしました。ですが、Linuxの理解があるだけで、開発者側との会話を理解できますし、自分で対応する事ができるかもしれません。またこの経験は次の現場でアピールできるはずです。

例えば、
「現場ではコマンドプロンプトを使い運営からの指示のもと作業していました」
よりも
「通信のエラーが生じた際はpingコマンドを用いて通信状態の確認を行ったり…」と答えられた方が、同じ運用の現場にいたとしても印象が全然違って見えると思います。

それぞれの現場でオブジェクティブのメンバーが少しでも市場価値の高いオプティマルデザイナーになっていくために、勉強してみてはいかがでしょうか。

OBGでは現在LinuCの資格取得に向けた取り組みも始まっています。
私も資格取得に挑戦します！

この記事でも一人でも心に火をつけることができていたら幸いです。
最後まで読んでくれたあなたに幸あれ！

(＊1)
オプティマルデザイナー：最適な提案を設計して自己実現できる人