OmniAICreator/Qiita-1.07M huggingface dataset:
[GAS] 具体事例から学ぶScriptAppによるトリガー生成コードサンプル（１）～毎日指定時間（○時○分）に実行したい場合

# はじめに
スプレッドシートを始めとしたGoogleのクラウドアプリは、**時間主導型トリガー**（以降、タイムトリガー）を使用して、定型処理を定期的に自動実行させることができます。

タイムトリガーはＵＩ画面から簡単に設定可能ですが、ＵＩにて設定できる項目が限られているため、要望する内容によってはGASの`ScriptApp`を使ってプログラム側からトリガーを生成する必要があります。

本稿では、ＵＩ画面からの設定では対応できない内容について、当方にご相談頂いた内容を元にした事例別の参考コードを不定期連載形式で紹介していきたいと思います。（ネタが溜まってきたら、随時公開予定です）

今回は初回ということで、比較的実装が容易なケースとして、**毎日指定時間（○時○分）に実行したい場合**のご紹介です。

::: note
**前提条件**
1. 仕様上、実行遅延（タイムラグ）がおよそ数分以内のレベルで発生します。そのため、厳密な時間管理が必要な処理には不向きです。（[公式](https://developers.google.com/apps-script/reference/script/clock-trigger-builder)にて一部メソッドにおいては±15分と明記されています）
2. 同様に、仕様上、エラー通知の頻度をスクリプト側で設定できないため、 **毎日通知を受け取る** がデフォルトとなります。
3. 拙記事ですが、[こちら](https://qiita.com/STSHISHO/items/2985c7b92c80b28f1018)を参考にタイムゾーンの設定が実行環境と合っているか確認してください。
4. サンプルコードでは１日あたりの総実行時間、１ユーザーあたり２０トリガーまで等、GASの制限事項は考慮していません。
:::

::: note
**設置時の共通事項**
1. トリガー生成ロジックは独立した関数として定義し、メイン処理内に組み込みます。組み込み位置は末尾を推奨しておきますが、好みや状況に合わせて適宜ご対応ください。
2. [GASの制限事項](https://developers.google.com/apps-script/guides/services/quotas#current_quotas)を考慮し、適宜メイン処理の軽量化、高速化をしましょう。また、実行回数に関係なく、実行済みトリガーの削除処理の実装を推奨します。
3. 初回のトリガー設定のみ手動で行います。
:::

# 比較的実装が容易なケース（１）
## 毎日指定時間（○時○分）に実行したい
ＵＩ画面にて**時間主導型** → **日付ベースのタイマー**でできそう、という安易なイメージでハマる場合が多いようです。

ハマるポイントとしては、**日付ベースのタイマー**では１時間単位の**時間帯**しか指定できず、かと言って、**特定の日時** の場合は指定日時の **１回しか実行されない** ことです。

ご相談いただいた方の多くのは、指定時間を含む時間帯か、指定時間以降の時間帯で**日付ベースのタイマー**を使用していました。つまり、妥協して利用していたということですね。

### ロジック
- Javascriptにて**翌日の指定日時**を設定する
- `ScriptApp`にて**特定の日時**としてトリガーを生成する

つまり、当日実行時に**翌日の処理を実行予約する**イメージです。結果、これが毎回繰り返されることで、毎日指定時間（仮に午後１２時３４分とします）に自動実行されます。

### サンプルコード

```Javascript: 毎日午後12:34にメイン処理を実行する
// 初期設定用オブジェクト
function init(){
  return {
    START_TIME: '12:34', // hh:mm形式で指定
    TRIGGER_HUNDLER: 'main' // 自動実行対象の関数名
  };
}

// メイン処理
function main() {
  /* メイン処理省略 */

  setTrigger();
}

// トリガー生成処理
function setTrigger() {
  const now = new Date();
  const INIT = init();
  const startTime = INIT.START_TIME.split(':');
  const targetDate = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1, startTime[0]*1, startTime[1]*1);

  ScriptApp.newTrigger(INIT.TRIGGER_HUNDLER)
  .timeBased()
  .at(targetDate)
  .create();
}
```

### 初回設定
初回はＵＩ画面経由で **特定の日時** で `main` を実行するようにトリガーを設定するか、エディタ画面より直接 `setTrigger`を実行します。

# 最後に
今回は初回ということで、比較的実装が容易なケースとして、**毎日指定時間（○時○分）に実行したい場合**のご紹介をしましたが、もちろん最適解ということではございません。

上記のサンプルコードを例に、`main`から`setTrigger`を切り離した上で、ＵＩ画面にて**時間主導型** → **日付ベースのタイマー**にて、`setTrigger`を実行させても同様の結果を得られます。

両者の違いは **メイン処理直後に翌日の実行予約をする** か、メイン処理とは別に **定期的な時間帯で翌日の実行予約をする** か、ということになります。

メイン処理中にエラーが発生した場合、トリガー設定をしないようにするため、本稿では前者のようなフローを採用しました。ただ、メイン処理とは切り離したい場合もありますので、状況に応じて実装すれば良いと思います。

誰かのお役に立てたなら幸いです。

# [参考・引用]
- [Class ClockTriggerBuilder  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/script/clock-trigger-builder)
- [[GAS] 簡単になったGAS実行環境のタイムゾーン設定](https://qiita.com/STSHISHO/items/2985c7b92c80b28f1018)
- [Quotas for Google Services  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/services/quotas#current_quotas)
多言語FizzBuzzチャレンジ3日目:Rust

## ここまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

## 本日のお品書き
今をときめくRustさんです。
ちょっとずつRust tourやったりはしてますが、実際にコードを書く機会が無いのでそのたびに忘れていますね…。

## FizzBuzz
```rust
fn main() {
    // Rustよ、君もセミコロン派か…
    for i in 1..101 {
        if i % 15 == 0 {
            println!("FizzBuzz");
        } else if i % 3 == 0 {
            println!("Fizz");
        } else if i % 5 == 0 {
            println!("Buzz");
        } else {
            println!("{}", i);
        }
    }
}
```

所有権の話とか出なければ、書きっぷりはC言語に近しいですね。
paiza.ioでelixir その36

# 概要
paiza.ioでelixirやってみた。
String.valid?使ってみた。

# サンプルコード

```
:unicode.characters_to_nfd_binary("だ")
|> IO.puts
[65, 66, 67, 68, 69] 
|> IO.inspect(charlists: :as_lists)


String.valid?("hello")  
 |> IO.inspect

String.valid?("")   
 |> IO.inspect
String.valid?('world')   
 |> IO.inspect
String.valid?(nil)    
 |> IO.inspect
String.valid?(100)   
 |> IO.inspect
String.valid?(<<128, 129, 130>>) 
 |> IO.inspect
String.valid?( [65, 66, 67, 68, 69])
 |> IO.inspect

```

# 実行結果

```
だ
[65, 66, 67, 68, 69]
true
true
false
false
false
false
false
```

# 成果物

https://paiza.io/projects/bSqkunMOQRU1P6oROuTlnw

以上。
paiza.ioでelixir その35

# 概要
paiza.ioでelixirやってみた。
List使ってみた。

# サンプルコード


```
l = [ 1, 2, 3, 4 ]
|> IO.inspect
IO.puts length l
l = l ++ [5]				
|> IO.inspect
IO.puts length l
l = l ++ [6, 7, 8, 9]
|> IO.inspect
IO.puts length l

l = List.delete(l, 3)
|> IO.inspect
IO.puts length l

l = List.insert_at(l, 2, 3)
|> IO.inspect
IO.puts length l

l = List.delete_at(l, 0)
|> IO.inspect
IO.puts length l

l = List.replace_at(l, 0, 0)
|> IO.inspect
l = List.update_at(l, 0, &(&1 + 10))
|> IO.inspect
l 
|> List.first()
|> IO.inspect
l 
|> List.last()
|> IO.inspect
l 
|> List.flatten()
|> IO.inspect
l = List.duplicate(50, 10)
|> IO.inspect


```

# 実行結果

```
[1, 2, 3, 4]
4
[1, 2, 3, 4, 5]
5
[1, 2, 3, 4, 5, 6, 7, 8, 9]
9
[1, 2, 4, 5, 6, 7, 8, 9]
8
[1, 2, 3, 4, 5, 6, 7, 8, 9]
9
[2, 3, 4, 5, 6, 7, 8, 9]
8
[0, 3, 4, 5, 6, 7, 8, 9]
[10, 3, 4, 5, 6, 7, 8, 9]
10
9
[10, 3, 4, 5, 6, 7, 8, 9]
'2222222222'


```

# 成果物

https://paiza.io/projects/DAKVpmJ4XS6BgNp-hR8Rbg

以上。
多言語FizzBuzzチャレンジ5日目:C言語

## ここまでのまとめ

https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

https://qiita.com/tenteko/private/74aa4c422196cb5cdeac

## 本日のお品書き
泣く子も黙るC言語。
触ったことはありますが、心を折られた苦い記憶がありますね…。

## FizzBuzz
```c
#include <stdio.h>

int main(void) {
  /*セミコロンを完璧に忘れていた*/
  int i;
  for (i = 1; i < 101; i++) {
    if (i % 15 == 0) {
      printf("FizzBuzz\n");
    } else if (i % 3 == 0) {
      printf("Fizz\n");
    } else if (i % 5 == 0) {
      printf("Buzz\n");
    } else {
      printf("%d\n", i);
    }
  }
  return 0;
}
```

LSPでいい感じにフォーマットしてくれるようになって時代を感じました（感想が古い）

## 【おまけ】コンパイルまで
```shell
# edit main.c
gcc main.c
./a.out
```
プライベートでEC2のWindows Serverを運用する時の覚書

# はじめに

Windows ServerのEC2をプライベートネットワークで運用する際のもろもろ気づいたことを書きます。

## SSMの設定

プライベートサブネットではSSMもつながらないため設定が必要になります。

### SSM用のエンドポイント

次の3つのエンドポイントを作成して、対象のサブネットにアタッチします。

* com.amazonaws.ap-northeast-1.ssm
* com.amazonaws.ap-northeast-1.ssmmessages
* com.amazonaws.ap-northeast-1.ec2messages

エンドポイントにはセキュリティグループでhttps(443)のインバウンド設定を付与する。

:::note warn
プライベートリンクのエンドポイントを設置すると、通信の従量課金だけでなく時間単位の[課金が発生します](https://qiita.com/talomina/items/e1c907fe58a905b4f4c6#%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)のでご注意。この構成でうっかり1か月過ごすと1万円を超える請求がきます。
:::

https://aws.amazon.com/jp/privatelink/pricing/

### SSMエージェント更新のためS3のエンドポイント

次のエンドポイントを作成して、対象のサブネットにアタッチします。

* com.amazonaws.ap-northeast-1.s3 ゲートウェイ型

対象のS3を絞り込む場合は下記の情報が役に立ちます。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent-minimum-s3-permissions.html#ssm-agent-minimum-s3-permissions-required

```json:東京リージョン向けのS3バケットポリシーのサンプル
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": [
				"arn:aws:s3:::aws-windows-downloads-ap-northeast-1/*",
				"arn:aws:s3:::amazon-ssm-ap-northeast-1/*",
				"arn:aws:s3:::amazon-ssm-packages-ap-northeast-1*",
				"arn:aws:s3:::ap-northeast-1-birdwatcher-prod/*",
				"arn:aws:s3:::aws-ssm-document-attachments-ap-northeast-1*",
				"arn:aws:s3:::patch-baseline-snapshot-ap-northeast-1/*",
				"arn:aws:s3:::aws-ssm-ap-northeast-1/*",
				"arn:aws:s3:::aws-patchmanager-macos-ap-northeast-1/*"
			]
		}
	]
}
```

## Windows Updateはどうするか
いまのところNAT ゲートウェイを経由するくらいしかないと思われます。WSUSなどの仕組みを構成することで、通信量を抑えるなどの工夫が必要になります。

[Amazon Linuxはエンドポイント経由でできる](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-al1-al2-update-yum-without-internet/)ようです。

# おわりに

意外となかったので、新たなことが出てきたら追記します。
[Unity]アプリをストアに公開する時、スクショ撮影がはかどる技

# 概要
GooglePlayやAppStoreにアプリを公開する時、機種のサイズごとにスクショを用意する必要があります。
でも、PC標準のスクショ機能を使っても目的の画像サイズで撮影することが出来ません。
そんな時はUnityエディターに内蔵されたスクショ機能が便利です。
# 本文
## UnityをInternalモードに切り替える
Unity > About Unity...
![スクリーンショット 2022-11-03 8.05.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c396fb84-fa2d-d780-6fe4-038dda0c6fc8.png)
About Unity画面が表示されたらキーボードから「internal」と入力します
![スクリーンショット 2022-11-03 8.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/52179df3-609a-fa9e-87a8-1c523da51c07.png)
そうするとUnity画面の所々に「点滅する丸印」が表示されると思います。これでモードが切り替わった事を確認できます。
![スクリーンショット 2022-11-03 9.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9db2c863-368a-6f6c-8274-9fcdb3564883.png)

## 撮影準備
Unityのスクショ機能は現在のGameView画面設定サイズで撮影されます。
必要なスマフォ機種の画面サイズに設定しておきます
![スクリーンショット 2022-11-03 8.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/99cc2788-1c13-7793-1d34-69b7f3771d2f.png)
Simulatorの画面サイズで指定しても大丈夫です。
![スクリーンショット 2022-11-03 8.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/e0870935-4225-d42f-66cb-2dbd62fe4d71.png)
## 撮影
Window > Internal > Screenshot > Snap Game View Contentでスクショが保存されます。（画像ファイルはプロジェクトの親フォルダと同じ階層に保存されます）
![fix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f2dd8574-0bab-3576-1d07-13ab80d1e894.png)

iPad mini 4
![ContentExample000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/041959b2-da3e-a196-3514-f6ecb9a70d69.png)







# 補足
Unity上でアピールメッセージを載せて撮影するのも良いですね！:star2:
![ContentExample001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/046fe228-88de-be4d-59a7-f7530cab4729.png)

:::note warn
撮影が終了したら忘れずにInternalモードを解除してください。
Internalモードに切り替えた時の手順をもう一度行うと解除できます。
（InternalモードはUnityに正式サポートされた機能では無いので、そのまま通常の作業を行うと不具合の原因につながる可能性があります）
:::

参考リンク
[知らないと損をする！？Unityエディタの隠された機能３選！](https://www.youtube.com/watch?v=mc0mHcnqu44&t=251s)
マークダウン形式のURLリンクをショートカットキーで取得する（クロームアドオン「Copy URL+」）

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

マークダウン形式で学習の記録をする時があるのですが、WEBページを参考リンクとして貼る時に、ショートカットキーでマークダウン形式のリンクをコピーできるため、方法の共有です!


:::note info
マークダウン形式のリンクとは
\[リンクタイトル](URL)
こんな感じでテキストを[]、URLを()で囲む表記です!
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e6bb1b7a-8490-5013-62e2-2b85ce13ffb7.png)

# 結論
グーグルクロームの「Copy URL+」という拡張機能を使うとできます!

https://chrome.google.com/webstore/detail/copy-url%2B/capojgaalppngkaagaobmigigcgnidmn/related?hl=ja

# 設定

インストールした拡張機能のアイコンを右クリックし、「Options」をクリックする

![Screen Shot 2022-11-02 at 9.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/ddfae27a-abf8-36b4-e5a0-9029c454ea10.png)

「Add a shortcuts」をクリックする

![Screen Shot 2022-11-02 at 9.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/fe2b50b9-527f-d385-5a81-9e34fb42771f.png)

formatのところに`[${title}](${sURL})`と入力する

（sを抜いて`[${title}](${URL})`としてもOKです）

![Screen Shot 2022-11-02 at 9.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/27e8b76e-40fb-d550-a4b1-381e4a87c27b.png)

keyのところで、設定したいショートカットキーを設定します!
自分は`⌘+c`で設定しています!

![Screen Shot 2022-11-02 at 9.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/7478572d-ff6d-8589-02ae-d9b551cb9482.png)

※注意：**enableの欄**で作ったショートカットキーの**チェックボックスをオン**にしてください!

:::note warn
この設定忘れがちなので注意です！💦
（自分「あれ？使えない…」ってよくなります…）
:::

![Screen Shot 2022-11-02 at 9.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/6a2a94a6-d39c-2369-b9ed-cc1bfd8d51bd.png)


`» Update context menus`にて適用して設定は完了です!

![Screen Shot 2022-11-02 at 9.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/8b2a0438-1efb-4ae0-8e32-2b908b79a140.png)

# 使用方法

コピーしたいWEBページ上にて、先ほど設定したショートカットキーを押すとクリップボードにマークダウン形式のURLが保存されます！

:::note info
うまくできた場合、下記画像のようにページ上部に`Shortcuting ~~~~ `と表示されます!
（1秒くらいで消えます）
:::

![Screen Shot 2022-11-03 at 8.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/9d457e83-a08e-80bf-b52c-cd6c135a2946.png)


:::note warn
コピーできない場合
- 「設定」のenableの欄のチェックボックスがオンになっているか
- コピーしたいページ内にて、入力フォーム等にカーソルが置かれていないか
    - 単純に文字入力になってしまいます💧
- ブラウザを再起動

にて確認してみてください🙇
:::


# おわりに
お読みいただきありがとうございました。
どなたかのお役に立てれば嬉しいです！

# 参考
https://youtu.be/VYJ1cLDRD3I?t=346
MindARトラブルシューティング

# クリックイベントが発生しない
MindARのオブジェクトはA-Frameタグを利用しているが、`cursor="rayOrigin: mouse` アトリビュートを付与してもクリックイベント（onClick,OnMouseUp等）が発生しないが、MindARではクリック対象のタグに`class="clickable"` を付与することでクリックイベントが取得できるようになる。

```javascript
      <a-entity
        mindar-image-target="targetIndex: 0"
        id="proTarget"
        ref={proTargetRef}
      >
        <a-video
          video-object
          class="clickable"
          onMouseUp={() => console.log("clicked")}
          src="#pro_video"
          width="1.3"
          height="1"
          position="0 0 0"
          rotation="0 0 0"
        ></a-video>
      </a-entity>
```

# クリックイベントが2回発生する
`onClick` でイベントハンドルするとクリック（タップ）時に2回イベントが発生してしまうため、`onMouseUp` または`onMouseDown` を利用すると1回だけイベントを取得できる。
privateメソッドはクラスメソッドで使えない理由から学んだことメモ

# コード例

```ruby
class Hoge

 def self.xxx
   yyy
 end

 private

 def yyy
   '呼んだ？'
 end
end
```

```ruby
Hoge.xxx
=> NameError: undefined local variable or method `yyy' for Hoge:Class
```

# 原因
- スコープの違い
    - カレントオブジェクトが異なるため、そんなメソッドないよと言われてしまう

## privateメソッドとは
「self以外のレシーバを指定して呼び出すことができないメソッド」（Ruby2.7以降)
self以外のレシーバが指定できない = **外部から呼び出しされることがない**メソッド

しかし、レシーバが指定できないだけでそれ以外はpublicメソッドと変わらない。
そのため、スーパークラスのprivateメソッドをサブクラスで使用することは可能。(レシーバの指定をしなくてもメソッドが呼び出されるから)

```ruby
class Hoge

  private
  
  def yyy
    '親のprivateメソッド'
  end
end

class Bar < Hoge
  def fuga
    yyy
  end
end
```

```
Baar.new.fuga => "親のprivateメソッド　"
```

反対にpublicメソッドは、レシーバの指定ができるため外部からの呼び出しも可能

参考: https://qiita.com/kidach1/items/055021ce42fe2a49fd66


# クラスメソッド内でprivateメソッドを扱いたいときはどうするか
- 特異クラスでprivateメソッドを定義し、外部に公開しないprivateなクラスメソッドを定義する
- このパターンもprivateなインスタンスメソッドと同様に、継承先のクラスからメソッド探索で呼び出し可能

```ruby
class Hoge

  class << self
    def hoge
        yyy
    end

    private
  
    def self.yyy
      '特異クラスに定義されたprivateなクラスメソッド'
    end
  end
end
```


## 特異クラスとは
特定のインスタンスのみが持つクラスのこと(singleton class)
特異クラスとは、`class << self`で定義できる 
参照:https://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fdef.html#class_method


### NG例

private以下に`self.xxx`の形で定義しても外部から呼び出されてしまう。（クラスメソッドと扱いが同じ)
この場合は、`private_class_method`で明示的にprivateメソッドにする必要あり


```ruby
class Hoge

  private
  
  def self.yyy
    'プライベートなクラスメソッドだから呼ばれたくない！'
  end
end

class Bar < Hoge
  def self.foo
    Hoge.yyy
  end
end
```

```
Bar.foo => "プライベートなクラスメソッドだから呼ばれたくない！"
```
[Unity]Plastic SCMでCheckin Changes（プッシュ）出来ない時

# 概要
以下のポップアップエラーはCheckin Changesした直後にもう一度Checkin Changesした時に表示される事がありますが、どれだけ待っても改善しない事がありました。そんな場合の解決方法です。
```
An existing checkout operation has locked the workspace '(プロジェクト名)'. Please wait for the checkout operation to finish.
```
# 本文

Window > Package ManagerからVersion Controlを最新バージョンに更新したら解決しました:raised_hands:
![スクリーンショット 2022-11-03 7.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a21f7e20-4c97-1e92-9cc8-0bdfb0666ddb.png)



参考リンク
https://forum.unity.com/threads/an-existing-checkout-operation-has-locked-the-workspace-constantly-happens.1268045/
pandasのresampleにおけるffillの挙動

# 不定間隔でサンプリングされたデータのリサンプリング
```python
df.resample('1ms').ffill()
```
としたら、NaNだらけになって？？？となったので、その時のメモ。

# 結論
```python
df.ffill().resample('1ms').ffill()
```
とすればいいみたい。
resampleにおけるffillは、あくまでリサンプリング時に、データがないものをfillするだけで、
直前のデータがNaNだと、NaNで埋められる。
言われるとそうだけど、２回ffill呼ぶのが気持ち悪い。。。


# 例

```python
import pandas as pd
import io

df = pd.read_csv(io.StringIO("""
col1,col2
2020-10-19 13:27:43.038572032,,15
2020-10-19 13:27:43.041051392,,25
2020-10-19 13:27:43.043462656,30,35
2020-10-19 13:27:43.045890304,40,
2020-10-19 13:27:43.055974656,,55
2020-10-19 13:27:43.058358016,60,
2020-10-19 13:27:43.060819456,70,35
2020-10-19 13:27:43.063246848,,25
2020-10-19 13:27:43.065672192,,
2020-10-19 13:27:43.074975040,,5
"""), index_col=0, parse_dates=True)
print(df.to_markdown())
```


|                               |   col1 |   col2 |
|:------------------------------|-------:|-------:|
| 2020-10-19 13:27:43.038572032 |    nan |     15 |
| 2020-10-19 13:27:43.041051392 |    nan |     25 |
| 2020-10-19 13:27:43.043462656 |     30 |     35 |
| 2020-10-19 13:27:43.045890304 |     40 |    nan |
| 2020-10-19 13:27:43.055974656 |    nan |     55 |
| 2020-10-19 13:27:43.058358016 |     60 |    nan |
| 2020-10-19 13:27:43.060819456 |     70 |     35 |
| 2020-10-19 13:27:43.063246848 |    nan |     25 |
| 2020-10-19 13:27:43.065672192 |    nan |    nan |
| 2020-10-19 13:27:43.077975040 |    nan |      5 |

というデータがあった場合

## resample('1ms').ffill() だと

```python
print(df.resample('5ms').ffill().to_markdown())
```
|                            |   col1 |   col2 |
|:---------------------------|-------:|-------:|
| 2020-10-19 13:27:43.035000 |    nan |    nan |
| 2020-10-19 13:27:43.040000 |    nan |     15 |
| 2020-10-19 13:27:43.045000 |     30 |     35 |
| 2020-10-19 13:27:43.050000 |     40 |    nan |
| 2020-10-19 13:27:43.055000 |     40 |    nan |
| 2020-10-19 13:27:43.060000 |     60 |    nan |
| 2020-10-19 13:27:43.065000 |    nan |     25 |
| 2020-10-19 13:27:43.070000 |    nan |    nan |


## あらかじめffillすると

```python
print(df.ffill().resample('5ms').ffill().to_markdown())
```


|                            |   col1 |   col2 |
|:---------------------------|-------:|-------:|
| 2020-10-19 13:27:43.035000 |    nan |    nan |
| 2020-10-19 13:27:43.040000 |    nan |     15 |
| 2020-10-19 13:27:43.045000 |     30 |     35 |
| 2020-10-19 13:27:43.050000 |     40 |     35 |
| 2020-10-19 13:27:43.055000 |     40 |     35 |
| 2020-10-19 13:27:43.060000 |     60 |     55 |
| 2020-10-19 13:27:43.065000 |     70 |     25 |
| 2020-10-19 13:27:43.070000 |     70 |     25 |


# 注意
初めと最後のデータの扱いは、チェックしたほうがいいかも。

初めのデータは、切り捨てられたところから始まるから、その時には計測データないので当然NaNだし、
最後のデータは、切り捨てられたところで終わるので、含まれない。
この辺はちょっと気持ち悪いね。


あと、あたりまえだけどffillだと、同じ区間に複数回計測データがあっても、
その区間の最後の値にしかならないので、それでいいかどうかも確認が必要。
The Spinning Cube立方体の回転について調べてみた。

リンクだけです。sympyで猛勉強中?です。半年ぐらい悩んでいます。
[半年の成果です。](https://qiita.com/mrrclb48z/items/b4b073a89f03b6e64bf1)


**オイラー角について、おすすめの本、サイトを教えて下さい。**

見えてきますね。いいですね。1分6秒見て下さい。

https://www.youtube.com/watch?v=MSeMBD7K-No

https://www.google.com/search?q=amazon+%E4%B8%80%E8%91%89%E5%8F%8C%E6%9B%B2%E9%9D%A2+%E6%95%B0%E5%AD%A6&oq=amazon+%E4%B8%80%E8%91%89%E5%8F%8C%E6%9B%B2%E9%9D%A2+%E6%95%B0%E5%AD%A6&aqs=chrome..69i57j69i60l2j0i546l2j0i30i546.15189j0j4&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8


# WolframAlpha で


視覚表示あります。図です。

https://www.wolframalpha.com/input?i=Cube%5B+%7B0%2C0%2C0%7D%2C%29+%7B1%2C0%2C0%7D%2C%29+%7B1%2C1%2C0%7D%2C%29+%7B0%2C1%2C0%7D%2C%29%7B0%2C0%2C1%7D%2C%29%7B1%2C0%2C1%7D%2C%29+%7B1%2C1%2C1%7D%2C%29+%7B0%2C1%2C1%7D%5D&lang=ja


https://www.wolframalpha.com/input/?i=%E4%B8%80%E8%91%89%E5%8F%8C%E6%9B%B2%E9%9D%A2&lang=ja





# 入試問題

http://k-kyogoku2.com/cn102/cn10/pg55.html

大学入試数学問題集成＞文系【５】,理系【６】

https://mathexamtest.web.fc2.com/2010/201010541/2010105410100mj.html#top-0106



【１】一辺の長さが 1 の立方体

https://mathexamtest.web.fc2.com/1993/199310267/1993102670200mj.html

【３】一辺の長さ2aの立方体

https://mathexamtest.web.fc2.com/1998/199813338/1998133380100mj.html#top-0103

2005年青山学院大学
大学入試数学問題集成＞未掲載

https://mathexamtest.web.fc2.com/daigakubetumj/13301index.html#y2009

# 参考

https://www.google.com/search?q=%E7%AB%8B%E6%96%B9%E4%BD%93+%E5%9B%9E%E8%BB%A2&rlz=1C1CHBD_jaJP908JP908&oq=%E7%AB%8B%E6%96%B9%E4%BD%93%E3%80%80%E5%9B%9E%E8%BB%A2&aqs=chrome..69i57j0i512l6.12936j0j7&sourceid=chrome&ie=UTF-8

https://www.google.com/search?q=%E4%B8%80%E8%91%89%E5%8F%8C%E6%9B%B2%E9%9D%A2+%E4%BD%93%E7%A9%8D&rlz=1C1CHBD_jaJP908JP908&oq=%E4%B8%80%E8%91%89%E5%8F%8C%E6%9：B%B2%E9%9D%A2%E3%80%80&aqs=chrome.4.69i57j0i512l4j69i60j69i61.3647j0j7&sourceid=chrome&ie=UTF-8


ダウンロードが必要です。英文pdf:The Spinning Cube

https://www.google.com/url?sa=t&source=web&rct=j&url=https://scholarworks.umt.edu/tme/vol18/iss1/5/&ved=2ahUKEwiF_b_H64z7AhWQH3AKHe3FAFkQFnoECAcQAQ&usg=AOvVaw3-1nP5OihyCd0eIYejzgY8
Amazon EC2にElastic IPアドレスを割り当てる

AWSマネジメントコンソールにログインしてください。
EC2ダッシュボードを表示してください。
[Elastic IP]をクリックしてください。
![スクリーンショット 2022-10-31 6.51.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/b56131fb-fe22-6d15-c233-01c491a77e43.png)

ElasticIPアドレスのページが表示されます。
ページ右上の[ElasticIPアドレスを割り当てる]をクリックしてください。
![スクリーンショット 2022-10-31 6.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/9cf2e3ed-25b4-5fe4-97d9-9c7925d73ca2.png)

ElasticIPアドレスを割り当てるページが表示されます。
初期設定のまま、何も変更せずに、[割り当て]をクリックしてください。
![スクリーンショット 2022-10-31 6.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/9449709f-fa84-a812-b048-fa7d0802bd67.png)

ElasticIPアドレスのページで[アクション]-[ElasticIPアドレスの関連付け]をクリックしてください。
![スクリーンショット 2022-11-03 7.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/60cce729-443f-09fd-91c8-0f522c772f66.png)

ElasticIPアドレスを関連付けるEC2インスタンスを選択し、[関連付ける]をクリックしてください。
![スクリーンショット 2022-11-03 7.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/8c1e3d19-9338-4f5d-12a1-86d035fb1f66.png)

EC2ダッシュボードページを表示してください。
ElasticIPアドレスを関連付けたEC2インスタンスを選択すると、ElasticIPアドレスが表示され、関連付けられたことが分かります。
![スクリーンショット 2022-11-03 7.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/89fe6b8d-2229-e6ec-c603-dd66d400ede2.png)

以上です。
ダニングクルーガー効果は嘘

ダニングクルーガー効果とは、実際の能力が低いほど、自己評価が高くなるという仮説である。

### 文脈
Andy Huntなどがエンジニアのダニングクルーガー効果について著書で述べていたり、「ワタシリナックスチョットデキル」のTシャツを着たリーナスの画像に共感が持たれるように、これが真実として語られる。人々は信じたいものを信じるので、謙虚ではない意識高い系の能力が低いと信じたいようである。

しかし、本当にダニングクルーガー効果は存在するのだろうか。

このような心理効果を数学的に分析しようとしたのは、以下の記事が最初かもしれない。
https://web.archive.org/web/20190306112412/https://datanerd.hateblo.jp/entry/2017/09/11/162446

魚拓に残っていて良かったが、これは自分が学生時代に作成した記事だ。専門学校の教師がFacebookでダニングクルーガー効果について熱弁していてムカついたので、その反論のために書いた記事である。

これと同じことをもう一度書く。

### 定式化
- 定義: 実際の評価が低いほど、自身を過大評価してしまう 
- x: 実際の評価。 
- y: 自己評価。 
- y-x>0: 過大評価。 

目的: yとy-xの関係、またはxとy-xの関係を見つければ良い。

- もしxとyが一様乱数でも定義が成り立つなら、このような現象は心理に関するものではないことになる。
- 定義の関係が成り立つことを確認するには、yとy-xが正の相関を持つこと、またはxとy-xが負の相関を持つことを示せば良い。

### pythonで実験

```python
x = np.random.uniform(size=1000)
y = np.random.uniform(size=1000)
z = y-x
plt.scatter(y, z)
```

![download (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933444/a18c91ff-7211-b96b-bd16-d062a7acdddd.png)

```python
import pandas as pd
df = pd.DataFrame({"x":x, "y":y, "y-x":z})
df.corr()
```

|     |          x |          y |       y-x |
|:----|-----------:|-----------:|----------:|
| x   |  1         | -0.0571932 | -0.725288 |
| y   | -0.0571932 |  1         |  0.7288   |
| y-x | -0.725288  |  0.7288    |  1        |

### science directの論文
自分がここで示したのは、実データではなく、単なる数学的な検証でしかない。

世の中には実データでこれを示した人もおり、以下の論文で確認できる。

https://www.sciencedirect.com/science/article/abs/pii/S0160289620300271

ダニングクルーガー効果は、あったとしても非常に小さい可能性がある。

### 追記
皮肉にも、ダニングクルーガー効果が正しいと考えている人が、自分自身が謙虚の側だと考えること自体が、すでに自己評価が高いことを意味する。

### 参考

- <a href="https://web.archive.org/web/20190306112412/https://datanerd.hateblo.jp/entry/2017/09/11/162446">自分のブログの魚拓</a>
- <a href="https://www.sciencedirect.com/science/article/abs/pii/S0160289620300271#:~:text=The%20Dunning%2DKruger%20effect%20is%20a%20type%20of%20cognitive%20bias,Kruger%20%26%20Dunning%2C%201999">The Dunning-Kruger effect is (mostly) a statistical artefact: Valid approaches to testing the hypothesis with individual differences data</a>
- <a href="https://math.stackexchange.com/questions/344844/distribution-of-a-difference-of-two-uniform-random-variables">Distribution of a difference of two Uniform random variables?</a>
- <a href="https://stats.stackexchange.com/questions/66610/generate-pairs-of-random-numbers-uniformly-distributed-and-correlated">Generate pairs of random numbers uniformly distributed and correlated</a>
form_withで送信ボタンを押しても動かないとき（同期通信）

備忘録。
form_withで送信ボタンを作成したとき、ページの更新を行なうとテーブルに情報が残るし、けど更新しないとエラーもでないのに固まったままだった。
```ruby
<div class="comment-form">
  <% if user_signed_in? %>
    <%= form_with model: [@item, @comment],local: true, id: "comment-form" do |f| %>
      <%= f.text_area :text , class: "comment-text"%>
      <%= f.submit "コメントをする", class: "comment-submit" %>
    <% end %>
  <% end %>
</div>
  <div id="comments">
  <h4>＜コメント一覧＞</h4>
    <% @item.comments.each do |comment| %>
      <div class="comment">
        <p class="user-info"><%= comment.user.nick_name %>： </p>
        <p><%= comment.text%></p>
      </div>
    <% end %>
</div>
```
結論、local: trueが抜けてました。今までlocal: trueくん、なんでいるの？君なんのためにそこにいるん？って思ってごめんなさい。君も大事な一員でした。
そうそう、local: trueが必要なのは同期通信の場合であって、非同期の場合はそうでないとか。
非同期実装の場合にまた書きます。
KeyCloakに連携したGitHub認証で得たGitHubのアクセストークンをアプリ側で取得する方法

この投稿では、KeyCloak+GitHub認証で、GitHubのアクセストークンをKeyCloakに保存し、取得できるようにする設定のやりかたを説明します。

まず、「Identity Providers」のGitHubの設定画面を開き、「Store Tokens」と「Stored Tokens Readable」の2つの設定を「ON」にします。

![CleanShot 2022-11-02 at 15.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/77d472d4-c062-8e02-9c2b-d24eb785571d.png)

これにより、ユーザーのKeyCloakのアクセストークンを使うことで、GitHubのアクセストークンを取得できるようになります。GitHubのアクセストークンを取得するKeyCloak APIのエンドポイントは下記になります。

```http
GET /realms/myrealm/broker/github/token HTTP/1.1
Host: localhost:8080
Authorization: Bearer <KEYCLOAK ACCESS TOKEN>
```

## 関連

https://qiita.com/suin/items/cb60e903eb1ddb15719b

https://qiita.com/suin/items/108f0b9ee6350226e011
Webで動くパネルルーレット

# Web で動くパネルルーレット

某所で、並んだパネルからアイテムが選ばれるルーレットがほしいみたいな話があったので、練習に軽く作ってみた。
桃鉄の目的地みたいな表示をする。

## 実物

https://riawiththesam.github.io/pannel-roulette/

## 機能

- ルーレット
  - ボタンクリックでルーレット開始/停止
- すべて表示
  - 選ばれるアイテムを一時的にすべて表示する
- アイテム変更
  - リスト内を編集してルーレットのアイテムを変更
- 背景変更
  - ローカルの画像を読み込ませて背景として設定
- 全画面モード
  - ルーレットをクリックで全画面に変更
  - 全画面中はルーレットクリックで開始/停止
  - 端末の全画面じゃなくてブラウザの全画面

## つかったもの

### Vite

本番用ビルド、開発用サーバ、環境構築に利用。超便利。
デプロイ先が GithubPages なのでちょっとだけコンフィグをいじった。

GithubPages はリポジトリ名のパスにファイルが置かれる。
Vite のデフォルト設定だと、ルートに置かれることが前提になっているので`base`設定を追加。

[該当箇所](https://github.com/riawiththesam/pannel-roulette/blob/master/vite.config.ts#L6)

[vite](https://ja.vitejs.dev/config/shared-options.html#base)

### TypeScript

Web 開発やるならこれ
Vite の CLI で設定できるものをほぼそのまま利用
たまにこの型どうなってんだ？はあるけど、React-Redux で色々してた頃ほど大変じゃない

### React

Web なのでとりあえず React でやった。
が、ルーレットアプリなんだから別にこれでやる必要はなかった。

### ReactKonva

ルーレットのグラフィックを表現する Canvas エレメントの制御のために利用。
React の世界の中で Canvas を扱える。
軽く Canvas を使うくらいならこれで良いけど、最初から[Pixi.js](https://pixijs.com/)や[Phaser](https://phaser.io/)を使ったほうが楽だったかも

### [use-timer](https://github.com/thibaultboursier/use-timer)

ルーレットの点滅の表現のために利用。
タイマーで 0.1 秒ごとにコールバックさせて、ステートを更新することで点滅させている

### [just](https://github.com/angus-c/just)

ユーティリティ。lodash は中身がそこそこ複雑だけど、just は 1 機能 1 ソースで見やすくて好き

### [gh-pages](https://github.com/tschaub/gh-pages)

`gh-pages -d dist`だけで Vite の生成物を GithubPages で公開できる。楽ちん

### GithubPages

デプロイ先。パスが固定になるので、Vite の設定に注意が必要。
また、ReactRouter もそのパスを基準に動作するように調整する必要がある。
他に、ルート以外への直アクセス時に 404 になるので、対策が必要(まだやってない)

## 問題点

[TypeScript](https://www.typescriptlang.org/) + [MUI](https://mui.com/) + [ReactKonva](https://konvajs.org/docs/react/Intro.html) の構成で開発中、アニメーションを強化しようとして、
[ReactSpring](https://github.com/pmndrs/react-spring) を追加したところ、`ReactKonva`のコンポーネントが使えなくなった。
たぶん発生したのは[これ](https://github.com/pmndrs/react-spring/issues/1515)
すこし書いてある方法ではわたしは調整できず、ReactSpring を諦めた。
最初から React 使わずやったほうが絶対良かった気がする。

ReactKonva のみだと、Animation 機能に Easing がない。
(直線的なアニメーションじゃなくて、時間軸で曲線的な動きをさせることできれいなアニメーションにするやつ)

## まだやってない機能

- 4x3 以外のレイアウト、アイテム数変更
- アイテム枠線変更
- キーボード操作
- 効果音
2022年の terraform-jp 振り返り

# tl;dr

- この記事は[terraform Advent Calendar 2022](https://qiita.com/advent-calendar/2022/terraform)の1日目です
- 2021年に引き続きコロナに振り回された１年でしたがお疲れさまでした
- [terraform-jp](https://join.slack.com/t/terraform-jp/shared_invite/enQtNTM2NTYzNDY0OTkyLTcxOTYxNmZhZmU3ZGIzOWU3M2RiODkyZTRmZTc0MjEwNjQ1NjMyZDAwMTExODc3MzkxNjAwNmU5ZDY1MTg3YTA) はオンライン以外の活動ができませんでした
- 来年こそ（去年も言った）、コロナがある程度落ち着いたら、[2019年に書いた記事](https://qiita.com/raki/items/96691d45922dd25e1365)のやりたいことをやっていきたいと思います
- ぶっちゃけ少人数での飲み会は行われているし、完全なオンラインでもやろうと思えばやれるよね

# 活動報告

- 2022年のオフライン活動はありませんでした
- mini-study チャンネルで個別にオンラインミーティングをいくつかしました。slack の無料プラン厳しい＞＜
- ちょいちょい質問チャンネルは動いているんですけれども

# terraform では

- v1.1.3 は2022年1月にリリースされました（v1.1.0 は2021年12月8日）
- v1.2.0 は2022年3月にリリースされました
- v1.3.0 は2022年9月にリリースされました
- 現時点（2022年12月1日）での最新は v1.3.6 です（日本時間12/01 05:30 頃タグがつくっていうね。もうね。）

# その他の HashiCorp 製品では

- [HCP](https://cloud.hashicorp.com/) は waypoint がベータです。先日仕事の関係で HashiCorp の営業さんとお話した時に、terraform だけ名前が違うのなんとかしないの？って聞いてみたけどなんともならないようですｗ
- [HashiCorp Cloud Engineer Certifications](https://www.hashicorp.com/certification) の terraform 試験は 003 が準備中です。手間取ってるっぽい？
- [HashiCorp at AWS re:Invent 2022](https://events.hashicorp.com/reinvent2022) がこの記事が公開される頃やっている（11/28 - 12/01）ので、後日誰か記事にしてくれることを期待ｗ って、re:Invent にブースだして Consul とかのセッションやったってことっぽい？（詳しくは見てない

# 来年は

- "コロナでオフラインにはまだ忌避感あったり、感染対策が必要だったりするので、オフライン開催をあきらめ、定期的な小規模オンラインMTGを実施したい"
    - ってことを去年（2021年）書いたので、年明けごろにオンラインミーティングを何回か実施しましたが、継続には至りませんでした。
    - slack ハドルがユーザ会とかにも無償で提供されると楽なんだけどって去年書いたけど、1on1でしか使えないの残念。。。
    - [gather](https://www.gather.town/) か [discord](https://discord.com/) で何かできるといいんだけど

# 最後に

[terraform-jp](https://join.slack.com/t/terraform-jp/shared_invite/enQtNTM2NTYzNDY0OTkyLTcxOTYxNmZhZmU3ZGIzOWU3M2RiODkyZTRmZTc0MjEwNjQ1NjMyZDAwMTExODc3MzkxNjAwNmU5ZDY1MTg3YTA) を参加している人たちみんなでもっと盛り上げていけるようにしたいと思います。
って毎年同じこと言ってるジャン。。。_no
Git サーバーを構築する（備忘録）

# Server (Ubuntu)

Open SSH付でインストール

Install git
```sh
sudo apt install git
sudo apt install git-lfs
```

Create user
```sh
sudo userdel -r git
sudo useradd -m git
sudo passwd git
su - git
```

Git config
```sh
git config --global init.defaultBranch main
git config --global core.autoCRLF false
```

Create Repo
```sh
mkdir repo.git
cd repo.git
git init --bare --shared=0777
git lfs install
```

# Client (PS, Linux)

Init Repo
```sh
git config --global user.name 'username'
git config --global user.email 'user@example.com'
ssh-keygen -R XXX.XXX.XXX.XXX
ssh git@XXX.XXX.XXX.XXX
exit
git clone git@XXX.XXX.XXX.XXX:~/repo.git
cd repo
git config --global init.defaultBranch main
git config --global core.autoCRLF false
git lfs install
git lfs track "PATH/*"
git add .
git commit -m "lsf init"
git push
git fetch
git pull
git status
git log
git remote -v
```

# Other

origin : リモートリポジトリのアクセス先に対してGitがデフォルトでつける名前

HEAD : 今自分が作業している場所を示すポインタ


# Reference

https://blog.katsubemakito.net/git/git-config-1st
[Golang]APIのバージョン管理

```go:main.go
package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"example/webapp/api/v1"
)

r := gin.Default()

func main() {
    r := gin.Default()
    v1.GroupRouter(r)

	r.Run()

}
```

```go:urls.go

package v1

import (
	"fmt"
	"github.com/gin-gonic/gin"
	
)

func ApiTemp(router *gin.RouterGroup) {
	router.GET("/ping", func(c *gin.Context) {
		// queryparamerの値を取得する
		// fmt.Println(c.Query("samplequery"))
		c.JSON(200, gin.H{
			"Message": "v1 ping healthcheck",
		})
	})
}



func GroupRouter(check *gin.Engine){
	check.GET("/healthcheckcheck", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "healthcheckcheck",
		})
	})
	v1_path := check.Group("/v1")
	ApiTemp(v1_path)

}

```
ラストのまほう　第５話『WASM-4 APIリファレンス(日本語版)』

# WASM-4 APIリファレンス日本語版

このあたりでWASMのAPIについてみてみましょう。WASM-4のAPIはとても簡素で、**関数がたった12個**しかありません。この12個さえ理解すればWASM-4を完全に理解したも同然です。（ほんとか？）

この記事では、WASM-4の全体像をつかめるよう、すべての関数について簡単に紹介しておきたいと思います。でも、英語を読める人はこの公式のリファレンスを読もう！

https://wasm4.org/docs/reference/functions

## グラフィックス

### `blit (spritePtr, x, y, width, height, flags)`

画像をスクリーンに描画します。画像データは `w4 png2src`でPNG画像から生成するといいです。

### `blitSub (spritePtr, x, y, width, height, srcX, srcY, stride, flags)`

画像の一部分を指定してスクリーンに描画します。

### `line (x1, y1, x2, y2)`

直線を描きます。

### `hline(x, y, len)`

水平の直線を描きます。


### `vline(x, y, len)`

垂直の直線を描きます。


### `oval (x, y, width, height)`

楕円形を描きます。描画色を変更すると枠線を描くこともできます。

### `rect (x, y, width, height)`

矩形を描画します。描画色を変更すると枠線を描くこともできます。

### `text (str, x, y)`

8ピクセル四方のフォントサイズで文字列を描画します。ASCIIの文字しか描けず、日本語の平仮名や漢字はWASM-4に内蔵されていないので書けません。どうしても日本語を描画したいなら、使いたい文字を画像にして`blit`するしかないと思います。

フォントには矢印キーとボタン1、ボタン２のフォントも含まれていて、画面上に操作方法を表示したいときにはこれを使えば良さそうです。使える文字は[フォントのファイル](https://github.com/aduros/wasm4/blob/main/runtimes/web/assets/font.png)を見るとわかります。



## サウンド

### `tone (frequency, duration, volume, flags)`

周波数、長さ、ボリュームなどを指定して音を鳴らします。BGMを鳴らすのも、効果音を鳴らすのもこの関数を使います。MP3ファイルを再生するだとか、MIDIファイルを再生するだとか、そういう高度な機能は一切ありません。この関数の仕様は実はかなり複雑なので、詳しくは公式ドキュメントをどうぞ。しかもこの記事の執筆時点でバグらしき挙動があったので要注意です。

## ゲームデータの保存と読み込み

### `diskw (srcPtr, size)`

バイトブロックを渡してゲームのセーブデータを書き込みます。全体でひとつの領域になっていて、セーブデータ1、セーブデータ2……みたいな区別もないのでそのへんは自力でなんとかしましょう。しかも1キロバイトが最大長です。

### `diskr (destPtr, size)`

ゲームのセーブデータを読み込みます。書き込まれたサイズがどのくらいなのかは引数で自力で指定しなければならないので、可変長のセーブデータだと微妙に困ります。先頭にファイル長を入れておけばいいんでしょうか。

## デバッグ

### `trace (str)`

デバッグ用にコンソールに文字列を出力します。Rustだと`format!`マクロを組み合わせて`trace(format!("PATERN", values))`の形で使うと良さそうです。

WASM-4の関数はこれで全部です。WASM-4が定める関数のインターフェイスは、上記の12個加えて、各ゲームごとに定義するコールバック関数である `update` と `start` だけです。


# 次回予告

次回はどんなゲームを作るのかの計画をちゃんと練りたいと思います。

https://qiita.com/hiruberuto/items/11da46642c91df5039b4
Emacs Tramp ドキュメント翻訳

# 注意
ドキュメントに記載がある magit-tramp パッケージは 2022.12 現在、パッケージリストに存在しないようです。

# 現状
翻訳終了(2022/12/06)

以下については訳出しません
- The license for this documentation.
- Function Index
- Variable Index
- Concept Index

"8 Frequently Asked Questions" まで訳出しました(2022/12/04)

"6 Using TRAMP" まで訳出しました(2022/11/29)

"5 Configuring TRAMP" まで訳出しました。(2022/11/15)

````
status by sentence: 1898+0f+0u
progress by sentence:1898/1898(100.00%)
progress by files: 7/7
2022年 12月  6日 火曜日 17:12:09 JST
````

# 何か
Emacs TRAMP 2.6.0-pre のドキュメント(Info)の翻訳です。

#使い方
こちらから

https://kuma35.github.io/tramp-docs-ja/

リポジトリは

https://github.com/kuma35/tramp-docs-ja

#ビルド

ブランチは docs-ja

sh -x path/to/me/texi-po/compile.sh

## その他スクリプト

msgcount.sh 上記「現状」と同じ出力をします

msgstat.sh 仕掛り中の po ファイルのリスト
msgstat.sh newbie 未着手の po ファイルのリスト

## docs/index.html

git-docs-ja と異なり、 texi-po/index.html を編集して下さい。docs/index.html にコピーします。

## .gitignore
直下の .gitignore をいじってあります。 docs/info フォルダで git add -f しろと怒られないようにするためです。
OpenXR Windows 編

https://qiita.com/ousttrue/items/582a970d8906914be3a8

から Windows 向けの内容を分離。
OpenXR を使う部分は同じグラフィクスAPIを使っていれば共通化できる。
OpenGLES とか Vulkan なら、WindowsMR, Steam, Oculus と Android 全部で動くエンジンにできるのではないか。

# OpenXR本家のサンプル hello_xr のビルド

`openxr_loader` を使うサンプルが

https://github.com/KhronosGroup/OpenXR-SDK-Source

の

`src/tests/hello_xr` フォルダにあります。
これを vc + cmake でビルドします。

* vc2019
* python-3.7(cmake が古いと python の検出に失敗してビルドできない。3.7 は cmake-3.10 で検出できる。)
* git clone https://github.com/KhronosGroup/OpenXR-SDK-Source

普通に cmake ビルドします。

## 実行

* `build/src/tests/hello_xr/hello_xr.exe`
* openxr_loader.dll にパスを通す

# openxr runtime 

Desktop は複数の VR platform があって winmr, steam, oculus などが選択できます。
アクティブな openxr_loader という概念がありこれが自動で選択されます。
winmr では d3d, oculus では opengl か vulkan, steam は両方できるという違いがあり、
hello_xr.exe の実行引数で Graphics API 指定する必要があります。

https://github.com/maluoi/openxr-explorer

は、VR paltform の切り替えと、platform の拡張の一覧を見れます。
PythonでHeapsort

# PythonでHeapとHeapsortの実装

```python
from typing import List

def heap_up(array: List[int], idx: int) -> List[int]:
    """Bubble up the element at idx until it is in the correct position.

    Args:
        array (List[int]): The array to heapify.
        idx (int): The index of the element to heapify.

    Returns:
        List[int]: The array with the element at idx heapified.
    """
    left = 2 * idx + 1 if 2 * idx + 1 < len(array) else None
    right = 2 * idx + 2 if 2 * idx + 2 < len(array) else None
    largest = idx
    if not left:
        return array
    if array[idx] < array[left]:
        largest = left
    if right and array[largest] < array[right]:
        largest = right
    if largest != idx:
        array[idx], array[largest] = array[largest], array[idx]
        array = heap_up(array, largest)
    return array

def heapify(array: List[int]) -> List[int]:
    """Return a heapified version of the array.

    Args:
        array (List[int]): The array to heapify.

    Returns:
        List[int]: The heapified array.
    """
    for i in range(len(array) // 2 - 1, -1, -1):
        array = heap_up(array, i)
    return array

def heap_sort(array: List[int]) -> List[int]:
    """Return a sorted version of the array using heap.

    Args:
        array (List[int]): The array to sort.

    Returns:
        List[int]: The sorted array.
    """
    array = heapify(array)
    for i in range(len(array) - 1, 0, -1):
        array[0], array[i] = array[i], array[0]
        array = heapify(array[:i]) + array[i:]
    return array
```
マインドフルネスの効果について個人的なまとめ

# マインドフルネスの効果について個人的なまとめ

## 記事の背景

昔マインドフルネスに興味が出て少し調べたことがあったのですが、その時はピンときませんでした。効果が「人生すべて良くなります！」みたいな感じでふわっとしてたのと、やる内容と効果のつながりがよく分からなかったのとで。
現在メンタルの関係で医療にかかっており、そこで半年くらいマインドフルネスの指導や関係療法を受けています。困っている症状や普段の生活の改善に効果あったような気がします。

:::note alert
私は医療従事者ではありません。治療が必要な方は専門機関にご相談ください。
:::

この記事ではマインドフルネスの効果について、私の理解や体験をざっくりまとめます。教わったことを忠実に書いてはいないので、早わかりや正確さを求める方には不向きです。

私の感覚で書いているので、多くの方には次の記事のほうが分かりやすいんじゃないかと思います。
[エンジニアにこそ勧めたいマインドフルネスと、自分が勘違いしていたポイント - Qiita](https://qiita.com/funatsufumiya/items/f6afb7d8367b403e5f63)

## マインドフルネスとは

マインドフルネスとは具体的な物事や手順ではなく、状態のようなものです。

- いまここに注意を向けている
  - 思い出したり、予定を考えたり、空想したりしていない
  - 後悔とか不安とかがない
- あるがままを感じている
  - 判断や評価をしていない（「どうしよう」「こうしなきゃダメだ」していない）
  - 否定していない（「そんなはずない」「そんなことない」していない）

日常生活では以下のような状況でマインドフルネスになったことがあります。たぶんあれがマインドフルネスだったんだと思います。

- 聴力検査、リズムゲーム
- ジェットコースター、整体
- 音楽鑑賞、絵画鑑賞
- デバッグ

## マインドフルネスの訓練

マインドフルネスに持っていく能力は訓練できます。
いろいろな方法があります。[Wikipediaのマインドフルネスの記事](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89%E3%83%95%E3%83%AB%E3%83%8D%E3%82%B9#%E7%9E%91%E6%83%B3)にいくつか紹介されています。

落ち着いて集中できればなんでもいいと思います。
コンディションによってうまくいったりいかなかったりしますが、長い目で見れば上達していくはずです。

### 訓練でのポイント

慣れないうちは刺激が少ない環境でやると気が散りにくいです。
ほどよい温度、音、光。体も変なこわばりが出ないようにほぐしておくとよいです。

いろいろ思い浮かんでも、強くいじくりまわさずに遠くから眺める程度に放っておきます。「考えないようにしなきゃ」って力むとかえって考えてしまいます。[ムラサキカガミ](https://ja.wikipedia.org/wiki/%E7%B4%AB%E3%81%AE%E9%8F%A1)みたいですね。
私の場合はセンサーになったイメージで過ごすとうまくいくことが多いです。

## マインドフルネスの効果

大きく2種類あります。「マインドフルネスに持っていく能力の向上による効果」と「マインドフルネス状態による効果」です。

### マインドフルネスに持っていく能力の向上による効果

訓練を続けたことによる、体質改善のような効果です。
トラブル対応や期限に追われているような、エンジニアあるあるのストレスフルな状況に対応しやすくなる気がします。

- 焦ったりくよくよオロオロしにくくなる
  - 不安症のパニック発作がてきめんに減りました
- 動揺しても落ち着きやすくなる
- 現実を認めやすく/受け入れやすくなる
  - 「ありえない」「そんなはずない」「あってはならない」みたいになりにくくなった気がします
- 自分の状態に気付きやすくなる
  - 疲れているなぁとか、実は怒っているんだなぁとか
- いわゆるゾーンとかフロー状態に入りやすくなる

### マインドフルネス状態による効果

マインドフルネスの度合いは何段階かに分けられる気がします。

| 段階 | 状態 |
|-----------|------------|
| 0 | パニック！　頭ぐるぐる/くよくよ |
| 1 | 動揺している自覚はある |
| 2 | たまに気が散るが、おおむね対象に注意を向けている |
| 3 | 対象に集中できている。没頭している。頭はほてり気味。 |
| 4 | ゾーン状態。明鏡止水。状況が鮮やかに把握できている。頭は冴えてクリア。 |

段階0が長期間続くと、脳が消耗して自律神経失調症だとかいわゆる副腎疲労だとか、ほかにもいろいろ不調が出そうです。私は出ました。
0より上の段階だと、次のような効果がありました。

- 消耗が減ってリフレッシュできる
- 落ち着くことで新たな気付きを得られる
Lively Wallpaperでvideoタグを使って動画を流す

# はじめに
videoタグを使用したhtmlファイルをLively wallpaperに設定してデスクトップの背景に動画を連続再生したかったのですが、思わぬところで躓いたのでメモします。

# やりたいこと
htmlファイルを用意し、Lively wallpaperに読み込ませます。
他にsrcに動的に動画ファイルを設定したり動画を全画面にしたりするスタイルシートを用意したりもしますが、やりたいことはこんな感じです。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
    </head>
    <body>
        <div class="wrapper">        
            <video id="video" autoplay muted src="./movie.mp4">

            </video>
        </div>
    </body>
</html>
```

# 設定してみる
設定しますが、プレビューも真っ黒になってしまうようにこのまま壁紙として有効化しても動画が再生されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131298/e77bcd25-4eff-b863-8895-c4c28852aa34.png)

ただし、htmlファイルを直接開いてブラウザで確認すると再生されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131298/313e1aae-18fd-a4b2-8ea0-78a7874a9292.png)

# 解決方法
Lively WallpaperのWebブラウザはデフォルトではCefSharpが選択されます。
しかし、CefSharpではオープンなファイルコーデックのみをサポートしており、H264/AACなどのコーデックはサポートされていないためmp4形式のファイルは再生できないことがあります。
そのため、今回の場合WebブラウザーにWebView2を選択する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131298/9456b797-fc40-81b4-1dad-1b244eea7c9e.png)

