OmniAICreator/Qiita-1.07M huggingface dataset:
310. Minimum Height Trees の解き方メモ

https://leetcode.com/problems/minimum-height-trees/description/

「N個のノードからなる根なし木が与えられる。各ノードを根として木の高さを求めたとき、その高さが最小になるようなノードをすべて求めなさい」という問題です。

書き方からはピンと来ないかもしれませんが、これはすなわち「木の中心を求めなさい」ということです。ノードvとwの長さが木の直径と等しいとき、vとwを結ぶパスの中央にあるノードが木の中心になることが知られています。

では木の直径をどのように求めるかですが、これもよく知られたものがあります。

1. 任意のノードからもっとも遠いノードを求める。これをvとする
2. vからもっとも遠いノードを求める。これをwとする
3. vとwの距離が直径となる

あるノードからもっとも遠いノードを求めるには幅優先探索を利用します。ここがO(N)で求められるので、全体の計算量もO(N)になります。

参考:

https://scrapbox.io/magurofly/%E6%9C%A8%E3%81%AE%E7%9B%B4%E5%BE%84

```rust
use std::collections::VecDeque;

impl Solution {
    pub fn find_min_height_trees(n: i32, edges: Vec<Vec<i32>>) -> Vec<i32> {
        let n = n as usize;

        let mut graph = vec![vec![]; n];
        for edge in edges {
            let a = edge[0] as usize;
            let b = edge[1] as usize;
            graph[a].push(b);
            graph[b].push(a);
        }

        let path1 = Self::farest(n, &graph, 0);
        let path2 = Self::farest(n, &graph, path1[0]);

        let m = path2.len();
        if m % 2 == 0 {
            vec![path2[m / 2 - 1] as i32, path2[m / 2] as i32]
        } else {
            vec![path2[m / 2] as i32]
        }
    }

    /// startから最も遠い地点までのパスを求める
    pub fn farest(n: usize, graph: &Vec<Vec<usize>>, start: usize) -> Vec<usize> {
        let mut queue = VecDeque::new();
        let mut distance = vec![-1; n];
        let mut pre = (0..n).into_iter().collect::<Vec<_>>();

        queue.push_back(start);
        distance[start] = 0;

        while let Some(cur) = queue.pop_front() {
            for &nxt in &graph[cur] {
                if distance[nxt] == -1 {
                    distance[nxt] = distance[cur] + 1;
                    pre[nxt] = cur;
                    queue.push_back(nxt);
                }
            }
        }

        let mut path = vec![(0..n).max_by_key(|&i| distance[i]).unwrap()];
        while let Some(&cur) = path.last() {
            if cur == start {
                break;
            }
            path.push(pre[cur]);
        }

        path
    }
}
```
プログラミング未経験からITエンジニア転職、ゆくゆくはフリーランスエンジニアを目指したい方へ

私は28歳の時に一念発起して、未経験からITエンジニアへとキャリアチェンジを思い切って行いました。IT業界に対して自由で華やかなイメージを持たれている方も多いかと思いますが実際は大変なことも多く、私もこれまでに苦労もしてきました。ただそんな苦労をしてでも、**ITエンジニアになる価値は十分にある**と考えています。

本ブログは未経験エンジニア転職→フリーランスエンジニアへとなった私が、私と同じようにこれからITエンジニアを目指す方たちへ道すじを以下リンクで紹介しています。私が未経験エンジニアの研修を担当したこともありますし、私と同様に未経験でエンジニア転職をした方や大手IT企業で優秀なベテランエンジニアなど多くの人たちを働きながら見てきました。**大手のメディアには書けないような実体験に基づく情報を発信**していきますので、ITエンジニアを目指す方に見ていただきたいです:bangbang:

<br>

![Career-Development-Image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/13e99c60-0d82-2eff-be4b-ec6102738d16.png)


