Rails Tutorial を忍者系 SNS に拡張した

## 経緯
会社の研修で Rails Tutorial をやっているのですが、余った時間でサンプルアプリこと Microblog service を拡張して~~遊んで~~勉強していました

個人的にダミーデータを生成できる Faker がツボだったので、これを拡張し、さらに Chat GPT の恩恵を受けることによって、サンプルアプリを忍者系 SNS に拡張しました

## 完成したもの
早速ですが完成したアプリはこちらです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/23aac8f5-224a-7a35-bd07-8c19052f53e8.png)

特徴としては
1. Faker による NARUTO のキャラクターの名前・セリフの搭載
1. Open AI API による投稿の自動変換機能（NARUTOっぽいセリフに変換してくれます）
1. アイコンを忍者にする（いらすとや）

の３点です

1の過程で Faker を拡張したので、拡張後の gem を以下に置いておきます

https://github.com/kromiii/faker

変更点としてはNARUTOっぽいセリフを生成できるように quote method を naruto.rb に追加したところです

元となるセリフは Chat GPT に以下のプロンプトで NARUTO っぽいセリフを考えてもらうことで数を増やしました

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/f89a392a-3642-0cd3-83de-e3ba15655e69.png)

UI としてペパボの ai-assistant を活用させてもらっています

https://github.com/pepabo/ai-assistant

投稿の自動変換の部分については [ruby-openai](https://github.com/alexrudall/ruby-openai) gem を使って以下のように実装しています

```ruby:micropost_controller.rb
def create
  prompt = "あなたはNARUTOが大好きなオタクです。以下の文章をNARUTOのセリフ風に変換してください。文章：#{micropost_params["content"]}"
  client = OpenAI::Client.new(access_token: ENV['OPENAI_API_KEY'])
  response = client.chat(
    parameters: {
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: prompt}],
      temperature: 0.7,
    }
  )
  revised_content = response.dig("choices", 0, "message", "content")
  revised_content = revised_content.delete('「」”')
  @micropost = current_user.microposts.build(content: revised_content[0..139])
  @micropost.image.attach(params[:micropost][:image])
```

これによって一見当たり障りのない投稿が NARUTO っぽいセリフに変換されて投稿されます

![忍者変換.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176789/69b07393-7ab5-3dbd-2caf-0e0410beaafe.gif)

アイコンの変更部分については `users_helper.rb` の gravatar method を以下で置き換えることで実現しました

```rb:users_helper.rb
def ninja_icon(user, size: 80)
  icon_no = (user.id % 8) + 1
  image_tag(image_path("ninja/ninja#{icon_no}.png"), alt: user.name, size: "#{size}x#{size}", class: "gravatar")
end
```

いらすとやの忍者のイラストが8体あったので、ユーザーIDに合わせてバリエーションをつけるようにしています

## あとがき

二週間の Ruby Tutorial 研修の集大成がこれってどうなの？という気もしますが、かなり楽しめたので OK かなと思っています

（matzさんも ruby はプログラミングを楽しむための言語だと言っている……ﾎﾞｿｯ）

https://ja.wikipedia.org/wiki/Ruby#%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3

またNARUTOっぽいセリフへの変換の部分はプロンプトを改良すればもっとクオリティが上がりそうです

それではよき Ruby Life を！！

## 2023/06/07追記
なんとRails チュートリアル本家の @yasulab さんに取り上げていただきました
チュートリアル本体にも組み込んでいただいて嬉しいです！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/khiroyuki1993?ref_src=twsrc%5Etfw">@khiroyuki1993</a> さんが公開してくれたSample Appの忍者系 SNS 拡張、とても面白い実装例だなと思ったので <a href="https://twitter.com/hashtag/Rails%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#Railsチュートリアル</a> 完走者向け「読み物ガイド」の拡張例として紹介してみました! 🆕<br><br>他の学習者にとっても AI 機能を実装するキッカケになれば嬉しいです...!!🎓✨<a href="https://t.co/u2iPBtWLCm">https://t.co/u2iPBtWLCm</a> <a href="https://t.co/cpOnmagj66">pic.twitter.com/cpOnmagj66</a></p>&mdash; 安川要平/Yohei Yasukawa (@yasulab) <a href="https://twitter.com/yasulab/status/1665961553756291072?ref_src=twsrc%5Etfw">June 6, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>