OmniAICreator/Qiita-1.07M huggingface dataset:
aroundフック

#### `around`フック
>### around hooks
#### `around`フックはprocとして振る舞うことを拡張したブロックの引数としてexampleを受理する。これによりあなたはexampleの前後に実行されるべきコードを定義する。もちろん、あなたはフックの前後で同じことができる。そしてその方がスッキリする方が多い。
>around hooks receive the example as a block argument, extended to behave as a proc. This lets you define code that should be executed before and after the example. Of course, you can do the same thing with before and after hooks; and it’s often cleaner to do so.

#### `around`フックが活躍する場面はあなたがブロックの中のexampleを実行したい時です。例えば、もしあなたのデータベースライブラリはブロックを受理するためのメソッドをトランザクションに提示する場合,あなたはexampleの周りのトランザクションを綺麗に開閉するために`around`を使う
>Where around hooks shine is when you want to run an example within a block. For instance, if your database library offers a transaction method that receives a block, you can use an around to cleanly open and close the transaction around the example.

####  around` フックは `before` フックや `after` フックと同じようにサンプルと状態を共有しません。この意味はあなたがexampleと`around`フックの間でインスタンスの変数を共有できないことだ
>WARNING: around hooks do not share state with the example the way before and after hooks do. This means that you cannot share instance variables between around hooks and examples.

#### Mockフレームワークはexampleを実行するcontextの内はセットアップしたり、解体されます。あなたは`around`フックにおいてMockフレームワーク達を直接的に操作できません。
>WARNING: Mock frameworks are set up and torn down within the context of running the example. You cannot interact with them directly in around hooks.

#### `around`フックは定義されたコンテキストに関係なく`before`フックよりも前に、`after`フックよりも後に実行される
>WARNING: around hooks will execute before any before hooks, and after any after hooks regardless of the context they were defined in.

https://rspec.info/features/3-13/rspec-core/hooks/around-hooks/#:~:text=around%20hooks,were%20defined%20in

#### 感想
英語上手くなりたい
LeetCodeを1日1題解いてみる (day43)

43日目に取り組んだ問題はこちら！
今日からまた、アルゴリズムの問題に戻ります。

# 589. N-ary Tree Preorder Traversal

https://leetcode.com/problems/n-ary-tree-preorder-traversal/description/?lang=pythondata

## 問題文
Given the root of an n-ary tree, return the preorder traversal of its nodes' values.

Nary-Tree input serialization is represented in their level order traversal. Each group of children is separated by the null value

## 僕の回答
```py
"""
# Definition for a Node.
class Node:
    def __init__(self, val: Optional[int] = None, children: Optional[List['Node']] = None):
        self.val = val
        self.children = children
"""

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        stack = [root]
        result = []
        
        while stack:
            node = stack.pop()
            if not node:
                if not stack:
                    break
                else:
                    continue
            
            result.append(node.val)
            for child in node.children[::-1]:
                stack.append(child)
        
        return result
```

## より効率の良い回答例

```py
"""
# Definition for a Node.
class Node:
    def __init__(self, val: Optional[int] = None, children: Optional[List['Node']] = None):
        self.val = val
        self.children = children
"""

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        if not root:  # rootがNoneの場合の早期リターン
            return []

        stack = [root]
        result = []
        
        while stack:
            node = stack.pop()
            if not node:
                continue
            
            result.append(node.val)
            if node.children:  # 子ノードがある場合のみ処理
                for child in node.children[::-1]:
                    stack.append(child)
        
        return result
```

## 学んだこと
- 以下の部分は`continue`で次の`while`で確認されるので不必要だった。
    ```py
    if not stack:
        break
    ```
 
- 配列に後ろからアクセスする方法は`arr[::-1]`

## コメント
今回の問題はすぐに思いついて、エラーなしで一回で成功したのでとても嬉しい！

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/2d2465135cb42255f872
ジオメトリノードでマイクラ風のキューブ充填表現をしてみる

自分は普段はこういった映像表現は作っていないのですが
他ソフトの作例動画を見かけて少し試してみたくなったのでBlenderのGeometryNodesでの作例を作ってみました
![24121601.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/45e08dde-8e33-e274-0074-9c1b82739ed8.gif)

歩いている人型のモデルを囲う立体グリッド上にキューブを発生させて
距離に合わせてキューブを縮小することでこの見た目になります

## グリッドデータの作成
キューブを発生させる範囲にグリッド状のメッシュを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/f4c928a2-c1a4-acfb-ca06-a5d05eca8b0c.png)
これは他の解説等でも出てくるので特に解説することはないのですが
縦横高さの範囲とグリッド幅を指定するように調整してあります
このグリッドの頂点座標を利用したいので　最後に並べたものを実体メッシュに変換する
「インスタンス実体化」を忘れずに。

## ターゲットメッシュを充填する
実はこういったメッシュで　表面だけ充填したい場合にはジオメトリ近接が使えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/5975cdde-f989-9d32-45ae-cdbc9911afa8.png)
ターゲットジオメトリの要素（この場合は面）からの距離を取得できるので決まった距離より遠いものを削除すれば済みます

ただし　厚みのある形状になると　壁面から離れた部分は充填されないことになります　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/2cc6b5d3-016d-7ca6-db2d-b72239a74a54.png)
（キャプチャでは蓋部分を削除した状態ですが　閉じていても同じことです）

ここでは中身を充填したい場合の計算を考えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/eec9f146-cd28-566e-5ef1-aa9d1d5b0b4c.png)
ジオメトリ近接ではターゲット上の近接位置を取得でき
グリッドの頂点位置との差をとると近接点との方向ベクトルを得られます
これと　近接点の法線と内積をとると　値の正負で面の表方向か裏方向かを取得できます

:::note
今回は内部を一律に距離０扱いにしたいので
スイッチノードで 表方向は得られた値のまま 裏方向は０としました
負の値になるようにしてもいいかもしれません

この計算では閉じてない形状では不正な値になる可能性があるのは注意してください
:::
## データの調整
後はそれぞれの目的に合わせた処理になりますが今回の設定を書いておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/9a316d8e-268e-c077-7f2b-7552b804f9e6.png)
個々のインスタンス（キューブ）で色替えするために
名前付き属性にポイント毎にランダムな色を格納しています
シェーダーでは属性で同じ名前を指定することで値を取得できます

ジオメトリ削除で一定距離より離れた数値になっているポイントを削除しています

範囲マッピングで　距離0で最大サイズ　指定した距離を離れるとポイントの半径が0になるようにしています

## ノードの全体
今回のノードの全体はこうなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/fedbc9d1-3d5d-33f1-6cdc-f45d2be8dc65.png)
何かの参考になれば幸いです
【VBA】わたしのベストプラクティス：エラートラップ編

VBAのエラートラップ、なにがいい形なのかいまいち定まっていなかったのですが、今のところ自分の行き着いた方法です

VBAでも、クラス設計をしっかりめにして書くのがマイブームです

エラーが発生したときにかんがえたいことは
- ログへエラー情報を出力したい
- フォーム上にエラーメッセージを表示したい
- エラー情報をメール通知したい
などです。

そのほかには
- エラーがどこで発生したのか？エラーの発生場所（クラスやメソッド）を知りたい。
- どの経路で呼び出した結果、エラーが発生したの？
などです。

こんな感じで書くことに決めています。
- クラス内のエラートラップは、全て呼び出し元へスローしてしまう
- Erra.RaiseのSouceに、Err.Souce & ">" & "クラス名.メソッド名"を入れてスローする

呼び出し元
```
private mc_MODNAME="MAIN"

pubilc sub Yobidasimoto()
    const cnsPROCNAME="Yobidasimoto"
    dim modProcName as string
    modProcName=mc_MODNAME & "." & cnsPROCNAME

on Error Goto ERR_SECTION
    
    dim hogehoge as hogehogeClass
    set hogehoge = new hogehogeClass
    call hogehoge.Init

ERR_SECTION:
    'ログ出力

    'メール通知処理呼び出したり
    'ここにメール送信処理呼び出しメソッド(割愛します）
    
    'エラーメッセージ表示したり
    Msgbox(Err.Description)
    
end sub
```

クラスモジュール
```
public sub Init(av_filePath as string)
    const cnsPROCNAME="Yobidasimoto"
    dim modProcName as string
    modProcName=mc_MODNAME & "." & cnsPROCNAME

on Error Goto ERR_SECTION

    'なにかの処理
    'なにかの処理
    'なにかの処理
    'なにかの処理
    'なにかの処理
    'なにかの処理

ERR_SECTION:
    if Err.Number<>0 then
        call Err.Raise(Err.Number , Err.Souce & ">" & modProcName , Err.Description)
    end if

end sub
```


ログ出力に関しては、なにが一番良いものか決めきれていないところもあるのですが
- グローバル変数使いたくない
- 依存性を極力排除したい
ので、、

クラスの中からログ出力イベント発生させて、呼び出し元でイベントキャッチしてログ出力するようにしてたりします。
また別の記事で書いてみます。
（これがいいのかわからない、、）
windowsからmacbookに有線lanでファイル転送

windowsに入っているデータをLANケーブルのみでmacbookに移した備忘録
https://pcelenet.blog.jp/archives/33226070.html を参考にさせてもらった

① PC同士をLANケーブルでつなげる

② windows側の準備
共有したいファイルを右クリック＞プロパティ＞共有＞共有＞everyoneを追加＞読み書きにチェックボックスをいれる
設定＞ネットワークとインターネット＞インターネットの詳細設定＞共有の詳細設定＞ファイルとプリンターの共有をON, パスワードの保護共有をOFF

③ macbook側
desktop画面の何もないところをクリックして ⌘K ＞ ブラウズ

これでファイルが表示される
ローコード・ノーコードツールに対する今後の期待

# はじめに

昨今ローコード・ノーコードツールが流行ってきております。
エンジニア歴10数年の私的には、技術を付けた上で扱うものだという意識でおりましたが、色々と自分を取り巻く状況も変わってきましたのですこしまとめたいと思います。

# がっつりコーディングには教育コストが非常に高い

