OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Meta QuestのMRでオクルージョンを行う

## デモ
まずはデモです。手やコントローラーがオクルージョンされていることがわかります。ハードオクルージョンとソフトオクルージョンをボタンで切り替えています。

![MetaOcclusion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/2aad3eda-8d89-2dd8-ac23-f17060f245fd.gif)

## Depth API
Metaの提供するDepth APIを利用してオクルージョンを実現します。開発者が何か特別な実装をする必要はないので便利で助かります。

参考リンク：[Depth APIの概要](https://developers.meta.com/horizon/documentation/unity/unity-depthapi-overview/?locale=ja_JP)

以下に公式サンプルが用意されています。

- [Unity-DepthAPI](https://github.com/oculus-samples/Unity-DepthAPI)

## バージョン情報

| ツール/SDK | バージョン |
|:-:|:-:|
| Unity  | 2022.3.3f1  |
| Meta XR All in one SDK  |  71.0.0 |

## 準備
以下をmanifest.jsonに追加します。(URPを想定)

```
    "com.meta.xr.depthapi": "https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi",
    "com.meta.xr.depthapi.urp": "https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi.urp"
```

PackagesにShaderが追加されるので、オクルージョン処理を行いたいオブジェクトに対して適用すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/6b0fe141-5a65-1565-ec87-9c8a6abc4076.png)


## サンプルコード

ボタン押下でShaderのオクルージョン状態を変更するサンプルです。EnvironmentDepthOcclusionController.csはMetaの提供するコードです。


```CS

using System;
using Meta.XR.Depth;
using TMPro;
using UnityEngine;

public class OcclusionToggle : MonoBehaviour
{
    [SerializeField] private EnvironmentDepthOcclusionController _occlusionController;
    [SerializeField] private TextMeshProUGUI _currentOcclusionsModeText;

    private int _currentOcclusionTypeIndex = (int)OcclusionType.NoOcclusion;

    void Update()
    {
        if (OVRInput.GetDown(OVRInput.RawButton.A))
        {
            SwitchToNextOcclusionType();
        }
    }

    private void SwitchToNextOcclusionType()
    {
        _currentOcclusionTypeIndex = (_currentOcclusionTypeIndex + 1) % Enum.GetValues(typeof(OcclusionType)).Length;
        var newType = (OcclusionType)_currentOcclusionTypeIndex;

        _occlusionController.EnableOcclusionType(newType);

        if (_currentOcclusionsModeText)
        {
            _currentOcclusionsModeText.text = $"Occlusion mode: {newType.ToString()}";
        }
    }
}
```
生物物理班紹介

# 挨拶
初めまして。Physics Lab. 2025の暫定的生物物理班班長です。理学部物理学科の3年生です。
生物物理の自主ゼミをしたいと2年生の頃から言っていたおかげか、2年ぶりに生物物理班が復活しました。今まで紹介があった班に比べてマイナーな班かも知れませんが、今まで知らなかった方に対しても、本記事を通して魅力を伝えられたら幸いです。
以下では、大きく分けて、
(1). 生物物理学とは
(2). Physics Lab.での活動
について述べます。

# 生物物理学とは
生物物理では、特定の理論を学ぶというよりも物理を使って生物に関わる現象をモデル化し新たな知見を得ることに主眼がおかれます。
それゆえ、
① 扱う対象/方法が共に多岐に渡る
② 物理だけではなく、対象についての生物化学的現象も知る必要がある
というような特徴があります。
それぞれの点について見ていきましょう。

① 扱う対象/方法が共に多岐に渡る
扱う対象はタンパク質分子、分子間の相互作用、細胞内の化学反応、細胞の構造、形態形成(遺伝子によってどのような表現形になるか)、微生物の集団的な振る舞いなど(そしてまだ対象とされていないものもうまくモデル化できれば対象になりうる) が考えられます。
使う物理(理論的背景)は多岐に渡り、挙動を見るためにシミュレーションを使うことも多いです。例を挙げると、剛体棒からなる鎖でタンパク質(アミノ酸がペプチド結合してできている) をモデル化して、実際のデータとの整合性を調べる研究や、ギブスエネルギーと電子授受の観点から熱水噴出孔微生物の生存を議論する研究があります。(もちろん、全く異なる数学・物理を使うこともあります。)　より具体的な例としては、4日目に統計物理班紹介[^1](https://qiita.com/sheepy/items/a1b6c80c1742c67f6750) 、7日目に計算物理班紹介[^2](https://qiita.com/Daimon_37/items/0ba8954a2ae0ccc52cda)で取り上げられた2024年ノーベル物理学賞は学習・記憶という生命的事象を物理のモデルを使って記述しようとした営みであるので、生物物理にも分類されえます。[^a]

② 物理だけではなく、対象についての生物化学的現象も知る必要がある
確かに物理以外の知識も必要ではあります。
しかし、例えば、生物についての知識を網羅していなければ生物物理を勉強できないというわけではありません。最低限、知りたいと思った事象さえ知っていればいいわけです。例えば、分子モーターを熱力学的に扱いたいならその分子モーターがどういう環境にあって、どういう機能を持っていて、どういうふうに動くのかをわかっていればとりあえず十分そうです。もし、特定の問題を考えたいのではなく、生物物理ってどういうことをするのだろう？と思って概説的な本を読むならば、生物化学的現象に関する知識は、多くの場合説明が与えられています。不足していても、気になった点をその都度調べれば分かる程度です。
## 生物物理学紹介　まとめ
生物に関する現象について興味を持っていたり、隠れた法則性があるのではないかと疑ってみたりした方にとっては、まさにこれ！というような分野です。
一方で生物にあまり触れてこなかった方からすれば、物理以外の事前知識を必要とし、取っ付き難くニッチな分野と思われるかもしれません。しかし、「従来の物理では扱われてこなかった対象について、既存の知見と組み合わせてモデル化し新たな知識を得る」という生物物理の枠組み自体は生物を超え、例えば経済や都市計画、社会科学のような対象にも応用しえます。[^b]その点において、生物物理に触れてみるメリットは、元々生物に興味がなかった方にとってもあると思います。

#  Physics Lab.での活動
他の班と同様に現在は自主ゼミを行っています。
今、自主ゼミで扱われている本・扱われる予定の本について軽く紹介します。

- 『生物物理学』鳥谷部 祥一 
 構成として、まず反応速度論・非平衡統計力学+情報・ソフトマターなど網羅的な内容がまとめられていて、その後に生物への応用的な内容が載っています。全体的に物理以外のバックグラウンドの方にも読みやすいと思います。しかし、逆に言えば、背景の物理の解説が少なかったり、式が与えられるだけのこともあり、自主ゼミの中ではそこを掘り下げることもあります。本郷と駒場でそれぞれ自主ゼミを開講していて、特に駒場の方では様々な学科の人がいて議論も活発なようです。
 - 『非平衡統計力学　―ゆらぎの熱力学から情報熱力学まで―』沙川 貴大
 1細胞レベルの系は非平衡統計力学で扱われることがしばしばあります。そこで非平衡統計力学に入門しようというモチベーションの下、入手しやすさ・評判の良さを考慮して沙川先生の本で非平衡統計力学を学んでいます。自主ゼミでは、現在、第3章のゆらぎの熱力学が終わりに差し掛かっており、参加者の興味次第ではより生物への応用に焦点を当てたゼミに移行する予定です。
 - 『細胞のメカニクス(第2版)』 David Boal (著),鈴木 宏明 (訳)
  あるいは原著の『Mechanics of the cell』
 今、B2の方が企画中でまさに12/8に顔合わせ予定の自主ゼミです。第II部「膜」を中心に扱うとのことです。膜の波打ち(Membrane undulations)の章で、曲がった空間の数学的取り扱いに触れられていて面白そうです。
 また、『細胞のメカニクス』で初歩的な内容に触れたら、
 『コロイドの物理学: 表面・界面・膜面の熱統計力学』S.A.サフラン (著), 好村 滋行 (訳)に移行する予定だそうです。
 
五月祭での活動は正直あまりまだ考えられていません。
しかし、個人の意見になりますが、生物物理班での普段の活動を通じて、私含む班員が興味を広げ深めることが大事だと思っています。その結果として、生物物理の魅力をお届けできるような展示を作り上げることができたらいいなと思っています。

 # 最後に
 今回は、他の記事に時間を割きすぎたり、そもそも私の力量不足もあって、あまり多くの範囲を扱えませんでしたが、もし生物物理に興味を持っていただけたら幸いです。
 Physics Lab.の記事は今後も次々と投稿される予定です。是非お楽しみください。

[^a]:この解説を書くか悩みましたが他の方が言及してくださったので、この裏の記事の一つでは、代わりに「膜の等価回路モデル」を紹介しています。
[^b]:実際、社会を物理を使って考える分野として、「社会物理学」があります。例えば、今夏話題になっていた贈与をモデル化した論文(プレスリリース:[^3](https://www.c.u-tokyo.ac.jp/info/news/topics/20240905140000.html))の一著者である金子邦彦氏は生物物理学で表現型のゆらぎと進化について扱った方としても知られています。
KMPでデータクラスに戸惑った話

# KMPでデータクラスに戸惑った話
今回は、私がKMPでiOSとAndroidでデータクラスを共通化しようとした時に迷ったことを書きます。

## 何をしようと思ったのか
以下のデータクラスをAndroidとiOSで使用したい
このデータクラスは、Twitch APIを利用して特定のクリップを取得する際に返ってくるレスポンスです。
```
@Serializable
data class GetClipRes(
    @SerialName("data")
    val data: List<ClipData?>?,
    @SerialName("pagination")
    val pagination: Pagination?
)
```
```
@Serializable
data class ClipData(
    @SerialName("broadcaster_id")
    val broadcasterId: String?,
    @SerialName("broadcaster_name")
    val broadcasterName: String?,
    @SerialName("created_at")
    val createdAt: String?,
    @SerialName("creator_id")
    val creatorId: String?,
    @SerialName("creator_name")
    val creatorName: String?,
    @SerialName("duration")
    val duration: Double?,
    @SerialName("embed_url")
    val embedUrl: String?,
    @SerialName("game_id")
    val gameId: String?,
    @SerialName("id")
    val id: String?,
    @SerialName("is_featured")
    val isFeatured: Boolean?,
    @SerialName("language")
    val language: String?,
    @SerialName("thumbnail_url")
    val thumbnailUrl: String?,
    @SerialName("title")
    val title: String?,
    @SerialName("url")
    val url: String?,
    @SerialName("video_id")
    val videoId: String?,
    @SerialName("view_count")
    val viewCount: Int?,
    @SerialName("vod_offset")
    val vodOffset: Int?
)
``````

## 発生した問題
iOS側で、GetClipResのdataの型がAnyの配列になってしまう。
![スクリーンショット 2024-12-07 17.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953312/ac464cb7-09b0-464c-dff8-0400d014f35b.png)

しかし、Android側では問題なく利用出来る。
![スクリーンショット 2024-12-07 17.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953312/1e8efab3-aca5-f6c5-2464-af494ce5e29b.png)


## 解決法

``` diff_Kotlin
@Serializable
data class GetClipRes(
    @SerialName("data")
-    val data: List<ClipData?>?,
+    val data: List<ClipData>?,
    @SerialName("pagination")
    val pagination: Pagination?
)
```
このように変更すると
![スクリーンショット 2024-12-07 17.47.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953312/fed33c7e-89b0-178b-09c7-2ab5f78b06e4.png)
このようにdataの型が、ClipDataの配列になっている。

## 今回の反省点
何でもかんでもnull許容にするのはやめよう!
Firefox勢必見、TabCenterを使う為に余計な物を消す。

これまでFirefoxで垂直タブを有効活用するために下記2つの記事を作ったが、記載内容の変更がり、この際2つの記事を1つにまとめることにした。
https://qiita.com/takutoP_n/items/03f84097b93f935e1f74

https://qiita.com/takutoP_n/items/af3a603ad26306614127

## ①Tab Center Rebornのインストール
https://addons.mozilla.org/ja/firefox/addon/tabcenter-reborn/
![スクリーンショット 2024-12-07 173239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/e3b836c1-c7b4-9bd2-9c76-76152a8f8c74.png)


## ②プロファイルを開く
URLから```about:support```を開く。
プロファイルフォルダを開く
![スクリーンショット 2024-12-07 173414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/596b84bd-5f2c-f8f6-ee26-019e3caae045.png)

## ② userChrome.cssの作成
プロファイル内に新規フォルダ```chrome```の作成。
その中に```userChrome.css```を作成し以下のコードを追加
```
#tabbrowser-tabs {
  visibility: collapse !important;
  }
/* タブ一覧ボタンを非表示にする */
#alltabs-button {
    display: none !important;
}
```
![スクリーンショット 2024-12-07 174653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/3e9631ac-7584-c0ba-fbbc-4a46eaf23e12.png)

## ③about:Configの設定
URLから```about:config```を開き、```危険性を承知の上で使用する```をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/b0b66812-60b3-10c9-8441-cde72e8b8e72.png)

userChrome.cssを有効する為に下記を適用。
```toolkit.legacyUserProfileCustomizations.stylesheet``` → ```true```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/2138f3f5-7084-4e86-8df1-21ed2d215ff2.png)

次にFirefoxViewを消す為に下記を適用。
```browser.tabs.firefox-view``` → ```真偽値```で追加 →  ```False```
```browser.tabs.tabmanager.enabled``` → ```真偽値```で追加 → ```False```

![スクリーンショット 2024-12-07 175612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/fbed663e-207f-e5f2-a48d-ada95cae63b0.png)

![スクリーンショット 2024-12-07 175622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/753e7f8c-eb57-1f86-4860-4eac29f92209.png)

![スクリーンショット 2024-12-07 175634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/85661bc8-a32e-5ee7-b839-7c7a9e60b9fa.png)

![スクリーンショット 2024-12-07 175642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/5208410b-5fb7-3756-65e8-7622b8338c25.png)

## はい完成
![スクリーンショット 2024-12-07 175706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/d17e365a-cb85-621f-81a1-c1c82d173f98.png)
障害対応フローを見直しているお話

本記事は、[Lancers（ランサーズ） Advent Calendar 2024](https://qiita.com/advent-calendar/2024/lancers) の7日目の記事です。

Webサービス/アプリにおいて障害が発生すると、ユーザーさんに深刻な影響を及ぼし、ビジネスにとってもリスクとなる可能性があります。
発生させたくないものではありますが、発生してしまった場合、どのようなフロー・役割分担で解決に至っていますか？

ランサーズでは、現行の障害対応フローに関していくつか課題があり、CRE・SREチームを中心に見直しを行っています。

## 障害対応フローにおける課題
1) 管理プロセスの課題
    - 最終的に誰が意思決定するのかフローが煩雑
    - 旗振りが機能しているようで機能していない（仕組みとして整い切れていない）
2) 役割と責任の課題
    - アサイン先が不明なものがある、軽微な考慮漏れ・仕様不備の場合にボール浮きがち
    - 対応フローが属人化している（それぞれの裁量に任されている）
3) コミュニケーションの課題
    - 今具体的に何が起きているのかが把握しづらい

今回の記事では、1と2に関する改善案をまとめていきます。

## 改善後フロー案（アップデート中）

インシデントコマンダーが旗振り役として機能するよう、指示系統の中心に定義しました。
現状では私がインシデントコマンダーの役割を担っています。

以下、いくつかのポイントでフローを説明していきます。

![名称未設定ファイル-Page-1のコピー.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40767/db7390d6-4975-a4a9-9ac9-bbea857fd901.png)

### 速報レベル付けと障害対応フローのスコープに関して
ランサーズではS/A/B/C/Dで障害レベル付けを行っています。（Sが一番高い）
緊急度と重要度が高いS/Aを障害対応フローの対象とすることにしました。
影響範囲が比較的軽微で改善要望レベルのB以下はGitHubでIssue化してbacklog管理下におき、担当者の判断で対応となります。


### 役割分担に関して

今まで明確に決めていなかったことが、ボールが宙に浮いてしまったりふわっとさせる要因になってしまっていたな…と思います。
今回、下記分類で担当を決めることでアサイン先が明確になるのはそれぞれの領域でユーザー価値提供をするうえでもよいことだと思っています。
```
基盤：Aさん+Bさん
WEB：進行中のPJTはPJTリーダー、それ以外はCREチーム
アプリ：Cさん
会計：Dさん
デザイン・UI/UX：Eさん
仕様不備：PdM（Fさん+Gさん）
```

## さいごに

障害発生時こそ冷静な対応が必要で、予め備えておくことが少しでも早い解決につながると考えています。
実際に運用するなかで改善ポイントがでてくるかと思いますが、ひとつずつ向き合い、磨いていければと思っています。

Lancers では、一緒に働けるメンバーを募集しています！
https://recruit.jobcan.jp/lancers01/list/all/all
YOUは何しにITへ？

## 初めに

私は新卒でIT業界のエンジニアの道に踏み込み、今年人生で初めての転職をしました。
この転職は、私にとって間違いなく大成功だったと言えるものに完結することができたと思います。

転職活動は決して楽ではありませんでしたが、あの時こうしておいて本当に良かったと思える行動や考え方があったなと思うのでここに記したいと思います。

## この記事の対象者

エンジニアを目指す以下の人
* 既にエンジニアとして働いているが、これから転職をしたい人
* 別業界だが、IT業界にエンジニアとして転職を目指す人

他の業界に行くにしても大事な考え方だと思いますので、
ぜひ参考にしていただけたらうれしいです。

## あなた誰？

新卒で受託とSESやっている会社に入り3年ほどエンジニアとして仕事をしました。
受託では開発もしていましたし、SESも開発業務もあれば既存サービスの運用保守、情シスの掛け持ちするなどなかなかハードワークでしたが、仕事内容はいろいろやらせてもらえて楽しかったです。

2024年、社会人4年目にして人生初の転職を果たし、今はエンジニアとして死ぬほど楽しく働いています。

ざっくり私の転職活動期間は1年ほどかかりましたが、最高の仕事に就くことができました。

## なんで転職しようと思ったの？

私が転職活動を始めたきっかけは給料の低さでした。
自分でいうのもなんですが、派遣先では結構なマルチタスクをこなして、派遣元でも3年目という若さにしてそれなりの役職をもらえていて部下もいて育成したりしていたんですけど、それに見合う給料じゃないなということで転職してえなあ～(ずるずるずるずる)となりました。

あとSESって疎外感が死ぬほどつらいんですよね。俺もプロパーになりたい！

といった感じで転職活動に至りました。

## 転職活動で利用したもの

転職エージェント
* レバテックキャリア
* Geekly

転職サイト
* Green
* マイナビ
* リクナビ
* doda

今回は転職でこれ大事だよって考え方を伝えるものなので使用感とかは割愛します。

## 転職活動の内容

最初はお給料上がるところがいいな～といった感じで活動していました。
(そんな人、多いんじゃないですか？)

転職活動初期の話をします。
主な転職活動内容は、エージェントを使ってひたすら面接してといったことを繰り返しており、40社くらい受けて2社くらい内定しました。

内定をもらった2社なんですが、どちらもエージェント経由で受けたものでSESだったんですよね・・・

40社に対しての2社というまあまあ絶望的な内定率でしたので、まあ～「ここにしましょう！この会社こんなにいいところありますよ！」ってごり押しされるんですよ

意志の弱い人間である私はついつい手を出しそうになってしまいますが、どちらもお断りしました。

なぜならSESは絶対に行かない、自社開発企業に行くって決めていたから。

絶対譲れない条件に対する意志も固く持っておくべきだなと思います。
(エージェントは絶対に譲れない条件を1つに絞りましょうと言ってきますが、3個くらいは絶対譲れない条件を持つべきです。)

そして最初の転職活動を3か月ほど行い、疲れた私は半年ほど転職活動を休止することになりました。

まあ、3年目の平均ちょいしたくらいのお金しかもらえてなかったけど2年目とか3年目とかこんなものなのかなと・・・


しかし半年後、上との会社に対する考えがマジで無理ってなる出来事があって転職活動を再開し、そこで転職エージェントさんにも再開しますと連絡してみました。

そこで出された求人に一つ、私の中で「ここだ！！！！！！！！」と思える求人が出されます。
まさに、運命の相手です。

ざっくりどのような仕事かというとプライベートでめっちゃ好きだったものにエンジニアとして関われるお仕事です。
ここで私は、仕事内容にめちゃくちゃ惹かれて「ああ、自分がやりたかったのはこれだったのか・・・」と確信しました。

そして今、その運命の会社に入社することができ、めっちゃ楽しく働けています。

## YOUは何しにITへ？

ここまで丁寧に読んでくださった方、マジでありがとうございます。

結局私が転職大成功できた！って思えるのは、心の奥底から「これがやりたい！」「これのために生きてきた」って思える仕事に就けたからなんだと感じています。

エンジニアにもさまざまな種類がいると思っていて、
* なんでもいいから技術を使って開発がひたすらやりたい
(どんな業界にどんなものを提供したいかはあまり考えてない)
* 技術はあくまで手段で、自分が本気で取り組めるプロダクトを提供したい
* 提供する業界もさらに絞って、特定領域で仕事したい

などですかね

あなたがどんなタイプであったとしても、「心から惹かれる仕事」に出会うまで転職活動を続けるべきだと思っています。

一度は転職活動のつらさに転職をあきらめ、1年後に運命的な出会いを果たして大成功できた私がここにいるのですから、どんなに時間がかかってもあなたにもあるんじゃないかと私は思います。

**YOUは何しにITへ？**

もしIT業界に転職を目指す人がいましたら、上の言葉を自分に投げかけて全力で取り組んでほしいなと思います。
[React] 再読み込みで増えないアクセスカウンターを作りたい(localStorage、sessionStorage)

この記事は、自分のウェブサイトにアクセスカウンターを実装する過程でできたものである。

自分のウェブサイト

https://polan6.github.io/homepage/

アクセスカウンターを作る際、再読み込みをしてもカウントが増えないようにしたいと思うかもしれない。そんなとき使えるのが、`localStorage`と`sessionStorage`になる。
どちらもデータをブラウザに保存するものであるが、両者の違いは簡単にいうと以下の通り。

- `sessionStorage`: タブが開かれている間だけデータをブラウザに保存する
- `localStorage`: タブを閉じてもデータをブラウザに保存

`sessionStorage`を使えば再読み込みで増えないアクセス回数をカウントする仕様になり、`localStorage`を使えば基本1人1回のみアクセスをカウントする仕様になる。ちなみに、これらはコンソールから削除することができるので、`localStorage`を使っていてもアクセス数を意図的に増やすことは可能である。

コードは以下の通り。

```javascript
const [isLoaded,setIsLoaded]=useState(sessionStorage.getItem("isLoaded"))
useEffect(()=>{
    //本番環境かつ、ストレージにアクセス済み情報が保存されていない場合
	if(process.env.NODE_ENV==="production"&&(!isLoaded)){
		access() //アクセスカウンターを増やし、カウント数を読み込む
		setisLoaded(true)
		sessionStorage.setItem('isLoaded',true) //アクセス済み情報を保存
	}else{
		getCount() //カウント数のみを読み込む
	}
},[])
```
`process.env.NODE_ENV`については以下の記事で解説されている。
process.env.NODE_ENV ってなに？

https://qiita.com/domodomodomo/items/11852a656750733eecc7

`access()`と`getCount()`は、今回はfireStoreを用いて実装した。

```javascript
const access=async()=>{
    await updateDoc(doc(db, "access", "counter"), {
        count: increment(1)
    });
    await getCount()
}

const getCount=async()=>{
    const snap=await getDoc(doc(db, "access", "counter"));
    setAccessCount(snap.data()?.count)
}
```

Firebase・Cloud Firestoreの使い方については以下の動画や記事が参考になるかもしれない。

【2022最新版】Firebase入門！Reactと連携してデータベース接続をしてみよう

https://www.youtube.com/watch?v=9NOg_HSbo9w

firebaseでincrementを使う(公式ドキュメント)

https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja

もし何か他にいい方法があれば、コメントで教えていただきたい。
個人開発アプリでサブスクユーザー100人達成した話。

## はじめに

この記事は[🎄GMOペパボ エンジニア Advent Calendar 2024](https://adventar.org/calendars/10317)の7日目の記事です。

先日個人で開発しているiOSアプリのサブスク加入ユーザーが100人を超えました。
個人開発を細々と続けていますが、なかなか嬉しい1つの節目だったので記事にしておこうと思います。何か参考になることがあるかどうかは、分かりませんが良ければ読んでいってください！

もしこの記事を読んで、「個人開発やってみるか！」とか「久々再開してみるか！」と思ってくれる人がいたらとても嬉しいです。

そしてそして、思っただけでなく実際に行動までしてくれる人がいたらベリーハッピーでございます。


個人開発については以下の記事も書いているのでよければ！


https://qiita.com/dokozon0/items/5ce14bc210e447cc32fa


## アプリの特徴
ツール系のアプリです。使用頻度としては、毎日使うような類のものではなく月1使うかなくらいのアプリです。
中には月に何回も使ってくれてるユーザーもいるかもしれませんが、僕の想定は月1くらいです。

数字感としては、大体月に2,000くらいダウンロードされます。DAUは多い時で500人くらい、少ない時は数十人とかのときもあります。

サブスク100人達成するためには大体1年ちょいくらいかかりました。
ちなみに自分はこのアプリを全く使いません。

## サブスクユーザー100人までにやったこと
### 思い込みを捨てる
僕の中で良くない思い込みだったなという印象的なものが２つあります。

#### 「このアプリでサブスクは売れない」という思い込み
サブスクを導入するか悩んでいたとき、「このアプリでサブスクは売れない」と思い込んでいました。

なぜなら、月１回程度しか使わないアプリのサブスクにはわざわざ入らないだろうと思っていたから。

さらに初期のサブスクの構想では広告削除機能しかなかったので尚更売れるはずがないと思って導入を足踏みしていました。

でも結果、広告削除のみの機能の状態でも何人かサブスクに加入してくれました。
そして、機能も少しずつ追加した今では100人もの人がサブスクに加入してくれています。

つまり、自分が売れないと思ったものが本当に売れないかどうかなんてやってみないとわからないということです。だからとりあえずサブスクは導入してみれば良いと思います。

そもそも売れなかったとしてサブスクを導入したことのデメリットが何かあるのかと言われればないです。

売れないかも？とか考えてる間に導入してしまえば良いんです。


#### 「ユーザーは知っているはず」という思い込み

僕のアプリはタブが3つの構成になっています。
そして、一番右のメニューのタブがリストになっていてそこにサブスク加入ページへの導線がありました。

そんなに奇をてらったようなUIではありません。当然ユーザーはこのサブスクの項目を見ていて、知っているものだとばかり思っていました。しかし、実際は違いました。

あるときアプリのレビューに「課金しても良いから、広告を消したい」という要望がありました。

このレビューをもらったとき、自分が思ってる以上にユーザーはアプリのことなんて見ていないんだということを改めて実感しました。

後述しますが、ユーザーは知らないという前提で、「どう知ってもらうか」「どう使ってもらうか」を考えると良いと思います。


### 仕組みが動く仕掛けを意識する
アプリ開発者は自分で作ってるので、アプリ内のどこに何があるのか、どんな機能があるのか、どんな使い方ができるかということをよく知っています。

個人で開発しているアプリなら尚更です。全部知っています。

でも僕のアプリのレビューから分かるように、ユーザーは思った以上にアプリのことを知りません。だから、その仕組みを知ってもらう仕掛けが必要です。

僕が、サブスクの存在に気づいてもらうためにやったことは非常にシンプルでした。

アプリの機能を使ったら必ず到達する画面にサブスクの内容と機能の概要を載せたバナーを表示しました。加えて、メニュータブにもサブスク加入ステータスを表示したりしました。たったこれだけ、ただサブスクがあることの露出をちょっと増やしただけですが、サブスクの新規加入者率はざっくりな計算で20%くらいは上がりました。

## 今後やっていきたいこと
一応今後やろうと思ってることも書いておきます。

### 数字を見てあれこれ
今あまり数字からこの機能を入れてみようとか、見せ方を変えてみようとかいうことはやっていません。
しかし、アプリをもっと拡大していくためにはどこかで必要な能力だと思うのでこの辺もやっていきたいと思います。

### アプリ自体への流入を増やす
ASOはある程度意識して調整をしました。
今後もっとアプリを大きくしようと思うとやっぱりシンプルにアプリに入ってくる人の量を増やすというのは１つの手になります。
広告費を大胆に使うみたいなことはなかなかできないなぁと思うので、SNSの活用をうまくしていきたいなと思っています。


## サブスク100を達成してみて思ったこと
まず自分のアプリから収入があるというのが嬉しいです。

ただお金という面だけでなく、自分の生み出したものをたくさんの人が使ってくれているというのもまたすごく嬉しいです。

自分が企画し、慣れないながらUIを考えて実際にコードを書いて形にし、どうやったらもっと良くなるのかを考えて改善をしてきました。

そのアプリに対してお金を払い続けても良いと思ってくれる人がこの世の中に100人もいるってすごいなと思います。

このアプリを世に解き放ててよかったです。もっと良い感じにしていきたいです

## 番外編
僕はアプリ内で課金されるたびにSlackに通知が飛ぶようにしています。
これ結構おすすめです。テンション上がります。
![スクリーンショット 2024-12-07 15.50.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644705/b7d13e43-4aa1-d87b-9e5c-3281814b784e.png)


## さいごに
いろいろ書いてきましたが、この記事で僕が伝えたかったのは主に2つです。

「思い込み捨てよ！」「仕掛け考えよ！」

ということです。いや、違いました...

**「いいから、個人開発やろうぜぇぇえええ！楽しいからっっっ！！」**

でした。本当に伝えたかったのは。

いつでも個人開発談義できる人募集してます。
Xで仲良くしてください。では！！

https://x.com/dokozon0
12/7 OSC福岡 参加レポート

（アドカレネタで埋まっていたため即投稿はしていないが、ライブ感を大事にしたいので、投稿日のまま編集せずにおく）

:::note warn
13時までは登壇準備のため集中できておらずうまくまとまってないです
:::

:::note warn
17時のLT会で、途中まで飛び入り参加するつもりで話すネタを考えていたため、途中がとびとびです
:::

## Docker + GPUで生成AIに挑戦してみよう
https://github.com/shimataro/dok-examples

実行コマンドとかもあるね
高火力DOKの無料枠\3,000（期限なし）と\20,000（期限あり）がもらえる（こっちはブースへ行こう）

無料枠いただきました！さくらさんはイベントの度にキャンペーンを打ち出してくれるのでうれしい！

## neo4j(グラフデータベース)
いつも話は聞いてみるんだけど、どうやって使うかのイメージがわかなくて何もやってない
誤解を恐れずに言うと、ノーコードDB？
クラスタリングが可視化されてるイメージ。リレーション？はノードかな

やるやる詐欺をしているので、いい加減にやる（詐欺）

## AIとオープンソースを使った最新ウェブアプリ作成手法について
:::note warn
ディスカッションしたかったのに、この後登壇で時間が取れずお話しできませんでした。
また何かの機会でお話ししたいです。
:::

めっちゃ人おるやん！
フロントエンドはbolt
バックエンドはなんだっけ、便利なやつ
Websimでグラフィカルなものを作る

replit
zeroなんとか
phind
tripo
felo

動作環境（動かし方）の作り方を学ぼう

AI情報だけを集めるXアカウントを作って育てる
GAS生成AI・GAS連携コードエディタもチューニングできる環境（GPTs）に置いている

## （展示ブース）
ちょこちょこブースに戻ってディスカッションしてますので、ちょうどこのタイミングにまとめます

私がお話しさせていただいた範囲だと学生さんが多かった印象。
一人で来る方よりは団体さんとか「LiONは知らないけど教科書使ってるよ！」という声も聞かれたりなど。

ここでも宣伝すると、新人研修でも使っていただけたり、もちろん独学で使ったり。

:::note warn
よく聞かれるが、無料教科書はLinuC試験に対応していない。
試験は試験、教科書は教科書。教科書自体が試験にロックインされてはいけない
:::

## AutoML(MySQL Heatwave)による機械学習
mysqlにIrisのデータを入れて実行するチュートリアルがある
環境構築は自分でやる

真面目に食い入って聞いていたので、とりあえず手を動かすところから。
mysqlコマンドの拡張と考えてOK。データクレンジングとかモデルのトレーニングとかをいい感じにやってくれる。
細かいのはググれば全部書いてある。講義内容もチュートリアルをそのままハンズオン＋解説

## オープンソースAIの定義
結論として、オープンソースAI（OSI）は難しい

- システムの利用の自由
- システムの動作の研究や検査をする自由
- システムを改変する自由
- 他者が使用できるようにシステムを共有する自由

なんだろうなあ、共感すればやるけど「データは資産」という潮流なのでシステムの内容自体を公開するのは迎合しないんじゃないだろうか、とは思うがあまり詳しくないので議論はできず。

## LT会
一番楽しみにしていたかもしれない、いつものやつ

### 海外カンファレスにGo！FOSSASIA25とCOSCUP25とグローバルイベントコミュニティについて
海外イベントだけど日本語が通じると！

### もうすぐ出るよ！『Linux標準教科書V4』
LiON名義で出てくれるのが嬉しい
私は知っている話どころか、セミナーセッションで語ったものの振り返り。
ドラを鳴らされてしまう…

### 再:うざいアクセスをシャットアウト＆来年の箱根の温泉合宿の紹介」T.Kabu
良さげ！
私が使うことがあるかどうか…

温泉合宿は年内いっぱいは応募受付中のこと

### 魔境の南島原市においでよ！ITキャンプ・IT合宿・アグリハックデイ」神崎健輔
パスタのじゃんけんで全部ぶっとんだ

やべー企画というか楽しそうというか、興味は持った

### RasberryPI
私はQiitaアドカレ使ってるけど、アドベンターの方が見やすいな

https://adventar.org/

### Cyber Kansai Project(CKP)
九州からOSS開発を発信するよ！という話
イベント色々あるよ！

### Wikimania 2024
Wikimediaに関するカンファレンスの話
イベントスポンサーがないのもすごい

Wikimedia Foundation

次回はケニア（ナイロビ）で！

### LibreOffice Asia Conference2025日本開催
タイトルがすべて

---

私もやろうかと思ったのですが、そもそも告知事項がないぞ…！
LT会に飛び込む時には宣伝するネタが必要なのだと思い知った。

---

## スポンサーセッション
九産大でOSC福岡をやるのは4回目のこと
私自身、福岡に参加するのは初めてだったが非常に楽しめました！

:::note
この後、懇親会へ
:::

## 振り返り
登壇者側の視点を強く持って参加すると、一般参加ではない観点からの学びが多くあった。
発表の方法などもソロで参加した時の資料がどうとか、機材をどうとかについては関心があったながら、運営やフォローアップ施策にも気付きがあった

九州拠点の勢いを伸ばしていくぞ！っていう話をしておきながらこういう事を言うと袋叩きにされるんじゃ？という気がしないでもないが、住んでいる場所も地元も九州はかすりもしないのだが、なんだかんだで二次創作同人サークル時代から全国区で飛び回っていたので「生息地・全国」のような存在に戻りつつある。

OSCスタッフの募集もあるみたい。
一度はやってみようかと思ってはいたので、機会を作ろう。
エンジニアがバックオフィスに歩み寄る開発話

:::note info
この記事は[ZOZO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/zozo) シリーズ10 の 8日目の記事です。
:::

こんにちは。あっすーです。
株式会社ZOZOで、**エンジニア部門全体を支援する部署**に所属しています。

業務内容はさておき、
最近は**バックオフィスチームが通常業務を効率化するためのアプリ設計・開発**を行っています。

どのように歩み寄って開発を進めているのでしょうか（現在進行形）。
今回はそこで実践してきたことの振り返りをします。

🎄🎄🎄🎅🎁🎄🎄🎄

## 1. はじめに：なぜ開発をすることに？
私の所属は【**エンジニア支援をするが開発知識はない、開発部門のバックオフィスチーム**】です。
私だけ開発経験のあるエンジニア出身、他メンバーは事務経験に長けています。

そのため、「せっかく開発部門なのに、業務が何だかいけてないな...」と思うことが少々あります。

組織が拡大していく中で、いけてない業務は定期的な見直しが必要です。
課題として上がっていた **Google Spreadsheetでのマスタ管理業務を他システムへ移行しDB管理する** ためのアプリ設計・開発を行うことになりました。

発案時点での構図は以下となります。
👩🏻 **ユーザー**：バックオフィス業務を行うチームメンバー（社員/パート）10名程度
👩🏻 **設計開発**：自分


## 2. 大切にしたこと
一番は、**移行によりバックオフィス側の現業務よりも面倒にならない**ことが重要です。
ありがちな「システム導入したら入力が面倒で触らなくなった」は絶対に起きてはいけません。
何のために導入するか、どんな使い勝手なら日々の業務に溶け込みそうか。
**ユーザー（使い手）の気持ち**を第一に寄り添います。
まずはそこからだと考えました。

## 3. 気持ちを知り、相談に乗る
「どんな使い勝手なら日々の業務に溶け込みそうか」を考えるための土台として、現在の運用で困っていること、付随する業務フローをヒアリングします。

現場からポコポコと出てくる気持ちや意見を  [オンラインホワイトボード miro](https://miro.com/ja/) で**画面共有しながらリアルタイムに付箋で貼り付けることで、課題を相違なくヒアリングする**ことができました。

## 4. 運用・定義をフローチャートで見える化
バックオフィス業務はマニュアル化されているものが多くあります。
しかし個々のタスクはマニュアル化されているものの、**全体感をフロー図に落とし込んでいなかった**のです。

これまでの運用・業務の関係性を**一緒に見える化**し、今後の運用ではどう改善できると効率的になるか？を**一緒に考えます**。

上記のように、一緒に考える流れを作ることの利点があります。
「**バックオフィス側の要望を全部受けるのではなく、改善に向かうよう並走する」立場として開発側が存在する**ことをお互い認識する。それが現時点でも今後のためにも役立っていると感じました。

## 5. システム導入のメリットを丁寧に伝える
導入を気持ちよく進めるための土台作りです。現状の課題だけでなく未来への期待を込めます。

❌「そうやって入力していたからデータが変になるんですよ」
⭕️「今後はこういう流れで入力をサポートできると良いですね」

**少しの言い回しの違いで、システムに興味を持ってもらいやすさ・案件の進行具合が変わる**と考えました。

併せて、移行により「自動取得できる」「変更ログが残せる」などの利点も伝え、役立つ箇所があるかどうかの認識合わせをします。

そしてある程度、ユーザー側から「叶えたいこと」の意見が出てきたら設計開発フェーズに入りました。

## 6. パーティメンバーを増やす
途中から、システムが想定より大規模で使われることが想定されたため、ユーザー範囲の拡大を想定して設計変更しました。
一人では重荷であるため、プロジェクト関係者を増やしていきます。

【設計前の想定】
👩🏻 **ユーザー**：バックオフィス業務を行うメンバー（社員/パート）10名程度
👩🏻 **設計開発**：自分

【変更後】
👩🏻 **ユーザー**：バックオフィス業務を行うメンバー（社員/パート）10名程度 + **社内の様々な立場の方**
👩🏻 **設計開発**：自分 + **チームメンバー1名（非エンジニア）**

運用の汎用化を考えながら導線制御をする場面では、バックオフィス側の知識が役立つことが多くありました。
パーティメンバーを増やしたことで業務知識が集まり、ありがたく参考にさせていただきました。

## 7. 未経験のシステムでアプリ開発するために✏️
実は今回の開発は、これまでに経験がなかったシステム上でのアプリ開発でした。

逆にチーム内でエンジニアが不在のため、心置きなく情報収集することができ、**外部コミュニティもどんどん活用**しました。

行動したことはざっくりと以下の通りです。

・社内にいる唯一の知見者にとにかく相談
・テストアプリでトライ&エラーを繰り返す
・公式ドキュメントを読み漁る
・公式チャットサポートをフル活用する
・公式が本社で開催する勉強会・事例紹介に何度も参加
・ユーザーコミュニティ会（オフライン・オンライン）に参加

（余談）
途中で関東 → 関西へ引っ越してしまいましたが、都内のイベントに快く出張を許してくれた上司には感謝しきれません。
都内にいると本当オフラインイベントに恵まれている......。

## 8. これから
得られた開発知見を全社向けに資料化し、**民主的に業務アプリを作れる未来** のきっかけになると良いなと思っています。

外部のユーザーコミュニティでは、珍しい育成事例として取り上げていただけて、**非エンジニアの方々から質問をいただく**ようになりました。
今後コミュニティの活性化にも貢献できると嬉しいですね。

バックオフィス業務はまだまだ改善できることが多いので、パーティを成長させて頑張っていきます！
Windowsタスクスケジューラ初心者がうまく行かなかった話

# 前座(自己紹介)

- 現役高校生
- Windows10より11の方が触っている時間が長い
- scratchから脱出できるまでに6年かかった
- Python大好き
- Typescriptも使いこなせるようになりたい
- GitHub Copilot2年生

<details><summary>状況など</summary>

# 状況

- 文化祭で、各物販の在庫状況をリアルタイムで表示する仕組みを前日に引き受ける
- 各クラスの担当者が手動でGoogleフォームを通じてデータを入力し、その情報をGoogleスプレッドシートに反映。スプレッドシートのグラフをGoogle Sitesに埋め込んで表示した
- 設置場所は会場の通路やエントランス、休憩スペースなど人が集まる場所で、休憩スペースではイベント映像と交互に表示

## 問題①: 自動更新の不備

Google sitesに埋め込んだスプレッドシートのグラフは自動更新されなかった。つまりリアルタイムでデータを更新するには、ページをリロードし続ける必要がある。

→自分たちでサイトを作っていればjsで定期的にGETしてくるなどできた。時間がなかったためchrome拡張機能をインストールして自動リロードを実現
→なぜか数十分後に止まってしまう
→Wi-Fiの電波が弱くて届いたり届かなかったりしたことが後に判明。**一度インターネットにつながっていない状態で自動リロードが入ると、拡張機能ごと停止してしまう**ため自動更新がされなかった。

## 問題②: 熱でスティックPCがやばい

猛暑日に小型スティックPC（低スペック）を使用した結果、過熱によるパフォーマンス低下が発生。
→窓を開けるなど環境調整を行い、大きなトラブルは回避。


## 問題③: タスクスケジューラーがわからない

これが今回の記事の本題。いままでWindowsはたくさん触ってきましたが、この件で初めてタスクスケジューラーなるものの存在を知りました。が、使い方が結構難解。

→ChatGPTとGoogleを横断しつつ対応...
→フルスクリーンで起動できない！

## 問題④: 動画を流すときにフルスクリーンで起動できない

Windows 10標準の「メディアプレーヤー」でフルスクリーン起動を試みたが、ネット情報と実際の挙動が一致せず失敗。

→`/fullscreen` オプションではフルスクリーンにならず、`--start-fullscreen` も動作が不安定。
→最終的にVLCメディアプレーヤーを使用して解決。あんまり良くないけど。

## 問題⑤: 秒数を指定して動画再生後のプロセス終了

動画とサイネージの表示を繰り返す設計において、指定秒数後に動画再生を終了させる必要があった。が、その起動オプションがうまくいかず。

→秒数を遅らせてtaskkillコマンドをタスクスケジューラーに登録して対応した。

</details>

# 解決手順詳細

### フルスクリーンで起動する

```
/fullscreen         # MS以外のソフト
--start-fullscreen  # MSのソフト
```

:::note alert
Windowsのメディアプレイヤー（従来版）では、/fullscreenが使えるものの、**メディアプレイヤーのウィンドウがフォーカスされていないと自動的にフルスクリーンが閉じます**
一応nircmdというものを入れればフォーカスをあてるコマンドを使用できるそうですが、試していません。
:::

### 従来版ではない方のメディアプレイヤー
`"C:\Program Files\WindowsApps\Microsoft.ZuneMusic_11.2405.8.0_x64__8wekyb3d8bbwe\Microsoft.Media.Player.exe"`

上記にある従来版でない方のメディアプレイヤーでは、特定のファイルを指定して開くコマンドラインが見当たらなかった（そのままパスを渡してもダメだった）。

したがって、動画をタスクスケジューラにて動かしたい場合はVLCなど別のソフトを使う方が私としては良かったです。
VLCでは`--start-fullscreen`が機能しました。同時に動画のファイルパスをそのまま渡せば、フルスクリーンで特定の動画ファイルを起動できます。（執筆時点）



# 秒数を指定して閉じる（ことはできない）

秒数を指定して閉じることはできない？(もしやり方知っている方いれば教えて下さい)ため、代わりに次にやりたいタスクの**上**に、前のタスクをキルするタスクを設定しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809025/20d1c19d-910c-6c24-9cf2-b26a1662a69a.png)

```
taskkill
```
```
/im (タスクキルしたいEXEの名前)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809025/7930d1b8-0c86-4ac7-019b-767eb80ad191.png)
Chromeをタスクキルして閉じたあとにexample.comをEdgeでフルスクリーンで開く。

:::note alert
実際にはmsedge.exeではなく、msedge.exeへの絶対パスを入力してください。  
引数としてそのままURLやパスをダブルクォーテーションでくくることで、ブラウザやその他のプログラムにおける「ファイルをプログラムから開く」と同等の動作をすると思われます。
:::


タスクの順番を切り替えるときは、タスクを左クリックして選択した状態で右側にある矢印を押す。

# 学びと今後の展望
時間やリソースの制約下で迅速なトラブルシューティングを実施した経験は大きな収穫。
今後、より柔軟でリアルタイム性の高いシステムを構築するための準備を進めたい。


# 参考文献
https://learn.microsoft.com/ja-jp/windows/win32/wmp/command-line-parameters
Power AutomateでSharePointリストの選択肢列からnullをフィルターする時の注意点

# やりたいこと
以下のSharePointリストで、選択肢列「製品別」が``null``となっている「AirPods Pro2」という製品名の項目を抽出したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/7c2b1d74-a13a-17ce-3489-58bf0f625992.png)

