OmniAICreator/Qiita-1.07M huggingface dataset:
ガウス過程と機械学習(ノート目次)

# ガウス過程と機械学習3章のノート
- [ガウス過程と機械学習](https://www.kspub.co.jp/book/detail/1529267.html)を読んだ自分用のノートです
- 後で見返す用なので、細かすぎることは書かずあらすじ程度の内容
- 詳しいことは本を買って読んでみてください
- 誤字脱字、間違いなどが有りましたらコメントよろしくおねがいします。
- ベイズ系の話を理解するときに自分が引っかかった部分を丁寧に書いたつもりです。
- python で実装しています。


自分のノートの目次記事
# 
- [ガウス過程と機械学習- 第0章](https://qiita.com/yoneXyone/items/52611e3580f0c4bb480c)
- [ガウス過程と機械学習- 第3章(1)](https://qiita.com/yoneXyone/items/d149471e9581cd3b912c)
- [ガウス過程と機械学習- 第3章(2)- ガウス過程回帰モデル](https://qiita.com/yoneXyone/items/affad2bd8d08cff6b571)

## メモ
- [ガウス過程回帰のメリットデメリット](https://qiita.com/yoneXyone/items/c6f6acc83404610fc6f5)

## 参考文献
詳細な参考文献は各ノートを御覧ください
- [ガウス過程と機械学習](https://www.kspub.co.jp/book/detail/1529267.html)
プルリク LEGO のすすめ

# はじめに
我々のチームは、プルリクが完了する度に 1 工程ずつレゴブロックを組み立てていく取り組みをしています！つい先日、GTR を組み立てることができました！

![プルリクLEGO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/35719ca3-2c69-587d-0fa5-39209f8689f7.jpeg)

# レビュワーの負担を減らすために巨大なプルリクを出さない
レビュワーの負担を減らす取り組みで、プルリクに視点を置いてみました。
コミットだけでなく、プルリクもそれなりに分けて出していこう！ということです。

どのくらいの単位でプルリクを出していくかは難しい問題ですが、今回の記事は前向きな気持ちでプルリクをたくさん出せるようにするやり方のすすめになります。

プルリク LEGO はプルリクが完了する度に 1 工程ずつレゴブロックを組み立てていくので、たくさんプルリクを完了させたい衝動にかられます！必然的にプルリクをたくさん出したくなるのです！
また、プルリクを出して満足してしまい、完了させるのに時間がかかってしまう問題もあります。プルリク LEGO ではその問題も解消できるでしょう。

みなさん、**プルリク LEGO** おすすめです。
【Linux】「パスを通す」についてのメモ

会社で契約してるあまり使われてない専用サーバ（CentOS）にSSHログインしComposerをインストールした時のメモ。そもそもの「パスを通す」の意味は以下記事様がわかりやすく解説してくださってます。

https://developers-book.com/2020/12/05/427/




## パスを通す必要があるか
既にパスが通っているディレクトリにcomposerをインストールする（できる権限があり、適切なディレクトリである）のであればパスを通すという作業は必要ない。

逆に、「レンタルサーバーにcomposerをインストールしたいが、既にパスが通っているディレクトリに対する書き込み権限がない」などの場合はパスを通す必要が有る。

「既にパスが通っているディレクトリ」は`$PATH`もしくは `printenv`で確認できる。

なお、グローバルにインストールするなら、Linuxの場合だとusr/local/binあたりのディレクトリを使用するのが適切かと思われる。そのあたり以下記事様がわかりやすく解説してくださってます。

https://qiita.com/valzer0/items/67a4c8bf2b1be0fc825a



　
## 既にパスが通ってるディレクトリを使う場合

既にパスが通ているディレクトリを使えるなら以下記事様が説明してくださってるような方法で問題ない。

https://www.wakuwakubank.com/posts/415-php-composer/

　
## パスが通っていないディレクトリを使いたい場合

この場合は当然パスを通す必要がある。
パスを通すには環境変数である$PATHにパスを通したいディレクトリを追記する必要がある。
ただしこの$PATHはターミナルを閉じるとリセットされてしまう。
そこで、bash_profileやbashrcというファイルを使用することになる。
詳しくは以下記事様がわかりやすく解説してくださってます。

https://qiita.com/shobooon/items/7a30f29091a6f8198f43
Requirements on Free Running Timer, No.211, AUTOSAR R21-11(228) CP

Requirements on Free Running Timer, No.211, 2021-11

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


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

AUTOSAR 21-11, 200文書読んだ。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 Programming Interface
|BSW |Basic Software
|COM| Communications
|ECU| Electronic Control Unit
|GPT |General Purpose Timer (SWS Module)
|HW |Hardware
|Tick |One increment of the HW timer =HW Timer Tick; If not explicitly noted Hardware timer is meant. TickType consists of many HW-Timer Ticks; If this is meant it will be pointed out explicitly.
|Interval of Timer| Distance in time between two measure points
|OS |AUTOSAR Operating System
|Range of Timer|Maximum interval the timer may cover
|Reset Timer |Timers which start on exceeding of a predefined margin with an also predefined value.
|Resolution of Timer|Minimal time interval which may be measured
|SI |International System of Units (abbreviated SI from the French language name Système International d'Unités)
|SLA |Software Layered Architecture
|SWC |Software Component
|SWFRT| Software extending features of HW Free running timers
|Test Value |Value against which the present read out is tested (e.g. compared).
|Wrap Around|The action taken when a timer reaches the defined maximum value.

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

T.B.D.

# 参考(reference)

[1] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[2] Glossary
AUTOSAR_TR_Glossary.pdf
[3] Specification of GPT Driver
AUTOSAR_SWS_GPTDriver.pdf
[4] Specification of Operating System
AUTOSAR_SWS_OS.pdf
[5] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
共通鍵暗号方式/公開鍵暗号方式/ハイブリッド方式の備忘録

<h2>公開鍵暗号方式/共通鍵暗号方式/ハイブリッド方式の備忘録</h2>
<h4>私の理解</h4>
<div>
<ul>
　<li>共通鍵暗号方式(AES)
<p>共通鍵で暗号化・複合する。ファイルの暗号化・複合に時間がかからない（かからないというか、暗号化するための鍵の長さを短くしているから時間がかからない。）ただし、共通鍵がバレたら復号できちゃう。。。</p>
<li>公開鍵暗号方式(RSA)
<p>自分で秘密鍵を用意して、秘密鍵から公開鍵を作る（秘密鍵は自分でのみ持っている）。サーバに公開鍵を渡して、公開鍵でファイルを暗号化してもらう。公開鍵で暗号化されたファイルは自分の秘密鍵でしか復号できない。

（復号できないというか、復号できないように鍵の長さを長くするという話。別に公開鍵で暗号化されたものは自分の秘密鍵でしか復号できないのではなく、暗号に使う鍵を長くして読み取りにくくしている。で長いからファイルを復号するのも時間がかかる。）
</p>
<li>ハイブリッド方式
<p>共通鍵を公開鍵暗号方式で暗号化する。共通鍵暗号方式のバレたら復号できちゃうのでダメなので、バレないように使用。→共通鍵自体を頑張って暗号化しようぜ！って話</p>
<li>感想
<p>結局、ハイブリッド方式は短い鍵長で暗号化したファイルを送るんだから、鍵が読まれたら終わりじゃね？というか共通鍵方式と何が違うの？って思ったんだけど、読み取る側で考えると違うのか。
秘密鍵って、公開鍵と暗号化されたファイルがあれば読み取れそうな気もするが、読み取れないように鍵長を長くしているって理解でいいよね？（udemyの例を見ると何となく読み取れそうな気がしてしまったけど、実際はそんなもんじゃないという話かな。）
<pre> ■読み取る側
・共通鍵
1.共通鍵をゲット
2.暗号化文をゲット
→読み取れました。

・ハイブリッド
1.共通鍵をゲット
２.秘密鍵をゲット（これが無理って話よね？）
3.暗号化文をゲット
→読み取れました。
</p>
</pre>
</ul>
</div>

<div>
<ul>公開鍵暗号方式
    <li>【クライアント側】秘密鍵で公開鍵を作って、サーバに公開鍵を渡す</li>
    <li>【サーバ側】で公開鍵でデータを暗号化してもらう</li>
    <li>【サーバ側】公開鍵で暗号化されたデータも受領</li>
    <li>【クライアント側】秘密鍵で暗号化されたデータを複合</li>
</ul>

<ul>共通鍵暗号方式
<li>共通鍵で暗号化・複合</li>
</ul>
<ul>ハイブリット方式
<li>【クライアント側】秘密鍵から公開鍵を作って、サーバに公開鍵を渡す</li>
<li>【サーバ側】公開鍵から共通鍵（秘密鍵じゃないと読み取れない鍵）を作って共通鍵をクライアントに渡す</li>
<li>【サーバ側】共通鍵でデータを暗号化してクライアントに渡す</li>
<li>【クライアント側】共通鍵（秘密鍵で共通鍵を複合）でデータを複合</li>
</ul>

<h4>参考</h4>
https://udemy.benesse.co.jp/development/blockchain/public-key-cryptography.html
<blockquote>
今回は仮に公開鍵(3、33)、秘密鍵(7、33)として、実際に17という数を暗号化してみましょう。

暗号文=17<sup>3</sup> mod 33
　　　    =4913 mod 33
　　　    =29
</blockquote>
公開鍵の3,33がわかっていれば、29という暗号化された分から候補は見れそうだけど、
この公開鍵がめちゃめちゃ長けりゃ候補も多いし、現実無理っしょって話なのかな。


https://www.infraexpert.com/study/security4.html
https://www.ipa.go.jp/security/enc/qa.html
https://cybersecurity-jp.com/column/53774
SQLでcolumnの編集をするコマンド

こんにちは
`SQL`駆け出し少年です。

先日、`column`の`NULL制約`を編集して`NULLABLE`から`NOT NULL`に変更しようとしたのですが、できなかったのでメモです。

# 環境
`AWS Lightsail`上の`Amazon Linux 2`です。
```
mysql  Ver 15.1 Distrib 10.5.10-MariaDB, for Linux (x86_64)
```

# 結論

`NULL制約`の変更は以下のコマンドで行います。

```sql
ALTER TABLE {TABLE名} CHANGE {COLUMN名} {COLUMN名} {型} NOT NULL;
```

一つ目の`COLUMN名`と二つ目の`COLUMN名`は同じです。

**`COLUMN`編集は`CHANGE`です。**

# エラーの原因

なんだか`Googleセンセ`に聞くと上位検索結果に`ALTER COLUMN`なんて出てきますね。
吾輩は`not null sql column`って検索して、ばっちり騙されてばっちり怒られました。

```
ERROR 1064 (XXXXX): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'varchar(255)' at line 1
```

検索結果ほとんど`alter`なんですけど、これは何なんですかね。
無知なので有識者いましたらご教示ください！

それではご機嫌SQL!
【環境構築】dockerでjupyterlabの環境を構築する

## 背景
- 機械学習をローカル環境のjupyterlabでしていると、ライブラリの依存関係がバグって昔作ったプログラムが動かなくなることがあった。
- dockerで環境を明示的にして、作ったプログラムが動かなくなる事態を避けたい。
- なんなら、githubとかにコード上げるときもdockerfileとセットで上げておいて「環境が違うから動かんやんけ。」って思われないリポジトリにしたい。

## 使用したファイルのgithub
https://github.com/takuma-competition/docker_jupyterlab

## 目標
- dockerで使用するライブラリも明示的に指定したjupyterlab環境を構築する。

## 前提
- dockerを多少は使ったことがある。

## 環境
- macOS 11.4 (20F71)
- arm64(M1)

## ファイル構成
```bash:
.
├─ Dockerfile         #どんな「docker images」を作るのか記載された設計図みたいなファイル
├─ docker-compose.yml #「docker container」の起動コマンドをまとめたファイル
├─ requirements.txt   #最初から入れておきたいライブラリを記載しておくファイル
└─ workdir            #「jupyterlab」を立ち上げるカレントディレクトリにするフォルダ（名前はなんでも良い）
   └ 作業で使用するファイルとか
```

## ファイルの中身
```docker:Dockerfile
FROM python:3.9@sha256:f3ea0f7b3662c33b650f763a365b2c3e3c7695ab1658fd0987150708b1f5f0e6

COPY requirements.txt .

RUN pip3 install --upgrade pip && \
    pip3 install -r requirements.txt && \
    pip install jupyterlab

WORKDIR /workdir
```

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

services:
  jupyterlab:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    container_name: jupyterlab
    working_dir: '/workdir'
    tty: true
    volumes:
      - ./workdir:/workdir
    ports:
      - "8080:8080"
    command: jupyter-lab --ip 0.0.0.0 --port=8080 --allow-root --no-browser --NotebookApp.token=''
```

```python:requirements.txt
#今回はサンプルとしてnumpyとpandasだけにしている
#使いたいライブラリがあればここに記載しておこう
numpy
pandas
```

## 起動方法
- dockerが起動している状態であれば、ファイルがあるカレントで下記コマンドを実行するだけ。
```
$docker-compose up --build
```
- うまくいけば、jupyterlabが自動起動するので、[http://127.0.0.1:8080/lab](http://127.0.0.1:8080/lab)にアクセスする。
- これで、「requirements.txt」に明示的に指定したライブラリが入ったjupyter lab環境で作業ができる。

## 補足
- 投稿者はdockerとか詳しくないので、間違ったことを書いてるかもしれないので悪しからず。

## 参考資料
- 阿佐 志保，プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化，翔泳社，2018.

https://www.shoeisha.co.jp/book/detail/9784798153223

https://qiita.com/plumfield56/items/335cad3b58afe55f6529

https://utouto97.hatenablog.com/entry/2022/03/15/092924


## 個人ブログ

https://takuma-tech.com/2022/09/27/176/
scipy.stats: 一元配置分散分析 -- Welch の方法

# scipy.stats: 一元配置分散分析 -- Welch の方法

scipy.stats の `f_oneway` は，各群の母分散が等しいと仮定する，古典的な検定である。

R では，等分散を仮定しない Welch の方法がデフォルトであるが，Python ではどのライブラリにもない。

じゃあ，作っちゃお。

## 関数定義


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

def oneway_ANOVA(*x, equal_var=False):
    k = len(x)
    ni = np.array([len(y) for y in x])
    mi = np.array([np.mean(y) for y in x])
    vi = np.array([np.var(y, ddof=1) for y in x])
    if equal_var:
        n = sum(ni)
        mean_x = sum(ni * mi) / n
        df1, df2 = k - 1, n - k
        F = sum(ni * (mi - mean_x)**2) / df1 / (sum((ni - 1) * vi) / df2)
    else:
        wi = ni / vi
        sum_wi = sum(wi)
        tmp = sum((1 - wi / sum_wi)**2 / (ni - 1)) / (k**2 - 1)
        m = sum(wi * mi) / sum_wi
        df1, df2 = k - 1, 1 / (3 * tmp)
        F = sum(wi * (mi - m)**2) / (df1 * (1 + 2 * (k - 2) * tmp))
    return F, f.sf(F, df1, df2)
```

## 使用例

引数に各群の配列，リストを列挙すればよい。

デフォルトで Welch の方法による検定を行う。

戻り値は，検定統計量 $F$ 値と $p$ 値のタプル。


```python
a = [0.0571, 0.0813, 0.0831, 0.0976, 0.0817, 0.0859, 0.0735, 0.0659, 0.0923, 0.0836]
b = [0.0873, 0.0662, 0.0672, 0.0819, 0.0749, 0.0649, 0.0835, 0.0725]
c = [0.0974, 0.1352, 0.0817, 0.1016, 0.0968, 0.1064, 0.105]
d = [0.1033, 0.0915, 0.0781, 0.0685, 0.0677, 0.0697, 0.0764, 0.0689]
e = [0.0703, 0.1026, 0.0956, 0.0973, 0.1039, 0.1045]

oneway_ANOVA(a, b, c, d, e) # (5.6644794946224915, 0.005079648192270907)
```




    (5.6644794946224915, 0.005079648192270907)



`equal_var=True` オプションは指定しないようにしよう。


```python
oneway_ANOVA(a, b, c, d, e, equal_var=True) # (7.121019471642447, 0.0002812242314534544)
```




    (7.121019471642447, 0.0002812242314534544)



# **以下は読む必要なし。**

「まず，等分散性の検定をして，その結果により（等分散性を仮定する）一元配置分散分析を採用するか，クラスカル・ウォリス検定を行うか決める」などと，古臭いことを書いてある教科書，サイトがあっても，信じてはいけない。

常に，等分散性を仮定しない Welch の方法による一元配置分散分析を行えばよい。



```python
from scipy.stats import f_oneway
f_oneway(a, b, c, d, e)
```




    F_onewayResult(statistic=7.121019471642447, pvalue=0.0002812242314534544)
【Nuxt.js】axiosのリクエスト送信/レスポンス受信の共通化を行う

# この記事について
axiosを使用する際に、どのHttpリクエスト送信時にも同じヘッダをつけたい場合や、Httpレスポンスハンドリングの共通化を行いたい場面があるかと思います。
この記事でNuxt.jsのpluginsを使用して、リクエスト送信/レスポンス受信の共通化を行う方法を記載したいと思います。

# 環境
|内容|バージョン|
|---|---|
|nuxt|2.15.8|
|@nuxtjs/axios|5.13.6|

# プラグインの作成
以下のディレクトリ構成を想定します。

```
someProject
├pages
| └index.ts
├plugins
| └axios
|   └axios.ts
└nuxt.config.js
```

nuxt.jsのpluginとしてaxiosプラグインを作成します。
axiosプラグイン内には大きく4つの処理を作成しますが、それぞれ以下の内容となっております。

* onRequest...リクエスト送信時（ `this.$axios.get` など実行直後）に呼び出される
* onResponse...レスポンスステータスコードが200台の場合に、レスポンス取得時に実行される
* onResponseError...レスポンスステータスコードが400台や500台の場合に、レスポンス取得時に実行される
* onError...onRequestなどリクエスト送信処理でエラー発生時に実行される

```plugins/axios/axios.ts
import { Context, Plugin } from '@nuxt/types';
import { AxiosResponse, AxiosError } from 'axios';

const plugin: Plugin = ({ $axios }: Context) => {
  $axios.onRequest((config) => {
    config.headers.Authorization = 'some value';
    return config;
  });
  $axios.onResponse((response: AxiosResponse) => {
    const responseBody = response.data;
    // responseBodyに関する処理
  });
  $axios.onResponseError((error: AxiosError) => {
    const response = error.response;
    // responseに関する処理
  });
  $axios.onError((error: AxiosError) => {
    const response = error.response;
    // responseに関する処理
  });
};

export default plugin;
```

作成したpluginを `nuxt.config.js` の `plugins` に登録します。

```nuxt.config.js
export default {
  plugins: ['~/plugins/axios/axios.ts'],
}
```

# 共通化した処理の動作確認を行う
実際にaxiosを用いてHttpコールアウトを実行してみましょう。

```pages/index.vue
<template>
  <button @click="callout">Callout</button>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  methods: {
    async callout() {
      await this.$axios.get('https://example.com');
    },
  },
});
</script>
```

レスポンスが200台の場合は、以下の順で処理が実行されます。

1. pages/index.vueの `callout`
1. plugins/axios/axios.tsの `onRequest`
1. plugins/axios/axios.tsの **`onResponse`**

レスポンスが400台や500台の場合（サーバサイドでエラーが発生した場合）は、以下の順で処理が実行されます。

1. pages/index.vueの `callout`
1. plugins/axios/axios.tsの `onRequest`
1. plugins/axios/axios.ts **`onResponseError`**

# 参考
[Nuxt.jsでaxiosの共通処理を作成し、API呼び出し処理をラップして使用する](https://qiita.com/itouuuuuuuuu/items/4132e3b7ddf2cbf02442)
fishの環境構築 (M1 mac)

fishを導入する際に少し躓いたので備忘録として残しておく。

## fishをインストール

```
brew install fish
```

M1 macでは、パスが異なるので注意。
`/opt/homebrew/bin/fish`にインストールされる。

## fishのパスを追加
`vi /etc/shells`で末尾に
```
opt/homebrew/bin/fish
```
を追加する。

```
chsh -s /opt/homebrew/bin/fish
```
でデフォルトのシェルを変更する。
再起動すると、shellがfishに変更される。

## fishにbrewのパスを通す

fishはbashやzshと非互換であり、brewのPATHが通っていない（`echo and $PATH`で確認できる）。

セッションを起動するために環境変数が設定されるよう、`config.fish`を書き換える。
`vi ~/.config/fish.config.fish`で
```
set PATH /opt/homebrew/bin $PATH
```
を追加する。

```
fish_config
```
コマンドで見た目を変えられる。

https://akashima.net/2021/11/06/1189/
https://qiita.com/ledsun/items/8ca1a450b21c8ebc9670
5.9 (易) 確率変数列としての標本平均

## 答案

![5.-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/fa08a908-a2ca-b696-04ac-da2cca882844.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
清水吉男氏の書籍を読んで重要だと思ったことまとめ

# はじめに
清水吉男氏の以下の2つの書籍を読んで重要だと思ったことをまとめておく。
* 「「派生開発」を成功させるプロセス改善の技術と極意」 ，技術評論社，2007
* 「[改訂第2版] [入門+実践]要求を仕様化する技術・表現する技術 ～仕様が書けていますか?」，技術評論社，2010

https://bookmeter.com/books/422459

https://bookmeter.com/books/594768

まとめていることは、派生開発カンファレンス2022での発表で参考にさせていただいたことである。

https://affordd.jp/libraries/affordd-conference2022-denso-create/


# 『「派生開発」を成功させるプロセス改善の技術と極意』

## スペックアウト P.60、P.109、P.128、P.129
> 設計書の不足を補うために、ソースコードから必要な設計書を起こす行為を「スペックアウト」と呼んでいます。

> 具体的な変更箇所や変更すべき項目（変更仕様）を拾い出すために、ベースのソースコードを読んでそこで行われている処理を理解することになります。このとき、適当な設計資料が残されていない場合は、理解した内容を「設計書」を補完するような資料の形にして残します。この行為を「スペックアウト作業」と呼んでいます。

> ソースコードを読むのは、必ずしも変更箇所を探すためとは限りません。変更仕様は見えているのですが、それを確かめるためにソースコードを読むこともあります。

### 調査の結果わかったことを残す資料の形
> * 関数の呼び出し関係を構造図にする
> * クラスの関係を理解した状態を図と説明にする
> * 構造体の図を描いて個々の要素のとる値の範囲や説明を付ける
> * グローバルデータを表にして、アクセスしている関数との間でマトリクスを作る

## 変更要求に対して変更仕様を抽出する方法 P.144
> * ベースのソースコードに対応する機能仕様書や操作仕様書などの文書から変更箇所を拾う
> * 関係しそうな箇所のソースコードを読んで，変更する箇所を拾う
> * ソースコードの関係個所をスペックアウトしながら，変更する箇所を拾う

## 変更要求単位で該当箇所を探す P.179
> ソースコードから変更仕様を抽出する作業は、必ず「変更要求単位」で行います。「スペックアウト」によって作成された成果物は、変更要求が所属する機能に対応した資料となり、その過程で発見した変更箇所を「変更仕様」として変更要求の下に記述することができます。

## 補助資料の効能 P.221
> 派生開発における影響範囲は、通常の処理構造などの「スペックアウト」だけでカバーしきれないことも少なくありません。

### 変更が影響することを見逃さないために理解しておくべきこと
> * 機能の依存関係
> * 機能とパラメータの関係
> * ハードのリソースとそれを使う機能の関係

## 成果物のレビュー P.318
> XDDPではこのほかに、変更要求に対してスペックアウトで作成した成果物や、現状のアーキテクチャを解析したときの成果物などがあります。このような調査資料は公式にはレビュー対象になっていませんが、このソフトウェアシステムを調査した担当者が認識を間違えたままではこのあとで正しい変更作業はできません。

# 『[改訂第2版] [入門+実践]要求を仕様化する技術・表現する技術 -仕様が書けていますか?』

## 要求仕様にまつわる問題の種類 P.34
> * 仕様の記述モレ
> * 良い手が仕様を誤って解釈してしまう仕様の誤解釈
> * その仕様が自分に関係する仕様とは気づいていないという認識不足
> * テストの段階に入ってようやく発見される仕様間の衝突

## 設計の階層 P.75
> 設計には段階があります。

> 各段階における仕様に対して、これら3つの視点から実現方法を考え決めていくことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243842/7db45aec-15e8-2fa4-5a4b-e1e9dcb93bf8.png)

## "仕様"になっていない P.92
> 要求仕様書のレビューで一番の障害は、そこでの表現が「仕様」になっていないことです。まだ抽象的な表現が残っていて、その表現のなかにどこまでの動きを含んでいるか見えないのです。つまり、書き手がどこまで認識してこのような文章（仕様表現）にしたのかが見えないため、漏れていると指摘するにも迷ってしまうのです。

## 要求の分割の基準 P.201
> * 時系列分割（時間軸分割）
> * 構成分割
> * 状態分割
> * 共通分割

## 何が変更されるかを表現する P.304
> 「変更要求」をしっかりと表現する

> 変更要求で大事なことは、それが“変更”であることを明確に表現すること

## 差分を書く P.305
> 派生開発における「要求」は、基本的には現在のシステムに対する「差分」です

## ソースの変更を変更仕様として記述する P.307
> ソースコードを変更するということは、ソースコードになった「仕様」を変更するということです。この場合の「仕様」は、最初の機能の振る舞いを記述した仕様とは限りません。設計工程の分割と階層化の過程でクラスや関数の仕様として設定した仕様が対象となることがあります。

> 「変更要求仕様書」では、このような実装レベルの仕様（ソースコードになっている）の変更も変更仕様として記述することを求めます。

> 派生開発のトラブルの多くはこの種の変更を「仕様変更」として記述しないところから発しているのです。

> 派生開発において、このような実装レベルの仕様の変更を「変更要求仕様書」に記述しなければ、重大な変更のミスを発見する機会を失うのです。

# 関連記事
https://qiita.com/kazuo_reve/items/bce7522fa2cca0995b85

https://qiita.com/kazuo_reve/items/989274a57fcb9b54ab6f
[Oracle] OCI資格(1Z0-1072-21-JPN) 概要をまとめた

## はじめに
これから Oracle Cloud の資格取得を目指す方のための情報をまとめています。
2022年4月から変更された部分の新情報を盛り込んでいます。

対象オラクルマスター
・1Z0-1085-21-JPN Oracle Cloud Infrastructure Foundations 2021 Associate
・1Z0-1072-21-JPN Oracle Cloud Infrastructure 2021 Certified Architect Associate
・1Z0-997-21-JPN Oracle Cloud Infrastructure 2021 Certified Architect Professional

関連記事

https://qiita.com/nisshii0/items/a2007bdeddcbc6dbbacf

## 資格種類
Oracle Cloudの資格は多くありますが、一番一般的なものはアーキテクト系の資格で以下の3つです。
レベル別に、Foundations→Associate→Professionalとなります。
このあたりは、AWSなど他の資格と同様です。

この中でも入門レベルのFoundations（AWSでいうとプラクティショナー）は、2022年4月から正式に無償化されました。
自宅のPCから「オンラインで」「何度も」受験できるため、
まずはFoundationsを受験してOracle Cloud資格試験の体験をするとよいでしょう。
マニュアルや後述のテキストで学習した内容が、どのような問題で問われるの確認しておくのが重要です。



|難易度  |試験番号  |試験名  |試験時間 |問題数 |合格ライン |受験料 |
|---|---|---|---|---|---|---|
|入門  |1Z0-1085-21  |[Oracle Cloud Infrastructure Foundations 2021 Associate](https://education.oracle.com/ja/oracle-cloud-infrastructure-foundations-2021-associate/pexam_1Z0-1085-21)  |90分 |55問 |68% |無料 |
|中級  |1Z0-1072-21  |[Oracle Cloud Infrastructure 2021 Certified Architect Associate](https://education.oracle.com/ja/oracle-cloud-infrastructure-2021-architect-associate/pexam_1Z0-1072-21)  |90分 |60問 |65% |29400円(税抜) |
|上級  |1Z0-997-21  |[Oracle Cloud Infrastructure 2021 Certified Architect Professional](https://education.oracle.com/oracle-cloud-infrastructure-2021-architect-professional/pexam_1Z0-997-21)  |120分 |50問 |70% |29400円(税抜) |

試験番号の最後の21は試験バージョン(西暦)を表します。
2022年5月現在、21(2021年版)が一番新しい試験です。1Z0-1072-21が2021年版。1Z0-1072-20が2020年版になります。
特に理由がない限り最新版を受験するのがよいでしょう。


## 学習資料
試験ごとの学習方法は別途まとめたいと思いますのでここでは概要を記載します。

まずOracle Cloudの資格試験については、対策本は発売されていません。
体系的に学習したい方は、Oracle Cloudの書籍が2冊発売されていますので、それを使用するとよいでしょう。

またオラクル社からは、受験にむけた公式のWeb学習コンテンツが無償提供されています。
レベル毎に「研修講義の動画・PDFのテキスト・練習問題・模擬試験」が用意されているので活用しましょう。
利用にはオラクル社のサイトへのID登録が必要です。
ID登録については「[こちらの記事を参照してください](https://qiita.com/nisshii0/items/a80073051f790023562d)」

### オラクル社が提供する資格別学習資料
[オラクル社学習コンテンツ](https://education.oracle.com/learn/oracle-cloud-infrastructure/pPillar_640)

・学習コンテンツにアクセスして、「Administrator」セクションから学習したいレベルの「学習を開始する」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/f84cd748-22c3-55a6-d592-dc94ce0bac8a.png)

・以下のような動画で試験の単元ごとに学習できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/355a60b1-abed-e9df-75a5-5c85fb42f77f.png)
RTSPをPC/RasPi経由でYouTube Live

気づいたらATOM Cam2にRTSPのI/Fが出来ていたのでYouTube Liveにでも残したくなった

ffmpegでサクッと

---

2023/03/15 追記
Atom Cam2のファームアップデートしたところなにがしかの変わったようで、オプションをちょとつけないといけないようだ
というわけで、こんなコマンドにすると良さそう
```
ffmpeg -rtsp_transport tcp -i rtsp://<anata-no-ip>/live -ar 11025 -f flv rtmp://a.rtmp.youtube.com/live2/<stream_key>
````

相変わらず `Non-monotonous DTS ~~~` を消す方法がわからない
previousとcurrentの値が違いすぎるときはffmpegを起動し直すと早く近くなることがあるのでそれで逃げてる
誰か教えてくらはい

---
そのまま
`ffmpeg -i rtsp://<anata-no-ip>/live -f flv rtmp://a.rtmp.youtube.com/live2/<livekey>`

開始時に
```
[flv @ 0x7fffc4af7e80] Non-monotonous DTS in output stream 0:1; previous: 9422, current: 9393; changing to 9422. This may result in incorrect timestamps in the output file.
```
みたいなエラーが表示され続けるが、しばらくすると消えてくれる
音声のBitrateやらの不一致がそのうちいい感じになるのかもしれない

無音化
`ffmpeg -i rtsp://<anata-no-ip>/live -f lavfi -i aevalsrc=0 -map 0:0 -map 1:0 -shortest -f flv rtmp://a.rtmp.youtube.com/live2/<livekey>`
GitのコミットメッセージにPrefixをつけよう！

雰囲気で書いていたコミットメッセージのプレフィックス。

人によって色んな種類のプレフィックスがあり、個人的に「結局どれが良いんじゃ」と思ったのでまとめました。

## そもそもPrefixとは
Prefixとは接頭辞で、コミットメッセージの先頭に特定の文字をつけることです。

```
feat : 〇〇の機能を追加
refactor : 〇〇の機能をリファクタ
fix : 〇〇で起きていたバグを修正
```
feat, refactor, fixなどがプレフィックスです。

## なぜPrefixをつけると良いのか
プレフィックスがつくことにより、以下のメリットがあります
- レビューワーが何に対する変更なのか見やすくなる
- コミットをプレフィックスレベルで分けるようになるので、コミットの粒度が適切になる
- コミットログが検索しやすくなる

## よく使うPrefix一覧
色々な方の記事を参考にさせていただいたのですが、[Angular.js/DEVELOPERS.md](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type)へのリンクが多かったため、真似させてもらいました。

| Prefix | 意味 |
|:-----------|:-----------|
| add  | ちょっとしたファイル・コードの追加 ex)画像ファイル  |
| change  | ちょっとしたファイル・コードの変更 ex)画像差し替え  |
| feat | ユーザーが利用する機能の追加。`add/change`を内包しても良い。 |
| style | 機能部分を変更しない、コードの見た目の変化 ex)CSS |
| refactor | リファクタリング |
| fix  | バグ修正 |
| remove | ファイルなどの削除 |
| test | テスト関連 |
| chore | ビルド、補助ツール、ライブラリ関連 |

悩みどころだったのが、フロントで画像だけ差し替えるちょっとした修正やコードの追加は`feat`なのか？と疑問に思っていましたが、「**ユーザーが利用する機能かどうか**」でプレフィックスを随時分けていくのが一番しっくりきました。

## コミットメッセージの書き方
コミットメッセージにはWhatとWhyを書くのがおすすめです。
サラッとコミットメッセージを見ているだけでも意図が伝わりやすくなります。

```
fix: 〇〇のエラーが起きているため、△△を修正
```

ただ、チームで合意が取れているものはこの限りではないと思っています。
例えばVue2→Vue3に書き換えするとチームで合意が取れていれば、WhatとWhyがなくても良いと思っています。

```
例
refactor: 〇〇ファイルをcomposition apiに書き換え
```

## まとめ
- プレフィックスはユーザーが利用する機能かどうかで分けると良き！

プレフィックスつけた方が良いのはわかっているけど、適切なプレフィックスがわからん！！と思っていたのでこの機に使い方をまとめられて良かったです。

## 参考記事

https://pyteyon.hatenablog.com/entry/2020/02/27/092101

https://qiita.com/numanomanu/items/45dd285b286a1f7280ed

https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e

https://gist.github.com/mono0926/e6ffd032c384ee4c1cef5a2aa4f778d7
pythonでOSMnxを使って、地図上に最短経路を表示する方法

# はじめに
pythonでOSMnxを使って、福岡の博多駅から西鉄天神駅までの最短経路(徒歩)を表示します。世界中の道路情報を取得できるっぽいので、単純にすごいの一言。
一部調査したときに、pythonの3.9からOSMnxで使えないモジュールが出てきているみたい…。
一応、Windowsでコマンドライン実行もやってみたが、pip等での違いはない。

# 環境
- コマンドライン実行
  - Windows10(64bit)
  - python 3.9.13 

- Docker on Jupyter
  - Windows10(64bit)
  - Docker Desktop
    - python 3.9.13
    - Jupyter NoteBook 6.4.11


# pip実行
```shell
pip install osmnx
pip install scikit-learn
pip install folium
```
※scikit-learn は osmnxの一部モジュールでエラーが出るため必要


# プログラム
```python
# 福岡の博多区と中央区を指定
query = ["Hakataku,Fukuoka,Japan", "Chuo-ku,Fukuoka,Japan"]
# 博多区と中央区の道路データ(歩き用)を取得する(driveとかにすると、車になる)
G = ox.graph_from_place(query, network_type="walk")

# 博多駅の座標
hakatasta_loc = (33.58993304570779, 130.42074178084746)
# 天神駅の座標
tenjinsta_loc = (33.59164188388589, 130.39887879641677)

# 各駅のノードを取得
hakatasta_node = ox.nearest_nodes(G, hakatasta_loc[1], hakatasta_loc[0])
tenjinsta_node = ox.nearest_nodes(G, tenjinsta_loc[1], tenjinsta_loc[0])

# 最短経路を取得
shortest_route = ox.shortest_path(G, hakatasta_node, tenjinsta_node)
# 最短経路を地図にプロット
map = ox.plot_route_folium(G, shortest_route)

# 地図に各駅のマーカーを追加
folium.Marker(location=hakatasta_loc, tooltip="博多駅").add_to(map)
folium.Marker(location=tenjinsta_loc, tooltip="天神駅").add_to(map)

# 表示
map
# HTML保存
# map.save("map.html")
```

# こんな感じ（出力したHTMLのスクリーンキャプチャ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541739/347ba948-4804-258f-3a80-a31b6d7471ef.png)

# さいごに
田舎の方の舗装されていない道とか、情報公開してほしくない国とか都市とかありそうだけど、制限どうなっているんだろう…
Google Document で正規表現にてキャプチャした値を置換後に使う小技

Google Document は便利ですが、置換の機能に正規表現がありながら、
キャプチャした値を ```$1``` などで置換後に使えません。
Spreadsheet ならばキャプチャした値を、置換後に```$1```形式で使えるというのに残念。

「GAS を使ってみればいけるのでは」と思ったのですが、
やはり ```replaceText``` というGASの関数では無理でした。

そこでググってみると、うまいこと JavaScript の ```replace```関数と組み合わせてキャプチャ可能にしている方がおられたので、
実装してみると、いけました👍

そんなわけで、メモを残します。

```javascript
function ReplaceWords(){ 
  const docBody = DocumentApp.getActiveDocument().getBody()
  const paragraphs = docBody.getParagraphs()
  const regExp = '([0-9]{1,2})'//キャプチャ用の任意の正規表現
  paragraphs.map(para => {
    let text = para.getText()
    //GASのreplaceTextの中でreplaceにてキャプチャを使う
    para.replaceText(regExp,
      text.replace(new RegExp(regExp,'g'), '$1hogehoge'))
  })
}
```

こんな感じです。

これで、無事document上の文字列を、正規表現にて一括置換に成功しました。

便利便利。

参考にしたのは[こちら](https://webapps.stackexchange.com/questions/99922/how-to-use-text-from-capturing-groups-in-google-docs-regex-replace)
DatabricksにおけるProphecyの活用(実践編)

こちらのProphecyとの連携手順を実際に試した内容です。

https://qiita.com/taka_yayoi/items/4607a48fdbc07c12a441

1. Databricksにログインし、サイドメニューのParter Connectをクリックします。
![Screen Shot 2022-05-27 at 16.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/be075d8c-e6a4-ee6e-cccd-561ebb0319d8.png)
1. Prophecyを選択します。
1. サービスプリンシパルとパーソナルアクセストークンが作成される旨のメッセージが表示されるので**次のページ**をクリックします。
![Screen Shot 2022-05-27 at 16.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1e26d680-0b59-8e0d-581f-507f8da0e1c6.png)
1. Prophecyのアカウントに使用するメールアドレスを確認し、必要に応じて変更します(詳細は[こちら](https://qiita.com/taka_yayoi/items/4607a48fdbc07c12a441#partner-connect%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Fprophecy%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A)を参照ください)。
![Screen Shot 2022-05-27 at 16.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9e0497ed-79d2-10af-f35e-854a9aecf35c.png)
1. Prophecyのウェブサイトに移動します。
![Screen Shot 2022-05-27 at 16.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a4c1d4d8-3680-dbe2-1472-9cd3b48f6900.png)
1. Prophecyアカウントのパスワードを入力し**Connect**をクリックします。
![Screen Shot 2022-05-27 at 16.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/930927a0-c7c6-e68d-2484-0cfefefab765.png)
1. チュートリアルが表示されるので、これに従います。
![Screen Shot 2022-05-27 at 16.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/407a0005-eb33-f209-773a-12f7fad05625.png)
1. サンプルのパイプラインを実行することができます。
![Screen Shot 2022-05-27 at 16.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/50517a90-9711-aa38-6eb8-9d9ccd753aa3.png)
1.右上のクラスター選択画面で**Create new cluster**をクリックすることで、背後でDatabricksクラスターが作成され起動されます。
![Screen Shot 2022-05-27 at 16.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6428527e-439b-a1dd-8e95-23f8d060cd70.png)
1. このようにDatabricksクラスターが起動します。
![Screen Shot 2022-05-27 at 16.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3adffd90-a9e5-d495-f4d4-d293befbc30b.png)
1. クラスター起動状況もProphecyから確認することができます。
![Screen Shot 2022-05-27 at 16.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/18db60f0-cdc9-7354-28b2-bcf217ddcd5c.png)
1. 右下の再生ボタンでパイプラインを実行できます。しかし、ProphecyのGUIは洗練されてますね。ETLパイプラインの個々のパーツはジェムと呼ぶそうで。
![Screen Shot 2022-05-27 at 17.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/39ce757b-4212-d7aa-a85d-6edaac507c0f.png)

なお、このサンプルパイプラインの入力ファイル、そして、出力先も[DBFS](https://qiita.com/taka_yayoi/items/897264c486e179d72247)になるのでDatabricksのデータ資産をローコードETLしたいという場合にも、Prophecyを活用することでクイックに実現できます。
![Screen Shot 2022-05-28 at 15.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/97cbf023-827c-cee8-aaf1-ccc7dbf4c8ad.png)


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Excel方眼紙の編集に革命を起こすツールを開発した

# はじめに
このツールを導入すれば、Excel方眼紙の編集でイライラしたり悩んだりすることはなくなります。
むしろ、とりあえず方眼紙ってなってしまうかもしれません。
また、すでに作成されたExcel方眼紙以外の文書に対しても、後から簡単にレイアウトを崩さずに列を追加したり削除したりすることが出来ますし、Excel方眼紙に変換することも出来ます。
もちろん逆の変換も容易に出来ます。

# かんたんレイアウト

## 外観
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/72a63885-86d4-7b25-8657-f76cd5b0c8cf.png)

## おすすめの機能
## Excel方眼紙 を 通常文書 へ変換
![方眼から貼付け.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/方眼から貼付け.gif)

## 通常文書 を Excel方眼紙 へ変換
![方眼へ貼付け.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/方眼へ貼付け.gif)
 
## Excel方眼紙 を ピッチの異なるExcel方眼紙 へ変換
![ピッチの違う方眼へ貼付け.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/ピッチの違う方眼へ貼付け.gif)

## ピッチを変えずに全体の幅を拡大 または 縮小する
![拡大縮小.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/拡大縮小.gif)

## 列の比率を変えずに全体の幅を拡大 または 縮小する
![拡大縮小2.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/拡大縮小2.gif)

## 既存文書の列を分割
![列を分割.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/列を分割.gif)

## 既存文書の列を統合
![列を統合.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/列を統合.gif)

## Excel方眼紙の列を分割
![方眼列分割.gif](https://raw.githubusercontent.com/takanaweb5/EasyLout/master/Help/Animation/方眼列分割.gif)

# お試し
以下のリンクをクリックすれば、サンプルのExcelファイルが開きますのでいろいろお試しください。
[sample.xlsm](https://github.com/takanaweb5/EasyLout/releases/download/V5.0/sample.xlsm)
<font color=RED>注意：Windows版のEXCEL2010以降で動作します(32,64bitいずれも可)</font>
上記のファイルの実行がセキュリティ問題によりできなかった時は、以下のアーカイブファイル内にあるsample.xlsmで試してください。
[sample.zip](https://github.com/takanaweb5/EasyLout/releases/download/V5.0/sample.zip)
※上記は以下のページのファイルへのリンクです
https://github.com/takanaweb5/EasyLout/releases


# ダウンロード
以下のページのEasyLout_v51.zipをダウンロードください。
https://github.com/takanaweb5/EasyLout/releases

Vectorのサイトからダウンロードも可能です。
http://www.vector.co.jp/soft/win95/business/se365623.html

# インストール方法
アドインに登録して使用します。
詳しくは以下のヘルプに記載しています。


# ヘルプ
詳しい使用方法は、以下のサイトを参照ください。
[http://takana.web5.jp/EasyLout/V5](http://takana.web5.jp/EasyLout/V5/?r=qt)

# 紹介記事
窓の杜

https://forest.watch.impress.co.jp/docs/news/1413439.html

# ソースコード
プロジェクトのパスワードは「3」で直接見れます
[github](https://github.com/takanaweb5/EasyLout)でも公開しています

# 最後に
このツールを気に入って頂けましたら、<font color=red><b>いいね</b></font> お願いします。
人に薦めたいほど気に入って頂けましたら、ブログやツイッターで紹介して頂ければうれしいです。
多くの人の反響が、開発の励みになります。


ちなみ以下のアイコンエディタはこのツールのアイコンを作成するのが開発動機となって作成しました

https://qiita.com/takahasinaoki/items/f3f49ac12df0634268a6
仮想環境を作成〜削除のやり方 -Python

# 概略
Pythonの仮想環境の作成機能のvenvを用いて
仮想環境の作成、有効化、無効化、削除までをまとめた。
※今回の記事はUNIX系OSのためWindows版は他の記事をあたってください

# 仮想環境の作成
```
python3 -m venv env
```

# 仮想環境の有効化
zshの場合
```
source env/bin/activate
```

bashの場合
```
. env/bin/activate
```

仮想環境を有効化したら下記コマンドを実行しpipを最新化します
```
pip3 install --upgrade pip
```

必要があれば、Djangoなど開発に必要なパッケージをインストールしてください
```
pip3 install Django
```

# 仮想環境の無効化
```
deactivate
```

# 仮想環境の削除
```
rm -rf env
```
STM32G031で半二重通信で遊ぶ


x 動作確認済み2022/5/28 19:26


x OBでリセットオンリーがわかる人むけ


目的
RXまたは、TXの1ピン削減する。
動くかどうかわからない




```c++

    void setHalfDuplex(void);
    bool isHalfDuplex(void) const;
    void enableHalfDuplexRx(void);

```

(成功)

![o_con497.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/82e8d89e-1f4c-fc8e-2f9f-4c0835aaa13e.jpeg)



名前は、まだない。


```C++



//SER_HalfDuplex_test_031_1


#include <Arduino.h>
#include <HardwareSerial.h>


//初期化
void setup() {

  Serial.setHalfDuplex();
  Serial.begin(9600);

  pinMode(PB7, OUTPUT);

}//setup


//メインループ
void loop() {

  Serial.println("Hello World");

  digitalWrite(PB7, HIGH);
  delay(1000);
  digitalWrite(PB7, LOW);
  delay(1000);

}//loop




```

--------------------------------------------------------


(成功)


![o_con498.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/56798101-f27c-5954-5582-cfc8bae0edb9.jpeg)



```c++


//SER_HalfDuplex_re_test_031_1

#include <Arduino.h>
#include <HardwareSerial.h>

//プロトタイプ宣言
void pc_putc(char ch);
int pc_printf(char *str1);
#define TX1        PA11  // 6pin


int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while (!Serial.available()) {}      // 受信データがあるか？
  u_key = Serial.read();            // 1文字だけ読み込む

  return (u_key);
}


//初期化
void setup() {

  Serial.setHalfDuplex();
  Serial.begin(9600);
  Serial.enableHalfDuplexRx(); //オープンした後で切り替え

  pinMode(PB7, OUTPUT);

  //TXポートの初期化
  pinMode(TX1, OUTPUT);
  digitalWrite(TX1, HIGH);


  pc_printf("<ST>\r\n");

}//setup



//メインループ
void loop() {

  pc_printf("<INPUT>\r\n");
  int ch = ch_in_key();
  pc_printf("<CH>\r\n");

  if (ch == 's') {
    digitalWrite(PB7, HIGH);
  } else if (ch == 'r') {
    digitalWrite(PB7, LOW);
  }//endif スカは、何もしない　スカとは、「はずれ」のことである。

  //delay(2000); //debug

}//loop


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

#define DW   digitalWrite
//#define TX1        PA11  // 6pin
#define UART_DELAY 106   // 002-110 9600bps ok 031

//仮想シリアルへの一文字出力 9600bps
void pc_putc(char ch) {
  
  DW(TX1, HIGH);

  DW(TX1, LOW);//START
  delayMicroseconds(UART_DELAY); //START BIT WAIT

  for (int ii = 0; ii < 8; ii++) {
    DW(TX1, (ch >> ii) & 1  );
    delayMicroseconds(UART_DELAY); //DATA 1-8BIT WAIT
  }//for

  DW(TX1, HIGH);//Stop
  delayMicroseconds(UART_DELAY); //StOP BIT WAIT

}//pc_putc


//文字列の表示
int pc_printf(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    pc_putc(*str1 ++);

  } //while

  //戻り値
  return (0);
}//pc_printf



```
ぼくがかんがえたさいきょうのREPLを作る（JScript）

# 概要

https://github.com/mukai1011/jscript-repl

まあまあやり尽くされたネタではありますが、JScriptのREPLを作ります。ES3のREPLなんか誰も嬉しくないってつっこみはナシです。

REPLとはRead-Eval-Print Loopとのことで、たいていのスクリプト言語に付属しているやつです。たとえばNode.jsでは、引数なしで`node`を実行することでREPLに入ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/ae042903-b2b5-e2f9-7a52-8ad1db94dc38.png)

# やりたかったこと

せっかく後発なので、Node.js風に使えるかっちょいいものにしました。

## TypeScriptで書く

そこそこのサイズになりそうです、さすがにES3では書きません。構成はこの記事に準じます。

https://qiita.com/mukai1011/items/f97cff32f36c1b595dd5

## 色を付ける

numberは黄、stringは緑、undefinedは灰色 ... 出力に色を付けます。

エスケープシーケンスを用いるのですが、`\e` `\033` `\x1b`のうちcscript.exeで使えるものは`\033`と`\x1b`であり、`\033`はTypeScriptのコンパイルが通りません。`\x1b`を使いましょう。

https://qiita.com/PruneMazui/items/8a023347772620025ad6

ところでせっかくモジュールが使えるのだから、[chalk](https://www.npmjs.com/package/chalk)などの既存のパッケージを使えばいいのにと思われることでしょう。残念ながら、JScriptの~~バグ~~謎実装などのせいでほとんどのライブラリはBabelを通しても使うことができません。

https://uupaa.hatenadiary.org/entry/20100127/1264566103

## 書き途中の改行を検出する

上の画像において下から3行目で書いている通り、Node.jsのREPLは途中の改行を自動で検出して繋げてくれます。

きっと抽象構文木を解析しているのだと思います。それはさすがにJScriptには荷が重過ぎるので、実行する前にきちんと括弧が閉じているかだけ検出してお茶を濁します。実装はこちらを参考にしました。

https://www.geeksforgeeks.org/check-for-balanced-parentheses-in-an-expression/

ところでASTの解析も既存のライブラリがありますが以下略。くやしい ...

## Dot commandsを実装する

Node.jsのREPLには`.`から始まる特殊なコマンドが用意されています。

cscript.exeではCtrl+Cを入力するとスクリプト自体が終了してしまうことから、入力を取り消す`.break` `.clear`は実装しておきたいですね。`.help` `.exit`も簡単そうなので、ついでにやりましょう。`.exit`は無意味ですけど。

# できなかったこと

## `.save` `.load`

ヘルプに書くなら実装しなさい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/c70c260e-c877-3a83-ea3f-0c7789995d8e.png)

## 正確な字句解析

括弧の対応を調べているだけなので、文字列リテラル内やコメントで括弧を使うと閉じた判定になってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/f2ec4994-1904-b563-f2aa-fa20025999e3.png)

気が向いたら直しておこうと思います。字句解析の勉強をちゃんとしなきゃ ...

## タブ補完

Enterを入力するまで進まないので、仕様的に厳しそうです。

## サジェスト

同上。Node.js風でないものなら、考えよう次第では実現できたかもしれません。

# まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/9ead6327-20ee-360e-7edf-ddc7dd5473c2.png)

どうでしょうか、ぱっと見わからないくらいのいい感じのREPLができて、個人的には満足です。

ES3のREPLが必要になる（屈辱的な）シチュエーションがありましたら、ぜひご利用ください。
test時にActiveRecord::DatabaseAlreadyExists: Text file busyが発生!!

## はじめに
Ruby on Railsでアプリを開発中にテストを行うと､下記のエラーが発生しました(提案されたコマンド`db:test:load => db:test:purge`を入力しても解決せず)｡

```ruby:terminal
$ rails t
rake aborted!
ActiveRecord::DatabaseAlreadyExists: Text file busy @ apply2files - /home/vagrant/workspace/railstutorial6_sample/db/test.sqlite3
-e:1:in `<main>'

Caused by:
Errno::ETXTBSY: Text file busy @ apply2files - /home/vagrant/workspace/railstutorial6_sample/db/test.sqlite3
-e:1:in `<main>'
Tasks: TOP => db:test:load => db:test:purge
(See full trace by running task with --trace)
```

多くの方の資料を参考に解決できました｡ありがとうございます‼
この問題は､アプリを開発する際に都度発生しそうなので､備忘録として書き留めておきます｡


### 開発環境
- HostOS: windows11 Home
- GestOS: ubuntu/xenial64
- ruby: 2.7.5
- Ruby on Rails: 6.1.6



## なぜ発生するのか
windowsを使用すると仮想環境で作成することが多いと思いますが､この問題はVagrantの共有フォルダ内にプロジェクトを作成すると都度発生するもののようです｡

なにが原因が正直わかりませんが､詳細がわかれば追記していきます｡

## 解決方法

解決方法としては､2点｡
- **プロジェクトを共有フォルダ外に作成する**
- database.ymlで指定されている**参照先を共有フォルダ外に指定する**(test.sqlite3を共有フォルダ外に複製)
の方法があります(他の方法もあるかも...)｡


プロジェクトはローカルと共有しておきたいので､今回はdatabase.ymlの参照先を変更する方法(test.sqlite3を移動)を使用します｡

### 手順
1. 共有フォルダ外にフォルダを作成します
1. 作成したフォルダにファイル(test.sqlite3など)を複製します
1. database.ymlで指定されている参照先を変更します


### ファルダの作成

ちなみに､共有フォルダは以下の設定にしています｡
```ruby:Vagrantfile
config.vm.define :ruby_machine do |machine|
  machine.vm.synced_folder "./workspace", "/home/vagrant/workspace"
end
```

では､共有フォルダ外にファルダを作成していきます｡

```shell:terminal
vagrant at ubuntu-xenial in ~
$ mkdir rails_db
```

### ファイルの複製

次に作成したフォルダに下記のファイルのコピーを作成します｡ついでに､development.sqlite3のファイルも移動させます｡

```shell:terminal
# プロジェクトへ移動
# rails_dbフォルダへファイルを複製
vagrant at ubuntu-xenial in ~/workspace/railstutorial_app
$ cp db/development.sqlite3 db/test.sqlite3 /home/vagrat/rails_db

# 複製されているかの確認
$ ll /home/vagrant/rails_db
-rwxrwxr-x 1 vagrant vagrant 5.0K May 26 03:49 development.sqlite3
-rw-r--r-- 1 vagrant vagrant 5.0K May 26 03:51 test.sqlite3
```

### database.ymlの設定変更

下記の`database: db/development.sqlite3` `database: db/test.sqlite3`の箇所をコメントアウトし､先程複製したファイルのパスを設定します.

```ruby:database.yml
︙
development:
  <<: *default
  # database: db/development.sqlite3
  database: /home/vagrant/rails_db/development.sqlite3

test:
  <<: *default
  # database: db/test.sqlite3
  database: /home/vagrant/rails_db/test.sqlite3
︙
```

これでrails tが通るようになりました.

```shell:terminal
$ rails t
Running via Spring preloader in process 4444
Run options: --seed 45160

# Running:

..

Finished in 1.530231s, 1.9605 runs/s, 1.3070 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
```



***
#### 参考資料
[Railsチュートリアル3章のエラー解決×2](https://betrue12.hateblo.jp/entry/2018/05/26/193529)
[[小ネタ][Ruby on Rails]bundle install時にText file busy エラー](https://dev.classmethod.jp/articles/tips_ruby-on-railsbundle-install_text-file-busy-error/)
[今更ながら Ruby on Rails Tutorial をやってみた (その7)](https://qiita.com/hideki0145/items/f2cb95516fdf8cc42609)
基本情報技術者試験の目的を確認する

## 挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
本稿は基本情報技術者の世間的な位置づけについての内容です。

## はじめに
　エンジニアとして自身の成長や知識の証明のため資格取得を目指すことはよくあることです。しかし、資格取得は資格を取ることだけが目的となりいかに効率よく試験に合格するかに注力をしがちです。
　もちろん効率よく勉強することは成長や知識の証明に繋がります。ですが資格を取得する上でその資格試験が目的としていること、なぜその知識を問われるかを理解することはエンジニアとして成長するビジョンを形成する一助になったり効率の良い学習に繋がります。
　そこで本稿では資格試験の代表として基本情報技術者試験を挙げ、その設立目的と試験範囲を紹介します。すでに資格を取得している方はITエンジニア像と照らし合わせ、まだ取得していない方は今後学習をする上でどのような試験に臨もうとしているのかを確認していただければ幸いです。

## 基本情報技術者試験と高度IT人材
　基本情報技術者試験は情報処理推進機構(IPA)が管理する試験です。IPAとは経済産業省が所管する独立行政法人になります。IPAは日本のIT分野競争力を強化することを目的としており、基本情報技術者試験はIT人材育成活動の一つです。
　まず、基本情報技術者試験はどのような技術者を対象としているのかを試験要綱から確認します。
`情報処理技術者試験情報処理安全確保支援士試験 試験要綱ver4.8`によりますと対象者は以下の通りです（[参照](https://www.jitec.ipa.go.jp/1_13download/youkou_ver4_8.pdf)）。
>高度IT人材となるために必要な基本的知識・技能をもち，実践的な活用能力を身に付けた者

ここでいう「高度IT人材」とは経済産業省が日本のIT分野競争力を強化するにあたり求められるIT人材です。具体的には
1. ITと経営を融合し各企業の課題をIT手段により解決する手段を立案できる人材
1. ITアーキテクチャの変貌に対応し複雑な制約条件下で信頼性の高いシステムを総括できる人材
1. グローバルなIT標準に知見を持ち安全性と信頼性の高いサービスの提供を行える人材
の３点が柱となっています（[参照](https://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/chousa/ict_ikusei/pdf/070919_2_si1-7.pdf)）。
元々高度IT人材とは、IT技術が産業の核に移行し非IT事業に生じた問題であっても解決にITを用いることができるという展望から、生じた問題に対してITによる解決ができる人材という位置づけで登場しました。そのため、単純にアルゴリズムとプログラミングができるだけでなく既存の問題解決のためチームマネジメントができる、経営戦略に対して知見があることが求められます。
　つまり、基本情報技術者試験は（非IT分野を含む）企業内に生じた課題をIT技術により解決するために必要な知見を持っているか否かを試験することを目的としています。

## 基本情報技術者試験の試験内容
　基本情報技術者試験の目的は高度IT技術者として事業の問題を解決する知見を得ているか否かを確認することでした。この前提の下でどのような設問がなされるのかを確認します。
基本情報技術者試験の試験範囲はシラバスで確認することができます。シラバスでは出題範囲をジャンル＞大分類＞中分類＞小分類に分けていますが本稿では３つに分かれたジャンルに注目して確認していきます。
### テクノロジ系
**テクノロジ系**ジャンルではプロセッサやメモリ、入出力規格などのコンピュータシステムやDB、マルチメディアなどの技術要素といった典型的な情報技術知識の他に離散数学などの基礎理論や要件定義、設計技法などのシステム開発技術及び開発環境管理や知的財産権などの開発管理技術に関する設問が含まれます。
基礎理論では担当事項について確率統計論や集合論を適用できることが設問の目的とされており、高度IT人材に基本的な数学教養が必要であることが示唆されています。
同様に、システム開発技術と知的財産管理も設問に含まれています。こちらも高度IT人材として既存の問題解決のためチームマネジメントができる、経営戦略に対して知見があることが求められていることが分かります。
### マネジメント系
テクノロジ系にもプロジェクトマネジメントやソフトウェア知財の管理が含まれていましたが、マネジメント系はプロジェクト管理手法だけでなくプロジェクトを管理する上で必要な知識（プロセスの分類や構成要素）を問うジャンルになります。こちらはテクノロジ系とは異なり各小分類の設問目的が「担当事項に適用できること」から「理解していること」になっており必要な理解度合いはやや下げられています（応用情報技術者試験ではこちらも「適用できること」になっています）。また、大分類としてサービスマネジメントが含まれることもマネジメント系の特徴です。この分類は単にソフトウェアを保守するだけでなくソフトウェアを用いたサービスを維持、改善するための組織管理を扱っています。そのため一見情報技術に関係ないように見えるサービスや組織のマネジメント技術も基本情報技術者試験の範囲に入ります。
### ストラテジ系
最後の分類はストラテジ系になります。ストラテジ系に分類される問題は高度IT人材の「ITを問題解決手段として活用できる」という要件を達成するための知識を問う分類です。具体的には、企業の経営戦略を理解しそのための情報システムを策定できる、業務とシステムをモデル化し最適なモデルを構築できると言った分野になります。つまり、現在課題のある業務と情報技術を適切に結び付け解決手法を立案できるかを問われる分野です。
また、業務に情報システムを活用するために活用促進に関する知識もこの分野の設問に含まれます。具体的にはシステム利用のためのマニュアルや教育活動の手法や意義の理解を問う問題や安全にシステムが利用されているかを監視するためのログ分析技術の設問などです。

## まとめ
本稿では基本情報技術者の目的を通じて経済産業省が育成に取り組んでいる高度IT人材とそれに必要な知識を確認しました。高度IT人材とは非IT分野を含む事業の問題をITを駆使することで解決できる人材を指します。
基本情報技術者試験では学ぶべき項目としてテクノロジ系、マネジメント系、ストラテジ系の３分野が挙げられていました。テクノロジ系には情報技術だけでなくコンピュータに用いられる基礎数学や設計技法が含まれていました。マネジメント系ではシステムを業務で運営するための知識が問われる分野であり、単に技術的な知識を得ているだけでなくそれを非IT分野を含む事業の諸問題解決に活かせるかどうかが特に重視されていました。ストラテジ系では実際の業務にフィットしたシステムのモデルを策定するための知識が問われます。
総じて、単に技術力を持っているだけでなくそれを事業の課題解決に用いることができるかどうかも重視された内容となっていました。

本稿が読者の方のITキャリアやIT人材像を見直す一助となれば幸いです。
AWSの料金体系について

AWSのcloud9を使ってクラウド技術を学習してる。
お金関係把握してないのが不安なので一応メモしとこう。

ドルって怖い

1-1. 使用した分だけ料金を払う従量制料金である
1-2. 契約するサービスによって料金が変わる
↓
Amazon EC2の場合は、主に以下の要素によって料金が決まります。
①インスタンスのタイプ（t2.nanoなど）
②サーバーの台数
③使用したストレージ容量（GB）
④Amazon EC2からインターネットへ送信されたデータ転送量（GB）

1-3. AWSの料金を決める3つの要素
AWSの料金は主に3つの要素によって決まります。その3つとは、①コンピューティング、②ストレージ、③データ転送（アウト）です。

1-4.どのくらいお金がかかるのかを知るために

AWSの「簡易見積もりツール」の概要
Amazonでは、「簡易見積もりツール」という、AWS料金の見積もりができるツールが提供されています。簡易見積もりツールのマニュアルも準備されているため、確認しながら必要項目を入力すれば、簡単に見積もり金額を入手することができます。

簡易見積もりツールの主な操作手順は、以下の通りです。

AWSを稼働させるリージョンを選択する。
右側のメニューから、見積もりを取得したいAWSのサービスを選択する。
選択したサービスごとに必要な項目やオプションなどを入力する。
簡易見積もりツールを使う前に、クラウド構成例が不明という場合もあるかもしれません。AWSのホームページ別ウィンドウで開きますでは、基本的な構成例とその推奨構成が紹介されています。このページを参考にして簡易見積もりツールで見積もり取得を行えば、検討しているサーバー構成と必要な金額を簡単に見積もることができるでしょう。
Requirements on Time Service, No.623, AUTOSAR 21-11 (226) CP

Requirements on Time Service, No.623, 2021-11

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


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

AUTOSAR 21-11, 200文書読んだ。2022年5月に全部到達。

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

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

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

# 用語(terms)

|Term|Description|
|:--|:--|
|GPT Predef |Timer A GPT Predef Timer is a free running up counter provided by the GPT driver. Which GPT Predef Timer(s) are available depends on hardware (clock, hardware timers, prescaler, width of timer register, …) and configuration. A GPT Predef Timer has predefined physical time unit and range.
|Time Service Predef Timer|A Time Service Predef Timer is a free running up counter with predefined physical time unit and range. The hardware timer functionality is based on the corresponding GPT Predef Timer. For each Predef Timer a set of API services is provided by the Time Service module. The user can instantiate any timers (only limited by available memory) and can use the instances completely independently of each other.
|Timer instance |A timer instance is a data object of an API data type.
|Reference time |The reference time is a time value stored for each timer instance.
## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
クラスをまとめるクラス設計(Facade?)

## 記事の内容
複数エンドポイントを持つAPIを実装するのに、
どうまとめるのが良いか考えていてエンドポイント毎にクラスを作成して、
エンドポイント毎のクラスをまとめるクラスを作ると汎用性の高い
クラスができると思い作ってみました。

デザインパターンのFacadeっぽい感じになると思います。
Facacdeで調べると複数機能を1つにまとめるために使われることが多くて、
呼び出し先をまとめるためではなさそうなので、っぽいとつけました。

Facadeについてはこの記事がわかりやすかったです。
https://xtech.nikkei.com/it/article/COLUMN/20051216/226402/

## 設計

同じメソッドを持つクラスを作成するので抽象クラスを作成します。
抽象クラスの命名は末尾にBaseを付けるか先頭にAbstractを付けることが多いようです。

APIを使うのにトークン取得は何を共通で持たせたいので抽象クラスで実装して継承します。

![クラス図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/050a7ea5-9bbc-b33f-526d-c1c251207da3.png)

クラスを作ったらFacadeクラスに分岐させて
クライアントから使いたい機能を指定して使っていきます。

![クラス図.drawio - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/b37e213c-aaee-85a5-09ba-325a8d2822f5.png)

## コード

### 抽象クラス

```py
from abc import ABC, abstractmethod

class AbstractClass(ABC):

    def __init__(self):
        # 必用に応じて
        pass

    def _get_token(self):
        """トークンの取得"""
        return token

    @abstractmethod
    def get_data(self):
        pass
```


### エンドポイントごとにクラスを作成

抽象クラスを継承させてエンドポイント毎にClassA, ClassB, ClassCを作成するのをイメージしています。

```py
class ClassA(AbstractClass):
    """●●取得用クラス"""

    def self(self):
        super().__init__()

    def get_token(self):
        super()._get_token()

    def get_data(self):
        return 'A Data'

class ClassB(AbstractClass):
    """●●取得用クラス"""

    def self(self):
        super().__init__()

    def get_token(self):
        super()._get_token()

    def get_data(self):
        return 'B Data'

class ClassC(AbstractClass):
    """●●取得用クラス"""

    def self(self):
        super().__init__()

    def get_token(self):
        super()._get_token()

    def get_data(self):
        return 'C Data'
```

### Facadeクラス

今回はEnumも使ってみたかったのでインスタンス時にEnumで呼び出し先を
変える実装をしていみました。

Enumの命名規則の例があまり出てこなかったのですが、
Enumを付けているケースとTypeを付けるというケースがでてきました。



```py
from enum import Enum

# Enumでクラスをまとめて持っておく
class EndpointEnum(Enum):
    A = ClassA
    B = ClassB
    C = ClassC


class ClassFacade():
    """●●クラスのFacade"""

    def __init__(self, target):
        
        # 引数がEnum出ない場合はエラーを表示
        if not isinstance(target, EndpointEnum):
            raise ValueError(f'{target}は指定できません。EndpointEnumのEnumを引数に指定してください。')

        # target.value()でインスタンス化する
        self._instance = target.value()

    def get_data(self):
        return self._instance.get_data()
```

## クライアントからの呼び出し

FacadeクラスとEnumをimportして使用します。

```py
from facade import ClassFacade, EndpointEnum

instance = ClassFacade(EndpointEnum.A)
print(instance.get_data())  # A Data

instance = ClassFacade(EndpointEnum.B)
print(instance.get_data())  # B Data

instance = ClassFacade(EndpointEnum.C)
print(instance.get_data())  # C Data

instance = ClassFacade('D')  # ValueError: Dは指定できません。EndpointEnumのEnumを引数に指定してください。
```
matplotlibで日本語を使う(japanize-matplotlib)

# 記事について
matplotlibで日本語を使おうとすると文字化けして不便
japanize-matplotlibというライブラリが便利そう
https://pypi.org/project/japanize-matplotlib/

# 使い方
通常のmatplotlib
```py
import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4])
plt.xlabel('簡単なグラフ')

plt.show()
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723352/698e5e90-3367-3d86-9cd7-b38b2f318607.png)

文字化けしてしまう。

パッケージをインストール
```
pip install japanize-matplotlib
```
インポートして普通にmatplotlibで描画
```py
import matplotlib.pyplot as plt
import japanize_matplotlib

plt.plot([1, 2, 3, 4])
plt.xlabel('簡単なグラフ')
plt.show()
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723352/91920a55-2c1c-3b89-083b-87d37bc22a09.png)

日本語が文字化けせずに描画できて便利。
viエディタでファイルの読み込みやOSコマンドの実行結果を取り込む方法

**システムの情報収集などで目的の情報を確認しながら取得する際に便利な方法として、
viエディタ(vim)でファイルの読み込みやコマンドを実行する方法を紹介します。**

使い方は、ターミナル(端末)からviエディタを開き、情報を追加したい箇所にカーソルを持っていき、":"キーを押してコマンドモードにはいります。このとき画面下にコロン":"と入力箇所でカーソルが点滅します。

■ viエディタでファイルを開く
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075298/c44af19d-35d0-2747-ab84-8d7b262c5337.png)
■　ノーマルモード
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075298/4388b960-22c0-cc91-48ea-6333dc2ae0e1.png)
■ コマンドモード　(":"キーを押す)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075298/80334226-fe84-653f-2def-02ab655e29a6.png)

**1. ファイルを読み込みたい場合**
　コロン":"の続きに、r "ファイルパス"を入力してEnterを実行します。
　
 【例1】 /etc/hostnameファイルを読み込む
```
:r /etc/hostname
```
viエディタにファイルが読み込まれた。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075298/cb6897b3-2507-a1e0-1b77-f0ab57829942.png)

**2. コマンドを実行して結果を得る場合**
コロン":"の続きに、r! "コマンドラインを"入力してEnterを実行します。

【例1】 TOPコマンドを実行してCPUとmemoryの使用率の確認
```
:r! top -b -n 1 |head -5
```
viエディタにコマンドの実行結果が書き込まれた。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075298/823347a3-f769-20af-8298-ddd93ec823bc.png)

色々と作業を行う上でviエディタを使うことはあるとおもいますが、
メモを取りたい時などに、これらファイルの読み込みやコマンドの実行結果をエディタにそのまま記録するのはとても便利です。もし便利そうだと思われたらご活用ください。