組織に属して製品を作るというのは大変な作業です。
趣味や学業の中でコーディングをやっているという方もいらっしゃると思いますが、組織ごとのルール・成果物が存在し、その精度も非常に高いものが必要とされます。
また、経験からくる「ここやばそうだな」とか「ここは今のうちに綺麗に作らないとな」とか というのも口で指導してもなかなか浸透までには時間がかかります。
信頼して開発を任せるというところまでたどり着くのに感覚ではありますがおおよそ5年程度は必要ではないでしょうか。
その間、指導コストも人材コストもかかってしまうという点は難点となります。

# 人材調達が難しい

特に私のような地方の者にとっては、戦力となる人が仲間になってくれるというのは難しくなります。
昨今ではリモートワークが導入されている企業も多く、地方に住みながらも都会の給料というのが当たり前になりつつあります。
そういった意味で人をあまり選んでられないというのが地方企業の実態なのではないでしょうか?

# 期待したいローコード・ノーコードツール

実際少ししか使ったことがありません笑。
が、あまり経験がなくとも戦力になるまでに要する時間は圧倒的に少ないというのは魅力でしょう。
一方で課題としては
* 導入・維持のコストがベイできるものか?
* 細かな制御を要するものを実現できるか?
* 基幹システムなどからのデータ連携など可能なのか?

といった点は課題でしょう。

社内のシステムなどある程度細かいところが交渉可能なものについては有利だと思います。
また、昨今では10年ほど前よりも大きく進歩を遂げ、使いやすく、多機能でパフォーマンスもよくなって おります(とAIさんが申しております)

実現できる機能にも幅が出てきたとのことであるため、活躍の場は広いでしょう。
コスト面に関しては、どこまでをこれで実現するか?によってペイできるか否かが変わってくると思います。
長期的な人材コストの面を踏まえての導入戦略が大切なものになるでしょう。
加えまして、導入している組織も多くなってきており、ベンダからのサポートも充実してきている点は 魅力となります。
どうやって実現すればいいかわからない。そもそも実現可能なのかを相談する先がどこかにあるというのは 助かる限りでしょう。

# 終わりに

やはりこの先はこちらが主流となってくるのでしょう。
わたしが挙げた課題も当然提供側も把握しているので、対策はされてくると思います。
(既にされているものもあるでしょう)
人そのものが減っている中、プログラミングについては学業の中でも取り入れられ、人気のあるリモートワークに よってエンジニアそのものの供給は保たれております。
ですが、地方ではその恩恵を受けにくい傾向にあるため、人が少なくてもやっていくための対策は必要になってくるのでしょう。
JSTQB FLの作問で生成AIを活用した際に気づいたこと

# はじめに
みなさんこんにちは！

まず自己紹介ですが、
私は昨年、JSTQB Foundation Levelに合格しまして、
今年は教える側の立場となり、悪戦苦闘しているQAエンジニアです。

今年はJSTQB FLの問題を作成して社内メンバー向けに模擬試験を行いました。
生成AIを活用して作問をしましたので、今回の記事ではその際のお話となります。

結論としましては、自力で問題を作成するよりも、生成AIを活用することで大幅に時間を短縮できました。
生成AIサービスを利用する中で、注意すべき点がいくつか見えてきましたので、備忘録としてまとめていきたいと思います。

JSTQBの自己学習で生成AIを利用したいと思ってる方や、
私と同じように社内で講師を担当されている方などに少しでもお役に立てましたら幸いです！


# 前提として

前提として、実際に作問を行った際の概要は以下のとおりです。
一言でまとめますと、「ChatGPTでシラバスversion3.1に基づいた問題を60問出力し、その後、内容が正確であるかを人の目でチェックして40問にまとめる」という作業を行いました。

```:概要
・ChatGPTを利用
・2024年11月の試験内容が更新される以前の「Version 2018V3.1.J03」のシラバスを参照
・実際の試験と同じような設定を想定して問題を作成
　・試験時間：60分
　・問題数：40問
　・4択形式
・全6章の中から1章10問ずつで問題と解説を出力
　・シラバス記載の想定学習時間の割合から章ごとの問題数を決定
・AI出力後に問題内容の整合性が取れているかレビューを実施
```


>　・シラバス記載の想定学習時間の割合から章ごとの問題数を決定

章ごとの問題数の決定は、例えば1章の想定学習時間は175分で全体の2割程なので問題数は8問に設定するという調整をしました。
結果、全体を見たときに違和感のないバランスに仕上がったので問題のない決定方法だったと思います。

# 気づいたこと/注意すべきこと

### ①AI出力後の問題が合っているかのレビューは必須である


生成AIを利用したことのある方は気づいていると思いますが、現状では嘘の出力（ハルシネーション）が当たり前のように発生します。

```:嘘出力の例
問題：テストとデバッグの違いは何ですか？
A：テストはソフトウェアの不具合を修正する
B：デバッグはソフトウェアの品質を評価する
C：テストは欠陥を発見する
D：デバッグは欠陥の原因を特定し、修正する

解説：テストはソフトウェアの欠陥を発見するプロセスであり、
　　　デバッグはその欠陥の原因を特定し修正するプロセスです。

出力された答え：D
実際の答え：CとD
```
例えば上記の出力の例の場合ですが、AIによる出力では答えはDとなっております。
しかし、シラバスに記載されているテストの7原則「テストは欠陥があることは示せるが、欠陥がないことは示せない」に基づけば、テストは欠陥を発見するプロセスであることが分かります。
そのため、実際の答えはCとDの両方となります。
そもそも、出力された解説とも矛盾しているため、このような問題については内容を修正するか、問題自体を差し替える対応を行いました。

AIで60問を出力した後にレビューを実施したところ、33問は修正が必要がありました。
少し怪しいと感じるものもあれば、一見問題なさそうな出力でも、シラバスと見比べると明確な記載がないので100%正しいとは言えない。
半数以上は修正が必要だったため、整合性が取れているかのレビューは必須であると考えます。


### ②出力された問題の難易度に注意する


初回は下記のような簡単なプロンプトでAI出力を行いましたが、
レビューを実施したところ、学習知識がない方でも消去法で答えが分かってしまうような非常に簡単な問題も多数ありました。

```:プロンプト例
あなたには今からJSTQBFLの模擬試験の問題を作成していただきます。
必要な要素は次の4つです。
・問題
・選択肢（4択）
・解答
・解説
```

例えば以下のような推測だけで答えられそうな問題が該当します。

```:出力例
問題：効果的なレビューの成功要因として適切なものはどれですか？
A：全てのコード行をレビューすること
B：参加者全員のスキルレベルが同じであること
C：明確な目標と計画を持ってレビューを実施すること
D：レビューの後に必ずテストを行うこと
答え：C
解説：効果的なレビューを行うためには、明確な目標と計画を持ってレビューを実施することが成功要因となります。）
```

ただ、もう少し難易度を上げてほしい、というようなプロンプトにも柔軟に対応可能なので難易度を調整したり、
同じ章から問題を再出力するなどで、多少時間がかかるものの対処自体は容易でした


### ③正確なシラバスのバージョン指定を行う

シラバスのバージョンを指定しないと、11月以前の範囲であるv3.1と最新のv4.0のシラバスの情報が混ざった内容となってしまったので失敗談として記載します。

以下の例で説明すると、シラバスv3.1には静的解析ツールについての解説がなく、シラバスv4.0には解説が含まれている内容であったので目的に沿った出力にはなりませんでした。

```:出力例
問題：静的解析ツールの主な目的は何ですか？
A：実行中のバグを検出すること
B：コードの品質や標準遵守を自動的にチェックすること
C：ユーザーインターフェースのテストを支援すること
D：データベースのパフォーマンスを向上させること
答え：B
解説：静的解析ツールは、コードの品質や標準遵守を自動的にチェックするために使用されます。これにより、手動で見つけにくい欠陥を発見できます。
```

正確なバージョンを指定さえすれば、指定したバージョンの内容に沿った問題の出力は可能なので調整は容易です。

# まとめ

JSTQBのAIによる問題作成では、上記で記載した通り半数以上は修正が必要な精度でした。
あくまで問題作成の補助として利用する前提で活用する分には非常に便利であると思います。

自己学習でも生成AIの活用は可能ですが、解いた後は必ずシラバスと見比べることは必須です。
私自身、上位資格の学習にAIを積極的に利用していこうと思いますが、この点は十分に注意したいと思います。

AIサービスの発展により今後さらに出力精度が向上していくと思いますので楽しみです。
以上、ご覧いただきありがとうございました！
MuJoCo入門 2 : いろいろなモデルを見る

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) ビューワーはどう使う？

## やること