# 実装方法
結論、``ColumnName eq null``でフィルタークエリを直接記述します。

また、日本語の列名で作成したので、列の内部名は_Xで開始する列名になっています。
この場合は、``OData_``を先頭に付与して、``OData__x88fd__x54c1__x5225_``という列名にします。

![NULL-Filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/97f3e3df-eea8-ae2b-847e-9f3f8d836308.png)



# 注意点
動的なコンテンツから「null」をセットした状態で、フローを実行するとエラーになります。ODataフィルタークエリを記述する際に、「true」や「false」を動的なコンテンツからセットする癖があったので少しハマってしまいました。

![NULL-Filter-Contents.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/8445f0eb-6624-6bca-60f5-7f4a1c07eb5b.png)

![NULL-Filter-Contents-Error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/3826252c-9bc8-937e-5c51-fba3e8954843.png)
テストを甘く見るなかれ 〜 Udemyのヒンシツ大学でテストの基礎を学ぼう

エンジニアにとって最も学ぶべき分野は何でしょうか？
私は10年以上エンジニアとして仕事していますが、**エンジニアならテストを学ぶべき**と考えます。
今回はテストのことを体系的に学べる「ヒンシツ大学」についてご紹介します。

## この記事の対象者

* ソフトウェアテストについて体系的に学んだことがない方
* ソフトウェアテストに苦手意識を感じている方
* テストのレビューを担当する方

