OmniAICreator/Qiita-1.07M huggingface dataset:
Qiita記事投稿用テンプレート

Qiitaで記事を作成するにあたり
1. 時間短縮
2. 記事構成の統一
の目的のもと、テンプレート例を作成

# テンプレ
```:コピぺ用
※ {記事タイトル}は、検索エンジンまたはQiita内での検索を考慮してキーワードを含めた命名を推奨。

# はじめに
なぜこの記事を書こうと思ったのか。
誰に向けた記事なのか。

# TL;DL
結論ありき
まず最初に一番重要な点を記述
読むのめんどくさいと思うので痒い所に手が届く簡潔な解説
ここを読んだだけで、何を言いたいのかがすぐにわかるように簡潔な記載
箇条書き〇

```:言いたいこと

- あれはこれです
- これはあれです

```:

# 前提
前提知識 => なしでも可

# 詳細
結論の内容を説明する詳細な内容を説明
番号付き見出しのまとめ

## 1. 詳細情報1
かくかくしかじかの説明
コードとともになら尚良しだが長くなりすぎるのに注意

## 2. 詳細情報2
かくかくしかじかの説明
コードとともになら尚良しだが長くなりすぎるのに注意

# 参考文献
- [リンクテキスト](URL)
- [リンクテキスト](URL)
- こっちにコードを用いた具体的な実装あってもいい

# その他部品
```言語名:ファイル名.拡張子
コードブロック
```:
[リンクテキスト](URL)

| No |    内容     |    備考    |
|---:|-------------|------------|
| 1  |             |            |
| 2  |             |            |
```

# はじめに
なぜこの記事を書こうと思ったのか。
誰に向けた記事なのか。

# TL;DL
結論ありき
まず最初に一番重要な点を記述
読むのめんどくさいと思うので痒い所に手が届く簡潔な解説
ここを読んだだけで、何を言いたいのかがすぐにわかるように簡潔な記載
箇条書き〇

```:言いたいこと

- あれはこれです
- これはあれです

```

# 前提
前提知識 => なしでも可

# 詳細
結論の内容を説明する詳細な内容を説明
番号付き見出しのまとめ

## 1. 詳細情報1
かくかくしかじかの説明
コードとともになら尚良しだが長くなりすぎるのに注意

## 2. 詳細情報2
かくかくしかじかの説明
コードとともになら尚良しだが長くなりすぎるのに注意

# 参考文献
- [リンクテキスト](URL)
- [リンクテキスト](URL)
- こっちにコードを用いた具体的な実装あってもいい

# その他部品
```言語名:ファイル名.拡張子
コードブロック
```
[リンクテキスト](URL)

| No |    内容     |    備考    |
|---:|-------------|------------|
| 1  |             |            |
| 2  |             |            |
AKS(Azure Kubernetes Service) 入門 ~基礎編~

# はじめに
クラウドエンジニアなのにKubernetesをまともに触ったことがないので勉強してみました。
Azure × Kubernetesの記事があまりないのでまとめておきます。

# AKS 用語説明
↓AKS ポータルトップ画面
![スクリーンショット 2021-08-28 15.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355263/d789dc97-531e-4217-618c-f6e1e7e09b4b.png)

## 名前空間(namespace)

**「クラスタの仮想化」をするための設定項目**
名前空間を設定することK8sクラスタを仮想的に分割して運用することが可能になる。
名前空間別、ロール別のアクセスコントロール、設定情報やシークレット情報を名前空間に保存、名前空間別のリソース制限(CPU、メモリ)、名前空間へのアクセスポリシーの設定などができる。
![スクリーンショット 2021-08-28 16.02.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355263/8498b090-adb5-6f18-f353-05579b7077a7.png)

## ワークロード(Workload)

ワークロード：オブジェクトのカテゴリを表す用語として用いられる。
デプロイ、ポッド、レプリカセット、ステートフルセット、デーモンセット、ジョブ、Cronジョブを一覧で確認できる。
![スクリーンショット 2021-08-28 16.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355263/744ea162-04c4-2e2e-bbec-66f933e2eb8d.png)

## サービスとイングレス

### サービス(Service)

K8sの「サービス」は、クライアントからのリクエストをPodへ転送する役割を果たします。
Podとサービス名を具体的に紐づける役割。
クライアントはサービスの代表IPアドレスにリクエストを送信する。

## イングレス(Ingress)

K8s内のリバースプロキシ
サービスと連携しK8s外からのリクエストをK8sクラスタ内部のアプリケーションへつなぐためのAPIオブジェクト。
Podのアプリケーションと外部公開用URLをマッピングしてインターネットへ公開できる。
さらに、SSL/TLS暗号化やセッションアフィニティなどの機能も備えている。
![スクリーンショット 2021-08-28 16.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355263/ef7181cf-1c4e-f2ab-bf0e-b39f454ef6b3.png)

## ストレージ

K8sの概念：Podは使い捨て
ただし、複数のPodでデータボリュームを共有したり、再度別のノードでスケジュールされた場合、データボリュームを再度アタッチしたい場面がある。
そういった用途向けに永続的なストレージを利用することができる。
![スクリーンショット 2021-08-28 18.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355263/ae262aca-73c8-e548-e464-7044176ebc06.png)

## 構成

証明書などのシークレット情報をK8sクラスタに保管・管理する。
![スクリーンショット 2021-08-28 19.13.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355263/6eb036ff-7aff-f7c4-aab5-1326edd9d300.png)



## 【参考文献】

