OmniAICreator/Qiita-1.07M huggingface dataset:
リハビリアプリを作ろう（その１）

1-25の数字押していくゲームを作りたいです
このコラムの範囲
- プロジェクトの作成
- 空白のページを作成

少しづつ作ります

# プロジェクト作成
```
mix phx.new num --no-ecto
cd num
mix phx.gen.live Users User users name:string
```

# ルータ設定
```diff_elixir:num/lib/num_web/router.ex
 scope "/", NumWeb do
    pipe_through :browser

+    live "/users", UserLive.Index, :index
    get "/", PageController, :home
  end
```

# 不要なファイルを削除
```
lib/num/users/user.ex
lib/num/users.ex

lib/num_web/live/user_live/form_component.ex
lib/num_web/live/user_live/show.ex
lib/num_web/live/user_live/show.html.heex
```

# 上書きする
```elixir:lib/num_web/live/user_live/index.ex
defmodule NumWeb.UserLive.Index do
  use NumWeb, :live_view

  @impl true
  def mount(_params, _session, socket) do
    {:ok, socket}
  end

end
```

```elixir:lib/num_web/live/user_live/index.html.heex
test
```

# 現時点結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/e0606398-ea18-226a-6ffa-3b6efebe09fe.png)

今回はここまで
Railsのcallback（after_commitエイリアス系）に意地悪されたので先生に言いつけなかった話

これは[Hubble Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hubble)の5日目の記事です。

# はじめに
はじめまして、株式会社Hubbleのしがないバックエンドエンジニアです。
名乗るほどの者でもありませんので、どうぞお好きお呼びなすってくだせえ。

今回[Hubble Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hubble)にて、5日目の記事を担当させていただくことになりました。

何書こうかなーと思っていたんですが、
直近で巧妙なトラップに引っ掛かったので、ちょっと ~~愚痴~~ 備忘録も兼ねて残しておこうと思います。

そんなにボリュームもないのでサクッと読んでいただけると思います！

# RailsのActive Record callbackについて
Railsを使っていたらお世話になっている方も多いと思いますが、
せっかくなので、今をときめくChatGPTさんに一言で表してもらいました。
```
RailsのActiveRecordのcallbackは、
一言で言えば「モデルのライフサイクル中の特定の時点で自動的に呼び出されるメソッド」です。
これらのコールバックは、オブジェクトが保存、更新、削除されるなどの特定のイベントが発生したときに実行されるもので、
データの整合性を保つためや、関連するアクションを自動化するために使用されます。
```

~~そうそう、それそれ！いやぁ、言いたいこと全部言ってくれた！~~

# after_commitコールバックについて
こちらも最早説明不要だと思いますが、
前述のコールバックの一種で、その名の通り、commit後に呼び出されるメソッドです。

# 本題
実はafter_callbackには種類がありまして、
- after_create_commit
- after_update_commit
- after_destroy_commit
- after_save_commit

とそれぞれの用途に応じて用意されています。

ただし、これらは**いずれもafter_commitエイリアスであってメソッドではない**ため、
例えば以下の様に記述すると、1つ目のcallbackは2つ目のcallbackで上書きされ、動作しません。
```
class User < ApplicationRecord
  after_create_commit :log_user_saved_to_db
  after_update_commit :log_user_saved_to_db

  private
    def log_user_saved_to_db
      puts 'ユーザーはデータベースに保存されました'
    end
end
```