# なぜテストの学習が重要なのか？

ソフトウェアテストの知識は、ソフトウェア開発に関わるすべてのエンジニアが持っておいて損にならない知識です。テスト工程に直接携わるかどうかに関わらず有用です。

テスト工程に直接携わるエンジニアであれば、より良いテストを設計・実施するためにプロフェッショナルとして持っておくべき知識です。これに関しては特に疑問は無いと思います。

ではテスト工程に直接携わらないエンジニアはどうでしょうか？私はテスト工程に直接携わらないエンジニアであってもテストの知識を身につけておくべきだと考えます。理由は、テストを意識して設計やプログラミングを行う方が品質の高い仕事ができるためです。
例えば画面設計だと、「こういう画面要素を置いたらこういうテストケースが発生するだろう」ということが想定できていれば、テストケースを満たす細かい配慮のある設計書を作成できます。テストを意識できないと、その後の工程で考慮漏れが見つかり、手戻りが発生してしまいます。
プログラミングの場合も、テストケースを意識したコードを書くことで不具合の少ないプログラムを作成することができます。

# ヒンシツ大学とは？

「ヒンシツ大学」は、品質／ソフトウェアテスト専門会社・株式会社SHIFTの教育専門機関です[^1]。
テストの専門会社が提供する学習コンテンツということで、質が高く汎用的な知識を得られる講座を受受講できます。

