OmniAICreator/Qiita-1.07M huggingface dataset:
ローカル管理していたソースをBitbucketで管理する方法

## 事前準備
- Bitbucketのアカウントの作成、及びワークスペースやプロジェクトの作成
- Source　Treeのアプリインストール

## ローカル管理していたソースをBitbucketで管理する方法
1.Bitbucketで該当プロジェクトを選択
2.右上Create>リポジトリ
3.リポジトリ名はローカルの該当フォルダ名と同一でok
4..gitignoreについては以下参照
　https://k-sasaking.net/programing/gitignore-setting/
5.リポジトリの作成
6.右上のクローンの作成を押し、git clone 以降のSSHリンクをコピー
7.Source Treeを起動し、ローカルリポジトリタブをクリック→新規作成
8.保存先のパスは管理したいソースが含まれているフォルダのパスを指定
　タイプはGitでok
　リモートリポジトリはさっき作っているのでチェック不要
　で、作成する
9.作成されたローカルリポジトリをSource Tree上で開く
10.保留中のファイル、パス順の左のチェックを入れて、全てのファイルにチェックが入ったことを確認→コメントを入力してコミット
11.左部Windowからブランチを開いて、正しい名前になっていることを確認（プッシュ後変更すると手間だったので、この時点で必要があれば変更）
12.右上設定からリモートタブを開いて、追加
13.リモートの名前はorigin（任意だがoriginとネットの記事によく書かれているのでよくわかんないうちは一緒にしといた方がいい）
　URLは⑥でコピーしたものをペースト
　であとは自動入力されるのでそのままok
14.左部Windowから履歴を開いて、最新の行を選択してプル→プッシュ
　なんかエラーでプルできない時は、.gitignoreの内容をコピーしておいてターミナルにて、gitで管理しているフォルダのルートまで移動
　git push -f origin main
 で強制プッシュ

以上

なお、.gitignoreの設定は以下参照
　https://qiita.com/maiito/items/271d5230c15785d2ed6d
【React】Warning: Use the 'defaultValue' or 'value' props on <select> instead of setting 'selected' on <option>　

## Warning: Use the 'defaultValue' or 'value' props on <select> instead of setting 'selected' on <  option>

![01 - January.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549258/9b1d7bab-c4d4-d284-634f-a6aa5d8410e5.jpeg)
Reactで↑みたいな、初期値でselected指定もできるselectコンポーネントを作っていたらコンソールから表題のエラーを吐かれた。
ググってみたらReactではselectedが非推奨とのことで、公式を見てもseletedを使った記述がない
公式：https://reactjs.org/docs/forms.html#the-select-tag

エラー本文は
> optipnタグにselectedを使わないで、selectタグにvalueかdefaultValueを指定して、これ経由で実装せよ
>
とのことなので、selectタグのvalue経由で選択状態を制御する様な実装に変えたらコンソールエラーが消えました


```tsx:SelectInput.tsx
import { useState } from 'react'
//略
const SelectInput = ( {//略} ) => {
//略
  const [currentSelected, setCurrentSelected] = useState<string>('01');

  const changeSelect = (newSelect: string) => {
    setCurrentSelected(newSelect);
  };

  return (
    <select
      onChange={(event) => changeSelect(event.target.value)}
      value={currentSelected}
    >
      {options.map((option: OptionContent) => (
        <option
          value={option.value}
          key={option.content}
          // ここにselectedを書くとエラーになるのでselectedを使うやり方はだめっぽい
        >
          {option.content}
        </option>
      ))}
    </select>
  );
};
export default SelectInput;
```




以上です!
これまでgit管理下にあったフォルダやファイルをgit管理から除外する方法

## .gitignoreを使う

1.ターミナルにて、git管理下ルートフォルダまで移動
2.Vim .gitignoreで開く（or 新規作成）
　https://k-sasaking.net/programing/gitignore-setting/
　を参考に追記して:wqで保存
　予めコピーしてある内容があればそれもペースト
3.ターミナルにて以下コマンド実行
```test-git.cmd
git rm -r —cached .
git add .
git commit -m “.gitignore update”
```
4.Source Treeからプッシュ
***
参考
https://ticklecode.com/gitignoreupdate/#gitignore%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92Vim%E3%81%A7%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B%E3%80%82
https://k-sasaking.net/programing/gitignore-setting/
クロージャー (JavaScript)

講義で学んだ記録を書きます (20220419.)
##### ※その前にスコープについて軽く触れる
スコープには下記の４種類がある。
**グローバルスコープ**：１つのファイルどこからでもアクセスできる。  
　　　　　　　　　　(注意：値の変更もどこでも可能になるので多用しない)
**ローカスコープ**：グローバル変数以外。　以下の2つに分かれる
**関数スコープ**：関数によって定義。関数内部からしか利用できない。  
　　　　　　　<font color="Red">※クロージャーで使用する知識</font>
**ブロックスコープ**：{ブロック}で定義される。変数はブロック内で利用可能。
クロージャーではスコープの概念が大切になるので、未学習の方はぜひCheck!!!

## クロージャー(closure)とは
関数の中に関数を作成し、内側の関数から外側の関数スコープへアクセスできるようにする。   
これにより関数スコープ内の変数情報を記憶・コントロールできるようになる。