[前回](https://qiita.com/Ninagawa123/items/57dc4b8e2fef9982b6ae)の続きです。
物理エンジンのMuJoCoを試します。

最終的には以下の内容を理解できるようになりたいです。（いつ）

https://mujoco.readthedocs.io/en/stable/overview.html



## 環境

- Mac M1


## 前回のリベンジ

[前回](https://qiita.com/Ninagawa123/items/57dc4b8e2fef9982b6ae)は、公式のチュートリアルに沿って犬ロボットをMuJoCoに出現させ、立たせたり歩かせたりするデモを確認しました。

しかし、MuJoCoのデスクトップアプリ(MuJoCo.app)を開いた後、使い方がわからず何もできない場面もありました。
今回はそのリベンジとして、コードを書かずにMuJoCoにサンプルのロボットを表示させてみます。

## MuJoCoでいろんなモデルを見る方法


#### 改めてMuJoCoアプリをDLする

[公式サイト](https://mujoco.org/)からMuJoCoのアプリをダウンロードします。
現在のバージョンは3.2.6です。 
https://github.com/google-deepmind/mujoco/releases

#### MuJoCoを起動する

MuJoCoを起動して空の画面を出します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/13bc1887-6154-267b-5478-c676fa993440.png" width=400/>

#### モデルを準備する

MuJoCoに対応したモデルのリストが下記にあるので確認します。
https://mujoco.readthedocs.io/en/stable/models.html

下記より、全モデルを一括DLします。
（codeのボタンからDownload Zip）
https://github.com/google-deepmind/mujoco_menagerie/tree/main

#### モデルを表示する

解凍して、たとえば「agility_cassie」のフォルダを開きます。
その中にある「scene.xml」をMuJoCoの画面にドロップします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/88ab27c5-340a-1d6c-bc61-8977948902b9.png" width=400/>


モデルと地面が現れます。
レンダリングがツヤツヤです。


#### いろんなモデルを表示する

同じ要領で他のscene.xmlも表示できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/9538e6a1-36be-9354-7ac9-eae6489ae49c.png" width=400/>

話題のロボットもいます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/6bb0b98f-168e-009f-fcc4-188e843ed5d7.png" width=400/>

コントロールタブから関節をまげたりもできます。

ロボット図鑑みたいでドロップしていろいろ見るだけでも面白いです。

前回のようなAgentタブやPlannerが左側のメニューにないので、自律的に動いてはくれません。よく調べれば自律プログラムもどこかに入っているかもしれませんがよくわかりません。


## つぎにやること

次回はPythonで動かすところを進めたいと思います。
ロボットをコードで動かせる環境に辿り着きたいものです。

## 前回記事

https://qiita.com/Ninagawa123/items/57dc4b8e2fef9982b6ae
playwright+node+dockerで直面したエラーについて

以下、WSL2+Ubuntu-20.04の環境で行いました。

# エラーその１：「At least one invalid signature was encountered.」

buildする際に以下のようなエラーが出ました。
```
> [5/5] RUN npx playwright install --with-deps --only-shell:
#0 0.818 Installing dependencies...
#0 1.060 Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
#0 1.154 Err:1 http://deb.debian.org/debian bookworm InRelease
#0 1.154   At least one invalid signature was encountered.
#0 1.178 Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
#0 1.208 Err:2 http://deb.debian.org/debian bookworm-updates InRelease
#0 1.208   At least one invalid signature was encountered.
#0 1.258 Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
#0 1.289 Err:3 http://deb.debian.org/debian-security bookworm-security InRelease
#0 1.289   At least one invalid signature was encountered.
#0 1.290 Reading package lists...
#0 1.295 W: GPG error: http://deb.debian.org/debian bookworm InRelease: At least one invalid signature was encountered.
#0 1.295 E: The repository 'http://deb.debian.org/debian bookworm InRelease' is not signed.
#0 1.295 W: GPG error: http://deb.debian.org/debian bookworm-updates InRelease: At least one invalid signature was encountered.
#0 1.295 E: The repository 'http://deb.debian.org/debian bookworm-updates InRelease' is not signed.
#0 1.295 W: GPG error: http://deb.debian.org/debian-security bookworm-security InRelease: At least one invalid signature was encountered.
#0 1.295 E: The repository 'http://deb.debian.org/debian-security bookworm-security InRelease' is not signed.
#0 1.296 Failed to install browsers
#0 1.296 Error: Installation process exited with code: 100
------
failed to solve: executor failed running [/bin/sh -c npx playwright install --with-deps --only-shell]: exit code: 1
```
無効な署名というエラーでしたが、結局は不要なイメージを削除する。具体的には、

```
docker system prune
```
を行った後にbuildすると無事エラーが解消されました。
以下の記事が参考になりました。

https://zenn.dev/gizumon/articles/7f9e6b4bf18051

https://qiita.com/yukia3e/items/6e2536dd90d34a8b01cc

# エラーその２：「Error: browserType.launch: Failed to launch: Error: spawn /root/.cache/ms-playwright/chromium-1148/chrome-linux/chrome ENOENT」
```
docker compose run --rm コンテナ名 npx playwright test
```
上記コマンドでtestを実行すると以下のようなエラーが出ました。

```
Running 1 test using 1 worker
  1) [chromium] › example.spec.ts:5:1 › 
・
・
・
    Error: browserType.launch: Failed to launch: Error: spawn /root/.cache/ms-playwright/chromium-1148/chrome-linux/chrome ENOENT
    Call log:
      - <launching> /root/.cache/ms-playwright/chromium-1148/chrome-linux/chrome --disable-field-trial-config --disable-background-
・
・
・
```
原因としてはalpineを使用していたことでした。
```dockerfile
FROM node:21.7.3-alpine3.20
・
・
・
```
以下のようにbookwormに変更することでエラーが解消できました。
```dockerfile
FROM node:21.7.3-bookworm
・
・
・
```

ドキュメントの一番下に示されている例でbookwormが使用されており、これが参考になりました。

https://playwright.dev/docs/docker
空の二次元配列をつくるときの注意点

空の配列をつくるときに自分が何度も同じ間違いをしていたのでメモしておく。

## 結論

```ruby
Array.new(2, [])
```
上のような書き方はやめたほうがよく

```ruby
Array.new(2) { [] }
```
ブロックを渡して書いたほうがいい。

## 理由
なぜなら`Array.new(2, [])`と書くと、全ての要素が同じ配列を参照してしまうから。  

## 具体例
```ruby
arr = Array.new(2, [])
p arr

arr[0] << "abc"
p arr
```

先頭の配列`arr[0]`に"abc"を追加したのに、`arr[1]`にも追加されている。
```bash
$ ruby sample.rb
[[], []]
[["abc"], ["abc"]]
```

ブロックで渡すと、それぞれの要素が独立した配列を参照するようになる。
```ruby
arr = Array.new(2) { [] }
p arr

arr[0] << "abc"
p arr
```

この場合は`arr[0]`のみが変更され、`arr[1]`は変わらない。
```bash
$ ruby sample.rb
[[], []]
[["abc"], []]
```

代入した場合は、参照元が変わるので、他の要素に影響しない。
```ruby
arr = Array.new(2, [])
p arr

arr[0] = "abc"
p arr
```
先頭の要素`arr[0]`だけが変更され、先頭の要素`arr[1]`は空の配列のまま。
```bash
$ ruby sample.rb
[[], []]
["abc", []]
```
## まとめ
空の二次元配列をつくるときは`Array.new(2) { [] }`とブロックを渡すようにする。
テスターが複数拠点に分かれている状況でテストリーダーがすべき3つのこと

## はじめに

仙台でテストリーダーを務めている `watatatata` です。QAからゲーム業界に入った元エンジニアです。
現在担当しているプロジェクトでは、拠点が別れており、社内のチームが2箇所、ベンダーのスタジオが1箇所ある状態です。
タイトルの通り、複数拠点にテスターがいる状況でテストリーダーとしてやってよかったことを紹介します。
ゲームテストに限らず、複数拠点にまたがるチームのリーダー向けに書いていきます。

## 複数拠点に分かれていることによって出てきた課題


**課題①** ─ テキストベースのコミュニケーションだと伝わる情報量が少なく、タイムロスや齟齬が生まれる。

**課題②** ─ 口頭で相談した情報が別拠点に伝わらず、あらゆる作業がバッティングする（テストケース、バグチケット、会議室の予約まで）

**課題③** ─ 作業が属人（拠点）化しており、体制変更や感染症などに対する受け身が取れない。

## 課題に対するアプローチ

### ①「いつでも開いているオンライン会議室」を積極的に使用

Google MeetやZoomなどのサービスを利用し、オンライン会議室を設け、リーダーが常に待機する状態を作りました。  
作業者はそこでいつでも口頭で質問できる環境を整えました。

### ② Slackで全員が情報を共有できるように

1つの作業に対して必ずSlackでスレッドを建て、作業開始時に申告するようにしました。  
問題が発生した際には、作業者全員が入っているグループメンションをつけるルールを設けました。

### ③「その拠点、その人でしかできない作業」をなくす

主担当を設けず、まだ経験のない人を積極的にアサインし、前の担当者が教えるサイクルを作りました。  
これにより、全員が「やったことがある」状態にすることができました。

## 課題の解決と効果
**①テキストベースのコミュニケーションだと伝わる情報量が少なく、タイムロスや齟齬が生まれる**  
- いつでも開いているオンライン会議室」にみんながいることで、口頭と変わらない情報量でコミュニケーションが取れるようになりました。  
- 不具合発見からチケット作成までの時間が28％減少しました。

　
**②口頭で相談した情報が別拠点に伝わらず、あらゆる作業がバッティングする（テストケース、バグチケット、会議室の予約まで）**  
- Slackとオンライン会議室を活用することで解決しました。  
- バッティング件数は、平均8件/月から0件/月に減少しました。

　
**③作業が属人（拠点）化しており、体制変更や感染症などに対する受け身が取れない**  
- 個人の病欠や拠点の問題があっても、全員がやったことがある状態なので、完全に滞ることがなくなりました。 
- また、「教える立場」を早くから経験できる環境が整いました。
## まとめ

上記のアプローチによって、まず足並みを揃えることができ、現在は拠点ごとの良いところと悪いところが明確になってきています。  
今後は、個人の適性や拠点の特色を活かして生産性を向上させていく予定です。  
全体的に、コミュニケーションが一番重要であることが再認識できました。  
コストをかける価値がある/あったと改めて感じています。

拠点間やリモートワークなど、離れた場所でのチーム内コミュニケーションに悩んでいる方はぜひ参考にしてみてください。
改めてLinuxコマンドを理解する [コマンドを繋げてみよう編]

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はLinuxコマンドの同士の連携についてです。


## パイプ
まずは基本的なところで、パイプです。
これは最初に実行したコマンドの結果を次のコマンドに渡すものです。例えばですが、以下のようなコマンドの場合です。
```Bash:
ls | grep "test"
```

この場合、`ls`の表示結果を右の`grep`コマンドに渡しています。パイプで繋げる場合、よく使われるのが`grep`コマンドです。
このコマンドは表示結果やファイルの中身などから特定の文字列が含まれているものだけを表示してくれます。なので、`ls`のコマンドで出てくる出力結果から`test`という文字列が含まれているものだけを出力する形ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/8a4435ec-c989-dbe5-13ff-122944392ddd.png)


:::note warn
左のコマンドに出力結果がない場合でも、コマンドは実行されます。空の場合は何も表示されず終了します。
:::



## 論理AND (&&)
次に論理ANDを紹介します。これは最初のコマンドが実行されたら次のコマンドを実行するシンプルな記述です。

```Bash:論理AND
mkdir test && cd test
```
以下のコマンドを実行すると、`mkdir`コマンドでディレクトリを作成した後に、そのままそのディレクトリに`cd`で移っています。

:::note warn
&&の場合、左のコマンドが実行失敗した場合は右のコマンドは実行されませんのでご注意ください。
:::


## 論理OR (||)
次に論理ORを紹介します。こちらはANDと違って、前のコマンドが失敗した時に次のコマンドを実行します。

三つ以上実行した場合は以下になります。
```Bash:三つ以上の論理OR
command1 || command2 || command3
```
**command1が成功**の場合：
command2とcommand3は実行されないです。

**command1が失敗**の場合：
command2が実行されます。成功した場合はcommand3は実行されないです。

**command2も失敗**の場合：
command3が実行されます。

:::note warn
前のコマンドが成功した場合のみ、次のコマンドを実行するという点に注意したいですね。
:::





## セミコロン (`;`)
コマンドを順番に実行します。前のコマンドが成功しようと失敗しようと、関係なく次を実行してくれます。
```bash
  cd test; ls
```

:::note warn
前のコマンドが失敗したらそのまま終わって欲しい場合は&&を使いましょう。
:::





## バックグラウンドで実行 (`&`)
コマンドをバックグラウンドで実行してくれます。例えば`sleep`コマンドという、シェルの処理を指定した時間分一時停止してくれるコマンドがあります。
```Bash:使い方
sleep 10 &
```
本来末尾に`&`がない場合、シェルはコマンドなどを受け付けないまま固まるのですが、末尾に`&`をつけると`sleep`コマンドを裏で実行してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/d6f603e5-f8a8-fe4b-c64f-7a5198e5ed1b.png)

## コマンドの置き換え（$()）
これはコマンドの結果を他のコマンドで使えるようにします。あとは変数に入れたりですね。
```Bash:書き方
echo "今日の天気は$(date)です。"
```

```Bash:出力結果
今日の天気は2024年 12月16日 月曜日 19時31分35秒 JSTです。
```

シェルスクリプトのif文で使用してみる。
```Bash:書き方
if [ "$(whoami)" = "root" ]; then
    echo "あなたはrootユーザーです。"
else
    echo "あなたは通常のユーザーです。"
fi

```
シェルスクリプトを作成して実行してみると、以下のような結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/e72208d4-9197-93bb-b6d9-bcbabccd7b8e.png)

