OmniAICreator/Qiita-1.07M huggingface dataset:
Visual StudioでWebアプリケーションを作成する【ASP.NET MVC】

## 前回の記事

C#の開発環境を構築する【Visual Studio】

https://qiita.com/shironana/items/d3aac3b0b889211d3dc0

## 本記事のゴール
- Webアプリケーションを作成し、Webページを表示する。

## 新規プロジェクト、ソリューション作成

1．「新しいプロジェクトを作成」を押します。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/56a75ddc-cfce-9a62-38c3-6611d9c66aeb.png)

2．目的に応じたテンプレートを選択します。今回は、「MVC」と検索し、「ASP.NET Core Webアプリ (Model-View-Controller)」**（C#版）** を選択します。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/415b0326-a159-00bd-e6d7-80d38c423c9a.png)

3．任意のプロジェクト名（管理用の名前）とプログラムの保存場所を入力します。今回は簡単なシステムであるため、「ソリューションとプロジェクトを同じディレクトリに配置する」にチェックを入れます。

:::note
ソリューションには、複数のプロジェクトをまとめる役割があります。
複数のWebアプリケーションやAPIなどを持つ複雑なシステムの場合には、プロジェクトを分割してソリューションでまとめて管理するといった運用を行うことが多いです。
複数プロジェクト構成の作成方法については以下記事を参考にしてください。
:::

https://qiita.com/shironana/items/6697750d380af58ac91b

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/848143bf-645b-9517-8e68-4664f62a4d2f.png)

4．追加情報は変更せずに作成します。

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/0dbeca0e-1bfb-2c91-54af-77a30a2ecc1b.png)

5．以下画像のように作成が完了することを確認します。

![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/8a257af3-f560-ed1e-a8e3-018c5c68b3fa.png)


## Webアプリケーションの起動

5．ツールバー内の緑矢印または、デバッグタブ内の「デバッグの開始」を押してWebアプリケーションを立ち上げます。（画像内の緑囲みのいずれか）

![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/98881a93-f2c8-299a-8dc4-1b18687b6f85.png)

6．以下画像のような証明書関係については、お使いの環境で支障がなければ同意を推奨します。

<div>
<img width="330" alt="image7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/8f7ce52a-b10e-802f-ba19-b1a677bd14b1.png">
<img width="304" alt="image8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/218a1f3b-5a64-ed29-d963-99c8d4372722.png">
</div>

7．以下画像のようにWelcomeページが表示されれば成功です！

![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/434ca424-54c2-6be5-1a62-686695d57298.png)

8．Webアプリケーションを停止するときは、ツールバーの赤色の四角を押します。

![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/bd6e8770-340a-a641-1bb3-0b79daefc06e.png)


## 補足：MVCによるアプリケーション開発
MVCとは、今日では広く用いられている概念であり、以下のようにWebアプリケーションの役割を分担して受け持つことで、効率的なシステム開発を実現します。
- **モデル** *Model*
    - データ処理担当
    - データベースとのやり取りや、データの加工などを行う。
- **ビュー** *View*
    - 画面担当
    - ユーザーに見せる画面作成や入力フォームの制御を行う。
- **コントローラー** *Controller*
    - モデルとビューの制御担当
    - ユーザーの入力に応じてモデルやビューを呼び出す。

## 次回の記事

ASP.NET MVCでページを編集・追加する

https://qiita.com/shironana/items/41c35b5ca3c2532f5ad9
C#の開発環境を構築する【Visual Studio】

## 本記事のゴール
- Visual Studio をインストールし、起動を確認する。

## Visual Studio インストール

1．Visual Studio のダウンロードページから、コミュニティ版をインストールします。

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

![image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/db653ea7-021b-318b-25e9-61646bb10ce1.jpeg)

2．ダウンロードされた VisualStudioSetup.exe を実行します。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/c90af8ce-cee1-291d-4530-626aa158bdd8.png)

3．各条項を確認し、続行を押します。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/8a8e0573-ded9-a11e-fe94-07d5e184244c.png)

4．利用目的に応じたワークロードを選択します。今回はASP.NETによるWebアプリケーション開発を行うため、「ASP.NETとWeb開発」を選択します。その後、右下のインストールを押します。

:::note
各コンポーネントは後から追加でインストールすることが可能です。
:::

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/ba94e362-59a4-8359-3167-14f4985c3d7d.png)

5．インストールが完了した後、再起動をします。

![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/1402dcc9-4e03-71be-18a4-4006106ba6c9.png)

6．Visual Studio を起動します。

![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/38452e73-5a47-5022-9aca-28bb512d4772.png)

7．Microsoftアカウントや配色の設定を行います。今回はスキップします。

![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/6f820b67-95f4-0ebc-5545-a8b0dfbc6243.png)

8．以下のような画面が表示されれば成功です！

![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779418/b1973dec-2d74-d19e-da7f-7ef714bc4f1b.png)

## 次回の記事

Visual Studio でWebアプリケーションを作成する。

https://qiita.com/shironana/items/ae99eb267cc2b1cce04c
ETFの年間リターン計算

新NISAが始まったのでどのETFを買えばいいか悩んだのでつくったよ。
プロンプトやターミナルでたたけば結果見れるよ。
著者の環境はMacOS

必要なこと
まず、yfinance をインストールすること。
やり方
```terminal
pip install yfinance
```
これを叩くだけ(pipのバージョンが低いと怒られるので怒られた場合は↓を叩いてみてね)
```terminal
 pip install --upgrade pip
```
デフォルトだとバージョンが低い可能性もあるので
pythonを最新にする(筆者はデフォのバージョンだったので必要なモジュールがなかったためアップデートした。）
```terminal
pyenv install 3.9.1
```
そしたら最新にしたのを設定
```terminal
pyenv global 3.9.1
```
```python

import yfinance as yf
import pandas as pd


etfs = ['VYM', 'HDV', 'SPYD']

#5年間のリターン
data = yf.download(etfs, start='2018-01-01', end='2023-01-01')['Adj Close']

# 結果を計算
annual_returns = data.resample('Y').ffill().pct_change().mean()

#結果を出力
print(annual_returns)
```


実際の出力例
HDV     0.100599
SPYD    0.099556
VYM     0.127432
dtype: float64
OAuthとOpenID Connect

## 対象の読者
- OAuthの基本的な概念を学びたい人
- OpenID Connectの基本的な概念を学びたい人
- OAuthとOpenID Connectの違いがわからない人


## はじめに
OAuthとOpenID Connectを学ぶ前に、まずは認証と認可について理解することが重要です。
- 認証
認証とは、あなたがあなた自身であることを確認するプロセスのこと。
- 認可
認可とは、あなたがアクセスできる情報や機能を決定するプロセスのこと。


## OAuth（Open Authorization）
OAuthは、ウェブサービスやアプリケーションにおける認可を提供するプロトコルで、主に特定サービスのデータへのアクセス権限の管理を可能にします。このプロトコルは、外部のクライアント（アプリケーションやサービス）がユーザーのリソースへのアクセスを許可するための仕組みを提供します。例えば、ユーザーが別のアプリケーションを通じてGoogleのアカウントにアクセスを許可する際、OAuthが活用されます。

OAuthを使用することで、ウェブアプリケーションがユーザーのパスワードを保持する必要がなくなり、代わりにセキュアなアクセストークンが使用されるためセキュリティが向上します。ユーザーは自身の認証情報を直接提供することなく、外部アプリケーションにアクセス権を委譲することが可能です。

認証コードは、ユーザーの認証を確認するために使用され、認証コードがアプリケーションに渡される時点でユーザーが正常に認証されていることが確認されます。成功した認可により、SNSプロバイダなどからアクセストークンが発行され、これを用いてユーザーが認可した情報にアクセスできます。アクセストークンが無効になった場合、リフレッシュトークンを使用して新しいアクセストークンを取得できます。

※OAuthは主にアクセス権限に焦点を当てており、厳密な認証には適していません。
※ユーザーの認証に重点を置く場合は、認証に特化したプロトコルであるOpenID Connectを使用することが推奨されます。


## OpenID Connect
OpenID ConnectはOAuth2.0の上に構築されており、認証と同時にユーザー情報を取得できるようになっています。この拡張により、外部クライアントアプリケーションは認証だけでなく、ユーザーに関する情報も取得可能です。

IDトークンはOpenID Connectで導入された特別なトークンであり、認証情報を提供します。IDトークンにはユーザーの識別情報(ユーザーIDなど)が含まれています。

クライアントアプリケーションはIDトークンを使用してユーザーを認証し、同時にユーザー情報を取得できます。これにより、外部アプリケーションはユーザーが誰であるかを確認し、ユーザーに関連する情報にアクセスできます。

OpenID Connectは認証のセキュリティと信頼性を向上させるために設計されており、アクセストークンだけでなくIDトークンも使用して認証を行います。これにより、認証の信頼性が向上し、クライアントアプリケーションはIDトークンを検証してユーザーの認証が正当であることを確認します。これにより、アプリケーションは認証されたユーザーに対して信頼性のあるサービスを提供できます。

## OAuthとOpenID Connectの違い
OAuthは、主にアクセス権限の付与と管理に焦点を当てたプロトコルで、クライアント(アプリケーションやサービス)がユーザーの代わりにリソースにアクセスするための仕組みを提供します。OAuth 2.0では、認可コード、アクセストークン、リフレッシュトークンなどを使用して、ユーザーが認可した範囲内でのアクセスを可能にします。

OpenID Connectは、OAuth2.0をベースにして認証と認可のためのフレームワークを提供するプロトコルです。OIDCは、OAuth 2.0の機能に加えて、ユーザーの認証を確認するためのIDトークンを導入しています。これにより、クライアントアプリケーションはユーザーが誰であるかを確認し、ユーザーの情報を取得できます。
定例の会議に自動で入ろう(for Windows)

これは

https://qiita.com/advent-calendar/2023/works-hi

のシリーズ3 16日目の記事です

## 定例の会議の時間を気にしたくないんだ

現在、フルリモートで仕事をしているのですが、フルリモートの会社はそれはそれで「定例のオンライン会議」というのがあったりします。

物理的に出社をしていれば声掛けで気づけたりしますが、オンラインだと気づく間もなく会議が始まっている　ということも。
※しかも都度発生するタイプの会議なら声掛けなどがあることもありますが、定例の会議については定例なのでそういうものも無く……

ただ、この手の「定例の会議」というのは例えば

 * Zoomの定まった部屋で定例の時間に始まる
 * googleMeetの定まったアドレスで定例の時間に始まる

などと、「定例の時間でどっかのURLを叩けば入れる」物が多い気がしています。

なので私は、**それならば定例の時間に会議室が自動で上がる様になってしまえば良い**んじゃないかな　と感じました。

実際、この仕掛けを現職に入社直後に１時間ぐらいでさっと組んで、１年半ほど使っているのですが、

 * 参加がほぼ漏れないのでギリギリまで別の作業に集中していても大丈夫
 * 会議に遅れて入ると他の参加者に迷惑をかけちゃうのが自分の心理的に大分嫌なのだけど、そういう心配もなし(※待たせるのは嫌なんだけど、待つのはあまり苦痛ではない)
 * 結果、大丈夫なので心理的に超安全

と、いいこと尽くめでした。

## 定例会議を自動起動するために何してんの？

基本的にはバッチファイルを起動すると所定の時間まで待って（待つようにループして待ち続け）、所定の時間になればループを抜けて、会議を立ち上げるコマンドを起動しているだけです。

追記(2023/12/18)：この方式の何が嬉しいかというと、ユーザー権限に依らずに自動起動処理を実現しやすい一点に尽きます。
※単にユーザー権限でコマンドプロンプトを実行でき、.netFrameworkにアクセスでき、会議アプリが起動できる/ブラウザがキックできるなら動く筈なので。

ちなみにWindowsではファイル名を指定して実行（Windowsキー+R）で shell:startup と打つと、各人の環境のスタートアップフォルダが出てくるようになっているのですが、毎日Windowsをシャットダウンして起動している人であればこのスタートアップフォルダに作成したバッチファイルを入れておけば勝手に起動時にバッチが上がって会議を上げてくれるようになります。

●スタートアップフォルダ立ち上げ用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144657/9773339a-bf66-3616-1bbd-579c08f8bffd.png)