- [MS公式Docs](https://docs.microsoft.com/ja-jp/azure/aks/concepts-clusters-workloads)
- [15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで (StepUp!選書) ](https://www.amazon.co.jp/15Step%E3%81%A7%E7%BF%92%E5%BE%97-Docker%E3%81%8B%E3%82%89%E5%85%A5%E3%82%8BKubernetes-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E3%81%8B%E3%82%89K8s%E6%9C%AC%E7%95%AA%E9%81%8B%E7%94%A8%E3%81%BE%E3%81%A7-StepUp-%E9%81%B8%E6%9B%B8/dp/4865941614)
ターミナルのコマンドを省略してうてるようにする方法

## 初回設定
1. .bashrcファイルを編集
1. .bash_profileを編集
1. 変更を反映

### .bashrcファイルを編集
以下のように追記

``` :.bashrc
・
・
alias 省略名="コマンド"
# ex) alias gopro="ssh -i ~/.ssh/sample.pem ec2-user@12.34.567.890"
```
### .bash_profileを編集
以下のように追記

``` :.bash_profile
・
・
source .bashrc
```
### 変更を反映
```Bash:terminal
$ source ~/.bash_profile
```


## 2回目移行
1. bashrcファイルを編集
1. 変更を反映

上記を参考
JOOQ3.15に上げるとSpring Bootが起動しない

2021/8/28現在、Spring BootとJOOQ 3.15を組み合わせるとDSLContextのインジェクションに失敗するようになりました。  

```
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-08-28 08:51:20.130 ERROR 10463 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.example.securingweb.UsersController required a bean of type 'org.jooq.DSLContext' that could not be found.


Action:

Consider defining a bean of type 'org.jooq.DSLContext' in your configuration.

Disconnected from the target VM, address: '127.0.0.1:58570', transport: 'socket'

Process finished with exit code 1
```

`spring-boot-starter-jooq`を単独で使う分には3.14系が使用されますが、自分は`nu.studer.jooq` gradleプラグインも使用しており、そちらが依存しているため3.15が入っていました。

### なぜエラーになるのか？
JOOQ 3.15からR2JDBCをサポートするようになり、`io.r2dbc:r2dbc-spi:0.8.5.RELEASE`が依存関係に追加されR2dbcAutoConfigurationが意図せず発動してしまうためです。

### 対処法

（R2JDBCを使用しないならばですが）`R2dbcAutoConfiguration.class`をexcludeすれば動かすことが可能です。  

```java
@SpringBootApplication(exclude = { R2dbcAutoConfiguration.class })
public class MyApplication {
    public static void main(String[] args) throws Throwable {
        SpringApplication.run(SecuringWebApplication.class, args);
    }
}
```

https://github.com/spring-projects/spring-boot/issues/26439

ただ、上記のIssueでやりとりされていますが、JOOQ 3.15の無償版はJava11以上が必要なため、Java8をサポートしているSpring Boot2.5系で3.15がサポートされることはないのかもしれません。  
商用ではおとなしく3.14系を使っておいた方が無難でしょうか。
チャットボットと会話するウェブアプリをGASで作る。（画面はReactで）

# チャットボットと会話するウェブアプリをGASで作る。（画面はReactで）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/71b7db8a-d4fd-d867-ff99-9f2b4cf5acf0.png)

## きっかけ

Google Apps Scriptの `ウェブアプリ` で画面を作ってみたかった。

今までは、Googleアプリケーション（カレンダー、メール、翻訳、ドライブ）との `トリガーによる定期処理` や `SpreadSheetのマクロ実行` `WebHookなどのAPI実行`　での利用方法しかしてこなかった。
よくよく考えたら、ウェブアプリってあるし、htmlもあるので画面が作れる仕組みだ・・・ってことで、作ることにしました。

## 利用技術

* Google Apps Script
* React `node_modulesを使うほど作り込まないので、今回はCDN`
* Materialize css `Material-UIはCDNだと使えないので、Materialize cssをCDNで利用`
* Chaplus `無料で利用できるチャットボットAPI`

### 仕組み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/75ad2bfa-167c-cb4b-65fe-6b17d80c2901.png)

* Clientで稼働するのは、Reactで構築される画面
* API呼び出しなどの通信処理は、GoogleAppsScriptで実行

## 実装

https://github.com/Yamamoto-Shohei/gas-chat-bot-webapp

* 動作させる場合は、以下の手順で実施してください。
    1. [Chaplus 対話API](https://www.chaplus.jp/api)のAPI KEYを取得する。
    1. GoogleAppsScriptを新規作成して、GitHubのプログラムを登録する。
        * `.html` は、HTMLで登録、 `.gs` は、スクリプトで登録してください。
    1. `main.gs - doGet()` を一度実行して、外部API実行の権限を許可する。
    1. `main.gs` の `API_KEY` に取得した値を登録する。
    1. デプロイ - 新しいデプロイでウェブアプリとしてデプロイする。
    1. 発行されたURLにアクセスする。

### POINT説明

* ウェブアプリの画面を応答する方法。

    ```javascript:main.gs
    const doGet = () => HtmlService.createTemplateFromFile('index').evaluate()
    ```

* 画面のファイルを複数に分割して、読み込み(inculude)する方法。

    ```html:index.html
    <?!= HtmlService.createHtmlOutputFromFile('chat_js').getContent(); ?>
    <?!= HtmlService.createHtmlOutputFromFile('app_js').getContent(); ?>
    <?!= HtmlService.createHtmlOutputFromFile('index_js').getContent(); ?>
    ```

* GASで、Reactを利用した画面を実装する方法。

  * ReactのCDNを読み込み

      ```html:index.html
      <script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
      <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
      <script crossorigin src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
      ```

  * Reactで実装する対象のdivを準備して、レンダリング

      ```html:index.html
      <div id="index"></div>
      ```

      ```javascript:index_js.html
      ReactDOM.render(
        <App />,
        document.getElementById('index')
      );
      ```

  * 本来、importして利用する`useState`や`useEffect`は、`React.`を指定

      ```javascript:index_js.html
      const [messages, setMessages] = React.useState([]);
      const [inputMessage, setInputMessage] = React.useState('');
      React.useEffect(() => {
        scrollTo(0, element.scrollHeight - element.clientHeight,);
      }, [messages])
      ```

* GASサーバ上の処理を呼び出しする方法。

    ```javascript:chat_js.html
    google.script.run.withSuccessHandler((response) => {
      addMessage({value: response.bestResponse.utterance, isMe:false})
    }).withFailureHandler((e) => {
      addMessage({value: JSON.stringify(e), isMe:false})
    }).callBot(value)
    ```

## 感想

簡単かつ無料で、フロントエンド＆バックエンドのウェブアプリの環境が構築できる事に感動しました。
今後、ちょっとおもちゃで作ったものを公開する環境としても活用できそうだと思いました。

GoogleAppsScriptの強みである、Googleアプリケーションとの連携などと組み合わせて使うことで、
イイ感じのツールを作っていくことができそうです。
Arduino pro micro でctrl連打ボタンを作る

# 概要
私は、<font Color = Red>**ctrlを連打したい**</font>

とにかく<font Color = Red>**連打したい**</font>

dbdというゲームのハグというキャラは常時、連打する必要があるのだ。
このままでは腱鞘炎になってしまう。

ということで作ったのでその記録です。

# やり方
### プログラム

```C
#include <Keyboard.h>

volatile int flag = 0;
volatile int num =0;

void setup() {
  pinMode(5, INPUT_PULLUP);
  Keyboard.begin();
  
}

void loop() {
  int data = digitalRead(5);                                   
  if (data == LOW ){
    Keyboard.press(KEY_LEFT_CTRL);
    delay(10);
    Keyboard.releaseAll();
  }
  delay(10); 

}
```
ずっと、スイッチのON,OFFを監視してONになったら、CTRLを押したと何度も送信するだけですね。


### pro microのプログラムの書き込み装置
初手で話がそれますが、USB機器として設定すると、勝手にCTRLを連打してきたりして、プログラムを書きこむことが難しくなります。
よって、USB以外の方法でプログラムの書き込みをする必要があります。今回はISP書き込みを使います。

1. `Arduino Nano`または`Arduino Uno`に`Arduino as ISP`というプログラム（ファイルのスケッチ例にあります）を書き込み、書き込み装置にする
2. 配線する。
3. プログラムを書き込む

というわけで、Arduino UNOでPro microにISPで書き込みます

https://n.mtng.org/ele/arduino/ArduinoISP.html

https://tomosoft.jp/design/?p=12039

が参考になりました。
![IMG_20210828_184204141.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/88ea93da-89c6-26a8-d40d-69b80a7426e0.jpeg)


# 遭遇した問題
## problem 1
プログラムが書き込めない

### 原因
ISP書き込みの場合`Ctrl+Shift+U`で書き込むようです。
ずっと、`Ctrl+U`を行っていたため失敗していました。
書き込み装置は`Arduino as ISP`を選択します。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/254b4f21-0cb1-627e-93d6-9411a245c900.png)

に書いてありました(笑)。

Pro microの設定は2つありますが、私の場合は
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/49a51a25-561c-c1a9-283a-34da18a8fdbc.png)
の設定で行いました。


## problem 2
今度はプログラム書き込み後、Pro microをPCが認識しない問題が発生しました。
ずっと、「不明なUSB」として認識される・・・
ブートローダーを焼き直そうとしても

```
stk500_disable(): unknown response=0x12
```
のエラーでブートローダーが書けませんでした。

### 対処

http://yatsugatake.org/kodaira/2011/09/27/burn-atmega328p-bootloader-to-atmega328/

https://www.arduino.cc/en/Tutorial/BuiltInExamples/ArduinoISP#toc3

こちらを参考にし、**2.2μFの電解コンデンサをGND,RESET間に入れる**ことでブートローダーの書き込みに成功しました。

## problem3
しかし、ブートローダーはかけましたが、「不明なUSB」が解除されない・・・

### 原因
しょうもないですが、USBケーブル変えたら治りました！`USB micoro B`の耐久性はかなり低いですね・・・


という感じで、作ることができました。

## ＜追記2025/1/13＞problem4 : ボードが接続されていません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/6084a9f5-0880-012e-c9cc-320f300d6c51.png)
書き込み途中で接続が解除されてしまう。
エラーには「書き込み開始した直後にリセットボタンを押してください」とある。

ProMicroにはリセットボタンがない。

https://content.arduino.cc/assets/UNO-TH_Rev3e_sch.pdf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/a8dedf46-bb01-bc6e-041e-cc9a3ca5e578.png)

10kオームでプルアップされている。
ボタンを押してGNDに落としている。

う～ん。直接書き込むのはやっぱり無理そう。
proxmoxのストレージ拡張

256GBのラップトップにproxmoxをインストールしたが、60GBほどしか利用できないため、ストレージ拡張を行った。
以下コマンドを実行する。

# 拡張
```
# Check disk space before
df -h

    # Delete local-lvm storage in gui

    lvremove /dev/pve/data

    lvresize -l +100%FREE /dev/pve/root

    resize2fs /dev/mapper/pve-root

# Check disk space after
df -h
```

# proxmox側に認識させる
拡張は先述のコマンドで完了しているのだが、トランザクションIDの不一致が起きてしまうらしい。
これは以下の操作で解決できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/d487ec21-4214-62c5-7cd9-4b6ffe17c971.png)

WEB GUIのデータセンター→ストレージ→localを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/68e98ddc-2d3b-023d-6846-54d69b872681.png)

共有済:にチェックを入れOKを選択する。

これでISOの読み込みやvmのデプロイが正常に行えるはずだ。
なお、ZFSなど複数マシンでクラスタリングなどを行っている場合は正常に実行できない可能性があるので注意したい。

# 参考文献
ストレージ拡張について
https://gist.github.com/laineantti/4fc29acbbd25593619a76b413e42b78f

拡張後の設定について
https://www.lowendtalk.com/discussion/118720/proxmox-5-can-not-create-new-vm-or-ct

proxmoxのストレージ拡張とトランザクションID
https://forum.proxmox.com/threads/task-error-unable-to-create-vm-100-lvcreate-pve-vm-100-disk-0.55826/
GatsbyJSでprogressbar（プログレスバー）を簡単に表示させる２つのパターン

記事をスクロールするプログレスバーとページ遷移時のプログレスバーの２種類あります。

別々に試しに実装してみました。

## GatsbyJSのページ遷移時のプログレスバー
https://www.gatsbyjs.com/plugins/gatsby-plugin-nprogress/

Gatsby公式プラグインに gatsby-plugin-nprogress があります。