:::note warn
シェルスクリプトを実行するには実行権限をつける必要があります。chmodコマンドを使いましょう。実際、別にやらなくて結構です。
:::


## おわりに
今回はコマンドをつなげてみようといった記事でした。
どれも結構使いますね。Dockerfileなどでもコマンドをつなげてコンテナ内の環境構築を一気にやることが多いです。

とはいえ、初学者向けの記事なので、まずは`&&`から使い始めてください。

シェル強強エンジニアを目指していきましょう💪
![7f274c8f-03f8-4661-ab8e-26c53c2ba192_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/c9202a6a-0e5a-8951-b4b1-c617695ecb87.png)

まとめ記事に戻るにはこちら👇

https://qiita.com/ikemura-ren/items/3e7b6ec1b0cd9b3928d6


## 余談
最近分厚い技術書を3冊購入したせいで、リュックが重くてしょうがないです。。
PC + 技術書は腰にきます（泣）
今年の自身の技術的成長を振り返って

# はじめに

今年も12月と終わりが近くなってまいりました。
今年はどんな知識・スキルを身に着けることができたのか改めて振り返ってみたいと思います。

# 仕事を通じて

どちらかというと技術力よりはマネジメントの力を身に着けたように思えます。
要件定義を複数こなし、自分の知らなかった業務領域の知識を身に着け、各所と相談・連携を図ったこと。 
メンバーに対しての指導方法についてのアプローチに落ち着いた対応が取れるようになってきたこと。 (自分で思っているだけですが)
技術面に関しては多少typescriptとの仲良し度が上がった気がします。

# 資格勉強を通じて

APの取得及びDBスペシャリスト試験への挑戦を行いました。 
APの取得においては苦手であったネットワーク領域について、多少のレベルアップができたと思いますし。 
自分が何を得意として何を苦手にしているのか?を知ることができました。 
普段やっているプロジェクトマネジメントは振るわなかったのは少し残念でありました。

DBスペシャリストの試験を通じて、自身が意外とわかっていていた(探索系)ところと実はよくわかっていなかった(概念設計)が浮き彫りになることで、これからどういったことの 知識を深めていかなければならないかなどの方針が見えてきましたし、やはりデータベースそのものの 知識の幅は広くなったと思います。

今思えばOSS-DB Goldはこちらを 取ってからの方が適切であったかもしれません。

# 昨年立てた3年間で達成したいロードマップとの比較