## Webview2プラグインのインストール
このまま有効にするとWebview2プラグインがないことでエラーが発生するためプラグインをインストールする必要があります。
以下を参考にインストールします

https://github.com/rocksdanister/lively/wiki/Web-Player#webview2-microsoft-edge

インストール後、Lively wallpaperを再起動しWebブラウザーをWebView2に設定します。

# そして解決
htmlファイルを追加するとプレビュー上でも動画が再生されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131298/052a7f31-2912-c7a9-23e2-df88cf8750b1.png)

背景上でも動画が再生されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131298/2b5a73e5-0740-818c-fe26-ec15bbb0bd81.png)

# 補足
- Lively wallpaperはMicrosoft Store経由でもインストールできますが、この場合WebView2プラグインを適用できるかは不明です。インストーラー版でインストールしたほうが良いかもしれません…

# 参考
https://github.com/cefsharp/CefSharp/wiki/General-Usage#multimedia-audiovideo
ラストのまほう　第６話『ゲーム開発を計画する』

いきあたりばったりに開発するのも楽しいですが、完成させるためには計画は大切なので、このあたりで少し計画を練っておきます。今回はプログラミングは無しです。「ものごとは決して計画通りには進まないが、それでも計画は必要だ」みたいなことを言った人は誰でしたっけ。