●スタートアップフォルダ ※バッチファイルは入ってないが、入れる先のイメージとして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144657/b31c3fce-07a5-edaf-c8d9-661f8d1bc321.png)

### 現在のバッチファイルの中身

下の例では夕刻の定例会議（17:20開始なのでその3分前の17:17）に起動するように処理を仕掛けています。
起動時間を変更したい場合は「rem まずは時間を取得」の次の行の hour や minute の引数を変更してみてください。

また、所定の会議の時刻より後にバッチを起動した場合はタイマー処理に入らず止まるようになっているので、コマンドプロンプトのウインドウを消すなりなんなりしてもらう感じの運用想定です。

```dosbatch
@echo off

rem 定例会議あげもれ防止くん  Write:ditflame 2022/7/5

rem まずは時間を取得
for /f "usebackq delims=," %%a in (`powershell "(get-date -hour 17 -minute 17 -second 0).tostring('HH:mm:ss.0')"`) do set tm=%%a
for /f "usebackq delims=," %%a in (`powershell "(get-date).tostring('HH:mm:ss.0')"`) do set now=%%a

rem 所定の会議時間の後に起動したケース（再起動）とかではpauseしといて手動で終了させたいのでここで止める
echo ～ここで止まったのであれば会議開始以降の時間なので上げたい場合はEnterおしてね～
if %now% geq %tm% pause

echo タイマ起動…

rem ここで時間まで待ってくれる
echo.
echo %date% %time%
rem tm 時間まで待つ
powershell "$w = [DateTime]'%tm%' ; if ((get-date) -lt $w) {  $w = new-timespan -start (get-date) -end $w ; Start-Sleep -seconds $w.totalseconds ; $ws = New-Object -com Wscript.Shell}"
echo %date% %time%
echo.

rem 会議を起動してくれる
start https://meet.google.com/【ここは実際の起動するショートカットから拾おう】

goto :eof

```


ちなみにZoomの場合は最後の「会議を起動してくれる」のセクションはこんな感じになります

```dosbatch
rem zoomを起動してくれる
set MEETINGID=【ミーティングIDを入れよう】
set PASSWORD=【ミーティングに参加するURLから拾ってこれるパスワードを入れよう】
start zoommtg:"//zoom.us/join?action=join&confno=%MEETINGID%&pwd=%PASSWORD%"

```

ちなみに年に数回程度ですがなんかタイマーが死ぬ事があります。
WindowsUpdateとか裏で噛むとだめだったりするのだろうか？　などと思っています（ので、一応スマホのタイマーなども併用して漏れを防止してます。）

## おわりに

こういう簡単な仕掛けでちょっとした改善を積み重ねるのが自動化や改善のコツなのかなぁ　という気がしています。

そういえばこんな本に今年寄稿していたのでした。

https://nextpublishing.jp/book/17144.html

まあ食指が動きそうなら。

※ちなみにこの記事は完全書き下ろしなので本の内容と被りはないですｗ

### 参考にしたもの

なおこのバッチのアレンジ元としては、ここらへんの記事を参考にさせてもらった覚えがあります。大変助かりました。
https://qiita.com/tootwotoh/items/94e8e49cd73e69e9c971
【TailwindCSS】groupの使用方法


以下のように`group`を使用すると親要素に基づいてスタイルを設定できます。

```html
<!-- 親要素にgroupを記述して子要素にgroup-hoverなどを記述する -->

<a href="#" class="group block max-w-xs mx-auto rounded-lg p-6 bg-white ring-1 ring-slate-900/5 shadow-lg space-y-3 hover:bg-sky-500 hover:ring-sky-500">
  <div class="flex items-center space-x-3">
    <svg class="h-6 w-6 stroke-sky-500 group-hover:stroke-white" fill="none" viewBox="0 0 24 24"><!-- ... --></svg>
    <h3 class="text-slate-900 group-hover:text-white text-sm font-semibold">New project</h3>
  </div>
  <p class="text-slate-500 group-hover:text-white text-sm">Create a new project from a variety of starting templates.</p>
</a>

```
標準SBOMフォーマットについての解説

