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
kanayannet
March 15, 2025
Programming
260
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
96
厳密な定義
kanayannet
0
120
Mcp Training
kanayannet
0
240
MCP で「こいつ動くぞ」
kanayannet
0
160
無関心の谷
kanayannet
0
1.3k
github copilot と 心理的安全性
kanayannet
0
290
FW と ライブラリ の考え方
kanayannet
0
280
TDDと今まで
kanayannet
0
720
個人開発 稼げなくてもいいアプリ
kanayannet
0
610
Other Decks in Programming
See All in Programming
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4k
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
220
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
150
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.9k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
290
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
450
Foundation Models frameworkで画像分析
ryodeveloper
1
600
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
580
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
140
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
760
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
数百円から始めるRuby電子工作
tarosay
0
140
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
260
Designing for Performance
lara
611
70k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
290
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
エンジニアに許された特別な時間の終わり
watany
108
250k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
119
120k
How to make the Groovebox
asonas
2
2.3k
From π to Pie charts
rasagy
0
260
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
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 は補助ツールとして使うのが良い
仕様や命令を厳密に組めて... コードを打つ手が足りない人には鬼に金棒
ご清聴ありがとうございました