# 👾ゲーム開発の計画

このシリーズでどんなゲームを作るかですが、いわゆる**プラットフォーマー**でいこうと思います。要するにマリオとかと同様の、主にジャンプで移動しつつステージクリアを目指すタイプのアクションゲームです。

比較的開発が楽そうなパズルゲームなんかに比べると、アクションゲームは衝突判定のプログラムが難しかったり、キャラクターアニメーションが大変そうではあります。でも、何かプラットフォーマーで遊んだ経験があればゲームのルールも操作方法もすぐわかるのでプレイヤーも取っつきやすいですし、プレイを見る側の人にとっても何が起こっているのかわかりやすくて楽しいです。

また、少ないボタンでも操作を表現しやすいです。WASM-4は何しろボタンが少ないので、あまり複雑な操作はできません。基本的に十字キーで移動＋ジャンプボタンだけで操作できるプラットフォーマーはWASM-4のような環境にぴったりです。そして何より**筆者はプラットフォーマーというジャンルが好き**なので、開発していて楽しいだろうということでこの判断になりました。やっぱり自分が好きなジャンルでないとモチベーションが保てませんから。

また、開発期間の目安としては、この年末で仕上げる！くらいを考えています。進捗は随時このシリーズの記事で報告していくので、よかったらご覧ください。