以前は公開講座形式・集合研修形式のみの展開だったと記憶していますが、現在ではUdemyを利用したe-learning形式でも講座が展開されるようになりました。

Udemyで受講可能な講座はヒンシツ大学HPの以下ページで確認できます。

https://www.hinshitsu-univ.jp/elearning/

# 特におすすめのUdemy講座

ヒンシツ大学のUdemy講座の中でも特におすすめできる講座をピックアップして紹介します。

## 2時間で学ぶ！ソフトウェアテスト設計講座（機能テスト編）～効率的に”もれ”の無いテスト設計手法を習得～

ソフトウェアテストについて体系的に学んだことがない、という方はまずこちらの講座を受講しましょう。ブラックボックステストのテストケースを機能ベースで洗い出す方法を解説しています。ヒンシツ大学のHPでも人気No.1の講座と紹介されています。
開発現場でテストケースを書いていると、その現場でのテストケースの書き方に慣れてしまいますが、その方法で本当に網羅できているのでしょうか？体系的に学ぶことで、今までの方法で良かったのかをチェックできます。

https://www.udemy.com/course/shift-designfunctionaltest/

同じような要領で、非機能テストやシナリオテスト向けの講座も用意されています。

https://www.udemy.com/course/shift-nonfunctionaltest/

https://www.udemy.com/course/shift-designscenariotest/