[こちらの記事](https://qiita.com/jun2/items/74560ce0c5cb7e9ef1fb)で立てたロードマップと現在の状況を整理しました。

* AP: OK

* DBスペシャリスト: 結果待ち→OK

* LinuC L1:勉強中

* LinuC L2:勉強中

割と高い目標を立てたつもりでしたが、DBスペシャリストの結果次第では達成が見えてきました。

あまり地頭は良くない方だと自覚しているのですが、何とかなるものですね。 
このままだとただの自慢(にもならないかもですが)に見えてしまうので一言添えますと、 自分の目標をオープンにするというのもなかなか効果的であると思います。 
誰に言われたわけでもない目標を達成するのは自分自身なので、やるもやらないも自分自身だからです。

確かにやらない選択をする人もいるでしょうが、Qiitaで発信しているような方々は前者を選択するものと思います。

# 終わりに

今年も様々な面で精進できたことは喜ばしいことだと思います。
中々同じことばかりしていると学びがないものですが、仕事自体のステップアップ、自分で決めたステップアップ を着実にこなしていくことで、学生自体の不勉強を何とか解消できて来たかなと社会人16年生にきてようやく思います。
API Best Practices ~RPCには必ず期限を設定する

## RPCには必ず期限を設定する

https://protobuf.dev/programming-guides/api/#every-rpc-deadline

RPCにはデフォルトでタイムアウトがありません。
リクエストは完了時にのみ解放されるバックエンドリソースを占有するため、デフォルトの期限を設定することは良い方法です。
通常、標準フレームワークを使用するときにデフォルトでそうします。

期限は、リクエストに添付されたより短い期限によって上書きされる場合があります。
deadline オプションを設定することで、クライアントにRPCの期限を明確に伝え、標準フレームワークによって尊重され、強制されます。

```protobuf
rpc Foo(FooRequest) returns (FooResponse) {
  option deadline = x; // there is no globally good default
}
```

既存のサービスの場合、破壊的変更とならないよう、新しい期限を強制する前に既存のクライアントの動作を評価することが重要です。
場合によっては、事後に短い期限を強制できない場合があります。

---

proto で明記せず、各言語の実装でデフォルト値を設定するのが一般的かもしれない。
public API として提供する場合は、proto で明記しておくべきかもしれない。
己のタスク管理のテクニック

# はじめに

仕事をしているとここ一番でタスクが積みあがってくるものです。
積みあがりすぎてもう何があるのかわからなくなることもしばしば。
こうなってくると時間外をしていても何ができたら帰れるか?が全然わからなくなってくるものです。
そこで実践しているタスク管理方法について記事にしたいと思います。

# タスクについて実行期間・納期を明確にする

まずはタスクが積まれたら、タスクリストに追加しましょう。
現在存在しているタスクの空き、優先度、納期を踏まえどの期間に実施するかを線引きます。
場合によっては既存のタスクのリスケジュールを行いましょう。
何を使うかは人それぞれだと思います。
わたしもいろいろ使ってみましたが、最後はOfficeに戻ってきてしまいました。
もちろんプロジェクト管理ツールに登録して線を引いていくとより良いのですが、
リスケの登録が大変であったりということがありOfficeで管理しています。
プロジェクト管理ツールに登録することで他の人にも状況を知らせることができますので、 そういった点で言えばプロジェクト管理ツールで行うのが正解だとは思っています。

# 週ごとに整理する

その週の開始時もしくは終了時に、1週間の詳細なやることを日ごとに整理します。
なるべく細かい方がよいです。
例えば「設計」ではなく、何のモジュールをどの程度の完成度までその日にもっていくか?
という目標値を立てます。
これにより、タスクがパンパンに詰まっているときの「帰っても大丈夫」を実現できると思います。
この時、タスクではない細かなことも記載していくとよいでしょう。

例えば、
* XXさんに打合せの打診・調整
* XXさんにXXのことを報告


など対人関係におけることですね。

意外とこれらタスクが積み重なってくると、そちらを優先しがちなので先延ばしにしてしまうことがあります。 
細かなことも日ごとのタスクとして捉えることで、先延ばしにせず対応ができると思います。

# 余力を把握する

タスクごとに線を引くときに気をつけなければならないのは、己を知っていることです。
自分であればこの仕事はこのくらいで達成できそうだななどわかっていないといざ引いた時に実はゆるゆるで不要な残業をした挙句、後ほどむしろ暇になってしまった。 
とか、全然余裕がなく結局間に合わなかった = やりきれない仕事を引き受けてしまった。 
になりかねません。

もちろん仕事を断りにくいのはその通りですが、余力をきちんと把握しておくことで、自分の状況を論理的に説明し、納期を調整してもらうなどの交渉の余地はあると思います。 
黙ってただただ遅滞してしまうとそちらの方が悪い印象を与えかねません。

・・・一応ですが、ここでは引き受けられない仕事は断りましょう! と言っているのではなく、遂行可能かを現実的に考えた上で難しければちゃんと相談しましょうと言っています。

# 依頼を行って待ちになりそうなものは優先する

他の人に依頼を行ってそれの待ちとなるタスクがある場合は、依頼を優先します。
待っている間に他の作業をこなすという感じです。
また、自身に相手を待たせるタスクがふってきた場合は、そちらを優先します。
開発で良くあるのが先行作業の待ちによって遅滞することですが、自身がその原因とならないよう気をつけて います。
全員がこの意識で動くことができれば待ちはあまり発生しなさそうですが、いろいろな人がいますので 少なくとも自身・まわりのメンバーはこれに気を付けています。

# 休暇の予定は忘れない

有給休暇は月に一度程度取得できる分はあると思います。
何かプライベートな予定もあるでしょうし、急な忌引、体調不良等もあるでしょう。 
ですので、線を引く際には月に一度程度休暇が入るであろうと見込んで線を引いておくと安全です。 
もちろん過渡期には休んでられない! という状況になっていると思いますが、長期でこなすタスクの場合には考慮しておいた方がよいでしょう。

# 終わりに

もっといい管理をされている人も多いでしょうが、私の場合はこのように実践しております。
ほとんど残業せずにいることができているのですが、タスクの管理方法なのか、タスク量が適量なのかについては微妙なところです。 
忙しい時ほど、冷静に分析がを行うことで、地に足をつけて業務に励むことができると思っての記事となりますので、誰かの役に立てば幸いです。
職場のストレス管理術

# はじめに

色々と立場によって抱えるストレスって違いますよね。

わたしもひと昔前は、納期やレビューの指摘に追われるといったところがストレスの元でしたが、 もっぱら昨今は人のコントロールや対外関係がストレスになることが多いです。 
ストレスをため込みすぎると体調にも影響が出ますしろくなことがありません。 
この記事ではストレスに立ち向かうための自身の方法について記事にしたいと思います。

# ストレスの原因を特定

例えば、上司の指導がストレスである場合があります。

わたしももっと若いころはそういったことがありましたが、それを理由にすると逃げている気がして認めたくなかったように記憶しています。 仕事が上手くできないせいだ・・・とか自分の段取りが悪いせいだ・・・とか色々転換したものですが、 これでは本来の原因の解決はいつまでたってもできません。

まずは自分がストレスと感じている部分について立ち向かうところから始めた方が良いかなと思います。

# 時間・タスクの管理

忙しい方が時間がたつのが早いので個人的にはここはあまりストレスを感じていませんが、割とこの悩みの方は多いのではないでしょうか? 
完全にバンクしてしまったときというのは、忙しいのかわからない状態になったものです。 
ここまでくると残業まみれが予想されるのですが、全体量に慌てず、一つ一つ書き出し、消込んでいくことで いつかは終わります。

忙しい時ほど、仕事の整理は行った方がいいです。
一つずつやることが減っていくと達成感を覚えられるのでお勧めします。

# 運動・リラクゼーション

職場環境によりますが、昼休み時間おにぎりをかじってスマホを触っているだけではなく、Qiitaに関わる方々はデスクワークが主になると思いますので、運動できるとよいでしょう。 
わたしは昼休みはウォーキング・ジョギングをやることが多いですが、かなり気分が切り替わります。 
ただし夏になると汗が引くまで大変です笑

趣味を楽しむのもお勧めです。
ランチに行くのもよいでしょう。
外食は食べるものを選ばないと肥満の元となりますので注意が必要です。

# コミュニケーションの改善

コミュニケーションが苦手な人はいると思います。
中には特定の人が苦手な人もいるでしょう。
苦手なものをそのままにしていると、後々自分に跳ね返ってきます。 
一日一回程度はメンバーと話す機会を設けて、円滑に仕事ができるように務めることが必要です。 
それ自体がストレスなんだよ! という人も多いと思います。 
もちろん己の志やキャリアプランにもよるのですが、ちゃんと仕事を続けてある程度のポジションを将来的には持ちたいと思っている方にとっては、これを放置すると後々の大きなストレスにつながっていきます。 
ある程度分散して対応していった方が、ストレスの管理としては良いものになるでしょう。

# 嫌なことほど早めの対処・相談を

仕事をしているとどうしても嫌なこと、やりたくないことはあるでしょう。 
そういったことを先延ばしにしていくと、今日・明日行きたくないなぁ〜という気持ちになってしまいます。
逆に奮い立たせて終わらせてしまうことで、不安なく仕事ができることでしょう。 
また、自分一人での対処が難しいこと、報告しずらいことほど早めに相談しましょう。 
これは新入社員の時に教わることでしょうが、年次を重ねるごとに相談しにくくなったりもします。 
それでもそのまま放置して対処を怠ると後々大きく自分に跳ね返ってきます。 
下手をすると自身の待遇にも影響が出るかもしれません。 
業種・社風にもよりますが、きちんとこまめに相談をしておくことで、そういった大きな不都合は回避できる ことでしょう。

# 終わりに

働いている以上たくさんのストレスが降りかかるものですが、逃げているばかりだと40年間働くことは難しいです。
もちろんFIREを目指して、蓄え・運用している人もいるでしょうが、短期的に実現するには相当なリスクを 取らないと厳しいです。 
企業に属している以上、社会保険の面で相当に有利になりますのでまずは目の前の職務に向き合えるよう日々のストレスと立ち向かえるよう自分でやりくり・精神鍛錬が必要なのだと思います。
プリザンターの外部ユーザー向けセキュリティ強化のポイント

## はじめに

プリザンターを基盤としたシステムに、外部からアクセスしたい！
でも、セキュリティが心配・・・そんな声は少なくないのではないでしょうか。

外部ユーザがプリザンターを基盤としたシステムにアクセスする際、セキュリティは最重要課題の一つです。
今回は、私たちが行ったセキュリティ強化の取り組みについてご紹介します。

`本記事は、プリザンターを基盤としたシステムに外部アクセスを提供する際のセキュリティ対策に焦点を当てています。`


## システム要件の背景

今回ご紹介するシステム構成は、以下のシステム要件を満たすために設計されました。

- **プリザンターを基盤**とした業務基幹システム
- **社内ユーザー**と**社外ユーザー**の両方からアクセス可能なシステム
  - **社内ユーザー**：社内ネットワークでのIP制限およびSSOを使用し、プリザンターの標準インターフェースで提供
  - **社外ユーザー**：フロントエンドはスクラッチで開発。プリザンターAPIでプリザンターと連携

![kouseizu_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962753/be776a34-19c1-73c1-903f-5360bc1b5b70.png)



ここで課題となったのが、**社外ユーザーからのアクセスにおけるセキュリティリスク**です。
具体的には以下の2点が懸念事項として挙げられました。
1. プリザンターAPIの利用時に、**APIキーが漏洩するリスク**はないか？
1. **ID/パスワードのみの認証では不十分**ではないか？

これらの課題に対し、以下の対策を実施しました。


## セキュリティ対策のポイント

### 1. APIキーの隠蔽
外部ユーザーからのAPIキー漏洩を防ぐため、**APIサーバを中継する構成**を採用としました。
APIサーバには独自APIを設置し、フロントエンドは独自APIを通じてアクセス。APIサーバがプリザンターAPIと連携します。

![kouseizu_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962753/3b3ec8d0-43f4-f4b9-4c1e-53b05dfbaf8b.png)

これにより、外部から直接プリザンターのAPIキーを参照することができなくなり、APIキーの漏洩を防止します。



### 2. 多要素認証の導入
ID/パスワード認証だけでは不十分ではないかとの課題については、多要素認証を導入しました。
今回は「SMS認証」と「セキュリティキー」の利用を認証プロセスに追加しました。
- SMS認証：[外部サービス(SMSLINK)](https://smslink.nexway.co.jp/lpv01_g?utm_source=google&utm_medium=cpc&utm_campaign=brand&utm_term=smslink&gad_source=1&gclid=EAIaIQobChMIl4Ts0_qrigMVYc0WBR3ptCNuEAAYASAAEgI8NPD_BwE)を利用
- セキュリティキー：WebAuthnプロトコルを活用した認証

![kouseizu_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962753/c5282771-000b-b61c-5e8f-a672af982225.png)

これにより、認証プロセスが二重、三重の防壁となり、不正アクセスのリスクを大幅に軽減します。

## システム構成の全体像
システム構成の全体像を、もう少し詳しく見ていきます。

![kouseizu_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962753/393dd0bb-7245-1afd-dab8-5cb3501be110.png)

##### AWS（EC2：Amazon Linux2023）
　今回は、Linux版でのプリザンター環境となります。
　Linux版ではWebサーバとしてNginxが必須なので、ここにAPIサーバを立てています。

##### プリザンター
　プリザンターへの直接アクセスは、IP制限で社内からのアクセスのみ許容としています。
　また、認証サービスのHENNGEを介してSSOでのログインとなっています。

##### フロントエンド
　使用言語はTypeScript（React）を採用。
　APIサーバの独自APIにアクセスします。

##### APIサーバ
　使用言語はPHP（Laravel）で構築しました。
　データの登録・更新はプリザンターAPIを利用してアクセスし、データ参照はパフォーマンスを考慮してDBを直接参照する形としました。
 　APIサーバにはSMS認証、セキュリティキーの認証サーバ機能も有しています。

## おわりに
外部から安全にアクセスしたいけどセキュリティが不安、というお悩みはありませんか？
今回ご紹介したAPIサーバの中継や多要素認証の導入以外にも、様々な方法はあるかと思いますが、要件に応じて柔軟に対応することが大切です。

本記事が、皆さんのシステム開発の参考になれば幸いです。ご質問やコメントがあれば、ぜひお寄せください！
PowerShellをexeに変換する時、ps2exeの簡単なgui版の使い方をご紹介！

<h4>2024年12月時点で検証しているので、比較的新しいと思います。</h4>

:::note info
まず、ps2exeとは、「.ps1」というファイルを、オプション(引数)を指定することで、実行可能な形式である「.exe」へ変換ができるものです！
:::
実行するコードは、コードブロック(黒い背景に文字があるもの)で、コピーしやすいように載せています♪
## ps2exeのインストール方法
監視者権限で、PowerShellを起動し``` 「PS C:\WINDOWS\system32> Install-Module ps2exe」 ```を入力し、実行する。
```PowerShell
Install-Module ps2exe
```
実行した後、色々出てきて、入力を求められたら、
``` Y ```
を入力し、enterで進むと、インストールが完了します！

## 使い方 Step1 起動方法
今回はGUIなので、そのまま、PowerShellで、このコードを入れ、実行してみましょう!
```powershell
start "C:\Program Files\WindowsPowerShell\Modules\ps2exe\1.0.14\Win-PS2EXE.exe"
```
↓の感じのUIが開いた場合、「 使い方 Step2 」へどうぞ～！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/9dd49764-589e-aed8-6fb3-10c0e02500f6.png)

:::note warn

### (もし、ファイルが見つからないと表示される場合↓)
先ほどのものから、
``` start "C:\Program Files\WindowsPowerShell\Modules\ps2exe\{ここがバージョン}\Win-PS2EXE.exe" ```
となっているので、``` {ここがバージョン} ``` の部分を最新版のバージョンの名前を入れてみて、再度実行してみてください。
一応、下記のURLのページの下部の方に、バージョンの一覧が乗っているので最新版のバージョン値を確認できます。(このURLから何かダウンロードする必要はありません。)

https://www.powershellgallery.com/packages/ps2exe/

そのほか、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/80607149-4ffa-ddb8-3672-3d12e01eafe1.png)

