OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでWebサーバー

プロンプトから
```
python -m http.server 8000
```
Webサーバーが起動します。
CGIを使う場合は、
```
python -m http.server --cgi 8000
```
のようにオプションを付けます。

ブラウザから
```
http://localhost:8000/index.html
```
とかで使えます。
Webサーバーの終了はプロンプトから、Ctrl + c で行います。
PythonとRubyとPHPの比較

# はじめに
PythonやRuby,PHPはプログラミング言語として知られている。しかし、それらがどのような特性を持ち、どのような特徴があるのかを比較した文献はそう多くない。したがって、今回は上記3種類の言語を比較することで、どの用途においてどの言語が優れているのかを調査する。また、参考に筆者が作ったサイトやアプリなどを載せた。

# Python
このブログの読者はご存じだと思うが、データサイエンスや統計学、数学的処理に長けた無料のプログラミング言語である。ただし、Anacondaという便利な仮想環境は団体だと有料になる場合があるので注意する。

Chat-GptはPythonでできているので、機械学習やAIとの相性がいい。

以下のようなポートフォリオがある。


https://line-app-my-site-d5c653292c91.herokuapp.com/index.html



# Ruby
日本人が開発した言語として有名である。したがって日本語でのリファレンスが充実している。Ruby が存在感を発揮している応用分野の筆頭がウェブアプリケーションという訳で必ずしもRuby自体がWebに特化しているという訳ではない。また、有名なRailsといったフレームワークと組み合わせることにより、簡単に多機能なwebシステムを構築することができる。

https://rails-login-2a6ee6a1f446.herokuapp.com/


# PHP
PHPは言わずとも知れた古くからある言語で、様々なサイトに使用されてきた。以下、自分が作成したサイトの一例である。

掲示板1

https://irucastudy.org/rMission6-2/Mission6-2.php

掲示板2

https://irucastudy.org/denkenkakumei/

もちろん、WordpressはPHPを用いている。

https://irucastudy.org/



# まとめ

今回は、自分のポートフォリオを用いてそれぞれのプログラミング言語を比較した。個人的には、これからデータサイエンスの波が来る（来ている)のでPythonを推したいが、Ruby on RailsもWebアプリ開発として捨てがたい。なので、究極的には、何を作りたいかなどの目的を明らかにして、それの用途を達成するための言語を選択した方が良いと感じた。
viteで作成したプロジェクトでmuiをinstallすると、"ERESOLVE unable to resolve dependency tree"

# 起きた現象
`npm create vite@latest react-sample`
で生成したプロジェクトで、MUIをインストールすると依存関係のエラーが発生した

```shell
$ npm install @mui/material @emotion/react @emotion/styled @fontsource/roboto @mui/icons-material
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: undefined@undefined
npm error Found: react@18.3.1
npm error node_modules/react
npm error   peer react@"^17.0.0 || ^18.0.0 || ^19.0.0" from @mui/material@6.3.0
npm error   node_modules/@mui/material
npm error     @mui/material@"*" from the root project
npm error   peer react@">=16.8.0" from @emotion/react@11.14.0
npm error   node_modules/@emotion/react
npm error     @emotion/react@"*" from the root project
npm error     peerOptional @emotion/react@"^11.5.0" from @mui/material@6.3.0
npm error     node_modules/@mui/material
npm error       @mui/material@"*" from the root project
npm error     2 more (@emotion/styled, @pigment-css/react)
npm error   2 more (@emotion/styled, @pigment-css/react)
npm error
npm error Could not resolve dependency:
npm error peer react@"^19.0.0" from react-dom@19.0.0
npm error node_modules/react-dom
npm error   peer react-dom@"^17.0.0 || ^18.0.0 || ^19.0.0" from @mui/material@6.3.0
npm error   node_modules/@mui/material
npm error     @mui/material@"*" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error
npm error For a full report see:
npm error /home/shun/.npm/_logs/2025-01-01T08_32_36_598Z-eresolve-report.txt
npm error A complete log of this run can be found in: /home/shun/.npm/_logs/2025-01-01T08_32_36_598Z-debug-0.log
```

# 原因
ログに書いてある通り
`Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps`
なので、
　・依存関係を解決する
 　または
　・--legacy-peer-depsをつけて無理やりインストールする
 ことが必要
 後者は不安なので前者でいく

依存関係の不整合は
`peer react@"^17.0.0 || ^18.0.0 || ^19.0.0" from @mui/material@6.3.0`
reactのバージョンがあってないようだ
（公式ページでも
https://mui.com/material-ui/getting-started/installation/
　で注意書きあり）

# 対応
## package.jsonの編集
19.0.0にしてしまう
```config
  "dependencies": {
    ...
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
    ...
  },
  "devDependencies": {
    ...
    "@types/react": "^19.0.0",
    "@types/react-dom": "^19.0.0",
    ...
  }
```

## インストール
インストールされているパッケージをいったん消して再インストール
```shell
rm -rf ./node_modules/
rm package-lock.json
npm install
```

# 備考
viteで自動生成したプロジェクトのpackage.jsonの一部をユーザーが書き換えてもいいものだろうか。。
map、filterメソッドの使い方

# mapメソッドとは？
ある配列に対して、与えられた関数処理を行い、新たな配列を作ります。

# filterメソッドとは？
ある配列の、与えられた関数の条件に合致した要素を取り出し、新たな配列を作るメソッド。

# 具体例
例として、const arry = [10, 20, 30, 40];を定義し、この各要素を2倍にして、50以上の値を取り出すとします。

**メソッドを使わない場合**
```main.js
const newArry = []

for (let i = 0; i < arry.length; i++) {
    const val = arry[i] * 2;
    if (val > 50) {
        newArry.push(arry[i] * 2);
    }
}
```
**map、filterメソッドを使う場合**
```main.js
const newArry = arry.map(val => val * 2).filter(val => val > 50);
```

# まとめ
メソッドを使い、コードの記述量が減りました。
おわり
tkinterでラジオボタンを使う

``` python
import tkinter as tk
from tkinter import messagebox

def message():
    messagebox.showinfo('回答', text[var.get()])

root = tk.Tk()
root.geometry('300x250')

text = ['北海道', '群馬', '福井', '和歌山', '島根', '福岡']

for i in range(2):
    root.columnconfigure(i, weight=1)
for i in range(len(text) + 1):
    root.rowconfigure(i, weight=1)    

var = tk.IntVar()
radio = []
for i in range(len(text)):
    radio.append(tk.Radiobutton(root, text=text[i], variable=var, value=i))
    radio[i].grid(row=i, column=0, sticky=tk.W)

answer = tk.Button(root, text='回答', command=message)
answer.grid(row=len(text)+1, column=1, columnspan=2, sticky=tk.EW)

root.mainloop()
```
Amazon Bedrock Knowledge Bases 構造化データのクエリに対応

# 内容

AWS re:Invent 2024 で発表があった Amazon Bedrock Knowledge Bases 構造化データの取り込みの機能についてシンプルに纏めます。

https://aws.amazon.com/jp/blogs/news/new-amazon-bedrock-capabilities-enhance-data-processing-and-retrieval/

構造化されたデータ検索により、データベースとデータウェアハウスの自然言語クエリが可能

簡単にちょっと例を出してみよう。

　ビジネスアナリストが「前四半期で最も売れた製品は何でしたか？」と質問
　↓
　システムは Amazon Redshift データベースに格納されているデータウェアハウスに適切な SQL クエリを自動的に生成して実行


# 対応リージョン

- Amazon Redshift と Amazon SageMaker Lakehouse が利用可能なリージョン


# 設定

データを用意するのが大変だったので、今回は画面だけ確認してみた。（時間があれば後日やってみて更新します。）

「ナレッジベースを作成」から「knowledge base with structured data store」
![スクリーンショット 2025-01-01 17.23.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/6bd6c322-864d-dd53-526e-9bb25ef8c7f4.png)

[Data source details] から「Amazon Redshift」
![スクリーンショット 2025-01-01 17.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/78f8a460-38a6-c9fc-a6d9-f328553a5135.png)

クエリエンジンには画像に表示されている項目が選択可能なようです。
[Query configurations] はオプションなので基本的に、
 [Query engine details]
 [Authentication]
 [Default storage metadata]
 を指定するだけでいいようです。
![スクリーンショット 2025-01-01 17.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c7d73588-66c9-5cd8-3118-947d5504227c.png)
![スクリーンショット 2025-01-01 17.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/6fdf9a54-8e18-1051-87cb-3f9383d7be1f.png)


# その他

次の方が試されたみたいですが、やはり今の所精度はやはり英語での質問がいいようです。

https://zenn.dev/fusic/articles/github-zenn-linkage-20241206-1
HTML、CSSメモ

# カレンダー表示
``` HTML
<p>日付を入力してください。</p>
<input type="date" value="2025-01-01">
```
value値にデフォルトの日付をセットしてあげます。

# 画像の遅延ロード
``` HTML
<img src="hoge.jpg" loading="lazy" alt="">
```

# スムーススクロール
``` css
html {
    scroll-behavior: smooth;
}
```

