OmniAICreator/Qiita-1.07M huggingface dataset:
【><>】ABC394のA~D問題を><>で解く


# はじめに

こんにちは，この記事ではABC394のA問題から，D問題までを`><>`で解くときの解法を解説します．

ちなみに私はABC394で，コンテスト中にA問とC問を`><>`で提出できました．
今回のように`><>`にとって解きやすい問題でないと，コンテスト中に`><>`で問題を提出するのは，私にとってなかなか難しいです．もっと精進したいところですね．

# A問題

↓問題リンク

https://atcoder.jp/contests/abc394/tasks/abc394_a

与えられた文字列$S$から，「2」以外の文字を削除して出力する問題です．
`><>`的には入力を受けとって，

 - `-1(EOF)` だったら終了
 - `2` だったら出力
 - それ以外だったら無視

するだけなので，非常に簡単です．

```fish:A問題
i:0(?;"2"=?2l?n
```

https://atcoder.jp/contests/abc394/submissions/63055939

実行時間 : 1ms

`i:0(?;`は入力を受けとり，それを複製して`0`未満であるか確認し，そうであったら終了する処理．
`"2"=?2l?n`はスタックに残った値が`"2"`であれば出力する処理です．

# B問題

↓問題リンク

https://atcoder.jp/contests/abc394/tasks/abc394_b

文字列が$N$個当たられるので，長さが昇順になるように並べ，結合して出力する問題です．
変数を一つのスタックで処理することしかできない`><>`としては，文字列のソートはかなりハードです．
そこで今回の問題の制約が，「文字列の長さは全て異なる」「文字列の長さは50以下」「$2 < N < 50$」であることを利用して解いていきます．

まず，文字列とその長さをスタックに格納します．例えば入力が「3 tc oder a」ならば，スタックが「t c 2 o d e r 4 a 1」となるように追加していきます．

次に，1~50までの数字について，スタック内に一致するものがあるか走査し，存在していれば`[`命令で文字列を丸ごと新しいスタックにコピーして出力します．

以下のコードでは出力した文字列を適宜消去することで，プログラムの終了条件が「スタックが空になった時`l0=?;`」となるようにしています．

```fish:B問題
0& ia=?v 20.
       > 02.
> i : 0(?v : a=?v
         >04.   > ~ l &-l& 02.
 ~ &~ 1& 05.
 l0=?; l> :0=?v $ : &:& =?v } 1-                         v
        ^     > ~ &1+& v  > $ ~ [ r > l0=?v o          v v
        ^              > 05.        ^     > ] &1+& 05. v v
        ^                           ^                  < v
        ^                                                <
```

https://atcoder.jp/contests/abc394/submissions/63101902

実行時間 : 34ms

今回は最大でも$N=50$程度なので十分実時間内に処理出来ましたが，かなり遅い処理を使っているので，もう少し$N$が大きい場合は考える必要がありそうです．

# C問題

↓問題リンク

https://atcoder.jp/contests/abc394/tasks/abc394_c

与えられた文字列$S$から，`WA`を`AC`に置換する問題です．
ただし，例えば`WWA`のような文字列は`WWA`→`WAC`→`ACC`のように置換されるので，文字列の先頭から愚直に置換するだけではうまくいきません．しかし，`><>`的には先頭から愚直に置換していきたいところです．

そこで，`i`で`W`を受けとった場合，その数をカウントしておき，続けて`A`を入力で受け取った場合に，カウントした数分の`C`を出力すれば，文字列を遡ることなく置換できます．
`WWWC`などは置換されないため，`A`以外の入力を受けとった場合，カウントした数分`W`を出力します．

以下のプログラムでは，`W`の数をレジスタに記録しています．

```fish:C問題
 0& 01.
 i :0(?v :"W"=?v :"A"=?v 07.
       > 09.   > 03.   > 05.
> ~ &1+& 01.

> ~ "A"o & >    :?v ~ 0& 01.
           ^o"C"-1<
> & >    :?v ~ 0& o 01.
    ^o"W"-1<
 ~ & >    :?v ;
     ^o"W"-1<
```

https://atcoder.jp/contests/abc394/submissions/63061402

実行時間 : 129ms

$S$の長さが$3 \times 10 ^ 5$の割には早く解けているので，`><>`適性の高い問題でした．

# D問題

↓問題リンク

https://atcoder.jp/contests/abc394/tasks/abc394_d

`()`，`[]`，`<>`で構成された文字列が，問題文で定義されるところの「カラフル括弧列」であるかを確かめる問題です．
スタックを利用して解く問題なので，`><>`にとっては非常に解きやすい問題です．(コンテスト中に提出できませんでしたが...)

```fish:D問題
 i :a=?v :")"=?v :"]"=?v :">"=?v
       >02.    >04.    >06.    >08.
 ~ l?v "seY"ooo;
     > "oN"oo;
 ~ l?!v "("=?!v 00.
      >       > "oN"oo;
 ~ l?!v "["=?!v 00.
      >       > "oN"oo;
 ~ l?!v "<"=?!v 00.
      >       > "oN"oo;
```

https://atcoder.jp/contests/abc394/submissions/63091748

実行時間 : 63ms

結構簡単だったので，コンテスト中に出せなかったことが悔やまれます．

# 終わりに

私事ではありますが，最近多忙だったため，あまりAtCoderのコンテストに参加できていませんでした．今回，久しぶりに`><>`を使ってプログラムができたので大変満足しました．
今回のように長い文字列を先頭から処理していく問題は`><>`的に解きやすいので，また似たような問題があれば解説記事を書きたいと思います．
Linuxリダイレクトまとめ

## はじめに
リダイレクト記法をコマンド例付きでまとめました。
|リダイレクト  |説明  |
|---|---|
|`>`  |標準出力の出力先を指定(上書き)  |
|`>>`  | 標準出力の出力先を指定(追記)  |
|`<`  |標準入力の入力元を指定  |
|`<<`  | 終端文字の指定|



## `>`　標準出力の出力先を指定（上書き）
コマンドの標準出力の出力先はデフォルトではディスプレイになっている
```terminal
~$ echo hogehoge
hogehoge
```
リダイレクト`>`によって標準出力の出力先をファイルに指定することができる
リダイレクト`>`ではファイルが上書きされる
```terminal
~$ cat test.txt 
hogehoge

~$ echo coffee > test.txt

~$ cat test.txt 
coffee
```
## `>>`　標準出力の出力先を指定（追記）
リダイレクト`>>`ではファイルに追記される
```terminal
~$ cat test.txt 
coffee

~$ echo fugafuga >> test.txt

~$ cat test.txt 
coffee
fugafuga
```

## `<`　標準入力の入力元を指定
標準入力の入力元はデフォルトではキーボードになっている
下の例では`tr`コマンドによってキーボードで入力した`hogehoge`の`h`が`p`に置換されて`pogepoge`になっている
```terminal
~$ tr 'h' 'p'
hogehoge　<<< キーボードから入力
pogepoge
```
リダイレクト`<`によって標準入力の入力元をファイルに指定することができる
下記の例では`test.txt`を`tr`コマンドの標準入力に入力している
```terminal
~$ cat test.txt 
handa
hogehoge

~$ tr 'h' 'p' < test.txt 
panda
pogepoge
```
## `<<`　終端文字の指定
`<<`によって終端文字を指定できる
その終端文字が入力されるまで標準入力に入力することができる
```terminal
~$ tr 'h' 'p' << stop                       
hoge <<< キーボードから入力
hoge <<< キーボードから入力
stop <<<　指定した終端文字
poge 
poge
```
【電脳少女プログラミング2088 ─壊レタ君を再構築─】Python初心者がやってみた（データセンター編）

## はじめに

前回の記事で「郊外のスラム街」をクリアして、今回は「データセンター」をクリアしたので書こうと思います。

難しくてまだクリアできてない方などに参考にしてもらえると嬉しいです。

https://paiza.jp/entry/denno2088_qiita

## 【問題】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526750/bc120a90-9906-40af-b2c0-80479f22fcc4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526750/a0f001db-d750-431e-bd62-42db7c0af04f.png)

