OmniAICreator/Qiita-1.07M huggingface dataset:
CRUDって簡単にどういうこと？

## CRUDとは？

CRUDとは、データベースを扱うシステムやアプリケーションに必要な4つの基本操作を表す言葉です。それぞれの操作は以下のような役割を持っています

- **Create（作成）**

  データを新しく追加する操作。
  
  - *例*: ユーザー登録フォームで新しいユーザー情報を保存する。

- **Read（読み出し）**

  保存されているデータを検索して表示する操作。
  
  - *例*: ユーザー一覧ページで登録されているユーザー情報を表示する。

- **Update（更新）**

  既存のデータを変更する操作。
  
  - *例*: プロフィールページでユーザー情報を編集する。

- **Delete（削除）**

  不要になったデータを削除する操作。
  
  - *例*: 退会時にユーザー情報を削除する。

## CRUDを簡単に理解するための例

シンプルなアプリケーション: ユーザー管理システム

**Create**: 新しいユーザーを登録する。
**Read**: 登録されたユーザー情報を一覧で表示する。
**Update**: ユーザーのプロフィール情報を編集する。
**Delete**: 不要になったユーザー情報を削除する。

これらの操作がすべて揃うことで、データの管理や操作が自在に行えるシステムが完成します。
Vueの.env読み込みに必要な手順

インストールコマンド
```
npm install dotenv --save-dev
npm install dotenv-expand --save-dev
```


ファイル構成
```
[プロジェクトフォルダ]
│  .gitignore
│  index.html
│  output.txt
│  package-lock.json
│  package.json
│  postcss.config.js
│  README.md
│  tailwind.config.js
│  vite.config.js
│  .env
│  .env.development
│  .env.production
│  
├─node_modules
│                  
├─public
│      favicon.ico
│      
└─src
    │  App.vue
    │  firebase.js
    │  index.css
    │  main.js
    │  
    ├─assets
    │      base.css
    │      logo.svg
    │      main.css
    │      
    ├─components
    │  │  Login.vue
    │  │  UserList.vue
    │  │  
    │  ├─icons
    │  │      IconCommunity.vue
    │  │      IconDocumentation.vue
    │  │      IconEcosystem.vue
    │  │      IconSupport.vue
    │  │      IconTooling.vue
    │  │      
    │  └─__tests__
    │          HelloWorld.spec.js
    │          
    ├─router
    │      index.js
    │      
    ├─services
    │      api.js
    │      
    ├─stores
    │      RecodeList.js
    │      
    └─views
            AboutView.vue
            Dashboard.vue
            Googale_Login.vue
            SideBar.vue
            styles.css
```

# .env.development (npm run dev で実行したときに優先して読み込む)
# .env.production　(本番環境で読み込む .env ファイル)

# 「.envファイルの内容の例」
```
VITE_API_URL=http://localhost:8000/
VITE_API_HOME=http://localhost:3000
VITE_GET_RECODE=recode
```

# 変更前の【vite.config.js】
```
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'), // Use Node.js compatible syntax
    },
  },
});
```


# 変更後の【vite.config.js】
```
import { defineConfig, loadEnv } from "vite"; 
import vue from '@vitejs/plugin-vue';
import path from 'path';

export default defineConfig(({ mode }) => {
  // .envファイルの内容を読み込む
  const env = loadEnv(mode, process.cwd());

    // 環境変数を出力して確認
    console.log('VITE_API_URL:', env.VITE_API_URL);
    console.log('VITE_GET_RECODE:', env.VITE_GET_RECODE);

    return {
      plugins: [vue()],
      root: "./src",
      envDir: '../',  // これを追加
      build: {
        outDir: "../dist",
        rollupOptions: {
          input: path.resolve(__dirname, "src/index.html"),
        },
      },
      resolve: {
        alias: {
          '@': path.resolve(__dirname, './src'),
        },
      },
      define: {
        '__VUE_PROD_HYDRATION_MISMATCH_DETAILS__': false,
      },
      server: {
        // サーバーの設定（例: ポートやプロキシ）を必要に応じて追加
      },
      test: {
        globals: true,
        environment: "jsdom",
      },
    };
  });
```

# ポイント①
以下の内容は、フォルダの構成によって調整すること
envDir: '../', 　これはルートが「src/index.html」になった場合に必要
```
      root: "./src",
      envDir: '../',  // これを追加
```

# ポイント②
以下の内容は、絶対パスの位置を設定するコード
src/ の直下に index.html が無いとエラーが起きる
```
        rollupOptions: {
          input: path.resolve(__dirname, "src/index.html"),
        },
```
最近納得した「集中」に関する話

#### 仕事を今年から始めて、「集中」というテーマに意識を向けてきました。

「どうやったら集中できるのか」
「どうしたら集中力を切らさずに業務をこなせるのか」
「集中力を持続させるためにはどうしたらいいのか」
このような疑問を考えながら取り組んできました。

ただし、集中できたとしても、その後の疲労感が非常に大きく、結果的に長時間休むことになってしまったり、集中できた日とできなかった日の差が激しいと感じていました。

そこで新しい考え方として学んだのは、「集中しないことに目を向ける」というものです。
1日の中で集中できる時間はおおよそ限られているようです。そのため、昼間に集中し続けることで夜には疲労困憊状態になり、結果的にパフォーマンスが低下してしまっていたのだと思います。
さらに、集中した日の翌日が集中できない日になると、結局どちらの日も普通の状態で作業した場合と大差がない結果になってしまいます。

### 「集中しない」とは
「あえて集中力100％をずっと続けようとしない」ということです。
時間やタスクによって集中力の使い方を調整し、意識的に集中しない時間を確保することを指します。

集中しない時間を作るために取り組んだこと

* 考えることが求められる業務は午前中に回す
集中できる時間が十分にあるうちに、頭を働かせる必要のある業務を優先して行います。


* 定期的に休憩時間を設ける
休憩を意識的に取り入れることで、仕事後の自己学習やプライベートの活動にも力を注ぐ余裕が生まれます。

「ポモドーロ・テクニック（25分作業 + 5分休憩）」などの時間管理術もあります。

* 余計なことに対する判断をできるだけ避ける
1日にできる判断の数は限られていると言われています。そのため、判断を必要としない場面（例: 「今日のご飯は何にしようか」など）でエネルギーを使わず、仕事や学習に集中するために判断力を温存します。

### まとめ
「集中力」は有限のリソースであり、適切に配分することでより良いパフォーマンスを発揮できます。
集中すべき時間と休むべき時間を意識的に調整し、無理に集中し続けようとせず、メリハリをつけて取り組むことが大切だと感じました。
 自分にとって最適な集中と休憩のバランスは人それぞれ異なります。試行錯誤を繰り返して、自分に合った方法を見つけることが大事でしょう。
【AWS Lambda】AWS Lambdaのここが難しいよ【初心者向け】

# はじめに

先日初めて Lambda に入門しました。その時にいくつか躓きポイントがあったので、紹介します。

# 作り方が3種類ある

Console から Lambda を作るとき、最初に3つの選択肢から選ぶ必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325392/ae13dea4-7566-06b9-92f3-8eaaf48d183e.png)

この選択によって、それ以降で設定する項目が結構かわるので、後回しにできません。
それぞれの選択肢をざっくり説明するとこんな感じです。

- Author from scratch
    - ゼロから作る場合に選択します。
- Use a blueprint
    - AWS が用意した設計図を使って作成する場合に選択します。
    - 使ったことがないのでわからないですが、実装したい内容とマッチする設計図が用意されている場合は使ってもいいかもしれないです。
- Container image
    - コンテナイメージを元に作成する場合に選択します。

この選択がデプロイ方法につながるので、注意しましょう。Author from scratchを選んだ場合は、Console 上で編集するか、Zip ファイルをアップロードしてデプロイすることになります。しかも変更できないので、後からコンテナイメージにしたい場合は最初から作り直す必要があります。

最初は `Author from scratch` でプロトタイプを作りながらいろいろ触ってみて、その後本番を `Container image` で作るのがおすすめです。

# 使う言語（ランタイム）は？

Lambda の関数の中身をどの言語で書くか決める必要があります。
1人で開発する分には好きな言語で問題ないですが、複数人で開発する場合や、作った後に別の人に引き継ぐ場合などは慎重に選びましょう。また、選んだ言語に AWS SDK のライブラリがあるか確認しておくと良いでしょう。 Lambda から別の AWS のリソースを操作する場合に AWS SDK は便利です。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

# x86_64 と arm64 どっち？

arm64 の方が安いので、基本 arm64 でいいと思います。コンテナイメージでLambdaを作る場合は、arm64 で動くイメージをビルドする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325392/de576b43-a246-551b-b0b1-58a5bf59da45.png)

詳細はこちら：

https://aws.amazon.com/jp/lambda/pricing/

# Lambda のバージョン管理どう管理する？

Lambda の関数のバージョンは、デプロイのたびに 1, 2, 3...のように増えていく整数になっています。 また、 `$LATEST` という最新を指すバージョンもあります。

バージョンとは別に **エイリアス** というものがあります。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-aliases.html

エイリアスにはバージョンを指定できるので、エイリアスをうまく活用すると、運用しやすくなる場合があります。例えば、何らかのリソースから Lambda を呼び出す時は常に特定のエイリアスに固定しておき、エイリアスに紐づくバージョンを変更することで新しいバージョンをリリースできるようにする、といった方法が可能です。

# 動作確認ってどうするの？

Console の Testタブから、Lambda に渡す引数を指定して実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325392/fc52a5fd-3020-9a49-7f31-e29cf63c30c9.png)

コンテナイメージの場合、ローカルでテストする方法がドキュメントに記載されています。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/ruby-image.html#ruby-image-clients

