OmniAICreator/Qiita-1.07M huggingface dataset:
デイリースクラムに変わるデイリーPDSについて

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 13日目です。

## １日で変化する「状態」を観測する

スクラムフレームワークでは、１日の振る舞いをデイリースクラムという方法で、透明性を持たせる。

それでは、適応型ソフトウェア開発においては、どうするのが良いか。

実はとてもシンプルである。それは、タイムボックスを１日に合わせたプロジェクトデータシートを俯瞰する時間を作ることだ。

## プロジェクトデータシート

プロジェクトデータシートやタイムボックスについては、以下の記事を参照。

https://qiita.com/h-kinocoboy/items/c759e2cc47b3d5070a6a

https://qiita.com/h-kinocoboy/items/cd9ad55c1131198469e0


## チームでの取り組み方の事例

以下の手順でチーム１日の俯瞰を進めることにした。

* 前日
    * 用意してあるデイリープロジェクトデータシートに、今作業している全ての案件を書き込む
    * 担当者は、１日でどの状態に行きたいかを事前に書いておく
* 当日
    * 朝会は任意参加
    * シートに書いてあることを正として進める

### 記載例
デイリーPDSだと、一番小さな粒度のタイムボックスになるため、やることはとにかく具体的に記述するようにした。

|タスク名|状態|今日やること|達成すること|目指したい背景|
|-------|---|--------|---------------|------------|
|XXXについて学ぶ|学習|XXXにおけるAAAの調査|AAAの調査を終える|XXXを顧客に提供したい|
|YYYについて思案する|思案|YYYのタスクブレイク|YYYを協調して作れる|XXXを顧客に提供したい|
|ZZZについて協調する|協調|ZZZのMRを作成する|ZZZをリリースする|ZZZを顧客に提供したい|


またこのタイミングで、困っていることや相談したいことなどを、軽い気持ちの共有という時間を作り、そこで交流を深めることで進捗を出せるように心がけた。

#### 頻度
このデイリーPDSを眺める時間は、毎日実施し、日々の状態を常に最新化できるようにすることを徹底した。

その結果、次に大きな粒度のタイムボックスになっても、自分たちの状態を見失うことは減っていった。
中学生エンジニアのワイが普段使ってるサイト10選

### 茶番(飛ばしてどうぞ)
どうも
qiitaで編集する方法を最近知ったkkk2z1です。

qiitaでできるだけ記事を書くようにします。
学校の移動教室で、長野に行くのですが　
ワイが告白するとかいう話が一組で広まっていました。
草
あ、友人のKHも告るか考え中だそうで
### 半平、シャーペン、本編です。
#### 1.[Github](https://github.com)
みんなおなじみGithubです。
gitをGUIベースでホストしてるサイト的なやつ。
micorosft所有だっけ...etc
課金で色々機能が使えるお