## 2時間で学ぶ！不具合分析講座～欠陥報告や不具合データを分析と対策、今後の改善に活かす方法を伝授～

テストが出た際に出てくる不具合に対して、データを分析して改善活動につなげるための方法を解説しています。恥ずかしながら私は最近までちゃんとした不具合分析をしたことがありませんでした。SQuBOKでも取り扱いのある[^3]項目なのですが、ちゃんと実施されていない現場も実際にはあるのではないでしょうか。
講座では不具合分析のやり方の解説に加えて、ケーススタディー形式の問題も用意されています。不具合分析に馴染みのない方は一度受講されて見ることをおすすめします。

https://www.udemy.com/course/shift-specificationdocumentinspection

# まとめ

今回はソフトウェアテストについて学ぶことができるヒンシツ大学のUdemyをご紹介しました。
最初にも述べた通り、エンジニアであればテストについて学んでおいて損はありません。ヒンシツ大学を活用して一皮向けたエンジニアを目指しましょう

## おまけ①：Udemyの効率的な受講方法

### 1. 耳だけ視聴でオーディオブック風に

家事や移動中など手が離せないときに、イヤホンで講座の音声だけを聞くこともできます。名付けてオーディオブック風受講です。
Udemyは動画の講座なので映像がありますが、オーディオブック風受講であれば音声だけ頭に入れる事ができます。音声だけで理解できればそれでOKですし、映像がほしい場合はその部分だけ後から見返せばよいのです。音声は頭に入っているので効率的に理解できます。
手が離せないときの時間も有効活用できるのでおすすめです。