`docker run` でコンテナを起動しておき、以下のように curl などで Lambdaを invoke することができます。

```
$ curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
```

# その他

- タイムアウト
    - デフォルトは実行時間が3秒を超えるとタイムアウトします。
    - 最大は 900秒 = 15分です。15分を超える処理はできないので、分割するか、別の手段に変えましょう。
    - [Lambda 関数のタイムアウトを設定する - AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-timeout.html)
- メモリ
    - 128 MB～10,240 MB です。大きくするほど料金が増えるので注意。
    - [Lambda 関数のメモリを設定 - AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-memory.html)
- エフェメラルストレージ
    - 512 MB から 10,240 MB です。大きくするほど料金が増えるので注意。
    - [Lambda 関数のエフェメラルストレージを設定する - AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-ephemeral-storage.html)
【備忘メモ】BCryptのCheckpwメソッドの引数

第一引数に設定するのはプレーンパスワード。
第二引数に暗号化したパスワードを設定する。

第一引数に設定するパスワードも暗号化したため二重に暗号化されてしまい、認証がうまくいかなくてハマった。
氷山モデルで問題を深掘りする

こんにちは！

エアークローゼット アドベントカレンダー16日目の記事です。
最近エアークローゼットに入社させていただき、今回が人生初の記事投稿になります！

少し前に知った氷山モデルという思考方法についてまとめたいと思います。

## 氷山モデルとは？
<br />
氷山モデルとは、表面的に起きた出来事は氷山の一角とし、その水面下にある要素も含めて全体像を把握しようと言う考え方です。
<br />

心理学でも自閉症などの支援をするためにも使用されいて、
課題解決において汎用性が高いフレームワークとして利用できます。

氷山モデルの説明は、下記の記事が非常にわかりやすかったです。
https://www.change-agent.jp/systemsthinking/approach/the_iceberg_model.html
<br />
上記記事の内容をざっくりまとめると、

発生した問題を下記のレイヤーで捉えます。
① 出来事
② パターン
③ 構造
④ 意識・無意識の前提

下に行くほど、深いレイヤーになります。

そして大抵の場合、
①に対して表面的な対処をするだけで問題に対応したように扱われがちです。
ただ、この出来事は氷山の一角でしかなく、
その水面下にある②〜④まで深掘りした上で対策しなければ、根本解決にならないよという内容です。


## 例えば
前職でSESとして複数の現場を経験する中で、
何度か目にした問題をもとに使い方をまとめてみます。

技術的に詳しくない分野の対応を若手が任される状況で、
調べてもわからない部分があった時、
バカだと思われたくなくて質問をせず、後で手戻りが発生してしまうケースです。

新卒時代の私もよくやっちゃってました。

表面だけ見ると「知識・経験不足でした」で片付いてしまいます。
しかし、ここで「今回でこの知識を理解したからもう次は大丈夫」と考えた場合、
また詳しくない箇所の修正等を任された時に同じ失敗を繰り返してしまいます。

少なくとも「怒られるのが怖いから聞かない」が治らない限りは、
次また詳しくない作業を任されたときに不明点を残したまま進めてしまうためです。
<br />
氷山モデルをもとに考えると、さらに下記のように考えられそうです。

①出来事
→ 知識・経験不足でバグが発生。
②パターン
→ これまでも本人は不明点があることに気づいても、怖くて質問できていない。
③構造
→ 質問をしやすいタイミングや日頃から関係性を気づくための仕組みが作られていない。
④意識・無意識の前提
→ 責任を押し付け合う習慣がチームにあり、質問をするハードルが高かった。
<br />
状況等によっても変わると思うのであくまで一例ですが、
このように考えていくと、根本的に解決しないといけないのはチーム内の他責思考なのかもしれません。
個々人に「質問して！」と注意するだけでは、人が入れ替わるたびに同じことが繰り返しかねないです。

もちろん、質問できなかった本人が「チーム内の他責が問題だ！」と言ってると一生成長できないです。
自分なりに恐怖に立ち向かうか、「後で問題発生する方が信頼を失う」と考え方を変える等の努力は必要だと思います。
あくまで組織の成長を考えるときに④まで深ぼるのが良いのでしょう。

## 最後に
<br />
同じ問題が人が入れ替わっても発生するなどあれば、氷山モデルの出番です。

一定のパターンがないかをチェックすることで、個人の課題が明確になりますし、
さらに構造や意識・無意識の前提まで深掘りすれば、組織としての課題発見に繋げられるかもしれません。

最下層が「意識・無意識の前提」と書いてあるくらいなので、結局問題は人ということになります。

エンジニアをやっていると、技術にばかり目が行きがちですが、
実際に作業をしているのは人間なので、人間についての理解を深めることも大事だと思います。

私ももっと人として成長していけたらとしみじみ思います！
来年に向けて気合い入れ直しましょう！
1年目エンジニアの命名規則まとめ

# はじめに
みなさんはちゃんと命名ができていますか？
僕はできてないです！
就職して1年目ですが、命名についてレビューをいただくことが多々あります。
勉強も兼ねて命名の仕方をまとめました。優しい目で見てください。

# 1. フォーマット規約[^1]に従う
フォーマット規約により、それが何を表しているのか判断できるという利点があります
```javascript:例 ( javascript )
// コンストラクタ
var x = new DatePicker();

// 通常の関数
var y = pageHeight();
```

単語を繋ぐ際にもフォーマット規約は重要となってきます
例として4つのケースを挙げます
```:例
スネークケース
user_name = "cat0"

# ケバブケース
user-name = "cat0"

# キャメルケース
userName = "cat0"

# パスカルケース
UserName = "cat0"
```
プロジェクトや言語によって使用できるフォーマット規約は変わりますが、一貫性を持たせることが大切です

自分自身やチーム、言語によって決められた規約の命名をすることが大事らしいです

# 2. スコープ[^2]を考える
> スコープが小さければ短い名前でも良い
```ruby:例 ( ruby )
    message = "Hello World!"
    puts message
```
上記のコードは`message`を理解するのに必要な情報がすぐそばにあるのでまだ理解できますが、数十行後に`message`が出てきた際にそれは何を意味しているのか分からなくなりそうです

大きいスコープを持つ変数には、いつ見ても理解できる命名をすることが大切です

# 3. 汎用的な名前は避ける
下記の`tmp`は生存期間こそ短いですが、この変数にとって一番大切なことは「一時的な保管」ではありません
```ruby:例
tmp = user.name
tmp += " " + user.phone_number
tmp += " " + user.email
puts tmp
```

これをわかりやすくするためには格納されている情報がわかる命名をします
```ruby:例
user_info = user.name
user_info += " " + user.phone_number
user_info += " " + user.email
puts user_info
```
汎用的な名前は便利ですが、コードを読みにくくしてしまいます

# 4. 明確な単語を選ぶ
```ruby:例
def GetPage(url)
```
`Get`ではこのメソッドがどこから`Get`してくるのかがわかりません
インターネットから取得するのならば`FetchPage()`, `DownloadPage()`の方が明確です

状況に合わせて同じ意味でも適した単語を使うようにしましょう
|単語|代替案|
|--|--|
|send|deliver, dispatch, announce, distribute, route|
|find|search, exact, locate, recover|
|start|launch, create, begin, open|
|make|create, set up, build, generate, compose, add, new|

# 5. 具体的な名前を使う
TCP/IPポートをサーバがリッスンできるかを確認するメソッド名を定義します。
`ServerCanStart()`という名前のメソッドを作成してしまうと、名前が少し抽象的です。
具体的な名前にすると`CanListenOnPort()`になります。
これならメソッドの動作をそのまま表せています。

# 6. 大切な情報を追加する
変数名に追加する情報は単位だけではく、状況によって改善すると良いです。
以下に例をまとめます。
|状況|変数名|改善後|
|---|---|---|
|passwordはプレーンテキストなので、処理をする前に暗号化するべきである|password|plaintext_password|
|ユーザが入力したcommentは表示する前にエスケープする必要がある|comment|unescaped_comment|
|htmlの文字コードをUTF-8に変えた|html|html_utf8|
|入力されたdataをURLエンコードした|data|data_urlenc|

# 7. 誤解されない名前か確認する
> 最善の名前とは誤解されない名前である。

これに基づきリーダブルコードで推奨されている命名をまとめます。

|状況|命名案|
|---|---|
|上下の限界値|min, max|
|包含的範囲|first, last|
|包含/排他的範囲|begin, end|
|ブール値|is, has|

単語に対するユーザの期待にも注意し、get()やsize()には軽量なメソッドが期待されています

# 最後に
この記事の多くはリーダブルコードより抜粋しています
みんな躓くものはどこかにナレッジがあるもんですね
命名で躓かないようになりたいです

[^1]:プログラムのコードを一貫した形式に整えるためのルールや規則のこと
[^2]:ソースコード内の変数や関数が利用できる領域
Swiftで作るコマンドラインツール

# まえがき

SwiftはiOSアプリ開発のための言語というイメージですが、
やろうと思えばサーバーサイドの開発や、コマンドラインツールの開発にも採用することが出来ます。

Xcode上でコマンドラインツールの開発プロジェクトを作ることができるのを最近知ったので、
実際にSwift製コマンドラインツールを作ってみましょう。

# Xcodeプロジェクト作成

* Xcodeの File... -> New -> Package... から新規プロジェクトを作成します。
    * 種類はmacOS -> Command Line Toolを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911364/68b7c245-de7e-6f5e-b3b6-6e204e88c229.png)

作ると↓こんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911364/cd8ce750-d47c-a652-b04d-7786e21150ae.png)

# ライブラリを導入する

外部ライブラリの導入もできます。