nprogressというJSライブラリをGatsbyJSでも使えるようにラップしたライブラリです。

```
npm i gatsby-plugin-nprogress
or
yarn add gatsby-plugin-nprogress
```

```gatsby-config.js
plugins: [
    {
      resolve: `gatsby-plugin-nprogress`,
      options: {
        color: `#76952F`,
        showSpinner: true,
      },
    },
]
```

これだけでページ遷移にプログラスバーを表示できるようになります。

### ページ遷移に１秒以上かかるページでないとプログレスバーが表示されない
しかし自分の作ったサービスに実装してみたところ表示されませんでした。

ライブラリのソースコードを見たところ、

```gatsby-plugin-nprogress/src/gatsby-browser.js 
省略
export const onRouteUpdateDelayed = () => {
  NProgress.start()
}
省略
```
となっていてGatsbyJS側で用意されている onRouteUpdateDelayed の実行に合わせてNProgressを読み込ませています。

そしてこの onRouteUpdateDelayed なのですが、 onRouteUpdateDelayed というローディングの遅延を監視する関数が実行されるまでに1000msかかる仕様になっているのでこれが原因のようです。

```gatsby/packages/gatsby/cache-dir/navigation.js 
省略
  const timeoutId = setTimeout(() => {
    emitter.emit(`onDelayedLoadPageResources`, { pathname })
    apiRunner(`onRouteUpdateDelayed`, {
      location: window.location,
    })
  }, 1000)
省略
```

https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby/cache-dir/navigation.js#L71-L73


１秒以下でページ遷移できたページで実行されないのは当然の結果でした。重いページで試したところ無事動作を確認。

しかし1秒未満のページ遷移が珍しくない時代なのでもっと短い遅延で読み込まれるようにしたいのでそこは不便でした。
解決策がわかる方がいればコメントもらえればなと。

## GatsbyJSのページスクロールのプログレスバー
https://www.gatsbyjs.com/plugins/gatsby-plugin-page-progress/?=progress%20page

Gatsbyコミュニティのライブラリに gatsby-plugin-page-progress がありこれを使います。

```
npm i gatsby-plugin-page-progress
or
yarn add gatsby-plugin-page-progress
```

```gatsby-config.js
    {
      resolve: "gatsby-plugin-page-progress",
      options: {
        includePaths: [{ regex: "^/elm" }, { regex: "^/worry" }, { regex: "^/blog" }, { regex: "^/about" }],
        // excludePaths: ["/elm/hoge"], // includePathsの範囲で例外のパスを指定すればそのPathだけ除外できる
        height: 3,
        prependToBody: false,
        color: `#76952F`,
        footerHeight: 500,
        headerHeight: 0,
      },
    },
```

これもとても簡単に実装できます。gatsby-config.jsへオプション指定してあげれば良いです。
includePathsはプログレスバーを表示させるPathを指定。
Pathを指定した範囲の中で例外があればexcludePathsで指定します。

自分の用途では特に問題なく使用できました。

### スター数が少ないのがネック
現時点で22スター最終更新は２ヶ月前ということでライブラリ全般の中ではあまりポピュラーではないかもしれません。

ただし、srcファイルを見た限りでは1ファイルの189行のみでwindow.locationで位置を取得しながらレンダリングする比較的にシンプルなライブラリであるため問題が起こってもフォークしてトラブルシューティングもできそうなライブラリかなとは思いました。
シーケンス図について【基本編】

こんにちは、プレイライフの熊崎です！
本日２本目の記事はシーケンス図をテーマにしようと思います。

## なぜシーケンス図をテーマに取り上げたのか？
- 言葉だけよりも図を使って説明した方が双方の認識のズレが起こりにくく、結果開発の効率化につながると考えたため。

## シーケンス図とは
> シーケンス図とは、クラスやオブジェクト間のやりとりを時間軸に沿って表現する図です。機能ごとに相互作用（Interaction）と呼ばれる下記のようなフレーム内に処理内容を記述します。

>引用元:[https://www.itsenka.com/contents/development/uml/sequence.html](https://www.itsenka.com/contents/development/uml/sequence.html)

## どんな時に使うのか？
- プログラムの処理や流れなどを設計する際に使用
- 設計書のない既存システムの分析に使用

## 書き方
以下のイベントの検索システムのフローを例に挙げる。

1. お客さんがイベント検索画面に遷移する。
2. 検索したいイベント名を入力して、検索ボタンを押す。
3. 検索システムがイベントの一覧が格納されているデータベースに問い合わせる。
4. データベースから、検索システムへ対象のイベントデータが渡される
5. 検索システムがイベント検索画面に対象のイベントデータを渡し、それが表示される。

このフローを示すシーケンス図は以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578823/745a9cd8-3e09-28b6-7fed-7c9d136028d8.png)

## シーケンス図の構成要素

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578823/c8431632-0969-8c76-19be-ad64206534ba.png)
引用元：[https://www.itsenka.com/contents/development/uml/sequence.html](https://www.itsenka.com/contents/development/uml/sequence.html)

### 補足
#### 実行仕様
> 生成されているライフラインが実行状態であることを意味します。

→ 生成されたオブジェクトで処理が起こっている状態

#### 停止
> 生成されたライフライン自体の消滅を意味します。

→ 生成されたオブジェクトで処理が行われていない状態

#### 非同期メッセージ
> 送り先のライフラインの実行に同期されないメッセージを意味します。メッセージ名には具体的な関数やINCLUDEディレクティブ等を記入します。
引用元：[https://www.itsenka.com/contents/development/uml/sequence.html](https://www.itsenka.com/contents/development/uml/sequence.html)

→ 一つのタスクを実行中に、他のタスクを実行できること。
例：メール機能など（メールが送られてから画面を表示するのではなく、メールの送信を待つことなく画面の表示が行われるため）

## 参考記事
- [https://www.itsenka.com/contents/development/uml/sequence.html](https://www.itsenka.com/contents/development/uml/sequence.html)

## 最後に
インプットしても、実際に使わないと覚えないため、日々の業務でどんどん使っていきたいと思います。
今回は構成要素など、基本的なところしか書いていないので、次回は複合フラグメントなどについてまとめます。
[02] Vagrant を使って VM「192.168.101.1」を立てる際のトラブル事例とその対策方法


|シリーズトップページ|
|:--|
|https://qiita.com/robozushi10/items/bbdcb9e3548fb5d22dcb|

# 概要

下記を実践した際のトラブルとその対策方法を記しておく.
・[[01]Vagrant を使って VM「192.168.101.1」を立てる](https://qiita.com/robozushi10/items/9b580af05646eb81c50b)


# 環境

|項目|値|
|:--|:--|
|物理PC|Ubuntu 18.04|
|VirtualBox|バージョン 5.2.42|
|Vagrant|バージョン 2.2.14|


# 事例

## 「vagrant up」を実行したところ「VBoxManage: error: Implementation of the USB 2.0 controller not found!」が発生した

### エラーログ抜粋

下記🛑がエラー部分である

```
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'CentosBox/Centos-7-v7.4-Minimal-CLI' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: 17.11.24
中略 
Command: ["startvm", "b62e9217-2a46-4ca4-84c7-67729769be25", "--type", "headless"]
 
🛑Stderr: VBoxManage: error: Implementation of the USB 2.0 controller not found!
🛑VBoxManage: error: Because the USB 2.0 controller state is part of the saved VM 🛑state, the VM cannot be started. To fix this problem, either install the 'Oracle VM VirtualBox Extension Pack' or disable USB 2.0 support in the VM settings.
VBoxManage: error: Note! This error could also mean that an incompatible version of the 'Oracle VM VirtualBox Extension Pack' is installed (VERR_NOT_FOUND)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole
```

### 対策

#### 参考にしたサイト

|URL|
|:--|
|https://qiita.com/keitakn/items/f29c9a1eaddfef2253c6|

#### 1. VirtualBox バージョンに一致した「Oracle VM VirtualBox Extension Pack」をダウンロードする

下図は VirtualBox 5.2.42 の場合である.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/5cf86fab-b4cb-c9a4-f8be-97b465bf98ec.png)

#### 2. 「Oracle_VM_VirtualBox_Extension_Pack-5.2.42.vbox-extpack」をインストールする

下図のように GUI にてダブルクリックで実行してやれば良い.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/a2fb8c1b-94ff-9e7e-3e49-73566bbc72f4.png)


#### 3. 再度 vagrant up を実行してやれば良い

```bash
$ vagrant up
```

　

以上
JXA で、クリップボードから文字列を取得する

## はじめに

　意外と検索に苦労したのと、状況によっては取得できなかったのでメモしておきます。

## 最初に見つかった方法

　最初に以下の方法が見つかりました。しかし、スクリプトエディタ上からは動作するのですが、シェルからは動作しませんでした。

```js
(() => {
    'use strict';
    let a = Application('System Events');
    a.includeStandardAdditions = true;
    return a.theClipboard();
})();
```

[JavaScript for Automation: getting the clipboard - Technical Notes](https://tech-notes.maxmasnick.com/javascript-for-automation-getting-the-clipboard)

　以下の例外が発生します。

```
osascript[19144:2059849] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM __setObject:forKey:]: object cannot be nil'
```

## シェルから動作させる方法

　仕方がないので、`doShellScript()` を使って `pbpaste` 経由でクリップボード（Paste Board）のテキストを取得しました。

```js
#!/usr/bin/osascript -l JavaScript
(() => {
    'use strict';
    var a = Application.currentApplication();
    a.includeStandardAdditions = true;
    return a.doShellScript('pbpaste');
})();
```

## 追記

　以下のコードでいけました。

```js
#!/usr/bin/osascript -l JavaScript