問題文中の参考リンク：
> [新・SQL入門編2: SELECT文を理解しよう](https://paiza.jp/works/sql/new-primer/sql-new-primer-2) 
> [▶ 【解答例つき】新作ゲーム『電脳少女プログラミング2088-壊レタ君を再構築-』](https://paiza.hatenablog.com/entry/2025/01/24/120000)

## 解答

今回はMySQL指定の問題でした。

```sql:解答
-- Let's チャレンジ！！
SELECT id, name from person
```

## コード解説

上のコードの解説をすると

まず`SELECT`文は、データベースから必要な情報を取得するための命令文です。`SELECT`の後に探したいカラム名（複数探す場合は「,」で区切る）、`from`の後に探したいカラムがあるテーブル名を指定します。


これを日本語にすると
「`person`テーブルから`id`と`name`を取り出してください」という命令になります。

***

こんな感じのコードで問題を解くことができました。

## 最後に

記事を最後までお読みいただきありがとうございます！
今回はMySQL指定の問題で、私はSQLのコードをそこまで書いたことがなかったので苦戦しました。次回は「ギャングのアジト」をやろうと思っています。次回も見てくださると嬉しいです。

ではまた他の記事で会いましょう！またねーヾ(*´∀｀*)ﾉ

## 参考にさせていただいたサイト
> [▶ 【解答例つき】新作ゲーム『電脳少女プログラミング2088-壊レタ君を再構築-』でPythonとSQLを学んでみた！](https://paiza.hatenablog.com/entry/2025/01/24/120000?_gl=1*g6krup*_gcl_au*ODk2NDkxNDQyLjE3NDAyODQxOTM.*_ga*NTAzNDgzMjguMTc0MDI4NDE5Ng..*_ga_X4K98BR9EP*MTc0MDMxNDc5OC40LjEuMTc0MDMxNjQ3My41OC4wLjA.)

https://qiita.com/mizusawa_slj/items/353560b9fa8c5d558a28
機械学習の予測式は線形回帰と捉えられる。

## はじめに
機械学習に関するちょっとしたメモ書きです。
傾きが(従属変数と独立変数の共分散)/(独立変数の分散)であるということを思い出すと、機械学習の予測式が理解しやすくなる、という話です。メモ書きなので結構適当ですが、理解の助けになれば幸いです。

## 最小二乗解の理解
[こちら](https://manabitimes.jp/math/942)のサイトにあるように、$y=ax+b$というモデルにおける$a,b$の最小二乗解$\hat{a},\hat{b}$はそれぞれ次の形で与えられます。

```math
\begin{align}
\hat{a}&=\frac{Cov(x,y)}{Var(x)}\\
\hat{b}&=\mu_y-\hat{a}\mu_x
\end{align}
```
ここで$\mu_y,\mu_x$は$y,x$それぞれの平均を表しています。やや気持ち悪い形をしていますが、$y=ax+b$の中にそれぞれを代入し、形を整えると…
```math
(y-\mu_y)=\frac{Cov(x,y)}{Var(x)}(x-\mu_x)
```
これは傾きが$\frac{Cov(x,y)}{Var(x)}$となる線形式を$(\mu_x,\mu_y)$を通るように移動させただけであり、思いのほか大したことを言っていないことが分かります。
ここで重要なのは、線形予測をする際、その傾きは(従属変数と独立変数の共分散)/(独立変数の分散)で与えられるということです。以下では、(従属変数と独立変数の共分散)/(独立変数の分散)という量が機械学習の予測式でよく出てくること、また、それを傾きとして捉えると予測式がより理解しやすくなることを見ていきます。

## 条件付多変量正規分布
n次元多変量正規分布に従う$\mathbf{x}\sim MVN(\mathbf{0},V)$に対して、ベクトル$\mathbf{x}$を二つに分割し$\mathbf{x}_1,\mathbf{x}_2$とします($\mathbf{x}=(\mathbf{x}_1,\mathbf{x}_2)$)。この時$\mathbf{x}_1|\mathbf{x}_2$が従う分布は条件付多変量正規分布と呼ばれ、その分布は解析的に導くことができます。詳しい計算は[こちら](https://qiita.com/m1t0/items/12b58f3583eab6e1e05c)に譲りますが、その分布の期待値は次の式に従うことが知られています。
```math
\mu_{x_1|x_2}=\mu_{x_1}+V_{x_1x_2}V_{x_2x_2}^{-1}(x_2-\mu_{x_2})
```
ここで、$V_{x_1x_2}V_{x_2x_2}^{-1}$が(従属変数と独立変数の共分散)/(独立変数の分散)であることに気づけば、先ほどと同じ単純な線形回帰式であることが分かります。

## カーネル法による予測
パターン認識と機械学習(prml)の第6章p3にはカーネル法による線形回帰の予測式が次のように書かれています。
```math
y(\mathbf{x})=\mathbf{k}(\mathbf{x})^T(\mathbf{K}+\lambda\mathbf{I})^{-1}\mathbf{t}
```
ここで$\mathbf{t}$は$y$の観察値、$\mathbf{k}(\mathbf{x})$は$k_n(\mathbf{x})=k(\mathbf{x}_n,\mathbf{x})$を要素に持つベクトル、$\mathbf{K}$は$n$行$m$列の要素を$k(\mathbf{x}_n,\mathbf{x}_m)$とする行列を表しています。
さて、少し飛躍はありますが、$\lambda$を誤差分散とすると、$(\mathbf{K}+\lambda\mathbf{I})$は$y$の全分散であり、$\mathbf{k}(\mathbf{x})$は$\mathbf{t}$と$y$の共分散であると考えることができます。さらに$\mathbf{t},y$の平均値が0であるとするならば、この予測式は線形回帰の式と全く同じ形をしていることが分かります。

## 推定可能関数の予測式
ここでは詳しく書きませんが、佐々木義之さんの「変量効果の推定とBLUP法」に出てくる推定可能関数$\mathbf{a}^T\mathbf{y}$の予測式もよくよく見ると、(従属変数と独立変数の共分散)/(独立変数の分散)が出てきており、線形回帰式と全く同じであることが分かります。詳しい説明は[こちら](https://qiita.com/KimuraSoh/items/f9a7212a22ddf5fcb655)に譲り、ここでは結果の予測式のみを載せておきます。気になる方は記事をご覧ください。

```math
{\begin{align}
\mathbf{a}^T\mathbf{y}&=\mathbf{k}^T(X^TV^{-1}X)^{-1}X^TV^{-1}\mathbf{y}+C^TV^{-1}(\mathbf{y}-X(X^TV^{-1}X)^{-1}X^TV^{-1}\mathbf{y})
\end{align}\\
}
```
【壊レタ君を再構築】javaでSランク（思い出の屋上）を解いてみた

普段はWebアプリケーション開発をメインにしているエンジニアの私ですが、久しぶりに競技プログラミングの問題に挑戦してみました。今回はPaizaの最難関Sランク問題に取り組んだ経験を共有したいと思います。

※言語は慣れているjavaにしました

## 苦労した点と学び

普段の業務ではWebアプリケーションの開発が中心で、アルゴリズムの実装にはかなり苦戦しました。特に二分探索のような基本的なアルゴリズムも、恥ずかしながら実務では使う機会が少なく、生成AIの助けを借りながら学習を進めました。

「より効率的な解法があるはずだ」という思いは常にありましたが、まずは自分なりのアプローチで問題を解くことを重視しました。（完璧な解法を求めるよりも、実装して動くものを作ることを優先）

## 工夫した点

一番工夫したのは、結果の検証方法です。競技プログラミングの問題では、単純に「正解/不正解」の判定しか得られません。そこで、処理の過程を視覚的に確認できるテストコードを実装することにしました。

```java
// マップの状態を視覚的に出力
for (int i = 0; i < hMax; i++) {
    for (int j = 0; j < wMax; j++) {
        // trueなら黒点「●」、falseなら白点「○」を出力
        System.out.print(mapInfo[i][j] ? "●" : "○");
    }
    System.out.println();
}

```

このような視覚的な出力により、アルゴリズムの動作を段階的に確認することができ、デバッグも容易になりました。

検証用のコードを含む開発過程のものと、本番提出用にクリーンアップしたコードの両方をGitHubにアップロードしています。

■提出用

https://github.com/canta1sei/createJavaSource/blob/master/paizaJavaTest/src/theRooftopOfMemories/theRooftopOfMemories.java

■検証用

https://github.com/canta1sei/createJavaSource/blob/master/paizaJavaTest/src/theRooftopOfMemories/Main.java


## 新しい挑戦から得られたもの

時間はかかりましたが、最終的に問題を解くことができた時の達成感はありました。普段の業務とは異なる種類の問題に取り組むことで、新しい視点やアプローチを学ぶことができました。

また、久しぶりの競技プログラミングは純粋に楽しかったです。実務では味わえないパズルを解く感覚はゲームみたいで楽しいです。プログラミングの楽しさを再確認できました。

## 他感想

オープニングのストーリーの設定が凝っていてちょっと笑っちゃいました。

他の挑戦者のファイルサイズ見ると信じられないくらい小さくてびっくりしてます。

どう解いたか気になるのであとで見てみようと思います。
「電脳少女プログラミング2088」Dランク問題「カジノ」をコーディングしてみた

この記事では「電脳少女プログラミング2088 ─壊レタ君を再構築─」のDランク問題 カジノ の解答コードをResultとChatGPTを使ってリファクタリングしていきます。

https://paiza.jp/entry/denno2088_qiita

## 方針

- 各チップの「額面×枚数」を合計する
- 以下の順で処理：
    1. チップの額面リストを作成
    1. 標準入力から各チップの枚数を取得
    1. 合計金額を算出
    1. 合計金額を出力

```python
values = [1, 5, 10]
total = 0

for value in values:
    x = int(input())
    total += x * value

print(total)
```

Reference: [int()](https://docs.python.org/3/library/functions.html#int) | [input()](https://docs.python.org/3/library/functions.html#input) | [print()](https://docs.python.org/3/library/functions.html#print)

## 改善

ChatGPTを使って可読性や効率を意識してみる：

```python
chip_values = [1, 5, 10]
total_amount = sum(int(input()) * value for value in chip_values)
print(total_amount)
```

Reference: [sum()](https://docs.python.org/3/library/functions.html#sum)



改善点：

- 変数名の最適化
    -  `values` → `chip_values` ：チップの額面リスト
    -  `total`　→ `total_amount` ：合計金額
- forループから内包表記+`sum()` で一行にまとめた
- forループから組み込み関数の `sum()` 関数にまとめたことで処理速度が向上


## 終わりに

このイベントを通してコードをリファクタリングすることに慣れていきたい。あと、せっかくリファレンスを作成したので時間がある時に見返したい。
JavaScriptにおける厳密等価演算子 (===)と等価演算子 (==)の違い

# 厳密等価演算子
いわゆる、私たちがイメージしているイコールに近い。
オペランド、演算される値の型が違う場合は違うものとして扱われる。
# 等価演算子
厳密でなくいうと演算される値の型が違っても、ざっくり見た目が同じなら同じものとして扱われる。公式の説明で言うと、オペランド同士が違う場合は型変換が行われ比較される。

```JavaScript
console.log(1 == 1);
// これがtrueなのはわかる　

console.log("1" == 1);
// こちらもなんとtrue

console.log(0 == false);
// これまでtrue
```

その他の事例は以下
>https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Equality

# じゃあ逆に等価演算子の価値はなんなのか？をネットで探してみる　
## null と undefined をより簡単にチェックする場合
```JavaScript

if (value == null) {
  console.log(" null == null なら当然このメッセージが表示されるが、
  undefined == null でもtrueが返され
  このメッセージが表示されるため便利らしい");
}
```
ただこのためだけに利用する価値があるかは疑問。

## ユーザーが入力するとき、入ってくるものが数値だと分かりきっており数値に変換がめんどくさいとき。

```JavaScript
let inputNum = prompt('好きな数字を入れてね');
if (inputNum == 1) {
  console.log('あなたは１を入れましたね？');
}
```

ただこれも入力された値を数値に変換すれば良いだけな気がする。

## 感想
初学者はとりあえずルールが厳しい方を選んで使ってみる。使い慣れてどうしても使いたいときだけ、もう一方のルールがゆるい方を選べば良い気がする。
ミサカネットワークを見つけてしまった・・・

## ミサカネットワークを発見！
たまたま、speedtest.netで速度計測をしていたときのことでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/6211191f-301b-4267-b91c-7f765492d8d6.png)

Misaka Network ... ミサカネットワーク・・・だと！？Σ(￣□￣|||)

## 見つけた経緯
ESET というセキュリティソフトがありますが、この製品にはESET VPNというものがあります。
AWSやAzureなどのクラウドサービスを使用しているときに、国外からのアクセスだったらどうなるかといったテストにも使えるので契約しています。
今回、香港を指定してVPNを接続し、回線速度を計測しました。
すると、出てきたのが、Misaka Networkでした。

## ミサカネットワークとは
説明する必要はないでしょう。というか、知らない人は知らなくてもいいネタですね。
一応説明すると「とあるシリーズ」に出てくるもので、詳しくはこちらのWikiをご覧ください。

https://ja.wikipedia.org/wiki/%E5%A6%B9%E9%81%94

レールガンこと御坂美琴のクローンとして生まれた能力者シスターズは、御坂と同じ電気を操る能力を持ち、クローンのシスターズが電気信号ネットワークを構築することで生まれる回線、それがミサカネットワークということになります。
あくまでも小説やアニメの世界のお話し。
そうフィクションのはずだったのに。

## 実在したミサカネットワーク
https://www.misaka.io/

という会社ですが、調べてみると以下のような情報が得られました。

**会社概要**
- 所在地: アメリカ合衆国、デラウェア州ドーバー
- 業種: コンピュータシステム設計および関連サービス
[情報元](https://www.dnb.com/business-directory/company-profiles.misaka_network_inc.4c2d53227628977ea9060bfd263df403.html)

**提供サービス**
- クラウドインフラストラクチャ: 低遅延のクラウドサーバー、高速ネットワーク接続、スケーラブルなリソース管理
- マネージドDNS: 高可用性のDNSサービス、グローバルなDNSキャッシング
- パフォーマンスモニタリング: リアルタイムのパフォーマンス分析、アラート通知システム

なんと東京にもデータセンターを持っているようでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/afa4471c-cebc-4006-9af1-76521b1f31c2.png)


## 感想
あくまでも同じ名前というだけで、決してあのミサカネットワークからインスピレーションを受けているとは限りません。でも知っている人にはそうとしか思えない気分です。社名に使用するセンスには驚きました。

インフラの世界というは、自分も含め専門外の人たちには見えない部分なのですが、私たちの世界を支えるとても重要なものです。
海底ケーブル、衛星通信、多くのインフラがありますが、その中についにミサカネットワークも加わっていた現実に驚愕した・・・というお話でした(笑)

 
---
**補足**
※この記事は、見つけたときの衝撃がすごかったので記したものです。
特に他意はありません。
広告でもなく、取り上げている会社とも何も関係ありません。
pythonデータ型にまとめ

# はじめに
pythonの勉強がてら備忘録的にデータ型をまとめてみることにしました

# 文字列(str)
「''」もしくは「""」で囲んで記述します
``` python3
data = "text"
print(type(data)) #<class 'str'>
```
# 整数(int)
整数用のデータ型で、演算子を使用し計算を行うことができます
``` python3
data = 12345
print(type(data)) #<class 'int'>

data = -12345
print(type(data)) #<class 'int'>
```
# 浮動小数点(float)
小数点を含む数値で、intと同様演算子を使用し計算を行うことができます
``` python3
data = 12.345
print(type(data)) #<class 'float'>

data = -12.345
print(type(data)) #<class 'float'>
```
# 複素数型（complex）
複素数を表すことが可能で「a+bj」の形式で記述し表現できます

``` python3
data = 6 + 5j
print(type(data)) #<class 'complex'>
```
# ブール(bool)
TrueかFalseを格納することが可能で、フラグ管理等で使用可能です
``` python3
data = True
print(type(data)) #<class 'bool'>

data = False
print(type(data)) #<class 'bool'>
```

# 配列(list)
他の言語と同様、値とその順序を保存します
``` python3
data = [0,1,2]
print(type(data)) #<class 'list'>
```

# タプル(tuple)
配列同様値とその順序を保存しますが要素の変更が出来ないデータ型です
``` python3
data = (0,1,2)
print(type(data)) #<class 'tuple'>

data[0] = 100 #これはエラー
```

集合(set)
一意のデータを順序なしで保存します
``` python3
data = {1, 2, 3}
print(type(data)) #<class 'set'>
```

# 辞書(dictionary)
キーと値をセットで保存します、JSONのように入れ子のデータを作成することもかのうです

``` python3
data = {"data_str": "text", "data_int": 12345}
print(type(data)) #<class 'dict'>

```
怠惰なので環境構築から何もないページの公開までやる

## 投稿をし忘れてました
気が重くて何もしなかった結果4日放置していたQiita君でした。

ちょっとやる気力が出たのでやります。

## ポートフォリオになるサイトの公開をして義務感を強めよう
さて今回作成したサイトはこちらです。

https://portfolio-3pp.pages.dev

見ての通り何もない状態なのでネットの海にぷかぷかと浮いたプラスチックごみみたいになってます。
きっと未来の僕がいい感じのサイトに仕上げてくれるでしょう。

## Astroで環境の構築
さて今回使っていくのはAstroです。

ではまず `npm create astro@latest`を実行しましょう。
```
$ npm create astro@latest
Need to install the following packages:
create-astro@4.11.0
Ok to proceed? (y)
```

なんか実行していいんか？みたいなのでましたね。いいからセットアップして！！！
```
astro   Launch sequence initiated.
dir   Where should we create your new project?
```
ディレクトリどうする？的なやつですね。適当に入力しましょう。
```
tmpl   How would you like to start your new project?
```
テンプレート使う？なんもないの使う？みたいなこと聞いてくるので`minimal starter`で

```
deps   Install dependencies?
...
git   Initialize a new git repository?
...
```
この辺りはとりあえずイエスで。依存関係とかgitとか細かく設定したい人はするといいです。

```
    ✔  Project initialized!
       ■ Template copied
       ■ Dependencies installed
       ■ Git initialized
next   Liftoff confirmed. Explore your project!
```
完成したっぽいです。
Astroはいったんこれでいいかな。
この後は作成したディレクトリに移動して`npm run dev`とかすれば開発用サーバで見れるようになるので好きにするといいです。

後githubにもリポジトリ作ってpushしておきます。

## Cloudflareで公開する。
公開のためのサーバーはCloudflareにします。

手順に従ってgithubと連携していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013677/d730b537-48df-45ee-8b74-1177112eecdb.png)

gitに接続を押して必要なことを載せていったら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013677/c65a0cf2-b898-4b8e-b77c-8b2024345f51.png)
後はデプロイを待つだけ。

もっといろいろ触るようになってから細かい話ができればなと思います。

## さて今回はここまで
とりあえずAstroのデフォページで公開までもってけたので次回はページの構成とか考えていこうと思います。
行き当たりばったりで進めていくのでどうなることやっ
【電脳少女プログラミング2088 ─壊レタ君を再構築─】Python初心者がやってみた（郊外のスラム街編）

## はじめに

前回の記事で「ネオン街の裏路地」をクリアして、今回は「郊外のスラム街」をクリアしたので書こうと思います。

難しくてまだクリアできてない方などに参考にしてもらえると嬉しいです。

https://paiza.jp/entry/denno2088_qiita

## 【問題】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526750/8ef194e8-f1e2-4fa7-b6d1-9ea1a20370eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526750/ea4a0198-ee13-485d-b4a4-f922588d76e5.png)

## 解答

今回もPython3を選択して書いてみました。

```python:解答
# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ！！
input_line = int(input()) # nを整数として受け取る

input_line = int((input_line / 2) + 100) # input_lineを２で割って、１００足して、整数としてinputlineに代入

print(input_line) # input_lineを表示
```

## コード解説

上のコードの解説をすると

値段を整数として`input_line`に代入

```python:４行目
input_line = int(input())
```

***

`input_line`を２で割って１００を足した数を整数として`input_line`に代入

```python:６行目
input_line = int((input_line / 2) + 100)
```

***

`input_line`を表示

```python:８行目
print(input_line)
```

***

こんな感じで上のコードで問題を解くことができました。

## 最後に

記事を最後までお読みいただきありがとうございます！
今回は結構簡単に解くことができました。次回は「データセンター」をやろうと思っています。次回も見てくださると嬉しいです。

ではまた他の記事で会いましょう！またねーヾ(*´∀｀*)ﾉ
[Python] sort()とsorted()の違い

# 1. 結論 - それぞれの関数の違い
### 違いその１ : 戻り値
* sort() → "None"が返ってくる
* sorted() → 並び替えられた状態の新しいListが返ってくる

### 違いその２ : 扱えるオブジェクトの種類
* sort() → Listのみ
* sorted() → Listを含むiterable*オブジェクト

![スクリーンショット 2025-02-23 21.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019167/ecee6872-a7c3-45c0-bd99-e91fc2eb7c93.png)
出典 : [Pythonドキュメンテーション](https://docs.python.org/3.13/howto/sorting.html)


### 補足 : iterableオブジェクトとは?


### iterable
An object capable of returning its members one at a time. 
Examples of iterables include all sequence types (such as list, str, and tuple) and some non-sequence types like dict, file objects, and objects of any classes you define with an \_\_iter\_\_() method or with a \_\_getitem\_\_() method that implements sequence semantics.

![スクリーンショット 2025-02-23 21.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019167/e778bfd2-7459-4329-b4e7-f6f9e23846ea.png)
出典 : [Pythonドキュメンテーション](https://docs.python.org/ja/3.13/glossary.html#term-iterable)
<br/>

自分なりに日本語訳してみた。

### iterable
要素を1つずつ取り出し、呼び出し元に渡すことができるオブジェクトのこと。例としては、要素の並び順を管理するList、str、tupleをはじめ、要素の並び順を管理しないdict、file objects、_ _iter_ _()、または_ _getitem_ _()によって順序管理を実装されたクラスのことが挙げられます。

### 2. 検証
![スクリーンショット 2025-02-23 22.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019167/c6d276cb-9a25-413e-8df4-86c5619a49f4.png)
*Paizaで提供されているWeb上の開発環境で検証を実施しました。
LILYGO T-Deck Plus　④：Tulipのファームウェアを入れてみる

# はじめに

[前回](https://qiita.com/inachi/items/c79efa4484c92de49110)においてT-Deck用CircuitPythonでキーボード入力をできるようにした後、[GT911](https://github.com/rgrizzell/CircuitPython_GT911)のドライバも入れて、タッチスクリーンも使えるようにしていました。

あとはキーボード入力の課題に取り組もうかと、いろいろ調査している中で、[Tulip for the T-Deck](https://github.com/shorepine/tulipcc/tree/main/tulip/tdeck)というものを見つけました。この Tulip を T-Deck に入れてみます。

# Tulip Creative Computerとは

詳しくは [Tulip CC のサイト](https://tulip.computer/)を見てもらうことにして、MicroPython をベースにして、主にミュジック関係に使うことを目的とした環境です。元々は専用ハードウェア用に作られたもののようですが、[Web版 や　デスクトップ版](https://github.com/shorepine/tulipcc/blob/main/docs/tulip_desktop.md)もあります。

この Tulip が T-Deck にも移植されてます。音楽系の機能を使わないにしてもMicroPythonをポケコン的に使うにはよい環境みたいです。

# Tulip ファームウェアのインストール

Tulipのファームウェアは、[リリースページ](https://github.com/shorepine/tulipcc/releases)に `tulip-full-TDECK.bin` があるのでダウンロードします。

ファームウェアのインストールにはESP系定番の[esptool.py](https://docs.espressif.com/projects/esptool/en/latest/esp32/)を使います。

T-DeckをPCにUSBケーブルで繋いで、トラックボールを押しながら電源を入れてブートローダモードにします。その上で以下を実行することでファームウェアをインストールできます。

```bash
$ esptool.py --chip esp32s3 --port <シリアルポート> erase_flash
$ esptool.py --chip esp32s3 --port <シリアルポート> write_flash 0x0 tulip-full-TDECK.bin
```

# 使ってみる。

リセットするか電源を入れなおすと MicroPython の REPL が起動します。

![1CF7FE39-7FD8-4000-A3CE-093B018CD7E4_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/93838d70-503c-4f03-8005-a6840751bf6a.jpeg)

内蔵キーボードは最初からネイティブに対応しています。左シフトとマイク/0を同時に押すことで Ctrl 入力にも対応しています。

キーに刻印のない記号やタブも alt-c の後に入力することで対応しています(憶えるのがやや難儀ではありますが)。

| キー | alt-c 後に入力される文字 |
|------|------|
| q	| ~	|
| w	| %	|
| e	| \| |	
| r	| % |
| t	| {	|
| y	| }	|
| (	| [	| 
| )	| ]	| 
| u	| ^	|
| i	| <	|
| o	| >	|
| p	| =	|
| g	| \	|
| k	| `	|
| \<space> | \<tab> |

カーソル移動や history にはトラックポイントを使います。

右下の三本線のところをタッチするとメニューが現れます(ということはタッチスクリーンにも対応しているということです)。

![CA88C219-1D35-498C-8FF2-3942374293D1_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/fdbc6792-f435-4f57-b9e1-1d61ee5b033e.jpeg)

簡易エディタもありますので、T-Deck上でMicroPythonプログラムが組めます。メニューからEditorを選ぶか、edit()関数を実行することで起動できます。

![2DCE52B9-7BC9-440F-AC52-4C05E13092FC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/dc853ec6-16eb-4b75-8987-ed44906e24c5.jpeg)

* セーブするには Ctrl-X
* 別名でセーブするには Ctrl-O
* 検索は Ctrl-W
* ファイルを読み込むには Ctrl-R

終了するには画面右上にある赤い電源印をタッチします。

# PCとのファイル転送

１つ重大な問題があって、しばらく放置してました。

それはPCとUSBで繋いで、シリアル経由でファイルを転送しようとするとリセットがかかってしまってうまくいかないことでした。

たとえば、PC上の example.py を main.py として MicroPython の動いているボードに転送する場合、いつも次のようにしているのですが、

```bash
$ mpremote cp example.py :main.py 
```

これを T-Deck でやるとなぜかリセットがかかってしまい、転送がうまくいきません。試しに ampy でも試してみたのですが、やはりダメでした。

なんとかリセットかからないように転送する方法はないかと調べてみたら、ちゃんと[ドキュメントに書いてありました](https://github.com/shorepine/tulipcc/blob/main/docs/getting_started.md#using-mpremote)。次のように `resume` を付加して、自動リセットを抑制することによりファイルの転送ができるようになりました。

```bash
$ mpremote resume cp example.py :main.py
```

# おわりに

MicroPython ポケコンとして、なかなかに理想的なものなので、しばらく使っていきたいと思っています。

GPSやLoRAが未サポートですが、当面、使うことはないと思うので問題なしです。SDカードは早くサポートして欲しいですが、USB経由でPCとファイルのやりとりは可能なので、それほど不自由はしません。
WSL DockerのUbuntuでlibc-binのエラー

下記のコマンドで日本語の文字化け対策しようとしたときのエラー

```
apt-get install language-pack-ja-base language-pack-ja
```

こんな感じのエラーが出た。
```
dpkg: error processing package libc-bin (--configure):
 installed libc-bin package post-installation script subprocess returned error exit status 139
```
ネットを探すと下記をせよとのことで実行

```
rm /var/lib/dpkg/info/libc-bin.*
apt-get clean
apt-get update
apt-get install libc-bin
```
あとは下記を行うが.bashrcでもいいかと思う。
```
locale-gen ja_JP.UTF-8
echo export LANG=ja_JP.UTF-8 >> ~/.profile
source ~/.profile
echo $LANG
```
NotebookLMとは？AIを活用した次世代のノートツール


### NotebookLMの概要
[NotebookLM](https://notebooklm.google.com/)は、Googleが開発したAIベースのリサーチアシスタントで、2023年に[Project Tailwind](https://blog.google/technology/ai/notebooklm-google-ai/)として発表され、2024年に正式版がリリースされました。このツールは、単なるノートアプリを超え、ユーザーが提供した資料を基に深い理解と分析を行い、思考をサポートする「AIパートナー」として機能します。最新のAIモデル[Gemini](https://gemini.google.com/app?hl=ja)を搭載しており、日本語を含む多言語に対応しているため、日本のユーザーにも使いやすいサービスです。
### 主な機能
NotebookLMの魅力は、その多機能性にあります。以下に代表的な機能を紹介します。
- 資料のアップロードと解析
PDF、Googleドキュメント、ウェブサイトのURL、YouTube動画など、さまざまな形式のデータをアップロードできます。AIがこれらの内容を瞬時に読み込み、重要なポイントを抽出します。
- 要約と質問応答
長い資料を短時間で要約したり、ユーザーの質問に対して資料に基づいた正確な回答を生成します。回答には引用元が明示されるため、情報の信頼性を確認しやすいのもポイントです。
- コンテンツ生成
FAQ、タイムライン、学習ガイドなど、アップロードしたデータを基に多様な形式のコンテンツを自動生成できます。特に教育やビジネスでの活用に適しています。
- 音声概要機能
2024年9月に追加されたこの機能では、資料の内容を会話形式のポッドキャスト風に要約してくれます（ただし、現時点では英語のみ対応）。

例：

YahooトップをPDF化し、試した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/ab97f953-e3b8-423c-9e74-9d7ec08e441f.png)


### 他のAIツールとの違い
例えば、ChatGPTのような生成AIはインターネット上の膨大なデータをもとに回答を生成しますが、NotebookLMはユーザーが提供した特定の資料に限定して動作します。これにより、「ハルシネーション」（根拠のない回答）が少なく、信頼性の高い結果が得られるのが特徴です。また、情報整理に特化しているため、ブレインストーミングよりもリサーチや学習に最適です。
### 活用シーン
- 教育: 学生や教師が教科書や論文をアップロードし、要点を把握したり質問に答えたりするのに役立ちます。
- ビジネス: 契約書や提案書を分析し、重要な条項を抽出したり、チームで共有可能なナレッジベースを作成できます。
- 個人利用: 読書メモや動画の内容整理など、日常生活での学びを効率化します。

### 制約と注意点
NotebookLMは優れたツールですが、いくつかの制約があります。
- アップロード容量の制限: 無料版では1ノートあたり50ソースまたは500万語までという上限があり、大規模なプロジェクトでは不足する可能性があります。
- インターネット依存の不在: リアルタイムのウェブ検索機能がないため、最新情報や外部リソースを参照することはできません。あくまでアップロードした資料に依存します。
- 音声機能の言語制約: 音声概要機能は英語のみ対応しており、日本語での利用はまだできません。
- 複雑な分析の限界: 高度な統計解析やプログラミングコードの生成など、専門的なタスクには対応していないため、他の専用ツールとの併用が必要な場合があります。
- プライバシー: アップロードしたデータはGoogleのサーバーに保存されるため、機密性の高い資料を扱う際は注意が必要です。

### 料金と利用方法
NotebookLMは基本的に無料で利用可能です。アカウント作成はGoogleアカウントがあれば簡単にでき、公式サイト[notebooklm](http:s//notebooklm.google.com)にアクセスして「Try NotebookLM」をクリックするだけで始められます。ただし、2024年12月に発表された企業・教育機関向けの有料プラン「NotebookLM Plus」では、ソース容量の増加やカスタマイズ機能が追加されています。個人向けには2025年初頭から[Google One AI Premium](https://one.google.com/intl/ja/about/ai-premium/)での提供が予定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/9cf5fb0f-2eb3-41dc-b07c-94ecdfe36ff8.png)


### まとめ
NotebookLMは、情報を効率的に整理し、深い理解を促す革新的なツールです。日本語対応が進んだことで、日本のユーザーにとっても使い勝手が向上しています。学習や仕事で資料を扱う機会が多い方は、ぜひ試してみてはいかがでしょうか。AIの力を借りて、時間を節約しながら知識を最大限に活かすことができるでしょう。

https://support.google.com/notebooklm/answer/15678219?hl=ja&ref_topic=15677005&sjid=2568953300135097610-AP
論文解説ずんだもんを自動生成してみた

# 概要
・未知の分野の論文は読むのがすごい大変
・ChatGPTによる論文要約→ゆっくり解説に変換→動画化（未完成）という流れ
・「何となく」論文を理解した状態を作れるようにする
・感動レベルで論文の主旨把握が速くなった

# 背景・課題
化学が専門なのに、素粒子物理の論文を読むと1行目から理解できません。
でも読まざる得ない場面もあります。
世間的には、そういう時は気合で乗り切るらしいですが、
世の中、時間がありません。なので、GPTの力を借ります。

理解とはらせん階段のようなものだと言います。
いきなり100％の理解を目指すより、まずは全体を20%理解できれば入門としては十分です。
入門が理解出来れば、その後の調査もグッと楽になります。それを目指します。

# 内容・結果

### 流れ

:::note info
①とりあえず未知なる論文を用意します
②GPTで要約します
③ずんだもん解説に変換
④解説台本を元に動画を自動生成します

:::

### 結果

https://www.youtube.com/watch?v=GwlC3YpC8OQ


### ①未知なる論文
　全く内容は知りません。テキトーに選びました。

https://arxiv.org/abs/2502.17161

### ②GPTで要約作成、②ずんだもん解説に変換、④動画を生成
割愛。テキトーに調べれば5万円ぐらいの教材が出てくる
高すぎるので全部自前で実装した。

GPTで要約した後、テキトーに台本に変換して、台本をDataFrameにして、
各行について音声合成と画僧編集した後、音声と画像を動画として合体させれば良い。
（全部Pythonで出来る）


# 感想
感動レベル。
ダルくて仕方がない論文の流れ抽出がほぼ一瞬で終わる。
今まで1日1本調べるのが限界だったが、10本は余裕になった。
コストは1本50円ぐらい。

2日あれば実装できるので、論文読むのダルイ人はおススメする。
（コード公開はしない
char型とint型

文字列を入れる変数を宣言しようとしたときに`char str;`って打ってしまい、エラーを吐かれ、色々調べました。

* 文字もACKIIコードで実態は数値
* `char c`は単一文字を格納する変数
* 文字列を格納したいなら`char c[6]`,`char c[] = "abcde"`などの配列にする
* 配列のサイズ、確保するメモリのことを考える必要があるので、ただ`char c[]`と宣言するのはダメ
* char型の指定子は`%c（単一文字）`、`%s（文字列）`
* 単一文字ならint型として取り扱える。文字列も`c[1]`のように配列番号を指定してやればint型で取り扱い可能
* 文字列を`%s`で渡された関数は、配列を「先頭からヌル文字`\0`まで」読み込んで処理を行う

自分でごく簡単なコードを書いて確かめてみました。

```C:char型
#include <stdio.h>
#include <limits.h>

int main()
{
  int n;
  printf("整数nを入力 : "); scanf("%d", &n);
  printf("%dはint型では\"%d\"で、char型では\"%c\"\n", n, n, n);
  printf("char型の最小値は%d、最大値は%d\n",CHAR_MIN,CHAR_MAX);
  printf("int型の最小値は%d、最大値は%d\n",INT_MIN,INT_MAX);

  return 0;
}
```


```terminal:実行結果
整数nを入力 : -50
-50はint型では"-50"で、char型では"ﾎ"
char型の最小値は-128、最大値は127
int型の最小値は-2147483648、最大値は2147483647
```
なるほど。
ちなみに、ASCIIコードの127は`DEL`とのこと。何も表示されないなと思ったら制御文字でした。
本読んで分かっても、いざコード打とうとすると「なんだっけ?」となることが多いです。
アクセシビリティを考慮してCSS単位を見直してみた！

## 背景

フロントエンドエンジニアとして日々コーディングをする中で、最近アクセシビリティの重要性を改めて学びました。特に、CSSの単位の使い方次第で、ユーザーのフォントサイズ変更に対応できなくなることを知り、これまでのコーディング手法を見直すきっかけとなりました。

何かご指摘やアドバイス等あると優しく教えていただけると幸いです、、！

## これまでのコーディング方法

デザインデータ通りにページを作成することを重視し、フォントサイズや余白などにvw（ビューポートの幅に対する割合）を多用していました。これは、ブラウザの幅が変わっても要素のサイズが同じ割合で変化し、デザインの一貫性を保ちやすいためです。

しかし、アクセシビリティの観点からは問題がありました、、！vwを使用したフォントサイズは、ユーザーがブラウザのフォントサイズを変更しても影響を受けず、可読性が損なわれます。

## CSS単位の見直し

そこで、フォントサイズ変更に対応できるCSSの単位を見直しました！適切な単位を使うことで、デザインの一貫性を保ちつつ、アクセシビリティにも配慮したコーディングが可能になります。

## remやemの活用

remやemは、ユーザーのフォントサイズ変更に対応できるため、フォントサイズ指定に適しています。ブラウザの設定によってフォントサイズが変更されると、これらの単位で指定されたスタイルもその変化に追従します。

例えば、デフォルトの1remは16pxですが、ユーザーの設定によって32pxやそれ以上になることもあります。そのため、フォントサイズや他のスタイルをremで指定すると、ユーザーの設定に応じて拡大・縮小されるようになります。

ただし、すべてをremやemにすればよいわけではありません。ユーザーのフォントサイズ変更に合わせてそのスタイルの大きさを変えたいかどうかを基準に、使用する単位を選択することが重要だと思います。

## ルート要素にfont-size: 62.5%を設定する問題点

一部の開発者はremの計算を簡単にするために、ルート要素（html）にfont-size: 62.5%を指定し、1rem = 10pxとする手法を使います。（ちなみに僕もしてました、、）しかし、これはユーザーが設定したフォントサイズを無視する原因となります。例えば、他のサイトでは1rem = 32pxで表示される環境のユーザーが、62.5%の指定があるサイトを開くと、意図せずフォントサイズが小さく見えてしまいます。

アクセシビリティを考慮するならば、ルートのフォントサイズはデフォルトのままにし、計算の関数等を作りremを適切に活用するのが理想的だと思います！

## 単位の使い分け（個人的な例）

以下は、僕が今の所使用しているCSS単位の使い分けです。ただし状況によって例外も多々あります、、！

| 種類 | 単位 | 理由 |
|:-:|:-:|:-:|
|フォントサイズ |rem|ユーザーのフォントサイズ変更に対応できるため|
|水平方向の余白・パディング|px|remを使用するとフォントサイズが大きくなるにつれて1行に入る文字数が少なくなるため|
|垂直方向の余白・パディング|rem|フォントサイズに応じて調整されるため|
|要素の幅|rem / % / vw/max-widhth|フォントサイズやビューポートに応じて変動させるため、remや%、vwを使い分ける|
|メディアクエリ|rem|ユーザーのフォントサイズ変更に対応しつつ、レイアウトを調整できるためremを使用する|
|境界線 (border)|px|borderの太さはフォントサイズに依存せず固定のほうが崩れにくいため|
|行の高さ (line-height)|rem|フォントサイズの変化に対応し、可読性を保つため|

## まとめ

CSSの単位を適切に使い分けることで、アクセシビリティを向上させながら、柔軟なデザイン調整が可能になります。特に、vwのようなビューポート基準の単位を多用するのではなく、ユーザーのフォントサイズ設定に影響を受けるremやemを適切に活用することが重要だと思います！

また、以下の記事がわかりやすいのでぜひ見てみてください！
https://coliss.com/articles/build-websites/operation/css/about-pixels-and-accessibility.html

閲覧ありがとうございました！
なぜECS⇒S3の通信が必要

# はじめに
閉域網内に、ECS + ECRの構成では、以下の通り、VPC Endpointの作成が必要です。
- Interface Endpoint
  - ecr.api
  - ecr.dkr
- S3 Gateway Endpoint

なぜS3 Gateway Endpointが必要なのかを調べてみました。


https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html

:::note info
For your Amazon ECS tasks to pull private images from Amazon ECR, you must create a gateway endpoint for Amazon S3. 
The gateway endpoint is required because Amazon ECR uses Amazon S3 to store your image layers. 
When your containers download images from Amazon ECR, they must access Amazon ECR to get the image manifest and then Amazon S3 to download the actual image layers. 
:::

要するに、ECSは、S3から実際のimage layersを取得するため、ECS⇒S3が必要です。

# リソース
- 諸VPC Endpoints作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/d9c05871-9aa4-489a-bc4a-4030392f15b9.png)
- ECS、ECRなど必要なリソース

# S3 Gateway Endpointを利用できない場合
ECSからS3 Gateway Endpointを利用できない場合、CannotPullContainerErrorが発生します。
- ECS用のsubnet - Route tableにS3 Gateway Endpointへのrouteが設定されていない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/05f8e195-39fe-4c84-92c8-1b7931cd375b.png)

## CannotPullContainerError
route設定なしにより、ECS task起動エラーが発生しました。

:::note alter
CannotPullContainerError:
 The task cannot pull 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com/test:NviE_Ss@sha256:6ecf45eff21e095ad8d60b724a6bbcax9df49da3b39fe80237ad7d688723c8706c3c from the registry 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com/test:NviE_Ss@sha256:6ecf45eff21e095ad8d60b724a6bbcax9df49da3b39fe80237ad7d688723c8706c3c.
  There is a connection issue between the task and the registry. 
  Check your task network configuration. : failed to copy: httpReadSeeker: failed open: failed to do request: Get 123456789000.dkr.ecr.ap-northeast-1.amazonaws.com/test:NviE_Ss@sha256:6ecf45eff21e095ad8d60b724a6bbcax9df49da3b39fe80237ad7d688723c8706c3c: dial tcp 52.219.172.118:443: i/o timeout
:::

52.219.172.118はS3関連のEndpointみたいです。
```
nslookup 52.219.172.118
名前:    s3-ap-northeast-1-r-w.amazonaws.com
Address:  52.219.172.118
```

要するに、S3に接続できてず、imageを取得できなかったです。

# S3 Gateway Endpointを利用できる場合
- ECS用のsubnet - Route tableにS3 Gateway Endpointへのrouteが設定されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/78dee030-8624-4dd2-af44-508d406ebcb9.png)

## ECS task起動できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/911efaa4-a35c-4e9d-870d-0abf6d4be5e9.png)

# NACL設定
NACLがStateLessであることを忘れてはいけないです。
以下のように、ECS subnetに付与されるNACLのOutboundにはALL Allowになっているが、Inbound ruleには、VPC内部の通信のみが許可されています。
そうすると、ECS⇒S3はOKで、戻り通信S3⇒ECSはblockされるため、同様に CannotPullContainerError が発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/37e80db9-4212-4e54-a29c-f55679a06f7a.png)
【C#】セーフコードでビットマップ画像を高速に操作する

# はじめに

C# で画像データをやり取りする機能として、標準ライブラリに [System.Drawing.Bitmap クラス](https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.bitmap?view=windowsdesktop-9.0&viewFallbackFrom=dotnet-plat-ext-9.0)があります。

今では少し古くさいクラスのようで、デメリットが存在します。

- パフォーマンスが微妙
- WebP 画像に対応していない
- Windows でしか使えない

しかしながら WindowsForms では画像を扱うならこのクラスが必要になりますし、枯れた技術としての需要はまだありそうです。

このビットマップをもう少し使いやすくしたい、というのが今回のお話です。

- 色情報をスパンで扱う
- プロジェクトで `unsafe` コードの許可なしで使えるようにする

## サンプルコード

## 使い方

```cs
// 適宜ファイルやストリームから画像をロード
using var bitmap = new Bitmap(100, 100);
{
    // 画像に対する操作はこのスコープ内で行い、画像のロックを解除するようにする
    using var editor = new BitmapEditor(bitmap);
    for (int y = 0; y < editor.Height; y++)
    {
        for (int x = 0; x < editor.Width; x++)
        {
            // グラデーション
            var c = (byte)((x + y) / 200f * 255);
            editor.Span[y * editor.Width + x] = new NativeColor(c, c, c, 255);
        }
    }
}
```

![a](https://drive.google.com/thumbnail?&id=1xrgw4VCVwsjPWhUNnniC15ei8kiWlNO9)

## 解説

`BitmapEditor` は `ref` 構造体です。リソースを持つため `using` パターンで破棄するようにします。  
色情報をスパンとして持ち、それを直接操作できます。

色情報は ↓ のようになっています。

```cs
file record struct NativeColor
{
    public byte B;
    public byte G;
    public byte R;
    public byte A;
}
```

これでうまいことビットマップのメモリと色情報を対応させられますが、環境依存かもしれません。

`BitmapEditor` の寿命はあまり長くないほうがよさそうです。というのも、画像データのハンドルをロックしたままフォーム等で表示しようとするとエラーになります。  
参照型にすることも可能ですが、あまりうまくいかなかったため値型で運用するのがよさげです。

## おわりに

今回の内容は若干ハック的な感じなので、使用できるなら適当な画像ライブラリを使うのがよさそうです。  
WindowsForm アプリで簡単な画像処理をする場合に検討できるかもしれません。
pivotとrequest

## pivot
中間テーブルのことのようで、多対多のリレーションが作れる
Aさん、Bさん、Cさんが居て、営業、エンジニア、人事みたいなのがあって、Aさん、Cさんが営業でBさんがエンジニア見たいのを管理できるみたいな。
↓AIが出したコード例
マイグレーション
```
// users テーブル
Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});

// roles テーブル
Schema::create('roles', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});

// role_user（中間テーブル）
Schema::create('role_user', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
    $table->foreignId('role_id')->constrained()->onDelete('cascade');
    $table->timestamps();
});
```

## Requestクラス
これはruleメソッドでバリデーションルールを設定したり、authenticateメソッドでバリデーションに入る前にそのリクエストを受け付けていいのかを判断できる。

https://laravel.com/docs/11.x/validation#form-request-validation

```
public function authorize(): bool
{
    return true;←trueに変えないとリクエストが受付されない。
}

public function rules(): array
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}
```
[Python] 小規模ツールのディレクトリ構造

## はじめに
Pythonを用いた作成物を開発する際に  
自分が採用しているディレクトリ構造についてまとめたものです。  

ディレクトリの名称や構造が適切なものでないと  
保守性が低下し、引き継ぎを行う際の大きな障害となり得ます。  
その苦い経験もあり自分なりに考えた構造の共有です。  

## ディレクトリ構造図
```plaintext
.
└── project_dir
    ├── config
    ├── data
    │   ├── input
    │   ├── output
    │   └── working
    ├── log
    └── src
        ├── errors
        ├── lib
        ├── models
        ├── services
        ├── typings
        └── utils
```

## 各ディレクトリの利用用途
### config
プログラムの処理中で利用する固定値や  
パラメーターを記載したファイルを格納するディレクトリです。

### data
処理の中で利用するファイル群を配置するディレクトリです。  
役割により分割した、以下の子ディレクトリも利用します。  
子ディレクトリの名称は、作成物によってより具体的なものに変更する場合もあります。

- input
  - 処理で利用する入力ファイルを配置するディレクトリです。

- output
  - 処理で作成した出力ファイルを配置するディレクトリです。

- working
  - 一般的にワーキングディレクトリと呼ばれるものであり、  
    処理の途中・加工中のファイルを入れておくディレクトリです。

### log
ログファイルを格納するディレクトリです。

### src
処理を記載したファイル群を格納するディレクトリです。  
src配下に処理を記載したコードが入っていると直感的にわかるようにします。

### errors
自作エラークラスを記載したファイルを格納するディレクトリです。

### lib
自作ライブラリを格納するディレクトリです。

### models
dataclassを定義したファイルを格納するディレクトリです。  
作生物によっては利用しない場合もあるので、その際は削除しておく。

### services
作成物における、ビジネスロジック・コアロジックを記載した  
ファイルを格納しておくディレクトリです。

### typings
型定義を記載したファイルを格納するディレクトリです。  
Python3.10以降は、型定義がより便利に行えるようになったのもあり  
別ファイルに定義し呼び出せるようにします。

#### なぜ、「typings」という名称にしたか？
当初は「types」というディレクトリ名も候補にしていましたが、  
配下に型定義ファイルと一緒に入れておく、__init__.pyファイル内を開いてみると  
オレンジ色で以下の警告が表示されており、候補から外した背景があります。

```py
"~/src/types/__init__.py" は stdlib モジュール "types" をオーバーライドしています
```

### utils
自作ユーティリティを格納するディレクトリです。

## あとがき
記載した構造は、主に小規模なツールを作成する場合を想定しています。  
しかし、小規模であってもディレクトリ構造の設計がよく考えられていないと  
後から自分で保守する場合や後任に引き継ぐ際の支障となります。  
  
逆に設計が上手くなされていた場合には、  
直感的に、どこにどの役割のファイルが配置されているかがわかりますし  
引き継ぎを行う際の説明も話しやすくなるので大事なポイントだと考えています。

## 参考
- Poetryを利用したマルチプロジェクトPythonアプリケーションの開発方法
  - https://techblog.lycorp.co.jp/ja/20241224d
- FastAPIのディレクトリ構成の最適解を知りたいッッ！
  - https://zenn.dev/dencyu/articles/a94928b9ce45f7
【メモ】基本情報技術者試験

## クロック

- 外部クロック
    - コンピュータ全体の同期を図るために生成される、一定周波数の安定したパルス
- 内部クロック
    - 個々のコンポーネントでの処理のための、コンポーネントごとに固有の周波数を持つパルス
    - 外部クロックがマザーボード上のクロックジェネレータで変換されることで、コンポーネントごとの周波数に変換される

## メモリインタリーブ

- メモリアクセスを高速化するための手法
- 「interleave」：データの連続性を保ちながら、複数の領域に交互に配置すること
- 主記憶を論理的な複数の領域（メモリバンク）に分けて、バンクを跨ぐようにアドレスを割り当てることで、連続した領域への並列アクセス（読み書き）を可能にする

![memory_interleave.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754094/24d4554c-4ff3-42b6-b16e-4c0cd8ade680.png)

## 割込み処理
### 内部割込み処理
- SVC割込み
    - 内部割込みの一種
    - スーパーバイザーコールにより引き起こされる割込み処理
    - 例：入出力処理の発生

※ スーパーバイザー：管理者の意、OSカーネルを表す
※ スーパーバイザーコール：プログラム実行中に、OSカーネルに特権的な機能を呼び出すための仕組み。プログラムには直接実行する権限がないので、OSカーネルに処理を依頼する。

## ファイルシステムにおけるデータ保存方法
- レコード
    - データの論理的な単位（テーブルデータ１件のイメージ）
    - レコードのデータサイズのことを「レコード長」と呼ぶ
- セクタ
    - ハードディスクにおける記憶領域の最小単位
- クラスタ（ブロック）
    - ファイルシステムにおける、データ管理の最小単位
    - OSによるファイル管理では、複数のセクタを１ブロックと見なしたクラスタ単位でファイルが読み書きされる
    - ブロック化因数：１ブロックに含まれるレコード数

## チェックポイント
- DBMSにおいて、主記憶に保持されているDB変更内容を定期的に補助記憶に書き込むタイミングのこと
- トランザクション処理による変更データは主記憶上にある程度蓄積されてから、チェックポイントでまとめて補助記憶に書き込まれる

## NAPT
- 「IPv4」でのアドレス不足解消のための手法
- IPアドレスとポート番号の組み合わせにより対応づけることで、複数のプライベートIPアドレスを一つのグローバルIPアドレスに変換する方法
- プライベートIPアドレスとポート番号を、グローバルIPアドレスと空いているポート番号に変換する。受信時は変換テーブルを参照してプライベートIPアドレスに変換する。（例：192.168.1.100:12345 → 203.0.113.1:56789）

## OSI基本参照モデル

ネットワーク通信に必要な仕様を階層的に整理したモデル

<table>
    <tr>
      <td>第七層</td>
      <td>アプリケーション層</td>
      <td>アプリケーション固有の規約</td>
    </tr>
    <tr>
      <td>第六層</td>
      <td>プレゼンテーション層</td>
      <td>データの表示形式に関する規約</td>
    </tr>
    <tr>
      <td>第五層</td>
      <td>セッション層</td>
      <td>対話的な通信の開始と終了、同一性に関する規約</td>
    </tr>
    <tr>
      <td>第四層</td>
      <td>トランスポート層</td>
      <td>データ送信の信頼性に関する規約</td>
    </tr>
    <tr>
      <td>第三層</td>
      <td>ネットワーク層</td>
      <td>送信元から送信先ノードへのデータ通信に関する規約</td>
    </tr>
    <tr>
      <td>第二層</td>
      <td>データリンク層</td>
      <td>隣接ノード間のデータ通信に関する規約</td>
    </tr>
    <tr>
      <td>第一層</td>
      <td>物理層</td>
      <td>データ通信における物理的な仕様に関する規約</td>
    </tr>
 </table>

※ プレゼンテーション層：文字コード変換、暗号化、データ圧縮など

## Java
- Javaプログラムは、JVM（Java実行環境）で実行できる「Javaバイトコード」という独自形式のプログラムに変換される
- JavaはJVMで実行されるため、OSに依存しないプログラミング言語である
- Java Servlet
    - サーバ上で動作するJavaプログラムの仕様を定義したもの
    - Webアプリケーションで、データ処理や動的なWebページ生成を行う際に利用される



## 用語
- オーバヘッド
- ユーザビリティ、アクセシビリティ
- バス幅（バス：データ伝送路）
- VDI、DaaS（デスクトップサーバ：自社運用、クラウド）
- チャレンジレスポンス認証
- ゲートウェイ
[日記] Raspberry Pi 5向けにC++ソースをクロスコンパイルする

# 背景
* Raspberry Pi 5を買ったので今後いろいろ遊びたい
* お仕事ではしつらえられたビルド環境が整っているので、一回自分でクロスコンパイルを一からやってみて流れを理解したい

# 環境
## ターゲット
* Raspberry Pi 5 8GB
* Raspbian GNU/Linux 12
## ホスト
* WSL 1 on Windows 11
* Ubuntu 16.04.5

# 実験
* 適当にサンプルコードをつくる
```c++
// hello.cpp
#include<iostream>
int main()
{
    std::cout << "Hello World!" << std::endl;
}
```
* g++でビルドし、動作確認
```bash
# host
$ g++ -o hello_host hello.cpp
$ ./hello_host
Hello World!
```
* fileコマンドでファイルタイプを確認するとx86-64アーキテクチャで動くことがわかった
```bash
# host
$ file hello_host
hello_host: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=be8acdcf26aa2e574315f088440fa65e8619df1f, not stripped
```
* RasPi上でuname -m を実行するとaarch64というアーキテクチャであることが分かった
``` bash
# target
 $ uname -m
aarch64
```
* ビルドしたバイナリをRaspberry Piに転送し実行するも、当然Exec format errorで失敗する
```bash
# host
 $ scp hello_host <user>@<raspi address>:/home/
# target
 $ ./hello_host
-bash: ./hello_host: cannot execute binary file: Exec format error
 ```
* ググったらg++-aarch64-linux-gnuがARM64向けのクロスコンパイラらしいのでインストールしてみる
``` bash
# host
$ sudo apt install  g++-aarch64-linux-gnu
```
* ビルドしてファイルタイプを確認するとアーキテクチャもARM aarch64となっている
``` bash
# host
$ aarch64-linux-gnu-g++ -o hello_target hello.cpp
$ file hello_target
hello_target: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=23145953038cc20552029576ca61ddc777ccbac3, not stripped
```
* RaspPi側に転送し実行するも、required file not foundだと怒られた
``` bash
# target
$ ./hello_target
-bash: ./hello_target: cannot execute: required file not found
```
* 動的リンクの問題かと考えlddしてみてもnot a dynamic executableと表示されてしまった
``` bash
# target
$ ldd hello_target
        not a dynamic executable
```

* fileコマンドの出力を見直すと、インタプリタとして```/lib/ld-linux-aarch64.so.1```と指定されていた
* /lib下にld-linux-aarch64.so.1は無かったがld-linux-armhf.so.3という名前のローダは見つかった
* armhfというのは32bitアーキテクチャのようなので、32bit向けにビルドしたら実行できた
```bash
# host
# g++のarmfh向けのクロスコンパイラをインストール
$ sudo apt install g++-arm-linux-gnueabihf
# ビルド
$ arm-linux-gnueabihf-g++ -o hello_armhf hello.cpp
$ file hello_armhf
hello_armhf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=5d079ab5090bb0a0d30d6de532b28dd081c2f47f, not stripped
# target
$ ./hello_armhf
Hello World!
```

# 学んだことと課題
* CPUアーキテクチャが64bitだとしてもELFローダも64bitに対応していないと実行できない
* 宿題として64bit向けにビルドしたバイナリを実行する方法を調べる

# 追記(2025/2/28)
* このフォーラムの投稿によるとRaspberry Pi 5自体は64bitだとしても32bit版のOSがインストールされているとこのような問題が起こるそうだ

https://forums.raspberrypi.com/viewtopic.php?t=357800

* 64bit版のOSをインストールしなおしたら正常に動作した
* 自分はOSがプリインストールされているキットを買ったので、そのあたりを意識していなかったのがつまづいた原因のようだ
```bash
$ ./hello_target
Hello World!
```


# 参考
https://teratail.com/questions/190228
【初心者】CIDR/30にする意味って？（CIDR:Classless Inter-Domain Routing）

:::note info
補足等ございましたらコメントをお願いします。
:::

**ネットワークアドレスとブロードキャストアドレスを抜いたら2台しか接続出来ない。**
**何のために使うん？？？**
### ずばり・・・

**ポイントツーポイント接続で使う**
・ルーター間（別々のネットワークやサブネット同士）
・デバイス間（直接的な2台の間で）

他のネットワークのパケットと干渉されず、通信を確立したいときに可能。

### RFC3021では・・・
/31のサブネットマスクの使用が認められている！？
この場合、2つのアドレスがそれぞれのホストのIPアドレスになるので、ネットワークアドレスやブロードキャストアドレスは不要になる。（不要というか予約しなくてもいけるよーって感じ。。。）



### 参考になった文献
https://tex2e.github.io/rfc-translater/html/rfc3021.html

https://www.nukolab.net/routeros-rfc3021/
RealSense D455が認識しなかった話

# はじめに
- RealSense初学者
- リファレンス読みません太郎
- 雑なQiita書きがち太郎

以上，前置きです．

# 事象
RealSense D455がrealsense-viewer上で認識せず表示されない事象．
```
lsusb | grep RealSense
```
したら引っかかる．という感じであった．

ホストマシンのスペック
- Ubuntu 22.04 LTS
- Inspiron 14 5410
- Core i5-11320H
- RAM 8GB

# 対処法
多分何個かあるので，全部書いておきます．
僕が実際にやって解消した方法は①です．

## ①Secure BootをOFFにする．
カーネルモジュールが署名検証を失敗し拒否されるためオフにしなければならないようです．
なんでこんなめんどくさいことしなきゃならんのか気になったので，調べました．

- ubuntu22.04では追加のDKMSモジュール・一部の公式モジュールが署名されていない場合がある．
- 今回障壁になったのはuvcvideoだけども，uvcvideoがコケる理由はLibrealsenseのDKMSによる影響．

ロードエラーは以下で確かめられます．
```
dmesg | grep uvcvideo
```

BIOSのセキュリティやBOOTの部分にあるはず(InspironはSecurityのところにあった)．適宜サーチ機能を活用するとよいと思う．

## ②DKMSモジュールに署名する
ないなら署名知ればいいです．
鍵ペアを作りましょう．
```
sudo apt install mokutil
sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
```

再起動してMOK Managerでキーを登録しましょう．

あとはカーネルモジュールをリビルドすればよいと思います．

試していないので間違ってたら申し訳ないです．

## ③カーネルのバージョンを変更
カーネルバージョン落としても動くかもしれません．5.13くらいがいいかなと思います．

```
sudo apt install linux-image-5.13.0-27-generic
sudo reboot
```

試していないので間違ってたら申し訳ないです．

# 締め
セキュアブートをオフにしなければならないって，常識なんですかね？
なんにせよ，半日潰れました(´;ω;｀)

https://x.com/tuji_moooon/status/1893634509905473704?t=P80yECmy1S7m2shhSM34RQ&s=19
メモ

### @State
変数を管理し、ビューの再描画を自動的に行う

### VStack

用途: 子ビューを縦方向（垂直）に並べる。

### HStack
用途: 子ビューを横方向（水平）に並べる。

### ZStack
用途: 子ビューを重ねて配置する。

### LazyVStack
用途: 大量の子ビューを効率よく縦方向に並べる。スクロール時にビューを遅延生成。

### LazyHStack
用途: 大量の子ビューを効率よく横方向に並べる。スクロール時にビューを遅延生成。
Hashmap, Array, ArrayList

## Hashmap
HashmapはKey‐valueでデータを保存する資料構造です。
Hashingを使ってデータを素早く検索できます。


特徴  : 
Keyは唯一なんですが、valueは多数あり得ます。
順序は不確かになります。
Keyとvalueをnullで保存できます。
時間複雑度はO(１)でデータにアクセスできます。

example)
```java
import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();

        // データ追加 (put)
        map.put("apple", 3);
        map.put("banana", 5);
        map.put("grape", 7);

        // データ取得 (get)
        System.out.println("banana: " + map.get("banana")); // 5

        // Key存在確認 (containsKey)
        System.out.println("cherry: " + map.containsKey("cherry")); // false

        // データ削除 (remove)
        map.remove("apple");

        // データ出力
        for (String key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}
```

:::note info
banana: 5
cherry: false
banana: 5
grape: 7
:::

Hashing以外Indexingもデータを検索する方法なので簡単に説明をします。


- Indexingとは?
定義 : 
データベースや整列された配列から特定のKeyをすばやく見つけるために、インデックステーブルを作成する方法

example)
図書館で本を探す時、本のタイトル - 書庫番号で整理されたリストを見てすばやく探すことと似ています。

特定 :
一般的に整列されたデータで使用され、検索速度はO(log N)
インデックス構造を維持する必要があるため、別のスペースが必要です。

## 配列

配列は、固定されたサイズの連続したメモリ空間を持つ資料構造です。同じタイプだけ保存ができます。

サイズが固定されているため、一度宣言すると変更できません。
インデックスを使用して素早くアクセス可能(O(1))
InsertとDeleteが非効率的です。

```java
public class ArrayExample {
    public static void main(String[] args) {
        int[] numbers = new int[5]; // 大きさが5の整数配列宣言

        // 配列初期化
        numbers[0] = 10;
        numbers[1] = 20;
        numbers[2] = 30;

        // 配列要素アクセス
        System.out.println("index 0: " + numbers[0]); // 10

        // 配列巡回
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("numbers[" + i + "] = " + numbers[i]);
        }

        // こんな風にも使えます。
        for (int num : numbers) {
            System.out.println("value: " + num);
        }
    }
}
```


## ArrayList

ArrayListは可変サイズ配列です
内部では配列を使うですが、自動的にサイズの変更ができます。


特徴
サイズが動的に増減します
要素にインデックスでアクセス可能です。(O(1))
配列でInsertとDeleteするときよりも便利です。(O(n))
nullを使うことができます。

```java
import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        // (add)
        list.add("apple");
        list.add("banana");
        list.add("grape");

        // (get)
        System.out.println("1番目の果物: " + list.get(0)); // apple

        // (set)
        list.set(1, "cherry"); // banana->cherry

        // (remove)
        list.remove("grape");

        // (size)
        System.out.println("ArrayList大きさ: " + list.size()); // 2

        // ArrayList巡回
        for (String fruit : list) {
            System.out.println("果物: " + fruit);
        }
    }
}
```

:::note info
1番目の果物: apple
ArrayList大きさ: 2
果物: apple
果物: cherry
:::


主に使用例
Hashmap :
DBで使う時はHashよりIndexingを先に使います。
そのため、Redis見たいなcacheを使う場合、Hashを使ってcacheを照会する時に使用して最適化します。


配列 : 
あまり使わない。

ArrayList :
DBで特定のデータと一致するデータを照会をする場合、まとめてデータを持って来る時があります。
その場合はArrayListを使います。
Active Directoryのドメインコントローラでできる7つのこと

いつも使っているWindowsserverのActive Directoryについて、名前くらいは知っていましたが具体的にどんなことができるのかは知っていませんでした。軽く調べてみました。今回はActive Directoryのドメインコントローラについて整理したく思います。

## そもそもドメインコントローラとは
#### ドメインコントローラ（Domain Controller, DC） は、Microsoftの Active Directory（AD） において、ドメイン環境を管理するサーバーのことです。
DCは、ユーザー認証、ポリシー管理、リソース制御などの役割を果たします。
## ドメインコントローラでできること

#### ●ユーザーアカウント管理
　・ユーザーの作成・削除・無効化・ロック解除
　・パスワードポリシーの適用（長さ、複雑性、有効期限）
　・ユーザーのグループ所属管理
#### ●コンピューター管理
　・Windows PCやサーバーをADドメインに参加（参加させるとDCが管理できる）
　・デバイスポリシーの適用（セキュリティ・ネットワーク設定）

#### ●認証とシングルサインオン
  ・Kerberos認証 / NTLM認証
  　一度ログインすればドメイン内の他のリソース（共有フォルダ、アプリ）に再ログインせずにアクセスが可能となる。
  ・LDAP（Lightweght Directory Access Protcol）
    他のシステム（Linuxサーバー）とAD連携が取れる認証の形式

#### ●グループポリシー管理（GPO）
・パスワードポリシー（長さ、複雑性、有効期限）
・デスクトップ制御（壁紙固定、コントロールパネル制限）
・ネットワーク設定（プロキシ、Wi-Fi、VPN設定）
・アプリケーションの配布（自動インストール・制御）

### ●DNS管理（AD統合DNS）
・Windowsドメイン内の名前解決
### ●証明書サービス（Active Directory Certificate Services, AD CS）
・ドメイン内部でSSL証明書を発行・管理
### ●ログ管理
・ユーザーがいつどこからログインしたかを確認できる

### まとめ
企業のIT環境を運用するにあたって、認証・管理・セキュリティの基本的な設定と管理をするのがドメインコントローラであることがわかりました。


## 参考にしたドキュメント

https://manual.iij.jp/vds/vds_console_manual_admin/22812824.html

https://jpwinsup.github.io/blog/2024/03/25/ActiveDirectory/Authentication/dc-bind/

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/plan/active-directory-integrated-dns-zones

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-cs/active-directory-certificate-services-overview

## 他にもこんな記事書いています。

https://qiita.com/mmurm/items/8e816d8223f370d45f03

https://qiita.com/mmurm/items/b8565c883e515e93cc7e

https://qiita.com/mmurm/items/01f7c891995a1ff22a5e
【PowerAutomate】件名、投稿者が空白の通知がTeamsチャットに届いた

職場環境の画面キャプチャは掲載できないため文字が多くなります。ご容赦ください。

## 困ったこと
Teamsのチャネルに新しい投稿があると、グループチャットに件名、投稿へのリンク、投稿者を通知するフローを運用中。
件名や投稿者が空白の状態でグループチャットに通知が届くことがある。チャネルへの投稿は無い。

## 原因
トリガーのOutputを確認すると
　"messageType":"systemEventMessage"
となっていてココが怪しいと感じて調べました。

チャネルへのユーザ追加や削除、チャネル名変更などで
"messageType": "systemEventMessage" イベントが発生します。
トリガーがそれに反応したようです。
https://learn.microsoft.com/ja-jp/graph/system-messages#supported-system-message-events

## 解決方法
グループチャットへの通知アクションの前に
　「"messageType"が"systemEventMessage"に等しくない」
条件コントロールを追加して回避。