File... -> Add Package Dependencies... で
検索窓にgithubのリポジトリのURLを直接入れて検索ができます。
ここではSwifterSwiftを入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911364/62ecc080-1e9d-a07c-fda5-82f52178dea4.png)

Add PackageでSwifterSwiftを入れた後、
XcodeプロジェクトのBuild Phases 
-> 「Target Dependencies」「Link Binary With Libraries」
にSwifterSwiftを追加します。

# プログラムを書く

main.dartにプログラムを書きます。

```
import Foundation
import SwifterSwift

print("Hello, World!")

let arguments = ProcessInfo.processInfo.arguments

func main() -> Int {
    
    for arg in arguments.enumerated() {
        if arg.offset == 0 {
            print("product path: \(arg.element)")
            continue
        }
        print(arg.element)
        if let intValue = arg.element.int {
            print("this is number: \(intValue)")
        } else {
            print("this is not number!!")
        }
    }
    
    return 0
}

_ = main()
```

# ビルドして実行ファイルを作る

Xcodeの再生ボタンからビルドします。
プログラムで引数を取得していますが、第一引数が実行ファイルの出力先パスになるので、
それを参照して実行ファイルをどこか使いたい場所にコピーします。
（もっとスマートなやり方があればコメントお願いいたします）

![スクリーンショット 2024-12-23 18.28.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911364/650c1e66-bd81-d1db-8195-d0355622f907.png)

これで作成は完了です。

# ターミナルから実行する

ターミナルから実行ファイルを実行します。

```
$ ./ForQiita 12 123 333 hoge fuga 444

Hello, World!
product path: /Users/username/Documents/ForQiita/ForQiita/
12
this is number: 12
123
this is number: 123
333
this is number: 333
hoge
this is not number!!
fuga
this is not number!!
444
this is number: 444
```
無名関数 elixir

無名関数とは？
> 無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 callable パラメータとして使う際に便利ですが、用途はそれにとどまりません。

https://www.php.net/manual/ja/functions.anonymous.php

名前の通り関数名を持たない関数のことです。
なおPHPのドキュメントから引用していますが概念としてはelixirでも同様です。

例
```elixir
iex > sum = fn (a, b) -> a + b end

iex > sum.(2, 3)
```

1行目でsumに対して関数を束縛しています。
fn (a, b) -> a + b endの無名関数がsumに束縛されたことにより2行目にて使用可能となっています。
無名関数を束縛された変数を利用するには『.』を付けて使用する必要があります。
この『.』（ドットと呼ぶ）は関数呼び出しを意味しています。
なお関数呼び出しの際にはカッコが必要であるが関数の定義には必ずしもカッコが必要ではありません。

参考資料：プログラミングElixir 第２版
1日20円で完全英語脳へのファーストステップを300日つづけられた方法

プログラマ、英語必要です。
変数名、メソッド名、クラス名を考えるため。
そもそものドキュメントを読むため。

わたしのように英語学習に何度も挫折した経験がある人のいいきっかけになってほしいと思いまとめました。

## 英語脳になる４ステップ
この動画によると、英語脳に到達するステップは以下の４ステップ。

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

![CleanShot 2024-12-23 at 18.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/35eaf626-b700-f6ed-7dec-259383d638eb.png)

1. 日本語→英語
1. パラフレーズ
1. 英語→英語
1. 1トピックを"elaborate"する

## わたしたちは「1. 日本語→英語」が圧倒的に足りない

りんご＝Apple、わたあめ製造機＝？

[^1]: わたあめ製造機は Cotton candy machine 

![CleanShot 2024-12-23 at 18.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/efcdb9e0-0005-bfb0-2e11-fdd8edd0c0a7.png)


話す前に、言葉を知らない、語彙力が足りない。

そこをできるだけ「勉強」とか「努力」というハードルを感じないために継続できている習慣があります。

## 「Super Duolingo（年額7,890）を毎日プレイする」

です。


![duo_plan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/dea7a27f-3b5a-4cc9-7d13-d18e3eccf13e.jpeg)


[^2]: 先日、317日目にして初めてダイアモンドリーグに昇格できました！ :tada: 
![duolingo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/b6273456-1ef3-24c6-f6d4-f6fcd9d2619c.jpeg)

## なぜ続けられているのか

- **ゲームになっている**
  何事も自発的にやれるほうが良いです。お風呂以外であればスマホは身近にあるのでそれを利用してスキマ時間でもサクッとプレイできます
- **Duoをしている最中はスマホを占有される**
  スマホの誘惑に勝つには、スマホを他の事に使えばよいのです
- **他のユーザーの継続状況がわかる「お祝い」しあえる**
  ひとりでコツコツできないので、他の人もやっている様子が見えるので良いです。時にはリーグを競うライバルになりますが
- **有料なので本気になる、ストレスなくプレイできる**
  無料プランだと毎プレイ広告が表示される、HPの概念で制限がすぐにかかります。これでは毎日やるにはストレスフルなのでお金で解決します
  お金を払うことで「ムダにしてはいけない」という気持ちを持つねらいももちろんあります

### 自分のがんばりを見えるところにおく
わたしはiPhoneの1ページ目の一等地に置いています！笑
「また戻ってきてね！」のひとことを見ると、がんばろうという気持ちがわきます。
![duo-top.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/43f2cad4-6554-554a-3bea-4c228a009bf6.jpeg)


## 300日つづけてみて実感すること。
- 語彙力が増えた
- ヒアリング
  - 語彙力が増えたことで聞き取れるセンテンスが増えた
  - 毎日やることで英語の耳が育ってきた
- スピーキング
    - 文章をみて発声するのがスムーズになってきた

冒頭の動画にも説明されていますが、英語の成長曲線は「低空飛行期間がとてもながい」ので、**まずは継続すること**をいちばんに考えてこれからも楽しく続けて行こうとおもいます。
マテリアルで正三角形・正六角形のモザイクを作ろう

この記事は[Unreal Engine (UE) Advent Calendar 2024(シリーズ 4)](https://qiita.com/advent-calendar/2024/ue)の14日目の記事です。

## 過去記事
この記事は昨年のUEアドカレの[マテリアルで三角形のモザイクを作ろう【初心者向け】](https://qiita.com/well_over_/items/01c2f6b960f2a257f157)の続きです。
こちらの記事の内容が前提となっていますのでご了承ください。

## マテリアルでのモザイク表現について
UEのマテリアルでは、次のようにTexCoordとFloor(もしくはCeil)を使ってUVに手を加えることで、テクスチャなどから簡単にモザイク表現を作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/2a90d0b3-4beb-2c2d-3ecf-90d416ce68cc.png)


こちらの詳細な仕組み等については今回は省略します。
興味がある方はぜひ、『[HoudiniとUnreal Engine 4で学ぶリアルタイムVFX](https://www.borndigital.co.jp/book/16566/)』(著 池田 亘 さん) の p.102～ をご覧ください。

## 今回の内容
以前の記事では、各方向のグラデーションをそれぞれ作成し合成することでモザイクを作成していました。

今回は、前回の記事と異なるアプローチで、正三角形・正六角形のモザイクを作ってみたいと思います。

## ふつうのUVとモザイクのUVの関係
さてモザイクのUVですが、画像のようにして通常のUVとの差を求めてみると、必ず全てのマスに同じ形のグラデーションが現れるという特徴があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/ca1fb146-10dd-3575-77ed-8f72ec8ab8f0.png)
<br>
グラフで確認してみましょう。<br>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/2bfe7ead-dc41-92f1-c137-4e9ec69ef221.png" width=60%>
<font color="LimeGreen">緑が通常のUV</font>、<font color="red">赤がモザイクのUV</font>です。
モザイクのUVはこのように階段状になっています。
<br>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/972165a1-c889-4ec2-7579-4c2a502cb3fa.png" width=60%>
2つのUVの差はこの青い部分になります。
青い部分が**マスごとにUVの傾きを平らにして1つの値でマスを塗り潰す**ことでモザイク模様になる、というのがなんとなく分かると思います。
<br>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/10904ab4-a136-aa71-ed31-0afa265c3856.png" width=60%>
共通する部分を取り除き、差の部分だけを表示するとこのようになります。
いわゆるノコギリ波という形になっており、これがマスごとに繰り返されるグラデーションの正体です。
0~1のグラデーションを5段階に区切っているため、1マスの中の変化量は1/5の0.2(-0.1~0.1)になっています。

以上のことから、
**通常のUVからマスごとにノコギリ波のグラデーションを引き算することでモザイクのUVが作成できる**ことが分かります。

<br>実際に組んでみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/3c2dcd95-0c61-8db2-06a3-6063e70ac133.png" width=100%>
ちゃんと同じ結果になりましたね！
意外にもノードの数も同じになりました。

## 正三角形のモザイク
上記を踏まえて次の画像のように組むと正三角形のモザイクが作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/1ec9e139-e929-b6d6-bc65-5e3baf228620.png)

記事が長くなってしまうので細かい説明は省略しますが、
単純な処理ばかりなので順に確認していけば理解するのはそれほど難しくないかと思います。
1マスの縦横比を正三角形に合わせて調整するため最初に√3を計算しているのがポイントです。
また、正三角形の場合上下が逆のマスがあるため、U方向とV方向を別々に計算しています。
## 正六角形のモザイク
先ほどの正三角形をさらに発展させて、正六角形のモザイクを作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/0d5f11fc-6be5-7548-ad66-96a1a4c1b6e5.png)
正六角形の場合は上下方向のズレと左右方向のズレの割合が異なるため、計算が少し複雑になります。
とても面白い処理になっていると思うのでよければ分析してみてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/fc59885e-a99a-955f-18ad-22e882bcaa6f.png" width=50%>
<br>かっこいい～～～