(() => {
    'use strict';
    var a = Application.currentApplication(),
        sa = (a.includeStandardAdditions = true, a),
        strClip = sa.theClipboard();
    console.log(strClip);
})();
```

参考：[JXA: Reading/Using Data from the Clipboard - Questions & Suggestions - Keyboard Maestro Discourse](https://forum.keyboardmaestro.com/t/jxa-reading-using-data-from-the-clipboard/3706/2)

## 環境

　以下の[環境](https://qiita.com/Tachy_Pochy/items/d5d4bf82f4e00eea1fd4)で動作確認しました。

```sh
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H1323
AppleScript version: 2.7
```
Googleシートでよく使う関数メモ


Googleシートで良く使う関数メモ（適宜改定＆追加予定）

:::note info
作業用メモなので説明は入れたり入れなかったりでゆるく追加してきます。
:::


# IF

### 複数条件のどれか１つに一致する(OR)

```sql

=IF(OR(A1="条件1", A1="条件2"), "どれかに一致する", "一致しない")

```

### 複数条件全てに一致する(AND)

```sql

=IF(AND(A1="条件1", A1="条件2"), "全て一致する", "どれか一致しない")

```


# VLOOKUP

### 一致する情報を検索して表示する

```sql

=vlookup(A1, $B$1:$C$10, 2, false)

```

A1セルの内容が、B1~B10の内容と一致していれば、一致しているC1~C10の内容を表示する
Excel時代から最も使える関数でしたが、たくさんvlookup仕込むとシートが重くなる点がネック。


# UNIQUE

### 重複データの排除

```sql

=unique(A:A)

```
A列全ての項目から重複項目を除外したリストを取得表示する(SQLだと、Distinctのこと）
googleシートでは対象項目のリストとかを抽出するのによく使います

# SUBTOTAL

### 表示されている値の集計（フィルタで絞った内容を反映させる集計関数）

```sql

=subtotal(9, A2:A1000)

```
A2からA1000の値の合計値を出す
一般的にはSUM関数を使うと思いますが、フィルタで絞った時の値を確認するにはSUBTOTALが便利なので、個人的にはこちらを使うことが多いです。

１つ目の引数を変更すると平均値なども出せる

| 引数| １ | ２ | 3 | 4 | 5 | 9 |
|:------|-------:|:-------:|:-------:|:-------:|:-------:|:-------:|
| 集計方法| 平均  | 数値の個数 | データの個数 | 最大| 最小 | 合計 |


# SUMIFS

### 条件一致した値のみの合計値を算出する

```sql

=sumifs(A2:A1000, B2:B1000, "1")

```
A2からA1000の範囲に対して、B2:B1000に1が入っている項目のみの合計値を出す


# AVERAGEIFS

### 条件一致した値のみの平均値を算出する

```sql

=averageifs(A2:A1000, B2:B1000, "1")

```

A2からA1000の範囲に対して、B2:B1000に1が入っている項目のみの平均値を出す


# IMPORTRANGE

### 他のGoogleシートの値を取得する

```sql

=importrange("https://docs.google.com/spreadsheets/d/{googleシートのID情報}", "{シート名}!A:D")
 
```
他のGoogleシートの特定情報を取得する（リンクを貼る）
データベースなどからGoogleシートに値を持ってくる場合、一意性を保つため（誰かがシートを消したりする可能性がある）に、importrangeで他シートから値を引っ張ってくる場合などに利用します。

GCPなどを利用しているとgoogleシート接続が楽チンで、誰でもアクセスしやすい。というメリットがある反面、複数担当者がシート上のデータを触ることになる為、誤って削除する。などの事件もやや起きやすい為、データベースと直接接続するシートと作業用シートは権限を分けて別管理しておく方がやや安全です。

Googleシートは履歴管理されている為、復旧自体は楽てはありますが、対象シートが増えてくると一定の手間になるので。


# ROW

### 行番号を自動採番する

```sql

=row()-1 

```

row関数で対称行が何行目か？がわかるのでそこからヘッダーなどの行数を引いてあげると自動で番号が取得可能


# COLUMN

### 列番号を自動採番する

```sql

=column()-1 

```

row関数で対称列が何列目か？がわかるのでそこからヘッダーなどの行数を引いてあげると自動で番号が取得可能


# IFERROR

### 関数にエラーが発生した場合に表示する値を設定する

```sql

=iferror( if(A1=1, A1*B1, 0), 2) 

```

上記では、A1セルに1が入っている場合、A1*B1の値を表示、それ以外は0を表示というIF文が入っているが、B1に数字以外の項目が入っていた場合は、エラーとなり#VALUE!というエラーが発生するが、iferrorで囲っておくことで、エラーが発生した場合は2を表示する。という形になる。
結構データの量が多くなるとこう言ったエラーも発生するため、個人的には利用頻度が高い関数です。

# COUNTIF

### 条件にあった行をカウントする

```sql

# A1:A10のセルに1が入っていたらカウントする
=countif(A1:A10, 1)

# A1:A10のセルにスペースが入っていたらカウントする
=countif(A1:A10, "")

# A1:A10のセルにスペースが入っていなかったらカウントする(not=的な使い方）
=countif(A1:A10, "<>")


```

# 日付関数

### 日付の操作（色々）

```sql

# 本日の日付を取得
= today()

# 日付から年を取得
=year(today())

# 日付から月取得
=month(today())

# 日付から日を取得
=day(today())

# 日付から来月同日を取得
=edate(today(),1)

# 日付から前月同日を取得
=edate(today(),-1)

# 日付から1年後の同日を取得
=edate(today(),12)

#日付から今月末を取得
=eomonth(today(),0)

#日付から来月末を取得
=eomonth(today(),1)

#日付から前月末を取得
=eomonth(today(),-1)

```
【圧縮？】JavaScript で正の整数を文字列に符号化・復号【パスワード生成？】

~~※本記事にはバグが含まれており、現在記事の修正中です。
詳細はコメント欄をご確認ください。~~
修正しました。
また、本記事より要領の良いコードをコメントにて投稿いただいています。ぜひそちらもご覧ください。

## 英数小文字だけ(36進数相当)

これがよくあるパターン。

```js
console.log(106832262987743896n.toString(36));
// => "t7wvk33m1zs"

// パスワード向けに下８文字だけ採用する
console.log(106832262987743896n.toString(36).slice(-8));
// => "vk33m1zs"
```

## 英数大文字と小文字(62進数相当)

大文字を混ぜるので、ちょっと面倒なことをしています。

```js
/**
 * 10進数の文字列を62進数の文字列に符号化
 * @param {string} id 10進数の文字列
 * @returns {string}
 */
function encode(id) {
    let n = BigInt(id);
    let result = '';
    let surplus = 0n;

    while (n > 0) {
        surplus = n % 62n;
        result += surplus < 36n ? surplus.toString(36) : (surplus - 26n).toString(36).toUpperCase();
        n /= 62n;
    }
    return result;
}

/**
 * 62進数の文字列を10進数の文字列に復号
 * @param {string} id 符号化した文字列
 * @returns {string}
 */
function decode(id) {
    let power = 0;
    let char;
    let result = 0n;
    let num = 0;

    // id 文字列が空になるまでループ
    while (id) {
        char = id.slice(0, 1);  // 先頭から一文字取得
        id = id.slice(1);       // 先頭の一文字を削除
        if (/[A-Z]/.test(char)) {
            // 大文字の場合、parseInt()で計算できる様に数字を整形する
            num = parseInt(char.toLowerCase(), 36) + 26;
        } else {
            // 小文字や数字の場合は普通に parseInt()
            num = parseInt(char, 36);
        }
        result += BigInt(num * Math.pow(62, power));
        power++;  // 一つ上の桁を計算する
    }
    return result;
}

