OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリの広告が表示されなくなった

## 作ったゲームの下部バナー広告が消滅
[しょうゆ取ってゲーム](https://apps.apple.com/jp/app/%E3%81%97%E3%82%87%E3%81%86%E3%82%86%E5%8F%96%E3%81%A3%E3%81%A6%E3%82%B1-%E3%83%BC%E3%83%A0/id6737563273)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/2499c1ce-0b30-b8a2-094e-483b1ac1a193.png)

　
デバッグするとコンソールに原因っぽいログ
```
<Google> <Google:HTML> 42 required SKAdNetwork identifier(s) missing from Info.plist. 
See [Enable SKAdNetwork to track conversions] 
(https://googlemobileadssdk.page.link/enable-skadnetwork).
```

Info.plistにSKAdNetworkIDs識別子が無いらしい（何それ・・）


## SKAdNetworkとは？
Appleが提供する広告トラッキングのためのフレームワーク
広告プラットフォーム（例: AdMob）は、この仕組みを利用するために特定のSKAdNetwork識別子をアプリの Info.plist に設定する必要がある。

## 対策
[このページ](https://developers.google.com/admob/ios/privacy/strategies?hl=ja)にあるSKAdNetworkItems以下を全てinfo.plistに追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/40a5c69c-91c2-b40b-6ad9-9841b2b80737.png)
　
実機で確認したところ出ている・・！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/cab46905-13c7-2eea-00e2-a6b545e57811.png)

ビルドしてアプリ申請します😄
DevToys Extension のサンプルプロジェクト作りました。

# DevToys Extension のサンプルプロジェクト

先日、８年ぶりに書いた記事、DevToysのExtension(拡張機能)についてですが。

https://qiita.com/BJCRobot/items/e94d93b8e2253bfe9bfe


動作するサンプルをGitHubにコミットしました。

https://github.com/bjcrobot/DevToysExample

# 動かすためには、
git で clone してVisual Studio 2022で開けば動くと思います。

```
> git clone https://github.com/bjcrobot/DevToysExample.git
```

## が、その前にそもそも必要なもの
DevToys 本体
インストーラー版より、Zip版をオススメします。
(どこにインストールされたのかわからなくなるので)

https://devtoys.app/

## DevToys Extension開発のための最低限のセットアップ

https://devtoys.app/doc/articles/extension-development/getting-started/setup.html?tabs=windows

環境変数の設定が必要になります。 
以下は、WindowsでPowerShellを使う場合、その他は上記のリンク先を見てください
```
[Environment]::SetEnvironmentVariable("DevToysGuiDebugEntryPoint", "<your_path>\DevToys.exe", "User")
[Environment]::SetEnvironmentVariable("DevToysCliDebugEntryPoint", "<your_path>\DevToys.CLI.exe", "User")
```

## 開発ツール
Windowsなら、Visual Studio 2022 がオススメですが、

https://visualstudio.microsoft.com/ja/vs/

Visual Studio Code でも大丈夫です。(Macとかでも動きます)

https://azure.microsoft.com/ja-jp/products/visual-studio-code

大体これで動くと思いますが、不足してるものとか不明点あれば、コメントください。
皆さんのはじめの一歩のお薬に立てばです。

で、何作ろう・・・
u16北海道プログラミングコンテスト配信の裏側

> この記事は、「K47deのひとりぼっち Advent Calendar 2024」の Day 1 です。

## 概要

Atemと会場プロジェクター、カメラなどのイベント時の構成で配信する知見の共有

## はじまり

先日、11月23日に「u16北海道プログラミングコンテスト 北海道大会」が釧路市にて開催されました。

https://procon.946oss.net/

私は会場の様子をYouTube配信する担当になり色々してましたが普通に失敗したのでみなさんが同じ道を歩まないために色々書き残します。

## 失敗その１ - スプリッター

https://www.blackmagicdesign.com/jp/products/atemmini
> ATEM Mini Proは、4つのHDMI入力、ハードウェア配信エンジン、USBディスクへの収録、オーディオミキサーなどの高度な放送機能を備えたコンパクトなライブスイッチャーです。

今回の配信はAtem Mini Proを経由して行われました。

初期構想ではスプリッターを利用する構成を組んでいました。
これはパソコンの表示を会場のプロジェクターとAtemの配信用に２つ乗せる必要があったからです。

しかし、**スプリットした映像はATEMが飲まなくなる**という事実が出てきました。
どうやら識別信号などの問題でATEMへ入力がいかなくなるようです。

これで構成図をその場で書き直すことになりました。

## 失敗その2 - 回線速度

会場は釧路市の釧路観光国際交流センター Aホール問ところで行われました。
回線はネットワーク担当のpovoや会場の無料WIFIのマルチフォーミングで行われましたが、au回線の弱さと無料WIFIの帯域幅の問題もあり安定した配信ができませんでした。

最終的には配信よりも会場進行を優先する判断をしたので配信は停止処理をしました。

## 心残り

そもそも正常に配信できなかったこと、設営の不備で関係各所にご迷惑をおかけしました。
次こそはと思っていますが、来年大会運営すらまともにできるのやら...

## まとめ

ATEMにスプリットした映像は入力できない。
配信に必要な帯域があるか事前に確認しておくべき。

来年こそはなんとかします...
CSS Modules + Sass（SCSS） で発生した変数に関する Stylelint エラーとその解決方法

## はじめに
CSS Modules と Sass(SCSS) を組み合わせてスタイルを実装した際に直面した問題を紹介します。

今回は、名前空間なしでインポートしたパーシャルファイル内の変数を使用して、ショートハンドプロパティを指定した際に発生したエラーの解決方法を取り扱います。

## 環境
```
Next.js: v14.2.3
Sass: v1.77.2
stylelint: v16.2.1
```

## 問題の概要
### 1. Sass（SCSS）のパーシャルファイルを作成し、変数 `$red` を定義
```scss
// _variables.scss
$red: #db4343
```

### 2. パーシャルファイルを名前空間なしでインポートし、`$red`を`border`に指定
```scss
// styles.module.scss
@use '/variables' as *;

.style {
  border: 2px solid $red;
}
```

### 3. Stylelintからエラーメッセージが出力
```bash
Cannot parse property value "2px solid $red" for property "border" \
(declaration-property-value-no-unknown) 
```
このエラーは、Sassの変数が`border`のプロパティ値として解釈されなかったことを示しています。


## 解決方法
今回、Sassのインターポレーションを使うことによって解決しました。
ショートハンドプロパティ内で変数を使用する場合、インターポレーションを使わなければ正しく解釈されません。
以下のように、変数を`#{$変数}`で囲ってあげることで、Stylelintのエラーは解消します。

```scss
// styles.module.scss
@use '/variables' as *;

border: 2px solid #{$red};
```

## 補足
名前空間ありでインポートすれば、インターポレーションを使わずともエラー解消できます。
ただ、今回は名前空間なしで実装したかったため、採用しませんでした。
以下、名前空間ありでインポートした際の実装です。
```scss
// styles.module.scss
@use '/variables' as color;

.style {
  border: 2px solid color.$red;
}
```

## 参考文献
https://stylelint.io/user-guide/rules/declaration-property-value-no-unknown.html

https://shanabrian.com/web/sass/interpolation.php

https://tenderfeel.github.io/SassReference/sass-script/interpolation.html
pythonのpipが環境変数に通ってなくて設定がややこしすぎる

多くのpythonの記事でpipを使うときは、
```powershell
pip install package
```
を使いますが、まれにpipが環境変数に通っておらず全くインストールできないことがあります。その場合は、
```powershell
python -m pip install package
```
を実行することで環境変数を通さなくてもpipを使うことができます。
(私はこの問題で1週間詰まりました)
Tailwind CSSのクラス名が上書きされない問題を解決する

## はじめに
Reactコンポーネントの props で tailwindcss のクラス名を渡した時にスタイルが上書きされず困ったのでまとめます。

## 問題
以下のような`Page`コンポーネントと`Button`コンポーネントがあるとします。
```react
// page.tsx
import Button from ./button

const Page = () => {
  return (
    <Button className={'bg-black'} title={'タイトル'} />
  )
}

export default Page
```

```react
// button.tsx
import React from 'react'

type Props = {
  children: React.ReactNode
  className?: string
} & React.ButtonHTMLAttributes<HTMLButtonElement>

export const Button = ({
  children,
  className = '',
  ...props
}: Props) => {
  return (
    <button
      className={`px-4 py-2 text-center bg-blue ${className}`}
      {...props}
      >
     { children }
    </button>
  )
}
```

`Button`コンポーネントの`className`に`bg-black`を指定した際に、背景色が黒色になることを期待しますが、実際にはデフォルトで設定した青色のままになってしまいます。

## 解決方法
[tailwind-merge](https://www.npmjs.com/package/tailwind-merge)を使えば解決できます。

```typescript
// button.tsx
import React from 'react'
import { twMerge } from "tailwind-merge"

type Props = {
  children: React.ReactNode
  className?: string
} & React.ButtonHTMLAttributes<HTMLButtonElement>

export const Button = ({
  children,
  className = '',
  ...props 
}: Props) => {
  return (
    <button
      className={twMerge(
        'px-4 py-2 text-center bg-blue',
        className,
      )}
      {...props}
    >
      { children }
    </button>
  );
}
```

## おわりに
tailwindcssは後に指定したクラス名が優先されると思ってましたが、必ずしもそうではないということを学びました。

## 参考
https://www.sabhya.dev/how-to-override-tailwind-css-styles-in-a-react-component
pythonで書いた探索・ソートアルゴリズムをjavascriptで書いてみる

概念で理解していることをほかのプログラミング言語に適用し、
習得度を確認してみるトライ。


python3 での ２分探索 
```python
def binary_search(arr: list, target: int) -> bool:
    first = 0
    last = len(arr)
    while last >= first:
        mid = (first + last) // 2
        if target == arr[mid]:
            return True
        else:
            if target > arr[mid]:
                first = mid + 1
            else:
                last = mid - 1
    return False

```



javascriptによる 2分探索
>> こちらはOK
```javascript
function binarySearch(Iterable, Target){
    let first = 0;
    let last = Iterable.length;

    while (last >= first){
        let mid = Math.floor((first + last) / 2);
        if (Target == Iterable[mid]){
            return "true";
        }else{
            if(Target > Iterable[mid]){
                first = mid + 1;
            }else{
                last = mid - 1;
            }
        }
    }
    return "false";
}
```


python のマージソート

```python
def merge_sort(arr: list) -> list:
    if len(arr) > 1:
        mid = len(arr) // 2
        left = arr[:mid]
        right = arr[mid:]

        merge_sort(left)
        merge_sort(right)

        left_i, right_i, arr_i = 0, 0, 0

        while left_i < len(left) and right_i < len(right):
            if left[left_i] < right[right_i]:
                arr[arr_i] = left[left_i]
                left_i += 1
            else:
                arr[arr_i] = right[right_i]
                right_i += 1
            arr_i += 1
        
        while left_i < len(left):
            arr[arr_i] = left[left_i]
            left_i += 1
            arr_i += 1
        
        while right_i < len(right):
            arr[arr_i] = right[right_i]
            right_i += 1
            arr_i += 1
    
    return arr

```


javascriptのマージソート

>>javascriptのマージソートは、正しく動かない.
```javascript
const mergeSort = (array) =>{
    if (array.length > 1){
        let mid = Math.floor((0 + array.length) / 2);
        let left = array.slice(0, mid);
        let right = array.slice(mid, array.length);

        mergeSort(left);
        mergeSort(right);

        let [i, j, k] = [0, 0, 0];
        while( i < left.length & j < right.length ){
            if (left[i] < right[j]){
                array[k] = left[i];
                i += 1;
            }else{
                array[k] = right[j];
                j += 1;
            }
            k += 1;
        }

        while ( i < left.length){
            array[k] = left[i];
            i += 1;
            k += 1;
        }

        while (j < right.length){
            array[j] = right[j];
            j += 1;
            k += 1;
        }
    }
    return array;
}


```

プリントデバッグでもしつつ、どうして意図した挙動になっていないかを確認する。
[なんでも整理しないと気が済まない人用]蔵書を管理するソフトウェアを作りました。[バーコード認識対応]

# A型の読書家のためのソフトウェア
小説を読むことが趣味・漫画を大量に集めている・文献を積んでいる、方！  
増えてきた蔵書を一元管理したい、本棚を整理したい、と思いませんか？
このたび、自分の収集癖的な発作を抑えるために、蔵書をパソコン上で管理できるソフトウェアを開発いたしました。
# Shelf
Shelfというソフトウェアになります。わかりやすい名前ですね。以下リンクになります。
ぜひダウンロードしてみてください。macOSに対応しています。ダウンロードの際は必ずREADMEの利用規約とライセンスに目を通すようにお願いしますね！
[Shelf](https://yuhara0.wordpress.com/shelf/)
# 使いかた
![screen_shot 2024-11-28 5.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618401/be37384b-67fb-02f3-4032-f5ed224d8916.png)
### はじめに
アプリを開いたら、再読み込みボタン(command+R)を押してください。データを読み込みます。
蔵書データは/Users/{ユーザー名}/Documents/Shelf/library.jsonに、JSON形式で記述され保存されています。初めてご利用の場合は、ファイルが生成されます。
### 本を追加する
追加ダイアログボックスにISBNコードを入力し、OKボタン(command+S)を押すことで書籍が登録されます。
NDLサーチAPIを使っていますので、国会図書館のデータベースに存在する書籍全てに対応しています。
バーコードの画像から追加したい場合は、「バーコードの画像ファイルから追加」をクリックし、画像ファイルを一つにまとめたフォルダを選択してください。
### 本を削除する
削除ダイアログにISBNを入力するか、Deleteチェックボックスにチェックを入れた後、OKボタンを押すことで削除されます。
### Classification
ユーザー独自の分類番号を振ることができます。私は十進分類法に基づいて分類番号を付しています。
入力後、**必ずOKボタンを押してください。** ボタンを押さなければ変更が保存されません。
### Readed
既読の本にはチェックを入れることができます。
変更後、**必ずOKボタンを押してください。** ボタンを押さなければ変更が保存されません。
## 開発の話
Pythonで全文書いています。データは、国会図書館APIからの取得。OpenBDも試しましたが、手持ちの本だけでも何冊かデータのない本がありましたので、おそらく蔵書数はトップだろうと国会図書館APIの出場となりました。
バーコードの読み込み処理は、頑張って並列化したんですが、どうしても重たいです。GUIが固まることがありますが、登録が終わるまでお待ちください。
代理ARP

# 送信元ホストが知らない場合でも送ることができる
>ホスト４が別のネットワークに存在することを`ホスト１が知らない場合にも、ホスト１からホスト４へパケットを送信する`ことができる。

# 宛先に所属するルーターがARPに応答する
>その解決方法は、CSネットワーク上から送信されたホスト４へのARPに対してルーターが応答し、`ルーター自身のアドレスE3を伝える`ことである。なお、ホスト４にはARP要求が届かないため、ホスト４が直接応答することはできない。これにより、ルーターは192.32.63.8へ送信されたフレームを受信し、`そのフレームをEEネットワークへと転送`する。この解決方法が`代理ARP(proxy ARP)`と呼ばれる

# 代理があることでネットワークを同一に見える
>この方法は、実際には別のネットワーク上にあるホストが、同一のネットワークに上にあるかのように見せたい場合に用いられる。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
[GCP]ADCについてざっくり

GCP の認証ライブラリが使用する認証情報である。
Terraform などのサードパーティツール でも ADC が使われる(=この認証ライブラリが使われているようである)

認証ライブラリは、以下のを探して ADC を取得しようとする。
1. 環境変数 `GOOGLE_APPLICATION_CREDENTIALS` で設定されている「サービスアカウントキーや、Workload Identity 連携の認証情報構成のJSONファイルパス」
2. `gcloud auth application-default login`実行時に保存される ADC ファイルのパス(保存場所は OS によって異なる)
    - Linux / Mac: `~/.config/gcloud/application_default_credentials.json`
    - Windows: `%APPDATA%\gcloud\application_default_credentials.json`
3. (GCP リソース上である場合のみ)リソースに紐づけられたサービスアカウントの認証情報(メタデータサーバーから自動取得する)

**参考:**
- [Terraform の認証](https://cloud.google.com/docs/terraform/authentication?hl=ja)
- [アプリケーションのデフォルト認証情報の仕組み](https://cloud.google.com/docs/authentication/application-default-credentials?hl=ja)
Chrome拡張機能の作り方

# 開発環境
chromeの拡張機能は基本的にhtml,javascriptで書きます。
私はvscodeを使って編集しています。(フォルダ階層がややこしいのでvscodeで編集することをお勧めします)

# 拡張機能の説明書(マニフェスト)を作成
ルートのフォルダに、「manifest.json」を作成してください。
そして、次のコードをコピーしましょう
```json:manifest.json
{
    "name": "サンプル",
    "version": "1.0.0",
    "manifest_version": 3,
    "description": "サンプルの拡張機能です"
}
```
nameは拡張機能の名前を、descriptionは拡張機能の説明を表しています。

## ポップアップ(html)を表示させるパターン
拡張機能でポップアップを表示させたい場合は、新たにhtmlのファイルを作りましょう。
```html:popup.html
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ポップアップ</title>
    <style>
        body{
            width:500px;
            height:300px;
        }
    </style>
</head>
<body>
    ポップアップのhtmlです
</body>
</html>
```
この場合は、manifest.jsonに新たに次のように更新しましょう
```json:manifest.json
{
    "name": "サンプル",
    "version": "1.0.0",
    "manifest_version": 3,
    "description": "サンプルの拡張機能です",
    "action": {
        "default_popup": "popup.html"
    }
}
```
これでポップアップを表示させることをできます

## Javascriptを実行させるパターン
chromeの拡張機能では、Javascriptを実行させることができます。(何らかのページが開かれたときに実行されます)
```js:script.js
console.log("実行されたよ!")
```

この場合は、manifest.jsonに新たに次のように更新しましょう
```json:manifest.json
{
    "name": "サンプル",
    "version": "1.0.0",
    "manifest_version": 3,
    "description": "サンプルの拡張機能です",
    "content_scripts": [
        {
            "matches": [
                "https://*/"
            ],
            "js": [
                "script.js"
            ]
        }
    ]
}
```
初めてオフライン勉強会(交流会)に参加してきました

## はじめに
オフライン勉強会(交流会)に参加してきました。今まで数学関係のイベント[^1]には参加したことがありましたが、エンジニアのイベントは初めてです。
この業界に知り合いが全然いないので、いろんな人に会ってみたいと思って参加することにしました。

[^1]: ロマンティック数学ナイト、北海道数学愛好会、とか。


## イベントを調べる
「北海道　エンジニア　イベント」みたいな感じで色々検索してみました。すると、いくつかサイトがありましたが、[connpass](https://connpass.com/dashboard/)さんが良さそうだったので登録。開催地域ごとにカレンダーで検索できたりするのが便利です。
調べてるなかで、自分の都合とあいそうなものを探して申し込み。今回は[「はじめてのIT勉強会 in 札幌(2024)」](https://lets-go-study-meeting.connpass.com/event/333395/)に申し込みました。ちょうど日にちの都合がよかったのと、「はじめて」というのが行きやすそうで選びました。


## 参加する
開場が18:30、開始は19:00、終了は21:00。仕事おわりにかるく夜ご飯を食べて会場へ。ちょうどいい時間帯です。会場は専門学校をかりているようでした。

時間前に全員集まったので、少し早くスタート(すごくめずらしいらしい)。主催者挨拶があって、LT[^2]があって、メイントークがあってそのあと雑談。LTは申し込みの時点で枠があり、希望したら選べるような感じになっていました。

雑談の時間が結構多くていろいろ話せました。仕事の話しとか他のイベントの話しとかいろいろ！


[^2]: ライトニングトークの略。数分程度の短い時間で発表する。LTってこの業界特有ですかね？初めてです。




## おわりに
参加してみてよかったです！
レベル感も色んな人がいて、どんな人でも楽しめそうな感じがしました。そして、みなさあたたかったです。
また都合のつくタイミングで他のイベントも参加してみたいです。なにとぞ！！！
【タスク処理のコツ】 "難しそう" "終わらなそう"の対処法

# はじめに
この記事では**入社3年目のエンジニア**がタスクを進めるうえで気にかけていることをまとめました。

今回は`難しそうなタスクの対処`と`終わるか心配な大量のタスクの対処`の2つがメインです。

徐々にタスクが増えてきた私が
「このタスクなんか難しそうだな、うーーん」
「今日ちょっとタスク多くない？これ終わるかな？」
という時に意識していることを記事として残しておこうと思います！


# 難しそうなタスク
### 「難しそう」の正体
そもそも**難しそう**っていったい何でしょう。
難しいと感じるものや原因は人それぞれなので一概には言えませんが、自分は

⇒ **ひとつひとつは簡単だけど、それらが複雑に絡み合ってわけわからなくなってるもの**

だと思っています:thinking_face:
つまり難しそうと感じるものの正体は、簡単で単純な要素がごちゃごちゃに集合しちゃってるだけかもという思想です！

というわけで今回はこの思想で解決できる、何から手を付けたらいいかわからない、漠然と"すぐにできなさそう"と感じる、といった部類のタスクの対処法になるかなと思います。

### 対処法

**・タスクを分解する**
対処法はとても簡単で、複雑になってしまっているタスクを<font color="Red">簡単だと感じるレベルまで分解するだけ</font>です。
とにかく簡単だと思える小さな作業まで分けることが大事。

>**タスク分解の例：設計書の修正**
【分解する前】
　変更内容を取り込んでチェックまで完了させる(ちょっと面倒そう)
【分解した後】
　・変更内容の取り込み① 見出しの文字直すだけ(楽勝)
　・変更内容の取り込み② パラメータ１の修正箇所の反映(直すだけ)
　・変更内容の取り込み③ パラメータ２の修正箇所の反映(直すだけ)
　・直したところのチェック
 　⇒なんかできそうかも
 
:::note info
自分が「これならできる」と思えるレベルに分解できていればOK
:::

**・手を付けられそうな簡単なところから始める**
自分でも出来そうなレベルにタスクを分解できたら、その中でも"着手しやすそうなもの"から処理します。
難しそうなタスクはそもそもやる気が起きないので、やってるうちにやる気が出るのを待ちましょう！
おそらく簡単な作業を進めていくうちに調子が出てくるはずです！

調子が出てきたらあとは分解したタスクをひとつずつこなしていくだけです。

※分解しすぎて物量が多くなって不安な時は次の「終わらなそうなタスクの対処法」で解決です。


# 終わるか心配な大量のタスク
### 終わらないかもという不安
まず、不安の原因は **「こうすれば終わるだろう」という見立てがないこと**にあると思っています！
心配でもとにかく進めるしかない、と思う時もあるのですが私の性格上、不安にはデメリットがあります。

:::note warn
不安を放置するデメリット
①終わらなかったらどうしよう、と無駄に考えて作業の進みが遅くなる
②精神的にきつい
③そもそも着手する気にならない
:::

繁忙期などタスクが詰まっているときにこんなデメリットと付き合っている暇はないので次の対処法で対抗します。

### 対処法
**・作業計画を立てる**
終わらなそうな不安に負けずタスクを完遂するために大事なのは、<font color="Red">計画を立てること</font>です！
計画を立てる時間がもったいない、手間がかかる、と思ってしまうところですが、
小さな手間と労力で作業が進めやすくなるならおつりがきます(おそらく)。


**・計画を立てるステップ**
1. 最終的な完了目標と期限を確認する(どのレベルの成果物をいつまでに終わらせるか)
1. タスクの全量を把握し一覧化する
1. タスクごとの予測時間(5分単位で)と着手するタスクの順番を決める
1. 予想されるタスクの進捗をスケジュールにはめる
　⇒○○時ごろにはここまで終わってるはず、がわかる！
1. 明らかに終わらないなと感じた場合は相談する

こちらはあくまで私が普段やっている方法になりますが、４までやると「どのペースで作業したらこの時間に終わる」が明確になります！
**タスクごとに終了時間の目安がある**ことで進捗の状況もわかり、**タスク完了までの道のりもはっきり**していて作業が進めやすいというわけです。
> 「10日で日本縦断してこい」よりも
「今日北海道、2日後に宮城、4日後に東京、5日後に～」
って言われる方が不安なく進みやすいみたいなイメージ

:::note info
計画を立てる時のポイント
①タスク内容と予測時間が具体的であること
②無理のない範囲で、**休憩も含めて**計画すること
③予測時間は過去の実績から決めるとなお良し
④心配であれば「このペースで進めるつもりです」を上司に確認
:::
これで何の不安もなく計画通りに簡単なタスクを進めるだけで予定通りにタスクが完了できそうな気がします！


# まとめ
今回は`難しそうなタスクは簡単になるまで分解する`、`終わらなそうなときは計画を立ててみる` の2点について記事にしてみました。
少しでも、タスクに潰されそうな方の参考になればうれしいです。
このほかにもタスクを進めるにあたって意識している点は多々ありますが、
それはまた機会があれば別の記事にまとめたいと思います！

余談ですが、私がタスク処理を頑張る理由は圧倒的に定時退勤のためです。
これからも"なんとしてでも定時で上がりたい"という強い気持ちを胸に、着実にタスクを処理していく社会人を目指していきます:fire:
【Apex】SOQLとSOSLの違いを理解しよう！具体例で分かる使い分け方

## はじめに

Salesforceでデータを検索しようとしたとき、「SOQLとSOSLどっちを使えばいいの？」と悩んだことはありませんか？
この記事では、SOQLとSOSLの違いを初心者にも分かりやすく解説していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/603fc6ce-8571-31ee-c9d3-8894aabad77a.png)


## SOQLとSOSLの違いを表で比較

|比較項目|SOQL|SOSL|
|:--|:--|:--|
|**主な用途**|特定のオブジェクトからデータを取得|複数オブジェクトから横断的に検索|
|**検索範囲**|単一のオブジェクトとその関連オブジェクト|複数のオブジェクトを同時に検索可能|
|**検索方法**|項目の完全一致や前方一致など|キーワードによる部分一致検索|
|**戻り値**|単一のリスト|リストのリスト|
|**使用頻度**|より頻繁に使用|特定の用途で使用|

## それぞれはどんなときに使うの？

### SOQLを使うのはこんなとき 👉
1. 取引先の一覧を取得したい
2. 特定の商談に関連する商談商品を全て取得したい
3. 今月作成された取引先責任者を取得したい
4. 金額が100万円以上の商談を取得したい

### SOSLを使うのはこんなとき 👉
1. "Tokyo"という文字列を含むレコードを全てのオブジェクトから探したい
2. 顧客名を複数のオブジェクトから検索したい
3. 商品名やその説明文から特定のキーワードを検索したい
4. メールアドレスやドメインで横断的に検索したい

## 具体例で理解するSOQLとSOSL

### SOQLの例
#### 例1：今月作成された取引先を取得
```apex
List<Account> accounts = [
    SELECT Id, Name, Phone
    FROM Account
    WHERE CreatedDate = THIS_MONTH
];
```
👉 **ポイント**：特定のオブジェクト（ここではAccount）から条件に合うレコードを取得

#### 例2：取引先とその関連する取引先責任者を一緒に取得
```apex
List<Account> accountsWithContacts = [
    SELECT Id, Name,
           (SELECT Name, Email FROM Contacts)
    FROM Account
    WHERE Name LIKE 'ABC%'
];
```
👉 **ポイント**：親子関係のあるオブジェクトのデータを一度に取得できる

### SOSLの例
#### 例1：全オブジェクトから"Smith"を検索
```apex
List<List<SObject>> results = [
    FIND 'Smith'
    IN ALL FIELDS
    RETURNING Account(Name), Contact(Name), Lead(Name)
];
```
👉 **ポイント**：複数のオブジェクトから同時に検索できる

#### 例2：名前フィールドから特定のキーワードを検索
```apex
List<List<SObject>> results = [
    FIND 'Tanaka OR Suzuki'
    IN NAME FIELDS
    RETURNING Account(Name), Contact(FirstName, LastName)
];
```
👉 **ポイント**：OR検索など、柔軟な検索条件を指定できる

## 初心者がつまずきやすいポイント

### 1. SOQLでよくあるミス
- 関連オブジェクトのフィールドを直接指定してしまう
- WHEREの条件指定で型が合っていない
- 必要以上のフィールドを取得している

### 2. SOSLでよくあるミス
- 検索文字列が短すぎる（最低2文字必要）
- 戻り値の取り扱いを間違える
- 検索範囲の指定を忘れる

## まとめ：使い分けのコツ

### SOQLを使う場合
- 特定のオブジェクトから確実にデータを取得したい
- 関連オブジェクトのデータも必要
- 条件指定を細かく行いたい

### SOSLを使う場合
- 複数のオブジェクトを横断して検索したい
- キーワードでの検索が必要
- あいまい検索をしたい

## さいごに
SOQLとSOSLは、それぞれの特徴を理解して使い分けることで、効率的なデータ検索が可能になります。
まずは簡単な検索から始めて、徐々に複雑な検索にチャレンジしていくことをお勧めします。

## 参考リンク
- [Salesforce Developer Documentation - SOQL and SOSL Reference](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/)
CSSファイルの読み方

CSSって知識ゼロで見ると結構謎が多い。

```css
h1 {
  xxx: xxx;
  xxx: xxx;
}

.contents {
  xxx: xxx;
  xxx: xxx xxx xxx xxx;
}

.contents h1 {
  xxx: xxx;
  xxx: xxx;
}
```

- 頭に「.」がついている/ついていないの違いは何？
- `.contents h1`みたいにスペース区切りは何？引数？

# `.`から始まるCSS

```css
h1 {
  xxx: xxx;
  xxx: xxx;
}

.contents {
  xxx: xxx;
  xxx: xxx xxx xxx xxx;
}
```

## 結論

- 特定のHTMLタグのスタイル指定は`タグ名 {}`
- 特定のClassのスタイル指定は`.クラス名 {}`
- 特定のClassの中の特定のHTMLタグのスタイル指定は`.クラス名 タグ名 {}`

## `タグ名 {}`の使いどころ

- ページ全体のデザイン統一とかに使いそう
- フォント指定とか文字色の統一など

## `.クラス名{}`の使いどころ

- いわゆる「デザイン」で使うイメージ
- TOPページや、上下の帯状のパーツなど

## `.クラス名 タグ名 {}`の使いどころ

例えば`contents`(ページのメイン部分によく使われるクラス名)に3つの画像を説明付きで並べて表示するとき。それぞれの画像につける見出しや文章のスタイルを統一するときに使う。

# 教材

~~Progateいいぞー~~

あーいや、Reactを学ぶうえではそんなことなかった。
JavaScript, CSSの基礎を学ぶために1ヶ月の金額を出せるかどうかがポイント。
【pip install】インストール可能なバージョンを確認しようとしたらエラーが出た話

# エラーが出た経緯

ローカル環境で、Pythonのライブラリをインストールする際にインストール可能なバージョンを確認しようと、次のコマンドを実行しました。

```bash
pip install pandas==
```

ところが、以下のエラーが出力されてしまいました。

```bash
ERROR: Invalid requirement: 'pandas==': Expected end or semicolon (after name and no valid version specifier)
    pandas==
           ^
```

**あれ？前にやったときは動いたような気がするけど…？**

というわけで、なぜエラーになるのかを調べた結果と、インストール可能なバージョンを確認する正しい方法について記載します。


## なぜエラーになるのか？

結論から言うと、`pip install pandas==` のようにバージョン指定なしで実行すると **不完全な指定」とみなされる** ためエラーになります。
この指定方法は以前から非推奨だったようで、リリースノートでいつから使用できなくなったのかは見つけられませんでしたが、少なくともpip ver.24以降は使えなくなっているようです。
その代わりに、pipのバージョン21.2以降は```pip index version```が使用できるようになっており、このコマンドを実行することでインストール可能なバージョンが確認できます。


## インストール可能なバージョンを確認する方法

### 方法①: `pip index versions` を使う
以下のコマンドで、指定したライブラリのインストール可能なバージョン一覧を確認できます。

```bash
pip index versions ライブラリ名
```

例として `pandas` の場合:
```bash
% pip index versions pandas
```

実行結果:
```
pandas (2.2.3)
Available versions: 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.4, 2.1.3, 2.1.2, 2.1.1, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 1.5.3, 1.5.2, 1.5.1, 1.5.0, 1.4.4, 1.4.3, 1.4.2, 1.4.1, 1.4.0, 1.3.5, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.5, 1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.5, 1.0.4, 1.0.3, 1.0.2, 1.0.1, 1.0.0, 0.25.3, 0.25.2, 0.25.1, 0.25.0, 0.24.2, 0.24.1, 0.24.0, 0.23.4, 0.23.3, 0.23.2, 0.23.1, 0.23.0, 0.22.0, 0.21.1, 0.21.0, 0.20.3, 0.20.2, 0.20.1, 0.20.0, 0.19.2, 0.19.1, 0.19.0, 0.18.1, 0.18.0, 0.17.1, 0.17.0, 0.16.2, 0.16.1, 0.16.0, 0.15.2, 0.15.1, 0.15.0, 0.14.1, 0.14.0, 0.13.1, 0.13.0, 0.12.0, 0.11.0, 0.10.1, 0.10.0, 0.9.1, 0.9.0, 0.8.1, 0.8.0, 0.7.3, 0.7.2, 0.7.1, 0.7.0, 0.6.1, 0.6.0, 0.5.0, 0.4.3, 0.4.2, 0.4.1, 0.4.0, 0.3.0, 0.2, 0.1
```

### 方法②: PyPI のウェブサイトで確認
PyPI の公式サイトで直接確認する方法もあります。

1. PyPI のプロジェクトページにアクセス  
   [https://pypi.org/project/pandas/](https://pypi.org/project/pandas/)
2. 「Release History」のセクションでインストール可能なバージョンを確認できます。

## まとめ

`pip install` を使ってライブラリをインストールする際、バージョン指定をしないとエラーになります。インストール可能なバージョンを確認したい場合は以下の方法を使いましょう！

- `pip index versions ライブラリ名`  
- PyPI サイトで確認する

# 参考リンク

https://stackoverflow.com/questions/4888027/how-to-list-all-available-package-versions-with-pip

https://github.com/astral-sh/uv/issues/2111

https://pip.pypa.io/en/stable/news/#v21-2
AWS PrivateLinkがクロスリージョン接続に対応

※執筆内容はエンジニアとして個人的な感想であり、所属する組織を代表するものではありません。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-privatelink-across-region-connectivity/
## 1. はじめに

- PrivateLinkの仕組み

　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615400/a3d91a10-efb9-21bc-8aa6-395d8eb78933.png)

※引用：https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/what-is-privatelink.html 

　VPCエンドポイントを作成して異なるVPCのリソースに対してアクセスが出来ます。
VPCエンドポイントと対抗先とではプライベート接続が可能で、互いにグローバルIPを持たない構成が可能なためセキュアな環境構築を可能にします。



## 2. AWS PrivateLinkの何がうれしい



　PrivateLinkの良さはクライアント側（VPCエンドポイント側）が楽に！セキュアに！接続が出来る事かなと思ってます。
 　VPCエンドポイントサービス名をクライアント側で登録するだけで、プライベート接続ができるだけでなく、VPC Peeringのように互いのVPCのCIDRすら意識しなくて良いわけですから、めちゃくちゃ楽です。この「ワンタッチ感」がたまらなく好きで、便利。
 
 特にSaaSと繋ぐ時とか。
 参考：https://aws.amazon.com/jp/privatelink/partners/

## 3. 海外リージョンへの対応の背景
- 以前の制限とその影響

　これまでVPCエンドポイントサービスとVPCエンドポイントは同じリージョン内である必要があるという仕様のため、クロスリージョン接続を可能にするためにはほかにリソースを作成する必要がありました。

AWS Transit Gateway Inter-Region Peeringを使うとできるようです。
コスト面が気にあるのと、やはり複雑性が増すので取っつきにくい感じはあったのかなと思います。

- ニーズ
海外支社や取引先などで海外のオンプレサーバーとセキュアに接続したいといったケース。

 VPCとオンプレ間はAWS Direct Connect等を利用して閉域接続を構築出来、VPC同士はPrivateLinkでワンタッチに接続できるならば非常に便利だなと思います。

 あとはSaaS側のリージョンが自分たちの使っているリージョンと異なるケース。
 PrivateLink対応してるけどリージョンが限られてますっていうのはだいたいこういうケースなんだろうなと思ってますが、今後は無くなりそうですね。
 
 
## 4. 地域別サポートの現状
- 対応している海外リージョンのリスト
 US East (N. Virginia), US West (Oregon), Europe (Ireland), Asia Pacific (Singapore), South America (São Paulo), Asia Pacific (Tokyo) and Asia Pacific (Sydney) Regions


## 5. 設定手順
- PrivateLinkの設定方法

両方での追加の設定が必要です。


![vpces複数リージョン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615400/a6c2c653-48de-fa38-f310-71e1eee72c22.png)
VPCエンドポイントサービス側では複数のリージョンが作成できるようになりました。

![vpce.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615400/9dd2477b-06a5-c0b9-f417-14c4274735b1.jpeg)

「VPCエンドポイント側ではクロスリージョンエンドポイントを有効にする」という設定が可能になっており、これを有効化しないと仮にVPCエンドポイントサービス側がクロスリージョンの設定を有効化していたとしても、そもそもVPCエンドポイントが作成できませんでした。（サービス名が見つからない）



## 6. 今後の展望
当社もAWS上にHULFT Squareというサービスをホストしており、PrivateLinkに対応した機能があります。
見た感じ製品側の改修も必要そうなので、執筆時点（11/28）ではさすがに昨日の今日過ぎて対応してないと思いますが待ち遠しく思ってます。
Shell Scripting APIC API

# APIC APIに接続してTenantを表示するシェルスクリプトを作る。

# 方針
必要な情報を取得してプログラムを書く。
・CiscoのAPI sandboxにアクセスし、APIを起動しUSER、PASSを取得
・環境変数を設定
・シェルスクリプトを書く

# CiscoのAPI sandboxにアクセスし、APIを起動しUSER、PASSを取得

以下のサイトにアクセスしてログインする。
https://devnetsandbox.cisco.com/

ACI Simulator Always-OnのLaunchをクリック
![Screenshot_2024-11-28_19-40-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943132/608597d3-7bfb-67ad-e750-f66bfe271f3e.png)

時間を適当に設定して、Launch Environmentをクリックすると
Sandboxが設定した時間だけ起動される。
![Screenshot_2024-11-28_19-41-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943132/e4f403ec-dfa9-bd9c-7507-21cd08b597c9.png)

鎖マークをクリックすると
User:admin
Pass:!v3G@!4@Y
が取得できた。
![Screenshot_2024-11-28_19-43-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943132/3e1b7d37-e3bd-807e-327a-12d1e150b31b.png)

# 環境変数を設定
環境変数のためのファイル
```shell:.envrc
export APIC_URL=https://sandboxapicdc.cisco.com
export APIC_USERNAME="admin"
export APIC_PASSWORD="!v3G@!4@Y"
```

# シェルスクリプトを書く
```shell:apic_tenants.sh
if [[ -z "${APIC_URL}" ]] || [[ -z "${APIC_USERNAME}" ]] || [[ -z "${APIC_PASSWORD}" ]]; then
    echo "What is the URL for APIC?"
    read APIC_URL
    echo "What is the username for APIC?"
    read APIC_USERNAME
    echo "What is the password for APIC?"
    read -s APIC_PASSWORD
else
    echo "Environment Variables found for APIC..."
fi

LOGIN_PAYLOAD='{
    "aaaUser": {
        "attributes": {
            "name": "'${APIC_USERNAME}'",
            "pwd": "'${APIC_PASSWORD}'"
        }
    }
}'

#User PassからTOKENを取得。
APIC_TOKEN=$(\
curl -k --silent -X POST \
${APIC_URL}/api/aaaLogin.json \
--data-raw "${LOGIN_PAYLOAD}" \
| jq --raw-output '.imdata[0].aaaLogin.attributes.token' \
)

#Tokenでアクセスしてデータを取得
APIC_RESPONSE=$(curl -k --silent \
    --header "Cookie: APIC-cookie=${APIC_TOKEN}" \
    ${APIC_URL}'/api/node/class/fvTenant.json')

echo "List of Tenants:"
echo $APIC_RESPONSE | jq -r '.imdata[].fvTenant.attributes.name'
```

# 実行
Tenant一覧が表示された。
```
$sudo apt install jq
$source .envrc
$chmod +x apic_tenants.sh
$./apic_tenants.sh
Environment Variables found for APIC...
List of Tenants:
infra
common
mgmt
Kelompok1Tenant_Universitas-Scientiarum
```


:::note info
まとめと注意
・Curlのエラーの詳細がわからなくなったら-s/--silentオプションをとる。
How to Hire a MERN Stack Developer Based on Their Skills

If you are looking to employ a MERN stack developer knowing the core capabilities and skills their skills bring is vital. The MERN stack - comes with  MongoDB, Express.js, React.js and Node.js--they offers an extremely robust framework to build modern web-based applications. Here's how to determine the developer's expertise in these important areas.

<h2>Proficiency in MERN Stack Technologies</h2>

A well trained MERN stack developer must be skilled in the four main technologies such as MongoDB/Express.js/React.js/Node.js./React.js is essential to build interactive dynamic user interfaces as Node.js and Express.js give you a solid base to build server-side apps/MongoDB is essential to manage data. Expertise in this NoSQL database allows for an efficient handling of data in the application.

<h2>Front-End and Back-End Development Expertise</h2>

An MERN stack developers has to be professional in front-end as well as back-end dev process. They must be able to develop responsive and dynamic user interfaces with React.js as well as create robust, scalable back-end systems that utilize Node.js as well as Express.js. The ability to control both sides of development will ensure seamless integration between the front end and back-end, which makes the application more efficient and faster. efficient.

<h2>Problem-Solving and Collaboration Skills</h2>

Beyond technical skills Communication, problem-solving and problem-solving skills are vital when selecting MERN stack developers. They should be able to tackle complex issues and effectively communicate with the team, particularly in the case of an full stack development company. This type of collaboration is essential in ensuring that the project is running smoothly and achieving the desired results.

<h2>Portfolio and Past Projects</h2>

When you hire an MERN development stack, make sure to examine their portfolio and previous work. This gives you a better understanding of their expertise, their coding style and the quality of work they've worked on. Find similar projects to yours. Make sure that they've built robust and secure web-based applications.

When you hire MERN developers, you will ensure that your website is built using a strong stack that is future-proof. This makes it possible to seamlessly integrate of features, fast performance, and a seamless user experience making sure your project is set to be successful over the long term.
マナビDX Questで掴んだ「自分にもできる！」という感覚

## はじめに  
「AI開発って、専門家だけがやるものじゃないの？」  
これが、参加前の私の正直な印象でした。非エンジニアの私にとって、AIは遠い世界の最先端テクノロジー。触れたくても、知識不足や周囲に相談できる人の不在が、挑戦へのハードルになっていました。

でも、**マナビDX Quest**での学習を通して、その見方がガラリと変わったんです。ここでは、私が心を動かされた瞬間や乗り越えた苦労、得られた気づきをお伝えします。これからAI開発に挑戦したい方が、「あ、意外と自分にもできるかも」と感じていただければ幸いです。

今期は、「[SIGNATE](https://dxq.manabi-dx.signate.meti.go.jp/)」と「[Life is Tech](https://lit-quest.meti.go.jp/)」の2つのプログラムが提供されています。

### 今回選択した教材
- SIGNATE提供　：不良個所自動検出（製造）
- Life is Tech提供：工数予測（製造）



## 心が動いた瞬間：AIを一緒に育てる「仲間」がいる  
印象的だったのは、**「一人じゃない」** と感じた瞬間でした。マナビDX Questでは、同じような関心を持った参加者と、緩やかなコミュニティを通じて交流できます。オンラインでは会話量が限られていたものの、チャットや資料共有を通じて、他の受講生が「こんなツールがあるよ」と教えてくれたり、「この前処理方法が有効だった」とアイデアを交わしたりできました。  

もともと、身近にAI好きな知人がいなかった私にとって、このコミュニティは新鮮な「知の交差点」でした。自分ひとりなら尻込みしていた未知のツールや手法も、誰かの実践例を目にすると「やってみようかな」と前向きになれる。**「専門家だけの領域」だと思い込んでいた壁が、仲間の存在でスッと低く感じられた**のです。

## 全体像を肌で感じる：モデルづくりはゴールではない  
マナビDX Questの一番の魅力は、**AI開発の全体像をリアルに体験できる**ことです。単にモデルを動かして「精度が出た」では終わりません。課題設定からデータの品質確認、ビジネスへの落とし込みまで、一連の流れを通して学べます。  

他参加者から共有していただいた資料を参考にすることで、同じ問題でも視点が全く異なることに気づかされました。「なるほど、ここはこう考えるんだ」「このデータ整理のアプローチ、真似してみよう」。そうした“引き出し”が増えることで、自分なりの開発サイクルが見えてきます。これって他の学習サービスにはなかなかない体験で、実務と直結した `生きた知識` が身に付く感じがしました。

## 苦しかった瞬間と乗り越え方：「100％じゃなくていい」  
苦しかったのは、限られた時間で複数コース（SIGNATEとLife is Tech）を同時進行する場面でした。仕事やプライベートと並行しながら、慣れない用語や前処理・特徴量選択を理解し、モデル精度向上に取り組むのは大変。何度も生成AIに質問して解決策を探しても、精度が上がらず行き詰まることもありました。  

そんなとき私が心がけたのは、**「100％を目指さず、まずは提出する」**という発想です。期日ギリギリまで完璧を狙うと、常にプレッシャーを感じてしまいます。少し余裕を持って取り組むことで、途中で方向転換したり、気持ちを軽くしたりできました。初めての挑戦なら、成果は“未完成”でもいい。経験値として蓄積し、次回に活かせばいいのです。

## 活かしどころは無限大：「自分で課題を見つけ、解決する」  
この学習経験を経て、私が身につけたのは**「問題解決型の思考力」**です。  

「この売上データから何がわかるだろう？」  
「在庫データの傾向はサービス改善につながらないか？」  

そんな問いを立てる力が養われると、業界や分野を問わず“AIを活用する余地”が見えてきます。製造業の不良個所検出演習を通じて「ここで分析できれば価値を生む」と感じたように、教育業界やサービス業でも、手元にあるデータから有用な示唆を引き出せる。読者の方にも、まずは手元のデータを眺め、ちょっとした分析から始めることをおすすめします。最初は関数一つでも、実験的な小さな一歩が次のチャレンジへと繋がります。

## 印象に残る課題：想像すらしなかった領域へ踏み込む  
不良個所自動検出の課題では、全く異業界の現場を垣間見るような感覚がありました。最初はYouTubeや記事で製造工程を調べ、「こういう場所でデータが生まれるんだ」とイメージするところからスタート。与えられた画像データをそのままモデルにかけるのではなく、「AIが理解しやすい」形に整えていくプロセスは、単なる作業ではなく、**自分なりの`職人技`を磨く感覚**でした。  

未知の領域に挑戦することで、視野はグッと広がります。「自分が知らない世界は無限にある。そして、その世界でAIを活かす方法も無限にある」と気づかせてくれた演習でした。

## 挑戦のハードルが下がる  
参加前は、「データ分析なんて専門家に任せるもの」と思っていた私。参加後は、「とりあえず手を動かせば、第一歩は踏める」と感じるようになりました。これって大きな変化です。知識ゼロからでも、課題を小さく分解し、可能な範囲で分析を試すことで、前に進める。  

この変化は、まるで鍵のかかった扉を開ける合い鍵を手に入れたようなもの。以前なら諦めたであろう業務上の問題でも、「もしかして、これなら何か使える手があるかも」と考える自分がいます。

## 明日から始める、あなたへの提案  
この記事を読んで、「AIに挑戦してみたい」と思ってくださった方へ。  
**まずは手近なデータを一つ、じっくり眺めてみてください**。在庫表や売上データ、顧客アンケートなど、何でも構いません。「どんなパターンがあるだろう？」「この変動には何か理由があるかな？」と問いかけてみることが、最初の一歩。  

最初はエクセル関数を試すだけでもいいんです。その小さな発見が「データを活かす楽しさ」を実感する扉となり、やがてAIを使った本格的な分析や開発へと続く道になります。

## まとめ：一歩踏み出せば、世界が変わる  
マナビDX Questを通じて、私が得たのは「やってみれば意外とできる」という感覚と、問題解決思考という新たな武器でした。非エンジニアであっても、知識ゼロであっても、一歩踏み出せば何かが掴める。その過程で出会う人々、発見する手法、経験する試行錯誤は、次の挑戦への燃料になります。  
「知らない世界に足を踏み入れる」  
その一歩を、どうか恐れずに踏み出してください。その先には、自分なりの成功体験と、新しい視界が広がっています。




https://dxq.manabi-dx.ipa.go.jp/
Viteを使用してGitHub Pagesでデプロイすると画面が真っ白になる

## はじめに

Vite + React + TypeScript + Tailwind CSSで作成した簡単なアプリケーションをGitHub Pagesでデプロイしようとしたのですが、タブにタイトルだけは出るものの、画面が真っ白になってしまいました。

検索して出てくる対処法を色々試したのですがうまくいかず、結局、`gh-pages`ブランチを使うことで無事画面が表示されました。上手くいった理由はわからないのですが、一応記録しておきます。

## 環境

- vite: 5.4.10
- React: 18.3.1
  - React Routerは未使用
- TypeScript: 5.6.2
- Tailwind CSS: 3.4.14

## 結論

以下のように`gh-pages`ブランチを使ってデプロイすることで上手くいきました。

### gh-pagesパッケージのインストール

```bash
$ npm install gh-pages --save-dev
```

### package.jsonへの追記

- 直下に"homepage"を追加

```package.json
"homepage": "https://{GitHubアカウント名}.github.io/{リポジトリ名}/",
```

- "script"に以下を追加

```package.json
"deploy": "npm run build && gh-pages -d dist"
```

### デプロイ

```
$ npm run deploy
```

### GitHubの設定変更

Settings > Pagesでブランチをgh-pagesに変更して『Save』を押す

![スクリーンショット 2024-11-28 20.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911578/6476f05d-4e5d-6254-0b01-1c9a907ac34e.png)

以上で無事に表示されるようになりました。

## 効果がなかったこと

私の環境では効果がなかったことを挙げます。

### index.htmlでの相対パスの変更

- `src="/src/main.tsx"`などを`src="./src/main.tsx"`に変更する
  - 画面が真っ白ということは、tsxやcssのファイルが参照されていないってことなので、パスの変更は効果ありそうでしたが、だめでした

https://zenn.dev/tetracontane/articles/0a3b4656b02509

### vite.config.tsのbaseの変更

- `base: process.env.GITHUB_PAGES ? 'REPOSITORY_NAME' : './',`や`base: /{リポジトリ名}/`を追加する
  - 検索して真っ先に出てくる解決策でしたが効果なし、、 

:::note info
ちなみに、gh-pagesブランチでのデプロイは、baseを上記のどちらにしても上手くいきました
:::

### BrowserRouterの修正

- main.tsx.のBrowserRouterを以下の通り修正する
  - めちゃくちゃ意味ありげでしたが、私はそもそもReact Router使ってないので関係なかったです

    ```react
    <BrowserRouter basename={import.meta.env.DEV ? "/" : "/{リポジトリ名}/"}>
    ```

https://qiita.com/otohusan/items/39160086ceec63c5b04a

## 終わりに

せっかく作成したアプリなのでやっとデプロイできて良かったですが、原因がわからないのでモヤモヤしてます。よろしければコメントで教えてください。
基本情報技術者試験向けかもしれない問題集

AIを使って問題を作成しています。

### Prompt:
`ITパスポートもしくは基本情報技術者試験に出てきそうな問題を作ってください。`


### 問題1 [ネットワーク]
次のうち、インターネット上でWebサーバーとクライアントの間でデータをやり取りするために使用されるプロトコルはどれですか？

A. FTP
B. SMTP
C. HTTP
D. TCP

<details>
<summary>解説</summary>

正解は C. HTTP (Hypertext Transfer Protocol)

解説：
- HTTPは、WebブラウザとWebサーバー間でデータを送受信するための基本的なプロトコルです。
- FTP (File Transfer Protocol)はファイル転送用のプロトコルです。
- SMTP (Simple Mail Transfer Protocol)は電子メールの送信に使用されます。
- TCP (Transmission Control Protocol)は通信の基礎となる信頼性の高い通信プロトコルですが、直接Webデータをやり取りするものではありません。

HTTPSは、HTTPにセキュリティ機能を追加した暗号化通信プロトコルで、現在のWebではより安全な通信に使用されています。
</details>

### 問題2 [情報セキュリティ]
次のうち、総当たり攻撃 (ブルートフォース攻撃) に関する説明として正しいものはどれですか？

A. ソーシャルエンジニアリングを利用してパスワードを推測する攻撃方法
B. 暗号化されたデータを解読するために、考えられるすべての組み合わせを試す攻撃方法
C. ネットワーク上の脆弱性を探査し、侵入経路を見つける攻撃方法
D. マルウェアを使用してシステムに不正にアクセスする攻撃方法

<details>
<summary>解説</summary>

正解は B. 暗号化されたデータを解読するために、考えられるすべての組み合わせを試す攻撃方法

解説：
- 総当たり攻撃（ブルートフォース攻撃）は、パスワードやデータ暗号化の鍵などに対して、考えられるすべての組み合わせを機械的に試す攻撃手法です。
- コンピュータの処理能力を使って、無作為に、または系統的にあらゆる可能性のある組み合わせを試します。
- この攻撃は時間がかかりますが、複雑なパスワードや暗号化に対しては非常に非効率的です。
- セキュリティ対策として、複雑なパスワード、多要素認証、ログイン試行回数の制限などが有効です。

A. ソーシャルエンジニアリング
C. 脆弱性探査
D. マルウェア攻撃
これらはそれぞれ別の攻撃手法を指しています。
</details>

### 問題3 [データベース]
リレーショナルデータベースにおける「主キー」の正しい説明はどれですか？

A. 他のテーブルから参照される列
B. テーブル内で重複を許可する列
C. テーブル内の各レコードを一意に識別できる列
D. テーブル内で最も重要な情報を格納する列

<details>
<summary>解説</summary>

正解は C. テーブル内の各レコードを一意に識別できる列

解説：
- 主キー（Primary Key）は、テーブル内の各レコードを一意に特定できる列または列の組み合わせです。
- 主キーの特徴：
  1. 重複した値を持つことができない
  2. NULL値を許可しない
  3. テーブル内の各行を一意に識別する
- 例：顧客テーブルでは顧客ID、注文テーブルでは注文番号などが主キーになることがあります。
- A. 外部キー（Foreign Key）は他のテーブルを参照する列を指します。
- B. 重複を許可しない点で誤りです。
- D. 「最も重要」という基準は曖昧で、主キーの定義に適合しません。

主キーは、データベースの整合性と関連性を保証する重要な概念です。
</details>

### 問題4 [アルゴリズムとデータ構造]
次のうち、先入れ先出し（FIFO: First In First Out）の特徴を持つデータ構造はどれですか？

A. スタック
B. キュー
C. ツリー
D. ハッシュテーブル

<details>
<summary>解説</summary>

正解は B. キュー

解説：
- キュー（Queue）は、最初に入れたデータを最初に取り出すFIFO（First In First Out）の特徴を持つデータ構造です。
- 実生活の例：
  - 人が並ぶ行列
  - プリンターの印刷待ち行列
- A. スタック：後入れ先出し（LIFO: Last In First Out）の特徴を持ちます。
  - 例：関数呼び出しのスタック、Undo機能
- C. ツリー：階層的なデータ構造で、FIFOやLIFOの特徴は持ちません。
- D. ハッシュテーブル：キーと値のペアを保存するデータ構造で、順序の概念はありません。

キューは、バッファやタスクスケジューリングなど、様々なコンピューティングシステムで重要な役割を果たします。
</details>

### 問題5 [情報システム]
システム開発におけるウォーターフォールモデルの特徴として、正しいものはどれですか？

A. 各工程を柔軟に行き来でき、顧客からのフィードバックをすぐに反映できる
B. 上流工程から下流工程へと順番に進み、各工程を完了してから次の工程に進む
C. プロトタイプを早期に作成し、継続的に改善していく
D. チーム全体で並行して作業を進めることを重視する

<details>
<summary>解説</summary>

正解は B. 上流工程から下流工程へと順番に進み、各工程を完了してから次の工程に進む

解説：
- ウォーターフォールモデルは、従来型の系統的なソフトウェア開発モデルです。
- 主な特徴：
  1. 順序立てて段階的に進行
  2. 各工程を完全に完了してから次の工程に移行
  3. 工程間の移動が制限されている
- 工程の典型的な順序：
  1. 要件定義
  2. 基本設計
  3. 詳細設計
  4. 実装
  5. テスト
  6. 運用

- A. アジャイル開発の特徴に近いです。
- C. プロトタイプモデルの特徴です。
- D. アジャイル開発やスクラムの特徴に近いです。

ウォーターフォールモデルは、要件が明確で変更の少ないプロジェクトに適していますが、柔軟性に欠けるという批判もあります。
</details>
なまけない脳を作る

## 本の情報
**タイトル**
博報堂スピーチライターが教える 5日間で言葉が「思いつかない」「まとまらない」「伝わらない」がなくなる本

**著者**
ひきた よしあき

**概要**
「意見を言葉にできない若手社員」と「大学で講義を行っている広告会社の社員」がメールをやり取りする という形式で、「思いを言葉にする力」について学ぶ本。
「頭の中にあるものを知る」「考える習慣をつける」「論理的に発想する力をつける」「真に伝わる表現力を磨く」「言葉に説得力を持たせる」の5つの章から成る。
各章では、テーマに基づいた考え方のコツや日常で行えるトレーニングが紹介されている。

## 内容
### 形容詞に逃げない
「頭の中にあるものを知る」の章の一つ。
「おいしい」「やばい」といった形容詞で自分の感想を述べるだけでは、出来事に反応して話した気になっているだけ。
脳は怠け者であり、複数の意味に使える「やばい」のような言葉を知ってしまうと、そういった言葉ばかり使うようになってしまう。

これを改善するために、なぜそう感じるのか / 自分がどんな気持ちになったのか といったことを考えて言葉にするトレーニングが有効。
例)「みかんがおいしい」→「柑橘系の匂いで気持ちがリラックスする」

このトレーニングを行う上で、言葉を思いつくためのコツが3つある。
1. 聴覚、味覚、視覚、嗅覚、触覚などの五感を使って表現する
→「おもしろい」を「鳥肌が立った」「髪の毛が逆立つようだった」などの身体感覚で表現する。
1. 自分以外の人の様子を交えて表現する
→「一緒に映画を観ていた彼女は、ずっと目をつぶっていた」のように、他の人を登場させる。
1. 自分の過去や思い出の中から探してくる
→「私が過去に観た映画の中でも３本の指に入る怖さ」のように、自分の経験と組み合わせる。

形容詞を使わないと決めてこのようなトレーニングを積み重ねると、自然と言葉が出てくるようになる。

### なんで、そうしたのか？を考える
「考える習慣をつける」の章の一つ。
理由を聞かれて答えられないのは、日ごろから「なんで、そうしたのか？」を考えるクセができていないから。
例えば、ランチにその店を選んだ理由を考えて、声に出してみると良い。
「おいしいから」だけではなく、「気温が低くて温かいものを食べたくなった」「朝見たテレビで特集をやっていた」などの理由があるはず。

自分が起こす行動は、全て脳の命令によるもの。
自分が今行っていることに対して、脳がどんな命令を出したのかを考えることが大切。
そうすれば、「～なので、～した」と考えて、即座に語れるようになる。

## 所感
### 形容詞に逃げない
自分が困っていたことを言われた と感じた部分でした。
→食事や趣味など好きなことをしたときに、いつも「おいしい」「楽しい」といった同じ感想しか出すことができないと感じていました。
自分では「どんなふうにおいしいのか」「なぜ楽しいのか」というように形容詞を掘り下げるように考えていたため、形容詞を使わないようにするという考え方は新しい観点でした。

### なんで、そうしたのか？を考える
こちらも、「なんとなく」が口癖になっている自分にとっては重要な指摘であると感じました。
「なんとなく」で片づけてしまったことにもその選択をした理由が必ずあるはずで、まさにそれを考えるクセがないことが現在の状態である と理解しました。
本の中でもランチを選んだ際の例が紹介されていましたが、自分が身近で「なんとなく」で片づけてしまっていることの理由を考えるようにしたいと思います。

## まとめ
自分の考えを言葉にして相手に伝える「思いを言葉にする力」について述べられた本でした。
特に、ある若手社員の悩みを解決する物語仕立てになっていること / 「やばい」などの語彙に対する警鐘があること から、2020年代入社の若手社員にとっての効果が大きい本であると感じました。
私は、「脳を活性化させ、なまけない脳を作る」といった記述が自分に合っていると感じたので、その点を意識してこの本の内容を取り入れていきたいと思います。
デフォルト・ゲートウェイ

# 外のネットワークへ出すためのデフォルト・ゲートウェイ
>ネットワーク外へのトラフィックは、デフォルト・ゲートウェイ（default gateway)と呼ばれるルーターへ送信することになっている。慣例では、デフォルト・ゲートウェイはネットワーク内で最小(198.32.65.2)を持つ。

# ARPブロードキャストを使ってルーターからルーターに送る
>このルーターへフレームを送信するためには、ホスト１はCSネットワークの上のルーター・インタフェースのイーサネット・アドレスを知る必要がある。ホスト１は、193.32.65.1へのARPブロードキャストを送信することで、それがE3であることを知り、そのアドレスを宛先としてフレームを送信する。インターネットにおける経路上に置いて、`あるルーターから次のルーターへとパケットを送る`際にも、同じ仕組みで探索が行われる。

### ルーターが知っているかどうかで処理が変わってくる
>ルーターのイーサネットNICがこのフレームを受け取ると、そのパケットをIPソフトウェアへ渡す。すると、`ネットワーク・マスクをもとに、そのパケットをホスト４へ届けるためにはEEネットワークへ送信`すれば良いことがわかる。`ルーターがホスト４へのイーサネット・アドレスを知らない場合には、アドレスを知るために、ここでもARPを行う`。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
全力で作品を作って発表したら、プログラミングスキルに肯定的になった話

# まえがき
こんにちは　N中等部所属の人です。
この記事では、自分がプログラミングスキルに対してなんとなく悲観的だった所から肯定的になった所までの体験談をしていきます。
まだ整っていない部分もありますが伝えたい大筋は変わらないのでなにとぞよろしくお願いします。

### 先に補足
#### ここで言う「作品」とは
表現が難しいですが...全力で作って完成させたものの事です。
##### 「全力」とは
言葉の通りだしうる限りの力、ありったけの力です。

## この記事で伝わってほしい事
不格好でも良いから、全力を出した作品をとりあえず作る。
そして発表してみる。
すると、自分の力が見えてくる。

<br><br><br><br>

# プログラミングスキルに対して悲観的
自分は以前からプログラミングを学んでいるのですが、とある作品を作るまでは自分のプログラミングスキルに凄く悲観的でした。
今思えば、もちろん上の上の人と比べれば下の下ですが全くできていないという程では無い、むしろできてる方ぐらいの感覚。そして、なかなか自分に向いている事だと思っています。
しかし、どうも当時の自分としては全くできていないように、全く向いていないように感じていました。

# 発展しない学び方
自分は
1. ひたすら学び
1. ひたすら学び
1. たまに練習としてちょっとしたプログラムを作る
1. そしてまたひたすら学ぶ

といったような学び方をしていました。
「学ぶ」か「ちょっとしたプログラムを作る」しかやらず、要は練習から次のステップに発展しなかった訳です。

# なぜ悲観的だったかというと
+ 作ったものを発表して評価してもらうことがほとんど無かった
+ 稀に作った物を評価してもらう時も、評価してもらう物が練習で作った物なので力のほんの一部分しか評価されていないように感じて、信用ができなかった
+ 上の上の上の人ばかりと比べて自分の実力を悲観してしまうという自分の性格

などによって盲信的に悲観していました。
また
「頑張ったところでどうせ向いていないしなぁ」
と、モチベーションがじりじりと下がっていくような感じがしていました。

# いつも通りのプログラムが全力の作品になっていた
そんなある日、いつものようにちょっとしたプログラムを作りました。
作ったものは、決定ボタンも無い凄く質素な選択画面のようなものです。

いつもならこの辺りで適当に切り上げてまた学びに戻るのですが、今回はまだまだ何か発展させられるような気がしました。
まだ発展させられるような気がするのは割とある事なのですが、今回は二味違いました。
全力を出して完成まで持って行こうとしたのです。
いつもなら一瞬力を出すだけで、途中で面倒になって未完成にしたりしていたのですが、今回は違いました。

そして、ぬるーっと「あれ、自分継続的に全力出せてるな」と思い始めました。本当にぬるーっと。
今まで、全力を出した作品を作れることはほとんど無かったのに、今回は違ったのです。

そんなこんなで、2ヶ月ぐらいかけて作品を作りました。

# なぜ全力になれたのか
なぜ全力を出せるようになったのか。
それは、その作品を作る数ヶ月ぐらい前から耳に入ってくるようになった声が関係していると思っています。
「失敗しても良いからチャレンジしてみよう」
「失敗して良いから全力でやってみよう」
「何か1つ成し遂げてみたら？」
「とりあえずやってみたら？」
こんな声です。
こんな声を何度も聞くようになって心境が変わっていった...ような気がします。
この声を聞いてはっきり
「1から全力で作品を作ろう！」
となった訳では無いですが、
偉大なる声を頭の片隅に置いて、この偉大なる声があったからこそ次に繋がったのではないか？と今では思っています。

# 嬉しい完成
作品が完成した時は、あまりの嬉しさにジャンプするという漫画みたいなことをしました。
出来とかなんとかを一旦置いておいて、完成したことがとてつもなく嬉しかった訳です。
こんなに全力を出して完成させたものは今までほとんど無かったのも相まっていました。
そして、完成したときに
「いつもは発表したりしないけれど、今回は凄く頑張ったし見て欲しい」
「発表してみようかな...」
と思いました。

# 心温まる発表
できた作品をおそるおそる発表してみました。
すると
「いいね」
「かわいい」
「ふふっとなりました」
「癒されました」
と、心温まる嬉しいコメントをたくさん頂きました。
凄く嬉しかったです。

モチベーションがグッと上がる音がしました。

# 意外と良い評価
全力を出した作品を評価してもらえるようになり、
「あれ、思っていたよりかは肯定的な意見もらえたな」
「全力を評価してもらえたから信用できる気がする」
「...言うほどできていない訳じゃ無いのかな」
「...思っていたより向いているのかも...？」
とか思い始めました。
思い上がっている訳...では無いと信じていますが、少なくとも悲観的になりすぎる事は少なくなりました。

# それから肯定的になった
それから自分は、時々全力を出した作品を作るように、そして積極的に作品を発表したりするようになりました。
そして、自分のプログラミングスキルに肯定的になった訳です。

<br><br><br><br>

# あとがき
不格好でも良いから、全力を出した作品をとりあえず作る。
さらに発表してみる。
すると、自分の力が見えてくる。

長々と書いてきましたが、自分から伝えたいのはこれです。
全力を出した作品をとりあえず作ってみると、自分の力が確認できる。
発表をすればその全力に対してフィードバックが貰える。
もちろん端麗にできるのならばその方が良いですが、とりあえず不格好でも良い。とりあえず作る。
思い上がる...という訳では無いですが、悲観的になりすぎず、自分の力を俯瞰的に見る、自分で見る事ができないのならば見てもらうという事が大事だと思います。
色々考え方があるとは思いますが、学び途中、駆け出しの段階にいる自分にとってはこれが大切だと思っています。
自分はまだ駆け出しの中の駆け出しなので、もっと発展的なことをやっている人からしたらまた違う考えがあるのかもしれないです。

<br><br><br><br>

ご清覧ありがとうございました！
[Delphi FMX][小ネタ] オブジェクトのクローン

# Clone メソッド

FireMonkey の基底オブジェクト [TFmxObject](https://docwiki.embarcadero.com/Libraries/ja/FMX.Types.TFmxObject) は [Clone メソッド](https://docwiki.embarcadero.com/Libraries/ja/FMX.Types.TFmxObject.Clone)を持っています。

Clone メソッドを呼ぶとオブジェクトを複製できます。
この時、子コンポーネントも全て複製されます。

例えば、↓こんな Panel があるときに Clone を呼ぶと…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/80f648de-6be1-a97d-ad19-505428fee55c.png)

↓こんな風に子コンポーネントのプロパティ値も含めて複製されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/66d2707c-c532-29a2-be7f-e67226132a3c.png)

コードはたったこれだけです。

```delphi
procedure TfrmClone.Button1Click(Sender: TObject);
begin
  var P := Panel1.Clone(Self);
  P.Parent := Layout1;
end;
```

# 解説
Clone メソッドは内部でコンポーネントストリームにデータを書き出して、読み出す、ということをやっています。
つまり、Delphi で .fmx や .dfm を書き出す過程を範囲を絞ってやっている、ということです。

具体的には

1. WriteComponent を使ってメモリストリームにコンポーネントの情報を書き出す
1. TFmxReader を使ってメモリストリームに書き込まれた情報を読み出しコンポーネントを生成する
1. オーナーが指定されていればオーナーの管理コンポーネントに追加する

ということをしています。

# まとめ
「ああ、この動的に生成したコントロールセットを複製したい！」というとき利用できます。
静的な場合は [TFrame](https://docwiki.embarcadero.com/Libraries/ja/FMX.Forms.TFrame) を使った方が良いです。

あとは非ビジュアルコンポーネントの複製や、自分で TFmxObject から派生したクラスでも使えますね。
基本情報技術者試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`ITパスポートもしくは基本情報技術者試験に出てきそうな問題を作ってください。`

---
### 問題1 (情報セキュリティ)
次のうち、パスワードポリシーとして最も適切なものはどれですか？
A. 誕生日をそのまま使用する
B. 連続する数字や文字を使用する (例: 123456、abcdef)
C. 大文字、小文字、数字、特殊文字を組み合わせる
D. 同じパスワードを長期間使い続ける
<details>
<summary>解説</summary>
正解は C です。
セキュアなパスワードを作成するためには、以下の要素が重要です：

大文字と小文字の混在
数字の使用
特殊文字の組み込み
十分な長さ (通常8文字以上)

不正解の選択肢の問題点:
A. 個人情報に基づくパスワードは推測されやすい
B. 連続する文字や数字は非常に脆弱
D. 定期的なパスワード変更が推奨される
</details>

---
### 問題2 (ネットワーク)
OSI参照モデルの「セッション層」の主な役割として、正しいものはどれですか？
A. データの暗号化と復号
B. 通信経路の選択
C. アプリケーション間の接続管理
D. データリンク層の管理
<details>
<summary>解説</summary>
正解は C です。
セッション層（第5層）の主な役割:

通信セッションの確立、管理、終了
アプリケーション間の接続コントロール
データ交換の同期

他の選択肢の層:
A. 表示層（第6層）が暗号化を担当
B. ネットワーク層（第3層）が経路選択
D. データリンク層（第2層）はネットワーク機器間の直接通信を管理
</details>

---
### 問題3 (データベース)
関係データベースにおける「主キー」の特徴として、正しいものはどれですか？
A. 重複が許可される
B. NULL値を含むことができる
C. テーブル内で一意である
D. 任意の列を主キーにできる
<details>
<summary>解説</summary>
正解は C です。
主キーの特徴:

テーブル内で各レコードを一意に識別
重複は許可されない
NULLは許可されない
テーブルごとに1つだけ設定可能

不正解の選択肢の誤り:
A. 重複は許可されない
B. NULLは許可されない
D. すべての列が主キーになれるわけではない
</details>

---
### 問題4 (プログラミング)
次のうち、オブジェクト指向プログラミングの「カプセル化」の説明として正しいものはどれですか？
A. 継承によってクラスの機能を拡張すること
B. オブジェクトの内部状態を隠蔽し、外部から保護すること
C. 異なるクラスのオブジェクトを同一視できること
D. メソッドをオーバーロードすること
<details>
<summary>解説</summary>
正解は B です。
カプセル化の特徴:

オブジェクトの内部状態（データ）を隠蔽
private、protected修飾子による外部からのアクセス制限
データの不正な変更を防ぐ

他の選択肢の説明:
A. 継承に関する説明
C. ポリモーフィズムの特徴
D. メソッドのオーバーロードは別の概念
</details>

---
### 問題5 (IT管理)
ITサービスマネジメントにおけるPDCAサイクルの「Check」の主な目的は何ですか？
A. 新しい目標の設定
B. 実行された活動の評価と検証
C. 具体的な行動計画の作成
D. 改善活動の実施
<details>
<summary>解説</summary>
正解は B です。
PDCAサイクルの各段階:

Plan（計画）: 目標と計画の設定
Do（実行）: 計画の実行
Check（評価）: 結果の測定と分析
Act（改善）: 改善点の特定と修正

「Check」では:

実行された活動の結果を評価
目標との差異を分析
次の改善につなげる情報収集

</details>


---

### おしまい

という感じで、雑多に勉強していこうと思うわけですが、
Cが答えになる率が高い気がします。
[DB]マスターデータとトランザクションデータについて考える

# はじめに
Qiita Advent Calendar　13日目です。
ここが本間に折り返し、いろいろなことを考えるきっかけとなっていい企画だなと思いました。
(なんか言ったのかわからない。)
本日はマスターデータとトランザクションデータについて考えてみたいと思います。

# マスターデータとトランザクションデータの違い

| 特徴/項目                     | マスターデータ                              | トランザクションデータ                              |
|------------------------------|---------------------------------------------|---------------------------------------------------|
| **定義**                     | 基本的な情報を管理するデータ                  | 業務活動や取引の記録データ                          |
| **更新頻度**                 | 低い                                        | 高い                                              |
| **例**                       | 商品情報、顧客情報、社員情報                  | 販売履歴、購買履歴、勤怠記録                        |
| **役割**                     | 業務の基盤となる情報を提供                    | 日々の業務活動や取引の詳細を記録                    |
| **管理方法**                 | 一貫性と正確さを重視                          | リアルタイムの更新と分析を重視                      |
| **データの性質**             | 静的（あまり変わらない）                      | 動的（頻繁に変わる）                                |

### マスターデータの具体例
- **商品マスタ**: 商品名、価格、メーカーなどの情報を含む
- **顧客マスタ**: 顧客ID、名前、住所などの情報を含む

### トランザクションデータの具体例
- **販売履歴**: 商品ID、販売数量、販売日時などの情報を含む
- **勤怠記録**: 従業員の出退勤時間、勤務日などの情報を含む

# マスターデータかトランザクションデータなのか
会社と従業員をい例として、考えたいと思います。
会社というオブジェクトに関して考えると、起こるイベントというのは限られています。
入社の際には、トランザクション回数は1回です。
何回も同じ会社に入社しませんよね。
つまり、データの更新頻度は極めて少ないです。
これはマスターデータ一つでよいと思います。


逆に、給与支払いは毎月行われます。
そして、給与の額も勤務時間によって変わります。
これはトランザクションデータを使用する必要があります。

**少なくとも入れたいデータを
社員番号、名前、部署名、入社年日、生年月日とします。**

# 給与支払いのテーマで考えよう。

給与支払いのケースで考えうるデータの集まりは以下になると思いました。

# 結論
### マスターデータ
- **社員番号**: 各社員を一意に識別するための番号
- **名前**: 社員の氏名
- **部署名**: 社員が所属する部署の名称
- **入社年月日**: 社員が会社に入社した日付
- **生年月日**: 社員の生年月日

# 給与支払い
### マスターデータ

- **社員番号**: 各社員を一意に識別するための番号
- **名前**: 社員の氏名
- **部署名**: 社員が所属する部署の名称
- **入社年月日**: 社員が会社に入社した日付
- **生年月日**: 社員の生年月日
- **給与等級**: 社員の給与ランクや等級
- **基本給**: 各社員の基本給額
- **銀行口座情報**: 給与振込先の銀行口座情報

### トランザクションデータ

- **勤務時間**: 各社員の月間勤務時間
- **残業時間**: 各社員の月間残業時間
- **休暇情報**: 有給休暇や病欠などの休暇情報
- **支給日**: 給与が支給される日付
- **控除項目**: 税金や社会保険料などの控除項目
- **支給額**: 各月の総支給額
- **控除額**: 各月の総控除額
- **手当**: 交通費や住宅手当などの各種手当
Laravel 10 -> 11 のアップグレードでやったこと

こちらのアップグレードガイドで
一部すぐに対応できなかった箇所があったので手順メモ

なお本投稿は

:::note info
自分自身のアウトプットのハードルを下げるぞ！
:::

という実験的試みも含まれています。

https://readouble.com/laravel/11.x/ja/upgrade.html

### composer.json

```
php: ^8.3
laravel/framework -> ^11.0
laravel/sanctum -> ^4.0
nunomaduro/collision -> ^8.1
```

のあと、`composer update`を実施

※利用しているライブラリ次第です、詳しくはアップグレードガイドをご参照ください

### AppServiceProvider.php

`Sanctum::ignoreMigrations()`　を削除

### bootstrap/app.php

ファイルを新規で追加して
最新を取得した場合と同様の内容の

```php
<?php

declare(strict_types=1);

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
```

とする。

### artisan(.php)

中身を別に最新で取得したものに置換

```php
#!/usr/bin/env php
<?php

use Symfony\Component\Console\Input\ArgvInput;

define('LARAVEL_START', microtime(true));

// Register the Composer autoloader...
require __DIR__.'/vendor/autoload.php';

// Bootstrap Laravel and handle the command...
$status = (require_once __DIR__.'/bootstrap/app.php')
    ->handleCommand(new ArgvInput);

exit($status);
```

### bootstrap/providers.php

ファイルを新規で追加して

```php
<?php

declare(strict_types=1);

return [
  // ここはconfigのprovider登録を持ってくる
];
```

### config/app.php

`'proviers'`と`'aliases'`を削除

:::note warn
#### 12/04追記 configを削除してしまうとide-helperが期待通りに動作しない
ide-helperがconfigの値を参照する

bootstrap/providers.phpに記載があれば動作は問題ないので
ide-helperを利用したい場合はconfig側にもproviderの記載を行う
:::