## 応用
例によってモザイクのマテリアルは普段UVを使用する部分へ置き換えるだけで様々な表現へ応用が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478649/cfe40bd4-bce3-ba30-d719-c1c0c58f501f.png)
ぜひ面白い使い方を探してみてください。
ぼくのかんがえたITエンジニアの報連相（報告編）

## 「報連相」とは
報連相とは「報告」「連絡」「相談」の略とされています。  
特に「仕事で周囲とのコミュニケーションを取る」ためのオーソドックスな手段と言われています。  
業種によってその定義は様々で、意外と認識齟齬が発生しやすく、「したつもり」が「なっていない」と注意されることもしばしば。  
なので「ぼくのかんがえたITエンジニアの報連相」と題して、それぞれについて思っていることを書き連ねます。

---

## 「報告」とは
基本的には1対1の情報伝達で、相手と内容について何等かのやり取りが発生します。  
特に上位者に対して行うことが多いと思われます。  
進捗定例のようなテンプレートが決まっているものもありますが、実際には日々の細々とした事象の伝達が多いはずです。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934651/0975b389-8f70-2220-086b-31bd1f522c44.png">

---

### 報告の目的
報告の主目的は大きく2つに分かれると考えています。

#### 1. 判断を仰ぐ
自身の権限では下せない判断をしてもらうことです。  
例えば、保守中のシステムにバグが見つかった場合。  
勝手に修正してリリースするわけにはいきません。なぜなら、そのバグの影響範囲や修正工数(費用)、顧客側の繁忙期など、自分では見えないことが多いためです。  
何の「報告」もせず勝手に手を出すと、「よくやった」とは言われず「勝手なことしないで」と注意されるでしょう。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934651/9150c0d6-5be7-cfa3-52fa-d01ef7c4d3b7.png">


#### 2. 責任の移譲
報告を行うことで、責任の一部を上位者に移譲することができます。  
たとえば、修正を行わずに繁忙期にエラーが発生してしまった場合、報告をしていればその責任は判断を下さなかった上位者に移ります。  
「報告することで責任を軽減できる」というメリットを意識してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934651/6b421fbd-b5da-caeb-9b27-70a053779e4b.png)
※このイラストはボールを投げられた人が困った顔をしていますが、実際はボールをため込んでいるほうが上司は困ってしまうので、積極的に共有しましょう。

---

### 報告の内容
良い報告は修正が効きやすい一方、悪い報告は判断ミスの原因となります。  
報告の内容に齟齬が起きないように以下の3つを意識しましょう。

#### 1. 現状の事実のみを伝える
まずは、事実のみを正確に伝えること。  
報告の出だしで予測や憶測を交えると、相手に誤解を与え、判断を誤らせる可能性があります。  
憶測は伝えない、もしくは後述の手順で明確に区別して伝えるべきです。

#### 2. 影響（範囲）について伝える
次に、何がどのように影響しているかを伝えます。  
たとえば、全社的に影響があるのか、一部の範囲なのか、全世界的な影響なのかを明確に伝えます。  
分からないことは「分からない」とはっきり言い、「調査中」と報告することが大切です。

#### 3. あなたの考えを伝える
最後に、あなたの考えを伝えます。  
ただし、ここでも「自分の憶測ですが…」と前置きし、憶測と事実を区別してください。  
相手に求められてから考えを伝えるのでも遅くありません。

---

### 報告の注意点
- **自分らしさを求めない**: 「自分らしい報告」は不要です。  
  淡々と事実を伝えることが最優先。
- **お気持ちは不要**: 感想や感情的なコメントは避けましょう。  
  余計な情報が判断を誤らせる原因となります。

---

## 報告のまとめ
- **報告はコミュニケーションをメインとしたものではない。**
- **事実のみを正確に伝えることを意識する。**
- **求められたら、自身の意見を発信する。**
HULFT10 × グリーンソフトウェア