# アスペクト比固定
``` css
img {
    aspect-ratio: 16/9;
    width: 100%;
    height: 100%;
}
```
[神機能]React Compilerに触れてみた

# React Compilerとは
React Compilerは、Metaが開発した新しいコンパイラで、ビルド時のみに実行されるツールであり、Reactアプリを自動的に最適化してくれます。

https://ja.react.dev/learn/react-compiler

# React Compilerの特徴
React Compilerの一番大きな機能としては、useMemoやuseCallback、React.memoを使わずとも、パフォーマンスの最適化をしてくれる機能かと思います。
メモ化は適用し忘れたり、誤って適用したりしてしまうことも多いので、その部分を意識しなくていいというのは、神機能だと思います。

# インストール
インストールは以下のコマンドになります。
```
npm install -D babel-plugin-react-compiler
```
以下は、React Compilerが提供しているESLintプラグインをインストールするコマンドです。
ESlintプラグインはコンパイラとは独立して使用できるため、コンパイラを使用しなくてもESLintプラグインだけで活用することもできます。
```
npm install -D eslint-plugin-react-compiler
```

# 導入手順
viteのconfigファイルに以下を追記
``` vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

const ReactCompilerConfig = {};

export default defineConfig({
  plugins: [
    react({
      babel: {
        plugins: [["babel-plugin-react-compiler", ReactCompilerConfig]],
      },
    }),
  ],
});

```
```.eslintrc.js
import reactCompiler from 'eslint-plugin-react-compiler'

export default [
  {
    plugins: {
      'react-compiler': reactCompiler,
    },
    rules: {
      'react-compiler/react-compiler': 'error',
    },
  },
]
```

・Next.jsに導入する場合
Next.jsに導入する場合は、「next.config.ts」ファイルに、以下の設定を加えればOK
```next.config.ts
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  experimental: {
    reactCompiler: {
      compilationMode: 'annotation',
    },
  },
}
 
export default nextConfig
```
# サンプルコード

``` App.tsx
import { useState } from "react";
import { TestComponent } from "./components/TestComponent";

function App() {
  const [count, setCount] = useState(0);

  return (
    <>
      <TestComponent 
        name={"Taro"} 
        onClick={() => console.log("click!")} 
      />
      <button onClick={() => setCount((prev) => prev + 1)}>
        {count}
      </button>
    </>
  );
}

export default App;
```

``` TestComponent.tsx
type Props = {
  name: string;
  onClick: () => void;
};

export const TestComponent = (props: Props) => {
  console.log("Rendered");
  return <div onClick={props.onClick}>Hello {props.name}</div>;
};
```

# 動きの違い
React Compilerを使っている場合と、使っていない場合のコンソールの出力を見てみましょう。
## React Compilerを使っていない場合
「TestComponent」がメモ化されていないため、ボタンをクリックするたび、「Rendered」がコンソールに出力される。

![React Compiler Demo2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/7cba970e-cf4c-d49b-070a-507469b73752.gif)


## React Compilerを使っている場合
自動でメモ化され、ボタンをクリックしても、「Rendered」がコンソールに出力されない。

![React Compiler Demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/a50b68d4-44fe-2b2a-26b1-ed623de1faff.gif)



# 最後に
他にも色々な記事を書いているので、よければ読んでいってください！

https://qiita.com/hukuryo/items/4a02784929b0cf0404a5

https://qiita.com/hukuryo/items/2a649d2ee018308d89f6

https://qiita.com/hukuryo/items/4e957621682a25da5f3b
OCIのFree tierアカウントの作成でつまずいた話

# はじめに
OCIのFree tierアカウントの作成につまずいた話と解決方法を書いていきます。
同様の事例がたまに見つかるため少しでも解決の助けになれば幸いです。

# つまずいた箇所
クレジットカードの登録をした後にトランザクションエラーが発生してアカウントの作成ができない。

エラー文はこんな感じです
```
トランザクションの処理中にエラーが発生しました
登録を完了できません。よくあるエラーには以下が含まれます：
a) 不完全または不正確な情報の入力
b) 意図的または意図せずに位置情報や身元を隠す
c) 複数のアカウントを作成しようとする。
これらに該当する場合は、再試行してください。
それ以外の場合は、Oracleカスタマーサービスにお問い合わせください。
```

# 試したこと
端末やブラウザを変える。→　解決せず
cookieやキャッシュを削除　→　解決せず
問い合わせフォームから英語で問い合わせをする→解決せず
ライブチャットで問い合わせ →　再度フォームを案内される

# 解説方法
問い合わせフォームに再度連絡すると
> Hello [NAME],
>We've identified the issue and made some adjustments. Using the same email address (mail address), please complete the sign up again at your earliest convenience.
>Regards,
>Customer Service Agent
>

この返答後に再度アカウント作成を試みたところ、無事にアカウントが作成できました。
以下に問い合わせ文を載せておきますので、必要であればコピペや改変等でご活用ください。
```
Dear Oracle Cloud Support Team, 
I am writing to follow up on my previous support request regarding a transaction error that occurred during my attempt to create an Oracle Cloud Infrastructure account. 
While I submitted an initial inquiry through your support form, the response I received did not resolve the issue. 
The error message I encountered was: 
トランザクションの処理中にエラーが発生しました We're unable to complete your sign up. Common errors are due to: 
a) Entering incomplete or inaccurate information 
b) Intentionally or unintentionally masking one's location or identity 
c) Attempting to create multiple accounts.

I would like to confirm the following points: 
1. All information I provided during the signup process was accurate and complete 
2. I am not using any VPN or location masking tools 
3. I have not attempted to create multiple accounts To help me complete the account creation process
I look forward to your response and guidance on how to proceed. Thank you for your time and attention to this matter. 
Best regards, [NAME]
```

# 終わりに
何が問題あったのかは不明ですが、何とかアカウントの作成が完了できました。
拙文失礼いたしました。
ラベル　java

はじめに
--
インフラの分野でも、Iac化が進んで行くと考えています。そこで、ノウハウが体系だっているものが学び易いと考えて、Javaを学びはじめました。

今回は、**ラベル (`a` と `b`)** の役割にフォーカスしました。


```java
public class Main {
    public static void main(String[] args) {
        int total = 0;
        
        a: for (int i = 0; i < 5; i++) {  // 外側のループ
            b: for (int j = 0; j < 5; j++) {  // 内側のループ
                // i が偶数の場合、外側のループの次の反復にスキップ
                if (i % 2 == 0) continue a;  
                
                // j が 3 より大きい場合、内側のループを終了
                if (3 < j) break b; 
                
                // j を total に加算
                total += j;
            }
        }
        
        // total の値を出力
        System.out.println(total);
    }
}
```

### ラベル（`a`, `b`）の意味と使い方

#### 1. **ラベル `a` の使用（`continue a;`）**
ラベル `a` は、外側のループ（`i` に関するループ）に対応しています。`continue a;` は、`i` が偶数の場合に、**外側のループ**（`i` のループ）の次の反復に進むことを意味します。

- `continue a;` は、`i` が偶数（`i % 2 == 0`）の場合に、**外側のループの次の反復**を開始させるため、内側のループ（`j` のループ）はスキップされます。
- これは、`i` が偶数のときには、内側のループを無駄に実行しないようにするためです。

#### 2. **ラベル `b` の使用（`break b;`）**
ラベル `b` は、内側のループ（`j` に関するループ）に対応しています。`break b;` は、`j` が 3 より大きくなった時に、**内側のループ**（`j` のループ）を終了させることを意味します。

- `if (3 < j) break b;` は、`j` が 4 以上の値を取った場合に、**内側のループを終了**させるための命令です。これにより、`j` が 4 に到達する前に、内側のループを終了させます。

### 実行の流れ

1.  **外側のループ（`i` ループ）** は、`i = 0` から `i = 4` まで実行されます。
2.  **内側のループ（`j` ループ）** は、`j = 0` から `j = 4` まで実行されますが、`i` が偶数の場合は `continue a;` によってスキップされます。

### 実行結果の詳細

- **`i = 0` のとき**（偶数）：
  - `continue a;` によって、内側のループがスキップされ、`total` は加算されません。

- **`i = 1` のとき**（奇数）：
  - `j = 0`: `total += 0;` → `total = 0`
  - `j = 1`: `total += 1;` → `total = 1`
  - `j = 2`: `total += 2;` → `total = 3`
  - `j = 3`: `total += 3;` → `total = 6`
  - `j = 4`: `break b;` → 内側のループを終了。`total` の値は `6` になります。

- **`i = 2` のとき**（偶数）：
  - `continue a;` によって内側のループがスキップされ、`total` は変わりません。

- **`i = 3` のとき**（奇数）：
  - `j = 0`: `total += 0;` → `total = 6`
  - `j = 1`: `total += 1;` → `total = 7`
  - `j = 2`: `total += 2;` → `total = 9`
  - `j = 3`: `total += 3;` → `total = 12`
  - `j = 4`: `break b;` → 内側のループを終了。`total` の値は `12` になります。

