Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
生成AIの使いどころ
Search
kanayannet
March 15, 2025
Programming
270
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
1
120
厳密な定義
kanayannet
0
130
Mcp Training
kanayannet
0
260
MCP で「こいつ動くぞ」
kanayannet
0
190
無関心の谷
kanayannet
0
1.3k
github copilot と 心理的安全性
kanayannet
0
300
FW と ライブラリ の考え方
kanayannet
0
280
TDDと今まで
kanayannet
0
750
個人開発 稼げなくてもいいアプリ
kanayannet
0
620
Other Decks in Programming
See All in Programming
iOSDC2026登壇資料.pdf
riofujimon
0
170
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
1.6k
アクセシビリティから考える情報設計
high_g_engineer
0
380
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
140
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
330
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
290
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
120
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
120
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
130
wkhtmltopdfの次どうするか問題2026
willnet
2
1.3k
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
180
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
4.7k
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Documentation Writing (for coders)
carmenintech
77
5.5k
The agentic SEO stack - context over prompts
schlessera
0
940
Accessibility Awareness
sabderemane
1
210
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
Bash Introduction
62gerente
615
220k
The Spectacular Lies of Maps
axbom
PRO
1
1k
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 は補助ツールとして使うのが良い
仕様や命令を厳密に組めて... コードを打つ手が足りない人には鬼に金棒
ご清聴ありがとうございました