この記事は [セゾンテクノロジー Advent Calendar 2024](https://qiita.com/advent-calendar/2024/saison-tech) 23日目の記事です。シリーズ２は [HULFT10](https://www.hulft.com/software/hulft-10) のエンジニアによる投稿をお届けします。

--------------------

こんにちは。
HULFT10ではフロントエンドエンジニアとしてAPI Gatewayの開発に途中から参加させていただきました。

今回の記事では技術的な話題からは離れて、私が所属する課での取り組みを少し紹介したいと思います。
読むと地球に少し優しくなれるかもしれません。

テーマは『**グリーンソフトウェア**』です。

# グリーンソフトウェアとは

皆さんはグリーンソフトウェアという言葉を聞いたことがありますでしょうか？

グリーンソフトウェアとは、ソフトウェア開発の過程でエネルギー消費を抑え、環境負荷を最小限にすることを目指す取り組みの事を言います。

概念としては主に以下の3つが挙げられます。

:::note
**【エネルギー効率】**
ソフトウェアが動作する際のエネルギー消費を最小限に抑える。
⇒ プログラムのコードの最適化やアルゴリズムの改良をすることで改善できます。

**【資源効率】**
ハードウェアやネットワークのリソースを効率的に利用する。
⇒ これは例えば、メモリ使用量の削減やデータ転送量の最適化が対策となります。

**【持続可能性】**
ソフトウェアのライフサイクル全体を通じて、環境への影響を考慮すること。
⇒ これは、開発・運用・廃棄に至るまでの全過程を含みます。
:::

ちょっと何を言っているのかいまいちピンと来ないかもしれませんが.…

家電売場などに行くと必ず「省エネ家電」という言葉を目にしますよね。15年くらい前には省エネ性能の高いテレビ・冷蔵庫・エアコンなどの家電を購入するとエコポイントが付与される制度が始まったり、その頃から省エネという言葉が身近になったと感じています。

グリーンソフトウェアはそのようなハードウェアではなく、ソフトウェア側からのアプローチをかけた「省エネソフト」を目指す取り組みと考えると理解しやすいかもしれません。

例えば1つの処理をするために10秒かかっていたプログラムが、コードの最適化によって8秒で処理できるようになったとします。仮に消費電力が一定だとした場合、単純に4/5の電力で処理できるという事です。

これで得られる改善が数ワット程度だったとしても、それがサーバーに常駐するタイプのものであったり、事業の根幹となるソフトウェアの場合はどうでしょうか。改善されるエネルギー効率は決して無視できないものとなります。

# 会社の電気も再エネ、AWSも再エネ、HULFTは？

ではグリーンソフトウェアがどのようなものなのか概念を理解したところで、ひとつ疑問が生まれてきます。

　
**「どうしてグリーンソフトウェアなのだろう」**

　
弊社が本社をおきます赤坂インターシティAIRでは、「入居企業のSDGs達成に貢献」として2022年度に再生可能エネルギー由来の電力へと[切り替わりました。](https://prtimes.jp/main/html/rd/p/000000243.000001379.html)

ASWもまた再生可能エネルギーに注力しており、今年7月には全世界の事業所で使用されている電力が100%再生可能エネルギーになったと[発表](https://www.aboutamazon.co.uk/news/sustainability/amazon-meets-100-renewable-energy-goal-seven-years-early)しています。

ではHULFTはどうでしょうか。

HULFTが多くの企業様にご利用いただいている事を考えると、グリーンソフトウェアの考え方を取り入れていくことは自然な流れかもしれません。

# HULFT10でグリーンソフトウェア、何から始めよう？

残念ながら、実際にはまだグリーンソフトウェアな開発は出来てはいません。

そもそも現状のHULFT10がどのくらいCO2を排出しているのか？どのくらいエネルギーを消費しているのか？グリーンソフトウェアを目指すためにまずはHULFT10の調査を今後していきたいと考えています！

その調査には **SCI** を使います。

SCI（Software Carbon Intensity）は、ソフトウェア利用時の電力・電力の炭素強度・ハードウェアの利用量から、炭素排出量をスコアとして評価する国際規格の手法です。
SCIを提唱しているグリーンソフトウェア財団では以下のように定められています。

```math
SCI = ((E * I) + M) / R
```
:::note
E = ソフトウェアが消費するエネルギー量（kWh）

I = エネルギー1kWhあたりに排出される炭素量（gCO2/kWh）

M = ソフトウェア実行中のハードウェアから排出される炭素量

R = 機能ユニット：ソフトウェアをどのように計るか、たとえばユーザーごとまたはデバイスごと
:::
[https://greensoftware.foundation/articles/software-carbon-intensity-a](https://greensoftware.foundation/articles/software-carbon-intensity-a)

# 最後に

『ファイル転送ソフト、どうしようか？』

『環境にも配慮したものを導入しろって上から言われてるんだよね』

『だったらHULFTしかない！』

HULFT10 × グリーンソフトウェア　はまだまだこれからですが、いつかそうなれるように、今から出来ることを進めていきたいと思います。
HERE Maps API for JavaScriptのSvelteテンプレートを作りました

:::note info
これは [HERE Advent Calendar 2024](https://qiita.com/advent-calendar/2024/here) 23日目の記事です。
:::

## はじめに
そういえばSvelteでHERE Maps API for JavaScript書いたこと無かったなと思い、テンプレートを作成しました
HEREのセットアップはちょっと複雑なのでテンプレートとして用意しておきたかった感じです

最初SvelteKitで挑戦したのですがうまく行かず、Vite + Svelteの構成になっています
おそらくですが、HERE Maps API for JavaScriptのimportの仕方の工夫が必要なのではと思われます


## メインのコード
```svelte
<script lang="ts">
  import H from "@here/maps-api-for-javascript";
  import "@here/maps-api-for-javascript/bin/mapsjs-ui.css";
  import { onMount } from "svelte";

  const API_KEY = import.meta.env.API_KEY;

  let maspRef: HTMLElement;
  let map: H.Map | null = null;

  onMount(() => {
    const platform = new H.service.Platform({
      apikey: import.meta.env.VITE_API_KEY,
    });
    const defaultLayers = platform.createDefaultLayers();
    // ベクタータイルのソースを設定
    const omvService = platform.getOMVService({
      path: "v2/vectortiles/core/mc",
    });
    const baseUrl = "https://js.api.here.com/v3/3.1/styles/omv/oslo/japan/";

    // 日本向けの地図スタイルを読み込む
    const style = new H.map.Style(`${baseUrl}normal.day.yaml`, baseUrl);

    // 背景地図のプロバイダーとレイヤーを作成
    const omvProvider = new H.service.omv.Provider(omvService, style);
    const omvlayer = new H.map.layer.TileLayer(omvProvider, {
      max: 22,
      dark: true,
    });

    // マップを作成（中心は東京駅）
    map = new H.Map(maspRef, omvlayer, {
      zoom: 16,
      center: { lat: 35.680959106959, lng: 139.76730676352 },
    });

    // ユーザーの操作を有効にする
    new H.mapevents.Behavior(new H.mapevents.MapEvents(map));

    // デフォルトのUIコントローラーを作成
    H.ui.UI.createDefault(map, defaultLayers);

    // ウインドウサイズが変更されたときに地図をリサイズ
    window.addEventListener("resize", () => map?.getViewPort().resize());
  });
</script>

<div>
  <div class="map" bind:this={maspRef}></div>
</div>

<style>
  .map {
    width: 100vw;
    height: 100vh;
  }
</style>
```

動かすとこのような地図が出ます
![スクリーンショット 2024-12-23 19.09.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/f96137cf-2628-2ab4-df9f-f3910f7970d3.png)

Altキーとマウスでグリグリ動かすとこんな感じ
![スクリーンショット 2024-12-23 18.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/4a32e72d-3763-bae3-9e18-f789ddc43859.png)


## テンプレート

https://github.com/northprint/here-maps-svelte-template

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

https://zenn.dev/mierune_inc/books/here-writings

https://www.here.com/docs/ja-JP/bundle/maps-api-for-javascript-developer-guide/page/README.html
TypeSctipt/vite環境で絶対パス(@)でimportする

### import

TypeScript での設定を Vite で使い回せる`vite-tsconfig-paths`パッケージをimport
```bash
npm i vite-tsconfig-paths
```

### ts.config.json更新

ts.config.jsonが、`tsconfig.app.json`を参照するように設定されているので、`tsconfig.app.json`を編集する。
```json:ts.config.json
// ts.config.jsonは何も編集しない。
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ]
}
```

```diff_json:tsconfig.app.json
{
  "compilerOptions": {
    ...

+    "baseUrl": ".",
+    "paths": {
+      "@/*": ["./src/*"]
+    },
    
    ...
}
```

### vite.config.ts更新

```diff_jsx:vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "tailwindcss";
+ import tsconfigPaths from "vite-tsconfig-paths";

// https://vite.dev/config/
export default defineConfig({
  plugins: [
      react(),
+       tsconfigPaths()
    ],
  css: {
    preprocessorOptions: {
      scss: {
        api: "modern-compiler",
      },
    },
    postcss: {
      plugins: [tailwindcss()],
    },
  },
});

```
[VRChat] 他人から見ると眼鏡が不透明になる問題への対応

VRChat にはシールドレベルによって他のアバターのシェーダーをフォールバックシェーダーに切り替える機能があります。これによって、眼鏡のレンズなどの半透明なオブジェクトが不透明に表示されてしまう場合があります。

シェーダーに lilToon を使っていれば、以下の記事のように GUI からプロパティを設定することでフォールバックシェーダーを設定できます。しかし、眼鏡のレンズは lilToon 以外のシェーダーを使っていることも多そうです[^MetalFrameGlasses][^distributRachel]。

https://tiny-sparklies.com/20240711-2/

そこで、本記事では GUI からフォールバックシェーダーを設定するのに対応していないシェーダーに対してフォールバックシェーダーを設定する方法について解説します。Mai Glass Shader![^MaiGlassShader]をベースに説明しますが、おそらく他のシェーダーにも適用できる内容だと思います。

[^MetalFrameGlasses]: https://booth.pm/ja/items/3750938
[^distributRachel]: https://booth.pm/ja/items/3479462
[^MaiGlassShader]: https://booth.pm/ko/items/2734598

## シェーダーに VRCFallback タグを設定する

公式ドキュメントに記載の通り、シェーダーに `VRCFallback` タグを設定することで、フォールバックシェーダーを設定することができます。

https://creators.vrchat.com/avatars/shader-fallback-system/

Inspector でレンズ部分に当たっているマテリアルを探し、 `Edit...` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104797/e267a0d1-4820-4a9c-7a27-97233c2f2a77.png)

そうすると、エディタが起動してシェーダーの定義部分のソースコードが開かれます。ドキュメントに記載がないのですが、タグを設定する場所は `SubShader` 内です。

```c#
Tags{ "RenderType" = "Opaque"  "Queue" = "Transparent+0" "IsEmissive" = "true" }
```

のような行を探してください（他のシェーダーでは異なるかもしれません）。見つけたら、以下のように変更します。

```c#
Tags{ "RenderType" = "Opaque"  "Queue" = "Transparent+0" "IsEmissive" = "true" "VRCFallback" 
= "Hidden" }
```

ここではフォールバックシェーダーを `Hidden` に設定しているため、うまく設定できていれば眼鏡のレンズが表示されなくなるはずです。変更を保存し、Unity に戻るとコンパイルが走ります。VRChat SDK のコントロールパネルから Build & Publish し、ラジアルメニューの オプション>アバター>フォールバックシェーダー で表示を確認してください。

問題なければ、これで対応完了です。
Qiita Advent Calendarを完走したので振り返ってみる

# はじめに
この記事で25記事（完走）であるため、厳密には完走した後とはいえないんじゃないか、と考える方もいると思いますがそこは目をつぶってください。
はじめにどんな記事を書いてきたのかを振り返り、そこから得られたものなどについて書いていこうと思います。
文字ばかりでつまらない記事になってしまうかもですが、読んでいただけると幸いです。

# 振り返ってみる
どんな記事を書いたのか振り返ってみます。
<dl>
<dt>DDD関連（９記事）
<dd>私は冗談抜きで「アーキテクチャ」の「ア」の字も知らないような状態だったこともあり、自分のような初心者でもわかる言葉で説明するというのを心がけました。

非常にボリューミーな内容なので、当初はこの分野だけで25記事書くつもりでしたが、概念理解の消化不良が続いていき、正直かなりきつい状態だったので挫折してしまいました。記事で触れた分野さえもボロボロだったので丁寧に復習していこうと思います。

まだまだ触れられていない部分も多くあるので、機会があれば再チャレンジしてみようと思います。

<dt>Python、Gemini関連（５記事）
<dd>本当になんとなくですが、生成AIとプログラミングを結びつけて何かしてみたいと思ったので挑戦しました。Pythonを選択したのは、大学の講義などを通して私が一番触ったことのある言語だったからです。
Pythonを扱うにあたって色々なエラーが出るなど問題にも直面したのでそのことについて取り上げた記事もしばしばです。

Gemini APIについては公式の解説を見ながら初歩的なことを行いました。普段はWebページ上の返答が、ターミナルで表示されてすごく新鮮に感じました。

余談ですが、私がよく使うChat GPTのAPIを採用しなかったのは利用に少しお金が必要だったからです。（初期クレジットという名目で利用開始時に５ドル以上支払う必要がありました。）一方のGeminiは無料で利用できてすぐにAPIキーも取得できたので助かりました。ただ、GCSの登録の際にクレジットカードの登録を行ったので、不注意で高額請求をされないよう気をつけようと思います。

最後に、前述しましたが全く踏み込んだ内容には挑戦できなかったので、そこを今後頑張っていこうと思います。

<dt>Go関連（４記事）
<dd>サークル活動でGoを扱うことになったので勉強中心の記事がほとんどでした。以前に一度触ったことはあったので学びなおしという感じでしたが、抜けていた点がほとんどでした。個人的には丁寧に復習することができたと思っているので今後の開発に活かしていこうと思います。

また、Goの利用に伴いリクエストの送信についても触れる必要があったので、「Docker」やVSCodeの拡張機能である「REST Client」を扱いました。「REST Client」はけっこう使い方などを理解したつもりですが、「Docker」についてはサンプルコードやコマンドを全てChat GPTに任せてばっかりだったのでもっとそれについての理解が必要だなと感じました。
Dockerはコマンドからビルドなどするときに処理の状態（レスポンス？）がばーってでてくるのでなんか楽しいです。もっと触って慣れていこうと思います。

<dt>Java関連（２記事）
<dd>大学でPythonについての講義が終わり、次に扱われた（現在勉強中の）言語がJavaです。

大学からの指示に従ったつもりでしたが、インストールするバージョンが違うなどの点で問題が発生したのでコードを記述する前からちょっとだけ嫌いでした。また、pythonよりも制約があり、記述する量も必然的に多くなるので現在も苦しまされています。

ただ、脳死で書いていた「Public void main()...」のところ（「おまじない」として取り上げたところ）の意味を理解したら不思議とJavaのコードを記述する心理的な負担が和らいだような気がします。

いかに課題を早く済ませるか、ということは大切ですが理解していくことも忘れずにしていこうと思います。

<dt>その他（５記事）
<dd>この記事もここに属します。カレンダー１日目に投稿した「GitHub Pages」はカレンダーの存在を知る前に書き始めていたもので、当初は12月前に全体公開にしようと思っていました。

それ以降は、「DDD」の勉強がしんどくなった時の箸休めのような立ち位置で、適当に興味をもったものについて調べたり実践したりして記事にまとめるようになりました。

書こうと思い立ってから比較的すぐに書き終えられたものが多く正直カレンダー完走の隠れキーマンみたいなものです。興味が冷めないうちに書き終えられたので、書いている最中もあまりしんどいと感じることがなく良かったです。

気軽に書いていく姿勢はこれからも大切にしていこうと思います。

</dl>
<strong></strong>

# 得られた成果と変化
始めた当初と比べて、個人的に成長したな、または鍛えられたなと思う点を挙げてみます。
<dl>
<dt>文字を入力するのが早くなった
<dd>私はもともとキーボードでの文字入力のスピードが遅かったです。しかし、記事を書いていると必然的にキーボードと向き合う時間が多くなり、タイピングのスピードが気持ち早くなった気がします。

早くなると大学のレポートにかかる時間を削減できるなど、良い点がいくつもあるのでこれからも鍛えていこうと思います。

<dt>言語化の練習になった
<dd>「〇〇とは何か」という解説記事は当然ですが、「エラー対処」や「使ってみた」などの記事でも状況やサービスについての解説は必須となります。

記事を公開するにあたって、例えを用いたり、超初歩的な内容は省いて冗長になりすぎないようにしたりなどいろいろなことを考えながら記事を書くので言語化の良い練習になったと思います。

<dt>情報のアンテナが大きくなる
<dd>個人的には、これが一番大きいと思います。
特に「Advent Calendar」では、「25記事書かなきゃ」という使命感がうまれます。数少ないテーマで記事数を稼ぐのも可能ですが、私の場合は途中で飽きがきてしまいました。（理解できなかったという理由もありますが）

すると、何か良い題材はないのかと半ば自然にネタ探しをするようになります。
その一環で話題となっている新たな言語やサービスに触れることになるなど、記事を書く前よりも情報のアンテナが大きくなったように感じました。
</dl>

# おわりに
今回の記事では完走の振り返りをしました。期間内に25記事を投稿するのは正直かなりしんどかったですが、これで完走できて本当によかったです。
これからも気が向いたときには記事をかいていこうと思います。

では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。
サンタさんの力でもないと実現しなさそうなアイディアをここに置いておきます

# サンタさん！こういうシステムを作って運用してください！！！！

これは[LabBaseテックカレンダー Advent Calendar 2024](https://qiita.com/advent-calendar/2024/labbase) 21日目の記事です。遅刻です。
株式会社LabBaseの岩井あらため杉山です。


## 前置き
皆さんは引っ越してますか？
私は今年は住所変更が2回、氏名変更が1回ありまして、その最中で考えていたものなのですが、個人でどうこうできる感じではないのでアイディアだけ一旦ここで公開させてください。これを見たどなたかが作ってくださっても嬉しいです。
（マネタイズ不可能と判断したので、公共事業的なことになると思っています）


## 概要
引っ越しをすると、各所に向けて「住所変更」の手続きを行うことになりますが、「誰を相手に手続きをすれば良いか」ということを完全に把握していますか？
もちろん最初は役所へ手続きに行くと思いますが、インフラ、銀行、クレジットカード、保険、通販サイト…　など、挙げていくときりがないといいますか、知人友人親族などを含めると「自分が誰に住所を教えたか」という情報が完全に散逸した状態になっていて、どこにある情報を更新すれば良いかわからないことがわかると思います。そんな状況から「役所で住所変更手続きを済ませれば完了」という感じになってほしいわけです。

システムの流れは以下の図のような感じになります。

### 初回の登録
大抵の方は既に住所を役所が管理しているはずなので、このシステムが運用開始された時点で「住所参照キー」が発行・配布されることを想定しています。
イラストは市役所を使用していますが、自治体を跨いで引っ越すことを考えると、マイナンバーと同じところに管理されているのが筋だと思います。また、最新の住所を参照するためにマイナンバーに紐づいているものとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911987/8d3e32de-9e2d-6c4a-6f61-6a88025a254b.png)

### 誰かに住所を教える
住所を教える代わりに、住所参照キーを教えることにします。これは、住所を教えることと実質的に同じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911987/1d912b92-b4bd-4a99-19b2-5b9821bd4fea.png)


### 住所の参照
キーを提供されている企業や人などが、相手の最新住所へ何かを送ったりしたいときはこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911987/c1f03a87-dedd-f736-545d-d6a948b10b85.png)


### 引越したとき
ここがシンプルになるのがこの仕組みの強みです。誰かに既に教えてある住所参照キーを教え直す必要もありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911987/c5c5a466-068b-4d77-19c8-85530219fd6f.png)

### 緊急時、住所を伏せたい事情などが発生したとき
住民票ロックみたいなことも必要だと思います。無効化や再発行が簡単に行える方が良いと思うので、マイナンバーとは別のキーを発行することを考えています。
また、「この相手には今の住所だけ知らせておけば良く、引っ越した後は知られている必要がない」ような場合は従来通りに住所を登録すれば良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911987/8ce87e91-61f3-fe26-cd6d-199424485f7c.png)


