OmniAICreator/Qiita-1.07M huggingface dataset:
Python matplotlib リアルタイムのグラフ表示

## 背景
お仕事（）でリアルタイムで得られた値を可視化したいということになったので、取り組んでみました。

## リアルタイム表示
最終的な目標は外部からの値をグラフに描写することです。

作成したモデルのベースとなったのが、[Pomta様](https://note.mu/pomta_trd)のこちらの[プログラム(matplotlibでリアルタイムグラフを出力してみたい)](https://note.mu/pomta_trd/n/n15b1d992f5ca)です。
大変勉強になりました。深く感謝したします。

こちらのコードをもとに以下のことを取り組みました。
・クラス化
・得られた値の最大値と最小値を取得
・外部入力値をグラフに書き込む
・横軸を一定間隔で更新（スライド式）

### 参考コード

外部入力値はsinにステップ数を代入した値とし、
また横軸を時間、縦軸を変位（外部入力値）としました。
リアルタイムでのグラフ表示は、
横軸の表示範囲を指定のステップ数範囲に強引に設定することで解決できます。

```python:draw_pic_realtime.py
import matplotlib.pyplot as plt
import math
import numpy as np

#クラス作成 スライド式リアルタイム速度表示
class draw_pic(  ):

    #変数の初期化
    def __init__(self):
        self.i_step = 0#ステップ数
        #self.j_step = 0
        self.t_axis = []#ステップ数を格納
        self.x_axis = []#変位を格納
        self.color = 'blue'

        plt.ion()
        plt.title('Estimation displacement Value')#タイトル
        plt.xlabel('t')#横軸のラベル名
        plt.ylabel('x')#縦軸のラベル名
        plt.grid()#グリッド表示

    # 引数はselfを指定しないと、すべての引数を認識してくれない
    def once_draw_pic(self, X_j):## 描画データ生成

        self.i_step = self.i_step + 1#ステップ数をインクリメント

        self.t_axis.append(self.i_step)#横軸
        self.x_axis.append(X_j)#縦軸
        plt.plot(self.t_axis, self.x_axis ,self.color)#横軸、縦軸、色

        plt.xlim(self.i_step - 20, self.i_step + 1)#横軸の範囲指定
        plt.draw()# グラフ表示

        if self.i_step == 1000:#ステップ数が1000に達したら終了
            plt.close()
       
        plt.pause(0.1)#待機時間[s]


    #　最大値から最小値に並べ替え,上位３つを取得
    def get_4_maxmin(self):
        #　最大値から最小値に並べ替える
        ld_max = sorted(self.x_axis, reverse=True)
        #　並べ替えて上位4つを取得
        ld_max = ld_max[:4]
        #　並べ替えて上位4つを小数第位4までを丸め込む
        ld_max = [ round(ld_max[n],4) for n in range( len(ld_max) )]
        # 平均値
        ld_max_ave = round(float(sum(ld_max) / len(ld_max)), 4)
        print("平均値", ld_max_ave, "最小値上位4つ", ld_max)
        #　最小値から最大値に並べ替える
        ld_min = sorted(self.x_axis)
        #　並べ替えて上位4つを取得
        ld_min = ld_min[:4]
        #　並べ替えて上位4つを小数第位4までを丸め込む
        ld_min = [round(ld_min[n],4) for n in range(len(ld_min ))]
        # 平均値
        ld_mix_ave = round(float(sum(ld_min) / len(ld_min)), 4)
        print("平均値", ld_mix_ave, "最小値上位4つ ", ld_min)

        return ld_max_ave, ld_mix_ave#別に返さなくてもいいです


#外部入力X_j
i_ = 0
X_j = 0

#描写オブジェクトを作成
D_p = draw_pic( )

#連続的な描写
while True:

    i_ += 1#インクリメント
    X_j = (np.sin(i_))#sinにステップ数を代入

    D_p.once_draw_pic(X_j)#グラフをリアルタイムで描写
    D_p.get_3_maxmin()#値の最大値と最小値を算出
```

### 実験結果
本当はgitで載せたかったんですが、ここらへんで力尽きました。
sin波形がカクカクしているのは、sinに1,2,3,4,,,を代入しているためです
つまり、sin(1),sin(2),sin(3),,,を計算して、表示させています。
![無題s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/05233f5c-d84d-199d-406c-b0d98e67d424.png)




## 反省点
オブジェクトに値を入れるだけで可視化できるコードに取り組みました。
もっと簡単に表現できる点がいくつもあるとは思いますが、それは今後学びます。。。
今後はクラス部分を1つのファイルにし、
importしただけでクラスを使えるようにすると便利かなと思います。

## 参考文献
[matplotlibでリアルタイムグラフを出力してみたい](https://note.mu/pomta_trd/n/n15b1d992f5ca)
bashスクリプトの最初の方に書いておくと少しだけ安心できる数行のコード

テストを完走したスクリプトが本番環境で動かない！などの不安を和らげる数行のコードで、個人的によく使う 3つを紹介します。

# 1. 環境変数 $PATH
systemd から実行したら動かないなどの問題が起きないように、環境変数`$PATH`の値を最初に整えます。スクリプト内で各コマンドをフルパスで書くより、環境変数をテスト環境と同じにした方が安心です。

```Shell:
for _path in $(echo "/usr/local/sbin:/usr/local/bin:/usr/sbin:/opt/myapp" | tr ':' '\n'); do
  echo ${PATH} | tr ':' '\n' | grep -q "^${_path}$" || PATH+=":${_path}"
done
```

現在の`$PATH`に含まれないパスが`"/usr/local/sbin:/usr/local/bin:/usr/sbin:/opt/myapp"`の中にあれば`$PATH`に追加されます。区切り文字の`:`を改行に置換して各パスを行に区切ることで`grep`での比較をしやすくしています。
（重複やべき等を気にしなければ、単に`PATH+=`で追加すればいいだけですが）

# 2. 多重起動防止
ファイルなどのリソースを操作するスクリプトで安心できるようになります。

```Shell:
(( $$ == $(pgrep -fo "$0") )) || exit 1
```

「同じコマンドライン文字列で実行された最も古いプロセス」が現在のプロセスなら通過、違っていたら多重起動と判定して異常終了します。実行時のコマンドライン文字列がいつも同じであることが条件になります。

# 3. 終了処理
`trap`で指定した関数`on_exit()`が終了時に実行されます。とりあえず書いておけば、スクリプト作成中に思いついた終了処理をすぐに追加できます。

```Shell:
function on_exit() {
  # $1: exit code
}

trap 'on_exit $?' EXIT
```

スクリプト内では、エラーで終了したいコマンドや関数の呼び出しを**`somecommand || exit $?`**のように書きます。

関数`on_exit()`では終了コードの値を見て、正常終了時／異常終了時／共通の処理をそれぞれ記述することができます。

```Shell:
function on_exit() {
  if (($1 == 0)); then
    echo "Completed."
  else
    echo "Failed ($1)." >&2
  fi
  echo "Bye."
}
```

# +1.
sh が bash にリンクされているかどうかに関係なく、使用するシェルは明示的に宣言します。

```Shell:
#!/bin/bash
```

# 参考リンク

* 「UNIX & Linux コマンド・シェルスクリプト リファレンス」 https://shellscript.sunone.me/
* 「“応用力”をつけるためのLinux再入門」 https://www.atmarkit.co.jp/ait/series/3016/
Access Tips テーブルの日付/時刻型のデータはシリアル値で表示できる

#表示形式
##シリアル値（Windowsだと1900/1/1を1とした値）
オプションでも変わる時があるが
***0***
***#,##0***
ちなみに
2019/10/1 13:00:00
のように日付と時刻が入っていても上の書式では無視される。
この表示形式は時間を無視するときには便利であるが、時間まで表示したいときはあまり使えない。

##時間のシリアル値は小数点以下
***0.000000***
のようにしなければならない。
From .0 to .9999
と公式にあるが小数点4桁ではない。嘘。本当はミリセカントまで持っているため時間のみなら小数点以下10桁程度まである。



##日付のシリアル値（1年の何日目か）
***y***
yでうるう年の場合366日の何日目か、通常年なら365日の何日目かを表示する
##曜日のシリアル値（1から7、日曜が1）
***w***
Displays a number that corresponds to the day of the week. (1 to 7)
1から7で表示される。1が日曜日、毎日1でもいいとは思うが。。。
##週のシリアル値（週番号、1年の第何週か）
***ww***
Displays a number that corresponds to the week of the year (1 to 53).
366/7=52.2...
なので1年を53週として週番号を表示させる
##日付を2019.10.5のように区切り文字をピリオドにする
***yyyy.mm.dd***
Accessは自動的にバックスラッシュ（日本では円マーク）を追加するので
***yyyy\\.mm\\.dd***


##短い日付（s）の本当の表示形式
***ddddd***
dが5個
なお、日本のAccessでこれを入れると短い日付（s）と変換して表示される
おそらくアメリカでも Short Dateになる
##長い日付(L)の本当の表示形式
***dddddd***
dが6個
なお、日本のAccessでこれを入れると日付（L）と変換して表示される
おそらくアメリカでも Long Dateになる
##日付（標準）の本当の表示形式
***c***
これも上記と同様日付（標準）に自動的に変換される
マウスやショートカットキーを使ってドロップダウンメニューから選択しなくてもよい
なお、アメリカ（英語）版の解説はAM/PM表示だが、日本は24時間表示でAM/PMは書き込んでも変換される。
例えば11:45:10 AM の表示は 11；45：10だが 11：45：10 PMと入力すると 23:45:10　となる
##日付(m)はMedium Dateだがこれを表示する文字はなく、アメリカと違う
強いて言えばyy-mm-ddであるが、これを表す文字がない。
また日本では
19-10-05のように日本では表示されるが
アメリカでは
19-Oct-05のように月が3文字のアルファベットで表示される。

#時刻だけ
あまり使われないと思うが、一応ある。
このとき日付は0として扱われるが1989/12/31を意味している。

>日付/時刻型フィールドの書式設定
日付、時刻、またはその両方を表示するように、日付/時刻型データの書式を設定することができます。日付のみの書式を使用すると、Access では時刻部分に値 0 が格納されます。時刻のみの書式を使用すると、Access では日付部分に値 0 が格納されます。
次の表は、Access で日付/時刻型データがどのように格納されるかについて示したものです。また、さまざまな書式を使用した場合に、どのように値が表示されるかについても示します。

>| 格納された値 |          デフォルトの書式   |   カスタム書式|
|------------:|-----------------------:|----------------:|
|   (倍精度の数値)       |       (日付 (標準))    |   (yyyy/mm/dd hh:nn:ss A.M./P.M.)|
|36295.0                 | 1999/5/15    |        1999/05/15 12:00:00 AM |
|       0.546527777777778  |  13:07:00        |     1899/12/30 01:07:00 PM |
|   36232.9375     |          1999/03/13 22:30:00  |1999/03/13 10:30:00 PM |
 
>https://support.microsoft.com/ja-jp/help/210276/how-to-store-calculate-and-compare-date-time-data-in-microsoft-access

とある。なお、日本でのカスタム書式(時刻はAM/PM表示)は `yyyy/mm/dd hh:mm:ss am/pm` or `yyyy/mm/dd hh:nn:ss am/pm`

##Short Time
時:分で表示。秒が表示されない
##Long Time
時:分:秒で表示
##ここでc 日付(標準)ではどうなるか
Long Timeとおなじになる。時:分:秒で表示
https://support.microsoft.com/ja-jp/help/210276/how-to-store-calculate-and-compare-date-time-data-in-microsoft-access
>日付/時刻値のデフォルトの書式は日付 (標準) です。値が日付のみの場合、時刻は表示されません。値が時刻のみの場合、日付は表示されません。

##特殊なのが分だけを表示するときはnまたはnn
分を単独で表示するときmではなくnを使う。月の名称を表示するときにmを使っているためであろう。
もっとも分だけを表示する場合を使ったことがないのだが。。。

##hh:nn:ssは可能
よく見ると、上記のヘルプでも使用されている。
令和元年にNetscapeでインターネットしてみる

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/d74a0b1a-2e51-0be6-bcf1-d90371b2fd6d.gif)

今月末くらいに[インターネット老人会 #2 -テレホーダイの思い出-](https://ariaki.connpass.com/event/148883/)というイベントがあります。LTで何か発表してみようと考え、調査用に当時のインターネットブラウザを令和元年の環境で動かしてみました。

## インターネットブラウザ(Netscape)のインストール

1990年代後半から2000年代初頭にかけてホットだった(過去形...)インターネットブラウザのNetscapeを動かしてみます。ありがたいことに、各種インターネットブラウザのアーカイブを保管されているWebサイトがあるようです。

 * [evolt.org Browser Archive](https://browsers.evolt.org/)

## インストールしてみる

さっそくWindows10の環境でインストーラを起動してみたのですが、Netscape 3.xのインストーラでは以下のエラーが発生し、インストールできませんでした...。

<img width="290" alt="img100.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/697e3440-f106-e2f0-984f-df5bdfdb5210.png">

Netscape 4.xのインストーラも同様のエラーにより、インストールできません。

<img width="357" alt="img101.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/001e2e86-24e5-2038-b2b0-7ce150c5932b.png">

どうやら最近のWindows環境では、古い時代のインターネットブラウザを動かすことができないようです。

## WINEを使用してみる

ここはひとつ、[WINE](https://www.winehq.org)というWindows互換レイヤーで動作するか試してみましょう。

### Ubuntuのインストール

今回は32bit版のUbuntuを使用します。

 * [Ubuntu 16.04.6 LTS (Xenial Xerus)](http://releases.ubuntu.com/16.04/)
 * http://releases.ubuntu.com/16.04/ubuntu-16.04.6-desktop-i386.iso

Ubuntuのインストール後、必要なパッケージをインストールします。
( `nginx` は後々利用するため、この時点でインストールしておきます)

```console
$ sudo apt-get install -y wine fonts-ipafont
$ sudo apt-get install -y nginx
```

これでインストーラが起動するようになります。

```console
$ wine NetscapeComm461.exe
```

インストールが完了し、無事にNetscapeが起動しました！

![netscape.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/cdd4badd-f7f5-496a-13f8-d6f5cf46416d.png)

## プロキシを設定する

Netscapeが起動するようになったものの、ブラウザがサポートしているTLSのバージョンが古いため、そのままではhttpsなサイトには接続できません...。

### nginxを使用したプロキシ設定

そこでnginxを使用し、ブラウザからhttpでアクセスされたURLに対し、プロキシ側でhttpsに置き換えてアクセスする方法で対応してみます。

`/etc/nginx/nginx.conf` に以下の設定を追加します。 `server_name` は自身のマシンに振られているIPアドレスを指定します。

```nginx
http {
# ...中略...
        server {
                listen 8080;
                server_name 10.0.2.15;
                resolver 8.8.8.8;
                location / {
                        proxy_pass https://$http_host$request_uri;
                }
        }
}
```

設定が完了したら、nginxを起動します。

```console
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
```

Netscapeでプロキシの設定を行い、 ~~インターネットのヤホー~~  `http://www.yahoo.co.jp/` にアクセスしてみると...。

<img width="475" alt="netscape.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/55e35131-8345-5339-a325-b62cb9672af9.png">

無事にアクセスできました！ただし、リンクから飛ぼうとすると上手く動かないので、まだちょっと対応が必要そうです。
(とりあえず動かす方法が把握できたのでこれで良いかなとも思っています...)

## まとめ

令和元年のコンピューター環境でNetscapeを動かす方法を調べてみました。最新の環境で古いソフトウェアを動かしたいという奇特なケースでは、WINEを活用してみるという解決策もありそうです。

## 参考URL

 * [インターネット老人会 #2 -テレホーダイの思い出-](https://ariaki.connpass.com/event/148883/)
 * [Nginxでyumやwget用のフォワードプロキシ](http://blog.memolib.com/memo/265/)
#Rails + #rspec の change 記法で model のインスタンスを検証する時、うまくいかないときは reload を挟めば良いじゃない

こんなノリ


```rb
subject { change_name! }
let!(:user) { create :user }

it { expect { subject }.to change { user.reload.name }.from('Alice').to('Bob')  }
```

以前は次のようににいみにくい reload を subject の中に挟んでしまっていたが、メソッドチェーンの中に relaod を仕込むほうが良いね

```rb
subject { change_name! }
let!(:user) { create :user }

it { expect { subject; user.reload }.to change { user }.from('Alice').to('Bob')  }
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2608








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
直観主義論理 五つの定理の同値性

# 概要
直観主義論理 と 古典主義論理 の違いは、<排中律> を公理として採用するか否かです。そして、採用する公理は<二重否定除去> でもよいとも知られています。

つまり、直感主義論理の導出関係において、<排中律>と<二重否定除去>は同値です。同様に<パースの法則> や ドモルガンの法則（のうちのひとつ）も同値な論理式です。

そこで、これら 5つの論理式の同値性を Coq を使って示します。これにより **5つのうちどれか一つを公理とすれば、直観主義論理の証明能力を 古典論理のそれに匹敵させるのに十分である** ことを示します。

なお、Coq の標準ライブラリでは <排中律> を公理として、それ以外の論理式を証明しています。

- 参考: [Coq 標準ライブラリでの実装](https://github.com/coq/coq/blob/master/theories/Logic/Classical_Prop.v)

# 5つの論理式
5つの論理式を記載し、Coq上で扱う際の名前を付けます:

- $P \lor \lnot P.$ 排中律。識別子は`LEM`
- $\lnot\lnot P\to P.$二重否定除去。識別子は `DNE`
- $((P\to Q)\to P)\to P.$ パースの法則。識別子は `PEIRCE`
- $(P\to Q)\to\lnot P \lor Q.$ 含意の書き換え。識別子は `IMPCASE`
- $\lnot(\lnot P \land \lnot Q)\to P\lor Q.$ ドモルガン則の一例。識別子は `MORGAN4`

5つのチョイスは Software Foundation の練習問題からです（が、さらに Coq'Art がその元ネタだそうです）。

Coq 風に書き下します:

```coq
Definition LEM := forall (P:Prop), P \/ ~ P. (* law of the excluded middle *)
Definition DNE := forall (P:Prop), ~ ~ P -> P. (* double negation elemination *)
Definition PEIRCE := forall (P Q:Prop), ((P -> Q) -> P) -> P. (* law of Peirce *)
Definition IMPCASE := forall (P Q:Prop), (P -> Q) -> ~ P \/ Q.
Definition MORGAN4:= forall (P Q:Prop), ~(~P /\ ~Q) -> P\/Q.
```

# 同値性の証明

以下のようないくつかの循環ができるので同値性の証明ができます

- 循環1: `LEM → DNE`, `DNE → MORGAN4`, `MORGAN4 → LEM`
- 循環2: `LEM → IMPCASE`, `IMPCASE → LEM`
- 循環3: `LEM-> PEIRCE`, `PEIRCE -> DNE`, 1の循環を利用

上記の循環を意識して同値性の証明を記載しておきます:

```coq
Definition LEM := forall (P:Prop), P \/ ~ P. (* law of the excluded middle *)
Definition DNE := forall (P:Prop), ~ ~ P -> P. (* double negation elemination *)
Definition PEIRCE := forall (P Q:Prop), ((P -> Q) -> P) -> P. (* law of Peirce *)
Definition IMPCASE := forall (P Q:Prop), (P -> Q) -> ~ P \/ Q.
Definition MORGAN4:= forall (P Q:Prop), ~(~P /\ ~Q) -> P\/Q.

Lemma l_d: LEM -> DNE.
Proof. intros lem P H. destruct (lem P). assumption. contradiction. Qed.
Lemma d_m: DNE -> MORGAN4.
Proof. intros dne P Q H. apply dne. intros H1.
apply H. split;intros ?;apply H1;[left|right]; assumption. Qed.
Lemma m_l: MORGAN4->LEM.
Proof. intros mor P. apply mor. intros [H1 H2]. contradiction. Qed.
Lemma i_l: IMPCASE -> LEM.
Proof. intros imp P. apply or_comm. apply imp. intros; assumption. Qed.
Lemma l_i:  LEM->IMPCASE.
Proof. intros lem P Q H. destruct (lem P). right. apply H. assumption.
left. assumption. Qed.
Lemma p_d: PEIRCE -> DNE.
Proof. intros H P H1. apply H with (Q:=False). intros. contradiction.  Qed.
Lemma l_p:  LEM-> PEIRCE.
Proof. intros ? ? ? ?. destruct (H P). assumption.
apply H0. intros.  contradiction.  Qed.

Theorem lem_dne_iff: LEM <->DNE.
Proof. split. apply l_d. intros. apply (m_l (d_m H)). Qed.

Theorem lem_peirce_iff : LEM <-> PEIRCE.
Proof. split. apply l_p. intros. apply (m_l (d_m (p_d H))). Qed.

Theorem lem_impc_iff: LEM <-> IMPCASE.
Proof. split. apply l_i. apply i_l. Qed.

Theorem lem_morgan4_iff: LEM <-> MORGAN4.
Proof. split. intros. apply (d_m (l_d H)). apply m_l. Qed.


```

# 参考文献
- [Coq 標準ライブラリでの実装](https://github.com/coq/coq/blob/master/theories/Logic/Classical_Prop.v): lem -> その他の定理 の証明の参考にしました
- [Software Foundations の練習問題](https://softwarefoundations.cis.upenn.edu/lf-current/Logic.html#lab202) : 本稿はこの練習問題を少しアレンジしたものです
Python＋RaspberryPiで2つのLEDを非同期で点滅

LED1を1秒ごと、LED2を1.2秒ごとに点滅したい。

# 方法1 自前でカウンタ

```py
import time
import wiringpi as w
count = 0
w.wiringPiSetup()
w.pinMode(0,1)
w.pinMode(1,1)

while 1:
  count = count + 1
  if ( 0 == ( count % 20 ) ):
      w.digitalWrite(0,1)
  if ( 0 == ( count % 24 ) ):
      w.digitalWrite(0,0)
  if ( 0 == ( count % 20 ) ):
      w.digitalWrite(1,1)
  if ( 0 == ( count % 24 ) ):
      w.digitalWrite(1,0)
  time.sleep(0.1)
```

# 方法2 マルチスレッド

```py
import threading
import time
import wiringpi as w
led1Stat=0
led2Stat=0
w.wiringPiSetup()
w.pinMode(0,1)
w.pinMode(1,1)

def LED1():
    global led1Stat
    if (0 == led1Stat):
        led1Stat = 1
    else :
        led1Stat = 0
    w.digitalWrite(0,led1Stat)
    t=threading.Timer(1,LED1)
    t.start()
def LED2():
    global led2Stat
    if (0 == led2Stat):
        led2Stat = 1
    else :
        led2Stat = 0
    w.digitalWrite(0,led2Stat)
    t=threading.Timer(1.2,LED2)
    t.start()

t1=threading.Thread(target=LED1)
t2=threading.Thread(target=LED2)
t1.start()
t2.start()
```
# 方法3 OSのタイマーシグナルを利用する

OSからのシグナルなので少し違うが、マイコンのタイマー割り込みみたいに考えることができ。


@miminashi さんが 「Python3で一定間隔で処理を行う」として、 signal.setitimer を使う方法を紹介している
https://qiita.com/miminashi/items/50a4f0906ab8f18b105d

しかしながら複数のシグナルをセットする方法がわからなかったので、断念！

# 方法4 Tornado ライブラリを使う

TornadoはPythonで書かれた非同期通信フレームワーク。Webサーバなどに使うことができる。

ここを参考に
https://stackoverflow.com/questions/14186925/tornado-on-raspberry-pi-to-use-websockets-as-well-as-monitor-serial-port-arduino

```py
import datetime
import wiringpi as w

from tornado import gen, options
from tornado.ioloop import IOLoop
from tornado.locks import Condition

condition = Condition()
led1Stat=0
led2Stat=0
w.wiringPiSetup()
w.pinMode(0,1)
w.pinMode(1,1)

@gen.coroutine
def LED1():
  global led1Stat
  while 1:
    yield condition.wait(timeout=datetime.timedelta(seconds=1))
    if (0 == led1Stat):
        led1Stat = 1
    else :
        led1Stat = 0
    w.digitalWrite(0,led1Stat)
 #   print("1",led1Stat)

@gen.coroutine
def LED2():
  global led2Stat
  while 1:
    yield condition.wait(timeout=datetime.timedelta(seconds=1.2))
    if (0 == led2Stat):
        led2Stat = 1
    else :
        led2Stat = 0
    w.digitalWrite(0,led2Stat)
#    print("2",led2Stat)

@gen.coroutine
def runner():
    yield [LED1(), LED2()]


options.parse_command_line()
IOLoop.current().run_sync(runner)
```
ターミナル　お気に入りデザイン

# Iceberg
お気に入りの色合い設定
だれかの公開済みのものを利用する
http://cocopon.github.io/iceberg.vim/
![スクリーンショット 2019-10-20 10.29.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/be84fc66-1b19-0240-0c1b-d13caf1073d5.png)

下までスクロールしてdownloadボタンを押す
![スクリーンショット 2019-10-20 10.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/b1ff5c2c-373b-9e4f-b311-b8a76b1533d3.png)

zipファイルダブルクリックしたらターミナル開いて環境設定
![スクリーンショット 2019-10-20 10.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/b4f1c74c-6075-e055-69d3-527d93d40e51.png)

読み込むをクリックし、さっきダウンロードしたファイルの中身を選択する
![スクリーンショット 2019-10-20 10.43.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/735929d6-0fc9-f9a0-1fba-62e788769faa.png)

ここに表示されるようになるので選択するだけ
![スクリーンショット 2019-10-20 10.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/952fe883-d760-7739-e974-adbb3fca4e82.png)

# Rictyフォントをmacにインストール
https://jinnaitakumi.com/ricty_diminished/

# ターミナルの先頭の文字を変更する
文字が長ったらしくて目が痛い
![スクリーンショット 2022-07-25 23.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/5878574c-0f6b-5e7e-372a-155899db281c.png)
### ターミナルの先頭の部分を設定している部分を探そう
どうやらこのファイルに設定内容が書かれてるみたい
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
/Users/(自分のユーザー名)/.zshrc

※ドットから始まるファイルはシステムファイルで
※通常では表示されないので `command + shift + .` で表示させよう
![スクリーンショット 2022-07-25 23.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/3388c72c-bedc-fa8e-5e95-f8713a1dde8a.png)
##### ファイルを開いて設定を変更しよう
ファイルを開くと色々書かれてるけど下までスクロールすると `PS1="xxxxxxxxxx"` ってところがある
このxxxxの部分がターミナルの先頭の部分を表示させている
![スクリーンショット 2022-07-25 23.23.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/2ad340d1-e964-3355-6200-ad5f437f5450.png)
デフォルトは `%n@%m %1~ %#` みたいだけど何やってるのかよくわからないね
そこで、こいつをみてみよう
![スクリーンショット 2022-07-25 23.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/53ae4ac0-0025-4131-6990-aba05189f5e4.png)

私の場合は今いるディレクトリの名前だけわかればいいので
こんな感じに変更して `command + s` で保存
```
# Default prompt
PS1="%c :"
```

ターミナルを閉じて、開き直すとこんな感じになった
![スクリーンショット 2022-07-25 23.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/68f1d923-890f-4c06-255a-73cfa5065e01.png)


まぁ `:` つけた方がここから自分が書いたこコマンドだよってわかるから `:` も入れた

# 完了
2022年7月に一部更新しました。
情報が古かったらすみません。
pythonを用いてRDataからcsvに変換する

私用で使いたいデータセットにRDataがあったのですが、内部のデータを抽出してpythonで扱えるフォーマット(今回は.csv)に変換する必要があったため、その方法を調べて自分用にまとめました。
# pyreadrをインストールする
terminalでpyreadrというモジュールをインストール

```terminal
pip install pyreadr
```
python3で使用したいなら、

```terminal
pip3 install pyreadr
```
コチラ(https://github.com/ofajardo/pyreadr) を仕様するとRDataをpythonで扱えるようになる。

# 大まかな使い方
これでRData内のデータをpythonで扱うことができる。

```python
import pyreadr
data = pyreadr.read_r(path) #使用する.RDataのpathを入力
```

| A                 | B                  |    C    |
|:-----------------:|:------------------:|:------------------:|
| 0              |    あ           |        a        |
| 1            |            い |       b      |
| 2              |              う |       c       |
| 3               |                え |         d        |
| 4              |             お |       e       |
| 5          |           か |      f       |

上記のテーブルの様な型でデータが入っていて、特定のカテゴリーを抽出したい場合、

```python
A = data['A']
```
このようにするとコラムだけを抽出したデータを扱うこともできる。

# pandasをインストールする
ここからは抽出したデータをcsvとして出力する為の方法。
おそらくpython使用してデータを扱う方には馴染みのあるモジュールでしょう。

```terminal
pip install pandas
pip3 install pandas #さっきと同様、python3で使い方はコチラでインストール
```
ここから普通にデータフレームを作ってcsv形式で出力するだけです。念の為、私と同様の初学者のためにこの後の流れも記載しておきますが、pandasはpythonでデータ操作をする上で重要なパッケージなのでもっとしっかりしたサイトで学習することをお勧めします。

私が学習に使用したサイトのリンクを載せておきます。
https://tutorials.chainer.org/ja/11_Introduction_to_Pandas.html
もっとしっかり実用的な学習をしたい方にはコチラの学習本をお勧めします。
[PythonユーザのためのJupyter[実践]入門](https://www.amazon.co.jp/Python%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEJupyter-%E5%AE%9F%E8%B7%B5-%E5%85%A5%E9%96%80-%E6%B1%A0%E5%86%85-%E5%AD%9D%E5%95%93/dp/4774192236/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=jupyter&qid=1571534612&sr=8-1)

# pandasでデータフレームを作ってcsvで出力する
RDataを入力して、データフレームを作ってcsvで出力するまでのコードを一気に書いていきます。

```python
import pandas as pd
import pyreadr
PATH = 'hoge' #扱いたい.RDataのパス
w_PATH = 'hogehoge' #出力した.csvのパス

data = pyreadr.read_r(PATH) #.RDataを入力

df = pd.DataFrame({ #データフレームを作成
       "A": data['A'],
       "B": data['B'],
       "C": data['C']
)}

df.to_csv(w_PATH) #作成したデータフレームを.csvで出力

```
以上で終了です。データフレームの作成段階で必要ないデータを抜いて出力すればより扱いやすいデータを作成できると思います。
当方も初学者ですのでもっとスマートなやり方があったり何かアドバイスがあればコメントで助言いただけると幸いです。
Rasberry Pi 3B+ で LED を点灯

#はじめに
Rasberry　Pi 3B+ でLED を点灯・消灯させるようにするが、まずはRasberry Pi 3B+ の端子に出力される電流や LED に流せる電流がどれぐらいなのかを見てみる。

#用意するもの

- Raspberry Pi 一式
- LED（何色でもよい）
- 抵抗（300Ω～1kΩ）
- ジャンパーワイヤー（オスメス型2本）

## LED の確認 
アマゾネスから、[『3mm 砲弾型の安いヤツ』](https://www.amazon.co.jp/KKHMF-100%E5%80%8B-%E7%99%BA%E5%85%89%E3%83%80%E3%82%A4%E3%82%AA%E3%83%BC%E3%83%89-LED%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%83%90%E3%83%83%E3%82%B0-%E5%90%8420%E5%80%8B/dp/B078MPBQYL/ref=sr_1_9?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=LED+3mm&qid=1571523124&s=industrial&sr=1-9)を買ったので、どれぐらいの電流を通していいのかよくわからん。

LED にあまり大きな電気を通すと、LEDが劣化する。劣化するぐらいならいいけど、焼けて溶けて危ないｗｗｗ
ということで、まずは LED にどれぐらい流していいのか、ググってみる。


http://www.my-craft.jp/html/aboutled/led_jyundenryuu.html

なるほど、標準電流は 20mA、最大電流は 30mA なのね。
そして、電圧は 2.1V と記載している。

## Raspberry Pi の出力
Raspberry Pi 3B+ の 3.3V 端子から電源を取るので、あと1.1V が必要となる
そして、Raspberry Pi 3B+ はどれぐらいの電流が流れるのかはいかに記載があった。

https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/README.md

なるほど。 16mA と記載があった。（GPIO 全体で 50mA）

## 抵抗の計算
これで、どれぐらいの抵抗が必要かだせるね！
中学生で習った電気の公式に当てはめる。

V=v1 + v2 + ....

なので、抵抗部分は 1.1V となる。

E=IR

1.2 = 0.016(16mA) * R
R = 75

答えは 75 Ω


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/afa14f38-62e2-f1e9-4d32-6d50317ae2ab.png)

ぎりぎりいっぱいを攻めなくてもいいし、そんな抵抗持っていないから、持っている抵抗で「470Ω」を使う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/2fde7cfa-86cd-468b-1a49-5d1701a90a6b.png)


ちなみに簡単な回路図を書くのであれば、「 https://www.lucidchart.com/ 」が便利。


# 回路作成

上記の回路図を作るだけ。
以下のようになっている



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/380c58bb-ae76-ffa3-f93d-36ec7e005145.png)

黒色の配線がグランド、白色が3.3Vに接続している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/c8ccedea-8a2e-a271-63d2-7f49e89a492a.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/90a4577c-0fe3-d12f-c278-908d6d18061f.png)


[「Raspberry Pi の 端子配列」](https://elinux.org/RPi_Low-level_peripherals#Model_A.2B.2C_B.2B_and_B2) は公式ページに掲載されている。


Raspberry Pi に電源を入れると、ぴかーーーー


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/9b86e70c-3637-520d-83f5-5428c3c05e5b.png)
【イベントレポート】2019/10/19 UiPathシナリオ研究会を開催しました！

こんにちは、おしうみです。

この度は、初めての主催イベント「UiPathシナリオ研究会」の第一回を開催しました！
東京と大阪の同時開催で参加者は合わせて15名。UiPathについて熱くディスカッションしてきました！

# UiPathシナリオ研究会とは

UiPathのシナリオ作成の方法について、**参加者同士で知識・経験を共有し**、ベストプラクティスを追求する会です。

今回は、「安定性」「高速性」「見やすさ」をテーマにしました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/d93da9f5-5217-5712-0e53-b0048fd263d6.png)

# 今回のイベントで溜まったナレッジ

今回はLT, 自分流UiPathの作り方, シナリオレビュー, ディスカッションをやりました！（盛りだくさん！）

そこで、溜まったナレッジを一挙公開していきます！

## UiPathの場合は「シナリオ」ではなく「ワークフロー」です

UiPathの中の人からご指摘がありました。

UiPathでは「ワークフロー」というそうです！

すみませんでした！これからは「ワークフロー」といいます！

早速UiPathワークフロー研究会に改名しました。

## UiPathの場合はロボットは作りません。ワークフローを作るのです。

UiPathの中の人からご指摘がありました。。

すみません、ロボットを作るという表現はもう致しません...！

UiPath Robotという製品があるので、「Robotを作る」というのはおかしいと、言われてみればロボットは作りませんね、、、。ワークフローを作ります！

## 変数名は日本語OK！

変数名は日本語が使えます！

ただし2018.4から（ここは正確ではないかも）です。

## Generic Value型は基本使用しない

Excelから値を読み込むときなど、Generic Value型で読み込まざるを得ない場合がありますが、それ以外はGeneric Value型は基本的に使用しないようにしましょう。

## Microsoftは.NET Frameworkでハンガリアン表記法を廃止している!?

ハンガリアン表記法（ハンガリー表記法）とは、変数名に「int」「str」「dt」など型を記す方法です。

イベント終了後にいろいろ検索してみたら、Microsoftさんの開発ドキュメントにもしっかり明記されていました。（2008/10/22更新と書いてますが、現在はどうなんだろう...）

> × DO NOT ハンガリアン記法を使用しないでください。

[一般的な名前付け規則](https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/general-naming-conventions)

ちなみに、このドキュメントには、アンダースコアも使わないように！と書かれています！

> × DO NOT アンダー スコア、ハイフン、またはその他の英数字以外の文字は使用しないでください。

これはびっくり！

## 開発の前段階でシーケンス図を作ろう！

シーケンス図についての説明は（個人的に）こちらが分かりやすかったです。

[シーケンス図の書き方 | 分かりやすく図解で解説](https://medium-company.com/%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E5%9B%B3/)

シーケンス図を作成すると、データの流れが分かりやすいそう！

## シーケンスとフローチャートどちらを使う？

【シーケンス】

- アクティビティが見えるのが良い（フローチャートはクリックしないとアクティビティがみれない）


【フローチャート】

- 業務の流れがフロー図式されていればそのまま実装しやすい
- 分岐やループ処理が分かりやすい
- フローの線を追いかけるのが大変...
- 整理されていないと見にくい

## アクティビティの表示名は分かりやすく！

少々長くなっても良いので、わかりやすい名前をつけましょう！

## ハードコーディングはやめましょう！

ハードコーディングとは、固定値を直接UiPathのワークフローの中に記入することです。

できるだけ、Excelなどに記入して、そこから読み込む形で使用しましょう！

## 基本的にtry-catchをいれましょう！

本当に絶対エラーが起きない（「代入」アクティビティ）とか以外は基本的にtry-catchの中にいれましょう！

エラー処理は忠実に！

## waitForReady（準備完了までの待機時間）の値はケースバイケース！

waitForReadyのCOMPLETEは「画面に要素が全て出現したら処理をする」という意味なので、ページ遷移をしたあとの一番最初だけ「COMPLETE」にすればOK！

あとは基本的に「NONE」か「INTERACTIVE」でOK！

## 繰り返し処理をするときに「Flowchart&if系」と「ForEach系」の使い分け

基本的にはForEach系でOK！

「Flowchart&if系」を使用すると、試行回数を最初に0にして、「最後まで処理されたら～～」という条件分岐をしないといけないので、少し複雑化してしまう。

ただ、繰り返し処理をする際の条件が複雑になる場合は「Flowchart&if系」を使う方が見やすい！

## send Hotkeyは極力使わない！

send Hotkeyを使わざるを得ない局面が出たとしても、画像認識で「画像をクリック」アクティビティも使えるので、「最終手段はsend Hotkeyか...」と思ってもまだあきらめないで！

## UiPath GOの使い方がわからない...

こちらを見れば解決！

UiPathのテクニカルサポートチームの方がツイッターで解説してくださっております！

https://twitter.com/UiPathJapan_TS/status/1182480687544205314


# おわりに

イベントでとても多くのナレッジが溜まりました。

私は主催側で、少し聞き逃した部分もあり、ディスカッションに加わっていないということもあり、参加者の方はもっと多くの知見が得られたのではないでしょうか！？

参加してくださったみなさまありがとうございました！
Capistranoを使ってRailsプロジェクトをデプロイ

自動化ツールは一度動き出すと便利なんですが、周辺環境の変化に都度追随するのが大変です。いっそherokuとかのPaaSに移ったほうが良いのかもしれませんが、柔軟性の高さが欲しい場合もあるので、もう少し自力で頑張る方向で。

macOSをCatalinaにアップデートしたら、`cap`コマンドが使えなくなっていたので、改めてgemをインストールします。

``` sh
sudo gem install capistrano-bundler capistrano-rails
```

プロジェクト内のCapfileでは以下の3行をコメントアウトします。`capistrano/passenger` は何故か動かない（再起動に失敗する）のでそのまま無効化しています。

``` ruby
require "capistrano/bundler"
require "capistrano/rails/assets"
require "capistrano/rails/migrations"
# require "capistrano/passenger"
```

`config/deploy.rb` は以下のように使っています（repo_treeやkeep_releasesは状況や好みによって変わると思いますが）。Rails5.2系になって一番の変化は `master.key` です。これは git 管理しないことが推奨されているので、別の経路でサーバに転送しておく必要があります。sharedフォルダが(currentやreleasesと並んで)存在しているので、その中に設置しておいて、`linked_files`の中に加えて上げると、各リリースの配備時にこのファイルのリンクを作ってくれます。

前述したようにPassengerの再起動がうまくいかないので、ここでタスクを定義して配備完了後にApacheを再起動するコマンド(`apachectl restart`)を実行しています。

``` ruby
set :application, "myapp"
set :repo_url, "git@bitbucket.org:myrepo/myapp.git"
set :repo_tree, 'railsapp'
set :keep_releases, 3

append :linked_files, "config/master.key"

namespace :deploy do
  after :publishing, :restart

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :sudo, 'apachectl restart'
    end
  end
end
```
Swagger で example values のキーを削除する・無効にするには readOnly: True 属性をつければ良いらしい？ いや違うな。

![image](https://user-images.githubusercontent.com/13635059/67152106-610de080-f30b-11e9-937b-9d8f6956d657.png)

[Swagger Doc "Example Value" is very large, how to simplify, override or hardcode it? · Issue #4898 · swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui/issues/4898)


# UI作用はそうなのだけど、本当に用途が合ってるか？

![image](https://user-images.githubusercontent.com/13635059/67152120-91557f00-f30b-11e9-9d68-01eb91ca603c.png)

[Data Types | Swagger](https://swagger.io/docs/specification/data-models/data-types/)


![image](https://user-images.githubusercontent.com/13635059/67152177-4851fa80-f30c-11e9-9b8a-2bbda47eee4e.png)


[OpenAPI Specification | Swagger](https://swagger.io/specification/)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2607








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
IOS develop!IOS 開発

—VietNamese—
Xin chào mọi người, hiện em/mình đang học về ios developer qua swift, thông qua một số khoá học online.
Udemy: https://www.udemy.com/course/ios11-app-development-bootcamp/learn/lecture/7719428?start=75#overview
Sau đó em/mình sẽ học https://www.raywenderlich.com/
và cuối cùng là khoá của standford online.
em/mình có một số thắc mắc khi học nên nhờ mọi người giúp đỡ.

1. Hiện tại em đang tự học , sau 1 năm tự học em có thể trở thành senior k? anh chị nào có kiến thức trước xin cho em kinh nghiệm và chia sẽ dùm em con đường và các khoá học tài liệu để e có thể định hình và đi tiếp ạ.

2. Hiện nay các thị trường ở singapore hay châu âu hay nhật bản việc tuyển dụng ios với senior ra sao ạ? Yêu cầu và lương ra sao ạ? từ một người mới học ios với tự học có thể sau 1 năm sẽ ứng tuyển được k ạ?

Mong có anh chị nào có kinh nghiệm trước đó xin được xin ý kiến ạ.

—English—
Hello everyone, now I am studing about iOS development on swift by online cousre on Udemy:
Link: https://www.udemy.com/course/ios11-app-development-bootcamp/learn/lecture/7719428?start=75#overview
then, I will learn https://www.raywenderlich.com/
after, I learn Stanford online.

I have some question, can You help me?
1. Now I am studying swift, after 1 years only I can become senior developer? Can I do it? Can you give me advice to done this plan. Can you give me course, book, or seminar to help me do my plan. Thanks a lot
2. Now, What condition of IOS Developer in Singapore, Europe or Japan. ? after one years only studying, Can I apply?
Can you help me to answer?
---日本語---
 みなさん、おはようございます。
現在、私はオンラインコースでIOS開発を学んでいます。
Udemy: https://www.udemy.com/course/ios11-app-development-bootcamp/learn/lecture/7719428?start=75#overview
このコースが終わった後、 https://www.raywenderlich.com/
最後はstandford online.
私は学ぶ中に質問がございます。
１。上のコースを学べば、１年間だけ上級開発ができますか？出来なければ、他のコース、本、セミナーがございましたら、教えてくれませんか？
２。私はシンガポールやヨーロッパや日本にてIOS開発募集について条件はなんでしょうか？１年間だけ勉強すれば、募集しても大丈夫でしょうか？
Excelでの「日付と解釈できる文字列」のセルへの代入 


「日付と解釈できる文字列」のセルへの代入 - マイクロソフト コミュニティ
https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E6%97%A5%E4%BB%98%E3%81%A8%E8%A7%A3%E9%87%88/e8205e9f-81f5-43c3-8a52-5c2b9fb3c1df?auth=1

>Excel365 バージョン 1909(ビルド　12026.20334)に上がってから

>```Range("A1").Value = "令和1年10月17日"```

>の結果が

>`"令和1年10月17日"`

>じゃなくて

>`2019/10/17（Value）`
>`"令和1年10月17日"(Text)`

>になるのですが、これは私の環境だけでしょうか。それとも仕様でしょうか。
>仕様であるなら、依然と同じ動作にする設定等はあるでしょうか。
Git Github 使い方 ※自己用


とりあえず使いたいので、自分の記録用。

### 環境 
Mac なので最初から入ってる(version確認)
設定(name,address)


```ruby:filename.rb
$ git --version

$ git config --global user.name "your name"
$ git config --global user.email "your@email"
```

Githubでremote repositoryを作成して、登録。

```ruby:filename.rb
$ git remote add origin https://github.com/----.git
```
Delphiでポインタをストリームとして扱う

#何をしようとしたの
普段ポインタを直接使うことはほぼないのですが、
最近 .NETアプリ等からバイナリデータの
ポインタを受け取るようなDLLを作ってて
ストリームにラッピングしたら楽じゃね？
ってことでやってみた。

#コード
```pascal:Unit1.pas
unit Unit1;

interface
uses
  System.Classes;

type
  TPointerStream = class(TCustomMemoryStream)
  public
    constructor Create(ptr: Pointer; const size: Int64);
  end;

implementation
  constructor TPointerStream.Create(ptr: Pointer; const size: Int64);
  begin
    inherited SetPointer(ptr, size);
  end;

end.
```

.NETのMemoryStreamクラスと違い、
最初からポインタ前提の基底クラスがあるので
実装もアホかというくらいシンプルです。
クラス名が適切かどうかも無視。


#使い方
コンストラクタに確保済みのメモリアドレスとサイズを指定するだけ。
読み取り専用ですが、書き込みに対応させても良いですし
[TBinaryReaderクラス](http://docwiki.embarcadero.com/Libraries/ja/System.Classes.TBinaryReader)でラッピングして使っても良いですね。
私は`TBitmap.CreateFromStream`に渡したりしてます。

#総評
もう既に誰かがやってそう。
初心者によるプログラミング学習ログ 131日目

# 100日チャレンジの131日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

131日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>131日目<br><br>Udemyでwebデザイン、ヘッダーのロゴとナビゲーション作成<br>ドットインストールでwebサイト構築、大枠作成<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#webデザイン</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1184217965207490562?ref_src=twsrc%5Etfw">October 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ChromeのStylishを使って、githubのフォントを変更する

githubのフォントを変えるには、Chromeの拡張機能に、指定したサイトにCSSを追加できる [Stylish](https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe) という拡張機能が使える。

それを使って、StylishのCreate New Styleから、以下のようにコードに対してフォントを適用するCSSを追加する。

```css
.blob-code, .blob-code-inner {
     font-family: "Liga InputMono",Hasklig,"Hasklig Light",SourceCodePro,"Source Code Pro",SourceHanCodeJP,"Source Han Code JP,TakaoGothic";
}
```

github.comとgist.github.comを"URLs starting with"で追加する。

<img width="835" alt="Screen Shot 2019-10-20 at 8.18.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3413/18f7c0a6-732f-a1ce-87be-b55d852a8100.png">
[iOS]アプリ申請完全自動化

# アプリの申請を完全に自動化する

ソースコードをpushしたら、あとは何も考えなくてもストアにリリースされる。
そんな環境を作ってみたのでメモ
*まだちゃんと動かなさそう*(fastlane_sessionが1ヶ月でexpireする）

# 全体の流れ


<img width="1366" alt="IMG_88DD0533F907-1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/b53e31c9-490c-1ee3-60fb-c1385a66d616.jpeg">

↑こんな感じ

Bitriseの部分は別になんでも良いのだけど、無料枠があったのでBitriseにしている。
[automate.io](https://automate.io) は、いわゆるIFTTTのようなサービス。
似たようなサービスでメルカリの採用している[Zapier](https://zapier.com)と言うのがあるが、カスタムWebhookがプレミアム専用なのでautomate.ioを使うことにした。
正直Zapierの方がsampleみながらzap作れるしgmailの取得速いし、正規表現ちゃんと使えるのでZapierの方がおすすめです。

# GithubにpushしてBitriseからappstore connectへアップロードする

ここは簡単。
[bitrise.io](https://app.bitrise.io/referral/48b158f55b33aa32)にサインアップしたら、チュートリアルの通りに進めばリポジトリとbitriseの連携が完了する。
あとは「Deploy to iTunes Connect - Application Loader」というstepを追加して、適宜情報を書き込めばアップロードされるようになる。
注意点としては、build numberをincrementすることを忘れずに。同じビルド番号のipaはアップロードに失敗します。
build numberの設定は「Set Xcode Project Build Number」というStepを使えば簡単に設定できます。
そして、書いていて思ったけどこの時点でappstore connectに新規のバージョンが無い可能性があるのでここはfastlaneのdeliver使った方がいいですね。

# AppStore ConnectのCompleted Processを待つ

ipaをアップロードすると、appleは自動的にipaの健康状態をチェックしてくれます。（悪いことしているとこの時点で弾かれる）
ここは大体数分から数時間と幅があるのでひたすら待ちます。
待っていると、Appleから`App Store Connect: Version 1.0 (1) for AppName has completed processing.`というタイトルのメールが届きます。

# Completed Processingのメールが届いたらbitriseのworkflowを発火させる

automate.ioを使ってgmailを監視して、メールが届いたらbitirseのapiを叩きます。
メールにはbuild numberとversionも記載されているので、これらをパースしてbitriseの環境変数に乗せておきます。

<img width="1049" alt="スクリーンショット 2019-10-20 6.22.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/8c1191b8-3f1d-3d0d-a58d-4069e6a72c7b.png">

automate.ioのbotの中身はこんな感じ。
正規表現機能がガバガバなので、タイトルをスペースで区切って取り出しています。

# bitriseからサブミットする

automate.ioのwebhookから叩かれたworkflowでfastlaneのdeliverを呼びます。
この辺は特に難しいところはないです。
サブミットするビルドのbundle numberなどは環境変数に入っているのでそれを使います。
fastlaneのascへの接続はFASTLANE_SESSIONを利用していますが、2FA切ったアカウントで認証しても良いと思います。

# 完成

あとはbitriseのtriggerなどを調整しながら、使いやすいようにしていきましょう。
テキストデータを読み込んで散布図の作成

```python
import numpy as np
import matplotlib.pyplot as plt

x = np.loadtxt(‘a1.dat’, usecols=2) # 2列目
y = np.loadtxt(‘a1.dat’, usecols=3) # 3列目

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title(‘Compare two methods’, fontsize=20)
ax.set_xlabel(‘Method1’, fontsize=18)
ax.set_ylabel(‘Method2’, fontsize=18)

plt.scatter(x, y, s=600, c=”pink”, alpha=0.5, linewidths=”2″, edgecolors=”red”)
plt.savefig(‘compare.png’) # Save as an image
plt.show() # show on your display
```

図のあたりは、他のページを参照したので、これが良いのかわかりませんが、とりあえず、それらしきものは作れます。見た目は、scatterの後の数字やらをいじくればなんとかなります。
CentOS8で無線LAN(RTL8822BE)が繋がらないときに

# CentOS8で無線LAN(RTL8822BE)が繋がらないときに
取った対策のメモ。（niche markets)

## secure boot
secure bootになっていると無線LANが使えないみたい。

```
# 確認
mokutil --sb-state

# 解除
sudo mokutil --disable-validation

参考
https://roguelikelog.blogspot.com/2018/06/linux-mokutilwifi.html
```

## ドライバインストール
```
sudo yum update
sudo yum groupinstall "Development Tools"
sudo yum install kernel-devel kernel-headers
git clone https://github.com/lwfinger/rtlwifi_new.git
cd rtlwifi_new
git checkout -b extended origin/extended
make
sudo make install
sudo modprobe rtl8822be
reboot
```
Houdini Python Script を別のPythonインタプリタから実行する

# 起動中のHoudiniに別のPythonからスクリプトを実行する

## 環境
<pre>
Windows 10
Houdini Apprentice 17.5
Python 2.7.14
</pre>

https://www.sidefx.com/docs/houdini/hom/rpc.html の手順通りやるだけです。

## 手順
### 1. Houdini上で以下のPyhtonスクリプトを実行する

```python
import hrpyc


hrpyc.start_server()
```

### 2. 別起動しているPythonにパスを通す

```python:add_path_for_hrpyc.py
# coding: utf-8 
import sys


# 各自Houdiniのインストールパスに合わせて書き換えてください。
sys.path += [
    "C:/Program Files/Side Effects Software/Houdini 17.5.293/houdini/python2.7libs",
    "C:/Program Files/Side Effects Software/Houdini 17.5.293/python27/lib/site-packages",
]

# どうでもいいはなし
# 
#   今回の方法は以下の2つのライブラリを利用する必要があります。
#
#   hrpyc: Houdiniのrpycのラッパーライブラリ
#     Houdiniは C:\Program Files\Side Effects Software\Houdini 17.5.293\houdini\python2.7libs  にパスを通して利用しています。
#
#   rpyc: rpcを利用してPython Procedureを呼び出すライブラリ…らしい
#     Houdiniは C:\Program Files\Side Effects Software\Houdini 17.5.293\python27\lib\site-packages にパスを通して利用しています。
#
#   正しくはpipとかでrpycライブラリをインストールするべきですが、
#   面倒なので、今回はHoudiniで利用しているライブラリをそのまま使いました。
#   本番では熟慮しようね！
```

### 3. 別起動しているPythonで手順1で起動したサーバーと接続する。
```python
import hrpyc


connection, hou = hrpyc.import_remote_module()

# どうでもいいはなし
#   connection.close() でHoudiniとの接続を切ることもできるが、
#   公式ドキュメントを読む限り、connectionが削除した際や、
#   ガベージコレクタにconnectionが破棄された際に自動的に接続を切るとのこと。
```

### 4. 別起動しているPythonでhouモジュールを操作する
```python
geo = hou.node('/obj/').createNode('geo', 'geo_test1')
geo.moveToGoodPosition()
```

## 終わりに
Mayaからの移民なのでHoudiniではメチャクチャ簡単にできることに戦慄していますね。
(Mayaのcmds.commandPortと同じく、パット見使えそうだけど、
 いざ利用してみるとなんか違う…みたいなものかもしれませんが。)

あと、今回出てきたrpycライブラリは可能性を感じるので、
もう少しここらへんを掘りさげると面白いことができそうだな～と悪巧みしています。

最後になりますが、正直Houdiniはあまり詳しくないので、
概念や用語やしきたりなど間違いがあればご指摘いただけると助かります！

ではでは。

## 参考
https://www.sidefx.com/docs/houdini/hom/rpc.html
macOS CatalinaにPython3.8をインストールし、セイウチ演算子を試す

# モチベーション

- Python3.8で利用可能となったセイウチ演算子(:=)を使ってみたい
- Catalina出たしPython環境をアップデートしたい

# インストール
## 先に結論

これだけでうまくいきました。
私の環境はanyenv x pyenvでPythonを管理しているため、`python-build`のディレクトリパスは適宜読み替えていただければと。

```bash
$ cd ~/.anyenv/envs/pyenv/plugins/python-build && git pull origin
$ pyenv install 3.8.0
```

以下、試行錯誤の備忘録として。

## pyenvで3.8-devのインストールを試みるもエラー

```bash
$ pyenv install 3.8-dev
・・・
Inspect or clean up the working tree at /var/folders/pv/nt2zdh7d0bzf2jlwn0zqgpnw0000gn/T/python-build.20191020002826.40064
Results logged to /var/folders/pv/xxx/T/python-build.20191020xxx.xxx.log
```
とあったのでログを見ると、以下のあたりが怪しい。

```bash
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/tk.h:78:11: fatal error: 'X11/Xlib.h' file not found                                          #       include <X11/Xlib.h>
                ^~~~~~~~~~~~
1 error generated.
```

## xquartzをインストールしてみた

```bash
$ brew cask install xquartz
```

これで再実行したところ↑のエラーは消えたものの、やはりインストール自体は失敗してしまう。

## CFLAGSを足して実行してみた

ビルド時にCのヘッダがうまく読み込めてないのかな？と思い、以下実行。

```bash
$ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.8-dev     
```

これもだめ。

## pyenvが古いらしい。。。

エラーをよく見ると、こちらのwikiを見ろ、と。
https://github.com/pyenv/pyenv/wiki/Common-build-problems

そして、私のpyenvがそもそも古かったようなのでpython-buildをUpdate
私の場合、anyenvを使ってpyenvを管理しているため、以下のディレクトリにpython-buildプラグインが入っています。

```bash

$ cd ~/.anyenv/envs/pyenv/plugins/python-build && git pull origin
```

するとちゃんと3.8.0がリストに入ってきてた。。。(まだ3.8-devしか無いのかと完全に勘違いしていたという)

```bash
$ pyenv install -l
・・・
  3.7.1
  3.7.2
  3.7.3
  3.7.4
  3.7.5
  3.7.5rc1
  3.8.0
  3.8-dev
  3.9-dev
・・・
```

```bash
$ pyenv install 3.8.0
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.0.tar.xz...
-> https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz
Installing Python-3.8.0...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.0 to /Users/xxx/.anyenv/envs/pyenv/versions/3.8.0
```

と、いう対処方法がこのあたりに書かれていました。
https://github.com/pyenv/pyenv/wiki/Common-build-problems#python-build-definition-not-found

なるほどー

# セイウチ演算子を試す
## 早速試してみる

pyenvで利用するデフォルトのPythonを3.8.0に変更。
これまで3.6.6を利用していたので随分すっ飛ばしている。

```bash
$ pyenv global 3.8.0

$ pyenv versions
  system
  3.6.6
* 3.8.0 (set by /Users/xxx/.anyenv/envs/pyenv/version)
```

## セイウチ演算子(:=)を使ってみる

変数を定義しつつ、変数に与えられた値をそのまま利用できる、ということで、試しにやってみた。
与えられた2つの引数を加算する関数`add`を無名関数で定義しつつ、引数に`2, 3`を与えてみる。

```python
(add := lambda x, y: x + y)(2, 3)
```

以下、実行結果。

```python
$ python
Python 3.8.0 (default, Oct 20 2019, 01:28:34)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

# セイウチ演算子を使って関数を定義しつつ実行
>>> (add := lambda x, y: x + y)(2, 3)
5

# 変数を確認すると、確かに関数が設定されている
>>> add
<function <lambda> at 0x1067c7dc0>

# 変数名から関数を呼び出してみる
>>> add(2, 10)
12
```

なにこれ便利。
macOS 10.15 Catalinaで、"fatal error: 'stdio.h' file not found"が出てしまう！


初めてRailsとやらの環境構築をしていた際、gem install pgなどすると以下のようなエラーが出ていて困り果てていました。

```/Users/Rascal/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-18/2.6.0-static/pg-1.1.4/mkmf.log
find_executable: checking for pg_config... -------------------- yes

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

"clang -o conftest -I/Users/Rascal/.rbenv/versions/2.6.4/include/ruby-2.6.0/x86_64-darwin18 -I/Users/Rascal/.rbenv/versions/2.6.4/include/ruby-2.6.0/ruby/backward -I/Users/Rascal/.rbenv/versions/2.6.4/include/ruby-2.6.0 -I. -I/usr/local/Cellar/postgresql/11.5_1/include -I/Users/Rascal/.rbenv/versions/2.6.4/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -ggdb3 -Wall -Wextra -Wdeclaration-after-statement -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens  -pipe conftest.c  -L. -L/Users/Rascal/.rbenv/versions/2.6.4/lib -L/usr/local/lib -L. -L/Users/Rascal/.rbenv/versions/2.6.4/lib  -fstack-protector-strong -L/usr/local/opt/openssl/lib -L/usr/local/lib -L/usr/local/Cellar/llvm/8.0.1/lib/clang/8.0.1/lib     -lruby.2.6-static -framework Security -framework Foundation -lpthread -lgmp -ldl -lobjc   "
In file included from conftest.c:1:
In file included from /Users/Rascal/.rbenv/versions/2.6.4/include/ruby-2.6.0/ruby.h:33:
In file included from /Users/Rascal/.rbenv/versions/2.6.4/include/ruby-2.6.0/ruby/ruby.h:29:
In file included from /Users/Rascal/.rbenv/versions/2.6.4/include/ruby-2.6.0/ruby/defines.h:123:
/Library/Developer/CommandLineTools/usr/include/c++/v1/stdio.h:108:15: fatal error: 'stdio.h' file not found
#include_next <stdio.h>
              ^~~~~~~~~
1 error generated.
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

/Users/Rascal/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-18/2.6.0-static/pg-1.1.4/mkmf.log (END)

```

stdio.hがないですと…？

Mojave(10.14)のときは、`open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg`で何とかなっていたのですが今回からそのようなパッケージもなく、以下のパスを参照するようにしても上手く行きませんでした。
`export CPATH=/Library/Developer/CommandLineTools/usr/include/c++/v1`

結論としては、以下を~/.bash_profileなり~/.bashrcに追記することで問題は解消されました。
`export SDKROOT="$(xcrun --sdk macosx --show-sdk-path)"`

この問題にぶつかるまでは、Dockerを使っての環境構築をしていたので自身のマシンで苦労するとは思いませんでした。
Talendで始めるREST APIテスト

REST API のテストに関して、
GUIで分かりやすい！簡単にできる `Talend（旧 Restlet）` について整理します。
（私が使い始めた頃は `Restlet` という名前でしたが、最近提供元の社名 `Talend` に変わったようです）

## そもそも REST とは？
> Representational State Transfer (REST) は、ウェブのような分散ハイパーメディアシステムのためのソフトウェアアーキテクチャのスタイルのひとつである。
> ...
> フィールディングのREST原則に従うシステムは、しばしばRESTfulといわれる。
> （出展 : Wikipedia）

... はい、よく分かりません。
`RESTful API` で調べても色々と出てきます。

### 参考
* https://blog.api.rakuten.net/jp-restful-api/

## Talendとは？
REST APIのGUIテストツール（Chrome拡張機能）。提供企業は Talend社。
企業情報を確認すると、BI関連の会社かなとざっくり分かります。
私自身、久しぶりに Restlet を使おうとすると `Talend` という名前になっていて驚きました笑
数年前にRestlet社が Talend社に買収されていたようです（[プレスリリース](https://jp.talend.com/about-us/press-releases/talend-acquires-restlet-leader-cloud-based-api/)）

## インストール
* [Chromeウェブストア](https://chrome.google.com/webstore/category/extensions?hl=ja) で `Talend API Tester` と入力、検索する
    * 概要 : `REST、SOAP、HTTP APIと視覚的に対話できます。` 
* `Talend API Tester - Free Edition` をクリックする
* `Chrome へ追加` をクリックする
* Chromeブラウザのアドレスバー右にアイコンが追加されたことを確認しクリックし、 `Talend` を開く

## 設定
* `MY DRIVE` にカーソルを合わせ、右のボタンをクリックし、`Add a project` でプロジェクトを作成する
![スクリーンショット 2019-10-19 23.32.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74924/af3992ed-adfd-0562-f1ce-e4ccab691aee.png)

* 作成したプロジェクト配下に `Add a service` で大項目を、その配下に `Add a request` で各APIのリクエストを作成する
    * プロジェクト作成時に作成される `Scenario` は一旦置いておく
* 作成したリクエストをクリックし、API実行時に必要なパラメータ `METHOD`、`HEADERS`、`BODY` を設定する
* 右上の `Add an environment` で、ローカル、開発、ステージング、本番 などの各環境を追加する
    * `Environment name` に各環境名を入力する
    * 環境ごとに異なるホスト名などを変数化する
        * 変数はこんな感じ `${host}` で使えます！
![スクリーンショット 2019-10-20 0.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74924/028cf37d-79f3-b441-014e-aeccbf90b1f0.png)
* 後はAPIをガンガン追加していく！
![スクリーンショット 2019-10-20 0.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74924/84d97175-ee84-f64e-890d-7bab14ff97dd.png)
* `Send` ボタンでAPIを実行し、レスポンスを確認する
    * 下に実行結果が表示される

## ある程度作ったら関係者に共有
* 左下の `Export` で APIや環境設定をJSON形式で書き出せる（便利！）
* 同、 `Import > Import API Tester Repository` からJSONファイルを読み込める（便利！！）
* 自分用に作って終わりではなく、関係者に共有すればみんなハッピー！

## 実際に使ってみると
* クライアントエンジニアの方は特にハッピー
    * 実際にサーバと結合する際、ソースにAPIへのリクエスト内容を組み込んでからレスポンスを確認するのではなく、組み込む前の確認や、各APIを横断的に即座に実行、確認もできるようになった
* 同様の理由により、API開発側のサーバエンジニアも開発速度が向上した
* また、（作りにも寄るが）クライアント側の実装前に、値を調整、確認する際にも使えそう
* テストコードを書く文化はなかったが、これなら楽しい、始められそう！と思った

### 一方で
* 開発時期は同時に複数のエンジニアが作業していたため、ある程度のJSONから各自の作業内容のJSONへ分岐していった
    * 結果、最終的なJSONを一人がまとめる作業をしていた
        * JSONはバージョン管理するのがいいかもしれません

## 次
* Talend の他の機能を触っていきたい
* Jenkins でCI回したい
今日学んだ基本情報の勉強内容(9)　～過去問編～

##過去問でわからなかったところをメモ
 - <font color="Red">リアルタイムOS</font>は時間的な制約を守ることができる利点をもとに即時処理が必要な時に用いられるOS。

 - <font color="Red">チャタリング</font>はスイッチなどの接点が切り替わった際に、微細で非常に速い機械的振動によって、電気信号が繰り返される現象

 - <font color="Red">スプリッタ</font>は高周波数の信号と低周波数の信号を分離、合成する装置

 - ディジタル署名の<font color="Red">DH</font>は事前の秘密情報の共有なしに暗号化鍵の共有を行う鍵交換方式

 - <font color="Red">DSA</font>は離散対数問題を用いたディジタル署名

 - <font color="Red">プライバシセパレータ</font>は無線LANに接続された機同士の通信を禁止する機能

 - ソフトウェア開発の構成管理はソフトウェアの構成を管理用のソフトウェアに記録して管理すること。プログラムや設計書、最新のバージョンなどが記録されている。
 





##参考文献
- [基本情報技術者試験ドットコム　基本情報技術者試験　過去問道場](https://www.fe-siken.com/fekakomon.php)