- **`i = 4` のとき**（偶数）：
  - `continue a;` によって内側のループがスキップされ、`total` は変わりません。

### 最終的な `total` の値

`i = 1` と `i = 3` のときに `total` に加算され、最終的な値は **12** になります。

### 実行結果

```java
12
```

### まとめ

- **ラベル付き `continue`** (`continue a;`) は、外側のループ（`i` のループ）の次の反復に進むために使用されます。
  - 具体的には、`i` が偶数のときに内側のループをスキップするために使います。
  
- **ラベル付き `break`** (`break b;`) は、内側のループ（`j` のループ）を終了させるために使用されます。
  - 具体的には、`j` が 4 に達したときに内側のループを終了させます。

ラベルを使うことで、特定のループを制御することができ、ネストされたループの中で柔軟に制御フローを管理することが可能となります。
（受験記）基本情報技術者試験(CBT)の受験記

この記事は、基本情報技術者試験をCBTで受験した時の記録です。

#### 誰向け？
まだ、基本情報技術者試験を受けておらず、特に当日の進み方を知りたい人

私の場合には以下でしたが、テストセンターによって違いがあるかもしれません

勉強方法はよく知られている為、記事の最後に書きました。


#### バックグラウンド
属性：非情報学系の専攻、就活の為
日時：2024年11月


#### 前日まで
CBT試験の為、数日前？までは試験日の変更が可能。つまり、先延ばしができる
研究活動と就活の方が優先順位が高かったので、数回先延ばしをしました
結果として、履歴書に書ける日がかなり先となりました（受験した月の翌月中旬に合格発表）
デッドラインは意識すべきだと思います

#### 当日、科目Aまで
会場に入ると、テキストを見ることは不可
従って、早めに行って試験までの時間に勉強は出来ない
私はエレベーター付近の邪魔にならない所で時間までテキストを読んでました

時間になったら会場入室

荷物は全てロッカーに入れる。飲み物も持ち込めない

ゴミ等も含めて、ポケットの中は完全に空にする

コピー用紙1枚とボールペンを貰って、席まで案内される

試験開始
試験画面は予め調べておくと安心です

#### 科目A終了から科目B開始まで
科目Aが終了したらブザーで係員さんを呼び出す
紙とボールペンは回収され、一旦退出
水分補給はここで行う

休憩は最大でも10分間で、超えた場合には自動的に科目Bの時間が削られる

新しい紙とボールペンを貰い、再度同じ席へ

科目B開始

#### 科目B終了後
ブザーで係員さんを呼び出して退出
ロッカーキーを返却して終了

#### 勉強方法
科目Aは、適応な自分に合うテキストを読む
アウトプットは過去問道場

科目Bについて
以下の本がオススメ，セキュリティは科目Aを丁寧に学んでいれば問題ないと思います
技術評論社：アルゴリズム×疑似言語
DockerFileからPullするとできず、直接docker pullするとPullできるのはなぜ？

## 問題
- [genesis](https://github.com/Genesis-Embodied-AI/Genesis/pull/303)のDockerFileからImageをBuildしようとした際に、BaseイメージのPullに失敗していた
- エラーメッセージは次の通り
```
[+] Building 0.7s (2/2) FINISHED                                                                                                                                                                                                                           docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                 0.0s
 => => transferring dockerfile: 4.38kB                                                                                                                                                                                                                               0.0s
 => ERROR [internal] load metadata for docker.io/pytorch/pytorch:2.5.1-cuda12.1-cudnn9-devel                                                                                                                                                                         0.7s
------
 > [internal] load metadata for docker.io/pytorch/pytorch:2.5.1-cuda12.1-cudnn9-devel:
------
Dockerfile:6
--------------------
   4 |     # Stage 1: Build LuisaRender
   5 |     # ===============================================================
   6 | >>> FROM pytorch/pytorch:2.5.1-cuda${CUDA_VERSION}-cudnn9-devel AS builder
   7 |     
   8 |     ENV DEBIAN_FRONTEND=noninteractive
--------------------
ERROR: failed to solve: pytorch/pytorch:2.5.1-cuda12.1-cudnn9-devel: failed to resolve source metadata for docker.io/pytorch/pytorch:2.5.1-cuda12.1-cudnn9-devel: error getting credentials - err: exec: "docker-credential-ecr-login": executable file not found in $PATH, out: ``
```
- docker build時には上記エラーが発生していたが、docker pullコマンドから直接同じイメージをPullするとエラーが発生しなかった

## 原因
- .docker/config.jsのCreditialStoreの設定による影響
```
{
  "credsStore": "ecr-login"
}
```

- ecr-loginはECSからイメージをPull/Pushしてくる際にログインせずに操作を実行できるようにする設定
    - https://kakakakakku.hatenablog.com/entry/2017/05/01/002326
- この設定が存在する場合、全てのdockerの通信をECRの通信として扱われるため、ECRに問い合わせて失敗していた
    - https://progret.hatenadiary.com/entry/2020/02/29/164458
- docker pullするときには、上記のCreditialを使用せずにPullしている？
    - https://qiita.com/autotaker1984/items/9b88b234b34b0e26fbdd

## 対応
- CreditialStoreの設定を一時的にコメントアウトする
    - AWS ECRからImageをPullしたい場合もあるので、一時的にコメントアウトし対応しました
```
{
  // "credsStore": "ecr-login",
}
```
- credStoreではなく、credHelperで自分のAWSのアカウント情報を設定すると解決できる方法もあったのですが、AWSのアカウントが複数ある場合の対応について考える必要があったため、ひとまず上記の対応にしました
    - https://qiita.com/segur/items/aff41c3b687dc42afb9c
GitHub ActionsでiOSアプリのバージョンアップを自動化する方法

## 概要
iOSアプリのバージョン管理を効率化するために、GitHub Actionsを活用して手動でバージョンを更新するワークフローを構築する方法を紹介します。このワークフローは、`patch`、`minor`、`major`のいずれかのバージョンアップを選択し、プロジェクトファイルを自動的に更新します。

## 前提条件

- GitHubリポジトリが存在すること
- `.pbxproj`ファイルを持つiOSプロジェクトであること

## ワークフローの設定手順

以下の手順に従って、GitHub Actionsのワークフローを設定します。

### 1. ワークフローファイルの作成

リポジトリの`.github/workflows`ディレクトリに`versionup.yml`という名前のファイルを作成します。以下のコードをそのファイルに追加します。

````yaml:.github/workflows/versionup.yml
# versionup.yml
name: Manual Version up

on:
  workflow_dispatch:
    inputs:
      update_type:
        description: 'バージョンアップの種類を選択'
        type: choice
        required: true
        options:
          - patch
          - minor
          - major
        default: 'patch'

permissions:
  contents: write

jobs:
  versionup:
    runs-on: macos-latest
    steps:
    - uses: actions/checkout@v4
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        fetch-depth: 0
    
    - name: Get Current Version
      id: current_version
      run: |
        CURRENT_VERSION=$(grep -m 1 'MARKETING_VERSION = ' $(find . -name "*.pbxproj") | grep -o '[0-9]*\.[0-9]*\.[0-9]*')
        
        MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1)
        MINOR=$(echo $CURRENT_VERSION | cut -d. -f2)
        PATCH=$(echo $CURRENT_VERSION | cut -d. -f3)
        
        case "${{ github.event.inputs.update_type }}" in
          major)
            NEW_VERSION="$((MAJOR + 1)).0.0"
            ;;
          minor)
            NEW_VERSION="${MAJOR}.$((MINOR + 1)).0"
            ;;
          patch)
            NEW_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1))"
            ;;
        esac
        echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT

    - name: Update App Version
      run: |
        find . -name "*.pbxproj" -exec sed -i '' "s/MARKETING_VERSION = .*;/MARKETING_VERSION = ${{ steps.current_version.outputs.new_version }};/g" {} \;
        CURRENT_VERSION=$(grep -m 1 'CURRENT_PROJECT_VERSION =' $(find . -name "*.pbxproj") | head -n 1 | grep -o '[0-9]*')
        NEW_PROJECT_VERSION=$((CURRENT_VERSION + 1))
        find . -name "*.pbxproj" -exec sed -i '' 's/CURRENT_PROJECT_VERSION = [0-9]*;/CURRENT_PROJECT_VERSION = '"$NEW_PROJECT_VERSION"';/g' {} \;

    - name: Commit and Push Changes
      run: |
        git config --global user.name "github-actions[bot]"
        git config --global user.email "github-actions[bot]@users.noreply.github.com"
        git fetch -p
        NEW_VERSION="${{ steps.current_version.outputs.new_version }}"
        BRANCH_NAME="release/${NEW_VERSION}"
        git checkout -b $BRANCH_NAME
        git add .
        git commit -m "バージョン番号を${NEW_VERSION}に更新"
        git push origin HEAD
````

### 2. ワークフローの実行

GitHubリポジトリの「Actions」タブから、このワークフローを手動で実行できます。実行時に、`patch`、`minor`、`major`のいずれかを選択してバージョンを更新します。