console.log(encode('106832262987743896'));
// => "axyFLT9iT7"
console.log(decode(encode('106832262987743896')));
// => 106832262987743896n
console.log(encode('106832262987743896').slice(-8));
// => "yFLT9iT7"
```

これだけ頑張っても上の簡単バージョンに比べて10%程度しか短くならないので、あまり活用されることはないかも…
【Git】【Server Starter】Gitによるデータ復旧の方法

本記事はMinecraft JEのサーバー管理システムであるServer Starterの連載記事として執筆しています。
一部ShareWorldなど特殊な単語を用いていますが、興味のある方は[こちら](https://qiita.com/CivilTT/items/a59d9be7cea50d60a666)も見て頂けると嬉しいです。

# 大前提
Gitではレポジトリ内において変更を行った場合、`commit`と呼ばれる作業を行うことにより、変更を保存しておくことができます。
このため、各変更を保存したcommitのタイミングまでデータを戻すことも可能であり、branchの機能と合わせて、共同開発などで多く利用されています。

しかし、当然のことながらGitは<b>commitしたところを区切りとしてしか戻すことはできない</b>ことになっています。
変更を行ってもしばらくcommitしていなかった場合は希望の時点に戻すことは難しいかもしれません。

# 復旧先を確認
レポジトリ（今回はShareWorldとします）が含まれているフォルダにカレントディレクトリを移動します。
その後、レポジトリを最新の状態にするためにリモートレポジトリを活用している方は`pull`をしておきます

~~~
cd ..../ShareWorld (絶対パス or 相対パスで指定します)
git pull
~~~

`git log`と打つことにより今までのcommit一覧が表示されるため、戻したいcommitのcommit番号（`b977060fa95590dd74222b81cef5332a0128d49b`のように書かれているところ）をメモ（コピーする）

~~~
$> git log

commit b977060fa95590dd74222b81cef5332a0128d49b (HEAD -> master)
Author: UserName <E-mail Address>
Date:   Mon Jan 1 00:00:00 0000 +0900

    --Commit Message--

commit 98f895cbca9e92262a8fadb72109d06ee332141c
Author: UserName <E-mail Address>
Date:   Thu Jan 2 00:00:00 0000 +0900

    --Commit Message--
:
~~~

# 実際に元のデータを取得してみる
下準備は終わったため、実際にかつてのcommit時点にデータを復旧してみる。
最新のレポジトリデータを保持しておき、復旧データと比較する場合は、レポジトリフォルダを別名でコピーしておき、そのコピー先のフォルダ内で復旧作業をするようにしてください。

>branchを使いこなせるGit上級者の方はこんなことをする必要はありませんが、初心者の方は着実な作業のためにコピーしておくことをお勧めします。

復旧作業をするフォルダにカレントディレクトリを設定したのち、以下のコマンドを打ち込み、データを復旧してみます。

~~~
git checkout (調べたcommit番号) 
git checkout master <------------ これは元のレポジトリでそのまま復旧作業を行っている場合は打つ必要のあるコマンド
~~~

<details>
<summary>細かいコマンドの内容が知りたい方はクリックしてください。</summary>
<div>
`git checkout`はbranchを変更することができるコマンドです。

今回はレポジトリ内でbranchをもとのブランチから一度抜けて復旧データのbranchを新規作成しています。
新規作成した復旧データが入っているbranchで作業を続けるわけではない場合、そのbranchに居続ける必要性はないため、mainのbranchに戻るコマンドを打ち込んでいます。

そのため、branchを使いこなすことができる場合は復旧データからの編集とメインの編集を並行して行い、区切りの良いところでbranchを統合するといった使い方も可能ですが、そちらはこの記事の趣旨とは離れるため、ここでは触れません。
</div>
</summary>
</details>

コマンドを打ち込んだのちに、フォルダを確認して、データが元に戻っていれば成功です。

# 復旧データを反映する
復旧データを活用して元の最新データを編集した場合、その変更を保存しておく必要があります。
以下のコマンドを入力して、変更を保存しておきましょう。
`git push`はリモートレポジトリを使用している方のみ入力の必要があります。

~~~
git add -A
git commit -m "Commit Message"
git push
~~~

最後に`git status`と入力して、特にエラーが生じていなければ、作業終了です。
[01] Vagrant を使って VM「192.168.101.1」を立てる


|シリーズトップページ|
|:--|
|https://qiita.com/robozushi10/items/bbdcb9e3548fb5d22dcb|

# 概要

仮想PC (以降「VM」) が 1台必要になった場合に、Vagrant + VirtualBox を使って
VM「192.168.101.1」を立てるための手順である.

なお、VM の OS は Linux を想定しており、ここでは「`Centos-7-v7.4-Minimal-CLI`」を使う.

# 環境

## 物理PC

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

# 前提条件

次の (a)(b) の両方を満たしていること.
(a) 物理PC 上に VirtualBox と Vagrant がインストール済みであること.
(b) Vagrant を使って VirtualBox の操作ができること.


# 手順

## 1. Vagrantfile を作成する

https://app.vagrantup.com/CentosBox/boxes/Centos-7-v7.4-Minimal-CLI より、
下図の要領で「Centos-7-v7.4-Minimal-CLI」の雛形となる Vagrantfile を入手する.

なお、VM へのログインIDとパスワードも「`vagrant`」と記されている.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/2a3b6a00-5ea2-e6bf-3567-328c3544d140.png)

### 雛形

```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "CentosBox/Centos-7-v7.4-Minimal-CLI"
  config.vm.box_version = "17.11.24"
end
```

## 2. Vagrantfile に今回構築したい VM「192.168.101.1」を定義する

下記 🛑 の一行を追加してやる.

```ruby
#! https://app.vagrantup.com/CentosBox/boxes/Centos-7-v7.4-Minimal-CLI
Vagrant.configure("2") do |config|
  config.vm.box = "CentosBox/Centos-7-v7.4-Minimal-CLI"
  config.vm.box_version = "17.11.24"
  config.vm.network :private_network, ip:"192.168.101.1" #🛑
end
```

## 3. VM を稼働させる

```bash
$ vagrant up
```

## 4. VM が稼働確認をする

### vagrant status 

running 状態であることを確認する

```bash
$ vagrant status
Current machine states:
 
default                   running (virtualbox)
```

### vagrant ssh <VM>

SSH 接続できることを確認する

```bash
$ vagrant ssh default
Last login: Thu Jul 27 18:09:11 2017
```

### VM の IP が「192.168.101.1」であることを確認する

下記 🛑 より 192.168.101.1 となっている.

```bash
[vagrant@localhost ~]$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:35:6a:97 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 86307sec preferred_lft 86307sec
    inet6 fe80::79d6:bb5c:24d0:ec1a/64 scope link 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:28:9e:89 brd ff:ff:ff:ff:ff:ff
    inet 192.168.101.1/24 🛑 brd 192.168.101.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe28:9e89/64 scope link 
       valid_lft forever preferred_lft forever