## なぜクロージャーが使われるのか
普通の変数であると、ソースの量が多い or チームで開発する際自分のプログラムで使用する変数やオブジェクトが、意図せず更新され結果、エラーやバグが発生してしまい可用性が損なわれる可能性がある。
そこで、データを保護する役割が可能な『[カプセル化](https://webpia.jp/encapsulation/)』の一つとして**クロージャー**が使用できる。  
(関数スコープ内の値は関数内部からしか変更できないため)

## 実装例
```js:script.js
const getGreetingName = (greeting) => {
    return (name) => `${greeting} ${name}`;
};
const greet = getGreetingName("Hello");  // Helloが保存される
console.log(greet("Ichiro"));  //Hello Ichiro
console.log(greet("Jiro"));  //Hello Jiro
const greet = getGreetingName("Good morning");  //Good morningが保存される
console.log(greet("Ichiro"));  //Good morning Ichiro
```
例のようにクロージャを使用することで、"Hello"の値が関数スコープ内に保存されるので、Helloの使い回しが可能。   
変数greet として関数を保存できているので、不意の値変更も誘発せず可用性向上につながる。
JavaScriptでクロージャについてふんわりと説明してみる


# クロージャとは

>クロージャは、組み合わされた（囲まれた）関数と、その周囲の状態（レキシカル環境）への参照の組み合わせです。言い換えれば、クロージャは内側の関数から外側の関数スコープへのアクセスを提供します。JavaScript では、関数が作成されるたびにクロージャが作成されます。
>
>引用元：https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures

...ムズカシイ。

# 実例で見てみる

```javascript:closureSample.js
'use strict'

function outerFunction(param){
    // ローカルスコープのvalue変数
    let value = param;

    return function innerFunction(){
        // outerFunctionで定義された変数をインクリメントして返す
        return ++ value;
    }
}

const increFunc = outerFunction(5);

// increFuncを呼び出すたびにvalue変数がインクリメントされていく
console.log("1回目", increFunc());
console.log("2回目", increFunc());
console.log("3回目", increFunc());

// value変数を更新しようとしても、宣言されていないというエラーになる
value = 10;
```
ソースコードを見てみると、value変数に関して
* innnerFunctionからアクセスできる
* outerFunctionの外からはアクセスできない

ということがわかります。

# ふんわりと説明してみます
引用元の表現を上記のソースコードをもとに
`innerFunction` = 組み合わされた（囲まれた）関数
`outerFunction` = その周囲の状態（レキシカル環境）
とすると、 **クロージャとは、outerFunction内で宣言したvalue変数を外部からはアクセスできないが、innerFunctionからはアクセスできるようにすることです** 。

## なにがいいの
変数へのアクセス権を限定することで、**重要な意味を持つ変数を誤って変更してしまうことを防止**したり、特定の関数からしか参照されないような変数を**余計なスコープで公開して煩雑になることを防止**できるといった利点があります。

以上、ふんわりでした。
クロージャーについて

<h2>クロージャーとは・・・</h2>
『関数』と、その関数の中に同封（enclosed）された、関数の「外」にある『変数』
これらの組み合わせのことである。

```JavaScript
function greeting(greetingWord) {
 return function(otherWord) {
  return `${greetingWord}, ${otherWord}`;
 }
}
```

<h2>クロージャーのメリット</h2>
同類の処理をさせる関数を複数作る際に、記述を簡素化できる。

```JavaScript
const sayGoodMorning = greeting("Ohayo");  //関数greetingに"Ohayo"が同封されている。
const sayWelcome = greeting("Youkoso");    //関数greetingに"Youkoso"が同封されている。

sayGoodMorning("Oni-Chan");  //"Ohayo, Oni-Chan"
sayWelcome("Nippon");        //"Youkoso, Nippon";
```
手動では動くのに、cronでpythonが動かない時の対処法（結論PATHを指定しよう）


pythonのスクリプトファイルが手動で実行すると動くのに、cronに設定すると何故か動かなくてハマりました。同じようにハマっている方に向けて備忘録を残します。


# 1. 実施したこと

①EC2にpython3の仮想環境をインストール ([インストール方法](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-python3-boto3/))
②home配下にpythonのスクリプトファイル(test.py)を配置
③下記のコマンドで手動実行させた場合には実行可能
 ```
 (env) [ec2-user@ip-xx-xx-xx-xx ~]$python3 test.py
 ```
④crontabで以下のように設定
 ```
 * * * * * python3 test.py
 ```

⑤boto3モジュールがないよとエラーが発生
 ```
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    import boto3
ModuleNotFoundError: No module named 'boto3'
 ```
# 2. 原因
・cronは環境変数をもたない
・pyenv環境を利用している場合、PATHの明示が必要

# 3. 解決策
①以下のコマンドでPATHを確認する
 ```
(env) [ec2-user@ip-xx-xx-xx-xx ~]$env
:
:
PATH=/home/ec2-user/my_app/env/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
 ```
②crontab -eで最初の行にPATHを追記する
 ```
PATH=/home/ec2-user/my_app/env/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin

 * * * * * python3 test.py
 ```

cronで問題なく実行できました！

# 4. 参考記事

こちらの記事が大変参考になりました！ありがとうございます！！

https://qiita.com/ming_hentech/items/75183720860eac9bc22a
Unityでhierarchyのソートを実装する

2022.4.19 6日目　昨日からやっていたソートができたので残しておこうと思います。

## 環境
・WindowsPC
・Unity2019.4.28f1

## 実装
```C#
public void OnClickLevelSortButton() {
        bool isEnd = false;
        int findAdjust = 1;
        while( !isEnd ) {

            bool loopSwap = false;
            for( int i = 0; i < cellNum - findAdjust; i++ ) {

                if( _instance[ i ].GetComponent<Cell>().getCellLevel() > _instance[ i + 1 ].GetComponent<Cell>().getCellLevel() ) {
                    GameObject temp = null;
                    temp = _instance[ i ];
                    _instance[ i ] = _instance[ i + 1 ];
                    _instance[ i + 1 ] = temp;
                    loopSwap = true;

                }
            }

            if( !loopSwap ) {
                isEnd = true;
            }

            findAdjust++;

        }
        foreach( var obj in _instance ) {
            obj.transform.SetSiblingIndex( cellNum - 1 );
        }
       
    }
```

これで実装できました。

明日からまた別の作業をやっていきます。
JavaScript スコープとクロージャーについて


## クロージャーの前にスコープとは

クロージャーを語るにはまず、スコープについて知っておく必要があります
スコープには以下の種類があります

- グローバルスコープ
    - 最高階層で宣言されその変数はどこからでも使用出来る 
- ローカルスコープ
    - グローバルスコープ以外の変数
    - 関数スコープとブロックスコープに分けられる
- 関数スコープ
    - 関数の中で宣言される変数で関数の中でしか使用出来ない
- ブロックスコープ
    {}で閉じられたブロックの中で宣言された変数で{]の中でしか使用出来ない

## クロージャーとは
上記のスコープを踏まえて
クロージャーの使用例を↓に記述します

``` js
const counter = () => {
  let x = 0;
  return () => {
      return x++;
  }
}
```

実行すると下記にようになります

```js
const ct1 =  counter();
const ct2 =  counter();

console.log(ct1());  // 0
console.log(ct1());  // 1
console.log(ct1());  // 2
console.log(ct2());  // 0
```


クロージャーを使用することで意図せず変数が書き変わってしまうことが防げます。
【Python】二次元リストからcsvファイル作成・追記

## 環境
+ Microsoft Windows 10.0.22000.613（21H2）
+ Windows PowerShell 5.1.22000.613
+ conda 4.12.0
+ Python 3.8.12.final.0
+ csv 1.0


## コード
```py:py
import csv

CSV_PATH = "パス"
li = [["A", "B"], ["C", "D", "E"]]

with open(CSV_PATH, mode="a", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(li)
```

```:csv
A,B
C,D,E
```

### csvモジュールについて
`writerow(list)`：一行用
`writerows(list)`：複数行用

https://www.delftstack.com/ja/howto/python/write-list-to-csv-python/

https://techacademy.jp/magazine/28002#ta-toc-1

### open関数について
```py
open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
```

#### mode
`r`：読み取り用（デフォルト）
`w`：上書き用
`a`：追記用

詳細は公式ドキュメントを参照

https://docs.python.org/3/library/functions.html#open
OracleLinux8.5にDocker EngineとDocker Composeをインストールする

DockerをOracleLinuxにインストールしている日本語記事が少なかったので、やったことをまとめておく（ほぼ公式ドキュメントなぞっただけ）

## Docker-Engineのインストール

### 事前準備

```
# パッケージの削除（古いバージョンが入っていた時のため、念の為実行）
$ sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# dnf-utilsをインストール
$ sudo dnf install dnf-utils

# dockerインストール用のレポジトリを追加
$ sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

# docker-ce-stableというレポジトリが追加されていればOK
$ dnf repolist
Failed to set locale, defaulting to C.UTF-8
repo id                                                   repo name
docker-ce-stable                                          Docker CE Stable - x86_64
ol8_UEKR6                                                 Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (x86_64)
ol8_appstream                                             Oracle Linux 8 Application Stream (x86_64)
ol8_baseos_latest
```
### dockerインストール
```
# パッケージをインストール
$ sudo dnf install docker-ce docker-ce-cli containerd.io

# バージョンが確認できればOK
$ docker --version
Docker version 20.10.14, build a224086

＃ dockerdの起動&確認&自動起動化
$ sudo systemctl start docker
$ sudo systemctl status docker
$ sudo systemctl enable docker
```

## Docker-Composeのインストール
```
# githubからレポジトリをダウンロ０ど
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 実行権限を付与
$ sudo chmod +x /usr/local/bin/docker-compose

# バージョンが確認できればOK
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
```
クロージャの概要と具体例

# クロージャについて学習した内容まとめ

## クロージャ(closure)とは
ある関数内でローカルスコープの情報を記憶している他の関数を内側に含む関数のことである。

:::note info
##### (補足) スコープとは
* グローバルスコープ
  最高階層で定義され、そのファイルのどこからでもアクセスできる変数のこと。
* ローカルスコープ
  グローバルスコープ以外の変数のことで、関数やブロック{}の中で定義された変数でその範囲でのみ有効な変数のこと。
:::

## クロージャの重要性
グローバルスコープで定義された情報を使用して関数を定義すると、その情報が変更されると関数の処理内容や出力が変わってしまい、予期せぬ関数となってしまう可能性がある。
そのため、ローカルスコープに定義された情報で関数を定義することが重要となる。

## クロージャの使用例
以下、実際のソースコードをもとに具体例を紹介する。
実装はJavaScriptで行う。
今回は、西暦から和暦に変換する関数を実装した。

+ クロージャなしの実装
```js:script.js
const startHeisei = 1989;

const convertHeisei = function (currentYear) {
  return currentYear - startHeisei + 1;
};

convertHeisei(2022); // expected return 34
```

上記の場合、平成元年の西暦をグローバルスコープとして定義しており、それを参照して平成暦を返す関数を定義している。

+ クロージャありの実装
```js:script.js
const convertYear = function (startYear) {
  return currentYear => currentYear - startYear + 1; 
}

// define functions
const convertHeisei = convertYear(1989);
const convertShowa = convertYear(1926);
const convertTaisho = convertYear(1912);
const convertMeiji = convertYear(1868);

convertHeisei(2022); // expected return 34
convertShowa(2022); // expected return 97
convertTaisho(2022); // expected return 111
convertMeiji(2022); // expected return 155
```

クロージャありの実装の場合、西暦を引数に取り、その西暦をもとに和暦を返す関数を返す関数convertYearを定義した。この関数を使うことで様々な和暦に対応した西暦変換関数を作り出すことができるため、汎用性が高いと言える。
Terraform - MFA認証とマルチアカウントスイッチロール



# 概要

* Terrafromをセキュアにデプロイしたい


# 前提

:::note
* AWS環境はマルチアカウントでスイッチロールする環境である
* aws-vaultでMFA認証及びスイッチロールできる状態
* 以下の記事の設定確認が既に済んでいること
:::

https://qiita.com/ezaqiita/private/335faf2c122ebd90b6a4

# 詳細

## デプロイ

* ローカルからaws-vault経由でMFA認証及びAssumeRoleを実行しtfファイルをデプロイ

* terraform initを実行

```
$ aws-vault exec hogeuser-admin -- terraform init  
```

* AssumeRleされている事を確認

```
$ aws-vault list
Profile                  Credentials              Sessions                 
=======                  ===========              ========                                     
default                  -                        -                        
hogeuser              hogeuser              -                        
hogeuser-common                   -                        -                        
hogeuser-admin        -                        sts.AssumeRole:13m7s     
```

* 簡単なmain.tfファイルを用意する
    * EC2を起動する

```:main.tf
provider "aws" {
  region = "ap-northeast-1"
}
resource "aws_instance" "example" {
  ami           = "ami-0ce107ae7af2e92b5" ⇐AmazonLinux2の公式AMI
  instance_type = "t2.micro"
  subnet_id = "subnet-xxxxxxxxxxxxx" ⇐ 自身の環境のサブネットID
  vpc_security_group_ids = [ "sg-xxxxxxxxxxx" ]⇐ 自身の環境のセキュリティグループID
}

```

* デプロイする

```   
$ aws-vault exec hogeuser-admin -- terraform plan
$ aws-vault exec hogeuser-admin -- terraform apply
$ aws-vault exec hogeuser-admin -- terraform destroy
```
Cloud Workflows で Cloud Dataflowのテンプレートジョブを作成する

# 背景
Dataflowのテンプレートを使ったジョブ [`GCS_Text_to_BigQuery`](https://cloud.google.com/dataflow/docs/guides/templates/provided-batch?hl=ja#gcstexttobigquery) を使って、GCSにあるCSVファイルをBigQueryにロードしたい場合です

Dataflow テンプレートとは、簡易に Datflow ジョブのデプロイやカスタマイズができる仕組みです。詳しくはドキュメントを参照ください。

https://cloud.google.com/dataflow/docs/concepts/dataflow-templates?hl=ja

今回は、Cloud Workflows から Cloud Dataflowのテンプレートジョブを実行するサンプルを作ってみます。

# 実装

```yaml: workflow.yaml

main:
    steps:
     - create_dataflow_sample:
        call: googleapis.dataflow.v1b3.projects.locations.templates.create
        args:
            projectId: your-project-id
            location: asia-northeast1
            body:
                jobName: job_name
                parameters:
                    javascriptTextTransformGcsPath: gs://bucket/udf.js
                    JSONPath: gs://bucket/model/schema.json
                    javascriptTextTransformFunctionName: transform
                   outputTable: dataset.model
                    inputFilePattern: gs://bucket/model/input_*.csv
                    bigQueryLoadingTemporaryDirectory: gs://bucket/bq_tmp/
                environment:
                    bypassTempDirValidation: false
                    serviceAccountEmail: some@your-project.iam.gserviceaccount.com
                    tempLocation: gs://bucket/dataflow_tmp
                    ipConfiguration: WORKER_IP_UNSPECIFIED
                    additionalExperiments: []
                gcsPath: gs://dataflow-templates-asia-northeast1/latest/GCS_Text_to_BigQuery
        result: output2
```

```js: udf.js
function transform(line) {
  var values = line.split(',');

  var obj = new Object();
  obj.id = values[0];
  obj.name = values[1];
  var jsonString = JSON.stringify(obj);

  return jsonString;
}
```

```json: schema.json
[
  {
    "mode": "NULLABLE",
    "name": "id",
    "type": "STRING"
  },
  {
    "mode": "NULLABLE",
    "name": "name",
    "type": "STRING"
  }
]
```

# 参照

https://cloud.google.com/workflows/docs/samples/workflows-connector-dataflow?hl=ja
Azure VPNゲートウェイ(仮想ネットワークゲートウェイ)で"VNet対VNet"の接続を利用する際の注意点

AzureにおけるVPNの機能を検証する際、VNetを2つ作成し、それぞれにVPNゲートウェイを作成して接続するというやり方をする場合がると思います。その際、VNet間の接続についてはデフォルト値が `VNet対VNet`となっています。このまま作成するといわゆるオンプレ想定のVPNの機能絵検証とは異なる動きをしてしまうため注意が必要です。

# 検証
- VNetx2を用意してVNet間でVPNをする
- その際`VNet対VNet`を選択する際の挙動を確認する

# リソースの作成
- VNetを2つ作成
- それぞれにVPNゲートウェイ、VM、VM用のサブネットを作成

# 接続の作成
それぞれのVPNゲートウェイにて双方向に接続を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/00d54de9-fcce-27f1-aa1c-62a7bd08e07c.png)

# 疎通確認
片方のVMにログインして、もう一方のVMにさらにRDPしてみます。すると何も経路の制御をしていないのにRDPできてしまいます。BGPを利用しなければ対向拠点側のアドレス空間の情報は見えないはずだと思っていたため、ここで驚きました。

# 理由
VNET間接続を作成する場合は、VPNゲートウェイが存在しているVNET内のノードに対して、自動的にルーティングテーブルが追加されます。NICの「有効なルート」を見てみると、他方のVNETCIDR空間に対してネクストホップが送信元VNETのVPNGatewayのルートが追加されていることを確認できます。

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-vnet-vnet-resource-manager-portal
> VNet 間接続を作成するときに、ローカル ネットワーク ゲートウェイのアドレス空間は自動的に作成され、設定されます。 一方の VNet のアドレス空間を更新すると、更新されたアドレス空間へのルーティングがもう一方の VNet で自動的に行われます。

- 送信元
![d7746b22-2e1c-42a0-b3a0-8aa61fc03a32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/f31b5207-f8e7-b693-471a-1102dab255f0.jpeg)

- 宛先
![8b6fff28-d3bf-4e54-8f92-a8c125b5b62c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/209ad2c2-3545-c235-1b5b-3d9c11346f3a.jpeg)

- 送信元VMのNICの[有効なルート]
対向拠点のIP空間に対するネクストホップがVPNゲートウェイのパブリックIPに設定されている。
![b588ebc2-3e58-463f-9264-b38d7d25b205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/8ed284d3-654c-f64b-eff5-f820e95b2fad.jpeg)

- 逆方向も然り。
![7e809f21-2188-488d-8447-0b6acd9d76ef.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/79a4607b-629f-2ff3-dc0a-59e16f901073.jpeg)

ちなみにこれらのルートはVPNゲートウェイ上の`接続`を削除すると消えます。

# おわり
オンプレ想定のVPNの張り方の検証をするには、VNetを用いるにしても`サイト対サイト`の方法で接続を構成する必要があるということがわかりました。このあたりのやり方は別記事にする予定です。
Tex Liveを導入ダッ！

vscodeでLatexを編集するのにLatex Workshopを使おうと思ったのですが、そのためにTex Liveの導入を強く推奨されていたので今回はその導入を記事にしたいと思います。
(今まではcloud latex使ってた)

私の環境はMacですが、他の環境でもほとんど変わらないと思うのでWindowsの方も参考にどうぞ。。。

## Macの環境
プロセッサだったりOSだったりの情報は以下です。
### ハード情報
![環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/2ff86778-97d4-006e-9a1f-83ba6ed993f5.png)
- MacBook Pro(2018年モデル)
- Intel プロセッサ

### ソフト情報
- MacOS Monterey
- シェルはzsh

## 導入
https://www.tug.org/texlive/

[こちら](https://www.tug.org/texlive/)のサイトにOSごとにインストーラーなどが配布されているので、ここから自分のOSのダウンロードページに飛んでください。![スクリーンショット 2022-04-19 17.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/31ec35fd-e533-4a8b-3dd1-8b96a56c3330.png)
こんな感じで3つあるので自分にあったものを選んでください。

![スクリーンショット 2022-04-19 17.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512282/a27ed81f-dbbf-f908-2cd6-5011a38abdda.png)
私の場合はMacですのでMacOSをクリックして飛ぶとこんな画面になるので上のダウンロードリンクをクリックします。

下のリンクはmakeとか必要なものなのでpkg開くだけでインストール出来る上のがいいと思います。

ダウンロードしたインストーラーを起動して指示通りに進んでいくとインストールできます。

## 終わりに
簡単すぎて記事にするほどでもないと思ったのですが、調べた感じTex Liveのインストールは記事になってなかったので一応作りました。

私はVSCodeの拡張機能のためにインストールしたのでどんな機能があるのかは知らないのですが、参考になれば幸いです。
[JPX Tokyo Stock Exchange Prediction]有名な株式アノマリーの紹介

こんにちは、tmrtjと申します。

私は現在株式会社音圧爆上げくんという会社に所属しており、プロKagglerとして活動しています。


私は現在プロKagglerとして、業務の一環で、現在Kaggleで行われているコンペの一つである[JPX Tokyo Stock Exchange Prediction](https://www.kaggle.com/competitions/jpx-tokyo-stock-exchange-prediction)に参加しています。





# はじめに

「JPX Tokyo Stock Exchange Prediction」は株式予測のコンペです。買い持ちと売り持ちをする銘柄を選び、シャープレシオというポートフォリオのパフォーマンス評価指標を最大化します。

今回は、株式予測に臨むにあたり、知っておいて方がいいであろう知識として「アノマリー」を調べたので紹介します。

アノマリーというのは、基本的にランダムに動く市場において、ある条件下で一定の決まった動きをする経験則を指します。

今回は株式のアノマリーの中で有名なものをピックアップしました。




<br>
今回の記事は、Kaggle上にNotebookとして同じ内容の記事を英語で投稿しています。
リンクはこちらです。

https://www.kaggle.com/competitions/jpx-tokyo-stock-exchange-prediction/discussion/320702



# バリュー

「バリュー」はおそらく最も有名なアノマリーの一つです。
「バリュー」を一言で述べるなら、「割安な株式ほどリターンが良い」というものです。
これは多くの人の直感に会うものではないでしょうか。
具体的にどのように割安度を測るのかというと、一般的には時価総額と簿価の比がよく使われます。


# モメンタム

「モメンタム」はその言葉通り、価格の勢いが未来のリターンに影響するというアノマリーです。
これまで価格が上がってきた株は今後も株が上がるというのがモメンタム効果です。また、モメンタムは反対の効果も観察されます。
つまり、モメンタム効果が成り立つならば、価格が下がっている株は、その後株価が下がることが予測されます。




# サイズ

時価総額が株価リターンに影響を及ぼすというアノマリーです。
時価総額が小さいほど株価リターンは高くなると言われています。
このことから「小型株効果」と呼ばれることもあります。

なぜこのアノマリーが機能するかは諸説ありますが、一つの有力な説として、時価総額が小さいほど売買しにくいため、その分のリスクに対するプレミアムがあるというものがあります。



# アクルーアル

「利益の質」がリターンに影響を与えるというアノマリーです。
「利益の質」は一般的に「利益−営業キャッシュフロー」で測られます。
アクルーアルは低い方がよく、利益の質が高いとされます。
なぜかというと、会計上の利益は様々な操作が可能である一方で、キャッシュフローを操作することは難しいからです。




# PEAD

「PEAD」はPost Earnings Announcement Driftの略です。

業績の発表後、発表された業績にサプライズがあった場合に、そのサプライズ方向に（つまり、業績が予想よりも良かった場合には株価が上昇する方向に、悪かった場合には下落する方向に）、株価が長期にわたって動くことをPEADと言います。


# 最後に

一つ注意点があります。

これらのアノマリーは広く知れ渡っているため、効果がどれほど望めるかはわかりません。

それでも分析のとっかかりとしては役に立つと思ったので紹介します。

また、アノマリーについては[Wikipedia](https://en.wikipedia.org/wiki/Market_anomaly)の記事があり、ここでは株式以外も含めて、膨大なアノマリーが紹介されています。

今回の記事がコンペティションに取り組むにあたり、何かの参考になれば幸いです。


# お知らせ
株式会社音圧爆上げくんではプロKagglerを募集しています。
ご興味のある方はぜひ以下のリンクをご覧ください。
[Wantedlyリンク](https://www.wantedly.com/projects/748285)
零細IT企業で1年間働いて感じたこと

## 企業の概要
都内の雑居ビルに拠点を置く零細IT企業。
オフショアで請負やって儲け出してる。一応自社製品も持ってて日本の開発チームはその開発を行っている。
メンバーは国内が10人くらい、海外が30人くらい。

## デメリット
#### ・給料が安い
かなり給料が安い。入る前から分かってはいたけど。
入社して研修期間の半年間は20万(みなし25時間)、それ以降が22万(みなし45時間)。
研修終了後の昇給が基本給じゃないっていう。しかも面接ではみなし25時間としか書面に書かれていなかったし。
ボーナスも決算賞与(0.5か月分)のみ。

#### ・雑用が多い
これは新入社員なら当たり前な気がする。
うちの場合は新入社員が自分だけだからテキトーな雑務が全て自分に降ってくる。
プリンターの調子が悪いから何とかしといてとか。

#### ・同期がいない
寂しい。わからないとこ気軽に聞ける人いないの辛い。


## メリット(?)
#### ・残業が割と少ない
みなし残業45時間に対して実際に残業は12時間くらい。
残業を強制させられたことは1度もない。
仕事の進み悪いなーって時に残業する感じ。

#### ・休みがちゃんとある
完全週休二日。
ただし人数が少ないから有給取る人が数人いると電話番がいなくなるからって理由で有給取れないこともある。

#### ・同期がいない
デメリットでも挙げたけど同期と比べられることがないっていうのはメリットな気がする。無能にはありがたい。


## まとめ
会社なんてピンキリだしこれはあくまでも一例ということで。
風通しが良くてよかったーって思ったことはほぼ無いです。
会社の大小関わらずコミュニケーションは必要なので、コミュ障だから人少ない会社に行きたいなーって人は止めたほうがいいと思います。
自分はSESと零細自社開発から内定貰って零細自社開発を選んだけど、これだったらSESの方がまだ給料よかっただろうからミスったかなーってたまに思います。SESの内部事情知らんけど。
結局はお金をちゃんとくれる会社が正義なので、最低限の給料を払ってくれる中堅どころで働くのがいいなって自分は思いました。
【PHP】TBを作成 ※n列で改行して余りはハイフン

# TBを作成  ※4列で改行して余りはハイフン

## パターン1.1

```PHP
<?php $data = ['フシギダネ','フシギソウ','フシギバナ','ヒトカゲ','リザード','リザードン','ゼニガメ','カメール','カメックス']; ?>
<table>
    <tr>
        <th colspan ="<?php echo $col = 4;?>">ポケモン</th>
    <tr><?php
        $int = 0;
        $wari = count($data) % $col;
        foreach($data as $list){ 
            if($int % $col === 0 && $int > 0) echo '</tr><tr>';
            echo '<td>',$list ?: '調査中','</td>';
            $int++;
        } 
        echo $wari !== 0 ? str_repeat('<td>-</td>',$col - $wari):'';?>
    </tr>
</table>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/35f8bee1-7ed2-7fa4-12f4-83f604b92892.png)

## パターン1.2 ※残りはテーブル結合
※下記の場合は出力するTD数が決まっている前提なので、ハイフンは表示しない
```PHP
<?php
$data = ['フシギダネ','フシギソウ','フシギバナ','ヒトカゲ','リザード']; ?>
<table>
    <tr>
        <th colspan ="<?php echo $col = 6;?>">ポケモン</th>
    <tr><?php
        $td_col = 2;
        $cnt = count($data);
        $wari = count($data) % 3;
        foreach($data as $td => $list){ 
            if($td % 3 === 0 && $td > 0) echo '</tr><tr>';

            if($wari === 2 && $cnt === 2){
                $td_col = 3;
            }
            echo '<td colspan=',$td_col,'>',$list,'</td>';
            $cnt--;
        }?>
    </tr>
</table>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/546aadd5-c257-2e1e-3c2d-3d21e37a913c.png)

```PHP
<?php
$data = ['フシギダネ','フシギソウ','フシギバナ','ヒトカゲ','リザード']; ?>
<table>
	<tr>
		<th colspan ="<?php echo $col = 2;?>">ポケモン</th>
	<tr><?php
		$td_col = 1;
		$cnt = count($data);
		$wari = count($data) % 2;
		foreach($data as $td => $list){ 
			if($td % 2 === 0 && $td > 0) echo '</tr><tr>';

			if($wari === 1 && $cnt === 1){
				$td_col = 2;
			}
			echo '<td colspan=',$td_col,'>',$list,'</td>';
			$cnt--;
		}?>
	</tr>
</table>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/9253c37a-9e9f-1212-1b57-58da95382fbe.png)





## パターン２
```PHP
<?php $data = ['フシギダネ','フシギソウ','フシギバナ','ヒトカゲ','リザード','リザードン','ゼニガメ','カメール']; ?>
<table>
    <tr>
        <th rowspan ="<?php echo ceil(count($data)/$col = 4);?>">ポケモン</th><?php 
        $int = 0;
        $wari = count($data) % $col;
        foreach($data as $list){ 
            if($int % $col === 0 && $int > 0)echo '</tr><tr>'; 
            echo '<td>',$list['name'] ?: '調査中','</td>';
            $int++;
        }
        echo $wari !== 0 ? str_repeat('<td>-</td>',$col - ($wari % $col)):'';?>
    </tr>
</table>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/b55bda09-fc79-c66a-4dfe-56b985d72f55.png)
典型90問008 AtCounterで解く！

# はじめに
AtCoder現在茶色(年内には緑が目標！）のあんこちゃん(@Chunky_RBP_chan)です。\
典型問題は抑えとかねばということで、★2〜★5に取り組んでいます。\
Pythonで取り組まれている方も多いと思うので自分の解答をシェアしたいと思います！

# 問題
https://atcoder.jp/contests/typical90/tasks/typical90_h

# 解法
![AtCounter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603082/cedf92b4-6d2d-2537-a9a9-4dd78a91c490.png)
DP[i][j]:Sのj-1文字目までにatcoderの1からi-1文字までが含まれる個数となるDPを考えます。

更新式は
**atcoder[i]=S[j]の時**
DP[i+1][j+1] += DP[i][j]
DP[i][j+1] += DP[i][j]
**atcoder[i] != S[j]の時**
DP[i][j+1] += DP[i][j]
 
例えば、DP[0][0]からDP[1][1]への遷移は
attcorderの１文字目のaをatcoderのaに選ぶことと同じ意味です。
一方でDP[0][0]からDP[0][1]への遷移は
attcoderの1文字目のaを選ばずにattcoderの2文字目への移動を意味します。
他にもDP[1][1]からDP[2][2]への遷移は
attcoderの二文字目のtをatcoderのtに選ぶことと同じです。
したがって、DP[8]にSに含まれるatcoderの個数が並ぶためDP[8]の合計値が答えとなります。


```python
N = int(input())
S = input()
atcoder = 'atcoder'
MOD = 10**9+7
dp = [[0]*8 for _ in range(N+1)]
dp[0][0] = 1
for i in range(N):
    s = S[i]
    for j in range(7):
        if s == atcoder[j]:
            dp[i+1][j+1] += dp[i][j]%MOD
        dp[i+1][j] += dp[i][j]%MOD
    dp[i+1][-1] += dp[i][-1]%MOD
print(dp[-1][-1]%MOD)
postgresで連番をinsertする

明細テーブルに「行番号」フィールドがあることってありますよね。
そういうのって、探しても見つからなかったので、頑張って書いたので、一応、記録残しておきます。

```sql
insert into meisai (line_no, summary_id, name ,units)
    select row_number() over (), 1, * from (
        select 'item1', 1 
        union all select 'item2', 1 
        union all select 'item3', 1 
        union all select 'item4', 1 
        union all select 'item5', 1 
    ) as line
```
こんな感じで連番ふれます。
複数行にも対応！長い文章の末尾を「…（3点リーダー）」にして省略する方法【CSS】


参考記事
https://design-levelup.com/webdesign/html-css/making-3/


.text {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    line-height: 2em;
    max-height: 6em;
}
【30秒でわかる】マクロ VBA VB.Net 

## はじめに
マクロ、VBA、VB.Netっ一体何者？？ってなったので調べたものを**めちゃくちゃ**簡単にまとめました

## マクロとは
　エクセル上で行った操作を記録する機能

## VBAとは
「便利なマクロ機能を構成するプログラミング言語」

　 マクロ機能　「操作」が「記録」　＝　内部で何かが残されている
 　マクロでエクセルなどの操作を記録すると、
　 操作内容がプログラム言語に変換されて、プログラムの形で内部に書き残される
　 このプログラム自体が「マクロ」であり、
　 そのプログラムを作っているプログラム言語が「VBA(Visual Basic for Applications)」
　
　VBAを使えば、Excel業務を効率化するツールが作れます。

### 一旦まとめ
　マクロは「機能」　VBAはマクロに指示を出す「言語」
　向いてることーエクセル作業の効率化

## VB.netとは
　 マイクロソフトが作ったプログラミング言語
　Windows上で動くプログラムを作るための言語

### メリット
　1. 画面を使ったアプリが簡単に作れる　 ＝　バックエンドに集中できる
　　　ツールボックスから部品（テキストボックスやボタンなど）を選び、
　　　ドラッグ&ドロップで簡単に画面が作れる
　2. コード入力の手間が少なく書きやすい　＝　初心者向き
　3. 無料で使える　＝　開発コストが低い

### デメリット
　1.画面に部品を配置する方法で作成するため、配置する部品が多いものは
　  画面に入りきらないこともあり、VBでは作成しにくい。
　2.画面のレイアウト修正の場合には、他の言語であればコードの修正だけで済むが、
　  VBの場合には部品を取り換える作業が発生するので手間がかかる。

### 用途
・ Windowsベースの業務システム、アプリ開発 ・Officeアプリケーションの拡張ツール開発
・　業務効率化のためのシステムや自動化システムなどの開発に適している
・　Windowsを使う企業での業務支援システムでの開発が多い

### VB.Netまとめ
　スピード感を持って作成できるが、大規模な開発になると保守面で多言語の方が優れている為　業務効率化のためのシステムや自動化システムなどの開発に適していると思われる
HerokuのPGBackupでバックアップとリストアを行う

## 環境
Ubuntu20.4

## 参考
PGBackupの公式サイト
https://devcenter.heroku.com/articles/heroku-postgres-backups

## はじめに
HerokuでPGbackupsを使って、PostgreSQLのデータのバックアップ/リストアを行うには、２通りのやり方があります。１つは、Herokuのサーバー上にバックアップダンプを作成して、サーバー上にあるバックアップダンプからリストアする方法。もう１つは、サーバー上に作成したバックアップダンプを、自分のローカル環境にダウンロードして、ローカル環境にあるバックアップダンプからリストアする方法です。

Herokuのサーバー上にバックアップダンプを作る場合は、スケジューリングして、定期的にバックアップダンプを作成することができるが、ローカル環境にダウンロードする場合は、スケジューリングができず、手動で行うしか方法はないようです。ローカル環境にバックアップダンプがあれば、Railsの開発環境やテスト環境にリストアして、本番環境と全く同じデータの状態を作り出すことができます。「開発環境では正常に動作しているのに、本番環境だとエラーになるぅ！」といった場合、本番データを使ってデバックしてみたくなるときもあるはずです。

ただし、PGbackupsを使うと、データベース単位で、全テーブルに対し、一括でバックアップダンプを作成し、全テーブルを一括でリストアします。テーブル単位でバックアップ/リストアしたい場合は、PGbackupを使わず、PostgreSQLのコマンドを使って行うことになるでしょう。

Herokuのサーバー上にバックアップダンプを作成して、サーバー上にあるバックアップダンプからリストアする方法は、以前、こちらに記事を書いたことがあります。
https://qiita.com/pyon_kiti_jp/items/fa32fb5a5bc8d49ce40b

今回は、Herokuのサーバー上に作成したバックアップダンプを、ローカル環境ダウンロードして、ローカル環境からHerokuのリストアしてみます。

では、やってみましょう！

## やったこと

Herokuにログインします。
```
$heroku login --interactive
```

ログインできていることを確認します。
```
$heroku whoami
```

バックアップを行う対象のアプリ名を確認します。
```
$heroku apps
```

バックアップダンプの一覧を表示して、ダウンロードする対象のバックアップダンプの**ID**を確認します。
```
$heroku pg:backups --app アプリ名
```

バックアップダンプをローカル環境にダウンロードする方法には２つあります。１つ目の方法は、IDとアプリ名を指定してダウンロードする方法です。次のコマンドを実行すると、ダウンロード元のURLが自動生成されます。生成されたURLをコピーして、ブラウザで指定したURLを表示すると、ダンプファイルがダウンロードされます。この方法だと、なぜだが、dumpの拡張子が付いていません。また、長いダンプファイル名が付いて作成されます。リストアする時は、入力しやすい適当なファイル名にリネームして、dumpの拡張子も付けて、リストアした方がベターです。

URLの有効期限は60分です。バックアップダンプを作成してから、60分以内にダウンロードを行ってください。
```
$heroku pg:backups:url ID --app アプリ名
```

このコマンドでも、ダンプファイルをローカル環境にダウンロードすることができます。上記のやり方よりシンプルな方法です。**latest.dump**という名前で、カーソルのあるディレクトリにダウンロードされます。IDの指定は不要です。ダンプファイルのタイムスタンプを判断して、最新のバックアップダンプをダウンロードします。IDを指定して、過去履歴のダンプファイルをダウンロードしたい場合は、上記のやり方で行うことになります。
```
$heroku pg:backups:download
```

ローカル環境にあるバックアップダンプをHerokuにリストアするときのコマンドです。**localhost**、**myuser**、**mydb**は、各自の環境に合わせて設定します。設定内容を確認する方法は、ブラウザからHerokuのサイトを表示して、**Datastores－アプリ名－Settings－Database Credentials**を表示すると、確認することができます。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/9fe7aa13-6888-fc6c-46f1-06af8818e589.png)

下記のコマンドでは、リストアするダンプファイルは、カーソルがあるディレクトリに、**latest.dump**という名前で保存されていることを前提にして記述しています。latestという名前にリネームしないとリストアできないということはありません。ファイル名は任意です。（dump拡張子を省略しても大丈夫ないかは確認していません。悪しからず。）

ローカル環境のPostgreSQL（開発環境、もしくは、テスト環境）にバックアップダンプをリストアする場合は、Railsを使って開発している場合に限定して書くが、database.ymlに記述している、データベース名、ユーザー名、パスワードを指定すると、ローカル環境に、リストアされます。

```database.yml
development:
	database: xxxxx_development
test:
	database: xxxxx_test
```

```
$pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
```

コマンドを実行するとパスワードを聞かれます。HerokuのPostgreSQLに接続するためのパスワードです。設定情報を見るとやたら長いパスワードが設定されています。１文字づつ手入力しなくてもコピペで対応できます。コピペしたパスワードは画面表示されませんが、ペーストしてEnterを押すと、リストアが走ります。

Herokuからログアウトします。
```
$heroku logout
```
URI（URL）の設計とパラメーターの使い分けの紹介

# 概要

- URI（URL）の設計で意識すべき事とパラメーターの使い分けについてまとめる。

# ご注意

- 本件は筆者の主観によるものが大きいです。
- URI設計する時に筆者はこんなことを意識しているんだなあ。くらいの気持ちで参考程度に御覧ください。

# URIについて筆者が意識していること

1. ぱっと読んでどのようなリソースに向けたURIなのかわかりやすいものにする。
    1. 冗長なパスを避ける
    1. パスに日本語を入れない（一見わかりやすいように見えるがエンコードが必要なため）
    1. 開発者の意図だけの省略文字などを使わない（userをuを省略することや、`alpha`や`beta`など）
1. 統一感を大切にする。
    1. 大文字 or 小文字で統一
    1. 複数形の単語を用いる
    1. 単語を連結する場合ハイフンで（ケバブケースを用いる）
    1. パラメーターの値取得のルールを統一（パスパラメーターを使う？クエリパラメーターを使う？ 先にルール決めしてそのルールを全体に反映させる）
1. セキュリティー面の安全性を意識する。
    1. .phpなどの拡張子をパスに含めない

# パラメーターについて筆者が意識していること

- こんな時はパスパラメーターを検討
    - 必ず特定のひとつの情報だけを返す場合
        - 単一なユーザーの情報取得等
- こんな時はクエリパラメーターを検討
    - nullableな値の場合
        - user_idが指定されている時は特定のユーザーを、指定されていないときはすべてのユーザーを返す時等
        - 一覧の絞り込み条件等
ProcessingをVSCodeで実行（Windows）

## 動機

新入部員にProcessingをやってもらうことになり、その時に読むメモとしてまとめた。

## ダウンロード

#### VSCode

1. VSCodeをダウンロード
   [Visual Studio Code – コード エディター \| Microsoft Azure](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

#### Processing

2. Processingをダウンロード
   [Download / Processing.org](https://processing.org/download)

   ![スクリーンショット 2022-04-19 160214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691046/df09f7ec-7fa2-085e-4157-70d19990f279.png)

   - WindowsDefenderがProcessingをマルウェア認識して正常にダウンロードが行われないケースが見られました。WindowsDefenderの設定にて例外扱いすることで回避することが出来ます。（問題が発生しても一切の責任は取れません。）

3. ダウンロードしたzipファイルを適当なフォルダに展開
   (例：Cドライブ直下にソフト管理用フォルダを作りそこに展開する`C:\SoftFiles\processing-{バージョン名}`)



## 拡張機能

以下はVSCode上での操作です。     

1. 拡張機能"[Processing VSCode](https://marketplace.visualstudio.com/items?itemName=Luke-zhang-04.processing-vscode)"をインストール
2. "Processing VSCode"のExtensions Settingsを選択
   ![スクリーンショット 2022-04-19 160424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691046/c34a9c81-b749-2e3a-2177-a3332437aff2.png)
3. Processing Pathに
   `Processingを展開したフォルダのパス\processing-java`
   (例: `C:\SoftFiles\processing-4.0b7\processing-java`) を入力
   ![スクリーンショット 2022-04-19 160744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691046/da42b253-9473-0957-cb52-8ca12691534e.png)


## プロジェクトの作成・実行

1. 新しいプロジェクトフォルダを作成(例: `firstProject`)し、それと同じ名前のpdeファイル(例: `firstProject.pde`)をプロジェクトフォルダ内に作りましょう。
   - フォルダ名とpdeファイル名は同一にする必要があります。
2. そしてこのpdeファイルをVSCodeで開きCtrl + Shift + Pを同時に押すと画面上部に入力ボックスが表示されます。
3. そこにProcessingと入力。
4. "Processing: Run Open Processing Project"を選択するとpdeファイルが実行できます。

例として、以下のコードをpdeファイルに入力した状態で実行すると、
緑色のウインドが表示されます。

```java
//firstProject.pde
void setup()
{
  size(600,600);
  background(0,255,0);
}
```

![スクリーンショット 2022-04-19 161307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691046/1e1ce61a-9d0b-f084-421b-3273aceff1c7.png)

---

参考: https://www.dbc-works.org/feedback/entry/2021/9/26
モバイルアプリからの「定期的な行動」編集時の動作について

[モバイルアプリからの「定期的な行動」編集時の動作について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G6KhZ)

似てそうだけど全然別物みたい。ややこしい。
Dagger.io を GitHub Actions で動かしてみた

[Dagger](https://dagger.io/) というポータブルな CI/CD 開発キットを GitHub Actions で動かしてみました。
実際に動作するコードサンプルも用意してあります。
https://github.com/algas/dagger-github-actions-example

## Dagger とは何か？

https://github.com/dagger/dagger
Dagger を使うとソフトウェアチームが強力なCICDパイプラインを最小限の努力で開発でき、どこでも動作するようになるというのがコンセプトらしいです。
次のような2つの利点があります。

1. 開発環境とCI環境の統一
1. CIロックインをなくす

[CUE](https://cuelang.org/) という言語を使ってパイプラインを記述します。
ドキュメントや周辺ツールの整備はまだこれからのようです。

## 使い方

Dagger 自体の記述や GitHub Actions の説明は今回はしません。
自分で書いた Dagger の設定を GitHub Actions から呼び出すことを目標とします。

1. Dagger のインストール
HomeBrew を使う場合 `brew install dagger/tap/dagger`
その他の環境では次を参照のこと https://docs.dagger.io/1200/local-dev
1. GitHub リポジトリの作成
リポジトリを作ったら `git clone` する
1. CUE ファイルを書く
1. Dagger 環境のセットアップ
`dagger project init && dagger project update`
cue.mod というディレクトリが作成される
1. GitHub Actions Workflow ファイルを書く
1. Git commit & Push
cue.mod も commit するのがポイント
`git commit -a && git push origin main`
1. 動作確認
GitHub リポジトリの Actions タブで動作を確認します

## CUE ファイルのサンプル

https://github.com/dagger/dagger/blob/main/pkg/universe.dagger.io/examples/helloworld/helloworld.cue

公式リポジトリに載っている Hello World を出力するだけのサンプルです

```cue
package helloworld

import (
	"dagger.io/dagger"
	"dagger.io/dagger/core"
)

dagger.#Plan & {
	actions: {
		_alpine: core.#Pull & {source: "alpine:3"}
		// Hello world
		hello: core.#Exec & {
			input: _alpine.output
			args: ["echo", "hello, world!"]
			always: true
		}
	}
}
```

## GitHub Actions Workflow のサンプル

上記の Dagger を動作させるための workflow ファイルのサンプルです

```yml
name: helloworld

on:
  push:
    branches:
      - main

jobs:
  dagger:
    runs-on: ubuntu-latest
    steps:
      - name: Clone repository
        uses: actions/checkout@v2
      - name: Hello World
        uses: dagger/dagger-for-github@v2
        with:
          version: 0.2
          cmds: |
            do hello --log-format=plain
```

## まとめ

Dagger を GitHub Actions で動かすサンプルを書いてみました。
次はもう少し実践的なファイルを書いてみようと思います。
【Vue】描画関数（render）内で「v-show」を使用する

単純に基礎知識が足りないせいで勘違いしていたので、備忘録も兼ねて投稿しておきます。

# 正しい例
まず初めに、描画関数（render）内で`v-show`を使用する正しい例です
```js
export default {
 data: () => ({
  isActive: false
 }),
 render(h){
  return h('div', {
   directives: [
    {
     name: 'show',
     value: this.isActive
    }
   ]
  }, this.$slots.default)
 }
}
```
よくよく考えてみれば`v-show`はディレクティブなので、描画関数内でもディレクティブを追加してあげれば良いだけなのですが、基礎を怠ったせいでこの発想がまず出てこなかった・・・
# 間違った例
というわけで何となく予想できるかもしれませんが、失敗例です。
```js
export default {
 data: () => ({
  isActive: false
 }),
 render(h){
  return h('div', {
   style: {
    'display': this.isActive ? '' : 'none'
   }
  }, this.$slots.default)
 }
}
```
はい。
一応これでも似たような動きはしますが、例えば`transition`なんかで囲った場合、`transition`側が反応しないです。



以上。
Python3: 文字列がカタカナかを判定する

Ubuntu でのライブラリーのインストール

```bash
sudo pip3 install regex
```

```py:katakana_hantei.py
#! /usr/bin/python
#
#	katakana_hantei.py
#
#					Apr/19/2022
# ------------------------------------------------------------------
import sys
import regex
# ------------------------------------------------------------------
def katakana_hantei_proc(word_in):
	rvalue = False
	changed = regex.findall("\p{Katakana}+", word_in)
	if 0 < len(changed):
		if word_in == changed[0]:
			rvalue = True
#
	return rvalue
#
# ------------------------------------------------------------------
for word_in in ["ニワトリ","にわとり","鶏","庭の鶏","庭のトリ"]:
	change_word_in = regex.findall("\p{Katakana}+", word_in)
	hantei = katakana_hantei_proc(word_in)
	print(word_in,hantei)
#
# ------------------------------------------------------------------
```

実行結果

```text
./katakana_hantei.py 
ニワトリ True
にわとり False
鶏 False
庭の鶏 False
庭のトリ False
```
CakePHP3のプレフィックスルーティングのURL生成

## 概要
CakePHP3でプレフィックスルーティング（prefix routing）使用時、URLヘルパーから参照する方法です。どこにも情報がなかったので置いときます。

## 方法

ルーティング内容は以下の通りです。`/api/v1/user/:uuid`を定義しています。
注意点として、`$routes->get()`や`$routes->post()`は無理でした。（検証不足かも）
また、`['pass' => ['uuid'], 'hash' => '.+']`の部分が必要です。（setPass, setPatternsでの定義も可）

```routes.php
$routes->prefix('api', function(RouteBuilder $routes) {
    $routes->prefix('v1', function(RouteBuilder $routes) {
        $routes->connect('/user/:uuid', ['controller' => 'Users', 'action' => 'index'], ['pass' => ['uuid'], 'hash' => '.+']);
    }
}
```

生成方法は以下の通りです。ビューの場合は`$this->Url->build()`でも良いかと思います。
ここでは、`'prefix' => 'api/v2'`が必要です。CakePHP4ではパスカルケースで記述する必要があるかもしれません。（ApiV2かApi/V2かはわからない）

```TestController.php
use Cake\Routing\Router;

$url = Router::url([
    'controller' => 'Users',
    'action' => 'index',
    'uuid1234',
    'prefix' => 'api/v2',
], true);

// $url -> 'http://localhost/api/v2/user/uuid1234'
```

ご参考になれば。
pandasを使用してCSVを読み込むとデータの先頭０が無くなった

# 結論
:::note info
**dtype=str**を追加してあげましょう
:::
```test.py
import pandas as pd
df = pd.read_csv('test.csv',dtype=str,header=None)
print(df)
```
**結果**
```
      0  1    2
0  user1  1  001
1  user2  2  011
2  user3  3  100
```

# なぜ０が無くなるのか
pandasを使用してCSVをデータフレーム型に格納する場合、dtypeを設定せずにいると、勝手に型を判別されてしまう。

# サンプルコード
今回読み込むCSVファイル
```test.csv
"user1","1","001"
"user2","2","011"
"user3","3","100"
```
**先頭の０が消えてしまうコード**
ちなみに今回のようなヘッダーなしCSVを読み込む際には「header=None」を指定しないと、先頭の行がヘッダーとして使用されてしまう。
```test.py
import pandas as pd
df = pd.read_csv('test.csv',header=None)
print(df)
```
**結果**
```
       0  1    2
0  user1  1    1
1  user2  2   11
2  user3  3  100
```
# まとめ
**dtype=str**は、いったん全部文字列型で受け取ろうという設定なので先頭が０のデータを扱う場合は、今回のように考慮する必要がある。
Volta のインストールと使い方

数年前から anyenv と nodenv で node のバージョン管理を行なっていたのですが、結局 node しか使いませんでした。
この度、別環境を構築したのを機に、他の node バージョン管理ツールを使うことにしました。

いろいろ比べたのですが、volta が一番オシャレ（名前がオシャレ、公式サイトがオシャレ、使っている人がオシャレ：2022年4月時点での私感）だったので volta を採用しました。

※以前 Node や Node のバージョン管理ツールを使っていた人は Volta をインストールする前に削除しておいてください。

``` shell
# 環境
# MacOS : Monterey 12.3.1
# SHELL : zsh
# Homebrew : 3.4.5
```

# インストール
## Homebrew から volta をインストールする
Homebrew からでなくともインストールできますが、Homebrew からのインストールした方がオシャレ度 UP ✨ です。
### 1. インストールと確認
```Shell
brew install volta

volta -v
```
### 2. 環境変数を設定する
```Shell
volta setup
```
参考 : https://docs.volta.sh/reference/setup

### 3. 一応 PATH の確認
```Shell
cat ~/.zshrc

export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"
```
### 4. SHELL の再起動
```Shell
exec $SHELL -l
```
### 5. node のインストールと確認
```Shell
volta install node

node -v

v16.14.2
```
バッチリです✌️ 

### * node のバージョンを指定してインストールする方法

```Shell
volta install node@18.12.1
```

### * のバージョンを指定してインストールする方法

```Shell
volta install npm@8.19.2
```




# 使い方
## プロジェクトで node のバージョンを固定する
### 0. プロジェクトディレクトリに移動して npm を初期化する
```Shell
mkdir ~/project-directory && cd ~/project-directory

npm init -y
```
### 1. node のバージョンを固定してインストール
```Shell
volta pin node@14.15.0
```
参考 : https://docs.volta.sh/reference/pin

#### 確認
```Shell
cat package.json 
```
```Shell

{
  "name": "project-directory",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "volta": {
    "node": "14.15.0"
  }
}
```
14.15.0 で固定されています。
### 2. yarn もプロジェクトで固定
```Shell
volta pin yarn
```
#### 確認
```Shell
cat package.json 
```

```Shell
"volta": {
    "node": "14.15.0",
    "yarn": "1.22.18"
  }
```

### インストールされている Node の確認
```Shell
volta list all
```

```Shell

User toolchain:

    Node runtimes:
        v14.15.0
        v16.14.2 (default)

    Package managers:
        npm:
            v8.7.0
        Yarn:
            v1.22.18

    Packages:
```
クロージャ（JavaScript）

最近クロージャを勉強したので備忘録として残しておきます。

# クロージャとは
クロージャーとは、関数とその関数の中に同封された関数の「外」にある変数の組み合わせのことです。この説明だとよくわかりませんね、以下に例を示しておきます。


# クロージャの例
```javascript:qiita.js
function add(x) {
    return (y) => x + y
}

const addOne = add(1);
const addTen = add(10);
```
この場合、変数xが関数addに内包されます。
addOneは、引数に1を加えた値を返す関数になります。
addTenは、引数に10を加えた値を返す関数になります。

＜実行例＞
```javascript:quita.js
addOne(2) // 1 + 2 = 3
addTen(5) // 10 + 5 = 15
```
1つ目の例では、内包された1に引数の2加わり、3が出力されています。
2つ目の例では、内包された10に引数の5が加わり、15が出力されています。


# クロージャの重要性
クロージャを使用すると、オブジェクトの変数やメソッドを他のプログラムから変更できないようにできます。コードが複雑になったり、チームでプログラミングをする時に、意図せず変数を書き換えてしまうことを防いでくれます。
Javascript のクロージャについて

### Javascript のクロージャについて

## スコープの種類と概要

Javascript におけるスコープとは、どの変数にアクセスできるかを考える時に必要になってくる。
スコープには、***グローバルスコープ***・***ローカルスコープ***・***関数スコープ***・***ブロックスコープ***が存在する。

***グローバルスコープ***は、同一ファイル内であれば、どこでも参照できる。

```javascript: 
//var で宣言することでグローバル変数となる
var hensu = 100;
```
***ローカルスコープ***は、グローバルスコープ以外の全てのスコープで、関数スコープとブロックスコープに分かれる。
***関数スコープ***は、関数の中で定義される変数のスコープで、その関数内部でしかアクセスできない。
```javascript:
//関数の引数は関数スコープとなる
function test(hensu) {
  console.log(hensu);
}
```

***ブロックスコープ***は、{}で閉じられたブロックによって定義されてその中で宣言された変数のスコープであり、その中でしかアクセスできない。
```javascript:
function test() {
  //{}の中にあるので、ブロックスコープとなる
  let hensu;
  console.log(hensu);
}
```

## クロージャの利点
クロージャとは、ローカルスコープの変数を保持する他の関数が内部に存在している関数を指します。
以下が例になります。xというローカル変数は、外部から直接操作することはできず、直接取得することもできない。これを、javaなどのオブジェクト指向言語で言うと「カプセル化」と呼ぶ。
```javascript:
function test() {
 //カプセル化されている
 let x = 0;
 return {
  get: () => { 
   return x;
  },

  set: (newX) => {
   x = newX;
  },
  //カプセル化されていない
  y: 2
 }
} 
```

カプセル化を行うことによって、誤って値を上書きすることを防ぐことができる。

```javascript:
let func = test();

//カプセル化できている
console.log(func.x); //undefined
console.log(func.get()); //0
func.set(10); 
console.log(func.get()); //10

console.log(func.y); //2
//カプセル化できていない
func.y = 12
console.log(func.y); //12

```
プログラミングスクール進捗

プログラミングスクールを始めて2か月が経過しました。（4/15時点)

そこで、進捗を少し話したいと思います。

# コピーアプリは9割がた終了
カリキュラム＋課題合わせて9割くらい終わりました。
残る課題も二つとherokuへpushするだけです。

## 最後の課題が難関
最後の課題が一番頭を悩ませます。自分でどういうコードを書けばいいか考え、実際にコードを書いていくことになります。
が、ヒントはありません。あるとすれば、カリキュラムの内容だけ。

## 出来るとすれば
課題の前のカリキュラムの内容を何度も読むことしかありません。

# 実際のところは
今月までに、カリキュラムの課題までを全部終わらせ、来月からオリジナルアプリを作っていきます。
その時には、ヒントになるものはほとんどありません。自分でどういうコードを書いていくか考えなければいけません。

まさに、ここからが正念場です。
【Swift】init(repeating:count:)で配列を作成する際の注意点

![macOS: 12.3.1（21E258）](https://img.shields.io/badge/macOS-12.3.1(21E258)-brightgreen) ![Swift: 5.6](https://img.shields.io/badge/Swift-5.6-brightgreen) ![Xcode: 13.3.1 (13E500a)](https://img.shields.io/badge/Xcode-13.3.1(13E500a)-brightgreen)

## はじめに
クラスを要素に持つ配列のクラスのプロパティを変更した時に挙動がおかしい...
といったことがありました。
単純なミスというか誤解だったのですが、備忘録として残します。

## 要素が参照型だった場合の挙動
結論から言いますと、私が誤解していた内容は下記のようになります。
恥ずかしながら両方とも同じ結果になると思っていました。


```swift: Sample.playground
//方法①
let arr1 = Array.init(repeating: SomeClass(), count: 3)
arr1[0].value = 1
print("結果①:", arr1)

//方法②
var arr2 = [SomeClass]()
for _ in 0 ..< 3 {
    arr2.append(SomeClass())
}
arr2[0].value = 1
print("結果②:", arr2)
```
#### 実行結果
```
結果①: [1, 1, 1]
結果②: [1, 0, 0]
```
`init(repeating:count:)`の引数に渡すタイミングでインスタンス化をしてやれば、
参照先が異なるクラスのインスタンスを3つ持った配列になる！と思っていました。
（私だけでしょうか...）

下記のように記述すれば、①の結果になることはイメージできていたのですが、一緒なんですね。
```swift
let someClass = SomeClass()
let arr1 = Array.init(repeating: someClass, count: 3)
```
でもまぁ、同じ挙動の関数を自作してって考えれば当たり前のことだなぁと理解できました。
関数の内部では、参照先が同じクラスのインスタンスしか取り扱えないですもんね。

## さいごに
今回は`init(repeating:count:)`を使う際の注意点を共有させていただきました。
参照型の取り扱いには気をつけないといけませんね。
『プログラマの数学』の各章の理解メモ

#### 1章　ゼロの物語
私たちが普段の生活で利用する数字は、「10進法」を用いた「位取り記数法」である。
数の表記は他にも「2進法」や「16進法」など「N進法」があるという話。
おそらく皆どこかでやってきた話で、それをより細か書く説明している章だった。
　少し面白かったのは、位取り記数法で10進数を知らない人は12をイチと、ニ？つまりサン？と考えるかもしれないことを思うと、常識が如何に思考から除外するのが難しいかわかることだった。
　また、薬を飲む人が３日に１回服薬を休む場合、ダミー薬を飲むことで飲まない日を考えなくて良いという例について。0によって「ナイ」ものを「アル」とすることが可能になり、そうすることで判断が簡略化できるようになったと言うのは目から鱗だった。0はプレースホルダーや穴埋めといった機能があるという話。

#### 2章　論理
■A∩B 論理積 エーかつビー
AでありB の時、網羅的にtrue
Aのみ、Bのみ、どちらでもないはfalse。
AとBがどちらも条件を満たさないと許せない完璧主義。

■A∪B 論理和 エーまたはビー
AかBであれば良い。true。
どちらかが条件を満たせばOKなリスクヘッジャー。

■AかBどちらか 排他的論理和
エーかビーのどちらかで、true
両立は想定されず、認められない
AもBも条件を満たす、あるいは満たさないことが許せない多様性信者。
※リモコンが二つあるライトをどちらからでもワンタッチで点けて消せる。

■A=B エーとビーが等しい
trueでもfalseでも同じであれば、true
単品だとfalse
AとBが条件を満たす満たさないに関わらず、同じであれば良い平等主義者。
※排他的論理和と反対の性質

■！重要！ AならばB  A→B 含意
前提Aがtrueの時、前提Bがfalseの場合。false
それ以外はtrue。
Aだけが条件を満たす状況を許さないB贔屓の毒親。

■カルノー図
定義を設定して条件を組みたい場合、カルノーズを描くことで理解しやすい。

■条件付き論理積
A&&B
Aがtrueのとき、A&&BはBの結果と等しくなる。
Aが値を取れない時、話はそこで終わり。論外。
Aがfalseの時、Bは常にfalse。※つまりBが値を取れなくても関係ない。ここは落とし穴になるかも。

■条件付き論理和
A||B
Aがtrueの時、Bを無視してtrue。※つまりBが値を取れなくても関係ない。落とし穴。
Aがfalseの時、A||BはBの結果に等しい。
Aが値を取れない。論外。

■条件付き論理の時否定には!をつける。

#### 3章 剰余
周期性を見つけ、それに0から番号をつける。
大きな数字の剰余(割った余り)とつけた番号を照合した結果が答えになる。
　また、偶奇性を使えば、パターンの検証が簡易化できる。

#### 4章　数学的帰納法
高校の時に授業で行った、証明。
基底(出発点)と帰納(出発点以上の整数kが成り立つと仮定して、k＋1を考える)の2つを証明すれば良い。というもの。
帰納が証明できれば、0で始まって以降どんな数字も地続きに成立してしまうので証明完了となる。
高校当時、覚えるしかなかった証明だが、今ならなぜ0とk+1を展開していくのか理解できるため、多少は脳みそが成長していることがわかった。
　しかし、「仮定した式を使ってその仮定が正しいこと」を証明することが直感的に理解できない・・・。
これは仮定した式が、なんらかのパターンに沿っているであろう数字の羅列を表したものである、という認識が足りていないためと私は考えた。
式(主張したい事を数学的に書き換えて記号化したもの)はとある計算処理を代数記号化したもので、計算処理にk+1を追加したものと、代数記号化にk+1を足したものが同じになればパターン化に成功していると言える、という話、だろうか？どうも違う気がする。
　なぜ自分がこの話を理解できないのか？主張する記号化式が正しいにしろ正しくないにしろ、整数kで成立すると仮定したもので証明することに例外がないということが理解できないから。
と思ったらp106で筆者も同じこと言ってた。
　小1時間考えた末、勘違いの元は、どっちにもk+1を足していると思っていたことがわかった。
例：以下の式を言い換える。k=0以上の整数。
0+1+2+3+・・・+k=k(k+1)/2
左辺を、整数kまでのパターンに沿った計算処理。
右辺を、左辺を数学的簡略化したもの。（まだ未証明）
とする。
左辺に「k+1を追加」し、右辺の「kをk+1に変換」して成立すれば数学的簡略化が証明完了。
理解できた。要するに、計算処理にはkの後にk+1を追加していて、数学的簡略化ではkをk+1に変換していることがわかってなかった。ということがわかった。
ユリイカ！

#### 5章　順列・組合せ
0が1番目である場合に起こる勘違いの話。

#### 6章　再帰
再帰とは、自分を使って自分を定義すること
　ハノイ問題を解くとき、簡単な規模にしてから解くとパターンが分かる。
一つ規模を下げて自分を定義させることを再帰的定義という。
これも数学的帰納法と同じで、基底(再帰では0固定)とそれ以上がn-1を用いて表されるという2ステップで定義される。

#### 7章　指数的な爆発
倍々ゲームをグラフにすると、ほぼ直線的に数値が増えていると言う話。
ドラえもんのバイバインによる栗饅頭の宇宙的恐怖はあまりにも有名。
　と言う話だけではなく、0の数を数えるという「対数」を使うことで莫大な数を扱いやすくすることも述べられている。
高校のときにやったlogが対数を利用して莫大な数字を計算しやすくしたものだと理解できた。

#### 8章　計算不可能な問題
背理法（帰謬法）について。これも「数学的機能法」「再帰」同様2ステップ。
①「証明したい命題の否定」が成り立つと仮定
②その仮定をもとに、矛盾を導く
・・・よくわからない。
例：最大の整数が存在しないことを証明したい。
①最大の整数Mは「存在する」と仮定
②M＋1を考える。これは最大の整数より大きい。矛盾している。
よって最大の整数Mは「存在する」ことが否定されたので、最大の整数は「存在しない」。という話。
　カウンタブルな集合について。
「集合の要素が有限個であるか、または全ての集合の要素を1以上の整数と1対1に対応付けられる」とき、その集合はカウンタブルと定義される話。対角線論法により、カウンタブルではない集合を証明できる。・・・理解し難い・・・。
　上記2つをもとに、計算不可能な問題についてプログラムに書けない関数の解説がなされている。
python csv パッケージの改行コードを指定しても CRLF になる

目標：CRLF ではなく、 LF にしたい。


```python
import csv

(中略)

with open("output.tsv", "w", encoding='utf-8', newline="\n") as f:
    writer = csv.writer(f, delimiter='\t', lineterminator="\n")
    writer.writerow(['key', 'value'])
    writer.writerows(data)
```

基本的には`newline="\n"`でよいはず。しかし `LF` にならない。

なぜか、`open`と`writer`のどちらも改行コードを`"\n"`に指定しないと、`CRLF`になってしまう。

# 参考リンク

https://qiita.com/tatsuya-miyamoto/items/f57408064b803f55cf99