### 注意点

- `GITHUB_TOKEN`はGitHubが自動的に提供するトークンで、リポジトリへの書き込み権限を持っています。
- `macos-latest`を使用していますが、必要に応じて他のランナーに変更可能です。

このワークフローを使用することで、手動でバージョンを管理する手間を省き、効率的にiOSアプリのバージョンを更新できます。これにより、開発プロセスの一部を自動化し、より重要なタスクに集中することが可能になります。
名刺アプリを作成してみた

ブラウザから登録、閲覧ができる目名刺アプリを作成しました。

- 使用技術
    - React
    - Jest
    - Chakra UI
    - UnoCSS

## 外観

![スクリーンショット 2025-01-01 10.23.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456603/bf1ddb45-03c7-2730-17c8-a051a3fc5581.png)

## 詰まったところ

今回、ルーティングのため、react-routerを使用した。
`react-router`と、`react-router-dom`の両方のパスが存在し、どちらのパスでも同じ名前のコンポーネントが存在したりしなかったりするため、どちらを使用している混乱して詰まることがあった。
また、AIでコードを修正した場合、`react-router`と、`react-router-dom`がよく書き換えられることがあったので、AIを使用する際は名前やパスの似ているライブラリに注意する必要があった。

## 学んだところ

今回、Github Actionを用いて、毎朝登録された内容を初期化することを行なっている。
今までは、Github Actionsをコードに対するテストやビルドなどを行うためのツールとしかとらえていなかったが、実際は、「指定されたスクリプトを実行する」ことができるツールだった。
そこから、何かに使ったから、その何かを行うためのツールと早合点せず、ツール自体の用途をきちんと調べるべきだと学んだ。

## JISOUのメンバー募集中

プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp
2025年上半期の学習計画

## はじめに
IT業界参入4年目のインフラエンジニアによる、2025年上半期の学習計画です。
計画倒れ防止のために、学習計画を投稿しています！

## 投稿者のレベル
学歴：私立文系卒
職歴：非IT→SES（2年）→クラウドインテグレーター（2年目）
業務内容：クラウド環境の運用保守構築

## 所持資格

**2021年**
| 資格名 | 取得年月 | 
|:-----------|------------:|
| CCNA       | 2021/10        | 

**2022年**
| 資格名 | 取得年月 | 
|:-----------|------------:|
| ITパスポート     | 2022/09      |

**2023年**
| 資格名 | 取得年月 | 
|:-----------|------------:|
| AWS CLF       | 2023/01        |
| AWS SAA         | 2023/02          | 
| LPIC101       | 2023/06       | 
| LPIC102    | 2023/08     | 
| AWS DVA    | 2023/10     |

**2024年**
| 資格名 | 取得年月 | 
|:-----------|------------:|
| AWS SAP       | 2024/01        | 
| AWS SOA     | 2024/04      | 
| AWS DBS     | 2024/04      | 
| AWS SCS         | 2024/06          | 
| AWS MLS         | 2024/07          | 
| AWS DEA       | 2024/07                | 
| AWS DOP     | 2024/11      | 

AWS資格は合計10個になりました！
その他、不合格ではありましたが2024年はIPA試験（応用情報）にも挑戦し
AWS以外の分野での勉強にも手を出せたのが良かったなと思っています！

## 上半期の受験計画

| 資格名 | 取得年月 | 
|:-----------|------------:|
| AWS ANS| 2025/01      | 
| AWS AIF| 2025/01      | 
| AWS MLA| 2025/02      | 
| 応用情報技術者試験|2025/04| 
| OCI Architect Associate| 2025/05| 

2024年度のAWS All Certificationsには間に合わせます。絶対に。
応用情報は昨年度、午後の点数が足りず落ちてしまったので今年こそは合格します！
午前もギリギリの点数で通過していたので、もっと余裕のある点数での合格を目指します。

