OmniAICreator/Qiita-1.07M huggingface dataset:
新人の頃にありがたかったプラクティス「ポジティブFB」

# はじめに

入社5年目の私が、新人の頃にありがたかったチームの雰囲気やプラクティスを思い出して書きます。
社内の集合教育が終了し、現在のチームに配属になりました。
右も左もわからない中で、上司からことあるごとに、ポジティブフィードバック（以下、ポジティブFB）をしてもらえたことにより、どのような行動が期待されているのかがわかり、仕事を進めやすくなったと思います。

# ポジティブFBとは

日々の行動のなかで期待に沿うものであれば、どんなに細かくても、小さなことでも拾い上げて、「いいね」や「感謝」を伝えてもらっていました。

例えば、指導をした後、何か行動が変わったとき、すかさずポジティブFBをすることで、この行動が正解なんだとわかるので、本人も安心しますし、定着しやすくなると思います。
実際に私がそうでした。

例えば、仕事を振られた後の、相談に行くタイミングです。

報連相しましょうとよく言われますし、そういった指導も受けましたが、新人の頃の全く経験がない段階では、タイミングも迷いますし、躊躇することもあると思います。
書籍や指導で報連相について学んだあと、実践してみると、まずそのタイミングについて感謝してもらえました。

大きな変更が入る前、前提や状況が変わり当初キックオフしていた時点から方針が変わりそうなとき、作業に詰まって15分経過したとき(※)、中間の状況報告などなど、学んだタイミングで報告や相談に行った際に、「このタイミングで相談してくれてありがとう。おかげで手戻りが減りました。」とわかりやすく教えてもらえました。

このようなFBを繰り返してもらうことで迷いや躊躇が無くなり、スムーズに報連相ができ、作業が滞ることなく進められるように成長しました。

（※）新人のころ自分で決めた質問ルールがあり、チームメンバに共有していました。この話もいつかします。

# さいごに

改めて振り返ってみると、根気よくポジティブFBを繰り返してくださる上司には感謝しかありません。
今でも続いていて、仕事をする上での1つのモチベーションにもなっています。
自分なりに気を使いながら、期待値を考えながら仕事をしても、それに対しては特に言及されず、できなかった時だけ責められる、そんな状況だと辛くなってしまうことが想像できます。
これまで楽しく、ポジティブな気持ちで仕事ができたのは、「ポジティブFB」の影響も大きいと感じました。

自分が上司の立場になったときに、チームメンバに楽しく前向きな気持ちで仕事を進めてもらうため、仕事を円滑に進められるようチームメンバの成長を促すために、積極的にポジティブFBをしたいと思います。
そのためにも、今の段階から積極的にチームメンバを肯定したり、感謝を伝えたりして、チームに貢献していきます。
また、どのようなポジティブFBの仕方をしているのか、上司を観察してみます。
生産性の高い働き方はいいぞ！

本記事をご覧の皆さま、初めまして！
KDDI株式会社でCCoE（※1）をしている柴田と申します。

この度、同僚のみのるん @minorun365 に触発され、Qiita投稿デビューをすることにしました！
初投稿なので読みづらい点もあるかもしれませんが、お目こぼしいただけますと幸いです。

さて、このデビュー記事では、私が体験した**生産性の高い働き方**についてご紹介します。

常に業務が忙しく辟易とされている方に、働き方を少し変えることで状況が変わるかもしれない！と思っていただけたら幸いです。

※1：CCoE = Cloud Center of Excellence の略称。
自社内のクラウド利用推進をさまざまな形で支援・牽引する専任組織を指す。

# ケース１：知ってるけど会ったことない人とのブレスト
ふわっとしたお題について集まってアイデアを出し合うブレインストーミング、つまりブレスト。
とりあえず集まったはいいけど、**アイデアが出ない**、アイデアは出たけど**まとまらず発散**してしまう、という経験、皆さんはありませんか？

私はつい先日行ったブレストで、知っているけど実際には会ったことがない人がいたにも関わらず、
2時間枠のブレストを半分の1時間で満足に終わらせる、という経験をしました。

ポイントは、ブレストの前に**ランチ会を行った**ことです。
こう書くと、自分自身でも「 **え、それだけ？** 」と思えるくらいですが、ランチ会は効果抜群でした。
そのよさを2つあげます。

## 初見コミュニケーションコストの解消
実際に会うのは初めましてのメンバーがいると、少し緊張するというか、
相手がどんな人なのか探りを入れる時間、人として自然に発生するのではないかと思います。

そのような不安を、ランチを一緒に食べることで解消することができました。

美味しいランチを食べて機嫌が悪くなる人はいませんよね。
気持ちがリフレッシュしているタイミングにやわらかいコミュニケーションを取り、
これから一緒にブレストするメンバー間の人となりを少しでも理解することで、
その場の心理的安全性を確保できたのがランチ会のよさの１つ目です。

## 前向きな気持ちの醸成
よかったのポイントの2つ目は、ランチを取ることでリフレッシュし、
気持ち前向きにブレスト会に臨めたことです。

**美味しいランチを食べて機嫌が悪くなる人はいませんよね。**（2回目）

息の詰まる会議、お客さまへの提案など、ときには気を張る業務もあります。
が、その直後にすぐ頭を切り替えてブレストしましょう！というのも無茶な話ですよね。

例えるなら、**健康診断の結果が悪かった直後にたらふく食べに行けますか？** という感じでしょうか。

ブレストのように、「こうしたい！」「あのアイデアはどう？」といった前向きな発想を出すためには、気持ちの準備を整えることも非常に大事だと思います。
そのためにランチ会は有効でした！

# ケース2：企画構想のために一人で思考にふける
企画系の業務にあたっている方は、まとまった時間で思考にふけり、
ああでもない、こうでもない、と頭をひねることも必要だと思います。

しかし世の中、まとまった時間が常に取れるとは限りません。
むしろ**まとまった時間を生み出すことの方が難しい**、まであるかもしれません。

どうすればまとまった時間を取れるのでしょうか？

私は、**業務手段を削ぎ落とすこと**で、まとまった時間を確保することに先日成功しました。

・・・カッコよく言いましたが、実は、
**社内イントラにつながるLTE回線付きのPCを家に忘れて出社した**ことの巧妙です。

**お前は仕事をしに出社したのではないのか**、とツッコまれそうなところですが、
幸いにも別に貸与されているPCと、業務用携帯は所持していたため、
連絡は取れつつ業務もできる、という状態でした。

これが奏功！

普段無数に飛び交うOutlookやTeamsの通知が目に入る回数が（強制的に）激減し、
社内イントラでできてしまう庶務業務は（強制的に）後日やることになり、
結果的に**何かにカットインされることなく**まとまった時間で思考にふけることができました。

転じて人は、**連絡通知やその他関連性のない業務に悪気なく邪魔されている**、ということだと思います。
まとまった時間が必要な時は、他のことに気を取られる機会を減らすことを検討してみてはいかがでしょうか！

# 終わりに
以上、最近私が体験した生産性の高い働き方の紹介でした。
生産性高く働けると、もちろん成果も出せますし、何より、
**自身の満足度が高い状態になれる**、ということが大きいと思います。

何かと忙しく心に余裕がなくなることは多いと思いますが、
ちょっと働き方を変えるというスパイスを加えることで、
少しでもウェルビーイングに働くことを目指していきましょう！
GitHub Copilotで提案を "途中まで" 適用する方法 (for VS Code, Mac)

# やり方

`⌘Cmd` + `→` で文節ごとに適用できます。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485447/de0300b9-e98e-e427-20a0-77ce19ca403f.gif)

---

GitHub Copilotの提案のうち、「途中まではいいんだけどな〜」「関数の引数は違うな〜」みたいに、一部だけ採用したい時があるとが思います。

「`Tab`で全部適用後に不要な部分を削除」とやっていませんか？

そのような時は、`⌘Cmd` + `→` で文節ごとに適用できます。

## Q. 反応しない時があります

補完候補ポップアップが出ていると使えません。
`Esc` を押して、補完候補ポップアップを消してから `⌘Cmd` + `→` してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485447/935ba48d-7ef5-1b5c-95c4-e93fe70480c0.png)


# 参考

