OmniAICreator/Qiita-1.07M huggingface dataset:
Ansible Tips: データ構造変換にはjinja2 for loopが使いやすい

備忘


# 概要
以前の以下の記事の更新。

https://qiita.com/hiroyuki_onodera/items/8588c44c9886aa67cb96
Ansible Tips: データ構造変換にはjinja2 for loopとfrom_yamlフィルターの組み合わせが使いやすい

上ではfrom_yamlフィルターを使った2段階変換を行っていたが、YAMLを経由しないで直接変換する例を示す。

## 元のロジックの例 (YAML経由変換)

元の、一旦YAMLデータを作成し、構造化データに変換する例

```
  - debug:
      msg: "{{ target }}"
    vars:
      source_data:
      - - hoge1
        - - foo: FOO1
            bar: BAR1
          - foo: FOO2
            bar: BAR2
      - - hoge2
        - - foo: FOO3
            bar: BAR3
          - foo: FOO4
            bar: BAR4
            
      target_yml: |
        {% for i0 in source_data %}
        {{ i0[0] }}:
        {% for i1 in i0[1] %}
        - {{ (i1['foo'] + '/' + i1['bar']) | to_json(ensure_ascii=false, sort_keys=false) }}
        {% endfor %}
        {% endfor %}
        
      target: "{{ target_yml | from_yaml }}"

```
この例では、一旦YAMLデータのtarget_yamlを作成し、その後from_yamlで構造化データとして読み込み直しの2段階データ変換。
YAMLのブロックスタイルなども利用可能なので結構ユニークな使い方ができるが、反面、to_jsonにてデフォルトではキーが勝手にソートされるなど、それなりに癖がある。この例ではソートはされないが。


## 直接変換の例 (YAMLを経由しない)
以下のように書けばYAMLを経由せず、1段階で変換可能

```
  - debug:
      msg: "{{ target2 }}"
    vars:
      source_data:
      - - hoge1
        - - foo: FOO1
            bar: BAR1
          - foo: FOO2
            bar: BAR2
      - - hoge2
        - - foo: FOO3
            bar: BAR3
          - foo: FOO4
            bar: BAR4

      target2: |
        {% set ns = namespace(output={}, lst=[]) %}
        {% for i0 in source_data %}
          {%- set ns.lst = [] -%}
          {% for i1 in i0[1] %}
            {%- set ns.lst = ns.lst + [i1['foo'] + '/' + i1['bar']] -%}
          {% endfor %}
          {%- set ns.output = ns.output | combine({i0[0]: ns.lst}) -%}
        {% endfor %}
        {{ ns.output }}
```

## 考慮点
- for loop内で更新した変数の値をloop外に持ち出すことで対応。jinja2におけるloop外への値の持ち出しはいくつか方法があるが、ここでは判り易いと思えるnamespaceを利用。
- 変換箇所が不必要な改行やスペースなどを生み出さないように、適宜{%- -%}などで前後の改行空白を削除する。for loop内のそれぞれのsetの箇所において{%- -%}とすれば十分な様子。
- データの追加はlistなら+などが、dictならcombineなどが利用可能。
- 最後に変換後の値を{{ }}にて変数に設定。


# namespace参考
https://jinja.palletsprojects.com/en/3.1.x/templates/#jinja-globals.namespace
https://qiita.com/masa2223/items/129012d5539a8724556d
https://qiita.com/waro_a2606/items/ae92dc26841a302ca95e
Snowflakeでのストアドプロシージャ作成と定期実行タスクの設定方法

## はじめに

Snowflakeでは、ストアドプロシージャを使ってデータ操作を自動化し、タスク機能を使ってその処理を定期的に実行することが可能です。本記事では、ストアドプロシージャでデータ変換処理を行い、例として毎日朝9時にその処理を自動的に実行するタスクの設定方法を紹介します。

## 1. ストアドプロシージャの作成手順

まず、ストアドプロシージャを作成して、必要なデータ操作を自動化します。この例では、`MY_SCHEMA.MY_TABLE` というテーブルに対してカラムを変換する処理を行います。

### ストアドプロシージャの作成

次のSQLコードで、`MY_SCHEMA.MY_TABLE` にストアドプロシージャを作成します。このストアドプロシージャは、`number_column` という`NUMBER`型のカラムを`DATE`型に変換して、新しいカラムにデータを移行し、元のカラムを削除します。

```sql
CREATE OR REPLACE PROCEDURE MY_SCHEMA.update_column()
RETURNS STRING
LANGUAGE SQL
AS
$$
BEGIN
   -- 新しいDATE型のカラムを追加
   ALTER TABLE MY_SCHEMA.MY_TABLE ADD new_date_column DATE;

   -- 元のNUMBER型のカラムからDATE型に変換して新しいカラムにデータを移行
   UPDATE MY_SCHEMA.MY_TABLE
   SET new_date_column = TO_DATE(TO_CHAR(number_column), 'YYYYMM');

   -- 元のnumber_columnを削除
   ALTER TABLE MY_SCHEMA.MY_TABLE DROP COLUMN number_column;

   -- 新しいDATE型のカラムの名前をnumber_columnに変更
   ALTER TABLE MY_SCHEMA.MY_TABLE RENAME COLUMN new_date_column TO number_column;
   
   -- 処理が成功した場合のメッセージを返す
   RETURN 'Procedure executed successfully.';
END;
$$;
```

### ストアドプロシージャの実行

作成したストアドプロシージャは以下のコマンドで実行できます。

```sql
CALL MY_SCHEMA.update_column();
```

これにより、`MY_TABLE` のカラム変換処理が実行されます。
![スクリーンショット 2024-10-22 12.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/79b59ae5-6caa-c5a1-62cf-879edf268e79.png)


## 2. タスクの作成とスケジュール設定

次に、このストアドプロシージャを定期的に実行するために、Snowflakeのタスク機能を使用して毎日朝9時に自動的に実行するよう設定します。

### タスクの作成

タスクを作成して、毎日朝9時にストアドプロシージャを実行します。日本標準時 (JST) の朝9時に実行するために、UTCの0時に相当するスケジュールを設定します。

```sql
CREATE OR REPLACE TASK MY_SCHEMA.update_column_task
  WAREHOUSE = my_warehouse  -- 実行に使用するウェアハウスを指定
  SCHEDULE = 'USING CRON 0 0 * * * UTC'  -- 毎日UTC 0時に実行（JSTの朝9時に相当）
  COMMENT = '毎日朝9時にupdate_columnを実行'
AS
  CALL MY_SCHEMA.update_column();
```

### タスクの有効化

タスクを有効化して、指定したスケジュールに従って実行されるようにします。

```sql
ALTER TASK MY_SCHEMA.update_column_task RESUME;
```

## 3. タスクの確認と管理

作成したタスクが正しく設定されているかどうかは、以下のコマンドで確認できます。

```sql
SHOW TASKS LIKE 'update_column_task';
```

必要に応じて、タスクの一時停止や再開も可能です。

- タスクを一時停止する場合:
  ```sql
  ALTER TASK MY_SCHEMA.update_column_task SUSPEND;
  ```
  
- タスクを再開する場合:
  ```sql
  ALTER TASK MY_SCHEMA.update_column_task RESUME;
  ```
設定後GUIからもデータセット配下のタスクとストアドプロシージャを管理できます。
![スクリーンショット 2024-10-22 11.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/bbd9827f-96a5-13a1-698f-c77431729205.png)


## まとめ

この記事では、Snowflakeでストアドプロシージャを作成し、それを毎日朝9時に定期的に実行するタスクを設定する方法を紹介しました。ストアドプロシージャとタスクを組み合わせることで、複雑なデータ操作を自動化し、効率的なメンテナンスやデータ処理を実現することができます。
Tips #003 Patch関数で指定するDate型は.Textじゃなかった話

https://qiita.com/Novskiiiiiiiiii/items/de8c519cb019f999736f

Patch関数でリストにアイテムを追加しようとしたらエラーになった。

    Patch(test_concur_request, Defaults(test_concur_request),
        {
            タイトル:DataCardValue1.Text,
            keijo_date:DataCardValue2
        })

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/d2ebfb9d-36bc-5abf-66f2-38e20c0308d7.png)

Copilotに聞いたら、日付フィールドの場合は「.SelectedDate」らしい。
テキスト型の場合は「.Text」だった。

正しくはこう。

    Patch(test_concur_request, Defaults(test_concur_request),
        {
            タイトル:DataCardValue1.Text,
            keijo_date:DataCardValue2.SelectedDate
        })

※見た目わかりやするために改行しているだけなので、改行しなくても大丈夫。
　もちろん、改行してもよい。
 　実務では複数項目をPatchする事になるだろうから、インデントしておいた方が可読性は向上する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/ff811f98-39fc-ab96-64c5-a1cffa5c257f.png)

以上

https://qiita.com/Novskiiiiiiiiii/items/f4c45b0b20d0f1bb71e6
Vue 3のライフサイクルとVue 2の比較

# Vue 3 のライフサイクル

1. **setup()**: 
   - コンポーネントの作成を開始し、`beforeCreate` と `created` の前に実行され、`data` と `method` を作成します。

2. **onBeforeMount()**: 
   - コンポーネントがノードにマウントされる前に実行される関数です。

3. **onMounted()**: 
   - コンポーネントがマウントされた後に実行される関数です。

4. **onBeforeUpdate()**: 
   - コンポーネントが更新される前に実行される関数です。

5. **onUpdated()**: 
   - コンポーネントが更新された後に実行される関数です。

6. **onBeforeUnmount()**: 
   - コンポーネントがアンマウントされる前に実行される関数です。

7. **onUnmounted()**: 
   - コンポーネントがアンマウントされた後に実行される関数です。

8. **onActivated()**: 
   - `<keep-alive>` に含まれるコンポーネントには、2つのライフサイクルフックが追加され、アクティブ化されたときに実行されます。

9. **onDeactivated()**: 
   - A コンポーネントから B コンポーネントに切り替えた場合、A コンポーネントが消えるときに実行されます。

10. **onErrorCaptured()**: 
    - 子孫コンポーネントからの例外をキャッチしたときにアクティブ化されるフック関数です。

---