## おわりに
どうでしょうか。
ちなみに、日本人は一生に平均約4回の引っ越しをするそうです。一生を80年とすると1人あたり平均20年に1回引っ越しをすることになります（合ってる？）。
「1人につき20年に1回しか活躍しないシステム」を維持するのはとても大変です。システムの目的上、「20年後にシステムが稼働してなかった」なんてことは絶対に避けたいわけですが、個人でそんなサーバーを維持し続ける自信はありません。企業が運営するサービスとしても、儲からなすぎてやる価値がないでしょう。
国家をあげてこういうのを作ってくれないかなーとサンタさんにお願いするわけです。
SSHでPCからRaspberryPiへデータ送受信

# PCからRaspberryPiにファイルを送りたい
2024/12/23　記

RaspberryPiとWindowsPCでデータの送受信ができると便利です


# SSH接続の有効化
**RaspberryPi側**
applications menu > 設定 > RaspberryPiの設定 > インターフェイス > SSHにチェック

**WindowsPC側**
Windows10以降はデフォルトでOpenSSHクライアントがインストールのため設定不要

# 送信先のIPアドレスを確認
```bash
hostname -I  # raspberrypiは LXterminalにて
ipconfig  # windowspcは windows powershellにて
```
`100.xxx.xxx.xxx`というのがIPアドレス
PC側はIPv4アドレスを参照

# ユーザー名の確認
```bash
whoami # raspberrypiとwindowsどちらも
```
windowsの場合`(PC名)\(ユーザー名)`とでて
raspberrypiの場合は`ユーザー名`とでます

# 送信コマンド   
```bash
# PCからラズパイへ送信する場合
scp (PCパスとファイル) (ラズパイユーザー名)@(ラズパイIPアドレス):(ラズパイ保存パス)
# 例えば
scp C:\Users\~\Desktop\test.py username@100.xxx.x.xx:/home/~/Desktop/
```
    
```bash
# 成功時のメッセージ
test.py                               100% 3184    50.2KB/s   00:00
```
# パスワード入力無しで送受信するとき
公開鍵暗号方式を使います
1. まず初めにPCで次のコマンドを実行してSSHキーを作成
    ```bash
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    ```
    **オプションの説明**
    `-t rsa`： 鍵の種類をRSAに指定（RSAは暗号化や電子署名に広く使われている公開鍵暗号方式の一つで，名前は開発者の3人（Rivest、Shamir、Adleman）の頭文字から取られています）
    
    `-b 4096`： 鍵の長さを4096ビットに設定
    
    `-C "your_email@example.com"`： コメントを追加（省略可）

    **提示される選択肢**
    保存場所の選択： デフォルト`~/.ssh/id_rsa`で問題なければEnterを押す
    
    パスフレーズ： 無記入でEnter（完全にパスワードを省略したい場合）
    これで、`~/.ssh/id_rsa`（秘密鍵）と`~/.ssh/id_rsa.pub`（公開鍵）が生成される
<br> </br>
2. 公開鍵をPaspberryPiに転送
以下をPC上で実行します（IPアドレスはRaspberryPiのものに置き換えます)
    ```bash
    ssh-copy-id username@<RaspberryPiのIPアドレス>
    # 例えば
    ssh-copy-id username@192.xxx.x.xx
    ``` 
    動作
    このコマンドはPCの公開鍵`~/.ssh/id_rsa.pub`を
    Raspberry Piの`~/.ssh/authorized_keys`に追加します
    パスワードを聞かれた場合はRaspberryPiのログインパスワードを入力します
<br></br>
3. sshの接続テスト
    設定後は次のコマンドを実行してパスワードなしで接続できるか確認します

    ```bash
    ssh username@<RaspberryPiのIPアドレス>
    ```
    パスワードなしでログインできれば成功です！

# トラブルシューティング的なもの
ssh-copy-idが使えない場合があります
その場合は手動で公開鍵を転送します

```bash
cat ~/.ssh/id_rsa.pub | ssh username@<RaspberryPiのIPアドレス> 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'
```

