OmniAICreator/Qiita-1.07M huggingface dataset:
Linux 権限変更

## ディレクトリ・ファイルの権限の確認方法

権限を確認したいディレクトリ/ファイルに移動して以下のコマンドを実行する。
```
ls -l
```

すると、ファイルの場合はそのファイルの情報が、ディレクトリの場合はディレクトリとディレクトリ内のファイルの情報が以下のように一覧で表示される。

```
-rw-r--r--. 1 ec2-user ec2-user  524 Dec 30 09:58 Dockerfile
drwxr-xr-x. 2 root     root       63 Dec 31 10:42 __pycache__
```

1番左の

```
-rw-r--r--
drwxr-xr-x
```

の部分が権限情報部分。


## 権限情報の見方
#### ルール1：　rwxの3セット
権限の種類はrwxの3文字で表現される。
|文字  |意味  |
|---|---|
|r |  読み取り権<br>ファイル/ディレクトリの読み取りができる|
|w |  書き込み権<br>ファイル/ディレクトリの書き込み・編集ができる|
|x |  実行権<br>ファイル/ディレクトリの実行ができる|


#### ルール2: 一文字目はファイルの種類を表す
一文字目がdの場合ディレクトリであることを表し、-(ハイフン)の場合はファイルであることを表す。
※一文字目以外の-(ハイフン)は権限がないこと表す

```
① -rw-r--r--
② drwxr-xr-x
```

①はファイルに対する権限を、②はディレクトリに対する権限を表している。

#### ルール3: rwxの3文字×3(ユーザーの種類)のセットになっている
権限は、ルートユーザー、ユーザーグループ、その他のユーザーの3種類のユーザーに対して設定できる。

ルートユーザー：　ファイルやディレクトリの所有者。他のユーザを作成したり、OSの設定ファイルを修正したりといったことができる(管理者権限)

ユーザーグループ：　ファイルの所有グループ

ユーザー：　その他のゲストユーザー

```
① -rw-r--r--
② drwxr-xr-x
```

①の場合
種類：　フォルダに対する権限
ルートユーザー：　読み込み権・書き込み権
ユーザーグループ：　読み込み権
ユーザー：　読み込み権


②の場合
種類：　ディレクトリに対する権限
ルートユーザー：　読み込み権・書き込み権・実行権
ユーザーグループ：　読み込み権・実行権
ユーザー：　読み込み権・実行権


## アクセス権を変更する
各ユーザーのアクセス権を変更するには、Linuxのchmodコマンドを使う。

```
chmod (モードを指定) (ファイル名)
```
権限を変更する(モードを指定)部分では、数字で指定する方法とアルファベットで指定する方法の2種類がある。

#### 数字で権限を変更

|数字  |権限  |
|---|---|
|4 |  読み取り権(r)|
|2 |  書き込み権(w)|
|1 |  実行権(x)|

<br>
数字で権限変更をする場合は、読み取り、書き込み、実行のそれぞれの数字を足した数値を、ルートユーザー、ユーザーグループ、ユーザーの順に指定する。

ex) hoge.txtファイルに対して
ルートユーザーに全ての権限を、
ユーザーグループに読み込み権と書き込み権を、
ユーザーに読み込み権を付与したい場合は、

```
chmod 764 hoge.txt
```

となる。


#### アルファベットで権限を変更

|権限を与える対象  |与える権限  |変更方法  |
|---|---|---|
|u<br>(ルートユーザー)  |  r <br>(読み込み)|＝<br>(指定した権限にする)
|g <br>(ユーザーグループ)  |w <br>(書き込み)  |＋<br>(権限を追加する)
|o <br>(ユーザー)  |x <br>(実行)  |ー<br>(権限を除去する)
|a <br>(全て)  |  |


ex1) ユーザーグループとユーザーに書き込み権を追加する場合
```
chmod go+w hoge.txt
```

ex2) 全てのユーザーの権限を読み込みにする場合
```
chmod a=r hoge.txt
```

## 一時的に管理者権限の状態で操作ができるようになるsudoコマンド
コマンドの先頭に「sudo」をつけると、その時だけルートユーザーの権限と同じ権限で操作することができる。
管理者権限を利用できるのはsudoコマンドをつけて実行した時だけなので、連続した操作で使用したい場合にはコマンドを実行するたびに打たなくてはいけないので注意。

<br>

Permissionエラー(権限関係のエラー)が出た場合はchmodコマンドで権限を変更するか、sudoコマンドで一時的に管理者権限で操作することで解決するかも。
Reactで簡単にGoogle One Tapログインの実装方法

# 前書き

こんにちは、今日は、ユーザビリティを格段に向上させる（かもしれない）Google One TapログインをReactアプリに取り入れる方法を説明します。

## ステップ1: ハマったところ

まずは、Googleの認証スクリプトを動的に追加することからスタートです。これは、「enableFedCM」と名付けた関数を使って実現します。こんな感じで

```javascript
function enableFedCM() {
  const fedcm = document.createElement('script');
  fedcm.src = 'https://accounts.google.com/gsi/client';
  fedcm.async = true;
  fedcm.defer = true;
  document.head.appendChild(fedcm);
}
```

これはHTMLの頭部（`<head>`）にGoogleのスクリプトを挿入します。これで、Google One Tapが解放されます。
ベタ書きでも構わないんですが、やっぱかっこいい書き方したいじゃん！

## ステップ2: スクリプトを呼び出し

Reactの`useEffect`フックを使って、ページが読み込まれた時に実行します。

```javascript
function GoogleGIS () {
  useEffect(() => {
    enableFedCM();
  }, []);

  // ...
}
```

## ステップ3: 設定と環境変数

次に、Google One Tapのコンポーネントを設定します。ここで重要なのが、環境変数からGoogleのクライアントIDを取得する部分で、よしなに書き換えてください

```javascript
return (
  <div id="g_id_onload"
    data-client_id={process.env.REACT_APP_GOOGLE_CLIENT_ID}
    data-login_uri="http://localhost:3012/api/user/google_gis/callback"
  >
  </div>
);
```

## 参考
https://zenn.dev/intomyam/articles/142eafe377dbc5

https://zenn.dev/yoiyoicho/articles/c44a80e4bb4515
【ChatGPT無】退屈しのぎのやり取りです。


　どうも、カーブミラーです。

　今回は、退屈しのぎのやり取りです。内容はないよう(=^･^=)

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　新年
　　明けまして
　　　おめでとうございます。

　本年も
　　よろしく
　　　お願いいたします。

　　　　m(_ _)m
***
　年が明けて、
　　初詣も済ませました。

　今は、
　　コタツで
　　　うだうだしています。

　ネタが
　　思い浮かばないので
　　　ChatGPTさんと
　　　　しゃべりますw

***
***User***
やらなきゃならないことがあります。
でも、やる気が起きません。
どうしたら？

***ChatGPT***
やる気が出ない時は、小さなステップから始めることが助けになることがあります。タスクを小さく分割してみたり、始める前に短い休憩を取ることも有効です。また、自分を奮い立たせるために目標や報酬を設定することも考えてみてください。

***User***
コタツから抜け出られないだけなんですけどねw

***ChatGPT***
コタツの魅力は本当に強力ですよね！特に寒い季節には余計に。やる気が出ない時は、コタツの中で少しだけタスクを始めるというのもいいかもしれません。そうすることで少しずつやる気が出てきたり、コタツから抜け出せるかもしれませんよ！

***User***
それはいいかもしれませんね。
でもそうするにはコタツを出て、タスクをするための用意をしなければなりません。
コタツから出たくないです。

***ChatGPT***
完全にわかります！コタツは快適ですからね。もしできるなら、コタツの中でできることはありますか？例えば、スマートフォンやノートパソコンを使ってできるタスクなどを考えることはできますか？もしそうであれば、コタツの中で少しだけでも進めることができるかもしれませんよ！

***User***
スマホはあります

***ChatGPT***
素晴らしい！スマートフォンを使ってできることはたくさんあります。例えば、ToDoリストを整理したり、メールのチェック、または気分転換に読書や音楽、ポッドキャストを楽しむこともできます。少しリラックスしながら、コタツの中でできることを見つけると、やる気も少しずつ戻ってくるかもしれませんね！

***User***
やってみます

***ChatGPT***
素晴らしい！少しずつ始めてみてください。コタツの中でもできることがきっと見つかるはずです。リラックスしながら少しずつ進めていけるといいですね。何かお手伝いできることがあれば、遠慮なく聞いてくださいね！
***

　コタツは、
　　魔物ですね、ホントに。

　今回は、ここまで。
　　すみません、こんな記事でw

　みなさまに
　　良き一年が
　　　訪れますように。
Linuxコマンドメモ

# ハードウェア情報を確認

```
lshw
```

# CPU情報を確認

```
lscpu
```

# Linuxのカーネルバージョンとかを確認

```
uname -a
```

# ホスト名の確認

```
hostname
```

# ディストリビューションバージョンの確認

ubuntu
```
cat /etc/os-release
```
centos
```
cat /etc/redhat-release
```

# ホスト名の変更

一時的にホスト名を変更する
```
hostname [ホスト名]
```
恒久的にホスト名を変更する
```
hostnamectl set-hostname [ホスト名]
```
恒久的にホスト名を変更する（ファイルを直接いじる）
```
vi /etc/hostname
```

# ディスク確認

```
df -h
```
```
lsblk
```

# メモリ確認

```
free -h
```

# リソースの使用状況を確認

```
top
```

# ip確認

```
ip a
```
Requirements on E2E, AUTOSAR 847, R23-11, FO