# Vue 2.x と Vue 3.x の比較

| Vue 2           | Vue 3                       |
| --------------- | --------------------------- |
| `beforeCreate`  | `setup(() => {})`           |
| `created`       | `setup(() => {})`           |
| `beforeMount`   | `onBeforeMount(() => {})`   |
| `mounted`       | `onMounted(() => {})`       |
| `beforeUpdate`  | `onBeforeUpdate(() => {})`  |
| `updated`       | `onUpdated(() => {})`       |
| `beforeDestroy` | `onBeforeUnmount(() => {})` |
| `destroyed`     | `onUnmounted(() => {})`     |
| `activated`     | `onActivated(() => {})`     |
| `deactivated`   | `onDeactivated(() => {})`   |
| `errorCaptured` | `onErrorCaptured(() => {})` |

---

### まとめ

Vue 2 と Vue 3 のフックの変更はあまり大きくなく、`beforeCreate` と `created` の2つのフックが `setup()` フックに置き換えられています。
Tips #002 DataCardValue1だけじゃダメだった話

https://qiita.com/Novskiiiiiiiiii/items/7c25df98be0d14a01435　

Patch関数でフォームからリストに新規アイテムを追加しようとしたらエラーになった。

    Patch(test_concur_request, Defaults(test_concur_request), {タイトル:DataCardValue1})

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c52a0846-7cea-4827-4680-d2cb3c27dc7c.png)

問題の切り分けのためにテキストベタ打ちで登録出来るか検証

    Patch(test_concur_request, Defaults(test_concur_request), {タイトル:"test"})

これは正常にリストに反映されていた、

じゃあ「DataCardValue1」がダメっぽい。

opilotに聞いてみたらこう返ってきた。

    Patch(MyDataSource, Defaults(MyDataSource), {FieldName: DataCardValue1.Text})

なるほど、「.Text」が末尾に足りてなかったのね。
おれぁてっきり「Value」って入ってるからそのままでいいかと…。

という事で

    Patch(test_concur_request, Defaults(test_concur_request), {タイトル:DataCardValue1.Text})

に直したら問題なくリストに追加された。めでたしめでたし。
　
　

https://qiita.com/Novskiiiiiiiiii/items/3265450763614154d284
【LT発表】Ruby 技術者認定試験 Gold に合格してみて

## 自己紹介
翼 /  Tsubasa

- 2019年 新卒で営業会社に入社 
- 2020年 9月 にエンジニアに転職
- 2023年 2月から Qiita にジョイン！
- 2024年 7月に 名古屋から東京に転勤!
- Ruby on Rails, React, TypeScript, GraphQL を業務で使いながら開発してます！
- 初めてのLTです！ よろしくお願いします！

---

## Ruby 技術者認定試験とは
>Ruby技術者認定試験制度は、Rubyベースのシステムを設計、開発、運用するエンジニア、Rubyでシステム提案を行うコンサルタント、Rubyを教える講師及びRubyを学ぶ学生などを対象とした認定試験制度です。

>認定者は、Ruby技術者としての技術力を公正に評価され、高い水準のRubyによるシステム開発能力を持つことを認定されます。

ref: https://www.ruby.or.jp/ja/certification/examination/

試験はSilverとGoldがあり、今回はGoldの話をしようと思います!


---

### 概要

|項目|内容|
|---|---|
|試験時間|90 分|
|試験方法|CBT 形式|
|問題数|50 問|
|合格ライン|75%|
|料金|16,500(学割で 8250 円)|

Gold の認定条件は Silver と Gold の両方に合格することとなっています。
(因みに勉強時間は Silver 3週間、 Gold 3週間くらい)

https://www.ruby.or.jp/ja/certification/examination/ より


---
## Goldの内容は?
Silverで求められる範囲（文法、オブジェクト指向、組み込みライブラリ、実行環境など）を更に掘り 下げた知識に標準添付ライブラリ知識やアプリケーション設計に必要となるクラスやオブジェクトに関する知識を追加し、Rubyによるプログラム設計技術を持つことを認定します。


https://www.ruby.or.jp/ja/certification/examination/ より

---

# 問題 

---
```rb
class Class
  def method_missing(id, *args)
    puts "Class#method_missing"
  end
end
class A
  def method_missing(id, *args)
    puts "A#method_missing"
  end
end
class B < A
  def method_missing(id, *args)
    puts "B#method_missing"
  end
end

B.dummy_method
```

何が出力されるでしょうか

1.エラーになる
2.A#method_missing
3.Class#method_missing
4.B#method_missing

理由も一緒にどうぞ!

---

# 答え


---
正解は...

- 3のClass#method_missing 

### 解説
- **method_missing** は呼び出されたメソッドが定義されていなかった時、
最終的に呼び出されるメソッドになります。
- 今回、 4 の B#method_missing でないのは B.dummy_method が呼び出されたときに
B クラスのクラスメソッドとして dummy_method が定義されていないためです(インスタンスメソッドとして定義されている)。

--- 
# 問題
```rb
module M
  def foo
    super
    puts "M#foo"
  end
end

class C2
  def foo
    puts "C2#foo"
  end
end

class C < C2
  def foo
    super
    puts "C#foo"
  end
  prepend M
end

C.new.foo
```

1.C2#foo
C#foo
M#foo

2.C2#foo
M#foo
C#foo

3.M#foo
C2#foo
C#foo

4.エラーになる

理由も一緒にどうぞ!


---
# 答え

---
正解は.. 1の
C2#foo
C#foo
M#foo
でした！

### 解説 
prepend は include と同様にモジュールのメソッドを クラスに取り込むためのメソッドです。
prepend の特性として、 呼び出したクラスよりも先に呼び出すため、
今回のような出力順になります。

---
<!-- 
## 実務でどういう場面で役に立った
- 複雑なコードの理解
    - 継承やモジュールを含むコードを理解しやすくなった
- コードレビュー
    - 他人のコードを理解しやすくなり、メソッドのaliasや語彙が増えた
- 人に教える時
    - 実装の挙動を説明しやすくなり、適切なメソッドを勧めるアドバイスができた

---
-->


## 取得してよかったこと
**主に以下の4つ**

- いちいちググることがなくなる
- Rubyを本質的/直感的に理解できる
- オブジェクト思考に関する理解が深まった
- 学習の習慣が染み付く

---
## いちいちググることがなくなる
業務のスピードが上がることが一番大きいです！

- 🤔 この配列を昇順にするのに何使えば良いんだっけ?
- 💡 `Array#sort`メソッドを使う
    - ruby 配列　並び替え で検索するとかがなくなった
    - 積み重ねで業務時間短縮

---
## Rubyを本質的/直感的に理解できる
- 🤔 なぜ、 `String`より `Symbol`の方が処理ってなんで早いんだ? 
- 💡 `Symbol` は`String`よりもメモリ効率が良く、処理が早い
- なぜ?
    - `Symbol` はイミュータブルで、メモリ上に一度しか存在しない
    - `String`はミュータブルで、同じ文字列が生成されるたびに新しいインスタンスが作成され、メモリを多く消費する




---

## オブジェクト思考に関する理解が深まった
- インスタンスメソッド、特異メソッド
    - Railsのモデル開発時 に特に 役立った
- include、extend、prependの違い探索経路
    - テストにあった問題など


---

## 学習の習慣が染み付く
試験形式で締め切りがあることによって

- 勉強する環境
- 勉強を継続する仕組み作り

が作れる




---


# 結論

---

####  夏休みの宿題は最後にやるタイプの人は、資格駆動の勉強はオススメだぞ！
python クラスについてイメージしてみた

## 問題
pythonのクラスが難しい。自分のためにまとめてみることにした。

:::note warn
あらかじめ記載しておきますが、初学者視点で自分の頭で理解できるようにまとめたものです。認識の違いや、理解の甘さ等、多々あると思いますが、あくまで自分のイメージの話です。しっくり来たのでまとめさせてもらいました。ご了承ください。


:::

##  よく言われる設計書
クラスの説明があるとき、必ずといっていいほど言われることが<font color="MediumVioletRed">「クラスは設計書、インスタンスが製品」</font>。
言っていることはなんとなくわかるが、いまいちしっくりこない。
### 言い換えてみた
そもそも製品をつくるため（返り値をもらうため）にクラスを設定している。そして、「クラスは工場。インスタンスは部品セット」と考えることにした
### イメージ
工場（クラス）➝この変数を与えたら、この部署（メソッド）を使ってこのような結果を返します。
部品セット（インスタンス）➝工場（クラス）に値を与えれば、製品ができあがる。
【下図①〜⑤のイメージ】

![スクリーンショット 2024-10-22 11.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893783/d739fa96-e131-3d21-cfdf-ab891cc2a5c1.png)



このようにイメージすると理解が進んだ。

## 理解を深める
上図と合わせて読み進めてもらいたい。例題をもとに説明を行っていく。
### 例題
```python
class Dog:
    def __init__(self, name):
        self.name = name 
    
    def parts(self):
        print(f'my name is {self.name}')
        
dog1 = Dog(name='ポチ')

dog1.parts()

#結果
#my name is ポチ
```

### インスタンス（部品セット）
どの説明をみても大抵はクラスから説明が入るが、自分なりにインスタンスから説明したほうが理解しやすいと感じたため、インスタンスから説明する。
まず、クラス（工場）を確認する。
そうすると以下のように記述してある。
```python
class Dog:
    def __init__(self, name):
        self.name = name 
```
「selfのほかに「name」が定義されているな。つまり「name」という値がほしいんだな。」と認識する。※そういうもんだ、と憶える。selfについては後述。

では、nameを与えてあげよう。ということになるのでインスタンス（部品セット）を作成する。

```python
#インスタンス名 = クラス名(欲しがっている変数 = 値)

dog1 = Dog(name='ポチ')
```
これでdog1というインスタンス（部品セット）が出来上がった。
部品セット（インスタンス）を使って、製品を作りた（返り値がほし）かったら、
```python
#インスタンス名.使いたいメソッド()
dog1.parts()

#結果
#my name is ポチ
```
により、クラス（工場）に与えたインスタンス（部品セット）で画面に出力される（製品ができあがる）