```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
私はこれでパスワードレスのSSH接続が使えるようになりました！
[翻訳記事 | AWS初心者] AWSサービスのリージョン、アベイラビリティゾーン、エッジロケーション

# [翻訳記事 | AWS初心者] AWSサービスのリージョン、アベイラビリティゾーン、エッジロケーション

元記事: https://devblogeasyoon.xyz/blog/aws-certification-region


---

# AWSの歴史
1. **AWSの歴史**
   - 2002年、Amazon.comの付属機能として開始
   - 2006年、初のクラウド製品をリリース (S3/EC2 など)
   - 2009年、VPCを発表
   - 2013年、認定資格を導入
   - 2020年、売上5兆3000億円を突破し、成長を続けている

---

# AWSサービスのリージョン、アベイラビリティゾーン、エッジロケーション
2. **AWSサービスのリージョン、アベイラビリティゾーン、エッジロケーション**
   - AWSのサービスは世界各地に複数の地域別リージョンに分かれている。

   - **リージョン (Region)**
     - AWSサービスが提供されるサーバー(データセンター)の物理的な場所であり、それぞれのリージョンには固有のコードが割り当てられている。
     - リージョンごとに利用可能なサービスが異なる場合がある。(例えば、国内で利用できないサービスを使用する場合、リージョンコードを変更してアクセスする必要がある)
     - ソウルリージョンの固有コード : `ap-northeast-2`
     - APリージョンに含まれる国 : 中国、オーストラリア など
     - 米国東部リージョン: `us-east-1` (AWSのすべてのサービスが最初にリリースされる重要なリージョン)

   - **リージョン選択時に考慮すべきポイント**
     - レイテンシー(遅延速度)：自分が属している国のリージョンを使用するのが最も速い
     - 法律：データ提供、サービス提供に関連するポリシー
     - 利用可能なAWSサービス

   - **アベイラビリティゾーン (Availability Zone)**
     - リージョン内の下位単位であり、1つのリージョンには必ず2つ以上のアベイラビリティゾーンが含まれる
     - アベイラビリティゾーンは1つ以上のデータセンターで構成される
     - リージョン間の接続は非常に高速な専用ネットワークで接続されている
     - 災害対策やセキュリティのため、アベイラビリティゾーンは物理的に一定距離以上離れており、かつ互いに100km以内の距離に位置する
     - セキュリティとトラフィック集中を防ぐために、AWSアカウントごとに選択されたアベイラビリティゾーンコード(AZ-A、AZ-B、AZ-Cなど)は、文字コードが同じでも実際に割り当てられるデータセンターの場所が異なる。
       - 例: アカウント`test1`の`AZ-A`(アベイラビリティゾーン-A)とアカウント`test2`の`AZ-A`は異なる場所に割り当てられる(ランダム割り当て)。

   - **リージョンやアベイラビリティゾーンで分類されたAWSサービス**
     - リージョンに依存しないサービス : IAM / Amazon CloudFront
     - リージョンに属するサービス : VPC, S3 (S3はグローバルサービスであるが、データは各リージョンに依存している)
     - リージョン内アベイラビリティゾーンAに属するサービス : RDS
     - リージョン内アベイラビリティゾーンBに属するサービス : EC2

   - **エッジロケーション (Edge Location)**
     - AWSのCloudFront(CDN、一時保存領域)などのサービスを最速で提供するためにキャッシュを保存する拠点
     - 世界中に分散して存在
     - メインリージョンへのトラフィック集中を防ぐことができ、エッジロケーションに近い拠点ほどより高速にサービスを提供可能
     - CDN向けの拠点

   - **グローバルサービスとリージョンサービス**
     - グローバルサービス : データとサービスを世界中のすべてのインフラで共有 (CloudFront, IAM, Route53, WAF)
     - リージョンサービス : 特定リージョンを基盤にデータやサービスを提供 (ほとんどのサービス, S3)

   - **ARN (Amazon Resource Name)**
     - AWSのリソースにはすべてARNが付与される
     - フォーマット:
       ```
       arn:[partition]:[service]:[region]:[account_id]:[resource_type]/resource_name/(qualifier)
       ```
     - 例:
       - `arn:aws:s3:::test_bucket/text.txt`
       - `arn:aws:dynamodb:ap_northeast_02:123456789012:table/*`
     - 上記の例のように末尾にワイルドカード(*)を付けて多数のリソースを指定可能 (例: キャッシュ無効化 `/*`)
Yoctoのインストール方法

### 注意
理解が浅いためドキュメントを引用しつつ読み込みを行いましたが誤っている箇所があるかもしれません。
その点をご理解の上で読んでいただけると幸いです。

## はじめに
あるRenesasのAIボードにおいてYoctoを使ったインストールの箇所がありました。
その際にやや詰まったり背景が理解しきれずコマンドをただ叩く行為になっていました。
そこで情報を整理し、インストールまで何が行われているのかを記述していきます。
この情報が今からYoctoを使ったインストールをされる方のお役に立てば幸いです。

## 環境
ubuntu20.04
wsl2環境
windows11
Renesas RZ/V2L

## Yoctoとは何か？
> The Yocto Project (YP) is an open source collaboration project that helps developers create custom Linux-based systems regardless of the hardware architecture.
The project provides a flexible set of tools and a space where embedded developers worldwide can share technologies, software stacks, configurations, and best practices that can be used to create tailored Linux images for embedded and IOT devices, or anywhere a customized Linux OS is needed.

https://www.yoctoproject.org/

> Yocto Projectとは
組込みシステムには、小フットプリント、制約のある環境下での高いパフォーマンス、信頼性、長期間のサポート、制限されたリソースへの対応が求められます。Yocto Projectは、これらのエッジ特有の課題を検討し、組込みLinuxプラットフォームの標準化を目指して生まれたLinux Foundation傘下のオープンソースプロジェクトです。柔軟なツールセットと開発環境を提供しており、世界中の組込み機器開発者がカスタムメイドのLinuxイメージを作成する際に使用する技術、ソフトウェアスタック、構成、ベストプラクティスを共有し、高い相互運用性を達成しています。ハードウェアベンダーやソフトウェアベンダーのエコシステムも統合されていることから、インテリジェントエッジなどの最新テクノロジーに対するサポートや専門知識も入手可能です。Yocto Projectは誰もが無償で利用可能な、標準の組込みLinuxビルドシステムを提供します。

https://www.windriver.com/japan/products/linux/basic/yocto

かなり乱暴なまとめ方に感じますが１言で表現してみると
Linuxをカスタマイズし組込みシステムに最適化させたビルドシステムのことなのだと解釈しています。

## 作業手順

```
sudo apt install build-essential chrpath cpio debianutils diffstat file gawk gcc git iputils-ping libacl1 liblz4-tool locales python3 python3-git python3-jinja2 python3-pexpect python3-pip python3-subunit socat texinfo unzip wget xz-utils zstd
```

```
git clone git://git.yoctoproject.org/poky
```

まずはcloneでyoctoプロジェクトを入手します

```
cd poky
```

```
git branch -a
```

-aオプションを付けることですべてのブランチを確認できます

```
git checkout -t origin/styhead -b my-styhead
```
ここではstyheadを採用しています

```
git pull
```
pullで必要な情報を取得します

```
cd poky
```

```
source oe-init-build-env
```
ファイルの実行を行います
今回はoe-init-build-envファイルの実行が行われます

https://docs.oracle.com/cd/E19205-01/821-2492/blbfh/index.html

```
bitbake core-image-minimal
```

bitbakeコマンドでlinuxイメージの構築を行います
今回はcore-image-minimalの構築を行います

```
runqemu qemux86-64
```
構築したイメージのエミュレーターの起動コマンドになります
問題がなければ画面が立ち上がりlinuxイメージが動いているのを確認できます

## 補足
```
sudo apt install zstd
```
この操作は状況によりけりですがインストールする必要があります
zstdを利用することでpull後の操作が問題なく進むというケースがありました
ロジックは不明ですが場合によっては利用されてください

## 最後に
誠実な批判や指摘は歓迎します。
ミドルウェアの実装方法メモ

ミドルウェアの実装方法メモ

## Step1：ミドルウェアを作成する
作成コマンド：`$ php artisan make:middleware [ミドルウェアのファイル名]`
よくQiitaなどで使い方の記事を読むとこのようなコマンドで作成しよう！と出ます。
が、私は十中八九他のファイルをコピーして作るので、その場合の作り方を以下にまとめます。

1.ファイルをコピーしてタイトルを変更する 
<img width="305" alt="スクリーンショット 2024-12-20 15.46.25.png (66.8 kB)" src="https://img.esa.io/uploads/production/attachments/21227/2024/12/20/160994/4f3deb80-1780-49cf-81dd-2b67fd87deab.png"><br>
2. ファイル内のクラス名を修正する
<img width="514" alt="スクリーンショット 2024-12-20 15.54.24.png (79.1 kB)" src="https://img.esa.io/uploads/production/attachments/21227/2024/12/20/160994/c4b8e52b-c25f-4a4f-9b4b-18b564b14eea.png"><br>

## Step2：kernel.phpとrouteファイルを修正する
1. kernel.phpにミドルウェアの情報を追加
※今回は特定のルートを通る際にミドルウェアを実行したかったので、`$middlewareAliases`のエリアに記載。
書き方：`'キー名' => [ミドルウェアクラス名]`
<img width="819" alt="スクリーンショット 2024-12-20 15.56.55.png (122.1 kB)" src="https://img.esa.io/uploads/production/attachments/21227/2024/12/20/160994/b266f147-91ad-4040-ade9-9cfdf892f151.png"><br>
2. ミドルウェアを通したいルートにキーを記載する（route/api.php）
隣の`auth:sanctum`とかいうやつは、平たく言うとこいつも認証機能です。
<img width="555" alt="スクリーンショット 2024-12-20 16.07.13.png (43.3 kB)" src="https://img.esa.io/uploads/production/attachments/21227/2024/12/20/160994/e40231e9-3a5c-4908-b311-bd2a25a7eeb6.png"><br>

## Step3：ミドルウェアファイルに処理を記載する
1. ミドルウェアファイルに処理を記載する
処理を記載する位置によって、実行のタイミングが変わります。
<img width="577" alt="スクリーンショット 2024-12-20 16.12.56.png (151.3 kB)" src="https://img.esa.io/uploads/production/attachments/21227/2024/12/20/160994/1f252231-00fb-492f-8d1c-8a055c517f4d.png"><br>
今回はログインパスワードの有効期限を設ける処理を追加します。
`return $next($request);`で一行に省略して記載しています。
<img width="860" alt="スクリーンショット 2024-12-20 16.15.21.png (222.5 kB)" src="https://img.esa.io/uploads/production/attachments/21227/2024/12/20/160994/3bd5e1c6-5d96-423a-bc94-592b9d0cb56b.png">

<br><br>
以上
iPhoneのショートカット機能２選

こんばんは、かーでぃです。
自分のnoteに書いた記事の紹介です。

iPhoneについてるショートカット機能、使ってますか？
スマホ操作にまつわる、ちょっと面倒なことを自動化してくれるツールなのですが、あまりネットに情報がなくて、知ってるけど使ってない、って人が多いのでは？

自分もそんな一人だったのですが、こんな機能を実装したので、ご紹介だけ。

## 名刺画像を背面タップで簡単呼び出し

プレーリーカードや<a href="https://lit.link/Kerdy" tartget="_blank">lit.link</a>カード等、NFC対応の電子名刺がちょくちょく出始めてますね。そんな自分もlit.linkカードは持っているのですが、読み取り位置の問題とかあって、なかなか読み取ってくれなかったり、咄嗟に出てこなかったり。

そんな時のために、lit.linkへのリンクをQRコード化して、名前と顔写真を入れた写真を、背面タップで簡単に呼び出せるようにした機能です。

https://note.com/kerdy/n/nb17322214973


## 写真をJPEGに変換しつつ、パソコンにコピー

<a href="https://www.photo-ac.com/profile/26752003" target="_blank">PhotoAC</a>に登録したこともあり、iPhoneで写真を撮ることが増えたのですが、パソコンに写真をコピーするのが結構面倒なんですよね。画像もJPEGじゃないし。

そんな面倒を一気に解決してくれるショートカットです。

https://note.com/kerdy/n/nce1ff7052ac4

--
よかったら、使ってやってください。
Add-Migrationのスタートアッププロジェクトをクラスライブラリにするとエラーになる

# はじめに
今まではWindowsフォームアプリのプロジェクトにDbContextとエンティティ、Migrationフォルダを置いていたのですが、別のプロジェクトでも使うしクラスライブラリプロジェクトを作ってそっちに置いた方がいいのかな？と思って移動しました。
`Add-Migration`しました。
エラーが出ました。
なんでやorz
# 環境
・VisualStudio 2022 Comunnity 17.12.3
・Windowsフォームアプリ(.NET8.0)
・Windowsフォームクラスライブラリ
# 原因分析
エラーメッセージはこんな感じです:
```Console:パッケージマネージャーコンソール
Unable to create a 'DbContext' of type 'MyContext'. 
The exception 'Object reference not set to an instance of an object.' was thrown while attempting to create an instance. 
For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
```
`-Verbose`でログを詳しく見てみると、
```Console:パッケージマネージャーコンソール
Finding application service provider in assembly 'POSレジライブラリ'... 
Finding Microsoft.Extensions.Hosting service provider... 
No static method 'CreateHostBuilder(string[])' was found on class 'Program'. 
No application service provider was found. 
```
こんな風にあります。
EFCoreは`Add-Migration`するときに`CreateHostBuilder`メソッドを呼び出すらしいのですが、それがなかったみたいです。
なら、winformsのプロジェクトで動いたのはなんでだろう？と思って`-Verbose`で見てみました。
```Console:パッケージマネージャーコンソール
Microsoft.EntityFrameworkCore.Design.Internal.AppServiceProviderFactory.CreateFromHosting(String[] args) An error occurred while accessing the Microsoft.Extensions.Hosting services. 
Continuing without the application service provider. 
Error: The entry point exited without ever building an IHost. 
No application service provider was found.
Using context 'MyContext'. 
Finding design-time services referenced by assembly 'POSレジ会計'... 
```
こちらもアプリケーションサービスプロバイダーを探している途中にエラーが発生していますが、そのまま次のステップに進んでいます。
GitHub Copilotに聞いてみると、`CreateHostBuilder`メソッドはASP.NETのホスティング環境を構築するのに使われるのに対して、winformsはデスクトップで作動するため`CreateHostBulider`メソッドは適していない、とのことらしいです。
そして、winformsでは`Application.Run`でフォームを起動する、と言っていました。
あまりよくわかっていませんが、ASP.NETでは`Program`クラスの`CreateHostBuilder`メソッドを呼ぶ必要があるがwinformsではエントリーポイントから起動できるよ、みたいな感じでしょうか。
# 解決策
どうしてもクラスライブラリプロジェクトをスタートアッププロジェクトにしたいのであれば、`Program`クラスと`CreateHostBuilder`メソッドを追加すれば出来そうです。
私の場合はクラスライブラリにする必要性は薄かったのでwinformsプロジェクトをスタートアッププロジェクトにしました。
# 参考リンク
https://learn.microsoft.com/ja-jp/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli

https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-9.0
# 追記(2024.12.26)
やっぱりモデルクラスはクラスライブラリプロジェクトにあったほうが便利だなーと思って`CreateHostBulider`メソッドを書かないまま`Add-Migration`を試したらなんか行けました。なんで…？
相変わらずこの文は出てたんですが、winformsプロジェクトでやった時と同じようにそのまま進んでました。
```Console:パッケージマネージャーコンソール
No static method 'CreateHostBuilder(string[])' was found on class 'Program'.
No application service provider was found.
Using context 'MyContext'.
Finding design-time services referenced by assembly 'POSレジライブラリ'...
Finding design-time services referenced by assembly 'POSレジライブラリ'...
No referenced design-time services were found.
```
WASはWindowsサービスでは実行中になっていても、裏で落ちていることがあるんだって。

■本記事について

みなさんの会社ではIBM WebSphere Application Server(以下、WAS)を使われてますか？
おそらく大半の人が使っていると答えるのではないでしょうか。

多くの企業で使われるWASについて、
初心者が転びがちな(というか私が転んだ)点を記載して
備忘録として残せれば、と思い本記事を執筆しました。
<br><br><br>
■転びポイント①「WASはWindowsサービスで起動中でも裏で落ちていることがある」

Windowsサービス画面で「IBM WebSphere Application Server V8.5 - 環境名　起動中」となっていても
実際は裏で落ちていることがあります。

対策としては、IBM管理コンソールを開いて停止すれば解決します。
Windowsサービス上とIBM管理コンソール上で停止していることを確認し、
Windowsサービスから起動すれば正常に起動します。
<br><br><br>
■転びポイント②「WASが制御不能となりWindowsサービスから操作できなくなった」
　※注意※制御不能となったWASサービスをOSから強引に落とす方法です。
<br>
●ND版
①「IBM WebSphere Application Server V8.5 - nodeagent」を落とす。
②「Systemout.log※」を参照し、pidを確認する。
　pidは1行目末尾の数字です。必ず最新のpidを確認。
　【例】
　************ Start Display Current Environment ************
　WebSphere Platform 7.0.0.29 [ND 7.0.0.29 cf291321.01] running with process name ANS01897Cell01\ANS01897Node01\cjk_nsk06 and process id 1234　←pid
　※例：D:\IBM\WebSphere85\AppServer\profiles\AppSrv01\logs\nodeagent
③プロセス停止。
　Windowsタスクマネージャー→詳細を開く。
　②のpidを使っているjava.exeが存在するので、「プロセスの終了」を押下。
　(この場合は「1234」を持っているjava.exeを落とす。)
④pidファイル削除
　D:\IBM\WebSphere85\AppServer\profiles\AppSrv01\logs\[環境名]\[環境名].pidを削除。
⑤「IBM WebSphere Application Server V8.5 - nodeagent」を起動。
⑥「IBM WebSphere Application Server V8.5 - 環境名」を起動。
<br>
●BASE版
①「Systemout.log※」を参照し、pidを確認する。
　pidは1行目末尾の数字です。必ず最新のpidを確認。
　【例】
　************ Start Display Current Environment ************
　WebSphere Platform 7.0.0.29 [ND 7.0.0.29 cf291321.01] running with process name ANS01897Cell01\ANS01897Node01\cjk_nsk06 and process id XXXX　←pid
　※例：D:\IBM\WebSphere85\AppServer\profiles\AppSrv01\logs\nodeagent
②プロセス停止。
　Windowsタスクマネージャー→詳細を開く。
　①のpidを使っているjava.exeが存在するので、「プロセスの終了」を押下。
③pidファイル削除
　D:\IBM\WebSphere85\AppServer\profiles\AppSrv01\logs\[環境名]\[環境名].pidを削除。
④「IBM WebSphere Application Server V8.5 - 環境名」を起動。
<br><br><br>
■転びポイント③「OOM(Out Of Memory)が発生したっぽい」
・OOM(Out Of Memory)が発生していると判断するには
　D:\IBM\Websphere85\AppSrv\profiles\AppSrv01\logs\[環境名]\　配下に
　下記ファイルが出力されているか確認。存在すればOOM発生していると判断できる。
　　heapdump.yyyymmdd.XXXXX.phd
　　javacore.yyyymmdd.XXXXX.txt
またsystemOut.log、SystemErr.log、native_stderr.logのいずれかのログに
該当時間に"OutOfMemory"というエラーが出力されますので
そちら確認することでも可能です。
<br>
OOMはサービス再起動で解決することが多い。
発生していたらサービス再起動で解消するか確認する。
<br><br><br>
■WAS管理コンソールを使う時の注意
①管理コンソールを開くときはWASサービス(※dmgr/nodeagent以外)を落とす
②管理コンソールが起動しないときはdmgr/nodeagentが落ちていないか確認する
<br>
■終わりに
この記事が誰かの役に立てば幸いです。
文責はすべて私に帰すので、誤りがありましたらご指摘ください。