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
yawaraka zouzei
Search
uvb_76
December 14, 2019
Programming
2.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
yawaraka zouzei
uvb_76
December 14, 2019
More Decks by uvb_76
See All by uvb_76
地元にいないローカルオーガナイザーの立ち回り
uvb_76
1
870
ユーザーにサブドメインの ECサイトを提供したい (あるいは) 2026年函館で一番熱くなるかもしれない言語の話
uvb_76
0
890
Rails 7.2 のリリースノートを見て思ったこと
uvb_76
0
950
Rails Girls ガイドを使って社内で Rails 講座を開催した
uvb_76
0
160
問い合わせ調査との付き合い方
uvb_76
0
250
メール認証とRuby
uvb_76
0
1.1k
開発環境(物理)を作る
uvb_76
0
1.8k
Other Decks in Programming
See All in Programming
AIで効率化できた業務・日常
ochtum
0
100
ふつうのFeature Flag実践入門
irof
7
3.6k
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.7k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
190
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
160
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.3k
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.2k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
350
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.5k
Modding RubyKaigi for Myself
yui_knk
0
890
Webフレームワークの ベンチマークについて
yusukebe
0
140
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
57
14k
The SEO identity crisis: Don't let AI make you average
varn
0
480
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
240
The Pragmatic Product Professional
lauravandoore
37
7.3k
How STYLIGHT went responsive
nonsquared
100
6.2k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
390
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
From π to Pie charts
rasagy
0
200
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Speed Design
sergeychernyshev
33
1.8k
Designing for Performance
lara
611
70k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
Transcript
͡Ίͯͷ૿੫ରԠ "UTVTIJ,BUTVVSB(.01FQBCP *OD ฏ3VCZձٞ ΘΒ͔૿੫
ࠓ͢͜ͱ w݄ͷফඅ੫૿੫ରԠͰ&$αʔϏεͰඞཁʹͳͬͨ͜ͱ w࣮ࡍʹରԠ͢Δ্ͰؾΛ͚ͭͨ͜ͱ w݄Λܴ͑ͨͱ͖ɺ͏·͍͔͘ͳ͔ͬͨ͜ͱ 3VCZͷ͋·Γͳ͍Ͱ͢ɻੜ׆ൃදͰ͢ɻ
উӜರJLBSVHB!67#@ (.0ϖύϘגࣜձࣾ&$ࣄۀ෦ΧϥʔϛʔϦϐʔτνʔϜ IUUQTJLBSVHBPSH
IUUQTDPMPSNFSFQFBUKQ
ΧϥʔϛʔϦϐʔτ w8FC"1*αʔόʔ 3VCZPO3BJMT wϑϩϯτΤϯυαʔόʔ &YQSFTT 7VFKT αϒεΫϦϓγϣϯͷܖ͕Ͱ͖ΔϥϯσΟϯάϖʔδΛ࡞Δ͜ͱ͕Ͱ ͖ΔαʔϏε
݄αʔϏεϦϦʔε⾣͡Ίͯͷ૿੫
૿੫
&$αʔϏεʹऻ͍͔͔Δফඅ੫૿੫ wγϣοϓΦʔφʔͷαʔϏεར༻ྉͷফඅ੫ wγϣοϓΦʔφʔ͕ઃఆ͢Δͷফඅ੫ wܰݮ੫ͷઃఆΛؚΉ
ܰݮ੫ wಛఆͷ੫͕͡Όͳͯ͘ʹͳΓ·͢Α wαʔϏεఏڙଆ͕அ͢ΔͷͰͳ͘ɺʮγϣοϓ Φʔφʔʯ͕அ͢Δͷ wγϣοϓΦʔφʔʹ͓Βͤͯ͠ઃఆͯ͠͏ඞཁ͕ ͋Δ
૿੫ରԠͰͬͨ͜ͱ wαʔϏεར༻ྉͷফඅ੫૿੫ରԠ wͷফඅ੫૿੫ରԠ wܰݮ੫ͷઃఆͷఏڙ ࣌ࠁΛڥʹදࣔΛΓସ͑Δ ࠓճলུ w ૹྉͷ֎੫Խ w
ாථͷमਖ਼ ۠هࡌٻॻอଘํࣜ w ച্కΊॲཧͷεϓϦΫτͷमਖ਼
੫͕ద༻͞ΕΔλΠϛϯά
Ұ࣍ιʔεΛΑ͘ಡΉ
ࠃ੫ி
αʔϏεར༻ྉͷ੫ wલఏΧϥʔϛʔϦϐʔτͷαʔϏεར༻ྉԁ w݁ܖऴ͕ྃҎ߱ͷͱ͖ɺͷফඅ੫Ͱѻ͏ wࠃ੫ிͷ)1ΛΑΉ wIUUQTXXXOUBHPKQUBYFTTIJSBCFSVUBYBOTXFSTIPIJ IUN
ɹͷఏڙ ɹෛʹΑΔͷఏڙͷ࣌ظɺݪଇͱ͠ ͯɺͷҾ͠Λཁ͢Δෛܖʹ͋ͬͯ తͷશ෦Λͯ͠Ҿ͖ͨ͠ɺͷ Ҿ͠Λཁ͠ͳ͍ෛܖʹ͋ͬͯͦͷ ͨ͠ͷશ෦ͷఏڙΛྃͨ͠Ͱ͢ɻ ɹ·ͨɺෛΛআ͘ਓతͷఏڙͷ࣌ظ ɺݪଇͱͯͦ͠ͷਓతͷఏڙΛྃ͠ ͨͰ͢ɻ
ɹͷఏڙ ɹෛʹΑΔͷఏڙͷ࣌ظɺݪଇͱ͠ ͯɺͷҾ͠Λཁ͢Δෛܖʹ͋ͬͯ తͷશ෦Λͯ͠Ҿ͖ͨ͠ɺͷ Ҿ͠Λཁ͠ͳ͍ෛܖʹ͋ͬͯͦͷ ͨ͠ͷશ෦ͷఏڙΛྃͨ͠Ͱ͢ɻ ɹ·ͨɺෛΛআ͘ਓతͷఏڙͷ࣌ظ ɺݪଇͱͯͦ͠ͷਓతͷఏڙΛྃ͠ ͨͰ͢ɻ
αʔϏεར༻ྉͷ੫ wܖΛͰදݱ͢Δͱ ੫ U ੫ ੫ TUBSUFE@BU FOEFE@BU
Ձ֨ͷ੫͕ద༻͞ΕΔλΠϛϯά w݁Ձ֨ൃૹ࣌ͷ੫Λద༻͢Δ wʹडͨ͋͠ͱʹൃૹ w⾣ͷ੫͕ద༻͞ΕΔ wIUUQTXXXOUBHPKQMBXUTVUBUTVLJIPOTIPIJIUN ΛಡΉ
ʵʵɹ୨Էࢿ࢈ͷҾ͠ͷ͕͍ͭͰ͋ Δ͔ʹ͍ͭͯɺྫ͑ɺग़ՙͨ͠ɺ૬ख ํ͕ݕऩͨ͠ɺ૬खํʹ͓͍ͯ༻ऩӹ͕ Ͱ͖Δ͜ͱͱͳͬͨɺݕʹΑΓൢച ྔΛ֬ೝͨ͠ɺ֘୨Էࢿ࢈ͷछྨٴͼ ੑ࣭ɺͦͷൢചʹΔܖͷ༰ʹԠͯ͡ ͦͷҾ͠ͷͱͯ͠߹ཧతͰ͋ΔͱೝΊΒ ΕΔͷ͏ͪɺࣄۀऀ͕ܧଓͯ͠୨Էࢿ࢈ͷ ৡΛߦͬͨ͜ͱͱ͍ͯ͠ΔʹΑΔͷͱ ͢Δɻ
࣮
੫ΛͲ͏දݱ͢Δ͔ w੫͕ద༻͞ΕΔ࣌ࠁ wܰݮ੫͔Ͳ͏͔ ͕Θ͔Ε੫ٻΊΒΕͦ͏ wఆͰઃఆʹ͢Δ w%#ʹσʔλΛͨͤΔ
%#Ͱ੫Λදݱ͍ͨ͠ "id" "kind" "rate" "started_at" "expired_at" "created_at" "updated_at" 1 0
0.08 "2014-03-31 15:00:00" "2019-09-30 14:59:59.999999" "2019-07-16 09:44:39.516075" "2019-07-16 09:44:39.516075" 2 0 0.1 "2019-09-30 15:00:00" NULL "2019-07-16 09:44:39.519505" "2019-07-16 09:44:39.519505" 3 1 0.08 "2019-09-30 15:00:00" NULL "2019-07-16 09:44:39.521575" "2019-07-16 09:44:39.521575" UBYFTςʔϒϧര ࠓճͪ͜ΒΛ࠾༻
࣮ class Tax < ApplicationRecord enum kind: { ordinary: 0,
reduced: 1 } class << self def ordinary_rate(time = Time.current) # 10%ͷ੫༻ ordinary.where('started_at <= ?', time).order(started_at: :desc).first.rate end def reduced_rate(time = Time.current) # 8%(ܰݮ੫)༻ reduced.where('started_at <= ?', time).order(started_at: :desc).first.rate end end end
UBYFTςʔϒϧͷ 4&-&$5͕ͨΒͱଟ͍
%BUF5JNFΫϥεϛϦඵ·Ͱ࣋ͬͯΔ [1] pry(main)> Time.current.iso8601(7) => "2019-12-09T08:49:24.4245084+09:00" 5JNFDVSSFOUΛ͢ͱ࣮ߦ͢ΔͨͼʹΫΤϦ͕࣮ߦ͞ΕΔͷͰ ΫΤϦΩϟογϡ͕ޮ͔ͳ͍ ੫ܭࢉͷج४࣌Λ໌֬ʹҾͱͯ͢͜͠ͱͰಉ͡ΫΤϦΛ ు͖ग़ͤ͞ɺΫΤϦΩϟογϡΛޮ͔͢
IUUQTHJUIVCDPNDPMPSCPY TIPVIJ[FJ
4IPVIJ[FJ(FN w:BNMͰͷఆಡΈࠐΈ wܰݮ੫ରԠ w͜ͷࢿྉ࡞ͬͯΔ࠷தʹݟͯ͠ʮΑ͍ʜʯͱͳͬͨ irb(main):010:0> Shouhizei.rate_on(Time.current) => (1/10) irb(main):011:0> Shouhizei.rate_on(Time.current,
reduced: true) => (2/25)
Ͳ͕͍͍ͬͪͩΖ͏Ͷ w5BYʹґଘ͢Δ3FMBUJPOଘࡏ͠ͳ͍ͷͰఆͰͳ͍ wҰํͰফඅ੫ͱ͍͏σʔλΛ%#Ͱදݱ͢ΔͷࣗવͰ͋Δ wґଘ(FNগͳ͍΄͏͕ྑ͍ ࠓճͲͬͪΛબΜͰΑ͔ͬͨͱࢥͬͨɻ
࣌ࠁΛڥʹදࣔΛΓସ͑Δ
ͳͥඞཁʹͳ͔ͬͨ wϑϩϯτΤϯυͰΛڥʹදࣔΛΓସ͑ ͍ͨ w࣌ؒΛڥքͱ͢Δςετେม wͰ͖Δ͚ͩ୯७ʹݕূ͍ͨ͠
Ͳ͏͔ͨ͠ w"1*ͷϨεϙϯεʹl૿੫ޙͷใ͔ zͲ͏͔ͷϨε ϙϯεΛCPPMͰՃͨ͠ w࣌ࠁΛฦͯ͠ϑϩϯτΤϯυͰஅ͢ΔͷΛආ͚ͨ
"1*Ͱ࣌ࠁΛฦͯ͠ྑ͍ͷͰ wlใ͕࡞͞Εͨ࣌ࠁzͲ͏͔ͷϨεϙϯεΛՃ͢ ΔͱɺϑϩϯτΤϯυͰ࣌ࠁͷൺֱ͕ඞཁʹͳΔ wϑϩϯτΤϯυͷ࣌ࠁͷൺֱେม
ςετ
34QFDͰςετ࣌ࠁΛม͑Δ # spec/support/traveling.rb RSpec.configure do |config| config.include ActiveSupport::Testing::TimeHelpers config.around(:each, :travel_to)
do |example| travel_to(example.metadata[:travel_to]) do example.run end end end
34QFDͰςετ࣌ࠁΛม͑Δ # spec/support/traveling.rb RSpec.configure do |config| config.include ActiveSupport::Testing::TimeHelpers config.around(:each, :travel_to)
do |example| travel_to(example.metadata[:travel_to]) do example.run end end end IUUQTSFMJTIBQQDPNSTQFDSTQFD DPSFWEPDTIPPLTBSPVOE
͍ํ ྫ context '૿੫લͷͱ͖', travel_to: '2019/09/30 23:59:59' do # ੫8%Ͱ͋Δ͜ͱΛ֬ೝ͢ΔςετΛ͜͜ʹ͔͘
end wϒϩοΫͷதͰAUSBWFM@UPA͕ޮ͍ͯศར w !LBKJTIB͞ΜͷΞΠσΞͰ͢ɻ͋Γ͕ͱ͏͍͟͝·͢ɻ
DPOUFYUͷΓํ w૿੫લ૿੫ޙͰେ͖ͳίϯςΩετΛΔ wͦΕͧΕʹطଘͷςετΛίϐϖ͢Δ w૿੫ޙͷίϯςΩετΛ͢ wςετ૿͑Δ͕ɺޙย͚ ςετͷআ ͷͱ͖૿੫લͷίϯς Ωετʹணͯ͠ςετͷཧΛߦ͑ྑ͍ͷͰָ
૿੫ޙʹ͏·͍͔͘ͳ͔ͬͨ͜ͱ
͏·͍͔͘ͳ͔ͬͨ͜ͱ w૿੫ޙͷදࣔपΓͷෆ۩߹ग़ͯ͠·ͬͨ w"1*ͷςετ͕NBTUFSͰࣦഊ͢ΔΑ͏ʹͳ͍ͬͯͨ
NBTUFSͰςετ͕ίέͩ͢ w૿੫લʹQBTT͍ͯͨ͠ςετ͕ࣦഊͨ͠ w૿੫ޙͷमਖ਼࡞ۀʹӨڹ͕ग़ͨ wUSBWFM@UPͷઃఆΕͰ݄ʹ௨͍ͬͯͨςετ͕݄ʹࣦഊ͍ͯͨ͠ wϩʔΧϧͰະདྷ࣌ࠁʹมߋͯ͠ςετΛҰ௨ͨ͠΄͏͕Α͔ͬͨʜ
·ͱΊ wϑϩϯτΤϯυʹ࣌ࠁΛͣ͞ʹݟͤΔํ๏Λߟ͑Δ wมߋ͢Δ࣌ࠁ͝ͱʹίϯςΩετΛ࡞͓ͬͯ͘ͱޙָ͕ w๏ͷରԠେม ँࣙ !LZNNUϨϏϡʔ͋Γ͕ͱ͏͍͟͝·ͨ͠