```

　

以上
企業でリッチなパソコンを買ってもらうために（総務に届け、現場の声）

早い話が文明の利器があるんだからガンガン楽をしましょうよ
洗濯板で洗濯物を洗う時代は終わりましたよってこと

##背景
ほとんどの企業（弊社だけ？）は10万円以上のパソコンを買いたがりません。
事業として何かを購入すると減価償却資産として扱う必要があります。
減価償却資産は購入金額に応じて経費の計上に違いが出ます。
10万円以上だと消耗品として扱われなくなるので固定資産税もかかってくる。

まとめるとこんな感じか。

購入金額 | 固定資産税の有無 | 償却期間
---|:-:|---
1円以上かつ10万円未満    | 無 | １回。少額減価償却資産。
10万円以上              | 有 | 耐用年数分。減価償却資産。
10万円以上かつ20万円未満 | 無 | 耐用年数に関わらず３年。一括償却資産。
10万円以上かつ30万円未満 | 無（よね?） | １回。少額減価償却資産の特例。
リース                  | 無 | リース期間で配分する。リース資産。

経費＝損金なので法人税に影響する話です。
法人税に影響するってことは決算書にも影響しますね。

それぞれの用語や詳細は下記参照

- [固定資産税（償却資産）｜税金の種類｜東京都主税局](https://www.tax.metro.tokyo.lg.jp/shisan/shokyak_sis.html)
- [No.2100 減価償却のあらまし｜国税庁](https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/2100.htm)
- [法人税｜国税庁](https://www.nta.go.jp/taxes/shiraberu/taxanswer/hojin/houjin.htm)

つまり、10万円以上のパソコンを買うと事務手続きが増えるのです。
とはいえ前線で作業するエンジニアが10万円未満のパソコンで満足できるわけ無いですよね。

総務からしたら、仕事が増えるから10万円以上のパソコンを買いたくない。
現場からしたら、仕事で楽したいから10万円以上のパソコンを買ってほしい。
完全に対立関係にあるわけですよ。
（政府はこの対立を見てニヤニヤしているに違いない！）

##それぞれのメリット・デメリットを考えていこう
総務に納得してもらうにはそれ相応の材料が必要でしょ。

###10万円以上のパソコンを買うメリットを考える
- エクセルをはじめとしたOffice製品がフリーズすることなく使える
- 開発環境（VMwareやVirtualBox、Docker)がぬるぬる動く
- eclipseを始めとしたエディタのコード補完機能が使える
- コンパイル、ビルド時間だって短縮できるぞ！

###10万円以上のパソコンを買うデメリットを考える
- 資産管理が煩雑になる（1回で済む減価償却を複数回に渡って行うことになる）

複数回の減価償却で何が起きるのか？

- 固定資産税の再計算
- 来期以降の法人税の再計算
- 来期以降の決算書の再計算

来期以降の書類って再計算することありますか？

###10万円未満のパソコンを買うメリットを考える
- 資産管理が楽
- 消耗品扱いなので多少雑に扱っても怒られない（諸説あり）

###10万円未満のパソコンを買うデメリットを考える
- 10万円以上のパソコンを買うメリットを考える で述べたことと真逆のことが言える
- 10万円未満という予算でなるべく高スペックのパソコンを探さないといけない
- 型落ちモデルやエントリーモデル、ノーブランドだったりで動作が安定しない

https://qiita.com/DandyMania/items/2c44481f03f4d08a24ea

要するにシームレスな作業以前にストレスフリーな作業さえままならない

###総務の言うめんどくさいが何かを考える
- 10万円未満の場合
    1. パソコンを買いました。
    1. 購入金額をそのまま全額計上します。解放されます。

- 10万円以上の場合
    1. パソコンを買いました。耐用年数はパソコンなので4です。
    1. 購入金額を4で割ります。
    1. 購入した年に1/4を計上します。
    1. 翌年に1/4を計上します。
    1. 翌々年に1/4を計上します。
    1. 翌々々年に1/4を計上します。解放されます。

たしかにめんどくさい。4年間覚えておかないといけない。

##総務へ伝えたいこと
- 青色申告、減価償却が管理できるシステムを買いましょう
    - 人間が備品をいつ・いくらで買ったかを覚える必要はないですよね
    - 他の大事な仕事（直接部門の視察や設備点検等）に注力できます
- 会社全体で見ると利益になります
    - フリーズ、動作が重い、ビルドに時間がかかる。<br>
      これらの時間はパソコン側のボトルネックにあります。<br>
      この時間、実は人間は働いていません（って書くと語弊はあるけど）<br>
      1回1回は短時間でも年単位で積み上げたら意外と大きいものです。
    - 低予算高スペックのパソコンを探す時間も馬鹿になりません。<br>
      スペックを詳細に調べて他のパソコンと比較してませんか？<br>
      実はこの時間も削れます。<br>
      10万円以上のパソコンなら適当に買ってもだいたい問題ないですからね。
    - 10万円未満のパソコンってすぐ壊れたりしません？<br>
      さすがに消耗品だからって雑に扱う奴はおらんとおもうけど……<br>
      高いやつはだいたい高耐久！買い替えも減らせます。
    - 実は10万円以上のパソコンでも特例により1回の減価償却で捌けます。<br>
        ※30万円未満でかつ合計で300万円以内、<br>
          さらに令和4年3月までと限定されているので注意
- リースという選択肢も忘れずに（戒め）
    - レンタルビデオ屋とか同じで、購入するより安い。
    - ↓ここより上手にまとめられる気がしないので詳しくはこちらを

https://biz.moneyforward.com/accounting/basic/53550/

##それでも総務が動かないなら
他SNS上で言われたことをここに記載

>現環境を説得/改善するよりも最初から当たり前となっている環境に行けば良いじゃん

ぐうの音も出ない、総務を説得するより転職したほうが（おそらく）省エネ。

---

2021.10.27 追記
転職することになりました。
面接時にPCにかける費用についても聞けたので良いきっかけとなりました。
多分91日後に基本情報技術者試験を受けるFラン文系既卒(2日目)

# コンピュータの5大装置
* コンピュータの5大装置とは?
 * 中央処理装置(CPU)
 * 主記憶装置
 * 補助記憶装置
 * 入力装置
 * 出力装置

# レジスタ
* レジスタの種類
 * プログラムカウンタ
 * 命令レジスタ
 * インデックスレジスタ
 * ベースレジスタ
 * アキュームレータ
 * 汎用レジスタ

# 命令実行手順
* 命令の取り出し
* 命令の解読
* 対象データ読み出し
* 命令実行

# 即値アドレス指定方式 
* 測地アドレス指定方法とは?
* オペランドの部に対象となるデータそのものが入っている方式

# 直接アドレス指定方式
* 直接アドレス指定方式とは?
 * オペランド部に記載してあるアドレスが、そのまま実行アドレスとして使える方式

# 間接アドレス指定方式
* 間接アドレス指定方式とは?
 * オペランド部に主記憶のアドレスが書いてある

# インデックスアドレス指定方式
* インデックスアドレス指定方式とは? 
 * オペランド部の値に、インデックスレジスタ値の加算をすることで実行アドレスを求める方式

# ベースアドレス指定方式
* ベースアドレス指定方式とは?
 * オペランド部の値に、ベースレジスタの値を加算することで実行アドレスを求める方式

# 相対アドレス指定方式
* 相対アドレス指定方式とは?
 * オペランド部の値に、プログラムカウンタの値を加算して、実行アドレスを求める方式

# クロック周波数
* クロック周波数とは?
 * クロックが一秒間に繰り返される回数のこと

# CPI(Clock cycle Instruction)
* CPIとは?
 * 1つの命令あたりに何クロックサイクルが必要かを示す値

# MIPS(Million Instruction Per Second)
* MIPSとは?
 * 一秒間に実行できる命令の数

# 命令ミックス
* 命令ミックスとは？
 * 良く使われる命令をセットにして、それらの頻度を考慮した上で、まとめて計算すること

# パイプライン処理
* パイプライン処理とは?
 * 複数の命令を並行して行うこと

# 分岐ハザード
* 分岐ハザードとは?
 * パイプライン処理の際に、分岐処理などがあると、先読みが無駄になること

# 分岐予測
* 分岐予測とは?
 * 分岐ハザードが発生しないように、予測して分岐処理を行うこと

# 投機実行
* 投機実行とは?
 * 分岐予測後の実行のこと

# スーパーパイプライン
* スーパーパイプラインとは?
 * パイプライン処理の分割をさらに分割し、それらを並行実行すること

# スーパスカラ
* スーパスカラとは?
 * パイプライン処理できる回路を複数持たせ、全く同じ処理を同時に実行できること

# CISC(Complex Instruction Set Computer)
* CISCとは?
 * CPUに高度な命令を持たせることで、一つの命令で複雑な処理を実現させるアーキテクチャ

# RISC(Redundant Instruction Set Computer)
* RISCとは?
 * CPU内に単純な命令しか命令しか持たない代わりに、それらをハードウェアのみで実装して、一つ一つの命令を高速に処理するアーキテクチャ

# RAM(Random Access Memory)
* RAMとは?
 * 揮発性
 * 読み書き可能
* RAMの種類 
 * DRAM
 * SRAM 

# ROM(Read Only Memory)
* ROMとは?
 * 不揮発性 
 * 基本的に読み出しだけが可能
* ROMの種類
 * マスクROM
 * PROM(Programmable ROM)
 * EPROM(Erasable PROM)
 * EEPROM(Electrically EPROM)
 * フラッシュメモリ

# キャッシュメモリ
* キャッシュメモリとは?
 * CPUとメモリの速度のギャップを埋める装置

# ディスクキャッシュ
* ディスクキャッシュとは?
 * メモリと補助記憶装置の速度のギャップを埋める

# ライトスルー方式
* ライトスルー方式とは?
 * キャッシュメモリと主記憶装置に同時に書き込む方式

# ライトバック方式
* ライトバック方式とは?
 * 基本キャッシュメモリにしか書き込まない
 * キャッシュメモリから溢れたものを主記憶装置に書き込む

# ヒット率
* ヒット率とは?
 * 欲しいデータがキャッシュメモリに入っている確率

# 実行アクセス時間
* 実行アクセス時間とは？
 * キャッシュメモリを使ったコンピュータのアクセス時間

# メモリインタリーブ
* メモリインタリーブとは?
 * 主記憶装置へのアクセスを高速化する手法の一つ
 * 主記憶メモリ内を分割して、それらを並行して取得する手法
AWS VPC Prefix Listのサイズが変更可能に

## 背景
- 2020年6月29日に、VPC Prefix List(以下、単にプレフィックスリストとします)がリリースされました。詳細は割愛しますが、プレフィックスリストでは、複数のCIDRブロックをリストとして管理することができます。
  - [プレフィックスリストの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/managed-prefix-lists.html "プレフィックスリスト")
- このプレフィックスリストですが、1つのプレフィックスリストに対して、「何個のCIDRブロックを登録可能か」を表すサイズは、実はプレフィックスリスト作成時のみ設定可能であり、作成後には変更できませんでした。この度、この`サイズを変更可能となりましたので、試してみました`(下記ブログ参照)
    - [Blog:Amazon Virtual Private Cloud (VPC) customers can now resize their prefix lis](https://aws.amazon.com/jp/about-aws/whats-new/2021/08/amazon-vpc-resize-prefix-list/ "Amazon Virtual Private Cloud (VPC) customers can now resize their prefix lis")

## 手順
### プレフィックスリストを作成する

まずは[手順](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-managed-prefix-lists.html#create-managed-prefix-list "Create a prefix list")を参考にして、プレフィックスリストを作成します

1. VPCのマネージメントコンソールを開きます
    - 利用リージョンは、東京リージョン(ap-northeast-1)です
1. 左側のメニューよりマネージドプレフィックスリストを選択します
1. 画面右上の[プレフィックスリストを作成]を押下します
1. 今回は、以下の値をそれぞれ設定しました。その後、[プレフィックスリストの作成]を押下して、作成を完了します
    - プレフィックス名: TestPrefixList
    - 最大エントリ: 20
    - アドレスファミリー: IPv4(デフォルト値)
    - プレフィックスリストのエントリ(下表)

| CIDRブロック | 説明 |
|:-:|:-:|
| 10.0.0.0/24  | Main Branch  |
|  10.0.1.0/24 | 2nd Branch  |
|  10.0.2.0/24 | 3rd Branch  |

#### 作成後の画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946407/f42ebd88-68bd-6e0b-6b69-1454c4f72ef3.png)


### プレフィックスリストのサイズを変更する
- 執筆時点(2021/08/28)では、`マネージメントコンソール上では、まだ、プレフィックスリストのサイズを変更することはできない`ようです
- AWS CLIのドキュメントを確認したら、バージョン2.2.33において、プレフィックスリストのサイズ変更をサポートした旨の記述（下記）がありました
    - `api-change:ec2: Support added for resizing VPC prefix lists`
    - [aws-cliのCHANGELOG](https://github.com/aws/aws-cli/blob/v2/CHANGELOG.rst "CHANGELOG")
- プレフィックスリスト変更用のコマンドである[modify-managed-prefix-list](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-managed-prefix-list.html "modify-managed-prefix-list")の説明を確認したところ、`--max-entries <value>`というコマンドオプションが追加されていることを確認しました
- aws-cliのバージョンを最新化しました

```
% aws --version
aws-cli/2.2.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off
```

- modify-managed-prefix-listコマンドを実行しました

```
% aws ec2 modify-managed-prefix-list --prefix-list-id pl-07e68***** --max-entries 30
{
    "PrefixList": {
        "PrefixListId": "pl-07e68*****",
        "AddressFamily": "IPv4",
        "State": "modify-in-progress",
        "StateMessage": "Attempting to modify maximum entries from (20) to (30).",
        "PrefixListArn": "arn:aws:ec2:ap-northeast-1:*****:prefix-list/pl-07e68*****",
        "PrefixListName": "TestPrefixList",
        "MaxEntries": 20,
        "Version": 1,
        "OwnerId": "*****"
    }
}
```

- コマンド実行後、マネージメントコンソールにて、再度、プレフィックスリストを見たところ、正常に変更されていることを確認できました!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946407/6841f539-e410-c2c2-756e-afee0c728204.png)


# まとめ
今回は、プレフィックスリストのサイズ変更の方法を紹介いたしました。プレフィックスリストを作成する際に、従来はサイズ変更が出来なかったために、慎重に検討してからプレフィックスリストを作成する必要がありました。この機能により、今後はもっと気軽にプレフィックスリストを作成できるようになる、と考えます。
pythonのライブラリにある関数の説明を日本語で見る

#pythonのライブラリにある関数の説明を日本語で見る

pythonのライブラリにある関数の説明を日本語で見れるようにするための関数を作ってみました。手順としては次の３段階です。

1.　ライブラリの関数が入っているpythonコードにアクセス。
2. 関数の説明部分だけ引っ張り出す。
3. google翻訳を使って翻訳

ライブラリとしては、sysとgoogle翻訳を使うためにgoogletransを使います。

ライブラリの関数が入っている場所はpythonのフォルダのあるところなので、そこはsys.pathで確認できます。

google翻訳のライブラリは、普通にpip install googletransとやっても実行時にエラーが出ることがでるので、下記リンクを参考に

pip install googletrans==4.0.0-rc1

でインストールしました。

https://qiita.com/_yushuu/items/83c51e29771530646659

プログラムは下記になります。
たとえば、numpyで逆行列を計算するnumpy.linalg.invの説明を見たいときはgetfuncinfo("numpy.linalg.inv")で呼び出します。




``` python
import sys
from googletrans import Translator