OCI（[Oracle Cloud Infrastructure](https://www.oracle.com/jp/education/certification/certifications-list/#OCI)）のアソシエイト資格を取得します。~~本当は3月に受けたい。~~
こちらは業務でOCI環境を触ることが今後も増えていくことが予想されるため、ハンズオンも含めしっかりめに勉強します！
6月受ける資格は決まり次第更新します。最有力候補はLPIC2です。
技術書を読み漁る期間になるかもしれません。上記資格を取り終わった後に反省を含め、落ち着いて考えようかなと。

## 使用予定教材
- AWS ANS
[AWS認定 高度なネットワーキングー専門知識(ANS-C01)完全対応テキスト](https://amzn.asia/d/0inGZVJv "テキスト")
Cloudtech　問題集
CloudLicense 問題集

- AWS AIF
CloudLicense 問題集

- AWS MLA
現在Web問題集の発表はありませんが、きっとそのうち出てくるでしょう（楽観）

- 応用情報技術者試験
過去問道場　
[応用情報技術者 合格教本](https://amzn.asia/d/3mfWj7G)　
[応用情報技術者　午後問題の重点対策](https://amzn.asia/d/7RVkfwy)　

- OCI Architect Associate
[Become a OCI Architect Associate](https://mylearn.oracle.com/ou/learning-path/japanese-become-an-oci-architect-associate-2024-/140905)　
[Oracle Cloud Infrastructure徹底入門](https://amzn.asia/d/g85DWUy)　
[Oracle Cloud Infrastructure エンタープライズ構築実践ガイド](https://amzn.asia/d/hl3dQjn)　
（もしかするとAA挑戦前にOCI Foundations Associateを受けるかも...？）

今年も余裕があればTerraformの勉強時間を確保したいです。あとPython...ansible...

## まとめ
これまで勉強し続けてきたAWS資格に加え、2025年はIPAやOCIなど他分野の勉強にもチャレンジします！
絶対に合格してやるぞという強い気持ちを持って勉強します。
合否に関わらず、去年は気持ちで負けている試験が多かったので。
今年もよろしくお願いします！
Youtubeで、どの配信業者が、曲をデリバリしているかを大体把握する方法【豆知識】

ここでいう配信業者は、DSPと呼ばれる音楽配信サービスへ、音源、アセットなどを提出するサービスを提供する事業者です。


軽く、配信業者の説明をしますが、ご存知の方は読み飛ばしていただいて構いません。
# DSPへ配信するまでの構造
まず、楽曲を制作した人が、多くのDSPへの配信するまでの一部の構造を紹介します。
![haisinnnonagare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/17e64587-783a-b20f-85a1-7401401be798.png)

ちなみに、ディストリビューターの例ですが
・TuneCore、BIG UP!、Distrokidのような幅広いユーザが配信可能な会社系
・TRACKS Inc.、NexTone Inc.のような著作権管理に特化した会社系
・Warner Music(WM~)やUniversal Music Publishingのようなレコード会社系(委託の場合あり)
・Any mindなどのインターネットコンテンツを専門とする事業者系
・VMLなどのフリー音源系

***この画像の内容以外にも、さらに複雑な関係が絡んでいます。***

今回は、そのディストリビューターに着目するので、次の章で、本題のどの業者が曲をDSPにデリバリしているのかを確認します。

# やり方

まず、Youtube Musicのサイトをブラウザで訪問します。
https://music.youtube.com

次に、調べたい曲を検索し、
![ytm-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/23824d78-13f7-9144-d4c2-f534fcf42e2d.png)
一覧の、「曲」もしくは「アルバム/シングル」にある曲を押し、そのまま再生して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/0683891a-c137-0aac-f146-e23a9ffe8874.png)
曲が再生されたら、パラメタがwatchであることを確認し、
music.youtube.comの部分をyoutube.comにします。(musicを消す)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/2b9a8000-4e93-82c2-57c6-92bb4d9714e4.png)

すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/baf01ec2-850d-c005-ba17-6617b11f637d.png)
動画の概要欄の部分に、Provided to YouTube by ~と書かれたものが出ますが、そこが ***多くの場合、*** ディストリビューター名になります。

ほかにも、Youtubeで直接、アートトラックと呼ばれる(今回Youtube Musicで見つけたもの)、アルバムのカバー画像(ジャケット)と、音源だけが入っていて、タイトルもその曲のタイトルのみがついているものを探すことで、同様に見ることができます。

:::note warn
ただこの方法について、最初申し上げた通り、必ずしも正確ではありません。

配信業者に委託している場合や、レーベルやアーティストの意向で変更を依頼している場合、単にProvided to YouTube byの部分を変更が可能な場合は、この方法では正確なディストリビューターとは一致しません。

:::

## おまけ
私は3～4年前に、音楽配信に関心を持ち始めました。その中でも、DSP（デジタルサービスプロバイダー）と直接取引を行うディストリビューターに興味を持ちました。このディストリビューターという仕事には、アグリゲーターやエンコーディングハウスのような業務も関連しています。この分野は将来的に大きなビジネスになると感じ、調査を進めていました。
同時に、「SkillShop」というプラットフォームでYouTubeに関する知識を学びました。ここでは、著作権管理やコンテンツの所有権についても勉強しました。これらのビジネスモデルは、CtoC（消費者間取引）ではなく、BtoB（企業間取引）の性質を持つものだと考えています。
特にYouTube Musicのようなサービスでは、同じYouTubeプラットフォームを使用していても、音楽コンテンツはユーザー生成（UGC）ではなく、提携パートナーが提供しています。DSPとの契約が、UGCより複雑になり、権利の監視、措置や、収益管理を大規模に行う点は、UGCとも比べ、大きな違いで、これが重要なポイントだと思います。

また、音楽ストリーミング分野では、ディストリビューターがさまざまな指定を行うことができます。たとえば、Explicit（不適切表現を含む）指定が可能であり、DSPが対応している場合は[E]マークが表示されます。この指定により、ストリーミングアプリの設定で該当する楽曲を非表示にすることも可能です。YouTubeもこの対応を行っています。。
この分野にあたって、
入りやすかったのがYoutube Musicをベースに考えることです。
Kotlin Koans はじめてみる

# はじめに
業務で Kotlin を触るものの、いちいち調べないと書けないので、練習のつもりで Kotlin Koans をやってみようと思う。
ただ Koans は Java → Kotlin にスイッチする人向けっぽい。
TypeScript くらいしかまともに扱ったことないから、どこまでできるか心配です。が、やってみる☆

# 環境構築
[Kotlin Koans の公式ドキュメント](https://kotlinlang.org/docs/koans.html)
オンラインでも intellij からでもできるらしい。
オンラインはこちら 👉 https://play.kotlinlang.org/koans

せっかくなので、intellij からやってみる☆
環境構築の方法は公式ドキュメントから見ていけばできたので割愛します。

ただ、せっかくならやったことを GitHub にコミットして草🌱を生やしたい（←動機が不純w）ので、回答用と思われるファイル（正確にはテストファイル以外の .kt ファイル）のみ事前にコミットしました。
下記 .gitignore ファイルは chatGPT にサクッと作ってもらいました☆


```gitignore:.gitignore
# Kotlinソースコード(.kt)以外を無視
*.*

# .ktファイルを除外しない
!*.kt

# Gradle関連のディレクトリ・ファイルを無視
.gradle/
build/
.gradle-wrapper/
gradlew
gradlew.bat
.gradle/**

# IDE関連のファイルを無視
.idea/
*.iml

# テストファイルやテストディレクトリを無視
**/test/
**/tests/

# その他の不要なファイルを無視
*.log
*.bak
*.tmp
*.swp
*.out
```

# Introduction > Hello, World!
では早速！
問題文が英語でちょっと嗚咽が・・・｡｡｡＿|￣|○ 早々に敗北感。。。

## Simple Functions
関数の構文を確認し、start 関数を変更して、文字列 "OK" を返すようにしてください。

Kotlin Koansの課題では、TODO() 関数が例外をスローします。
Kotlin Koansを完了するには、この関数の呼び出しを問題に従って意味のあるコードに置き換える必要があります。

```kotlin
fun start(): String = TODO()
```

### 解答
```kotlin
fun start(): String = "OK"
```

# おわりに
とりあえず学習環境が整ったので、このあたりにしておこうかな。
Koans は英語環境しかないから、いちいち翻訳しないと読めないのが残念。英語スキル大事。
せっかく翻訳するので記事にしていこうかな。未来の自分のために。

# Kotlin Koans やってみた の リンク
### Introduction
- **Hello, world!:** [Kotlin Koans はじめてみた（本記事）](https://qiita.com/b-yuko/items/3907987008e48f454cdf#introduction--hello-world)
- **Named arguments:** [Kotlin Koans やってみた 1](https://qiita.com/b-yuko/items/63dc3de54c752245bf48)
- **Default arguments:** [Kotlin Koans やってみた 2](https://qiita.com/b-yuko/items/a3f93b5410be7576c457)
- **Triple-quoted strings:** [Kotlin Koans やってみた 3](https://qiita.com/b-yuko/items/306f9352b37eef218808)
- **String templates:** [Kotlin Koans やってみた 4](https://qiita.com/b-yuko/items/cc2baa1dedc979a0050e)
- **Nullable types:** [Kotlin Koans やってみた 5](https://qiita.com/b-yuko/items/672fc37e158180e58f9d)
- **Nothing type:** [Kotlin Koans やってみた 6](https://qiita.com/b-yuko/items/6a4c8ba209c71c6e779a)
- **Lambdas:** [Kotlin Koans やってみた 7](https://qiita.com/b-yuko/items/01541f78faf31c1ba311)
### Classes
- **Data classes:** [Kotlin Koans やってみた 8](https://qiita.com/b-yuko/items/5d3ad8151276d98b73fe)
- **Smart casts:** [Kotlin Koans やってみた 9](https://qiita.com/b-yuko/items/de0ea00db977bc9d14a8)
AWS re:Invent 2024 6つの教訓から学ぶ対応方針とW-Aとの関係性

# はじめに

AWS re:Invent 2024で、AmazonのCTOであるDr. Werner Vogelsは、キーノートにおいて「Simplexity（シンプレクシティ）」を発表し、システム設計における複雑性の管理について6つの教訓を紹介しました。

今回はその教訓に基づいて、システム構築や運用においてどのようなことを考えなければいけないのか、またWell-Architected Frameworkへの対応について整理してみました。

# 6つの教訓
まずはそれぞれの教訓とはどのようなものかについて説明します。

1. **進化可能性を要件とする**
システムは将来的な変更や拡張に対応できるように設計する必要があります。これにより、新たな機能追加や技術の進化に柔軟に対応でき、長期的な維持管理が容易になります。<br><br>

1. **複雑性を分割する**
システムの複雑な部分を小さな部分に分割し、それぞれを独立して管理・開発します。 これにより、各部分の理解と管理が容易になり、全体の品質と信頼性が向上します。<br><br>

1. **組織をアーキテクチャに合わせる**
組織の構造をシステムのアーキテクチャに合わせることで、効率的な開発と運用が可能になります。 例えば、マイクロサービスアーキテクチャを採用する場合、各サービスに対応するチームを編成することで、責任範囲が明確になり、迅速な対応が可能となります。<br><br>

1. **セルベースの構成にする**
システムを独立したセル（単位）に分割し、各セルが他のセルから独立して機能するように設計します。 これにより、障害が発生した際の影響範囲を限定し、全体の信頼性を向上させることができます。<br><br>

1. **予測可能なシステムを設計する**
システムの動作が予測可能であることは、ユーザーの信頼を得るために重要です。 一貫したパフォーマンスや安定性を持つシステムを設計することで、ユーザーは安心して利用することができます。<br><br>

1. **複雑性を自動化する**
システムの複雑な部分を自動化することで、人的ミスを減らし、効率的な運用が可能になります。 例えば、インフラのコード化や自動デプロイメント、テストの自動化などを導入することで、運用負荷を軽減し、品質を向上させることができます。

# 教訓から学ぶエンジニアの対応方針とWell-Architected Frameworkの関係

1. **進化可能性を要件とする**
- システムをモジュール化し、各コンポーネントが独立して変更・拡張できるように設計する
- IaCを採用し、バージョン管理や自動デプロイを可能にすることで、将来的な変更に柔軟に対応する
- CI/CDを実践し、自動化されたテストとデプロイメントパイプラインを構築する

::: note info 
**対応するW-A**
- **運用上の優秀性** : 運用手順のコード化と自動化、変更管理の実施、継続的な改善の推進 
- **信頼性**: 変更管理と自動化されたリカバリ手順の実装
- **パフォーマンス効率**: 新しい技術の評価と効率的なリソースの使用
:::

2.**複雑性を分割する**
- マイクロサービスアーキテクチャを導入し、システムを小さなサービスに分割する
- 各サービス間のインターフェースを明確に定義し、依存関係を最小限に抑える
- ドメイン駆動設計(DDD)を活用し、ビジネスドメインに基づいてシステムを分割する

::: note info 
**対応するW-A**
- **運用上の優秀性**: 運用手順のコード化と自動化、およびチームの責任範囲の明確化
- **信頼性**: 障害の影響を最小限に抑えるためのシステム分割と設計
- **パフォーマンス効率**: 効率的なリソースの使用とスケーラビリティの確保
:::

3.**組織をアーキテクチャに合わせる**
- DevOps文化を醸成し、開発チームと運用チームの連携を強化する
- クロスファンクショナルチームを編成し、各チームが特定のサービスやコンポーネントの全責任を持つ体制を構築する
- 定期的に組織とアーキテクチャの評価を行い、必要に応じて再編成する

::: note info 
**対応するW-A**
- **運用上の優秀性**: チームの責任範囲の明確化と運用手順の標準化 
- **信頼性**: 組織構造とシステム設計の整合性確保
- **セキュリティ**: 責任の明確化とアクセス管理の適切な実施
:::

4.**セルベースの構成にする**
- セルアーキテクチャを採用し、システムを独立したユニットに分割し、障害時の影響範囲を限定する
- 各セルが他のセルから独立して機能できるように設計し、全体の信頼性を向上させる
- 需要に応じて各セルを個別にスケールアップ/スケールアウトできるようにし、リソースの最適化を図る

::: note info 
**対応するW-A**
- **信頼性**: バルクヘッドアーキテクチャを使用して影響範囲を制限することで、障害の分離を強化し、システム全体の信頼性を向上させる 
- **パフォーマンス効率**: リソースのスケーリングと最適化を行い、需要に応じて効率的にリソースを使用する
- **運用上の優秀性**: 運用手順のコード化と自動化、チームの責任範囲の明確化を推進する
:::

5.**予測可能なシステムを設計する**
- 使用する技術やプロセスを標準化し、システムの一貫性と予測可能性を高める
- システムのパフォーマンスやエラーログを継続的に監視し、異常を早期に検知・対応する
- 将来の負荷増加を予測し、適切なリソース計画を立てることで、システムの安定性を維持する
::: note info 
**対応するW-A**
- **信頼性**: システムのモニタリングと障害からの回復手順の実装により、システムの安定性と予測可能性を確保する
- **パフォーマンス効率**: リソースのモニタリングとスケーリングにより、需要の変化に対応し、効率的なリソース使用を実現する
- **運用上の優秀性**: 運用手順の標準化と自動化により、プロセスの一貫性と予測可能性を向上させる
:::

6.**複雑性を自動化する**
- EKSやECSなどのオーケストレーションツールを活用して、デプロイやスケーリングの自動化を実現する
- TerraformやCloudFormationを利用して、インフラ構築の自動化と再現性を確保する
- CI/CDパイプラインを構築し、コードの品質保証と迅速なリリースを可能にする

::: note info 
**対応するW-A**
- **運用上の優秀性**: 運用手順のコード化と自動化により、運用効率と信頼性を向上させる
- **セキュリティ**: セキュリティのベストプラクティスを自動化することで、スケール機能を改善し、安全に、より速く、より費用対効果の高いスケールを可能とする 
- **信頼性**: 自動化されたリカバリ手順の実装により、障害からの迅速な回復を可能とする
:::

# まとめ
6つの教訓から対応すべき方針をあらためて認識するとともに、Well-Architected Frameworkのベストプラクティスを照らし合わせることでシステムの複雑性を効果的に管理し、信頼性と拡張性の高いシステム構築へとつながるのではないでしょうか？
【SQLServer】備忘録：データの存在確認をする

## はじめに
SQLServerでデータの存在確認をする方法をいつも忘れるので、備忘録として残します。

環境：SQLServer 2017

## ひな形

```SQL
SELECT 
	CASE 
		WHEN EXISTS
			(
			-- 存在をチェックしたいデータをSELECT
			)
		THEN 1
	ELSE 0
	END AS "Exists"
 ```

Existsの値が1であればデータが存在し，0であれば存在しないというクエリになります。
数値として受け取ることも可能ですが、SQLServerのデータマッピングを使って真理値型(boolean型)で取得すると使いやすいです。

## 使用例
ユーザが存在するかチェックしたい場合

 ```SQL
SELECT 
    CASE
        WHEN EXISTS
        (
            SELECT 
                1 
            FROM 
                user
            WHERE
                user.id = @id
        ) THEN 1 
        ELSE 0 
    END AS "Exists";
 ```

## 簡単に解説
`WHEN EXISTS` で存在チェックをしています。
`WHEN EXISTS` の()内で取得したデータ数が1件以上であれば `1`、0件の場合は `0` を出力する仕組みになっています。

使用例でいうと
```SQL
SELECT 
    1 
FROM 
    user
WHERE
    user.id = @id
```
上記のクエリの結果が1件以上あれば `1` (存在する), 0件であれば `0` (存在しない)を出力します。
ABC014 B - 価格の合計

# 問題

あなたは買い物をしていて，商品リストからいくつかの商品を選んだ．
商品の数，それぞれの商品の価格，そして部分集合を表す10 進整数 X が与えられるので，部分集合に含まれる商品の価格を合計することである．

https://atcoder.jp/contests/abc014/tasks/abc014_2

# 考察
初めてビット全探索をやる人に向けた問題だと思います。
集合を表す変数が与えられているので、for文の中にfor文を書く必要はありません。

# コード
```cpp
#include <bits/stdc++.h>
#include <atcoder/dsu>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

using namespace std;
using namespace atcoder;

int main() {
    int N, X;
    cin >> N >> X;
    
    int ans = 0;
    
    vector<int> vec(N);
    rep(i, N) cin >> vec[i];
    
    for (int i = 0; i < N; i++) {
        if (X & (1 << i)) {
            ans += vec[i];
        }
    }
    
    cout << ans << endl;
} 

```

ビット探索の部分はこのように書くこともできます。

```cpp
#include <bits/stdc++.h>
#include <atcoder/dsu>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

using namespace std;
using namespace atcoder;

int main() {
    int N, X;
    cin >> N >> X;
    bitset<20> binary(X);
    vector<int> vec(N);
    rep(i, N) cin >> vec[i];
    
    int ans = 0;
    
    for (int i = 0; i < N; i++) {
        if (binary.test(i)) {
            ans += vec[i];
        }
    }
    
    cout << ans << endl;
} 
```
【Jest × react-testing-library】.map is not a functionの解決方法

# はじめに
Jestを使ったテストを書いていた際に発生したエラーについての記事です。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# 問題
以下のように、`Supabase`から取得した画像データを`images`として`map`でループ処理し表示させるコードを書きました。

***修正前***
```App.jsx
const [images, setImages] = useState<ImageType[] | undefined>([]);

//省略

images.map((image, index) => (
<Box key={index}>
  <Link href={`/Clothes/${image.id}`} display="block" w="100%" h="100%">
    <Image src={image.file_url} alt="clothes" w="80%" margin="auto" py={4} />
    <Text textAlign="center">{image.id}</Text>
  </Link>
</Box>
))
```
しかし、テスト実行時に次のエラーが発生しました。
```react
const mockImgDate = jest.fn().mockResolvedValue({ file_name: "testImg", file_url: "testUrl" });
```

# 解決方法
原因はモックデータの形式に問題があったことでした。

```APP.jsx
const [images, setImages] = useState<ImageType[] | undefined>([]);
```
受け取ったデータを配列として扱う必要があるのに対し、モックデータが配列の形になっていませんでした。

修正後
```react
const mockImgDate = jest.fn().mockResolvedValue([{ file_name: "testImg", file_url: "testUrl" }]);
```
この修正によってimages.mapが配列として正しく動作するようになり、テストが通るようになりました。

# 終わりに
今回のエラーは、モックデータの型と実際のコードが不一致だったことが原因でした。引き続きテストの精度を高めるために学習を続けていきたいと思います。
初心者プログラマーにおすすめのパソコンのOSについて

# はじめに
プログラマーやエンジニアは様々なツールやOS、システムを自在に扱うことができるようになることが、究極的な目的の一つではある。しかし、初心者にとって一番難しいのが、どのOSが自分の用途に適しているのかである。そこで、今回はWindows,Mac,Linux(Ubuntu)を保持する筆者が初心者にとって、どのOSが最適なのかを議論する。

# OSの種類
一般に、パソコンのOSはWindows,Mac,Linux(以下Ubuntuに限定する)の3種類を意味する。一部スパコンや、AWSシステムなどのインフラを扱っているPCはマニアックなLinuxを用いているものもあるが、今回は考えない。
そこで、それぞれのメリットとデメリットをまとめるので参考にして欲しい。

# Windows

まずは、パソコンのOSと言えば、Windowsである。ExcelやWordといったマイクロソフトのソフトを始め、基本的にほとんどのアプリケーションに対応している。

以下メリットを挙げる。

- 汎用性が広い
- 初心者からプロ向けの幅広いペルソナ
- オフィスと相性がいい
- 情報が豊富
- ユーザーが多い
- 安く基本どのようなパソコンにも入っている
- 動作が安定している（変なことをしないユーザーに限る）


まとめると、良かれ悪かれ、多くのユーザや企業が標準対応しているため、パソコン初心者やオフィスソフトを多用するユーザにとってはオススメである。

次に、デメリットを挙げる。

- 環境構築が複雑化しやすい
- システムが複雑すぎる
- ライブラリの衝突などが生じやすい
- コマンドが特殊（パスの通し方など）
- MSのマーケティング戦略にかかりやすい
- アップデートが多い
- 突然ブルースクリーンを吐く
- 遊べない（主にメインPCになるので）
- 文字化けやレトロなトラブルが起きやすい

まとめると、PythonやRubyなどの比較的新しいプログラミング言語を扱う際は少し注意が必要である。（勘違いしないで欲しいのがプログラミングを出来ないという訳ではない）むしろ、C言語やJAVA、PHPなどの古くからある言語は、Windowsの方が、扱いやすい場合がある。ただし、古すぎるシステムの場合は文字化けなどのバグを引き起こしやすい。
# Mac
次にMacについて述べる。
モダンなWebアプリや最近のエンジニアにとってかなり重宝されているOSである。特に、Iphoneアプリを製作することができるXcodeなどの機能は、原則Macでしかない。

以下メリットを述べる。

- スペックや機能性が高い
- Linuxコマンドなどの環境が既に整っている
- GUIとCUIのバランスが良い
- デザインが良い
- Adobeなどのデザインソフトと相性がいい
- オフィスなどのソフトもまあまあ使える
- ライブラリの衝突が起こりにくい
- 比較的操作がシンプル

まとめると、高い機能性やデザイン、iPhoneのアプリに興味のある方やWeb系を志したい人にとってはオススメである。

次に、デメリットについてまとめる。

- 基本的に高価である
- 中級者以上向け
- リソースが乏しい分野あり(Win程親切ではない)
- 販売店や修理店が充実していない（基本純正のみ）
- 重量が重い（高性能なため） 

まとめると、使用しているユーザーがそこそこしかいないので、エラーなどが起きてもそれに対応するリファレンスが日本語に対応していない場合が多い。また、高性能なため重量やサイズが大型になりやすい。


# Linux(Ubuntu)
最後に、Ubuntuについて述べる。Ubuntuは無料OSなためサーバーやAWSのようなクラウド、データサイエンス用のスパコンなど意外と身近なところで使用されている。駅の掲示板のシステムなどにも採用されている。

縁の下の力持ち的なOSであるということを覚えておいて欲しい。

以下メリットについて述べる

- マニア向け
- プログラミングとすこぶる相性が良い
- 動作が軽い
- 低スペックのPCにも最新版を導入可能
- デザインが良い
- コマンドベースで処理ができる
- 膨大なデータを扱いやすい
- 勉強用になる
- 遊べる（システムを破壊したり、、、）
- コスパがいい
- ウイルスにかかりにくい
- アップデートが無料かつシンプル

まとめると、プログラミングをする方でマニアックなもの好きな方にとっては、すこぶる人気があるといえる。また、古いソフトウェアや英語版のソフトウェアを動かしたりする際の検証用PCとしても重宝する。
次に、デメリットについて述べる。

- メインにはしない方がいい
- オフィスやAdobeと仲が悪い
- 初心者には不向き
- リファレンスが乏しく英語が多く専門家向け
- STEAMなどのゲームができない

まとめると、遊びや勉強用として使うＯＳには最適だが、オフィスソフトと相性が悪いためメインのパソコンにするには不向きである。

（一応、Libreオフィスという代替品もあるが、細かい文字フォントなどの違いもあるため、オフィスにこだわる方はWindowsを使うべきだ。）

# まとめ
今回は、3種類のOSについて紹介した。Windowsは、一般人向けでMacはモダンなwebやアプリ系のエンジニア向け、Linuxはマニアや研究者、データサイエンティスト向けという結果になった。なので、個人的には、Windowsをよく使用するが、Webアプリを作成したい場合はMacを使う。
AIエージェントとその未来：Agentariumフレームワークの紹介

## はじめに

近年、人工知能（AI）の進化は目覚ましく、特にAIエージェントの登場が注目されています。AIエージェントは、自律的にタスクを実行し、判断を下すプログラムであり、ビジネスや日常生活において多くの可能性を秘めています。本記事では、Pythonフレームワーク「Agentarium」を中心に、AIエージェントの機能、利用方法、将来性について詳しく解説します。

## 1. Agentariumとは？

[Agentarium](https://github.com/Thytu/Agentarium)は、AIエージェントを管理・調整するための新しいPythonフレームワークです。このフレームワークは、複数のAIエージェントを簡単に作成・管理できるように設計されています。具体的には、以下のような機能があります。

- **高度なエージェント管理**：異なる役割と能力を持つ複数のAIエージェントを作成し、調整することができます。
- **ロバストなインタラクション管理**：エージェント間の複雑なインタラクションを調整します。
- **チェックポイントシステム**：エージェントの状態やインタラクションを保存・復元することができます。
- **データ生成**：エージェントのインタラクションを通じて合成データを生成します。
- **パフォーマンス最適化**：効率性とスケーラビリティを重視して構築されています。
- **柔軟な環境設定**：YAML設定ファイルを使用してカスタム環境を定義することができます。
- **拡張可能なアーキテクチャ**：特定のニーズに合わせて簡単に拡張・カスタマイズできます。

これらの機能は、AIエージェントの設計や運用をより効率的に行うための強力なツールとなります。

## 2. AIエージェントの機能

### 2.1 自律的なタスク実行

AIエージェントは、自らの判断でタスクを実行する能力を持っています。これにより、日常業務の自動化が進み、人間が行うべきクリエイティブな作業に集中できるようになります。

### 2.2 データ分析と意思決定

AIエージェントは、大量のデータをリアルタイムで分析し、最適な意思決定を下すことができます。例えば、顧客の問い合わせに対して迅速に適切な回答を提供することが可能です。

### 2.3 学習と適応

AIエージェントは、過去の経験から学び、結果に基づいて自らを改善する能力を持っています。この学習機能により、エージェントは時間とともにより高度なタスクを実行できるようになります。

## 3. AIエージェントの導入事例

### 3.1 ビジネスプロセスの自動化

多くの企業がAIエージェントを利用して、顧客サポートや営業支援の業務を自動化しています。これにより、業務効率が向上し、コスト削減にも寄与しています。

### 3.2 マーケティングの最適化

AIエージェントは、顧客データを分析し、最適なマーケティング戦略を提案することができます。これにより、企業はより効果的にターゲットにアプローチすることが可能になります。

### 3.3 教育分野での活用

教育機関でもAIエージェントが導入され始めており、学生のニーズに応じたサポートを提供しています。特に、学習の進捗を管理し、個別の学習プランを提案することが期待されています。

## 4. AIエージェントの未来

### 4.1 より高度な自律性

AIエージェントは今後、さらに自律的な存在へと進化していくでしょう。これにより、人間の介入なしに複雑なタスクを遂行できるようになると予想されます。

### 4.2 インターネットとの統合

AIエージェントは、インターネットと連携することで、リアルタイムで情報を取得し、より豊富なデータに基づいて判断を下すことができるようになります。

### 4.3 社会的影響

AIエージェントの普及は、労働市場にも大きな影響を与えるでしょう。特に、反復的な業務が自動化されることで、新しい職種や役割が生まれると考えられます。

## 5. まとめ

Agentariumフレームワークは、AIエージェントの管理と調整を効率化するための強力なツールです。AIエージェントは、業務の自動化やデータ分析、意思決定において重要な役割を果たすことが期待されています。今後の展望としては、さらなる自律性の向上やインターネットとの統合が挙げられ、私たちの生活やビジネスに革命的な変化をもたらすことでしょう。

このように、AIエージェントの導入は企業にとって競争優位性をもたらす重要な要素となります。これからの進化を見逃さず、積極的に取り入れていくことが求められます。


https://github.com/Thytu/Agentarium
任意のヘルパーメソッドを定義する

#### 任意のヘルパーメソッドを定義する
># Defining arbitrary helper methods

`define_method`メソッドまたはrubyの関数キーワードを使ってどのexmapleグループ内でもメソッドを定義できる。

それらのヘルパーメソッドはそのグループ内に入れ子されたグループと定義されたグループでexampleたちに公開される。しかし親グループまたは兄弟グループには公開されていません。

>You can define methods in any example group using Ruby’s def keyword or define_method method. These helper methods are exposed to examples in the group in which they are defined and groups nested within that group, but not parent or sibling groups.

#### 同じグループ内でメソッドを定義する
>### Use a method defined in the same group

```rb
RSpec.describe "an example" do
  def help
    :available #rubyの関数キーワードを使ってexmapleグループ内でメソッドを定義することでhelpメソッドが呼ばれる
  end

  it "has access to methods defined in its group" do
    expect(help).to be(:available) # 同一の関数であるからtrue
  end
end
```
```
Run options: include {:full_description=>/an\ example/}
1 example, 0 failures, 1 passed
```
#### 親グループ内で定義されたメソッドを使う
>### Use a method defined in a parent group

```rb
RSpec.describe "an example" do # 親グループ
  def help
    :available # 親グループで定義する
  end

  describe "in a nested group" do # 子グループ、入れ子されたグループ
    it "has access to methods defined in its parent group" do
      expect(help).to be(:available) # 親グループで定義されたメソッドを使える
    end
  end
end
```
```
Run options: include {:full_description=>/an\ example/}
1 example, 0 failures, 1 passed
```

https://rspec.info/features/3-13/rspec-core/helper-methods/arbitrary-methods/
[備忘録]Docker Dockerfileの基本

# なぜDockerfileが必要なのか？
DockerHubにはubuntuやpythonなど様々なイメージが提供されているのに、なぜDockerfileへの理解が必要なのでしょうか？
基本的にはDockerHubで提供しているイメージはubuntuのみ、pythonのみなど最低限の機能しか入っていないものが多い。開発実務では多くの技術スタックを組み合わせていくことになるため、イメージをカスタムする必要がある。DockerfileはDockerイメージの基になるテキストファイルと考えれば良い。

# Dockerfileに関するコマンド
Dockerfileからイメージを作成する
```
docker image build {ディレクトリパス}
```
ディレクトリパスは基本的にはDockerfileがあるディレクトリを指定する。
-tオプションでイメージの名前をつけられる。
例）docker image build -t test-image:v1 {ディレクトリパス}
-tをつけないとイメージ名が"none"になる。

# Dockerfileの書き方
```
FROM {dockerイメージ}
```
FROMは一番ベースのイメージを記載する。
例）FROM ubuntu:20.04
<br>
```
RUN {コマンド名}
```
RUNはイメージからコンテナを起動する際に実行するコマンドを記載していく。
例）
RUN apt install
RUN apt install -y curl
<br>
```
COPY {コピー元のファイルパス} {コピー先のディレクトリパス}
```
COPYで好きなファイルをイメージに配置する。コピー先は存在しなければ新しく作成される。

# ビルドコンテキストについて
```
docker image build {ディレクトリパス}
```
の{ディレクトリパス}は厳密にはビルドコンテキストパスと呼ばれるものになる。そしてこのコマンドをより詳細にいうと、Dockerfileとビルドコンテキストからイメージを作成するコマンドとなる。なのでビルドコンテキストとDockerfileは全くの別物となる。image buildするさいにDockerfileがビルドコンテキストのパスに存在するものとして、Dockerfileを探しにいく。逆に言うとビルドコンテキストのパスとDockerfileのパスが異なっていても指定することもできる（後述）。

ビルドコンテキストを理解するためにはまずはdockerのアーキテクチャを把握する必要がある。
以下の図は公式ドキュメントで紹介されているDocker Engineの全体像。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630415/001f2080-66d1-db81-3908-efa7da8d43a7.png)
(出典:<a href = "https://docs.docker.jp/get-started/overview.html">Docker 概要</a>)

ターミナルでのdockerコマンドの入力は図のクライアント dockerCLIにあたる。入力したコマンドをREST APIを介してサーバ dockerデーモンに渡すことで、イメージを作ったり、コンテナを作ったりしている。なのでdockerCLIとdockerデーモンが別々の環境にあっても操作ができることになる。
dockerデーモンはクライアントとは別々の環境に存在することが思想にあるため、例えばローカルのファイルをdockerイメージ内に配置したい、などの場合にはdockerデーモンに対して、事前にローカルのファイルについての情報を教えてあげる必要がある。それが上で説明したビルドコンテキストの正体。ビルドコンテキストに指定した配下のファイルを操作することができるようになる。逆に言えばビルドコンテキストにないファイル等はdockerデーモンが認識できないため操作できない。

### Dockerfileとビルドコンテキストを別々に指定する方法
Dockerfileがある場所とビルドコンテキストに指定したい場所が別々の階層の場合は以下のコマンドで指定できる。
```
docker image build -f {Dockerfileのディレクトリパス} {ビルドコンテキスト}
```

# デフォルトコマンドを変更する
Dockerfile内にCMDを記述することでコンテナ実行時のデフォルトコマンドを設定できる。例えばDocker Hubからプルしたubuntuのデフォルトコマンドはbashだが、CMDを記述することによって任意のコマンドに変更できる。

```
FROM ubuntu
CMD ["実行コマンド","パラメータ1","パラメータ2",・・・]
```
パラメータはいくつでもOK。CMDを複数記述したさいは最後のCMDのみ有効になることに注意。

# 環境変数を設定する
```
ENV 環境変数名 = "値"
```
複数記述可。「””」,「＝」は省略可。設定した変数を呼び出すには先頭に$をつけるのを忘れずに。

# 変数を設定する
イメージ作成時に利用する変数を渡す。
```
ARG 変数名 = デフォルト値
```
<br>

dockerfile例）
以下は変数sampleを設定し、コンテナを起動するさいにsample.txtに任意の文字列を書き込み、catでファイルの中身を表示する。
```
FROM ubuntu
ARG sample
RUN echo $sample > sample.txt
CMD ["cat", "sample.txt"]
```
イメージを作成する際は以下のように、--build-argオプションをつける。
```
docker image build --build-arg sample="hello wolrd" .
```
作成したイメージからコンテナを起動すると以下のような出力になる。
```
user % docker container run -it {イメージID} 
hello wolrd
user %
```

# ARGとENVの違い
ARG：イメージ作成時のみ有効な一時的な変数
ENV：イメージ作成時とコンテナ起動時、両方で有効な変数

# 作業ディレクトリを変更する
RUNやCMDなどの作業ディレクトリの指定は以下のコマンド
```
workdir {ディレクトリパス}
```
で現在の作業ディレクトリを変更できる。デフォルトでは/（ルート）になっている。
配列の内容を二重ループで表示　Java

はじめに
--
インフラの分野でも、Iac化が進んで行くと考えています。そこで、ノウハウが体系だっているものが学び易いと考えて、Javaを学びはじめました。

今回は、ループ処理にフォーカスしました。

### 内側のループが終了するたびに外側のループが再度実行され、`A` が2回表示される動作を確認する。

外側のループ: 配列 array の各要素を順に a に代入します。
内側のループ: 配列 array の各要素を順に b に代入し、b が "B" でなければ b を出力します。b が "B" になると、break で内側のループを終了します。


```java
public class Main {
    public static void main(String[] args) {

        String[] array = {"A", "B"};

        // "A A" を表示するためのループ
        for (String a : array) {  // 外側のループ
            for (String b : array) {  // 内側のループ
                if ("B".equals(b)) 
                    break;  // "B" を見つけたら内側のループを終了

                System.out.print(b + " ");  // "A" を表示
            }
        }
    }
}
```

### 実行結果:

```
A A 
```



1. **外側のループ** (`for (String a : array)`) は `array` の中身 `{"A", "B"}` を順に取り出します。
2. 内側のループ (`for (String b : array)`) は `array` の中身を再度順に取り出します。
3. **最初のループ** (`a = "A"`):
   - 内側のループが `"A"` を取り出して `System.out.print(b + " ")` を実行し、`"A "` を出力。
   - 次に内側のループが `"B"` を取り出すので、`if ("B".equals(b))` が `true` となり、`break` で内側のループが終了します。
4. **2回目のループ** (`a = "B"`):
   - 再度内側のループが実行されますが、`b = "A"` が再度取り出され、同じく `System.out.print(b + " ")` が実行されて `"A "` が再び表示されます。

### 結果として、`A` が2回表示されるのは、外側のループが1回目（`a = "A"`）と2回目（`a = "B"`）の両方で内側のループを走らせるからです。そのため、`A A` が表示されます。

## 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421
`flask db init` にて、 Error: No such command 'db'. エラーとなる

`flask db init` を実行すると、`Error: No such command 'db'. `

```zsh
$ flask db init
Usage: flask [OPTIONS] COMMAND [ARGS]...
Try 'flask --help' for help.

Error: No such command 'db'.
```

`help`  を確認すると、

```zsh
$ flask --help 
...
Commands:
  routes  Show the routes for the app.
  run     Run a development server.
  shell   Run a shell in the app context.
```

確かにサブコマンドに `db` が存在しない。

解決方法は、[こちら](https://jjasghar.github.io/blog/2023/06/26/flask-migrate-db-not-found/)を参考にした。

コードが足りないと、サブコマンドが生えてこないらしい。。。
以下３つのコードを追記

```app.py

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate # 追記1

db = SQLAlchemy()
migrate = Migrate() # 追記2

def create_app(config_object='app.config'):
    # Flaskアプリケーションの作成
    app = Flask(__name__)

    app.config.from_object(config_object)

    db.init_app(app)
    migrate.init_app(app, db) # 追記3
```

```zsh
❯ flask --help
Usage: flask [OPTIONS] COMMAND [ARGS]...

Commands:
  db      Perform database migrations.
  routes  Show the routes for the app.
  run     Run a development server.
  shell   Run a shell in the app context.
```

生えてきたｗｗｗ。
サーバー作成方法

今回は、スマホでもパソコンでもできる、Minecraftサーバーの作り方を教えていきます
1.まず、Googleや、safari、edgeなどのブラウザでaternosと調べてください
![スクリーンショット 2025-01-01 160634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975362/64c4ec1c-0906-16dd-75a0-310a438b6927.png)
これをクリック
クリック後
![スクリーンショット 2025-01-01 161130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975362/50d7a0b5-6951-80b8-16d7-e1d91b227e53.png)
Googleログインは、垢を持っている人、もっていない人は、アカウント作成をクリック
![スクリーンショット 2025-01-01 161346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975362/c15d0699-8f9f-cdda-6cd3-1e0daa72050f.png)
ユーザー名をクリックし名前を
次へを押す、
![スクリーンショット 2025-01-01 161535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975362/91b4720c-8793-5cb9-3f42-a17dbd56a393.png)
パスを打って、メアドも打つ
![スクリーンショット 2025-01-01 161658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975362/0558d278-66dc-c082-6723-8b03b4319f01.png)
サーバー作成をクリック
その後、ソフトウェア、お選び、鯖起動したり、プラ入れたりしてね～