# 🎴ゲームの大まかな仕様

完成が大切なので、仕様は次のような感じにとにかく絞ります。

- 想定プレイヤーはカジュアルゲーマー
- 想定プレイ時間10分～30分くらい
- 全１ステージ
- ゴールに辿り着いたらゲームクリア
- ゲームオーバーなし
- 操作は基本的に移動とジャンプのみ（ドアを開くとかの多少のインタラクションは入れるかも？）
- ストーリーなし（ゲームスタート演出、ゲームクリア演出くらいはしますが）
- 操作はゲームパッド前提。キーボードでもプレイできますが、操作しづらいのでアクションのあるゲームではゲームパッド推奨です。

せっかく作るので、ただのプラットフォーマーじゃなくて何か特徴をつけたいな……とかはちょっと思ったのですが、**独自性とかそういう余計なことを考え始めるとだいたい完成しなくなる**ので我慢します。いったん完成してからオマケ要素として付け加えてもいいですしね。


想定プレイヤーは、何からのゲームに触れたことがある程度の**カジュアルゲーマー**とします。つまり、ゲームの「お約束」を事細かに説明はしなくていいかな、ということです。ゲームをやったことがある人なら、左右で移動、ボタンを押したらジャンプくらいはまあ想像が付きますし、丁寧に説明しなくてもたぶんどこかに「ゴール」があってそこに行けばいいんだろうなだとか、まあ何か探索してみよう、だとかそのくらいは期待してもいいでしょう。

