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
280
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
150
厳密な定義
kanayannet
0
170
Mcp Training
kanayannet
0
360
MCP で「こいつ動くぞ」
kanayannet
0
210
無関心の谷
kanayannet
0
1.4k
github copilot と 心理的安全性
kanayannet
0
300
FW と ライブラリ の考え方
kanayannet
0
300
TDDと今まで
kanayannet
0
840
個人開発 稼げなくてもいいアプリ
kanayannet
0
630
Other Decks in Programming
See All in Programming
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.1k
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
280
はじめてのPLATEAU
nokonoko1203
1
400
ActionController meets Protocol Buffers
sorah
1
780
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.4k
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
160
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.5k
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
610
SODA - FACT BOOK(EN)
sodainc
1
200
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
14
11k
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
150
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
580
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
6.2k
Context Engineering - Making Every Token Count
addyosmani
9
1.3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
660
The Cost Of JavaScript in 2023
addyosmani
56
10k
Skip the Path - Find Your Career Trail
mkilby
1
280
Amusing Abliteration
ianozsvald
1
380
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
560
The browser strikes back
jonoalderson
0
1.9k
Designing Powerful Visuals for Engaging Learning
tmiket
1
640
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 は補助ツールとして使うのが良い
仕様や命令を厳密に組めて... コードを打つ手が足りない人には鬼に金棒
ご清聴ありがとうございました