# はじめに
さて、本日はSBOMフォーマットの話題です。
SBOMの非常に重要な要素のひとつが<font color="Red">**Automation Support**(**自動生成や機械可読性など、自動化に対応していること**)</font>です。大規模なシステムや製品であれば、数十～数百個のコンポーネントを内包していることもあるため、機械処理できないと大変ですよね(とても、読めないし、書けない)。そして、機械処理するためには、内容や書き方、粒度などを統一する必要があり、書き方のルールを定めた「**フォーマット**」を定義する必要があります。
SBOMの標準フォーマットは、[The Software Package Data Exchange(SPDX)](https://spdx.dev/)、[CycloneDX](https://cyclonedx.org/)およびSoftware Identification (SWID) tagsの3種類とされており、実務ではSPDXとCycloneDXを活用されているケースが多いようです。
# SPDX
SPDXは古くからソフトウェア部品の主にコンプライアンス関連の情報を記述するためのフォーマットとして活用されてきたものですが、2021年5月の米国大統領令（EO #14028）からの一連のSBOMの議論の中で推奨フォーマットのひとつとして言及されたことから、実質上のデファクトスタンダード的なポジショニングで語られることが多くなりました。V2.2.1が**ISO/IEC 5962:2021**として国際標準化されており、RDF, XML, xlsx, tag-value, JSON, YAML等のファイル形式で表現することができます。現在の最新バージョンは[v2.3](https://spdx.github.io/spdx-spec/v2.3/)で、近日中にv3.0のRC2が発表される予定です。その成り立ちから、**ライセンス情報を伝達するための項目が豊富**です。
# CycloneDX
CycloneDXは、完全自動化可能で**セキュリティに特化したBOM規格**です。 SBOMフォーマットの標準の開発を目標として、[OWASP（Open Worldwide Application Security Project）](https://owasp.org/)のプロジェクトによって、2017年に開発されました。CycloneDXは汎用性のあるBOM規格であり、ソフトウェアだけでなく、SaaSBOM、HBOM、OBOM、VEXなどの規格がサポートされており、さまざまな使い方が想定されています。現在の最新バージョンは[v1.5](https://cyclonedx.org/docs/1.5/json/)で、XML, JSON, Protocol Buffers(protobuf)等のファイル形式で表現することができます。
# SPDXとCycloneDXの特長
SPDXとCycloneDX、いずれも古くから活用されているフォーマットであり、実績があります。ざっくりいうと、<font color="Red">**SPDXはライセンスコンプライアンスの目的に強く、CycloneDXはセキュリティの目的に強い**</font>、ということになりますが、「どちらが優れている」というようなものではなく、目的や用途、状況(例えば、提供先からの指定など)に応じて適切な方を選択して使用してください。
下記の図は、NTIAのSBOM最小構成(The Minimum Elements)を例にとり、SPDXとCycloneDXの該当項目をマッピングしたものです。

![MinimumElements.PNG](![MinimumElements.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528217/088a61e8-1531-9dec-442f-02214bc4f57b.png)
 
SPDXとCycloneDXでは、有するパラメータが異なるため、一方のフォーマットに限定してデータ管理をしていると、もう一方のフォーマットに対応できなくなってしまいます。SBOMは「他エンティティと情報をやりとりするためのフォーマット」と理解し、社内でのデータ蓄積・管理ではどちらのフォーマットにも対応できるように、必要なデータ項目を網羅しておくのがおすすめです。十分なデータがあれば、必要に応じてどちらのフォーマットのSBOMファイルを生成することが可能です。(SPDXとCycloneDXの変換をおこなうツールもありますので活用してみてください。)
【Flutter】今年触れた技術について〜Retrofit〜

今回記載するのは、Retrofitというパッケージになります。
では行きます:writing_hand:


## Retrofit

https://pub.dev/packages/retrofit

これは、Androidネイティブの開発をしているエンジニアの方は馴染みがある名前になりますね！
機能も同様でAPI通信で馴染みのDioを使いやすくしたものになります。
注意点としては、AndroidのRetrofitの作者とは異なるのでその点は注意が必要です。

現在(2023/12/15)Likeが1468とこれまで紹介してきたものと比べると少ないですが、そこそこ有名なものになります。

ただ私は触ってみましたが、実際にAPI通信のパッケージとしては採用せずにhttpというパッケージを採用しました。

https://pub.dev/packages/http

この辺は触ってみて自身に合う方を採用してみるといいと思います！！

では、また明日〜〜
PowerAutomateでクラウドフローからデスクトップフローが呼び出せなくて詰まった話

![スクリーンショット 2023-12-14 154616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/1e01fb53-63c2-9955-6c01-d4d1d875b458.png)

このエラーが出ている人向け対象方法を書いています。

### 対処方法概要

・個人ユーザ（企業アカウントでPCにログインしてない人）はローカルアカウントでWindowsにログインしなおしてドメイン名\ユーザ名で接続せよ
・ドメイン名\ユーザ名はコマンドプロンプトで「whoami」せよ
・組織ユーザ（企業からもらったアカウントでPCにログインしてる人）はAD管理してる部署に問い合わせよ

### 問題：クラウドフローからデスクトップフローが呼べない

![スクリーンショット 2023-12-14 154616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/1e01fb53-63c2-9955-6c01-d4d1d875b458.png)

1番最初に書いたようにこのエラーが出てクラウドフローからデスクトップフローを呼ぶことができません。

エラーが起きていた当時の状況
- PowerAutomateMachineruntimeにマシンは登録済
- 自PCのドメイン名\ユーザ名、パスワードで認証できない
- 確実に間違ったドメイン名\ユーザ名、パスワードでも同様のエラーが発生する

解決策
- ローカルアカウントでWindowsにログインし直す

クラウドフローからローカルマシン（自PC）のデスクトップフローを呼び出すには、ローカルマシンとの接続を確立する必要があります。

ローカルマシンと接続を確立できる方法には2種類あり、
- Windowsに「ローカルアカウント」でログインしてドメイン名\ユーザ名で認証する
- Windowsに「ローカルアカウント」でログインして「ActiveDirectory」のドメイン名\ユーザ名で認証する

Windows11をセットアップした時にログインしているアカウントは「ローカルアカウント」ではなく「MSアカウント」だったことが今回のエラーの原因でした。

恥ずかしながら、「ローカルアカウント」にログイン＝Windowsにログインだと思っていたので解決に時間がかかってしまいました。

しかしインターネット上で同様の事象で悩んで解決したという事例が見つからなかったため、今回自身の反省の意味も込めて記事にさせていただきました。

PowerAutomate、MSLearnで勉強していますが便利で最高です。
どんどん自動化しちゃうぞ～！
【Flutter】今年触れた技術について〜freezed〜

今回記載するのは、freezedというパッケージになります。
それでは行きます:writing_hand:

### 環境
Mac OS:Sonoma14.1.2
Android:33
Android Studio:Android Studio Giraffe | 2022.3.1 Patch 4

## freezed

https://pub.dev/packages/freezed

こちらはデータクラスとそれに付随する必要なコードを自動生成してくれるパッケージになります。
現在(2023/12/15)Likeが3323ととても有名なパッケージになります。

コードの自動生成すると.freezedや.gという拡張子のファイルが生成されます。
(余談ですが、自動生成コマンド実行前にエラーが出た状態でコマンドを打つので本当に大丈夫なのかいつも心配になります:joy:)

また自動生成したファイルをコミット対象に含めるのかはいつも議論になるところですね。(皆さんどうしているのだろう？？)
私としては含めて管理するべきだと考えています。(その方がレビューしやすいことなどが理由)

では、また明日〜〜
未来のエンジニアから学んでみよう

## はじめに
本記事は[NSSOL Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nssol)の16日目の記事です。はじめてNSSOLのアドベントカレンダーに参加しました。拙い文章ですが、よかったら読んでみてください。

## 急速に進むプログラミング教育
2022年4月より高等学校で「情報Ⅰ」が必修化されることが以前話題となったが、実は小中学校においても既にプログラミング教育は必修化されている。（小学校では2020年、中学校では2021年より）

 下記資料によると、小学校では算数や理科の授業内で論理的思考力を養うという。例では図形を書く方法をビジュアルプログラミング言語であるScratchを用いて導く問題が挙げられている。
 私は大学生時代に小学生向けプログラミング教育のボランティアをした経験があり、実際に似たような問題を教えたこともあった。

https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/05/21/1416331_001.pdf

## 未来のエンジニアから学んでみよう
ボランティアをした際も、ITネイティブな小学生たちのプログラミングスキルには関心させられた。中にはfor文を知っていてプリントに書いている子もいて、彼らが大人になる頃には私はカタコトなプログラミングを書くおっさんになるのかもしれない……と恐れ慄いた。

そんな将来有望な小中学生エンジニアから学べることはたくさんあると思う。この記事ではScratchで公開されている面白いプロジェクトを紹介する。

### Scratchとは
[Scratch](https://scratch.mit.edu/)は子供向けの教育用ビジュアルプログラミング言語であり、ブロックを並べるようにしてコードを記述していく。


下記ページからコードの作成ができるので、触ったことのない方は遊び感覚で触ってみると面白いと思う。

https://scratch.mit.edu/projects/editor/?tutorial=getStarted

作成したプロジェクトは公開することができ、他の人はコードを見たり、自分の作品として改造ができるリミックスをすることができる。明らかに大きいお友達が作ったであろうクオリティの高いゲームが並ぶが（[スイカゲーム再現](https://scratch.mit.edu/projects/911281961/)しているのとか、[3Dゲーム](https://scratch.mit.edu/projects/926935828/)はかなりすごい）、なるべく子供っぽいものを探していくことにする。

https://scratch.mit.edu/explore/projects/all

以下の理由から原則、公開されたプロジェクトのコードは閲覧できるらしい。
>「中を見る」ボタンを消し、リミックスできなくするオプションが欲しいと思っている人もいる。それは次のような理由からである：
・ただのコピーのプロジェクトが作られないように多くの努力をしている場合。
・どのように動いているか見られたくない場合。
・コードをいじってゲームをしてほしくない場合。
教師が、生徒たちに他人のソースコードをみて課題を解いてほしくない場合。
しかし、Scratchチームは創造的な学習機能を取り除きたくないため、これらの提案は今のところ実現されていない。リミックスを禁止することは、Scratchのモットー「Imagine, Program, Share」（想像、プログラム、共有）に反する上、Scratchのクリエイティブ・コモンズ・ライセンスにも反する。

このポリシーはとても良いと思う。複数人で開発をすることになれば自分の書いたコードを共有することは当たり前だし（それが途中だったり、自分が考えたすごいコードでも）、世の中にOSSはありふれている。

### [爆笑アニメ _ 第1話　野球](https://scratch.mit.edu/projects/927010454/)
野球のアニメーション。
最後のTo Be Continued が出てくるタイミングが面白いなと思った。矢印が出現するまでと、矢印が出現するときの音楽が別々に用意されているのだが、絶妙なバランスでうまくつながっていた。矢印が出現すると他のスクリプトをストップさせてTo Be Continuedのミームを再現しているのもよい。そんなこともできるんだ。

### [計算クイズ～1.7～](https://scratch.mit.edu/projects/892662878/)
小学生らしさが感じられてめちゃくちゃ良い。
正解した数をカウントしていて最後に全問正解かの判定をしているところがすごい。正解の場合と不正解の場合で犬の反応が変わるのも面白かった。

### [Mario Clicker](https://scratch.mit.edu/projects/864078209/)
プロフィールに10歳と書いてあってびっくりした。クオリティが高すぎる。クリックと放置をするだけのシンプルなゲームではあるが、能力を強化できるのが楽しい。ショップメニューの表示、どうやっているんだろう。コードを読んでも分からなかった。
つい、Achievementをすべてクリアしてしまった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625261/ee387091-a461-d00f-ffa4-36022a682130.png)


## 終わりに
意外とクオリティが高すぎるプロジェクトが目立ち、子供が作っていそうなものをあまり発見できなかった。~~普通にスイカゲームで遊んでいたら書く時間がなくなった~~
タイトルに未来のエンジニアと書いたが、彼ら彼女らは既に僕より立派なエンジニア/プログラマーなのかもしれない……
【Go】golang-migrate × sqlboiler で migrateしたmysqlのtableを自動でmodel化する

# はじめに
本記事ではgolang-migrateとsqlboilerを使ってmysqlのtableを自動でmodel化する方法についてまとめます。

:::note warn
dockerの扱い方については解説しません
:::


# 環境
- go 1.21.5
- golang-migrate v4.16.2
- sqlboiler v4.15.0

# 最終的なディレクトリ構成
```zsh
.
├── app
│   └── domain
│       └── models // この中にmodelが生成されています
│           ├── boil_queries.go
│           ├── boil_table_names.go
│           ├── boil_types.go
│           ├── boil_view_names.go
│           ├── mysql_upsert.go
│           ├── schema_migrations.go
│           └── users.go
├── config.toml
├── data
├── database
│   └── migrations
│       ├── 000001_create_user_table.down.sql
│       └── 000001_create_user_table.up.sql
├── db
│   └── my.cnf
├── docker-compose.yml
├── go.mod
├── go.sum
```

# dockerコンテナの立ち上げ
mysqlのコンテナを立ち上げます。

# migration
まず、golang-migrateのインストールを行います。
```zsh
brew install golang-migrate
```

次に、以下のコマンドをプロジェクトディレクトリで実行します。
```zsh
migrate create -ext sql -dir database/migrations -seq create_user_table
```

`database/migrations`はmigrationファイルを管理したいディレクトリ名、`create_user_table`は生成されるsqlファイルの名称になります。

上記コマンドを実行すると、指定のディレクトリにsqlファイルが2つ生成されます。
upがついているsqlファイルには以下を記述します
```sql
CREATE TABLE `users` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NULL DEFAULT NULL
);
```
downがついているファイルには以下を記述します。
```sql
DROP TABLE IF EXISTS users;
```

以上の操作を行った後、

```zsh
migrate --path ./database/migrations --database 'mysqlのアドレス' -verbose up 
```
を実行するとusersテーブルが作成されます。

```zsh
migrate --path ./database/migrations --database 'mysqlのアドレス' -verbose down
```
を実行するとusersテーブルが削除されます。

他のテーブルを追加したい際も同様の手順でmigrateする事ができます。
以上がmigrateの手順です。

# modelの生成
続いて、migrateしたtable情報を元にmodelをsqlboilerで自動生成します。

sqlboilerのインストール
```zsh
go install github.com/volatiletech/sqlboiler/v4@latest 
```

まず、プロジェクトファイル直下にdb設定を記述したtomlファイルを用意します。

:::note warn
あくまで例なので環境に応じて変更してください
:::


```toml
[mysql]
dbname = "golang_test"
user = "test"
pass = "test"
host = "test"
port = 3307
sslmode = "false"
```

その後、以下のコマンドを実行します。
`-o` optionには生成するディレクトリを指定します。
```zsh
sqlboiler mysql -c config.toml -o app/domain/models --no-tests 
```

すると、指定ディレクトリにmodelが自動で生成されます。

しかし、このままだとpackage errorが出ているかと思うので

```zsh
go mod init 'プロジェクトディレクトリ名'
```

```zsh
go mod tidy
```

を実行します。

これでエラーが解消されます。

以上でmodelの自動生成が完了です。

# 終わりに
今回はmodelを自動生成する方法についてまとめてみました。
sqlboilerはgormと比べて、migrate機能がないため、他のツールと併用する必要がありますが、modelに優秀なメソッドが生えるのに加えて[こちら](https://github.com/volatiletech/sqlboiler?tab=readme-ov-file#benchmarks)のベンチマーク結果にあるように、あらゆる面でパフォーマンスで優れていそうです。

まだまだ使いこなせていないので、使い方について模索していこうと思います。
第二世代　バッテリーリフィル

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の20日目です。

ERS-210のバッテリーについて、Loïc POLLIERさんのレポジトリbattmonを参考に、一から勉強したメモをまとめています。
https://github.com/lpollier/battmon/tree/master

ヤフオクで購入した機体のバッテリーは完全放電して液漏れしていましたので、battmonの手順に従いセルを交換しようと思います。また、作業中に気づいた重要そうな点をまとめました。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

:::note
業務外の個人的な検討活動です。
:::

#### 手順で気づいた重要な点
- EEPROMの内容は必要であれば書き直す
- セルを取り付ける前にトラップ部を無効にする
- 充電してBQ2040のキャリブレーションを促す

特に2番目と3番目は気づくまでフューズが切れたりaibo本体が起動しなかったりで散々でした。

#### EEPROMの内容の変更
セルの容量が変わった場合や充電回数をリセットしたい場合は、18日目の内容を参考にしてEEPROMの情報を書き換えました。
https://qiita.com/nakmura/private/5e313057527ebb8f6b8d
セルをニコイチする場合は変更しなくてもよかったです。

#### セルを取り付ける前にトラップ部を無効にする
battmonでも特に記載されていますが、下記のテスト端子間を一時的に短絡させます。
1. TP4/TP5とTP12を短絡させる；Q8をオフにしてFuse切断機構を無効化する
1. セルをはんだ付けする
1. TP4/TP5とTP24を一瞬、短絡させる；GNDとBAT-の電位を合わせる
1. TP4/TP5とTP12の短絡を解除する

個人的にハマったのは3.の「一瞬」というところでした。battmonには"a split second"と書いてありましたが、ちょい押しみたいな一瞬で実施して2度フューズが切れました。2-3秒短絡させるようにしてからはフューズが切れなくなりました。
また、GNDとBAT-の電位が揃っているか判断するとき、battmonは”TP4/TP5とTP24の間の抵抗が0Ωに非常に近い"で判断していましたが、フューズを切ってしまった時もその状態で判断してしました。今回の検討では、GNDとBAT-の電位が揃った結果、IC200の3.3v生成用のレギュレータの出力が3.3Vになっていることを確認するようにしました。

#### 充電してBQ2040のキャリブレーションする
aibo本体にとりつけてステーションに載せる、ステーションのサブバッテリー充電器にバッテリーを接続し、充電が完了するまで待ちました。
battmonには"TIPS and tricks"と書かれていたので他の作業が終わってから読もうと思ったのですが、この作業をしないとバッテリーは使用できる状態にならないようです。
20日目のバッテリー残量チェッカーも、キャリブレーションするまでは残量なしの表示になりました。
https://qiita.com/nakmura/private/323822b798a539dcd42a

今回の実験ではキャリブレーションが完了するまで約1時間くらいかかりました。もちろん充電中は目を離さないようにしていました。

#### 動作確認
やっとERS-210が目の前で起動しました。
だいたい2か月くらいかかったのでリフィルされたバッテリーを15,000円で買った方が早かったと思いましたが、EEPROMのテストクランプをつかったり今まで個人的に謎だった技術を勉強できてよかったです。

#### 警告をもう一度
今回のAdvent Calenderでバッテリーセルの交換について考察しますが、非常に危険ですので知識と教養を深める目的で調べたことをまとめました。
十分な安全対策を講じなければ、実行することはお勧めできません。
重要なことなので、もう一度書きます。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::
超初心者の困りごと　「階層って何？」　mkdirでフォルダの作成が出来ない。

◎この記事は、中年のおじさんが勉強をする中で気づいたことや失敗や解決した事を記載する、もしかしたら誰かの役に立てたらいいな・・的内容です。

■なんなのこれ？　「階層って何？」　git mkdir でディレクトリ（フォルダ）の作成が出来ない。

git勉強しているんです。超・超初心者なので、本当にすみません。
だけどコツコツ勉強してまして、今日は「git　mkdir」で新しいディレクトリを作るぞ！ってなもんです。

いつもの通り、ハイできない！！💦
超初心者のおじさんは考えてもわからない。だけど負けない！！

結局、色々調べたら「階層」が合っていない。すなはち作りたい階層へ移動していないので
作っていても見えていない。
他の階層に作られていたのが判明。

①user@usernoMacBook-Air ~ %cd [作りたい階層のパス名」
②user@usernoMacBook-Air ~[作りたい階層のパス名」 %git mkdir [作りたいファイル名]
⇨①で階層移動をした後にgit mkdir　だよ〜。

本当にコマンドって理屈があって全て繋がっているので、一つでも異なるとエラーないし動かない。
本当に勉強になりました。

まだまだ未熟者だけど、少しでもQiitaの皆さんに追いつけるよう感張ります。前向き明るく頑張ろう！！
SwiftUI TextFieldのdefault フォーカス設定

# Textfieldのdefault フォーカス設定
- 画面表示時設定

```

struct ContentView: View {
    enum FocusedField {
        case firstName, lastName
    }

    @State private var firstName = ""
    @State private var lastName = ""
    @FocusState private var focusedField: FocusedField?

    var body: some View {
        Form {
            TextField("First name", text: $firstName)
                .focused($focusedField, equals: .firstName)

            TextField("Last name", text: $lastName)
                .focused($focusedField, equals: .lastName)
        }
        // または 
        //.defaultFocus($focusedField, .firstName)
        .onAppear {
            focusedField = .firstName
        }
    }
}

```
【Python】非推奨になった関数やメソッドのリプレイス工程にとっても便利な`typing_extensions.deprecated`

## はじめに
ある関数やメソッドを非推奨にして今後リプレイスしていくということは開発時によくあることだと思います。

しかし、特徴的な使われ方や名前であるならまだしも、使われ方も名前も似ている関数やメソッドがそのようなリファクタリングの対象だと非常に視認性が悪く作業効率が低下しうっかりバグを埋め込んでしまうかもしれません。

```py
# 下記のようなディレクトリ構成と仮定
# .
# ├── __init__.py
# ├── demo.py <- このファイル
# ├── lib_a.py
# └── lib_b.py

# demo.py
from . import lib_a, lib_b


def main():
    lib_a.foo()
    lib_b.foo()

if __name__ == "__main__":
    main()
```
このようなコードで「`lib_a.foo`は非推奨でリプレイスするけど、`lib_b.foo`はそうではないので**気を付けて**」と言われたら、かなり慎重な作業をしなければならず精神的に疲弊してしまうでしょう。

これを解決するのが[PEP702](https://peps.python.org/pep-0702/)で導入されPython3.13より標準ライブラリ入りする予定の`typing_extensions.deprecated`です。

## ランタイムの動作について
`typing_extensions.deprecated`はデコレータとして使われ、実行時に呼び出されると引数に渡した文字列のメッセージを持つ`DeprecationWaring`を表示します。
```py
# lib_a.py
from typing_extensions import deprecated


@deprecated("削除予定")
def foo():
	...
```
```
>>> python -m samples.demo
...\samples\demo.py:10: DeprecationWarning: 削除予定
  lib_a.foo()
```
これだけであればよくある実行時に非推奨であることを表示する仕組みです。
`typing_extensions.deprecated`の真価は、VSCodeの`Pylance`のような、IDEと型チェッカーが組み合わさった開発環境で発揮されます。

## IDE表示の変化について
**VSCode・`Pylance`によって、`typing_extensions.deprecated`でデコレートされた関数には打ち消し線が引かれます**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364180/13920b66-13d8-cf0d-803a-4b90bedafb71.png)
**かつ、マウスオーバーするとツールチップには引数に取ったメッセージを表示してくれます**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364180/45c6d61b-d2e7-610a-4d29-058595bdda1d.png)

これは非常に視認性がよく、単体テストが網羅していない場合でも型チェッカーが静的解析で探してくれるため非常に便利です。

## 一部の呼び方だけ非推奨にする
デフォルト値付きの引数を持つ関数が引数名なしで呼び出されている場合、一見してパラメータの意味が分からないときがあります。
```py
def main():
    lib_b.bar()  # 引数なしで呼び出せるのか。
    lib_b.bar(30)  # 30ってなに?
    lib_b.bar(timeout=20)  # やっと意味が分かった!
```
これの視認性をよくするために、今後のコードでは引数名を指定することを推奨したいです。
しかし、実装を`def lib_b.bar(*, timeout=60)`としてしまうと引数なしで呼び出されている既存コードで実行時エラーとなってしまいます。
そんなとき、`typing.overload`と`typing_extensions.deprecated`を組み合わせると実行時エラーを起こすことなく同じ関数の特定の呼び出し方をしている部分のみ、打ち消し線をIDEで表示させることができます。
```py
from typing_extensions import overload
from typing_extensions import deprecated


@overload
def bar(): ...
@overload
@deprecated("タイムアウトは名前付きで指定すること")
def bar(timeout, /): ...
@overload
def bar(*, timeout=...): ...

def bar(timeout=60):
    ...
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364180/88616627-bb4f-1fa2-c097-b68270524345.png)

**この使用法の注意点としては、`overload`と`deprecated`でデコレートした呼び出し方で呼び出しても、実行時に`DeprecationWarning`は表示されないことです**。
関数の呼び出し方による警告を実行時にも表示するには、そのための分岐を別途実装に追加していく必要があります。

## まとめ
VSCode・`Pylance`・`typing_extensions.deprecated`の組み合わせは、非推奨となった関数やメソッドを視認性よく表示させる強力な機能です。
Python3.13以降は標準ライブラリ内部に`warnings.deprecated`として追加されるので、特別な用意をすることなくリファクタリングの役に立つこの機能を使えるようになります。
これによって、実行時の動作への影響をなるべく抑えたリファクタリングがはかどっていくと考えています。
ほんの少しでもメンバーに寄り添いたいという優しさをもったテスト作り

最近趣味で様々な勉強会やプロジェクトに参加させていただいてます。
いろんな立場や世界観を知りたいと思ったのがきっかけです。
そんな中

**「良いチームは、どれだけ仕事を理解しているかではなくどれだけメンバーを理解できているか否か」**

そんな風に感じるようになりました。

「題目に何の関係があるの？」

と思われる気がしますが、後ほど。
さて本題といきましょう。

## 難題「テスト項目書の改修」

9月末くらいに開発プロジェクトのPMから「テスト項目書の改修」を依頼されました。

改修理由としては
- わかりずらい
- どういう条件をどの粒度まで書けば良いか。
- テスト作成後に漏れがあることが

人によってテスト観点が異なることから、作成者によって記載粒度が異なるという問題点がありました。
解決にあたり、きっと同じような課題を抱えている仲間がいるはずだと思い、インターネットの力を頼りました。

結論を言うと

**「どう言う観点でやれば良いかという記事はたくさんあるが、その解決策はなし」**

困りました。

「できませんでした」で許してもらいたい。


## 経験によらないテストケース


調べている中で、素敵な論文がありました。

https://www.jstage.jst.go.jp/article/kaihatsukogaku/42/1/42_15/_pdf

日本工学開発学会が出している「開発工学」に特集されていた内容です。
経験によらないようにする仕組みの構築が必要であると考えたことから実証実験を行った結果が記載されていました。
結論
**「手順化されていればある程度のものを若手でも作成できる。しかし熟練者との差異はすべて埋められるわけではなく「テストに関する知識」の有無が大きく影響する。」**


やはり知識があるかないかがポイントなようです。

ちなみに以前どんなテストがあるかまとめたことがあります。
きっとこの知識は最低ラインなんだろうな。

https://qiita.com/mooooroi/items/a2461c5406ba4b1f0414

ちなみにこの記事、こちらのリストにも入れていただいてます。

https://qiita.com/NullPointerException/items/fca7cbd205f7445f7e87

インターネット上には「テスト観点」に関する記事が多く存在します。
**「具体的にどう対応すれば良いのか」**
と文句を言っている私みたいなのは論外なんだろうなと思います。

まずはじっくりテストについての知識を吸収することから始める必要があるのです。
とはいえ、早急にテンプレートを作らないと・・・瞑想、迷走。

## テスト項目書のテンプレートを作ろう

ネット上にたくさんテンプレートが掲載されていましたが、どれもしっくりいくものではありませんでした。どんな点に注意すれば良いのかしっかり説明してくれている記事はたくさんあるのに。

こちらの記事でもテンプレートについて触れられていました。

https://qiita.com/jun2014/items/cad7328978e709fe79f4

私なりにも、何を意識すれば良いのか考え、下記のポイントを絞り出しました。

**1. テスト項目書だけみて、どういったシステムなのか理解できるか**
**2. 掲載すべき内容が明瞭か**
**3. 正常系・異常系**

ちなみに現在のプロジェクトはスプレットシートでテンプレート作成しております。

### 1. テスト項目書だけみて、どういったシステムなのか理解できるか

精度を高めるためにも実装者やテスト作成者とは別の人がテストを実施することが大半です。
そのためテスト項目書に書いている内容がよくわからず、実装コードをみたり、設計書をみたりと資料を漁って解決することがありました。
その無駄を省けるテンプレートを心がけました。

また内容がわからず迷子になったとしても、
**「何を見れば良いのか」** 
導線がはっきりするようにもしました。
具体的にはバックログやPRリクエストのリンクがわかりやすいところに用意しました。

### 2. 掲載すべき内容が明瞭か

今までのテンプレートは「テスト結果」という欄に
「〇〇な表示になる」
「〇〇なデータができる」
など様々な情報を同一のセルに記載する形となっていました。
このため、記載漏れが生じやすい状況になっていました。
そこで
- 用意するデータ（テーブル名欄・カラム名欄）
- 動作方法
- 結果（データ関係以外）
- 結果（データ関係※こちらは別シートにまとめて記載※リンクを貼ることで誘導）

というようなことを項目わけて記載できるようにしました。
テンプレートに項目として用意することで、記載漏れが防げる確率が高まっているのではないかと思いました。

### 3. 正常系・異常系

僕は「異常系」について考えるのを忘れてテスト項目書を作成することがよくあります。
**「思うように動くのだからO.K.」**
そんな風に楽観的に考えてしまうことからですね、きっと。

そんな自分への戒めとして新規でこのテストが「正常系」によるものか「異常系」によるものがを判定できるようにしました。
これによりテスト観点が網羅でき、精度の高いものがリリースできるようになります。

### その他

メンバーのリクエストとしてテストのNG回数が自動的にカウントできるようにGASを組みました。これにより、実装精度が一目瞭然となりました。


## 気になるテンプレート

こちらにテンプレートを貼ろうかと思いましたが、著作権が私ではなく、チームにある気がしたので貼ってません。みたい方はこそっと教えてください。

## テスト自動化しないの？

さて、強強エンジニアの皆様はきっと思われたと思います。

「こちら自動化しちゃえば？」

確かにそうかもしれません。しかし項目書に起こし、コツコツ手作業で進めることにはいろいろな意味があると思います。

一番は
**「ユーザーの気持ちになれる」**

ではないでしょうか。

実際に触ることで、感じられることも多々あります。
これは自動化してしまうと感じることができません。
もちろんテスト実施には自動化以上に時間がかかったりします。
テストデータ作りに意識が朦朧とし、自動化すれば楽なんだろな・・・とぼやいたこともあります。
しかし「自動化」しないからこそ得られる視点もあるのです。

**「良いチームは、どれだけ仕事を理解しているかではなくどれだけメンバーを理解できているか否か」**

このメンバーには **「利用者、ユーザー」** も含まれると思っています。

みんなの立場を理解できるチームが素敵だと思いませんか？

以上です！

お読みいただきありがとうございました!!
山口でゼミ３

## 山口でゼミってなに？
皆さんは「山口でゼミ」って聞いたことありますか？
その名の通り，山口県で行われるゼミのことです．簡単ですね．

今回はこの「山口でゼミ」の宣伝をしていきます．

## 山口でゼミの基本情報
実はこの記事，投稿日の１時間前に書いているので時間がありません．
これも全て実験，テスト，レポートなどを課してくる化学科が悪いです．僕は悪くないことに十分注意してください．

しかし，基本情報なしに宣伝をしてもあまり効果がないことも事実です．
ですので，いくつかの参考文献を以下に示しておきます．

１．「2回目のScientia Meetupを運営した話」
https://note.com/ritsuki_second/n/n191db814e420
↑代表の書いたnoteです．

２．「Scientia Meetup 公式HP」
https://sites.google.com/view/scientia-meetup

あとはTwitterで「#山口でゼミ」「#山口でゼミ2」で検索すると，いい感じの情報を得ることができます．

## 山口でゼミ３
続いて来年の３月に行われる「山口でゼミ３」の説明に入りましょう（早口）（公開まであと30分）．

開催日は**3/21～3/23**の３日間です．
本当は４日間にしたかったんですが，施設の都合で無理でした．悲しいね．

参加費は**10000円**くらいです．
実際はこれよりも数百円くらい低くなる予定ですが，10000円を想定してください．

ゼミの分野は数学，物理，化学，生物，情報，地学の**６分野**で，テーマは**10テーマ**あります．
詳しくは公式Twitterを確認してください（下）．
https://x.com/yama_seminar/status/1735585506304610564?s=20

個人的には「多孔質構造体入門」と「一般相対論へのいざない」が気になりますね．まあ，僕はゼミに参加できないんですけど（血涙）．

## 応募方法やイベント詳細
応募は以下の Google Form より行ってください．
https://t.co/15JpsnTueR

イベント詳細は以下のpdf
https://t.co/lcUNDrXSJP

または，質問Form（下）を利用してください．
https://t.co/AuVgHDIsMt

皆さんの参加を心より楽しみにしています！！！

## おわりに
だいぶ短くなってしまいましたが（残り12分），山口でゼミのことが少しでも伝わったでしょうか？
「気になるけど，実力がない．．．」とか「勉強についていける自信がない．．」なんて思っている人，大丈夫です．もし分からないことがあってもゼミのメンバーがきっと引っ張ってくれます．

大学生の春休みって長いですが，思ったよりもやることはないと思います．
是非，山口に来て有意義なゼミをしましょう！！！
mayaで ファイルを開かずにreferenceしてるファイルを知りたい2


mayaで ファイルを開かずにreferenceしてるファイルを知りたい 
https://qiita.com/9boz/items/10da0a3c9ba4f4305925

承前

なんかうまく行かない奴
-

実際の案件データで試していたところ、アセットを何も使ってないと返ってくるファイルが多数。
maファイルの中身を覗いてみると

```
file -rdi 1 -ns "hoge" -rfn "hogeRN" -op "v=0;" -typ
		 "mayaAscii" "C:/Users/kubo/Desktop/tama.ma";
file -r -ns "hoge" -dr 1 -rfn "hogeRN" -op "v=0;" -typ
		 "mayaAscii" "C:/Users/kubo/Desktop/tama.ma";
```

改
行
かよ！（伯方の塩の感じで

対応
-

1行ずつ評価はするとして、
- file  で始まって、 ;  で終わってる場合は従来通りその行を取得
- file  で始まって、 ;  で終わっていない場合は、次以降の行も連結させる。
- 行の連結が始まっていて、　;  で終わってる場合は行の連結を終了

とかですかねぇ


雑改造
-

```python
def getReferenceFilePath(sceneFilePath):
    allFilePath = []
    
    with open(sceneFilePath,"r") as f:
        lines = f.readlines()

        tmpString = ""
        for l in lines:            
            if l.startswith("file -r"):            
                if l.endswith(";\n"):  
                #1行で完結してるパターン
                    tmpString = l.split(" \"")[-1]
                    referenceFilePath = tmpString.replace("\";\n","")
                    
                    if referenceFilePath not in allFilePath:
                        allFilePath.append(referenceFilePath)

                    tmpString = ""
                    continue      
                else:
                #1行で完結してないので、連結開始
                    tmpString = l.replace("\n","").replace("\t"," ")                    
                    continue

            elif l.startswith("file -r") == False:
                if tmpString != "":
                #連結受付中
                    if l.endswith(";\n"):
                    #連結終了
                        tmpString = tmpString + l.replace("\n","")
                        tmpString = tmpString.replace("\t"," ")
                        
                        tmpString = l.split(" \"")[-1]
                        referenceFilePath = tmpString.replace("\";\n","")
                        
                        if referenceFilePath not in allFilePath:
                            allFilePath.append(referenceFilePath)
                        
                        tmpString = ""
                        continue     

                    elif l.endswith("\n"):
                    #連結継続
                        tmpString = tmpString + l.replace("\n","").replace("\t"," ")
                        continue
                else:
                #連結受付してない
                    tmpString = ""                    
                    continue                            
        f.close()

    return allFilePath
    
sceneFilePath = "C:/Users/kubo/Desktop/refTest.ma"
print(getReferenceFilePath(sceneFilePath))
```

おっけぇ　改行対応はなんとかできました。
まだ見ぬ障害はあるかもしれませんが、一旦これにて〆ます。
業務自動化を「ゲーム世界」と比較してみた

## はじめに
こんにちは。
自称自動化マニアです。
今回は世間で話題な業務自動化をゲーム視点を取り入れて考えていきたいと思います。

私についてなのですが、
よくminecraftで自動化modを入れて遊んだり
![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630992/fb55059b-86a6-3bd0-1b95-74b3b758bea6.jpeg)

steamでセールがあるときは「自動化」タグで検索したりして常にディグって自動化ゲームを遊んでいる輩です。
![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630992/bf4638d9-05c7-3243-170b-2873f6cf814c.jpeg)

自己紹介はここまでにして、
それでは業務自動化をゲーム世界と比較し、考えてみましょう！

## ゲームでの自動化の定義
ゲームでの世界で生産性向上を目的とした自動化を考えたとき、メリット、デメリットを次の2つの目線で考えることができます。
1. ゲーム世界目線
2. プレイヤー目線

**ゲーム世界目線**
| メリット | リスク |
| --- | --- |
| 資源管理の簡略化、複雑な構造の構築可能 | ゲームのバランス崩壊 |

**プレイヤー目線**
| メリット                                   | リスク                             |
| ------------------------------------------ | ---------------------------------- |
繰り返し作業からの解放、より高度なゲームプレイへの導入 | ゲームの基本的な楽しみ方の変化、過度な自動化による挑戦性の欠如 |

このとき、二つの目線でリスクを回避した選択できるタスクは以下のような量になると考えられます。
![Untitled.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630992/f72233bb-1dfa-46e4-7e48-f682b29e37c6.jpeg)

ゲームでの自動化の定義では個人が定めるゲームの楽しみかた、バランスがもし柔軟であれば、自動化してもよいタスクはかなり多いと考えられます

## 業務自動化の定義
では、現実世界での生産性向上を目的とした自動化を考えたとき、メリット、デメリットを次の目線で考えることができます。
* 会社目線
* 労働者目線  

しかし、業務では自動化を考えるときもう一つ重要な目線が必要です。

そう、それは**お客様目線**です。
業務ではこれがないと会社の利益を継続的に上げていくことは**不可能**です。

つまり、業務での自動化を考えた時、必要な目線は次の三つです。
1. 会社目線
2. 労働者目線
3. お客様目線

**会社目線**
| メリット | リスク |
| --- | --- |
| オペレーションの最適化、人的資源の再配分 |  技術依存度の増加、初期投資コスト |

**労働者目線**
| メリット                                   | リスク                             |
| ------------------------------------------ | ---------------------------------- |
単純作業の軽減、スキルアップの機会。 | 職の喪失、スキルの陳腐化 |

**お客様目線**
| メリット | リスク |
| --- | --- |
| より迅速で正確なサービス |  個人化されたサービスの欠如、人間らしい対応の減少 |



このとき、3つの目線でリスクを回避した選択できるタスクは以下のような量になると考えられます。

![ああ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630992/bd7d90a6-0823-54b2-b219-6a1c524b8a2a.jpeg)
二つより三つの目線のほうが、当たり前ですが自動化してよいものは限られてきます。


つまり、現実世界において、お客様目線は非常に重要です。
自動化がもたらす迅速さと効率性は顧客にとって大きなメリットですが、個人化された対応や人間らしい接触の欠如は顧客体験を損なう可能性があります。
だから、自動化を進めつつも顧客のニーズや期待に応えるバランスを取ることが重要です。

## 結論
**なんでもかんでも自動化するのは違うよって話。**

今回ゲームと比較して伝えたかったことは、
**「個人でなにかを自動化して、効率化するのはリスクは少なく、メリットは多い。**
**けど、会社単位で自動化を考えるとき、自動化をする背景（お客様）をちゃんと見ないと怖いリスクに遭遇するかも。」** です！！！

たまには、こんな記事も楽しいね！！！
今年の量子コンピュータ活動を振り返る

Kumaは(99%趣味で)量子コンピュータをやっています。

# 今年やったこと/見聞きしたこと


## 連続量 x 光量子 x 量子機械学習

いろいろな理由で光量子もやりたいなと思ったので、Pennylaneのデモを参考に連続量で量子機械学習をやってみました。
さすがに場の量子論は忘れてたので、苦戦しましたが、最低限の変分ゲートセットの動きを理解して、回帰をやらせてみました。
光量子で古典光の問題を解く　ということに何かロマンを感じたので、toy problemですが実際に解いてみました。
で、その　連続量光量子量子機械学習（必殺技かな？）で学会へ論文を投稿したところ、Oral acceptされました。
- 去年は離散量量子機械学習で分類問題を解いてみたのだけど、Oral落とされてPoster採録だったので、進歩しているかもしれない。

## 量子誤り訂正符号

Post表面符号として、量子LDPC(Low Density Parity Check)符号が注目されているらしいです。
LDPC符号は、古典では現状もっとも強力な符号として知られています。
（このQiitaの記事も、LDPCで誤りから守られることで配信されています）
量子でもやっぱりLDPCなのかぁ　と感慨深いです。

古典のLDPC符号の基本的な考えは、「復号計算量を抑えながら符号長を長くする」です。
符号長を長くすると、大数の法則から、誤りは統計に従うので、扱いやすくなります。
しかし符号長が長いほど、復号の際に「ありえる送信符号語の候補数」が指数的に増えてしまうので、復号が困難となります。
LDPCの場合、これを　符号を定義する生成行列をスカスカにする("Low Density")とか、局所情報を計算グラフでやりとりすることで効率的に復号する（特に並列化がしやすい）といった手法で巧みにカバーしています。
LDPCの用途は、知るだけでも
- 光ファイバ通信(都市間・大陸間)
- 衛星通信(DVB-S2)
- 無線通信(4G,5G)

と、無数にあります。逆にLDPCが使われないのは、復号器の回路のコストが許されない用途 or/and ランダムエラーよりもバーストエラーが多い　(Fiber to the homeとか QRコードとか)に限ります。

LDPCは復号が効率的ですが、といっても大規模な数値演算となります。
そのため、低コスト用途には　Stair Case符号というものがでてきています。
Stair Caseは、短い符号を部分的にオーバーラップさせながらつないでいくことで疑似的に長い符号長を実現するものです。
復号も端からスライディングでやっていきます。
(LDPCでも同じようなアイデアがあって、空間結合LDPCとかLDPC畳み込みとかよばれます）

**もしかすると、量子でもStair Caseのような「複数の符号の疎結合」が出てくるかもしれません。**
Quantum Stair Case 符号!?

また、誤りのある量子回路を通信路とみなせば、最適な符号語というのは、量子回路の統計的性質に依存するかもしれません。
例えば誤り訂正符号化をしたとして、その論理状態を生成するためのコスト（ゲート数など）が妙に高くついてしまう　ということはありえると思います。
このような場合、「論理状態を生成するコスト（ゲート数かもしれないし、制御パルスの所要エネルギーかもしれない)」や「論理状態同士の”距離”」といった物理的な制約までも考慮した符号語が、End-to-endでみると最適な符号化になっていることがあるかも、ということです。
これは通信路理論で言うところの　**符号化変調**　の概念です。
つまり、符号というのはデジタルの世界に住んでいるんだけども、実際にそれを物理で実現したとすると、そこにはアナログ的なコスト（エネルギーとか）がついて回るので、それも含めて最適化しないといけないよ、という話です。
関係あるかもしれないし、ないかもしれません。

あとは、**軟判定**とか**ターボ符号**ですかね。そのうち量子版が出るかも。

## 中性原子/冷却原子/リードベルグ原子
物理量子ビットの”移動”が可能なので、非隣接のCNOTが必要な量子LDPCには向いているらしいです。
でも”移動”はまだかなり遅いそうです。。

## QSVT(量子特異値変換)
1年遅れぐらいですが勉強しています。Qiitaにも記事書いてます。
いろんなアルゴリズムを見通しよく理解できる一般化になっています。

## QKD
学会でたまに聴講しています。最近は古典光と同時伝送するというPoCが流行っているようです。欧州中心。
古典光と同時伝送すると、光ファイバ中のラマン効果というやつで量子光がやられます。
なので、古典光と量子光は、200 nm以上離す必要があります。(100 nmぐらいだとラマンにやられます)
ただ既存の光ファイバNWは古典光のために作られたものなので、中継間隔は長いし、実験室に比べるとだいぶロスも大きいです。
そこで量子光を飛ばせる区間がどれぐらいあるのか、とかリアルなことを考えてしまいます。
新しくファイバを引けばいいじゃないか、と思うかもしれませんが、、
古典伝送のための光ファイバが枯渇してきている現状でも、めったなことではファイバを引こうとはしない（コストがとてつもなくかかる）ので、QKDのため（だけ）に敷設するというのはまずないと思います。
学術ネットワークだったらありえますが。
**QKDは、やはりPoCで止まるんじゃないかという気がしています。**
希望的観測としては、コスト度外視の防衛用途でしょうか。防衛費盛り上がってますしね。

## 勉強会
量子統計力学をやっています。難しいですが、久しぶりに物理の脳が動くのは楽しいです。


# まとめ
量子コンピュータを本業にする気はないのですが、やはり学術的にも工学的にも面白い分野です。
来年度も量子はちょこちょこやっていきます。
【SwiftUI】ウィジェットの周りのマージンをなくす（iOS17）

# はじめに
iOS17からウィジェットの周りに余白が付くようになったみたいです。

そんな邪魔な余白をなくすってのが今回の記事の目的です。

![Simulator Screenshot - iPhone 15 - 2023-12-15 at 22.29.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b3dcce73-f729-4154-81d0-2423149ce700.png)

こんな感じ

# 実装
```diff_swift
struct DemoWidgetExtension: Widget {
    let kind: String = "DemoWidgetExtension"

    var body: some WidgetConfiguration {
        IntentConfiguration(
            kind: kind,
            intent: DemoWidgetConfigurationIntent.self,
            provider: Provider()
        ) { entry in
            DemoWidgetExtensionEntryView(entry: entry)
        }
+       .contentMarginsDisabled()
        .configurationDisplayName("DemoWidget")
        .description("ウィジェットの説明")
        .supportedFamilies([.systemMedium, .systemLarge])
    }
}
```

# おわり
余白が消えましたーばんざーい

![Simulator Screenshot - iPhone 15 - 2023-12-15 at 22.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/27cacf26-937f-d87a-68ee-93a6c830ec2b.png)

# 公式ドキュメント
https://developer.apple.com/documentation/swiftui/widgetconfiguration/contentmarginsdisabled()
CanSatが動かない話@能代


この記事はCanSatチームFUSiONのアドベントカレンダー2023，13日目(12月15日)の記事です。

https://adventar.org/calendars/9518

## 記事の内容
CanSatランバック部門という20cmくらいのロボットを高いところからパラシュートで落として目的地に向かわせる大会に出場した。結果いろいろ失敗したのでアンチパターン的にまとめた。

## 作ったものの仕様
幅22cmの機体に直径14cmのタイヤがついている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533947/74a12cf5-a794-fdef-ceb8-49d2780b1bda.png)
メインのマイコンがRaspberryPiPico
サブのマイコンがRaspberrypiZero
あとモタドラとかSDカードとかIMUとかGNSSとかカメラとか乗ってる
### 思想
メインの処理は書きやすいからラズピコ
カメラの処理をしたいのでラズパイゼロ
GNSSとIMUで近づいてカメラで目標地点の三角コーンに向かうCanSatではメジャーな奴

## アンチパターン

#### １.モタドラの定格は余裕を持とう

https://www.tamiya.com/japan/products/89865/index.html

タミヤモータ君の思わぬ電力消費にモータドライバTB67H450は過電流保護を発動させた。モータドライバの定電流機能を使って電流を2.5Aに制限して頑張って動かした。１か月ぐらいロスした。モタドラの定格は余裕を持とう。

>なおブレッドボードでの実験中はジャンパ線の抵抗値によりICの電流制限機能が機能して、結果として過電流保護が発動せずに見かけ上正常に動作していた。
#### ２．モタドラの過電流保護は過信しないようにしよう
動かせたけど今度は過電流保護貫通してモタドラのmosfetがたまに焼けるようになった。割とどうしようもない面もあるけどモタドラはいっぱい買っておこう。
#### ３．I2Cを信じすぎないようにしよう
I2Cで動くセンサ類をブレッドボード上で実験するとき、ジャンパ線の接触とかで割と接続が切れる。ちゃんとエラーハンドリングして再接続するようにしよう。なおmicropythonのI2Cには接続失敗時にエラーを出すのではなくフリーズすることがあるので可能ならsoftI2Cを使おう。[^1]
#### ４．ＢＮＯ０５５はクオータニオンを使おう
このモジュールは勝手に内蔵のマイコンでカルマンフィルタをかけて磁気センサ、ジャイロセンサ、加速度センサの値を統合してくれる機能がある。これは非常に便利だが、起動直後に向いていた方向をしばらく北だと思い続ける仕様があったり、ピッチとヨーが45°以上ずれた方向を向く場合オイラー角の出力数値がずれるという問題があるので意識する必要がある(1敗)。可能ならクオータニオンで処理することで対処可能。
#### ５．入手できない部品を設計に使わないようにしよう
秋月の発売終了になったGNSSモジュールを使うために古いやつを引っ張り出したらしばらく使っているうちに衛星をロックする速度がどんどん下がっていって最終的に曇ってると受信しないGNSSが誕生した。設計段階で入手性の高い部品を使うようにしよう。
#### ６．電源スイッチはつけよう
なくても行けるか☆という心で作成したが普通にデバッグで不便だった。せめてフライトピンとかつけないとパラシュート切り離し機能の誤爆とかが発生してまずい。
>実際に、パラシュート切り離し機能をデバッグ時にハードコードして無効化していたのを忘れて機体を投下してしまった。電源スイッチつけよう。
#### ７．低電圧ロックアウトをつけよう
実験中機体の電源を入れっぱなしにして忘れた結果7.4VLiPoが5Vになったりした(3敗)。PchMosとかでUVLOを作ってつけておこう。

## まとめ
以上のように装置の開発では様々な問題が発生する。少なくともこの記事を読んで同じ失敗をする人が１人でも減ったならば幸いだ。また、究極的な失敗原因として開発期間の不足があり、試験機作成→改良を満足に行えないと失敗が発生するため締め切りには余裕を持とう。[^2]

[^1]: ウォッチドックで頑張るという手もあるかもしれない。
[^2]: 私たちは審査書締め切り数時間前に試験に成功した。
第二世代　本体の内蔵電池交換

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の20日目です。

ここまでERS-210のバッテリーについて調べていましたが、aibo本体にも二次電池が内蔵されています。
充電操作しないまま放置されていたので、その二次電池も充電あるいは交換が必要なようです。

内蔵電池の電圧が低いと起動できない場合もあるとのことだったので交換しようと思います。
https://hyper-air.hatenablog.com/entry/2015/03/31/140712

:::note alert
警告
この記事について作者はいかなる責任も負いません。
:::

:::note
業務外の個人的な検討活動です。
:::

#### 胴体部分の分解
手足や頭、しっぽのモジュールを取り外し、胴体部分を分解していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/9055bb1f-bed7-0198-7a06-6e696b4b195e.png)

無線モジュールのジャックの裏側に二次電池を見つけました。
ML621の容量は5.8mAhとのことで非常に小さいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/a4f97ab1-7a0d-ada5-71e6-c08a229c73e9.png)

ERS-11xと違い、かなり小さくなっていました。
これはERS-111の内蔵二次電池です。VL2330の容量は50mAhとのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/2391b8ca-8bb3-c61c-934d-a7cc128e849f.png)

今回は容量が少し多めの電池を選定し、はんだごてをつかい電池を取り外して、交換しました。
https://www.amazon.co.jp/gp/product/B07MSGHG2K

これで不安な要素を一つ減らせました。
SourceTreeで部分コミットと削除：Hunk・選択した行ごとのステージングと削除

# Hunkとは
英語のHunkには「塊（かたまり）」などの意味があります。
「Hunkは変更点の塊」を指定してステージングすることができる。
SourceTree上で緑になっているところがHunkです！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/b7318fbd-a55e-74c3-3b29-c567fcdd48dd.png" width=700>


# Hunkごとの部分コミットと削除
### Hunkごとの部分コミット
SourceTreeのワークスペース -> 履歴のステージングに未登録のファイルを選択する！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/1d21fbac-ba80-e0c4-2bb6-3d307e5581b3.png" width=700>

一番右上のHunkをステージングに移動のバタンを押すと、Hunk1:行15-22だけがステージングされる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/78868464-3ef2-5c22-9bc1-adab305371b8.png" width=700>

ステージングされ、Hunkの塊単位での部分コミットができる！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/fe8df4a8-5d46-4927-da55-24e8a83f0cfd.png" width=700>

### Hunkごとの削除
右上のHunkを破棄を押す！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/cac23e3b-d6b0-506e-f1c8-be33b8ad74b1.png" width=700>

OKボタンを押すとHunkをすべて破棄することができる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/2f3e294c-c853-94a3-f7e5-f2831b6abea2.png" width=700>

SourceTree上でprint("Hoge")Hunkが削除され、Xcode上でも削除される！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/1243f950-47e7-79c8-ad0c-5a5fce73cf79.png" width=700>

# 選択した行ごとの部分コミットと削除
### 選択した行ごとの部分コミット
ステージングしたい行をクリックし、行をステージングに移動ボタンを押す！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/822c1864-93a8-3760-6c22-de10584f9d92.png" width=700>

行単位で、ステージングし、コミットすることができる！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/5f961b3d-8c11-d973-34a3-3395f19b0156.png" width=700>

### 選択した行ごとの削除

行単位で、ステージングし、行を破棄ボタンを押す！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/cac13f57-8e94-20e2-3d45-e7bf380764ab.png" width=700>

OKボタンを押すと選択した行を破棄することができる！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/c3f3d193-831d-104b-1676-bf2d3e145a8b.png" width=700>

SourceTree上でprint("Hoge")行が削除され、Xcode上でも削除される！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/0fdab4a5-d708-3991-0dde-d7a00cd69beb.png" width=700>
# 参考文献

https://www.webdesignleaves.com/pr/plugins/git-hunk.html

https://qiita.com/HrsUed/items/0924c5f1f59210db3bfe

https://tyoshikawa1106.hatenablog.com/entry/2016/05/16/154209

https://www.webdesignleaves.com/pr/plugins/git-hunk.html
OJTの受け入れで意識したこと

この記事は カオナビ Advent Calendar 2023 16日目です。

https://qiita.com/advent-calendar/2023/kaonavi

# はじめに
自分にとって今回初めてOJTを受け入れ、トレーナーとして4ヶ月やりました。
特に誰からも教えられたとかはないので完全に我流なのですが、こんなことを考え意識しながらやってみたというのを共有できればと思います。

# 色々なことを広く浅く

フロントエンドやバックエンドどっちかをやりたい！っていう人は多いと思います。
しかし私は入社して１年目以内でどっちかって決めてしまうのはとてももったいないと思います。

私自身もバックエンドをやったりフロントエンドをやったりふらふらしているのですが、色々触れることによりたとえばAPIのレスポンスを決める時に「フロントエンドはこのようなレスポンスだと使いやすそうかな？」などフロントエンドの視点から物事を見れるようになるのでとても役に立っています。

なので今回はFE、BEはもちろん。テスト実施やクエリ作成, GASなどとにかく色々なことに触れてもらいました。

# 2on2をダラダラと
特にアジェンダなどを設定したりしない2on2を毎週金曜日におこないました。
ここでは自分たちへのFBだと思いながら、今週どうだったかやあのMTG参加してみてどうだった？などざっくばらんに１週間の出来事や関心事を聞きました。

ここで聞いたことは来週改善できるように調整したり、別のタスクをアサインしたりできたのでかなり有用な場だったと思います。

# 成功体験とても大事
これは自分がOJTに行った時に言われたことです。
自分ってこんなことできるんだという自信にもつながりますし、どうすれば成功できるのかというプロセスを知ることもできます。

今回は一人でタスクをこなせるようになるのと通常のタスク＋で仕事を振られた時にどう計画を立て達成させるかの成功体験を積ませたかったためOJT終了までにGASのシステムを改良して欲しいというタスクを渡しました。
実際にOJT終了までに隙間時間を見つけて着手していてちゃんと完了させてくれました。🎉

# 他の人を堂々と頼る
トレーナーだからといって常に付き添うことはできないですよね。
MTGやら自分のタスクもしなければなりません。

幸い私のチームでは基本的には全てのタスクはチームが持つものという考えが浸透しているため、「このタスク終わるまでペアプロお願いしてもいいですか？」など堂々と頼ることができました。
また、これには新卒側にもメリットがあると思っていて一人に付ききりになるよりも色々な人と親睦を深めたり考え方など色々な話が聞けたりするのでできるだけ色々な人と喋った方がいいと思っています。(ただの言い訳に聞こえるかもですが...)

# 反省点
やっぱりリファインメントなどでいきなり「わからないことがあったら発言してね」は難しいと感じました。
ドメイン知識が少ない状態ですし、１５人ぐらい参加しているMTGを自分都合で止められる鋼の心を持ち合わせてないと難しいですよね。

なので、我々トレーナーが発言できるように雰囲気作りをできればよかったのですが自分の意見を言うので夢中であまり気にかけることができなかったです。

ただ、先ほどの2on2など後から理解できた?などサポートはしていましたがやっぱりその場で聞けるのがベストですよね。

# おわりに
やはり人に教えることや、人を成長させることは自分自身にとってもとても勉強になります。
「あれ？自分ってどうやって成長してきたんだっけ」と振り返ってみたり、あの時こうしてたらもっと成長できただろうなと気がつくこともあります。
その体験や気づきを後輩たちに教え成長をサポートする役割はとっても大事だと思うと同時にとても難しいなと感じました。
今回色々気がつくことがあったのでまた機会があったらもっと上手くできるように挑戦していければなと思います。
ApacheでProxy 今更たけど知ってちょっと感動？

## はじめに
　ウェブサイト制作しているときに、プロキシについて気になって調べました。それが私の中でちょびっと感動したので記事にしようと思います。

## 設定
　Webアプリなどを作ったときに、いちいちポートを指定してアクセスするのは面倒なので、Webサーバーの特定のディレクトリにプロキシする設定をしました。SSL化している場合なら、`default-ssl.conf`の適当なバーチャルホストに以下のような設定を追加します。
```diff_conf
<VirtualHost www.example.net:443>
+   ProxyPass /proxy_example http://example.com:8080
+   ProxyPassReverse /proxy_example http://example.com:8080
</VirtualHost>
```
　`/proxy_example`がプロキシ先のディレクトリーです。`http://example.com:8080`がプロキシされる元のアドレスです。

## おわりに
　新しいことを、また一つ知ることができました。これからも自分の知識に磨きをかけていきたいと思います。また、以下のサイトを参考にさせていただきました。

https://qiita.com/niwasawa/items/c66cc35b52c1445d0157
【UEFN】Verseでプレイヤーにアイテムをランダムに付与してみる

## 背景
PVP系の島を作るときで**試合開始後にランダムなアイテムをプレイヤーに持たせ**たかったので調べ始めました。

## 利用するDevice
- アイテムグランター 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/00e56ae0-2eac-26bf-f41d-9523e0f81fd3.png)

## 実装方法
### 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/yRUrMy3lINE?si=bYhPG8ct1BgbctOg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### アイテムグランター設定
以下のような設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/0f1e8a17-77d1-a0a4-4258-bb7f48d99d0e.png)

### 全体コード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

sample_granter_device := class(creative_device):

    @editable
    ItemGranter:item_granter_device=item_granter_device{}

    OnBegin<override>()<suspends>:void=
        Players := GetPlayspace().GetPlayers()
            for (Player : Players):
                # 現在のアイテムを付与する
                # ItemGranter.GrantItem(Player)
                # ランダムにアイテムを付与する
                ItemGranter.CycleToRandomItem(Player)
```

ゲーム開始時にこのゲームにいるすべてのプレイヤーを取得します。それぞれのプレイヤーに``CycleToRandomItem``をすることでアイテムグランターに設定したアイテムの中からランダムに付与することができます。

## まとめ
シミュレーションゲームを作成したときに何かタスクをクリアしたらこのアイテムを付与するとかできそうですね！

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/MehcNhyxdq