:::

## 使い方 Step2 アプリ化の方法
ここでは、適当なアプリにしましょう。
Chat GPTさんのお力を得ながら、ps1(PowerShell用のコード)を組みます。
完成したら、この画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/ca85e800-81df-11a7-e3ca-b870f01c80ab.png)

### 出力結果～
まず、元にしていたps1ファイルと出力されたexeの実行可能なファイルが出力されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/392216d8-46d5-870b-8cd9-53275e4f591b.png)
----
アプリは開くとこんな感じで、今回のオプション設定はPowerShellのプロンプトを表示せず、実行するように設定していたため、Visual Studioで作成したWindows Form Applicationができました。
(ちなみにアプリの内容は、ファイルをパスワードで暗号化するだけのシンプルなものです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/8fdadd59-76b7-31ea-bbdd-95f2ea0b15c4.png)

----
いかがでしたでしょうか！
このような形で、簡単にps1をexeに変換することができる、ps2exeの簡単なgui版の使い方を皆さんも知っていただき、もし使うことがあればぜひ活用してみてください！
JobsでPR伝票をフィルターすることの設定

伝票種類の区分①：
伝票番号の頭数字で確定。
　3XXXXX MRPで作成したPR
　1XXXXX 手動で作成したPR
使うアプリ：Application Jobs
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/233dff68-dc63-1cb9-9ab3-8004ca923107.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/80b7fbc2-8b17-b7e8-fa69-e8b51b375adb.png)

伝票種類の区分②：
手動で「Requisitioner」を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/84fbdf6c-427c-9ba2-c2ff-f307f1863c56.png)
リスコフの置換原則について勘違いしていたこと

# 懺悔
　数か月前までリスコフの置換原則に対して誤った理解をしていたので、ここに懺悔します。自分のような誤りを犯すいないともいますが、誰か一人でも理解の助けになれば幸いです。

# 誤っていた理解
　私がリスコフの置換原則を初めて出会ったのは、「Clean Architecture 達人に学ぶソフトウェアの構造と設計」という本の中です。この本ではリスコフの置換原則を以下のように説明していました。
> Ｓ型のオブジェクト o1 の各々に、対応するＴ型のオブジェクト o2 が１つ存在し、Ｔを使って定義されたプログラムＰに対して o2 の代わりに o1 を使ってもＰの振る舞いが変わらない場合、ＳはＴの派生型であるといえる。

　この説明を始めてみた時何が言いたいのか理解できませんでした。ただ文脈から何となくサブクラスはスーパークラスと同じ振る舞いをしないといけないと理解しました。この「同じ振る舞いをしないといけない」というのは本来プロパティやメソッドなどクラスの要素に対しての話なのですが、私は***クラス全体（型）を同じにしないといけない***と曲解してしまいました。
　図にすると以下のようなイメージで、子クラスは親クラスと同じ要素を持たないといけなくて、親クラスが持っていない要素を持つにはprivateで持つしかないという理解です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267761/a0536191-92f1-1719-e017-fd3581750d7e.png)

　このような理解をしていたため、ポリモーフィズムは概念が完全に同じで、詳細の動きだけ違いうといった局所的なところでしか利用できないと勘違いをしており、いまいちパワーを理解できずにいました。

 # 正しい理解
　以下の説明にはっきり書いてあるのですが、正しい理解は「o2（親クラス）の代わりにo1（子クラス）を使っても呼び出し側の処理は変わっちゃ駄目だよね」です。子クラスは親クラスの代わりをすればいいだけなので、子クラスに新しいプロパティやメソッドが増えても関係ありません。
> Ｓ型のオブジェクト o1 の各々に、対応するＴ型のオブジェクト o2 が１つ存在し、Ｔを使って定義されたプログラムＰに対して o2 の代わりに o1 を使ってもＰの振る舞いが変わらない場合、ＳはＴの派生型であるといえる。

　ポリモーフィズムも概念が完全に同じである必要はなく、各オブジェクトにある共通の概念を取り出し、親クラス（インターフェース）として定義することで、呼び出し側は親クラスの型に対してプログラミングを行えるので、柔軟性や可読性の高いコードになります。
　このような理解に正したことで、ポリモーフィズムのパワーが分かり、実際に活用できるようになりました。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267761/592f3cb9-b1fb-c7ce-41b1-39b8cedbae44.png)

 # 気づいたきっかけ
　ある日ピクミンって凄いポリモーフィズム感あるなと考えていました。走る、集合する、攻撃するといったピクミンとしての共通する行動があるうえで、赤ピクミンは攻撃力が高かったり、紫ピクミンは力持ちだったり、同じ行動でも各色のピクミンで違った結果を持つのがポリモーフィズムの考えだと。
 　ただ考えていくうちに黄色ピクミンは電気を通すという行動があったり、岩ピクミンは水晶を壊すといった行動があったり、ピクミンという抽象化されたものとは別に、各色のピクミンで異なる行動があることに気が付きました。それまでの私の理解だとこの状態はリスコフの置換原則の違反になるため、継承が行えずポリモーフィズムの実現が出来なかったです。しかし各色のピクミンのオブジェクトを作成して色単位でオブジェクトの管理を行うのはとても面倒なのではとも思いました。そこで今一度リスコフの置換原則について調べなおしたら、この誤りに気付きました。

# まとめ
　最初に読んだ説明は確か複雑でしたが、ちゃんと読めば理解できる内容だったので、文章はちゃんと読みましょう。また周りにアーキテクチャについて会話できる人がいないので、誤った方向に進んでしまったのもあります。もう少し記事の発信やオフラインのイベントに参加して交流を持てたらと思います。
テスト項目レビューについて気を付けていること

# はじめに

レビューって難しいですよね・・・?
まず大量のテスト項目を見ただけで気が滅入ってしまいます。
テストは不良を取り除く最後の砦です。
そのレビューがどれだけ大事か皆様ご承知のことと思います。
テストレビューをするにあたってどのようなことを気を付けてみているかを共有して 少しでも参考になればと思います。

# 目的

目的において特に気を付けるべきなのは新規構築の時ではなく、変更時だと思います。
新規構築時は目的はともあれ、全機能のチェックを行うものです。
変更時においては、目的を明確にしないと不要なテストをしてしまいがちです。
例えば、データベースが変更になったのでデータアクセス層の変更を実施した際、フォームそのもののコントロールについてはテスト不要であると考えます。
何も考えないと関係しそうな雰囲気の部分をテストしてしまいがちです。
データベースが変わるとどのような変更差異があるのか?その変更差異はどの機能に影響するのか?
を事前に考えないとテスト仕様書を見せられた時に、このテストってなんでするの?となってしまいます。
もちろんこの例で言えば、データ取得・更新系は全て見るべきです。
ですが、フォームで行っているバリデーションのチェックは理由がなければ変更も変化もないはずですよね。
理由ってなんだ?と言いますと例えばchar(1)の扱いがbyte→1文字になった場合などです。
(postgresqlにて文字数であることを最初衝撃でした)
この場合、フォーム側で10byteまでの制限をかけていた場合、10文字まで耐えられるよう変更が必要となります。
また、表示文字幅など10byteと10文字では全然異なりますので、このあたりは明確に変更点として取り上げ テストをすべきものと思います。

# 目的からテスト項目へのアプローチ

ただ目的を掲げテスト項目を並べただけでは何のためのテストか汲み取るまでに時間がかかります。
オフラインでのレビューであればこのあたり説明してもらえば納得なのですが、オンラインともなると この見せ方については、気の強い方が作成した場合そんなのそっちの都合でしょ」と言われてしまいそうですが、 漏れがないかを検査してもらうという意識をもって、資料を作る気持ちで作成してほしい。
見せ方は作成者側も注意が必要です。
とお願いしています。

# 境界值

ある程度の経験があれば息を吐くように境界値テストの項目を出してきてくれますが、 あまりレビューをされてこなかった人、不慣れな人はこの辺がよく漏れています。 
境界値はバグが出やすいところの上位であると思いますので、このあたりは必ず見ています。

# テスト環境

顧客が使用する環境を意識したテスト環境でテストするつもりがあるか?を確認します。

画面一つとっても解像度、縦横比によって画面が見切れたり、不要なスクロールが発生します。 
また、OSやOSに付随するソフトウェアのバージョンによって思わぬ動作の違いが出たりするため、必ず顧客と同等の環境でテストする必要があります。
一方、大衆に向けた製品である場合はサポートする環境がなんであるか?をよく確認し、 それぞれの環境で必要なテストを行う必要があります。

# テスト条件と期待値が明確か

「ボタンを押下し正常に終了すること」
もはや何をテストするのかわかりません。
期待値としていくつか後ろに隠れているのだと思います。
* データがテーブルに正しく入っているか
* 正常終了を契機にダイアログが表示されるか
* 画面を再読み込みし、最新の状態を表示するか
など、一例ではありますが、本来見たい内容というのは頭の中にたくさんあるのだと思います。 
また、「テーブルに正しく入っているか」 確認するためにどのようなデータを用意するか?も重要です。 
フォームの中にたくさん入力項目があって、全てに100と入力しても正しく入っているか?はわかりませんよね。

条件についても同様です。
網羅的に条件を満たしてテストできるのか?を私は見ていますので、少なくとも条件が整理されていることが 重要となります。

# 終わりに