### クラス（工場）
以下のように定義する
```python
class クラス名
    def __init__(self, name):
        self.name = name 
```
このとき、クラス（工場）には以下の特別なルールがある。
① `__init__`　を作成する
②メソッドの第一引数にはselfを記述する

順番に見ていく


#### ①` def __init__`を作成する
def __init__とは、初期化する部署。ここに書かれたことはインスタンスごとに設定されることになる。※「さまざまなデータ入り乱れたら嫌だよね。だから、与えられたら初期化しよう」ということ
つまり、今回の例で行くと

```python
class Dog:
    def __init__(self, name):
        self.name = name 

dog1 = Dog(name='ポチ')
```
dog1というインスタンス（部品セット）があって、Dogというクラスにname=ポチという部品が与えている。ポチという値が、まずは__init__メソッド（初期化部署）にて定義されている。

#### ②メソッドの第一引数にはselfを記述する
クラス（工場）にインスタンス（部品セット）が送られてくる。この場合はname='ポチ'が送られてくる。自動的に__init__メソッド（初期化部署）にて定義される。そして、__init__メソッドから、各メソッド（部署）に部品を回して、製品を作っていくわけである。しかし、場合によっては、数十個ものインスタンス（部品セット）が送られてくるため、どの部品がどのインスタンス（部品セット）だったかわからなくなってくる。それを回避するためにselfという引数が、重要になってくる。簡単に言うと倉庫みたいなものだ。selfには、どのインスタンス（部品セット）だったかを保存する機能がある。今回で言えばdog1というインスタンス（部品セット）が保存される。つまり、以下のような形となる。※数字の通り順番に読んでください。
```python
class Dog: #②dog1というインスタンスが来た。まずは、__init__で初期化しよう。
    def __init__(self, name): #③__init__初期化部署を使ってself（倉庫）に、dog1を保存する。
        self.name = name #④dog1のnameには、与えてくれたname の値（ポチ）が入っているって各部署に伝える
    def parts(self): #④partsという部署にself（dog1）の情報を与えよう。
        print(f'my name is {self.name}') #⑤self(dog1)のnameの値（ポチ）を使おう

dog1 = Dog(name='ポチ') #①dog1というインスタンス(部品セット)には、name='ポチ'という部品が入っていて、それをDogというクラス（工場）に与えているよ

```

::: note info
※別にselfという名前でなくても良い、testでもaでも何でも良いが、pythonの慣習的にselfが一般的となる
:::

## 学んだこと
・クラスには`__init__`と`self`が必要。
・__init__には、インスタンスより与えられたデータを初期化する機能がある。
・selfには、インスタンスより与えられたデータを保存する機能がある。selfを使用して、ほかのメソッドに活用する機能が備わっていうる。
・クラスを活用する流れは、「クラスの定義 ➝ インスタンスの作成 ➝ メソッドの実行」。
・クラスの継承はまた今度。

初学者の参考になれば幸いです
Tips #001 フォームを新規登録モードにする方法

リストからフォームのカスタマイズでフォームを作成したものの、
「新規登録する場合ってどうするんだ？」と思ったのでメモ

    DataSource:リストの名前
これを消すのはダメらしい。

    DefaultMode:FormMode.New
Edit, View, Newから選択する。初期値はEdit。

    Item:Default(リストの名前）
フォームの内容をリストに追加するのにSubmitFormでなくPatchで登録する前提なら、
ここはブランクでも大丈夫っぽいが、無難にこうしておいた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/70204f7e-245e-19d3-79d8-f02146386166.png)

今回は以上！

https://qiita.com/Novskiiiiiiiiii/items/de8c519cb019f999736f
Laravel11から削除されたapi.php

# 削除された理由（翻訳）
api.phpおよびchannels.phpのルートファイルは、デフォルトでは存在しなくなりました。これは、多くのアプリケーションでこれらのファイルが必要ないためです。その代わり、これらのファイルはシンプルなArtisanコマンドを使用して作成できます。


## api.phpを追加する方法
以下のコマンドで`api.php`を追加することができます
```
php artisan install:api
```
インストール時に認証(ログイン機能）に関するマイグレーションファイルが自動生成され、インストールログの最後にマイグレーション実行の有無（Yes/No)を聞かれますが、作成したテーブルは後から削除するなど対応は各々の判断になります

![スクリーンショット 2024-10-22 11.17.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/2b29b53a-e1e5-165a-2ab0-71fccb0003e3.png)

## 参考サイト（Laravel11 リリースノート）

https://laravel.com/docs/11.x/releases#opt-in-routing

![スクリーンショット 2024-10-22 10.49.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/6e6671a5-76c4-d212-f73e-09fdca603db6.png)
phpstorm で github copilot を使おうぜ

# 追記

原因は css に scoped がついていないから、
本番環境だとなぜかcssがおかしくなっていた。

しか、vueファイルは10個以上あったので、原因を
chatgptに聞いても意味不明な回答。

そりゃ全て読み込ませてないからね。

そこで、github copilot chat に聞いたら教えてくれた。



# github copilot plugin？

おおっ！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">JetBrains IDE + GitHub Copilot Plugin の組み合わせ最強すぎてもう前の環境に二度と戻れない<br>人間は怠惰</p>&mdash; 日銀は利上げするな (@mpyw) <a href="https://twitter.com/mpyw/status/1848515335043047449?ref_src=twsrc%5Etfw">October 22, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そんなに便利なのか
AI系のプラグインは色々あるけど、すべて有料にされるの敬遠していた

# 導入してみる

ちなみに、年間100ドルかかります。
1ヶ月の無料期間もありますがね。

https://zenn.dev/ichii731/articles/8ec3114381c6f6


# 利用方法

```php
tabキーもしくは
ctrl + alt + 右
で全部の行を受け入れ

ctrl + 右
で1単語ずつ受け入れ
```

# すべてを保管してくれる

```php
//1を繰り返し10回表示
```

と書くと

```php
$res = str_repeat("1", 10);
```

と自動で保管。TABキーを押すことで確定。
続けて

```php
pd($res);
```

も自動補完。
ちなみに、`pd($res)`はprの自分で設定した関数。
これまで使ってくれる。

自分はgithubにコードをアップしていないが使える。
素晴らしいですね。

まだテスト段階ではありますけど、
いいと思います。

# 複雑なの

```php
//ユーザーの情報を新しい順に10件だけ取得
```

と書くと

```php
$res = User::query()
    ->orderBy('id', 'desc')
    ->take(10)
    ->get();
```

を自動補完。
iPhoneのChromeでフォーム送信がうまくいかない場合の解決方法

## iPhoneのChromeでフォーム送信がうまくいかない場合の解決方法

iPhoneのChromeで、フォーム送信時に正しい画面遷移が行われない問題に対して、主な原因としてキャッシュの影響やJavaScriptの処理タイミングの問題が考えられます。この記事では、その具体的な解決方法を2つの観点から紹介します。

### 1. キャッシュの無効化

iPhoneのブラウザは、ページやフォームのキャッシュを保存してしまい、予期せぬ動作を引き起こすことがあります。特に、フォーム送信後にキャッシュされた内容が原因で、正しい画面遷移が行われないことがあります。これを防ぐために、以下の対策を行うことが推奨されます。

#### HTTPヘッダーでのキャッシュ制御
サーバー側でHTTPヘッダーを設定することで、ブラウザにキャッシュを使わないよう指示できます。以下のヘッダーを設定しましょう。

- `Cache-Control: no-store, no-cache, must-revalidate, max-age=0`
- `Pragma: no-cache`
- `Expires: 0`

これにより、ブラウザは常に新しいデータをサーバーから取得するようになり、キャッシュによる影響を防ぎます。

#### フォームの `autocomplete="off"` の設定
フォームに `autocomplete="off"` を設定することで、ブラウザが以前に入力したデータをキャッシュしないように制御できます。これにより、フォーム送信後にキャッシュされたデータが再度送信されることを防げます。

### 2. JavaScriptの処理タイミングの見直し

JavaScriptでフォーム送信や画面遷移を制御している場合、処理のタイミングが適切でないとiPhoneのChromeで不具合が発生することがあります。複数のOrderに基づく画面遷移を正しく処理するため、以下の点を確認しましょう。


#### `setTimeout`や`setInterval`の使用の見直し
JavaScriptの非同期処理に依存している場合、イベントの発火タイミングが遅れることがあります。`setTimeout`や`setInterval`を使用している場合は、タイミングを再確認し、必要に応じて処理を調整してください。

#### フォーム送信の改善
`document.forms[0].submit()` のようなフォーム送信方法は、iPhoneのChromeでは正しく動作しないことがあります。送信方法の変更や見直しが必要です。

---

### まとめ

iPhoneのChromeでフォーム送信が正しく動作しない場合、主に **キャッシュの影響** と **JavaScriptの処理タイミング** に注意する必要があります。