#### 2.[qiita](https://qiita.com)
みんな大好きqiita
IT系の情報があるサイト
q&aのサイトだからqから始まりaで終わるqiitaになった名前が
自分が、IT系で困った時に見に来てる
[外部のサイトでqiitaに関する記事](https://itpropartners.com/blog/9393/)

#### 4.[IE-T](https://ie-t.net)
このwebが半腐れとも言えなくもない時代ですが
無料/無広告でSSLまでついてくるレンタルサバです。
PHP(apache のmod_phpで対応 )やmaillが使えます。
独自ドメインが使えるのも魅力

#### 5.[忍者admax](https://www.ninja.co.jp/home/admax)
ページに広告が作成できるやつ。
クレカがない　中学生には、うれしいポイント付与で後々金に変えるやつ。
html で書き込むのでアメブロには、設置できない。
忍者シリーズは、微妙に便利

#### 6.[pypi.org](https://pypi.org/)
python のpackageを調べられる。
#pypalは、Python Package Indexの略だよ。
登録するとするとpipを作成できる.
python 3.4より前は、別に別にインストしなきゃ行けなかった(desk.channel.io...?)らしい。

#### 7.[channel Tallk](https://desk.channel.io/)
ネッ友と雑談するのに使う。
マイクラ風ゲームのクライアント作成の雑談とかに使ってる。
企業向け？ﾁｮｯﾄﾅﾆｲｯﾃﾙｶﾜｶﾘﾏｾﾝ
discord感あるのなんでだ......?

#### 8.[VScode.dev](https://vscode.dev/?vscode-lang=ja)
みんな使うvscode
自分は、コーディングはcodespace小説作成は、vscodeで使ってる
githubと連携できる
開発がGUIで出来るのでべんり

#### 9.[Proton maill](https://proton.me/mail)
Proton maill 個人情報とかを保護しつつメールできる。
スマホアプリとかを使えば　容量が増えた気がする。
Tor版があるぞい。
[2023ぐらいで大体一億人ぐらいが使ってる。](https://ja.wikipedia.org/wiki/Proton_Mail#:~:text=2023%E5%B9%B44%E6%9C%88%E3%81%AE%E6%99%82%E7%82%B9%E3%81%A71%E5%84%84%E4%BA%BA%E4%BB%A5%E4%B8%8A%E3%81%AE%E5%88%A9%E7%94%A8%E8%80%85%E3%81%8C%E3%81%84%E3%82%8B)

#### 10.[Render.com](https://render.com)
Dockerとかpython3でホストできる
基本無料　有料で常時起動とかが出来る
intersteler proxyなどをホストするとBanされる。
[Zenn.devでの紹介記事。](https://zenn.dev/mitsuruokura/articles/12b17d406902ab#:~:text=Rnder.com%E3%81%AF%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%84%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%83%BB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E7%B5%B1%E5%90%88%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82%E7%84%A1%E6%96%99%E3%81%AETLS%E8%AA%8D%E8%A8%BC%E3%80%81%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%81%AACDN%E3%80%81DDoS%E9%98%B2%E5%BE%A1%E3%80%81%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%80%81Git%E3%81%8B%E3%82%89%E3%81%AE%E8%87%AA%E5%8B%95%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%8C%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)

### 終わり。
色々あったね
ぜひ使ってみて!
#### いいエンジニアライフをアディオス!

:::note info
☆英語の時間の最中に書きました☆
:::
行列式を実装してみる

# はじめに
本記事はQiita 全国学生対抗戦 Advent Calender2024に参加しています。
[Advent calender](https://qiita.com/advent-calendar/2024/student)

こんにちは。あずびわです。
現在、数学科に通っている1年生です。
代数学の授業で線形代数を習ったので、その中でも行列式をいろいろな定義を用いてプログラムで実装したいと思います！

# 行列の準備
今回は計算が分かりやすいように、3次正方行列を用いて計算します。

```Python:Python
import random
N = 3  # 3次行列

matrix = [[random.randint(0,5) for i in range(N)]for i in range(N)]
for i in range(N):
  print(matrix[i])
```

二重のリストを使って行列を作成しています。
行列の要素は0から5までランダムな整数を取るようにしています。

# 行列式の定義
n次正方行列${A=(a_{ij})}$に対して、置換${S_n}$を用いて

${\det A =\sum_{\sigma \in S_n} \varepsilon (\sigma)a_1{\sigma _{(1)}}a_2...a_n{\sigma _{(n)}}}$

と表されるものが行列式です。

これは、各行各列から1つずつ要素を取り出してかけて、そこにそれらの置換に応じた符号をかけて足し合わせたものになります。

```Python:定義
det = 0

for i in range(3):
  for j in range(3):
    if i!=j:
      k = (6-i-j)%3  # 3行目が何列目になるか
      
      hugou_pls = False
      if (i==0 and j==1 and k==2) or (i!=0 and j!=1 and k!=2):  # 置換による符号
        hugou_pls = True
        
      sum = matrix[0][i] * matrix[1][j] * matrix[2][k]
      if hugou_pls:
        det += sum
      else:
        det -= sum
        
print(det)
```
こんな感じです。
今回は3次正方行列を考えているので、置換は各行と各列の値が等しい時か各行と各列の値が全て異なっている時に正になります。


# 余因子展開
```Python:余因子展開
det = 0

for i in range(3):
  sum =  matrix[i][0] * (matrix[(i+1)%N][1] * matrix[(i+2)%N][2] - matrix[(i+1)%N][2] * matrix[(i+2)%N][1])
  det += sum
  
print(det)
```

余因子展開は、1つの行または列を選び、そこから小行列を考えて行列式を計算する方法です。
このプログラムでは、1列目で余因子展開しています。

# サラスの公式
```Python:サラスの公式
det = 0

det += matrix[0][0] * matrix[1][1] * matrix[2][2]
det += matrix[0][1] * matrix[1][2] * matrix[2][0]
det += matrix[0][2] * matrix[1][0] * matrix[2][1]
det -= matrix[0][0] * matrix[1][2] * matrix[2][1]
det -= matrix[0][1] * matrix[1][0] * matrix[2][2]
det -= matrix[0][2] * matrix[1][1] * matrix[2][0]

print(det)
```
3次正方行列で使える公式で、斜めにかけて足すことで行列式を求めることができます。
プログラムとしては見たままで、それぞれの対象を計算して、足すものと引くものに分けて計算しています。
キャリアブレイク中にやっている息子のサポート

今日はキャリアブレイク中に具体的にやっている息子のサポートについて書きます。

# 息子のサポート
息子に宿題以外の家の自習で何かサポートしたいとは思っていて、キャリアブレイク中は1日1時間はそのために使おうと思ってしました。ただ、月水金はゲーム、動画、習い事などに時間を取られるので、火曜と木曜ならやってあげても良いよ（誇張）と言われました。

# 算数のサポート
息子は小さいころから数は好きでした。計算なんかも得意だったので自分に時間が出たら、息子のペースに合わせて、算数を見てあげようと思いました。以前に小2用の参考書を買ってきて何となく時間がある時見てあげたりはしていました。それをキャリアブレイク中は定着させ、可能なら学校より先に進めようと思っています。実際11月で小2分は終わりました。来年分の先行が楽しみ。

# 自転車のサポート
息子はまだ自転車に乗れません。僕自身小4まで自転車に乗れなかったので気にする必要はないと思いつつ、乗れないのが悔しいという気持ちがあるようなので、練習を見てあげることにしました。でもコツとかはあまり分からないので、基本付き添ってアドバイスする程度です。ようやく漕げるようにはなってきましたが、安定が悪く、すぐふらつくのでもう1歩かなと思っています。

# マラソンのサポート
息子は走るのも好きなので、自分が走るのとは別で息子のペースで5kmぐらい走っています。タイムで言うと1kmで2分以上遅いですが、自分にとってもゆっくり走るのは悪くないので、ちょうど良いと思っています。これも単に並走するだけで特に何かはやっていません。

# コンピュータのサポート
これはまだやっていません。いつやろうか迷っていて、何度か無料のプログラム教室には通わせてみましたが、今のところまだ本気でやりたいとはなっていないようでした。いつ自分専用のスマホやパソコンを渡そうかも迷っています。

# まとめ
息子のサポートなかなか難しいですね。結局隣で見ているだけになっているものも多いし、頻度やペースも思った通りにやれているわけではないです。でもそもそも働いていると時間を取ることがとても難しいので、これは今の特権です（リモートワークでもこういうのが出来ると良いですね）。焦っても、本人のやる気を削いでしまうだけなので、まあなかなか自分のようには行かないです。。でも自転車も算数も少しずつ進んでいるので気長に見守っていきます。
証明書のテストをした記録

今年を振り返る「なんかかく」アドベントカレンダー 13 日目です。軽めの話題ですが予定通りです。今日はしゃかいじん、真面目な仕事もしていますという話です。チラシの裏です。自分のメモ用の趣が強いですが、未来の私に感謝されるつもりで書いておきます。

証明書のテストをした記録、参考にした資料等々です。


## 自己証明書

PowerShell で。

https://tech-lab.sios.jp/archives/26309

```Powershell:Powershell
$cert = New-SelfSignedCertificate -Subject "VM1" -CertStoreLocation "cert:\CurrentUser\My" -KeyExportPolicy ExportableEncrypted
Export-Certificate -Cert $cert -FilePath VM1.cer
```

```Powershell:Powershell
Import-Certificate -FilePath VM1.cer -CertStoreLocation "cert:\CurrentUser\Root"
Import-Certificate -FilePath VM1.cer -CertStoreLocation "cert:\LocalMachine\Root"
```

ほか [テスト証明書の作成 - Windows drivers | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/creating-test-certificates)

## CertUtil
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/certutil

> certutil.exe は、証明書サービスの一部としてインストールされるコマンドライン プログラムです。 certutil.exe を使用すると、証明機関 (CA) の構成情報の表示、証明書サービスの構成、および CA コンポーネントのバックアップと復元を行うことができます。 このプログラムにより、証明書、キー ペア、および証明書チェーンの検証を行うこともできます。

## 静的 Web サイトの準備

https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-static-website

https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-static-website-how-to?tabs=azure-portal


## Let’s Encrypt

https://letsencrypt.org/ja/

[Let's Encrypt の証明書をブラウザ上で簡単取得 (dns-01 / ECDSA もあるよ) #JavaScript - Qiita](https://qiita.com/tappie/items/76881fdf7996c57a105a)


## ZeroSSL

https://zerossl.com/

[無料の SSL 証明書が得られる ZeroSSL を使ってみた](https://zenn.dev/mattn/articles/b2c4c92c9116b1)


## 余談
[チュートリアル - Azure portal を使用して Key Vault に証明書をインポートする | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/key-vault/certificates/tutorial-import-certificate?tabs=azure-portal)
[Azure Firewall Premium の機能 | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/firewall/premium-features#tls-inspection) : TLS インスペクション
[Azure Firewall Premium の証明書 | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/firewall/premium-certificates) : 証明書


以上です～
[CAIレシピ] HTTPレスポンスコード/ヘッダーを扱うサービス接続

## はじめに

REST APIによっては、レスポンスコードとしてHTTP 200以外を返す動作や、レスポンスヘッダーとして重要な情報を返す動作があります。この記事では、これらの情報をサービス接続で取得する手順を確認します。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [終了ステップによるHTTPレスポンスコード/ヘッダーの設定](https://qiita.com/shunsuzu/private/a0acf33c961ec52ed4fd)
- [サービス接続によるREST APIの実行](https://qiita.com/shunsuzu/private/f2783c55a4d75661fc0b)

:::note
例えば、SAPのODataサービスではCSRFトークンが必要になる場合があります。
[CSRF Token Validation Failed in POST method in Gateway Client](https://community.sap.com/t5/technology-blogs-by-members/csrf-token-validation-failed-in-post-method-in-gateway-client/ba-p/13519500)
CSRFトークンはレスポンスヘッダーとして返されるため、対象のAPI利用時にはこの記事で紹介している方法でサービス接続を定義します。
:::

## HTTPレスポンスコード/ヘッダーを扱うサービス接続

### サービス接続の作成

次の手順では[終了ステップによるHTTPレスポンスコード/ヘッダーの設定](https://qiita.com/shunsuzu/private/a0acf33c961ec52ed4fd)で作成したCAIプロセス __recipe-pca-stepEnd__ を実行するサービス接続を作成しています。

1. サービス接続を次の設定で作成します。
    - 名前を __recipe-svcConn-handleResponseCodeHeader__ とする
    - アクション __getAction__ を追加する

1. __バインディング__ タブを選択して __URL__ に[終了ステップによるHTTPレスポンスコード/ヘッダーの設定](https://qiita.com/shunsuzu/private/a0acf33c961ec52ed4fd)で作成したCAIプロセス __recipe-pca-stepEnd__ のサービスURLを指定します。

1. __出力__ タブを選択して、出力フィールドを2つ、次のように定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/0f8a6b88-bde8-4245-ffc9-a511def191af.png)
__取得元__ を __HTTP応答ステータスコード__ とすることでHTTPレスポンスコードを、__HTTP応答ヘッダー__ とすることでHTTPレスポンスヘッダーを取得しています。

1. 作成したサービス接続を 保存 して パブリッシュ を実行します。


### アプリケーション接続の作成

1. アプリケーション接続を次の設定で作成します。
    - 名前を __recipe-appConn-svcHandleResponseCodeHeader__ とする
    - タイプを __recipe-svcConn-handleResponseCodeHeader__ とする
1. 保存、パブリッシュ を実行します。



### CAIプロセスの実装
次の手順では作成したサービス接続・アプリケーション接続を利用するCAIプロセスを作成しています。

1. CAIプロセスを次の設定で作成します。
    - 名称を __recipe-pca-svcHandleResponseCodeHeader__ とする
    - __匿名アクセス__ を許可する
    - __クラウドサーバー__ にデプロイする

1. 出力フィールド __outputCode__、__outputHeader__ を __タイプ=テキスト__ として定義します。
1. CAIプロセスが次の順に実行されるように各種ステップを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/173fdf82-bbd4-d8d6-3ed0-488c536ed296.png)

1. サービスステップを選択して、次のように設定します。
    - __サービスタイプ__ を __接続__ とする
    - __接続__ を __recipe-appConn-svcHandleResponseCodeHeader__ とする
    - __アクション__ を __getAction__ とする

1. 割り当てステップを選択して、出力フィールド __outCode__、__outHeader__ にサービス接続の出力フィールド __getActionCode__、__getActionHeader__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/eb7eb353-abda-7d44-f797-7196ff4fa929.png)

### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。[終了ステップによるHTTPレスポンスコード/ヘッダーの設定](https://qiita.com/shunsuzu/private/a0acf33c961ec52ed4fd)で作成したCAIプロセス __recipe-pca-stepEnd__ が返すHTTPレスポンスコード(`505`)/ヘッダー(`headerTest`)をサービス接続経由で取得できました。

```:curlコマンドと実行結果
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-svcHandleResponseCodeHeader

//実行結果
{
"outputCode":"505",
"outputHeader":"headerTest"
}
```





## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)
【Rustのまほう2】#14 マルチスレッディングの諸刃の剣

今作っているゲームで、ボスキャラクターが数回に一回くらいの割合で移動しなくなる、というバグが起きたことがありました。こういう再現しにくいバグの原因究明は大変で、このときは1時間は費やしてしまいました。今回はそのBevyの落とし穴について触れたいと思います。





# システムの実行順序

以下のサンプルプログラムを考えます。

```rust
use bevy::prelude::*;

fn a() {
    info!("a");
}

fn b() {
    info!("b");
}

fn main() {
    let mut app = App::new();
    app.add_plugins(DefaultPlugins);
    app.add_systems(Update, (a, b));
    app.run();
}
```

aと出力するだけのシステム`a`と、bと出力するだけのシステム`b`が定義されており、それらが同じ`Update`スケジュールに登録されています。つまり1フレームごとに、aという文字列を出力する、bという文字列を出力する、というだけのコードです。このプログラムを実行すると、abababab……のようにaとbが交互に出力されるかと思いきや、babaababbaab……のようにたびたび順序が入れ替わって出力されます。この結果は実行するたびにランダムに変わります。実は、**システム`a`とシステム`b`は別々のスレッドで実行されています**。

Bevyはデフォルトでマルチスレッディングが有効になっています。先ほどの単純なソースコードからはマルチスレッドプログラミングの気配はまったく感じませんが、Bevyはあれを自動的に別々のスレッドに割り当てて並列処理します。このため、**同じスケジュールに登録されたシステムの実行順序はデフォルトでは不定**です。上のような簡単なプログラムでも、簡単に結果が不定になってしまうのです。

冒頭て述べたボスキャラクターが動かなくなるバグの原因を探ってみると、ボスキャラクターの剛体に移動のために外力を設定したのですが、別のシステムでも外力を設定するコードが書かれており、それらのシステムの実行順序が不定だったため、ボスが動いたり動かなかったりしたのでした。そちらの古いシステムのコードはすっかり存在を忘れていて、新しく書いたシステムとバッティングしてしまったというわけです。





# システムの順序を指定する

ではシステムの実行順序を指定するにはどうすればいいかというと、`before`や`after`のようなメソッドを使います。以下のように`a.before(b)`のように書くと、`b`は`a`が完了したあとに実行を開始するようにスケジュールされるので、abababababababab...のように必ずaとbが交互に出力されるようになります。

```rust
app.add_systems(Update, (a.before(b), b));
```

もっとも、こうすると`a`と`b`は並列に実行されません。すべてのシステムに順序を指定してしまうとせっかくのマルチスレッディングが台無しになってしまうので、必要な部分だけ順序を指定します。

ほかの対策としては、`a`と`b`の両方のシステムから同じデータへ個別に書きこむのをやめて、`a`と`b`を統合するという手もあります。標準出力という全体で共通のリソースに対して別々のシステムから書きこむから結果が不定になってしまうわけで、標準出力に書きこむシステムをひとつにしてしまえばいいわけです。でも、本当にシステムを統合できるかはケースバイケースです。また、Bevyではシステムは分割していったほうがコードがすっきりするので、統合する方法が適しているケースはあまり多くないと思います。

さらにほかの対策としてはマルチスレッディングの機能自体を無効にする手もあるのですが、ゲーム開発において実行速度は重要であり、マルチスレッディングはそのための重要な道具ではありますので、頑張って付き合っていくのがいい気がしてます。

なお、**システムセット**という機能もあるようですが、チートブックを読んでもどういう使い方をすればいいのか私にはよくわかりませんでした。複数のシステムをまとめて実行順序を指定できるという機能のようですが、どちらかというとサードパーティのプラグインで使う機能かもしれません。私の作っているゲームでは、唯一物理エンジン関係のシステムのスケジュールでこのシステムセットを使っていますが、正直よく理解できていないです。だれか日本語で解説書いてください！！！

https://bevy-cheatbook.github.io/programming/system-sets.html




# 他のゲームエンジンとの比較

私は他のゲームエンジンでのマルチスレッディングについては知らないのですが、たとえば[Godotのマルチスレッディング](https://docs.godotengine.org/ja/4.x/tutorials/performance/using_multiple_threads.html)や[Unityのマルチスレッディング](https://docs.unity3d.com/ja/2018.4/Manual/JobSystem.html)のコードを見てみると、マルチスレッディングで動作するように書き方を工夫する必要があり、追加でかなり多くのコードを書かなければならないようです。またミューテックスのようなマルチスレッド特有の概念も取り扱う必要が出てきます。デッドロックのような厄介なバグにも直面するかもしれません。

それに対し、Bevyでマルチスレッディングを行うのに、特別な書き方はほとんど必要ありません。せいぜい`before`や`after`で必要に応じて実行順序を指定するだけです。

**Bevyで書くと、アプリケーションが自然に小さなシステム群へと分解されます。そうやってできた小さなタスク群はそれぞれの独立性が高いので、マルチスレッディングにより別々のスレッドで実行するのに適しています。そしてBevyが自動的にそれらのシステム、それらのタスクを上手にスケジューリングして並列実行してくれます。** これはほかのゲームエンジンでは到底真似のできない、Bevyの大きな強みといえると思います。


もちろんこの記事で述べたように、**Bevyのマルチスレッディングの自動的なスケジューリングがうまくいくのは、それらのシステムが完全に独立して実行できる場合だけ**です！どちらも同じデータに書きこむなどで依存関係があって独立していない場合は、ちゃんと実行順序を指定しないと不定な結果になることがあります。Bevyではそのような不定なシステムをあまりに簡単に作れてしまいます。これはBevyの諸刃の剣、敵も味方も吹き飛ばすBevyの地雷原です！気を付けましょう！
[備忘録]　Youtubeを見ながらUnityの勉強　4日目

# はじめに
　こんにちは，Umamusume22です。最近、業務でUnityを使っているのですがUnityが分からないので自主的に勉強を始めました。とりあえず、Youtubeを見ながらUnityの勉強を行います。学んだことはここの記事にアウトプットしていきます。
 今日は以下の動画を見てUnityの勉強を行いました

 https://youtu.be/gJiHFc--g1w?si=VBKH0dTkZK1R17U2

 https://youtu.be/P4V8TtBaNNw?si=x5PvRG-Y6MfWTJ8K

 
 # 備忘録
 - Translateは指示された場所にPositionを動かすという命令
 - Vector3.forwardはz方向に物体を移動させる
 - Vector3.forward*0.1fの0.1fはスピードが0.1倍になります
 - puclicにしたら変数名がInspectorに表示される
 - privateの場合はInspectorに表示されない
 - privateとpublicを書かない場合はprivate扱いになる


# 最後に
　勉強した内容を備忘録にしました。

 

ここまで記事を読んでいただきありがとうございました！

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteもやっています．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!
Cookieとは

## はじめに
Cookie（クッキー）は、WebブラウザとWebサーバー間でやり取りされる小さなデータの断片のようなものです。
主にユーザーのセッション情報やサイト設定を保存したり、より便利で個別化されたWeb体験を提供するために使用されます。
本記事では、Cookieの基本から種類、実践的な使用方法、ベストプラクティスまでを調べてみたのでまとめてみます。

## Cookieの用途

Cookieは、Webサーバーがユーザーのブラウザに送信し、保存される情報です。その後、ブラウザは同じサーバーにリクエストを送る際、Cookieを一緒に送信します。この仕組みにより、サーバーはユーザーを識別したり、前回のセッションを引き継いだりすることが可能になります。

主な用途
- セッション管理：ログイン状態やショッピングカートの内容を保持
- 個別化：ユーザーの設定や言語選択を保存
- トラッキング：ユーザーの行動を追跡して分析

## Cookieの種類

Cookieにはいくつかの種類があり、それぞれ用途や挙動が異なります。
### ファーストパーティCookieとサードパーティCookie
ファーストパーティCookie：訪問しているWebサイトによって設定されるCookie
サードパーティCookie：埋め込まれた広告や外部サービスによって設定されるCookie

### セッションCookieと永続Cookie
セッションCookie：ブラウザを閉じると削除される一時的なCookie
永続Cookie：有効期限が設定され、ブラウザを閉じても保持されるCookie

## セキュリティ関連の属性
Secure属性：HTTPS接続でのみ送信されるCookie
HttpOnly属性：JavaScriptからアクセスできないようにする属性
SameSite属性：クロスサイトリクエストを制限するための属性

## Cookieのメリットと課題
### メリット
ユーザーエクスペリエンスの向上：ログイン状態や設定の保持。
### 効率的なセッション管理：サーバーリソースの節約。

### 課題
プライバシーの懸念：トラッキングによるデータ収集。
規制対応の必要性：GDPRやCCPAなどの法規制。

## Cookieのベストプラクティス
前述のセキュリティ関連の属性については下記のように設定するのが望ましいです
Secure属性：HTTPSのみでCookieを送信するようにする
HttpOnly属性：JavaScriptからのアクセスを制限する
SameSite属性：Webサイト内のリンクを踏んで別のサイトに移動する際に、遷移先のサイトのCookieを送信しないように指定します。クロスサイト攻撃を防止のため

また、必要最小限のデータのみを使用するために有効期限を短く設定するなども有効です。

## まとめ
読んでいただきありがとうございました！
属性周りのことは今回調べてみて初めて知れたのでまとめてみて良かったです。

## 参考記事
https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies

https://www.engilaboo.com/cookie-attribute-summary/#rtoc-9
Next.js14 App Routerでi18nをしようとしているのならnext-intlのほうがよさそう

## 結論

設計思想にこだわりがないのならApp Router + SSR のi18n対応は[next-intl](https://github.com/amannn/next-intl) が楽だと思います。
`zod` を使ってバリデーションもi18n対応したい場合は `next-i18next` のほうが親和性は高いですが、工夫次第で `next-intl` でも問題なし。（将来的には next-intl も zod-i18n に対応するでしょう）

---

Next.jsでi18nするぞーとなってググったとき、最初に見つかったのが `next-i18next` でした。このときは `next-intl` の存在すら知らず`react-i18next` と何が違うかわからんけどnextだしいっか、と使い始め、結果良くできてたライブラリで安心してました。

ここまではいいんです。問題はApp Routerです。

## App Router with SSR

next-i18next自体はSSRでのレンダリングに対応しているらしいのですが、素人TypeScriptエンジニアである私からすると、設定方法がよくわからず大変そうだなという印象でした。（そもそもSSRとCSR/SSGの根本の違いを理解していない前提もあり）

結果的にプロエンジニアの力を借りて実装そのものはできたのですが、自分が理解するまでに骨が折れそうだなと今は思っています。

そして実際骨が折れつつもこの課題について素晴らしくまとめてある記事もあります。

https://zenn.dev/k0kishima/articles/956ba3f3dc9629

https://zenn.dev/takumiyoshikawa/articles/3adb0e18fdcdec

## 代替手段 next-intl

これからi18n対応するという前提で、もう少し楽にi18nする方法はないのかなと改めて検索すると、以下のWebサイトが引っかかりました。

https://i18nexus.com/tutorials/nextjs/react-i18next

先程のZennの記事と似てるのですが、こちらは多言語ファイルをWebで管理できる i18nexus というツールのチュートリアル記事のようでした。
ここに見覚えのない単語があります。

それが　__「next-intl」__　Who Are You?

Githubのスター数は現時点（2024/12)で3Kほど `next-i18next` のほうが上ですが、Googleトレンドではすでに `next-intl` のほうが上です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/42765a02-9e79-4a44-00ea-5d58ab9ded66.png)

おそらく導入時、SSG/SSRによって実装手順に大きな違いがないという容易性がウケてるんだと思います。（少なくとも私は簡単だなと感じました）
これはi18nexusのチュートリアルをみても自明だと思います。

SSRでさえ以下のように宣言するだけで、SSGと同じように非同期翻訳が使えます。

```typescript
const t = await getTranslations("Week");
```

参考：

https://phrase.com/blog/posts/next-js-app-router-localization-next-intl/


## Zodのバリデーションとi18n対応

別の観点としてよく使うユースケースだと思われる `Zod` のバリデーションを多言語化するという例で `next-i18next` と `next-intl` を比較してみます。

Zodのi18nは以下で対応されています。

https://github.com/aiji42/zod-i18n

exampleにあるように、 `next-i18next` での使い方は以下のような感じです。

```typescript
const { t } = useTranslation();
z.setErrorMap(makeZodI18nMap({ t }));
```

が、これをそのままApp Routerで使うことはできません。先述どおりSSR用の `useTranslation` を自分で実装・定義する必要があります。

 `next-intl` はどうでしょうか。
 こちらは標準で `zod-i18n` には対応していないため、以下のブログのように組み込み方を少し工夫する必要があります。

https://www.gcasc.io/blog/next-intl-zod

どちらも一長一短ありますが、個人的には `next-intl` だと 項目名のi18nも簡単そうにみえますね。
例えば入力欄ではなく、画面上部にエラーメッセージをまとめて表示するというユースケースのとき、「username は必須です」と出力されるよりも「ユーザー名は必須です」と出てほしいっていうやつです。 ここでの `username` は以下のようなZodのスキーマを前提としたときのキー名です。

```typescript
const schema = z.object({
  username: z.string().min(3),
  age: z.number().min(18),
});
```

## まとめ

Next.jsでのi18n対応に1つ選択肢が増えたので、プロダクトの方向性やエンジニアチームの趣味趣向、アーキテクチャの具合や今後を踏まえてどちらかを選択すると良いかと思います。
色々面倒なことを省き、これからのエコシステムの発展に期待するという側面では、 `next-intl` が有利かなと個人的には思います。
開発者代表として商談に参加させていただいたら上流工程を学べて要件定義について詳しくなった話

:::note warn
こちらは個人の備忘録です。こちらの情報は過信せずに一興として一読いただけたらと思います。
間違った記述があれば都度ご連絡ください。
:::

お疲れ様です。steveです。
前回、前々回とGptに関するAPIに触れてきましたが、今回は趣向を変えて、エンジニアとしての技術の前段階、**クライアントからの要求は何で、目的を果たすにはどうするべきか**についてエンジニアとしてやや上流工程的な知見が身についたと思います！

今回はこの経験を共有したいと思います。

##
**・ことの経緯**
インターン先での前段階タスクが終了して、一息ついたところPMからやや馴染みのないお誘いをいただきました。

「商談で使うデモを作成してほしい、ただ使用する技術スタック等は任せるし、必要な機能ももしあったら提案してほしい」

？？？
正直なところ最初は意味を理解するのにも時間がかかったですし、技術選定の知識なんてないしどうしよう・・・と思っていました。

ただ、デプロイはいらないし、クライアントの要求が実現可能であるということを示れば良いということで、簡単に実装ができるGASとお馴染みのGPTのAPIでいけるかと安心しました。

ただ、ここ数日のgptモデルの進化は著しいためocrのクオリティを考えたらgemini2.0とかを使うのも選択肢に持つべきだったと反省しています。
簡単な案件の概要です
2種類のフォーマットが決まったpdfをpng形式に変換し読み込み、ocrし内容を抽出、
（pngはロスレス圧縮をするので高画質が保たれocrさせる際に最適かなと思ったためです。）
内容の矛盾がないかチェック（gpt api）し自動でスプレッドシートに記載させる
内容自体そこまで難しくはなかったのですが、gptへの不勉強さ、初めての（やや）上流工程ゆえに緊張していました笑

結局作成に使ったスタックはこんな感じです
・GAS
・chatGPT-4o-latest
・pdf変換API
・スプレッドシート

##
**いざ商談**


やはり商談であるため、100%クライアント様の意向にそったデモが求められるなと思いました。
高性能であればいいわけではない。大切なのは、クライアント様の要求と質問に答えることです

ここまでインターンに参加するために数多の面接に挑んだ経験があったため、不思議と初めてのような緊張感はあありませんでした。

**エンジニアとして大事な能力の一つに「非技術者に解説する能力」がある**とも実感いたしました。
今回幸いgptという馴染み深い技術を使ったため説明は容易でしたが、やはりヒューショットプロンプトとか、難しい言葉を使わずに流れを解説するのは難しかったです。

２社のインターンを経験していて常々感じることですが、技術力が大切であることはもちろん、それ以上に**コミュニケーション能力**が大切であるとも感じました。

相手の言ったことを過不足なく受け取る能力、自分の意思を理路整然と伝える能力、インターンを経験していく中で成長を感じる領域ではありつつも、自分自身まだまだであると感じる領域でもあります。

:::note info
普段生活していく中で、面接対策にもなると思ってインターン中のコミュニケーションで**責任ある立場で大人と**理路整然としたコミュニケーションをとることを心がけるのもいいかもしれませんね
:::
TypeScript、短絡評価(&&,||,??)について

# はじめに
こんにちは！エンジニア志望の学生です。今日はTypeScriptにおける短絡評価について、「生成Aiが出してくれるけど詳しく理解してないから使えない」という状況から脱出するために、まとめたいと思います。


# 短絡評価とは
- 論理演算子を用いて、特定の条件下のみでの動作を指定する処理
- `&&`、`||`、`??`といった論理演算子が使用可能であり、それぞれで動作が違う
- JSXへの応用により、条件に応じたレンダリングの変更が可能

# 論理AND演算子 `&&`
- `&&`**について、左辺がfalseの場合、右辺が評価されない**という特性を利用する
- 左辺が`false`や`0`、`""`等のfalsyな値の場合はそのままfalsyな値を返し、それ以外の場合は右辺の値を返す
- 左辺がフラグ、右辺が処理になることが多い
```typescript
const result = flag && "Hello, world!";

console.log(result);
//=>false //flag=false
//=>"Hello,World!" //flag = false
```
```tsx
//JSXとの組み合わせも可能
const message = isLoading && <h1>読み込み中です</h1>
//=>isLadingがTrueであれば、「読み込み中です」の文字を表示
```

# 論理OR演算子 `||`
- `||`**について、左辺がtrueの場合、右辺が評価されない** という特性を利用する
- 左辺が`true`や文字列、値等のtruthyな値の場合はそのままtruthyな値を返し、それ以外の場合は右辺の値を返す
- AND演算子の逆
```typescript
const result = flag || "Hello, world!";

console.log(result);
//"Hello, world!"//flag = false
//=> true // flag = true
```
```tsx
//JSXとの組み合わせも可能
const message = isEnd || <h1>まだ終わっていません</h1>
//=>isLadingがTrueであれば、「読み込み中です」の文字を表示
```

# null合体演算子　`??`
- ほとんど論理OR演算子
- 左辺がnullまたはundefinedの時に右辺を返す
- falseや0等のその他のfalsyな値については、そのまま、そのfalsyな値を返す
- プロパティの有無のチェック等に使う
```typescript
const result = flag ?? "Hello world!";

console.log(result)
//=>Hello World! //flag = null/undefind
//=>true //flag = true
//=>false //flag = false
```

# まとめ
以上になります。

うやむやに中途半端な理解で済ませていた部分をちゃんとできてよかったです。

# 参考
https://typescriptbook.jp/reference/jsx#%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1

https://gizanbeak.com/post/typescript-short-circuit
MySQL5.6でもJSONしたい

# はじめに
先日、たまたましまい込んでいたMySQL5.6のDBを使う機会があったので、備忘録のメモです。
5.6ではJSON型はサポートされていませんでしたが、アプリの都合でテキストでJSONを保存していたものがありました。
これに対して、アドホックにSQLで検索したのでせっかくなので残しておきます。

# MySQLとJSON
MySQL5.7からJSON型がサポートされましたが、5.6ではJSON型はサポートされていません。
しかし、ただのテキストとしてJSONを保存することは可能です。
例えば以下のようなテーブルを考えます。

meta_dataテーブル

| id | meta_json                                       |
|----|-------------------------------------------------|
| 1  | {"lang": "ja", "timezone": 9, "type": "normal"} |
| 2  | {"lang": "en", "timezone": -5, "use": 2}        |

## MySQL5.7の場合
このように、JSONをテキストとして保存している場合、MySQL5.7 以降であればJSON関数を使って検索することができます。
MySQL5.7以降であれば、以下のようなクエリでtextで保存されていてもJSON型にキャストすることでtimezoneを簡単に抽出することができます。

```sql
SELECT json_extract(CAST(meta_json AS JSON), '$.timezone') FROM meta_data;
```

## MySQL5.6の場合
しかし、MySQL5.6ではJSON型がサポートされていないので、JSON関数を使うことができません。
そのため、JSONをテキストとして保存している場合、JSONの中身を抽出するには、正規表現を使う必要があります。

```sql
SELECT
  REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(meta_json, '"lang":', -1), '}', 1), '"', '') AS lang,
  SUBSTRING_INDEX(SUBSTRING_INDEX(meta_json, '"timezone":', -1), '}', 1) AS timezone
FROM  meta_data;
```
JSONのValueが数値であれば、そのまま数値として取り出すことができますが、文字列であれば、`"`で囲まれているので、`"`を取り除く処理が必要です。
また、JSONの末尾の項目の場合、`,`がないので、`SUBSTRING_INDEX`で取り出す際には注意が必要です。
末尾のものの場合は以下のようにする必要があります

```sql
SELECT
  REPLACE(REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(meta_json, '"type":', -1), ',', 1), '"', ''), '}','') AS type
FROM  meta_data
WHERE meta_json LIKE '%"type":%';
```

# おわりに
以上、MySQL5.6でテキスト保存したJSONの中から手する方法についてのメモでした。

5.7ですら昨年には延長サポートも切れているので、今後ほとんど使う機会がないとは思いますが備忘録でした。

あくまでこの例は１階層しか無いJSONの場合の例でしたが、 いつかもし私のようにどうしても必要になった人の助けになれば幸いです。
Satisfiability Problem(SAT)について

# SATとは
**SAT**(Satisfiability Problem)は
**ブール関数(f)がtrueと評価されるようにfの変数の割り当てを決定,
またはそのような割り当てが存在しないことを証明**すること.
(発展的な話題として**P,NP問題**につながる)

n変数の論理式で,f=1となる組み合わせがあるかどうかは真理値表を書くことで確認可能

ただし,その計算時間は$O(2^n)$となり,多項式時間では解けない.
(1変数に対して1or0の可能性があるため）

一方で，論理式$x_1, x_2, ..., x_n$に0か1を代入して,fが1か0となるかを確認することはすぐにできる.

このようにSATで考えることで**計算時間が(すべての場合を考えるときに比べて)非常に短くなるという利点**がある.

多くの問題はSAT問題に変換することができるので,コンピュータが普通に解く分には難しい問題をSAT問題として扱うことで,効率よく解くことができるのではないかと考えるケースが多い.

# 定義
真偽値をとる論理変数$x_1, x_2, ...$および論理演算しで論理式を構成

### 論理否定
論理否定($\bar{x}$)...$x_1$が真ならば偽.偽ならば真

| $x_1$ | $\bar{x_1}$ |
|----|----|
|  0 |  1 |  
|  1 |  0 |  


### 論理和
論理和($x_1∨x_2$)

| $x_1$ | $\bar{x_1}$ | $x_1 ∨ \bar{x_1}$ |
|----|----|---------|
|  0 |  0 |    0    |
|  0 |  1 |    1    |
|  1 |  0 |    1    |
|  1 |  1 |    1    |


### 論理積
論理積($x_1∧x_2$)

| $x_1$ | $x_2$ | $x_1 ∧ x_2$ |
|----|----|---------|
|  0 |  0 |    0    |
|  0 |  1 |    0    |
|  1 |  0 |    0    |
|  1 |  1 |    1    |

### リテラル
リテラル...論理変数($x_1$)またはその否定($\bar{x_1}$)のこと


### 節
節...リテラルの論理和のこと
# 問題の例
$f = (x_1 ∨ x_2 ∨ \bar{x_3}) ∧ (\bar{x_1} ∨x_3) ∧ (\bar{x_2} ∨ x_3)$に対して$f$が真となるような$x_1, x_2, x_3$の真偽値の組み合わせは存在するか?


### 存在する例
$x_1 = 1, x_2 = 1, x_3 = 1$の場合満たされる

#### 理由
第一節$(x_1 ∨ x_2 ∨ \bar{x_3})$,第二節$(\bar{x_1} ∨x_3)$,第三節$(\bar{x_2} ∨ x_3)$に注目する

第一節について,これは$1∨ 1∨ 0$となるので第一節は真

第二節について,これは$0 ∨ 1$となるので第二節は真

第三節について,これは$0∨ 1$となるので第三節は真

したがって,$f = 1 ∧ 1 ∧ 1$となるので,$f$は真となり,その時の変数割り当ては
$x_1 = 1, x_2 = 1, x_3 = 1$となる.

### 真とならない例
$x_1 = 1, x_2 = 0, x_3 = 0$の場合満たされない

#### 理由
第一節,第二節,第三節に注目する

第一節について,これは$1∨ 0∨ 1$となるので第一節は真

第二節について,これは$0 ∨ 0$となるので第二節は偽

第三節について,これは$1∨ 0$となるので第三節は真

したがって,$f = 1 ∧ 0 ∧ 1$となるので,$f$は偽となる.

# SATソルバー
SAT問題を解くとなったとき,
**SATソルバー**と呼ばれるSAT問題を効率的に解くためのツールがある.

数百万の変数の組み合わせにも対応しているようなSATソルバーもあり,その目的は

**1.式が満たされるか(解が存在するか)を判定すること**
**2.解が存在する場合は,その変数割り当てを返すこと**
となる.


# SAT制約
SATソルバーを通じてSAT問題を解くとき,**SAT制約**を考えて解くことになる.

SAT制約は,論理式の形で表現され,これを考えることで
考えるべき変数の組み合わせを減らすことができる.

### SAT制約の例
#### 例:グラフの彩色問題
「隣接する2つの頂点が同じ色にならないように3色で彩色する」問題の場合

- 頂点を$V_1, V_2, ... $として,各頂点が赤、青、緑のいずれかになる制約
    - $V_1$が赤なら$x_{1, red} = 1$, 青なら$x_{1,blue} = 1$(変数の定義)
    - 制約例:頂点$V_1$は一つの色しか持たない(以下の論理式で表現可能)
($x_{1, red} ∨ x_{1, blue} ∨ x_{1,green}$)∧($\bar{x_{1,red}} ∨ \bar{x_{1, blue}}$)
        - 前半について:真ならば頂点$V_1$がいずれかの色に彩色されていることを表す
        - 後半について:真ならば赤と青を同時に持っていないことを表す
        - そのほかに青と緑,赤と緑を同時の持たないことを表す論理式を追加することで
頂点$V_1$について,一つの色しか持たないことを表せる
    - 制約例:$V_1, V_2$が同じ色にならない制約(隣接頂点間の制約)
    ($\bar{x_{1,red}}∨ \bar{x_{2,red}}$) ∧ ($\bar{x_{1,blue}}∨ \bar{x_{2,blue}}$)  ∧($\bar{x_{1,green}}∨ \bar{x_{2,green}}$)
        - 論理式について:偽ならば頂点$V_1, V_2$で同じ色を持っていることになる

→頂点$V_1, V_2$についての論理式しか例として挙げていないが,**考えられる全ての頂点,頂点の組み合わせに対して制約**は考える必要がある.

こうした制約をSATソルバーに入力することで解が存在するか否かが判別可能

# 最後に
SATについて簡単にまとめてみた.

次回は数独に対して,SATソルバーを実際に使ってみようと思う.
マナビDXコンペの続き ~Signate,Kaggle~

マナビDXクエストお疲れ様でした！
この記事ではマナビDXクエストでよく話題になっている機械学習コンペプラットフォームの **「Signate」** と **「Kaggle」** をご紹介します！

マナビDXのAI課題で機械学習モデリングに興味を持った人はぜひ取り組んでください！

---

## 🗾 **Signateとは？**  

Signate（シグネイト）は **日本発のAI・データサイエンスコンペティションプラットフォーム** です。  

### **特徴**  
- **日本語対応**：日本語で問題設定が書かれているため取り組みやすい。 共有コードなども日本語です。 

- [Signate コンペ一覧](https://signate.jp/competitions)

---


## 🧩 **Kaggleとは？**  

Kaggle（カグル）は、Googleが提供する **世界最大のデータサイエンスコンペティションプラットフォーム** です。  

### **特徴**  
- **世界中のデータサイエンティスト** と競い合い、学び合える。  
- ノートブック機能（Kernels）が充実し、他の参加者のコードを参考にできる。  
- **幅広い課題**：画像処理、テキスト分析、数値予測、時系列予測 など。  

Kaggleについては、スタートダッシュについて多くの方が解説しているので、その記事を紹介させていただきます。

カレーちゃんさんの書かれているnoteで、こちらを参考にすると提出まで出来るかと思います。

https://note.com/currypurin/n/na821f2ee4948


---


## 🔍 **KaggleとSignateの比較**

| 項目              | Kaggle                           | Signate                     |
|-------------------|---------------------------------|-----------------------------|
| **対象者**        | 世界中のデータサイエンティスト     | 主に日本語圏のユーザー      |
| **言語**          | 英語中心                        | 日本語中心                 |
| **共有リソース**  | NotebookやDiscussionが豊富        | 解法共有は少なめ            |


---

## 🚀 **なぜ挑戦するべきか？**  

マナビDXで学んだ知識やスキルを次のレベルに引き上げるためには、 **実践の場** が重要です。
成長するための最良な機会を得ることが出来ると思います。

また下記でも役立ちます。
1. **スキルの確認**：学んだ知識を使い、現実の課題に取り組める。  
2. **学びの加速**：他の参加者のコードや解法から新たな発見が得られる。  
3. **実務力の向上**：企業が抱えるリアルな問題に触れ、解決力が高まる。  
4. **キャリアに有利**：実績をポートフォリオや履歴書に活かせる。


どちらのプラットフォームでも、良い成績を取ると称号と呼ばれるものが手に入ります。
私はKaggleの方で銀メダルと銅メダルを1枚ずつ持っていますが、取得してから企業のイベントの招待などをいただくようになりました。

---

## 💬 **まとめ：継続が成長のカギ**  

データサイエンスの道は「挑戦と学び」の繰り返しです。  
マナビDXで学んだスキルをKaggleやSignateで実践し、**継続してスキルを磨きましょう！**  

データサイエンスの実力を試し、さらに成長するための第一歩を踏み出してください 🚀  

---

## **参考リンク**  
- [Kaggle公式サイト](https://www.kaggle.com/)  
- [Signate公式サイト](https://signate.jp/)
React Props学んでみた【初心者】

<h1>Propsとは

Propsは**コンポーネント間でデータの受け渡しを行うもの**である。
親コンポーネント(大元のページ)から子コンポーネントへデータを渡すことができる。

<h1>書き方

<h3>子コンポーネント側</h3>

```js:ChildComponent.js

function ChildComponent (props) 
```

まずはこのように**関数宣言**の部分のカッコの部分に`props`と記述します。

```jsx:ChildComponent.js
{props.関数名}
```
次に、入力したい部分を以上のように記述する。(関数名は親コンポーネント側で決める)

<h3>親コンポーネント側</h3>

```jsx:ParentComponent.js
<ChildComponent 関数名="渡したいデータ"/>
```
子コンポーネントを呼び出す部分をこのように記述することで、子コンポーネントにデータを送ることができる。

<h1>例
<h3>親コンポーネント</h3>

```jsx:page.js
import Image from "next/image";
import Footer from "./components/Footer";
import Links from "./components/Links";
import Headline from "./components/Headline";

export default function Home() {
  return (
    <div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
      <main className="flex flex-col gap-8 row-start-2 items-center sm:items-start">
        <Image
          className="dark:invert"
          src="/next.svg"
          alt="Next.js logo"
          width={180}
          height={38}
          priority
        />
        <Headline page="index"/>
      <Links />
      </main>
      <Footer />
    </div>
  );
}
```

<h3>子コンポーネント</h3>

```jsx:Headline.js
import Image from "next/image";
import React from "react";

function Headline(props) {
  return (
    <div>
      <h1>{props.page} Page</h1>
        <ol className="list-inside list-decimal text-sm text-center sm:text-left font-[family-name:var(--font-geist-mono)]">
          <li className="mb-2">
            Get started by editing{" "}
            <code className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-semibold">
              src/app/{props.page}.js
            </code>
            .
          </li>
          <li>Save and see your changes instantly.</li>
        </ol>
    </div>
  );
}

export default Headline
```

ここでは関数名を`page`としている。
ここには乗せてないが、aboutページにはaboutというデータを渡し、indexページとの差別化をしている。
【メモ】formのメソッドと$requsetの記述方法

＜きっかけ＞
Laravelで検索機能実装中、$requestの値を取得する記述方法に関して、気になった。


＜内容＞
例えば、nameの情報を取得したいとき

①$request->input('name');
②$request['name'];

と、二通りの記述方法があることを知った。


＜調べた結果＞
どうやら
①$request->input('name');は
formのget、postの両方のメソッドに対応した記述方法である。
また
$request->input('name', 'Tanaka');と
第二引数にデフォルト値を設定できるようだ。

②$request['name'];という記述は、postメソッドにしか対応しておらず、第二引数も設定できない。
記述のしやすさはあるが…。

＜結論＞
汎用性の高い
①$request->input('name')
の形での記述が推奨されるようだ。

ーーーーーーーーーーーーーーーーーーーーーーーーー
がちがちの初心者プログラマー、もんです。
ほぼ独学で進めるなかのメモ程度の投稿なので
アドバイス・ご指摘・追加の疑問などコメントいただけると
大変ありがたいです。
Pythonを基礎から学ぶその１　Pythonの特徴

追記(2024/12/14)
一部の写真の;はなくても動くそうです。
この記事は、[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の13日目の記事です。去年それなりに学習したので、今年はまだ勉強していない部分も学習していきます。

Pythonもやります
# Python
AIや画像処理などができます。ライブラリが豊富な言語です。自分は大学の講義で使いました。Googleだと、Pythonが使えるサイトとして[Google Colab](https://colab.research.google.com/?hl=ja)があります。Pythonの中にも、「Python2」と「Python3」の二種類存在しているようですが、2のほうはサポートが終了しているようなので今回はPython3について学習していこうと思います。
## Hello Worldから学ぶ言語の特徴
早速ですが、
```py
print('Hello World')
```
たったこれだけです。Javaの時はclassとかvoidとかいろいろ必要なことを書いていましたが、Pythonではそんなもの必要ないみたいです。
# 配列
### リスト(list)
listです。配列を調べたところ、リストは配列の一種となっていました。おそらくPythonでは、リストと配列が大体同じものとして扱われているのでしょう。
##### 配列の使い方
```py
A=[1,3,4,5,6]
```
ほかの言語と違うのは、最初にint[]などと書かなくてもよい点です。ちなみにintとかStringとかを指定しないので、
```py
A=["a",3,4,5,6]
```
こんなことができてしまいます。Stringとintをひとつの配列に一緒に入れることができるみたいです。
```py
A[1]=10
print(A[1]+A[3])
```
もちろんほかの言語同様に足し算をしたり要素の変更もできました。
## タプル(tuple)
Pythonで初めて見ました。先ほどのリストは要素を[]で囲っていたのに対してこちらは()で囲むようです。また、生成した後の要素の変更(追加、削除)ができないといった特徴があるようです。
```py
A=(0,1,2,3,4,54,6)
```
このようになります。要素の変更ができない以外はリストと同じです。
要素を変更しようとすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/c857eaad-6e30-27e4-4399-2aff4175f1a2.png)
こんな感じでエラーが出ます。変更は無理です。
## 辞書(dict)
辞書のように、要素と情報をセットにしておくことができるやつです。Python限定？かと思われます
```py
A={"1":"数字","a":"小文字","A":"大文字"}
```
こんな感じで書いてみました。:の左側に名前、右側にその説明を付けています。今回はたまたますべて文字列になってしまいましたが、もちろん数字を入れておくこともできるようです。この機能では、中の要素が存在するか検索したり:の片方に対応する説明（：のもう片方の情報）を確認することができるなど、確かに辞書っぽい性能をしていました。
要素があるか確認する方法⇩
```py
print("a" in A.keys())
```
結果:True
"a"が存在しているかどうかを確認しています。今回は入っているのでtrueが返ってきます。
片方の情報に対応するもう片方の説明⇩
```py
print(A["A"])
```
結果:大文字
まるで辞書を引いているかのように、対応する情報を返してくれます。[]の中に、調べたい情報を入力するだけです。
全体を出力する場合は想像の通りprint(A)とするだけなので説明は省略します。
# 復習
去年ざっくり学習した範囲をもう少し詳しく学習します。
## for
```py
A=[1,2,3,4,6]
for B in A:
    print(B)
```
AをBとしてBを出力するfor文では、Aの内容が一行ごとに出力されていきます。ほかの言語とは違いforの行の最後、処理の前で;の代わりに:が使われます。
```py
A={"1":"数字","a":"小文字","A":"大文字"}
for B in A:
  print(B,A[B])
```
forを使うことで、先ほどの辞書の中身を一行ずつ出すことができます。
## 条件分岐
```py
A=100

if A==100:
  print (A)
```
結果:100
見ての通りです。forの時そうでしたが、条件分岐のifも条件に()が使われていません。Pythonでは()で囲まなくてもよいそうです。ただし、()で囲んだとしてもちゃんと処理が行われました。
# Pythonでできなかったこと
### //でコメントアウト

できませんでした。Pythonではコメントアウトする際に#を使用するようです。また、複数行をまとめてコメントアウトする際には'''か"""を使うようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/8c450b3e-7197-d727-1e8c-97996f664430.png)
Google colabの場合はなんか出ちゃってますが、
![13Py-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/f856b75e-29d2-ca3e-63cc-bb62ed726439.png)

通常はこんな感じで無視されています。
# まとめ
Pythonの配列は3種類存在しており、それぞれリスト、タプル、辞書と呼ばれている。Pythonではコメントアウトする際に#を用いている。forやifでは条件を()で囲まなくてもよい。
# 参考文献

https://www.acrovision.jp/career/?p=3146

https://techplay.jp/column/1703

https://web-camp.io/magazine/archives/15340/

https://staff.persol-xtech.co.jp/hatalabo/it_engineer/677.html

https://techplay.jp/column/462

https://web-camp.io/magazine/archives/15340/
PythonのTkinterで動画視聴管理アプリを作成


PythonのTkinterの学習のアウトプットとして、動画視聴管理アプリを作成しました。このプロジェクトでは、Windowsインストーラを初めて作成し、GitHubに公開しています。GitHub Actionsも活用しており、簡単なunittestを実施しました。
---
## GitHub
[video_learning_management](https://github.com/Argorn5940/video_learning_management)


---

## 作成の目的

YouTubeやUdemyでの学習記録をまとめたいと考えたためです。

---

## 主な機能

- 入力・登録フォーム
- Excelデータベースへの保存機能
- SQLite保存機能

---

## 使用したツール

- **innoSetup**（Windowsインストーラ作成用）

Python環境があれば、データベースはExcelだけでなく、SQLiteも使用可能です。

---

## 使用ツールの補足: DB Browser for SQLite
[DB Browser for SQLite](https://sqlitebrowser.org/)
SQLite用のGUIツール「DB Browser for SQLite」を活用することで、SQL操作に慣れていない方でも簡単にデータベースを操作できます。

---

## 学習したこと

- フォーム作成
- Excelへの登録機能実装
- SQLiteへのデータ保存機能実装
- アイコン作成
- 実行ファイル作成
- innoSetupを使ったWindowsインストーラの作成

---

## アイコン作成

プロジェクトフォルダ内に「ICON」フォルダを作成し、アプリ用のアイコンを作成して保存しました。

---

## 実行ファイル作成

`pyinstaller`を使用して実行ファイルを作成しました。

---

## インストーラ作成

- **使用ツール:** innoSetup  
  当初は`cx_Freeze`を試しましたが、Pythonの依存関係の問題でエラーが発生したため、最終的にinnoSetupを採用しました。innoSetupは依存関係をうまく処理してくれるため便利でしたが、設定には試行錯誤が必要でした。

---

## テスト

- 簡単なunittestを作成
- GitHub Actions用のYAMLファイルを作成
- Windowsインストーラを使用し、アプリをインストールして動作確認

---

## 苦労した点

1. **Pythonの依存関係:**  
   依存関係のエラーで何度も実行ファイルを作成し直す必要がありました。
2. **innoSetupの設定:**  
   初期設定ではエラーが発生し、フォルダ構成やスクリプトの記述を追加する必要がありました。

---

## 今後の課題

1. 開発フローを覚え、機能を充実させていく。
2. **テスト:** 
   - Pytestを活用して厳密なテストを行う。
3. **インストーラ:** 
   - 他のツール（例: cx_Freeze）にも挑戦する。

---

このプロジェクトを通して、コード作成からテスト、実行ファイル・インストーラ作成、GitHub Actionsまでの一連の流れを学習できました。引き続きスキルアップを目指していきます。
エンジニアになってから初めて転職します

## はじめに
エンジニアになって3年半が経ち、エンジニアとして初めて転職することになりました。
今回は[転職ドラフト](https://job-draft.jp/)を利用したので、今後同サービスを利用して転職される方の参考になればと思い、こちらの記事を残そうと思います。

去年の10月に同期が転職ドラフトを利用して転職していて、いいサービスなんだろうなと話を聞いて思っていたので、今回自分も利用させてもらいました。
個人的にはすごく満足しています。

[※ こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています](https://job-draft.jp/articles/251)

## 転職活動時の開発経験やそれまでの経歴
エンジニア歴でいうと、3年半、Sler企業にて幅広い案件に携わってきました。
転職ドラフトに参加した際のスキルは以下です。
- 経験技術
  - バックエンド
    - Java,Spring (2年)
    - PHP,Laravel（1年半）
  - フロントエンド
    - Typescript,Next.js（1年半）

- 経験業務
  - 要件定義、基本設計、詳細設計~テスト、リリース
  - PL(2000万規模のプロジェクト、メンバー6名)
  - 設計レビューやコードレビューなどのレビュー業務



## 転職ドラフトに参加する前の準備について
転職ドラフトはレジュメ審査に通過しないとドラフトに参加できないので、かなりみっちり書きました。
プロジェクトの内容は以下の構成で記載して、5プロジェクト + マネジメント能力などで総計10000万字ぐらいは書いたと思います。

- プロジェクト概要
- 担当内容
- 使用技術
- 課題と取り込み
- その他工夫したこと

レジュメを完成させるのに、2週間~3週間ぐらいはかかったと思います。
今までのプロジェクトを振り返らないといけないので、プロジェクトが終わる度に詳細を書き残しておけば楽だったなと思います。

レジュメはそれなりに記載したため、無事1発で審査を通過することができました。

## 転職ドラフトに参加してみた結果
転職ドラフトには2回参加しました。
参加した結果、
- 1回目：18件
- 2回目：7件

で計25件のオファーをいただくことができました。

今までの経歴ややってきたことを見て価値を測っていただきたいと思っていたので、希望年収はあえて記載しませんでした。
その結果、最高750万、平均で632万の年収提示を受けることができました。

## 指名していただいた後
指名いただいた後は、企業側の提示面談タイプによって「カジュアル面談」や「一次選考」に進むことができます。

面談・面接の希望提出後は、日程調整を行うのですが、
転職ドラフトの日程調整機能がすごく便利で、毎回メッセージで日時を打つ必要がなく、他の企業に提案中の日時がすぐ見てわかったりするので、ダブルブッキング等なく快適に日程調整をすることができます。

面接以降は普通の選考になるので、「オファー=ほぼ内定」ではありません。

## 選考結果
25件のオファーを受けて、全て面談に進むのは大変だろうなと思い、かなり厳選して選考を進めました。

カジュアル面談：9社
一次面接：6社
最終面接：2社
内定：2社

という結果になり、2社内定いただいたうちの1社に転職を決めました。
また、4社落ちてしまった敗因は単純なスキル不足もあったと思いますが、
だいたい以下の理由で落ちたんだろうなと予想してます。

- スキルの言語化不足
- 企業が求める人物像とミスマッチなキャリアプランを話してしまった
- カルチャーのミスマッチ

転職ドラフトでの転職は、最近はレベルが高くなって難しいと外部情報で聞いてたんですが、なんとか2社内定をいただくことができて良かったです。


## 転職ドラフトを利用した感想
レジュメを詳細に記載したり、審査が必要だったり、実際にドラフトに参加してオファーを待ったり、内定を獲得するまでにそれなりに時間がかかりますが、自分の知らない企業や「こんな企業からもオファーもらえるんだ」っていう驚きがあったりするので、総じていいサービスだなと感じました。

転職ドラフトを利用して良かった点は以下です。
- 自分の市場価値を把握できる
- レジュメを書く際にキャリアの棚卸しができ、面接で話す内容もある程度準備できる
- 提示年収を上げる以外の理由で現年収を聞くのはルール違反になるので、現年収をベースに年収提示されない
- 指名時提示年収の90%未満で内定を出すことができないので、提示年収はあまり下がらない
<br>
その他、オファーを受けて面談に進む前に確認したほうがいいなと思ったことも書き残しておこうと思います。

- 社員数に対して過剰なオファー数を送っていないか
- 企業側がレジュメをちゃんと読んでオファーしてくれているか

企業によって多様な採用術があると思うのですが、個人的に上記2つのような場合は、結局選考に進んでもミスマッチにつながって不採用になる可能性が高いんじゃないかと思いました。
レジュメを読み込んでオファー文を送ってくださる企業の方が、こちらが実現したい事や今までの経歴をある程度理解した上でオファーをしてくれているので、マッチしやすい気がしました。


## さいごに
転職ドラフトを利用した体験談を記事にしてみました。
今の自分の市場価値を測り、年収を大きく上げられる可能性があるサービスなので、エンジニアが1度は利用するべきサービスだと思います。

気になる方はぜひ参加してみてください。
何事もやってみればなんとかなる！


さて、こんにちは。
あかつきゆいとと申します。

私は今年から高校生ということでね、S高等学校に入学したわけですが、何もやってねーから書くことないやーとか思ってたら、まぁ、色々やってたので、今回はその中からいくつかピックアップして書いてみようと思います。

## 今年やったこと

### UniProject立ち上げたよ

最初から特大なのですが、デジタル創作サークルを立ち上げました。
今ではメンバー数は50を超える結構大きいサークルになってます。

https://uniproject.jp

これからの話の大半はそこのサークルの活動の一環であった出来事です。

### ProxmoxとK8sを始めた

サークルメンバーのしばいぬさんという方が自宅でProxmoxVEを稼働してくれており、その上でK8sを運用し始めました。
某散財系鯖主、うんちゃまさんの動画で2つとも知ったんですけれど、ずっと試してみたいなぁと思いつつも、環境がなく、できずにいました。
やっと叶った感じですね。

その時の苦労話はこの記事にあるので、ぜひ読んでください。

https://qiita.com/yuito_it_/items/bcdecfa75ae906622bff

### 推定1000人の前でLTした

まさかまさかとは思いましたが、学内LT(通学コース推定1000人超)の前でLTをしました。
やはり、とても緊張しましたね。

https://qiita.com/yuito_it_/items/075995a6320cc3cbab5d

## 最後に

この記事は、ただの自分の振り返りでしたが、他のアドカレの記事は普通に役に立つようなものを並べているつもりなので、ぜひ読んでみてください！！
最後になりましたが、**出会ってくれたUniProjectメンバーやそれ以外の人たちに最大限の感謝を！！**

### 何事もチャレンジしてみるということ

新しい言語をやってみたい、新しい技術に触れてみたい、LTをやってみたい、そう思いながらずっと後回しにしていませんか？
ぼくがそうでした。

やっぱり、ハードル高いですよね。特に、LTなんかは、自分一人じゃなくお客さんがいるわけですし、とても難しく感じるでしょう。
失敗したらどうしよう、当日何かトラブルがあったら...どうすればわかりやすく伝えられるんだろう、自信ない...
ぼくもそうでした。

ですが、やはり、**チャレンジしないことには何も始まらないですよ**。
だから少しずつでいいんです。外部じゃない身内だけのサークル内LT、社内LTから始めてみるもよし、新しい言語ならチュートリアルを毎日一ページ終わらせるとかでもいい、なんでもいいからやってみる。

来年もこのマインドでやっていきたいと思います。
皆さんも、このマインドでいい一年にしましょう。
そして、またアドカレで皆さんの今年一年やったことを見せ合いましょう！！
2024年に micro:bit を使って試作した作品をざっくり振り返る【micro:bit-2】

この記事は「[micro:bit Advent Calendar 2024](https://qiita.com/advent-calendar/2024/microbit)」の 14日目の記事です。
（公開タイミングが 1日早いですが）

今年の micro:bit のカレンダーに登録した記事としては 2つ目で、1つ目は以下の記事を書いていました。

https://qiita.com/youtoy/items/edd4fafac5e5d87b67d7

## はじめに
今回の記事では、2024年に micro:bit を使って試作した作品をざっくりと振り返ってみます。

基本的に試作したものは X などで写真・動画付きでポストしているため、それをたどって作品をピックアップしていきます。

● micro:bit from:youtoy - 検索 / X
　https://x.com/search?q=micro%3Abit%20from%3Ayoutoy&src=typed_query&f=live

## 作品
### 手で触れると光り出す魔法陣
1つ目は宮城県の石巻で行われた、石巻ハッカソン2024 に参加した際に作ったものです。

チームで作った全体の作品のうち、自分はこの部分などを作りました。

https://x.com/youtoy/status/1845627698930200888

仕組みとしては、100均のプラスチックケースに micro:bit（＋ フルカラーLEDテープ）をそのまま入れています。

micro:bit のボタンが、そのケースの蓋にギリギリあたるくらいまで底上げして入れているので、ケースの上に触れるとボタンが押される感じになります（そして、ボタンが押されたことをトリガーにフルカラーLEDテープが点灯する流れ）。

### ライントレースや無線通信など
次は、名古屋で開催された中高生向けの AI を学ぶイベント向けに準備したものです。

そのイベント内で、ガジェット・技術を使った展示のコーナーが作られる話があり、そこに体験型展示として置いたもののうちの 1つです。

https://x.com/youtoy/status/1812451837318148397

https://x.com/youtoy/status/1811979077382963566

仕組みとしては、以下の 3つを無線機能で連携させています。

1. ボタンを押すか本体を振ると、無線機能で特定の信号をとばす
1. ライントレースするロボットカーのモーター制御を、無線機能と連携（特定の信号を受けとると、動き出したり止まったり）
1. micro:bit につけたフルカラーLEDテープが無線機能と連携（特定の信号を受けとると、光ったり消えたり）

### Joy-Con との連動
次はブラウザの WebHID API で制御している Joy-Con と組み合わせてみたものです。

micro:bit を扱う処理の一部にもブラウザの API（Web Serial API）を用いています。フルカラーLEDテープを光らせるところは、MakeCode で作っています。

https://x.com/youtoy/status/1769382065416675532

挙動は見た目通り、Joy-Con を傾けるのに連動してフルカラーLEDテープの点灯する LED数が変わるというものです。

### p5.js の描画との連動
こちらは、描画ライブラリ p5.js を使って描画しているマウスカーソルと連動して動く円と、micro:bit につけたフルカラーLEDテープを連動させています。

https://x.com/youtoy/status/1769341627276161394

シンプルに円の左右移動と、フルカラーLEDテープの点灯・消灯を連動されている形です。

## おわりに
2024年に micro:bit を使って試作した作品を、ざっくりと振り返ってみました。

この他にも、フルカラーLEDテープと組み合わせたものを各所・いろいろな機会で利用したりもしました。

↓こんな感じで、作ったものを子ども向けイベントの中で楽しんでもらったりもしました。

https://x.com/youtoy/status/1839926028313284750

## 余談： その他
### 学生さん向けワークショップ
こちらは試作した作品の話ではないですが、今年 micro:bit を活用した事例の話です。

自宅にあるたくさんの micro:bit を準備しつつ、さらに複数の micro:bit を用意してもらいつつでワークショップを実施しました。

https://x.com/youtoy/status/1744357916235137496

ワークショップの様子は、以下に記事として掲載してもらったりもしました。

●横須賀プログラミング“夢”アカデミー
　https://yumeaka.jp/report/2024/02/01/1860/

↓このような感じで、けっこうな人数の学生さんにご参加いただきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/335f07d9-78a3-7694-9f26-7a1d819dcd1f.png)
価格オラクルChainlink、Pyth、Tellorの特徴と注意点

# はじめに

オラクルはブロックチェーン外の情報（例えば、通貨の価格など）をブロックチェーン上に提供するサービスです。
ブロックチェーン上でスマートコントラクトから外部データを取得するためには、オラクルが重要な役割を果たします。
例えばDeFiでは、ETH対ドルの価格を取得するためにChainlikなどの価格オラクルが使用されます。

従来、価格オラクルの分野ではChainlinkが主導的な地位を占めていましたが、近年ではPythなどの新興プロジェクトが台頭し、Chainlinkの市場シェアは減少傾向にあります。

https://x.com/blockworksres/status/1841886449878360543

そこでChainlinkと他の価格オラクルを比較するために、Chainlink、Pyth、Tellorの各オラクルについて、その特徴と分散化の仕組みについて解説していこうと思います。

# Chainlink
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92492/152abaf5-4e30-2c15-5eb4-290bd0877a69.png)


### 特徴
[Chainlink](https://chain.link/)は、複数の独立したノードオペレーターからデータを収集し、これを集約することで信頼性を確保しています。
ノードオペレーターは、外部データを収集してマートコントラクトに提供する役割を担い、その報酬としてChainlinkのネイティブトークンであるLINKトークンを受け取ります。
ノードオペレーターへの報酬は、スポンサーと呼ばれる多様な有料ユーザーやコミュニティによって支払われます。
同じブロックチェーン上の同じデータ（例えば、Arbitrum上のAAVE/USDレート）を必要とするようなユーザーやコミュニティがそのデータのスポンサーになります。

### 注意点

Chainlinkのデータ更新頻度は、各プライスフィードごとに設定されたheartbeat毎（例：24時間）、または価格変動幅が一定の閾値を超えたタイミングで更新されます。そのため、リアルタイム性が求められるアプリケーションでは、データの更新タイミングに注意が必要です。

# Pyth
![Pull__Don_t_Push__A_New_Price_Oracle_Architecture___Pyth_Network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92492/7540b7ec-ad59-5a63-0966-546d99dd6c29.png)


### 特徴
[Pyth](https://www.pyth.network/)は、複数のデータ提供者からの情報を集約し、信頼区間を設定することでデータの正確性と信頼性を確保しています。また、Pythnetと呼ばれる独自のブロックチェーン上でこれらのデータを管理し、他のブロックチェーンへはクロスチェーンでデータを提供しています。
クロスチェーンでのデータ提供は自動では実行されず、ユーザーがオンチェーントランザクションを実行して要求する必要があるため、プル型オラクルとも呼ばれています。

データの提供を要求する際にユーザーは手数料を支払う必要があり、この手数料がデータ提供者の報酬となります。ただし2024年12月現在、手数料は各チェーンで最小単位の1となっています(例: Ethereum では 1 wei)。
ガバナンスが稼働し次第、この手数料モデルが本格稼働するようです。

### 注意点
Pyth Network上では、データ更新が高頻度で行われているため最新のデータが保存されていますが、各チェーンでそのデータを使用するにはデータを要求するためのオンチェーントランザクションを実行する必要があります。
そのためPythのデータを利用する側のサービス設計に、データをいつどのように更新するのかを組み込む必要があります。

# Tellor
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92492/56e65197-9ddc-19f3-9a5e-af908102a800.png)


### 特徴
[Tellor](https://tellor.io/)は、レポーターと呼ばれる参加者がデータをオンチェーンで提供し、他の参加者がそのデータの正確性を検証する仕組みを採用しています。
レポーターはTellorのネイティブトークンであるTRBをステーキングすることでデータの提供が可能となり、その上でデータを提供することで報酬を得ることができます。
不正確なデータを提供した場合にはペナルティ（ステーキングしたTRBが没収される）が課されることで、データの信頼性を維持しています。

データの提供をレポーターに依頼するには、データフィードにチップを送る必要があります。
このチップがレポーターの報酬となります。

### 注意点
最新のデータは他の参加者によってまだ検証されていない不正なデータである可能性があるため、常に少し古いデータを参照する必要があります。
そのためリアルタイム性が求められるアプリケーションでは特に注意が必要です。


# まとめ
Chainlink、Pyth、Tellorはそれぞれ独自のアプローチでオラクル問題を解決しようとしています。
データの更新タイミングや分散性、インセンティブモデルなどそれぞれ異なるので、使用する際には各プロジェクトの特性を十分に理解することが重要となります。

# 参考
https://blog.chain.link/chainlink-price-feeds-secure-defi/

https://docs.pyth.network/price-feeds/pull-updates

https://docs.pyth.network/price-feeds/how-pyth-works/fees

https://www.liquity.org/blog/tellor-issue-and-fix
【K8s】microk8sでIPv6を有効化してIngressをIPv6にした話


## はじめに

今回はmicrok8sでIPv6をやった話です。
IPv6が使えるとものすごく便利になるものですね。

私は今回、IngressをMetalLBの外部IP設定で使っていたのですが、IPv4だとポート開放するのが少し面倒に感じていました。
そのため、IPv6に対応させようというのが発端です。

## 注意点

一番大きな注意点として、IPv6に対応させるとなると、**クラスタを組み直す必要があったりします**。
これを聞いて少し尻込みする方もいるかもしれませんが、最初さえやってしまえばあとは楽なもんです。
こればかりは耐えましょう...
なぜクラスタを組み直す必要があるかというと、一つのノードで設定しても、マスターノードと設定の同期が行われるため、無効化されてしまうためです。

他の注意点としては、

- 全てのノードで設定することが推奨されている
- microk8sを再インストールする必要がある

ですね。

## microk8sを設定する

さて、実際に設定していきましょう。

まずは、microk8sをアンインストール

```shell
snap remove microk8s
```

microk8sの設定ファイルを編集するのですが、どこにあるかというと、`/var/snap/microk8s/common/.microk8s.yaml`にあります。
ですが、おそらく、最初はディレクトリすらないのでディレクトリもファイルも作ってしまいましょう。
ちなみにこのファイルでクラスタドメインなどの設定もできるらしいですが、面倒なのでやったことはないですね()

IPv6の設定の書き方ですが、

```.microk8s.yaml
---
version: 0.1.0
extraCNIEnv:
  IPv4_SUPPORT: true                 # IPv4を有効に
  IPv4_CLUSTER_CIDR: 10.3.0.0/16     # IPv4のクラスターIPのCIDR
  IPv4_SERVICE_CIDR: 10.153.183.0/24 # IPv4のサービスIPのCIDR
  IPv6_SUPPORT: true                 # IPv6を有効に
  IPv6_CLUSTER_CIDR: fd02::/64       # IPv6のクラスターIPのCIDR
  IPv6_SERVICE_CIDR: fd99::/108      # IPv6のサービスIPのCIDR
extraSANs:
  - 10.153.183.1                     # クラスターネットワーク上のK8sコントロールプレーンPodのIP
```

基本的にこれをこのまま使えば良いでしょう。

そしてこのファイルを配置した状態で、再度microk8sをインストールします。

```shell
snap install microk8s --classic
```

## サービス側の設定

お次はサービス側の設定です。
これに関しては至って簡単です。

まずはmetalLBから

```yaml
spec:
  addresses:
    - 172.16.150.1-172.16.150.150
    - 240b:13:xxxx:xxxx:150::100-240b:13:xxxx:xxxx:150::150
  autoAssign: true
```

IPAddressPoolでこのようにIPv6の範囲も指定します。

次に、K8sのServiceのマニフェストファイルを編集します。

```diff
apiVersion: v1
kind: Service
...
spec:
  clusterIP: 10.153.183.148
  clusterIPs:
    - 10.153.183.148
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
+   - IPv6
+ ipFamilyPolicy: PreferDualStack
- ipFamilyPolicy: SingleStack
  ports:
    ...
  type: LoadBalancer
```

こんな感じになればOKです。
この`PreferDualStack`というのに書き換えるだけで大丈夫です。
すでにデプロイされているものを編集するのが一番手っ取り早いかと思います。

`PreferDualStack`というのは、**可能であれば**デュアルスタックで構成するという設定ですね。
`RequireDualStack`というのもあり、こちらは、**必ず**デュアルスタックという設定なので、ここら辺は使い分けでいいかと思います。

## 今回よくわからなかった点

今回あんまり分からなかったなぁというのが一つあって、それは、IPv6の固定です。
IPv4であれば、MetalLBの仕様で固定できたのですが、IPv6だとエラーが出ます。
MetalLBのドキュメントを読んだのですが、よくわからなかったので、また今度やってみたいと思います。