どちらかというと、細かい内容のチェックよりかは大枠のアプローチが正しいか?を見るようにしています。 確かに細かい内容の誤記などもあるでしょうが、多くはテスト中に間違っていた・・・と気付くと思います。 全く見ないとは言いませんが、まずはアプローチが正しいか?が重要ではないでしょうか。
VScodeで使いやすい背景変更拡張機能を作ってみた

# VScodeで使いやすい背景変更拡張機能を作ってみた

この記事では作った拡張機能についての説明をしようと思います。

どのように作ったかなどの説明は気分が向いたら後々書きます。

詳しい中身を知りたい方は拡張機能自体はMITライセンスでソースを公開しているのでそちらをご覧ください

https://github.com/ThunLights/BackImage

## 拡張機能を追加

私が作った拡張機能はVScodeのマーケットプレースにて公開しています。

https://marketplace.visualstudio.com/items?itemName=ROBOTofficial.backimage

VScodeの拡張機能タブで「backimage」と検索すると出てくると思うのでインストールして再起動してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676619/97fa04b6-a09c-7b0b-1f08-3cd9f0de9a19.png)

## 設定をする

そうすると左側にBackImageのアイコンが出てくると思うのでクリックしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676619/a0e0727a-57e1-3df1-5f90-6f0d91127047.png)

「画像リスト」の右側にアイコンが二つあると思います。右は画像単体を追加、左はフォルダを追加(フォルダの中の画像をスライドショーのように投影する)を押して画像リストを追加してください

追加が終わると以下のようにリストが追加されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676619/a78ff22b-c3d4-a021-a7a8-a08b361fa588.png)

※画像リストの名前を変更したい場合はゴミ箱マークの左のボタンを押したあと鉛筆マークを押していただくと変更することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676619/fd0d2441-19a0-359b-0d19-44800a8472b0.png)

画像リストの追加が出来たら「未選択」になっている部分を押して登録した画像リストを選択しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676619/795230bc-13b5-5c4c-f7f3-4a3d5264784e.png)

## 実際に設定を適応

1: 先ほどのセレクトメニューの左側のON/OFFを切り替える

2: 現在の状況が無効になっている場合は「有効化する」ボタンを押す。

3: 「設定を適応する」ボタンを押す

この3ステップで以下のように背景画像変更が出来たと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676619/34881d73-0e7d-54a6-98ed-0578d0ec6c41.png)

## 注意

この拡張機能はWindows以外でのデバッグが済んでいません

LinuxやMacで実行した場合、うまく動かなかない可能性があります。

## ちょっとした宣伝

今現在、本拡張機能は英語と日本語にしか対応していません、他言語に翻訳できる方が居ましたら翻訳していただけると幸いです。

また、本拡張機能に不具合等がありましたらissueで報告、又はPull Requestを出していただければ幸いです。

## 引用

https://github.com/ThunLights/BackImage

https://marketplace.visualstudio.com/items?itemName=ROBOTofficial.backimage
【GPTプロンプト講座基礎編②】プロンプトの基本的な使い方

# プロンプトエンジニアリング基礎編②
※本記事は執筆にあたり生成AIツールを使用している箇所があります
※プロンプトの基礎部分は生成AIで作成し、具体例や体験談を自分の視点で補完しています

こんにちは。ゆずかきです。
前回は「プロンプトエンジニアリングの基礎」についてお話ししました。今回は、その続きとして、具体的なプロンプト例をいくつかご紹介していきます。

AIを使った作業の効率化や応用をイメージしやすくするため、さまざまな場面で使えるプロンプトをピックアップしました。ぜひ、参考にしてみてください。

※本連載について
GPTプロンプト講座シリーズとして定期掲載を考えています。
第1回～第5回は特に入門者向けの基礎を丁寧に解説する予定です！

　
# §プロンプトの基本構成

まず、効果的なプロンプトを作るために押さえておきたいポイントをおさらいしておきましょう。

- 明確な目的を設定する
- シンプルで具体的な言葉を使う
- 必要に応じて出力形式を指定する

これらを意識していれば、初心者の方でも十分に使いこなせます。
まずはシンプルな用途に使うところから、第一歩を踏み出しましょう！

　
# §文章作成のプロンプト例

AIを使えば、文章作成の手間を大幅に減らすことができます。以下はその例です。

- メールの作成
「上司への報告メールを、敬語を使って300字以内で作成してください。」
　
- プレゼン資料の要約
「この文章を300字程度に要約してください。」
　
- 記事のタイトル案作成
「この記事に合うキャッチーなタイトルを5つ考えてください。」
　
- 商品説明文の作成
「20代向けの女性におすすめのコスメ商品の紹介文を100字以内で作ってください。」
　

# §アイデア発想のプロンプト例

クリエイティブなアイデアを生み出すのも、AIの得意分野です。

- ブレインストーミング
「次のテーマで新しいアイデアを10個出してください：エコで便利な日用品」
　
- 新商品企画
「ペット向けのユニークな商品コンセプトを3つ考えてください。」
　
- キャッチフレーズ作成
「新しいスマートフォンの広告キャッチフレーズを作成してください。」

　
**最近の、特にGPT4o以降は、従来AIが苦手としていたクリエイティブ領域も大丈夫になってきている印象ですね。**
　

# §データ整理のプロンプト例

大量のデータを効率よく整理する場合にも、AIが役立ちます。

- タスク管理
「以下のタスクを優先順位ごとに並べ替えてください。」
　
- リスト化
「この文章から重要なポイントを箇条書きでまとめてください。」
　
- データの要約
「次の内容を100字以内で要約してください。」

　
**むしろ、人間が苦労するような大規模なデータの扱いこそ、AIに任せるべき分野です。**
　

# §教育や学習のプロンプト例

AIは学習のサポートにも活用できます。特に初心者向けの内容を簡単にまとめてくれる点が便利です。

- 知識の整理
「高校生向けに、地球温暖化の原因を分かりやすく説明してください。」
　
- 問題の作成
「中学生向けの数学の練習問題を5問作成してください。」
　
- テキストの解説
「この文章をさらに簡単にして、子どもにも分かるように書き直してください。」
　

# §プログラミングのプロンプト例

コードの作成や修正も、AIにお願いすることができます。

- コード生成
「Pythonで簡単なWebスクレイピングを行うコードを作成してください。」
　
- バグの修正
「次のコードのバグを見つけて修正してください。」
　
- 説明の追加
「このコードに初心者向けのコメントを追加してください。」

 　
**重要なのは、全てAIにやらせよう！とするのではなく、AIに部品を作ってもらって人間がそれを組み立てる、というようなマインドセットです。**
　

# §まとめ

今回は、具体的なプロンプトの例をさまざまな分野からご紹介しました。実際にプロンプトを試してみることで、AIの可能性がぐっと広がります。
　
**🔑 この記事のポイントまとめ**
**プロンプトの基本構成 → 明確な目的、シンプルかつ具体的な言葉、出力形式の指定を意識。**
**文章作成 → メール、記事タイトル、商品説明など日常の文章生成を効率化せよ。**
**アイデア発想 → ブレインストーミングや企画案の生成に活用せよ。**
**データ整理 → リスト化や要約など、データの効率的な処理にAIを使うこと。**
**教育やプログラミング支援 → 知識の整理やコード生成をAIと協力して行うこと。**
　
次回は、さらに応用的なプロンプトの使い方や、特定の目的に合わせたカスタマイズのコツについて解説していきます。どうぞお楽しみに！

ご訪問ありがとうございました！
Gitの便利な小技 アスタリスクでまとめてコミット

たとえば複数の階層のあるフォルダ以下にREADME.mdがあり、それを編集したとする。そうなると`git add`は

```
$ git add dir1/README.md dir2/README.md
```

になるが、アスタリスクを使うと以下のように簡単に行える。

```
$ git add */README.md
```

あとは`git commit`すれば(ﾟдﾟ)ｳﾏｰ。
Laravelのサービスコンテナとサービスプロバイダ

### はじめに
Laravelの重要な仕組みであるサービスコンテナとサービスプロバイダについて解説します。

Railsを経験している方がLaravelに取り組む際、DI（Dependency Injection）やサービスプロバイダの概念は少し新鮮に映るかもしれません。本記事では、サービスコンテナとサービスプロバイダを理解するための具体例を用意しました。Railsの経験を生かして学びを深めていきましょう。

### サービスコンテナとは？

サービスコンテナは、Laravelのコア部分を支える仕組みの一つで、依存関係を管理・解決するための強力なDIコンテナです。DIとは、オブジェクトの依存関係を外部から注入するデザインパターンを指します。

#### Railsとの比較

Railsでは、`ActiveSupport::Dependencies`を用いたオートローディングが一般的で、クラスやモジュールの依存解決が暗黙的に行われます。一方、Laravelでは明示的に依存を解決するため、コードの意図をより明確に表現できます。

#### 具体例

サービスコンテナを使って依存関係を解決する基本的な例を見てみましょう。

```php
namespace App\Services;

class GreetingService
{
    public function greet($name)
    {
        return "Hello, {$name}!";
    }
}
```

この`GreetingService`をコントローラで利用するには、サービスコンテナを活用して以下のように記述します。

```php
namespace App\Http\Controllers;

use App\Services\GreetingService;

class GreetingController extends Controller
{
    protected $greetingService;

    public function __construct(GreetingService $greetingService)
    {
        $this->greetingService = $greetingService;
    }

    public function greet($name)
    {
        return $this->greetingService->greet($name);
    }
}
```

この例では、コントローラのコンストラクタに`GreetingService`を依存として注入しています。Laravelのサービスコンテナが自動的にクラスのインスタンスを生成し、依存を解決します。

### サービスプロバイダとは？

サービスプロバイダは、Laravelのアプリケーションにおける全てのサービス（バインディングやイベントリスナーなど）を登録するための中心的な仕組みです。

#### Railsとの比較

Railsの`config/application.rb`や`initializer`ディレクトリに該当する部分が、Laravelではサービスプロバイダになります。ただし、Laravelではサービスごとにプロバイダを分けることで、よりモジュール化された構成が可能です。

#### 具体例

サービスプロバイダを作成して、`GreetingService`をサービスコンテナに登録してみましょう。

```php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\GreetingService;

class GreetingServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(GreetingService::class, function ($app) {
            return new GreetingService();
        });
    }

    public function boot()
    {
        // 必要に応じて、起動時の処理を記述できます
    }
}
```

