OmniAICreator/Qiita-1.07M huggingface dataset:
初心者が基礎から学ぶKotlin var と val

## var とval の読み方と略称
### var
読み方：バー
「variable」（変数）の略称

### val
読み方：ヴァル
「value」（値）の略称


## 説明
### 共通点
両者はどちらも変数です。
変数には"型"があり、"型"によって入れていいものとダメなものが決まります。
<br>
例えばInt型は整数しか入れることができず、String型は文字列しか入れることができません。入れる値によって型を使い分ける必要があるわけです。

```kotlin
Int i = 1
String str = "A"
```

しかしvarとvalは使い分ける必要がありません。代入する値を見て、「この値はこの型だ！」と判断してくれます。

```kotlin
var i = 1
var str = "A"

val i = 1
val str = "A"
```
### 相違点

varは再代入ができますがvalはできません。
<br>
例えばvarは"A"を代入後、"B"を再代入することができます。
```kotlin
var str = "A"
str = "B"
```
しかしvalはこれができません。"A"を入れてしまった以上、値は"A"のままにしなければなりません。
<br>
再代入不可という縛りは誤って再代入させないなどのメリットがあります。基本的にはvalを使い、必要に応じてvarを使うといいでしょう。
ARC180回答メモ

# 0.はじめに
　土曜日がARCと珍しい感じ。1問も正解できず
　レート落ちする恐れもありましたが、まぁ
　今更気にしてもしょうがないので参戦。
　なんとか1問正解でき、レートも微増となりました。


# 1.A - ABA and BAB
　愚直に解いていくとTLEまっしぐらな問題であることは
　わかるものの、最初はどうしていいかわかりませんでした。
　
　まぁ2時間使うつもりでとりあえずTLE覚悟の愚直な
　方法で実装
【考え方】
　1.1回置換の操作を行うと、文字列の長さが2個減る
　2.N=10の時、文字列の長さ毎のパターンは以下の5種
　　1)N=10、2)N=8、3)N=6、4)N=4、5)N=2
　3.まず、N=10の文字列をリストL(set)に格納
　～以下Lがなくなるまで繰り返し
　　4.Lから、一つずつ文字列を取り出し取り出すたびにansに1加算
　　5.取り出した文字列を先頭から見ていき
　　　ABAかBABが出てきたら、置換した文字列を
　　　リストNL(set)に格納していく
　　6.Lがなくなったら、LをNLで置き換え
　7.ansを出力して終了
　
　上記考え方で、例題3までは解けましたが、4は案の定TLE
　
　例題3を上記考え方に通していい感じで解けないかを検討し
　　1)AとBが連続している部分は置換の対象にはならない
　　2)ABABA・・・とかBABA・・・とAとBが交互に連続している部分は
　　　最終的に同じ型に帰結する＆最終型までのパターン数は一定
　ということに気づきました。
　さらに2)について最終型までのパターン数は
　AとBが交互に出てきた数を2で割って1を足すことで計算可能と判明
　　例）
　　　ABA　→Aに対してB・Aと2回、交互出てきたとカウントして2//2+1の2パターン
　　　（ABA、A）が発生
　　　ABABA →Aに対して4回、交互出てきたとカウントして4//2+1の3パターン
　　　（ABABA、ABA、A）が発生
　
　上記をもとに考え、AとBが交互に出てくるパート毎のパターン数を
　掛け合わせれば、答えが出ると気づきました。
　　例題3をもとにすると)
　　xの部分は返還の対象とならない部分として
　　1～3のパートに分かれる
　　x11111122222xx333
　　BBABABAABABAAAABA
　　1・2の部分は3パターンずつ、3の部分は2パターンが
　　発生するので、掛け合わせて、答えは18パターン

　上記までの考察をもとに以下の実装

【実装】
　1.NとSを入力
　2.以下の変数を初期化
　　MOD(回答のMOD算出に使用)　　　 初期値：10の9乗足す7
　　cnt(ABが連続する数をカウント)　初期値：0
　　pre(S参照時の前の文字)　　　 　初期値：""(空)
　　L(ABが連続する部分のパターン数)初期値：[](空)
　3.文字列Sを添え字iで先頭から参照していく
　 -1.preが空の時、preにS[i]をセット
　 -2.preが"A"かつ、S[i]が"B"の時
　 　・cntに1を加算し、preにS[i]をセット
　 -3.preが"B"かつ、S[i]が"A"の時
　 　・cntに1を加算し、preにS[i]をセット
　 -4.-1～-3以外の時(preとS[i]が同じとき)
　 　・cntが2以上の時、Lにcnt//2+1を追加
　 　・cntに0をセットして、preにS[i]をセット
　4.cntが2以上の時、Lにcnt//2+1を追加(ABの繰り返しのままSが終わったときの措置)
　5.ansに1をセット
　6.Lを先頭から読み込み、ansに乗算していく
　7.ans％MODを出力
　
　例題4が正解だったのでまぁ行けるかなと提出してAC頂けました。

　https://atcoder.jp/contests/arc180/submissions/55020785


以上
Databricksワークフローでシンプルにスケジュールを設定できるようになりました

こちらのアップデートです。