これが初心者ゲーマーを視野に入れると、丁寧なチュートリアルを入れたり序盤の難易度を徹底的に下げたりという工夫が必要になってくるかなと思います。ちょっとそこまで作り込む余裕はないです。

全１ステージやゲームオーバーなしというのは、ステージ切り替えやゲームオーバー演出を始めると作業が増えるからやりたくないだけです。ローグライクのようなゲームでない限りゲームオーバーに大きなペナルティはないわけで、そこはユーザーがストレスを感じない作りにしていきたいと思います。


# 🎮ゲームの操作体系

また、操作はゲームパッド前提で行きたいと思います。WASM-4は画面上に仮想ゲームパッドを出すことができて、そちらでもゲームを操作できますのでスマホやタブレット単体でも遊ぶことができます。しかし筆者はスマホやタブレットでゲームをするのがあまり好きじゃなくて、というか**タッチパネルでプレイするのは耐え難い**と感じます。スマホ画面でボタンやスティックを触っている感触がない状態だとプレイしにくくて、すごく面倒くさくなってしまいます。

ちなみに筆者は[logicoolのF310](https://gaming.logicool.co.jp/ja-jp/products/gamepads/f310-gamepad.940-000137.html)を使っています。比較的安価ながら操作しやすくて、ゲームパッドを持っていない人にはおすすめです。

# 👩‍🎨グラフィクスの仕様

WASM-4のスクリーンは 160ピクセルX160ピクセルしかありません。ここでキャラクタースプライトのサイズが重要になってきます。たとえば、キャラクターが8ピクセルx8ピクセルの大きさなら、画面上には20タイルx20タイルの領域の広めの領域を表示できることになりますが、幅がたった8ピクセルではキャラクターの表現は限られます。一方で、もしキャラクターを16ピクセル四方のサイズにした場合は、キャラクターを詳細に描画できる一方で、画面内には10タイル四方しか表示できません。

このあたりで参考にしたのは初代『スーパーマリオランド』と『スーパーマリオランド２　６つの金貨』なのですが、６つの金貨はキャラクターが大きくて詳細に描かれている反面、画面はかなり狭苦しく感じます。プラットフォーマーとしては遠くまで見えたほうがどう考えてもプレイしやすいので、今回はキャラクタースプライトを小さめにして幅8ピクセルx高さ16ピクセルという初代マリオランド並みのサイズにしたいと思います。これにならって、ステージマップも8ピクセルx8ピクセルを１タイルという基準でデザインしていきたいと思います。

これには、キャラクタースプライトの解像度を落とすことで絵を描く作業を楽にしたいという意味もあります。ドット絵を描くのは大変なので……。



# 🔜次回予告

~~今回はプログラミングなしですみません。次回はもう少しプログラミングっぽいことをやっていきたいと思い、ゲーム開発に絶対に必要になるベクトル演算まわりの整備から始めたいと思います。~~

予定変えたのを忘れてました。次回は早速デプロイして、実際に遊べるデモを用意したいと思います。

https://qiita.com/hiruberuto/private/06d86fa363ce8c663174
Mapオブジェクトはmapメソッドを使用できる【Javascript,Typescript】

## 概要
Mapオブジェクトを反復で使おうとする際、何も考えず下記のように書くと`プロパティ 'map' は型 'Map<string>' に存在しません。`と注意される。
```javascript
const hoge = new Map();
hoge.set("key1","value1");
hoge.set("key2","value2");
hoge.map(x=>console.log(x))//Error: hoge.map is not a function
```
これは単純な理由で、Mapにはmapが実装されていないためだ。

しかし、上記の代わりに下記を書くと問題なく実行できる。
```javascript
const hoge = new Map();
hoge.set("key1","value1");
hoge.set("key2","value2");
[...hoge].map(x=>console.log(x))
//> Array ["key1", "value1"]
//> Array ["key2", "value2"]
```
これはMapが **反復可能プロトコル** に沿っているからだ。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Iteration_protocols

>String, Array, TypedArray, Map, Set は、すべての組み込み反復可能オブジェクトです。

この反復オブジェクトは`[...hoge]`のような、スプレッド構文を使用することで展開ができる。

```javascript
const hoge = new Map();
hoge.set("key1","value1");
hoge.set("key2","value2");
console.log([...hoge])// Array [Array ["key1", "value1"], Array ["key2", "value2"]]
```
よって、Mapオブジェクトでも以下のようにmapメソッドを用いることができる。
```javascript
const hoge = new Map();
hoge.set("key1","value1");
[...hoge].map(x=>console.log(x))
```
## これはどこで使うの？
ReactでMapメソッドを用いて重複をチェックしつつ配列管理を行いたい際に、Mapをそのままコンポーネントに落とし込めるのではないか？と考えている。近日中に記事を書いてここに追記する。

## まとめ
Mapは反復可能プロトコルに沿っているため、スプレッド構文を用いることで`[[key1,value1],[key2,value2]]`という配列に展開でき、展開されたものはArrayのためmapメソッドが使用できる。
Azure Policyについて

●Azure Policy
・組織独自のコンプライアンス要件を持つ場合
・太油なリソース種類や不適切な構成での作成を制限したい場合
・リソース管理の一貫性を他界めたい場合

このような組織のニーアズに対するものとしてAzure Policyがある。
ポリシーの作成や割り当て及び管理に使用できる。

リソース作成時に特定のタグの付与を必須にし、リソース管理の一貫性を高めるっことができる。

●Aziure Policyの手順
ポータルのサービス一覧から「管理＋ガバナンス」カテゴリないにあるポリシーをクリック。

１、ポリシー定義の作成または確認
新規作成または最初から用意されている組み込み（ビルドイン）でも使用できる。

２、イニシアティブ定義の作成
複数のポリシーをまとめて定義したい場合に作成。単一のポリシー定義のみを使用する場合には必須ではない。

３、割り当ての設定
前の手順で作成したポリシー定義またはイニシアティブ定義を割り当てるスコープのパラメーターを設定する。割り当ての設定によってポリシーの適用範囲が決定される。

４、結果と評価の確認
割り当てによってポリシーの内容に基づいてAzure上の操作が制限されるため、最後はその結果を確認する。また、既存リソースの評価結果を確認し、準拠していないリソースがある場合には、そのリソースの変更や削除などの対応を行う。
レビューしやすいPRテンプレートを作ってみた

こんにちは。[rendaman0215](https://twitter.com/rendaman0215)です。

GitHubでレビュー時、PRに記載されている変更内容の粒度がレビュイによって異なりますよね。
そこで記載する内容や粒度を合わせるためにPRテンプレートを導入されているチームも多いと思います。
私のチームでもPRテンプレートを導入し始めたため、導入するまでの流れをまとめました。

## テンプレートの構成を考える
まず、テンプレートの構成を考えるにあたり、直感的にほしいと思う項目、一般的な項目、別のチームで採用されている項目をまとめました。

- 関連するissue番号
- 修正内容
- レビューしてほしいポイント
- PR前のチェックリスト
- 参考資料
- 補足・その他

ここから一項目ずつ精査していき要否を検証していきました。

### issue番号
私のチームでは、issueをチケットとして利用し、issue駆動で開発を行っており、PRには必ずissueが紐づくようになっているため、issue番号はマストでした。
GitHubでは、`- {issueのURL}`とPRに記述することで、issue番号＋issueのタイトルが表示されます。
![スクリーンショット 2022-11-03 0.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264373/0d794f10-bc9d-3d44-c822-1f884a5ca95e.png)

しかし残念ながらGHEではissueのタイトルが表示されません。
弊社ではGHEを採用しているため、issue番号 + 概要を記載することとし、まとめて`概要`として採用することとしました。

### 修正内容
`どこ`を`なぜ` `どう直したか` `修正した結果どうなるか`を箇条書きでかく場所です。
概要より細かい粒度で書くことでレビュアの労力を軽減しています。
レビュアの想定外の場所が修正されていた際、その理由などきく必要がないためここの手間が省けます。

### レビューしてほしいポイント
上記の内容を踏まえ、重点的にレビューしてほしいポイントや自信のないポイントを記載してもらいます。
こちらは、レビュイ視点で取り入れるべきと判断しました。

### PR前のチェックリスト
別のチームで採用されているため、候補にあがりました。
そちらのチームでは、テストの実装ができているか、commit履歴にissue番号が入っているか、などのチェックリストがありました。
しかし、チェックリスト自体組織が大きくなっていくと形骸化しやすいこと、私自身チェックリストが苦手ということもあり、チェックリストは自動化することで廃止することとしました。

- ex)
  - commit履歴の精査は、.precommitを利用し検証
  - テストの実装は、カバレッジを出力することで対応

### 参考資料
ほとんど使われることがないため、補足・その他と一緒にまとめることにした。

## PRテンプレート
上記の内容を踏まえ、最終的に出来上がったのが以下のテンプレートです。
```
## 概要

## 修正内容

## 影響範囲

## レビュー観点

## 補足
```

## テンプレートの設定
[公式ドキュメント](https://docs.github.com/ja/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository)で紹介されていますが、簡単にまとめると以下の通りになります。

- pull_request_template.mdというファイルを作成する
- PRテンプレートファイルは、基本的に `/.github`ディレクトリに格納するとよい
- デフォルトブランチにPRテンプレートファイルがcommit/mergeされると反映される

## おわりに
PRテンプレートを用いることで様々なメリットがありました。
レビュアは以前よりレビューしやすく、レビュイはフォーマットを気にせずPRを作れるようになり、新規参入者は過去PRを見やすくなりました。
定期的に見直すことでよりよくしていきたいと思います。（遊び心で絵文字を追加するとか）