作成したサービスプロバイダを登録するには、`config/app.php`の`providers`配列に追記します。

```php
'providers' => [
    // 他のプロバイダ
    App\Providers\GreetingServiceProvider::class,
];
```

これにより、`GreetingService`を明示的にサービスコンテナに登録し、Laravel全体で利用できるようになります。

### サービスコンテナとサービスプロバイダの連携

サービスプロバイダは、サービスコンテナにバインディングを登録するための仕組みです。Railsでは、ほとんどの依存関係が自動解決されるため、明示的な登録の手間が少ないですが、Laravelではサービスプロバイダを活用することで依存関係を柔軟かつ明示的に管理できます。

### まとめ

Laravelのサービスコンテナとサービスプロバイダは、依存関係の管理を効率化し、拡張性の高いコードを書くために重要な仕組みです。

Rails学習者にとって、最初は少し手間に感じるかもしれませんが、依存関係が増えるほどその恩恵を実感できるでしょう。この記事を参考に、ぜひLaravelでの開発を進めてみてください！
IT末経験者が水道工事を頼まれるまで

# 私の日常はヘルプデスクで回っている!?
私は齢45のIT技術者です。もうかれこれIT関連に浸かって27年が経とうとしています。だがIT技術よりも他の事で頼まれ事をされることが最近多くなりました。そんな日常を書いてみたいです。
ポエムです。

めんどうなのでアドベントカレンダーにも登録します。
まぁこの中だったら「楽しく技術を使う」かなぁ。

## XXさん、蛇口が取れちゃったんで直してくれませんか？
これマジに頼まれました。朝もはよから仕事していたらこう言われたのです。私は水道工事の資格なんて一切持っていません。しかも他のIT資格も持っていません。でも頼まれるのです。

## Copilotさん教えてちょうだい!!
ということでCopilotさんに聞いてみました。

「私はIT技術者ですがなぜかこの前水道工事を依頼されました。なぜですか？」

それは面白いですね！IT技術者であるあなたに水道工事を依頼された理由は、いくつか考えられます。

**信頼されている:** 以前のやり取りや仕事の成果から、あなたが信頼されているからかもしれません。信頼されていると、他の分野でも頼りにされることがよくあります。

**問題解決能力が高い:** IT技術者は問題解決能力が高いとみなされることが多いです。そのため、「どんな問題でも解決してくれる」という期待から依頼された可能性があります。

**人手不足:** 水道工事を頼む業者が見つからないなど、人手不足の状況で、頼りになる人に声をかけたのかもしれません。

**親しみやすさ:** 普段から親しみやすく、話しやすい印象を持たれているため、困ったときにまずあなたの顔が浮かんだのかもしれません。

それとも、ユーモアのセンスが評価されて、「この人なら楽しく対応してくれる」と思われたのかも？いずれにせよ、信頼されている証拠ですね！他にも面白いエピソードがあれば、ぜひ聞かせてください。😊✨

･･･だとさ。
まぁ、その時は「施設課呼んでね(はぁと」で事なきを得ました。

### 俺みたいになるな!!とは言わない。
別にしくじったわけでないので私はこのことをオススメしないわけでは無いです。何でも頼まれるのは良いしるしでもあると思います。ただし限度はあると思いますけどね!!いや、別に頼られることは嫌じゃないし水道工事を頼まれるなんて滅多にないことですよ。感謝感謝!!

あるときは「予算20万余ったからなんか良いNAS無いですか？」とダイレクトメッセージで聞いてきた人もいます。だからIT以外の事ではなくきちんとITの話を振ってくれる人もいます。

要は信頼と実績を積むしかないってことです。

以上、末経験者の戯れ言でした。
【備忘録】生成AIで使用するプロンプトを作ってみた。

## はじめに
初めての投稿(プログラミングを初めて３日)から約半年が立ちました。
フォント煮？

そんな私は、新卒の同期と２人で生成AIを利用したチケット起票システムの実装に取り組んでおりました。

**期限はなんとトータル２か月！！！**

この期間で出力精度を上げる方法isプロンプトのブラッシュアップしかない！！！

ということで思考錯誤した結果がこちらです。

## 前提条件
　**目的**
    チケットの自動起票
　**生成AIで行うこと**
    slackにあるスレッドの文章をコピペで入力
    チケットの該当欄のフォーマットに合わせて出力

これらに最適なプロンプトを生成すべく、我々はアマゾンの奥地へと向かった、、、

https://platform.openai.com/docs/guides/prompt-engineering
すると、圧倒的信頼度を誇るソースを発見。

今回はこの中にあった
**・明確な指示を書く
・参照テキストを提供する
・モデルに「考える」時間を与える
・変更を体系的にテストする**

これらの4項目を実践してみました。

今回はこの中で特に効果的であった２項目について書き残そうと思います。


## 1つ目
**明確な指示を書く**

当たり前みたいなことを忘れていました。生成AIは自発的には動きません。
普段私たちが文章をまとめるときに自然と行っている手順も、生成AIにとっては指示がなくては当たり前に実行できるものではないのです。
そこで、文章作成までの一連の流れを、私たちが作業を行うことのできる粒度まで分解してプロンプトに記載することで、生成AIの行う作業に手順を設けることを試みました。

今回は生成AIで行いたい入力から出力までの過程を明記しました。

    (修正前)
    入力を基に、フォーマットに従った出力を作成してください。
    
    (修正後)
    入力をチケットにふさわしい言葉に置き換えます。
    つぎにフォーマットの７項目に沿って入力内容を整理し、
    フォーマットに従った出力を作成してください。

この変更によって得られた変化が次の２つです。
　**・出力の体裁が保てるようになった！**
    スレッドの文章内にある過剰な敬語や砕けた表現が適切な表現に置き替えられることで、チケット起票後に語尾を修正する必要がなくなりました。
　**・内容の重複が減った！**
    入力内容を分類してから出力の作成を行うことで回答が論理的になり、出力された内容が正確に項目分けされるようになりました。
 
## 2つ目
**モデルに「考える」時間を与える**

生成AIは速やかな処理のため、文章の中にあるそれぞれの情報を逐次処理して回答を生成しています。
しかしながら、スレットの文章をすべて入力するという今回の条件では結論を文章の最後まで断定することができません。
そこで、生成AIに私たちが文章を読んでまとめる作業に伴うものと同様の「思考の連鎖」を要求することで、出力の精度を上げることを試みました。

今回はプロンプトの内部に、「必ず入力内容の結末を確認してから、出力の作成を行ってください。」という指示を追加しました。

この追加によって得られた変化が次の2つです。
　**・出力内容に一貫性が保てた！**
     「成功したと思ったら失敗していた」「間違えた対処をしていた」等の内容が入力に含まれていた場合でも、先に入力された情報に惑わされることなく出力が行われたことにより、内容の一貫性を担保できるようになりました。
　**・出力の量が少し増えた！**
     すべての入力が揃った状態で処理されることによって文脈情報や各情報との関連付けが可能になり、全体像を加味した出力が行われた結果、出力の量が微増しました。

## さいごに
以上、どんなプロンプトにも入れることができそうな２つの項目を紹介しました。

**・入力から出力までの過程を明記してみる
・「必ず入力内容の結末を確認してから、出力の作成を行ってください。」という指示を追加してみる**

皆様のプロンプトのスパイスに。ぜひおためしあれ。
Google formのアンケートがspreadsheetでずれる対策

Google Formは手軽にアンケートを作れてとても便利です
それをSpreadsheetに出力すると、集計も出来てとても便利！

# SpreadSheetでデータがずれること

こんなアンケートを作って…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/bd63d4f1-bee4-9d37-d428-032b64eedc0e.png)

こんなふうにデータが集計されて…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/4dc2c936-120c-98fa-6dd7-946d88d50e66.png)

色々するために別シートにデータをコピーして…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/79f85f58-9928-d2b0-29e0-ffe86820fe09.png)

2件ほどアンケートが増えたら…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/2ad4c162-366c-cf87-7efc-2afecd1c940f.png)

…あれ？なにか変だぞ？
ここは、='フォームの回答１':B5 でないとおかしいはず…
なぜこんな事になってるんだ…？

# 理由

このフォームでは、データが挿入の形で追加されます
なので、アンケートが増えてもその下の空欄のセルを参照するように調整され、
アンケートが増えたらそのデータをコピーというのはこの方法では出来ません

# 対策

今回はindex関数を使う方法を書きます

２行目でB2を参照する場合は「=index(B:B, row(), 1)」とします
なお、冒頭では、B1のセルでフォームの回答:B2を参照しているため、index(B:B, row()+1, 1))と
行の値を調整する必要があります

sum(B2:D2)のような関数は、「=index(B:D, row(), 0)」と0を入れることで範囲が指定できます
[小ネタ] 簡単なアルゴリズムを使ってレクリエーションのチーム分けを解決した話

# 事の経緯

これはとあるレクリエーションを企画していたときの話なのですが、「１回目のゲームと２回目のゲームのチーム分けで同じチームになる人が出ないようにしてほしい。」という要望がありました。どうしたものかと思ったのですが以下のコードで簡単に解決できました
# コード
今回は26チームに6人ずつという程で記載しています
```python
#A-Zまでの配列
team = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T','U','V','W','X','Y','Z']

#チームメンバー数
NUM_OF_MEMBER=6

for i in range(len(team)):
    for j in range(NUM_OF_MEMBER):
        print(team[i], end='->')
        # 剰余で配列のインデックスが漏れないようにする
        print(team[(i+j)%len(team)])
```

# 出力結果
```
A->A
A->B
A->C
A->D
A->E
A->F

B->B
B->C
B->D
B->E
B->F
B->G

C->C
C->D
C->E
C->F
C->G
C->H
```

# 解説
基準となるチームに`+0~5`することでチームをばらけさせることができます。
`i+j`が26を超えてしまった場合でも剰余を使う事でインデックスが漏れるのを防ぐことができます。

# おわりに
アルゴリズム、、、と呼ぶにはちょっと陳腐なものですが、プログラミングで解決できる課題は意外と日常に溢れているんだなと思いました。