AUTOSARが、2023年の版、R23-11を公開しました。
Requirements on E2E, AUTOSAR 847, R23-11, FO
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_RS_E2E.pdf

R22-11
https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_EXP_AIBodyAndComfort.pdf

R21-11
https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_EXP_AIBodyAndComfort.pdf

R20-11
https://www.autosar.org/fileadmin/standards/R20-11/CP/AUTOSAR_EXP_AIBodyAndComfort.pdf

R19-11
https://www.autosar.org/fileadmin/standards/R19-11/CP/AUTOSAR_EXP_AIBodyAndComfort.pdf

R1.5.1/R19-03
https://www.autosar.org/fileadmin/standards/R19-03/FO/AUTOSAR_RS_E2E.pdf

R1.5.0/R18-10
https://www.autosar.org/fileadmin/standards/R18-10_R4.4.0_R1.5.0/FO/AUTOSAR_RS_E2E.pdf

R1.4.0/R18-03
https://www.autosar.org/fileadmin/standards/R18-03_R1.4.0/FO/AUTOSAR_RS_E2E.pdf

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.
# Release Overviews

AUTOSARには現在3つの分類があります。Foundation, CAN, OSEK/VDXのClassic Platform, Ethernet/TCP/IP, POSIXのAdaptive Platform.

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Classic Platform Release Overview, AUTOSAR No.0 ,R23-11, CP
https://qiita.com/kaizen_nagoya/items/9d22c8722cbc0f42b137

Adaptive Platform Release Overview, AUTOSAR 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7

# Qiita 記事一覧

Autosar Foundation R23-11 一覧
https://qiita.com/kaizen_nagoya/items/c30674cb2dac2fcbbd04

AUTOSAR Adaptive Platform R23-11一覧
https://qiita.com/kaizen_nagoya/items/1dece8799a730367b0dc

Autosar Classic Platform R23-11 一覧
https://qiita.com/kaizen_nagoya/items/f770f6c2906e1dcbf180

## 文書変更(Document Change) 

>• Editorial changes

https://qiita.com/kaizen_nagoya/items/94d3aa95a99732a7448d
# 用語(terms)
|term|Description|
|:--|:--|
|E2E |End-to-End.|
|E2E Profile| A set of combined E2E measures as efficient solution for a particular communication stack.|
|BER |Bit Error Rate - a rate of corrupted bits in a byte stream, e.g. 1e-5.|
# References
[1] ISO 26262:2018 (all parts) – Road vehicles – Functional Safety https://www.iso.org
[2] Standardization Template AUTOSAR_FO_TPS_StandardizationTemplate
[3] Glossary AUTOSAR_FO_TR_Glossary
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_TR_Glossary.pdf


## 補足資料（Additions）

AUTOSAR Countdown Calendar 2023
https://qiita.com/advent-calendar/2023/autosar

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.


# 文書履歴(document history)
ver. 0.01 初稿 　20240101
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Webサイト制作で画像を埋め込む有効な技術

こんにちは！
今回はWebサイト制作の際に画像を埋め込む技術をここに残したいと思います。

画像を埋め込む際に例えば横並びのボックスデザインを実装したいとき、画像の縦幅がうまく調整できない状況におちいるときもあるかと思います。

そのときは以下のようなコードを書いてみてください。

````main.css
.img-compornent{
    objectfit: cover;
    width: 100%;
    height: 100%;
}
````

このコードは、divタグなどで画面内の領域を決めている場合にその領域内に画像を崩さずに画面いっぱいに埋め込むことができます。

今回は少し短いですがここまでにしたいと思います！
Requirements on Debugging, Tracing and Profiling support of AUTOSAR Components, AUTOSAR 916, R23-11, CP

AUTOSARが、2023年版、R23-11を公開しました。
Requirements on Debugging, Tracing and Profiling support of AUTOSAR Components, AUTOSAR 916, R23-11, CP
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_RS_DebugTraceProfile.pdf

R22-11
https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_RS_ClassicPlatformDebugTraceProfile.pdf

R21-11
https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_RS_ClassicPlatformDebugTraceProfile.pdf

R20-11
https://www.autosar.org/fileadmin/standards/R20-11/CP/AUTOSAR_RS_ClassicPlatformDebugTraceProfile.pdf

R19-11
https://www.autosar.org/fileadmin/standards/R19-11/CP/AUTOSAR_RS_ClassicPlatformDebugTraceProfile.pdf

R1.5.1/R19-03
https://www.autosar.org/fileadmin/standards/R19-03/FO/AUTOSAR_RS_FoundationDebugTraceProfile.pdf

R1.5.0/R18-10
https://www.autosar.org/fileadmin/standards/R18-10_R4.4.0_R1.5.0/FO/AUTOSAR_RS_FoundationDebugTraceProfile.pdf

https://www.autosar.org/

文書は検索してダウンロードできます。

# Release Overviews

AUTOSARには現在3つの分類があります。Foundation, CAN, OSEK/VDXのClassic Platform, Ethernet/TCP/IP, POSIXのAdaptive Platform.

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Classic Platform Release Overview, AUTOSAR No.0 ,R23-11, CP
https://qiita.com/kaizen_nagoya/items/9d22c8722cbc0f42b137

Adaptive Platform Release Overview, AUTOSAR 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7

# Qiita 記事一覧

Autosar Foundation R23-11 一覧
https://qiita.com/kaizen_nagoya/items/c30674cb2dac2fcbbd04

AUTOSAR Adaptive Platform R23-11一覧
https://qiita.com/kaizen_nagoya/items/1dece8799a730367b0dc

Autosar Classic Platform R23-11 一覧
https://qiita.com/kaizen_nagoya/items/f770f6c2906e1dcbf180


## 文書変更(Document Change) 

>• Editorial changes

https://qiita.com/kaizen_nagoya/items/511bb63cc346cd67b303

# 用語(terms)

|Term| Description|
|:--|:--|
|ARTI| AUTOSAR Run Time Interface
|OS| Operating System
|SWC| Software Component

# References
[1] Standardization Template AUTOSAR_FO_TPS_StandardizationTemplate
[2] Glossary AUTOSAR_FO_TR_Glossary
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_TR_Glossary.pdf
[3] Main Requirements AUTOSAR_FO_RS_Main

## 補足資料（Additions）
AUTOSAR Countdown Calendar 2023
https://qiita.com/advent-calendar/2023/autosar

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.


# 文書履歴(document history)
ver. 0.01 初稿 　20240101
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
SwiftのDictionary型をJSONに変換する方法

対象者：SwiftのDictionary型に馴染みがない人。

記事を書いた経緯：Flutterアプリにおいて、Swift -> Dartにデータを送信する際に、Dictionary型でまとめたデータをJSON形式で送りたい。躓きポイントが２つあったので忘れないうちに共有しよう！

躓きポイント１：単純にDictionary型をJSON形式でエンコードしてDart側に送信すると配列？に変換されてしまう。

躓きポイント２：Dictionary型のキーがString型以外だとエラーでクラッシュする。こんな感じ -> ```*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid (non-string) key in JSON dictionary' ***```

対処法
```swift

private var mDicData: [Int64: Int] = [:]

func changeDicToJson() {
    //mDicDataにデータを入れる処理...
    //そのあと単純にdicDataに値を格納する
    var jsonStru = JSONStru() 
    jsonStru.dicData = mDicData

    do {
        //Data型に変換
        let data = try JSONEncoder().encode(jsonStr)
        
        //JSON形式のString型に変換
        if let jsonString = String(data: data, encoding: .utf8) {
            //Flutter側にデータを送る処理など...
        }
    } catch {
        print("エラー: \(error)")
    }
}

struct JSONStru: Codable {
    var dicData: [Int64: Int]?
}
```

これだとDictionary型が配列？になってしまう...

エンコードする前に、下記のようにString型をキーとするDictionary型に変換することで解決！
キーをString型にしないと躓きポイント２に遭遇するので注意。


```swift

var stringKeyDictionary: [String: Int] = [:]
for (key, value) in mDicData {
    stringKeyDictionary[String(key)] = value
}

jsonStru.dicData = stringKeyDictionary

struct JSONStru: Codable {
    var dicData: [String: Int]?
}

```
[Python][Julia]Project euler7 (プロジェクトオイラー7)

