OmniAICreator/Qiita-1.07M huggingface dataset:
ABC381Aをjavascriptで解いた

# [今日の問題](https://atcoder.jp/contests/abc381/tasks/abc381_a)
↑押してください。
# 自分の回答(javascript)
```javascript
function Main(input){
    min = 1e18
    max = -1e18
    let abc = "abcdefghijklmnopqrstuvwxyz".split("")
    let ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
    let f = 3
    if(f == 0){
      input = parseInt(input.trim())
    }
    if(f == 1){
      input = input.trim().split("\n").map((a)=>parseInt(a))
    }
    if(f == 2){
      input = input.trim().split("\n").map((a)=>a.split(" ").map((b)=>parseInt(b)))
    }
    //ここより上は定型文です。
    input = input.trim().split("\n")
   n = parseInt(input.shift())
   t = input.shift().split("")
   for(let i = 0;i<n;i++){
     if(i < (n+1)/2-1){
       if(t[i] != "1"){
         console.log("No")
         return
       }
     }
     if(i == (n+1)/2-1){
       if(t[i] != "/"){
         console.log("No")
         return
       }
     }
     if(i > (n+1)/2-1){
       if(t[i] != "2"){
         console.log("No")
         return
       }
     }
   }
   console.log("Yes")
  }
  Main(require("fs").readFileSync(0, "utf8"));
  

```
# 工夫した点
愚直にやりました。"/"でsplitすればもうちょっと簡単だったかな？
READMEを作成するときはQiita CLIのリポジトリを参考にしよう

## はじめに

今回記事の作成にQiita CLIを使ってみようと思って、Qiita CLIのリポジトリを見てみたところ、READMEがすごく見やすかったので、それについて記事化しました。

