OmniAICreator/Qiita-1.07M huggingface dataset:
phpのslimをdockerで動かしてcurlでファイルをアップロードしたメモ

## 概要
dockerを使ってPHP-Slimを動かしてみたメモ。
ついでに、starserverにftpでアップロードしたメモも残す。
なお、startserverの無料枠はhttps化できなかったので微妙だなぁと。

[この時点のソース](https://github.com/hibohiboo/php-slim/tree/34cc8b7661abe0edbe9b49b313c4c9948cedf472)

## 環境

* Windows10
* Virtualbox 6.1.24
* Vagrant 2.2.17
  * box - ubuntu/focal64
     * docker-compose 1.29.2
     * docker 19.03.13
* git 2.32.0

## 環境構築
### dockerの準備
[laradock](https://github.com/laradock/laradock)から必要そうなもののみ抽出して使用。


* workspace
* php-fpm
* nginx
* mysql
* docker-in-docker

[docker/docker-compose.yml](https://github.com/hibohiboo/php-slim/blob/34cc8b7661abe0edbe9b49b313c4c9948cedf472/docker/docker-compose.yml)
[docker/.env](https://github.com/hibohiboo/php-slim/blob/34cc8b7661abe0edbe9b49b313c4c9948cedf472/docker/.env)

### composerでインストール
`docker-compose up`でlaradockを立ち上げたのちに、
`docker-compose exec workspace bash`でworkspaceに入る。
あとは、その中で`composer install`コマンドを実行。


## ファイルのアップロード

curlコマンドでアップロードするshellを組んでいる。

```sh:/bin/ftp-upload_all.sh
#!/bin/bash

# このシェルスクリプトのディレクトリの絶対パスを取得。
bin_dir=$(cd $(dirname $0) && pwd)
parent_dir=$(cd $bin_dir/.. && pwd)
public_dir=$(cd $parent_dir/public && pwd)
host=xxx.starfree.jp
user=xxx.starfree.jp
pass=xxxxx

cd $public_dir 
curl --upload-file composer.phar --user $user:$pass ftp://$host/
curl --upload-file .htaccess --user $user:$pass ftp://$host/
curl --upload-file index.php --user $user:$pass ftp://$host/
find templates -type f -exec curl -u $user:$pass --ftp-create-dirs -T {}  ftp://$host/{} \;
find vendor -type f -exec curl -u $user:$pass --ftp-create-dirs -T {}  ftp://$host/{} \;
```


## 参考

https://www.rasukarusan.com/entry/2021/05/01/121005

https://www.slimframework.com/docs/v3/start/installation.html
OpenFOAM 9 チュートリアルケースの動作確認 : 非圧縮性流体、icoFoam、天井駆動のキャビティ流れ

# ケース
$FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity
# 概要
天井部の壁 (movingWall) は x 軸方向に 1 m/s の速さで移動します。一方、他の３つの壁 (fixedWalls) は静止しています。流れは（乱流モデルを使用しないことから）層流と仮定され、層流、等温、非圧縮性流れ用の _icoFoam_ ソルバを使用して、一様なメッシュ上で解かれます。
# 解析モデル
解析モデルを下図に示します。
![figModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/9e85eafb-7ad7-6e92-2924-e5eb7307fc7e.png)
# 解析条件
解析条件を下表に示します。

|項目1|項目2|項目3|単位|設定内容|
|---|---|---|:-:|:-:|
|_system_|_blockMeshDict_|解析モデルサイズ _x_|m|0.1|
|   |   |解析モデルサイズ _y_|m|0.1|
|   |   |解析モデル分割数 _nx_|-|20|
|   |   |解析モデル分割数 _ny_|-|20|
|   |_controlDict_|開始時刻|sec|0|
|   |   |終了時刻|sec|0.5|
|   |   |$\Delta$ _t_|sec|0.005|
|_constant_|_transportProperties_|動粘性係数 $\nu$|m2/s|0.01|

# 解析結果
計算終了時 (0.5 sec) の圧力分布を下図に示します。
![figPressure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/aa299afb-bc85-911b-b09e-c6c3fb26d729.png)
計算終了時 (0.5 sec) の速度ベクトルプロットを下図に示します。
![figGlyph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/b80b3380-1847-1bd5-115b-d2c9a8d7b52a.png)
計算終了時 (0.5 sec) の流線を下図に示します。
![figStreamline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/8aaead13-33ef-449d-770b-14dd998c7523.png)
# 実行コマンド
前処理 (Pre-processing)
`run`
`cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .`
`cd cavity`
メッシュ作成
`blockMesh`
アプリケーションの実行
`icoFoam`
後処理 (Post-processing)
`paraFoam`
# 計算時間
0.07 (sec), シングル, AMD Ryzen 7 3750H with Radeon Vega Mobile Gfx
# 参照
- [OpenFOAM v9 User Guide: 2.1 Lid-driven cavity flow](https://cfd.direct/openfoam/user-guide/v9-cavity/)
- [XSim](https://www.xsim.info/articles/OpenFOAM/tutorials/incompressible-icoFoam-cavity-cavity.html)
VS codeからssh接続して、Amazon Linux2 にログインする

VS codeの拡張機能を使って、
Amazon Linux2にログインするやり方があったので、ご紹介致します。
これにより、
ディレクトリなど、かなり見やすいので、おすすめです。

※なお、今回は既にEC2があることを前提としています。


### インストール
VS codeで
`remote ssh`
などで検索し、
#### Remote - SSH
をインストールします。 
![スクリーンショット 2021-07-24 16.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/c8577c65-9b0d-e85e-ac92-545d6545bc90.png)


### configの設定
コンソールを開いて
.sshのconfigに設定を入れます
（.sshの中にconfigがない場合は新規で作成してください）

```ruby:/Users/{ユーザー名}/.ssh/config
Host { 任意の名称 例: test }
  HostName { 作成したEC2のパブリック IPv4 アドレス 例: 11.11.11.11 }
  IdentityFile { キーペアのパス 例: /Users/{ユーザー名}/.ssh/test.pem }
  User ec2-user
```

### VS codeで起動する
以下を押下します。
![スクリーンショット 2021-07-24 16.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/ce70ec0a-4012-eaad-fcc3-6c734d6093f7.png)

`Connect to Host`を押下します。
![スクリーンショット 2021-07-24 17.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/d503f04e-0dea-ce1c-2737-110b6a7c5dbd.png)

すると、先ほど
`config`に設定した
Host名が表示されるので、
それを押下します。


![スクリーンショット 2021-07-24 17.03.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/221b29f1-0e05-e5bf-b5b2-d3025545f878.png)

これで
VS codeで
Amazon Linux2 にログインできました。
openからディレクトリを開き、ターミナルを開けば、
かなり
見やすくなりました！！！！

![スクリーンショット 2021-07-24 17.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355517/dcf466a7-92ee-477d-0862-f270c1c72430.png)
別のhtmlをloadしたい場合 (jQuery3)

## 参考

https://css-tricks.com/the-simplest-ways-to-handle-html-includes/

https://api.jquery.com/load/

## jQuery対応バージョン

```
1.X系はIE8以前
2.X系はIE9～
3.X系もIE9～、性能向上
```

## 方法

```sh
$("#result").load("ajax/test.html");
```

## slim版について

* アニメーション系が省かれた軽量版の様子。CDNからgz圧縮された容量は以下
    * `min.js` 31.5kb
    * `slim.min.js` 25kb
* 今回の .load() 命令はslim版には含まれていない

### 利用方法

```html:index.html
<script src="//code.jquery.com/jquery-3.6.0.min.js"></script>

<div id="result"></div>

<script>
$("#result").load("my-table.htm");
</script>
```

https://www.anothersky.jp/2016/06/jquery_3_slimbuild_hint.html
初心者がオブジェクト指向について考えてみた


#まえがき
はじめまして。
PHPを使った開発を行う上でなかなかイメージが掴みづらい「オブジェクト指向」という概念ですが、
実際どのようにコーディングして、どのようなシチュエーションで利用すると便利なのか、検証して理解した事をまとめてみようと思います。

#注意事項
PHPバージョン：8.0.1

#ソース

まずはソースから記載するのですが、処理の動きとしては、
<ul>
<li>継承先となるextendClass.phpから、継承元のclass.phpを呼び出す</li>
<li>extendClass.php上でclass.php上で設計された機能（メソッド）を使う</li>
</ul>
というようなイメージとなります。

```php:class.php
<?php

// オブジェクト指向の簡単なデモ

class Car
{
    private $maker;        //メーカー
    private $name;         //車名
    private $model;        //型式
    private $displacement; //排気量
    private $fuelEconomy;  //燃費
    private $fuelCapacity; //燃料容量
    private $price;        //価格

    function __construct($maker, $name, $model, $displacement, $fuelEconomy, $fuelCapacity, $price)
{
    // メンバ変数を初期化
    $this->maker        = $maker;
    $this->name         = $name;
    $this->model        = $model;
    $this->displacement = $displacement;
    $this->fuelEconomy  = $fuelEconomy;
    $this->fuelCapacity = $fuelCapacity;
    $this->price        = $price;
}

    // 小さい単位のデータ取得、処理 ------------------------------------------------------
    // ゲッター（メーカー）
    public function getMaker(){ return $this->maker; }
    // ゲッター（型式）
    public function getModel(){ return $this->model; }

    // メンバ関数(メソッド)
    public function getLogicalMileage()
    {
        // 論理走行距離（燃費 * 燃料容量）
        return $this->fuelEconomy * $this->fuelCapacity;
    }
    public function getLMOfPrice()
    {
        // １万円あたりの走行距離（小数点第二で切り上げ）
        return round($this->getLogicalMileage() / $this->price, 2);
    }
    
    // クラス内で生成したデータを成形するメソッド -----------------------------------------
    /**
     * ゲッター、メンバ関数を用いて
     * 説明文の生成するメソッド
     */
    public function getDescription()
    {
        $text = "";
        $text = $this->getMaker(). "の". $this->getModel(). "は、";
        $text .= "論理走行距離が". $this->getLogicalMileage(). "km";
        $text .= "であり、";
        $text .= "車両価格対走行距離が1万円あたり".  $this->getLMOfPrice(). "km";
        $text .= "です。";
        return $text;
    }



}


```

```php:extendClass.php
<?php

echo phpinfo();

// クラスファイル読み込み
require 'class.php';

// 引数は可変値、設計書は使いまわすイメージ
$car1 = new Car("トヨタ", "ランドクルーザー", "4.6GX", 4608, 93, 6.9, 437.8);
$car2 = new Car("ホンダ", "ヴェゼル", "1.5 G Honda SENSING", 1496, 40, 21.2, 192.1);
$car3 = new Car("三菱", "アウトランダー", "20M", 1998, 63, 16.0, 247.8);

// 各オブジェクトから生成された説明文を出力
echo "<pre>";
var_dump($car1->getDescription());
var_dump($car2->getDescription());
var_dump($car3->getDescription());

// string(124) "トヨタの4.6GXは、論理走行距離が641.7kmであり、車両価格対走行距離が1万円あたり1.47kmです。"
// string(136) "ホンダの1.5 G Honda SENSINGは、論理走行距離が848kmであり、車両価格対走行距離が1万円あたり4.41kmです。"
// string(118) "三菱の20Mは、論理走行距離が1008kmであり、車両価格対走行距離が1万円あたり4.07kmです。"


```

#あとがき
オブジェクト思考を利用した開発を行う事で、
具体的な動きと入力される情報の置き場所を分けてコーディングする事ができ、
棲み分けを行う事ができるのは非常に良いなと感じました。

ただし、上記のような考え方を落とし込みながらシステムの要件定義や設計を行う必要があり、
そのためには時間が必要となりそう & 慣れが必要となんだろうなと思いました。
ROS2のsetup.*とlocal_setup.*

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】

まだメモ程度．情報が集まり次第，随時更新．


# setup.*とlocal_setup.*の違い
foxyまでのtutorialではcolcon build後行うのは，`. install/setup.bash`，galacticでのtutorialではcolcon buld後行うのは，`. install/local_setup.bash`となっている．違いは？
頭にいれておくのはoverlayによってワークスペースを切り替えて使用するのが当たり前となっていること．

## setup.*
現在のワークスペース以外の設定を読み込む．ament indexのparent_prefixp_pathのリストを読み込んで設定を行った後，自分のところの設定(local_setup.*)を行う．

- [What is the difference between local_setup.bash and setup.bash](https://answers.ros.org/question/292566/what-is-the-difference-between-local_setupbash-and-setupbash/)

一方で[チュートリアル](https://docs.ros.org/en/galactic/Tutorials/Workspace/Creating-A-Workspace.html)のNoteでは以下のように書かれている．

:::note
Sourcing the local_setup of the overlay will only add the packages available in the overlay to your environment. setup sources the overlay as well as the underlay it was created in, allowing you to utilize both workspaces.

So, sourcing your main ROS 2 installation’s setup and then the dev_ws overlay’s local_setup, like you just did, is the same as just sourcing dev_ws’s setup, because that includes the environment of the underlay it was created in.
:::

こちらの意味だと，ローカルのsetup.bash = /opt/ros/\<distro\>/setup.bash + ローカルのlocal_setup.bash．

## local_setup.*
自分のところの設定を行う．現在の場所のpackagesのリストを読み込んで設定を行う．

## 参考
miroで始めるドメインモデリング

私はよくDDDを行うのですが、ドメインモデリングに関しては自己流で他人にいつも同じような説明をすることが多いため、
ここでまとめておこうと思います。

# ドメインモデリングとは
DDDの潮流で語られる言葉で、ソフトウェアで解決したい領域であるドメインを整理、図示化(モデリング)したものです。
具体的には

* 業務用語
* 作業の順番
* 関係性の整理 (ex. 商品 -> 値段)
* 作業者

を整理します。

注意点として、必ずドメインエキスパート(業務経験者など解決したい領域に詳しい人)

# ドメインモデリング実践
使うツールはmiroというホワイトボードツールを使用します。
https://miro.com/

## step1: 業務フロー整理
miroのユーザーストーリーマッピング(User Story Map Framework)のテンプレートを使って、業務を整理していきます。

![スクリーンショット 2021-07-24 14.50.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/6cf38161-9d94-100f-9565-2a1de382d7ed.png)


流れとしては以下です。
* ドメインエキスパートに時系列順に業務の内容を喋ってもらう。
* はじめに、大まかな流れを喋ってもらい (~をして、〜をして、〜する)青いカードに書く
* そのあとで詳しく小さな業務を喋ってもらい(~を入力する、~を〜に持っていく)黄色いカードに書く
* 下部の灰色の部分にメモを入れていく

書くときの注意点として、絶対に名詞と動詞は明確にわかるように書きましょう。つまり
`決済する(動詞) 決済情報(名刺)`
という形です。決済とだけ書かれると文脈で判断しなければならず、余計なコストがかかります。


![スクリーンショット 2021-07-24 15.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/8d581860-1bb8-5566-4bcf-8a6ba80b7898.png)

## step2: 関係性の整理

これで業務フローは分かりましたが、言葉が抽象的すぎるのでまだ関係性を明確に整理できたとは言えないです。
そのために名刺を抽出して

`何が何を持っているか？　(has-a)`
`何は何の派生か？　(is-a)`

という観点から情報分解していきましょう。
特に `クレジットカード情報`といった xx情報は多様に解釈を含むので絶対に分解しましょう。

例として今回はクレジットカード情報という名刺を分解していきましょう。

まずはクレジットカードが持つ情報を整理しましょう。
クレジットカードなので、必ず番号はありますね。
あとは所有者の名前も入っています...といった形で
クレジットカードを構成する概念を書き出していきましょう。

私が試しに作ったものはこちらです。

![スクリーンショット 2021-07-24 15.30.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/6cd1f1a9-29d9-dd03-6040-ac29e28fb507.png)

こんな形で出てきた名刺ごとに情報の関係性を図示化していきます。

## step3: チェック
step1,2が終われば関係の整理は完了しているので後はチェックです。

まず、システムの入出力を以下の観点でチェックします
* システムは何の情報を表示するのか？
* システムは何の情報を入力してもらうのか？

チェック方法は以下の通り
* 業務フローを時系列順で確認する。
* 確認、入力、表示といった動詞が出たら、目的語となる名詞を見つけドメイン図で保有する情報を確認する。
* システムの表示、入力の情報を全て保有しているかを確認する。

注意点ですが、 必ずしもドメイン図 = 入出力の情報とはなりません。
重要なことは、ドメイン図に存在しない入出力情報が存在するのか？、存在する場合はそれは正しいのか？を判断することです。

確認後にドメインエキスパートと見てもらうと良いと思います。

## ex: tips
### 完全を求めない
初めから完全なドメインはできないので、ドメインモデリングの時間は１時間と決めて行ってください。そこから、不備やおかしい部分を改善しドメインを研ぎ澄ましていきましょう。

### 新規機能はどうするか？
新規機能の場合はそもそもワークフローがないので、自分でワークフローを組んで業務を行う予定の人と議論しながら、ドメインモデリングやワークフローを改善していきましょう。

# 最後に
ドメインからコードに落とす方法は別の機械に書きたいと思います。

それでは良いドメインモデリングを
WioLTE: http get クライアント

Wio LTE for Arduino の http get クライアントのサンプルです。

仕様
[HttpGet](https://seeedjp.github.io/Wiki/Wio_cell_lib_for_Arduino/reference-ja.html#httpget)

## フォルダー構造

```text
$ tree http_get/
http_get/
├── http_get.ino
└── setupLTE.ino
```

## プログラム

```text:http_get/http_get.ino
// ---------------------------------------------------------------
/*
	http_get.ino

						Aug/08/2021
*/
// ---------------------------------------------------------------
#include <WioLTEforArduino.h>
#include <stdio.h>

#define URL	"https://httpbin.org/get?user=jiro&password=123456"

#define INTERVAL          (10000)

WioLTE Wio;
	
// ---------------------------------------------------------------
void setup() {
	setupLTE();

	SerialUSB.println("### Setup completed.");
}

// ---------------------------------------------------------------
void loop() {
	char data[1024];
	int dataSize;
	dataSize=sizeof(data);
	
	SerialUSB.println("### Get.");
	SerialUSB.println(URL);
	SerialUSB.println("Aug/07/2021 PM 14:08");

	int rvalue;
	rvalue = Wio.HttpGet(URL, data, dataSize);
	if (!rvalue) {
		SerialUSB.println("### ERROR! HttpGet ###");
	}
	else
		{
		SerialUSB.print("dataSize: ");
		SerialUSB.println(dataSize);
		SerialUSB.println(String(data));
		SerialUSB.print("rvalue: ");
		SerialUSB.println(rvalue);
		}

	SerialUSB.println("*** Wait *** aaa ***");
	Wio.LedSetRGB(0, 0, 1); 
	delay(INTERVAL / 2);
	SerialUSB.println("*** Wait *** bbb ***");
	Wio.LedSetRGB(0, 0, 0); 
	delay(INTERVAL / 2);
}

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

setupLTE.ino はこちら
[UDP で温度と湿度を Harvest に送る](https://qiita.com/ekzemplaro/items/690faa6f56003272299f)

## 実行結果
![http_get.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/60cc3d54-c9ff-60ee-83e2-84489e750218.png)

## 関連ページ
[Wio LTE for Arduino の http post クライアント](https://qiita.com/ekzemplaro/items/f49423428bdf52cd814a)

## Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1014369b-bcc8-c841-00e8-151478ac4ff1.png)
YAML の変な記号 | 

YAMLの変な記号 | 　

前々から、よく見かけるものの、どう使うのか不明でした。
超基本的な事かもしれませんが、初心者の私にとっては
理解するのに時間がかかったので、共有します。

改行を保存する為の記号でした。


変更履歴のように、数行に分けて、文字列を記載したい場合もあると思います。
0401 aをｂに変更
0501 cをｄに変更 


A) |をつけない場合

comment:
 変更履歴
 0401 aをｂに変更
 0501 cをｄに変更   

jsonだと、以下のようなイメージ
{
  "comment": "変更履歴 0401 aをｂに変更 0501 cをｄに変更"
}

コード上は改行されているのですが、
改行がスペースに変換されてしまい。一行に丸まってしまいます。



B) |をつけた場合
comment: |
 変更履歴
 0401 aをｂに変更
 0501 cをｄに変更  
 
jsonだと、以下のようなイメージ
{
  "comment": "変更履歴\n0401 aをｂに変更\n0501 cをｄに変更    "
}

改行が保持されており、想定どおり

参考にさせて頂いたサイト

JSON to YAML
https://www.json2yaml.com/

スペース、改行、ネストの動作を
手を動かしながら確認できるので、便利です。
【Swift エラー】Method '' with Objective-C selector 'delete:' conflicts with method 'delete' from superclass 'UIResponder' with the same Objective-C selector

storybordから引っ張って、deleteという関数を作成しようとしたときに発生したエラー。
以下のように表示された。

```swift
Method 'delete' with Objective-C selector 'delete:' conflicts with method 'delete' from superclass 'UIResponder' with the same Objective-C selector
```

#原因
よくわからないが、調べているとコンパイルエラーが発生しているらしい。
Swiftではオーバーロードが可能だが、Objective-cではオーバーロードができないため発生する。
Swiftでは引数または返り値が違う場合は同じ名前(識別子)で複数の関数を定義することができ、これを「オーバーフロー」という。
つまり、引数が文字列（String)や数字(Int)で違うなら、関数の名前は同じでもいいというもの。１つでもどこか違うなら、名前は同じでいいよってことですね。（ややこしいけど）

#解決策
・名前を変える
私の場合、メモの削除機能だったため、deleteだった関数名をdeleteMemoとかに変更したらエラーは出なくなった。
【BashでJSON】JSONファイルそのものをPOSTする


## 概要

DRF(Django Rest Framework) に JSON ファイルを POST したら、宜しく解読してくれて驚いた.


## 詳細

### POST 実行プログラム

引数に JSON ファイルへのパスを 1個指定する

```bash
#!/bin/bash
 
curl -X POST \
http://192.168.1.100:8000/api/v1/foo/result? \
-H "Content-Type: application/json" \
-d @$1

exit 0
```

### JSON ファイル例

```json
{
 "authors":"やなせたかし",
 "book":[
    {
        "title": "あんぱんまんとばいきんまん",
        "price": 935
    },
    {
        "title": "あんぱんまんとうみのあくま",
        "price": 935
    }
 ]
}
```
深層強化学習（A2C）を用いたシステムトレーディング

# はじめに

　近年、人工知能ブームにより、人工知能を使ったトレーディング手法が盛んである。そこで、今回は深層強化学習を用いたシステムトレーディングを実施した。
まず、実際の深層強化学習モデルである。agentの行動として、 BUY、HOLD、SELLの三つの内一つを選択する。環境の戻り値として、状態（今現在保有しているポジションの価格、市場価格、手持ちのキャッシュ）、報酬（手持ちのキャッシュの変化値（含む益も含む））、終了（取引の終了か否か）、情報（ターミナルにディスプレイする情報）を返す。

![rl_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/ede34533-5f33-df74-64ec-e5069bee956e.png)




## 使用データについて

トレンド傾向の掴みやすさから、yahoo financeからGSPCの日足を使用した。

訓練データの期間：2015/1/1 - 2017/6/30
テストデータの期間：2017/7/1 - 2021/1/1

以下ソースコード

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/get_csv.ipynb

# 方策学習

価値学習(Q学習)は、Q値を最大化するように行動する。それに対して、方策学習は方策π(s)からサンプリングを行い確率的な行動をとる。


# TD学習

TD学習（時間的差分学習: Temporal Difference Learning）とは、代表的な価値ベース手法一つである。逐次的にデータ更新ができるのが特徴。

TD = MC(モンテカルロ方策) + DP(Dynamic Programming: 動的計画法)
MC: 経験から学習
DP: 直後の状態の価値から学習

以下、TD学習での状態価値の更新式。

```math
\Delta V(s) = r + \gamma V(s_{t+1}) - V(s_t)  \\
```

# A2C[^1]

　A2C(Advantage Actor-Critic)とは、A3C(Asynchronous Advantage Actor-Critic)から、非同期の部分を抜いたものであり、A3Cと比べてGPUの負荷が低い。
　Q学習で使用したQ値は、状態価値関数V(s)とアドバンテージ値A(s, a)の2つに分解できる。このアドバンテージ関数とは、ある状態において、ある行動が他の行動に比較しどの程度優れているかを表す。価値関数とは、その状態に優位度を表す。
　つまり、Actorはアドバンテージ値を通しQ値を学ぶ。これによりある行動の評価は、その行動がどれだけ良いかだけでなく、どれだけ良くなるかにも基づいて行われる。アドバンテージ関数の利点は、状態価値関数V(s)をベースラインとして使用することで、政策ネットワークの高い分散を減らし、モデルを安定させる。

```math
A(s_t,a_t) = Q(s_t,a_t) - V(s_t) \\
```


![a2c_frow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/490e7146-f64a-6525-c9b6-f870b8c22e58.png)

# 損失関数[^2]

損失関数(更新式)は、損失関数(Actor)と損失関数(Critic)に分解できる。

```math
L = L_v + L_π
```
損失関数(Actor)と損失関数(Critic)は以下の式に分解できる。アドバンテージ値A(s, a)は、一般的なTD学習での状態価値の更新式より、時系列を加味した形式になっている。Hはエントロピー。

```math
L_v = (A(s_t,a_t))^2 \\
L_π = -log(π(a_t,s_t))A(s_t,a_t) - \beta H(π(s_t)) \\
A(s_t,a_t) \approx TD error = r + \gamma V(s_{t+1}) - V(s_t)  \\
H(π(s_t)) = 1/2(log(2π \sigma ^2) + 1) \\
\beta:ハイパーパラメータ、\gamma:割引係数、\sigma:分散
```


# 売買ルール

1.空売りは認めない
2.ポジションを持っている場合、追加注文を出せない。
3.最後のステップでポジションを全て売却する。
4.ポジションは全買い、全売り
5.所持金は1000000ドル

# 実装と結果

ソースコードはこちら

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/A2C/a2c_test.ipynb

前のqlearning、sarsaよりも、大幅に収益性、勝率、トレード回数とともに、改善された。

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/e391c5e8-5614-9ec8-3f8a-0fef4a78b99e.png)

ソースコードはこちら

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/make_data_analysys.ipynb


[^1]: V. Mnih, A. P. Badia, M. Mirza, A. Graves, T. Lillicrap, T. Harley, D. Silver, and K. Kavukcuoglu, “Asynchronous methods for deep rein- forcement learning,” in International conference on machine learning, (2016), pp. 1928–1937.

[^2]: S. Kuutti, R. Bowden, H. Joshi, R.D Temple, and S. Fallah, "End-to-end Reinforcement Learning for Autonomous Longitudinal Control Using Advantage Actor Critic with Temporal Context", IEEE Intelligent Transportation Systems Conference (ITSC),(2019)
[Go Snippet] マルチプレクサをざっくり


## 自作で ServeHTTP を実装

`http.Handler` は、`ServeHTTP` を実装すれば OK。
([詳しくは「Golang での Web アプリ開発で、理解を早める 5 ステップ」をチェック](https://qiita.com/yNavS4Ki/items/5b7a0c7c41eb8da8f12a))

```go:maing.go
package main

import (
	"fmt"
	"math/rand"
	"net/http"
)

type MyServeMux struct {
}

// ServeHTTP を implement
func (p *MyServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path == "/" {
		fmt.Fprint(w, "hello, world!\n")
		return
	}
	if r.URL.Path == "/randomInt" {
		fmt.Fprintf(w, "Random number is: %d", rand.Int())
		return
	}

	// TOP 以外のパスがきたら Not Found を返す
	http.NotFound(w, r)
}

func main() {
	mux := &MyServeMux{}
	http.ListenAndServe(":8000", mux)
}
```

## `NewServeMux` を使う

自作のマルチプレクサだと、`if` 文で URL パスをチェックしないといけない。
これだと手間なので、`NewServeMus` を使うことでもう少し簡単に書ける

```go:main.go
package main
import (
    "fmt"
    "math/rand"
    "net/http"
)
func main() {
    myMux := http.NewServeMux()

    // TOP ページ    
    myMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "hello, world!\n")
    })

    // random int ページ
    myMux.HandleFunc("/randomInt", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, rand.Int())
    })

    http.ListenAndServe(":8000", myMux)
}
```
3.5(標準) 指数分布

## 方針

指数分布について書く．指数分布は「微小単位時間あたり平均lambda回発生する事象が，ある時点から次に発生するまでにx単位時間かかる」確率を示す分布である．

```math
Exp(\lambda)=Ga(1,\lambda)
```

と考えれば確率密度関数を覚えなくて済む．確率変数Xが指数分布に従う時，生存確率P[s<=X]は「ある時点からs単位時間以上，事故が起こらずに(故障せずに)生存する(動作する)確率」である．確率密度関数は，

```math
f_X(x)=\lambda\exp(-\lambda x),\ \ \ \ 0<x
```

分布関数は，

```math
\begin{align}
F_X(x)&= \int_0^x\lambda\exp(-\lambda t)dt\\
&= \left[-\exp(-\lambda t)\right]_0^x\\
&= -\exp(-\lambda x)+1
\end{align}
```

生存確率は，

```math
P[s\leq X]=1-(-\exp(-\lambda s)+1)=e^{-\lambda s}
```

条件付き生存確率(s単位時間生存したとすると，そこからさらにt単位時間生存する確率)は，

```math
\begin{align}
P[X\geq s+t|X\geq s]&= \frac{P[X\geq s+t\land X\geq s]}{P[X\geq s]}\\
&= \frac{P[X\geq s+t]}{P[X\geq s]}\\
&= \frac{e^{-\lambda(s+t)}}{e^{-\lambda s}}\\
&= e^{-\lambda t}\\
&= P[X\geq t]
\end{align}
```

となる．これらのことに関連して，ハザード関数を定義する．ハザード関数は，x単位時間生存した，という条件のもとで次の瞬間に故障する確率である．微小単位時間をDeltaと置くと，

```math
\begin{align}
\lambda(x)&= \frac{P[x\leq X\leq x+\Delta\ \land\ x\leq X]}{P[x\leq X]}\\
&= \frac{P[x\leq X\leq x+\Delta]}{P[x\leq X]}\\
&\approx \frac{f_X(x)}{1-F_X(x)}
\end{align}
```

条件付き生存確率において確認した指数分布の無記憶性をハザード関数によって示す．

```math
\lambda(x)=\frac{\lambda\exp(-\lambda x)}{\exp(-\lambda x)}=\lambda
```

より，ハザード関数は時間xに依存しない．何時間ここまで動作したかに関わらず，次の瞬間故障する確率はlambdaである．問題では，任意の分布関数，確率密度関数がハザード関数によってかけることを示す．

## 答案

ハザード関数を積分すると，

```math
\begin{align}
\int_0^x\lambda(t)dt&= \int_0^x\frac{f_X(t)}{1-F_X(t)}dt\\
&= \int_0^x\frac{F_X'(t)}{1-F_X(t)}dt\\
&= \left[-\log(1-F_X(t))\right]_0^x\\
&= -\log(1-F_X(x))
\end{align}
```

より，

```math
\begin{align}
F_X(x)&= 1-\exp\{-\int_0^x\lambda(t)dt\}\\
f_X(x)&= \frac{d}{dx}F_X(x)\\
&= -\exp\{-\int_0^x\lambda(t)dt\}(-\lambda(x))\\
&= \lambda(x)\exp\{-\int_0^x\lambda(t)dt\}
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
plunkerでvue その53

#概要

plunkerでvueやってみた。
phinaやってみた。

#サンプルコード

```

new Vue({
  el: '#app',
　data: {
	  //phina: phina,
 		//scene:,

  },
  beforeMount: function() {
	//mounted() {
		this.init()
	},
	methods: {
		init() {
			phina.globalize();
			phina.main(function() {
  			var app = GameApp({
    			startLabel: 'splash',
    			scenes: [{
            className: 'SplashScene',
            label: 'splash',
            nextLabel: 'title',
          }, {
            className: 'TitleScene',
            label: 'title',
            nextLabel: 'count',
          }, {
            className: 'CountScene',
            label: 'count',
            nextLabel: 'pause',
          }, {
            className: 'PauseScene',
            label: 'pause',
            nextLabel: 'result',
          }, {
            className: 'ResultScene',
            label: 'result',
            nextLabel: 'title',
          }, ],
  			});
  			app.run();
			});
    },


  }
});




```

#成果物

https://embed.plnkr.co/plunk/U01gA5sA422sfKZv

以上。
最低限覚えておきたいRSpecの基本構成

今までRSpecに関する記事を複数書いてきましたが、RSpecの基本構成に関する記事を上げてなかったので、今回はかんたんにまとめていきます。

かなり初歩的な内容になりますので、RSpecの基本的な部分が分かっている方は、他の記事をご覧ください。
[[Rails]RSpecでテストを行う準備(FactoryBot使用)](https://qiita.com/nakachan1994/items/29369470d50d0fcd0f6c)
[[Rails]RSpecでモデルのテスト(FactoryBot使用)](https://qiita.com/nakachan1994/items/d869db15f8482ba70d02)
[[Rails]RSpecでよく使うマッチャー10選](https://qiita.com/nakachan1994/items/e9938d70b3f6345368b2)
[[RSpec]request specでcontrollerテストをやってみる](https://qiita.com/nakachan1994/items/f62cd4d93c061e3fa6df)

#RSpecの構成

それではさっそく、RSpecの構成について説明していきます。

RSpecでは、テストしたい項目を入れ子構造で、分類していきます。
入れ子構造にすることで、テストを実行した際にどこでエラーが出ているかがすぐにわかるので、便利ですし、テストコードを書いている際もどこのテストをしているのかわかりやすいです。

構成の部分で使用されるものは下記です。

- describe (テストの１番おおきいくくり　　：`必須`)
- context (describeをさらに細分化する場合にのみ使用)
- it (具体的なテストをここで実施します　:`必須`)
- before (itの前に実行したい項目がある場合にのみ使用)

`describe`と`it`が必須でそれ以外は状況に合わせて使用していきます。

#四則演算の例

では、四則演算を例にコードを記述していきます。

####describe

まず、`describe`は１番大きいくくりなので、四則演算を入れていきます。

```rb:
describe '四則演算' do
  # この中にいろいろと入れていく
end
```

####context

四則演算という大きなくくりができたので、足し算、引き算といくくりでさらに細分化したいので、`context`を使っていきます。

```rb:
describe '四則演算' do
  # 足し算に関するテスト
  context '足し算' do
    # テストはこの中で実施
  end
  # 引き算に関するテスト
  context '引き算' do
    # テストはこの中で実施
  end
end
```

####it

では、足し算と引き算という項目まで細分化できたので、足し算と引き算に関する具体的なテストを`it`で記述していきます。

```rb:
describe '四則演算' do
  context '足し算' do
    it '1 + 1は２になるか' do
      # エクスペクテーションとマッチャーを使ってテストコード記述
      expect(1 + 1).to eq 2
    end
    it '100 + 1は101になるか' do
      # エクスペクテーションとマッチャーを使ってテストコード記述
      expect(100 + 1).to eq 101
    end
  end
  context '引き算' do
    it '7 - 5は２になるか' do
      # エクスペクテーションとマッチャーを使ってテストコード記述
      expect(7 - 5).to eq 2
    end
  end
end
```

このような入れ子構造がRSpecの基本構造です。
足し算というくくりの中に何個でも`it`を入れていくことが可能です。

エクスペクテーションとマッチャーってなんやねんって方はこちらどうぞ！
[[Rails]RSpecでよく使うマッチャー10選](https://qiita.com/nakachan1994/items/e9938d70b3f6345368b2)

#before

`before`の説明がまだだったので、`before`に関しても触れておきます。
`it`の前に実行したいことがあれば、記述していきます。

テストしたいページに移動やサインインがよく使われます。
そのページに遷移することで、そのページでのテストが実行できます。

```rb:
describe 'トップ画面のテスト' do
    # itが実行される前にroot_pathに移動しています。
    before do
      visit root_path
    end

    context "表示の確認" do
      it "top画面に投稿一覧へのリンクが表示されているか" do
        expect(page).to have_link "", href: posts_path
      end
      it "root_pathが / であるか" do
        expect(current_path).to eq('/')
      end
    end
  end
```

#まとめ

RSpecの構成

>- describe (テストの１番おおきいくくり　　：`必須`)
- context (describeをさらに細分化する場合にのみ使用)
- it (具体的なテストをここで実施します　:`必須`)
>- before (itの前に実行したい項目がある場合にのみ使用)

今回は超初歩的なことをまとめてみました。

RSpecのコードをよくわからず、コピペしていた方などの参考になれば幸いです。
HTML + CSS + JavaScript + React でカウンター機能を実装する

#はじめに

この記事ではReactのHooksである「useState」を使用して、カウンターアプリを作成する方法を解説します。必要な部分のみ参考にしていただけたらと思います。

#ソースコード

「App.jsx」「index.js」「index.html」「styles.css」のコードはこちらになります。

```React:App.jsx
import { useState } from "react";
import "./styles.css";

export default function App() {
  // カウント保持（初期値:0）
  const [count, setCount] = useState(0);
  // カウントアップ処理
  const countUp = () => {
    setCount(count + 1);
  };

  return (
    <div className="App">
      <h1>カウンタ</h1>
      <p> {count} </p>
      <button onClick = {countUp}> ＋ </button>
    </div>
  );
}
```


```JavaScript:index.js
import { StrictMode } from "react";
import ReactDOM from "react-dom";

import App from "./App";

const rootElement = document.getElementById("root");
ReactDOM.render(
  <StrictMode>
    <App />
  </StrictMode>,
  rootElement
);

```


```HTML:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <title>React App</title>
  </head>

  <body>
    <noscript>
      You need to enable JavaScript to run this app.
    </noscript>
    <div id="root"></div>
  </body>
</html>
```


```CSS:styles.css
.App {
  text-align: center;
}
```

#実行結果

実行結果はこのようになります。

![スクリーンショット 2021-07-24 15.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758310/f55310f4-a6f9-25ca-f46d-bbcde567e649.png)

プラスボタンをクリックすると、下記画像のように数字がカウントアップされます。

![スクリーンショット 2021-07-24 15.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758310/3c744a69-404c-128b-edbd-80de89dcaced.png)

以上になります。
CPUの高速化技術~応用情報技術者試験に向け〜

##パイプライン処理
逐次制御方式ではない。複数の命令を並行して実行。
次々と命令を先読みして実行していると、先読みが無駄になる事がある。
このようなパイプライン処理の乱れをハザードという。

##ハザードの種類
* 分岐命令に起因する制御（分岐）ハザード
* ハードウェアの競合に起因する構造ハザード
* 後継の命令で用いるデータが、他の命令の結果待ちになるデータハザード

##分岐予測と投機実行
この分岐が実行されるのか、次の命令はどれか予測することで無駄な待ち時間を生じさせないようにすることを分岐予測という。その予測に基づいて後々無駄になるかもしれないが、多分これだから先にやっておこうという分岐の命令を実行開始する手法が投機実行である。

##スーパーパイプライン
各ステージの中身をさらに細かくステージを分類することで、パイプライン処理の効率アップを図る

##スーパースカラ
パイプライン処理を行う回路を複数持たせることで、全く同時に複数の命令を実行できるようにしたもの

##VLIW
very long instruction world
ソフトウェア処理に重点を置いた高速化手法がVLIWである。
同時に実行可能な複数の動作をまとめて一つの命令にすることで、複数の命令を同時に実行させる手法
コンパイル時に一つの命令語にまとめる。
規定の長さにまとまらない場合はNOP命令を入れる→効率は落ちる

##CISCとRISC
CPUには高度な機能を持つCISCと単純な命令のみで構成するRISCという２つのアーキテクチャという。

###CISC
complex instruction set computerの略
CPUに高機能な命令を持たせることによってひとつの命令で複雑な処理を実現するアーキテクチャ
命令の実行速度は遅い
命令の長さや実行速度はバラバラ
命令の追加や変更が容易
便利な命令が揃っているので機械語のプログラム作成がラク
回路そのものは簡単にして、マイクロプログラムで実装するイメージ

###RISC
reduced instruction set computerの略
CPU内部に単純な命令しか持たない代わりに、それらをハードウェアのみで実装してひとつの命令を高速に処理するアーキテクチャ
命令の追加や変更は難しい
手作業による機械語のプログラム作成は困難
命令の長さや実行速度がほとんど等しい
パイプライン処理の実行速度がめちゃんこ早くなる
【GitHub】commit log にアイコンを表示させる

## はじめに

コードレビュー依頼時に「ローカルの Git アカウントと GitHub のユーザー情報が一致していなそうなので、合わせておきましょう！」とご指摘頂きました。

どうやって判断してるんだ？と思っていましたが、どうやらPRのcommit logにGitHub上で設定しているアイコンが表示されていれば一致している、されていなければ一致していないということのようです。

今まで全く気にしていませんでしたが、GitHub上へプッシュした際、commit logにアイコンが表示されてないと、別アカウントとして認識されているように見えてしまうので修正しておきたいと思います。

### イメージ

![スクリーンショット 2021-07-24 13.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1088946/fb8d476c-ffa9-b54a-db2c-520f320c7af1.png)

## 結論

そもそもローカルのGitで名前とメールアドレスを設定してなかったので、そちらをGitHubのユーザー情報と同じものにすれば解決します。

## 手順

それでは早速ローカルのGitアカウントの設定をしていきましょう。

今回は全体のプロジェクトで、共通のユーザー名とメールアドレスを使用する前提で説明していきます。
※リポジトリごとにも設定できます。その際は以下で紹介するコマンドの global を localに置き換えればOKです。

### 1.Gitのアカウント情報を確認

まずは現在の設定がどのようになっているかを確認しましょう。

```zsh
# ユーザー名の確認
% git config --global user.name
# メールアドレスの確認
% git config --global user.email
```


### 2. Gitアカウントの設定

以下コマンドを実行することで、`~/.gitconfig`ファイルに設定を書き込むことができます。
※gitconfigはGitの設定ファイルです。

```zsh
# ユーザー名の確認
% git config --global user.name "name"
# メールアドレスの確認
% git config --global user.email "email@example.com"
```


### 3. commit logの確認

以上で設定の変更が完了したため、適当にコミットしてGitHubへプッシュしてみましょう。
以下のようになっていれば、ユーザー情報を一致させることに成功しています。
![スクリーンショット 2021-07-24 15.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1088946/087cd252-1d09-eb1b-bfb6-6d791d30eb6a.png)


## おわりに

個人でやってると全然気にしませんが、チーム開発だと誰の変更かひと目で分かるため、ぜひ設定しておきたいですね。
python の SpeechRecognition で長めの wav ファイルを日本語音声認識する

```shell
pip install SpeechRecognition
```

でインストールできる python の [SpeechRecognition](https://pypi.org/project/SpeechRecognition/) ライブラリでは、日本語音声認識向けとして主に

- Google Speech Recognition
- Google Cloud Speech API

が使えます。が、前者は長めの wav ファイルが使いづらく後者は有償ということで、試験運用的に前者で済ませられないかと格闘したメモです。

```python
import speech_recognition as sr
import time

r = sr.Recognizer()

# https://github.com/Uberi/speech_recognition/blob/master/speech_recognition/__init__.py#L500-L509
r.dynamic_energy_threshold = False # デフォルトだと True だが、音声が長めになりがちなので False にしている
r.energy_threshold = 500  # minimum audio energy to consider for recording (300)
r.phrase_threshold = 0.2 # minimum seconds of speaking audio before we consider the speaking audio a phrase - values below this are ignored (for filtering out clicks and pops) (0.3)
r.pause_threshold = 0.1 # seconds of non-speaking audio before a phrase is considered complete (0.8)
r.non_speaking_duration = 0.1 # seconds of non-speaking audio to keep on both sides of the recording (0.5)

with sr.AudioFile("long.wav") as source:
    while True:
        audio_data = r.listen(source)
        # flac でリクエストしているので、flac でのバイト数を気にする
        # https://github.com/Uberi/speech_recognition/blob/master/speech_recognition/__init__.py#L866-L877
        flac_data = audio_data.get_flac_data(
            convert_rate=None if audio_data.sample_rate >= 8000 else 8000,  # audio samples must be at least 8 kHz
            convert_width=2  # audio samples must be 16-bit
        )
        print("len: {} ← 10MB に近づくとエラーになりやすいので、サイズを見てパメータをいじる".format(len(flac_data)))
        try:
            print(r.recognize_google(audio_data, language='ja-JP'))
        except sr.UnknownValueError:
            print("Oops! Didn't catch that") # セグメントによっては音声認識できない、無視
        if len(flac_data) == 0: # ファイルの終わり
            break
        time.sleep(1) # ちょっと投げすぎを気にしている
```

と言っても、[Uberi/speech_recognition](https://github.com/Uberi/speech_recognition) には音声の無音を検知して区切る機能が既にあるので、リクエスト不能な長さ(10MBぐらいで Bad request になる)で投げないようパラメータをチューニングするだけです。デフォルトで `dynamic_energy_threshold` は `True` ですが、`True` のままパラメータをチューニングするのが辛かったので `False` にしています。

1 度のリクエストが 10MB 近くにならなければ問題ないので、元の wav ファイルを固定長でバラバラにしておく方法もありますが、上記チューニングで対応することで、音声の途中で切れたりするケースを若干減らせそうです。

なお結局、[YouTube の字幕機能の方が認識精度が良さそう](https://qiita.com/tset-tset-tset/items/7b388b0536fcc774b2ad#122-asr-%E9%9F%B3%E5%A3%B0%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%A8%E5%88%86%E5%89%B2%E5%8C%BA%E9%96%93%E3%82%92%E5%BE%97%E3%82%8B)だったので現状あんまり使ってはいないですが……。
個人開発で会計ソフトを開発しました

# 各種リンク
front-end
https://github.com/nobu0605/accounting-application
back-end
https://github.com/nobu0605/accounting-application-api

application
https://accounting-application-front.herokuapp.com

## 背景
自分はエンジニアにキャリアチェンジする前に、経理などのバックオフィスの仕事を3年半ほどしていました。経理の仕事には今も興味があるので、今回個人で会計ソフトを開発してみました。

## 機能(一部)
・言語切り替え
日本語と英語を選ぶ事ができます。

日本語
![スクリーンショット 2021-07-24 14.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243749/ae061459-5869-ecab-61c5-a1cce78fe13d.png)

英語
![スクリーンショット 2021-07-24 11.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243749/11e1c6b4-132f-40f8-be3f-2711ba93c1e8.png)

・振替伝票
仕訳を入力する事ができます。
![スクリーンショット 2021-07-24 11.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243749/31bee98a-ec21-242e-844f-b65b42669053.png)

・財務レポート
![スクリーンショット 2021-07-24 11.57.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243749/71d1b70c-3a36-c6ef-8f65-e9780ce8f2df.png)

・仕訳一覧
![スクリーンショット 2021-07-24 11.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243749/4ddc8a49-5c71-d8c3-e208-0c92c0d49bd1.png)

## 使用した技術
・フロント
React version 17.0.1
Typescript version 4.0.5

・バックエンド 
Laravel Framework 6.20.4
PHP 7.3.24
MySQL 5.7

・CI/CD 
GitHub Actions

・サーバー
Heroku

・ER図
https://drive.google.com/file/d/14r1bxllKWg7Ih6xf9yeYxHyRrDL5FkrU/view?usp=sharing
Pythonの画像処理ライブラリPillow(PIL)の読込み・保存まとめ (JPEG編)

# はじめに
Pythonの画像処理ライブラリPillowは、手軽に画像の読み込み～加工～保存ができる大変便利なライブラリです。ただし、画像の読込み・保存の詳細について、日本語で書かれたものが少なかったのでまとめました。
本稿は、JPEGの読込み・保存について記載します。
情報は2021年7月時点のものです。PillowのWebページの情報をもとにしました。

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html

# JPEGの読込み
## 読込み & パラメータ表示の例
``` python:open.py
from PIL import Image
im = Image.open("./input.jpg")
print(im.info.items())
```

## 読込みパラメータ一覧
読込んだ画像のパラメータは、オブジェクトのinfoプロパティに、ディクショナリ形式で格納されます。

| パラメータ | 説明 |
|:-:|:-:|
| jfif | .jfifファイル = True |
| jfif_version | jtifのバージョン番号（メジャー, マイナー） |
| jfif_density | 水平、垂直 解像度（画素密度） |
| jfif_unit | 解像度の単位（0 : 単位なし、1 : dpi、2 : dpcm） |
| dpi | dpi（水平、垂直） |
| adobe | Adobe JPEGファイル = True |
| adobe_transform | ベンダー固有のタグ |
| progression | プログレッシブJPEG = True |
| icc_profile | ICCプロファイルの内容 |
| exif | EXIFデータの内容 |
| comment | コメントの内容 |

# JPEGの保存
> Image.save(fp, format=None, **params)

- fp : ファイル名、pathlib.Pathオフジェクト、またはファイルオブジェクト
- format : 保存するファイル形式（省略可）
- params : 保存するパラメータ（省略可）

## 保存の例

``` python:save.py
from PIL import Image
im = Image.open("./input.jpg")
im.save('./output.jpg', 'JPEG' ,quality=95, optimize=True, progressive=True, dpi=im.info.get('dpi'), icc_profile=im.info.get('icc_profile'), exif=im.info.get('exif'), subsampling=-1, qtables='keep')
```

## 保存パラメータ一覧

| パラメータ | 説明 |
|:-:|:-:|
| quality | 保存画像の品質。0（最低）～95（最高）。初期値は75。（95以上は使用しない） |
| optimize | True = 最適化して保存 |
| progressive | True = プログレッシブJPEGで保存 |
| dpi | dpi（水平、垂直）の指定 |
| icc_profile | True = ICCプロファイルを保存。既存のプロファイルを指定する場合 = icc_profile=im.info.get('icc_profile')  |
| exif | 保存するEXIFデータの指定 |
| subsampling | 色差成分の保存形式を指定。 -1 : 元のフォーマット、 0 : 4:4:4、 1 : 4:2:2、 2 : 4:2:0 |
| qtables | エンコーダーで使用するQテーブルの指定。64個の整数のリストやディクショナリ形式でも指定できますが、"keep"、”web_low”、"web_high"といった名前でも指定できます。画像のサイズを小さくできますが、半面、精細感が失われます。 |

# その他
1. あとは、pngとgifについて、解説記事を書きたいです。
2. 蛇足。JPEGの量子化テーブルは普通に『Q Table』なんですね。動画のエンコーダー & デコーダーを開発していたときは、『キューマト(Q Matrixの略)』って呼んでました。

# 参考リンク
https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#jpeg
jest、prismaを使ったテストで Jest did not exit one second after the test run has completed. が出たときの解決法

```test.ts
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

describe("sample", () => {
  test("sample", async () => {
    const user = await prisma.user.findFirst();
    expect(user).toBeTruthy();
  });
});
```

これを実行すると
`Jest did not exit one second after the test run has completed.`
が出た。

## 解決法
`await prisma.$disconnect();`　を追加する

```test.ts
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

describe("sample", () => {

// 追加
afterAll(async () => {
    await prisma.$disconnect();
  });

  test("sample", async () => {
    const user = await prisma.user.findFirst();
    expect(user).toBeTruthy();
  });
});
```

https://www.prisma.io/docs/concepts/components/prisma-client/working-with-prismaclient/connection-management
にわか圏論は恥だが役に立つ

## コード

https://github.com/umireon/umireon-qiita-category-theory-future/blob/main/src/main/scala/Main.scala

## 前提

こういうAPIがありました。（Futureで包まなくて良くねというツッコミは受けません）

```scala
def theFutureList(): Seq[Future[Int]] = {
  1 to 10 map { Future(_) }
}

def theFuture1(value: Int, uuid: UUID): Future[(Int, String)] = {
  Future { (value * value, uuid.toString) }
}

def theFuture2(value: Int, str: String): Future[(Int, Char)] = {
  Future { (value - 10, str.head) }
}
```

これらを組み合わせて`Future[Seq[(Int, Char)]]`を取るコードが書かれていました。

```scala
def calculate1(): Future[Seq[(Int, Char)]] = {
  Future.sequence(theFutureList()).flatMap { list =>
    val uuid = UUID.randomUUID()
    Future.sequence(
      list.map { theFuture1(_, uuid) }
    ).flatMap { list2 =>
      Future.sequence(list2.map { case (value: Int, str: String) =>
        theFuture2(value, str)
      })
    }
  }
}
```

実際には`theFuture*`に相当するメソッドがもっとたくさんあって、ネストもかなり深くて読めたものではありませんでした。

## 圏論の知識？

使った圏論の知識は1つだけです。モナド`Future`が隣接してネストしていたら1つに合成できるということだけです。型が`Future[Future[Int]]`となっていたら`Future[Int]`に変換できるということになります。
元々のコードでもこの性質は利用していますが、もっと適用を進めます。

## 得られたコード

ネストの階層が2階層までに制限できました。実際の元のコードは10階層くらいネストぐらいしていたのでこれでだいぶ読みやすくなりました。
2階層になっているのは、`Future`と`List`は違うモナドなので基本的には合成できないためです。

```scala
def calculate3(): Future[Seq[(Int, Char)]] = {
  Future sequence theFutureList zip Future(UUID.randomUUID()) flatMap {
    case (list: Seq[Int], uuid: UUID) =>
    Future.traverse(list) {
      theFuture1(_, uuid)
    }
  } flatMap {
    Future.traverse(_) { case (value: Int, str: String) =>
      theFuture2(value, str)
    }
  }
}
```

## 結論

理論は理論であるとか見抜ける人でないと（Scalaを使うのは）難しい

## 追記

### 最初のコードへのツッコミ

```scala
def calculate2(): Future[Seq[(Int, Char)]] = {
  Future sequence theFutureList map {
    (_, UUID.randomUUID())
  } flatMap { case (list: Seq[Int], uuid: UUID) =>
    Future sequence list.map {
      theFuture1(_, uuid)
    }
  } flatMap {
    Future sequence _.map { case (value: Int, str: String) =>
      theFuture2(value, str)
    }
  }
}
```

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">10階層のネストはしんどいですね……<br>Future.sequence(list .map(f)) は<br>Future.traverse(list)(f) <br>に書き換えができますので、traverse使うともう少し楽にできる所がありそうな気がしました。ご参考まで。<br>ご存知でしたらすみません。</p>&mdash; がくぞ (@gakuzzzz) <a href="https://twitter.com/gakuzzzz/status/1418909991390482432?ref_src=twsrc%5Etfw">July 24, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

`flatMap`と`Future.traverse`を合成した関数を作りたかったのですが無理っぽいです。
応用情報技術者試験に向け勉強してみた〜コンピューター編〜

##クロックサイクル時間
１クロックに要する時間
例）１GHzのCPUの場合は
1Ghz=10⁹Hzなので
１/10⁹秒＝１n秒

##CPIとは
clock per Instruction
「一命令あたり何クロック必要か」を表すもの

##MIPS
１秒間に実行できる命令の数
Million instruction Per second
[Go Snippet] シンプル HTTP サーバー


## 基本

```go:main.go
package main

import (
	"fmt"
	"log"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	// io.WriteString(w, "hello, world!\n") or
	fmt.Fprint(w, "hello, world!\n")
}

func main() {
	http.HandleFunc("/hello", hello)
	log.Fatal(http.ListenAndServe(":8000", nil))
}
```

`go run main.go` の後、コンソールから `curl http://localhost:8000/hello` を実行すると、`hello, world!` が返ってくる

ただ、POST で送信しても同様の結果になる (`curl -X POST http://localhost:8000/hello`)


## リクエストメソッドで出力変える

`GET` と `POST` でレスポンスを変えるには、`r.Method` をチェックする必要がある

```go
package main

import (
	"fmt"
	"log"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	if r.Method == http.MethodGet {
		fmt.Fprint(w, "hello from GET\n")
	} else {
		fmt.Fprint(w, "hello from POST\n")
	}
}

func main() {
	http.HandleFunc("/hello", hello)
	log.Fatal(http.ListenAndServe(":8000", nil))
}
```

これで `GET` と `POST` のリクエストに応じてレスポンスを変えられる

## `fmt.Fprint` or `io.WriteString` どっちを使う？

上記のサンプルでは、`fmt.Fprint` も `io.WriteString` いずれでも問題なく動作するけど、結局何が違うの？
ということで、調べてみました。

| 関数 | シグネチャ |
|---|---|
| [io.WriteString](https://pkg.go.dev/io#WriteString) | `func WriteString(w Writer, s string) (n int, err error)` |
| [fmt.Fprint](https://pkg.go.dev/fmt#Fprint) | `func Fprint(w io.Writer, a ...interface{}) (n int, err error)` |

結論から言うと、文字列 を出力する場合は `io.WriteString` で、それ以外は、`fmt.Fprint` で OK。

`fmt.Fprint` の方が、複数の引数を渡せたり、型に縛られずに渡すことができる汎用性がある。
【Swift】クロージャについて整理してみた

#はじめに
クロージャについての理解がまだまだ浅く、なんとなくの理解となっているため、
私の頭の中を整理する意味でまとめていきます。




#クロージャについて
そもそもクロージャとはなにか？　について[Swift実践入門](https://www.amazon.co.jp/dp/B086VVQ3DJ/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)より以下を引用させていただきます。
>クロージャは、再利用可能なひとまとまりの処理です。

>クロージャにはクロージャ式という定義方法があります。
>クロージャ式は名前が不要であったり、型推論によって型の記述が省略可能であったりと、関数よりも手軽に定義できます。



##基本構文
クロージャは{ }を使用して、以下のフォーマットで記述します。

```
{ (引数名1:型,引数名2:型....) -> 戻り値の型 in
    //実行時の処理
    return 返却値
}

```
上記に従い実際に記述すると以下のようになります。

```swift
let equal = { (val1:Int,val2:Int) -> Bool in
    //実行時の処理
    return val1 == val2
}

```
(val1:Int,val2:Int)でInt型の値を2つ受け取り、Bool型の値を返します。
上記で実際に返却される値はval1とval2を比較したBool型の結果です。
これを変数equalに代入しています。


##クロージャの呼び出し

クロージャを呼び出す際は、クロージャが代入されている変数名の後ろに( )をつけて、( )の中に受け渡す値を記述します。

```swift
let equal = { (val1:Int,val2:Int) -> Bool in
    //実行時の処理
    return val1 == val2
}
//呼び出し
equal(10,20)//false
equal(20,20)//true
```




##糖衣構文（シンタックスシュガー）
クロージャを呼び出す際の値や変数宣言によって、型を自動的に推論できる場合は　、クロージャの引数の型を省略出来ます。
また、処理が単文の場合はreturnも省略可能です。

```swift
//変数宣言
let equal :(Int,Int) -> Bool

//クロージャを代入
equal = { (val1,val2) in
    //実行時の処理
    val1 == val2
}
//呼び出し
equal(10,20)//false
equal(20,20)//true


```

引数が無く、戻り値も無いクロージャは以下のように ( ) -> Void in と記述出来ます。


```swift
let closure = { () -> Void in
    print("Hello")
}
//呼び出し
closure()//Hello
```
さらに、( ) -> Void　in も省略出来ます。

```swift
let closure = {
    print("Hello")
}
//呼び出し
closure()//Hello
```


##クロージャのスコープ
```swift
//変数宣言
var closure :() -> Void

do{
    var count = 0
    closure = {
        count = count + 1
        print(count)
    }
}

//呼び出し
closure()//1
closure()//2
//print(count) //doのスコープ外からはcountにアクセスできないためコンパイルエラー
```
クロージャのスコープについて見ていきましょう。
do文の{}の中で宣言された変数countは、do文の{}の中のみが影響範囲となっており、本来、do文の外からのアクセスは出来ません。

しかし、クロージャは自身が定義されたスコープの変数への参照を保持しているため、do文の外からクロージャを通してcountの値を変更することが出来ます。この機能をキャプチャといいます。


##トレイリングクロージャ

トレイリングクロージャとは関数の引数の最後にクロージャを渡した場合にクロージャを( )の外側に記述することができる方法です。
これにより、可読性が向上します。

```swift
func greeting(name:String,handler:(String) -> Void){
    handler(name)
}

//トレイリングクロージャあり
greeting(name: "ポチ") { val in
    print("\(val)さんこんにちは")
}
//トレイリングクロージャなし
greeting(name:"ポチ",handler:{ val in
    print("\(val)さんこんにちは")
})

//実行結果
//ポチさんこんにちは
//ポチさんこんにちは
```

#参考

[【Swift】クロージャ(基本編)](https://qiita.com/funacchi/items/9be7653cf8d002bac4ec)
[Swift実践入門](https://www.amazon.co.jp/dp/B086VVQ3DJ/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
npm install -g が失敗する場合の対処法

## 環境
Macですがlinuxなら同様の対処で解決するのではないでしょうか
特にバージョンは関係ないかと思います

## npm install -gをするとPermission deniedで失敗してしまう
npmの新しいバージョンが使えるようになったということで`npm install -g npm`でバージョンアップしようとしたところ、以下のようなエラーが出てしまいました

```console
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules/npm/node_modules/abbrev'
npm ERR!  [Error: EACCES: permission denied, access '/usr/local/lib/node_modules/npm/node_modules/abbrev'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules/npm/node_modules/abbrev'
npm ERR! }
```

## 原因
自明ですが権限エラーです
調べてみるとやはりroot権限になっていました

```console
$ ls -la /usr/local/lib/node_modules/npm
total 512
// ・・・
drwxr-xr-x  360 root      wheel   11520 10  9  2020 node_modules
// ・・・
```

## 対処
root権限である必要もないし、Macユーザをオーナーにしようと思ったので以下のコマンドで`/usr/local/lib/node_modules`以下の権限を全て変更しました

```console
$ sudo chown -R $USER /usr/local/lib/node_modules  
```
パスワードの入力を要求されるので入力してください
環境変数にユーザ名が登録されたいない場合は

```console
$ sudo chown -R $(whoami) /usr/local/lib/node_modules  
```
で変更してください


ちなみに上記コマンドでは`/usr/local/lib/node_modules`以下のディレクトリが全てMacのユーザ権限になります


## ちなみに
別のユーザをオーナーにする場合は`$USER`の部分にユーザ名を入力してください

## 参考
stackoverflowに記事がありました
https://stackoverflow.com/questions/48910876/error-eacces-permission-denied-access-usr-local-lib-node-modules
DNSの HTTPS レコードをパースしたい

# HTTPSレコード
新しいDNSのリソースレコードとして、HTTPSレコードの標準化がIETFで進められています([提案仕様 URL](https://datatracker.ietf.org/doc/html/draft-ietf-dnsop-svcb-https-06))

このHTTPSレコードを使うことで、HTTP/3の接続時に利用するAlt-Svc情報や、SNIを暗号化するのに利用するECHconfigをDNSを介して提供できるようになります。

https://asnokaze.hatenablog.com/entry/2020/07/19/234103

## HTTPSレコードを取得する
dig で Type65 (HTTPSレコード)を指定して取得する事ができます。

```
$ dig  crypto.cloudflare.com type65
...

;; ANSWER SECTION:
crypto.cloudflare.com.	300	IN	TYPE65	\# 136 0001000001000302683200040008A29F874FA29F884F0005004A0048 FE0A004423002000203DE66812D93354486F011CF747CD101328B236 BF3C524E191771B13F68F4E14A00040001000100000013636C6F7564 666C6172652D65736E692E636F6D0000000600202606470000070000 00000000A29F874F260647000007000000000000A29F884F
```

ECHconfigを取り出して、Enclipted ClientHelloを試そうと思ったんですが、このままでは中身を読み解くのは難しいです。

## HTTPS レコードをパースしたい

HTTPSレコードの値を読むには、Wiresharkでパースすることも出来るんですが、「[Google Public DNS](https://dns.google/)」のWebページを使うと手っ取り早い。

Web UIからHTTPSレコードを指定できないが、ちゃんと動く。

https://dns.google/query?name=crypto.cloudflare.com&rr_type=https&ecs=

```
  "Answer": [
    {
      "name": "crypto.cloudflare.com.",
      "type": 65,
      "TTL": 299,
      "data": "1 . alpn=h2 ipv4hint=162.159.135.79,162.159.136.79 ech=AEj+CgBEIwAgACA95mgS2TNUSG8BHPdHzRATKLI2vzxSThkXcbE/aPThSgAEAAEAAQAAABNjbG91ZGZsYXJlLWVzbmkuY29tAAA= ipv6hint=2606:4700:7::a29f:874f,2606:4700:7::a29f:884f"
    }
  ],
```

これで、ECHconfigが取り出せました。

よかったよかった。
Unity公式Assetについて(追加していくメモです！)

完全にメモです。
充実するまではあんまり意味ない記事かもしれません。

#UI関連
#**Untiy Sample:UI**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/6e782462-8356-7a12-c649-bca3a856055b.png)

https://assetstore.unity.com/packages/essentials/unity-samples-ui-25468
3DのUIを体験できます。
https://qiita.com/yamachan360/items/2f909a11665161a6b485
この記事がめっちゃ参考になります。！

#**Unity Device Simulator**
各端末の見え方をGame画面で見せてくれる。
例えばiPhone7ではアスペクト比がこうで、iPhone12ではセーフエリアがこうでーみたいに実機を使わなくてもある程度わかるのが神なツール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/1f68c154-776c-c647-2340-fb8829040aa8.png)
正式なツールでないプレビュー版なため、導入方法に難がある。
Package Manager の Add Package from git URLで**com.unity.device-simulator**と入力すると導入できる。詳細は下記参照

https://www.midnightunity.net/unity-device-simulator/#Package_Manager_%E3%81%AB%E3%81%AA%E3%81%84%EF%BC%9F

#TextMeshProでフォントが使える
Textと違いttf otfのフォントファイルを直接使うことができない
ttf otfの違いは時代の違い、Unityでは両対応なのでご安心を(エラーが出たら自分も困る)
UnityのTextMeshProでフォントを使う場合FontAssetを作る必要がある。TextMeshPro専用のフォントといった感じ。Font Asset Creatorを以下参照で導入する。

https://qiita.com/thorikawa/items/03b65b75fa9461b53efd

ただしこのサイトでは日本語を対応させるやり方が書いてない
特にCharacterSet(フォントで使う文字の種類)の設定が面倒で、既存のFontAssetから使う文字の種類を選択する必要がある。
でも、日本語の入ったFontAssetが見つからなかったので、CustomCharacterListに追加したい文字列を入力して解決した。以下参照

https://qiita.com/kgsi/items/08a1c78b3bee71136156

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/25f08e02-bbae-70ef-8747-f53e89af6289.png)
うまくいかねぇ！！
いろいろ試した結果
Excluded Charactersがフォントのためのテクスチャに収まりきらなかった文字の個数らしい
Missing CharactersはUnity側で認識できない文字だと思う(1505個も導入できなかったのかな？)
単純な解決策としてAtlas Resolutionの範囲(多分フォントのためのテクスチャのサイズ)を増やしたら行けた(このやり方は非推奨、追記参照)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/01f872b7-d712-287e-b853-598f68603f4f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/02823d5c-67fc-8307-7b71-8e56095700e8.png)

注意：これやると100MB超える超デカファイルになるのでGitとかに上げずらくなる(解決方法がわからんくて困ってる)
**2021/08/01追記**：IphoneやAndoroidなどはAtlas Resolutionの上限が4096×4096だった。つまりテクスチャの広さを増やして無理やりやってもだめで、Sampling Point Sizeを48→40に減らすことで1文字当たりのテクスチャ面積を減らすことで解決できる。(文字の多さによってもっと下げる必要がある。)

**Unityのデフォルトフォントを変更する**
ProjectSettiongsのTextMeshProのSettingsのDefaultFontAssetを作ったFontAssetにすると、いちいち設定する必要がないので便利
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/b5cbe084-11f9-c9ab-e5c7-9c86eed67e0c.png)