Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
生成AIの使いどころ
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
kanayannet
March 15, 2025
Programming
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
生成AIの使いどころ
kanayannet
March 15, 2025
More Decks by kanayannet
See All by kanayannet
厳密な定義
kanayannet
0
95
Mcp Training
kanayannet
0
190
MCP で「こいつ動くぞ」
kanayannet
0
140
無関心の谷
kanayannet
0
1.1k
github copilot と 心理的安全性
kanayannet
0
270
FW と ライブラリ の考え方
kanayannet
0
280
TDDと今まで
kanayannet
0
670
個人開発 稼げなくてもいいアプリ
kanayannet
0
600
システムの堅牢性
kanayannet
0
340
Other Decks in Programming
See All in Programming
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
500
New "Type" system on PicoRuby
pocke
1
830
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
2
580
CSC307 Lecture 17
javiergs
PRO
0
320
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.1k
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
710
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.4k
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2k
JavaDoc 再入門
nagise
0
320
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
How to Think Like a Performance Engineer
csswizardry
28
2.6k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
The SEO Collaboration Effect
kristinabergwall1
1
480
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
220
Visualization
eitanlees
152
17k
The SEO identity crisis: Don't let AI make you average
varn
0
490
Documentation Writing (for coders)
carmenintech
77
5.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
580
Transcript
生成AI の使いどころ @kanazawa
生成AI ってどんなのがある chatGPT AWS Bedrock github copilot Gemini etc...
大きくこんな感じに分類される考え方
AAAA Automaton(オートメーション) Advice(アドバイス) Augment(拡張) Agent(代行)
Automaton DeepL 翻訳サービス Suno AI 歌詞付きの楽曲を自動生成
Advice ChatGPT Gemini
Augment GitHub Copilot IntelliCode
Agent ChatGPT Gemini
被っているものもあるね
何となくAIつかうよりも 意識して使った方が効果が高い
じゃあ
丸投げ あえて、アンチパターン 素数を 1-100まで作るrubyプログラムのコードを提出して ただし素数を作る部分は関数にして
def prime?(n) return false if n < 2 (2..Math.sqrt(n)).none? {
|i| n % i == 0 } end primes = (1..100).select { |num| prime?(num) } puts primes.join(", ")
厳密に言葉に出来れば、明確にコードが返ってくるね
丸投げパート2 BBSをwebアプリケーションで作りたい。 ruby で作ってみて。
gem install sinatra sinatra-contrib
require 'sinatra' require 'sinatra/reloader' require 'json' set :messages, [] get
'/' do @messages = settings.messages erb :index end post '/post' do content = params[:content] unless content.strip.empty? settings.messages << { id: settings.messages.size + 1, content: content } end redirect '/' end __END__ @@ layout <!DOCTYPE html> <html> <head> <title>Simple BBS</title> </head> <body> <h1>掲示板</h1> <%= yield %> </body> </html> @@ index <form action="/post" method="post"> <input type="text" name="content" required> <button type="submit">投稿</button> </form> <ul> <% @messages.each do |msg| %> <li><%= msg[:content] %></li> <% end %> </ul>
重要なリプレイ post '/post' do content = params[:content] unless content.strip.empty? settings.messages
<< { id: settings.messages.size + 1, content: content } end redirect '/' end
シャットダウンしたら消える!! メモリーにしか残してない
もうちょっと詳しく伝える textファイルに保存したい
# 一部抜粋 FILE_PATH = 'messages.txt' # ファイルからメッセージを読み込む def load_messages return
[] unless File.exist?(FILE_PATH) File.read(FILE_PATH).split("\n").map.with_index(1) { |msg, idx| { id: idx, content: msg } } end # ファイルにメッセージを保存 def save_message(content) File.open(FILE_PATH, 'a') { |file| file.puts(content) } end set :messages, load_messages get '/' do @messages = settings.messages erb :index end post '/post' do content = params[:content].strip unless content.empty? save_message(content) settings.messages = load_messages end redirect '/' end
ここまではOK
機能を拡張させる 編集・削除機能もつけたいです
# ... # 投稿処理 post '/post' do content = params[:content].strip
unless content.empty? new_message = { id: settings.messages.size + 1, content: content } settings.messages << new_message save_messages(settings.messages) end redirect '/' end # 編集ページ get '/edit/:id' do @message = settings.messages.find { |msg| msg[:id] == params[:id].to_i } halt 404, "Not Found" unless @message erb :edit end # 編集処理 post '/update/:id' do id = params[:id].to_i new_content = params[:content].strip message = settings.messages.find { |msg| msg[:id] == id } halt 404, "Not Found" unless message message[:content] = new_content save_messages(settings.messages) redirect '/' end
重要なリプレイ # 投稿処理 post '/post' do content = params[:content].strip unless
content.empty? new_message = { id: settings.messages.size + 1, content: content } settings.messages << new_message save_messages(settings.messages) end redirect '/' end
レコード数+1 = ID ブラウザ開いたままの人がいると関係ない記事が消える
もう少し詳しく指定 これじゃ、削除と投稿を繰り返すとIDが重複して関係ない記事を削除してしまうことがあり得るのでIDを一意にしてもらいたい
# 投稿処理 post '/post' do content = params[:content].strip unless content.empty?
new_message = { id: SecureRandom.uuid, content: content } settings.messages << new_message save_messages(settings.messages) end redirect '/' end
UUID !! オートインクリメントになると思いきや ややオーバースペックだが、どうにかか?
ここまでで学んだ(味わった)こと 細かく指定しないと「察してくれない」 コードを見抜ける目がないと ミスリードされる
細かく指定して、見抜ける目があればいいのでは?
細かく指定 = 各個撃破 見抜ける目 = 慣れながら、進めば養われる
TDD Github Copilot Augment(強化)
まずは新規データ書き込み require './lib/bbs' require 'minitest/autorun' require 'minitest/spec' require 'minitest-spec-context' require
'minitest/reporters' Minitest::Reporters.use! describe '掲示板のデータ' do before do @bbs = BBS.new end context '記事を書き込む' do it '記事が追加される' do @bbs.name = 'test' @bbs.title = 'test' @bbs.article = 'test' res = @bbs.add assert_equal true, res end end end
Product code class BBS def initialize @article_path = './data/article.dat' @id_path
= './data/id.dat' @name = '' @title = '' @article = '' end attr_accessor :name, :title, :article # 記事を追加する(デリミタはタブ) # id は自動採番で削除されても重複しないuniqな値 end
デモを見せます
0:00/ 1:10
さっきよりはずっと上手くいきましたね。 あとは、読み込みや編集を同じ要領で行えばいいだけ
まとめ 丸投げは打率低め 細かく少しづつ足すと良い 打率が上がる TDD は効果的 インクリメンタルに進める
それでも... 最後は解る人が見ないと責任持てるコードにならない
予想できる未来 コードを打ってるだけの人は仕事が減る コーダー: ジュニアプログラマ的な人にはきつい話 コードを見抜ける人は必須 コードが解る人でなければ、ならない AI は補助ツールとして使うのが良い
仕様や命令を厳密に組めて... コードを打つ手が足りない人には鬼に金棒
ご清聴ありがとうございました