def getfuncinfo(tarfunc):
    tarfuncs=tarfunc.split(".")
    
    #フォルダ名はsys.pathで出てくる3番目のものがpythonのフォルダまでを示したものだったのでそれを使う
    f=open(sys.path[2]+"/site-packages/"+tarfuncs[0]+"/"+tarfuncs[1]+"/"+tarfuncs[1]+".py")
    funcn=tarfuncs[2]

    #ここで.pyファイルから指定の関数を定義している範囲だけ取り出す
    lines=f.read()
    posi = lines.find("def "+funcn+"(")
    if posi<0:
        posi = lines.find("def "+funcn+" (")
    lines1=lines[posi:]

    posi2=lines1[10:].find("def ")
    lines2=lines1[:posi2]
    #関数のあと"""で囲われた部分が関数の説明になるので、その範囲の文章を取り出してgoogle翻訳で翻訳する
    if lines2.find('"""')>=0:
        funcd=lines2.split('"""')[1]
        jfuncd=entoja(funcd)
        return(jfuncd)   

#google翻訳を使って日本語に翻訳
def entoja(lines):
    translator = Translator()
    translated = translator.translate(lines, dest="ja");
    return(translated.text)

tarfunc="numpy.linalg.inv"
jfuncd=getfuncinfo(tarfunc)
print(jfuncd)

```

linalgの関数のありかが下記であることがわかったため上記のプログラムで取り出せました。

/python3.8/site-packages/numpy/linalg/linalg.py

フォルダをかまさない他の関数などはどこにアクセスするかなどおいおい調べながら更新していきます。どのファイルにアクセスされているかなどの知識が不十分なので、アドバイスなどコメントでいただけると、適宜改善しながら更新していきます。
Reactを基本からまとめてみた【4】【Component（コンポーネント）】

##はじめに
####学習するに至った経緯
2020年より、未経験からエンジニアへの転職を目指し、某プログラミングスクールへ通う。入学後、『Ruby』を未経験から学ぶ人が多いのと『Ruby』の求人が思っていた以上に少ないので、卒業後、フロントエンドのエンジニアを目指す事に。
Reactの学習した事を言語化し、認識の深化による備忘録として記載。

##JSXとは
Facebook社が開発したJavaScriptの拡張構文。
jsファイル上で、ほぼHTMLと同じ記述ができる。

##Componentとは
再利用可能なUI部品のこと。
UI（User InterFace)とは、ユーザとサービスの接触面の役割で、Webサービスにおいてユーザの目に触れる部分。※ 具体例：ボタン・入力フォーム・検索結果一覧

##Componentのメリット
- 部品化することで、様々な所で再利用ができる
- 出来上がっているComponentを当てはめるだけ
- コードの記述量が減る
- 効率よくフロントエンド開発が行える

##Componentの種類
####1. Class Component
(1)　state
(2)　props
(3)　lifecycle

####2. Functional Component
(1) props
(2) 余計な情報を付加させない
(3) Hooks
① state
② lifecycle
③ 最近はHooksを使ったFunctional Componentが主流

##実際にコーディング

(1)デフォルトファイルの削除
(2)App.js作成

```App.js
import React from "react";

const App = () => {
  return (
    <div>
      <div>App</div>
    </div>
  );
};
export default App;
```
(3)index.js作成

```index.js
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

ReactDOM.render(<App />, document.querySelector("#root"));
```

(4)semantic-uiの導入
『semantic-ui』とは、CSSのフレームワークで、指定されたクラス名を記述。
 CSSを記述せずに綺麗なUIを作成できる。

① semantic-ui-cdn　のhttps://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css　をコピー

② index.htmlへ貼り付ける

(5)Button.jsの作成
① Button.jsの作成

```App.js
import React from "react";
import Button from "./Button";

const App = () => {
  return (
    <div>
      <div>App</div>
      <Button />
    </div>
  );
};
export default App;
```

```Button.js
import React from "react";

const Button = () => {
  return (
    <div>
      <div>Button</div>
    </div>
  );
};
export default Button;
```
② Semantic UIの導入
 Semantic UI　⇨ Menu ⇨　Elements ⇨ Button　

Basic
A basic button is less pronouncedをコピーして、
Button.jsの中身を置き換える。

```Button.js
mport React from "react";

const Button = () => {
  return (
    <button className="ui basic button">
      <i className="icon user" />
      Add Friend
    </button>
  );
};
export default Button;
```
```App.js
import React from "react";
import Button from "./Button";