### 2. 倍速・飛ばし見の活用

私はほとんどの動画を1.5〜2倍速で視聴しています。通常の動画は2倍速、ちょっと早口だなと感じる動画は1.5倍速です。慣れれば倍速でも十分に聞き取れます。
既に知っている内容が出てきた場合は、その部分のチャプターごと飛ばしてしまいます。
有料で買ったものだと、最初から最後まで見ておかないと損した気分になりがちですが、受講することよりも受講した自分が成長することを目的とすべきです。自分の成長に繋がらない部分へ時間を使うのは

## おまけ②：本のおすすめはある？[^2]

動画講座よりも本で学びたい！という人のために、テストのおすすめ本も紹介しておきます。「ソフトウェアテストの教科書」という本です。こちらもテストを体系的に学べる内容となっておりおすすめです。著者はソフトウェアテスト会社のバルテスの方です。

https://www.amazon.co.jp/dp/481560875X

[^1]: [ヒンシツ大学HP](https://www.hinshitsu-univ.jp/)より引用
[^2]: Advent Calendarのスポンサーにバルテスが入ってるので、バルテスを立てる内容も書いといたほうがいいと思いました笑
[^3]: SQuBOK内では「障害分析」の名称で記載されているようです
お問合せフォーム通知をちょっとだけ工夫した話

この記事は、**Power Automate Advent Calendar 2024 12月12日担当分** の記事です。

https://qiita.com/advent-calendar/2024/powerautomate

問い合わせフォームの通知フローを少しだけ工夫した内容になります。

### 問い合わせフォームの通知
発端は「フォームをメール通知してほしい」との要望ですが、意外と難航します。

### フローを一旦作成する
ひとまず、以下のようなフローを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/13ffa7f0-a346-ce89-964b-fb357724d17e.png)

このようなフローを作ると、以下の内容で問合せした人にメール通知がされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/790725fb-8206-a0cc-c866-44e578aa1bd3.png)
メールの差出人がフロー作成者となります。
問題は、メール受信者が、差出人（フロー作成者）に連絡してしまうことがあります。
差出人（フロー作成者）が業務担当者であれば問題ないですが、業務担当外の場合に担当が違うということが起きます。

### 試してみた事 その①　差出人を変更する
メールの送信(V2)アクションの差出人を別のメールアドレスに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/34b0f572-4f88-5255-6068-b01d0c106321.png)

実行してみると下記のようなエラーとなってしまいました。
指定のアカウントでのメール送信する権限がないと表示されています。
**You are not authorized to send mail on behalf of the specified sending account.**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/fdc8affa-2226-f108-4b4b-3db8453150fc.png)

### 試してみた事 その②　SPOの機能でメールを送る
代替手段を探していたところこちらの記事を拝見し
SPOの機能でメールを送る事ができると知りました。

https://qiita.com/negimijin/items/24db9eaea33976c5e27d

作成したフローの最後のアクション **「メールの送信（V2）」** を **「SharePointにHTTP要求を送信します」** に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/ea7f7da9-1e96-788a-f52b-6be7791e1719.png)

#### 設定内容

|プロパティ|設定値|
|---|---|
|サイトのアドレス|任意のサイト |
|方法|Post|
|URI|_api/SP.Utilities.Utility.SendEmail|
|ヘッダー（Accept）|application/json;odata=verbose|
|ヘッダー（content-type）|application/json;odata=verbose|
|ボディ|以下を設定|
```
{
        "properties": { 
            "__metadata": { "type": "SP.Utilities.EmailProperties" },
            "From": "", 
  　        "To": { "results": ["メールアドレス"] }, 
            "CC": { "results": ["メールアドレス"] }, 
            "Subject": "件名",
            "Body": "本文"
        }
}
```

#### ボディの設定内容
|プロパティ|設定値|備考|
|---|---|---|
|__metadata| {"type":"SP.Utilities.EmailProperties" }|
|From|差出人|""のみ。""からメールアドレスに変更しても差出人はSPOのまま。|
|To|宛先|resultsを使用して["メールアドレス１", "メールアドレス２"]とすると複数メールに送信可|
|CC|同報|resultsを使用して["メールアドレス１", "メールアドレス２"]とすると複数メールに送信可|
|Subject|件名||
|Body|本文||

このように指定するとメール差出人が**no-reply@sharepointonline.com**で通知されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/24a2da8c-f690-1116-78ef-548ad11189df.png)


#### 注意点
ToやCCにメールアドレス指定する際、指定したメールアドレスについては、サイト上で閲覧権限以上指定しないとメール通知されないようです。

### 要注意事項
一見「試してみた事 その②」でフロー作成者→SPOへ差出人を変更することができ、めでたし、めでたしと思いきや要注意事項があります。

https://devblogs.microsoft.com/microsoft365dev/retirement-of-the-sharepoint-sendemail-api/

なんと来年2025年10月31日でSharePoint SendEmail APIのサポートを廃止するから使えなくなるってことですよね。
来年10月末まではOutlookコネクタを利用するようにって、結局は差出人がフロー作成者に戻ることになるんじゃん😱

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/60ab7474-933d-372c-05db-821ce6d6feaa.png)
※引用：Microsoft開発者ブログ

他に代替手段がないか引き続き確認したいと思います。
[忘備録]Githubのコマンド打つのすらめんどい[.command]

## 前提
個人プロジェクトレベルでgitのいろんな操作すんのめんどくせぇ
ダブルクリックで勝手にプッシュまでやってほしい

## 1.ファイル
以下にファイルを用意して、末尾に **.command** をつけて保存
ここでは仮に **auto-push.command** とする
```
#!/bin/bash

cd pass/to/your/app
git add .
git commit -m "comment"
git push origin main
```

## 2.実行権限付与
```
chmod +x auto-push.command 
```

## 3.完成!
あとはファイルをダブルクリックすればプッシュしてくれるのだよ。
しかし、これはDockに固定できないので、めんどくさがりは
以下の記事を読んでくれ！

https://qiita.com/GeneLab_999/items/32e7a6190b0490408886
[CAIレシピ] プロセスオブジェクトによるユーザー定義変数の利用

## はじめに
プロセスオブジェクトを定義することで、任意のフィールドの集合型を利用できます(`プログラミングにおける構造体`)。この記事ではプロセスオブジェクトを使用する手順を確認します。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)

## プロセスオブジェクトの定義と使用

### プロセスオブジェクトの定義

次の手順ではプロセスオブジェクトを定義しています。

1. IICSにログインして __アプリケーション統合__ のページに移動、 __新規メニュー__ を選択して __プロセスオブジェクト__ の作成画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/1424de74-892f-5b35-944b-40ee5be161ca.png)

1. プロセスオブジェクトの名前を __recipe-po-processObjectTest__ とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/81403562-0800-0488-b3fd-98bd29698b9d.png)

1. 名前・ラベル・タイプを指定すると __フィールドの追加__ をクリック可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/79d21f3f-2072-4b2b-8d7d-85e78833b8eb.png)
今回は次のようにフィールドを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/784f8540-1e42-223b-ea40-ea3af452dd3c.png)

:::note
JSONやXMLのように __階層構造のオブジェクト__ を表現するには、プロセスオブジェクトをネストして定義します。
プロセスオブジェクトをネスト形式で定義するには、__タイプ=参照__ として、作成済みのプロセスオブジェクトを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/05f549fc-83f4-55fe-89a2-60aeb956046b.png)
:::

### CAIプロセスの作成

次の手順では作成したプロセスオブジェクトを入力フィールド、出力フィールドとして利用するCAIプロセスを作成しています。