[>> プログラミング未経験からエンジニア転職するための3STEP学習法](https://taishi-official.com/learning-programming/)

[>> いちばん最初が難しい！？未経験転職で知っておくべき有益情報](https://taishi-official.com/first-engineering-career-change/)

[>> 転職のための退職スケジュール、履歴書・職務経歴書対策、面接対策など](https://taishi-official.com/changing-engineer/)

[>> フリーランスエンジニアになるための準備を紹介します！](https://taishi-official.com/it-freelance/)

<br>

https://taishi-official.com/


http://www.youtube.com/@Engineer_ILLBE


<br>

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- TikTok：https://www.tiktok.com/@taishi_will_be
- note：https://note.com/taishi_wii_be/

<br>


最後に良かったら「いいね」お願いします:thumbsup:
(調査)CNCのUI開発（CODESYSとやりとりする、PC側のUI開発）

<h2>やりたいこと

動く範囲で使いやすい汎用CNCを作ること。UI大事！

<h2>方針

<h3>コントローラ

CODESYSのMOTION FBを使ってCODESYSで開発。
とりあえずRPiで動くものを公開。

<h3>UI

WebVisuでもいいんだけど、なんとなく使い勝手のデザインがなぁ、って最近思ってます。

ファナックやシーメンスのようなメンブレンスイッチ液晶モニター一体型のコンソールがあるといいんだけど、どっちみち物理SWは必要で、あとはラズパイのランタイム＋UI画面＋（できれば手パ）の構成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408008/cfec2db5-1303-0f7e-44a7-ffc81709a85e.png)

手パはこんなのあるんですね。使えたらいいんだけど。6軸でワイヤレス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408008/225da537-e89e-efcd-8cf3-e63676a195bd.png)



<h3>PC用のプログラミング言語との接続と親和性

ラズパイはLinuxがベースになっていて、PCのプログラミング言語(PythonやC）でGUI画面が作れる。

このリンク（CODESYSのヘルプ）
https://content.helpme-codesys.com/ja/CODESYS%20Examples/_ex_cds_shared_memory_communication.html

を見ると、共有メモリが使えるみたいです。共有メモリ速くて楽です。でも、Linuxでも出来るって書いてあるけど、ランタイムが載ってないのは、ドキュメントが追いついていないのか？はっきりしないですね。



PLCベースのコントローラで動かすことを思うと、共有メモリではなく、Modbus/TCPでレジスタやコイルに必要な定義をしてやりとりしたほうが、どちらもいけてラッキーですかね。


<h3>通信はModbus/TCPを使うことに


CODESYS側も手っ取り早いのと、各PC言語にもライブラリがあるケースが多いので後々いろんなケースで自由度が高まる気がしました。

機械にPC乗せたくない場合（案外多い）も、産業用のタッチパネル（OMRONや三菱、富士電機とか）も、Modbus/TCP or RTUはサポートしてるから、機械が好きな人も手軽に自由に機械の画面も作れていいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408008/1d0b9620-88c2-8766-bc5f-3ad6e52357c8.png)

<h3>PC側の開発言語は簡単でいいから自由な3Dをサポートしたい

１）OpenGL系の簡単なワイヤーフレームまたは、シェーディンググラフィック
２）Modbus通信のライブラリがある
３）大規模なテキストファイルの編集、事務所のCAD/CAMとのやり取りが簡単
４）反応が速く、長期運用可能に。静的なメモリ割り当てがなるべく可能なら尚よい。

すべては難しいかもなので、それらのバランスの良い言語で、開発工数が少ないものを。

候補
C+OpenGL
C#＋Unity
FreePascal(Lazarus)+GLScene

とかですかね。

Python系のGUIも調べてみたいです。
Python3ではじめるシステムトレード：カテゴリカルデータと相関行列

分割表を学ぶ際にカテゴリカルデータを分析していること、カテゴリカルデータの分布とその特性値を理解していることが3元分割表の理解を加速することがわかっているので、カテゴリカルデータの相関の計算の方法を学習する。通常の相関係数（ピアソンの相関係数）はカテゴリカルデータにおいては、直接適用できない。

本記事を読む前に

https://qiita.com/innovation1005/items/c8c6560fbafbd8a1d126
Python3ではじめるシステムトレード：3元分割表

を読むことが必須。


# 相関行列

生成されたデータの特性を理解するために相関行列を計算することは、因子間の関連性を定量的に評価する上で非常に有用だ。ここでは、カテゴリカルデータに基づいて相関行列を計算する手順を説明する。

### カテゴリカルデータの相関行列

**クラメールのV統計量**などが使用される。クラメールのVはカイ二乗統計量に基づいており、カテゴリ間の関連の強さを測るのに適している。

### 解析的計算

実際の相関行列を解析的に導出するには、カテゴリカルデータに適した相関の尺度を計算する必要がある。クラメールのVを計算するためには：

1. **カイ二乗統計量の計算**:
   - 2つのカテゴリカル変数間のカイ二乗統計量を計算する。これは、観測度数と期待度数の差の二乗和を自由度で割る。

2. **クラメールのVの計算**:
   - カイ二乗統計量からクラメールのVを計算するには、次の式を用いる：
     $$
     V = \sqrt{\frac{\chi^2}{n \times \min(k-1, r-1)}}
     $$
   ここで、$ \chi^2 $はカイ二乗統計量、$ n$はサンプルサイズ、$k$と$r$はそれぞれ列と行のカテゴリ数だ。

### PythonによるクラメールのVの計算例

```python
import numpy as np
from scipy.stats import chi2_contingency

def cramers_v(contingency_table):
    chi2, _, _, _ = chi2_contingency(contingency_table)
    n = contingency_table.sum()
    phi2 = chi2 / n
    r, k = contingency_table.shape
    phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))    
    rcorr = r - ((r-1)**2)/(n-1)
    kcorr = k - ((k-1)**2)/(n-1)
    return np.sqrt(phi2corr / min((kcorr-1), (rcorr-1)))

# 例として2つの因子のカイ二乗検定結果を用いたクラメールのVの計算
table = np.array([[10, 20], [20, 40]])
print("Cramer's V for the table:", cramers_v(table))
```

このコードは、与えられた分割表に対してクラメールのVを計算し、因子間の関連の強さを評価する。つぎの方法は、生成された多項分布データの相関行列を解析的に理解するための一つのアプローチだ。全体の相関行列を導出するには、すべての因子ペアに対してこの計算を繰り返し実行する必要がある。

```Python
import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency

# サンプルデータを生成（A, B, Cはそれぞれ2カテゴリー）
np.random.seed(0)
sample_size = 300
p = [0.5, 0.3, 0.2]  # 各カテゴリが発生する確率
data = np.random.multinomial(1, p, size=sample_size)  # 多項分布からサンプリング

df = pd.DataFrame(data, columns=['A', 'B', 'C'])

# クラメールのVを計算する関数
def cramers_v(x, y):
    confusion_matrix = pd.crosstab(x, y)
    chi2 = chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum().sum()
    return np.sqrt(chi2 / (n * (min(confusion_matrix.shape) - 1)))

# 相関行列の計算
correlation_matrix = pd.DataFrame({
    'A': [1, cramers_v(df['A'], df['B']), cramers_v(df['A'], df['C'])],
    'B': [cramers_v(df['B'], df['A']), 1, cramers_v(df['B'], df['C'])],
    'C': [cramers_v(df['C'], df['A']), cramers_v(df['C'], df['B']), 1]
}, index=['A', 'B', 'C'])

print("相関行列:")
print(correlation_matrix)

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267055/b14f6297-fc70-f6a1-77e3-837288031a04.png)

独立ではないデータは異なる確率の設定$p$から得られます。この$p$からデータの相関を計算するのは厄介ですが、多項分布から得られた既知の相関のデータは、完全独立モデル、周辺独立モデル、条件付独立モデルと３元分割表の関係を知るのに重要であり、質的データの階層構造の理解に欠かせません。

<A HREF="http://www.tradersshop.com/bin/showprod?c=9784775991855
">Python3ではじめるシステムトレード【第2版】環境構築と売買戦略</A>

<A HREF="http://www.tradersshop.com/bin/showprod?c=9784775991855">
     <IMG SRC="http://www.tradersshop.com/images/prod/9784775991855.jpg"BORDER=1 WIDTH=70 HEIGHT=100  </A>

「画像をクリックしていただくとpanrollingのホームページから書籍を購入していただけます。
ActiveRecord各メソッドの処理速度を計測してみた

### はじめに
RailsでSeedデータを作成していた時に、「**関連テーブルの主キー（id）を全て取得する際に何のメソッドを使うべきか？**」考えたのがきっかけでした。

今回はメソッドの**実行速度**を指標として考えてみました。
⚠︎これが正解というわけではなく、あくまで私個人の見解です。

### 今回使用したメソッド
#### pluck
   - **特徴**：指定したカラムのレコードの配列を取得する
   - **メリット**： ActiveRecordオブジェクトを生成せず、特定のカラムのみデータベースから取り出すためメモリを節約できる。
   - **デメリット**：メソッド実行時に毎回SQLが発行される。

```ruby
user_ids = User.pluck(:id)
=> [1, 2, 3, 4, 5, ...] # 返り値
```

#### ids
   - **特徴**：主キーのカラムデータを全て配列で取得する
   - **メリット**：レコードのIDの配列の取得に適している。
   - **デメリット**：idの取得のみを行うため、他の属性の値は取得できない。

```ruby
user_ids = User.ids
=> [1, 2, 3, 4, 5, ...] # 返り値
```

#### map
   - **特徴**：各要素に対してブロックを評価した結果を全て含む配列を返す。
   - **メリット**：元の配列を変更せずに新しい配列を生成できるので、元のデータを保持しつつ、処理された結果を取得できる。
   - **デメリット**：レシーバをメモリ に読み込むためメモリを浪費する。

```ruby
user_map = User.all.map(&:id)
#もしくは
user_map = User.all.map(|user| user.id)
=> [1, 2, 3, 4, 5, ...] # 返り値
```

### 計測の仕方
railsのライブラリ[benchmark](https://docs.ruby-lang.org/ja/latest/class/Benchmark.html)を使用しました。

サンプルコードはこちらです。
```ruby
require 'benchmark'

result_ids = Benchmark.bm do |x|
  x.report("ids:"){user_ids = User.ids}
end

result_pluck = Benchmark.bm do |x|
  x.report("pluck:"){user_pluck = User.pluck(:id)}
end

result_map = Benchmark.bm do |x|
  x.report("map:"){user_map = User.all.map(&:id)}
end
```

- ```x.report```: [測定対象のコードブロックとラベルを指定します。](https://docs.ruby-lang.org/ja/latest/class/Benchmark=3a=3aReport.html#I_ITEM)
- ```("")```の中でラベルを指定できます。
- ```{}```の中に測定したい処理を記述します。


### 実行結果
```
       user     system      total        real
ids:  0.000000   0.000894   0.000894 (  0.001304)
       user     system      total        real
pluck:  0.000425   0.000149   0.000574 (  0.000716)
       user     system      total        real
map:  0.000727   0.000183   0.000910 (  0.001290)
```
totalの値で評価しています。
処理速度の観点だけで見れば、pluckに軍配が上がりました。

#### 結果の見方
[「【Ruby】まとめでよく見る処理速度の計測方法・見方」](https://zenn.dev/publiclocaldev/articles/63e0fb1eb098ce)の記事を参考にしています。

> **user** : ユーザー CPU 時間
ユーザープログラムの実行に費やした CPU 時間。この場合、Ruby スクリプトを実行すべく Ruby 処理系が働いたぶんの CPU 時間のこと。
> **system** : システム CPU 時間
OS はファイルの読み書きなどの基本的な機能を「システムコール」という形で提供しているが、プログラムがそれを呼び出しその実行に費やした CPU 時間をこう呼ぶらしい。
> **total** : userとsystemの和
> **real** : 処理の開始から終了までの現実の経過時間
Timeクラスを使用した場合と同じなので、待機時間が含まれたりネットワークの影響も受けてしまうため、見る必要はない。

### おわりに
処理速度を調べてみて、各メソッドへの理解が深まりました。
今回の結果ではpluckが一番速かったのですが、idsのほうが速いという説もあるようです。
DBの設定やデータ量などのコンテキストの影響もあると思うので、単純な処理速度だけでなくメソッドの用途や特性を理解した上で選定できるようになりたいです。

### 参考記事
- [benchmarkライブラリ](https://docs.ruby-lang.org/ja/latest/library/benchmark.html)
- [【Ruby】まとめでよく見る処理速度の計測方法・見方](https://zenn.dev/publiclocaldev/articles/63e0fb1eb098ce)
- [パフォーマンスを低下させる！？初心者ありがち?pluckメソッドについて調べてみた。](https://zenn.dev/kuchaman/articles/d946e31e0e8edb)
- [pluckメソッドとidsメソッドについて](https://qiita.com/pandama09396862/items/aa7b60f5697fa63cbd95)
シグネチャー・ハビット・ID：次世代のバイオメトリック認証技術

## 目次
1. [概要](#概要)
2. [シグネチャー・ハビット・IDの特徴](#特徴)
3. [技術の原理とコンポーネント](#原理とコンポーネント)
4. [実装方法とアルゴリズム](#実装方法)
5. [事例：日常行動を通じたセキュアな認証](#事例)
6. [プライバシーとセキュリティの取り組み](#プライバシーとセキュリティ)
7. [開発者コミュニティとリソース](#コミュニティ)
8. [そして](#そして)

## 概要
シグネチャー・ハビット・IDは、個人の日常的な行動や癖、生理的特徴を利用した次世代の認証技術です。この技術は、利き手や利き足、呼吸の深さ、脈拍の変動など、個人が無意識のうちに示す独特なパターンを認証データとして使用します。

## シグネチャー・ハビット・IDの特徴
この認証システムは以下のような特徴を持ちます：

1. **非侵襲性**:
   - ユーザーは特別な動作やスキャンを必要とせず、自然な行動の中で認証が完了します。

2. **高度な精度**:
   - 微細な行動のパターンを分析することで、非常に高い精度で個人を識別します。

3. **動的な学習機能**:
   - ユーザーの行動パターンの変化を学習し、認証プロセスを逐次更新します。

## 技術の原理とコンポーネント
シグネチャー・ハビット・IDは、以下の技術的コンポーネントに基づいています：

- **行動センサリング**:
  - 日常生活における細かな動作や習慣を捉えるための高感度センサーを利用します。

- **生理的フィードバック分析**:
  - 心拍数、呼吸パターンなどの生理的なデータをリアルタイムで分析します。

- **機械学習アルゴリズム**:
  - 収集されたデータから個人の独特な行動パターンを抽出し、学習モデルを構築します。

### アルゴリズムの詳細
以下のMermaid図は、データ処理フローを示しています：

```mermaid
flowchart TD
    A[データ収集] -->|生データ| B[特徴抽出]
    B --> C{パターン認識}
    C -->|一致| D[認証成功]
    C -->|不一致| E[認証失敗]
```

## 実装方法とアルゴリズム
実装には以下のステップが含まれます：

1. **データ収集**:
   - 日常生活での行動や生理的な反応を連続して記録します。

2. **特徴抽出**:
   - 収集したデータから識別可能な特徴を抽

出します。

3. **パターンマッチング**:
   - 抽出した特徴を既存のデータモデルと照合し、認証を行います。

## 事例：日常行動を通じたセキュアな認証
例えば、オフィスでのPC作業中にユーザーのキーストロークパターン、マウスの動き、座り方の微細な変動などから個人を識別し、セキュリティを確保します。

## プライバシーとセキュリティの取り組み
全てのデータは暗号化され、プライバシー保護のために最新のセキュリティプロトコルが適用されます。ユーザーの許可なくデータが外部に公開されることはありません。

## 開発者コミュニティとリソース
この技術の開発と改善には、世界中の専門家や技術者が協力しています。オンラインフォーラムや開発キットが提供され、広範なコラボレーションが促進されます。

## そして
シグネチャー・ハビット・IDは、未来の認証方法として多大な可能性を秘めていますが、この技術はまだ開発中です。この架空の概念が現実に近づく日も遠くないかもしれません。この記事が、新しい認証技術に対する理解と興味を深めるきっかけとなることを願っています。
robloxでassistant その9

# 概要
robloxでassistantやってみた。

# 質問
電卓を教えて

# 回答

以下はLuaで電卓を実装する例です。
```
local function calculate(operation, num1, num2)
	if operation == "+" then
		return num1 + num2
	elseif operation == "-" then
		return num1 - num2
	elseif operation == "*" then
		return num1 * num2
	elseif operation == "/" then
		return num1 / num2
	else
		return nil
	end
end

local operation = "+" -- 演算子を設定する部分です
local num1 = 10 -- 最初の数を設定する部分です
local num2 = 5 -- 2番目の数を設定する部分です

local result = calculate(operation, num1, num2)

if result then
	print("計算結果: " .. result)
else
	print("無効な演算子です")
end
```
このコードをRoblox Studioのスクリプトに追加して実行すると、指定した演算子と数値に基づいて計算結果が表示されます。

以上。
robloxでassistant その8

# 概要
robloxでassistantやってみた。

# 質問
じゃんけんを教えて

# 回答

じゃんけんは、日本の伝統的な手の遊びです。以下はLuaでじゃんけんを実装する例です。
```
local hands = {"グー", "チョキ", "パー"}

local function playJanken()
	local randomIndex = math.random(1, 3)
	return hands[randomIndex]
end

local playerHand = "グー" -- プレイヤーの手を設定する部分です

local computerHand = playJanken()

print("プレイヤーの手: " .. playerHand)
print("コンピューターの手: " .. computerHand)

if playerHand == computerHand then
	print("引き分けです！")
elseif (playerHand == "グー" and computerHand == "チョキ") or
			 (playerHand == "チョキ" and computerHand == "パー") or
			 (playerHand == "パー" and computerHand == "グー") then
	print("プレイヤーの勝ちです！")
else
	print("コンピューターの勝ちです！")
end
```
このコードをRoblox Studioのスクリプトに追加して実行すると、じゃんけんのゲームが再現されます。プレイヤーの手を設定し、コンピューターの手と比較して勝敗を判定します。



以上。
robloxでassistant その7

# 概要
robloxでassistantやってみた。

# 質問
zundokoを教えて

# 回答

zundokoは、日本の伝統的な遊びの一つです。以下はLuaでzundokoを実装する例です。
```
local zundoko = {"ズン", "ドコ"}

local function checkZundoko(sequence)
	local n = #sequence
	if n < 5 then
		return false
	end
	
	for i = 1, n - 4 do
		if sequence[i] == "ズン" and sequence[i+1] == "ズン" and sequence[i+2] == "ズン" and sequence[i+3] == "ズン" and sequence[i+4] == "ドコ" then
			return true
		end
	end
	
	return false
end

local sequence = {}

while not checkZundoko(sequence) do
	local randomIndex = math.random(1, 2)
	table.insert(sequence, zundoko[randomIndex])
	print(zundoko[randomIndex])
end

print("キ・ヨ・シ！")
```
このコードをRoblox Studioのスクリプトに追加して実行すると、ズンドコキヨシの遊びが再現されます。プログラムはランダムに"ズン"と"ドコ"を出力し、"ズンズンズンズンドコ"の並びが現れるまで続きます。最後に"キ・ヨ・シ！"と出力されます。

以上。
robloxでassistant その6

# 概要
robloxでassistantやってみた。

# 質問
fizzbuzzを教えて

# 回答

FizzBuzzは、プログラミングの面接試験や練習問題でよく使われる問題です。以下はFizzBuzzの解法の一つです。

1から100までの数を順番に出力しますが、3で割り切れる場合は"Fizz"、5で割り切れる場合は"Buzz"、3と5で割り切れる場合は"FizzBuzz"と表示します。それ以外の場合は、その数を表示します。

以下はLuaでFizzBuzzを実装する例です。
```
for i = 1, 100 do
	if i % 3 == 0 and i % 5 == 0 then
		print("FizzBuzz")
	elseif i % 3 == 0 then
		print("Fizz")
	elseif i % 5 == 0 then
		print("Buzz")
	else
		print(i)
	end
end
```
このコードをRoblox Studioのスクリプトに追加して実行すると、1から100までのFizzBuzzが出力されます。


以上。
robloxでassistant その5

# 概要
robloxでassistantやってみた。

# 質問
九九を教えて

# 回答

九九の表は、1から9までの数字を掛け合わせた結果を表にしたものです。以下はLuaで九九の表を表示する例です。

```
for i = 1, 9 do
	for j = 1, 9 do
		print(i .. " × " .. j .. " = " .. i*j)
	end
end
```
このコードをRoblox Studioのスクリプトに追加して実行すると、九九の表が出力されます。

以上。
robloxでassistant その4


# 概要
robloxでassistantやってみた。

# 質問
websocketは、できますか

# 回答

申し訳ありませんが、Robloxの公式ドキュメントにはWebSocketに関する情報は見つかりませんでした。Robloxでは、HTTPリクエストを送信するためのHttpServiceクラスが提供されていますが、WebSocketに関する直接的なサポートは提供されていないようです。
ただし、一部の開発者は、LuaでWebSocketを実装するための外部ライブラリを使用しています。これにより、Roblox内でWebSocket通信を行うことができます。ただし、外部ライブラリの使用には注意が必要であり、セキュリティリスクを避けるために信頼できるソースからのみリクエストを受け入れるようにしてください。
もし他に質問があれば、お気軽にどうぞ！


以上。
robloxでassistant その3

# 概要
robloxでassistantやってみた。

# 質問
http getは、できますか

# 回答

はい、RobloxのHttpServiceクラスを使用してHTTP GETリクエストを送信することができます。以下は、GETリクエストを送信するための基本的なコード例です。
```
local HttpService = game:GetService("HttpService")
local url = "https://example.com/api/data" -- リクエストを送信するURL
local response = HttpService:GetAsync(url) -- GETリクエストを送信し、レスポンスを取得
print(response) -- レスポンスを出力
```
このコードでは、HttpService:GetAsync()メソッドを使用して指定したURLにGETリクエストを送信し、レスポンスを取得しています。
取得したレスポンスは、response変数に格納され、print()関数を使用して出力されます。
ただし、注意点として、HTTPリクエストは信頼できる第三者のプラットフォームにのみ送信するようにしてください。
また、セキュリティリスクを避けるために、信頼できるソースからのみリクエストを受け入れるようにしてください。
もし他に質問があれば、お気軽にどうぞ！

以上。
Ubuntu 24.04 LTS の Azure VM を Azure CLI で作ってみた

Ubuntu 22.04 LTS の次の LTS バージョンとして「24.04」がリリースされました。早速、Ubuntu 24.04 LTS の Azure VM を Azure CLI で作ってみました。

## 使用する VM イメージ

https://documentation.ubuntu.com/azure/en/latest/azure-how-to/instances/find-ubuntu-images/

![ubuntu2404-image-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/92f0d3ef-c269-9319-6104-9cb6186763c4.png)

こちらに記載の `Canonical:ubuntu-24_04-lts:server:latest` を使用します。

## 検証用の Azure VM を作成

```bash:bash
prefix=mnru2404
region=japaneast

az group create \
  --name ${prefix}-rg \
  --location $region

az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image Canonical:ubuntu-24_04-lts:server:latest \
  --size Standard_B1s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --nsg-rule NONE \
  --public-ip-address-dns-name ${prefix}

az network nsg rule create \
  --resource-group ${prefix}-rg \
  --name AllowSSH \
  --nsg-name ${prefix}-vmNSG \
  --priority 100 \
  --source-address-prefixes $(curl -s inet-ip.info) \
  --destination-port-ranges 22 \
  --access Allow \
  --protocol Tcp

ssh azureuser@${prefix}.$region.cloudapp.azure.com
```

## OS 名を確認

```bash:bash
$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Ubuntu 24.04 LTS"
```

## 後片付け

```bash:bash
$ exit

$ az group delete \
  --name ${prefix}-rg \
  --yes
```
ラズパイのTerminal壊れたので直した（PermitTTY）

# sshd_configの設定間違えた
sshd_configでPermitTTYをnoにするとSSH接続によるTerminal操作に制限がかかる

SSHではなく直接Terminalをいじれば多分Terminal使えるのですぐにsshd_configを書き直せるけど、SSH以外で操作できない時はechoでoverwriteするしかない

```bash
echo 'Match User pi' | sudo tee /etc/ssh/sshd_config
echo '    X11Forwarding yes' | sudo tee -a /etc/ssh/sshd_config
echo '    AllowTcpForwarding no' | sudo tee -a /etc/ssh/sshd_config
echo '    #PermitTTY no' | sudo tee -a /etc/ssh/sshd_config
echo '    #ForceCommand cvs server' | sudo tee -a /etc/ssh/sshd_config
```
その後リスタート

```
sudo systemctl restart sshd
sudo service sshd restart
sudo sshd -t
```

## sshd_configに関して参考になりそうな資料

https://unskilled.site/sshd_config%E3%81%AE%E8%A8%AD%E5%AE%9A%E9%A0%85%E7%9B%AE%E3%81%AE%E7%90%86%E8%A7%A3%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99/

右往左往する中で見つけた面白そうな記事

https://qiita.com/isotai/items/f8ece84816f34eb515e5

sshポートフォワーディングして特定のサーバーを経由してSSHする方法が書いてある

# そもそもターミナルって何？
ターミナルはLinuxなどのOSに対して命令を直接送るためのプログラム「シェル」を表示させるプログラム

ラズパイはLXTerminalを採用

UNIX系OSのLinuxに人が命令を伝えて計算や処理を行う場合、「シェル」を使って命令（コマンド）を送り、そのシェルを表示させるソフトが「ターミナル」

/bin/bash と表示された最後の「bash」というのがシェルの種類
```
Bourne Shell 系
sh
ash
dash
bash
zsh
C Shell 系
csh
tcsh
```

# 途中で見つけた便利コマンドやツール

pinout
![119388569-7346c200-bc98-11eb-96de-c83d7359b643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/8894daa1-a1b1-2c09-c3a8-7444a4f9cd83.png)

Jupyter Notebook on RPi
```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3 python-dev build-essential python-pip
sudo pip3 install –upgrade pip
sudo pip3 install jupyter
jupyter notebook –generate-config
jupyter notebook password
jupyter notebook
```
Build a reusable UI component using lightning web components



[Build a Reusable UI Component with Lightning Web Components](https://trailhead.salesforce.com/content/learn/projects/get-started-with-salesforce-development/build-reusable-ui-component-with-lightning-web-components)


+ [After deploying the housingApp successfully. I don't see it in the custom section of components area](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajy9Y)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/21c358e9-26e1-6f84-6326-e506d38030c9.png)


:::note
So I figured this out. I needed to be on the Home tab and select edit Page. I was in the house page Edit Page. I think the wording on the tutorial could be a little clearer.


れで私はこれを理解しました。 [ホーム] タブで [ページの編集] を選択する必要がありました。私はハウスページの編集ページにいました。チュートリアルの文言がもう少しわかりやすくてもよいと思います。
:::
jaxのループの中でprintする方法

# はじめに
- jaxではscan, fori_loop, while_loopなど、[独自のループ文の書き方](https://qiita.com/shibaura/items/d3ea05c3f392ed0ba7d9)がある
- このscanなどの中でprintをしても、**中身が表示されずに困る**

# 問題の詳細
次のプログラムのようにscanの中でprintしても、`Traced<...>`といったデータしか表示されない。。
```python:プログラム
import jax
import jax.numpy as jnp

def body_fun(val, x):
    print(val) # デバッグのためにprintしたい
    return val + x, val + x  

final_val, ys = jax.lax.scan(body_fun, 0, jnp.arange(5))
```

```:実行結果
Traced<ShapedArray(int32[], weak_type=True)>with<DynamicJaxprTrace(level=1/1)>
```
👆 なんとか表示させたい

# 解決方法
`jax.debug.print`を使えば解決！
```python:プログラム
import jax
import jax.numpy as jnp

def body_fun(val, x):
    jax.debug.print('{}', val) # デバッグのためにprintしたい
    return val + x, val + x  

final_val, ys = jax.lax.scan(body_fun, 0, jnp.arange(5))
```

```:実行結果
0
0
1
3
6
```
👆 ちゃんと表示できている！

# もっと複雑な状況でprintしたい場合
コールバックという、ホスト側にデータを移してから、データ操作する方法があるらしい。
jax.debug.printもコールバックを使った一つの関数とのこと。
https://docs.jax.dev/en/latest/external-callbacks.html

コールバックを利用するれば、もっと複雑な状況でもprintができる。

# おわりに
結構この情報を探し当てるのに、結構な時間がかかった。。
備忘録　同じ端末で二つのgitアカウントで複数のGitHubアカウントを作る方法

ディレクトリの位置はmacを想定しています、個人の備忘録・記事を書く練習の殴り描きです。
調べてたどり着いた方は記事末の参考を参考にしてください。

まず二つのgithubアカウントにて別のssh設定で接続。

~/ssh./config にて

```
Host github.com-for-private
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_github_private
  TCPKeepAlive yes
  IdentitiesOnly yes
```

この Host の値が
"プロジェクトフォルダ"/.git/config の

```
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@github.com-for-private:sample.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
[branch "feat/create_question_list"]
	remote = origin
	merge = refs/heads/feat/create_question_list
[user]
	email = sample@gmail.com
```

git clone や git remote add の時、リポジトリ名の指定を git@github.com:account/sample.git のようにすると思いますが、 これを github.com-for-company:account/sample.git のように指定することで 使用するsslのキー(==GitHubアカウント)を指定することができます。


~.git/configは
```
cd Project/develop
$ git config --local user.name "sumple_name"
$ git config --local user.email "sumple.gmail"
```
この具合でもう一つの分も操作します

このようにして個別のプロジェクトで別のssh接続が別のアカウントに繋がるようにします


参考
同一端末で、複数のGitHubアカウントを使い分ける方法
https://github.com/youkinjoh/TrainingWebSocket/wiki/同一端末で、複数のGitHubアカウントを使い分ける方法

複数のgitアカウントを使い分ける
https://qiita.com/0084ken/items/f4a8b0fbff135a987fea

[Git]これだけ押さえる！gitconfigの基本
https://qiita.com/C_HERO/items/c35e679f0b03a5f06469
Javaで「実行環境のエンコーディングに合わせてプログラムを実行する」の動作を確認してみた

# 概要

Javaで「実行環境のエンコーディングに合わせてプログラムを実行する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/encoding/index4.html

# 実装

以下のファイルを作成しました。
```JSample4_1.java
class JSample4_1{
  public static void main(String[] args){
    System.out.println("いい天気ですね");
  }
}
```

以下のコマンドを実行しました。
```
$ javac -J-Dfile.encoding=UTF-8 JSample4_1.java
$ java JSample4_1
いい天気ですね
```

# まとめ

何かの役に立てばと。
YouTube Data API v3を使ってYouTube動画情報取得アプリを作ってみた


## はじめに

このアプリは、YouTube Data API v3を使用して指定されたチャンネルの情報を取得するWebアプリケーションです。Flaskフレームワークを使用しています。

## Youtube Quest
### プレビュー
<div align="center">
  <a href="https://youtube-quest.onrender.com/" target="_blank">
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680988/44c3ac08-c486-594e-5416-67c32f4261bd.png" >
  </a>
</div>

https://youtube-quest.onrender.com/

:::note warn
注意: [Render.com](https://render.com/)の無料プランで公開しているため、開くまでに50秒以上かかります。
:::

### 利用条件
1. [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/)のAPIキー
1. [Youtube](https://www.youtube.com/)のチャンネルIDもしくはユーザーID



### チュートリアル
1. [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/)のAPIキーを取得し、フォームにAPIキーを設定します。
2. [Youtube](https://www.youtube.com/)から調べたいチャンネルのチャンネルIDもしくはユーザーIDを取得し、フォームに貼り付けます。
3. 詳細設定で表示したい項目と検索を絞り込める検索詳細設定が可能です。
4. "Search" をクリックすると、該当チャンネルの情報と動画の情報を表示します。
5. 任意でCSV形式でのダウンロードが可能です。
<br>

## ローカルでの使用方法
https://github.com/yhotta240/youtube-quest
### プロジェクトを作成
1.リポジトリをクローンします。
```powershell:Windows
git clone https://github.com/yhotta240/youtube-quest.git
cd youtube-quest
code . 
```

2.仮想環境を作成します。
```powershell:Windows
py -3 -m venv .venv
.venv\Scripts\activate
```

### インストール
必要なライブラリをインストールします。

```powershell:Windows
pip install Flask
pip install google-api-python-client
```
もしくはrequirementsを使って一括インストール
```powershell:Windows
pip install -r requirements.txt
```
### 起動方法
1.`python fix_imports.py` を実行し、ローカル用のimportに修正します。
```powershell:Windows
python fix_imports.py
```
2.`python api/run.py` を実行してアプリケーションを起動します。
```powershell:Windows
python api/run.py
```
<br>

## まとめ
今回、APIを使う経験が初めてだったので、APIの使い方についての理解を深める良い機会でした。

まだ実装できていない部分がいくつかありますが、自分としては最低限の機能を実装することができました。しかし、もし何か改善すべき点があれば、積極的に取り組んでいきたいと考えています。
<br>

## 参考

https://developers.google.com/youtube/v3/docs?hl=ja

https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/
GoLand で gRPCリクエストを発行するための設定

GoLandのHTTP Clientは、gRPCのリクエストも発行することができる。ただし初期設定だと、`google.protobuf.Timestamp` や　`google.protobuf.FieldMask` を含むリクエストを発行したとき、以下のようなエラーが発生してしまう。

```
com.intellij.grpc.requests.RejectedRPCException: An error occurred during protocol buffers file binary assembly. Details are logged
```

GoLandのHTTP Client が TimestampやFieldMaskを解釈できないのが原因。

GoLandのHTTP Clientに、`google.protobuf.Timestamp` の定義を教えてやれば、問題は解決する。

以下、具体的な手順。

1. 以下のGitリポジトリをcloneする
   - https://github.com/protocolbuffers/protobuf
   - cloneしたディレクトリを`<root-dir>` とする
2. GolandのProtocol Buffersの設定のImport Pathsに以下を追加する(下図)
   - `<root-dir>/protobuf/src`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196890/417ae421-ff47-2d2f-10ff-3b7831245367.png)

多分、GoLand以外のJetbrainのIDEでも同じ。
超高性能コンパイラ「エクリプシス」：次世代のコンパイルテクノロジー詳細ガイド

## 目次
1. 概要
2. エクリプシスの革新的特徴
3. 高度な最適化技術
4. マルチプラットフォーム対応と環境適応
5. 実践例：エクストリームパフォーマンスを実現
6. エクリプシスのインストールと使用方法
7. 産業界での具体的影響と事例
8. エクリプシスの開発フローとアーキテクチャ
9. そして

## 概要
エクリプシスは、次世代のコンパイル技術を駆使して、ソフトウェア開発の各フェーズで前例のない速度と効率を実現するコンパイラです。このツールは、特に大規模なソフトウェアプロジェクトやリアルタイムシステムでその真価を発揮し、AIと量子計算を組み合わせた革新的なアプローチでコード解析と最適化を行います。

## エクリプシスの革新的特徴
エクリプシスは以下の特徴を持つことで、従来のコンパイラと一線を画しています：

1. **AI駆動のコード解析**:
   - 深層学習に基づくアルゴリズムが、ソースコードのパターンを学習し、予測不能な最適化をリアルタイムで実行します。
   
2. **リアルタイムのパフォーマンスフィードバック**:
   - コンパイル時に収集されるパフォーマンスデータを基に、コード改善のための具体的な提案を行います。

3. **クロスプラットフォームのバイナリ生成**:
   - 同一ソースコードから複数のプラットフォーム向けに最適化された実行可能ファイルを生成、プラットフォームごとの微調整を自動で行います。

## 高度な最適化技術
エクリプシスは以下のような最先端技術を駆使してコードを最適化します：

- **量子アルゴリズム最適化**:
  - 量子計算を活用して、伝統的なアルゴリズムでは不可能だったコード最適化を実現します。
  
- **マルチスレッド並列処理**:
  - 複数のCPUコアやGPUをフルに活用し、コンパイルプロセスを劇的に高速化します。

## マルチプラットフォーム対応と環境適応
エクリプシスは、Windows、Linux、macOS、さらには組み込みシステム向けにも最適化されたコードを生成する能力を持っています。異なるハードウェアの特性を自動で識別し、それに応じた最適化を施します。

## 実践例：エクストリームパフォーマンスを実現
以下はエクリプシスを使用して、計算集約型のアプリケーションのパフォーマンスを極限まで高めた例です：

```c
// 高度な画像処理の最適化
int advancedImageProcessing(int pixelData[]) {
    // 複雑な画像処理アルゴリズム
    return modifiedPixelData;
}
```

このコード片は、エクリプシスによってハードウェアアクセラレーションを利用した形で最適化され、実行速度が大幅に向上します。

## エクリプシスのインストールと使用方法
エクリプシスのインストールは以下の手順で行います：

```bash
$ wget https://eclipsys.com/install
$ chmod +x install
$ ./install --optimize
```

使用方法もシンプルで直感的であり、コマンドラインから容易に操作可能です。

## 産業界での具体的影響と事例
エクリプシスは、ゲーム開発、金融分析、AIトレーニングプラットフォームなど、多岐にわたる分野でのアプリケーションのパフォーマンス向上に寄与しています。特に大規模なデータセンターでの運用効率向上が顕著です。

## エクリプシスの開発フローとアーキテクチャ
以下の処理フロー図は、エクリプシスがソースコードをどのように処理し、最適化するかを示しています：

```mermaid
graph TD;
    A[ソースコード入力] --> B[AI解析];
    B --> C[依存関係解析];
    C --> D[プラットフォーム特定最適化];
    D --> E[量子アルゴリズム適用];
    E --> F[マルチスレッド最適化];
    F --> G[最終バイナリ生成];
```

このフローチャートは、エクリプシスがどのように複数の段階を経てソースコードから最終的な実行ファイルを生成するかを示しています。

## そして
エクリプシスは、コンパイラ技術の未来を切り開く存在ですが、現実にはまだ存在しません。この記事は技術の可能性を探るものであり、実際の製品開発に向けたインスピレーションを提供することを目的としています。未来の技術開発における一助となることを願っています。
Click Fraud Software: Detecting and Preventing Digital Deception

In the fast-paced world of online advertising, click fraud has become a significant concern for businesses seeking to maximize the effectiveness of their digital marketing campaigns. Click fraud occurs when individuals or automated bots maliciously click on online ads with the intention of draining advertisers' budgets or artificially inflating click-through rates.

To combat this threat, click fraud software has emerged as a vital tool for advertisers. This software employs sophisticated algorithms and machine learning techniques to analyze vast amounts of data and detect suspicious patterns indicative of fraudulent activity. By monitoring factors such as click frequency, IP addresses, user behavior, and device information, click fraud software can identify and flag fraudulent clicks in real-time, allowing advertisers to take proactive measures to protect their ad spend.

Furthermore, click fraud software offers valuable insights and analytics that enable advertisers to optimize their campaigns and allocate their resources more effectively. By identifying areas of high click fraud risk and adjusting their targeting strategies accordingly, businesses can minimize waste and achieve better ROI on their advertising investments.

In conclusion, click fraud software plays a crucial role in safeguarding the integrity of online advertising ecosystems and ensuring that advertisers receive genuine engagement from their target audience. By leveraging advanced technology and data-driven insights, businesses can stay one step ahead of fraudsters and maximize the impact of their digital marketing efforts.
SESの現場から逃げよう

皆さんはSESで働いていますか？
私は１０年超のSESで客先常駐で働いています。
心も体もボロボロでだましだまし働いていますが、ほんとに壊れてしまって働けなくなった場合、経済的に損失が大きくなってしまいます。それを踏まえて、働きつつ現場がヤバいなと感じたら逃げる頃合いをいつも探しています。

以下は私がヤバいなと感じて逃げるときのポイントです。
# 残業が多い
私は残業が月30時間を超えるような労働を強いられると胸のあたりが痛くなってきます。体が一番大切な資本です。忙しかったり暇だったり繰り返すと落差から躁鬱っぽくなりますよね。でもそんな働き方は令和の時代にそぐわないと思います。

<b>撤退しましょう。


# ・聞かれたことを素直に答えづらい
例）
プロパー「この間のタスクいつぐらいに終わる？」
私「タスク自体なら今日中に単体テストが終わって結合環境で明日テストが終わればリリースできるぐらいです。ただXXの横展開もモジュールに含めてやるとなると結合含めて＋１日なので明後日ぐらいまでかかるかと思います。」
プロパー「いやだから全部含めて何日か言ってほしいんだけど。。３日ね。」
私「そうですね。何もなかったら３日程度だと思います、ただXXの横展開がそのまま出来るか微妙かもしれないので、もしかしたら４日ぐらいかかる可能性もあります。」
プロパー「さっき３日って言ったじゃん。遅すぎるよ。もしもってどう言うケース？」
私「ほげほげふがふがというケースがあったらテストパターンを増やす必要があるかと思いました。」
プロパー「それを含めて最初に４日で終わりますって言ってほしかったんだけど」
私「申し訳ありません」

これ客先のプロパーは正論しか言ってませんよね。聞かれたことだけに正確に答えるなんて小中学生でも出来ることです。だけどそれができるときって心理的安全が担保されてるときだけなんですよね。偉い人はそんなのお構いなしに結果だけ詰めてくるからやりづらいです。
私はこのプロパーとの会話がストレスで言ったことを覚えられない、メモも追いつかないからタスク管理ツールかチャットによるやり取りをさせて欲しい旨伝えましたが、面倒くさいと却下されました。
こういうとき相手や環境、自分を責めてもしょうがないです。
<b> 撤退しましょう。

# ・やっている業務に興味がもてない
どうしても興味がもてない業務ってありますよね。
<b>撤退しましょう。

# ・現場がピリついてると感じる
なんか無性にそう感じる現場ってありますよね。こっちの気のせいとか、考えすぎってケースもあるかもしれませんが、そのピリついた現場に適応するために努力するのってバカらしいですよね。
<b>撤退しましょう。

# ・現場の業務がルーチンになってきた
慣れてきてある程度わかってくると業務がルーチンのように感じるときがあるかもしれません。
刺激がある他の仕事を振ってもらったり交渉しましょう。
でももし無理だったらそこでの成長はもう無理です。長くやってたらわかることもあるかもしれませんが
そんな不確実なものを待つのは悪手だと思います。
<b>撤退しましょう。


こういうことを書くと責任感がない！とか憤る人も多いかもしれません。
でも客先も自社も自分の利益のために働いてるのであって、
現場で働くあなたのことなんて二の次三の次です。
特にSESなんか不安定な働き方をする人こそ自分のことを一番に考える必要があると私は思います。
撤退は恥ずかしいことではありません。
むしろ我慢した結果、急に出社できなくなる方が自社も客先も迷惑だと思います。
なので自社には細かく続けられそうなのか報告をしつつ、無理そうだったら早めに言いましょう。
【雰囲気で覚える】CloudFront オリジンアクセスアイデンティティ（OAI）

カタカナいっぱいで混乱したので、
CloudFront経由のS3のセキュアな設定についてのメモ

※正式な設定方法はこちらの方が詳しく説明してくださっているのでご参照ください。

https://qiita.com/frozenbonito/items/b03935a12b680e62c6d1

# 関連用語説明

### プリンシパル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/c309a8d1-6f15-be3a-1dd0-f6982ce71df3.png)

対象にアクセスのリクエストをするアプリ等

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/intro-structure.html#:~:text=プリンシパルとは、AWS%20リソース,情報を付与できます%E3%80%82

### オリジン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/32a379de-8f75-9d2b-d203-3d70194858c5.png)
CloudFront によってファイルのリクエストが送信される場所
例えば、Amazon S3 バケット、MediaStore コンテナ、MediaPackage チャネル、Application Load Balancer、AWS Lambda 関数 URL を使用できます。
 
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html

# ゴールのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/29e34c2d-9ad1-7178-c01a-f303bc4ae7d4.png)

# 本題
あるところに有名な絵画を保有し展示している人がいました。
絵画の保有者と、お客さんには、それぞれこんな不満がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/6c75a507-bdfc-455b-ba9f-57047edbd1b2.png)

お客さん「有名な絵画を見に行きたいけど、場所が遠い。もっと近くにあれば良いなぁ。」
絵画の保有者「誰でも見ることが出来ると盗まれそうだな。」

そこで絵画の保有者はこんなことを思い付きました。
絵画の保有者「そうだ、コピーを作って博物館で展示しよ。場所はお客さんの近くにしよ。」

## オリジンアクセスアイデンティティ（OAI）の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/d7e93364-d398-952c-b642-61e8167d10fb.png)

お客さんの近くに博物館を開きたいので、準備をします。
まず、絵画のコピーを入手する為専用のトンネルを作成します。
動線の確保が大事です。
トンネルには「OAI」という名前を付けました。

※2024/05/04現在
> OAC の使用をお勧めします。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

## S3アクセスポイントの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/4ed0d57b-08bb-0f82-ea7f-7759c8ef984e.png)

元の絵画は安全の為に隠すことにしました。
そして「コピーの絵画を受け取れる人は、OAIトンネルから来た博物館管理者だけ」という約束で、博物館経営会社にコピーの使用許可と経営許可を出しました。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-access-points.html

## CloudFrontディストリビューションの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/7a5aeec3-59df-7766-283a-c76bc46435f5.png)

いよいよ博物館を建築して、
絵画の保有者と約束した経路で、絵画のコピーを入手します。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html

## 博物館オープン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/18f04bd8-8d7a-f81a-90a4-21f28e5e2a4c.png)

冒頭記載のゴールのイメージで読み替えてください。
forem docker?をVBOXで動かした

# forem ってなに？
foremはコミュニティ？記事？のプラットフォームらしいです。
OSSで公開されいて改造が可能になっていると聞き立ててみました！

https://github.com/forem/forem

目次
・Rubyのインストール
・docker docker-composeのインストール
・foremの起動

環境
OS:ubuntu 22.04
主なライブラリ:docker ruby 

## ruby のインストール
rubyで書かれているようでインストールしないといけないです。
[この記事](https://qiita.com/kerupani129/items/77dd1e3390b53f4e97b2)を参考にさせていただきました。

上記の記事からrubyのインストールを行ってください。

変更点：ruby v3.3.0
以下のコマンドを入力
```
rbenv install 3.3.0
rbenv global 3.3.0
```

## docker docker-composeのインストール
[この記事](https://qiita.com/kerupani129/items/77dd1e3390b53f4e97b2)を参考にさせていただきました。
上記の記事からdocker docker-composeをインストールしてください。

以下のようなエラー対処として[この記事](https://qiita.com/Muusann/items/93918a1e78130e46cd0e)を参考にさせていただきました。
```
"Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied"
```

## foremの起動
[forem公式](https://developers.forem.com/getting-started/installation/containers#docker)の方法を使わせていただきました。
foremをgitから取得
```
git clone https://github.com/forem/forem.git
cd forem
```
bundlerのバージョンを合わせます。
```
gem install bundler -v 2.4.17
```
foremのセットアップ
```
gem install dip
dip provision
dip rails s
```
これでローカルでの起動が終了しました。お疲れ様です。
リンクはおそらく 0.0.0.0:3000 で確認できると思います。

調子が良ければ https や利用方法をまとめたいと思います。

# 参考資料

https://qiita.com/kerupani129/items/77dd1e3390b53f4e97b2

https://qiita.com/nanbuwks/items/0ba1d13b3cd27e5c6426

https://qiita.com/Muusann/items/93918a1e78130e46cd0e

https://developers.forem.com/getting-started/installation/containers#docker

https://github.com/forem/forem
OpenAI GYMでFrozen Lakeをrenderする際のエラー解決方法

Frozen Lakeをrenderする際に下記エラーが発生する。
```
elf_img = pygame.transform.scale(elf_img, elf_dims)
TypeError: integer argument expected, got float
```
下記のようにFrozenLakeの元ファイルの302-303行目をintでキャストすることで解決する。
``` diff_ruby:\gym\envs\toy_text\frozen_lake.py
# prepare images
last_action = self.lastaction if self.lastaction is not None else 1
elf_img = self.elf_images[last_action]
elf_scale = min(
-    small_cell_w / elf_img.get_width(),
+    int(small_cell_w / elf_img.get_width()),
-    small_cell_h / elf_img.get_height(),
+    int(small_cell_h / elf_img.get_height()),
```
How to use T265(realsenset265の環境構築)

# 動作環境
* ubuntu20.04
* ROS2 foxy
* kernal 5.11
* realsense-ros 4.51.1
* realsense SDK 2.51.1
# realsense SDK の Build
昔のSDKを使うためpipでinstallせずに自力でソースコードからbuildします。以下のGitHubからソースコードをとってきてください。[librealsense v2.51.1](https://github.com/IntelRealSense/librealsense/tree/v2.51.1)
* ubuntuを更新する
```
sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
```
* librealsenseルート ディレクトリに移動して、次のスクリプトを上から順に実行します。
接続されているインテル RealSense カメラはすべて取り外します。
```
sudo apt-get install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev at
```
```
sudo apt-get install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev at
```
```
./scripts/setup_udev_rules.sh
```
```
./scripts/patch-realsense-ubuntu-lts.sh
```
* librealsenseルート ディレクトリに移動して実行します。
```
mkdir build && cd build
```
* buildを実行する。(上から順に実行)
```
cmake ../
```
```
sudo make uninstall && make clean && make && sudo make install
```
# realsense-ros の導入
* [realsense-ros](https://github.com/IntelRealSense/realsense-ros/tree/4.51.1)をGitHubから持ってきてros2_wsに置く。
```
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src/
```
```
git clone https://https://github.com/IntelRealSense/realsense-ros/blob/4.51.1
cd ~/ros2_ws
```
* 依存関係の解決
```
sudo apt-get install python3-rosdep -y
sudo rosdep init # "sudo rosdep init --include-eol-distros" for Dashing
rosdep update
rosdep install -i --from-path src --rosdistro $ROS_DISTRO --skip-keys=librealsense2 -y
```
おそらくこのままだとerrerが出るそのため足りない依存は手動で入れる。例えば以下のように入れる。
```
sudo apt install ros-foxy-xacro ros-foxy-diagnostic-updater
```
* buildする
```
colcon build
```
# 実行
端末を開く
以下を実行
```
source /opt/ros/foxy/setup.bash
cd ~/ros2_ws
. install/local_setup.bash
```
t265をつける
```
ros2 launch realsense2_camera rs_launch.py
```
rqtで可視化する
![IMG_7608.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531353/5d8b0df0-029a-697d-51b1-e3c987b447f0.jpeg)
    この時Reliability PolicyをBest Effortに変更する。するとトピック/camera/pose/sampleを読むことができる。
simple-git-hooksを使ってVSCodeのSource Controlでgit commitするときに"command not found"エラーが出た

## 問題
simple-git-hooksを導入してgit commit時にlinterを走らせようとしたのですが、VSCodeのGUIからcommitしたら`pnpm: command not found`エラーが出てかなり詰まりました。

私の場合、Dockerコンテナ内にてnvmでnodeのインストールを実施し、pnpmを使ってパッケージ管理をしていたので上記エラーが出ましたが、npmやyarnを使用している場合も同じようなエラーが出るのかなと思います。

## 解決方法
Dockerfile内に以下の記述を追加したら解決しました！
```dockerfile
# `~/.simple-git-hooks.rc`を作成してnvmを読み込む
RUN echo -e 'export NVM_DIR="$HOME/.nvm"\n'\
    '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"\n'\
    > $HOME/.simple-git-hooks.rc

# 環境変数を設定
ENV SIMPLE_GIT_HOOKS_RC="$HOME/.simple-git-hooks.rc"
```

simple-git-hooksで自動生成される`.git/hooks/pre-commit`内に`$SIMPLE_GIT_HOOKS_RC`を読み込む記述があるので、そこを通ることでnvmへのパスを通すことができます。
```sh:.git/hooks/pre-commit
#!/bin/sh

if [ "$SKIP_SIMPLE_GIT_HOOKS" = "1" ]; then
    echo "[INFO] SKIP_SIMPLE_GIT_HOOKS is set to 1, skipping hook."
    exit 0
fi

# ↓で$SIMPLE_GIT_HOOKS_RCが読み込まれる
if [ -f "$SIMPLE_GIT_HOOKS_RC" ]; then
    . "$SIMPLE_GIT_HOOKS_RC"
fi

pnpm run lint-staged
```

## 余談
ちなみに公式にGUIでのcommand not foundエラーが出たときの対処法が記載されているのですが、nvmの場合における記載がないので、解決するまでに苦労しました。。
https://github.com/toplenboren/simple-git-hooks?tab=readme-ov-file#i-am-getting-npx-command-not-found-error-in-a-gui-git-client

## 参考
以下の記事がcommand not foundとの戦いに終止符を打ってくれました。執筆者に感謝です！
https://www.gaji.jp/blog/2022/11/11/12096/
windowsのタスクスケジューラで指定時間を超過してもタスクが実行される話。

# はじめに
これまで、数々のプロジェクトでWindowsのタスクスケジューラを愛用し、何百にも及ぶタスク登録をしてきたので、**この設定で大丈夫だろう**と思っていたら躓いてしまったので忘備録として記録しておきます。

# やりたかったこと
**朝の9時から20時まで15分おきにバッチを実行する。**（これだけです）

## 登録したタスク
登録したタスクの設定はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/4921fbb2-eb8f-ca7e-7fb1-ad66a5dbcc4b.png)

詳細を確認しても**毎朝 9:00に起動 トリガーされた後、１日間の間 15分間ごとに繰り返します。トリガーの有効期限は 2024/05/04 20:00:00 までです。** とあり、望み通りの設定になっていると思っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/d7798a04-6eb3-de08-138e-7a8a4d653609.png)

## 指定時間を過ぎても動き出すタスク
テストを行い、朝の9時から15分毎に開始され特に問題なく実行されていました。
しかし、**停止時刻の20時を過ぎてもタスクが実行**され、停止する気配はありませんでした。

:::note info
**本記事の現象について**
[Microsoft Japan Windows Technology Support Blog](https://jpwinsup.github.io/blog/)に同様の現象が報告されており、また回避策も掲載されています。

* [タスク スケジューラで無期限に繰り返しを行うタスクを作成する際の注意点](https://jpwinsup.github.io/blog/2023/02/07/UserInterfaceAndApps/Repeat-task-indefinitely-issues/)
* [タスク スケジューラのトリガーにて有効期限が想定された動作とならない](https://jpwinsup.github.io/blog/2023/03/10/UserInterfaceAndApps/DoesNotWorkExpiration-DateTaskScheduler/)
:::

Windows Server 2016 以降とWindows 10 以降で発生する現象の様で、Microsoft Japan Windows Technology Support Blogにある記事を参考にタスクを修正しテストを行いましたが、望んだ挙動にならず**いつもの方法でタスク登録を行いました。**

## 回避策
指定時刻毎にタスクを作る事で回避しました。（実行回数分作る必要がありますが、一度作ってしまえばよいので）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/bfbc8c56-62d9-dfcd-5c2e-451d0bc22aea.png)
[Rust] Rust で Google の secret manager の値を取得する方法

## 概要

Qiita 初投稿です。GCP の Secret Manager の指定したキーの値を Rust を用いて取得したい方向けの記事になります。

筆者は元々、Rust で立ち上げた個人プロジェクトの .env ファイルに APIキーなどの情報を入れていましたが、セキュリティの観点から Secret Manager に引っ越しすることになりました。

## 前提

1. Rust がインストール済み。
2. Google Cloud にプロジェクトが作成されている。
3. サービスアカウントのキーの作成を既に行っており、json ファイルがダウンロード済み。

## 実装

「google_secretmanager1」クレートを利用するため、参考にした記事はこちらです。
https://docs.rs/google-secretmanager1/latest/google_secretmanager1/

今回の実装例では、MY_KEY の値を取得するサンプルになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111828/8ee3a2ce-2c35-fe49-8228-ea619d95a81a.png)

### .env

.env ファイルに下記を追加し、ご自身の環境に合わせます。

```
# minify したサービスアカウントのキーの json 
GOOGLE_APPLICATION_CREDENTIALS=
# Google Cloud のプロジェクトID 
PROJECT_ID=
```

### Cargo.toml

```rust
[dependencies]
dotenvy = "0.15"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
google-authz = "0.0.2"
google-secretmanager1 = "*"
hyper = "1.3.1"
hyper-rustls = "0.27.1"
```

### Secret Manager の指定したキーの値を取得する関数

get_secret_value 関数のパラメータには取得したいキーを入れます。

```rust
use std::env;
use secretmanager1::{
    SecretManager, oauth2, hyper, hyper_rustls, Error
};

// get_secret_value is a function that returns the secret value from the Secret Manager
pub async fn get_secret_value(secret_name: &str) -> Result<std::string::String, secretmanager1::Error> {
    let service_account_key = env::var("GOOGLE_APPLICATION_CREDENTIALS").unwrap();

    let service_account: oauth2::ServiceAccountKey = serde_json::from_str(&service_account_key).unwrap();

    let auth = oauth2::ServiceAccountAuthenticator::builder(service_account).build().await.unwrap();

    let hub = SecretManager::new(hyper::Client::builder().build(hyper_rustls::HttpsConnectorBuilder::new().with_native_roots().https_or_http().enable_http1().build()), auth);

    let project_id = env::var("PROJECT_ID").unwrap();

    let path = format!("projects/{}/secrets/{}/versions/latest", project_id, secret_name);

    let result = hub.projects().locations_secrets_versions_access(&path).doit().await;

    match result {
        Err(e) => match e {
             Error::HttpError(_)
            |Error::Io(_)
            |Error::MissingAPIKey
            |Error::MissingToken(_)
            |Error::Cancelled
            |Error::UploadSizeLimitExceeded(_, _)
            |Error::Failure(_)
            |Error::BadRequest(_)
            |Error::FieldClash(_)
            |Error::JsonDecodeError(_, _) => {
                println!("There was an error: {:?}", e);
                Err(e)
            }
        },
        Ok(res) => {
            let response = res.1;
            let value = response.payload.unwrap().data.unwrap();
            let secret_value = std::str::from_utf8(&value).unwrap();
            Ok(secret_value.to_string())
        }
    }

}

```

### 呼出側

```Rust
let secret_value = get_secret_value("MY_KEY").await;
println!("{}", secret_value.unwrap());
```

実行の結果として、Google の Secret Manager にある MY_KEY というキーの値がコンソール画面に表示されたら、無事成功となります。
【asdf】PHP 8.x をインストールするときに "No package '~~~' found" と出てめんどかったのでメモ

# はじめに
Ubuntu 22.04 で、asdf を使って PHP のバージョン管理をしようと思ったが、
`asdf install php latest` と実行したとき、無限にエラー吐いてめんどくさかったのでメモ。

# 環境
- Ubuntu 22.04

# 解決コマンド (一発用)
```sh
sudo apt install autoconf bison re2c pkg-config libxml2-dev libssl-dev libsqlite3-dev libcurl4-openssl-dev libgd-dev libonig-dev libpq-dev libreadline-dev libzip-dev
```

# エラーと解決コマンド
## No package 'autoconf' found
```
sudo apt install autoconf
```
## No package 'bison' found
```
sudo apt install bison
```

## No package 're2c' found
```
sudo apt install re2c
```

## No package 'pkg-config' found
```
sudo apt install pkg-config
```

## No package 'libxml-2.0' found
```
sudo apt install libxml2-dev
```

## No package 'openssl' found
```
sudo apt install libssl-dev
```

## No package 'sqlite3' found
```
sudo apt install libsqlite3-dev
```

## No package 'libcurl' found
```
sudo apt install libcurl4-openssl-dev
```

## No package 'gdlib' found
```
sudo apt install libgd-dev
```

## No package 'oniguruma' found
```
sudo apt install libonig-dev
```

## Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path
```
sudo apt install libpq-dev
```

## Please reinstall readline - I cannot find readline.h
```
sudo apt install libreadline-dev
```

## No package 'libzip' found
```
sudo apt install libzip-dev
```
【CSS】訪問済みリンクにスタイルを適用する方法

`:visited`擬似クラスを使用すると訪問済みリンクにスタイルを適用できます。

```css
a:visited {
   color: red;
}

```

## 参考

https://developer.mozilla.org/ja/docs/Web/CSS/:visited

https://developer.mozilla.org/ja/docs/Web/CSS/Privacy_and_the_:visited_selector
3・ここに書く事は特になしの一日

英語の勉強をめちゃくちゃして、ジムに行って、バイトに行ったそんな一日！
プログラミングしてない人の日記になっちゃってるなぁ（笑）
まぁ、私が触っているのはHTMLなんで詳細に言えばプログラミングではないらしいんだけどね
Kaggle学んだことメモ

Kaggleで学んだことをメモしていきます。
Dicision tree
    説明変数（特徴量）から、モデルを構築
    モデル構築には、sklearnを使用
    データは、モデル構築データとValidationデータに分けておくが、これもsklearnを使用
    モデル構築後、Validationするが、予測精度が悪いことがある
    これは、モデル構築データに合わせすぎたため（overfitting)
    その逆を、Underfitting
    MAE（Meas absolute error）をsklearnで計算し、値が一番小さいものが最適なtreeの深さ
    その最適なtreeの深さを使用して、モデルを再構築
    ★random forestについて記載予定

    
    
    参照：https://www.kaggle.com/learn/intro-to-machine-learning

:::note info
sklearnの使い方は覚えられないので、実際に使用する際は検索必要そうです。
:::


/pythonでのメモ
```
#dictionary作成
lista = [1,50]
dictionary = {a : a+100 for a in lista}
print(dictionary) #{1: 101, 50: 150}

#keyの取り出し
key = min(dictionary, key=dictionary.get)
print(key)#1
```
【TryHackMe】Web Application Security：Walkthrough

# 概要

TryHackMe「Web Application Security」のWalkthroughです。

https://tryhackme.com/r/room/introwebapplicationsecurity

# Task1

## **Q1**.*What do you need to access a web application?*

**A**.**Browser**

# Task2

## **Q1**.*You discovered that the login page allows an unlimited number of login attempts without trying to slow down the user or lock the account. What is the category of this security risk?*

**A**.**Identification and Authentication Failure**

## **Q2**.*You noticed that the username and password are sent in cleartext without encryption. What is the category of this security risk?*

**A**.**Cryptographic Failures**

# Task3

## **Q1**.*Check the other users to discover which user account was used to make the malicious changes and revert them. After reverting the changes, what is the flag that you have received?*

**Hint**.*On the site on the right, click "Your Activity" and try to enter numbers between 5 and 10 instead of 11 in the user_id=11.*

`View Site`をクリックしサイトを開きます。

`Your Activity`タブへ移動しURLに注目するとユーザーIDらしきものが使用されています。

![task3 q1 my account.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/6965a0da-9f67-287a-33be-a24a13b31cca.png)

この数字を操作することで他のアカウントにアクセスできる可能性があります。

ヒントを頼りに5~10まで見ていくと、IDが9の興味深いユーザーが見つかりました。

![task3 q1 account id 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/d700758a-8543-b872-0e3e-15e175f83d02.png)

`Revert`ボタンをクリックしてデータを基に戻すことができるようなので、全てクリックしていくとフラグゲットです。

![task3 q1 get flag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9390750a-bdb4-0190-9ad9-949a3b37ab10.png)

**A**.**THM{IDOR_EXPLORED}**