- **参考記事**: [MDN Web Docs - autocomplete属性の使用法](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete)
- **参考記事**: [キャッシュされたくない場合のHTTPヘッダのベストプラクティス ](https://turningp.jp/network_and_security/http_header-cache#google_vignette)
- **参考記事**: [Ben Nadel - Preventing Form Caching With JavaScript](https://www.bennadel.com/blog/1584-preventing-form-caching-with-javascript-and-jquery.htm)

参考記事
https://forums.developer.apple.com/forums/thread/694565
https://stackoverflow.com/questions/45868263/on-iphones-form-submit-javascript-does-not-work-again-when-clicking-back-to-th
ChatGPTを使ったPR作成自動化の実践

## 背景

今回は、私が最近取り組んでいるChatGPTを活用したPR作成の自動化について、Qiitaで共有したいと思います。GitHubやGitLabでのPull Request（PR）作成は、日々の開発フローの中でも非常に重要なタスクですが、レビュアーにわかりやすいように、Issueに紐づけて、変更内容を丁寧にまとめ、マークダウン形式で書くとなると意外に労力がかかります。特に、複数のPRを一日に何度も作成する場合、繰り返しの作業がストレスになることもあります。

そこで、AIを活用してこの作業を効率化できないかと考え、「ChatGPT」を使ってPRの作成を自動化する方法を実装しました。この記事では、その過程と効果について紹介します。

## 自動化の流れ

今回の自動化プロセスは、次のような流れで進行します。


1. **Issueをコピペ**: ChatGPTに、対象となるIssueの内容をコピペして入力します。
2. **PRの概要を生成**: ChatGPTが、コピペしたIssueの内容に基づいて該当IssueやPRの概要を自動生成します。
3. **変更内容の生成**: before, afterでコードの差分をコピペすると、ChatGPTがその差分を判断して変更内容を生成します。
4. **PRの生成**: ChatGPTが事前に指定したテンプレートに沿って、変更内容を含んだPRをMarkdown形式で整形し、コードブロックとして出力します。その出力結果をコピペするだけで、PRの作成が完了します。

## 実装手順

### 1. テンプレートの準備

まず、PRのテンプレートを用意します。このテンプレートには、Issue番号、目的、変更内容などのセクションを用意しておきます。たとえば、次のようなテンプレートを使います。

```
## Issue

- #{issue_number}

## 目的

{issueの目的を簡潔に記載}

## 変更内容

- {変更内容1}
- {変更内容2}

## その他

{その他必要な情報}
```

### 2. ChatGPTへのプロンプト

次に、ChatGPTへのプロンプトを作成します。以下は、具体的なプロンプト例です。

```
次のテンプレートに従って、Pull Requestを生成してください。
その際、コードブロックの中にマークダウン形式で記述してください。

    ## Issue
    - #{issue_number}

    ## 目的
    {issueの目的を簡潔に記載}

    ## 変更内容
    - {変更内容1}
    - {変更内容2}

    ## その他
    {その他必要な情報}
```

### 3. ChatGPTからのPR生成

上記のプロンプトと具体的なIssueの内容や変更点を入力するだけで、PRの内容が自動的に生成され、整形されたマークダウン形式で出力されます。

### 4. 出力例

例えば、以下のようなPRが生成されます。(PR例)

```markdown
## Issue
- #1234

## 目的
このPRでは、ユーザープロファイル情報を取得するAPIエンドポイントに`lastLogin`フィールドを追加し、ユーザーが最後にログインした日時をレスポンスに含める機能を実装しました。

## 変更内容
- `GET /api/v1/users/:id`のレスポンスに`lastLogin`フィールドを追加
- ユーザーモデルに`lastLogin`プロパティを追加し、ログイン時にこのフィールドが更新されるように修正
- フロントエンドでユーザープロファイル画面に`lastLogin`を表示するための対応も行いました

## その他
この変更に伴い、データベースクエリに一部修正を加えていますが、パフォーマンスに大きな影響はないと考えています。負荷テストを実施して影響がないことを確認予定です。
```

## 実際に使ってみて

この方法により、PR作成の手間が大幅に削減されました。Issue番号と変更内容を簡単に入力するだけで、形式の整ったPRが出力されるため、複数のPRを効率的に処理することが可能です。

また、PR作成の際に毎回フォーマットを考える必要がなくなるため、記載ミスやフォーマットのバラつきもなくなりました。Markdown形式で丁寧に記述を行おうとすると意外と面倒なのですが、テンプレートにまとめて出力させるとレビュアーにとっても見やすく、自分の手間もかからないのでいい感じです。

## CLIツールとしてまとめても面白そう
現在はブラウザでChatGPTを使用していますが、API経由で自動生成するCLIツールとしてまとめてみても面白いかもしれません。CLIならばGitと連携して差分やcommitを自動で判別し、コマンドを打つだけでPRまで完了させることができるようになります。

## まとめ

今回、PR作成の自動化にChatGPTを使ってみた結果、簡単な割に非常に大きな効果を実感しました。手間のかかる作業を効率化できたことで、他の重要な開発タスクに集中できるようになったのは大きなメリットです。

PR作成のように繰り返し発生するタスクをAIで自動化することで、開発効率を格段に向上させることができます。皆さんも、ぜひ自分のプロジェクトでChatGPTを活用して、自動化の力を体感してみてください。
AutoHotkey v2.0　Win＋HショートカットをCtrlキーに割り当て

Windows11の音声入力が便利なので、そのショートカットWin＋HをCtrlキーに割り当ててみた。

```
#Requires AutoHotkey v2.0

; Ctrlキーを押すとWin+Hを送信
Ctrl::
{
    Send "{LWin down}h{LWin up}"
}

; スクリプトを終了するためのホットキー (Ctrl+Esc)
^Esc::ExitApp()

```
スイッチングハブ

>`レイヤ２スイッチ(L2スイッチ)`とも呼ばれる装置で、`データリンク層に位置`し、`ブリッジと同じ働き`をします。つまり`MACアドレスを認識してフレームの宛先を決めて通信`を行います。

https://gihyo.jp/book/2023/978-4-297-13865-3

MACアドレスを用いて通信をする（具体的には想像できない）

https://qiita.com/masatom86650860/items/6ea52dde3bd21271edde#:~:text=%E8%A3%85%E7%BD%AE%E3%81%A8%E3%81%AF%EF%BC%9F-,%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8%E3%81%AE%E5%8B%95%E4%BD%9C%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%82%89%E3%81%AA%E3%81%84Mac%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AF%E5%8F%97%E4%BF%A1%E3%83%9D%E3%83%BC%E3%83%88%E4%BB%A5%E5%A4%96%E5%85%A8%E3%81%A6%E3%81%AB%E6%B5%81%E3%81%99%E3%80%82,-%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8%E3%81%AF

データリンク層とは何をしているところだっけ
ブリッジを知らない。

https://qiita.com/masatom86650860/items/6ea52dde3bd21271edde

# 感想
スイッチングハブとブリッジの違いが理解できなかった。
JavaScriptを使用して背景の色を切り替えるスイッチを作る

# はじめに
Webアプリを作成するためのメモ
電気のスイッチのようにボタンを押すと背景の色を変更できるスイッチを作成する
# 作成したもの
- スイッチの画像を押すと背景の色を白→黒 黒→白 に変更する
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895022/347903ab-5b48-f222-f19e-718fa67f3723.png">
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895022/69042170-b9e8-a12e-013f-cb386bf3e85b.png">

# 階層図
webPage/
　├ image/
　│　├ switch_on.png
　│　└ switch_off.png
　├ js/
　│ └ switch.js
　│
　index.html

# コード
- index.html JavaScriptのメソッドchangeImage()を呼び出す
```html:index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>背景を制御する</title>
        <script type="text/javascript" src='./js/switch.js'></script>
    </head>
    <body>
        <!-- JavaScriptのchangeImage()メソッドを呼び出す -->
        <img id="image_file" src="./image/switch_on.png" onclick="changeImage()">
    </body>
</html>
```

- switch.js 
1. 背景を暗くするメソッドを作成する(toDark())
1. 背景を明るくするメソッドを作成する(tolight())
1. htmlから呼び出すメソッドを作成する(changeImage())
```javascript:switch.js
// RGB値を制御するオブジェクト
let color = {red: 255, green: 255, blue: 255};

// 背景色を暗くする
function toDark(){
    let body = document.getElementsByTagName("body")[0];
    color.red =0; color.green=0; color.blue=0;

    // 背景色を変更
    body.style.backgroundColor = "rgb(" + color.red + "," + color.green + "," + color.blue + ")";
}

function tolight(){
    let body = document.getElementsByTagName("body")[0];
    color.red =255; color.green=255; color.blue=255;

    // 背景色を変更
    body.style.backgroundColor = "rgb(" + color.red + "," + color.green + "," + color.blue + ")";

}

function changeImage() {
    //画像を切り替えて背景を変更する
    if (document.getElementById("image_file").src.match("switch_off.png")) {
        document.getElementById("image_file").src = "./image/switch_on.png";
        tolight();
    } else {
        document.getElementById("image_file").src = "./image/switch_off.png";
        toDark();
    }
}
```
# まとめ
html,javascriptはほとんど触ったことがないので、しょうもないミスで少しハマってしまった。
どこが間違っているか理解するのに時間がかかったため、デバッグ環境を構築してからコーディングする必要がありそう。
各言語の配列length

見て楽しむ用です。間違っているかもしれません。

| 言語 | オブジェクトタイプ | 使用例 |
| --- | --- | --- |
| Java | プロパティ | ar.length |
| java script | プロパティ | ar.length |
| C# | プロパティ | ar.Length |
| python | 関数 | len(ar) |
| PHP | 関数 | count($ar) |
| lua | 単項演算子(長さ演算子) | #ar |
| bash | 不明 | ${#ar[@]} |
CATとは

>イーサネットケーブルは、カテゴリという規格で分かれており、通信速度・周波数の違いで分かれています。
カテゴリの数字が高いほど通信速度は速くなります。

https://www.hashimoto-kosan.jp/ethernet/#:~:text=%E9%80%9A%E4%BF%A1%E9%80%9F%E5%BA%A6%E3%81%AE%E3%81%A1%E3%81%8C%E3%81%84,%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

カテゴリの数字が大きいほど、通信速度が速い。
イーサネットケーブルの通信速度の速さの規格がCATだった。
すべての場合でCAT７を使えばいいのになぜ場合分けされているのだろうか？


### 回線自体のスペックをあげよう
>例えば、現在一番通信速度が速い「Cat8」を選んだとしましょう。しかし、回線が10Gbpsより低いと性能は発揮できません。LANケーブルのスペックが高いことで必ず通信速度が上がることは無いので、回線自体のスペックを必ず確認しましょう

https://www.panduit.co.jp/column/naruhodo/11943/#:~:text=%E4%BE%8B%E3%81%88%E3%81%B0%E3%80%81%E7%8F%BE%E5%9C%A8%E4%B8%80%E7%95%AA%E9%80%9A%E4%BF%A1%E9%80%9F%E5%BA%A6%E3%81%8C%E9%80%9F%E3%81%84%E3%80%8CCat8%E3%80%8D%E3%82%92%E9%81%B8%E3%82%93%E3%81%A0%E3%81%A8%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82%E3%81%97%E3%81%8B%E3%81%97%E3%80%81%E5%9B%9E%E7%B7%9A%E3%81%8C10Gbps%E3%82%88%E3%82%8A%E4%BD%8E%E3%81%84%E3%81%A8%E6%80%A7%E8%83%BD%E3%81%AF%E7%99%BA%E6%8F%AE%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82LAN%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E3%81%8C%E9%AB%98%E3%81%84%E3%81%93%E3%81%A8%E3%81%A7%E5%BF%85%E3%81%9A%E9%80%9A%E4%BF%A1%E9%80%9F%E5%BA%A6%E3%81%8C%E4%B8%8A%E3%81%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E7%84%A1%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%E5%9B%9E%E7%B7%9A%E8%87%AA%E4%BD%93%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E3%82%92%E5%BF%85%E3%81%9A%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86

インターネット回線自体が10Gbpsより低いとイーサネットケーブルの通信速度を活かせない。
IT企業におけるデザイン組織の役割

# はじめに
BIPROGY（旧：日本ユニシス）というIT会社にシステムエンジニアとして入社し、現在はデザイン組織でUI/UX、サービスデザインなどを担当しています。普段の業務では人間中心設計専門家として、UI/UX関連の案件支援をしたり、知財開発や啓蒙活動をしたりしています。

会社をご存じの方からは、「え？システムエンジニアなのに、デザインやっているの？」とか「バトミントンの会社？」「電飾メーカー？」などと思われるかもしれませんが、2011年からデザイン領域の専門組織を立ち上げ、地道にデザイン領域に取り組んでいます。元々はSI領域に強みがある会社ですが、昨今では従来のSIだけでなく、サービスビジネスも多数手がけています。

今まではあまり社外に対して発信をしてこなかったのですが、これからは部署のメンバーで持ち回りしながら、UI/UX、サービスデザイン、デザイン思考などの技術情報を発信していきたいと思います:wink:

# エンジニアの中心でHCDを叫ぶ
2011年にデザイン組織が立ち上がった当初、UXやサービスデザインといった用語はまだ広く認知されていませんでしたが、”ユーザビリティ（使い勝手）”の重要性が徐々に浸透してきた時期でした。正直に申し上げると、当時のシステムは使い勝手が十分ではありませんでした。特に、当社は当時、SI（システムインテグレーション）に強みを持ち、BtoB向けの業務システム開発が主流でした。そのため、限られたユーザーが使用する業務システムでは、使いやすさや見た目の優先度が低くなりがちでした。この結果、要件を満たしていても、使いにくいシステムが多く生まれてしまいました。

 使い勝手が悪いシステムは、ユーザに使いたくないと思われてしまい、淘汰されてしまいます。結局頑張って作っても、使ってもらえなければ意味がない。そこをなんとかしていかないと！という思いから、エンジニアしかいない弊社の中で人間中心設計（Human Centered Design）を叫び、デザインの専門組織の立ち上げに至りました。

# 人間中心設計（HCD）とは
人間中心設計（Human Centered Design）は、[ISO9241-210:2010](https://ja.wikipedia.org/wiki/ISO_9241-210)（JIS Z 8530:2021）にも定義されている、ユーザ（人間）を中心にモノづくりをする設計手法になります。


![HCD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899899/4f6dfd38-16ab-c07d-5ecb-82cd7e740582.png)


ユーザのことを深く理解した上でモデル化（ペルソナ・シナリオなど）し、要求事項を抽出。そこから解決策（画面プロトタイプ）の作成を行い、ユーザ視点で評価を行います。評価の結果問題がなければ、解決策はユーザ要求を満たしていることになり、次工程（開発など）に進みます。逆に評価の結果、問題があれば前工程に戻り、反復改善を繰り返します。このようなプロセスを、人間中心設計プロセス（HCD）といいます。

弊社では、このHCDを開発工程に落とし込んだものを、UXデザインプロセスとして定義し、様々なお客様のプロジェクトやプロダクト開発に生かしています。

# システムエンジニアがやるからこそのデザイン
2011年の専門部署発足当時とは異なり、2024年現在、UXを手掛けるデザイン会社は多数あります。
[HCD-Net](https://www.hcdnet.org/) の認定する人間中心設計専門家、スペシャリストも約2200人が認定されています。私たちはシステムエンジニアであり、美術系の学校を出たデザイナーではありません。秀でた芸術的センスがあるわけでもありません。そのような中で、あえてエンジニアが、UI/UXの領域をやり続けるのには、理由があります。

### ＜IT企業におけるデザイン組織の役割とメリット＞
* **エンジニア経験・知識があることから、デザインと開発のスムーズな橋渡し**
昨今、UIデザインと開発の垣根が薄くなってきており、デザインを行う上でも特にフロントエンド技術の理解が必要です。 例えば、CSSライブラリやローコード・ノーコードを使って実装する場合、エンジニアの知識があることで、技術的な制約を把握した上でデザインを考えることができます。凝ったデザインや美しいデザインを作成しても、「実現できなければ」「コストに見合わなければ」意味がありません。”絵に描いた餅”にしないためには、現実的な解決策を導くエンジニアの視点が役立ちます。また、バックグラウンドが同じなので開発チームとのコミュニケーションもスムーズで、食い違いが起きにくいというメリットもあります。
</br>

* **SIで培った業務への深い造詣、要件定義の能力**
UXの実現において、ユーザーの理解は必要不可欠です。BtoB向けのシステムにおいては、見た目の美しさよりも、業務を深く理解し、業務がスムーズに遂行できることが求められます。そのためには、該当業務を深く理解する必要があります。お客様から要件を拾い上げ、深掘りし、まとめ上げることが重要です。これは長年SIerとして多種多様なお客様のシステム開発に携わった経験が役立っています。 
</br>

* **シームレスな実行力**
見た目だけを良くしても良いプロダクト（サービス）は成し得ません。サービスデザイン、UXデザイン、UIデザイン、開発設計をシームレスに実施することで、ワンストップでの開発が可能になります。特に昨今、弊社もSI領域ではなく、サービスビジネス領域に力を入れているため、この領域をきちんと考えていくことが求められています。
</br>

# おわりに
今回は、IT企業において何故デザイン組織が必要なのか、その役割とメリットを内的要因を中心に説明しました。他にもデザイン組織が必要になった背景としては、DXや事業創出に伴い、お客様から求められることに変化があったことも挙げられます。不確実性の高いニーズに対応する必要があり、それにはアジャイル開発とUXを掛け合わせた考え方も必要不可欠です。アジャイルUXについては、また別の機会に言及したいと思います。

これからも、私たちはエンジニアとしての強みを活かし、デザインと開発の橋渡し役として、ユーザーにとって使いやすく、魅力的なシステムを提供していきます。技術とデザインの融合を追求し、常にユーザーの視点を大切にしながら、より良いプロダクトを生み出すことを目指し、進化し続けるデザインの世界で、新たな挑戦を続けていきたいと考えています。
エンジニアなら知っておきたい契約知識

## これは何?

業務をしていて契約周りのことで詰まることがあったので調べたことをまとめます。

---

## 派遣契約

- 派遣会社が雇用している従業員を企業に派遣し，特定の業務を行う
- 契約書に記載された業務のみを行うことが可能
    - 契約書以外の業務を実施させてはならない
    - 契約内容にない出張や記載している就業場所以外で業務を行わせてはならない
- 基本的に期間を定めて雇用するが，無期雇用派遣なども存在する
- 派遣元責任者という制度に基づく
    - 労働管理責任が派遣先企業にあるため，労働時間の管理などは派遣**先**企業が実施する必要がある
    - 給与や福利厚生は派遣**元**会社が実施する
    - 業務の進行は派遣**先**の責任
- 名刺は「派遣先」のものを使用することができる

### 登録型の派遣

- リクルートやパーソル等の人材派遣会社の応募によって派遣される
- 3年以上同じ現場にいた場合は人材派遣会社もしくは派遣先の正社員にしないといけない

---

## 業務委託契約(パートナー)

- 請負契約，委任契約，準委任契約を総称する言葉である
- 会社によっては派遣社員と区別するためにパートナーと呼ぶこともあるかも
- 基本的には業務を決めて契約する
    - 想定よりも工数がかからなくても満額支払いが必要
- 偽装請負を避けるために
    - 直接指揮命令権がないため，正社員が直接指示を出すと偽装請負になる→労働時間の管理等は社員の責任でない
        - リーダを定めてその人を通じて指示をする(SESの場合，SESのプロパーの方がリーダになり，再委託先に指示を出すことが多そうだが法的な制限はなさそう)
    - 勤怠実績の報告を求めてはならない
    - 発注者側で業務を実施する人材を選定してはいけない
    - 仕事の完成や業務の処理方法の教育，指導は請負事業主自ら行っていることが求められる。発注者が教育を行うことは原則できない

### 請負契約

- 成果物に対して報酬を支払う契約→成果物を納品する責任を負うため，基本的には期日を守り，ミスや欠陥があった場合には損害賠償を請求されることもある

### 委任/準委任契約

- 何かしらの行為に対して報酬を支払う契約のこと
- 成果物に対しての責任を負わない
- 法律関係の依頼は委任契約，それ以外は準委任契約になる

---

## なぜ派遣エンジニアとパートナーエンジニアがいるのか

- パートナーは再委託がOK
    - SES企業は自社の社員でない人を送り込むことができる(二重派遣は法律違反)
    - 再委託の場合，SES企業からすると自社の社員よりも単価が安い場合がある

---

## 契約社員と正社員の違い

### 正社員

- 雇用期間が無期雇用である
- 定期的に査定などにより，昇進昇給することがある

### 契約社員

- 正社員同様，勤務先の企業に直接雇用される
- 雇用期間が決まっている
- 同じ企業での勤続年数が5年を超えた場合には労働者からの申し出があった場合には契約社員は無期雇用契約への切り替えが可能である
- 契約時に役割と給与が決まっているため給与や昇進はない
- 福利厚生は勤務先企業の責任になる
- 勤務先企業は指揮命令権があるため，正社員と同じような業務を行える
Linuxユーザパスワードポリシーメモ

`/etc/security/pwquality.conf`ファイルでパスワードポリシーを定義するには、以下のように設定します。これにより、パスワードの長さや複雑さ、その他の要件を細かく制御できます。

### パスワードポリシー設定例

```bash
minlen = 8        # パスワードの最小文字数
dcredit = -1      # 数字を少なくとも1つ要求
ucredit = -1      # 大文字を少なくとも1つ要求
lcredit = -1      # 小文字を少なくとも1つ要求
ocredit = -1      # 記号を少なくとも1つ要求
maxrepeat = 3     # 同じ文字を連続で使用できる回数
retry = 3         # パスワード入力失敗時の再試行回数
```

### 各設定の説明
- **`minlen`**: パスワードの最小文字数を設定します。例では8文字以上を要求しています。
- **`dcredit`**: パスワードに含まなければならない数字の最低数を設定します。`-1`は少なくとも1つの数字を必要とします。
- **`ucredit`**: 大文字の要求数を設定します。`-1`は少なくとも1つの大文字が必要です。
- **`lcredit`**: 小文字の要求数を設定します。`-1`は少なくとも1つの小文字が必要です。
- **`ocredit`**: 記号（特殊文字）の最低数を設定します。`-1`は少なくとも1つの記号を必要とします。
- **`maxrepeat`**: 同じ文字を連続で使用できる回数を制限します。例では、同じ文字を3回まで連続して使用できます。
- **`retry`**: ユーザーがパスワード設定に失敗した際に再試行できる回数を指定します。

これらの設定を使用して、システムに要求されるパスワードポリシーを強化できます。
IEEE 802.3で標準化されている仕様

# 1000BASE-T(IEEE 802.3ab)
>ツイストペアケーブルを用いて1000Mbpsの通信速度を実現するギガビットイーサネットの仕様

### ツイストペアケーブルとは
https://qiita.com/masatom86650860/items/618b5e96bcaec067dc63#%E6%9C%AC%E4%BD%93%E3%81%A8%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%81%AB%E7%94%A8%E3%81%84%E3%82%8Blan%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB

# 1000BASE-X(IEEE 802.3ae)
>光ファイバケーブルを用いて1000Mbpsの通信速度を実現するギガビットイーサネットの仕様

# 10GBASE 
>伝送速度が10Gbpsである通信(10ギガビットイーサネット)の総称。IEEE 802.3aeで規格化されている。なお、10BASE系以降、CSMA/CDの規格から削除されている。

https://gihyo.jp/book/2023/978-4-297-13865-3

# 感想
他にもいろいろあるらしい。
使うケーブルとCATで様々な規格があるのは面白い

https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88#:~:text=%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88%E8%A6%8F%E6%A0%BC%E4%B8%80%E8%A6%A7,1.6TBASE%2DKR8

https://www.hashimoto-kosan.jp/ethernet/#:~:text=%E3%81%AE%EF%BC%AC%EF%BC%A1%EF%BC%AE%E5%90%91%E3%81%91-,%E8%A6%8F%E6%A0%BC,600MHz,-LAN%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE
git log のMerge pull requestコミットメッセージからPR番号のみ抽出して一覧化するコマンド

## mainとdevelopmentの差分のPR番号一覧を取得

```shell-session
$ git log --merges --oneline origin/main...origin/development | grep "Merge pull request" | sed -E 's/.*#([0-9]+).*/\1/'
```

## 補足

### git log --merges --oneline

`--merges`: マージコミットのみを表示するオプション
Gitリポジトリには、通常のコミット（単純な変更を記録するコミット）と、ブランチの統合を行った際に生成されるマージコミットがあります。
`--merges` オプションを使うと、マージコミットだけがフィルタリングされ、表示されます。これにより、他の通常のコミットは表示されません。

`--oneline`: 各コミットを1行で簡潔に表示するオプションです。
通常、`git log` はコミットIDや日時、作成者、コミットメッセージなどを複数行にわたって表示しますが、`--oneline` オプションを使うと、コミットの短縮版ID（SHAの先頭7文字）とコミットメッセージの先頭部分だけが1行で表示されます。これにより、コミット履歴を簡潔に見ることができます。

### sed -E 's/.*#([0-9]+).*/\1/'

#### 正規表現の構造

```shell-session
sed -E 's/.*#([0-9]+).*/\1/'
```

`-E`
- 拡張正規表現 (Extended Regular Expressions) を使用するオプションです。通常の正規表現よりも強力なパターンが使えます。

`s/.../.../`
- これは `sed` コマンドの置換 (substitution) 構文です。`s/` の後ろにある最初の部分が検索するパターン、次の部分が置換する内容です。

#### 正規表現の詳細

```
.*#([0-9]+).*
```

`.*`
- 意味: 任意の文字が0回以上繰り返される部分を表します。
- 解説: `.*` は、任意の文字列を指していて、行の先頭から `#` までの部分をすべてマッチさせます。

`#`
- 意味: 文字 `#` をそのままマッチします。
- 解説: これにより、プルリクエスト番号の先頭にある `#` を探します。

`([0-9]+)`
- 意味: 数字 [0-9] が1回以上連続する部分を表します。
- 解説: # の直後に続く数字部分がここにマッチします。カッコ () で囲んでいるため、キャプチャグループとして扱われ、後でこの部分を取り出すことができます。ここではプルリクエスト番号に相当する部分です。

`.*`
- 意味: 再び任意の文字が0回以上繰り返される部分です。
- 解説: #123 の後に続く任意の文字列全体を表しますが、これは置換時に無視されます。

置換部分 `\1`
- 意味: これは正規表現内の 1番目のキャプチャグループを指します。
- 解説: ここでは `([0-9]+)` にマッチした部分（つまり、プルリクエスト番号）が `\1` で参照されます。`\1` によって、マッチしたプルリクエスト番号だけを出力します。

#### 全体の動作

この正規表現は次のように動作します。

- `.*#([0-9]+).*`: 任意の文字列の後に `#` と数字列が続くパターンを探し、その数字列をキャプチャします。
- `\1`: キャプチャされたプルリクエスト番号だけを出力します。

例
たとえば、以下のマージコミットログ：

```shell-session
Merge pull request #123 from some-branch
```

このログに対して、正規表現は次のように処理します。

1. `.*` で `Merge pull request` という部分を無視します。
2. `#` にマッチし、その後の数字 `123` をキャプチャします。
3. 残りの部分 from some-branch は再度 `.*` で無視されます。
4. 最後に `\1` でキャプチャされた `123` だけを出力します。

結果的に、`123` だけが抽出されます。
OMC218B(755,整数)

https://onlinemathcontest.com/contests/omc218/tasks/4737

コンテスト後しばらくは解説を読んでも理解できなかったので、復習です。
解説によると、フェルマーの小定理使うと解けるらしいです。

フェルマーの小定理をWikipediaで調べると、

$a$を$p$の倍数でない整数($a$と$p$は互いに素)とするときに、
$a^{p-1}≡1$ $(mod$ $p)$
が成立する。

と書かれています。

問題文より$2^{16}+1$は素数であり、$a_{n+1}=2^{a_n+1}$は$2$のべき乗です。

$2$と$2^{16}+1$が互いに素であることを利用して、
$2^{2^{16}}≡1$ $(mod$ $2^{16}+1)$
を示したいです。

さて、
$a_2=2^{a_1+1}=2^{1+1}=2^2=4$
$a_3=2^{a_2+1}=2^{4+1}=2^5=32$
$a_4=2^{a_3+1}=2^{32+1}=2^{33}$
$a_5=2^{a_4+1}=2^{2^{33}+1}$

$a_5>2^{2^{16}+1}$なので、ここからフェルマーの小定理が使えそうです。
$2^{33}=2^{16}×2^{17}$より、$2^{33}$は$2^{16}$の倍数なので、
$2^{2^{33}}≡2^{2^{33}-2^{16}}≡2^{2^{33}-2^{16}×2}≡2^{2^{33}-2^{16}×3}≡…≡2^0(=1)$ $(mod$ $2^{16}+1)$になります。
したがって、$a_5≡2$ $(mod$ $2^{16}+1)$になります。

同様に$a_6$の指数部$2^{a_5+1}$ ($a_5$は$16$以上の整数)の$2^{a_5}$は、$2^{16}$の倍数です。($2^{a_5}=2^{16}×2^{a_5-16}$)
というわけで、$2^{a_5}≡1$ $(mod$ $2^{16}+1)$なので、$a_6≡2$ $(mod$ $2^{16}+1)$となります。

$a_7$から先も前の章の$(a_5,a_6)$を$(a_n,a_{n+1})$に置き換えるだけなので同じです。
したがって$a_{100}≡2$ $(mod$ $2^{16}+1)$。
年収上げたい開発者が読むべき本（古め）

### はじめに、

私自身はインフラSEです。しかしたまにミニPJの開発PMをやったり、小さい案件は一人で開発をすることがあります。（主にjavaとpython) 結構前ですが開発者として派遣された子の進捗が芳しくなく、2週間かけて全然完成できなかった機能実装を、私と一緒に行ったら2Hで終わった事がありました。

彼は一応開発のプロとして派遣されてきたにも関わらず、なんだ？この体たらくは！？っと最初思いました。
そして彼にいくつか質問をしたところ、私が常識と思っていたことが全く知らなかった事に驚愕。
その後彼に教材として私が読んだ書籍を渡し、一緒に勉強をしました。

結果彼は急激に成長し、派遣会社を辞め某大手企業に転職を果たせました。

その時の書籍だと古いものが多いので、比較的新しい書籍があればそちらもご紹介します。

### オブジェクト指向を身に付ける

まずpython,php,swift,cotlin,typescript,javascriptなど多種多様な言語が世の中に存在しています。
ただ私の感覚で言えば、これらの言語は日本語(オブジェクト指向言語)の中にある、博多弁、関西弁、京都弁、青森弁などの違いでしか無く、オブジェクト指向という言語の考え方が分かれば正直すぐ分かる程度です。

事実2Hでオープンソースの不具合を見つけるコンテストを開いた時、初めて触る言語にも関わらず不具合を発見するという事が出来ました。（まぁ情報工学系博士課程の学生だったのもあります）

新卒採用した子でも2年間で6つぐらいの言語は使いこなしているので、オブジェクト指向を理解した開発をするのは必須だと考えても問題無いです。

以下の本は古い本ばかりですが、オブジェクト指向を初めて勉強するには全く問題無い本です。
図書館に行けば多分まだ置いてあるかも。

他にお勧めの初心者向けオブジェクト指向があればコメントで教えてください。

https://amzn.asia/d/2UB22Xg
![オブジェクト指向](https://m.media-amazon.com/images/I/51WNK7S07FL.jpg)

https://amzn.asia/d/dnR3KdY
![オブジェクト脳](https://m.media-amazon.com/images/I/51zFIBS+D2L.jpg)


### デザインパターンを使いこなす

オブジェクト指向で開発していると、クラスにどんな単位で作成するべきか、もしくは分割するべきか？がけっこう悩みの種になってきます。クラスの特性に応じて、パターン化してくれたものがデザインパターンになります。

これは結構強力で、私は100行、ｘ10ファイルぐらいのクラスファイル中、if文があるのは1ファイル以外無くなり、多段になるif文も存在しなくなった時、感動を覚えた記憶があります。

やり過ぎると逆に可読性とメンテナンス性は下がりますが、最低でもステート/ストラテジーパターンやNullObjectパターンぐらいは身に付けて貰えたら相当開発が楽になります。

https://amzn.asia/d/9HbYQRp
![デザインパターン](https://m.media-amazon.com/images/I/81Jbi1m5CSL._SY522_.jpg)

https://amzn.asia/d/g9INvQx
![デザインパターン](https://m.media-amazon.com/images/I/41xgZhdHu7L._SX342_SY445_.jpg)


### リファクタリング

実は今回紹介する本の第一章を10回ぐらい繰り返して行う事でオブジェクト指向とデザインパターンが理解出来るようになった名著中の名著です。

開発をしていると、最初から綺麗なコードを書ける訳ではないです。ちょっとこのクラスにこの機能があるのはおかしいとか、メソッドがやたら多いなぁっと感じて来た時に、クラスを分割したり、再構成するときに非常に強力な考え方を教えてくれる本です。正直この本に書いてあることを半分でも実践出来たら、新人飛び越えてそこそこ活躍出来る開発者になっていると思っても良いと思います。

私個人としては絶版になったjava版がお勧めではあります。
![リファクタリング](https://m.media-amazon.com/images/I/71SE4R7l1AL._SY522_.jpg)

https://amzn.asia/d/3Ft7pdA
![リファクタリング](https://m.media-amazon.com/images/I/71ipwugYIIL._SY522_.jpg)

### 単体テスト

実は、単体テスト、リファクタリング、デザインパターンは私の中では開発者が必ず身に付けるべき3種の神器(スキル）と思っています。単体テストがあることで安心してリファクタリングが出来、デザインパターンがあることで、リファクタリングする方向性が定まります。

しかしテストコードを書くのは相当しんどいです。特に初期段階ではクラスが定まらず、何度もリファクタリングするためにテストコードを書き換える事が多くなります。
そのためテストコードをおろそかにして、痛い目を見るというのが新人が通る鉄板の事象です。

特に半年後、1年後に自分のコードを修正したら不具合が発生するという事がよく起こります。
その時テストコードがないと原因が分かるのに無駄な時間を費やす結果になるので是非未来の自分のためにもテストコードの作成は必須と思って貰えるとうれしいです。

https://amzn.asia/d/9umNCsj
![TDD](https://m.media-amazon.com/images/I/81LdP5NQF3L._SY522_.jpg)

https://amzn.asia/d/0EJEABy
![TDD](https://m.media-amazon.com/images/I/813DXFJioDL._SY522_.jpg)

### 最後に

リーダブルコード系の書籍も非常によいですが、今回はリファクタリングに含まれていると思い、外しました。
ただリーダブルコード系の本の方が読みやすいとは思います。

また新人開発者が陥るのは、何でもかんでも開発してしまう事です。
「それってDBに任せていいじゃないの？」
「それってプラグインあるよね？」
「パフォーマンスチューニングするのはそこじゃないでしょ？」
という事がしばしば発生します。

よい開発者への道は（私にとって）開発の神様であるケンベック曰く、
「私は優秀な開発者ではない、優秀なツールを使いこなす開発者だ」の格言に従い、
先人達の知恵を活用して是非開発者人生を歩んで頂けたら幸いです。

もし今回紹介した本よりも良い本があれば是非ご紹介ください。
宜しくお願い致します
RDB(例:supabase)と非RDB(例:firebase)の違い

# 一般的な機能の機能の違い
RDBは、複雑なビジネスロジックやデータ間の厳密な関連性を扱うアプリケーションに向いており、非RDBはリアルタイム性や柔軟性を重視するアプリケーションに適しています。例えば、Firebaseはチャットアプリやリアルタイムゲームに向いている一方、SupabaseはECサイトやデータ分析を行うアプリケーションに適しています。

| 特徴             | **RDB（例：Supabase）**                        | **非RDB（例：Firebase）**                        |
| ---------------- | ---------------------------------------------- | ---------------------------------------------- |
| **スキーマ**      | 固定スキーマが必要                                 | スキーマレス                                     |
| **データの整合性**| 高い整合性を保つ                                   | 整合性の管理はアプリ側で                          |
| **スケーリング**  | 垂直スケーリングが主                                 | 水平スケーリングに優れる                           |
| **クエリの柔軟性**| SQLで高度なクエリが可能                               | 複雑なクエリやJOINは難しい                         |
| **リアルタイム処理**| リアルタイムにはやや弱い                             | リアルタイム同期に強い                             |
| **運用管理**     | 自分で管理する必要あり                               | 自動化された運用管理                               |
| **トランザクション**| 強力なトランザクション機能                              | トランザクション機能は限定的                        |
| **データモデル**  | 正規化が基本                                       | 非正規化が基本                                    |



# 検索やINDEXに関する整理
検索とインデックスに関して、RDBは複雑なクエリを高速に実行するためにインデックスの手動管理が必要で、最適化次第では非常に高いパフォーマンスを発揮します。
一方、Firebaseのような非RDBは自動的にインデックスを生成し、シンプルなクエリに対しては優れたパフォーマンスを発揮しますが、複雑なクエリには限界があります。したがって、データの規模や検索の複雑さに応じて、最適なデータベース選択が求められます。

| 特徴               | **RDB（例：Supabase）**                                    | **非RDB（例：Firebase）**                                  |
| ------------------ | -------------------------------------------------------- | -------------------------------------------------------- |
| **検索機能**        | SQLを使った複雑な条件付き検索が可能                           | ドキュメントベースのシンプルな検索が主                           |
| **複雑なクエリ**    | 複数のテーブルにまたがるJOINやサブクエリに対応                   | 複数条件やJOINには対応していない                              |
| **インデックス管理**| 手動でインデックスを作成、最適化が必要                            | 自動インデックス生成（ただし、カスタムインデックスは手動）          |
| **自動インデックス**| 一部自動生成されるが、最適なパフォーマンスには手動の調整が必要       | すべてのフィールドが自動インデックス化される                     |
| **インデックス数**  | 複数のインデックスを自由に設定可能、ただし管理が必要                  | カスタムインデックスに上限あり、複雑な検索には制限がある            |
| **検索のパフォーマンス**| インデックスによって大規模データでも効率的に検索可能               | 単純なクエリは高速だが、複雑なクエリにはパフォーマンス制約がある     |
Slackにインスタントな翻訳機能を提供する-機能拡張編-

# はじめに

少し前に、１クリックでSlackの投稿を日本語訳してくれるボットを作りました。

* 前編 [Slackにインスタントな翻訳機能を提供する-概要編-](https://qiita.com/yabikkio/items/2bd496684b317fc03d2e)
* 中編 [Slackにインスタントな翻訳機能を提供する-カスタムワークボット設定編-](https://qiita.com/yabikkio/items/a9d13e5c1ec14be5097f)
* 後編 [Slackにインスタントな翻訳機能を提供する-レシピ構築編-](https://qiita.com/yabikkio/items/cb728e63e37191e78421)

今回は、上記で作成したレシピを拡張します。

# 多言語に翻訳したい
ユーザーに「日本語だけじゃなくて、他の言語にも翻訳できたら嬉しいな！5か国語くらい。それで今後も増やしていきたいかも。できる？」と言われた場合を想像してください。
分岐が大変なことになるのでは？ 対応言語を増やすたびにレシピを改修しなきゃいけないの？と身構えてしまいませんか。
安心してください。
**If文を乱用せず、今後はレシピメンテ不要でオンタイムに対応言語を増やしていける**ようなレシピに仕上げていきましょう。

# レシピのビフォーアフター

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/12c3d021-5027-899a-ab73-20a4f837613d.png)

アクションは増えていませんが、トリガーが少しだけ複雑になっているように見えます。
種明かしをすると、LookupTableを導入して、Workatoの関数（Formulaモード）を使って参照し動的に値を求めることで、レシピの構造を変えずに１ロジックで実現しています。

ここからは細かい改修手順のお話をします。

# 手順1) LookupTableを用意
絵文字リアクション名と、それに対応するDeepLの言語コードをマッピングします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/21f12b5e-4717-89d5-8442-97c8258829cd.png)

### ・「Slack_reaction」カラム
各国旗の絵文字リアクション名です。
`reaction_added`イベントを受信した際に取得される値をセットします。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/adb5c0eb-0ed0-601f-f511-6418046fbdee.png">

### ・「DeepL_languageCode」カラム
[DeepLの対象言語コード](https://developers.deepl.com/docs/ja/resources/supported-languages#target-languages) の値をセットします。
### ・「memo」カラム
任意（処理では使用せず、備忘用です）

## テーブルの用途
このLookupTableには、次の用途を期待します。
* **辞書的に使う**
アクションでは、絵文字リクション名からDeepLの言語コードに変換して翻訳する
* **ホワイトリスト的に使う**
トリガーでは、テーブルに登録されている絵文字のどれかと一致するリアクションだけに反応する


# 手順2) トリガーの条件を編集
レシピを開いて、トリガーの条件を編集します。

以前は、付けられた絵文字リアクションが`jp`(日本)なら、ジョブが実行されました。
今後は、付けられた絵文字リアクションが「用意したテーブルに登録されている国の絵文字」のいずれかと一致すれば、ジョブが実行されるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/b5a8dad5-55e1-4b82-db58-33459c1fe051.png)

`Lookup`Formulaを使うと、任意のLookupTableに対して任意の値で絞り込みをかけ、データを抽出できます。
抽出されたデータが「存在するか」を評価するには、`is present`を使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/3b044397-248c-a248-634d-129c9aed2625.png)

:::note info
`Lookup`Formulaのテーブル指定は、名称かIDのどちらにも対応しています。
ただし名称を使っている場合、LookupTable名を変更してレシピ側を変更しないとエラーが発生します。テーブル名が変更される可能性がある場合は、IDを使用する方が安全です。
:::

# 手順3) アクションを編集
Step3のDeepL翻訳処理に移り、フィールド`Target lanuage`を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/a3e35e4e-6afc-1aaa-7a7d-9d81ad5a2458.png)

入力モードでつらつらと書いてある内容について補足します。

`Lookup`Formulaは先ほどトリガーのフィルター編集で出てきました。
今度はその後に ["(カラム名っぽい何か)"] が続いていますね。

`Lookup`Formulaで抽出したデータにはすべてのカラムが含まれていますが、DeepLが翻訳するのに必要なのは**DeepLの言語コード**です。
このため、["カラム名"]でお目当ての要素を取得しています。
（クォーテーションはシングルでもダブルでも構いません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/46f4d8d5-a1a4-2554-107f-3d8cae4b8958.png)


これで修正は完了しました。

# 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/8c199214-ccc5-2cdb-33a5-59ffae9826c0.png)

多言語に翻訳できました。


# さいごに
Workatoは実装が簡単なので、最初はとりあえず動くものを作ってみて、ユーザーの反応を見ながら改良していくことがよくあります。
レシピ作成に関する記事は多く見つかりますが、レシピの修正に関する情報はあまり見かけないため、この記事がメンテナンスに携わる皆さんのお役に立てれば幸いです。
【GO】go:embedを利用して埋め込んだ秘密鍵をGithubActionsで利用する方法

# はじめに
GOの勉強で、JWTの生成を実装していました。
JWTの生成で使う秘密鍵と公開鍵は、go:embedを利用して埋め込む方法を取りました。
そして、秘密鍵と公開鍵は、セキュリティの問題があるのでGitHubにはコミットしないようにしました。
この場合、GithubActionsで、LintやTestが失敗するので、どうすればいいか調べました。

結論から言うと、GithubActionsには、シークレットという変数を登録して、GithubActionsを実行中に使える機能があるので、それを使います。
具体的には、秘密鍵と公開鍵の中身を変数として登録し、GithubActionsを実行するときに変数の中身を秘密鍵と公開鍵のファイルとして、出力するという方法となります。

# GOのコード
GOのコード側では以下のように秘密鍵と公開鍵を利用しています。

```go
//go:embed cert/secret.pem
var rawPrivKey []byte

//go:embed cert/public.pem
var rawPubKey []byte
```

# シークレット変数を登録
- GitHubリポジトリの「Settings」に移動
- リポジトリページの右上にある「Settings」をクリック
- 「Secrets and variables」→「Actions」を選択
- 「Secrets and variables」の中から「Actions」を選択し、「New repository secret」をクリック
- PRIVATE_KEYなど任意の名前を設定し、秘密鍵の値を入力して保存
- 同様に公開鍵も、PUBLIC_KEYなどの任意の名前を設定し、保存

# GithubActionsで利用する
Workflowで、以下のように秘密鍵と公開鍵を作成する
```yaml
    steps:
      - uses: actions/setup-go@v3
        with:
          go-version: ">=1.18"
      - uses: actions/checkout@v3
      - name: Create dir
        run: mkdir -p auth/cert
      - name: Create secret key
        run: |
          echo "${{ secrets.SECRET_KEY }}" > auth/cert/secret.pem
      - name: Create public key
        run: |
          echo "${{ secrets.PUBLIC_KEY }}" > auth/cert/public.pem
```
IEEE 802.3とは

> OSI基本参照モデルにおける`データリンク層と物理層のプロトコルおよびサービスを対象とする企画`です。具体的には、データリンク層をLLC副層とMAC副層２つに分割し、物理層における`LANで使用する伝送媒体やMAC副層におけるフレームの構成や衝突検出の仕組み`などを規定しています。

フレーム構成、衝突検出とは？
LLC副層とMAC副層とは？

### 標準化されている仕様
https://qiita.com/masatom86650860/items/45f4c78358c835493907
# 感想
上の疑問を解決しないといけない。
この規格を使った技術もあるらしいが、疑問が解決しないと理解できない
【Rails】rails db:resetとrails db:migrate:resetは何が違う？

こんにちは！

今回は、rails db:reset と rails db:migrate:reset の違いについて書きます！

![banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/83de7afc-66c8-8880-ad67-fd6231afad24.png)


 # rails db:reset
* rails db:reset は、データベースを再作成し、シードファイルを読み込んでダミーデータを挿入します。テーブルは再作成され、既存のデータはすべて削除され、シードファイルを元に新しいデータが作成されます。
* ただし、rails db:reset はマイグレーションを実行しません。マイグレーションファイルの内容は反映されず、db/schema.rb に基づいてテーブルが再作成されます。


 # rails db:migrate:reset
* rails db:migrate:reset はデータベースを再作成し、テーブルのデータがすべて削除される点は rails db:reset と同様です。
* その後、すべてのマイグレーションファイルが古い順に実行されます（db/migrate/hoge.rb など）。データベースが drop された後、マイグレーションが通常通り実行されます。
* シードファイルは自動で読み込まれないため、新しいダミーデータを挿入するには別途 rails db:seed を実行する必要があります。

# 最後に
ここまで読んでいただき、ありがとうございました！
rails:db:seedが通らない時があったので、備忘録として書いてみました。
いいねしてくれたら、スキップして喜びます:heartpulse:
reduceメソッドの蓄積値に型付けをし、カテゴリー毎に指定したオブジェクトを格納する

## 背景
受け取った値をreduceメソッドでカテゴリー毎に分け、分けたものに対し各種処理を行う必要のある場面がありましたので、「reduceメソッドでカテゴリー毎に分ける」部分をメモしておきたい背景となります。

## 該当のデータ
```typescript:index.ts
type Item = {
  category: string;
  name: string;
  price: number;
};

const items: Item[] = [
  { category: "A", name: "A1", price: 100 },
  { category: "A", name: "A2", price: 200 },
  { category: "B", name: "B1", price: 300 },
  { category: "B", name: "B2", price: 400 },
  { category: "C", name: "C1", price: 500 },
];
```

このようにcategoryプロパティでカテゴリー分けがされているのですが、「カテゴリーA（もしくはB・C）の全てのアイテムに対し処理を加えたい」という場合があるので、reduceメソッドで分けていきます。

## reduceメソッド
まずは基本構文です。
```typescript:index.ts
// テストデータ
const testArray = [1, 2, 3, 4, 5];

// reduceメソッドを使用して配列の合計値を求めます。
// 引数には(蓄積する変数(accumulator)、繰り返しを行なっている配列の現在の値(currentValue))が入ります。
// 第二引数には初期値が入ります。この場合、0を初期値として渡しています。
const sumValue = testArray.reduce((accumulator, currentValue) => accumulator + currentValue, 0);

// 15で出力されます（1 + 2 + 3 + 4 + 5 = 15）
console.log(sumValue);
```

## カテゴリー毎に分ける
続いて、先ほどのデータをカテゴリ毎に分別していきましょう。

### 全体のコード
```typescript:index.ts
type Item = {
  category: string;
  name: string;
  price: number;
};

const items: Item[] = [
  { category: "A", name: "A1", price: 100 },
  { category: "A", name: "A2", price: 200 },
  { category: "B", name: "B1", price: 300 },
  { category: "B", name: "B2", price: 400 },
  { category: "C", name: "C1", price: 500 },
];

// ①
const grouped = items.reduce((acc: { [key: string]: Item[] }, item: Item) => {
  // ②
  if (!acc[item.category]) {
    acc[item.category] = [];
  }
  // ③
  acc[item.category].push(item);

  // ④
  return acc;
}, {});

console.log(grouped);
// {
//   A: [
//     { category: 'A', name: 'A1', price: 100 },
//     { category: 'A', name: 'A2', price: 200 }
//   ],
//   B: [
//     { category: 'B', name: 'B1', price: 300 },
//     { category: 'B', name: 'B2', price: 400 }
//   ],
//   C: [ { category: 'C', name: 'C1', price: 500 } ]
// }
```

### ①蓄積値をオブジェクト型とし、キーと値に片付けを行う
```typescript:index.ts
// ①
const grouped = items.reduce((acc: { [key: string]: Item[] }, item: Item) => {},{});
```
蓄積値であるaccumulator（acc）をオブジェクト型{}で型付けを行い、内部のプロパティ名を[key: string]、値をItem[]という形にし、各種カテゴリ名がプロパティ名となり、値にそのカテゴリのアイテムがItem型で格納される形とします。

### ②繰り返し処理が新しいカテゴリーの番になったら空の値を作成
```typescript:index.ts
  // ②
  if (!acc[item.category]) {
    acc[item.category] = [];
  }
```
各種繰り返し処理時、蓄積値に該当のカテゴリーがあるかを検索し、存在しない場合にそのカテゴリをプロパティ名、値を空の配列としたものを作成する

### ③蓄積値に存在する該当カテゴリーにアクセスし、配列に値をpushする
```typescript:index.ts
  // ③
  acc[item.category].push(item);
```
蓄積値にブラケット記法でアクセスを行い、その値が配列なのでitemをpushメソッドで値に追加する。
※pushメソッドは配列の後尾に引数の値を追加するメソッドです。

### ④蓄積した値を返す
```typescript:index.ts
  // ④
  return acc;
```
returnで蓄積値を返してあげることで、次の繰り返し時にaccが蓄積された状態になる。

### まとめ
オブジェクト型データの値がカテゴリ毎に存在している場合、reduceメソッドで各種カテゴリの配列を作成することが可能。

今回は自作APIを叩いて受け取った値が上記の形でしたが、API側でカテゴリ毎に出力するエンドポイントを作ってあげれば解決するので、今後はそのように変更していきたいです。