1. CAIプロセスを次の設定で作成します。
    - 名前を __recipe-pca-processObject__ とする
    - __匿名アクセス__ を許可する
    - __クラウドサーバー__ にデプロイする

1. 入力フィールド __input__ を定義します。__タイプ__ には作成したプロセスオブジェクトを指定します。作成済みのプロセスオブジェクトは __カテゴリ=カスタムタイプ__ に切り替えると選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/424e3f5f-90cf-9ad4-430e-9edfd6270828.png)

1. 出力フィールドとして __output__ を __タイプ=recipe-po-processObjectTest (作成したプロセスオブジェクト)__ で作成します。

1. 割り当てステップを追加して、出力フィールド __output > id__ および  __output > value__ を選択して __計算式__ を利用する設定とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/3c43eee0-8cbc-b15b-0a61-8b835475d545.png)
計算式として各フィールドに次の値を指定します(入力フィールドのid/valueの値に"out"という文字を追加しています)。
      - id = `concat("out-", $input.input[1]/id )`
      - value = `concat("out-",$input.input[1]/value)`


### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。入力フィールド・出力フィールドとしてプロセスオブジェクトを利用できることが確認できました。

```:curlコマンドと実行結果
// curl コマンド
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-processObject \
-H 'Content-Type: application/json' \
-d '{"input": 
{"id" : "aaa", "value" : "bbb"}
}'

// 実行結果
{
  "output": {
    "id": "out-aaa", "value": "out-bbb"
  }
}
```



## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)
競プロ日記#24/12/06

# 061_061_B-CountingRoads
- 大前提として問題の設定を紙とペンで表現する。（正直問題文を読んだだけではイマイチ設定が理解できなかった）
- 都市用と道用の配列を用意する。
- 道の本数文for文を回してa,bに都市番号が入ってくることが理解できれば添え字の性質に注意して[a - 1]と[b - 1]に対してインクリメント
[CAIレシピ] 実行中のCAIプロセスの取得