const App = () => {
  return (
    <div>
      <div>App</div>
      <Button />
      <Button />
      <Button />
      <Button />
      <Button />
      <Button />
    </div>
  );
};
export default App;
```


##参考サイト
[【React入門】#4 Component（コンポーネント）の理解]
(https://www.youtube.com/watch?v=mjrNtEIk5Fs&t=759s)
Rails6でSNS認証が急に使えなくなったケース

#はじめに
右も左もわからない未経験エンジニアが書く記事です。
膨大な勉強量の中で、気になったことや発見などを書いていこうと思います。

間違いなど御座いましたら、教えて頂けると幸いです:bow:

#開発環境
Rails 6.1.3.2
webpacker (5.4.0)
webpack 4.46.0
ruby 2.5.1
Docker version 20.10.6
devise (4.8.0)

#今回の内容
Deviseでwebアプリにゲストログイン機能、SNS認証機能を導入し開発を進めていた時
認証されなくなりました（ログイン画面に行くだけで、実際にはログインされない状態）

Deviseのログイン画面からログインを試みるも、エラー発生
が、ブラウザの戻るボタンを押すとログインされている。。。

webアプリ内の機能を色々試してみましたが、ログイン関係とユーザーや記事の削除のみ
使用できなくなっていました

ゲストログイン機能やSNS認証機能関連のコードを変更したわけでもなく
なぜ！？っとびっくりしたのでメモ

#原因
:::note alert
app/javascript/packs/application.js内の記述ミス
:::

```js:javascript/packs/application.js
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"
import "jquery"
import "bootstrap"
import "@fortawesome/fontawesome-free/js/all"
import "../stylesheets/application.scss"
import "../stylesheets/homu.scss" // 記述ミス箇所 正しくはhome.scss
            ・
            ・
            ・
Rails.start()
Turbolinks.start()
ActiveStorage.start()
```

# 発生したエラー文

```:log/development.log
[Webpacker] Compiling...
[Webpacker] Compilation failed:
Hash: ・・・・・・
Version: webpack 4.46.0
Time: 52423ms
Built at: 08/10/2021 9:28:28 AM
            ・
            ・
            ・
ERROR in ./app/javascript/packs/application.js
Module not found: Error: Can't resolve 'homu' in '/app/app/javascript/packs'
 @ ./app/javascript/packs/application.js 19:0-20
            ・
            ・
            ・
```

#何が起きたのか
上記エラー文を見ればわかりますが、
./app/javascript/packs/application.js内で
moduleが見つからずhomuを処理できませんとのこと

つまり用意したhome.scssではなく、homu.scssをimportしてね！と指示してしまっているので
webpackerが「そんなファイルないよ〜:joy:」と嘆いている状態だと考えています笑

それによりwebpackerのコンパイルが失敗し、エラー箇所で処理が止まってしまい
その後のコードが読み込まれていませんでした

webpackerについてはこちら

https://railsguides.jp/webpacker.html

今回注目すべき部分は以下３点

```js:
import Rails from "@rails/ujs"
        ・
import "../stylesheets/homu.scss" // 記述ミス箇所 正しくはhome.scss
        ・
Rails.start()
```

エラー箇所よりも先で待つ Rails.start() が処理されないせいで
@rails/ujsが読まれなくなってしまった

という事は、importしているファイルでエラーが発生した場合も@rails/ujsが読まれなくなり
正常に表示されなくなります。

例えば、cssファイルのタイポや記述ミスにより同様の症状が現れます。

webpackerを使って開発中に
「急にデザインが崩れた！」とか
「急にシステムが正常に働かなくなった！」など
焦らずにチェックを行いましょう♪

# rails/ujsとは
UJS: Unobtrusive（控えめな）JavaScript

詳しくは下記リンクをお読みください:smile:

https://railsguides.jp/working_with_javascript_in_rails.html

例えばform_withでは、デフォルトでAjaxをフォームで使えることが前提であり
それをサポートしてくれているのがrails/ujsだと考えています

そのrails/ujsが読まれないことでログインと削除機能が使えなくなったのだと思います

下記サイトがとても参考になりました！
ありがというございます:bow:

https://www.inodev.jp/entry/2019/12/03/234210


#最後に
勉強を始めたばかりで知識もなく、拙い文章ですがアウトプットすることで頭の中を整理しつつ、どなたかのお役に立てれば良いなと思い投稿させて頂きました。
最後まで見て頂きありがとうございました！
【A/Bテスト】再実験を行なった場合のp値の扱い【フィッシャーの方法】


## 概要
「A/Bテスト実践ガイド」という本を読んだ。
複数回同じ実験を行なった場合のp値の式が載っていたがよくわからなかったので調べながらまとめる。

## p値とは
**帰無仮説が正しいとした時にその事象がどれくらいの確率で起きるか**である。
例えばA/Bテストで介入群とコントロール群の比較を行っているとする。
介入群がコントロール群よりも強いかどうかが知りたい。

この時、帰無仮説として「二つの群で有意差がない」とおく。

例えば実験の結果介入群の結果がコントロール群よりも良く、p値が0.05よりも小さかったとする。
これは「有意差がない」と仮定したときに"たまたま"このような結果が起きる確率が5%より小さいということだ。
つまり、帰無仮説が間違いである可能性が高いので、対立仮説である「**有意差がある**」を採用するというわけだ。

A/Bテストの集計では95%信頼区間を用いることが多いため、p値が0.05より小さければ有意差ありと判断するケースが多い。

## 再実験とフィッシャーの式

実験結果に確証が持てない場合、同じ条件で再実験をするケースがある。
実験をやるごとに異なるp値が得られるはずだが、最終的に有意差ありかどうかをどのように判断すればいいだろうか？

例えば二回実験を行ってp値がそれぞれ0.05, 0.06だったとする。
この時に直感的に考えるとより有意差がある確率が高くなりそうな気はする。
0.05, 0.2だった場合はどうだろう？

上記の書籍によると、フィッシャーのメタアナリシスという方法により以下のように定式化できるらしい。

```math
\chi_{2k}^2=-2\Sigma_{i=1}^k ln (p_i)
```

kは再実験を行なった回数、$p_i$はi番目の実験におけるp値を表す。
もし帰無仮説が真ならば、この式の右辺は**自由度2kのカイ二乗分布**に従う。
p値が小さければこの値は大きくなり、有意差があると判断できる。


## 式のお気持ちを理解する

### 確率変数の変換

まずは簡単のためkを一回分に固定して考える。
もし帰無仮説が正しければ。p値の分布は**一様分布になるはずだ**。
一様分布であるpを$-2ln(p)$に変換した時を考える。

確率変数の変換は以下の公式を使う。

```math 
f(y) = f(\phi(y))|\frac{dx}{dy}| 
```

xの従う確率分布をf(x)、xを変換したのがy。
最終的に知りたいのはf(y)である。
また、x=(yの式)に直したものを$\phi(y)$とおく。

今$p$を$-2ln(p)$に変換したいので

```math
y = -2ln(x)
```

とする。
x=の式にして、$\frac{dx}{dy}$を計算すると

```math
\phi(y) = x = exp(-\frac{y}{2})\\
\frac{dx}{dy}=-\frac{1}{2}exp(-\frac{y}{2} )
```
となる。
f(x)は一様分布(=1)であるため、これらを代入すると

```math
f(y) = 1 |-2exp(-\frac{y}{2})|\\
     = 2exp(-\frac{y}{2})
```

つまり、一様分布pの対数をとった確率分布は指数関数になる。

### カイ二乗分布

一方でk次のカイ二乗分布というのは、k個の標準正規分布に従う変数の2乗和を意味する。
数式の求め方はいったん飛ばすが、k=2の場合のカイ二乗分布は$\frac{1}{2}exp(-\frac{x}{2})$となる。
これはまさに先ほど計算した$-2ln(p)$と同じ形をしている！
これをそのままk個の和に拡張すると$-2\Sigma_{i=1}^k ln (p_i)$は自由度2kのカイ二乗分布に従うことが言える。


## まとめ
- 再実験を行なった場合のp値の扱いはフィッシャーの方法を使えばいい
    - カイ二乗分布からのずれを見れば有意差があるかどうかわかる

## 余談
このフィッシャーの式って交差エントロピーの形にとても似ている。
交差エントロピーは機械学習の際の損失関数としてよく用いられる。
エントロピーというのは基本的に乱雑で選択肢が多いほど値が大きくなる（エントロピー増大の法則）。
これが小さい方が、より確実に選択肢を絞れている=精度が高いと直感的に理解できる。

選択肢が多い方が一つ一つの状態の取りうる確率は小さくなるのでエントロピーは大きくなる。
今回のケースで言えばp値が小さい場合にフィッシャーの式が大きくなることに関連してそうだが、この考えが正しいのかはわからない。
そもそも今回のケースだとk回の実験は全て独立なのでp値(確率)の和が1になることもない。
なので、このような関連付けをしようとすること自体が間違っているのかもしれない。

## 参考文献
- A/Bテスト実践ガイド
    - 書籍
- 確率分布の変換式
    - https://nishiru3.hatenablog.com/entry/2018/07/06/000000
- フィッシャーの式
    - https://en.wikipedia.org/wiki/Fisher%27s_method
    - 英語版Wikipediaに乗ってた
- 交差エントロピー
    - https://qiita.com/kenta1984/items/59a9ef1788e6934fd962
量子計算は上手くできてる！

# 任意の論理回路、特にプール関数

入力の01系列に対して、出力の01系列を定めると一意に決まる。

# 任意の量子ゲート

入力の01系列で定まる純粋状態に対して、出力の01系列の重ね合わせ(ただし可逆なもの)を定めると、その重ね合わせとして一意に決まる。

# 結論

可逆論理回路の一般化として量子ゲートは定まっている！