これを知らなくてちょっとハマりましたが、
後で調べたら、かの有名な[Railsガイド](https://railsguides.jp/active_record_callbacks.html#after-commit%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AE%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)に、ゴリゴリに書いてあるのを見つけました。

正直納得いかなかった（そんな紛らわしいもの用意すんなよ...）んですが、
タダで使わせて貰っている身でありながらそんな事を思ってしまった自身が恥ずかしくなり、
如何に驕り高ぶっていたのかと反省するとともに、
心身ともに清めるために滝修行しなくてはいけない...と思いましたが、やめました。

# 教訓
ちゃんと使う前に、信頼性の高いソースを見て挙動を把握しようね！
ChatGPTは全知全能ではありません、ご利用は計画的に！

# 最後に
Hubbleの名誉のために記載しておきますが、決してアドカレはやらされている訳ではありません。
もしJoinしたらこれやらないと行けないのか...などと思われている方がいらっしゃれば、その点はご安心ください笑

Hubbleは本人の意思を尊重する自由な風土がモットーです！

明日は@yuto_1220さんの投稿です！お楽しみに！
ansibleを使ってlinux brewをinstallする方法

ansibleでbrewを入れる方法である。
brewでansibleを入れる方法ではない。
（入るのはbrew。使うのがansible）

```yaml
  tasks:
    - name: install linux-brew
      shell: |
        echo "your_password" | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
        brew install bat
```
当然ながらyour_passwordを自身のパスワードに変更しましょう。
あと~/.profileにevalをlineinfileなどで書き込んでおくと良いかと思います。
Maker Faire などのモノ作り系展示会に出した／LT発表した作品の技術の話【からあげ帝国】

この記事は、「[からあげ帝国 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/karaage)」の 6日目の記事です。

上記のカレンダー名に書かれている「からあげ帝国」というのは、自分がモノ作り系などの活動をしている中でご一緒することがある[からあげ（@karaage0703）さん](https://twitter.com/karaage0703)が作成された Discordサーバー上のコミュニティです。

[X（旧Twitter）が無くなったときのための退避場所、などという目的で作成されたコミュニティ](https://karaage.hatenadiary.jp/entry/2022/11/30/073000)です。

## 今回の内容
今回の記事の内容は、自分が [からあげ（@karaage0703）さん](https://twitter.com/karaage0703) とご一緒したことがあるイベントで、出展をしていた作品とその技術について概要をざっくり書いたものです。

### Ogaki Mini Maker Faire 2022
1つ目の展示イベントは、2022年の 12月に大垣で開催された「Ogaki Mini Maker Faire 2022](https://www.iamas.ac.jp/ommf2022/)です。

https://twitter.com/youtoy/status/1599021889308921857

#### 出展者ページ
以下が、自分／からあげさんが出展していたブースの情報です（イベント公式ページより）。

https://www.iamas.ac.jp/ommf2022/maker/robot-gamers-from-toio-tomo-group/

https://www.iamas.ac.jp/ommf2022/maker/ai-zoo-keeper/

↓からあげさんは、こちらの作品を出されていました。
●AI Zoo Keeper | ProtoPedia
　https://protopedia.net/prototype/3469

#### 利用されていた技術
上記の展示で利用されていた技術は、以下がありました。

- 描画ライブララリ
   - p5.js 【両方】
- デバイス関連
   - toio 【自分】
- AI・機械学習関連
   - 画像生成AI（Stable Diffusion）の image-to-image 【からあげさん】

### IoTLT @ NT金沢
IoT に関する技術コミュニティのイベントが、NT金沢というモノ作りイベントの中で開催されました（※ オンラインと現地の両方から登壇した人がいて、オンライン配信ありだった）。

#### LTの様子
自分もからあげさんも、LT登壇していました。からあげさんは、ブースでの展示もされていました。

https://twitter.com/n0bisuke/status/1670288019604267008

https://twitter.com/youtoy/status/1670317905798664193

https://twitter.com/youtoy/status/1670337629345423362

ここで LT で登場した作品は、以下のとおりです。

●【自分】 （電子ペーパー名札） An Electronic paper nameplate with M5Paper&UIFlow | ProtoPedia
　https://protopedia.net/prototype/4598

●【からあげさん】 ニンジャランタン | ProtoPedia
　https://protopedia.net/prototype/3882

#### 利用されていた技術

- 開発環境
   - M5Stack社の UIFlow 【自分】
- デバイス関連
   - M5Paper 【自分】
   - Raspberry Pi 【からあげさん】
   - フルカラーLED（NeoPixel） 【からあげさん】
- AI・機械学習関連
   - 手の印を対象にした機械学習モデルを使い画像認識 【からあげさん】

## おわりに
からあげさんとご一緒したモノ作り系イベント・LT会のイベントで、それぞれ出展したり LT　で話したりしていた作品紹介と、ざっくりと技術の部分の話の記載をしてみました。

からあげさんとは、また今後もこういったイベントでお会いすることが多々ありそうです。

## 余談
その他、展示・発表以外で、今年からあげさんごご一緒してた件があったので、以下は余談として。

[#マウザーアワード](https://twitter.com/hashtag/%E3%83%9E%E3%82%A6%E3%82%B6%E3%83%BC%E3%82%A2%E3%83%AF%E3%83%BC%E3%83%89?src=hashtag_click&f=live) というモノ作り系のコンテストがあり、そのコンテストで、[一次審査員としてからあげさんごご一緒してました](https://twitter.com/youtoy/status/1652874184656322561
)。
![一次審査員](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6e5fdc23-5258-6e22-4a85-b9eb010b9ca6.png)

### 一次審査員での集合写真
顔出しNG なからあげさんは、マスクをつけてという感じですが、#マウザーアワード の表彰式などが行われたイベントである「[Maker Faire Tokyo 2023](https://makezine.jp/event/mft2023/)」の会場でご一緒しました。

https://twitter.com/ProtoPedianet/status/1713446205110567145

会場では、[コンテストに応募されて受賞をしてた方なども含めた集合写真を撮っていて、その時もご一緒しました](https://twitter.com/ProtoPedianet/status/1715198008416166295)。

![集合写真](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bd7a5188-8367-5d00-80ab-7de114c9986c.png)
zennからの乗り換え

# 皆様はじめまして
qiita初心者です。
少し前にzennを利用し始めてましたが、zennを利用する上でしっかりした記事を書こうとするあまり、非公開の記事がたまり始めました。
なので、もう少し気楽に記事を公開していきたいと思い、記事に関してはコチラを利用していこうと思います

# qiitaとzennを比較してみて(※あくまで個人視点)
- 目次：zennが見やすいと思っています
- 記事入力：入力欄と表示欄が隣り合わせのqiitaいいですね！
    - zennで、入力とビューアーが切り替え式なので偶に面倒に思う時がありました
- その他機能：zennだと、本だったりスクラップという機能があり、個人的には記事より使いやすいと感じていました
- イベント：qiitaのアドベントカレンダーに参加してみたい！

# さいごに
アウトプットを頑張っていこうかと思います。
初心者なので、読みづらい所は多々あると思いますが、ご拝読頂けますと嬉しいです
外国人エンジニアと日本語で円滑なコミュニケーションを図るためのポイント

# 外国人エンジニアと日本語で円滑なコミュニケーションを図るためのポイント

日本はグローバルなテクノロジー産業において重要な位置を占めており、多くの外国人エンジニアが日本の企業やプロジェクトで活躍しています。しかし、外国人エンジニアとの円滑なコミュニケーションは、言語の壁や文化の違いによって課題が生じることがあります。その中でも、日本語の特有のニュアンスや表現、ビジネスカルチャーに慣れることは、外国人エンジニアにとって特に重要です。この記事では、「外国人エンジニアに伝わる日本語」に焦点を当て、効果的なコミュニケーションを実現するための方法やポイントを紹介します。
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627492/b0059ae7-83d0-4c62-830c-2c0110a55d75.png">

### 1 やさしい日本語で話す
「やさしい日本語」とは、普段使われている言葉を外国人にもわかるように配慮した、簡単な日本語のことです。
##### ①ゆっくりはっきり話す
日本人が普通のスピードで話すと、外国人は不慣れなため知っている言葉や表現でも聞き取れません。
##### ②「です・ます」体の簡単で丁寧な日本語を使う
外国人は「です・ます」体を学習し、その後「わかる？」「行かない」「元気だよ」という普通の文体（普通体）を学びますが、一般研修終了時には普通体を使いこなせるまでにはなっていないからです。
＜例＞
わかる？⇒わかりますか？
行かない⇒行きません
元気だよ⇒元気です
##### ③ やさしい言葉や表現を使う
漢語やあらたまった表現、逆にくだけた表現は避けます。外国人が初級で学習する語彙は約800単語しかありません。「食べます」「話します」といった基本的な語彙に限られていて、「食べます」に対しての「くう」、「話します」に対しての「しゃべる」などは学んでいません。
＜例＞
召し上がる⇒食べる
土足厳禁⇒くつをぬいでください
キャンセルする⇒やめる
##### ④ 短い文で話す
何かを説明する場合、重文や複文のような長い文はなるべく避けて、短く簡単な文を繋いで話すようにしてください。初級で学習する文型は約75ありますが、「～ので、～」「～たら、～」といった複文はある程度の習熟期間が必要なためほとんどの人が使いこなせません。
＜例＞
私の家は宮崎市内で、駅から近いです。
  ⇒私の家は宮崎市内です。駅から近いです。
ここは危ないので、入らないでください。
  ⇒ここは危ないです。ですから入らないでください。
##### ⑤ 方言を使わない
外国人はどこでも誰にでも通じる標準語を学んでいます。方言や世代に特有の言葉や言い回しはわかりません。
##### ⑥ 意味のない言葉を使わない
普通日本人は「あのですね」、「えーとね」、「あー、なんかね」といった意味のない言葉を無視して聞いています。しかし外国人にはそれに意味があるかないかがわからないため全体の意味を捉えそこなうことがあります。

### 2 理解を助ける動作や身振り、絵や筆談といったさまざまな手段を利用する
言葉だけでは分からない場合でも、身振りや手まねを入れたり、図を描いたりすると、分かりやすくなり、理解が進むことがあります。また知っているのに聞き取れないだけの場合も多く、その言葉や表現をローマ字や仮名で書くだけでも分かることもあります。
### 3 一方的に話さず、理解したかどうか確認しながら話す
確認する場合は「わかりますか」と聞くだけでは不十分です。適度に説明を中断して、内容をもう一度言わせたり、質問に答えさせたりして理解を確認することが重要です。

外国人エンジニアに伝わる日本語のポイントとして、外国人の日本語スキルに合わせたアプローチが重要であることを紹介しました。言語の壁は誰にとっても克服が難しいものですが、お互いに理解し合うことで、プロジェクトや仕事がより円滑に進むことを願っています。
Linuxで2つのディレクトリ間の重複情報を調ベる


## はじめに

本記事は、[All About Group（株式会社オールアバウト） Advent Calendar 2023](https://qiita.com/advent-calendar/2023/allabout) 6日目の投稿です。

ディレクトリaとディレクトリbの間で重複しているサブディレクトリやファイルの情報を調べたい人がどこかにいるかもしれないので記録します。

https://qiita.com/fukasawah/items/53abdd6fde20b5adf83c

↑の記事をベースにしました。

### 前提

以下のようなディレクトリがあるとします。
```
$ tree
.
├── a
│   ├── alice.txt
│   ├── carol.txt
│   ├── dave.txt
│   ├── dinner
│   │   ├── rice.txt
│   │   └── steak.txt
│   └── morning
│       ├── bread.txt
│       └── soup.txt
└── b
    ├── alice.txt
    ├── bob.txt
    ├── carol.txt
    ├── dinner
    │   ├── rice.txt
    │   └── steak.txt
    └── lunch
        ├── bread.txt
        └── soup.txt

7 directories, 14 files
```


## 1階層のみ重複ファイル/ディレクトリ名を表示する
```
$ (ls a; ls b) | sort | uniq -d

alice.txt
carol.txt
dinner
```

- aディレクトリとbディレクトリをlsする
- 表示された一覧をsortする
- uniq -d で重複する行だけを出力する

階層が1つだけならこれで良いです。

## サブディレクトリ含め重複ファイル/ディレクトリ名を表示する
```
$ (ls -R a; ls -R b) | sort | uniq -d

alice.txt
bread.txt
carol.txt
dinner
rice.txt
soup.txt
steak.txt
```

- 上のコマンドの ls に再帰の -R オプションを付けただけ


ただし ls なので、ファイル名だけの重複を調べており、ファイルパスを含めた比較にはなっていません。

## サブディレクトリ含めファイルパスの重複を表示する

```
$ (find ./a | awk '{print substr($1, 4)}'; find ./b | awk '{print substr($1, 4)}') | sort | uniq -d

/alice.txt
/carol.txt
/dinner
/dinner/rice.txt
/dinner/steak.txt
```

- aディレクトリ以下をfindする
- awkを使い表示されたパスの先頭x文字を切り取る(例の場合は4文字 "./a/" の部分)
- bディレクトリも同様に実行する
- 表示された一覧をsortする
- uniq -d で重複する行だけを出力する

ファイルパスの重複確認だけならこれで十分です。

## サブディレクトリ含めファイルサイズなどの情報も含めて重複を表示する

```
$ (find ./a -ls | awk '{print substr($11, 4), $7}'; find ./b -ls | awk '{print substr($11, 4), $7}') | sort | uniq -d

 224 <- aディレクトリ, bディレクトリのサイズ表示
/carol.txt 9
/dinner 128
/dinner/rice.txt 24
```


- aディレクトリ以下をfindして、情報はls -dgilsの形式で表示する
- awkを使い比較したい情報を切り取って表示する
    - 11番目の項目 : ファイルパス, 7番目の項目 : ファイルサイズ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176913/857c0480-648d-f417-1fb0-df8d2e641581.png)


- bディレクトリも同様に実行する
    - （参考までにbディレクトリの情報）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176913/f3a44682-b25b-8e40-73a3-9770c83c92bf.png)

- 表示された一覧をsortする
- uniq -d で重複する行だけを出力する


なお、パスに大文字小文字が混在している場合は、sortに -f オプション、uniqに -i オプションを追加します。
```
(find ./a -ls | awk '{print substr($11, 4), $7}'; find ./b -ls | awk '{print substr($11, 4), $7}') | sort -f | uniq -d -i
```

重複でなく、差分表示の場合はuniqのオプションを -u に変更します（こちらの方が需要が多いかもしれませんね）。
```
(find ./a -ls | awk '{print substr($11, 4), $7}'; find ./b -ls | awk '{print substr($11, 4), $7}') | sort -f | uniq -u -i
```

---

さらっと書きましたがかなり試行錯誤しました。
誰かのお役に立てれば幸いです。
WebAPI 呼び出しのタイムアウトや特殊なレスポンスを試すためのテストツールを作った

この記事は [ビジネスエンジニアリング株式会社（B-EN-G）アドベントカレンダー2023](https://qiita.com/advent-calendar/2023/b-en-g) の記事です。

## きっかけ
開発作業をしていて、以下のような場面がありました。

- サーバーにタイムアウト時間の設定をしたが、本当にその時間でタイムアウトするかテストしたい。
- タイムアウト時の挙動をテストするために `504 gateway timeout`  
- 認証関連のプログラムを作成しているときに `401 unauthorized` や `403 Forbidden` が返ってきた時のテストをしたい

これらをテストするには、呼び出した WebAPI の 応答時間 及び レスポンスの Http Status Code を気軽に変更したくなります。次のような要件を満たすツールが欲しいなぁと思いました。

- セットアップが簡単（ `node` や `Visual C++ 再頒布可能パッケージ` や `Docker` など実行に必要な他の物がない）
- WebAPI の 応答時間 及び レスポンスの Http Status Code を気軽に変更できる
  - 「URL パラメータで指定できる」「設定ファイルを書き換えれば再起動なしで変更できる」など
- Windows で動けばよい

## 見つからなかったから作った！
上記の要件にあうツールを探したのですが、見つけられなかったので自分で作りました。

Java の有名なフレームワークである [Spring Boot](https://spring.io/projects/spring-boot) でベースを作成しています。
Spring Boot には [GraalVM ネイティブイメージのサポート](https://spring.pleiades.io/spring-boot/docs/current/reference/html/native-image.html) という機能があり、この機能を活用して、Windows での実行可能ファイル（exe）を作成しました。
これにより アプリを動かす PC に Java が入っていなくても動作させることができます。

## 入手方法／使い方
※ Windows 上での操作を想定しています。

### 入手 と はじめての実行
+ https://github.com/HiroshiKuboBeng/pingPong/releases/tag/v1.0.0 から `pingPong-vX.X.X-win-binary.zip` をダウンロード。（2023-12-04 現在最新版は v1.0.0）
+ ダウンロードした zip ファイルを展開
+ 展開したファイル内の `startPingPongServer.bat` を実行
+ ブラウザで `http://localhost:8888/ping` にアクセスして pong と表示されたら成功

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3235622/1fc16a18-5266-06ca-49fc-e4c9e75930c1.png">

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3235622/4c0ff9ac-c92c-d7ca-5f1b-f8545d6f661c.png">

### レスポンスを変更する方法
`GET` メソッドの呼び出しの場合は、クエリパラメータでレスポンスを操作できます。

- クエリパラメータ `delay_seconds=数値` を指定すると、指定された秒数分、待機してからレスポンスを返します
- クエリパラメータ `response_status_code=数値` を指定すると、指定された Http Status Code のレスポンスを返します

```batch
c:\>@rem ３秒後に http status code 500 のレスポンスを返す例
c:\>curl -i "http://localhost:8888/ping?delay_seconds=3&response_status_code=500"

HTTP/1.1 500
Content-Type: text/plain;charset=UTF-8
Content-Length: 4
Date: Sun, 03 Dec 2023 20:33:03 GMT
Connection: close

pong
```

`POST` `PUT` `PATCH` `DELETE` メソッドの呼び出しの場合は、リクエストボディでレスポンスを操作できます。

```batch
c:\>curl -i -X POST -H "Content-Type: application/json" -d "{\"delay_seconds\" : 3 , \"response_status_code\" : 500}" "http://localhost:8888/ping"

HTTP/1.1 500
Content-Type: text/plain;charset=UTF-8
Content-Length: 4
Date: Mon, 04 Dec 2023 00:14:56 GMT
Connection: close

pong
```
その他、詳細は zip ファイル内の `readme.md` をご覧ください。 

### カスタマイズ（サーバーが使用するポートを変更する）
zip ファイルを展開したフォルダ内にある `application.yml` の `server.port` の数字を変更して再起動してください。

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3235622/8b5f7540-fd13-06b3-6d81-1d71f3e390f5.png">

## まとめ
WebAPI の 応答時間 及び レスポンスの Http Status Code を気軽に変更できるツールを作りました。
これを活用することにより、WebAPI連携のレアケースのテストがしやすくなります。
よろしければ、ご活用いただき、フィードバックをお寄せいただけると嬉しいです。

そして、やっぱり、もっと高機能な類似のアプリが世の中にはあるハズだ。。。あるなら教えて欲しい。
IBM i アーキテクチャー：活動レベル中でのCPUのディスパッチ

今回はIBM i での複数ジョブ（タスク、スレッド）によるCPU共有のお話です。
コンピューターは物理的に1つのCPUを複数の処理（タスク、スレッド、ジョブなどと呼ばれます）で共有させるためにディスパッチと呼ばれる処理を実行しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/bfa13f3a-aa11-1b43-4fa3-e6cb1efdece8.png)

IBM i では活動レベルという設定があります。活動レベルは前回ご紹介した、プール（実行プログラムの特性毎に分割したメインメモリのエリア）毎に設定されています。システム値QPFRADJが1～3ではOSがシステムの負荷状況を調べて適時最適な値に活動レベル（画面の 最大活動 ）値を自動調整します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/eb8c64d4-212b-517d-f4eb-55f605cfe6ec.png)

上図では、プール2（*BASE : OS本体やバッチジョブ等のプログラムが動作する）の最大活動＝活動レベルは147です。皆さまの手元の環境はいくつになっているでしょう？

さて、上記のシステムの例だとプール2に最大147のジョブが活動状態で存在できますが、物理的なCPU演算回路は非常に限られています。（次章 CPUのマルチスレッドをご参照ください）
・一時点でCPUを使用できるジョブは1つだけです。どのジョブがCPUを使用できるかはQSYSARB（QSYSアービター）というシステム・ジョブが決定します。（下図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/45dd9964-333d-efec-d3f7-540bd4338779.png)

・QSYSARBがディスパッチするジョブを選択する基準は、各ジョブに指定されている実行優先順位に依存します。実行優先順位はクラス *CLS で指定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/de98dcf6-d94d-a074-9225-020ebdeb4e7c.png)
上記の*CLS QBATCHはバッチ用の定義なので、実行優先順位が50と比較的低くなっています。対して*CLS QINTERは30です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6073c0e3-30b1-8877-1554-43c612a6ce47.png)

バッチジョブと対話型ジョブが同一条件でCPUにディスパッチされるのを待っていたとすると、優先順位としては対話型ジョブが優先されることになります。

ディスパッチされ実行中のジョブがCPUを使用する権利を失い、他のジョブにディスパッチが移る契機は以下の3つです。
 1. ディスパッチされていたジョブがCPU処理を終了
 　　バッチジョブの場合はジョブの終了、対話型ジョブの場合はロング・ウェイトに入った状態です。
 2. タイム・スライス・エンド 
 　　ディスパッチされているジョブが使用したCPU処理時間が、そのジョブの＊CLS クラスのタイムスライス値に達した場合
 3.　物理的ディスク装置I/Oの発生
 　　ディスパッチされたジョブがメインメモリに無いプログラム・コードやデータ・レコードをアクセスしようとして物理的I/Oが発生した場合にも、ジョブはディスパッチを他のジョブに渡します。ただし、アクセスしようとしたプログラムコードやデータ・レコードがメイン・メモリ上にあった場合はそのままディスパッチされたジョブは継続して処理を続けることができます。



------
■CPUのマルチスレッド
※近年のCPUは1つのCPUコアの中に、並列に動作する複数の演算回路を搭載しています（ハイパースレッド(Intel系）やSMT（POWER））。上図では単純化のためにハイパースレッドやSMTの表記は省略しています。


模式的にはこのようなイメージになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/388039a8-9c47-c73e-8cfd-8d49f7de8897.png)


POWER10の場合、1つのCPUコアの中に8つの独立した回路がありSMT8モードでは8並列で動作します。前章の図では横軸のラインが1つですが、これが1コアで8本あるイメージになります。
※また、1つの物理的なCPUチップ（1ソケット、と表現される＝自作PC作った方なら周知のとおりですが買ってきたマザーボードにCPUを刺すソケットのことです）の中に複数のコアが搭載されていることが最近は多いと思います。POWER10の最小モデルであるPOWER S1014の最小モデルでも1ソケットで4コアを搭載しています。
POWER S1014の最小モデルで4コアをフルアクティベーションした場合、同時並行処理できる演算回路の数＝スレッド数は、8スレッド・1コア X 4コア・1ソケット = 32スレッドとなります。
前章の例ですと、プール2だけだと仮定すると、最大147ジョブがOSレイヤーでは稼働でき、それを32スレッドに割振りして（並列処理して）いる、という事になります。（実際はプール1～4の合計の最大活動数になります。）
Adobe Max 2023

この記事は[Globeeアドベントカレンダー](https://qiita.com/advent-calendar/2023/globee)4日目の記事です。

こんにちは！株式会社Globee(グロービー)で、2021年に一人目のデザイナーとして入社した西田です。
現在は、abceedのアプリ、WebのUI/UXの改善を主に対応しています。

私についてはこちらの記事をご覧ください。
https://note.com/globee/n/nb4bdadd79a64

## Adobe Max 2023
![IMG_0600 Edited (2).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620678/528f2a10-30e3-2638-df59-483b6f91d93f.jpeg)

今回、リアルでの開催は4年ぶりとなったAdobe Max 2023に参加したのでその内容を共有したいと思います。前回はパシフィコ横浜でしたが、今回は東京ビッグサイトでの開催でした。


## キーノートから生成AIの話でいっぱい

今回のAdobe Maxはほぼ「生成AI」の話で持ちきりでした。Adobeの生成AIで今何ができるのか？また将来どうなるのか？がまるわかりの一日でした。

全部話し始めるとキリがないので、この投稿では1つ紹介したいと思います。

## 生成AI「Adobe Firefly」は多くのデザイナーを救う

すでに生成AI「FireFly」はPhotoshopなどで使うことができますが、これがすごい。
簡単に言うと、Google Pixelの「消しゴムマジック」の超強化版です。

会場でのデモでは、たくさんの人が行き来する神社の写真で、ざっくり群衆を選択して生成AI呼び出してボタンをクリックするだけで、神社の写真から人をすべて消すということをしていました。

単純に人を消すだけでなく、AIがその写真の状況を理解して、人だかりで見えない部分を自然な形で生成していましたね。神社の石畳をきれいに補ったり、柵を設置していたり。しかも３パターンほどつくって候補として出してくれる。

### 写真からモノを消す仕事って意外にある

小規模の会社のデザイナーであれば、いろんな仕事をする必要がありますが、たとえば外部公開したい写真の中に写ってはいけない書類が写ってるから消したいなんて仕事がよくあるわけですが、これが意外に面倒で。

その書類が複雑に他の要素とかぶってるとか、背景がごちゃごちゃしてる、とか。真面目にやると数時間かかる作業なんですが、これを生成AI使えば数分で完了してしまう。

我々のような事業会社に勤めるデザイナーにとっては嬉しすぎる機能だと言えます。

## 早速使ってみる！

ではさっそく生成AIのずごさを実感してみる！ということで、Unsplashから適当に写真をゲット。
このように手前から奥にかけて人がいて、奥の方はボケています。ここから、すべての人を消し去ってみます。

普通に消そうとすると相当むずかしい。特にこのようにいろんな要素がごちゃついていて、遠近感がある写真で人だけけすのは至難の技かなと。

![annie-spratt-tB4Gf7ddcJY-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620678/2a1c272d-f986-17e9-5754-014a62b673eb.jpeg)

### Photoshopで読み込み、人をざっくり選択

細かく選択する必要はありません。投げ縄ツールで選択します。
選択したら、「生成する」ボタンを押すだけ。

![スクリーンショット 2023-12-04 10.28.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620678/70cd2925-e957-40a4-1623-0135c439dc77.png)

### 数十秒で出来上がり！

人が全員消えました！！！！手前から奥にかけての写真のボケ具合はそのままで、綺麗に消えます。
人がいたところはAIがこの写真の他の要素から「人がいなかったらこうじゃない？」っていう感じで生成してくれています。

![スクリーンショット 2023-12-04 10.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620678/f6223572-8fa0-2426-6e9c-2a370158688c.png)

## まとめ

生成AIはアーティストが素晴らしい作品を作るだけでなく、我々のような末端のデザイナーにとっても福音となる機能。2024年もガンガンつかっていきたいですね。
FlutterアプリでSQLインジェクションを試す

## はじめに

普段はWebアプリケーション脆弱性診断に関わる業務を行っています。
最近、Flutterアプリの脆弱性診断が増えてきているのでどのようなソースコードで脆弱性が入るのか体験してみました。
脆弱性を試すのが目的だったので、シンプルなアプリを作ってSQLインジェクションを入れてみました。
ここではSQLインジェクションを実装したところをメインに紹介します。

## 　動作確認環境

- macOS Ventura 13.6.2
- Flutter 3.13.3
- Dart 3.1.1
- sqflite 2.0.2

## 該当のソースコード

Androidアプリで、タイトル検索時のクエリでインジェクションできるようにしています。
※データストアはSQLiteを利用していて、sqflite経由でアクセスしています。

```
  static Future<List<Map<String, dynamic>>> searchNotes(String title) async {
    final db = await NoteViewModel.db();
    return db.rawQuery('SELECT * FROM items WHERE title LIKE "%${title}%"');
  }
```

こちらの例では検索時のパラメータをバリデーションやエスケープを実施せずに利用していて、SQLインジェクションすることが可能になっています。

## おわりに

脆弱性の勉強がしたいという方の一助になれば幸いです。

## 参考URL

- [【5分でわかる】ローカルデータベースの実装方法 | Flutter入門](https://kimuralog.com/?p=2283)
- [【Flutter】AppBarに簡単な検索機能を実装する方法](https://enoiu.com/app-develop/flutter-search-function/)
- [sqflite](https://pub.dev/packages/sqflite)
AWS タグで請求金額を絞る

## 概要

AWSのリソースに付与するタグを使ってリソースを絞り請求金額を確認する方法をまとめる

## 前提

請求を管理するAWSアカウントでAWSのコンソールにログインできること。
`Project`や`IsTest`など何かしらのタグが何かしらのリソースに付与されていること。（タグが一切登録されていないと請求をまとめる事ができない。）

## 方法

1. AWSコンソールにログインする。
1. 「請求とコスト管理」を開く。

    ![コンソールのホーム___コンソールのホーム___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0fac0be6-c62e-7815-136d-30b2941127b0.png)

1. 左サイドバーで「コスト組織」の「コスト配分タグ」をクリックする。

    ![Billing_and_Cost_Management___Global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e0de5aa6-5eef-b617-b230-fc53769156b8.png)

1. 運用中のタグキー一覧が表示される。まずは登録されているタグキーを「アクティブ化」する。アクティブ化することで初めてタグで絞った請求料金を確認する準備が整う。（タグを作成してすぐだと、当該の一覧にまだ反映されていない可能性がある。どうやらタグは数時間から数日かけてAWSシステムに伝播するらしい。気長に待ってみよう。）
1. 今回は「IsTest」というタグキーをアクティブ化する。「IsTest」にチェックをつけ、右上の「有効化」をクリックする。

    ![Billing_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/951646fb-bde6-b8c0-0317-c1f4cc2c4b19.png)

1. タグキーをアクティブ化してから、タグで絞った請求料金を確認できるようになるまで最大で24時間かかる模様だ。「請求とコスト管理」のホームに「コスト配分の範囲」というフィールドがある。タグキーがアクティブ化したらこちらに情報が表示される様になる。（表示されるまで気長に待つ。）

    ![Billing_and_Cost_Management___Global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6a7a1caa-6a4f-7171-5bf0-4df1a5e68011.png)

1. また、タグが有効化されると「コスト内訳」の「コストグループ化」のプルダウンで「コスト配分タグ」を選択し表示されるプルダウン内にタグが追加される。（アクティブ前だと当該プルダウンに何も表示されない。）

    ![Billing_and_Cost_Management___Global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ac212976-0afe-22ec-105d-f28d4933769c.png)

1. タグのアクティベートが完了すると下記のようにタグでコストの内訳を絞ることができるようになる。

    ![Billing_and_Cost_Management___Global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c80dc4c1-ccfd-9b03-0f78-10d1e2de9c97.png)

## 追記

EC2などにタグを付与してから「請求とコスト管理」の「ユーザー定義のコスト配分タグ」に表示されるまで筆者は最大24時間かかった。なので「リソースにタグ設定」の直後に「ユーザー定義のコスト配分タグ」が表示されないことは普通にあるっぽいので気長に待ってほしい。

![Billing_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/35bddb6a-4fc2-eb1a-738d-64d9a2c93f88.png)

更に「ユーザー定義のコスト配分タグ」で「有効化」してもタグごとに料金を絞り込めるようになるまでこちらも24時間ほどかかる。基本時間がかかるものだと思って気長に待ちましょう。

## 参考文献

https://aws.amazon.com/jp/blogs/news/cost-allocation-tag/

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/activating-tags.html

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/configurecostallocreport.html#allocation-viewing

https://www.sunnycloud.jp/column/202300207-02/
さわってみよう watsonx.data #1 ~初めの一歩編~ Part 2

**Part 2の内容**
「さわってみよう watsonx.data #1 ~初めの一歩編~ Part 2」となる当記事では、
下記のうち

・watsonx.dataへのログイン
・インフラストラクチャー・マネージャー(3階層コンポーネントを知る)
・データ・マネージャー(データの探索)
**・照会ワークスペース(データの照会)**
**・照会履歴(照会の監査(過去に実行されたSQLの表示))**
・スキーマの作成
・データの取り込み(都内WiFiスポットの緯度、経度が記録されたCSVファイル)
・データの照会(地理空間関数で東京駅に近い都内WiFiスポットの件数を調べる)
・アクセス制御(インフラとデータに対するユーザー単位での制御)

太字部分の
**・照会ワークスペース(データの照会)**
**・照会履歴(照会の監査(過去に実行されたSQLの表示))**
を取り上げます。


**照会ワークスペース**

照会ワークスペースは “SQL”アイコンで呼び出せます。 
カタログ->スキーマ->表という階層で表示される点はデータ・マネージャーと似ていますが、表を選択すると列名まで確認できます。
SQLで表を指定する際には、カタログ名.スキーマ名.表名で指定します。
照会ワークスペースで、照会(SELECT)などのSQLをエディター上(画面例：Untitle1タブ)で記述し、実行し、結果の確認ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/a381e095-f488-71fa-e08e-648c1571c3d1.png)

照会ワークスペースでは、表を選択後、”</>”アイコンをクリックし、リストから”SELECTの生成”を選択することで、SELECT文を自動生成させることもできます。
任意の表を選択し、操作してみてください。生成されたSELECT文は編集可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/05240064-698c-10c0-318a-631acaf89ca9.png)


画面右上の青文字の”説明”ボタンをクリックすると、エディター上のSELECT文の実行計画(EXPLAIN)を確認できます。
EXPLAINは照会パフォーマンス・チューニングの際に「どのようなアクセス・プランに基づいて照会が処理されているか？」を理解したい時に利用されることが多いです。
詳細はマニュアルをご参照ください。 https://www.ibm.com/docs/en/watsonxdata/1.0.x?topic=statements-explain

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/26957a60-64bf-6229-eec6-8aaeccb68a99.png)

**照会履歴**

照会履歴は、画面左上の”SQL”アイコンのすぐ下のアイコンで呼び出せます。状態が”FINISHED”になっているものは、実行済みのSQLで、”RUNNING”になっているものは現在実行中のものです。
状態として、”STARTING”や”FAILED”が表示されることもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/3099d4fa-5756-aa12-6cb8-1e76ad2dc0b7.png)

照会履歴では過去に実行したSELECT文などを画面上のリストから選択し、再実行することが簡単にできます。
画面リストの”照会”に注目して、任意のSELECT文を選択してください。
選択したまま、画面右端のドットが3つ縦に並んだアイコンをクリックし、”照会ワークスペースで開く”を選択します。すると画面が照会ワークスペースに切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295277/4d08e0fd-275d-f351-386b-c0319cc93dd0.png)

**Part 2のまとめ**
・照会を実行し、結果を確認できる、照会ワークスペースついて学びました。
・照会ワークスペースで表を指定する時は、カタログ名.スキーマ名.表名で指定します。
・照会ワークスペースでは、表を選択後、リスト"SELECTの生成"からSELECT文を自動生成できます。
・照会ワークスペースでは、SELECT文の実行計画(EXPLAIN)を確認できます。
・過去に実行した照会は照会履歴から確認できます。
・照会履歴から、過去に実行済SQLを簡単に再実行することができます。

Part 3に続きます。
https://qiita.com/ibm_tk/items/67835baee81ce07716be
ボーイスカウトルールのご紹介

## 初めに

こんにちは。CYBIRD Advent Calendar 2023の21日目の担当者の@dave_cです。20日目は@ice_matcha3さんの[「ロードバランサの流量調整を動的にやってみた！」](https://qiita.com/ice_matcha3/items/b4e05b66a422a75aad57)でした。

## ボーイスカウトルールって何？

最近色々なエンジニアとの話したところ気ついたのが、あまり知られていない方針だそうですので、記事を作ろうと思いました。この方針に応じてコードの品質をアップできると思います。

プログラミングにおけるボーイスカウトルールとは、開発者が見つけたコードをより綺麗な状態にしておくべきだという原則です。名前は、アメリカのボーイスカウト団体のモットー「Leave No Trace（痕跡を残さないようにする）」から来ており、自然を訪れた時よりも良い状態にしておくことを奨励しています。
Robert C. Martin (よりUncle Bobの名前でよく知られている)によると「Clean Code」の方針の一部となっています。

プログラミングにおいてボーイスカウトルールを適用するということは、開発者がコードの一部を作業するたびに、リファクタリング、最適化、または改善する機会ことです。たとえ、その部分のコードベースに直接関連しない主要なタスクであっても、次のようなことが含まれます。

1. コードをより読みやすく、モジュール化された状態にリファクタリングする
2. 変数や関数の名前を、目的をよりよく反映するように改善する
3. 不要なコードや使われていないコードを削除する
4. コードを理解しやすくするために、コメントやドキュメントを追加・更新する
5. パフォーマンスやリソースの使用を改善するために、コードを最適化する
6. 小さなバグを修正したり、技術的負債に対処したりする
7. テストがないコードに対してテストを追加する
など

重要なのは、処理自体を変わらないように注意が必要です。
そして、該当のタスク以外の修正をするとしたら、レビュアー、他のチームメンバーを混乱しないようにPRを作るときにちゃんとそれの理由を教えることです。

ボーイスカウトルールに従うことで、開発者は徐々により綺麗で保守性の高い信頼性のあるコードベースに貢献することができます。この慣行は、開発者だけでなく、コードの理解や保守に必要な時間と労力を削減できるため、チーム全体にも利益をもたらします。

## ボーイスカウトルールの問題

エンジニアは多くの場合、品質への配慮が限定的かまったく考慮されず、時間制限の下で働くことを強いられます。短期的な成果に重点を置くと、将来の生産性のボトルネック、つまり技術的負債が生じます。悪循環です。

私たちはできるだけ早くリリースすることを目指しているため、品質をあまり気にせずに新しいコードを追加します。これにより、今後の作業がより困難になりますが、それでもすぐにリリースしたいので、コードを綺麗にしません。さらに、問題を作成し、問題にフラグを立ててスプリントに追加する簡単な方法がない場合、問題のあるコードをコードベースに残すと、時間の経過とともに技術的負債が増加します。 待つ時間が長くなるほど、コードをクリーンアップするのが難しくなります。コードの健全性は悪化し続け、最終的には選択肢がなくなり、大規模なクリーンアップを実行する必要が生じ、最悪の場合、開発がしばらく完全に停止することになります。これらはすべて、ソフトウェアの品質への投資はコストに見合わず、リリースまでの時間が遅くなるという誤った信念によるものです。

ボーイスカウトのルールを適用することでサイクルを断ち切ることができますが、実際に適用するのは簡単ではありません。

問題をより明確に理解するために、少しエンジニアの立場になってみましょう。

タスクを割り当てられました。 計画時に見積もりを約束したため、一定の期間内に作業を終わらせる必要があります。 目標を達成して予定どおりにビジネス価値を提供したいと思っていますが、コードよりも綺麗にして残したいです。これにより、チームメンバーや私が後でコードに取り組むことが容易になります。 今後の作業をより迅速にリリースできるようになり、品質も向上するため、ビジネスに利益がもたらされます。

しかし、コードを綺麗にするのためどれくらい時間を使ってよいのかをどうやって分かりますか? 最も価値があるものを特定するにはどうすればよいですか? コードベース全体をクリーンアップすることはできません。
答えるのが難しい質問です。作業をどれだけ早く完了できるかによって異なります。また、選択肢の箇所が多すぎると、さらに最も価値のあるものをいくつか特定するのは困難です。

上記のことを踏まえると、どのような行動を取ればよいでしょうか?

クリーンアップしすぎてリリースが遅れる可能性があります。逆に、いくつかのことをクリーンアップするかもしれませんが、「もっとも重要なものはクリーンアップしません」という危険もあります。

## コードをより良くするための3段階の戦略

コードをクリーンアップするためにすべての開発プロセスを停止する必要がある状況を回避するには、エンジニアチームが次のボーイスカウト規則の拡張版に従うようにしてください。

1. すぐに修正できる小規模な技術的負債やコードベースの問題が見つかった場合は、すぐに修正してください。
2. 修正に時間がかかる可能性がある問題、または確信が持てない問題が見つかった場合は、コードに FIXME/TODOコメントを残して、チケットを作成します。
3. 大きな問題を継続的に追跡し、優先順位を付けてスプリントの一部に追加します。

こうすることで、常に発見したときよりも優れたコードを残し、健全なコードベースを得ることができます。

## まとめ

サッカーの場合では、日本チームが世界中に更衣室が前より綺麗な状態に残されるで知られていると思いますが、コードの場合でも来年に向けてそうしたいと考えています。

## 最後に

CYBIRD Advent Calendar 2023、 明日は@yoooosuさんの投稿です。ぜひ、それもご覧ください！
【AWS re:Invent 2023】サステナビリティスタンプラリー完走の景品が大優勝してた

# はじめに

あっという間にre:Inventの期間が終了しましたね！現在、時差ボケと格闘中です😪

今回、おそらく初の試みとしてAWS eventsアプリ内にGameという項目が用意されており目を引きました。

このGameはスタンプラリーで、サステナビリティとEXPOの２種類を体験することができ、私はサステナビリティのスタンプラリーを完遂しました！ゴールした際に頂けたプレゼントがレア？なものでしたのでご紹介します！

# あまり告知されていなかったGameの概要

サステナビリティに関連する場所にQRコードが設置されており、それを10箇所めぐることでクリアするようなゲームでした。

スタンプカードは以下で、QRコードをスキャンするとスタンプ風画像が追加されていきます。
<img width="400" alt="IMG_0414.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/b056c838-2656-46cc-dfbe-24ead4c1ac0d.jpeg">

🔽スキャンするQRコードは次のようなもので、9箇所に設置されています。
<img width="400" alt="IMG_0178.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/ac68e78c-f998-5181-aa33-a9aadaa61f1b.jpeg">


特にゴールした際の景品が何かはわかりませんでしたが折角なのでやってみよう！という気持ちで取り組みました！

あまり周知されていなかった？こともあり人も集まっておらず道案内のスタッフに聞いても知らないと言われてしまうこともありました😭

色々な会場を回らないとクリアできないため、わりと大変でしたがセッションを回るついでにどんどんスタンプを集め無事ゴールすることができました！

# プレゼントは2022年のre:Play会場のテント？！

ゴール時に頂いたプレゼントは、この大きなトートバッグと25ドル分のAWSクレジットをいただきました✨

このトートバッグは余裕でリュックが入るほどの大きさで非常に頑丈な布で作られていました。頂いた時はこのバックがどうサステナビリティに関連するのかピンときませんでした。

<img width="400" alt="IMG_0316.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/58d58b51-e65f-e09e-814a-bc8e1719c90e.jpeg">

そこで、よく見てみますとバックの内側に付いていたタグに[re:Play 2022]の文字が！
なんとこのバッグの素材は、2022年のre:Playの会場として建てられていたテントの布を使用して作られたバッグだったのです👜✨

巨大なテントたちの布も無駄にするのではなく、バッグとして製品化し且つサステナビリティゲームの景品にするなんてとても素敵な取り組みだなと思いました🌿🌱

<img width="400" alt="IMG_0410.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/5f67c078-5c2a-0a23-a3b9-acd4a206ae4a.jpeg">


非常にレアなプレゼントにとてもテンションが上がりました！🥺大切に日本で使用しようと思います！

# さいごに

re:Inventに関係のあるプレゼントを頂けると、日本に帰国後にも思い出になりますしre:Inventに参加してよかったなと余韻に浸ることができます:relaxed:

2024年以降に参加される皆さん、もしアプリ内にGameという項目を見つけましたら是非トライしてみてください！
Ruby on Rails カラムの追加/データ型変更/削除

ポートフォリオ制作でdocker-composeコマンドを使ってカラムの追加/データ型変更/削除を行ったので備忘録として記載しています。

前提条件
ruby'3.1.3'
rails'7.0.4'
docker-compose '3.8'

apiと書かれた部分は適宜読み替えてください。

### 既存のテーブルに新しいカラムを追加する
（usersテーブルにbadgeというカラムを追加する例）
1.新しいマイグレーションファイルを作成する
```
docker-compose run --rm api rails generate migration add_badge_to_users badge:boolean
```
2.以下のマイグレーションファイルが生成される
```
class AddBadgeToUsers < ActiveRecord::Migration[7.0]
  def change
    add_column :users, :badge, :boolean
  end
end
```
3.rails db:migrateを実行
```
docker-compose run --rm api rails db:migrate
```




### 既存カラムのデータ型を変更
(quizzesというテーブルのsentence_japaneseとsentence_englishというカラムのデータ型をtextに変更します)
1.新しいマイグレーションファイルを作成する
```
docker-compose run --rm api rails generate migration ChangeSentenceEnglishInQuizzes
```
2.生成されたマイグレーションファイルを開き、change_columuメソッドを使用して、変更したいカラムと新しい型を指定します。
```
class ChangeSentenceEnglishInQuizzes < ActiveRecord::Migration[7.0]
  def change
    change_column :quizzes, :sentence_japanese, :text
    change_column :quizzes, :sentence_english, :text
  end
end
```
3.rails db:migrateを実行
```
docker-compose run --rm api rails db:migrate
```



### 既存カラムを削除し、新しいカラムを追加する
（postsテーブルの不要なカラム削除と新規カラムを追加する例）
1.新しいマイグレーションファイルを作成する
```
docker-compose run --rm api rails generate migration ModifyPostsForNewFields
```
2.生成されたマイグレーションファイルを以下のように編集する
```
class ModifyPostsForNewFields < ActiveRecord::Migration[7.0]
  def change
    #既存の不要なカラムを記載
    remove_column :posts, :scene, :string
    remove_column :posts, :content_english, :text
    remove_column :posts, :subject_english, :text
    #新たに追加したいカラムを記載
    add_column :posts, :title, :string
    add_column :posts, :content, :text
    add_column :posts, :genre, :string
  end
end
```
3.rails db:migrateを実行
```
docker-compose run --rm api rails db:migrate
```
以上
Java の -Xmx を減らしたら OutOfMemoryError が解消した話

Java で `OutOfMemoryError: Java heap space` が発生する場合、-Xmx (最大ヒープ サイズ) を増やすほうが良いと思っていました。しかし、実際に -Xmx を減らすことで OutOfMemoryError が解消する経験をしましたのでご紹介します。


## -Xmx を減らすと解消する例

### 対象とするプログラム

以下のようにたくさんのオブジェクトを格納する配列を使用するプログラムで発生しました。

```java
class ObjectArrayAllocator {
    public static void main(String[] args) throws NumberFormatException {
        int gb = Integer.parseInt(args[0]);
        Object[][] objects = new Object[gb][1_000_000_000];
        System.out.printf(
            "allocated for %d objects%n",
            (long) objects.length * objects[0].length
        );
    }
}
```

### 実行してみる

JDK 17 で上記プログラムをコンパイルし、実行してみます。

```console
$ java -Xmx40g ObjectArrayAllocator 7
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at ObjectArrayAllocator.main(ObjectArrayAllocator.java:4)
$ java -Xmx31g ObjectArrayAllocator 7
allocated for 7000000000 objects
```

`-Xmx40g` を指定すると OutOfMemoryError が発生するのに、`-Xmx31g` を指定すると正常に実行できることがわかります。

### なぜ小さい方が良いのか

実は、オブジェクトのポインタのサイズは、デフォルトではヒープ サイズによって異なります。ヒープが約 32 GB 未満の場合はデフォルトで 32 bits の Compressed Oops が使われます。32 GB を超えるとポインタのサイズが 64 bits に倍増するため、上記の例では `-Xmx40g` を指定するとメモリが不足してしまうのです。(ただし、ZGC の場合には常に 64-bit ポインタが使われるそうです。)


## 32 GB を超えても 32-bit ポインタを使いたい場合

実は、32GB を超えても 32-bit ポインタを使う方法があります。

### 明示的に Compressed Oops を使いたいことを指定する

まず、`-XX:+UseCompressedOops` を指定することで、32-bit ポインタが使える場合には使うように指定します。しかし、これだけだと 32-bit ポインタが使えなかった場合は警告が出るだけで、実行は 64-bit ポインタを使って継続されてしまいます。

```console
$ java -Xmx40g -XX:+UseCompressedOops ObjectArrayAllocator 7
OpenJDK 64-Bit Server VM warning: Max heap size too large for Compressed Oops
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at ObjectArrayAllocator.main(ObjectArrayAllocator.java:4)
```

### さらに、ObjectAlignmentInBytes を指定する

そこで必要になるオプションが `-XX:ObjectAlignmentInBytes` です。

オブジェクトはデフォルトで 8 バイト単位で align されるのですが、Compressed Oops は「8 バイト単位なら末尾 3 ビットはいつも 0」という事実を利用してポインタの値を 3 ビット シフトすることで、32 ビットに 35 ビット分の情報を持たせています。

つまり、もし 16 バイト単位で align するならば Compressed Oops は 32 ビットで 36 ビット分の情報を持つことができ、約 64 GB までのヒープ領域を使用することができます。

先ほどのプログラムで、80 億個のオブジェクトの領域を確保するように指定して実行してみます。

```console
$ java -Xmx40g -XX:+UseCompressedOops ObjectArrayAllocator 8
OpenJDK 64-Bit Server VM warning: Max heap size too large for Compressed Oops
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at ObjectArrayAllocator.main(ObjectArrayAllocator.java:4)
$ java -Xmx40g -XX:+UseCompressedOops -XX:ObjectAlignmentInBytes=16 ObjectArrayAllocator 8
allocated for 8000000000 objects
```

`-XX:ObjectAlignmentInBytes` を指定することで、40 GB のヒープでも Compressed Oops を使い続けることができました。

`-XX:ObjectAlignmentInBytes` には 8 から 256 までの 2 の冪乗を指定できます。


## 参考

[Compressed OOPs in the JVM](https://www.baeldung.com/jvm-compressed-oops)
プロダクトオーナーになってから1年経過した話

この記事は [クラウドワークス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/crowdworks)シリーズ１の8日目の記事です。

# 概要
こんにちは、はじめまして、 @e-takazawa です。
[株式会社クラウドワークス](https://crowdworks.co.jp/)で[クラウドワークス.jp](https://crowdworks.jp/) のプロダクトオーナーを担当しております。

私はもともとWeb/Androidエンジニア経験を持つプロジェクトマネージャーとして開発マネジメントを行なってきましたが、クラウドワークスにはプロダクトオーナーとしてジョインしました。
以前、プロダクトオーナーに転職した直後に書いた[記事](https://qiita.com/e-takazawa/items/67c2c6a558687496c2b2)からさらに1年が経ち、プロダクトオーナーという役割の解像度が高くなってきたのかなと感じています。
同じキャリアを歩んでいる方、これから歩もうとしている方への参考になればと思って、今回も書かせていただきます。

# プロダクトオーナーとは？
 [スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)には`プロダクトオーナーは、スクラムチームから⽣み出されるプロダクトの価値を最⼤化することの結果に責任を持つ。`
と書いてあります。
基本的な部分は1年経っても変わりませんが、1年やってみて気づいたことを書いていきます。

## プロダクトオーナーはスペシャリストではない
クラウドワークス.jpはサービスインしてから10年以上経過しているプロダクトです。
なので、プロダクト内に複数のグループを抱え、分業化が進んでいます。
エンジニア、デザイナーはもちろん、データアナリスト、ユーザーサポート、ビジネスサポート、法務、経理と社内に専門的知識を持つスペシャリストを多数抱えております。

そのため、施策を進めるのはプロダクトオーナーではありますが、具体的にどう詰めていくかについては、自分一人だけで考えることはありません。
これが私の考えた施策だ！と考えていた時期もありましたが、スペシャリストの意見を聞いてだいぶ変わっていくことが多いので、「自分の役割は施策をどうしていくかをわかりやすく整理して、ステークホルダーとなるスペシャリストの意思を集約していくのが仕事ではないか？」と今では考えるようになりました。

## 歴史を読み解く
クラウドワークス.jpはサービスインしてから10年以上経過しているプロダクトです。
なので、歴史的な経緯で作られた課題や負債が多数あり、思いもよらない落とし穴がたくさんあります。
ただ、実施したことや何故そうしたかをドキュメント化していく文化が定着しているので、探せば歴史的経緯を紐解く手がかりはあります。
また、過去を経験した知識豊富なメンバーがいますので、そのメンバーを巻き込んでいくことでなんとか課題を乗り越えることができます。

## 最後までやり遂げること
クラウドワークス.jpはサービスインしてから10年以上経過しているプロダクトです。
ただ、未だに発展途上にあるプロダクトです。
まだまだ改善の余地がたくさんあり、プロダクトバックログの優先順位を決めていく中で「全部優先度高だ！」「これはすぐにできないね。」と考える時期が多々あります。
ただ、そこで諦めるのではなく、時期を見越して取り組む、取り組むために準備することが大事だと思います。
「今はやらないけどこの先これを必ずやる」ことをプロダクトバックログに積み、この先必ずやり遂げられるように諦めないことがプロダクトオーナーにとって大事な要素なのではと考えます。

# おわりに
いかがだったでしょうか。
1年経過したことで、改めてプロダクトオーナーとしてスペシャリストたちのシナジーを最大化して発揮していくことが大事なのかなと思い始めております。
相変わらず不確実性は高いプロダクト開発ですが、これからも楽しくやっていきたいと思います。
Java で List 同士を compare して大小関係を得る

Java で List 要素の比較ではなく List 同士の比較をする方法を紹介します。


## やりたいこと

リストの中身を辞書順のように比較するような compare メソッドがほしいと思いました。
以下のようになるイメージです。

```java
// 素朴な比較
compare(List.of('a', 'p', 'p', 'l', 'e'), List.of('a', 'p', 'p')) > 0
compare(List.of('a', 'p', 'p'), List.of('a', 'p', 'p')) == 0

// Comparator を指定しての比較
compare(
    List.of(JapaneseDate.of(JapaneseEra.REIWA, 5, 12, 25)),
    List.of(LocalDate.of(2023, 12, 25)),
    ChronoLocalDate.timeLineOrder()
) == 0
```


## 実装

```java
public class Lists {
    public static <T extends Comparable<? super T>> int compare(List<? extends T> list1, List<? extends T> list2) {
        return compare(list1, list2, Comparator.naturalOrder());
    }

    public static <T> int compare(List<? extends T> list1, List<? extends T> list2, Comparator<? super T> comparator) {
        int minSize = Math.min(list1.size(), list2.size());
        for (int i = 0; i < minSize; i++) {
            int compared = comparator.compare(list1.get(i), list2.get(i));
            if (compared != 0)
                return compared;
        }
        return list1.size() - list2.size();
    }
}
```

## 使用例

```java
    public static void main(String[] args) {
        SortedSet<List<String>> stringListSet = new TreeSet<>(Lists::compare);
        stringListSet.add(List.of("pen", "pineapple", "apple", "pen"));
        stringListSet.add(List.of("pan", "pancake"));
        stringListSet.add(List.of("pan", "pancake", "almond", "potato"));

        stringListSet.forEach(System.out::println);
        // [pan, pancake]
        // [pan, pancake, almond, potato]
        // [pen, pineapple, apple, pen]
    }
```
DAO

DTO(Data Transfer Object)はデータ受け渡し専用のクラス
データを管理するフィールド変数とフィールド変数に対応したGetter・Setterで構成される。
型の異なるデータを一括で管理可能。

https://kanda-it-school-kensyu.com/java-jdbc-contents/jj_ch04/jj_0402/
GetFileByUrlメソッドを作った話

## あらすじ
GASのDriveAppクラスのメソッドで、getFileByUrlや、getFolderByUrlといったメソッドは存在しない。けど、URLを指定してファイルやフォルダを取得することはけっこう多い。なので、ライブラリを作って楽しよう。

```javascript
/**
 * フォルダのリンク（ＵＲＬ）をフォルダＩＤに変換
 * 変換できない場合はリンク（ＵＲＬ）を返す。
 * @param {str} folderUrl - フォルダのURL 
 * @return {str} - フォルダＩＤ
 */
function folderUrlTofolderId(folderUrl) {
  /* 
  *******************************
  フォルダのリンクURLをフォルダのIDに変換
  入力：
   folderUrl フォルダのリンクURL（テキスト型）
  出力：
   フォルダのID（テキスト型）
  *******************************
  */
  const folderUrlParts = folderUrl.match(/\/folders\/(.+)\?/);
  if (folderUrlParts == null || folderUrlParts.length < 2) {
    return folderUrl;
  } else {
    return folderUrlParts[1];
  }
}

/**
 * ファイルのリンク（ＵＲＬ）をファイルＩＤに変換
 * 変換できない場合はリンク（ＵＲＬ）を返す。
 * @param {str} fileUrl - ファイルのURL 
 * @return {str} - ファイルＩＤ
 */
function fileUrlTofileId(fileUrl) {
  /* 
  *******************************
  ファイルのURLからファイルIDを生成する。
  入力：
    fileurl : ファイルのURL（「リンクの取得」で取得）
  戻り値：
    ファイルID　IDが生成できない場合はファイルのURLを返す。
  *******************************
  */
  const fileUrlParts = fileUrl.match(/\/d\/(.+)\//);
  if (fileUrlParts == null || fileUrlParts.length < 2) {
    return fileUrl;
  } else {
    return fileUrlParts[1];
  }
}

/**
 * フォルダのリンク（ＵＲＬ）で
 * フォルダオブジェクトを返す。
 * 変換できない場合は例外をThrowします。
 * @param {str} folderUrl - フォルダのURL 
 * @return {obj} - フォルダオブジェクト
 */
function getFolderByUrl(folderUrl) {
  try {
    return DriveApp.getFolderById(folderUrlTofolderId(folderUrl));
  }
  catch(e) {
    Logger.log('getFolderByUrlメソッドでエラー。フォルダURLが不正でIDに変換できないか、フォルダIDが不正と思われます。'); 
    throw e;
  }
}

/**
 * ファイルのリンク（ＵＲＬ）で
 * ファイルオブジェクトを返す。
 * 変換できない場合は例外をThrowします。
 * @param {str} fileUrl - ファイルのURL 
 * @return {obj} - ファイルオブジェクト
 */
function getFileByUrl(fileUrl) {
  try {
    return DriveApp.getFileById(fileUrlTofileId(fileUrl));
  }
  catch(e) {
    Logger.log('getFileByUrlメソッドでエラー。ファイルURLが不正でIDに変換できないか、ファイルIDが不正と思われます。');
    throw e;
  }
}
```
ChatGPTのAPIで議事録作成してハマったところ

こんにちは！ QualitySolution本部でソフトウェアテストを担当している@hakumai_です。

みんさま、生成AIのChatGPTは活用されていますか？
2022年11月にリリースされ、瞬く間に広がっていったことは記憶に新しいですが、特に「卓越した自然言語処理能力」は、グローバル開発の分野での課題解決や効率化の可能性を大いに感じさせます。

というわけで、今年は業務のスキマ時間でちょこちょこ触っておりましたので、やってみてわかったことや、思わぬ躓きポイントの概要をご紹介したいと思います。
追って、詳細な記事を書いていく予定です。


## グローバル開発における活用
国境を越えたチームでプロジェクトを進める「グローバル開発」は、今や一般的な手法となっていますが、異なる国のメンバーとのコミュニケーション課題が生じるケースもあるでしょう。
これらの課題解決にはChatGPTの「自然言語生成能力」活かせると感じており、具体的には以下のような用途で役立つと考えています。

- 翻訳
- 文書の生成
- 要約
- 音声の文字起こし


## グローバル開発における活用イメージ
前述の特性を活かした生産性を上げるために特に有効な活用方法はこちらです。
- チャットコニュニケーション
    - テキストコミュニケーションのリアルタイム翻訳
- 会議
    - 会議のテロップ追加（＆リアルタイム翻訳）
    - 議事録生成

これらが精度高くできれば、母国語が異なることによるコミュニケーション問題の多くは解消されるでしょう。
英語周りは既にこのようなソリューションがたくさんあるので、イメージがつく方もいらっしゃるのではないでしょうか。
では、なぜ手元でやろうと思ったかですが、最も欲しいベトナム語対応の実用レベルのサービスが見つからなかったからです。


## 実現方法、利用APIについて
音声周りの処理は以下のようなステップです。
既に優れたAPIがあるので、どんどん活用していきます。

| 機能                | 利用するAPI              |
|---------------------|--------------------------|
| 音声の文字起こし     | OpenAIのWisper API       |
| テキストの翻訳       | OpenAIのWisper API       |
| テキストの要約       | text-davinci-003         |


## 実装でハマったこと、挫けそうになったこと
想定外にハマったことを中心にリストします。
この記事で詳細は書きませんが、「こんなことがあるのか」と俯瞰的に知っておくだけでも違うと思います。

* API課金使用上、精緻な事前見積は難しい
  * 利用トークン単位の課金になっており、例えば「1時間の会議を文字起こししたらいくら掛かるのか」などの予測を立てにくい（https://openai.com/pricing）
  *上限設定しておくと安心
* 文字起こしの「リアルタイム性」確保が難しい
  * 1時間会議の文字起こしに数時間かかるなど
  * マシンスペックGPU性能も大事っぽい
* 文字起こしは「スピード」と「精度」がトレードオフ
  * Wisper APIでは複数のサイズモデルを提供しており、性能とリソースの使用量（例：メモリや計算時間）のバランスが変わる。
  * 時間をかけるほど精度の高い文字起こしができ、数時間というレベルで処理速度差が出るので悩む
* 会議音声をそのままテキスト化しても読みにくい、使えない
* 「えー」「あー」「うーん」とか議事録として不要な言葉を拾う（びっくりするくらい多い）
  * →チューニングで多少解決できた
* 話者識別の実装は必須（だと思っている） 
  * 話者識別のない、のっぺりとした文字起こしデータは話の流れを読み取りにくい
  * → 話者識別を実装した
* 会議要約の実装は必須（だと思っている） 
  * 会議をただテキスト化しても長すぎて読み返す気が起きない
  * APIによる要約作成は有用だが、プロンプト次第で質が変わるのでここも奥深い…
* ベトナム語はChatGPT泣かせかもしれない
  * 地域によって言葉が結構違うのですが(日本の方言の比ではない)、標準語から外れると全く拾えない
  * 略語が多いそうで日常会話が拾えない
  * ベトナム語に強そうなモデルを選択するのもよい
* 議事録の信ぴょう性
  * デフォルトのまま使っていると、ChatGPT側で文脈から読み取って「それっぽい」創作文書を追加していることがあって怖すぎた（もはやそれは議事録ではない）
  * 利用モデルの教師データがYoutubeなのか「ご視聴ありがとうございました」「チャンネル登録よろしく」みたいな文言が追加されることがある

* 追加学習で精度を上げたいが、リスクもある
  * 特定の専門用語はファインチューニングを行う
  * 方言などは転移学習で既存のモデルの一部を再学習させるのが良いが、中途半端に取り組むとモデルが劣化する
  * 色々試して、精度検証あるのみ


## まとめ
まだ試行錯誤の中ですが、今は会議動画を特定のフォルダーに入れておけば数時間で議事録＆要約が出来上がる。というかたちで運用しています。

やはり、ChatGPTが一般化されてきた2023年はテクノロジーでグローバル開発がもっと身近になると革新した1年でした。やはり未来が楽しみですね。

今回はボリューム的に取り組みの詳細までを盛り込むことが難しかったのですが、また時間を見つけて、もう少し詳細なTips記事などを上げていきたいと思います。
Git blame（行の変更者を調べる）

今まで動いていた部分が急に動かなくなった場合、変更された行を確認するのが一番手っ取り早い。

確認したいファイル階層まで降りて、そこで「git blame　"確認したいファイル名"」を入力。
コマンドを流すと以下のような表示がずらずらと。
※【】の中は実際には表示されないよ。

【コミットID】f46d1ea3 
【コミットした人の名前】(貴方のID名がここに入る 
【日付】2023-12-02 
【時間】14:42:16 +0900 
【行数】41)          
【その行の変更点】System.out.printf("");

詳細なやり方は以下参考サイトを参照

参考サイト
https://www.r-staffing.co.jp/engineer/entry/20200626_1
社内に定着した独自生成AIツール 4選

## はじめに
本記事は[リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の4日目です🎄
こんにちは、リンクアンドモチベーションの河野です。

弊社では、生成AIを活用した生産性向上活動に取り組んでいます。本記事では、弊社で作った独自生成AIツールの中から、社内での利用が定着し、かつ効果が出ているツールを4つ紹介します。


## 1. 会議の自動議事録
![Screenshot 2023-12-04 at 9.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/6a0b2e35-40d7-3954-e36e-cd9f92a2aba0.png)

※ 議事録フォーマットのサンプル

### ツールの概要
オンラインMTGを文字起こしするAIツールです。社内MTGや顧客アポMTGを自動で作成し、議事録作成や情報共有の効率化を実現します。

### 解決した課題と成果
社内の文字起こし・議事録業務が317h/月工数削減されました。

また、
「参加していない社内MTGや顧客アポの状況が簡単に把握できるようになった！」
「文字起こしから、トークスクリプトを短時間で作成できるようになった！」
といった声を貰いました。

他にも...多くの方に愛されて利用されるツールにするために、DALL-E 3を使って公式キャラをつくり、みんなが親しみやすくなる遊び心を入れました。

![Screenshot 2023-12-04 at 9.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/31926112-1980-697e-d758-ea76c568449c.png)

## 2. 目標設定のフィードバック
![993718e944c98b9693b04838b08af96f.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/1b4e866b-ccda-3d00-16aa-589597d057f3.jpeg)
メンバーの目標設定に対して、GPTからフィードバックしているサンプル画像

### ツールの概要
目標設定を作成する際、所定のフォーマットに入力した内容に対してAIがFBをしてくれます。過去に上司や周囲から実際にもらったFB観点をGPTにインプットしています。

### 解決した課題と成果
目標設定のクオリティ向上、および上司の相談工数削減を想定する効果としていました。結果、メンバーおよびマネージャーからアンケートを取ったところ、以下のような結果となりました。

■マネージャー
先Qと比べ、今Qにメンバーから上がってきた目標設定のクオリティは上がっていましたか？
→ マネージャーの90%以上が5段階評価の4 or 5と回答

■ メンバー
目標設定サポーターによってマネージャーに持って行くまでの目標設定作成の負担は軽減されましたか？
→ 利用者の90%以上が5段階評価の4 or 5と回答


## 3. 日報の自動返信Bot
![Screenshot 2023-12-04 at 9.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/9074b77f-49b2-7815-14e2-2832911a7aab.png)


### ツールの概要
AIが、日報の内容をもとに"気づきを与える"、"励ます" 返信をしてくれます。

### 解決した課題と成果
日報の返信を通じて、

1. 気づきをもらえたことで、行動の改善ができた
2. 励まされたことで、今日も頑張ろうという活力が生まれた
3. Slackスレが盛り上がり、コミュニケーション機会になった

といった効果が生まれました。

特に、2.の効果を感じてる人が多く、「AIからの返信でも、"今日も頑張ろう"と思えた」という声を貰いました。筆者も、日報返信くんからの「長時間労働、お疲れ様でした！」という一言に何度も励まされました。

## 4. 新人エンジニア向け技術学習Bot

![Screenshot 2023-12-04 at 9.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/712fe4a5-9f4e-5bf5-8dec-bad5f0014883.png)


### ツールの概要
主に新卒などのジュニアを対象として、定期的に社内で利用している技術に関する問題を出題してくれるBotです。AIが問題を自動で生成してくれるため、問題を考える手間が省け、かつ出題内容が被らないことが特徴です。

### 解決した課題と成果
新卒が遊び感覚で技術的な問題に答えることで、基礎知識の習得を担っています。また、問題を通じて先輩エンジニアが解説してくれるケースも多く、ジュニアとの良いコミュニケーション機会にもなっています。（弊社には教えたがりの優しい先輩が多いようです笑

## さいごに
生成AIを活用すると、これまでできなかったアイデアが実現できて楽しいですね！
私たちの取り組みが、みなさんの業務改善の一助になれば幸いです。
PHPでも型宣言を使いこなそう

# この記事の目的

PHPは型宣言なしのプログラミング言語ですが、直近のアップデートは型に関するものが多くあります。
綺麗なコードを書くために知っておくことが目的です。

# classのプロパティ
```php
class Test
{
    public string $log;
}
```


# classの定数
```php
class Test
{
    public const string TEST = "Test";
}
```

# 関数の引数
```php
function test(string $param)
{
    return $param . ' test';
}
```



# 関数の戻り値
```php
function test($param): string
{
    return $param . ' test';
}
```

# 複数宣言
```php
function test(string|int $param)
{
    return $param . ' test';
}
```

# nullable な型
```php
function test($param): ?string
{
    return $param . ' test';
}

```


# Mixed な型
```php
function test($param): ?mixed
{
    return $param . ' test';
}
```

# 終わりに
使いこなすには継承時の挙動やtrait使用時の挙動など把握しないといけませんが、
読みやすいいコードを書くためにも、学習しておくといいのではないでしょうか。
Figma入門【グループ化】




### 左上のメニューから「Star」を選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/04bf0265-f29e-fa17-5b6a-865b8acb61ec.png)


### 「「「Shiftを押しながら」」」ドラッグアンドドロップしてきれいな星を作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/519fc8ce-ced7-95fe-6430-f257aed61db1.png)


### Ctrl C とCtrl V で複製する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/75975a7c-c2a1-dd28-5fc3-8047a4271704.png)

### うまい具合に等間隔になると、数字が出る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/1fda23b2-b451-d294-4d68-d41621e556dc.png)

### この時、左側のパネルのオブジェクトはそれぞれ紐づいている状態ではない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/b56f40e8-b1f0-e255-2d90-f48e1137069c.png)

### この時に、五つの★をドラッグアンドドロップで選択する（左のパネルも選択されることに注目）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/e76c2f71-659a-f8f2-825e-fa4f054fb5bc.png)


### 「Ctrl G」を押下（Macの場合は「Command G」）するとグループになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678228/5538de3e-2358-8933-fd12-32b5941d8ac5.png)
開発生産性向上Tips 〜そのエラーハンドリング必要ですか？〜

「開発生産性向上Tips」と題しまして、私が思っている開発生産性を向上させるTipsを紹介します。

この記事では「そのエラーハンドリング必要ですか？」というタイトルで、エラーハンドリングについて話します。

# エラーハンドリング

エラーが発生した時の処理のことです。
この処理の特徴は、**正常に動作している限りは使われない**ということです。

開発していると色々細かくエラーハンドリングしたくなりますが、ここでの開発生産性Tipsは

**【必要最低限のエラーのみハンドリングする】**

です。

保守すべきコードが増えれば増えるほど保守コストが高くなっていきます。
そのため、できる限りコードを増やさないことが開発生産性を高く保つコツです。

そこで今回はエラーハンドリングに着目しました。

エラーハンドリングは前述した通り、正常に動作している場合は使われません。
言い換えると実装しなかったとしても正常動作には影響を及ぼさないということです。
そのため、必要最低限のエラーハンドリングだけ実装すべきです。

# 必要最低限のエラーハンドリングとは？

ほとんどの場合、エラーハンドリングはグローバルな処理でガバッと実装していることが多いと思います。
例えば、APIであればエラーが発生したらBadRequestを返却するようにしていたり、クライアントではエラーが発生したら特定のアラートなどを表示するようにしていると思います。

基本的にはそれだけ十分だと思います。
グローバルなエラーハンドリングだけで済む場合、実装は共通化された1箇所だけで良いし、個々にエラーハンドリングを実装する必要もなくなり、大幅に実装や保守のコストが削減されます。

# 個別のエラーハンドリングを実装した方が良い場合は？

とは言っても開発していると、個別でエラーハンドリングしたくなることがあります。
その時の判断基準としては、このエラーハンドリングがなかったら本番運用中に利用者がどれくらい困るか？で考えると良いと思います。

例えば、下記のような場合は個別でエラーハンドリグすることを検討した方が良いと思います。

* エラー発生か確率が高く、ユーザーにエラー原因が伝わることでエラーからリカバリできる(エラー原因を伝えないとできない可能性が高い)
    * ただし、そもそもエラー発生確率を減らす方法があるならそちらを検討すべき
* エラーが発生した場合、リトライなどでの回避が難しく高確率で問い合わせや離脱につながる

一方で下記のようなものは対応不要だと思います。

* 発生確率が低い
* 発生してもユーザーでは対処できない(エラーを伝えてもどうしようもない)
* 発生してもリトライなどで回避できる(エラー原因が粗くてもリカバリできる可能性が高い)

プロジェクトを継続的に運用している開発チームであれば、下記の問だけで判断可能だと思います。

「エラーハンドリングの実装が漏れてしまい、本番環境で当該エラーが発生しました。hotfixや差込対応で数日以内に修正しますか？」

数日以内に差し込み作業として修正するレベルなら最初から入れておくべきだし、それ以外なら実装しなくて良いと思います。

# まとめ

実装していると、自分のコードはキレイに、そして完璧に作りたくなるものです。
ただ、ほぼ発生しないエラーハンドリングなどレアケースな処理を実装してしまうと、運用では1回も動いたことがないのに保守し続けていくコードが発生することになります。

このようなコードが積もり積もって運用コストを上げていくので、必要最低限のコードだけ実装するということを心がけるようにしましょう。
Salesforceで使えるテストツール



+ [静的アプリケーション セキュリティ テスト (SAST) ツール](https://qiita.com/Keiji_otsubo/items/279b257a2eb6d1125ee0)
+ [Salesforceで 画面のテスト自動化ができるのなら、試してみたい ](https://qiita.com/Keiji_otsubo/items/5ba37884ba5ed832e0ee)


# Snyk（スニーク）

+ [Snyk（スニーク）って、Salesforceでも使えるの（前編）](https://qiita.com/Keiji_otsubo/items/def64ad9e061897c6cc2)
+ [[snyk-docs] Snyk CLI のインストールとアップデート (Install or update the Snyk CLI)](https://qiita.com/ToshiAizawa/items/c090cbd525e45cc5ae51)
+ [Getting started with the Snyk CLI](https://docs.snyk.io/snyk-cli/getting-started-with-the-snyk-cli)
+ [How to install Snyk CLI with NPM or YARN on Ubuntu/Debian](https://www.cyberithub.com/how-to-install-snyk-cli-with-npm-or-yarn-on-ubuntu-debian/)