#### Project euler Ploblem 7 (プロジェクトオイラー7)
[10001st Prime](https://projecteuler.net/problem=7)

備忘のために残しておく。
コードを修正しました(指摘ありがとうございます)

## 問題
#### 問題文 (意訳)
素数をはじめから順に6個並べると、2,3,5,7,11,13。6番目の素数は13だとわかる。
10001番目の素数は？

#### 原文
By listing the first six prime numbers: 2, 3, 5, 7, 11 and 13 , we can see that the 6th prime is 13 .

What is the 10001st prime number?



## 解答
#### 答え
<b>104743</b>

#### 解答の方針
エラトステネスのふるいを使って10001個より大きい素数のリストを作成し、10001番目の素数をリストから取り出す。


#### Pythonのコード
```Python:Python Ploblem7
def eratosthenes(n: int) -> list:
    """エラトステネスのふるい"""
    isprime = [True] * (n+1)
    isprime[0], isprime[1] = False, False
    # ふるい
    for p in range(2, n + 1):
        # 素数以外(False)を飛ばす
        if not isprime[p]: 
            continue
        # p 以外の p の倍数をふるいにかける(TrueをFalseに)
        q = p + p
        while q <= n:
            isprime[q] = False
            q += p
    l = [x for x in range(n+1) if isprime[x]]
    return l

def seek_ans(limit: int, interval: int = 100000) -> int:
    # intervalは適当な値を置いている
    n = 2
    # セイウチ演算子を用いる
    while len(l := eratosthenes(n)) < limit:
        n += interval
    return l[limit-1]
        
print(seek_ans(10001))
```

#### Juliaのコード
```Julia: Julia Ploblem7
function eratosthenes(n::Int64)::Vector{Int64}
    # エラトステネスのふるい
    isprime = fill(true, n+1)
    isprime[1] = false
    
    for p in 2:n
        if !isprime[p]
            continue
        end
        # p 以外の p の倍数をふるいにかける(TrueをFalseに)
        q = p + p
        while q <= n
            isprime[q] = false
            q += p
        end
    end
    
    l = [x for x in 1:n if isprime[x]]
    return l
end

function seek_ans(limit::Int64, interval::Int64 = 100000)::Int64
    # intervalは適当に置く
    n = 2
    while length(eratosthenes(n)) < limit
        n += interval
    end
    
    return eratosthenes(n)[limit]
end

println(seek_ans(10001))

```
#### 追記
セイウチ演算子(:=)についての参考記事
[セイウチ演算子って何？](https://qiita.com/Nipper1357/items/446923f67e03d646be36)
WindowsTerminalを「カレントディレクトリで開く」様にした時の失敗

# 本記事の目的
・参照したサイト記事をよく読まずに実行して「うごかねぇじゃん！」をやらかしたので反省及びPC再構築時の備忘録として残す

# 参照先
https://news.livedoor.com/article/detail/17947449/

https://news.mynavi.jp/article/windows-468/

# で、何をやらかした？
参照先のregファイルをそのまま実行した(ダメ１)
➯「Win 10編: Windows Terminalをコンテキストメニューから起動する」の方しか読んでなかったからという愚行
➯「Windowsスマートチューニング 第472回 Win 10編: Windows Terminalをカレントフォルダーで起動する」の方には何をどうしろという手順も書いてあった(ダメ２)

# 
以下は参照先にある「CommandLine-Boot-WindowsTerminal.zip」を展開した中身
```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\Terminal]
"Extended"=""
"NoWorkingDirectory"=""
@="Windows Terminal"

[HKEY_CLASSES_ROOT\Directory\Background\shell\Terminal\command]
@="C:\\Users\\kaz\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe"
　　　　　　　　↑ココを変えていなかったのが間違い
```

# 結論
１つの記事ではなく、複数記事を参照しよう。

# 蛇足
ConEmuで事足りるが、それぞれ好みで使えば良いと思う

https://conemu.github.io/
【OpenCvSharp】距離変換を用いて内側の図形を取得する


入力した任意の図形から、その図形の1px内側の図形を抽出する。
イメージはこう。少し見づらいですが外側が赤、内側が緑になっています。
![内側図形.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/032cbed6-282f-d40a-2266-6715d5fde6cf.png)


今回は距離変換を用いて内側の図形を取得します。

### パラメータ
- 画像データ
画像データの前提条件は下記。
  1. 閉じた図形である。
  2. 図形は一つだけ描かれている。
  3. 二値画像である。

### 距離変換
OpenCv(Sharp)には`DistanceTransform()`という距離変換を行う便利関数があるのでこれを使う。
`Mat`を入力に`Mat<float>`を返し、この`float`がその画素における距離である。

`DistanceTransform()`には二つパラメータがある。
- DistanceType:
距離計算方法。主にL1, L2, Cを使う。
    - DistanceType.L1: 市街地距離
    - DistanceType.L2: ユークリッド距離
    - DistanceType.C: チェス盤距離
    - DistanceType.L12: L1とL2の中間の性質を持つ距離
    - DistanceType.Fair, Welsch, Huber: いずれも外れ値に対して頑健な距離計算

- DistanceTransformMasks:
距離計算に用いるマスクサイズ。マスクサイズが大きいほど複雑な形状に対応した距離変換になる
    - DistanceTransformMasks.Mask3: 3*3の範囲をマスク
    - DistanceTransformMasks.Mask5: 5*5の範囲をマスク
    - DistanceTransformMasks.Precise: より精密な計算のためのマスク
        - [ドキュメント](https://docs.opencv.org/4.8.0/d7/d1b/group__imgproc__misc.html#ga8a0b7fdfcb7a13dde018988ba3a43042)ではまだサポートされていないとあるが、エラーにはならず動くのでMask3かMask5に変換されているのか？
        

今回は市街地距離で計算し、複雑な図形を扱わないことからMask3を採用する。

## 最終的なコード
下記では距離変換で得られた距離をインデックスとして、色付けして見やすくしている。

```csharp
public void ShowDistanceColor(Mat binaryImage)
{
    // 距離変換を適用する
    var dist = binaryImage.DistanceTransform(DistanceTypes.C, DistanceTransformMasks.Mask3);
    dist.MinMaxLoc(out double _, out var maxVal);

    // 出力画像の準備
    var output = binaryImage.CvtColor(ColorConversionCodes.GRAY2BGR);
    var random = new Random();

    // 距離値ごとに色を変えて描画する
    for (var distance = 0; distance <= (int) maxVal; distance++)
    {
        var color = new Vec3b(
            (byte) random.Next(256),
            (byte) random.Next(256),
            (byte) random.Next(256));

        for (var y = 0; y < dist.Rows; y++)
        for (var x = 0; x < dist.Cols; x++)
        {
            if ((int) dist.At<float>(y, x) != distance) continue;
            // 好きなように処理する
            output.Set(y, x, color);
        }
    }

    Cv2.ImShow("Color Coded Distance Map", output);
    Cv2.WaitKey(0);
}

```

ちなみにこれを実行すると下記のような画像が得られます。
![内側図形_最終.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/2fe56919-7194-ebd5-dad3-47366b977e6e.png)


## まとめ
画像処理のアルゴリズムって勉強していると「いつ使うんだろ？」と思うこと多いけどふとした時に使う場面と出くわしますね。
アメバ連携プラグインを開発しての感想

# はじめに
過去、10数年、独自のyoutube再生サイトを構築してきました。再生サイトは、レンタルサーバー上に設置してきました。再生サイトは現在も運用中です。ある時期までは、独自の再生リストでyoutube動画を再生していましたが、その後、プラグインの開発に興味を持ち、これまで、いくつかのプラグインを作成してきました。
最近は、アメバ連携のプラグイン作成を主に行っています。今回、slimプラグインv4.0プラグインをChromeウェブストアに公開しました。ここでは、このプラグインの開発経緯についての感想です。

# アメバ連携プラグイン(slimプラグインv4.0)について
アメバブログを投稿していますが、この時に、youtube動画を埋め込むことができます。この埋め込みは一つのyoutube動画を埋め込む機能です。これも一つの方法ですが、行いたかったことは自前のサイトの動画を埋め込むことですが、これはアメバではできません。
使用禁止タグのため、htmlやscript、iframeなどが使用できません。そこで、仕方なくリンクで自前のwebサイトを開くことにしました。その時に、このアメバ連携プラグインが必要になりました。このプラグインを使って自前のWebサイトページにアメバブログを表示することにしました。アメバブログのurlをWebサイトページを開くときにパラメータとして渡しています。

### slimプラグインv4.0のインストール
slimプラグインv4.0のインストールは、以下のリンクからChromeウェブストアを開き、そこで、Chromeブラウザーへインストールします。

### youtube再生サイト
このプラグインは、favoriteサイトと連携しています。favoriteサイトのurlは以下になります。
[favoriteサイト]（"https://favorite.tecoyan.net/slim/index.php")

### アメバ連携時のurlパラメーター
アメバ連携時のurlパラメーターは以下になります。
サンプルサイト
https://favorite.tecoyan.net/slim/index.php?vid=jGtRG25lxIo&title=%E6%83%B3%E3%81%84%E5%87%BA%E3%81%BC%E3%82%8D%E3%81%BC%E3%82%8D%E3%80%80%E5%86%85%E8%97%A4%E3%82%84%E3%81%99%E5%AD%90%EF%BC%881976%E5%B9%B4%E6%94%BE&url=https://ameblo.jp/tecoyan/entry-12829812484.html

これらのパラメーターはアメバブログのリンク生成時に半自動生成しています。

# slimプラグインv4.0の機能
このslimプラグインv4.0には、機能として3つあります。
(1)youtubeサーチ&保存&再生
(2)アメバ連携
(3)yahooサーチ
現在、このプラグインは、https://favorite.tecoyan.net/slimサイト専用になっています。

# 感想
このプラグインの使い方としては、アメバでブログを書いているとその内容と関係のあるyoutube動画へのリンクが欲しくなります。記事の内容を動画でも見れるとより分かりやすいかと思いました。確かにアメバでも関連する動画を埋め込む機能はあります。しかし、この機能は一つの動画単位となります。複数の動画を見るには、複数分の埋め込みが必要になります。
プラグインを使えば、リンクをクリックして、その専用ページを開き、そこで動画をリストで再生することができます。
このリスト再生がこのプラグインの特徴です。

# あとがき
まだ、記述内容として未完成のため、追って補足、追加して行きたいと思います。このプラグイン開発時の苦労話や特徴、技術的な現状の問題点などを記述したいと思っています。このプラグインはまだ開発継続中です。途中経過として投稿しています。


(補足)favorite
現在、このslimプラグインv4.0に一部不具合があります。そこで、その不具合を解消したプラグインを公開前にダウンロードして使用できるようにしています。favoriteサイトのメッセージをクリックするとyoutbeボタンが表示されますので、そのボタンをクリックするとダウンロードの説明が表示されます。
不具合を解消した、次のslimプラグインv5.0の公開は、近日中に予定しています。
Elixir 2024年の私の抱負

# 2023年のふりかえり

## 2023年の1月

私がElixirを始めたのは、2022年の7月8日で、この半年くらいで、いろいろ新たな事を学び、この記事にまとめました。

https://qiita.com/GeekMasahiro/items/2c2e7d44fca157ea146a


## 2023年の2月

Elixirで、AtCoderをやってみよう。とおもいAtCoderを始めました。
数年前から、競技プログラミングといものがある事は知っていたんですが、やってみるまでは至ってませんでした。Elixirのコミュニティで話題になったのがきっかけでした。

## 2023年3月~11月

AtCoderの問題はElixirでも解けるんですが、次のような問題がでてきました。
- Pythonで書いた方が、プログラムの作成時間が短い
- Elixirでは、実行速度が問題になって解けない問題がある。

Elixirがきっかけて始めたAtCoderですが、いったんPythonで取り組むことにしました。
なかなか、学ぶ事が多くて、AtCoderの沼から抜け出せなくなりました。

AtCoderのレーティングは3月から9が月で、灰色→茶色→緑色まで成長できました。

競技プログラミングをやってみて、プログラミングスキルのスキルを数値化して、向上を見る事ができる点はおもしろいと思いました。
長年プログラムを作っていますが、このような経験はなかなかありません。これからプログラミング言語を学びたい。簡単なプログラムはできるけど、もうちょっとできるようになりたいという人にはとても良い教材だとおもいました。
プログラミングを学びたい方にお勧めです。

## 2023年12月

Elixirのアドベントカレンダーの記事作成。
25個投稿できました。

# 2024年の抱負

生成AIの発展で、プログラムの作成と人のかかわり方が変わってくるとおもいます。
「あまり詳しいことがわからなくても開発ができる」こんな世の中になるかもしれません。
そんな時に、コンピュータシステムの基本がわかっているかどうかが、壁になるのではないか。こんな気がします。
AtCoderで出てくるアルゴリズムやコーデイングを、今のうちに一度身に着けておくと何かの役に立つのではないか。と思うので、もうちょっとAtCoderをやってみます。

Elixirの様な楽しい言語を使ってみる事で、世界の達人プログラマーが志しているものを理解しておくことは、生成AIが発達したとしても、何かに役立つものになると思います。

今年の目標
- Elixirを楽しむ
- AtCoderで水色になる
- ElixirらしいOSSを作ってみる
2024年1月の目標


### 目標概要

- AWS PAS SAP DOP勉強
- AWS PAS SAP DOP受験
- TOEIC勉強開始

会社から（たぶん）特別に多くバウチャーをもらったのでここでケリをつける。

### カレンダー

``` 
    January 2024
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
```

### Week 1

目標：PAS勉強完了

1. 試験ガイドのAWS公式PAS問題集完了
TOEICの勉強スピードを図り、目標を立てココに追記する。
2. ExamReddinessのAWSAWS公式PAS問題集開始
2. AWS公式+UdemyのPASハンズオン視聴
2. AWS公式+UdemyのPASハンズオン視聴
2. AWS公式+UdemyのPASハンズオン視聴
2. ドキュメント閲覧＋暗記＋公式問題集回す
2. ドキュメント閲覧＋暗記＋公式問題集回す

PASは受験まで6,7日目を繰り返す。
1週間の時点で、計画に無理がないかフィードバックする。

### Week 2

Week1を振り返り、2024/1/9に修正

【AWS勉強計画2Week】

目標：PAS合格、SAP勉強開始

1. AWS Partner: SAP on AWS (Technical) (Japanese/日本語)
1. AWS Partner: SAP on AWS (Technical) (Japanese/日本語)
1. AWS Partner: SAP on AWS (Technical) (Japanese/日本語)完了
Udemy教材の非チート問題集完了
1. PAS：集めた資料閲覧＋問題を解く
SAP：日本語のSAP本3週目をやりつつ、公式問題2種類を解く
1. PAS：集めた資料閲覧＋問題を解く
SAP：日本語のSAP本3週目をやりつつ、公式問題2種類を解く
1. PAS：集めた資料閲覧＋問題を解く
SAP：日本語のSAP本3週目をやりつつ、公式問題2種類を解く
1. PAS：集めた資料閲覧＋問題を解く
SAP：日本語のSAP本3週目をやりつつ、公式問題2種類を解く

AWS試験の受験日はバウチャー提供日次第。
13日までの提供は難しそうなので、勉強計画としました。

【TOEIC勉強計画2Week】

1. 基本単語 100/200 金のフレーズ 20/900+リスニング（勉強できず復習のみ）
1. 基本単語 125/200 金のフレーズ 30/900+リスニング
1. 基本単語 150/200 金のフレーズ 40/900+リスニング
1. 基本単語 175/200 金のフレーズ 50/900+リスニング IELTS
1. 基本単語 200/200 金のフレーズ 60/900+リスニング IELTS
1. 金のフレーズ 80/900+リスニング IELTS
1. 金のフレーズ 100/900+リスニング IELTS

毎回暗記するまで語彙をやっているので、2か月あれば900語彙増えるはずです。それが1番の対策だと考えているので頑張ります。


### Week 3

目標：PAS合格、SAP勉強終了、SAP合格、DOP勉強

1. PAS：追い込み
1. PAS：追い込み
1. PAS：追い込み　SAP：公式サンプル問題実施
1. PAS：追い込み　SAP：公式サンプル問題実施
1. PAS：受験
1. SAP：書籍末尾問題開始　DOP：Udemyのハンズオン、公式ハンズオン実施
1. SAP：書籍末尾問題　DOP：Udemyのハンズオン、公式ハンズオン実施

うーん。計画を結果に合わせてきてしまっています。

TOEICは引き続き単語をやります。

### Week 4

目標：DOP勉強、合格

1. UdemyのDOPハンズオン+問題集
1. UdemyのDOPハンズオン+問題集
1. UdemyのDOPハンズオン+問題集
1. UdemyのDOPハンズオン+問題集
1. UdemyのDOPハンズオン+問題集
1. UdemyのDOPハンズオン+問題集
1. UdemyのDOPハンズオン+問題集

DOPは苦手な分野なので、2月にもちこすかもしれない。
何をもって勉強完了にするか考えておきたい。
2024年目標：つよつよエンジニアになる


私が今後見直し、PDCAサイクルを回せるようにこの記事を作成しました。

### 2024年目標

- 1-3月でIT系の資格勉強をひと段落させる
- TryHackMeを行う
- AWSハンズオンを行う
- RustでGBエミュレータを完成させる
- パケットキャプチャの教科書を終了させる
- TOEICで750点以上900点以下を12月までに達成する
- 統計検定2級に合格する

### 目標の意図

下記のような認識変化がありました。

今まで：エンジニアに必要な広い知識を得ることを最優先する。基本をしっかり学んでおけば現場の指示についていけるだろう。
↓
これから：特定の分野の深い知識を得ることを優先する。2024年度は「セキュリティ、クラウド、機械学習」の3分野の内「セキュリティ」に重点を置く。現場には指示を出せる人は少なく、能力不足でレビューができない人もいる。そういった環境でも品質を向上させ、生き延びる（自分に責任をなすりつけられない）実力を身に着ける。

この変化に対応するため、2024年の目標はハンズオンを重視したものとなっています。

資格に関しては23年時点で「ここまで」というラインを決めていたIT資格と、今後絶対に必要になる「英語」「統計」に絞りました。

Rustに関しては趣味ですが入れておきました。

### 各目標の何をゴールとするか

- 1-3月でIT系の資格勉強をひと段落させる
AWS（SAP DOP PAS） JavaGold CCNAの取得完了
- TryHackMeを行う
具体的なライン未定。あるラインに3か月を目途に到達すれば完了
- AWSハンズオンを行う
特定のセキュリティに関連するハンズオンを複数こなせば完了
- RustでGBエミュレータを完成で完了
エミュレータ完成をもって完了
- パケットキャプチャの教科書を終了させる
終了後、Qiitaに記事投稿をもって完了
- TOEICで750点以上900点以下を12月までに達成する
目標達成で完了
- 統計検定2級に合格する
資格取得で完了

### 各月の配分

- 1月
AWS PAS SAP DOPの順に受験
TOEIC対策開始

- 2月
JavaSilver JavaGoldの順に受験

- 3月
CCNA(オプション)
1－2月で無理をしているはずなのでバッファとして使う

- 4月
TryHackMe開始
ネスペ記念受験

- 5月
TryHackMe
統計検定2級対策開始

- 6月
TryHackMe振り返り。継続か他に切り替えか判断。

以降はまったく予測がつかないため、まあ全部終わっているものとする。

今後は4半期毎に、翌4半期の目標を設定する。

### 復習方法

- その日に行ったこと、前日に行ったことををしずかなインターネットに書き出す
5分で思い出す。思い出す努力をすれば、まったくきれいな文章である必要はない。

- 重要度が高いトピックを3日に1度判断し、Qiitaに投稿する
時間がかかることを気にしない。

### 各月の目標

リンク先にて管理

### 各月の反省

月2回、2週間毎に実施
リンク先にて管理
【swift】年越しカウントダウンを実装してみた！

## はじめに
2024年、あけましておめでとうございます。年越しに作ったカウントダウンアプリが成功したので、記念に記録しようと思います。

## 開発環境
Xcode Version 15.1

## 作品の概要
年を越すまでカウントダウンし、カウントダウンが00:00:00になったらイラストが今年のものになり、HappyNewYearが表示されるといったシンプルなものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984024/a67e9a8b-2e76-1a51-8e55-905014006b41.png)

## コード全文
```swift

import SwiftUI

struct ContentView: View {
    @State private var countdown: String = ""
    @State private var isCountdownFinished: Bool = false
    
    var body: some View {
        VStack {
                  if isCountdownFinished {
                      Image("dragon")
                          .resizable()
                          .scaledToFill()
                          .frame(width: 250, height: 250)
                      Text("Happy New Year!!")
                          .padding()
                  } else {
                      Image("rabbit")
                          .resizable()
                          .scaledToFill()
                          .frame(width: 250, height: 250)
                      Text("2024年まであと \(countdown)")
                          .padding()
                          .onAppear(perform: startCountdown)
                  }
                  
              }
              .onChange(of: countdown) { newValue in
                  if newValue == "00:00:00" {
                      isCountdownFinished = true
                  }
              }
              .onChange(of: isCountdownFinished) { newValue in
                  if newValue {
                      Text("Happy New Year!")
                          .font(.largeTitle)
                          .padding()
                          .foregroundColor(.red)
                  }
              }
          }

    func startCountdown() {
        let calendar = Calendar.current
        // ターゲットの時刻設定
        let targetDateComponents = DateComponents(year: 2024, month: 1, day: 1)
        let targetDate = calendar.date(from: targetDateComponents)! // Date()に型を合わせる
        
        // カウントダウン（1秒ごとに発火）
        let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {
            timer in
            // 現在時刻の取得
            let currenDate = Date()
            // 残り時間のコンポーネントを作成
            let components = calendar
                // 秒未満を切り捨て
                .dateComponents([.hour, .minute, .second],
                // 差分を計算
                from: currenDate, to: targetDate)
            // hour, minute, secondsがnilでないことを確認
            if let hours = components.hour, let minutes = components.minute, let seconds = components.second {
                //formatする
                countdown = String(format: "%02d:%02d:%02d", hours, minutes, seconds)
            }
        }
        timer.tolerance = 0.1
        timer.fire()
    }
}

#Preview {
    ContentView()
}

```

## 最後に
今年もプログラミング頑張ります。よろしくお願いします。みなさんの一年が良いものとなりますように。
Bootstrap5　汎用的なクラス＆書き方まとめ


## 幅
```
w-
```

## テキストカラー
```
text-light 
```

## ボーダー
https://getbootstrap.jp/docs/5.0/utilities/borders/

ボーダー(全、上、下、右、左)
```html
<span class="border"></span>
<span class="border-top"></span>
<span class="border-end"></span>
<span class="border-bottom"></span>
<span class="border-start"></span>

```



カラー
```html
<span class="border border-primary"></span>
<span class="border border-secondary"></span>
<span class="border border-success"></span>
<span class="border border-danger"></span>
<span class="border border-warning"></span>
<span class="border border-info"></span>
<span class="border border-light"></span>
<span class="border border-dark"></span>
<span class="border border-white"></span>
```
(iOSアプリ開発)Launch Screenの設定でハマったこと

#### はじめに
ユーザーがアプリを起動する際に最初に表示される画面、すなわち「Launch Screen」を設定するとアプリが本格的になります。Launch Screenを作成する方法を色々と調べましたが、この記事では一番簡単な方法として`info.plist`ファイルを使用した設定方法を紹介します。

#### Launch Screenとは？
Launch Screenは、アプリがロードされる間に表示される静的な画面です。ユーザーにアプリの初期読み込み時間を知らせる役割を果たします。効果的なLaunch Screenは、ユーザー体験を向上させるための重要な要素です。

#### `info.plist`でのLaunch Screen設定手順
1. **Xcodeプロジェクトを開く**: Xcodeで対象のiOSアプリプロジェクトを開きます。
2. **Assetsに画像をアップロードする**: 使いたい画像をドラッグ&ドロップで下の図の「logo」の箇所にアップロードします。（画像のタイトルは任意に設定可能です）
![](https://storage.googleapis.com/zenn-user-upload/b8bf597fc3a1-20231231.png)



3. **`info.plist`ファイルを見つける**: プロジェクトナビゲーターで一番上のプロジェクト名を選択し、Infoを選択し、Launch Screenの「＞」をクリックし、「＋」を押します。
![](https://storage.googleapis.com/zenn-user-upload/9e7106e81054-20231231.png)


4. **Launch Screen設定を追加**: Image Nameを選択します。右横のtextfieldに2でアップロードした画像の名前を入力します。
![](https://storage.googleapis.com/zenn-user-upload/a6cdd63cc8fc-20231231.png)


#### 注意点（私がハマったこと）
- **シミュレーターや実デバイスに反映しないことがある**: 私の場合、上記を実行しても実デバイスにすぐに反映しませんでした。結局テストでは実デバイスには反映せず、本番リリースして初めて反映を確認できました。シミュレーターでビルドすると反映してたのでそれを信じて本番リリースしました。
- **サイズ調整**: 画像が想定よりも大きく表示されました。リサイズは、webで画像のリサイズサイトを使って、画像をリサイズした上で、リサイズ後の画像を使うと、いい感じのサイズで表示されました。

---

個人でアプリを開発しています。

https://apps.apple.com/jp/app/%E9%A7%85%E3%81%AE%E3%82%A8%E3%83%AC%E3%83%99%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%9E%E3%83%83%E3%83%97/id6472233345
Terraformでlambdaプロキシ統合のAPIを作成する際の注意点

# はじめに
Terraform初心者のため、間違いなどあればコメントで指摘していただけると助かります。

# 結論
API Gatewayとlambdaを組み合わせたAPIを作成するときは、GET APiの場合でもaws_api_gateway_integrationのintegration_http_methodをPOSTとしよう。

``` api.tf
resource "aws_api_gateway_integration" "get_section" {
rest_api_id = aws_api_gateway_rest_api.main.id
resource_id = aws_api_gateway_resource.get_section.id
http_method = aws_api_gateway_method.get_section.http_method
#Lambdaプロキシ統合を使用する場合は、GETメソッド作成時もaws_api_gateway_integration中のintegration_http_methodをPOSTにする必要がある。
integration_http_method = "POST"
type = "AWS_PROXY"
uri = aws_lambda_function.get_section.invoke_arn
}
```

# 発生の流れ
Terraformを使用してAWSインフラを構築している最中、GET APIを作成しているタイミングで発生しました。
自分はTerraformに慣れていなかったため。マネジメントコンソールで設定項目を確認してから、Terraformのコードを記述するという手順を踏んでいました。
その際API Gatewayのintegration設定項目において、GET APIを作成するからGETだろうと安直に設定した箇所が上記になります。
マネジメントコンソールにおいて設定する場合は、メソッド作成時にlambda統合を有効にするというチェックをつけるだけで、裏側でうまいこと設定してくれる部分みたいですね。

# 原因
lambdaプロキシ統合を利用する場合、メソッドリクエストが統合リクエストを呼び、統合リクエストがlambdaを呼び出すという手順を踏みます。この際、メソッドリクエストのHTTPメソッドがなんであろうと統合リクエストでPOSTでないとlambdaまでリクエストが届きません。

こちらにも書かれていましたね。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_integration

> integration_http_method - (Optional) Integration HTTP method (GET, POST, PUT, DELETE, HEAD, OPTIONs, ANY, PATCH) specifying how API Gateway will interact with the back end. Required if type is AWS, AWS_PROXY, HTTP or HTTP_PROXY. Not all methods are compatible with all AWS integrations. e.g., Lambda function can only be invoked via POST.

# 終わりに
始めて触る技術は公式で一次情報を参照する癖をつけたいです。
2STEPでNode.jsのプログラムをEXE化する方法

# Node.jsでEXE化!?
今回はNode.jsで作ったプログラムをEXE化する方法について書いていきます。
不備等ございましたらコメントにてお手柔らかに指摘お願いします。

## 注意
この記事はNode.jsとnpmをインストールしている前提で書いています。

# STEP1: Nexeをダウンロード
以下のコマンドを実行してください
```console
$ npm -g install nexe
```
# STEP2: Nexeを使ってExe化
```console
$ nexe -i ファイル名.js -o ファイル名.exe -t windows-x64-14.15.3
```
# 最後に
Node.jsやTSに関してのブログを他にもいくつか書いているので良かったらご覧ください
すぐに出来る！TypeScript実行環境構築

# TypeScriptの実行環境構築
この記事では素人ながらTypeScritpの実行環境構築に関してまとめていきます。
不備等ございましたらコメント等で優しく教えてください。

# 注意
大前提としてNode.jsとnpmが導入されているものとします。
導入していない方は導入をお願いします。
TS→TypeScript

# まず最初に
```console
$ npm install -g typescript @types/node@16 ts-node
```
このコマンドを実行してください
以下のものがインストールできます
| 名称 | 内容 |
|:-----------|------------:|
|typescript|TSのコードをJSに変換するための基本ライブラリ|
|@types/node@16|型情報を提供するためのライブラリ|
|ts-node|TSのコードを直接実行するためのライブラリ|

# 1: tscで実行
```console
$ tsc ファイル名.ts
```
このようにやると同じファイル名のjsファイルが生成されると思いますので、その後は普通にNode.jsと同じように実行してください。

念のためNodeの実行コマンド
```console
$ node ファイル名.js
```

一番これがオーソドックスな方法だと思います。
# 2: ts-nodeを使って実行
1の方法だと一度JSファイルにコンパイルするので面倒！
と思いませんでしたか？

それを解決するのがts-nodeです。
実行方法は簡単
```console
$ ts-node ファイル名.ts
```
これをやると再度JSファイルを実行する必要なく**コマンド1つで**TSのコードを実行させることができます。
# 最後に
TSはJSの拡張版です。JSが物足りないと感じているならぜひ使ってください。
自分はほかにもいろいろなJSやTS関係の記事を上げているので気になったら是非チェックしてください！
知っておくと便利！TypeScriptの追加要素 (一部)

# TypeScriptと使うメリット
素人ながらTypeScriptを使うメリットをまとめてみようと思います。
間違っている部分などありましたらコメントで優しく教えてください。
まだTypeScriptを導入していない方は[こちら](https://qiita.com/ROBOTofficial/items/b4cfc000fd5cf255c9e1)を確認してみてください。

### 注意
あくまで初心者を対象に書いています。
厳密にいうと違う表現があるかもしれませんがご了承ください。
今回紹介するのはあくまで**一部**です。
TSはTypeScriptの事です(一々正式名称だと大変なので省略しています)
.tsはTypeScriptの拡張子です。

## 1:JSとの互換性
まず大前提としてJSとTSには互換性があります。
つまり…
```js:main.js
console.log("HELLO WORLD");
```
このコードをそのままmain.tsに入れて実行しても動かすことができます。

## 2:静的型付けが出来る
JSで静的型付けが使えずに不便だと思ったことはありませんか？
それを解決できるのがTypeScriptです。
例えば…
```ts:main.ts
const a:string = "HELLO";
console.log(a);
```
このように変数に代入する際に型を指定することができます。
主な型名はこんな感じです

|型名        | どういうものか  |
|:-----------|------------:  |
| String     | 文字列       |
| boolean    | true or false |
| number     | 小数を含めた数値の型      |
| null       | 値がない         |

あくまで一部なので他にもsymbol型やbigint形など、いろいろな型があります。

## 3:関数
TSでは関数の引数と戻り値に型注釈をつけることができます。
```ts:main.ts
function test(a:number,b:number):string {
    if ((a + b) >= 3) {
        return "答えは3以上です";
    } else {
        return "答えは3未満です";
    }
}

const c = test(1,1)
console.log(c)
```
この場合だとaとbという引数にnumberという型注釈をつけ戻り値をStringにしました。
今紹介したnumberとString以外にも色々指定できるので是非やってみてください。

## 4:ジェネリックス
JSだけやっていた人だとこの言葉をあまり知らないかもしれません。

ジェネリックスを簡潔に説明すると…
**型の安全性とコードの共通化を両立**の実現です。

例を見てみましょう
```ts:main.ts
function Random<T>(v1: T, v2: T): T {
    if (Math.random() <= 0.5) {
        return v1
    } else {
        return v2
    }
}

const a = Random<string>("WIN", "LOSE");
const b = Random<number>(3, 4);

console.log(a)
console.log(b)
```
> [引用元](https://typescriptbook.jp/reference/generics)もよかったらご覧ください

このようなランダムな値を出すものにおいてジェネリックスは非常に役立ちます。
このコードを実行すると
```console
LOSE
4
```
などと出てきます。
数回実行すると色々なパターンの値が帰ってくると思います。
今はnumberとStringだけでしたが、他の型でもやることができます。
このように任意の型で値を返してほしい時にジェネリックスは最適です。
関数より使う機会は低いかもしれませんが、困った時に是非お使いください。

## 最後に
今回紹介したもの以外にもTSには色々な追加要素があるので、JSに飽きてきたりJSに不満があったりしたら是非使ってみてください
自分はこれ以外にもいくつかTS関係の記事を上げているので良かったら見ていってください。
### 引用元
> https://typescriptbook.jp/reference
> https://www.typescriptlang.org/docs/
新感覚ドキュメント管理アプリを作った話

# 何を作ったのか
まだプロトタイプの域を出ませんが、新しいドキュメント管理体験ができるデスクトップアプリを作りました。ixmaという名前がついています。100programという長期ハッカソンの成果物です。

メモにインデントを掘ると上位のインデントがタグとして機能し、関連するセクションを自動で整理して見返すことができます。

https://youtu.be/Y0TkW8eD1V0

# 思想
このアプリは、（特にウェット系の）「研究ノート」をよりよく管理するために開発されました。
研究ノートは、実験の結果などを体系だって管理する必要がありますが、その見返し方はさまざまです。同じ試薬どうしで別の実験を比較することも、同じ実験手法どうしで別の試料を比較することもあります。

例えば以下のような階層でメモを管理している場合を考えます。
```
試料A
 ├ 実験A
 ├ 実験B
 └ 実験C
試料B
 ├ 実験A
 └ 実験B
```
このとき、試料A同士で実験A~Cの結果を一覧することは簡単ですが、実験Aの結果をさまざまな試料で比較した場合には少し不便です。

このアプリでは、先のデモ動画で示したように、タグをクリックすることで**階層構造をその場で構築し直し**、関連するセクションだけを抽出して一覧することができます。

## 他のドキュメント管理アプリとの比較
このアプリの開発にあたって、デジタルのドキュメント管理アプリの前例として「Notion」と「Scrapbox」を挙げました。
  
Notionは、階層管理に適したタスクと脳みそを持っている人々にとっては最高のアプリです。
しかし、「こうもり問題」が指摘するように、多くの人にとって秩序を持ったまま階層管理を続けることは苦行になり得ます。「こうもりを分類するのは、獣フォルダか？鳥フォルダか？」といった、階層型の管理が必ず直面する問題。どちらにも分類できるファイルたちについて、俺ルールによってカオスな分類が進んでいくことは想像に難くありません。
  
Scrapboxはこういったドキュメント管理の弱点を指摘し、階層を完全に撤廃して「リンク」を用いたネットワーキング型ドキュメント管理を提唱しました。それは素晴らしいもので、筆者も愛用しています。

しかし、「過去の記録を横断的に見返す」という点において、階層型が持っていたメリットは無視しきれませんでした。特に、雑多にメモを取りつつも、まとめる際には体系的に見返す必要がある実験化学の現場ではそれが顕著です。

求められているのは、「Scrapboxのように書けて、Notionのように見返せる」ドキュメント管理アプリだと感じ、それを目指して開発しています。


# 技術的な話
KMPを用いて、ほぼ全てのコードをKotlinで書いています。
KMPを採用した経緯は、元々ネイティブモバイルアプリを作ろうとしていて、KotlinやComposeを触ったことのある人々で開発チームを組んだのですが、ユーザーヒアリングを進めるにつれてデスクトップアプリの方が優先度が高いことが判明したため、モバイルと同じ感覚で書くことのできるCompose for Desktopを用いることを決断しました。

机の上に紙を広げていくような感覚でメモを見返すために、マルチウィンドウをを採用しました。
これはモバイルにはない状態管理が求められる、少しチャレンジングな試みでした。
マルチウィンドウをComposeでどう管理するべきか、というドキュメントが当時なかったため、独自に「WindowController」を導入して直感的に管理できるようにしました。

```kotlin
object WindowController {
    val subWindowPageLinks = mutableStateListOf<String>()

    fun openNewPageWindow(link: String) {
        subWindowPageLinks += link
    }

    fun closePageWindow(link: String) {
        subWindowPageLinks.remove(link)
    }
}

@Composable
fun RenderWindows(windowController: WindowController) {
    windowController.subWindowPageLinks.forEach { linkString ->
        Window(onCloseRequest = { windowController.closePageWindow(linkString) }, title = linkString) {
            PageEditViewScreen(linkString, windowController)
        }
    }
}
```
Applicationの一番rootのところでRenderWindowsを呼べば、WindowControllerが保持しているリンクがWindowに変換されて描画され、ComposableによってそれぞれのWindowの状態が監視される、といった狙いです。
（このアプリでは、初期画面以外の全てのWindowはリンクという文字列から生成されるのでこのような設計になっています。）

もっといい方法があったらご教示願います。

# これからどうするのか
**思想は立派だけど開発が追いついてない！！**
A. はい、、、
頑張ります。コードを書きます。UI整えたり、細かいバグとかを潰したりしたら実行ファイルを配布したいですね。あとは、せっかくKMPで書いているのでモバイル対応もしたいですね。
個人的には、モバイルとデスクトップでデータの同期までできたら、僕も普通のメモに普段使いしてぇなと感じています。早く完成させなきゃ、、！
仕様書をGPTと壁打ちして作るためのプロンプト

よかったら使ってください。ひとり開発のとき、GPTと仕様を握ってから実装はじめるのおすすめです。

https://chat.openai.com/share/b285e554-e227-4348-b854-1744cd9ae4d4

おすすめな理由、Xにパラパラと投稿したので、そのうちまとめたい。

https://twitter.com/sudo_lab/status/1741571063124013111?s=61&t=ozqwIDxbGKH0nrQdqSqxcg

https://twitter.com/sudo_lab/status/1741569126001467536?s=61&t=ozqwIDxbGKH0nrQdqSqxcg

https://twitter.com/sudo_lab/status/1741568622856994817?s=61&t=ozqwIDxbGKH0nrQdqSqxcg

https://twitter.com/sudo_lab/status/1741388267726287007?s=61&t=ozqwIDxbGKH0nrQdqSqxcg

https://twitter.com/sudo_lab/status/1741378058135953466?s=61&t=ozqwIDxbGKH0nrQdqSqxcg

https://twitter.com/sudo_lab/status/1741378679958282599?s=61&t=ozqwIDxbGKH0nrQdqSqxcg
ReactとRailsアプリケーションにおける環境変数を無理やり共通化したかった

### 背景
この記事では、Reactをフロントエンドとして、Railsをバックエンドとして使用するアプリケーションの例を取り上げ、両者間での環境変数の共有方法について説明します。

## 問題の概要
ReactとRailsの両方で使用する環境変数がある場合、例えばAPIのエンドポイントやOAuthのクライアントIDなどがある場合に、これらの環境変数の管理が同期的である方が好ましいよな？(個人的な意見)と思いました。

## 考えた解決策
バックエンド（Rails）の .env ファイルから環境変数を読み取り、
それをフロントエンド（React）用の .env ファイルに転送するシェルスクリプトの作成。
この方法により、環境変数の一元管理が可能になりそうだと思った。

スクリプトの実装
``` shell
# バックエンドの .env ファイルのパス
BACKEND_ENV_PATH="./backend/.env"

# フロントエンドの .env ファイルのパス
FRONTEND_ENV_PATH="./frontend/.env"

# フロントエンドの .env ファイルをクリアする
> $FRONTEND_ENV_PATH

# バックエンドの .env ファイルを読み込み、すべての変数をフロントエンドの .env に書き出す
while IFS= read -r line || [[ -n "$line" ]]; do
  # 空行またはコメント行を無視する
  if [[ ! $line =~ ^\# ]] && [[ ! -z $line ]]; then
    line="REACT_APP_$line"
    echo "$line" >> $FRONTEND_ENV_PATH
  fi
done < $BACKEND_ENV_PATH
```

## 使用方法
上記のスクリプトを env_sync.sh という名前で保存。
スクリプトに実行権限を付与。スクリプトを実行して .env ファイルを同期。

## 注意点
スクリプトは開発環境でのみ使用し、本番環境への直接の適用は避ける。
環境によって異なる環境変数を適宜管理する。

# まとめ
ReactとRailsを用いたアプリケーション開発において、環境変数を効率的に共有するための方法として、シェルスクリプトを利用したアプローチを考えました。この考え方はきっと正しくないので、突っ込んでもらえると助かります。
この方法で環境変数の一元管理を可能にしたかったです。
Java の UUID は符号付きで大小比較される

UUID を以下のパターンで比較してみます。
|format| uuid |
|:-:|:-:|
|基準| 018cc122-1a9d-7478-06e8-7a96ab18fea0 |
|MSB比較| <font color="red">X</font>18cc122-1a9d-7478-06e8-7a96ab18fea0 |
|LSB比較| 018cc122-1a9d-7478-<font color="red">X</font>6e8-7a96ab18fea0 |

```Java
var uuid = UUID.fromString("018cc122-1a9d-7478-06e8-7a96ab18fea0");
var um1 = UUID.fromString("118cc122-1a9d-7478-06e8-7a96ab18fea0");
var um8 = UUID.fromString("818cc122-1a9d-7478-06e8-7a96ab18fea0");
var ul1 = UUID.fromString("018cc122-1a9d-7478-16e8-7a96ab18fea0");
var ul8 = UUID.fromString("018cc122-1a9d-7478-86e8-7a96ab18fea0");
System.out.println(uuid.compareTo(um1));
System.out.println(uuid.compareTo(um8));
System.out.println(uuid.compareTo(ul1));
System.out.println(uuid.compareTo(ul8));
```
実行結果:
```
-1
1
-1
1
```
(Java 18.0.2.1 で確認)

uuid と um1 の比較結果は負数、すなわち uuid < um1 と判定されます。
uuid と um8 の比較結果は正数、すなわち uuid > um8 と判定されます。
同様に
uuid と ul1 の比較結果は負数、すなわち uuid < ul1 と判定されます。
uuid と ul8 の比較結果は正数、すなわち uuid > ul8 と判定されます。

# 観測結果
UUID 128 bit について、先頭 64 bit と末尾 64 bit をそれぞれ符号付きとして比較される模様です。すなわち先頭の文字が8～Fの場合は負数として比較されるため、0よりも小さいと判定されます。

# 補足
32bit 境界 (たとえば
 018cc122-<font color="red">8</font>a9d-7478-06e8-7a96ab18fea0) は基準となる uuid より大きいと判定されましたので、64 bit 境界で(longで)判定される模様です。

# reference
[java.util.UUID](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html)
2024/1/1主にITとかセキュリティの記事

ファイルコインネットワークとは何ですか?またその仕組みは何ですか?(12/29)
https://portalcripto.com.br/ja/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B3%E3%82%A4%E3%83%B3%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%A9%9F%E8%83%BD%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B/

2024年に流行るサイバー攻撃は？　注目はやはりAI(12/30)
https://www.sankei.com/article/20231230-BZPT7UOTLBJ3FHA4UQP44DIENU/

なぜセキュリティグループで0.0.0.0/0からのインバウンドトラフィックを許可することが危険なのか？(12/30)
https://dev.classmethod.jp/articles/security-group-0000ports/

詐欺サイト撲滅にボランティア＝２４年、全国で学生向け講習会―サイバー犯罪対策センター(12/29)
https://sp.m.jiji.com/article/show/3132318

Canvaの危険性は？商用利用で使う時の禁止行為も解説！(12/29)
https://apple-geeks.com/canva-risk-100834

おすすめの DEX（分散型取引所）とは？リスクや注意点も解説(12/30)
https://crypto-times.jp/dex-ranking/

【書評】『WEB+DB PRESS Vol.136』から学ぶ、パスキー(Passkey)導入で変わるセキュリティとUX(12/30)
https://dev.classmethod.jp/articles/benefit_of_passkey_in_web_db_press_136/

マイクロソフトのメタバース vs. Facebook メタバース: 違い(12/29)
https://portalcripto.com.br/ja/Microsoft%E3%83%A1%E3%82%BF%E3%83%90%E3%83%BC%E3%82%B9%E3%81%A8Facebook%E3%83%A1%E3%82%BF%E3%83%90%E3%83%BC%E3%82%B9%E3%81%AE%E9%81%95%E3%81%84/

銀行口座から70万円が突然消失した男性　「サイバー攻撃のでっち上げ」と疑われる(12/30)
https://nordot.app/1113575765364818131

2023年のブロックチェーン振り返り〜「プロ驚き」からの脱却と地に足がついた若い世代への交代の予兆(12/30)
https://media.dglab.com/2023/12/30-2023blockchain-01/

パナHD、電力事業者向けサイバー防衛　25年にも開始(12/30)
https://www.nikkei.com/article/DGXZQOUF214EN0R20C23A9000000/

2024年のブロックチェーン技術予測──リップル、コインベース、a16z、スタークネットなど10人の専門家に聞く(12/30)
https://www.coindeskjapan.com/213110/

［社説］企業は米中分断リスクへの備えを急げ(12/30)
https://www.nikkei.com/article/DGXZQODK290WJ0Z21C23A2000000/

Androidの新しいマルウェア「Xamalicious」、25種類のアプリに混入(12/30)
https://news.mynavi.jp/techplus/article/20231230-2853250/

モダンなアプリケーションのセキュリティ対策について学んできた　#AWSreInvent(12/30)
https://dev.classmethod.jp/articles/modern-application-security-20231129/

[レポート] Amazon CloudWatch Logs から実行可能なインサイトを得る #COP326 #AWSreInvent(12/29)
https://dev.classmethod.jp/articles/cop326-get-actionable-insights-from-amazon-cloudwatch-logs-reinvent-2023/
Vmmem、DockerDesktopのメモリ制限をしたら

**文系学生エンジニアのJonyTaskです**
**こちらの記事では、Vmmem、DockerDesktopの使用できるメモリを制限したら、動かなくなることがあり、そちらについて話したいと思います。**

## Vmmem、DockerDesktopBackendのメモリ消費が凄い
私は現在、Windows11を使用していますが、最近調子が悪く、タスクマネージャーを閲覧したところ、

DockerDesktop メモリ消費約2GB
Vmmem　　　  メモリ消費1GB弱

死ぬほど消費しており、そのためメモリ消費を制限しようと思いました。

## .wslconfigによる制御
メモリ消費の制御方法は.wslconfigファイルに書き込むことが最も直接的らしいです。

```
[WSL2]
memory=500MB
```

.wslconfigファイルですが、「C:\Users\ユーザ名」このパスに配置しなければいけないらしいです。

使用されるメモリの上限が500MBになるように記述し、
DockerDesktopの設定→Resources→Advanced
こちらの箇所に、「Disk image location」とあります。

「Browse」から先ほどのディレクトリを指定し、「Apply&start」をクリック
**すると、全く動かない！**
**DockerDesktopでEngineは起動せず、VSCode上でUbuntu内にあるプロジェクトファイルを開くことができず、本当にこの世の終わりかと思いました。**

メモリを制限し過ぎたのではないかと思い、
```
[WSL2]
memory=1GB
```
制限を500MBから1GBに緩和したところ、動くようになりました！

:::note alert
どうやらあまりにもメモリを制限し過ぎるとダメらしいですね
:::

正直細かい原因は分かりませんが（笑）、メモリを制限し過ぎるとLinux自体が動かなくなると覚えていただけるといいでしょう！
「ソフトウェアアーキテクチャの基礎」輪読会の感想

10月から11月末にかけて、有志で「ソフトウェアアーキテクチャの基礎」という本の輪読会に参加したので、その感想を書こうと思います。
# 「ソフトウェアアーキテクチャの基礎」とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/d4251b63-e5cc-03c8-9009-deb1c369e36d.png)
ソフトウェアアーキテクチャの種別やそれぞれのトレードオフ、アーキテクチャをどのように選択するかの技法から、そもそもソフトウェアアーキテクトが持つべきマインドどのようなものなのか、ということまで言及されている本です。私は最近アーキテクチャに興味があったこともあって、とても楽しく読めた本でした。

# 輪読会をどう進めたか？
参加者は所属も居住地も全く異なるコミュニティの学生たちだったため、輪読はすべてオンラインで行われました。
平日の毎朝8:30~から一時間弱ほどの尺で行い、およそ１か月ほどかけて全２４章の輪読を行いました。
実施日の１週間前あたりに章ごとの担当者を決め、担当者は担当日までに章の内容をScrapboxにまとめます。
参加メンバーは5人だったため、ちょうど週に一度自分の担当が来る、くらいの頻度でした。この規模感はとても丁度よかったと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/576cf560-9225-1fc2-c62f-f3bd7b6846c6.png)
# 学んだこと
学習したことは、コミュニティのScrapboxにまとめてあります。公開プロジェクトなので、時間のある方は[こちらから](https://scrapbox.io/sandbox-community/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E5%9F%BA%E7%A4%8E%E8%BC%AA%E8%AA%AD%E4%BC%9A_%E3%81%BE%E3%81%A8%E3%82%81)ぜひ覗いてみてください。

私が担当した章は、
- 第5回「アーキテクチャ特性を明らかにする」
- 第10回「レイヤードアーキテクチャ」
- 第16回「オーケストレーション駆動サービス志向」
- 第19回「アーキテクチャ決定」
- 第24回「キャリアパスを拓く」
の全5回でした。


特に、第II部アーキテクチャスタイル（第9回~第17回）の内容は、実際の様々なアーキテクチャについての議論を扱うもので、なかなかカロリーが高かったです。初めて知るアーキテクチャ構成も多く、輪読会を通じて語彙を増やせたな、と感じました。
しかしまだ、一度読んだだけでは、すぐに実践できるほどの知識の定着は実感できていないため、これからソフトウェア開発に関わっていく中で読み返して身につけていくのが良いだろうな、と考えています。

復習に関しては、巻末付録に各章の要点を問う確認質問（付録A　自己評価のためのチェックリスト）があるので、それらを活用するのもアリだと思っています

# 良かった点
私は今回初めて技術書の輪読に参加したのですが、他人と共同しながら一冊の本と向き合うのは、一冊を読み切るモチベーションの維持にとても良い影響を与えると感じました。1人でこの本を一冊読み切るのは中々難しいと思います（私はアーキテクトとしての仕事をしていない/したことがない以上、実務にすぐ活きる内容からは少し遠いため、余計にそう思うかも）。

また、複数人ならではの議論が発生するのも良かったです。自分になかった着眼点で掘り下げが起こったり、誰かが関連するブログ記事を見つけてきてみんなで読みに行ったりなど、1人では体験できないようなイベントが発生し、毎回刺激的に読み進めることができました。

アーキテクトの仕事についての解像度が上がり、また、これらのアーキテクチャについて積極的に情報発信している企業についても詳しくなれたと思っています。キャリアを考える面でも素敵な活動だったと思っています

# 苦戦した点
初めに述べたように、この輪読会は8:30 ~ のスケジュールで土日祝日を除く毎日行われたのですが、参加者の中で私だけが大学の単位を十分取り終えておらず、1限に参加するために途中で離脱したり耳だけ参加になってしまったのが惜しかったです。（それでも、夜に毎日あるより健康的ですし、**トレードオフ**ですね!）
それでも、Scrapbox上でテキストベースに議論したり、どうしても参加できなかった章は後から資料を読み返すなど、そこまで深刻な問題ではなかったです。

# 総括
輪読会っていいものですね!
箱根駅伝データ分析物語　#６：逆タイム番長トラックタイム補正

明けましておめでとうございます！
しかし、俺らの年末はまだ終わらねぇ。

ということで、**いわゆる「逆タイム番長」が各大学に存在する。**
トラックのベストタイムは高校時の記録で、その後爆伸びしてからはトラックを走っていないため、トラックの記録と本当の実力が見合っていない（いい意味で）選手だ。

**10,000mトラックタイムベースで予測をしようとしている今回においては、特に補正しなければならない要素**である。

機械学習による予測予定の第101回に向けても、結局は考慮するべき事象な気がしているので、今回の分析を次回に生かす！

＜前記事＞
[箱根駅伝データ分析物語　#５-２：ロード力分析（潜在的個人ロード力）](https://qiita.com/sakigakeman/items/3837a59ee5aca4b11106)

# 1. はじめに
はじめに、どのような「逆タイム番長」が具体的に存在するのか。やはり駒澤大学の山川拓馬くんが適任！

**持ちタイム**
10,000mベスト：30:27
（箱根全大学エントリーランナー平均：29:08）


**出走結果**
2022全日本：4区区間賞
2023箱根：5区4位
2023出雲：3区日本人トップ
2023全日本：8区区間賞

と、こんな感じに大きなギャップがある…。

実際ハーフマラソンの記録は良いので、**ハーフマラソンについても加味すれば改善されるのだろう**が、ハーフマラソンの記録がない選手も多々存在するので、やはり10,000mの記録寄与度をあげるためにも、補正ロジックは一旦作成する必要がある。

# 2. 補正ロジック

以下のようなステップで補正ロジックを作成した。とても複雑なので、セルフチェックの意味も込めて記載する。

### STEP①：各駅伝結果からのトラックタイム逆算

1. 2020年以降の出雲・全日本・箱根の同区間出走ランナーを対象として、**出走ランナーにおける5,000m（出雲）、10,000m（全日本・箱根）タイムの平均値を算出**する
　
2. 同様に2020年以降を対象として、**同区間における各ランナーの区間タイム標準偏差・偏差値を算出**する
 　
3. #2で算出した区間タイム標準偏差・偏差値は、トラックタイムでも同様の標準偏差・偏差値だと仮定して、#1で算出した平均値をもとに**偏差値ベースでのトラックタイムの逆算値を算出**する


:::note info
**ポイント①：5000m⇔10000mのタイム変換**

今回、最終的な予測では10,000mトラックタイムを用いているが、出雲駅伝からは5,000mの逆算値算出を行っている。ではどのように10,000mに変換するか…。

世界陸連がワールドランキングというものを公表しているが、そのランキングは各種目におけるスコアに基づいている。そのスコアは各種目の記録に対して付与されるものになる。

その**スコア変換テーブルを参照して、5000mと10000mのトラックタイムの紐づけ**を行った。
例えば5000m 13:47:84 / 10000m 29:00:51に対しては、どちらも1041ptが付与される。よってこのタイムは同等とみなす、というようなロジック。

参考：[WORLD ATHLETICS -Technical Information -SCORING TABLES](https://worldathletics.org/about-iaaf/documents/technical-information?_gl=1*11v5lgp*_ga*NzA1NTQyMDEzLjE3MDMwODA1OTA.*_ga_7FE9YV46NW*MTcwMzA4MDU4OS4xLjAuMTcwMzA4MDU4OS4wLjAuMA..)
:::

### STEP②：各逆算値の集約

STEP①で算出した出雲・全日本・箱根の区間タイムから逆算したトラックタイムを、以下のパターンに応じて集約する。

- **過去出走大会が計2大会以上あり、箱根駅伝にも出場している場合**：
シンプルに平均
　
- **過去出走大会が計2大会以上あるが、箱根駅伝に出場していない場合**：
出雲・全日本のみでまず平均値を算出、その後箱根は100%と仮定して、2データで平均をとる
　
- **過去出走大会が1大会の場合**：
逆算タイムと現持ちタイムの平均をとる
　
- **過去出走していない場合**：
空欄


### STEP③：現持ちタイムとの比較・補正

最後に、現持ちタイムとの比較を実施する。目的は、逆タイム番長のトラックタイムの補正であることを忘れない。
以下のパターンに分けて比較を行い、最終的なトラックタイムを決定した。

**①トラック持ちタイムが28:30以下の場合**：
トラック持ちタイムそのまま

**②以下、トラック持ちタイムが29:30以上で過去2回以上出走している場合**
- 逆算値タイムが28:30以下の場合：28:30
- 逆算値タイムが28:30以上でトラック持ちタイム以下の場合：逆算値タイム
- 逆算値タイムがトラック持ちタイム以上の場合：トラック持ちタイム

**③上記以外で過去1回以上出走している場合**
- 逆算値タイムが28:30以下の場合：28:30
- 逆算値タイムが28:30以上トラック持ちタイム以下の場合：逆算値タイムとトラック持ちタイムの平均
- 逆算値タイムが28:30以上でトラック持ちタイム以上の場合：逆算値タイム

**④トラック持ちタイム29:30以下で過去出走していない場合**
トラック持ちタイムそのまま
　
**⑤トラック持ちタイム29:30以上で過去出走していない場合**
各大学エントリーランナータイムの平均

:::note warn
**ポイント②：様々なパターンを考えようとしすぎるあまり複雑怪奇に…**

過去出走大会が1回なのにその結果を反映させるのは…等、場合分けパターンを色々考えすぎてしまった結果、複雑怪奇になってしまった。

来年度はこの場合分けも不要だろう…。
:::


# 3. 補正結果

これによってどのような補正結果になったか、駒澤大で逆タイム番長だと思われる3人を例に以下に示す。

|名前|補正前タイム|補正後タイム|
|:-:|:-:|:-:|
|山川拓馬|30:27|28:26|
|赤星雄斗|30:07|28:34|
|庭瀬俊輝|30:27|28:54|

結構、妥当なのではないでしょうか……。


# 4. 限界

やはり、**この補正をしたうえで近似を行う必要がある。** これに尽きる。


# 5. 次分析

次はいよいよ予測結果を載せる……。長かった…。何とか箱根駅伝に間に合わせようと殴り書きになったが、間に合いそうでよかった。。。