OmniAICreator/Qiita-1.07M huggingface dataset:
体調管理(最高の体調)

みなさんこんにちは！

この記事では体調管理について、書いていきます。

## 記事作成のきっかけ
記事作成のきっかけは、現場の方々と体調について頻繁に話をしていたことから、体調に悩みを持つエンジニアの方が多いのではないかと感じたことです。

そこで、面白かった体調管理に関する本の紹介と数ヶ月実践してみた感想を記事にしようと思いました。

皆さんの健康管理に、少しでも参考になれば幸いです。

## 書籍紹介
紹介する本は以下です。
- 題名：[最高の体調](https://www.flierinc.com/summary/1691)
- 著者：鈴木 祐

この書籍の内容をざっくりまとめると、以下のようなことが書いてます。
- 現代人の生活における不調の主な原因は、**文明病**である
- 文明病を癒すために、身体に適した生活をしましょう

以下で、もう少し詳細にしていきます。

### 文明病とは
本書は、進化医学の観点から体調不良の原因を説明しています。
人類の歴史を見ると、誕生から600万年間は狩猟採集生活を営んでおり、農耕生活に移行したのが1~2万年前、産業革命が起きたのが250年前、デジタル化はつい数10年前です。
人類の身体は長い時間を過ごした狩猟採集生活に適したものにできています。一方で、人類の取り巻く環境は産業革命以降に急速に変わってしまいました。
現代人の身体が現代の環境に適応できていないことが体調不良の原因であり、本書ではこれを文明病と呼んでいます。
したがって、文明病を癒すためには、狩猟採集民のままである私達の身体に合わせた生活が大切であると書かれています。

本書では、具体的なアドバイスが複数書かれていますが、ここでは私が実践している運動、睡眠、腸について記載します。

### 運動
狩猟採集民は毎日獲物を追って移動を続けてきました。１日におよそ1万～2.5万歩の移動が当たり前でした。一方、現代人の多くはデスクワークに従事しています。
狩猟採集民に合わせてもっと運動しようという提案がなされています。
運動の効果は身体的にも良く、ストレス改善にも有効です。

### 睡眠
狩猟採集民の平均睡眠時間は７~８時間で、太陽の運行とともに入眠・起床をしていました。
それに合わせて、現代人も７~９時間は寝ることが推奨されています。
睡眠は身体の疲労回復に加え、ストレスを軽減する働きがあります。

### 腸
腸には乳酸菌などの腸内細菌が住んでおり、栄養吸収を助け、細菌などの外敵から守る健康に欠かせない役割を担っています。
腸内細菌は食物繊維を餌として繁殖しますが、現代人の食物繊維摂取量は減少しています。1日の摂取量は、日本人で13〜17g程度ですが、狩猟採集民は42gも摂取していました。
詳しくは省きますが、現在の環境が原因で現代人は腸内細菌の種類も減少しています。
種類も餌も減っている現代人の対策として、種類を増やすために納豆・キムチ・ヨーグルトなどの発酵食品、餌を増やすためにごぼう・きのこ類・りんごなどの水溶性食物繊維を食べることが推奨されています。

## 実践していること
私は数ヶ月ほど、上記の3つについて生活に取り入れることを実践してきました。
基本的に三日坊主な性格なので、なるべく続けられるように自分なりに工夫をしてきました。
ここでは、具体的な実践内容と続けてみての感想を記載します。

### 運動
朝起きたら10分ほどジョギングすることを続けています。
工夫として、以下が自分には合っていました。
- 行うタイミングを固定する
- 準備をなくすため、寝起きのまま走る
- 時間を最小限にするため、家の周りを走る

続けてみた感想は、朝走るのはとにかく気持ちがいいです。
ストレス解消に繋がっているのではないかと感じています。

### 睡眠
7時間以上は寝ることを続けています。
工夫として、以下が自分には合っていました。
- 原則の寝る時間と起きる時間を固定する
- 寝る前は間接照明にする

続けてみた感想は、自分は8時間睡眠の時が体調が良いということです。
6時間程度だと日中すっきりしないと感じます。

### 腸
発酵食品として納豆と味噌、たまにキムチを食べ、水溶性食物繊維として、もち麦を食べています。
工夫はめんどくさいを防ぐため、調理を最小限にすることです。
納豆、キムチは調理不要で、味噌は出汁入り味噌をお湯に溶かして味噌汁として飲んでいます。もち麦は、お米と一緒に炊けば良いだけで非常に簡単です。

続けてみた感想ですが、効果の実感は特にありません。
自分の知らないところで腸内細菌が活発になっていることを期待しています。

## おわりに
本記事では、詳細を省いてますので、興味を持たれた方は書籍を読んでみてはいかがでしょうか。
この記事が皆さんの健康管理において、少しでもお役に立てれば幸いです。
メモリ消費の削減を試してみた話

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

# はじめに
先日、[Android Dagashi](https://androiddagashi.github.io/issue/304-2023-12-03/)さんの中で[65% Smaller APKs and 70% Less Memory: How I Optimized My Android App -Part II (App Memory)](https://medium.com/@tarunanchala/65-smaller-apks-and-70-less-memory-how-i-optimized-my-android-app-part-ii-app-memory-d4e652cf2c49)という記事がリストアップされていました。ご覧になった方も多いのではないでしょうか。

私も同記事を読んでみたところ、参考になるTipsが多く含まれていました。
そのため、自身が携わっているアプリで試してみることにしました。

# 計測する
記事に倣って、現在のメモリ消費量を計測します。
今回は手元のデバック環境で試すだけのため、Android Profilerを使用します。

Galaxy SC-51D（Android 13）を使用し、画像を大量に読み込む操作を行ったところ、操作時のメモリ消費量は**580MB**前後でした。
本来は丁寧にボトルネック箇所を探すべきですが、今回は勉強も兼ねて記事の内容を試してみましょう。

# 手法を試す
記事で紹介されている手法の内、以下の3つを試しました。
1. カラーフォーマットの変更
2. offScreenPageLimitの変更
3. onViewRecycled時のリクエストのキャンセル

## 1. カラーフォーマットの変更
対象のAndroidアプリはCoilとPicassoを使用しているため、以下のようにコードを追加しました。

```Kotlin
// Coil
 ImageRequest.Builder(LocalContext.current).data(url).apply {
    // 省略
    allowRgb565(true)
```

```Kotlin
// Picasso
// インスタンス生成時にconfigを渡す
Picasso myPicasso = new Picasso.Builder(this.getContext()).defaultBitmapConfig(RGB_565).build();
```

再度計測すると、535MBまで減少しました🎉
||Before|1|
|-|-|-|
|消費量|580MB|535MB|


## 2. offScreenPageLimitの変更
offScreenPageLimitを2に設定している箇所があったため、1に変更します。
※コードは省略します

再度計測すると、525MBまで減少しました。
カラーフォーマットほどではありませんが、効果があるようです。
||Before|1|1 + 2|
|-|-|-|-|
|消費量|580MB|535MB|525MB|

## 3. onViewRecycled時にリクエストをキャンセルする
RecyclerViewの中でPicassoを使用しているため、以下のようにコードを追加します。

```Kotlin
public class MyRecyclerView extends RecyclerView {
    // 省略
    @Override
    public void onViewRecycled(@NonNull HogeViewHolder holder) {
        Picasso.get().cancelRequest((ImageView)holder.itemView);
    }
}
```

再度計測すると、今回は増加してしまいました。
||Before|1|1+2|1+2+3|
|-|-|-|-|-|
|消費量|580MB|535MB|525MB|555MB|

詳しい原因は追えていませんが、今回は1+2の組み合わせが効果的なようでした。

# さいごに
今回は[65% Smaller APKs and 70% Less Memory: How I Optimized My Android App -Part II (App Memory)](https://medium.com/@tarunanchala/65-smaller-apks-and-70-less-memory-how-i-optimized-my-android-app-part-ii-app-memory-d4e652cf2c49)で紹介されている手法の一部を試してみました。

その結果、以下の通りにメモリ消費量を削減できることが分かりました🎉

||Before|After|
|-|-|-|
|消費量|580MB|525MB|

画像の扱いに悩んでいる方は是非元の記事をご参照ください！


# 参考URL
- https://medium.com/@tarunanchala/65-smaller-apks-and-70-less-memory-how-i-optimized-my-android-app-part-ii-app-memory-d4e652cf2c49
AtCoderのFortranでfortran-stdlibが使えるようになったので何が楽になるかを考える

# AtCoderとは?
競技プログラミングを主催している会社.
そこでは毎週土曜日くらいの21:00からプログラミングコンテストが開かれているとか.
## 参考
https://atcoder.jp/

ログインすればAtCoder上のコードテストでこの記事のコードを実行できる.
<https://atcoder.jp/contests/practice/custom_test>
ログインしないならこっち.
<https://play.fortran-lang.org/>

# Fortranとは?
- 主に大規模数値計算で使われる言語.
- 速い
- 組み込みには連想配列や可変長配列どころか**ソートすらない**.
## fortran-stdlibとは?
Fortran-langコミュニティが実装しているライブラリ.

https://github.com/fortran-lang/stdlib

AtCoderではこの前(2023年夏頃)の言語アップデートで使えるようになった(参考: <https://img.atcoder.jp/file/language-update/language-list.html>).
## 参考
https://stdlib.fortran-lang.org/

https://qiita.com/implicit_none/items/6fc196bd96fb5495ed44
# 何ができそうか
## [implicit_none さんの記事](https://qiita.com/implicit_none/items/6fc196bd96fb5495ed44)をじーっと見る.
### とりあえずバージョンを調べる.

```fortran
program check_version
  use stdlib_version
  implicit none
  write(*, *) stdlib_version_string
end program
```
結果
入力
(なし)
出力
 0.2.1
 
### ソート
- AtCoderではソートした方が考えやすい問題が出題されることある(頻出?).
  - 順序を無視しても解が変わらない問題.
  - 小さい方(大きい方)から貪欲に処理する問題.
  - 配列上の2分探索.
  など

`use stdlib_sorting` して `call sort(arr)` をするだけ!
```fortran
program sort_problem
  use stdlib_sorting
  implicit none
  integer :: arr(5) = [5, 3, 4, 2, 1]
  call sort(arr)
  write(*, *) arr(:)
end program sort_problem
```
結果
入力
(なし)
出力
           1           2           3           4           5

### 文字列
- AtCoderでは[長さが正確に分かっていない文字列を入力とする問題](https://atcoder.jp/contests/abc328/tasks/abc328_d)が出題されることもあるので, `character(len=200000)` のように文字の長さを決め打ちする必要がある.
  - 文字列型に入力を読み込むことで, 長さの決め打ちを止めたいが...
  - [`type(string_type)` の入力に問題](https://qiita.com/implicit_none/items/a6a2bf0e7ad916f25068)があるらしく, AtCoderの入力を読み込むことはできないかもしれない...
  - 下のソースコードでは改行がないので, 入力の途中で `End of file` に到達してエラーになる.
```fortran
program string_problem
  use stdlib_string_type
  implicit none
  type(string_type) :: str
  read(*, *) str
  write(*, *) str
end program string_problem
```
結果
入力
hello
(改行1つ)
出力
エラー

入力
hello

(改行2つ)
出力
 hello

 ## [fortran-stdlibのドキュメント](https://stdlib.fortran-lang.org/)をじーっと見る
 ### 連想配列
 - AtCoderでは連想配列は言語に備わっていて当然のような雰囲気がある(偏見?).
   - 文字列の種類数を求められる.
   - 10^9などの巨大なインデックスに対応する配列のように扱える.
   - 数値が既に存在しているかを調べられる.
など, 多様な使いみちがある.

Fortran-stdlibでの連想配列は以下のように使うことができる.
連想配列の`キー`は `character` と `integer(int8)の配列` を使うことができ, `値`はなんでもOK.

```fortran
program hashmap_problem
  use stdlib_hashmaps 
  use stdlib_hashmap_wrappers
  implicit none
  type(chaining_hashmap_type) :: m
  type(key_type) :: key
  type(other_type) :: val
  call m%init(fnv_1_hasher)
  call set(key, "hello")
  call set(val, 5)
  call m%map_entry(key, val)
  call m%get_other_data(key, val)
  select type(v => val%value)
    type is (integer)
      write(*, *) v
  end select
end program hashmap_problem
```
入力
(なし)
出力
           5
# 結論
- ソートは楽に使える.
- ハッシュマップは...可能性は未知数である.
  - 使うのに慣れが必要であろう.
  - 実装に `class(*), allocatable` が使われているため速度の確認も必要かもしれない.
Chromeで「この接続ではプライバシーが保護されません」と表示されてアクセスできない時に確認すること

## はじめに
今回は、ちょっとしたモヤモヤを解決する記事です。

## 事象

普段、正常にアクセスできるページでも、たまに「この接続ではプライバシーが保護されません」と表示され、なぜか繋がらない事象が発生する時がございます。

![スクリーンショット 2023-10-24 14.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477555/0b220641-808b-9ef1-e529-d727d46a1c5e.png)

この事象について対処法をご紹介いたします。

## 事象について確認
- 普段アクセスしているサイトで、「この接続ではプライバシーが保護されません」と表示され、アクセスができない。
- 周りの人にアクセスしてみてもらうと正常にアクセスできる
- リロードするとアクセスできるようになる時がある
- ダメな時は、何をやっても接続できない
- 時間が経過してから接続すると、アクセスできたりする
  - アクセスできると、迷宮入りする

※証明書は正しいこと、有効期限が切れていないことは前提になります。

## さきに結論
ブラウザからHSTSの設定を削除すると、アクセスできるようになる可能性がございます。

### 手順 
#### 1. Chromeで設定画面にアクセス
URLバーに下記を入力してアクセスし、設定画面を表示します。
`chrome://net-internals/#hsts`

![スクリーンショット 2023-12-11 18.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477555/3718853c-5cc9-5b4e-233d-ccb9304b9f0f.png)

#### 2. HSTSの設定が登録されているか確認
「Query HSTS/PKP domain」の見出しのDomain入力欄に、対象となるドメインを入力して、Queryボタンを押してみましょう。

例）qiita.comの場合
Found と表示されて、設定値が表示されています。
dynamic_sts_domainに、qiita.comが登録されていますね。

![スクリーンショット 2023-12-11 18.43.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477555/3a85e191-c21c-ec61-0112-4c6c428f5662.png)

#### 3. HSTSの設定を削除
「Delete domain security policies」の見出しのDomain入力欄に、対象となるドメインを入力して、Deleteボタンを押してみましょう。

例）qiita.comの場合
ボタン押しての特にメッセージは出ません。

![スクリーンショット 2023-12-11 18.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477555/deee8993-fe73-a1e2-c717-ba4d194bd9f9.png)

#### 4. 再度、2の手順でHSTSの設定を確認

例）qiita.comの場合
今度は、Not Foundと表示されました。
 ![スクリーンショット 2023-12-11 18.44.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477555/3f300dd7-d768-fff1-89ab-e42eab18d4ad.png)

#### 5. WEBサイトにアクセスして確認
接続できるようになりましたでしょうか。

※解消しない場合は、今回の事象とは別の理由が考えられますので、こちらを参照ください。
[Google chrome ヘルプ](https://support.google.com/chrome/answer/6098869?hl=ja)



## 補足
### HSTSとは？

https://developer.mozilla.org/ja/docs/Glossary/HSTS
> HTTP Strict Transport Security を使用すると、ウェブサイトはブラウザーに、HTTP を使用してサイトを読み込まないことと、HTTP を使用してサイトにアクセスしようとするすべての試みを HTTPS リクエストへ自動的に変換する必要があることを通知することができます。

httpで接続した時に、自動でhttpsにリダイレクトするサイトがあると思いますが、それを事前にブラウザにドメインを設定しておくことで、ブラウザ側でやってしまおうという設定です。
最初から安全なhttps接続ができることと、サーバに対して余計なアクセスを減らすことができます。

### Chromeの対応

https://news.mynavi.jp/techplus/article/20231031-2807397/
> GoogleがすべてのChromeユーザーに対し、HTTPリクエストを自動的にHTTPSリクエストに変更する「HTTPSアップグレード」を開始したと報じた。

どうやら、サーバ側でHSTSの設定をしなくてもChromeが、良い感じで対応してくれるようです。


## おわりに
たまに起きるからこそ厄介なことってありますよね。そんな些細なストレスを解決する引き出しを持っておきましょう。

また、アップデートにより自動でHSTSのようなことをChromeが勝手にやってくれるようになったことを知りました。たまに余計なお世話な時もありますが、いざおかしなことになった時に、裏側で何が起こっているのかを知っておくことは大事なことですね。

※ちゃんと検証、原因特定ができておりませんので、事象の再現手順がわかる方いれば教えてください。
これからのプロダクト開発に必要なスキル「問いかけ」の作法

この記事はZOZOアドベントカレンダー Series1 12日目の記事です。

大変な時代になりました。現代はVUCA時代と言われています。つまり、「**先行きが不透明で将来の予測が困難な時代」が今の時代です。**

一度ヒットすれば売れ続ける、テクノロジーを詰め込めば売れる時代ではなく、何がヒットするのか生産者も消費者もわからないような時代です。

そんな時代にあって、最近のプロダクト開発では、「アジャイル開発」が主流となっているのは改めて言う必要はないでしょう。

予測困難な時代にあって、柔軟に方向転換しながら開発をしていく手法はすごく理にかなっています。

アジャイル開発では、方向を定めながら、できるだけ早く顧客に製品を届け、方向が正しいか検証を素早くしていくため、組織の構造にも目を向ける必要があります。

「プロダクトマネジメント　ビルドトラップを避け顧客に価値を届ける」では、予測困難で不確実性が高い問題に対処するために「プロダクト主導組織」を推奨しています。

「セールス主導組織」で顧客からの要望を個別に取り入れていけば、いつか成長する余裕がなくなる。「ビジョナリー主導」ではビジョナリーが去ったあとの持続性がない、「テクノロジー主導」ではマーケットの価値主導の戦略に欠けます。

そこで、「プロダクト主導」、つまり、ビジネスのアウトカムに着目し、プロダクトの戦略を自分たちの目標に合わせて調整していく。問題に取り組むのはビジョナリー一人ではなく、プロダクトにコミットした多くのメンバーの頭脳で解決していくということです。

さて、そういった組織を目指していくために必要なものがコミュニケーションです。

プロダクトのビジョンをどう位置づけるか？チームをもっと良くしていくためにはどうするか？何を仮説として定義して次に何を作り実験していくか？

プロダクトにコミットした多くのメンバーの頭脳を元にそれらを解決していくなら、コミュニケーションを通してこれらの問にどう向き合うかが大事です。

そのために必要なのはファシリテーションの力です。

なぜなら、どのような問をメンバーに向けて発するかでその答えが大きく変わってくるからです。問が悪ければ誰も何も答えられず無言の時間ばかりが過ぎていくかもしれません。

「問いかけの作法」という本が参考になります。

この本でも言い方は異なりますが、経営層が問題を定義して現場メンバーが解決策を磨き続けるファクトリー型、いわるゆ「ビジョナリー主導」の組織ではなく、問題を発見し、解決策を模索していくのは現場メンバーであるというワークショップ型、「プロダクト主導組織」がVUCAの時代には有効であると言っています。

この本ではそれを踏まえ、ファシリテートする際にどのように問を発していくのが良いか多くの例を紹介しています。

その中で、自分でもすぐ実践でき有効な問の作法を一つ紹介します。

振り返りなどで中々意見が出ない場合に「適度な制約をかけ、考えるきっかけを作る」というテクニックです。

単純に「改善したいことはありますか」では考える範囲が広く中々有効な意見は出てきません。そこで「今日一日ではどうですか？」や「点数を付けるとしたら何点？満点でなかったところは？」など考える範囲を狭めてあげると意見が出やすくなります。

ぜひ参考にしてみてください。

問の作法を身に着けて「プロダクト主導組織」「ワークショップ型」のチームづくりをしていきたいですね。
Fusion360 CAM 使用方法 メモ

fusion360 CAM の使用方法メモ

# 言葉の意味

```
ストック・・・材料,設定時に「ソリッドから」を選択することで，事前に準備したモデルにすることも可
粗取り・・・大まかな切削
2Dモード・・・スケッチや輪郭を指示することでパスを生成するモード.(※ スケッチ等しかみないため，穴の深さなどモデル形状を見ないパス生成.）
3Dモード・・・3Dモデルを使用したパス生成.
ワーク座標系・・・CAM座標系.機械側ワーク座標系と一致する.
```

# 切削方法の選択
## 粗取りをしたい

[3D]-[負荷試験]

## 面の平面を出したい

[2D]-[平面]

ストックの高さからワークの高さまでの表面切削パス生成などができる

## 削り出しをしたい

[2D]-[輪郭] 

板から形状を切り抜いたりできる

# CAM切削設定例
## プローブの切削

https://www.youtube.com/watch?v=QMow7wb0fDY&list=LL&index=2&t=5s

使用機器: 中華CNC

### 2D輪郭

- 工具
2mmフラットエンドミル
主軸回転速度: 10000rpm
ランプ主軸回転速度: 10000rpm
切削送り速度: 200mm/min

- パス
仕上げの送り: 50 mm/min
複数深さON: (最大あらとり切り込みピッチ) 0.1mm, 

### 2D負荷制御

### 2D輪郭
### 面
### 2D輪郭


# 参考

https://cad-kenkyujo.com/tutorial/fusion-360-cam/

https://www.kazuban.com/blog/fusion360-cam/

https://www.youtube.com/watch?v=5bU_YmRw2z0&t=4s

https://fusion.onefish-lure.com/2019/08/15/fusion360-cam5/
TwitterでJavascriptを使って内部APIから得られた情報を取得する方法

# はじめに
拡張機能を開発している中でTwitterのAPIの情報を取得するのに困って調べてみましたが、
調べた感じ詳しいやり方がよく分からなかったので調べて出てきた情報を元に調査しました。
## 注意
2023/12/11時点で検証した内容です。
今後Twitter側で変更があった場合に使えなくなる可能性があります。
また、この記事では任意のツイートの情報を取得するわけではなく、
現在アクセスしているページの中にあるツイートの情報を取得するものです。
得られる情報は内部APIから取得したデータと同等と思われます。
## Twitter内部APIにはアクセスしない方がいい
まず、Twitterの内部APIにはアクセスしないほうがいいです。
Twitter側の変更でAPIの通信に必要なパラメータが変更された際、
凍結やShadowBANの危険性があるので特に理由がない限りやめておいた方がいいです。
そのため、今回はアクセスしたページにある情報を使ってツイートの情報などを取得します。
## 仕組み
Twitterでは、React Propsにデータを保存しています。(多分)
このReact Propsにアクセスすることで、データを取得できます。
## ツイートの取得方法
ツイートの大本のオブジェクトには、`data-testid="cellInnerDiv"`というプロパティが付けられています。
そのため、まずは取得したいツイートのオブジェクトを取得しましょう。
(ここでは仮にtweetelementという変数に保存したと思います。)
その後、データが保存されているエレメントを取得するにはこのようなquerySelectorを使用します。
(tweetdataelemはお好きな変数名に変えてください。)
```javascript:データが保存されているエレメントを取得
const tweetdataelem = tweetelement.querySelector("div[role='group'][id]");
```

それでは次に、React Propsを取得していきましょう。
この場合、このようなコードで取得できるようです。
```javascript:React Propsを取得
const reactPropsName = Object.getOwnPropertyNames(tweetdataelem).filter((n) => n.startsWith("__reactProps$"))[0];
const reactProps = tweetdataelem[reactPropsName];
```
後はReact Props内のツイートデータを取得すれば終わりです。
```javascript:ツイートデータを取得
const tweetdata = tweetdataelem.children[1].props.retweetWithCommentLink.state.quotedStatus
```
取得した内容は辞書型として使用できます。
ブックマーク数や、そのツイートの投稿者の固定ツイなどまで取得できます。
## ユーザーの取得方法(プロフィール画面)
こちらの場合、```data-testid="UserName"```というプロパティが付いたエレメントを取得してください。(ここでは仮にUsernameという変数名にします)
後はさっきと同じくReactPropsを取得してください。
後はReact Props内のユーザーデータを取得すれば終わりです。
```javascript:ユーザーデータを取得
reactProps.children[1].props.user;
```
内容はツイートデータ内のuserに入っているものと同じとなります。
# おわり
今回は備忘録として書いてみました。
以上です。
# クレジット
こちらのGithubリポジトリを参考に調べています。
https://github.com/Robot-Inventor/shadowban-scanner
また、こちらのページも参考にしています。
https://zenn.dev/roboin/articles/5744ef1ba48c03#react-propsの取得方法
ほとんどこの2ページのコードを参考にしています。ありがとうございます。
(この2つのページがなければ今頃ネット上で彷徨っていました。)
AndroidのActivityを縦固定にする

## 背景
画面の横回転させないようにさせたい。

## 設定
AndroidManifestに`android:screenOrientation`で`portrait`を指定する。

https://developer.android.com/guide/topics/manifest/activity-element?hl=ja#:~:text=%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82-,android:screenOrientation,-%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4

## お悩みどころさん
Activity毎の設定しかできない？
アプリケーション内で一括で設定できないかな…
Androidでキーボード入力時にUIをずらす

## 背景
キーボード入力時にUIにキーボードが被らないようにしたい。

## 設定
Android ManifestにUIの対応方法を指定する。
`windowSoftInputMode`に`adjustResize`を指定する。
https://developer.android.com/develop/ui/views/touch-and-input/keyboard-input/visibility?hl=ja#Respond

```
<application ... >
   <activity
       android:windowSoftInputMode="adjustResize" ... >
       ...
   </activity>
   ...
</application>
```


## 結果
キーボード領域分だけUIがずれるようになった。
もくもく会の参加時に持って行って良かったもの5選

## 対象読者
* これからオフラインのもくもく会へ参加しようと思っている方々

もくもく会に馴染みがないと雰囲気など色々わからないことが多いかと思います。
そんな方の一助になれば幸いです。

## 本題：もくもく会に持って行っていくといいもの
### サブディスプレイ
![3676207_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634780/a836a0da-6aa2-149d-343c-754c64f23567.jpeg)
すでにデュアルディスプレイで作業している方はわかると思いますが、作業効率が段違いです。
また、最後に成果報告がある会の場合はサブディスプレイ側を共有して発表ができるので便利です。
そもそももくもく会で1人に割り当てられるスペースってそんなにあるの？と思われるかもしれませんが、多くの会場では十分にスペースを確保できました。
ただコンセントは1人1つのことがままあるので、電源をPCと共有できるものの方が安心です。

自分はPCとディスプレイを繋ぐケーブルを忘れたことが2,3回あります。
邪魔な鉄板と化すのでくれぐれもケーブル含めて忘れないように気をつけましょう。

### マウスパッド
![4433300_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634780/ef29d9df-cf03-8171-1999-ad835aed75ad.jpeg)
レーザーマウスやLEDマウスを使用する場合はあるといいです。
お洒落な会場だとテーブルが生木だったりガラスだったりして、パッドなしだとマウスがまともに使えない場合があります。
もちろんトラックボール使用者だったり、トラックパッドで十分な方なら不要。

### 長めの充電ケーブル
![28083015_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634780/356224fb-c0fd-f580-5ae0-4bffee66b3b1.jpeg)
会場によっては少ないコンセントに多数の延長ケーブルを生やして配電していることもあります。
特に開催自体が初めての会場だったりすると配電が見落とされがちで、短い充電ケーブルだと苦労することが多いので、複数種持っているのであれば一番長いものを持っていきましょう。

### ヘッドホン・イヤホン
![24983984_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634780/955be09f-129c-5dac-47db-121bda21d942.jpeg)
Web関連ではあまりないかと思いますが、アプリやゲームの作成で音関連の作業をする場合には必須です。
あと常連の人たちが盛り上がってうるさくなった時（本当にごめんなさい）にも作業に没頭するために必要です。

### HDMIの変換プラグ
![4527613_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634780/9c220875-c99d-da9e-0f14-519b9c7aa18c.jpeg)
成果発表がプロジェクターを接続して行う場合、HDMIケーブルしかない場合があります。
一方でHDMIに対応していないノートPCも少なくありません。
Type-Cに変換できるプラグがあると勇者になれます。

## 最後に
以上、自身の経験上からもくもく会に持って行って良かった・助かったものを挙げてみました。
進捗を出すのがもくもく会の本分なので、どうせならしっかり準備して最大限の効率を目指しましょう！
Pythonで「リストの要素を取得する」の動作を確認してみた

# 概要

Pythonで「リストの要素を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/list/index2.html

# 実装

以下のファイルを作成しました。
```sample.py
colorlist = ["Red", "Blue", "Green"]
print(colorlist[0])
print(colorlist[1])
print(colorlist[2])
colorlist = ["Red", "Blue", "Green"]
print(colorlist[-1])
print(colorlist[-2])
print(colorlist[-3])
#colorlist = ["Red", "Blue", "Green"]
#print(colorlist[3])
print(colorlist[len(colorlist) - 1])
colorlist = ["Blue", "Red", "Green", "White", "Black"]
print("最初の要素は " + colorlist[0] + " です。")
print("最後の要素は " + colorlist[len(colorlist) - 1] + " です。")
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Red
Blue
Green
Green
Blue
Red
Green
最初の要素は Blue です。
最後の要素は Black です。
```

# まとめ

何かの役に立てばと。
Magento 2 のヘッドレスコマース

Headless Commerce（ヘッドレスコマース）は、Magento 2で採用されるモデルの一つで、フロントエンド（UI/UX）とバックエンド（データ処理）が独立しているアーキテクチャです。これにより、異なるデバイスやプラットフォームに対応するための柔軟性が向上し、より洗練されたユーザーエクスペリエンスを提供することができます。

![Magento 2 のヘッドレスコマース Headless Backend](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622272/1667dcaf-842a-6cbf-db1c-c9e47f7784f2.png)

以下は、Magento 2 Headlessを使用して商品を購入する一般的な手順です。

### 1. フロントエンドの構築

あなたのウェブサイトやモバイルアプリなど、選択したフロントエンドアプリケーションにアクセスします。これは、React、Vue、Angularなどのフレームワークで構築されているか、Magento PWA Studioを使用している可能性があります。

![Magento 2 のヘッドレスコマース React、Vue、Angular](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622272/7a6f2a7f-67da-60b4-9071-e7ecd2518f57.png)

詳細については、https://developer.adobe.com/commerce/pwa-studio/ をご覧ください。

### 2. 製品の閲覧

ユーザーは製品を閲覧し、商品ページで製品の詳細を確認します。これには、GraphQLを使用してMagento 2のバックエンドからデータを取得するプロセスが含まれます。

GraphQL へのご参考:
https://developer.adobe.com/commerce/webapi/graphql/schema/products/queries/products/ 

### 3. ショッピングカートに商品を追加

ユーザーが製品を選択すると、ショッピングカートに商品が追加されます。これには、GraphQLを使用したバックエンドへのデータの送信が含まれます。

GraphQL へのご参考:
https://developer.adobe.com/commerce/webapi/graphql/tutorials/checkout/add-product-to-cart/ 

### 4. ショッピングカートの管理

ユーザーはショッピングカートを管理し、商品の数量を変更したり、商品を削除したりできます。ショッピングカートに関連するデータはGraphQL経由でバックエンドに送信されます。

GraphQL へのご参考:
https://developer.adobe.com/commerce/webapi/graphql/schema/cart/queries/cart/ 

### 5. 支払いのプロセス

ユーザーが支払いプロセスを開始すると、GraphQLを使用してMagento 2のバックエンドに支払い関連のデータを送信します。

GraphQL へのご参考:
https://developer.adobe.com/commerce/webapi/graphql/tutorials/checkout/ 

### 6. 注文の確認

ユーザーが購入プロセスを完了すると、注文が確定され、注文情報がMagento 2のデータベースに保存されます。これには、GraphQLのミューテーションが含まれます。

GraphQL へのご参考:
https://developer.adobe.com/commerce/webapi/graphql/schema/customer/queries/orders/ 

これは一般的なMagento 2 Headlessでの購入プロセスの例です。ただし、具体的な実装は使用しているフロントエンドテクノロジーやビジネスの要件によって異なる可能性があります。
プログラミング言語Go 1Dayブートキャンプ に参加して

![Advent Calendar 2023 Template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618539/1832138c-67bb-ca66-f327-8a8eeb83ea8f.png)
[Chompy Advent Calendar 2023](https://qiita.com/advent-calendar/2023/chompy) の12日目です。

はじめまして。
ChompyでBIZアシスタントをしたり、コーポレートをしたり、エンジニアに転向したりしている吉田です。
経歴が怪しいですが、気になる方は[Podcast](https://open.spotify.com/episode/0OlqreJHXl6a6iFJQ2nI6n?si=onHc9kQjSGW1ud9iFFhRfA)をチラ聞していただけると経緯を話していたりします。

# プログラミング言語Go 1Dayブートキャンプ

Go初心者なのでさまざまな形で勉強しているのですが、
先日ブートキャンプへ参加する機会をいただけたので、感想について記載したいと思います。

https://womenwhogo-tokyo.connpass.com/event/299721/

内容をご紹介する前に、
機会をくださったWWGTスタッフのみなさま
講師＆資料の公開について快く許可くださったtenntennさん
場所の調整してくださったいりこさん
場所を提供してくださったHRBrainさん
本当にありがとうございました。

# ブートキャンプの概要

概要をざっくりご紹介します。

- [スライド](https://tenn.in/go)
Goを勉強する人ほとんどが見たことであるであろうスライドです
こちらで基本を復習、ハンズオンに関わる部分について抜粋してご説明いただきました

- [ハンズオン](https://github.com/gohandson/genai-ja)
chatGPTをつかってみよう！ということで色々遊んでみました

- [connect](https://connectrpc.com/docs/go/getting-started/)
Getting startedを進めながら概要を学びました

# 感想

具体的な内容を誤りなく書けるほど自信がないので
1日を通して私が印象に残ったことや感じたことを記載します。

- ブートキャンプに取り組む心構え
”いろんな方を教えた経験があるのでどんな質問でもよいよ””WWGTでは置いていかないよ”という言葉を最初にいただきました。
自分の性質上、置いていかれないように細かいところは後で調べようとしてしまう癖があるのですが、ひっかかることがあっても流さないで突っ込んでみよう！と、課題に取り組む気持ちを最初に作ることができました。
　
- 新しいことを積極的に学ぶ姿勢
プログラミング自体に対して初心者ということもあり、勉強する際は”基礎をしっかり固めてから”という気持ちを持ちがちだったのですが、
新しいものに対して積極的に触って動かしていくことの楽しさを感じることができました。
　
- Goは積み上げられるという話
Goはメジャーバージョンが変わっていないため、ほかの言語と比べるとやり続ければ積み上げていけるよ的なニュアンスの言葉がありました（正確でなかったらすみません）
周りと自分の差に腰がひけてしまう時もありますが、今からでもコツコツ積み上げて良いコードが書けるようになりたいと強く思いました。
　
- さまざまな人と交流できる楽しさ
コロナ禍を過ぎてから勉強を始めたこともあり、今まではオフラインのイベントにあまり参加できていませんでした。
今回は業種・業務内容・環境・経歴など、本当にさまざまな方が参加されており
特に非エンジニアの方が独学で勉強されているお話や未経験からコツコツ積み上げている方のお話を聞くと、自分も頑張らねば！とモチベーションにつながりました。

# おわりに
はるか昔に手順書や報告書を書いたことはありましたが、記事を書いたのは初めてでした。
会社のみんなで書こう！とハードルを下げて機会をいただけて感謝です。
これから勉強を始める方や、始めてみたけど何をどうすればよいかわからないという方にとって、少しでも参考になる記事になっていると嬉しいです。
[画像生成]Playgroundが凄いらしいので使ってみた

こんにちは！

最近、様々な分野でAIの発展が目覚ましいですね。
画像生成の「Playground」というサービスが凄いという情報を見かけて、試してみました🙂

# Playgroundとは
[公式](https://github.com/zsxkib/playground-v2-1024px-aesthetic)より
diffusionベースの、テキストから画像への生成モデルとのこと。
Playground の研究チームによってゼロからトレーニングされたそうです。

# 使ってみる
インストールしたかったのですが、マシンスペックの問題もあり、まずは[Playgroundのサイト](https://playground.com/)にアクセス。
いい感じのサイトですね。
「Get Started」から始めましょう。

![スクリーンショット 2023-12-11 12.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/366e772e-d417-40cc-8874-67a7b37cac5a.png)

Googleアカウントで登録します。
![スクリーンショット 2023-12-11 12.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/a6bfda54-c30c-2965-415d-384c1164b147.png)

登録直後の画面。様々なイラストが表示されてます。
右上の「Create」から作成しましょう。
![スクリーンショット 2023-12-11 12.01.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/e4ae548e-a464-6a1b-18e4-ceecbdfe9d3c.png)

開始してすぐに凄いと思ったのは、キャンパスサイズを自由に設定できること。
最大1024、最小256のようです。
![スクリーンショット 2023-12-11 12.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/7a334c15-7eea-ee94-f1fc-eecd64aeae38.png)
![スクリーンショット 2023-12-11 12.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/bacc19c5-e680-e064-73b8-94f6bd1f2585.png)

それでは、作成してみましょう。
まずはモデルを選びます。
今回は、宇宙っぽいのを選択してみました。
![スクリーンショット 2023-12-11 12.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/ffee24f5-57e6-d37f-8c57-3e455a4a21ef.png)

宇宙の王になった猫のイメージを作ってみます。
プロンプト：a cat who became the king of the universe
![a-cat-who-became-the-king-of-the-universe-photo-reallistic-8k-112343774.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/96cc0937-b858-d934-00d1-8b047644d117.png)

勇ましいですね！
画像サイズも指定した通りです。

他にも、様々なモデルが用意されており、選択するだけで利用できます。

全く同じプロンプトでモデルを変えて作ってみました。

### モデル：Mysterious V4
これもいいですね。
a cat who became the king of the universe
![a-cat-who-became-the-king-of-the-universe-14626844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/e386814b-77cb-9749-0c20-69f1969cfad9.png)

### モデル：DucHaiten V2
なるほど。凛々しいです。
a cat who became the king of the universe
![a-cat-who-became-the-king-of-the-universe-98523305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/1833cb25-83ef-e68a-2547-2016868d8851.png)

### モデル：Dreamshaper
あれ？
宇宙に包まれてはいますが、ちょっと違うようです。
気持ちよさそうですね。まさに王様気分です。
a cat who became the king of the universe
![a-cat-who-became-the-king-of-the-universe-669552290.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/56c42b8a-11f9-3d6b-b360-c1446ded8e9c.png)
AIも猫は自由だと認識しているのかもしれません。

# まとめ
今回は、話題のPlayground v2を利用してみました。
モデルの活用によって様々な画像を生成できるので、とても便利です。

欲しい結果を得るために根気も必要ですが、生産性は飛躍的に向上するのではないでしょうか。

同様のサービスがどんどん出てくるので、他のサービスも試して、改めて共有します！
ド初心者がAWSとAzureの初級資格を取得した際の勉強方法

## はじめに
筆者はITを専門に学んだというわけではなく、「クラウド？よくわからないけど便利なイメージだよね～」みたいな感じでした。
実際に触っていたのはGoogle Photosなどのストレージサービスくらいです。

そんな**ド初心者がIT系の会社に転職する前に取得した、AWS・Azureの初級資格の勉強方法など**を書いていきます。
「これから学ぼうと思っているけど実際に試験に合格できるのか不安だな…」と思っている方の助けになればと思います。

## 前提
今回は**知識を深めるための資格取得であり、資格を取るための勉強方法ではない**です。
資格をとるためでよいのであれば、Udemyなどで過去問を解きまくるだけでも大丈夫かと思います。

また、勉強期間は、就業時間前後の**1日2～4時間ほどで2ヶ月間**でした。
ちなみに移動時間は最初の2週間ほどはテキスト、あとはずっとUdemyに費やしていました（理由は後述）。

## 勉強方法

大まかには、以下の順で勉強しました。
1. テキストを一読＆社内教育を活用
2. Udemyでとにかく過去問を解きまくる
3. 分からなかったところは調べる／テキストで理解を深める
4. 最後に公式の問題集を解く

具体的には…
　
**1. テキストを一読＆社内教育を活用**
「初心者でも分かる！」的なテキストをとにかく読む＋重要なところはノートに書き写していました。
また、省略されたサービス名が覚えられるか不安だったので、PCは使わず自分の手で書き写してました。
ここら辺は、個人でやりなれた勉強法が良いかと思います。

また、平行して社内教育を受けていました。
AWSは基礎の座学のみ、Azureは基礎の座学＋実際の環境を数時間いじるくらいの教育に参加しました。


**2. Udemyでとにかく過去問を解きまくる**
過去問のテキスト・Webサイトなど色々あるかと思いますが、個人的には**Udemyが使いやすくてオススメ**です。
基本的に問題に解説がついている、かつ操作が直観的なので、移動などのスキマ時間に勉強するのにはもってこいでした。
受講資格に応じてフィルタリングができたり、Q&Aも行えるので、上手く使えば本当に強いサービスです。

以下は筆者がお世話になったUdemy講座（2023年更新）です。
* **これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題300問付き）**
https://www.udemy.com/course/ok-aws-e/
問題集だけでなく、解説動画や実際の環境を映したハンズオンなども豊富で理解しやすいです。
* **AZ-900 Microsoft Azure Fundamentals模擬試験問題集（7回分490問）**
https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/
とにかく問題数があるので、理解というより対策に使えます。正答率80％くらいを目指すのがよいかと。


**3. 分からなかったところは調べる／テキストで理解を深める**
講座で躓く箇所＝テキストで把握出来なかったところが多いと思うので、基本調べる感じになると思います。
筆者はQiitaなどの技術ブログや公式のドキュメント漁ったりしました。


**4. 最後に公式の問題集を解く**
公式の問題集では出題される問題の雰囲気がつかめるので、ある程度Udemyの過去問が解けたらこちらも見ておくとよいです。

## で、試験の結果は？
どちらも合格ではありましたが、AWSはちょっと危なかったです🙄
Azureはぼちぼち点を取れたという感じですね。
また他の資格取得を予定しているので、その時も上記と同じ勉強法で挑む予定です。

## さいごに
勉強法は人それぞれなので、どなたかの参考程度になれば幸いです。
オブジェクト指向について

### クラスとインスタンス
インスタンスは主に`new クラス名()`で生成する。
```javascript
const インスタンス名 = new クラス名();
```

### プロパティとメソッド
クラスを定義するとき
```javascript
class Car {
  constructor (color) {
    // プロパティの定義
    this.color = color;
  }

  // メソッドの定義
  run () {
    console.log(`${this.color}色の車が走る`);
  }
}
```
複数のインスタンスを生成する。
```javascript
const blueCar = new Car('青');
const orangeCar = new Car('オレンジ');
const greenCar = new Car('緑');
```
メソッドは`インスタンス.メソッド()`で呼び出す。

```javascript
blueCar.run(); // blueCarだけ走る
```

### 継承
#### 継承のイメージ
```mermaid
classDiagram
  親クラス --> 子クラスA
  親クラス --> 子クラスB
  親クラス --> 子クラスC

  class 親クラス {
    property
    method()
  }
  class 子クラスA {
    property
    method()
    +methodA()
  }
  class 子クラスB {
    property
    method()
    +propartyB
  }
  class 子クラスC {
    property→propertyC
    method()→methodC()
  }
  ```
>子クラスAはmethodAだけでなく、親クラスのpropartyとmethodも使うことができる。
>子クラスCのようにpropartyとmethodをオーバーライドして機能変更して使うこともできる。

#### 継承のメリット
- コードの重複減らしてコードの再利用性を高めることができる。
- メソッドの追加やオーバーライドで機能拡張できる。

#### 継承の問題点
多重継承問題
```mermaid
classDiagram
  親クラス --> 子クラスA
  親クラス --> 子クラスB
	子クラスA --> 孫クラスA
	子クラスB --> 孫クラスB
	子クラスB --> 孫クラスC

  class 親クラス {
    property
    method()
  }
  class 子クラスA {
		property
    methodA()
  }
  class 子クラスB {
		property
    methodB()
  }
  class 孫クラスA {
		property
    methodA()
  }
  class 孫クラスB {
		property
    methodB()
  }
  class 孫クラスC {
		property
    methodC()
  }
```
:::note warn
①クラスの管理が煩雑になってしまう
②密結合になってしまう。上図だと親クラスを変更すると5つのクラスに影響を及ぼす。
:::

菱形継承問題
```mermaid
classDiagram
  親クラス --> 子クラスA
  親クラス --> 子クラスB
	子クラスA --> 孫クラスA
	子クラスA --> 孫クラスB
	子クラスB --> 孫クラスB
	子クラスB --> 孫クラスC

  class 親クラス {
    property
    method()
  }
  class 子クラスA {
    method()→methodA()
  }
  class 子クラスB {
    method()→methodA()
  }
  class 孫クラスA {
    methodA()子クラスAから継承
  }
  class 孫クラスB {
    [???]()　どっちのmethodA？
  }
  class 孫クラスC {
    methodA()子クラスBから継承
  }
```

:::note warn
孫クラスBのメソッドは子クラスA,子クラスBどちらを継承しているか不透明
:::

:::note
💡継承はオブジェクト指向の特徴だが、強みというわけでもない。
継承よりクラス設計の構成を考える。
:::


### 身近にあるオブジェクト指向
#### 配列
```javascript
let ary = [1, 2, 3];
ary.length; // 長さプロパティを参照
ary.push(4); // 要素を追加するメソッドを呼び出す
```
#### 配列リテラルを使わない場合
```javascript
let ary = new Array(1, 2, 3);
ary.length;
ary.push(4);
```
>Arrayクラスからインスタンスを生成
非技術者の新米プロダクトオーナーになって痛感したこと

開発チーム内の技術的な共有をする場で、(大体)以下の内容で発表しました。
感想文的な発表ですが、自分としては新鮮な学びだったので、せっかくなので記事として公開します！

<iframe src="https://www.slideshare.net/slideshow/embed_code/key/rf5FXIEBz5ue1?hostedIn=slideshare&page=upload" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
古いバージョンのGitLab Ceのインストール

GitLab Ceのサーバー移管をしたかったが、元サーバーのGitLab Ceのバージョンが古すぎた。。
ですが、元サーバーからのバックアップファイルを新サーバーで動かすにはバージョンを合わせる必要があります。

※Linux環境です。

## 必須パッケージのインストール
```
$ sudo yum install -y curl policycoreutils-python openssh-server
```
## リポジトリ追加
```
$ curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
```

## インストール可能パッケージの確認

```
$ sudo yum list --showduplicates gitlab-ce
```
こちらのコマンドにて、yumでインストール可能なgitlab-ceのパッケージが表示されますが、
私が入れたかったバージョンが古すぎてyumでインストールできない

# wget でダウンロード → rpmインストール

https://packages.gitlab.com/gitlab/gitlab-ce
に旧バージョンの情報があるので探す

![スクリーンショット 2023-12-11 18.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869250/ca940933-d0c0-28f7-3773-78243e5ff0f5.png)

### wget でダウンロード
```
$ wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/6/gitlab-ce-10.4.3-ce.0.el6.x86_64.rpm/download.rpm
```

### rpmインストール
```
 $ rpm -ivh gitlab-ce-10.4.3-ce.0.el6.x86_64.rpm/download.rpm
 ```
【Rails】ransackを用いた、ほんのすこし複雑な検索条件(delegate)

:::note warn 
**注記**
この記事の投稿者はRuby on Rails初学者であり、自身の学習の備忘録目的で記事投稿を行なっております。
情報の正確さには最大限注意をしておりますが、もし誤り等がございましたらお知らせいただけますと幸いです。
:::
Ruby on Rails初学者です。
学習の一環として簡単な記事投稿アプリを作成しています！

## 記事投稿の経緯
```gem 'ransack'```を導入して、検索フォームを作成していたところエラーが発生したのですが、```ransack```のおかげで解消できたので備忘録として。

## モデルの内容
ユーザー(```user```)は複数の投稿(```post```)をすることができます。
つまり、```users```テーブルと```post```テーブルは一対多のアソシエーションを設定しています。

ここで少し注意していただきたい点があります。
```users```テーブルは```name```カラムを持っておらず、```profiles```テーブルが```name```を持っている点です。
(```Users```モデルをスッキリとさせるために使用しています）

#### モデル
```ruby:user.rb
class User < ApplicationRecord
  has_one :profile, dependent: :destroy
  has_many :posts, dependent: :destroy # postsテーブルとのアソシエーション
  validates :email, uniqueness: true, presence: true
  validates :password, presence: true, length: { minimum: 8 }, confirmation: true
  delegate :name, to: :profile # Profileモデルのnameメソッドを呼び出し
end
```
```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user # usersテーブルとのアソシエーション
  has_many :comments, dependent: :destroy
  has_many :taggings, dependent: :destroy
  has_many :tags, through: :taggings

  validates :title, presence: true
  validates :body, presence: true
end
```

```rb:profile.rb
class Profile < ApplicationRecord
  belongs_to :user # usersテーブルとのアソシエーション
  validates :name, presence: true
end
```


```User```モデルでは、```profiles```テーブルが持っている```name```カラムを、```delegate :name```を使って呼び出すことができます。
この```Users```モデルをすっきりさせるための```delegate```実装が、のちに悲劇を生むのであった・・・
## どんな問題が発生したのか

```ransack```を用いて、記事を書いたユーザー名で記事を検索可能な検索フォームを作成しました。


```ruby:_search_form.html.erb
<%= search_form_for @q, url: posts_path do |f| %>
  <%= f.search_field :user_name_cont, placeholder: "ユーザー" %>
  <%= f.submit "Search" %>
<% end %>
```



```views/posts　/index.html.erb```で呼び出したところ、```NoMethodError```が発生してしまった。






![37b7558700d3a1fcbd899ee0da092a63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621297/3a2b8ac7-a88e-e71c-835d-2a6929d3b1c8.png)

## なぜエラーが発生したのか
エラーの意味を調べたところ、
「Ransackの検索フォームで使用されている検索条件 ```user_name_cont``` が```Post```モデルに存在しないよ」というエラーのようです。

つまりエラーの原因は
「```name```というカラムは```users```テーブルに存在していないのに
```user_name_cont```という検索条件で値を取得しようとしたこと」にあります。  
  
前述の通り、```name```カラムは```users```テーブルではなく```profiles```テーブルに存在しており、
```delegate```を通して```profiles```テーブルから呼び出しています。

## これで解決
検索条件を```user_name_cont```から```user_profile_name_cont```とすることで、検索機能が意図した動作をするようになりました。
```ruby:_search_form.html.erb
<%= search_form_for @q, url: posts_path do |f| %>
  <%= f.search_field :user_profile_name_cont, placeholder: "ユーザー" %>
  <%= f.submit "Search" %>
<% end %>
```
```:user_profile_name_cont```は```User```モデルを経由して```Profile```モデルの```name```属性を検索するための```ransack```の検索キーです。
```ransack```では、今回のように関連モデルを通じた検索をすることが可能です。
便利ですね。
ただし、しっかりとテーブル同士のアソシエーションが設定できている必要があるので、実装の際には慎重に確認する必要がありそうです！
chrome拡張開発のCORS周りの備忘録

# はじめに
初投稿です。
先日chrome拡張機能を作成したのですがCORS周りがめんどくさかったので記録を残します。
拡張機能の内容としてはマウスで英単語を選択した際に選択位置の右下にCambridge DictionaryへのリンクとWeblio英和辞典から日本語訳を表示させるものです。私は英単語を学習するとき日本語訳をチラ見してから英英辞典を見るという手順をとっているので手間を省くために作成したって感じです。

↓こんな感じ。リンク画像ちょっとずれてる、、
![forQiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629545/fb6a5691-5ed1-6707-a347-9c3542f0e6dc.png)

で、選択した文字列に対応するページが存在することを確認する際と日本語訳を拾ってくる際に`fetch`を使用したんですがこれがCORS制約で弾かれました。調べていくと`manifest.json`周りをいじってやれば解決できそうなのでやってみました。

# やり方

URLの存在確認用コードはこんな感じです。`fetch`の`response`を基に判断しますがCambridge Dictionaryは存在しないページへのリクエストは自動的にトップページにリダイレクトされていしまうので`response.url === url`で返答元が指定したurlかを確かめています。
```js:content.js
function isUrlValid(url,callback){
  fetch(url,{
		method:"HEAD"
		})
    .then((response) => {
      if(response.status === 200 && response.url === url){
		callback(true);
      }else{
        callback(false);
      }
    })
    .catch(error => {
      callback(false);
    });
}
```
ただしこのコードだけではCORSエラーが出ますのでchromeのdeclarativeNetRequest APIを用いて対応します。これは特定のルールに基づいてネットワークリクエストをブロックしたり変更したりできるようにするものらしいです([公式リファレンス](https://developer.chrome.com/docs/extensions/reference/declarativeNetRequest/))。今回は変更で使います。
書き方は下のようにしておけば少なくとも動くとは思います。

```json:manifest.json
"permissions": [
    "declarativeNetRequest"
],
"host_permissions": [
    "<all_urls>"
],
"declarative_net_request": {
    "rule_resources": [
        {
            "id": "1",
            "enabled": true,
            "path": "rules/rule1.json"
        },
        {
            "id": "2",
            "enabled": true,
            "path": "rules/rule2.json"
        }
    ]
}
```
`permissions`はAPIのアクセス許可です。今回は`declarative_net_request`しか使いません。
`host_permissions`には`declarative_net_request`を許可するurlを書きます。一部chromeAPIでは`permission`のほかにこいつが必要になるらしいです。今回は全てのurlからのリクエストが対象となるので`<all_urls>`と書きます。
`declarative_net_request`の`rule_resources`に使用するjson形式のルールファイルへのpathを書きます。複数指定できます。
```json:rule1.json
[
  {
    "id": 1,
    "priority": 1,

    "action": {
      "type": "modifyHeaders",
      "responseHeaders": [
        {
          "header": "Access-Control-Allow-Origin",
          "operation": "set",
          "value": "*"
        }
      ]
    },

    "condition": {
      "urlFilter": "https://dictionary.cambridge.org/dictionary/english/*",
      "resourceTypes": ["xmlhttprequest"]
    }
  }
]
```
`action`にネットワークリクエストに対し何をするかを書きます。今回はレスポンスヘッダの書き換えです。全てのurlからのリクエストに対するレスポンスですので`value`を`*`にしています。
`condition`にそれを行う条件を書きます。`urlFilter`が書き換えの対象となるurlです。`resourceTypes`は`xmlhttprequest`を指定すれば`fetch`もできます。

# 補足
ちなみに後で分かったことですが`fetch`をServiceWorker(要するに`background.js`)で行う場合`host_permissions`の記述は必要ありませんでした。多分そっちが正しいやり方。
IBM i でYumリポジトリをオフラインで使用する


## はじめに
IBM i はRPM（RedHat Package Manager)をサポートしています。Yumを使ってPythonやNode.js、Rといった多様なオープンソースをIBM i 上で利用できます。

しかし、RPMでモジュールをインストールするというのは、インターネットに接続していることが前提の仕組みです。でもIBM iってほとんどのケースでインターネットに接続してないですよね？実はこの点を解決する機能がIBM iユーザーにはお馴染みのACSに実装されています。

ACSを経由して、インターネットに接続したPCからIBM i にRPMパッケージを送り込むことができるのですが、オープン系エンジニアにとっては、ACSを毎回使うのは面倒（!?）ではないでしょうか。そこで、LinuxライクにSSHでYumでいつでもオープンソースを入れられるようにYumリポジトリ―をオフライン化する方法を試したいと思います。

## 目的
この記事のゴールは、
**「インターネットに接続されていないIBM i で、Yum（CUI）を使ったオープンソース管理を実現する」** 
です。


## 検証環境
* IBM i 7.5 on PowerVS
* ACS 1.1.9.0
* Cliet to Site VPN越しにIBM i にアクセス（VPNはVPCがGW）
* IBM i 自体はインターネットへの疎通なし
* PC（ACS）からSSHアクセスを許可

## 手順
ACSを開いて、[アクション] メニューから [管理] -> [オープン・ソース・パッケージ管理] を開きます。
![acs_oss_offline_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/c86723dc-08f4-94e6-77c5-4e85d34e8dc5.png)

システム： IPアドレス or ホスト名
ユーザー： SSH アクセスするUSRPRF
と、パスワードもしくはSSH鍵を指定します。（IBM i のSSHはQSECOFRはデフォルトでは許可されてないので、別ユーザーが推奨）
![acs_oss_offline_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/be9e47d7-b122-32d8-64a7-d5bb842fd293.png)


オープン・ソース・パッケージ管理画面の[ユーティリティー]メニューから[オフライン使用のためにリポジトリ―を複製] を開きます。
![acs_oss_offline_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/88a6bdef-0803-8418-92b6-506cc9e971cb.png)


いくつか設定項目ありますが、今回はデフォルトのまま進めました。
画面中央にある**リポジトリ―の複製** ボタンで開始します。
![acs_oss_offline_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/a881b2e2-f32b-05e8-fbae-8e1af5f78fa1.png)


複製中はモジュールごとに進捗が確認できます。
![acs_oss_offline_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/f0ee5bcb-e84a-40d5-dd0b-6525f67514b0.png)

全部複製するまでにはそれなりの時間がかかります。ネットワーク環境に依存しますが、試した際には20分くらいかかりました。

あまり参考にならないかもしれませんが、リポジトリ複製中のPCのスループットは50Mbps程度がMAXでした。
![acs_oss_offline_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/96dd9e06-2527-521c-2a1c-18486f8016c4.png)

完了するとメッセージが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/ca5af4ec-929c-5656-dc9f-5e761d1ffd46.png)

複製完了時点のIBM i 側のディレクトリサイズは約 3 GBでした。
（/QOpenSys/QIBM/UserData/rpm_repos/ibm の容量）
![acs_oss_offline_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/94bad068-874c-d9eb-7bae-513c77bd2dcc.png)

### オフラインでYumを使う
リポジトリが複製できた後は、インターネットに接続していないIBM iにsshアクセスしてyumコマンドによるパッケージ管理ができるようになります。

https://qiita.com/sugata/items/29b646a946b0c11d290b

### Trouble Shooting
オフラインリポジトリ―を作成したのに、インターネット上のリポジトリにアクセスしようとしてyum installが失敗することがあります。そういったときには、ACSの[ユーティリティー]メニューの
* Clear Metadata
* Rebuild RPM Database

を実行すると機能するようになるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/0d1ac656-8b3f-abd1-9174-b89bb90a5111.png)


### 最後に
オープンソースツールをいつ使いたくなるかはわからないので、IBM iの初期セットアップ時に最新のパッケージでオフラインリポジトリーを作成しておくと良いかもしれません。
windows11 PCでusbデバイスが不安定な場合の対処法

<!-- # windows11 PCでusbデバイスが不安定な場合の対処法 -->

全ての場合に効くかはわかりませんが、ご参考ということで。

USB接続のICカードリーダを使う必要があって、windows11機器に接続したのですが、稀に認識されて動くものの、ほとんど認識されず、認識されても、すぐに認識されなくなるという現象に遭遇していました。windows10機器だと安定して使えますし、それ以前の環境でも、安定して使えていました。USB接続のICカードリーダは、本体側はmini Bで、そんなに新しいものではありませんが、windows11はサポートとメーカーが情報を出しています。

windows11の問題というより、搭載PCのハードウェアの問題な気もしましたが、ならばと、古いUSBハブ経由で繋いでみましたら、嘘のように安定しました。

USBも、どんどん高速化していますから、古くて遅いデバイスとの相性があるのかもしれません。

簡単な方法で解決したので、共有します。
【PHP】Null合体演算子とNull合体代入演算子ってなに？

# はじめに
今回は、Null合体演算子とNull合体代入演算子について、まとめました。

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

# この記事の目的
Null合体演算子 `??` を調べていると、Null合体代入演算子 `??=` を知ったため、アウトプットします。

# この記事の対象者
- PHPを学習されている初学者の方
- `??` って何？となっている方

# この記事の内容
1. `??` Null合体演算子（Null coalescing operator）
2. `??=` Null合体代入演算子（Null coalescing assignment operator）
3. 挙動の確認

# 1. `??` Null合体演算子（Null coalescing operator）

https://www.php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.coalesce

三項演算子やif文を短縮して書くことができます。

- 式であるため、return で参照返しするときは注意
- 演算子の優先順位が低いため、組み合わせで使う時は注意
- ネストで使用することができる

```php
// 書き方
変数 = 対象 ?? 初期値; 

// 上記と同様の三項演算子
変数 = isset(対象) ? 対象 : 初期値; 

// 上記と同様のif文
if (isset(対象)) {
  変数 = 対象;
} else {
  変数 = 初期値;
}

// ネスト
$a = null;
$b;
$c = 0;
$d = 1;
var_dump($a ?? $b ?? $c ?? $d); // => 0
```

# 2. `??=` Null合体代入演算子（Null coalescing assignment operator）

https://www.php.net/manual/ja/language.operators.assignment.php#language.operators.assignment.other

https://wiki.php.net/rfc/null_coalesce_equal_operator

式の中の値を使用し、その値をその式の結果とすることができます。

- Null合体演算子と同一の結果になる

```php
// 書き方
対象 ??= 初期値;

// 上記と同様
対象 = 対象 ?? 初期値; 
```

# 3. 挙動の確認

```php
$value_1 = 1;
$a = $value_1 ?? '初期値';
$value_1 ??= '初期値';
var_dump($a);       // => 1
var_dump($value_1); // => 1

$value_2 = 0;
$a = $value_2 ?? '初期値';
$value_2 ??= '初期値';
var_dump($a);       // => 0
var_dump($value_2); // => 0

$value_3 = "0";
$a = $value_3 ?? '初期値';
$value_3 ??= '初期値';
var_dump($a);       // => "0"
var_dump($value_3); // => "0"

$value_4 = "";
$a = $value_4 ?? '初期値';
$value_4 ??= '初期値';
var_dump($a);       // => ""
var_dump($value_4); // => ""

$value_5 = null;
$a = $value_5 ?? '初期値';
$value_5 ??= '初期値';
var_dump($a);       // => "初期値"
var_dump($value_5); // => "初期値"

$value_6;
$a = $value_6 ?? '初期値';
$value_6 ??= '初期値';
var_dump($a);       // => "初期値"
var_dump($value_6); // => "初期値"

$array_1 = [];
$a = $array_1 ?? '初期値';
$array_1 ??= '初期値';
var_dump($a);       // => []
var_dump($array_1); // => []

$array_2 = [0];
$a = $array_2 ?? '初期値';
$array_2 ??= '初期値';
var_dump($a);       // => [0]
var_dump($array_2); // => [0]
```
【15日目】OSS連携してみたい！(12)PythonRoboticsのpure pursuitをAutowareに移植する(2)

この記事は筆者オンリーの[Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aichallenge_racing_for_mas)15日目の記事です。  

# 前回までのあらすじ
前回は何も考えずに前進するだけのモジュールを作りました
今回はpure pursuitのソースコードをpythonroboticsを参考にして作っていきたいと思います。

## ソースコード
とはいえAutowareにpythonroboticsのソースコードをそのままひっつけて動くほど甘くなく。。。
作りが異なること、python roboticsはpythonなのでC++で動かせないかなあと考えていました。

そこでchatgptでpythonのソースコードをまずは生成することにしました。
chatgptは便利ですね、すぐにコードを作ってくれました。

## 次回
次回はchatgptに作ってもらったコードをAutowareに組み込んでビルドして実際にAutoware上で動かしてみようと思います。
透明に塗りつぶすアプリつくーる（Python、OpenCV）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)14日目の記事です。
昨日は、OpenAIのDALLE2を用いて透明に塗りつぶした領域を画像生成でインペイントしました。今日は、透明に塗りつぶすアプリを作っていきます。

# 開発環境
- Windows 11 PC
- Python 3.11

# 導入
1．ライブラリのインストール
pip install opencv-python

2．プログラムを作成

~~~image_paint.py
import cv2
import numpy as np

# マウスが押されているかどうかのフラグ
drawing = False
# ブラシの初期サイズ
brush_size = 50

# ブラシのプレビューを表示するための一時的な画像
temp_image = None

# ブラシサイズを更新する関数
def update_brush_size(val):
    global brush_size
    brush_size = val

# マウスコールバック関数
def draw_brush(event, x, y, flags, param):
    global temp_image, drawing, brush_size

    if event == cv2.EVENT_MOUSEMOVE or event == cv2.EVENT_LBUTTONDOWN or event == cv2.EVENT_LBUTTONUP:
        # 一時的な画像を元の画像のコピーで更新
        temp_image = image.copy()

        # ブラシのプレビューを表示
        cv2.circle(temp_image, (x, y), brush_size, (0, 0, 0), 3)

        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True

        if drawing:
            # ブラシサイズ分の範囲を透明にする
            cv2.circle(image, (x, y), brush_size, (0, 0, 0, 0), -1)

        if event == cv2.EVENT_LBUTTONUP:
            drawing = False

# 画像を読み込む
image_path = 'woman-2003647_1280.jpg'  # 画像のパスを指定
image = cv2.imread(image_path, cv2.IMREAD_UNCHANGED)

# アルファチャンネルを追加（もし存在しなければ）
if image.shape[2] == 3:
    # RGBからRGBAに変換
    image = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA)

temp_image = image.copy()

# OpenCVウィンドウを作成し、マウスコールバックを設定
cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
cv2.createTrackbar('Brush Size', 'Image', brush_size, 100, update_brush_size)
cv2.setMouseCallback('Image', draw_brush)

while True:
    # ブラシのプレビューを表示するために一時的な画像を使用
    cv2.imshow('Image', temp_image if not drawing else image)

    # キー入力を待つ
    key = cv2.waitKey(1) & 0xFF

    # 's'キーで画像を保存
    if key == ord('s'):
        save_path = 'mask.png'  # 保存するファイル名
        cv2.imwrite(save_path, image)
        print(f"Image saved as {save_path}")

    # 'q'キーで終了
    if key == ord('q'):
        break

# すべてのウィンドウを閉じる
cv2.destroyAllWindows()
~~~

# 実行結果

https://x.com/sotongshi/status/1734130086193062385?s=20

保存したマスク画像はこちらです。

![mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/ccd241af-36cd-9277-88b1-e5991c11b5d2.png)

お疲れさまでした。
[QBCore] "Missing Phrase For Key" の解決法

# まえがき
いつもの如く自分用メモ書き
それでも誰かのお役に立てれば幸いです。

## エラー文の発生状況
今回は "mechanicjob" に関連した `"Missing Phrase For Key"` が発生
具体的には、

```diff_lua
[script:qb-mechanicjob] Warning: Missing phrase for key: "target.duty"
```
みたいな感じ
これが `"target.***"` のような感じに5行くらい続く

![スクリーンショット 2023-12-11 160941.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/b9e04842-3733-580f-8123-d55bdb03ac76.png)

:::note info
`Warning`であってエラーではないが、発生しないに越したことはないので修正していく
:::

## 結論から言うと
言語ファイル(日本語化のため外部から導入した`ja.lua`)が原因だった

外部から導入した`qb-mechanicjob/locales/ja.lua`を開き、
QBCore公式の`qb-mochanicjob/locales/en.lua`と比較すると…

QBCore公式の **qb-mechanicjob/locales/en.lua**
![スクリーンショット 2023-12-11 164901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/e10f68c3-0843-dfb9-d232-e6b292e60517.png)

日本語化ファイル(一応作者の方は伏せてます) **qb-mechanicjob/locales/ja.lua**
![スクリーンショット 2023-12-11 165312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/67e6e9bd-19a2-c308-127c-90fb78586be0.png)

`ja.lua`の方には`target.***`のテーブルが存在せず、QBCore公式のファイルには存在している

:::note warn
それ以外も全然違うので、
このまま導入すると`qb-mechanicjob`関連はほぼ`Missing Phrase...`を出すはず
:::

これが原因なので、`en.lua`から該当部分をコピペで移して、同時に日本語に置き換えてみる

**修正しつつ日本語化**
![スクリーンショット 2023-12-11 165858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/ba136bd1-b896-476f-d377-9cb8892517ca.png)

修正が終わったら保存し、`qb-mechanicjob` リソースを**Restart**してみる
![スクリーンショット 2023-12-11 170213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/861e968e-6716-7e7e-ae96-24695484f113.png)


`target.**`は左Altキーでアクセスできる箇所のローカライズに関する部分なので、
このようにちゃんとショップにアクセスできて、エラーログが出てないなら修正完了

## 解説してみる
トラシューだけで終わっても味がないので、一通りの流れを解説
ただし、そこまで詳しいわけではないため間違っていたら修正コメントお願いします

:::note info
バグトラシューには関係がないのでここから先はスルーしてもOK
:::

### どの処理部からこのWarningが出たか？
`target.**`は`qb-mechanicjob/client/main.lua`の114行目～224行目が呼び出しを行っている
<br>

**例**
```diff_lua
exports['qb-target']:AddCircleZone(k .. '_duty', v.duty, 0.5, {
            name = k .. '_duty',
            debugPoly = false,
            useZ = true
        }, {
            options = { {
                type = 'server',
                event = 'QBCore:ToggleDuty',
                label = Lang:t('target.duty'),
                icon = 'fas fa-user-clock',
                job = v.managed and k or nil
            } },
            distance = 2.0
        })
```

このコードは`qb-target`モジュールを使用してアクセスできるゾーン
(`debugPoly`をtrueにすると緑色の円形のゾーンが見えるが、それ自体)の生成を行っている部分

### 本当にこれが呼び出し元か実験してみる

ここの`options`テーブルの`label = Lang:t('target.duty')`を
適当に`label = Lang:t('target.aaaa')`に変えてみる

**正常系**
![スクリーンショット 2023-12-11 172515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/a198d002-0a3f-951d-f301-a9c7f7c11afd.png)

**変えてみた**
![スクリーンショット 2023-12-11 171002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/eed99c7a-b24c-e45a-055d-d543cbb48424.png)

![スクリーンショット 2023-12-11 170906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697232/5fa9783e-70ac-d9fe-3773-21e52fa6bd2e.png)

以上

## 引用

- 公式github(qb-mechanicjob)
[QBCore - qb-mechanicjob](https://github.com/qbcore-framework/qb-mechanicjob)