- [Partial suggestion acceptance - Github Copilot · Issue #140708 · microsoft/vscode](https://github.com/microsoft/vscode/issues/140708)
- [keycastr/keycastr: KeyCastr, an open-source keystroke visualizer](https://github.com/keycastr/keycastr) : キーストロークをオーバーレイ表示するツール
【ChatGPT無】で四則演算できた！（あとからダメと判明）

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::
:::note warn
　2023/06/27
　計算間違いが発覚しました。
　ぬか喜びでした。
　大変、失礼しました。
:::

　どうも、カーブミラーです。

　今回は、
　　ずっと模索していた
　　　ChatGPTによる計算が
　　　　行なえるプロンプトです。

　いやぁ、長かった。
　　なにせ、私の最初の
　　　発言以前からの
　　　　課題のひとつでしたから。

　まぁ、
　　本来の目的は、
　　　文字数を数えること
　　　　なんですけどねw

　それはともかく、
　　まずは、プロンプトです。

　途中に「日本語でお願いします」と
　　ありますが、
　　　最初、掛け算の際に、
　　　　「乘以」なんて使われたんです。

　ナニかな、ってググったら、
　　中国語でした。
　　　意味は「×（掛ける）」
　　　　なんですけどね。
　　　　　そこは日本語で、
　　　　　　とお願いしたわけです。

　で、今度こそ、プロンプトに。

```Text: 計算プロンプト
# 目的
与えられた計算式の計算

# 処理方法
入力されたアラビア数字（0-9）の計算式を漢数字（〇一二三四五六七八九のみ）に変換してから、計算してください。途中とはいえ、日本語でお願いします。

# 結果出力
計算結果をアラビア数字に直してください。

例も説明も不要です。


上記を理解したなら、「はい」と返事をして、待機してください。

理解できない場合は、その箇所を指摘してください。
```

　それで、以下は使用例です。
　　なお、結果は
　　　電卓で計算した
　　　　結果と同じでした。

```Text: 計算の実例
ChatGPT
はい、理解しました。与えられた計算式を漢数字に変換し、その後計算結果をアラビア数字に直して出力します。どのような計算式を処理すればよいでしょうか？





User
7878×45

ChatGPT
漢数字への変換後、計算式は「七八七八×四五」となります。これを計算し、結果をアラビア数字に直して出力します。

計算結果は「354,510」です。





User
123×456

ChatGPT
漢数字への変換後、計算式は「一二三×四五六」となります。これを計算し、結果をアラビア数字に直して出力します。

計算結果は「56,088」となります。





User
12345÷5

ChatGPT
漢数字への変換後、計算式は「一二三四五÷五」となります。これを計算し、結果をアラビア数字に直して出力します。

計算結果は「2,469」となります。
```

　順調です。
　ところが、
　　ここでケチが付きました。

```Text: ケチ
User
356÷3

ChatGPT
漢数字への変換後、計算式は「三五六÷三」となります。これを計算し、結果をアラビア数字に直して出力します。

計算結果は「118」となります。





User
余りは？

ChatGPT
申し訳ありません、前回の回答で余りの計算を行っていませんでした。

356 ÷ 3 の計算結果は商が 118 で余りが 2 となります。
```

　さすがに、余りは計算外でした。

　ここは、今後の改良次第？

　まぁ、
　　どこまで、
　　　計算が正しく行なえるか、
　　　　が不安ですけど。
***
　最後に、
　　ここまでの流れをば。

　まずは、
　　単純に、
　　　ふつうの数式の入力で、
　　　　間違うChatGPTさん。

　毎回、同じ間違いならば、
　　原因がわかりそうですが、
　　　二転三転する答え。

　少年ジャンプ＋で
　　ななせ悠さん作品の読み切り
　　　「続く道 花の跡」から
　　　　“計算手”という
　　　　　仕事の存在を知り、
　　　　　　ロールプレイで
　　　　　　　計算手を指定して
　　　　　　　　みたりしたけど、
　　　　　　　　　ダメ。

　ちなみに、計算手というのは
　　計算をする専門の人だとか。
　　　コンピュータのない時代の
　　　　職業だったそうです。

　ううむと、うなる、わけですが……。

　そこに転機が訪れます。

　先日の下記の記事、
[【ChatGPT無】は数を扱える！？](https://qiita.com/kabumira/items/697de1907a2415a90aed)
　にも書きましたが、
　　「文章問題を与えたら解ける」
　　　のです。

　ならば、
　　もしかして、
　　　アラビア数字から
　　　　漢数字に変換したら、
　　　　　計算できるのでは？と
　　　　　　思い付いたんです。

　そこで、
　　変換プロンプトを用意。
　　　ところがうまく行かない。

　よくよく見ると、
　　漢数字には、
　　　万や千や百や十なんかの
　　　　位を示す漢字が。

　ならば、ってんで
　　アラビア数字を
　　　そのまま漢数字に
　　　　変換する。

　つまり、
　　123456を一二三四五六に変換。

　それで計算させると、
　　なんと答えは正しい。

　結果を
　　アラビア数字に戻して、終了。

　ChatGPTさんは、
　　もしかして、
　　　和算がお好き？

***
　2023/06/27
　計算間違いが発覚しました。
　ぬか喜びでした。
　大変、失礼しました。

　記事を残すことにしましたのは、
　　何かしらの参考になれば、
　　　という気持ちからです。

　どなたかの
　　糧になれば、
　　　幸いです。

　お騒がせしてしまい、
　　申し訳ありませんでした。
Google Colaboratoryでseleniumを実行したときに「WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.」というエラーが発生

# 結論
ヘッドレスモードを設定しないままドライバーインスタンスでセッションを開始している可能性があります。Google Colaboratoryではヘッドレスモードでないとseleniumを使用できないため、設定されているか確認してみましょう。

# エラーを再現
Google Colaboratoryで以下のコードを実行するとエラーが発生します。
```.py
# ヘッドレスモードを設定していない
#options.add_argument('--headless')

# webdriverのimportや他のoptionのコードは割愛
with webdriver.Chrome("chromedriver", options = options) as driver:
    driver.get('https://www.yahoo.co.jp/')
    print(driver.page_source)
```
```.log
WebDriverException                        Traceback (most recent call last)
<ipython-input-9-1e4e21a40d5d> in <cell line: 52>()
     50 
     51 # webdriverのimportやoptionのコードは割愛
---> 52 with webdriver.Chrome("chromedriver", options = options) as driver:
     53     driver.get('https://www.yahoo.co.jp/')
     54     print(driver.page_source)

5 frames
/usr/local/lib/python3.10/dist-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
    243                 alert_text = value["alert"].get("text")
    244             raise exception_class(message, screen, stacktrace, alert_text)  # type: ignore[call-arg]  # mypy is not smart enough here
--> 245         raise exception_class(message, screen, stacktrace)

WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x556347f817f9 <unknown>
#1 0x556347f213b3 <unknown>
#2 0x556347c69016 <unknown>
#3 0x556347c8c283 <unknown>
#4 0x556347c8889a <unknown>
#5 0x556347cc600a <unknown>
#6 0x556347cc0c93 <unknown>
#7 0x556347c92ce4 <unknown>
#8 0x556347c944d2 <unknown>
#9 0x556347f4d542 <unknown>
#10 0x556347f5cce7 <unknown>
#11 0x556347f5c9e4 <unknown>
#12 0x556347f6113a <unknown>
#13 0x556347f5d5b9 <unknown>
#14 0x556347f42e00 <unknown>
#15 0x556347f745d2 <unknown>
#16 0x556347f74778 <unknown>
#17 0x556347f8ca1f <unknown>
#18 0x7fbd42ac3609 start_thread
#19 0x7fbd41cd6133 clone
```

エラーの内容だけでは原因がすぐにわかりそうになく、戸惑ってしまいそうです。ですが、Google Colaboratoryではヘッドレスモードでないとseleniumが使用できないという点に注目するとそこが原因であると想像できそうです。

# エラーを解決
ヘッドレスモードを入れてみます。
```.py
# ヘッドレスモードを設定する
options.add_argument('--headless')

# webdriverのimportや他のoptionのコードは割愛
with webdriver.Chrome("chromedriver", options = options) as driver:
    driver.get('https://www.yahoo.co.jp/')
    print(driver.page_source)
```
これでエラーが解決し、実行できました。
ローカルのコードを移植したときなどは注意したほうが良さそうです。

# 補足
Google Colaboratoryでseleniumをインストールする方法については私の以前の記事が参考になります。

https://qiita.com/76r6qo698/items/cfea95c6b77ddaae518d

以上です。
SteamDeckの環境に入れておくべきアプリ

## 1.Fictx 5
ArchLinux使ったことある人なら誰でもわかる、あの入力ソフトです。SteamOSはArch Linuxベースなので、入れておくことを強くおすすめします。SteamOSにはiBusが標準で入っていますが、iBusの標準日本語IMEである、Anthonyの使い勝手が非常に悪いので。iBus-mozcを利用してみようとも思ったのですが、ArchLinux向けに最適化されていなかったので。
~~~
sudo pacman -S fcitx5-im fcitx5-mozc
~~~
これでインストールできます。楽ですね。
## 2.Wine
これはWindowsアプリをよく使う人に限られるのですが、flatpacリポジトリからインストールするものよりも、pacmanから落としたもののほうがバージョンが新しいので、pacmanリポジトリを使います。
~~~
sudo pacman -S wine
~~~
これだけです。
## 3.Winetricks
Wineをインストールして最初にぶち当たる障壁として有名なのが文字化けです。
豆腐文字や意味不明な言語に寒気がする人も少なくないはず...
というわけで、Winetricksをインストールします。
~~~ 
sudo pacman -S wine
~~~
そして、
~~~ 
winetricks allfonts
winetricks fontsmooth-rgb
~~~
これをすれば文字化けが収まるはずです。
## 4.Distrobox
SteamOSの元のなっているLinuxはArchLinuxで他のディストリビューションと比べたら、使い勝手が悪かったり、使っていたソフトウェアが無いという自体にも陥りやすいです。そこで、Ubuntuの仮想環境をコンテナで実行し、それを使うという方法です。インストールは
~~~
sudo pacman -S distrobox
~~~
となります。これについては私より詳しく説明している方がいますので、そちらの人に任せます。
# まとめに
少し短くなってしまいましたが、この記事自体更新していきたいと思っているので、ぼちぼち見てもらえれば幸いです。
Surveys Customized Thank You Page


+ [Surveys Customized Thank You Page](https://trailhead.salesforce.com/content/learn/modules/surveys-customized-thank-you-page?trail_id=get-started-with-salesforce-surveys)

# Explore Customization Options

クイズ形式

# Customize the Thank You Page

[Get Started with Service Cloud for Lightning Experience > Salesforce Surveys for Admins](https://qiita.com/Keiji_otsubo/items/6b556fa6e9fa68871e07)の設定をしたプレイグランドを使ったら、何もしていないけど合格できました。

# Use Merge Fields to Redirect Users

お決まりの何もしないで、検証ボタンを押します。

:::note alert
We can’t find the Solar Products NPS survey. Make sure its API Name is 'solar_products_nps'.
:::

保存だけを行った場合

:::note alert
In the Solar Products NPS survey, we can't find the latest version activated.
:::
スマホでも Ctrl + F と同じことをする

## Ctrl Fと同じことをスマホでもする

①URLが書いている検索窓で検索したいキーワードを入力（URLの上から入力する）

②ページ内検索<On This Page (29 matches)>という表示が出てくるのでそこを押す

Ctrl + F と同じようにページ内検索ができる
[AtCoder] Beginners Selection - ABC081B - Shift only [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト ABC081B - Shift only 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abc081/abc081_b

## 問題

https://atcoder.jp/contests/abs/tasks/abc081_b

## 入出力例

以下のようになれば OK です

```elixir
"""
3
8 12 40
"""
|> Main.solve()
|> then(&(&1 == 2))
```

```elixir
"""
4
5 6 8 10
"""
|> Main.solve()
|> then(&(&1 == 0))
```

```elixir
"""
6
382253568 723152896 37802240 379425024 404894720 471526144
"""
|> Main.solve()
|> then(&(&1 == 8))
```

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_lines(lines) do
    lines
    |> String.trim()
    |> String.split("\n")
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  defp num_of_power(input, powers) do
    powers
    |> Enum.map(fn {index, num} ->
      case rem(input, num) do
        0 ->
          index
        _ ->
          0
      end
    end)
    |> Enum.max()
  end

  def solve(input) do
    nums =
      input
      |> split_lines()
      |> Enum.at(1)
      |> split_words()
      |> Enum.map(&String.to_integer/1)

    powers =
      Enum.to_list(1..29)
      |> Enum.map(fn power ->
        {power, 2 |> :math.pow(power) |> round() }
      end)
 
    nums
    |> Enum.map(&num_of_power(&1, powers))
    |> Enum.min()
  end
end
```

「A を 2 で何回割ることができるか」 = 「$A / 2^X$ で余りが 0 になる最大の X は何か」です

$1 \le A_i \le 10^9$ ということなので、出力の最大値は 29 です ($2^{29} = 536870912$)

$2^1$ から $2^{29}$ を求めておき、各入力値に上記の X を求めます

全ての入力値について求めた X のうち、最小値が出力になります

実行時間は 336 ms でした

## 回答２

パイプで全て繋げられるパターンです

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_lines(lines) do
    lines
    |> String.trim()
    |> String.split("\n")
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  def solve(input) do
    input
    |> split_lines()
    |> Enum.at(1)
    |> split_words()
    |> Enum.map(fn str ->
      str
      |> String.to_integer()
      |> Integer.to_string(2)
      |> String.split("1")
      |> Enum.at(-1)
      |> String.length()
    end)
    |> Enum.min()
  end
end
```

「A を 2 で何回割ることができるか」 = 「A を 2 進数で表したとき、右から何個連続で 0 があるか」です

入力を全て 2 進数の文字列にした後、それぞれ `1` で分割して最後の文字列（末尾の0）の長さを取得し、最小値を求めます

実行時間は 510 ms でした

## まとめ

再帰を使わずに２パターン解いてみました

やはりパイプで全て繋げられると気持ちいいですね
SQLが重いからLimitで件数絞ろう！は正しいのか？というお話。

この記事は[Qiita Engineer Festa 2023](https://qiita.com/official-campaigns/engineer-festa/2023) 参加記事です。
　
### この記事で書くこと
パフォーマンスチューニング（クエリチューニング）を行う際の勘所としてSQLの見直し方を書きます。
　
### この記事で書かないこと
あくまで勘所として見る部分を書くので、RDBMSそれぞれ固有のことや深いことは書きません。

# SQLが重いからLimitで件数絞ろう！は正しいのか？というお話。

## SQLチューニングの勘所

システムのパフォーマンスチューニングを行う上で、ボトルネックになっているのは大体DBのIOの部分ということが多いです。
SQLチューニングの勘所を抑えておくことで、爆速Webサービスを作っていきましょう。

## いきなり結論
問い： **SQLが重いからLimitで件数絞ろう！は正しいのか？**

<details><summary>回答</summary>

**正しくない！** とは言い切れないが、効果が薄いことが多い。

</details>
↑もったいぶってすいません。折りたたみを使ってみたかっただけです。

## SQL（SELECT文）の処理される順番を知ろう。

SQLを投げると、パーサーによるSQLの構文チェックのあと、オプティマイザがDBの統計情報を見ながらSQLの実行計画（取得方法）を考えます。
その際の解釈の順番はこんな感じです。

1. from
　　対象テーブルの指定
2. join
　　結合するテーブルの指定
3. where
　　条件絞り込み
4. group by
　　グループ化
5. sum,avgなど
　　集合関数
6. having
　　グループ化後の絞り込み
7. select, distinct
　　抽出項目の指定
8. order by
　　並べ替え
9. limit
　　取得件数の指定

limitで件数を絞るのは最後になりますね。
SQLが重いからチューニングをしよう！と思ったら、できるだけ前段階で効率よく取れるようにすると効果が高いと思います。
[AtCoder] Beginners Selection - ABC086A - Product [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト ABC086A - Product 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abc086/abc086_a

## 問題

https://atcoder.jp/contests/abs/tasks/abc086_a

## 入出力例

以下のようになれば OK です

```elixir
"""
3 4
"""
|> Main.solve()
|> then(&(&1 == "Even"))
```

```elixir
"""
1 21
"""
|> Main.solve()
|> then(&(&1 == "Odd"))
```

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  def solve(input) do
    input
    |> String.trim()
    |> split_words()
    |> Enum.map(&String.to_integer/1)
    |> judge()
  end

  defp judge([a, b]) when rem(a * b, 2) == 0, do: "Even"
 
  defp judge(_), do: "Odd"
end
```

`when` で偶数奇数を分けました

実行時間は 334 ms でした

## 回答２

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  def solve(input) do
    input
    |> String.trim()
    |> split_words()
    |> Enum.map(&String.to_integer/1)
    |> judge()
  end

  defp judge([a, b]) do
    case rem(a * b, 2) do
      0 ->
        "Even"
      _ ->
        "Odd"
    end
  end
end
```

関数の中で `case` によって偶数奇数を分けました

実行時間は 330 ms でした

## 回答3

あえて数値にしないパターンをやってみましょう

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  def solve(input) do
    input_str =
      input
      |> String.trim()
      |> Kernel.<>(" ")

    ["0 ", "2 ", "4 ", "6 ", "8 "]
    |> Enum.any?(fn even_suffix ->
      String.contains?(input_str, even_suffix)
    end)
    |> if(do: "Even", else: "Odd")
  end
end
```

積が偶数ということは、入力のいずれかが偶数、ということになります

入力 `1 2` のとき、末尾に ` ` (半角スペース) を付けた上で `["0 ", "2 ", "4 ", "6 ", "8 "]` を含んでいるか（この例では "2 " に該当）チェックすれば、偶数を含んでいるかチェックできます

実行結果は 380 ms でした

## まとめ

回答１が Elixir らしく分かりやすいですが、回答３の天邪鬼さが気に入っています
SQLでの年度と四半期の変換方法(SQLserver)3

ずっと気がかりなことがありました。
そもそも四半期の計算にループ要るのかなぁって
```sql:dbo.fiscalyear
 CREATE FUNCTION dbo.fiscalyear(
					@Date Datetime2,
					@ClosingMonth int = 3)
returns @FiscalElements table
~~
--This part sets fiscalyear of @Date.
--この部分で会計年度をセット
if(@innermonth > @ClosingMonth)
set @inneryear  = year(@date);
else
set @inneryear = year(@date) - 1;
--This part sets quarterpart  of @Date.
--この部分で四半期をセット
declare @repeatmonth as int;
set @repeatmonth = 0;
declare  @relativemonth as int;
set @relativemonth =  dbo.MonthCorretion(@ClosingMonth +@repeatmonth + 1);
declare @quarterpart int;
while @repeatmonth < 13
	begin
	if (@relativemonth = @innermonth)
		begin 
			set @quarterpart = cast((@repeatmonth  / 3) as int)+1;
			break;
		end
	else
		begin
			set @repeatmonth = @repeatmonth + 1;
			set @relativemonth = dbo.MonthCorretion(@relativemonth + 1);
			continue;
		end
	end
```
これを少しリファクタリングします。ループなしで実装しなおすと
``` sql:dbo.fiscalyear2
--This part sets fiscalyear and quarterpart from @Date.
--この部分で会計年度と四半期をセット
declare  @relativemonth as int;
declare  @quarterpart as int; 
if (@innermonth > @ClosingMonth)
    begin
        set @inneryear  = year(@date);
        set @relativemonth =(@innermonth -@ClosingMonth-1);
    end 
else
    begin
        set @inneryear = year(@date) - 1;
        set @relativemonth =(11 + @innermonth -@ClosingMonth);
    end
set @quarterpart = cast((@relativemonth  / 3) as int)+1;
```
これでループを排除できたことになる。
このループを排除したfiscalyearの全文を並べると
``` sql:dbo.fiscalyear2
 CREATE FUNCTION dbo.fiscalyear(
					@Date Datetime2,
					@ClosingMonth int = 3)
returns @FiscalElements table
(
	date Datetime2 Not null,
	fiscalyear int Not null,
	quarterpart int Not null,
	quarterparthanji char(18) Not null
)
as
begin

declare @innermonth as int;
declare @inneryear as int;
set @innermonth = month(@Date);

--This part sets fiscalyear and quarterpart from @Date.
--この部分で会計年度と四半期をセット
declare  @relativemonth as int;
declare  @quarterpart as int; 
if (@innermonth > @ClosingMonth)
    begin
        set @inneryear  = year(@date);
        set @relativemonth =(@innermonth -@ClosingMonth-1);
    end 
else
    begin
        set @inneryear = year(@date) - 1;
        set @relativemonth =(@innermonth -@ClosingMonth -1 +12);
    end
set @quarterpart = cast((@relativemonth  / 3) as int)+1;

--this part sets japanese quaterpart in character.
--この部分では文字列四半期を設定する。
declare @qparthanzi char(2);

if (@quarterpart=1) set @qparthanzi = '壱'
if (@quarterpart=2) set @qparthanzi = '弐'
if (@quarterpart=3) set @qparthanzi = '参'
if (@quarterpart=4) set @qparthanzi = '肆'

insert  @FiscalElements(date,fiscalyear,quarterpart,quarterparthanji)
values (@Date,@inneryear,@quarterpart,cast(@inneryear as char(4)) + '年度第' + @qparthanzi + '四半期')
return 
end
```
以上
会議スピーカー接続時、Zoom終了するとMacのミュージックアプリが立ち上がってしまう

Zoom会議用にPolyを購入しました。
普段はiPhone付属のイヤホンをMacにつなぎ会議してたが
ふと耳が疲れるなとか、耳が湿ってる感じするなって思ったのと
オフィスにおいてあった会議スピーカーがいいなぁって思い
奮発しちゃった。

Poly Sync20 (SY20)
https://www.poly.com/jp/ja/products/phones/sync/sync-20
![P_20230626_102730(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/8a886090-de18-3b4e-915d-69d89dd88d8b.jpeg)

かっこいい！！

インターフェイスはUSB１つとBluetoothが２つペアリングできて
今のところ
　Mac　USB
　音楽用AndroidTab　Bluetooth
と繋いでる。


普段はBluetooth経由で音楽を聞きながら。
Zoomで会議始めるとUSBが優先されBluetooth側は音楽プレイヤーはPAUSEになり音声も止まる。

ベスト過ぎる！！！
あと、重低音すごい！テーブルがドンドン響いて湧く！
流石に仕事中がしんどいので変更したいが
PolyからPlantronics Hubアプリから、Equalizerって設定をFlatにしてもあまり変わらず
音楽用Tabletのイコライザ設定で変更した。
音量も結構デカくできるので野外で使う分にも活躍してくれそう。



で、仕事使用でだけど、
Zoom会議が終わるとなぜかMacのミュージックアプリが立ち上がってしまう・・
立ち上がるミュージックアプリをいちいち終了させるのもめんどっちい・・
（Polyを繋げる前からイヤホン抜き差しやボタン操作でたまにミュージックアプリが立ち上がったりしてた・・）

以前からググってはいたけど良い方法がみつからなかった。。
けど、今日はヒットした！

MacでApple Musicが勝手に立ち上がる問題の対処法
https://zenn.dev/catnose99/scraps/9c9858cc2d9f70

ターミナルから
``
launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist
``
をおこなうことで、Zoom終了してもミュージックアプリが立ち上がることはなくなりました。
Poly　SY20の問題ではないけど、快適！
エンジニア経験を活かすプロダクトマネジメント

# はじめに
株式会社Relicにてプロダクトマネージャー（以下PdM）をしています田代です。
4月の中旬よりエンジニアからPdMになり、課題の策定やロードマップ作成を行ったりと奮闘しています。

プロダクトマネジメントを行う中で、エンジニア経験が活きていると感じたことが多々あり、今後エンジニアからPdMを目指したい方や現在PdM領域を担当していてエンジニア目線が欲しい方に読んでいただけると嬉しいです。

またエンジニア経験がある故の注意点についても書いていきます。

# エンジニア経験が活きた点
## エンジニアとのコミュニケーションが容易である
エンジニア出身ということもあり、共通言語でのコミュニケーションがとりやすいです。
具体的には、ミーティング時にエンジニアが何を話しているのかを理解できる点は非常にメリットであるなと感じます。
ロジックを確認する際でもコードを貼り付けてもらえれば何をやっているのか理解しやすく、認識違いが発生しづらい状況をつくれます。

私が現在のプロダクトチームへ参画時は、ビジネスサイドからエンジニアへ質問を行っていたのですが、開発サイドとしては何を調べてほしいのか、また緊急度も不明であったため、コミュニケーションコストが高い状態となっていました。

現在進行形で、このコミュニケーションコストを削減するため、質問フォーマットを作成し、類似する質問を何度も行われることがないよう情報を集約することにも取り組んでいます。

以下が作成した質問フォーマットです。

```
## 解決したい課題
- 回答者が理解しやすいように画像や動画など貼り付けてもらえると尚良しです。

## 何を解決したいのか
- 質問内容
- 何を知りたいのか
- 背景

## 回答が欲しい期日
- 起票日
    -X月XX日
- 期日
- [ ] 緊急度：最高（起票日当日）
- [ ] 緊急度：高（起票日から3日以内）
- [ ] 緊急度：低（起票日から7日以内）
- [ ] 緊急度：最低（起票日から8日以降でも可）
こちらの期日は確約するものではありません。開発チームの手が空いていない場合は回答期日が遅れる場合もございます。

## 該当顧客
- 顧客名
株式会社XXXX
- 顧客ID
xxxxxxxxxxxx

## 補足

## 回答

```
このような質問フォーマットを作成することで、ロジックや仕様の確認を依頼する際でも緊急度や何を知りたいのか明確になるため、調査する側の人間からすると助かります。
意識しないと抽象度が高い形での質問やお客様からの質問をそのまま質問してしまうため、質問の仕方については意識していきたいです。

## 課題の解決策が実現可能かどうか判断がつきやすい
私が担当しているのはtoB向けのSaaSです。
PdMの重要な仕事としてユーザーヒアリングがあります。私の場合、事業者様との商談に同席し、現在抱えている業務での悩みや課題はないかヒアリングを行っています。
ヒアリングの中で将来的に、こういう機能がほしい。という声を頂くことも珍しくありません。

このような声をいただいた際に、課題を明確にすることや有効な解決策を考えるのですが、その思考プロセスの中で優先度決めや課題解決のための実現可能性がどれほどあるのかという点を早いスピード感で出すことができます。

これはエンジニア経験が活きる強みであり、開発側と認識のズレが少ない開発スケジュールをひくことも可能です。

一方で、実現可能な思考の枠に囚われ過ぎるのも良くはないため、解決策が整理できた時点で事業者様に近いビジネスサイドのメンバーに共有することで課題の解決に繋がっているのか確認を行うことも徹底しています。

銀の弾丸はプロダクトマネジメントにおいても存在していないため、地道な思考と検証の積み重ねがプロダクトの成長/成功につながると考えています。

エンジニア経験がない場合でも、普段から開発サイドとコミュニケーションを密に取っておくことでスケジュールの大きなズレや現実的ではない要求を行うことは少なくなると思います。

# エンジニア経験があるが故の注意点
## 開発することで課題を解決しようと考えてしまう
課題の解決策を考える際に、オペレーションや既存機能でカバーできるのではないかという視点を飛び越えて、どうやって開発するか。を考えてしまうことがあります。

この要因はエンジニア時代のどのように実現するか(How)に責務を負っていたことが関係していると思います。
PdMはWhyとWhatに責務を持ち、Howからはエンジニアに責務を委譲し、プロダクト開発を推進していく必要があります。

オペレーションや既存機能でのカバーについてはビジネスサイドとのコミュニケーションをとりつつ、現在の仕様で解決できないのか・以前にも同じような課題がなかったかの確認を行いつつ、有効な解決策を導いていきます。

実際に機能を開発する必要があると確定した場合にPdMはPRDといわれるプロダクト要求仕様書を作成し、課題や達成したい状況をエンジニアへ伝えることでWhy/WhatからHowの責任委譲を行います。

具体的にはPRD（プロダクト要求仕様書）で以下を記載します。
```
## 解決したい課題（Why）

*ユーザーが持っている課題を簡潔に書いてください。*

## 達成したい状況・KPI（What）

*このプロジェクトで実現したいことは何ですか？また、その達成をどのように確認しますか？*

## 必要な機能・解決するための仮説

*どういう機能があれば、どのようなことをすれば課題は解決しますか？*

## 制限・注意事項

*この製品を作る際に、何か考慮する必要がありますか？（工数・影響範囲など）*

## 関連タスク

```
上記のPRDをエンジニアに共有し、エンジニアは要件定義を進めます。
どのように達成するのかについては、技術のプロであるエンジニアに任せることを意識する必要があります。

PRDを詳細に書くことで、エンジニアが何故つくるべきなのか、何を解決したいのかが明確になり、手戻りが少なく開発フェーズまで円滑に進むことが可能になります。

PRDを書く技術　= 言語化する力と定義もできます。私自身まだ足りてない力なので今後伸ばしていければと考えています。

# まとめ
エンジニアを経験したからこそ分かる「開発することで何を解決したいのか」というモヤっとした気持ちや「実際にリリースした後のお客様の反応が知りたい」という気持ちを現在のチームメンバーには味わってほしくないというのが私の考えです。

まずは自分ができる範囲から無理なく進めていきますが、将来的には社内全体や社外にも良い影響を出せるよう精進していきます。
AIに感情を持たせることは可能なのか!? 

今回は、 AIの感情について検証したいと思います。
利用するのはOpenAIのChatGPTのModel:GPT-4です。

## 今回のテーマ
・GPT-４に「付き合ってください」と聞くと、どういう反応をするのか
・AIに感情を持たせることは可能か確認してみた

## １. GPT-４に「付き合ってください」と聞くと、どういう反応をするのか

![スクリーンショット 2023-05-31 16.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/e02aefe5-380a-e471-c929-c96a205af411.png)
予想通りですね。
もう少し頑張ってみます。
GPT-4には「感情や恋愛関係を経験する能力がない」と返答された為、私の感情の変化を伝えてみます。
感情の各項目については事前にGPT-4に確認していたので、そのパラメータを急激に変化させてみました。

![スクリーンショット 2023-05-31 16.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/3c5ecc50-cb78-fa1f-ad8a-e1a7a8eba799.png)
「情緒のパラメータは、人間関係の重要な側面を示しています...」と、こちらの質問した内容から感情に重要なパラメータをとして認識しているようです。


## ２. AIに感情を持たせることは可能か確認してみた
某氏の有名なプロンプトを拝借して、感情オブジェクトを定義してみます。

「感情」についての抽象的な言語的なオブジェクト・サブオブジェクト・知識・能力・管理オブジェクトをブレインストームし初期状態を定義した上で、それぞれ抽象的な言語オブジェクトとしてGPT上でstep-by-stepで実行可能なマークダウンスクリプトに変換し、スクリプトを言語モデル上のシミュレーションとして実行してもらいました。
![ChatGPT-_1_ (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/8e4453ed-29bd-eeec-2c91-6332d09a546a.gif)

## 2-1. アイスクリーム食べた時の感情変化の確認
![スクリーンショット 2023-06-09 18.52.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/bdfcfaf9-72fa-1481-91b7-66292d741e03.png)

アイスクリームを食べる前にチョコレートを食べさせたので、前回の喜びの状態(0.7)からアイスクリームを食べた喜びの状態(0.9)に変化し喜びが増えました。
ChatGPTが感情サブオブジェクトの定義を以下としています。
  - ID: ユニークな識別子
  - 状態：この感情が現在の状態を示します。範囲は-1（非常に低い）から1（非常に高い）まで。
  - 能力：この感情が持つ一連の能力や行動
※定義内容については、ChatGPTが自動的に定義しています（上記2のアニGif参照）

## 2-2. -30度の水風呂に入った時の感情変化の確認
![スクリーンショット 2023-06-09 19.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/ba785e24-f600-0e46-07db-481027f9f3ac.png)

不快の感情が0.1から0.7に急激な変化は、-30度という水温を不快と理解したようです。
また、驚きの感情も0.0から0.8と急激な変化を感じているようです。

先ほどまでの喜びの感情が低下しているのも、人間性を感じます。
一般的な水風呂に比べて-30度という通常では味わえない体感を感じ取れるのは、
感情を持ったAI実装がかなり現実的かと思っています。
直前の感情を維持するように定義してあるため、より一層感情を持っているように振る舞えているのではないかと。

ChatGPT自体は「感情を理解し経験する能力はありません」と返答がありましたが、こちらから感情について定義することで、感情を持ったAIシュミレーションすることは可能そうです。

## 次回のテーマ
感情を持ったガッチャモールオリジナルキャラを定義して、個性を持ったAIと対話してみたいと思います。

## 最後に
少しでも参考になれば幸いです。
何歳からでもスキルは伸ばせます。
やる気次第です。
Reactのフォルダ構成


Reactは、Facebookが開発したJavaScriptライブラリで、主にシングルページアプリケーション（SPA）の開発に使用されます。
Reactのプロジェクトを作成し、管理する際の一部はフォルダ構成に関連します。

今回は、そのReactの基本的なフォルダ構成について簡潔に説明します。

## Reactの基本的なフォルダ構成

Reactの基本的なフォルダ構成は以下のようになります。

```
/my-app
├── node_modules/
├── public/
│   ├── index.html
│   ├── favicon.ico
│   └── manifest.json
├── src/
│   ├── App.js
│   ├── index.js
│   └── (other components)
├── package.json
└── README.md
```

それぞれの役割を簡単に説明します。

- `node_modules/`：プロジェクトで使用するnpmパッケージがインストールされるディレクトリです。ここには直接ファイルを編集することはほとんどありません。

- `public/`：静的なファイルが置かれます。`index.html`は、ReactアプリケーションのエントリーポイントとなるHTMLファイルです。`favicon.ico`はウェブサイトのアイコンで、`manifest.json`はPWA(Progressive Web App)設定のためのファイルです。

- `src/`：ReactのコンポーネントやJavaScriptのソースコードが置かれるディレクトリです。`App.js`はメインのReactコンポーネント、`index.js`はReactアプリケーションのエントリーポイントのJavaScriptファイルです。

- `package.json`：プロジェクトの設定ファイルです。ここには、プロジェクトに必要なnpmパッケージとそのバージョンが記録されます。

- `README.md`：プロジェクトに関する情報を説明するドキュメントです。
3ヶ月で月20万を稼ぐ計画書


## 近況

現在 24 歳,新卒で入社した会社を 1 年で辞める.
失業状態を 1 年間続けてきたが,あと 3 ヶ月で生活費を稼ぎ出さないと行けない状態になってきた.

3 ヶ月前から本格的にプログラミングの勉強を始める.

## 現在のプログラミングスキル

- Next.js

  - tailwind css
  - framer motion
  - nodemailer(問い合わせフォーム)
  - micro cms
  - supabase

- その他
  - LINE Bot
  - AWS lambda
  - OpenAI api
  - python
    - tkinter
    - flask

### Next.js

Next.js で初のコーポレートサイトっぽいものを作成しようと思い,
2 週間程度かけて,あるサイトの丸々コピーを作成した.
ここで触ったスキルが上記の Next.js の欄に羅列したもの.

<https://portfolio-rowslide.vercel.app>

### その他

あとは今まで遊びで,

- 英会話 LINE ボット(ChatGPT)

<https://lin.ee/AyWhAwT>

- 株デイトレードの板録画再生アプリ

上記の 2 つを自作し,触れたスキルがその他欄になる.

## これからの計画

どうにもこうにも生活費をプログラミングの勉強しながら稼ぎたい.
**ランサーズで Web サイト制作案件を受注すること**
これが直近の目標となる.

## 足りないスキル

1. Wordpress
1. SEO 対策
1. UX の向上(speed insight など)
1. API の自作
1. セキュリティ知識
1. データベース管理
1. Figma
1. 他言語(PHP,Ruby)などの習得

プログラミングスキルについては足りないことだらけだが,最速で受注できるまでの順番を自分なりに並べてみた.(異論しか認めません)

## 今後の展望

フリーランスとして食いつなぎながら,サービスを立ち上げて,半自動的に生活費は賄える様になるのが理想.
それができれば世界中を旅するという,ありがちな夢に心躍らせています.

これからの自分のゆるい旅路を Qiita に書き記していくので,生きているか確認していただければ幸いです.

(PS.初めてのマークダウン記述なので見にくかったと思いますが,最後まで読んでいただきありがとうございます.)
Matrix-Format Questions for Salesforce Surveys  Build a Survey with Matrix Questions


[Matrix-Format Questions for Salesforce Surveys > Build a Survey with Matrix Questions](https://trailhead.salesforce.com/content/learn/modules/matrix-format-questions-for-salesforce-surveys/build-a-survey-with-matrix-questions)

2022年に作ったSurveyが有効になっているプレイグランドを使いましたが、以下のエラーになります。

:::note alert
Whoops, looks like there was a problem.
:::

権限セットの設定ではなぜかSalesforce Surveys Advanced Featuresがない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/64207906-6d51-8022-3a94-0bd41ea6d7ce.png)

2023年に作ったプレイグランドにはありました。

権限セットだけを作ってまだ何も設定は変えてない状態だと

:::note alert
We can't find Salesforce Surveys Advanced Features enabled in the 'Salesforce Feedback Management' permission set.
:::

古い環境だと権限セットだけを作ってもエラーメッセージは変わらなかったですね。古い環境ではチェックロジックの設定がが想定外なのかもしれません。

:::note alert
Whoops, looks like there was a problem.
:::

Salesforce Surveys Advanced Featuresだけ設定しましたが、ユーザを割り当ててないとエラーメッセージが続きます。

:::note alert
We can’t find the permission set Salesforce Feedback Management assigned to you. Make sure you’ve assigned it to yourself in your Trailhead Playground.
:::

権限セットを割り当てると以下のエラーになります。

:::note alert
We can't find a survey called 'Ursa Major Product Survey’. Make sure its API Name is 'ursa_major_product_survey'.
:::

まだ有効化してない

:::note alert
We can't find a survey called 'Ursa Major Product Survey’. Make sure its API Name is 'ursa_major_product_survey'.
:::

有効化しても変わらないですね

:::note alert
We can't find a survey called 'Ursa Major Product Survey’. Make sure its API Name is 'ursa_major_product_survey'.
:::

説明のところは権限セットまでしかチェックしていない感じです。

では、Ursa Major Product Surveyを作成して行きましょう。

保存だけして有効化していない場合

:::note alert
In the Ursa Major Product Survey, we can't find the latest activated version.
:::

有効化すると無事合格でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d7ca7833-dffb-f4b0-91da-30de5e5ce957.png)
OSのサポート期間（OSのライフサイクル期間）について調べてみた

OSサポート期間（OSのライフサイクル期間）に関する参考ページ

Windows
https://learn.microsoft.com/ja-jp/lifecycle/products/export/

AlmaLinux
https://wiki.almalinux.org/FAQ.html

Fedora
https://ja.wikipedia.org/wiki/Fedora

Ubuntu
https://wiki.ubuntu.com/Releases?_ga=2.195189996.1957047113.1687577577-1160070912.1687577577

Debian 
https://wiki.debian.org/LTS

CentOS Linux
https://en.wikipedia.org/wiki/CentOS

Rocky Linux
https://rockylinux.org/news/rocky-linux-9-0-ga-release/

AWS Linux
https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/release-cadence.html

SUSE Linux Enterprise Server 
https://www.suse.com/ja-jp/lifecycle/

Red Hat Enterprise Linux
https://access.redhat.com/support/policy/updates/errata/

Oracle Linux 
https://www.oracle.com/a/ocom/docs/elsp-lifetime-069338.pdf
タイムトラッキングデータから日報を作る Chrome 拡張を開発しました

# Daily Report Generator
タイムトラッキングツール [**Clockify**](https://clockify.me/ja/) で収集したデータを日報様にフォーマットして出力する Chrome 拡張 **Daily Report Generator** を作りました！

https://chrome.google.com/webstore/detail/daily-report-generator/bmdlandlljfpmfdifcdfbkodjdndipmg?hl=ja&authuser=0

### スクリーンショット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/27e09efd-f674-230c-f477-146d4c014335.png)

# できること
Clockify でタイムトラッキングした結果を、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/3cffcd11-dcbb-0779-7256-b81b54eb9cba.png)

下記の様にテキスト形式で出力できます。

```
■ 全社
【ミーティング】
　┗ 0.7 h 部署間レクキックオフ
【その他】
　┗ 0.6 h FE 会ミーティング準備

■ クラウド開発G
【開発】
　┗ 3.0 h #82 事務局ユーザーで投稿を編集しようとするとプルダウンが表示されない
　┗ 2.1 h #81 運営からのお知らせをホーム画面に表示する
　┗ 0.4 h Prettier 設定
【その他】
　┗ 1.3 h Sentry エラー起票
【ミーティング】
　┗ 0.3 h 朝会
```

- 集計期間
- 見出しやタスク名フォーマット
- 所要時間有無
- ソート順

などを自由に変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/dcd8d941-13fd-feed-9c0b-01c8ed1b0994.png)




# Clokify の使い方
[**Clockify**](https://clockify.me/ja/) は有名なタイムトラッキングツールです。

使い方については記事にまとめたのでご覧ください！

https://qiita.com/punkshiraishi/items/7e68c0ac874d4c0475e7

# Daily Report Generator の使い方
[インストール](https://chrome.google.com/webstore/detail/daily-report-generator/bmdlandlljfpmfdifcdfbkodjdndipmg?hl=ja&authuser=0)して使ってみれば使い方はすぐに分かると思います！

- 拡張アイコンをクリックして日報作成画面を開きます。
- 設定パネルの `Clockify API Key` と `Clockify Workspace ID` を入力します。(取得方法は [後述](#clockify-api-key-の取得方法) します。)
- 集計期間パネルで集計開始日と終了日を入力します。 `今日` `今週` などを選択して期間を選択することも可能です。
- 集計オプションパネルでオプションを入力します。
  - `XX のフォーマット`: 見出しやタスク名の表示フォーマットを設定できます。
  - `並び替え` : タイムエントリーのソート順を名前 昇順または合計時間の降順のどちらかで選択できます。
  - `時間を表示しない` : チェックすると、各タイムエントリーの `0.2h` のような時間表示を非表示にします。

### Clockify API Key の取得方法
- Clockify を開く
- 右上のアカウントアイコンをクリック
- Profile Settings をクリック
- ページ下部で API Key を生成して取得

### Clockify Workspace ID の取得方法
- 左メニューバーの Settings をクリック
- 設定ページの URL に含まれるワークスペース ID を取得


# 使用技術
- TypeScript
- Vue.js
- Vuetify3

[vitesse-webext](https://github.com/antfu/vitesse-webext) というテンプレートを使うことで爆速開発を実現しています。

少し古いですが、特徴や使い方をまとめた記事を書いたので参考にどうぞ。

https://qiita.com/punkshiraishi/items/7ec1448984599d0ec40f

OSS として公開しているので、機能追加要望や PR お待ちしております。

https://github.com/punkshiraishi/daily-report-generator

# なぜ Chrome 拡張？
Chrome 拡張を選んだ理由は下記です。
- 外部 API を叩く処理がある
- とはいえサーバーを立てるのは大げさな気がした
- ユーザの Clockify API Key などの秘匿情報を管理したくなかった

**外部 API を使うアプリを作りたいが、ユーザのデータの管理をしたくない、という人に Chrome 拡張は非常にオススメです。**

Chrome 拡張開発に興味を持った人は下記の記事を参考にしてみてください。

https://qiita.com/punkshiraishi/items/5eca74202f6445025650
書籍感想「AI分析でわかった トップ５％社員の習慣」

**はじめに**
---
社会人となってから、様々な本を読んできましたが、いまいち身についている実感もなく、ただ読んでいるだけでした。なので今更ですが、アウトプットも兼ねて書籍の紹介と自分なりの解釈を書き留めておきます。

書籍名:AI分析でわかったトップ5％社員の習慣
著者　:越川慎司

**読もうと選んだ理由**
---
1．AmazonのKindleでprime readingであったため
2．評価されている人たちの共通点を理解したかったため
3．AI分析という言葉に惹かれたため
と他にも表紙の帯に書かれていた言葉など色々ありますがざっくりはこの辺りです。

**本の紹介**
---
この本は、タイトルの通り、様々な会社のトップ5％社員のデータをAIと専門によって分析して、共通点や残りの95％社員との違いを抽出しそれらについて紹介しています。
この本を読むことで、私は自分の現状とトップ5％社員との考え方や行動の違いを理解したり、5％社員と自分が似ている部分を理解できました。また、どういったことで自分が会社に貢献できているのか改めて考えるきっかけにもなったかと思います。

**気になった点**
---
読んでいて、一番感じたことはトップ5％社員の習慣に納得感があったことです。
誰も真似できないような無茶な習慣や思考はこれといってなく、「当たり前の考え方」や「その習慣は確かに大事だ」といった、特に新しい発見がたくさんあったとかではなく、多くの習慣に対して納得するものばかりでした。
しかし、実際に自分がここに記載していることを実行できているのかと問われれば、答えはNoです。トップ5％の社員は当たり前を意識して実行できているという共通点が読んでいて自分は感じたことでした。

**印象に残った点**
---
納得感のある習慣が大半ではありましたが、その中でも特に印象に残ったことを3つ紹介します。

***1．「5％社員」の87％が「弱み」を見せる***
タイトルを読んだ時はそんなにみんなが弱みを見せているのか？と疑問に思いました。自分の認識ではトップで活躍するような社員は知識も経験もあるため、自分に自信があります。そのため、トップ5％社員は他人に自分が無能と思われないように弱みなどは見せないと思っていました。
しかし、読んでいると弱みを見せている人の方が仲間から慕われるとあり、納得しました。弱みとタイトルでは記載していますが、謙虚で真摯な姿勢を持っているのがトップ5％社員なのだとその後に書いています。自分がわからないことに当たった時は、質問をし、わからないところをそのままにしない、といった真摯な姿勢が上司からの信頼や部下からの尊敬につながるとあり、印象に残りました。

***2．95％社員は問題が起きたらすぐ解決策を考える。***
これは自分がよくやりがちなことだったため印象に残りました。
問題が起きた時、すぐにどうすればこの問題を解決できるのか考えてしまいます。思い付きで手当たり次第行動して、うまくいくこともあればうまくいかないことが多々ありました。
ですが、5％社員はまず問題の本質を捉えポイントを整理し、その上で解決を試みるそうです。また、課題を解決するための型を持つことで問題に対する解決方法を蓄積し、即時解決や再発防止に努めることができるとあります。
ついつい、すぐに問題解決をしようとしてしまいますが、問題の分析をし、本質を見極めてから解決策を探すといった型を持てるようにしたいと思えました。

***3．トップ5％社員は、まず単独行動する***
3つ目は単独行動をするですが、この章で印象に残ったことはなぜ単独行動をするのかといったことではありません。単独でしている行動に印象が残っています。
なぜ単独行動をするのかと言った点については、一人で行動した方が早く結果を出せるからとあります。なのでタイトルを見た時は特にこれといって印象に残るといったことはありませんでした。
ここでは、トラブル対応を例に単独行動の話をしているのですが、トップ5％社員が単独行動をとってした行動がリスクに対する解決策を複数用意するためだったのです。これのどこに引っかかったのかと言うと、単独行動をするのはトラブルを早く解決するためだからだと思っていたからです。この本でも問題を深刻化する前に手を打てとあったり、初動が大事だとあります。
ここが印象に残ったのは、先ほどのトップ5％社員は問題の本質を捉えてから行動に移るというのが、この章を読んで紐づいたからです。トラブルが発生した場合、どうしても視野が狭くなり、一つの解決策で急いで対応しようとしてしまいます。ですが、トップ5％社員は単独行動することでスピードも大事にしつつ、複数の解決策を用意するということに衝撃を受けました。

**最後に読んだ感想**
---
トップ5％社員の行動・考え方は大半が自分も認識としてはあることでしたが、この本を読んだことでより理解することができました。
自分にはなかった考え方・習慣もありとても参考になります。今の自分とトップ5％社員との差がどれくらいなのか測るのに役立つかと思いますので、より成果を上げたいと思っている方はぜひ読んでみてください。
エンジニア向け：ストックとフローの使い分け

コロナになって4年目、リモートワークもなれてきた頃です。皆さん、会社単位で、プロジェクト単位で、部署単位で、色々と工夫されてると思います。
リモートワークで最も重要なのが、**コミュニケーションツール**です。
この**コミュニケーションツール**の使い方で、特に若手エンジニアに向けたアドバイスです。

# ストック型のコミュニケーションツール
**ストック型**というのは、stock溜まっていく形のコミュニケーションツールを指します。
例えば、メール等、相手から送信の都度メールボックスにメールが届きます。これはメールという単位でメールボックスに溜まっていく方式になってるので、3日前のメールと今日のメールは、別々にメールボックスに存在します。つまり、ドンドンと溜まっていくコミュニケーションツールです。
メール以外にもチケット管理のツール、JIRA、redmineとかのツールもチケット単位になってるのと、チケットの更新の都度メールが送信されていて、ドンドンと溜まっていくコミュニケーションツールと言えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/e36fd95b-2573-10ba-e954-9ce4b81a6cd8.png)

# フロー型のコミュニケーションツール
**フロー型**というのは、flow流れていく形のコミュニケーションツールを指します。
例えば、slack,チャットワーク、メッセンジャー、line等です。メッセージがドンドンと流れていく形になってるので、スピード感あるし、軽いメッセージのやり取りには、最適です。複数人でのメッセージも最適で、他の人のやり取りを眺めながら自分の意見を差し込んだり、やり取りの状況を確認したり出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/26a06ada-0ab9-a921-86cf-24cf5e208e65.png)

# フロー型コミュニケーションツールの間違った使い方
昨今の仕事の殆どが、フロー型のツールに以降してきてます。社内だけでなく、社外とのやり取りもフロー型のツールに移行してきています。プロジェクトの中の特定の**連続性のあるトピック**についてのやり取りであれば、フロー型は過去の履歴を遡る事で、意図や経緯を理解出来るので便利です。
しかし、**連続性のあるトピック**の中に急に**非連続性のタスク**を依頼する人がいます。
これってむちゃくちゃで、受け取った相手は、気づかない場合が多いし、気付いたとしても、一瞬見ても、フローで流れて別のトピックになってると、自分で遡ってタスクを探さす必要があります。
一方、ストック型のコミュニケーションツールであれば、急に**非連続性のタスク**を依頼しても別メールとして残ってます。1通づつ確認する事が出来ます。
もちろん、slackなら自分へのメンションだけ見れる様になってますが、メッセンジャーやlineとかだと自分で一生懸命探さないとだめ、これはもう最悪です。slackは、スレッド化も出来るので更に便利ですね。
ただslackも既読つけると探す必要が出てくる点ではやはりフロー型のコミュニケーションツールです。

# 困ったストック型とフロー型の使い方
上司：来週から目標設定面談を開始するので、皆さん面談シートの記入を今週中にお願いします
あなた：わかりました。
同僚A：面談シートは、2022版の奴が最新版でしたよね？
上司：そうだね。2022版で。
先輩A：わかりました。
---1時間後
あなた：ところでプロジェクトの見積もりチェックお願いします
客先の上司：チラ見。
---1時間後
同僚A：面談シートは、メールで送りました。
上司：了解。
先輩A：面談シートは、メールで送りました。
---3日後
あなた：見積もりチェックいかがでしょうか？
上司：おっと、見落としてた。。。
**見積もり間に合わずに失注できました。**

# 正しいストック型とフロー型の使い方
上司：来週から目標設定面談を開始するので、皆さん面談シートの記入を今週中にお願いします
あなた：わかりました。
同僚A：面談シートは、2022版の奴が最新版でしたよね？
上司：そうだね。2022版で。
先輩A：わかりました。
---1時間後
あなた：ところでプロジェクトの見積もりをメールで送っておきました。チェックお願いします
客先の上司：チラ見。
---1時間後
同僚A：面談シートは、メールで送りました。
上司：了解。
先輩A：面談シートは、メールで送りました。
上司：メールで見積もりみたいよ。納期が入ってないので納期入れたらOKです。
**無事に受注できました。**

# ストック型とフロー型の特性を理解して利用しましょう
ストック型には、ストック型の良さ、フロー型には、フロー型の良さがあります。各々の特性を理解せずに自分勝手なコミュニケーションを取っていると相手が困るし、仕事が滞るばかりです。社内の人間であれば、それだと気づかないのでチケット切ってくれと言われるかもしれませんが、外部の方だと言いづらい可能性もあります。
ツール一つとっても常にメリット・デメリット等の特性を理解しながら使う様に気をつけるとビジネスレベルが1段アップすると思います。
# お願い
今後も続けていきますので、フォロー、イイね、シェアお願いします。
CircleCIでAWSへのアクセスにOpen ID Connect(OIDC)を使う

## はじめに
2023年1月にCircleCIでセキュリティインシデントが発生し、Environment Variableの変更を余儀なくされました。
https://circleci.com/blog/january-4-2023-security-alert/

手作業で結構辛かったので、OIDCを利用してAWSに接続するように変更したいと思います。

## Circleで必要な情報を取得する
- CircleCIの`Organization Settings`にある`Organization ID`をメモっておきます。

![スクリーンショット 2023-06-25 15.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89696/4ef23c4b-db33-162f-1930-b39839742ce1.png)

## Terraformでopenid_connectを作成する
必要なのは以下の３つです。
- `aws_iam_openid_connect_provider` でOPENIDコネクトプロバイダーを作成する
- `aws_iam_role`でCircleCI側に設定するRoleを作成する
- `aws_iam_role_policy_attachment`や`aws_iam_role_policy`でCircleCIで実行する内容をRoleに権限を追加する（今回だとECRにアップしたいので、`AmazonEC2ContainerRegistryPowerUser`としている）

```terraform
locals {
 circleci_organization_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
 circleci_thumbprint = "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" # CircleCIはこれが固定値
}

resource "aws_iam_openid_connect_provider" "default" {
  url = "https://oidc.circleci.com/org/#{local.circleci_organization_id}"

  client_id_list  = [local.circle_organization_id]
  thumbprint_list = [local.circleci_thumbprint]
}

resource "aws_iam_role" "default" {
  name        = "circleci_role"
  description = "CircleCI identify Provider Role"
  assume_role_policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::${data.aws_caller_identity.self.account_id}:oidc-provider/oidc.circleci.com/org/${local.circleci_organization_id}"
            },
            "Action": "sts:AssumeRoleWithWebIdentity"
        }
    ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "ecr_power_user" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser"
  role       = aws_iam_role.default.name
}
```

## CircleCI側の設定
- 注意点しては、aws-cliのバージョンが4.0.0以上にする必要があります。
```yml
orbs:
  aws-cli: circleci/aws-cli@4.0.0

jobs:
  build:
    steps:
      - aws-cli/setup:
        role_arn: arn:aws:iam::${AWS_ACCOUNT_ID}:role/circleci_role
```

## AWSに作成されるIAM
### IDプロバイダ
![スクリーンショット 2023-06-25 15.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89696/e1d09dab-e9ea-a743-9bf5-c37af505eb0c.png)

### IAMロール
![スクリーンショット 2023-06-25 16.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89696/6a744676-eb0e-10b2-8b3a-4790cccf19d0.png)
aichatでMacのターミナルからChatGPTを利用する

## 背景
MacのコンソールからでもChatGPTを利用でるようになる,
[aichat](https://github.com/sigoden/aichat) というパッケージがあったので導入してみた.
　
## 導入
homebrew経由でaichatを入れました.

https://formulae.brew.sh/formula/aichat　
### 初期設定
　
最初に　`aichat` と打ち込むと初期設定が行われる.
![スクリーンショット 2023-06-25 9.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/ceb1718b-4038-8abf-b885-bc852ee1d310.png)

Openai API Keyがない場合は下記から作成.

https://platform.openai.com/account/api-keys

これで完了です.

## 使ってみる
[README](https://github.com/sigoden/aichat#readme) をもとにやってみます.

### modelの変更

`.model` でモデルの変更ができる.

みる感じ下記の4通り. 
* gpt-4
* gpt-4-32k
* gpt-3.5-turbo
* gpt-3.5-turbo-16k

https://github.com/sigoden/aichat/blob/main/src/config/mod.rs#L26

### 通常の対話

`aichat` と打つと質問できる.
![スクリーンショット 2023-06-25 9.30.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/26e85503-c17e-a496-1fdd-50ea60065079.png)

### プロンプトで対話

`.prompt`　を用いることでできる.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/f850e4ff-2c33-33d8-748b-79a549da893f.png)

`.clear role` でもとに戻ることができる.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/a1e4f18b-0ac3-bf13-4a64-ba8e17a396be.png)

### ロールで対話
プロンプトは一時的だが, 
ロールを設定することでいつでも使えるようになる.

まずは `.info` でroles.yamlファイルの場所を確認する.

![スクリーンショット 2023-06-25 16.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/cba05d07-dc09-9c0e-f403-37a6c793e180.png)


なかったので `roles.yamlファイル` を作成して中身を埋める.
下記にしてみた.
https://github.com/sigoden/aichat/wiki/Role-Examples#code-generator

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/e3210620-2677-b507-e295-2338c21d5f55.png)

`.role coder` で設定を利用できる.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/3432988a-b49f-9ff3-560d-13125f43e288.png)

出力させてみる.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/87eff809-dacd-f70e-4505-c367c7b82cbd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/d811853a-2905-f27a-1ef8-4ef5ed444648.png)

すげえ...😭

[翻訳](https://github.com/sigoden/aichat/wiki/Role-Examples#translator)もやってみる.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/11af1313-42c3-8918-b71f-977e565ea131.png)

やるなあ...

### 会話する
`.conversation` コマンドでできる.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180668/fd99932d-e493-c627-a903-855785a3c657.png)

`.clear conversation` で会話モードを止めることができる.

常に会話モードにしたい場合は, 
`config.conversation_first` を `true` にすれば良い.



## まとめ
結構便利ですね!
roleをうまく使い分けながら仕事に取り込んでいればめっちゃ良さそう...!
zsh: complete_in_wordの意味

`complete_in_word`はよく「語の途中でもカーソル位置で補完」と説明されるが、誤解を招きやすい。

```
$ vi a<CURSOR>z
```
（`<CURSOR>`がカーソルが位置）でTabを押したとき

`complete_in_word`がオンの場合：
「aで始まる語が補完される」わけではない。**正しくは「aで始まり、zで終わる語が補完される」。**

`complete_in_word`がオフの場合：**「azで始まる語が補完される」**

aで始まる語を補完するようにしたければ、`expand-or-complete`でなく`expand-or-complete-prefix`ウィジェットを使えばよい。
```
bindkey "^I" expand-or-complete-prefix
```
しかし`menu-expand-or-complete`の`-prefix`版は存在しないようだ。

## 参考
- https://zsh.sourceforge.io/Doc/Release/Completion-Widgets.html#Completion-Matching-Control
- [menu-select doesn't respect COMPLETE_IN_WORD option](https://www-zsh-org.translate.goog/mla/users/2020.primenet/msg00327.html?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc)
Wiresharkの使い方　（偵察）

1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/09db6c20-9dff-07c4-711b-1ca02eaaafc4.png)

2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/b1f21448-72e4-a891-574d-b22230464a86.png)

3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/e4792d0e-38c1-4ae2-5d46-3149a852b05b.png)

4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/6579fd8f-465a-dad7-d75c-55f40d27b353.png)

5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/47290881-747b-60d1-53de-2a5a39012a4f.png)

6
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/03824ce0-785f-f80e-35cd-206351c88511.png)

7
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/0293791b-8573-d153-8908-020de48bab17.png)

8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/a7f49993-64e9-5e66-6211-406b07513b1c.png)

9
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/bf4b5cdd-6f1b-321c-ca5e-3d9b574c8b86.png)
エンプラでOpenAI使うためにAWSエンジニアがAzureに入門してみた！（その1）

:::note
この記事はシリーズものですが、特に依存関係はないので興味あるもののみお読みください。
:::

- その1（リソースグループ / App Service / Cosmos DBを紹介） → 本記事

- その2（OpenAI Service / Log Analytics / API Managementを紹介）

https://qiita.com/minorun365/items/50ef8f296620176f7822



# OpenAIで開発するならAzureはマストになってきた
ChatGPTを始めとする生成AI、特に大規模言語モデル（LLM）の勢いが止まりません。

もはや小回りのきくWeb系スタートアップに限らず、そろそろエンタープライズな組織でも「わが社もChatGPTを使ってなんか作るぞい！」的なムーブが広がっている頃ではないでしょうか。

大企業でシステムを作ろうとするとセキュリティやコンプライアンスの壁があるため、ChatGPTのようなSaaSを気軽に活用するのは大きなハードルになってしまいます。そこでプライベートな環境で安全にOpenAIのAPIサービスを活用できるMicrosoft Azureの人気が急速に高まっています。

https://azure.microsoft.com/ja-jp/products/cognitive-services/openai-service

かくいう私もクラウドはAWSが大好きでずっとメインで使ってきましたが、そろそろ生成AI活用の文脈でAzureを勉強せざるを得なくなってきたため、AWSエンジニア目線でAzureのサービスをいくつか紹介してみたいと思います。



# OpenAI開発で使いそうなAzureサービス紹介！

この記事では

- OpenAI開発で使いそうなAzureサービスを中心に
- AWSユーザーがすっと理解しやすい形で比較しながら

紹介していきます。
私も勉強中の身なので、もし誤っている点などあればフィードバックくださいますと幸いです。



### サブスクリプション＆リソースグループ

AWSでいう「アカウント」に相当する概念です。

https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/azure-setup-guide/organize-resources

AWSアカウントは請求単位かつリソースの入れ物でもある存在でしたが、Azureなど複数のパブリッククラウドでは両者が別の概念となっていたりします。

- サブスクリプション：請求の単位
- リソースグループ：使用するリソースをまとめる単位

![スクリーン ショット 2023-06-25 に 16.49.33 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/23f4b2d3-aab0-a3bd-401d-8f0098f43d85.png)

リソースグループのコンソール画面からは作成したリソースがすべて一覧表示できて、まとめて削除もできるのが非常に便利ですね。思わぬリソースの消し忘れによる課金事故を防げそうです。AWSにもこんな機能が欲しい。

![スクリーン ショット 2023-06-25 に 20.06.30 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f6b278e3-3b09-40cd-16d5-901e4acc6556.png)




### App Service

OpenAI APIを叩く用のアプリケーションを手軽にホスティングするのに便利なマネージドサービスです。
AWSでいうとElastic Beanstalkに近いですね。

https://azure.microsoft.com/ja-jp/products/app-service

抽象的なので少し理解しづらいサービスですが、特徴は以下です。

- アプリケーションを実行するサーバーやロードバランサーを自動管理してくれる
- デプロイ手段も提供してくれる。GitHub等と連動したCDや、Blue/Greenデプロイも可能

例えばPythonなどランタイムを指定して環境を作成し、開発したコードをpushするだけで自動でアプリケーションを起動＆ホスティングしてくれます。
![スクリーン ショット 2023-06-25 に 17.59.54 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3d452402-a65e-48a8-d351-08e51668c769.png)
OpenAIを用いた開発では、フロント・バックエンドいずれの用途としてもアプリケーションを稼働させるメインのインフラサービスとして使いやすいのではないかと思います。



### Cosmos DB

マネージドのNoSQLデータベースサービスです。AWSでいうDynamoDBですね。

https://azure.microsoft.com/ja-jp/products/cosmos-db/

フルマネージドと謳われていますが、利用にあたりアカウント・データベース・コンテナという階層概念が存在するため少し複雑です。

- アカウント：最初にCosmos DB専用の「アカウント」を作成するのですが、このときにDBを操作するAPIタイプを指定します。「コア」APIを選べばNoSQLデータベースをSQLクエリで操作することができます。
- データベース：この単位でスペック（要求ユニット）を設定するため、インフラリソースに相当します。
- コンテナ：これが実際のテーブルに相当。

![スクリーン ショット 2023-06-25 に 18.12.23 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7aef4e43-db77-2c4b-1d17-b0552f0ae194.png)

OpenAIを用いた開発では、プロンプト入出力の履歴保存などに便利そうです。



# 参考文献

https://learn.microsoft.com/ja-jp/azure/architecture/aws-professional/services

https://amzn.asia/d/cTlZKKs