## はじめに
この記事では、実行中のCAIプロセスをREST APIで抽出する手順を確認します。
運用監視の観点からCAIプロセスが長時間実行中となっている対象を確認したい場合に、この記事の情報をお役立ていただけると思います。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [プロセス実行環境の切り替え(Secure Agent環境での実行)](https://qiita.com/shunsuzu/private/2afc72613d894b4d553e)
- [実行済みCAIプロセスのステータス取得](https://qiita.com/shunsuzu/private/08d434246a4767ce6de7)


## 実行中のCAIプロセスを取得する手順

実行中のCAIプロセスを取得するには、CAIプロセスのデプロイ先別に次のURLを使用して基本認証にてGETリクエストを実行します。

- クラウドサーバー
https://__\<Informatica Cloud Application Integration URL\>__/active-bpel/restadmin/processes/?advancedQuery=getProcessProperty("State")=1
- Secure Agent
http://__\<agentName\>:\<httpPortNumber\>__/process-engine/restadmin/processes/?advancedQuery=getProcessProperty("State")=1

※太文字の箇所については、ご利用環境にあわせて変更が必要です

なお、今回は実行中(__Running__)のプロセスを対象にプロセスの一覧を取得するため __("State")=1__ を指定しています
他のステータスを対象にフィルタリングしたい場合、次の一覧のNoを指定します。

|№|ステータス(日本語)|ステータスの意味|
|-:|-|-|
|1|Running(実行中)|プロセスは正常に実行中です。|
|2|Suspended(一時停止中)|何らかの理由でプロセスが一時停止しています。|
|3|Completed(完了)|正常に完了しています。|
|4|Faulted(フォルト)|プロセスはフォールトで終了しています。|
|5|Compensatable(補償可能)|サブプロセスが完了し、補償の対象となっています。|

## 実行例
クラウドサーバーを対象とした実行例を見てみましょう。

```:クラウドサーバーで実行中のCAIプロセス一覧を取得
// curl コマンド(URLエンコードしています)
curl -u username:password https://<IICS・CAIサーバー>/active-bpel/restadmin/processes/?advancedQuery=getProcessProperty%28%22State%22%29%3D1
```
curlコマンドの末尾`getProcessProperty%28%22State%22%29%3D1`は文字化けではなく、`getProcessProperty("State")=1`をHTMLエンコードした文字列です。


実行結果は次のような内容になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/6205e34e-f3bb-d36d-3349-0ab4475a8515.png)

例えば、shellスクリプトを用いて運用監視をしている場合、次のようにjqコマンドにて必要な情報を整形・フィルタするとデータを扱いやすいかもしれませんね。
(この例では、プロセスID・プロセス名・実行開始日時を取得しています)

```:CSV形式で実行中のCAIプロセス一覧を取得
REST_RET=` \
curl --silent -u username:password -X GET \
https://<IICS・CAIサーバー>/active-bpel/restadmin/processes/?advancedQuery=getProcessProperty%28%22State%22%29%3D1
` 
echo ${REST_RET} | jq -r '.process[] | [.processId, .title, .started] | @csv'

//実行結果
"1049962662857383936","pSleep5min","2024-12-07T08:16:46.188+00:00"
"1049962653155962880","pSleep5min","2024-12-07T08:16:43.876+00:00"
"1049962555747446784","pSleep5min","2024-12-07T08:16:20.653+00:00"
```

上記の様にREST APIにより情報を取得できるので[サービス接続によるREST APIの実行](https://qiita.com/shunsuzu/private/f2783c55a4d75661fc0b)に記載している手順を参考に、サービス接続にて実行中のCAIプロセスの一覧を取得することも可能です。



## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)
- [CAI製品ドキュメント > REST APIs for viewing processes](https://docs.informatica.com/integration-cloud/application-integration/current-version/monitor/processes/process-management-apis-for-deployed-processes/rest-apis-for-viewing-processes.html)
フォーマット指定子

format文やf-stringsでのフォーマット指定子の種類。

### 数値のフォーマット
1. **ゼロ埋め**:
   ```python
   number = 7
   print(f"{number:02}")  # 2桁のゼロ埋め
   print(f"{number:05}")  # 5桁のゼロ埋め
   ```
   出力:
   ```
   07
   00007
   ```

2. **小数点以下の桁数指定**:
   ```python
   number = 3.14159
   print(f"{number:.2f}")  # 小数点以下2桁
   print(f"{number:.3f}")  # 小数点以下3桁
   ```
   出力:
   ```
   3.14
   3.142
   ```

3. **幅の指定**:
   ```python
   number = 42
   print(f"{number:6}")  # 幅6で右寄せ
   print(f"{number:10}")  # 幅10で右寄せ
   ```
   出力:
   ```
       42
           42
   ```

4. **符号の表示**:
   ```python
   number = 42
   print(f"{number:+}")  # 符号を表示
   ```
   出力:
   ```
   +42
   ```

### 文字列のフォーマット
1. **幅の指定**:
   ```python
   text = "hello"
   print(f"{text:10}")  # 幅10（デフォは左寄せ）
   ```
   出力:
   ```
   hello     
   ```

2. **左寄せ**:
   ```python
   text = "hello"
   print(f"{text:<10}")  # 左寄せ
   ```
   出力:
   ```
   hello     
   ```

3. **右寄せ**:
   ```python
   text = "hello"
   print(f"{text:>10}")  # 右寄せ
   ```
   出力:
   ```
        hello
   ```

4. **中央寄せ**:
   ```python
   text = "hello"
   print(f"{text:^10}")  # 中央寄せ
   ```
   出力:
   ```
     hello   
   ```

### その他のフォーマット
1. **パーセンテージ表示**:
   ```python
   number = 0.1234
   print(f"{number:.2%}")  # パーセンテージ表示
   ```
   出力:
   ```
   12.34%
   ```

2. **指数表記**:
   ```python
   number = 1234
   print(f"{number:.2e}")  # 指数表記
   ```
   出力:
   ```
   1.23e+03
   ```
【超簡単】Linuxファイルシステムの書き込み禁止を解除して再マウントする方法


例えば、/usrディレクトリ配下で書き込みできない場合、以下のコマンドで再マウントすることができます
```bash
mount -o remount,rw '/usr'
```
※上記の/usrの部分をマウントポイントに適宜変更してください

```
root@nas[~]# mountpoint /boot
/boot is not a mountpoint

root@nas[~]# mountpoint /usr 
/usr is a mountpoint
```
のようにしてmountpointコマンドで適当にマウントポイントか調べることができます

df コマンドを使用してマウントポイントを一覧表示することもできます

（大学生です・正規雇用のお仕事ありましたら連絡ください✪ ω ✪）
Jenkinsで.envを外部groovyから読み込む方法

# はじめに
同じEnv parameterを異なるrepositoryに入れたい!という要望が来ました。このweb_backend とweb_frontendはデプロイ先サーバが同じでもディレクトリが異なるので片方の.envにアクセスして読み込むことはできない、という関係性です。

```bash
## web_backend repository
vim .env
ENV = development
CLIENT_ID = "test%develop898"

## web_frontend repository
vim .env
ENV = development
CLIENT_ID = "test%develop898"
```
また、2つのrepositoryの.envファイルに同じパラメータを入れると管理が２重になって面倒...ということでJenkinsで管理しちゃおう作戦。その中でJenkinsのenvパラメータを外部groovyから読む方法を試したので書いていきます。
今回のenv parameterはユーザに見えてもOKな値とします。

# 開発
Jenkinsからアクセスできる場所にgroovy fileを作ります。今回は例えばdev.groovyを作り、中にenvとして設定したいパラメータを書いていきます。
```bash
vim env/dev.groovy

env.ENV="development"
env.CLIENT_ID="test%develop898"
...etc.
```
あとはJenkinsのscriptの中でload($groovy_file)をするだけです。
```groovy
script {
        $groovy_file_path="/path/to/env/env-dev.groovy"
        load "${groovy_file_path}"
        echo "${env.ENV}"
        ehco "${env.CLIENT_ID}"
}
```
これでパラメータを表示できたかと思います🥳
簡単！


# おわりに
私たちのpipelineでは実際env parameterを使うのはrakeタスクなので、ここからrakeタスクに渡してあげる必要があります。例えば↓

https://stackoverflow.com/questions/825748/how-to-pass-command-line-arguments-to-a-rake-task


やっぱりenv parameterが増減した時に面倒.... rakeタスクと、タスクを呼んでいるすべてのJenkins scriptの更新が必要ですね。管理が面倒なので簡単にしたいという目的と離れちゃうので、私は今回は使わないことにしました。

セキュリティ的に見せてはいけないパラメータならJenkinsのCredentialに登録すると良いかもですね。

参考になれば幸いです🍎
[Unity] Netcode for GameObjectsにおけるRPCとNetworkVariableとの違い

# RPCとNetworkVariableの違いまとめ

| 通信方法 | RPC | NetworkVariable|
|:-:|:-:|:-:|
| 説明  | あるプレイヤーが実行した関数をほかのプレイヤーも実行する  |  通信を行っているプレイヤー間で共有する変数を作成して値を変えてゆく| 
| 同期タイミング  |  同期する関数が実行されたタイミングのみ | 常に互いに同じ値を共有 | 
|途中参加のプレイヤーからの見え方|参加前に変更された情報は得られない|参加前に変更された情報も得られる|

公式ページによれば、その場でしか利用しないデータの共有にはRPC、永続的に全員が持っているべきような変数はNetworkVariableを使うと良いらしい。

しかし、RPCについてもUpdate()関数内でRPCに指定している関数を実行すれば、途中参加の人も含めて常に最新情報が共有できそう。

# 参考にした記事
図などがあってとても分かりやすかったです。

https://docs-multiplayer.unity3d.com/netcode/current/learn/rpcvnetvar/
RDS I/O最適化を考えてみる：Auroraとプロビジョンドの活用事例と共に


#### 👋 はじめに
AWS RDSのI/Oコストに悩みます。どうすれば、最適化できるか考えていきます。

#### 1. AWS RDSのI/O仕組みとコスト構造
RDSでは、主にデータの読み書きや特定のデータ操作がI/Oコストの発生源です。以下はその主要なポイントです。

```markdown
主なI/O発生源：
1. データ読み取り操作
   - テーブルスキャン（大規模データで発生しやすい）
   - インデックススキャン（特定のクエリ最適化に依存）
   - ジョインオペレーション（複雑な結合でI/O負荷が高い）

2. データ書き込み操作
   - INSERT/UPDATE/DELETE（トランザクション単位でI/Oが発生）
   - VACUUM（PostgreSQL特有、メンテナンスの一環）
   - バイナリログ（MySQLのデータレプリケーションで重要）
```

#### 2. 性能監視とアラート設定
AWS RDSのパフォーマンス監視は、問題の早期発見と対策に不可欠です。特に重要なメトリクスとアラートの設定例を以下に示します。

```yaml
Critical（重要度高）:
  IOPS:
    threshold: 設計上限の80%
    duration: 15分継続（短期間のピークも検知）
    action: インシデント発行（即時対応が必要）

Warning（注意レベル）:
  Cache Hit Rate:
    threshold: 95%以下（通常キャッシュヒット率が高いとI/O負荷が軽減される）
    duration: 30分継続（長期間の低下を検知）
    action: 調査タスク作成（詳細調査のためのアクション）
```

#### 3. プロビジョンドIOPSの活用事例
以下のコードは、システムの平均とピークのI/Oを元に最適なIOPSを計算する例です。

```python
def calculate_iops(avg_iops, peak_iops, buffer_ratio=1.2):
    # 平均IOPSにバッファをかけて基準を計算
    base = avg_iops * buffer_ratio
    # ピークに対する追加バッファを計算
    peak_buffer = peak_iops * 0.2
    # IOPSの最小値は3000、最大値は64000に制限
    return min(max(3000, base + peak_buffer), 64000)

# 実運用例：平均5000IOPS、ピーク15000IOPSのシステムにおけるIOPS計算
monthly_stats = {
    'avg_iops': 5000,
    'peak_iops': 15000
}

recommended_iops = calculate_iops(
    monthly_stats['avg_iops'],
    monthly_stats['peak_iops']
)
```

これにより、月次のI/O負荷に合わせて適切なIOPSを設定でき、コスト最適化に繋がります。

### 📝 まとめ
本記事で紹介した手法は、RDSのI/O最適化のための一般的なアプローチです。実際の効果はワークロードやシステム構成によって異なりますが、以下のような改善が期待できます：

I/Oパターンの可視化によるボトルネックの特定
適切なプロビジョニングによるコストとパフォーマンスのバランス改善
監視体制の確立による問題の早期発見

より具体的な数値や制限については、AWS公式ドキュメントを参照し、実際の環境に合わせて検証することをお勧めします。
1番のお気に入りの使い方　~リアルタイム生成~

## はじめに
こんにちは、
今回はsattoで私のお気に入りの使い方をご紹介しようと思います

王道ではない使い方かもしれませんが、みなさんに「おお、面白い」と少しでもプラスになればと思います

では、はじめます

## 何をするのか
一言で表すと
**リアルタイムで生成AIから結果を得る**
です。

これが意外と便利で、sattoのUIも相まって良いと感じています

これから使い方や例について詳しく説明していきますが、みなさんも「こんなことにも使えそうだな」と思い馳せながらお読みいただけると幸いです

## 使用するsattoの機能
ずばり
**インプットにあるパラメータ追加の
"AIに考えさせる"機能**
です

この機能について説明していきます。

### パラメータとは
これはスキルの中で「変数」の役割をしています。数学やプログラムコードで用いられる概念と同じです。つまり**何かしら値をいれる箱**です

例えば、”カレンダーに予定を作成スキル”では
"件名"と"開始日時"、"終了日時"、"備考"がパラメータとして設定されています。

これらを分けることで、それぞれの要素に対して処理することも可能になります。

このスキルでは、GoogleカレンダーにAPIで値を渡すため、開始日時と終了日時のそれぞれの値の形式を変換する処理をいれていますね。

### AIに考えさせるとは
続いて、**AIに考えさせる**機能についても説明します。

パラメータ追加のボタンを押すと
細かな設定がはじまります。この中で"初期値オプション"という欄にAIに考えさせるがあります。

これは設定欄の上の方にある**パラメータの説明に記載されている内容をもとにAIがパラメータの値を考えてくれる機能**です。

例えば、”カレンダーに予定を作成スキル”では
スキルを使う時に直接パラメータへ値を入れるのではなく、会議の議事録テキストを選択しインプット入力として入れると、そのテキスト内容からAIが判断しパラメータの値が自動で入力されます。

# お気に入りの使い方
上記で説明したAIに考えさせる機能は、なんと**リアルタイムで**パラメータを入力してくれます

これを使うとシンプルではありますが便利なことができます

それはスキルを実行しなくても、インプットを入れるだけで生成AIが使えます
面倒くさがり屋の私にはとても刺さっています

しかも、このスキルを作るのは超簡単です。プロントを書く必要がありません！
（後述します）

これを使って何をしているのかご説明します

### リアルタイム辞書
記事やSNS投稿を読んでいる時にふと分からない言葉、知らない言葉がある。
など
言葉の意味を調べたい時ありますよね。

今までは、調べたい言葉をコピーしてGoogleで検索するなど、画面を切り替えり面倒な手間がかかりストレスでした。（面倒と感じない人もいる）

この機能を使えば、調べたい部分を選択して、sattoを開いて、スキル選択するだけで実行せずとも意味がわかってしまいます。

画面切り替えの必要なく、その場で、少しのキーボード操作で実現してしまいます。

![スクリーンショット 2024-12-07 16.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947948/fa609b28-7940-780d-4428-754da79d7381.png)


# プロンプト要らず！超簡単な上記スキルの作り方
画像を見ていただくとわかるとおりパラメータの設定のみで実現できます。

▼リアルタイム辞書
![スクリーンショット 2024-12-07 15.41.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947948/18cd84c2-c98c-c2ee-eaca-1fca0d37ec39.png)
パラメータ設定
![スクリーンショット 2024-12-07 15.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947948/7c0c90a8-2b2f-e4b6-b0bc-441c194545f1.png)

# 最後に
この記事では、sattoの「AIに考えさせる」機能を活用した便利な使い方についてご紹介しました。この機能を利用することで、リアルタイム翻訳や辞書機能など、手間を省きストレスの少ない操作が可能になります。特に面倒くさがり屋の方には大変おすすめです。

「おお、面白い」と少しでもプラスになったでしょうか？
他のアイデアなど思いついたでしょうか？

どちらか1つでも当てはまっていたら幸いです。
途中まで打ったコマンドの編集方法

# はじめに
コマンドを打った後「ファイル名typoしてた…」とか、「基本同じコマンドだからコピペしたいけど一部変更しなきゃ…」といったお悩みを抱きつつ矢印キーで移動している方、いませんか？そんなあなたに便利なコマンドをいくつかまとめておきます。

# 便利な操作キーバインドについて
筆者のPCはMacのためMac特有のキーバインドの可能性があります。

## カーソル移動
- `Ctrl + a`
    - カーソルを先頭まで持っていく
- `Ctrl + e`
    - カーソルを最後まで持っていく
- `Option + ←`
    - 一単語分前に移動
- `Option + →`
    - 一単語文後に移動

## 文字削除
- `Ctrl + u`
    - カーソル位置から行頭まで削除
- `Ctrl + k`
    - カーソル位置から行末まで削除
- `Ctrl + w`
    - カーソル位置から後側にある一単語分を削除
- `Ctrl + y`
    - 最後に削除したものを貼り付ける

## 応用編
zshだとこんなことができるよという置換を最後に紹介しておきます
(bashでもできるかも、fishは多分できない)
- `!!:gs/old/new`
    - 一つ前のコマンドのうち、oldをnewに置換したものを実行する

```zsh: 実行例
 % kubectl exec -it exp-project-database -n exp-project -- /bin/bash
...

 % !!:gs/exp-project/exp1-project
kubectl exec -it exp1-project-database -n exp1-project -- /bin/bash
...
```