リポジトリはこちら:
[Qiita CLI GitHubリポジトリ](https://github.com/increments/qiita-cli)

以下に、READMEの良かった点を挙げていきます。

## Qiita CLIのREADMEの良い点

### 見やすさと分かりやすさ

- **記事が文字だけでなくアイコンもあって見やすい**
  - READMEにはアイコンが使われており、とても見やすく、視覚的に分かりやすい構成になっています

![スクリーンショット 2024-12-25 14.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/c1fca51d-da4f-2980-4900-7d7e3d75cf42.png)

### ユーザーへの配慮

- **お願い事項が具体的で、実行しやすい導線がある**
  - スターをつけるお願いや記事投稿のお願いが書かれており、その内容がすぐに実行できるような導線が用意されています
  - Qiita CLIの関連記事がすぐに確認できるようになっている点も秀逸です

### 情報の充実度

- **使い方やオプションの説明が簡潔で的確**
  - Qiita CLIの使い方だけでなく、生成されるファイルや各種オプションの内容についても簡潔に説明されており、初めて利用する人にも分かりやすい内容となっています

## まとめ

ちょっと簡単な記事ですが、README書く時の参考になれば幸いです。

## 参考

- [Qiita CLI公式ドキュメント](https://github.com/increments/qiita-cli)
- [Qiita API v2](https://qiita.com/api/v2/docs)
ABC380Dをjavascriptで解いた

# [今日の問題](https://atcoder.jp/contests/abc380/tasks/abc380_d)
↑押してください。
# 自分の回答(javascript)
```javascript
function Main(input){
    min = 1e18
    max = -1e18
    let abc = "abcdefghijklmnopqrstuvwxyz".split("")
    let ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
    let f = 3
    if(f == 0){
      input = parseInt(input.trim())
    }
    if(f == 1){
      input = input.trim().split("\n").map((a)=>parseInt(a))
    }
    if(f == 2){
      input = input.trim().split("\n").map((a)=>a.split(" ").map((b)=>parseInt(b)))
    }
    //ここより上は定型文です。
   input= input.trim().split("\n")
   s = input.shift().split("")
   n = s.length
   S = []
   abcset = new Set(abc)
   for(let i = 0;i<n;i++){
     if(abcset.has(s[i])){
        S.push(ABC[abc.indexOf(s[i])])
     }else{
       S.push(abc[ABC.indexOf(s[i])])
     }
   }
   //console.log(S)
   q = parseInt(input.shift())
   klist = input.shift().split(" ").map((a)=>BigInt(a))
   n = BigInt(n)
   res = []
   for(let i = 0;i<q;i++){
     klist[i] = klist[i]-1n
     
     if(so(klist[i]/(n)) == 0){
       res.push(s[Number(klist[i]%(n))])
     }else{
       res.push(S[Number(klist[i]%n)])
     }
     
   }
   console.log(res.join(" "))
   
   
   function so(n){
    let a = n.toString(2)
    a = a.split("").map((a)=>parseInt(a))
    goukei = 0
    //console.log(a)
    for(let i = 0;i<a.length;i++){
      goukei += a[i]
    }
    return goukei%2
   }
  }
  
  Main(require("fs").readFileSync("/dev/stdin", "utf8"));
  

```
# 工夫した点
愚直にやるとTLEします。またjavascriptは10^15くらい以上の数はNumber型が使えないのでBigIntで管理します。規則性を見つけます。2^n+m番目は2^(n-1)+m番目と逆であることなどから地道に考えると、塊のpopcountが偶数か奇数で場合分けされて答えを出すことができます。
scssのmap機能で色指定するメリット・デメリット

実務で色指定をする際、SCSSのmap機能を使用しています。
SCSSのmap機能を使うと、keyとvalueのペアを定義できます。

定義しているscssファイルはこんな感じです。

```styles/global/variable.scss
@use "sass:map";

/* Color */
$yellow: (
  "5": #fbf8ee,
  "10": #fff8e5,
  "20": #f3ebcf,
  "30": #e8d89f,
  "40": #d4c282,
  "50": #feec58,
  "60": #ffd746,
  "70": #ffd027,
);
$blue: (
  "5": #d5f3f3,
  "10": #afe7ff,
  "20": #537ca9,
  "30": #347692,
  "40": #0070a2,
  "50": #0071a3,
);
$white: (
  "100": #fff,
);
~
```

使用する場合は下記のように使用します。

```button.module.scss
@use "sass:map"; // 必須

.button {
  color: map.get($white, '100');
  background-color: map.get($blue, '70');
}
```

ドキュメントは下記になります。

https://sass-lang.com/documentation/modules/map/

現状の色の指定を使い続けてみて、自身がメリットとデメリットに感じることを挙げてみました。

## メリット

- 色の種類(黄色、青色など)ごとにどれくらいの種類のカラーコードを登録しているかが一目で分かる
- 登録していない色は指定できないので、デザインデータと整合性が取りやすい
- 一元管理しているので、色の変更があった際に変更しやすい

## デメリット

- カラーコードをグラデーションごとにルールを決めて登録している場合、後から色を追加しづらい
- 毎回カラーコードを検索して調べる必要がある
- カラーコードが増えてくるとメンテナンスしづらい
- どの色がどこで使われているのか分からないので、デザインを統一しづらい(例えば背景色やボタンの色がページによってバラバラになるなど)


メリット・デメリットに関しては、現状のリポジトリがデザインの色の整備されきっていないこと、コンポーネントの共通化が完了いないこと、CSS Modulesを使用していることなど、他の要因も影響しています。

## デメリットを改善するために進めること

- まずはデザインで使用されている色を見直し、整備する
    - 不必要に登録されている色がないか見直す
    - 色の役割と分類を見直し、例えばプライマリー、セカンダリー、背景色など、役割に応じた分類を行う
    - 現状では数字でカラーコードを登録しているだけにとどまっているので、どこでどの色を使用するのかを見直す
- スタイル名自体が目的を示すように、明示的な名前を作成してプロジェクト全体で一貫性を持たせる
    - 例: `$primaryColor`, `$errorBackgroundColor`のように明確な命名を行う
    - 例: `$cardBoxShadow: 0 0.5rem 0.2rem -0.2rem map.get($gray, '50');`など、よく使われるスタイルを変数化する

## まとめ

色の指定には様々な方法があり、プロジェクトの規模や性質に応じて最適な手法を選択することが重要です。
デザイナーと開発者で、統一性と実用性を確保するために、定期的にデザインの整備を行うことが必要だと思いました。
ABC380Cをjavascriptで解いた

# [今日の問題](https://atcoder.jp/contests/abc380/tasks/abc380_c)
↑押してください。
# 自分の回答(javascript)
```javascript
function Main(input){
    min = 1e18
    max = -1e18
    let abc = "abcdefghijklmnopqrstuvwxyz".split("")
    let ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
    let f = 3
    if(f == 0){
      input = parseInt(input.trim())
    }
    if(f == 1){
      input = input.trim().split("\n").map((a)=>parseInt(a))
    }
    if(f == 2){
      input = input.trim().split("\n").map((a)=>a.split(" ").map((b)=>parseInt(b)))
    }
    //ここより上は定型文です。
    input = input.trim().split("\n")
   let [n,k] = input.shift().split(" ").map((a)=>parseInt(a))
   let s = input.shift()
   a = s.split("0")
   b = s.split("1")
   s = s.split("")
   if(s[0] == "1"){
     m = 1
   }else{
     m = 0
   }
   list1 = []
   list2 = []
   for(let i = 0;i<a.length;i++){
     if(a[i].length != 0){
     list1.push(a[i].length)
     }
   }
   for(let i = 0;i<b.length;i++){
     if(b[i].length != 0){
     list2.push(b[i].length)
     }
   }
   //console.log(list1,list2,a,b)
   
   //console.log(list1,list2,a,b)
   list2.push(0)
   list1.push(0)
   res = []
   list1[k-2] = list1[k-1]+list1[k-2]
   list1[k-1] = 0
   list2[k-1-m] = list2[k-1-m]+list2[k-m]
   list2[k-m] = 0
   for(let i = 0;i<list1.length+list2.length;i++){
     if(m == 1){
       for(let j = 0;j<list1[i];j++){
         res.push(1)
       }
       for(let j = 0;j<list2[i];j++){
         res.push(0)
       }
     }
     if(m == 0){
       for(let j = 0;j<list2[i];j++){
         res.push(0)
       }
       for(let j = 0;j<list1[i];j++){
         res.push(1)
       }
       
     }
   }
   console.log(res.join(""))
   
  }
  Main(require("fs").readFileSync("/dev/stdin", "utf8"));
  

```
# 工夫した点
C問題からは愚直にやるとTLEするので注意します。まず1と0がそれぞれ何個連続であるかをlistにします。その後、連結する作業をして、もとの形のリストに戻して出力して完成です。
【VBA】VBE設定を変更して使いやすい環境にしよう

最近Twitter(X)にて、VBAを初めて使ったが、編集中に都度エラーが表示されてうっとおしいといった旨の投稿が目に入りました。

端的に言うとVBEのオプションでメッセージ表示の抑止ができることは皆さんご存じだと思います。自動構文チェックのチェックをOFFにするだけですね。（デフォルトON）

私はOfficeを入れるたびにVBEの設定を変更しているので、その情報を残しておけば、何かの役に立つかもしれないと思い、ここに残します。

## オプション設定について
### 編集タブ
下記の様に私は設定しています。
![スクリーンショット 2024-12-18 165749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/c1a1d5fd-494b-e8fb-4a41-022ceabdb3f1.png)

### エディターの設定タブ
エディターの設定タブでは、フォント指定や、色設定ができます。フォントはお好きなフォントをどうぞ。等幅フォントを指定するのが良いかと思います。
私は[PlemolJP](https://github.com/yuru7/PlemolJP)を使用しています。
![スクリーンショット 2024-12-18 165759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/97403400-8b0b-3471-e694-8784a2c477f6.png)

フォントサイズには注意点があり、3の倍数にしていないと等幅フォントでも位置ずれが発生するそうです。
https://x.com/KotorinChunChun/status/1868262514670415962
また、前景色、背景色の選択肢はあまりなく、中間色が選択できません。（無理やり変更する手段もあるみたいですが、DLLを編集するものなので、お勧めしかねます）

設定後の編集画面はこんな感じになっています。

![スクリーンショット 2024-12-18 165917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/e1e7998c-fc3d-16de-b90c-515e3b2f62a8.png)

## SQL編集画面も変えてみる
ここからはおまけです。

AccessデフォルトのSQL編集画面はフォントも小さく、かなり見づらいと思います。そこで、SQL編集画面の設定も変えてみます。
アクセスのファイル→オプションで下記画面が表示されます。
「現在のデータベース」を選択「Monaco SQLエディターを有効にする」のチェックをON（デフォルトONだったかも）
この項目はM365になってからでしょうか。
![スクリーンショット 2024-12-18 165950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/bf07a535-7175-8c09-9f79-5940ccd04330.png)
![スクリーンショット 2024-12-18 170008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/08722ba7-86c9-5416-3c73-d1333e8d6f64.png)
ONにするとサジェストがきいて少し便利かも（うっとおしいだけ？）
![スクリーンショット 2024-12-18 170039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/77749779-2679-7243-901f-db88a8c1151d.png)

オブジェクト デザイナーに移り、クエリデザイン配下の「クエリデザインのフォント」を変更。ここでは[Firge](https://github.com/yuru7/Firge)を指定しています。フォントサイズを大きくしましょう。

![スクリーンショット 2024-12-18 170211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/e8f473b0-fc95-cd78-c94e-5b544907153d.png)

![スクリーンショット 2024-12-18 170335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/d9c5faa9-74d3-fd42-91a7-1e226f77db52.png)

注意点があります。SQL編集画面以外のデザインビューの下部にある項目設定部分のフォントも大きくなってしまいます。そのあたりはバランスを取るしかないのでしょうね。

オワコンだ何だと言われているAccessですが、無事Office2024にも搭載されました。まだしばらく使うことになると思いますので、少しでも使いやすい環境でコーディングできるように設定してみてはいかがでしょうか。
自称デグレ発生率が低めの人が普段気をつけていること（レビュー編）

こんにちは、jof-fumiです！

この記事は、[よりそうアドベントカレンダー](https://qiita.com/advent-calendar/2024/yoriso) 20日目の記事としてお届けします。

[自称デグレ発生率が低めの人が普段気をつけていること（開発編）](https://qiita.com/jof-fumi/items/5c9c3d39f0fefb1958a9) を書いている時、もともとこの記事に開発編とレビュー編を一緒にまとめる予定でした。ですが、あまりにも長くなってしまったため、分割することにしました。  
とはいえ、開発編で大体のことを言い切ってしまったので、レビュー編の内容は少し薄めかもしれません。

---

## スタンス

私は常に次のような姿勢でレビュー作業に臨んでいます。
**「PRに書いていないことは、やっていないものと思う」**

これは、自分がPRを作る時にも意識しているポイントです。
修正内容的にやってなければならない動作確認や調査が書かれていない場合、やっていないと認識しています。

「この動作確認はやっているはずだ」という思い込みは、PR作成者がどれだけ優秀であっても、レビュワーからしたら事実ではなく、単なる想像（もはや妄想）にすぎません。
そのため、基本的にPR内容を疑うスタンスで臨んでいます。これはその人の信用とは無関係であり、疑う基準としてのルールです。  
（もちろん、「自動テストのケースを全部PRに記載しろ」というわけではありません。自動テストは大体GitHub ActionsでPR作成時に実行されるようにしているので、実質PRに「書かれていること」とみなしています。）

---

## 気をつけていること

### 1. 影響範囲の広い機能が修正されていた場合、pullしてGREP調査をする

共通コンポーネントや他のファイルから呼び出される関数など、影響範囲が広そうな場合は、自分のローカル環境にPRをpullしてGREP調査を行います。  
時間がない時は「GREP調査しましたか？」というコメントを残すだけにすることもありますが、基本的には自分で調査するようにしています。

結構めんどくさいのですが、これをすることで拾えた修正漏れなどが、どの現場でも幾度となくあるので、基本的にやって損はない作業だなと思っています。


ちなみに、自分が作業者の時は、逆に「GREPしました？」と聞かれたくないので、調査内容や自動テスト外の自分で打鍵したテストを網羅的に書くようにしています。
ちょうど、スタンスに書いたことと表裏一体の関係性になってます。

（自動テストを導入推進して、これを全くやらなくていいようになりたい！）

---

### 2. 結合度の高い実装を許容しない

結合度の高い実装を許容すると、以下の問題が発生します。
- 影響範囲が広がり、デグレが発生しやすくなる。  
- 既存コンポーネントの使用方法が崩れ、今後の修正でもデグレの可能性が高まる。  

このため、結合度が高い実装は可能な限り許容しないようにしています。
結構当たり前かな〜と思いつつ、作業者が他のレビュワーとそれなりに指摘対応をしたあとに気づいたりしたら、ちょっと言いづらいですよね…。
でも妥協はせず、指摘するようにしています。

---

### 3. ファイル数の多くなるようなPRは、作業を分割して小さいPRにしてもらう

これは[開発編](https://qiita.com/jof-fumi/items/5c9c3d39f0fefb1958a9)でも触れたポイントですが、レビューでも同様です。  
できる限り作業を分割し、小さな単位でPRを作成してもらうようにしています。  
とはいえ、「作り直せ」と強要するのではなく、「次回からそうしてね〜」といった柔らかな対応を心がけています。

結局、ファイル数が多いPRは次のような問題を抱えていると考えています。
- **修正対象の理解が不十分:** 修正対象の仕様や挙動、ロジックを適切に理解していれば、影響範囲を小さくする作業分割が可能 
- **設計の考慮が不十分:** 修正対象を理解してもできない場合は、コンポーネント間の結合度が高いと考えられるので、設計の見直しが必要


また、シンプルに修正箇所が多いと見落としが発生しやすくなり、**レビュワーの負担増加** にもつながります。

---

## AIの活用

これに加えて**AI**の活用も行っています。  
https://qiita.com/punkshiraishi/items/629753be2e4d08fd1f42

**よりそう**ではAIの活用を積極的に推進しており、今季はCursorというAIエディタの導入が実現しました。有料プランを契約してもらったおかげで、開発スピードが飛躍的に向上したメンバーもいます。  
良い会社ですね〜。

--- 
### 最後に

デグレを防ぐ取り組みは、個々の開発者だけでなくチーム全体の責任です。  
今回紹介したレビュー時に気をつけているポイントは、私が実際に実践している、どちらかといえばマインドに近い部分です。  
もちろん、チームとして仕組み化を進め、自動的にバグを減らす取り組みも実践しています。

ただし、個人のマインドセットがないと、仕組みの必要性に気付けなかったり、スピード重視で修正漏れが発生したりすることもあります。  
そのため、チーム全体でマインド面を成熟させながら、**安心してリリースできる開発チーム**を目指していきたいと思います。

最後まで読んでいただき、ありがとうございました！
ABC380Bをjavascriptで解いた

# [今日の問題](https://atcoder.jp/contests/abc380/tasks/abc380_b)
# 自分の回答(javascript)
```javascript
function Main(input){
    min = 1e18
    max = -1e18
    let abc = "abcdefghijklmnopqrstuvwxyz".split("")
    let ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
    let f = 3
    if(f == 0){
      input = parseInt(input.trim())
    }
    if(f == 1){
      input = input.trim().split("\n").map((a)=>parseInt(a))
    }
    if(f == 2){
      input = input.trim().split("\n").map((a)=>a.split(" ").map((b)=>parseInt(b)))
    }
    //ここより上は定型文です。
   input = input.trim().split("|")
   count = 0
   res = []
   while(true){
     count ++
     if(input[count].length == 0){
       break
     }
     res.push(input[count].length)
   }
   console.log(res.join(" "))
  }
  Main(require("fs").readFileSync("/dev/stdin", "utf8"));
  ```
  # 工夫した点
  "|"でsplitすることによって楽にできた。
モダン化、革新、そしてアリババクラウドで成長する

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/modernize-innovate-and-thrive-with-alibaba-cloud_601885?spm=a2c65.11461433.0.0.4ee35355MlSWeA)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

<div class="wrap-main-left-article markdown-body">
企業がデジタルトランスフォーメーションの旅を開始するとき、一般的には最新の技術を活用して近代化し、革新を行う方法を探します。このような最新の技術は、Alibaba Cloud、Azureなど主要なパブリッククラウドプラットフォームが提供しています。ワークロードをクラウドに移行する決定は、通常、以下のような実際的なビジネス理由と戦略的理由に基づいて行われます：

- インフラストラクチャの管理からアプリケーションの革新への焦点のシフト
- オンプレミス環境によく見られる可用性、スケーラビリティ、および機動性の制限への対応
- 老朽化したハードウェアやライフサイクル終了に近いソフトウェアの信頼性のある代替手段の探求
- オンプレミスでは利用できないクラウドサービスを利用できるハイブリッドアーキテクチャの実装
- コンプライアンスを維持しつつセキュリティを強化すること

これらの課題と機会は、ビジネスのアプリケーションランドスケープの見方を変えることで、変化するニーズに対応するクラウドプラットフォームへと推進しています。<a href="https://www.alibabacloud.com/en/solutions/cloud-migration" target="_blank">クラウド移行</a>とは、アプリケーション、仮想マシン、データベース、インフラストラクチャなどをオンプレミス環境からクラウドへ、またはクラウドからクラウドへ移行するプロセスです。戦略がなければ複雑なプロセスになります。多くのクラウドプロバイダーは価値ある有用なサービスを提供していますが、それらは消費量の増加とコストの上昇につながります。このような状況下で、Alibaba Cloudへの移行は効率的でコスト効果の高いソリューションを提供し、組織が移行プロセスを簡素化・合理化しながら高度なクラウド技術とAI革新の恩恵を受けることを支援します。

多くの組織は、さまざまな種類のツールを使用してアプリケーション、ワークロード、データ、その他のリソースをクラウドに移行します。しかし、ツールが多すぎると一貫性が失われ、近代化プロセスが遅れたり複雑化したりすることがあります。Alibaba Cloudの移行サービスは、スムーズで効率的な移行を可能にする包括的なソリューションを提供します。これらのサービスにより、セキュリティを高めて数ステップでAlibaba Cloudへの移行を評価・計画し、コスト効果の高いツールを使用してリソースを管理して事業継続を確保することができます。また、他のプラットフォームを使用して移行することも、<a href="https://www.alibabacloud.com/en/solutions/cloud-migration" target="_blank">Alibaba Cloudの移行サービス</a>やClick2Cloudのような信頼できるパートナーに移行プロセスを任せることが可能です。

Click2Cloudでは、ビジョン設定ワークショップを通じてお客様がAlibaba Cloudがどのようにビジネスを変革するかを明確に理解できるようにサポートしています。AI駆動の評価により、現在の環境に関する洞察を得て、カスタマイズされた移行ロードマップを生成します。また、実際のユースケースを示してAlibaba Cloudの能力を展示し、シームレスな展開のためのランディングゾーンのアーキテクチャブループリントを提供します。

医療、金融サービス、ガバナンス、小売、製造業など、どのような業界でも、Alibaba Cloudはビジネスの市場投入速度を加速するための変革的なソリューションを提供できます。提供する移行サービスは、ローコードアプリケーションやデータベースなど多くのものをサポートします。信頼性の観点からは、Alibaba Cloudは常に移行に高可用性機能とディザスタリカバリ機能を含むことで、事業中断を最小限に抑えます。移行中に炭素排出量を削減するための炭素知能型持続可能性ソリューションも利用できます。

結論
<a href="https://www.alibabacloud.com/en/solutions/cloud-migration" target="_blank">Alibaba Cloud移行</a>は柔軟性があり、単なる技術的な変化以上のものであり、革新、効率性、そして持続可能な未来への戦略的なステップです。業界固有のニーズに対応し、容易な移行に役立つ堅牢なツールを備えています。これにより組織はオペレーションの近代化、セキュリティの強化、コスト削減を実現できます。移行プロセスを通じてインフラストラクチャを近代化することで、ROIを最大化し、革新を促進することができます。使いやすいツールを使用して、移行の旅をシームレスに追跡・管理し、各ステップでのシンプルで効率的なオペレーションを確保できます。段階的に移行するか、クラウドへの完全な移行を行うかに関わらず、企業はAlibaba Cloudの包括的なソリューションを通じて新たな機会を開拓し、成長を加速し、価値を創造することができます。

免責事項: ここに表明されている見解は参考用であり、必ずしもAlibaba Cloudの公式見解を代表するものではありません。
</div>
なぜFinOpsがクラウド投資の可能性を解放する鍵となるのか？

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/why-is-finops-the-key-to-unlocking-your-cloud-investment-potential_601884?spm=a2c65.11461433.0.0.4ee35355MlSWeA)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# 今日の高速な世界におけるクラウドの活用と課題

今日の高速な世界では、多くの組織が革新を推進し、競争力を維持するためにクラウドを採用しています。しかし、この移行には、クラウドコストを効果的かつ効率的に管理および最適化するための多くの課題が伴います。クラウド財務管理は当初の期待を超えており、多くの組織がどのように監視し、割り当て、そして支出を制御すべきかに苦慮しています。<a href="https://www.alibabacloud.com/en/solutions/container/finops" target="_blank">FinOps</a>は、単なるソリューション以上のユニークなアプローチであり、よりスマートな前進方法です。自動化、高度な最適化ツール、戦略的計画機能を提供することで、クラウド実践者が基本的なコスト管理を超えることができます。各組織の独自のニーズに合わせたサポートを提供し、あなたとともに進化することを設計しており、クラウド投資を最大限に活用するお手伝いをします。複数のプロバイダー間でのクラウドコストを明確かつ統一されたビューで表示することで、支出パターンを比較および分析し、最適化の機会を見つけることが容易になります。過去のコストと使用データ、業界ベンチマーク、予測分析を活用して、正確な予測と見通しを提供します。これらの洞察を武器に、予算編成に積極的なアプローチを取り、リソースの割り当てを最適化し、よりスマートな決定を下すことができます。これにより、予算内に収まるだけでなく、妥協することなくビジネス目標を達成することができます。<a href="https://www.alibabacloud.com/en/solutions/container/finops" target="_blank">FinOps</a>は、最適化の取り組みをスケーリングし、費やされる每一ドルの価値を最大化するお手伝いをします。高度な分析と直感的な可視化ツールにより、クラウドコストについて深い理解を得ることができます。カスタマイズ可能なダッシュボードとレポートにより、コストドライバーの特定、異常値の検出、精度の高いコスト削減戦略の実装が容易になります。既存の財務および調達システムとのシームレスな統合により、ワークフローを合理化し、一貫して効果的なコスト最適化とガバナンスを確保します。

## なぜFinOpsが必要なのか？
- データ駆動型のコスト決定を行う
- もっと多くの収益を生成する
- クラウドコスト管理を自動化する

## FinOpsを始めるには？

<a href="https://www.alibabacloud.com/en/solutions/container/finops" target="_blank">FinOps</a>は、正しいプラットフォームを選択し、コストを追跡するだけではありません。学習の機会、課題、成功のマイルストーンが詰まった旅です。おそらく旅の最も重要な部分は、あなたのビジネスにとって何が機能し、何が機能しないかを学ぶことです。Click2Cloudでは、Alibaba Cloud Financial Operations Solutionを選択し、ビジネスで使用を開始することをお勧めします。Alibaba CloudのFinOpsソリューションを活用することで、クラウドコスト最適化をサポートするFinOpsベストプラクティスを実装し、組織のクラウドビジネス価値を最大化することができます。クラウド環境で細粒度のコスト分析を簡単に実装し、最適な支出決定に役立つ貴重な洞察を得ることができます。FinOpsベストプラクティスは、コストを人々、製品、プロセスに自動的にマッピングし、誰のために、どこで、なぜコストが変化しているかを確保するためのパーソナ分析をサポートします。総所有コスト計算機を使用してクラウドコストを見積もります。コスト管理ソリューションにより、パフォーマンス、コスト、異常値の可視性を確保し、チームが情報に基づいたビジネス決定を行うことを可能にします。コスト分析ソリューションを使用して、コストを報告、ベンチマーク、予測し、データを洞察に変えることができます。

### FinOpsをビジネス目標に合わせる
- **透明性と責任感を醸成する**：さまざまなプロジェクトまたは部門間でコスト割り当てを分散させることで、クラウドリソースの使用に対する責任を持つ文化を醸成します。このような明確さは、費用に関連する役割と責任の完全な理解につながります。
- **進捗を追跡し、先を見据える**：パフォーマンス指標を使用して過去のコストを振り返り、将来の計画を立てることで、チームが予算管理に必要なツールを提供します。
- **スマートな決定を促進する**：チームにリアルタイムの洞察を提供し、ワークロードの実行コストを理解できるようにすることで、迅速かつ情報に基づいた選択を行い、効率を向上させることができます。
- **重要なところでのコスト削減**：非効率を特定し、コミットメントベースのディスカウントなどの節約機会を活用して、クラウド投資から最大の価値を得ることができます。

**免責事項**：ここに表明されている見解は参考のみであり、必ずしもAlibaba Cloudの公式見解を代表するものではありません。
SolidJSのエコシステムが弱いって本当？

この記事は、[SolidJSアドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/solidjs) 25日目の記事です。

## SolidJSなどの最近出てきたライブライはよく「エコシステムが整うまで触るのやめとくか」って言われますよね

私も言ってました。

ですが、最近SolidJSを触り始めて「エコシステム十分そろってないか？」と思ったので調査した結果をまとめていきます。

## 全部ある

全部ありました。

- フレームワーク
- 認証
- UIライブラリ
- styling用のライブラリ
- 無限スクロール
- graphql
- API呼び出し
- i18n
- Form
- Storybook
- Test
- router
- 状態の永続化
- アニメーション

### フレームワーク

Next.jsみたいなフレームワークの[SolidStart](https://start.solidjs.com/)がある

- Client-side rendering (CSR)
- Server-side rendering (SSR)
- Static site generation (SSG)

全部できる

## 認証

[mediakit](https://mediakit-taupe.vercel.app/auth/install) がある

詳しくは以下

https://qiita.com/no_job_swan/items/9c8886e860a9c658c74c

## UIライブラリ

shadcnみたいなライブラリは２つある：[shadcn-solid](https://github.com/hngngn/shadcn-solid), [SolidUI](https://www.solid-ui.com/)

MUIみたいなライブラリの[SUID](https://suid.io/getting-started/installation)がある

SUIDは[React2Solid](https://suid.io/tools/react-to-solid#aW1wb3J0ICogYXMgUmVhY3QgZnJvbSAicmVhY3QiCmltcG9ydCBCdXR0b24gZnJvbSAiQG11aS9tYXRlcmlhbC9CdXR0b24iCgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDb3VudGVyKHByb3BzOiBhbnkpIHsKICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IFJlYWN0LnVzZVN0YXRlKDApOwogIGNvbnN0IHsgbGFiZWwgPSAnSW5jcmVtZW50JywgLi4ub3RoZXJQcm9wcyB9ID0gcHJvcHM7CiAgY29uc3QgcHJvcHNBbmRWYWx1ZSA9IHsgLi4ucHJvcHMsIHZhbHVlIH07CiAgY29uc3Qgb25DbGljayA9ICgpID0+IHNldFZhbHVlKHZhbHVlICsgMSk7CgogIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7CiAgICBjb25zb2xlLmxvZygiVmFsdWU6ICIgKyBwcm9wc0FuZFZhbHVlLnZhbHVlKTsKICB9LCBbdmFsdWVdKTsKCiAgcmV0dXJuIDxkaXYgey4uLm90aGVyUHJvcHN9PgogICAgVmFsdWU6IHt2YWx1ZX0KICAgIDxCdXR0b24gb25DbGljaz17b25DbGlja30+e2xhYmVsfTwvQnV0dG9uPgogIDwvZGl2Pgp9Cg==)があるから移行も簡単

## Styling

tailwindは普通に使える

[macaron.js](https://macaron.js.org/docs/installation)がある

## 無限スクロール

[Tanstack Virtual](https://tanstack.com/virtual/latest/docs/introduction)がある

## GraphQL

[urql](https://qiita.com/no_job_swan/items/cadb6c4a8fd7aacb9494)がある

apolloはない

## API呼び出し

[Tanstack](https://tanstack.com/query/latest/docs/framework/solid/overview)がある

## i18n

[solid-primitive](https://primitives.solidjs.community/package/i18n)にある

## Form

[modularforms](https://modularforms.dev/)がある

## Storybook

[solid用のプラグイン](https://github.com/storybookjs/solidjs)がある

## Test

[solid用のtesting-library](https://github.com/solidjs/solid-testing-library)がある

## Router

[solid-router](https://docs.solidjs.com/solid-router)がある

## 状態の永続化

[solid-primitive](https://primitives.solidjs.community/package/storage/)にある

## アニメーション

- [transition-group](https://primitives.solidjs.community/package/transition-group)
- [tween](https://primitives.solidjs.community/package/tween)

がある

## 終わりに

私の思う「全部ある」でしたが、足りないものがあると思ったらコメントください。追記します。
ABC380A問題をjavascriptで解いた

# [今回の問題](https://atcoder.jp/contests/abc380/tasks/abc380_a)
```javascript
function Main(input){
    min = 1e18
    max = -1e18
    let abc = "abcdefghijklmnopqrstuvwxyz".split("")
    let ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
    let f = 3
    if(f == 0){
      input = parseInt(input.trim())
    }
    if(f == 1){
      input = input.trim().split("\n").map((a)=>parseInt(a))
    }
    if(f == 2){
      input = input.trim().split("\n").map((a)=>a.split(" ").map((b)=>parseInt(b)))
    }

    //ここから上は定型文です。
   input = input.split("").map((a)=>parseInt(a))
   input.sort((a,b)=>a-b)
   input = parseInt(input.join(""))
   if(input == 122333){
     console.log("Yes")
   }else{
     console.log("No")
   }
  }
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
```
# 工夫した点
"Yes"と出力しなければいけないのは、60通りもあるが、sortしてから試すことによって、122333の一通りを試せば良くなります。
LLM時代に必須！？Slurmでジョブを実行する方法

# はじめに

こんにちは、京セラコミュニケーションシステム　川村（@kccs_takahiro-kawamura）です。

前回（[LLM時代に必須！？トレーニングジョブを管理するSlurmのセットアップ手順](https://qiita.com/kccs_takahiro-kawamura/items/bb0ffe731030aec3e4f5)）に引き続き、Slurmについて記載します。
今回は、前回作成した環境で簡単なジョブを実行する手順と注意点を紹介いたします。

:::note info
本記事は2024年12月ごろに作成しております。よって、引用している文章などはこの時点での最新となります。ご了承ください。
:::

## 本記事の対象者
* Slurmでジョブ管理を検討している方

# 本記事におけるサーバー構成
以下の図のようなサーバー構成を前提に記載します。
また、サーバーのOSはUbuntu 24.04LTSを使用します。
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164163/121770dc-d776-6717-dde2-01e081a91b90.png)

#### 管理ノード
Slurmのクラスターとジョブを管理するサーバーです。
slurmctldが動作します。

#### 計算ノード
Slurmのジョブを実行するサーバーです。
slurmdが動作します。

# ジョブの準備
ジョブを実行するためには、ジョブの内容を記載したシェルファイルを用意する必要があります。
今回は下記のようなジョブにしたいと思います。
```
#!/bin/bash

#SBATCH -J job
#SBATCH -o output/output.txt
#SBATCH -e errors/errors.txt
#SBATCH -p debug
#SBATCH -n 1

python3 job.py
sleep 30
```
このシェルファイルはジョブを送信する **管理ノード** に作成してください。
`#SBATCH`と書いてある部分はジョブ実行時のオプションです。
`-J`: ジョブの名前を指定します。
`-o`: ジョブの標準出力を保存するパスを指定します。
`-e`: ジョブの標準エラーを保存するパスを指定します。
`-p`: ジョブを実行するパーティションを指定します。
`-n`: ジョブの実行に使用するノード数を指定します。

ジョブとしては、`job.py`というPythonファイルを実行しています。
こちらは下記のような内容にしたいと思います。
```
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print(‘hello world’)
```
このPythonファイルのようなジョブの実態として実行するものは、 **計算ノード** に作成してください。
これらを合わせて、ジョブの実行結果としては
`hello world`と記載されたファイルが`output/output.txt`に
エラーが発生していた場合は、エラー内容が記載されたファイルが`errors/errors.txt`に作成されます。

シェルファイルの中に記載したパスが相対パスの場合、
管理ノードでジョブを送信したユーザーと同名のユーザーが計算ノードで必要であり、そのユーザーのホームディレクトリが参照されます。

# ジョブの実行
ジョブの実行は`sbatch`コマンドで行います。
```
$ sbatch job.sh
```
これで計算ノードでジョブを実行するように指示が送信されています。
送信されたジョブの状態やどの計算ノードで実行されているか確認する場合は`squeue`コマンドを使用します。
```
$ squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
   30     debug      job    qiita  R       0:19      1 slurm-compute-01
```
ジョブの実行が完了すると`squeue`コマンドの結果に表示されなくなります。


# まとめ
今回は、簡単なジョブの例を用いてSlurmでジョブを実行するための準備と実行方法について記載しました。
ジョブの実態となるプログラムを毎回計算ノードに配置するのは手間なので、シェルファイルの中でダウンロードしたりするのも1つの手だと思います。
皆さんもこれを機にSlurmでジョブの管理をしてみましょう！

次回の記事もお楽しみに！

## おしらせ

弊社X（旧：Twitter）では、Qiita投稿に関する情報や各種セミナー情報をお届けしております。情報収集や学びの場を求める皆さん！ぜひフォローしていただき、最新情報を手に入れてください😄

https://x.com/kccs_digital
matplotlibで画像セグメンテーションのマスク画像を表示するとき，同じクラス番号のハズなのに色が変わってしまうときの対処法

# 解決方法：``matplotlib.pyplot.imshow``の引数に``vmin``,``vmax``を設定する
matplotlibでは，渡された2次元配列の最大値によって，各値に割り当てるカラーを決めているらしい．
そのため，マスク画像に最大値のクラスが含まれていない場合（4クラス分類なのに，マスク画像に3番の値が含まれていとき），matplotlibの最大値が変わってしまい，割り当てられるカラーが変化してしまう．

そのため，plt.imshowする際に，vmin=0（最小値）とvmas（最大値）=クラス数-1と明示的に指定することで，タグ番号が同じなのに色が変わってしまう問題を解消できる．

# 例：4クラス分類の場合（画像セグメンテーションの機械学習）
私が直面したトラブルの簡単な例として，画像セグメンテーションのマスク画像を``matplotlib``を用いて表示することを例に挙げます．

例えば，以下のようなプログラムでマスク画像を表示するとします．
```ex1.py
import matplotlib.pyplot as plt

# マスク画像（4×4 Pixelと仮定）
img = [[0,1,2,3],
       [3,2,1,0],
       [0,1,2,3],
       [3,2,1,0]]

plt.imshow(img)
```
このとき，以下のような画像が出力されます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/10e0dc4a-ffb3-62e7-7b96-218154d3eaa8.png)


しかし，imgの要素の最大値が**2**であった場合，
```ex1-2.py
import matplotlib.pyplot as plt

# マスク画像（4×4 Pixelと仮定）
img = [[0,1,2,2],
       [2,2,1,0],
       [0,1,2,2],
       [2,2,1,0]]

plt.imshow(img)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/b91f03af-e793-e600-f1fe-ac222fabc9f9.png)
出力はこのようになります．要素の**3**の値がないだけで，それ以外の0,1,2,3の色も最初の例の出力と大きく異なってしまいます．

そこで，``plt.imshow``の引数に``vmin``，``vmax``を加えて以下のようなプログラムに改良します．
```ex1-2_improvement.py
import matplotlib.pyplot as plt

# マスク画像（4×4 Pixelと仮定）
img = [[0,1,2,2],
       [2,2,1,0],
       [0,1,2,2],
       [2,2,1,0]]

plt.imshow(img, vmin=0, vmax=3) # 4クラス分類なので，0~3
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/59af8314-3094-de18-f91c-08eda02405fb.png)
すると，0~2の値の色は最初の例ののまま出力することができました．

# 余談
私は，画像セグメンテーションの推論画像を表示するとき，検出対象のマスク領域は合っているのに，クラス番号が違うといトラブルにに出くわし，困っていました．ずっと学習の仕方が悪いのかと思っていたのですが，``matplotlib``の仕様でそのように見えていただけなんですね（笑）

対処に大変時間を要しました．灯台下暗しです．

# 参考
https://qiita.com/hirowatari-s/items/e51cf26d093fbefa5598
IAPで外部IPアドレスを持たないGCEインスタンスにHTTPアクセスする

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki)です。

先日とある案件を担当している方から、

「外部IPアドレスを持たない Compute Engine 上でアプリケーションを開発しようとしている。お客さん自身は内部 IP アドレスで直接アクセスできる模様。うちの環境からも VM に HTTP アクセスしたい。どうしたら良い？」

と質問いただきました。

## 状況整理

話を少し聞いてみると以下の状況でした。

- お客さんの Google Cloud プロジェクト
- Compute Engine 上でアプリケーションを開発・稼働させようとしている
- Compute Engine は直接外部IPアドレスを持たない（持たせない）
- ネットワーク的には繋がっていない
- お手軽に、コストをかけずに

アプリケーション ロードバランサを経由してアクセスするのが良いんじゃないかなと思いますが、それもすぐは厳しいということでした。

## Identity-Aware Proxy(IAP) で TCP 転送

そんなわけで本題です。

[弊社櫻木の記事](https://qiita.com/kccs_nobuaki-sakuragi/items/38af1c9c9408ce87925a)で主にメンテナンスでの利用目的で Identity-Aware Proxy（以下 IAP）が紹介されておりますが、**IAP TCP 転送は任意のポートが指定可能**ですので HTTP アクセスにも利用できます。

トンネルを張る手間はありますが今回の状況では有用な手段かなと思います。

https://cloud.google.com/iap/docs/using-tcp-forwarding?hl=ja

## 準備と HTTP アクセス

前提：外部 IP アドレスが割り当てられていない VM が作成済みで Apache が起動済み

### 1. ファイアウォールルールの作成

VM の存在する VPC のファイアウォール上りルールで 35.235.240.0/20 からの 80/TCP (HTTP) 接続を許可します

### 2. ロール付与

HTTP アクセスする（IAP を利用させる）Google アカウント / グループ に以下のロールを付与します

- IAP で保護されたトンネル ユーザー（roles/iap.tunnelResourceAccessor）

### 3. gcloud コマンドで IAP TCP 転送

以下のコマンドで localhost - VM 間に IAP を経由したトンネルを張ります

```
gcloud compute start-iap-tunnel ${INSTANCE_NAME} 80 \
    --local-host-port=localhost:8080 \
    --zone=${ZONE}
```

トンネルが張れたら以下の応答が返ってきます

```
Testing if tunnel connection works.
Listening on port [8080].
```

### 4. ブラウザで `localhost:8080` にアクセス

特に異常がなければ Apache のデフォルトページが表示されるはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/42432d88-56c0-886e-44b5-5451201f9d3e.png)

## まとめ

IAP TCP 転送を使用したトンネルを張ることでプライベート IP アドレスのみの VM に対して簡単にアクセスが可能です。
この記事が少しでも役に立てたら嬉しいです。

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

https://cloud.google.com/iap/docs/using-tcp-forwarding?hl=ja

https://zenn.dev/google_cloud_jp/articles/connecting-to-google-compute-engine

https://cloud.google.com/solutions/connecting-securely?hl=ja#external

https://cloud.google.com/compute/docs/connect/ssh-internal-ip?hl=ja

https://cloud.google.com/compute/docs/connect/ssh-using-iap?hl=ja
真のエンジニアを目指して一人アドベントカレンダーをした感想

## はじめに
12月25日に向かい、街はクリスマスムードになってきましたが、エンジニア界隈では12月と言えばアドベントカレンダーの季節ですね。
実は今回「真のエンジニアを目指して」というアドベントカレンダーを作り、自分一人で毎日記事を投稿していました。

https://qiita.com/advent-calendar/2024/devmatsuko

内容は基本的なCSに関するアウトプット記事がメインですが、たまに変なのも混じっています。
本記事ではその振り返りをしたいと思います。

## 私について
- エンジニア歴3年（元フィールドSE3年、2021年に未経験からWebエンジニアに転職）
- 主にバックエンド（Ruby on Rails、Go）中心でたまにReact使ってフロントも触っていた
- 現在無職。転職活動が最近終わった

## なぜやろうと思ったか
前述の通り現在前職を退職&転職活動中で少し時間ができたため何か勉強&アウトプットしようかな、と漠然と思っていました。
そんな時にたまたまこの記事を見つけました。

https://qiita.com/mackeee-orange/items/afbed5ec3816d4af2e58

こちらには本物のバックエンドエンジニアになるために学んでおくべきことが書かれており、何を勉強しようか悩んでいた私は「とりあえず愚直に何も考えず、このロードマップに従って勉強してみる」ことにしました。

今回作成したカレンダー「真のエンジニアを目指して」に登録されている記事は、上記ロードマップの「Backendロードマップ 〜ビギナー編〜」の内容がほとんどになります。

また、このアドベントカレンダーを進めるにあたって掲げた目的を以下の3つにしました。
- アウトプットの練習をする。25日間やり通すこと
- 最後の復習と思って取り掛かること
- たまに変な記事も書いてみること

## なぜビギナー編？
3年もエンジニアしてるんだしせめてジュニア編だろ！って思いますよね。
ご想像の通り、ほとんどの内容は既知の知識で、復習になりました。
ただ今回このカレンダーを作った目的の一つに「アウトプットの練習」が入っているので、テーマは簡単にしてとにかく学び、それをアウトプットする練習を行うことを第一に考えていました。



## 1日1記事を書くためにやったこと
**生成AIは思いっきりフル活用しました。**
が、[Qiitaのコミュニティガイドライン](https://help.qiita.com/ja/articles/qiita-community-guideline#ai) には

> AIが生成した内容は、そのまま投稿するのではなく、正しいかどうかを検証した上で投稿するようにしましょう。

と記載がある通り、そのまま投稿するなどはしませんでした。
実際、生成AIが作った記事は**変な言い回しがあったり、間違いがあったりしました。**（例えばSecureをシーキュアーと呼んでたり）

とはいえ、1日1記事書くというのは想像の何倍も大変でした。。。（ホンマきつい）
少しでも効率よく学習し、アウトプットできるように下記の手順で記事を作るようにしていました。

1. 生成AIに「「◯◯について」というタイトルで記事を書きたいので、構成案を考えてください」と投げて、ざっくり構成案を提案してもらう
1. 提案された構成案の各項目についてググり、調査する
1. 調査結果を自分の言葉で記事にする。生成AIが作った文言がそのまま使えそうなら流用する

目的はあくまで自身の学習なので、生成AIには「何を調べるべきか」だけを提案してもらい、それを自分で調査しながら学習するというやり方で進めました。

## 実際やってみてどうだったか
### ざっくり感想
一応3年エンジニアやっている身なので、やはりほとんどの内容は復習になりました。
ただ意外と記事にする前提で調べ学習をしてみると**初めて知る内容も多かったです。**
特に技術の概要を知っていても「なぜその技術が生まれたのか」「どういう課題があってその技術を使うのか」などは興味を持って調べないと学ぶことはないな〜と感じたのでいい機会になりました。

次にやってみて良かったことと反省点をまとめます

### 良かったこと
- 生成AIで骨子を作り、それを修正するというプロセスが時短に繋がる かつ しっかり学習することができた
- アウトプットの習慣がついた。スピードが上がった
- たまについたいいねやストック通知で学習のモチベーションが上がった

### よくなかったこと
- 記事の内容が中途半端な踏み込み具合になってしまった。
- 図を作るのを面倒くさがってしまった（生成AIを使って作れるか試みたが、プロンプトが下手くそなのか思った通りの図が作れず。。。）
- しんどい日は生成AI作の文章が多めになってしまった


## 終わりに
まだまだ真のエンジニアへの道のりは長いですが、本アドベントカレンダーを通して学べたことも多く、やって良かったと思います。（何より途中で飽きたりしなかったのが偉いと勝手に思ってます
今後も定期的な学習のアウトプットを続けていき、気力があれば来年のアドベントカレンダーもワンランク上の学習アウトプットができればと思います！
のんびりではありますが成長していければと思います。
読んでいただきありがとうございました！！！

P.S. メリークリスマス🎅
女性エンジニア応援記事を書いてみた！

# はじめに

エンジニアとして働き始めて、気づけば10年以上が経ちました。
私がこの道を選んだきっかけは、学生時代に情報系の勉強をしていたことです。

エンジニアの世界では、中途採用の方が一定の仕事経験を持っているケースが多いですが、新卒採用では少し事情が異なります。
意外なことに、男女問わず文系出身で入っる方が多く見られます。

プログラミングができなくても、パソコン操作や周囲との円滑なコミュニケーションが得意であれば、十分に活躍できる場面があります。

とはいえ、プログラミングを学ぶ意欲があるなら、新人のうちにしっかりと学んでおくことをおすすめします。
この時期は、先輩から丁寧に指導を受けられるチャンスが多いので、ここで基礎を身につけると後々役立ちます。

# エンジニアの仕事について

「エンジニア」と聞いて、まず頭に浮かぶのは「システムエンジニア（SE）」ではないでしょうか。しかし、エンジニアの仕事は実際にはもっと多岐にわたります。エンジニアと一言で言っても、その仕事内容や求められるスキルは職種によって大きく異なります。

### エンジニアの種類

エンジニアといっても、さまざまな職種があります。以下は代表的な例です

 - **システムエンジニア（SE）**
 ソフトウェアの設計や開発を担当するエンジニア
 - **インフラエンジニア**
 サーバーやネットワークなど、システム基盤の設計・構築を担当
 - **ネットワークエンジニア**
 ネットワーク環境の構築や運用を行う専門職
 - **Webエンジニア**
 Webアプリケーションの開発を担当
 - **フロントエンドエンジニア**
 ユーザーが直接触れるWeb画面やUI部分を開発
 - **バックエンドエンジニア**
 サーバーサイドやデータベースの設計・構築を担当
 - **フルスタックエンジニア**
 フロントエンドからバックエンドまで幅広く対応
 - **セールスエンジニア**
 顧客との技術的なやりとりや提案を担当
 - **制御・組み込みエンジニア**
 ハードウェアに組み込むソフトウェアを開発
 - **テストエンジニア**
 システムの品質を担保するためのテスト設計・実行を担当

これ以外にも、専門的な分野を担当するエンジニアは数多く存在します。


### 大きく分けると「システム系」と「インフラ系」

エンジニアの仕事は、大きく分けると以下の2つに分類できます。

 - **システム系**
ソフトウェアやアプリケーションの設計・開発を行う仕事。システムエンジニアやWebエンジニアなどが該当します
　
 - **インフラ系**
 システムが動くための基盤を支える仕事。インフラエンジニアやネットワークエンジニアが含まれます

## システムエンジニアの仕事の流れ
システムエンジニアの代表的な仕事である「システム開発」は、以下のようなステップで進められます。

 - **要件定義**
クライアントが求めるシステムの仕様や目的を明確化
 - **基本設計**
要件をもとに、システム全体の構造や動作を設計
 - **詳細設計**
 基本設計をもとに、より具体的な仕様を設計
 - **プログラミング**
 設計書に基づいて、実際にプログラムを作成
 - **テスト**
開発したシステムが要件通り動作するかを確認
 - **保守**
運用中のシステムの修正や改善を行う

これらの工程の中で、特に重要なのが「要件定義」と「テスト」です。要件定義が曖昧だとシステム全体に影響を及ぼし、テストが不十分だとトラブルの原因になります。

# エンジニアの年収について

エンジニアの仕事は、性別に関係なく、スキルと経験が収入に直結する職種です。
スキルや経験が増えるほど年収も上がりやすい、いわば「**スキル = 年収** 」という傾向が強い業界といえます。

興味深い調査結果を紹介した記事がありましたので、こちらに共有します。
このデータを見てみると、確かにスキルと経験の積み重ねが年収アップに直結していることがわかります。

これを見ていただければ、エンジニアのキャリアにおいてどのように収入が上昇していくのか、よりイメージが湧くと思います。

![スクリーンショット 2024-11-23 6.57.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828745/4d6f3747-4935-27b6-f913-026b4dde531d.png)
参考サイト：[経済産業省｜IT関連産業の給与等に関する実態調査結果](https://warp.da.ndl.go.jp/info:ndljp/pid/11623215/www.meti.go.jp/press/2017/08/20170821001/20170821001-1.pdf)



# まとめ
エンジニアの仕事は、単なるプログラミングだけではありません。
システム全体を設計し、クライアントの要望を形にするための幅広いスキルが求められます。また、インフラエンジニアやテストエンジニアなど、システムを支える役割も重要です。

これからエンジニアを目指す方は、どの分野に興味があるかを考えつつ、自分のスキルを伸ばしていくことが大切だと思います。

以上、最後まで読んでいただき、ありがとうございました
Raspberry Pi Pico WのLチカでつまづいた話

Raspberry Pi Pico(Wなし)にて、内臓LEDの仕様が若干異なるために苦労した記事はよく見かけますが、この記事はそれ以前でつまづいた話です。
そもそも、VScodeのExtensionsのみで開発する方法があまりやられていないようで別種類の苦労をしました。

# 経緯
Windows 10のPCで、VSCodeの拡張機能```Raspberry Pi Pico```を利用した開発・実行
1. Raspberry Pi Pico WをPCのUSBにBOOTSELを押したまま挿入
1. ```New Project from Sample```からサンプルファイルを作成。

    ![スクリーンショット 2024-12-24 211232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/52253e4f-b785-05f0-e789-0c50e7f2b603.png)
    サンプルは```blink```（いわゆるLチカのプログラム）を選択。
    
    ![スクリーンショット 2024-12-24 211303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/2470ca95-7885-2d01-d424-55d88d16f742.png)
    Board Typeは```Pico W```を選択。

1. ```Configure Cmake```で、buildフォルダ下にMakefileを作成。
1. ```Compile Project```で、ビルドしてコンパイル。すると、以下のように、ファイルがたくさん作成される。
![スクリーンショット 2024-12-25 021845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/169c027c-9ba8-b29b-c760-a3a574802426.png)

1. ```Run Project (USB)```でプロジェクトを実行。
::: note alert
ここでエラー発生。
![スクリーンショット 2024-12-25 022825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/c6b0c05b-d290-5e02-5c3e-183f523dd322.png)
:::
「詳細はターミナルでgdb-serverの出力を見ろ！」と言われたので見ることに。
すると、"no accessible RP2040 devices in bootsel mode"とか"Device at bus 1, address 1 appears to be a RP2040 device in BOOTSEL mode, but picotool was unable to connect"とあった。
まず、USBに挿すときにBOOTSEL押してたしなあと思いながらも、一度外して再度BOOTSELを押したまま挿す。そして、実行。するが、やっぱりダメ。

# 解決法
解決のため、ドキュメント"getting started with pico"[^1]を見漁ってると、26pに書いてあった。
![スクリーンショット 2024-12-25 030417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/7d08be49-a0e5-55a1-66dc-d2046d7c1f37.png)

どうやら、ドライバーをインストールする必要があった。
- すぐさま[Zadig](https://zadig.akeo.ie/)をダウンロード
- 上のプルダウンから```RP2 Boot (Interface 1)```を選択
- driverの矢印の右側をプルダウンから```WinUSB```を選択
- ```Install Driver```をクリックし、インストール

これで、再度VSCodeに戻り、```Run Project (USB)```で実行したら、晴れてPico Wの内臓LEDがピコピコ点滅した。

[^1]:https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf
HTTP/3とは

>HTTP/3、またはH3は、HTTPの3番目の主要な改訂版であり、HTTP/2の後継として設計された。
HTTP/3の大きな違いはHTTPメッセージをサポートするために利用するトランスポート・プロトコルである。TCPを用いる代わりに、QUICと呼ばれるUDPの拡張バージョンを用いる。QUICは、UDP上で動作するユーザー空間の輻輳制御を用いるHTTP/3は単純にHTTP-over-QUICとして始まったがプロトコルの最新の主要な改訂版となった。QUICとHTTP/3のクライアントとサーバーのロジックをサポートする多くのオープン・ソース・ライブラリがC,C++,Python,Rust, Goなどの言語で利用可能である。Nginxを含む人気のあるWebサーバーもパッチによってHTTP/3をサポートしている。

###  QUICによる性能向上
>ストリーム多重化とストリームごとのフロー制御をサポートしてる。ストリーム・レベルの信頼性とコネクション横断の服装制御より、HTTPの性能は劇的に向上する。輻輳情報はセッション間で共有され、並列でオブジェクトを取得する複数のコネクション間で信頼性が維持される。あるサーバーのエンド・ポイントにコネクションが存在する場合、クライアントはHTTP/3を使うことで、そのコネクションを複数の異なるURLで再利用することができる。

* ストリーム
* ストリーム多重化とは
* セッション
* コネクション間の信頼性とは
* コネクションとは
>クライアントはHTTP/3を使うことで、そのコネクションを複数の異なるURLで再利用することができる。

>QUIC上HTTPを動作させるHTTP/3はHTTP/2に対してさらなる性能向上を約束する。これは主にTCPと比べて、QUICがHTTPに提供する利点によるものである。ある意味でQUICは次世代のTCPと見なすことができる。

>クライアントとサーバー間で追加のラウンド・トリップなしでコネクションを設定できる。
>クライアントとサーバー間で以前のコネクションが確立されている場合、そのコネクションのシークレットが確立されてキャッシュされていれば、往復なしにコネクションを再確立することができる。


https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
Matterの仮想デバイスを作成してみた

以下のURLの内容を参考に、仮想Matterデバイスを作成してみた。
https://developers.home.google.com/codelabs/matter-device-virtual?hl=ja#1

# 必要なもの（実デバイス）
・Google Home App の入った端末
・Google Nest Hub

# Docker EngineとMatterSDKのインストール
Docker Engineをインストールする。
※注意　Dockerデスクトップは使用しない。

次にMatter SDKのクローンを作成する。
https://github.com/project-chip/connectedhomeip

その後、コンテナを起動する。

# 仮想Matterデバイスの作成
Google Homeのディベロッパーコンソールでデバイス名・デバイスタイプ・VendorID（テスト用）・ProductID（テスト用）などを設定。
https://developers.home.google.com/codelabs/matter-device-virtual?hl=ja#1

# 仮想Matterデバイスの構築・コミッショニング
Dockerコンテナ内でデバイスのビルド＆コミッショニングをする。
コミッショニング後にQRコードが出るURLが表示されるので、URLに飛んでGoogle Home APPで読み込む。

# コミッショニング完了
Google Home APPにデバイスが追加されるので名前を設定し、操作することができる。

# 小ネタ
### 増殖する仮想Matterデバイス
ディベロッパーコンソールで新しいデバイスを設定しなくても、コミッショニングするたびにデバイスが新しくGoogleHomeAppに追加される（なお前に作ったデバイスは操作できなくなる）。

### コミッショニング時のネットワークについて
Matterデバイスのコミッショニングの大体は、最初のデバイス検出（Bluetooth）→ネットワーク情報を入力してWi-fiなどで接続している印象。
今回試した仮想Matterデバイスのネットワークについて試したことは以下。
##### ・Wi-fiのみONでのコミッショニング：
デバイスを追加する段階で「アクセサリを追加するにはBluetoothをオンにする必要があります」と表示される（コミッショニングできない）。
##### ・BluetoothのみONでのコミッショニング：
QRコードを読み込んで、デバイスの確認中に「Googleで操作するにはハブが必要です」と出てセットアップが強制終了してしまう（コミッショニングできない）。
Beam subjected to moment load「モーメント荷重が作用するはりをsympyのソースコードで教えて下さい。」をAI先生に聞きました。

~~・先生の回答によって質問内容を変えています。~~
・私は内容を理解していません。申し訳ありません。

# ChatGPT先生へ
>(回答抜粋)
端部にモーメント荷重が作用する場合
```python
from sympy import symbols
from sympy.physics.continuum_mechanics.beam import Beam

# 定義
length, E, I, M = symbols('L E I M')
b = Beam(length, E, I)

# 端部にモーメント荷重を設定
b.apply_load(M, 0, moment=True)

# 境界条件を設定 (固定端)
b.bc_deflection.append((0, 0))
b.bc_slope.append((0, 0))

# 解を計算
b.solve_for_reaction_loads()

# 結果の確認
shear_force = b.shear_force()
bending_moment = b.bending_moment()
deflection = b.deflection()

print("Shear Force:", shear_force)
print("Bending Moment:", bending_moment)
print("Deflection:", deflection)
```
>途中にモーメント荷重が作用する場合
```python
from sympy import symbols
from sympy.physics.continuum_mechanics.beam import Beam

# 定義
length, E, I, M, a = symbols('L E I M a')
b = Beam(length, E, I)

# 途中にモーメント荷重を設定 (位置 a)
b.apply_load(M, a, moment=True)

# 境界条件を設定 (片持ち梁の場合を仮定)
b.bc_deflection.append((0, 0))
b.bc_slope.append((0, 0))

# 解を計算
b.solve_for_reaction_loads()

# 結果の確認
shear_force = b.shear_force()
bending_moment = b.bending_moment()
deflection = b.deflection()

print("Shear Force:", shear_force)
print("Bending Moment:", bending_moment)
print("Deflection:", deflection)
```
モーメント荷重が作用するはりを　英語にしたい。

>"Beam subjected to moment load"

単純梁の両端にモーメント荷重が作用するはりを　英語にしたい。
>Simply supported beam with moment loads applied at both ends

# Gemini先生へ
```python
```


# copilot先生へ
未



# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境

# いつもと違うおすすめです。
#### wikipedia
Tips: Next.jsのServer Actionsで送れるリクエストサイズを1MBから変更する

## この記事は何
Next.jsではV14からserverActionsを利用できます。
Server Actionsについては以下の記事をご覧ください。

https://nextjs.org/docs/13/app/api-reference/functions/server-actions

Server Actionsはとても便利なのですが、リクエストサイズが大きいとエラーになることがあります。

この記事では送れるリクエストサイズを変更する方法について簡単にまとめます。

## Server Actionsにリクエストサイズ上限が設定されている理由
Server Actionsでは、リクエストを送るタイミングで事前にサイズの検証をおこなうことでサーバーの負荷上昇を防いでいるようです。

しかし、この制限によって送りたいリクエストをうまく送ることができない場面も発生します。

## 解決方法
解決方法はドキュメントに記載されており、
以下のように`bodySizeLimit`の指定を行うだけで変更できます。

```js:next.config.js
/** @type {import('next').NextConfig} */
 
module.exports = {
  experimental: {
    serverActions: {
      bodySizeLimit: '2mb',
    },
  },
}
```

https://nextjs.org/docs/app/api-reference/config/next-config-js/serverActions#bodysizelimit

## Vercelの場合は注意が必要かも

こちらに関しては検証できていないですが、Vercelを利用している場合、Configでサイズを指定しても最大4.5MB、edgeの場合は4MBまでしか上限を上げられないようです。
Vercelをご利用の方はお気をつけください。

https://stackoverflow.com/questions/78196546/why-does-my-server-action-not-run-when-i-pass-in-images-that-are-too-large-using
最善の書き込み方法について（主に速度）

今回は以下の方法について速度を求めてみた。
①ギャラリーDB参照、書き込みDBのみ
②ギャラリーコレクション参照、書き込みDBのみ、コレクション更新
③ギャラリーコレクション参照、書き込みDB+コレクション

とりあえず下記のようなSharePointリストを作成して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/f202f427-7db6-9823-2417-c1b954de2fdf.png)
こんな感じで書き込んでみる。
①の場合
```
Patch(速度テスト,Defaults(速度テスト),
    {
        Text:Label1.Text,
        Date:DatePicker2.SelectedDate,
        Sentence:Label1_1.Text,
        Number:Value(Label1_2.Text),
        Boolean:true
    }
)
```
結果は下記のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/d86bbfcc-83a0-3083-9882-d5e28d4ed9cf.png)
大体0.5秒

次に②の場合を考えてみる。
```
Patch(速度テスト,Defaults(速度テスト),
    {
        Text:Label1.Text,
        Date:DatePicker2.SelectedDate,
        Sentence:Label1_1.Text,
        Number:Value(Label1_2.Text),
        Boolean:true
    }
);
ClearCollect(col速度テスト,速度テスト)
```
結果は下記の様になり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/1396e1c8-b9ec-e51b-34c1-a82970325ab5.png)
0.33秒
うーん。よくわからない。
各5回動作させてみたが①②は似たり寄ったりだった。
どちらも0.3-0.5秒くらいの間の処理スピード

③に関しては順序は関係ないので下記コードで書き込みを実施した。
```
Concurrent(
Patch(速度テスト,Defaults(速度テスト),
    {
        Text:Label1.Text,
        Date:DatePicker2.SelectedDate,
        Sentence:Label1_1.Text,
        Number:Value(Label1_2.Text),
        Boolean:true
    }
),
Patch(col速度テスト,Defaults(col速度テスト),
    {
        Text:Label1.Text,
        Date:DatePicker2.SelectedDate,
        Sentence:Label1_1.Text,
        Number:Value(Label1_2.Text),
        Boolean:true
    }
);
```
その結果がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/321bfb05-d4f7-a121-0799-50771eab017e.png)

5回動作させて平均して0.2秒くらい
結果、③で動作させたほうが処理が早くなることが分かった。
体感的に③が一番いいとわかっていたんですが数字として確認出来て満足！！

ついでに
③でForAllで10回動作させたときの結果
Concurrentで走らせた場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/8aa4b7f9-d9db-389a-656c-1ac41eceb775.png)
そのまま10回動作させた場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/ebba1b5e-d57a-40d1-ebab-520b587a1911.png)

うーんあんまり変わらないカモー
まぁデータ数など増えてきた場合は変わってくるかもしれないのでおまじないでConcurrentつけます。
以上です。
【困ったら立ち返りたい】Webアニメーションの実装方法まとめ

## Webアニメーションとは
![画面収録 2024-12-25 12.15.56 (1) (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624902/b9d2e21b-61b1-b99f-58f3-00d30f366198.gif)
<sub>スターバックスの採用サイトTOPページから引用。画質荒くてすみません</sub>

Webアニメーションとは、Webサイトやアプリケーション上で要素を動的に表現する技術です。ボタンのホバーエフェクトから複雑なインタラクティブアニメーションまで、様々な動的表現を実現します。

## WebアニメーションはUXにどのように影響するか
WebアニメーションはUXの観点で、以下に影響します。

**視覚的な効果**
- ユーザーの注目を集める
- サイトの魅力を向上させる
- 情報の理解を促進する

**操作性の向上**
- ユーザーアクションへの即時フィードバック
- 画面遷移をスムーズに表現
- 操作を直感的に理解させる

**ブランド価値の向上**
- サイトの個性を表現
- 記憶に残る体験を創出
- ブランドイメージの強化

## Webアニメーションの実装方法一覧
### CSSアニメーション
最も基本的で軽量な実装方法です。
```style.css
/* トランジションの例 */
.button {
  background-color: blue;
  transition: all 0.3s ease;
}

.button:hover {
  background-color: red;
  transform: scale(1.1);
}

/* キーフレームの例 */
@keyframes bounce {
  0% { transform: translateY(0); }
  50% { transform: translateY(-20px); }
  100% { transform: translateY(0); }
}

.bouncing-element {
  animation: bounce 1s infinite;
}
```
**メリット**
- JavaScriptなしで実装可能
- ブラウザの最適化により高パフォーマンス
- 学習が比較的簡単（ただし奥は深い...）


### SVGアニメーション 
ベクターグラフィックスを使用したアニメーション。

```index.html
<svg width="100" height="100">
  <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3">
    <animate 
      attributeName="r" 
      values="40;20;40" 
      dur="2s" 
      repeatCount="indefinite"
    />
  </circle>
</svg>
```
**メリット**
- 解像度に依存しない高品質な表現
- ファイルサイズの最適化が可能
- 複雑なアニメーションが可能（複雑なものを作りすぎるとページのパフォーマンスが下がる可能性あり）

### Lottieアニメーション
After Effectsで作成したアニメーションをWeb上で再生。

````lottie.js
import lottie from 'lottie-web';

const animation = lottie.loadAnimation({
  container: document.getElementById('animation'),
  renderer: 'svg',
  loop: true,
  autoplay: true,
  path: 'animation.json'
});
````
**メリット**
- 高度なアニメーションが可能
- デザイナーとの協業が容易
- 軽量な**JSON**ファイル形式　← ここ重要


### GIFアニメーション
最もシンプルな実装方法。
```index.html
<img src="animation.gif" alt="アニメーション">
```
**メリット**
- 実装が極めて簡単
- 広いブラウザ互換性
- デザイナーが直接作成可能


### その他
- JavaScript/Canvas
- WebGL/Three.js
- GSAPなどのアニメーションライブラリ

## 実装時の注意点
### パフォーマンス最適化
- アニメーションの頻度を適切に設定
- 重い処理は避ける
- モバイル端末での動作確認

### アクセシビリティ
- reduce-motionへの対応
- 過度なアニメーションを避ける
- 代替コンテンツの提供

### ブラウザ対応
- クロスブラウザテスト
- フォールバックの実装
- 最新のWeb標準への準拠

## まとめ
今回はWebアニメーションの実装方法について簡単にまとめてきました。他にもやり方はあるかもしれませんが、主要な方法については取り上げられたのではないかと思います。

個人的にLottieが気になっていて、Figmaのプラグインでも作成できるらしいので、近日中に調整してみようと思います！

本記事を読んでいただきありがとうございました！
[Bevy] 長文を表示する

今度は長文を表示してみます。

# テキスト取得

```rust
#[derive(Resource)]
struct TextData {
    text: String,
}
```
テキストを格納するためのリソースを準備し、登録します。

```rust
app.insert_resource(TextData { text: get_text() });
```

テキストはファイルからふつうに読み出します。

```rust
fn get_text() -> String {
    let mut f = File::open("assets/dummy.txt").expect("file not found.");
    let mut contents = String::new();
    f.read_to_string(&mut contents)
        .expect("something went wrong reading the file.");
    contents
}
```
以下の丸写しです。

https://doc.rust-jp.rs/book-ja/ch12-02-reading-a-file.html

# 表示領域描画

```rust
let width = windows.single().resolution.width();
let height = windows.single().resolution.height();

commands
    .spawn((
        Node {
            top: Val::Px(25.),
            left: Val::Px(25.),
            width: Val::Px(width - 50.),
            height: Val::Px(height - 50.),
            padding: UiRect {
                left: Val::Px(20.),
                right: Val::Px(20.),
                top: Val::Px(20.),
                bottom: Val::Px(20.),
            },
            ..Default::default()
        },
        BackgroundColor(Color::from(WHITE)),
    ));
 ```

Nodeというものがわかっていませんが、ユーザーインターフェース用の領域設定のなにかのようです。

https://docs.rs/bevy/latest/bevy/ui/struct.Node.html

FlexboxやGridなどのCSSの概念が使えるみたいですね。

見覚えのある名前のFieldがあるため、適当に設定しました。

これで、以下が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821654/0b4dd35f-b93b-0e6f-2302-2f5912e9cc43.png)

# テキスト描画

```rust
    /* (略) */
    },
    BackgroundColor(Color::from(WHITE)),
))
.with_children(|builder| {
    builder.spawn((
        Text::new(text_data.text.to_string()),
        TextColor(Color::from(BLACK)),
        TextFont {
            font: asset_server.load("SawarabiGothic-Regular.ttf"),
            font_size: (height - 50. - 40.) / 20. - 4.,
            ..default()
        },
    ));
});
```

さっき書いたspawn部分へ`with_children()`をくっつけます。

https://bevy-cheatbook.github.io/fundamentals/hierarchy.html

これで、親要素の内部へテキスト要素が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821654/4d406ebd-fc4a-8b4c-4dbe-7488ba36a1dd.png)

本来、ECSの概念では親子のような階層の概念はないようですが、仮想的な階層が導入されているようです。


# 終わりに

なんとなく、サウンドノベルゲームのような表示をつくってみました。

少しずつBevyでのコードの書き方がわかってきたような気がします。

まだ複雑なものはつくっていませんが、少しずつステップアップしていきたいものです。

ここまで読んでいただき、ありがとうございました。
VPS に Docker コンテナの API サーバーをデプロイする

# 概要
XServer VPS に Docker で開発した API サーバーをデプロイし、リクエストを投げるまでの手順を自分用にまとめました

# 前提
- Docker コンテナに立てる API サーバーが作成済み
- ローカルと VPS の OS は Ubuntu（ローカルのOSは windows でも手順変わらないはず）
- デプロイしたいソースが GitHub にある

# XServer VPS 契約
素直にフォームを入力すればよく、つまずくところはなさそうなので割愛
ただし、アクセス方法に ssh 接続を指定した場合に秘密鍵をダウンロードできるので、ダウンロードしたファイルを消さないよう注意

# SSH 接続
ローカルPC から VPS に ssh 接続できるようにする
契約時ダウンロードした秘密鍵を `~/.ssh` におく

`~/.ssh/config` を作成し下の内容を記述
```
Host your_host_name # 任意のホスト名
    HostName xxx.xxx.xxx.xxx # 契約した VPS の IPアドレス
    User root
    IdentityFile ~/.ssh/example.pem # example.pemは秘密鍵ファイルの名前
```

permission を更新する
```
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/example.pem
```

XServerの VPS パネルから ssh 接続を許可するポートを開放する
「パケットフィルター設定を追加」を押下し、「フィルター」に「SSH」を指定するとポート番号 22 が指定されるはず（2024/12/25 時点）
![スクリーンショット 2024-12-25 0029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940829/51c2b09e-1ffa-beaf-b83a-16df65a9a741.png)

ssh 接続確認
```
ssh -v your_host_name
```

# Docker インストール
`ssh -v your_host_name` で VPS に接続する
apt リポジトリに接続するためのファイルを作成

```
cat << EOS | sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(lsb_release -cs)
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: 
$(while read line; do echo " $line"; done < <(curl -fsSL https://download.docker.com/linux/ubuntu/gpg))
EOS
```

Docker Engine, Docker Compose のインストール
```
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-compose
```

# Git 接続
`ssh -v your_host_name` で VPS に接続する

VPS にデフォルトで git はインストールされているようなので、Git インストールはしなくて良い
```
git --version
```

ssh 鍵生成
```
ssh-keygen -f .ssh/github
```

`~/.ssh/config` を作成し下の内容を記述
```
Host github.com
    User git
    IdentityFile ~/.ssh/github
```

公開鍵を `cat ~/.ssh/github.pub` で確認し、GitHub の Deploy Key に追加する
読み込みのみを許可する（デフォルト）
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940829/f0d2a23b-aefc-eb66-49aa-f2fc76f3823d.png)

導通
```
ssh -T git@github.com
```

# ビルド
ソースを github から clone する
```
git clone git@github.com:your-repository-name.git
```

ローカルと同様の手順でビルドする

# API サーバーのポート開放
XServer の VPS パネルから解放したいポートを指定する

![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940829/73c7f02c-05d5-b4d3-42e3-2a0c4c283efc.png)
「パケットフィルター設定を追加」を押下し、「フィルター」に「手動で設定」を選択
解放したいポート番号を指定して追加する

どの PC からでも下記のように、リクエストが投げられる
```
curl "xxx.xxx.xxx.xxx:8080/ping"
```

---
# 参考
https://zenn.dev/ikkik/articles/4f2e7886b945be

https://zenn.dev/joh_luck/articles/6e0d029bd6a33a