[**Quickly add a periodic schedule to a Databricks workflow**](https://docs.databricks.com/en/release-notes/product/2024/june.html#quickly-add-a-periodic-schedule-to-a-databricks-workflow)

> 間隔と単位(4時間ごとにワークフローを実行など)のみを指定することで、Databricksワークフローのシンプルなスケジュールを追加できるようになりました。この新たなスケジュールタイプは、数クリックでスケジュールを提供できるようにすることで、既存の高度なスケジュールを補完するものとなります。[スケジュールに従って、または継続的にジョブを実行する](https://docs.databricks.com/ja/workflows/jobs/schedule-jobs.html)をご覧ください。

と言うことで設定してみます。**ジョブ**にアクセスして、ジョブを作成します。右側の**スケジュールとトリガー**にある**トリガーを追加**をクリックします。
![Screenshot 2024-06-30 at 9.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/432e475c-abde-54bc-2993-7b3f170077bb.png)

トリガータイプで**スケジュール済み**を選択すると、**スケジュールのタイプ**で**Simple**と**Advanced**を選べるようになっています。
![Screenshot 2024-06-30 at 9.09.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/099990ac-ae45-a9a4-fb81-bcbcf10b539d.png)

これで、1時間周期で実行したいジョブなどをクイックに設定できます。
![Screenshot 2024-06-30 at 9.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/feffe7de-bd2f-279c-c44a-24a367845193.png)
![Screenshot 2024-06-30 at 9.10.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1b5d4a7c-7a66-cee0-424d-19b4c68e5b1a.png)

時刻を指定したい場合には従来の**Advanced**を使う形になります。
![Screenshot 2024-06-30 at 9.13.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/33a14794-be9b-d833-9ed8-46ec72424f39.png)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
OpenAPIのフォーマットメモ


ユーザー管理のAPIを例として、ユーザーの一覧取得、ユーザーの作成、ユーザーの詳細取得の3つのエンドポイントを定義した場合のサンプル！

pathsで各エンドポイントのHTTPメソッド、リクエストパラメーター、レスポンスの定義を行い、components/schemasセクションでは、リクエストやレスポンスで使用するデータモデルを定義す。

```
openapi: 3.0.0
info:
  title: Sample API
  version: 1.0.0
  description: This is a sample API built with OpenAPI specification.

servers:
  - url: https://api.example.com/v1

paths:
  /users:
    get:
      summary: List users
      responses:
        '200':
          description: Successful response
          content:
            application/json:    
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
    post:
      summary: Create a user
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewUser'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
                
  /users/{userId}:
    get:
      summary: Get a user
      parameters:
        - in: path
          name: userId
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
                
components:
  schemas:
  
    User:
      type: object
      properties:
        id: 
          type: integer
        name:
          type: string
        email:
          type: string
          
    NewUser:
      type: object
      required:
        - name
        - email
      properties:
        name:
          type: string
        email:
          type: string
```
OpenAPIについて

# OpenAPIとは

OpenAPIは、APIの仕様の定義を記述するためのフォーマット。
OpenAPIは以前はSwaggerと呼ばれていたが、現在はSwaggerがOpenAPIを使用するツールを指す言葉として使われている。

## OpenAPIの主な特徴

- APIの設計、構築、ドキュメント化、テストを支援する
- RESTful APIの仕様記述と公開の標準フォーマットとして広く使われている
- APIの仕様を機械可読な形式で記述できるため、自動生成やテストの実行などが可能
- APIの仕様管理が容易になり、開発の効率化が期待できる

## OpenAPIの活用例

- API仕様書の自動生成
- モックサーバーの構築
- APIのテスト自動化
- クライアントSDKの自動生成

## あとで読む
- OpenAPIの概要と活用方法
    - https://www.aeyescan.jp/blog/openapi/
- OpenAPIの基本と使い方
    - https://qiita.com/shino365/items/80a50d6f1a6241ce52fa
- OpenAPIの仕様と特徴
    - https://apidog.com/jp/blog/what-is-openapi/
ApacheとGitフックで構築するRaspberry Piの自動デプロイ環境

# 背景
アルバイト先で簡易的なWebサーバーをローカルネット内でGitを使って更新したかったので、sshでアクセスできるリモートリポジトリを作成し、そのリポジトリの内容をGitフックを用いて更新しWebサーバーとして公開する機能を実装しました。

# 開発環境
- Raspberry Pi 4B 4GB (Raspberry Pi OS)
- Apatch2
- Git

# 手順
## 1. Apacheサーバーのセットアップ
サーバー側で以下コマンドでApacheサーバーのインストールを行いました。
```shell
sudo apt update
sudo apt install apache2
```
インストール後にブラウザで`http://<hostname>.local/`にアクセスし、Apacheサーバーが起動していることを確認しました。

## 2. Gitリポジトリのセットアップ
サーバー側にGitをインストールし、リモートリポジトリを作成しました。
リモートリポジトリの名前は`repo.git`とし、ホームディレクトリの下に配置しました。
```shell
sudo apt install git
cd ~
mkdir repo.git 
cd repo.git 
git init --bare
```

## 3. `post-receive`フックの設定
リポジトリに`post-receive`フックを設定しました。これにより、リポジトリに新しいコミットがプッシュされたときにApatchサーバーの情報が更新されるようになります。
```shell
cd ~/repo.git/hooks 
emacs post-receive
```
以下のスクリプトを`post-receive`ファイルに記述しました。
```shell
#!/bin/sh 
echo "Running post-receive hook" >> /tmp/post-receive.log 
GIT_WORK_TREE=/var/www/html git checkout -f main >> /tmp/post-receive.log 2>&1 
echo "Finished post-receive hook" >> /tmp/post-receive.log
```
スクリプトに実行権限を与えます。
```shell
chmod +x post-receive
```

## 4. リモートリポジトリをローカルリポジトリに追加
ローカルマシンのリポジトリにサーバーのリモートリポジトリを追加しました。
```shell
# ローカルリポジトリ内に移動
git remote add origin pi@<hostname>.local:~/repo.git
```

## 5. pushの実行
ローカルリポジトリからリモートリポジトリにpushを行う。
```shell
git push origin main
```

## 6. Webサーバーが更新されているか確認する
`http://<hostname>.local/`にアクセスし、pushした内容がWebサーバーに反映されていることを確認しました。

# まとめ
サーバー側にGitのリモートリポジトリを用意して、Webサーバーのコンテンツを自動更新する仕組みが構築できました。これにより、ウェブサイトのコンテンツが簡単に管理できるようになり、変更も即座に反映することができるようになりました。

# 参考サイト
[Git - サーバー用の Git の取得](https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%94%A8%E3%81%AE-Git-%E3%81%AE%E5%8F%96%E5%BE%97)
[Git - Git フック](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)
TypeScriptとJavaScriptの違い


# TypeScriptとJavaScriptの違い

## JavaScript

- **概要**:
  - JavaScriptは、Webページに動的な機能を追加するためのクライアントサイドスクリプト言語である。
  - 1995年にNetscapeによって開発され、現在はほとんどのブラウザで標準的にサポートされている。

- **特徴**:
  - **動的型付け**: 変数の型は実行時に決定されるため、型の宣言が必要ない。
  - **インタプリタ言語**: コードはブラウザやランタイム環境で逐次実行される。
  - **広範なサポート**: ほぼすべてのモダンなWebブラウザでサポートされている。
  - **シンプルな構文**: 学びやすく、初心者にも扱いやすい。

## TypeScript

- **概要**:
  - TypeScriptは、JavaScriptに型の概念を追加したオープンソースのプログラミング言語である。
  - Microsoftによって開発され、2012年に公開された。

- **特徴**:
  - **静的型付け**: 変数の型を明示的に宣言できるため、コンパイル時に型の不一致を検出できる。
  - **トランスパイル**: TypeScriptコードはJavaScriptに変換（トランスパイル）され、ブラウザやNode.js環境で実行される。
  - **最新のJavaScript機能**: TypeScriptは、JavaScriptの最新の機能（ES6以降）をサポートしている。
  - **IDEサポート**: 型情報を利用して、コード補完やリファクタリング、エラーチェックなどが強力にサポートされている。

## 主要な違い

1. **型システム**:
   - JavaScript: 動的型付け。型の宣言がなく、実行時に型が決定される。
   - TypeScript: 静的型付け。型の宣言が可能で、コンパイル時に型チェックが行われる。

2. **コンパイル**:
   - JavaScript: 直接実行されるスクリプト言語。
   - TypeScript: JavaScriptにトランスパイルされてから実行される言語。

3. **エラーチェック**:
   - JavaScript: 実行時にエラーが発生する可能性が高い。
   - TypeScript: コンパイル時に多くのエラーが検出され、実行前に修正できる。

4. **開発ツールのサポート**:
   - JavaScript: 基本的なコード補完やデバッグサポート。
   - TypeScript: 型情報を利用した強力なコード補完、リファクタリング、デバッグサポート。

## 選択のポイント

- **JavaScriptを選ぶ場合**:
  - 小規模なプロジェクトやシンプルなスクリプトを迅速に開発したい場合。
  - 動的型付けの柔軟性が必要な場合。

- **TypeScriptを選ぶ場合**:
  - 大規模なプロジェクトや長期間にわたるメンテナンスが必要なプロジェクト。
  - 静的型付けによる早期のバグ検出と開発効率の向上を目指す場合。
  - 複数人でのチーム開発や大規模なコードベースでの作業。

TypeScriptは、JavaScriptの拡張言語として設計されており、既存のJavaScriptコードベースに導入しやすく、段階的に移行することも可能である。これにより、TypeScriptの利点を活用しつつ、JavaScriptの柔軟性を保持できる。
Ubuntu23.10にNsCDE 2.3インストールマニュアル

Ubuntuに当時のUNIXデザインを味わえるウィンドウマネージャNsCDEのインストールを解説します。
Motifウィンドウが蘇ります。

# NsCDEをインストール
## 1.FirefoxでURLを開く
すでにUbuntuがインストールされている前提で解説します。

https://github.com/NsCDE/NsCDE/releases
ページの少し下にある nscde_2.3-3_amd64.deb を右クリックしてダウンロードします。このファイルは"ダウンロード"ディレクトリに保存されます。

## 2.端末を開く
ターミナルを開き、以下のコマンドを実行して依存関係をインストールします。
sudo apt update

sudo apt install build-essential git xorg-dev x11-utils x11-xserver-utils xterm libx11-dev libxft-dev libxinerama-dev libxpm-dev libxaw7-dev libjpeg-dev libpng-dev libtiff-dev libxt-dev autoconf automake

## 3."ダウンロード"ディレクトリに移動する
ダウンロードした nscde_2.3-3_amd64.deb ファイルが保存されたディレクトリに移動します。

cd ~/ダウンロード

## 4.NsCDE パッケージをインストールする
ダウンロードした nscde_2.3-3_amd64.deb ファイルをインストールします。
sudo dpkg -i nscde_2.3-3_amd64.deb

## 5.「処理中にエラーが発生しました」と表示されるが次のコマンドで修正します
sudo apt --fix-broken install

## 6.xscreensaverインストール
sudo apt install xscreensaver

## 7.パスの追加
echo 'export PATH=$PATH:/usr/bin' >> ~/.bashrc
source ~/.bashrc
touch ~/.xsettingsd

## 8.設定ファイルの作成
設定ファイル .xsettingsd を作成しテーマの設定を行います。
echo 'Net/ThemeName "YourThemeName"' >> ~/.xsettingsd

## 9.再起動
システムを再起動します。ドックのEXITボタンをクリックします。
再起動後、パスワード入力画面で画面右下の歯車からNsCDEを選択します。
パスワードを入力しログインします。

## 10.NsCDE初期設定画面表示
初期設定開始します。
メッセージ：Press RETURN to run setup → エンターキー

文章の末尾が[y]または[n]の質問が続きます。全てyでエンターキーを押します。
ただし、最後の2つは下記を入力します。

Your favorite X File Manager(command)? []
pcmanfm と入力

Your favorite X Text Editor(command)? []
nano と入力

Press RETURN to ... と表示されたらエンターキーを押します。

NsCDEがインストール完了しました。

## 11.日本語入力
画面右下の□の文字をクリック。
「日本語-Mozc」を選択。
キーボードの「半角/全角」キーで入力可能です。

## 12.ファイルマネージャpcmanfmをインストール
NsCDE起動後に端末を開きます ドックのパソコンアイコンです。
sudo apt install pcmanfm

再起動します。下のドックのexitをクリックします。
Operating System: rebootを選択しConfirm
再起動したらドックのファイラーアイコンクリックでウィンドウマネージャー開きます。

# ---以降は必要であれば追加してください。---

## 13.print screenキー有効化
sudo apt install xclip

## 14.画像ソフトインストール
sudo apt install gimp
ファイラー → 左の「アプリケーション」→グラフィックス→GIMPがあります。

## 15.ブラウザ
ドック左の時計アイコンクリックでFirefoxが開きます。
または 時計アイコン上の▲クリック → WebBrowserをクリックします。

以上です。
【C#】単体テストプロジェクトの作成バージョン誤りによりテスト対象が認識されなかった話

# 【C#】単体テストプロジェクトの.NETバージョン誤りによりテスト対象が認識されなかった話

皆さんこんにちは！
今回は自分がコーディング中にハマった小ネタについて紹介します。
めちゃくちゃ短いです最後までお付き合いください。

実際の業務では単体テストプロジェクトを新規作成することはあまりないかもしれませんが、誰かの助けになれば幸いです。

## 環境

- Windows11
- Visual Studio 2022

## 結論

タイトルにもありますが作成したプロジェクトの.NETのバージョンと単体テストプロジェクトのバージョンに乖離があり依存関係を設定しても対象クラスを認識してくれませんでした。

単体テストのバージョンはテストプロジェクトを選択すると表示されるXMLファイルの中で確認することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/f69f40bf-b971-11c0-d5d4-98f7538fbc99.png" width="60%">


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/02023691-cd8b-c762-a1dd-1a2d7b97da42.png" width="90%">

こちらがテスト対象のプロジェクトのバージョンが「net8.0」に対してMSTestプロジェクトが「net7.0」になっていました。プロジェクトを作成しなおしたところうまく認識されるようになりました。

このプロジェクトは新規プロジェクト作成から作成したのですがその際に設定を誤ったようです。

## 最後に

今回は自分が直面した作成したテストプロジェクトでテスト対象が認識されなかったときの原因をご紹介しました。うっかりミスが原因でしたが、こういうのに限って気づくのに時間がかかるものなのでしっかり注意したいです。。。！

この記事で皆様のコーディングライフの助けになれれば幸いです！
ではまた次の記事で！！
【CSS】リセットCSS

# 最新のリセットCSSの種類と特徴

## 1. Normalize.css

- **特徴**:
  - デフォルトのスタイルをすべてリセットするのではなく、ブラウザ間の一貫性を保つためにスタイルを調整する。
  - デフォルトのスタイルを最大限に尊重し、必要な部分だけを修正。
  - モジュール化されており、必要な部分だけをインポートすることができる。

## 2. Reset.css (Eric Meyer’s Reset CSS)

- **特徴**:
  - より徹底的にスタイルをリセットする。
  - すべてのデフォルトのマージン、パディング、フォントサイズなどを初期化。
  - 短くシンプルで、すべてのHTML要素に対して一律にスタイルを適用する。
  - 完全に一からスタイルを構築したい場合に適している。

## 3. Sanitize.css

- **特徴**:
  - Normalize.cssとReset.cssの中間的なアプローチ。
  - 一部のデフォルトスタイルをリセットし、他の部分はNormalize.cssのように調整する。
  - より近代的なウェブ標準に準拠し、セキュリティやアクセシビリティの考慮も含まれる。
  - 安全かつ一貫性のあるスタイルを保ちつつ、モダンなウェブ標準に準拠したい場合に適している。

## 4. Reboot.css (Bootstrap Reboot)

- **特徴**:
  - Bootstrapフレームワークの一部として提供されるリセットスタイルシート。
  - デフォルトのブラウザスタイルを調整しつつ、Bootstrapのデザインシステムと統合されている。
  - Typographyやフォームのスタイルなど、一般的な要素に対する追加のスタイルも含まれる。
  - Bootstrapを使用するプロジェクトで、デフォルトスタイルを整えるために使用される。

## 5. Modern Normalize

- **特徴**:
  - Normalize.cssをベースにしつつ、モダンブラウザ向けに最適化されている。
  - 古いブラウザのサポートを削除し、最新のブラウザに焦点を当てている。
  - 余計なスタイルを排除し、軽量化されている。
  - 最新のブラウザのみをターゲットにしたプロジェクトに適している。
【Laravel】routingはグループでまとめる


例えばuser系のルーティングを設定する時。

```
Route::get('/user/', [UserController::class, 'index'])->name('user.index');
Route::get('/user/{user_name}', [UserController::class, 'show'])->name('user.show');
Route::get('/user/{user_name}/edit/', [UserController::class, 'edit'])->name('user.edit')->middleware('auth');
Route::post('/user/store/', [UserController::class, 'store'])->name('user.store');
Route::post('/user/destroy/{id}', [UserController::class, 'destroy'])->name('user.destroy');
Route::patch('/user/{id}/edit/', [UserController::class, 'update'])->name('user.update');
```

下記のようにまとめる！

```
Route::prefix('user')
    ->namespace('user')
    ->group(function () {
        Route::get('/', [UserController::class, 'index'])->name('user.index');
        Route::get('/{user_name}', [UserController::class, 'show'])->name('user.show');
        Route::get('/{user_name}/edit/', [UserController::class, 'edit'])->name('user.edit')->middleware('auth');
        Route::post('/store/', [UserController::class, 'store'])->name('user.store');
        Route::post('/destroy/{id}', [UserController::class, 'destroy'])->name('user.destroy');
        Route::patch('/{id}/edit/', [UserController::class, 'update'])->name('user.update');
});
```
【Laravel】scssを導入したらやること


まずSASSをインストール
```
npm i sass -D
```

resourcesディレクトリにSCSS/app.scssを作成。
```
resources
    └ css
    └ img
    └ sass
    └ scss
        └ app.scss
```

headのviteにapp.scssを追加

```
<head>
~
@vite([
    'resources/scss/app.scss'
])
~
</head>
```


vite.config.jsにも追加。
これをしないとビルドした時にビルド対象にならない。

```
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            input: [
                'resources/sass/app.scss',
                'resources/scss/app.scss',
                'resources/js/app.js',
            ],
            refresh: true,
        }),
    ],
});
```
【CSS】背景ドットのつくりかた


background-imageでradial-gradientを指定。
「$color」にドットの色を指定する。
各％とbackground-sizeでドットのサイズと間隔を調整する。

```
    background-image: radial-gradient($color 10%, transparent 10%);
    background-size: 15px 15px;
```
RSS リーダーを使いたい

RSS リーダーを使いたいという思いつきがあって、試したので現時点での情報共有。

RSS リーダーを勧める記事は今でもあるが、下のようにスマホとの連携を重視している記事が多い。
自分はスマホアプリの RSS リーダーを昔使ってたことあるが、通知がうるさく感じて見なくなった経験あるため、PC から使うものとする。

[2024年の今こそ使ってほしい「RSSリーダー」。基礎知識＆最新おすすめリーダー・一挙紹介 | ライフハッカー・ジャパン]( https://www.lifehacker.jp/article/2402-the-best-rss-reader-apps-in-2024/)

## 思うこと

- 配信するところが減っている
- サーバー維持が面倒
- 飽きたときの撤収コストを低くする
- **最近 Emacs を始めたので使いたい**

## 評価基準

- 求めること
  - Must
    - 軽い
    - 手軽
      - 申込みとかしたくない
      - サーバーとか建てたくない
      - 自動でダウンロードしてほしい
      - やめたくなったら即やめられる
  - Good
    - 全文検索
    - JSON feed 対応
    - 画像使用可能

- 考えないこと
  - スマホ対応
    - PC で使うものとする  
  - 金で解決
    - VPS
    - 引き落としは無視して撤収する気が起きるのを待つ

## 候補
  - [skeeto/elfeed: An Emacs web feeds client](https://github.com/skeeto/elfeed)
    - Emacs のパッケージ
    - 画像がそのまま見える
    - 全文検索機能はない
  - [Newsboat, an RSS reader](https://newsboat.org/index.html)
    - 画像を見るにはブラウザを開く必要がある
    - 全文検索機能を持つ
  - [fastladder/fastladder: Fastladder Open Source \[Forked\]](https://github.com/fastladder/fastladder)
    - 年始にアップデートが入り Docker 一発で導入できるようになった
    - 画像がそのまま見える

以上の候補から

- Emacs を使いたかった
- やめやすい
    - パッケージをアンインストールするだけ

という点から elfeed にした。

## コード

上記記事のアプリやサーバーを建てるソリューションは自動でフィードを集めてくれる点で優れている。
elfeed で同様な使用感を得るために Emacs を起動する度に自動でフィードを集めるようにした。
ことある事にエディタを開くクセがあるのでこのようにしたが、普通の人は Newsboat を使って cron で自動化することをお勧めする。

```init.el
(defun auto-elfeed-update ()
  "Run custom setup commands."
  ;; Run elfeed-update
  (elfeed-update)
  )

(add-hook 'emacs-startup-hook #'auto-elfeed-update)
```

## 現時点での雑感

- 機能的には満足
- もっと頻繁にフィードを受信したいかも
- elfeed は`file://~`で PC 内のファイルを読めるので、スクレイピング + 変換スクリプト(Emacs の起動にフックする)でフィード以外も読めて便利
    - 別に elfeed の専売特許ということはなく、こういう手段もある
        - [JSON to Feed](https://json2feed.ssig33.com/)
        - [ssig33.com - OpenFastladder クローラー向け RPC について](https://ssig33.com/text/OpenFastladder%20%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E5%90%91%E3%81%91%20RPC%20%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

## 終わりに

しばらく試したので現時点での雑感などをまとめました。もしも長続きしたらアップデートします。
集約について

集約（境界づけられたコンテキスト）

境界とルートが存在する
集約内の操作は全て集約ルートというエンティティを経由して行う
メリット



引継ぎや構成説明に便利
具体的な処理をいわなければいわなければならない
共通認識
全員が理解する必要がある
何を集約にすべきかは判断が難しい
背景がわからないとどうメンテナンスしたらよいかわからないwhyを残す
厳密に定義できたらどれだけ楽だろう
Goのスライスの挙動

## はじめに
Goのスライスの挙動について調べた。

容量を超える要素を追加したときは、元の容量を2倍したスライスが作られる。

元のスライスをコピーして新しいスライスが作られるため、メモリ上のアドレスが異なる。

つまり、元のスライスの分だけ、余分にメモリを消費するということ。

```go
package main

import "fmt"

func main() {
	s1 := make([]int, 1, 5)
	fmt.Println("Len:", len(s1), "Cap:", cap(s1)) // Len: 1 Cap: 5
	fmt.Printf("%p\n", s1)                        // 0xc00001a150

	// 容量を超える要素を追加
	s1 = append(s1, 1)
	s1 = append(s1, 2)
	s1 = append(s1, 3)
	s1 = append(s1, 4)
	s1 = append(s1, 5)
	fmt.Println("Len:", len(s1), "Cap:", cap(s1)) // Len: 6 Cap: 10
	fmt.Printf("%p\n", s1)                        // 0xc00001e050
}
```

ということは、下記のような場合、スライスのコピーが何度も繰り返され、メモリを消費する。

```go
package main

import "fmt"

func main() {
	s1 := make([]int, 0)

	for i := 0; i < 10000; i++ {
		s1 = append(s1, i)
		fmt.Println("Len:", len(s1), "Cap:", cap(s1))
		fmt.Printf("%p\n", s1)
	}
}
```

なので、処理をする前に既にスライスの大きさが分かっているなら、長さか容量を指定してスライスを初期化しましょう。

```go
package main

import "fmt"

func main() {
	s1 := make([]int, 0, 10000)

	for i := 0; i < 10000; i++ {
		s1 = append(s1, i)
		fmt.Println("Len:", len(s1), "Cap:", cap(s1))
		fmt.Printf("%p\n", s1)
	}
}
```

## 参考図書
- [Go言語 100Tips ありがちなミスを把握し、実装を最適化する](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E-100Tips-%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A1%E3%81%AA%E3%83%9F%E3%82%B9%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%97%E3%80%81%E5%AE%9F%E8%A3%85%E3%82%92%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%99%E3%82%8B-impress-gear/dp/4295017531)
Raspberry Pi5でWindows11 nvme SSD版（メモ）

# 始めに
Raspberry Pi5でwindows11が動くと聞き、今までRPi3,RPi4とWindows10を動かしてきたので、パワーアップしたRPi5でどんなものだろうと試してみたところ、[簡易にできる版](https://note.com/ogura_margarin/n/n88cd1bd38d9b)があり、簡単にUSBディスクでの立ち上げに成功しました。どうせならnvme SSDでの立ち上げをしたいと、そこから調べていろいろ試したのですが、①USB変換器M.2 SSDにインストールして、中身をnvme基板に取り付けると、ディスクがない（どうやらインストール時のドライブを覚えている模様）と言われダメ、②インストーラの段階でnvme基板に取り付けると、インストーラのドライバが対応していないらしく、エラーでダメ、となります。調べたところ、簡易的な方法では無理で、インストール前にドライバを入れ替えることで動作することがわかりました。ということで、情報を集めればできますが、メモとして方法を記しておきます。

# 参考URL

[Raspberry Pi 5でWindows11を動かしてみた際のメモ](https://note.com/ogura_margarin/n/n88cd1bd38d9b)
 SDやUSBで動作させたいときはこのページだけで動作します。

[How to install Windows 11 on your Raspberry Pi（英文）](https://www.xda-developers.com/how-install-windows-11-raspberry-pi/)
 Windows on Rのページの使い方が書いてあります。これに少しアレンジするだけで動作します。（時間はかかります）

[worproject/rpi5-uefi (github)](https://github.com/worproject/rpi5-uefi/releases)
 RPi5のUEFIのダウンロードページです。

 [worproject/dldserv-mirror（github）](https://github.com/worproject/dldserv-mirror/releases/tag/13%2F02%2F2024)
  RPi5のnvme対応ドライバの置き場ページです。

# 前提環境

- Raspberry pi 5 8GB版
- RPi5用nvme基板
- nvme M.2 SSDのUSB外付けケース
- 何らかのsudoが使えるLinuxマシン（USBディスクがマウントできること、Raspberry Pi OSでも可、wslは難しい）

# インストール方法

### 1.　WoRのISOイメージ作成
[How to install Windows 11 on your Raspberry Pi（英文）](https://www.xda-developers.com/how-install-windows-11-raspberry-pi/)に従い、Raspberry Pi用のWin11インストールISOファイルを作成、USBドングルに挿したnvme SSDにイメージをコピーするところ（Flashing the Windows 11 ARM64 ISOの章すべて）まで行います。途中ファイルのダウンロードとISOイメージの作成に非常に時間がかかります。あとバイナリの実行時にWindwos Smart Screenが発動します。もし気にする方は、消してもいいWindows11のマシンで行ってください。

### 2. UEFIおよびnvmeドライバのコピー
(1) Linux上で、githubから[worproject/rpi5-uefi (github)](https://github.com/worproject/rpi5-uefi/releases)のUEFI v0.3と、[worproject/dldserv-mirror（github）](https://github.com/worproject/dldserv-mirror/releases/tag/13%2F02%2F2024)のstorage_v4.zipをダウンロードして解凍してください。

(2) windows 11が入ったUSBドングルをLinuxマシンに挿し、sudo suでrootになってください。fdisk -lでUSBディスクが確認でき、3つのパーティションがあるのがわかると思います。ここからは/dev/sdbがUSBディスクだと仮定して進めます。

(3) まず/dev/sdb1を/mntにマウントします。ここはUEFIのブートコードが入っているパーティションなので、(1)でダウンロードして解凍したUEFIのv0.3を上書きします。上書きにの確認が入ると思いますが、Yesを選択してください。その後アンマウントします。

(4) 次に/dev/sdb3を/mntにマウントします。ここはセットアップ前のWindows11のイメージが入っているパーティションあんおで、(1)でダウンロードたstorage_v4.zipを解凍した内容（4つのファイル）を/mnt/Windwos/System32/drivers/にコピーして下さい。同じく上書きの確認が入ると思いますが、Yesを選択してください。その後アンマウントします。これでLinux上の作業は終了です。

(5) USBドングルからM.2 SSDを取り出して、RPi5用nvme基板に装着、RPi5に装着して起動します。Windwos11のセットアッパーが起動すれば成功です。インストールを進めます。オンボードのイーサネットやWifiは機能しないので、USBイーサネットドングルを使用するか、または国選択のところでShift+F10を押してコマンドプロンプトを開き、cd oobeでディレクトリを変えて.\BypassNROを実行することでネットワークの部分をかいひする必要があります。

# 最後に
以上、メモですが現在のところnvme上で安定してWindwos11が動作しています。やはり今までのRPi4+Win10とは違い、サクサク動く印象があります。ただ、ベンチマークをとったところ、nvmeが遅いので、まだ何かありそうです。これならUSBでの立ち上げでもいいかもしれません。どうしてもnvmeの立ち上げにこだわる人向けと思います。
ITパスポート テスト手法と運用・保守プロセス

・モジュール
ソフトウェアにおける独立した機能をもった構成要素

・テストケース
作成したプログラムを検証するために、入力データを想定して、それに対する出力結果がどうあるべきかを記述したもの

・単体テスト
プログラム単位で確認する
・ホワイトボックステスト
プログラムの内部構造に着目し、プログラムが正しく動作することを確認する
・ブラックボックステスト
プログラムの内部構造は考慮せず、外部仕様を満たしていることを確認する

・結合テスト
プログラム間のインタフェースを確認する

・システムテスト
システムの要件を満たしていることを確認する

・運用テスト
本番環境下で業務が実施できることを確認する

・ソフトウェア保守
本番稼働中のソフトウェアを修正すること
法改正に伴いソフトウェアを修正すること
ソフトウェアの修正に伴い、ドキュメントを修正すること

・レグレションテスト（退行テスト）
ソフトウェア保守に当たり、ソフトウェアの修正箇所が他の正常箇所に影響を及ぼしていないことを確認する
【Rails7】保存ボタン（submit）をフォームの外にしたい

## はじめに
「保存ボタン（submit）をフォームの外にしたい😭」ということがありました。

## 開発環境
- Rails 7.0.4.2
- ruby 3.1.4

## コード

`button_tag`を使用して、フォームの外側に保存ボタンを作成しました！

```
-----------------------------------------------------------<br>

<%= button_tag("保存", type: "submit", form: "post_form") %>

<br>-----------------------------------------------------------

<%= form_with(model: post, id: "post_form") do |form| %>
  <div>
    <%= form.label :title, style: "display: block" %>
    <%= form.text_field :title %>
  </div>

  <div>
    <%= form.label :content, style: "display: block" %>
    <%= form.text_area :content %>
  </div>
<% end %>
```

## 保存される様子
![画面収録-2024-06-30-7.23.30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727670/fdf758c7-aa94-564e-bf9a-137eb416a75e.gif)

無事に保存されました！
【CakePHP5】自動テスト/CIとかのまとめ

# はじめに

こんにちは、エンジニアのkeitaMaxです。

CakePHPの自動テストとかをいろいろやったのでまとめです。

今までCakePHPの記事を書いてきたので、それをまとめました。

これから紹介するものが全て入っているリポジトリは以下です。

https://github.com/NiheiKeita/cake-example-app

# Docker環境を作成

Dockerを使用してCakePHPの環境を作成しました。

https://qiita.com/keitaMax/items/6152aa9fff66bee4e887

# PHPstanを使った自動テスト

PHPstanを使って静的解析をしました。

https://qiita.com/keitaMax/items/77df412e05a537571549

また、以下記事ではPHPstanをGitHubにPushしたときにテストできるようにGitHubActionsを使用しました。

https://qiita.com/keitaMax/items/6e354b9a0b7c54344fa1

下の記事は、Git上でDockerを立ち上げてその中でテストできるようにしました。

https://qiita.com/keitaMax/items/63d64590e53def393f4c

# PHPUnitを使ったテスト

PHPUnitを使用してテストコードを作成しました。

https://qiita.com/keitaMax/items/7327c83cea938fe124f9

また、以下記事ではPHPUnitをGitHubにPushしたときにテストできるようにGitHubActionsを使用しました。

https://qiita.com/keitaMax/items/8aa77b447863ba81645a

# PHP CodeSniffer を使ってテスト

PHP CodeSniffer を使ってコーディングチェクをしました。

https://qiita.com/keitaMax/items/3147a3e56c4c2a3b8fde

また、以下記事ではPHP CodeSnifferをGitHubにPushしたときにテストできるようにGitHubActionsを使用しました。

https://qiita.com/keitaMax/items/5feef83f0f6bfa1b501c

# 初期設定系

マイグレーションファイル、コントローラ、モデルを作成しました。

https://qiita.com/keitaMax/items/953002976f2b38e298c5

https://qiita.com/keitaMax/items/b260eb3899de1115ffd0

# その他

PHPUnitのよく使うAssertions一覧

https://qiita.com/keitaMax/items/f3dc680edcf35e13e92f

CakePHPのよく使うコマンド

https://qiita.com/keitaMax/items/42d87235c31b7f9c1f66


# さいごに

 やり方が違ったり、もっといいやり方があるというご指摘がある方はコメントしていただけると幸いです。

最後まで読んでいただきありがとうございました。
好きな総菜発表ドラゴン曲線


### 好きな総菜発表ドラゴンが

![happyou_doragon0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/4e83e16e-9249-36a7-5575-f256383cbdff.png)

### 好きな総菜を発表します

![happyou_doragon1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/c0bcb7ec-7187-55c2-9ef4-100bcaecff94.png)

### からあげ

![happyou_doragon2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/db14c26a-c8be-1058-408e-2070fe51d218.png)

### ハンバーグ

![happyou_doragon3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/a1755d88-cb1e-ad1a-5d21-b6363aaf16fb.png)

### とんかつ

![happyou_doragon4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/95ba824d-cbf4-12d6-7f09-e058474d49c6.png)

### 肉を甘辛く炒めたやつ

![happyou_doragon5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/b0463b45-0ae7-fad3-a534-c4b2910bbf45.png)

### 正式名称が

![happyou_doragon6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/07e5b2db-9511-7605-c852-e223600311db.png)

### わからない総菜も

![happyou_doragon7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/c5f2171b-efcf-1349-161d-f38132565019.png)

### 好き

![happyou_doragon8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/62c0fc52-9fda-77e8-7e3c-a50e7bf8f16b.png)

### 好き

![happyou_doragon9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/6fbbc5fb-b7cb-128b-07b9-a16a919796a5.png)

### 大好き

![happyou_doragon10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/7b9c9532-bbf1-3df2-17bb-f7b1317b092b.png)
Java SE Bronzeに合格した備忘録

プログラミング（Java）の勉強1ヶ月目でJava SE Bronzeに合格したので、次の資格勉強に向けての備忘録です。

# Java SE Bronzeとは？
Java SE Bronzeは、Oracle認定のJava資格で、言語未経験者向けの入門資格です。
試験時間65分で選択問題が60問あり、正解率60%で合格となっています。
（自分は正解率85%で合格でした。）

## 勉強期間
約1ヶ月
（この資格の範囲だけ勉強していた訳ではないので、資格の範囲だけに勉強を絞ったらもっと短くできそうです。）

## 勉強方法
入門書（スッキリ）で範囲の基礎知識を一通り学び、まずは黒本の問題を章ごとに解きました。
その後、間違えた問題や知識が曖昧な問題の解説を読んで、わからない問題が無くなるまで何周か解き直し、最後に模擬試験問題を実際に時間を計って解きました。

# 次の資格に向けて
Bronzeは飛ばす人もいると思いますが、個人的にはCBT試験を受けるのが初めてだったので、今後受ける試験の練習にもなっていい経験になりました。
paiza.ioでelixir その291

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
GPIOを操作したフリをせよ。

# サンプルコード

```

defmodule Pin2 do
  use GenServer

  def start_link(state) do
    GenServer.start_link(__MODULE__, state, name: __MODULE__)
  end

  def value() do
    GenServer.call(__MODULE__, :get)
  end

  def on(key) do
    GenServer.call(__MODULE__, {:on, key})
  end

  def off(key) do
    GenServer.call(__MODULE__, {:off, key})
  end

  def init(state) do
    {:ok, state}
  end

  def handle_call({:on, key}, _from, state) do
    IO.puts("#{key} 1")
    state = Map.put(state, key, 1)
    {:reply, state, state}
  end

  def handle_call({:off, key}, _from, state) do
    IO.puts("#{key} 0")
    state = Map.put(state, key, 0)
    {:reply, state, state}
  end

  def handle_call(:get, _from, state) do
    IO.inspect(state)
    {:reply, state, state}
  end
end

Pin2.start_link(%{GPIO15: 0, GPIO16: 0, GPIO17: 1, GPIO18: 0})
|> IO.inspect()

Pin2.value()
Pin2.on(:GPIO15)
Process.sleep(300)
Pin2.on(:GPIO16)
Pin2.on(:GPIO18)
Pin2.value()

```

# 実行結果

```
{:ok, #PID<0.97.0>}
%{GPIO15: 0, GPIO16: 0, GPIO17: 1, GPIO18: 0}
GPIO15 1
GPIO16 1
GPIO18 1
%{GPIO15: 1, GPIO16: 1, GPIO17: 1, GPIO18: 1}
```

# 成果物

https://paiza.io/projects/00PpNA1GMOIB5vtMvrjm2g


以上。
paiza.ioでelixir その290

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
GPIOを操作したフリをせよ。

# サンプルコード

```

defmodule Pin do
	use Agent
	def start_link() do
		Agent.start_link(fn ->
			%{"GPIO15": 0, "GPIO16": 0, "GPIO17": 0, "GPIO18": 0}
		end, name: __MODULE__)
	end
	def on15() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO15 1")
			Map.put(v, "GPIO15", 1)
		end)
	end
	def off15() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO15 0")
			Map.put(v, "GPIO15", 0)
		end)
	end
	def on16() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO16 1")
			Map.put(v, "GPIO16", 1)
		end)
	end
	def off16() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO16 0")
			Map.put(v, "GPIO16", 0)
		end)
	end
	def on17() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO17 1")
			Map.put(v, "GPIO17", 1)
		end)
	end
	def off17() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO17 0")
			Map.put(v, "GPIO17", 0)
		end)
	end
	def on18() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO18 1")
			Map.put(v, "GPIO18", 1)
		end)
	end
	def off18() do
		Agent.update(__MODULE__, fn v ->
      IO.puts("GPIO18 0")
			Map.put(v, "GPIO18", 0)
		end)
	end
end
Pin.start_link()

Pin.on15()
Process.sleep(300)
Pin.off15()
Process.sleep(300)
Pin.on16()
Process.sleep(300)
Pin.off16()

```

# 実行結果

```
GPIO15 1
GPIO15 0
GPIO16 1
GPIO16 0
```

# 成果物

https://paiza.io/projects/YMYm3XAb4XiouBYrbHo-ew


以上。
FlutterでWidget間の隙間を空けるのにSizedBoxを使う違和感

<H1>結論</H1>
隙間を空ける用途でSizedBoxを使うのは問題ない

<H1>背景</H1>
普段Web開発を普段している私は、Flutterで隙間を空けるためにSizedBoxが用いられていることに違和感があった。<br/>
例えばcontent1とcontent2の間にスペースを空けたいときはHTMLではこのような記載になる。(説明の簡易化のためにTailwindCSSを利用)

```HTML
<div class="mb-2"> Hello, World! </div>
<div> Welcome to Flutter </div>
```
それをDartで再現しようとすると、以下のようになる。

```Dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Hello, World!'),
              SizedBox(height: 8), // ☆ここ
              Text('Welcome to Flutter'),
            ],
          ),
        ),
      ),
    );
  }
}
```

この```SizedBox```はあたかも```<div class="my-1">```という空divを置いているようで、とても違和感があった。

```HTML
<div> Hello, World! </div>
<div class="my-1">
<div> Welcome to Flutter </div>
```

しかし複数の学習ではこのような```SizedBox```の使い方が紹介されていたため、公式ソースを追ってみることにした。


<H1>公式の説明</H1>
以下の動画に｢Great for adding gaps between widgets｣と説明あり。<br/>
ウィジェット間のスペース空ける用途で用いられていた。

https://www.youtube.com/watch?v=EHPu_DzRfqA&t=79s

<H1>最後に</H1>
隙間を空ける用途でSizedBoxを使うのは問題ない。今後はSpacerやContainer、Paddingなど用途に併せてSizeBoxもうまく活用していきたい。
メンバーシップ型採用は馬鹿に出来ない

## メンバーシップ型雇用は過去の遺物か

メンバーシップ型の雇用といえば、どちらかというと古臭くネガティブなイメージで語られることが多いと思います。
ここ数年は欧米のジョブ型雇用が増えている傾向にありました。

メンバーシップ型のデメリットはもちろんあると考えていますが、一方で現在やこれからのことを考えると、馬鹿にできないなと思うようになりました。

## これからの仕事は作業をこなすだけではないから

仕事の内容が明確で専門性の高いものであれば、ジョブ型雇用が適していることが多いでしょう。しかし、その専門性の高い仕事が継続的に求められる保証はあるでしょうか。

### 作業者の仕事はなくなる

技術の発達によって、私たちの働き方は急速に変化しました。

四肢の代わりとなるハードウェアが必要なブルーカラー職の代替は時間がかかりそうですが、ネコ型配膳ロボットのように最適な形を模索しながら、少しずつ社会に浸透していくでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/9ddb78b9-596e-cfc7-e884-1c4e733ebd03.png)

一方で、ホワイトカラー職の人間から機械への代替は複雑なハードウェア制御が不要な分、ブルーカラー職より早いスピードで起きると予想できます。

[「なんだか助かる便利なおっちゃんになりたい」の“人工知能が仕事を奪う”](https://qiita.com/koji-yamauchi/items/61aed31bc27b929c996c#%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%8C%E4%BB%95%E4%BA%8B%E3%82%92%E5%A5%AA%E3%81%86)でも記載したとおり、プログラムを作成する、設計書を書くなどの業務もかたちを変えて人間の作業負担は大きく削減されるでしょう。

このときに「これが私の専門分野だから」と、自分の想定していた仕事の範疇にとらわれるとうまく最適化が出来ません。

私たちが取り組むべきことは、あくまで価値の提供であり、作業は手段でしかない認識が必要です。

## 腹落ちしているかどうかは必ずパフォーマンスに直結するから

納得していない、不満がある、こんなことをやりたいわけではない、意味がない、このような考えのもと行う仕事はコミュニケーションや成果物などに必ず悪い影響があります。
周りの士気を下げる言動や、自分勝手な要求、ただやっただけな意味のない成果物としてポロポロとこぼれ落ちます。

組織やチーム全体が同じ理念、MVV（ミッション・ビジョン・バリュー）を持ち、価値観を合わせていかなければ高いパフォーマンスを発揮できません。

## 踏ん張りどころは発生する

「いけたらいく」「やれたらやる」ではなかなか物事はうまくいきませんし、周りも仕事の依頼ができなくなります。
例えば、新しい引き合いがあって、調査分析と提案までの期間が1週間しかない、プレゼンが◯◯日◯◯時ときまっていたら、必ずそこに合わせる必要があります。

目的を達成するには、少し踏ん張るタイミングというのは単純作業のお仕事でない限り発生するものです。

## 役割の境界線は曖昧だから

誰がどの役割の帽子をかぶるべきかは、状況によって変わります。
手段が目的になってしまわないためには、皆が必要とあらばどの役割の帽子でも被れる覚悟が必要です。

また、相手の仕事や立場を理解しなければなりません。

## しかし、お気持ちだけでは不十分

とはいっても、気持ちだけではなんともなりません。

専門性を求められる仕事の中での経験や学びが地層のように重なり、それが要求される課題解決とマッチすることで価値を創ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/eedafa72-e65c-5624-f648-139fbe7d026b.png)

急速な環境変化に合わせて組織はピボットする必要がありますし、汎用的な問題解決能力や専門知識が求められるケースもあります。

## それぞれの道

中途採用は行わず新卒一括採用でメンバーシップ型に振り切ったSIerで高い営業利益率の有名な会社がありますが、そのような戦略をとる会社があることは理解できます。

もちろん、ジョブ型雇用の会社のことも。

ジョブ型、メンバーシップ型のそれぞれの良い部分を合わせた柔軟な組織を模索するというのも考えられるでしょう。

古くからの日本企業ならではのメンバーシップ型雇用を馬鹿にせず、今一度ここにヒントを見出すのも良いかもしれません。
wslでelixir その151

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookで、GPIOを操作したフリをせよ。

# 方針
- GenServerを使う。
- Kino使わん。

# サンプルコード
```
defmodule Pin2 do
  use GenServer

  def start_link(state) do
    GenServer.start_link(__MODULE__, state, name: __MODULE__)
  end

  def value() do
    GenServer.call(__MODULE__, :get)
  end

  def on(key) do
    GenServer.call(__MODULE__, {:on, key})
  end

  def off(key) do
    GenServer.call(__MODULE__, {:off, key})
  end

  def init(state) do
    {:ok, state}
  end

  def handle_call({:on, key}, _from, state) do
    IO.puts("#{key} 1")
    state = Map.put(state, key, 1)
    {:reply, state, state}
  end

  def handle_call({:off, key}, _from, state) do
    IO.puts("#{key} 0")
    state = Map.put(state, key, 0)
    {:reply, state, state}
  end

  def handle_call(:get, _from, state) do
    IO.inspect(state)
    {:reply, state, state}
  end
end
```

```
Pin2.start_link(%{GPIO15: 0, GPIO16: 1, GPIO17: 0, GPIO18: 0})
|> IO.inspect()

Pin2.value()
Pin2.on(:GPIO15)
Process.sleep(3000)
Pin2.on(:GPIO16)
Pin2.on(:GPIO18)
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5c3b63ee-1451-0411-ac67-ee8804b86a71.png)


以上。
Javaで「文字列と文字列の大きさを比較する(String.compareTo)」の動作を確認してみた

# 概要

Javaで「文字列と文字列の大きさを比較する(String.compareTo)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/string/index13.html

# 実装

以下のファイルを作成しました。
```JSample13_1.java
class JSample13_1{
  public static void main(String[] args){
    String str1 = "東京都港区";
    String str2 = "東京都港区";
    String str3 = "東京都";
    String str4 = "東京都中央区";

    System.out.println(str1.compareTo(str2));
    System.out.println(str1.compareTo(str3));
    System.out.println(str1.compareTo(str4));
    System.out.println(str1.charAt(3) + ":" + Integer.toString(str1.charAt(3)));
    System.out.println(str4.charAt(3) + ":" + Integer.toString(str4.charAt(3)));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample13_1.java 
$ java JSample13_1 
0
2
8194
港:28207
中:20013
```

# まとめ

何かの役に立てばと。
クローン面接体験記

[株式会社オルツ](https://alt.ai/)は日本語LLM LHTM (ラートム) を開発し、それを個人を代行できるパーソナルAIとして応用している会社である。昨年、今年とオルツコンファレンスに参加させてもらい、その勢いを感じてきた。

その代表取締役の米倉千貴氏からLinkedInでスカウトのメッセージが来た。私の経験を高く評価してもらってうれしい。現在フルタイムで働くことはできない状況にあるが、業務委託での参画も可能だということで、魅力的な話だ。

まずはAI面談でということで、オルツのパーソナルAI alt BRAINによって作られた米倉氏のクローンとの面談をすることになった。単なるチャットボットではなく、CEOのクローンともなれば、きっと実りのある対話ができるに違いない、とこの点でも魅力を感じた。

AI面談までの事前のやり取りは、米倉氏本人ではなく、採用担当の方から回答が来ていた。

実際のAI面談は先方の質問に答える形で進んだが、私からの回答には、他組織とのコラボレーションやキラーアプリの提案など、CEOだったら反応するだろうと思われる内容を混ぜ込んだつもりである。それに対する言及が相手からなかったので、その点ではちょっと期待はずれだった。

面談後の報告メッセージの中に、米倉氏あてに以下のようなAI面談を行った感想を含めた。

> AI面接の機会をいただきありがとうございました。貴重な体験だったと思います。少しディレイはあるものの、会話の流暢さや相手の話に合わせた会話など感銘を受けました。
>
>ただ気になる点もありました。
>
>一つはこれってCEOのクローン = CEOの仕事の代行ができるエージェントになっているのか、ということです。今回のような一次面接ですと、もともとCEOが行う業務ではないように思います。それでも採用担当の仕事の軽減になるからよいではないかという議論もあるかと思いますが、結局採用担当者は今回の録画を同じ時間かけてみることになり、時短にはつながらないのではないでしょうか。ただ、スケジュール調整のコストが削減されるというメリットは分かります。
?
>もう一つは会話の流れです。もともと決めてあるステップに沿って進んでいたのですが、これはIF-THEN-ELSEで会話の流れを定義するチャットボットと変わらないではないでしょうか。相手がインタラプトをかけて質問するようなことは可能なのでしょうか。業務を代行するクローンとしては、臨機応変に会話が必要になると思います。

この感想に関しても米倉氏ではなく採用担当の方から回答があった。CEOの代行とは言えないが採用の効率化に役に立っている。面接から評価までの一連の流れを自動化できるとのこと。また、採用面接の流れにそった会話になるように設定しているとのこと。

AI面接の次のステップに関しては、人事部で調整ということだったが、1か月たっても何のメッセージも来ていない。途中で状況の問い合わせも行ったが、これに対しても回答は来ていない。

という訳で、まだ米倉氏とは直接話ができていない。もしかしたら最初のメッセージから米倉氏ではなく採用担当の方からきていたのかもしれない (ぬか喜びだったということになる)。さらに言うとこれらすべてのメッセージをAIが書いて出しているのかもしれない。オルツはAIクローンが行う仕事にも報酬を出すとのことだが、そうすると従業員の知らないところでAIが暴走する可能性があるのではないか。オルツが推進するパーソナルAIも怖くて使いどころが分からないということになりかねない。

これとは別件で、オルツのAI GIJIROKU の売り込みの電話があった。Zoom面談で説明させてほしいとのことで、スケジュールを設定し、会議室に入って待っていたが、結局相手は入ってこなかった。最初の電話もAIの暴走だったのだろうか。

また、6月26日に行われた[新規事業カンファレンス OFFROAD 2024](https://jafco-seminar.com/2024)で、オルツの人もプレゼンされていたので、メッセージを送ったのだが、こちらも反応がない。
5分でできる！GitHub README プロフィール 💬

こんにちは！もみです🐶

皆さん、**GitHubプロフィールのREADME** は設定していますか？

GitHubのプロフィールを充実させることで、
GitHub上での交流はもちろん、就活や転職でもきっとちょっと役に立ったりと、素敵なご縁に繋がるかもしれません。

たった5分で設定できるので、さっそく設定していきましょう！



## 🚩 今回作成するプロフィール
シンプルさを保ちつつ、スキルやGitHub上での活動を中心にした自己紹介テンプレートにしてみました！

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984587/7caabe29-e944-c985-ec3e-28928deb5b2e.png)

GitHubリポジトリ： 
https://github.com/NonokaM/sample-github-profile/blob/main/README.md 



## 1. リポジトリを作成しよう

まず、ユーザー名と同じ名前のリポジトリを作成しましょう。
（ ユーザー名と同一のリポジトリは、特別なリポジトリと認識されて自動的にプロフィールに表示されます ）

また、編集を加えていくREADMEファイルのチェックボックスを選択し、ファイルを追加しておきましょう。

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984587/8aba0009-48f2-5800-ade5-0a18303ed539.png)



## 2. コードを貼り付けて編集しよう
下記のコードを作成したREADME.mdファイルにコピペ後、コメントの指示に沿って変更するのみで完成するようにしてみました。

ライトモード ↔️ ダークモードの変更方法なども、コメントに含めたのでお好みで変更してみてください！

```README.md
<!-- 1. GitHub usernameを変更 -->
<div align="right">
  <img src="https://komarev.com/ghpvc/?username=username" />
</div>


<!-- 2. プロフィールや連絡先を変更 -->
## <img src="https://media.giphy.com/media/hvRJCLFzcasrR4ia7z/giphy.gif" width="28"> Hi there

- 🧑‍💻 I'm a backend engineer.
- 🌱 I’m currently learning go!
- 📫 How to reach me: [Twitter - @username](https://twitter.com/username)
<br>


<!-- 3. 好きな技術スタックに変更 -->
<!-- ライトモート：theme=light, ダークモート：theme=dark -->
<!-- アイコンの選択肢一覧：https://arc.net/l/quote/zizyykfh -->
## 🌱 Skills
<img alt="my skills" src="https://skillicons.dev/icons?theme=dark&perline=7&i=html,css,js,ts,react,next,figma,python,fastapi,go,docker,terraform,aws,gcp" />
<br>


<!-- 4. GitHub usernameを変更, 2箇所 -->
<!-- ライトモート：theme=light, ダークモート：theme=vue-dark  -->
## 🏃‍♀️ Activities
<div align="left"> 
  <img alt="Top Langs" height="170px" src="https://github-readme-stats.vercel.app/api?username=username&theme=vue-dark&layout=compact" />
  <img alt="github stats" height="170px" src="https://github-readme-stats.vercel.app/api/top-langs/?username=username&theme=vue-dark&layout=compact" />
</div>


<!--
This repository is a ✨ _special_ ✨ repository because its `README.md` (this file) appears on your GitHub profile.

Here are some ideas to get you started:

- 🔭 I’m currently working on ...
- 🌱 I’m currently learning ...
- 👯 I’m looking to collaborate on ...
- 🤔 I’m looking for help with ...
- 💬 Ask me about ...
- 📫 How to reach me: ...
- 😄 Pronouns: ...
- ⚡ Fun fact: ...
-->

```


これにて、GitHubのプロフィールは完成です！
今回使用したサービス以外にも、GitHubプロフィールを充実させる様々なサービスがあるので、自由にカスタムして楽しんでみてください 🥳



## おまけ ： 使用したライブラリ・サービスの解説

### 🌟 GitHub Profile Views Counter
閲覧回数を表示するライブラリ

https://github.com/antonkomarev/github-profile-views-counter


### 🌟 GIPHY
gif画像を埋め込んで、動きやユニークさを出すのもおすすめです。
今回は👋の動作のgifを下記のサイトから埋め込んでみました。
自作で画像やgifを用意したりしても、よりユニークで良さそうですね☺️

https://giphy.com/


### 🌟 Skill Icons
言語や技術のアイコンを簡単に設定できるライブラリ

https://github.com/tandpfun/skill-icons


### 🌟 GitHub Readme Stats
GitHubのプロフィールに統計情報を追加するツール
これを使うと、自分のリポジトリの統計（例えば、言語の使用状況、コミット数、スター数など）をREADMEファイルに簡単に埋め込むことができます。

https://github-readme-stats.vercel.app
Visual Studioで入力候補(IntelliSense)が全く出なくなった

Visual StudioでASP.NET Coreを使いフロントはTypeScriptを用いたウェブサイトを作っていたところ、入力候補(IntelliSense)が全く出なくなりました。
文字を入力しても画像のような入力補助が全く出ない状態でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481394/096f8c4b-a1aa-a64a-68f2-abc1f738a978.png)
# 原因と解消方法
Microsoft.TypeScript.MSBuildのバージョンが5.5.0-rcだったので、5.4.5(最新の安定版)に変更したところ解消しました。
このバージョンについては遠からず問題が解消すると思いますし、この事象がこの原因だけで起こるわけではもちろんないですが、MSBuildが原因で起こりうるということで記録しておきます。
# 調査手順
最初にVisual Studioの再起動・更新・入れ直し等を行ったものの改善しませんでした。切り分けとして、他のソリューションに確認したところ問題が起きていなかったため、このソリューション特有の問題のようでした。
上記の確認中、Visual Studioの出力>IntelliSenseで以下のメッセージが出ていたことに気が付きました。

> JavaScript および TypeScript 言語サービスは繰り返しクラッシュした後に無効になりました。ご使用のプロジェクトの IntelliSense サポートが低下している可能性があります。言語サービスを再び有効にするために、ご利用のソリューションの再読み込みをお試しください。

このメッセージを受け、ソリューションを新たに作成して元のソリューションでTypeScriptを導入するために実行したことを一つずつ行うことで原因を確認しました。
結果的に、MSBuildを入れる段階でバージョンがRCであることに気が付き、5.4.5に切り替えることで解決しました。
SteamVRが「一部のアドオンがブロックされています」でどうにもならなくなった場合に設定ファイルを直接書き換えてどうにかする方法

Quest+LighthouseをOpenVR-SpaceCalibratorで実現していたり、VirtualDesktop Streamerを使っていたり、ほかアドオンが読み込まれないと期待動作しない環境でSteamVRを使用している場合に、よくわかりませんが時折SteamVR起動時に「一部のアドオンがブロックされています」が表示される場合が起こります。少なくともうちの環境では。🥺

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33891/c8912767-bef4-36fb-54a5-c4e25457d145.png)

これまではこのダイアログが表示される状態に陥っても、ダイアログから「アドオンを管理」または起動中のSteamVRのシステムトレイアイコンを右クリックして設定画面を呼び出し、GUIから必要なアドオンをブロック解除し、促されるSteamVRの再起動で期待動作を復元できていました。

しかし、今晩はGUIからブロック解除を行った後に促されるSteamVRの再起動ボタンを押下しても、再起動しています表示から進まなく（SteamVRが終了しなく）なってしまい困りました。強制終了してもブロック解除できていない状態のままです。

とりま、このあたりの設定は以下のファイルにありました。

`C:\Program Files (x86)\Steam\config\steamvr.vrsettings`

必要な部分だけ抜粋すると、ブロックされたアドオンがある場合は次のような設定項目があります。

```json
   "driver_01spacecalibrator" : {
      "blocked_by_safe_mode" : true
   },
   "driver_VirtualDesktop" : {
      "blocked_by_safe_mode" : true
   },
```

これを `false` にするとブロック解除された状態で起動するようになります。

私の環境ではなぜか OpenVR-SpaceCalibrator がブロックされる場合が月に1度くらいの頻度で発生します。いままではGUIでブロック解除から再起動できていたので「またか」といった程度で数分から十数分で対処できましたが、今回はGUIから再起動できず、強制終了してもブロック解除の設定変更が保存されておらず困りました。最終手段として設定ファイルを手編集して解決しました。なおったからヨシ！と思いたいところですが、なんとも面倒です。
Windows上のgit-ftpで日本語を含むパスのファイルを送れるようにする方法

## 問題
普通にセットアップしたgit-ftpで`git ftp push`をして、日本語を含むパスのファイルもアップロードされるとき、`curl: Can't open '(ローカルのファイル。パスが途中で見えなくなっている)`と表示される。Git Bashだとパスがすべて見えるのだが、日本語を含むパスのファイルが開けないらしい。

## 理由
どうもWindows版Gitに付属のcurlが、Unicode対応じゃないということらしい。

## 対処
Windowsにはcurl.exeが付属しており、そちらはUnicode対応だという。ならそれを使えばいいじゃないかということで、

* `C:\Program Files\Git\mingw64\bin\curl.exe`を適当にリネーム

で解決。

## 終わりに
この記事が助けになったらうれしい。
効率的なレンダリングとアプリサイズ削減のためのベストプラクティス

効率的なレンダリングとアプリサイズの最小化は、パフォーマンスの向上、ユーザーエクスペリエンスの改善、デバイスストレージの最適化にとって重要です。以下に、iOSアプリ開発においてこれらの目標を達成するための重要なベストプラクティスとシナリオを示します:

**1. 画像アセットの最適化**

画像アセットを効率的に管理することは、アプリサイズの削減とレンダリングパフォーマンスの向上に不可欠です：
- **アセットカタログ**: アセットカタログを使用して画像を整理し、デバイスの能力に基づいて適切な解像度を選択することで、冗長なアセットを削減します。
- **画像圧縮**: ImageOptimなどのツールを使用して画像を圧縮し、品質を維持しながらファイルサイズを最小化します。
- **ベクターグラフィックス**: 可能な場合はベクターグラフィックス（PDF、SVG）を使用し、ファイルサイズを大幅に増やすことなく画像を拡大縮小します。

**2. 適応レイアウトの実装**

適応レイアウトを採用することで、異なるデバイスや画面の向きにわたって一貫したレンダリングを確保します：
- **Auto Layout**: Auto Layoutを使用して、さまざまな画面サイズや向きに対応する柔軟でレスポンシブなUIを作成し、複数のレイアウト設定の必要性を最小限に抑えます。
- **サイズクラス**: サイズクラスを活用して、デバイスの特性に基づいてUI要素を調整し、レイアウトの効率を最適化します。

**3. コードとフレームワークの管理**

コードと依存関係を効率的に管理することで、アプリサイズの削減とレンダリングの高速化に貢献します：
- **コードの削除**: Xcodeのビルド設定を使用して未使用のコードやリソースを削除し、実行ファイルのサイズを最適化します。
- **動的フレームワーク vs 静的フレームワーク**: 動的リンクが必要でない限り、起動時間を短縮しアプリサイズを最小化するために、静的フレームワークを優先します。

**4. パフォーマンスのプロファイリングと最適化**

定期的にアプリのパフォーマンスをプロファイリングすることで、レンダリングのボトルネックを特定し、効率を最適化します：
- **Instruments**: XcodeのInstrumentsを使用して、CPU、メモリ使用量、GPUのパフォーマンスを分析し、改善すべき領域を特定します。
- **レンダリングのボトルネック**: 過剰なテクスチャの読み込みや複雑なアニメーションなど、非効率なレンダリング操作に対処し、UIの応答性を向上させます。

**5. データ管理とキャッシュ戦略**

データの取得と保存を効率的に管理することで、アプリのパフォーマンスを最適化し、レンダリングの遅延を削減します：
- **キャッシュ**: 頻繁にアクセスされるデータに対して、メモリ内およびディスクキャッシュのメカニズムを実装し、ネットワークリクエストを削減してレンダリング速度を向上させます。
- **データのプリフェッチ**: ユーザーの操作を予測してデータを事前に読み込み、レンダリングの遅延を最小限に抑え、ユーザーエクスペリエンスを向上させます。

**6. ネットワーク使用の最適化**

効率的なネットワーク使用は、データの取得速度とレンダリングパフォーマンスの向上に貢献します：
- **圧縮**: ネットワークリクエストに対してデータ圧縮技術（例：gzip）を使用し、データ転送サイズを削減してレンダリング速度を向上させます。
- **バックグラウンドフェッチ**: バックグラウンドフェッチを実装して、コンテンツを事前に更新し、フォアグラウンドのレンダリングに影響を与えることなく最新のデータを確保します。

**結論**

効率的なレンダリングとアプリサイズの削減は、高速で応答性が高く、ストレージが最適化されたiOSアプリを提供するために不可欠です。これらのベストプラクティス—画像アセットの最適化、適応レイアウトの採用、コードと依存関係の管理、パフォーマンスのプロファイリング、データ管理とネットワーク使用の最適化—を実装することで、開発者はアプリのパフォーマンスを向上させ、ダウンロードサイズを最小化し、多様なiOSデバイスと使用シナリオにわたってシームレスなユーザーエクスペリエンスを提供できます。
生成モデルによる業務支援：もう全部 ChatGPT でいいんじゃないかな

最近、生成モデルが急激に進化しているので活用方法を検討。

### 0. 大まかな考え方

1. **前提：生成モデルに入力してはいけない機密情報に注意する**。
2. 要件定義、設計、実装、テスト、運用、の一連の工程を部分的に自動化または提案させることで、エンジニアは意思決定や問題解決に専念する。
3. ドキュメントの作成・更新、コードレビューや品質管理、を生成モデルが自動的に行い、エンジニアはアイデアの創出などの創造的な業務に専念する。
4. 生成モデルが新技術の調査や学習を支援し、エンジニアのスキルと専門性を高める。

### 1. 会議・コミュニケーション支援

1. 議題・資料自動生成
   1. 会議の目的や参加者、過去の関連情報に基づき、議題と資料の草案を生成。
2. リアルタイム議事録作成＆要約
   1. 会議中の音声を認識し、議事録を作成。
   2. 要約やToDoリストの生成。
3. 要件定義書への変換
   1. 議事録の内容を解析し、要件定義書の雛形を生成。
4. Slack連携
   1. Slackチャンネルを監視対象に登録し、そこでの投稿を自動的に分析し、自チームの業務に関連する投稿や、対応が必要な内容を抽出。担当者への通知や対応策の提案を行う。

### 2. 設計・開発支援

1. 設計支援
   1. 要件定義書の内容を解析、Design Doc、テスト計画書、API仕様書などの雛形を生成。
   2. 機能分割、API設計、データベース設計などを支援。
3. コード生成
   1. Design Docやその他の仕様書に基づき、コードを生成。
4. コードレビュー自動化
   1. プルリクエストが作成されると、自動的にコードの品質、セキュリティ、バグの可能性などをチェックして改善点を提案。
5. ドキュメントとコードの同期
   1. main や develop ブランチへのマージをトリガーとして、READMEやリリースノート、その他の関連するドキュメントを更新。
6. リファクタリング候補の提案
   1. コードを解析し、リファクタリングが推奨される箇所を指摘。具体的な改善案の提案。
7. 影響範囲分析
   1. システム変更時の影響範囲を自動的に分析し、必要なテストや修正を提案。

### 3. 運用・保守支援

1. 運用手順書生成
   1. システムの運用に必要な手順書を更新。
2. モニタリング支援
   1. 異常検知や性能監視のためのモニタリングシステムの開発支援。
   2. モニタリング結果の要約と自動解釈。
3. インシデント対応自動化
   1. インシデント発生時に、原因特定、復旧手順の提案。

### 4. 管理業務支援

1. 作業計画支援
   1. チームの状況に基づき、タスクの分解、ポイント見積もり、優先順位付けを支援。
2. 進捗管理支援
   1. タスク管理システムの状況を自動で追跡し、状況を要約。
3. 振り返り支援
   1. 振り返り内容を分析し、要約&改善案の提案。
4. チーム目標設定支援
   1. 過去のデータや業界トレンド、積みタスクを分析し、チームの目標設定を支援。
5. カレンダー連携
   1. ステークホルダーの予定を考慮し、会議を自動設定。

### 5. ナレッジマネジメント支援

1. ドキュメント自動分類＆タグ付け
   1. 内容に基づき、ドキュメントを自動で分類・タグ付けし、検索性を向上。
2. ドキュメント利用状況分析
   1. 閲覧履歴などを分析し、利用頻度の低いドキュメントのアーカイブや更新を提案。
3. 新入社員研修資料生成＆更新
   1. 既存の資料や最新情報に基づき、研修資料を生成・更新。

### 6. その他

1. BigQuery クエリ最適化
   1. クエリの高速化を提案。
2. 汎用アドバイザー
   1. エンジニアからの、コーディングや設計パターン、ドキュメント作成、業務の進め方、スプリント運営、時間管理、コミュニケーションなどの相談に対応する
3. アイデア創出支援
   1. 要件を満たすシステム構成案を複数提示させ、技術選定の幅を広げる。
4. 問題解決のブレーンストーミング
   1. 原因不明のバグ、パフォーマンス改善など、多角的な視点からの解決策を提案。
AWSのコスト状況をLINEとDiscordに定期通知させてみる（高額請求回避）

# はじめに
Amazon Kendraの勉強をした後に作成したリソースを消し忘れており、`$262.12` （＝42,169.21 円 2024/6/29時点）の請求が来てしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/7389112b-6aa9-eca1-6349-19bb075f1d0d.png)

私がこまめにコストの方を確認していなかったのが悪いのですが、請求アラートの設定もできていなかったため今回請求アラートの設定を行いました。
またこの際に、勉強も兼ねて自分が使っているSNS（LINE、Discord）にAWSのコスト情報を通知する仕組みも実装してみました。
本記事はこれらの内容をまとめたものになります。


# 請求アラートの設定
AWS Billing から請求アラートをドキュメント記載の手順通り設定（AWS Billing > 請求設定 > アラート設定）するだけです。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html


# LINEとDiscordへの通知構成

構成としては以下のようになります。


![AWS通知構成図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/a70ca6e3-b092-63cf-7aec-d780f3a0a5c9.png)


・スマホのイラスト：https://www.irasutoya.com/2014/07/blog-post_63.html


### ◆EventBridge
EventBridgeのスケジューラを使ってLambdaを定期的に実行しています。


### ◆Cost Explorer
コストを取得しています。

### ◆Lambda
Cost ExplorerのAPI呼び出して、コストを取得しています。
その後通知メッセージを作成した後に、LINE NotifyとDiscordにPOSTリクエストを送り、それぞれ通知を送っています。

Discordへの通知はGASを使用した下記の記事が参考になると思います。
今回は記事に記載されている処理をJavaScript⇒Pythonで焼き直してDiscordへ通知を出しています。

https://qiita.com/enumura1/items/eb808ffe42048eeb50f0

:::note warn

個人的詰まりポイント

Lambdaを実行する際に使用した `requests` モジュールは標準モジュールではないのでLayerに追加して実行しました。詳細は下記の記事にまとめています。

https://qiita.com/enumura1/items/22826d9925ef6836d0b9

:::



# 動作確認
LINEとDiscordでそれぞれ通知を確認すると、下記のようにそれぞれメッセージを表示できていました。

### LINE

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/89e1a86b-00f4-9c15-8a6f-2c8a00f3ab42.png)

### Discord

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/8658ca77-df36-e4fe-8bdb-1c6f3d9b7871.png)


# 終わりに
請求アラートのメール通知、LINE通知、Discord通知の3つがあれば、定期的にコスト状況を把握しやすくなり以前よりかなりマシになったと思います。
リソースを切り忘れて課金されているものがあっても、各種サービスごとにコストを表示しているのでそこも気づけそうです。


# 参考

https://zenn.dev/tiga_aws/articles/9feb095deed6fe

https://note.com/maken241/n/nbc6c97616987

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html