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
筋トレを習慣化させる テクノロジー
Search
naokia
December 06, 2018
1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
筋トレを習慣化させる テクノロジー
naokia
December 06, 2018
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
370
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Six Lessons from altMBA
skipperchong
29
4.5k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
570
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
190
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
240
エンジニアに許された特別な時間の終わり
watany
108
250k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
260
Transcript
ےτϨΛश׳Խͤ͞Δ ςΫϊϩδʔ !OBPLJB
ࣗݾհ w Ѫౠथ ͋ͨ͗ͳ͓͖ w UXJUUFS!OBPLJB w ΤϯδχΞɻ"TL%PDUPSTͱήϊϜؔ࿈αʔϏε୲ w
3VCZ +BWB +4ͳͲීஈ৮ͬͯ·͢ w झຯ৯า͖ͱిݯΛΘͳ͍ήʔϜ
ࠓ͢͜ͱ w ϓϥΠϕʔτͰͬͯΔϓϩδΣΫτͷͰ͢ w ےτϨΛͨͯ͘͠ͳ͔ͳ͔श׳ԽͰ͖ͳ͍ਓͰɺے τϨΛश׳ԽͰ͖ΔϕετϓϥΫςΟεΛൃݟͨ͠ʂʂ w ͦͷϕετϓϥΫςΟεΛΑΓ࣮֬ʹ࣮ફ͢ΔͨΊͷ "QQMF8BUDI༻ͷΞϓϦΛ࡞ͬͨ
ࢲͳͥٸʹےτϨΛ ࢝ΊΔΑ͏ʹͳ͔ͬͨ
͋ΔɺΓʹͭ͜͏ͱͯ͠ ෆҙʹؾ͍ͮͨ
ࠓɺΤϯδχΞͱͯ͠ಇ͍ͯ ऩೖΛಘ͍ͯΔ͚Ͳ
֩͠ઓ૪Ͱจ໌่͕յͯ͠ɺ Πϯλʔωοτύιίϯ͕͑ͳ͘ͳͬͨ ΒɺͲ͏ͬͯऩೖΛಘΕ͍͍Μͩɾɾɾʁ
ఆ͢Δੈք؍
None
֩͠ઓ૪ޙͷੈքͰΑ͏͘खʹೖΕͨ ࣄ͕ΥʔϘʔΠͩͬͨΒʁ ମ࿑ಇ ˠࠓ͔ΒےτϨ͢Δ͔͠ͳ͍
w ͍ͭےτϨΛ͠Α͏ͱࢥ͏Μ͚ͩͲɺҙࢥ͕ऑ͗ͯ͢ ·ͱʹଓ͖ͨ͜͠ͱ͕ͳ͍ w ͲΕ͘Β͍ऑ͍͔ͱ͍͏ͱɺՈ͔Βెา̍̌ͷͱ͜Ζ ʹ͋ΔτϨʔχϯάδϜΛʮԕ͍ʯͱ͍͏ཧ༝Ͱୀձͨ͠ ͜ͱ͕͋ΔϨϕϧ
ͦΜͳͰઈରʹےτϨΛ ܧଓͰ͖Δํ๏Λݟ͚ͭ ͨɾɾ
ࢲͷ5XJUUFSΞΧϯτʹͯɻ
ࢲͷ5XJUUFSΞΧϯτʹͯɻ
ࣗʹ՝ͨ͠ϧʔϧ w ຖि࠷ೋճɺඞͣےτϨΛ͢Δ w ےτϨΛͨ͠ΒͦͷࢫΛ5XJUUFSʹॻ͖ࠐΉ w ͠िೋճͷےτϨΛୡ͍ͯ͠ͳ͚ΕɺϑΥϩϫʔ ࢲʹઍԁͷ"NB[POΪϑτ݊ΛٻͰ͖Δ ˠ͜ͷࠒϑΥϩϫʔਓ͘Β͍ͩͬͨͷͰɺےτϨΛଵ
Εࢲ࠷େͰສԁͷଛࣦΛड͚Δ͜ͱʹͳΔɻ ڪා৺ʹۦΒΕͯɺےτϨ͕ḿΔ
݁Ռ w ڪා৺ʹۦΒΕͳ͕Βࡾϲ݄ےτϨΛܧଓ͢Δ͜ͱ͕ Ͱ͖ͨʂʢྺ࠷ߴهʣ
͔͠͠ࡾϲ݄ʹͯ͠࠳ં ͦΕͰ࠷ه
w ୭"NB[POΪϑτ݊Λٻͯ͠དྷͳ͔ͬͨ Կਓ͔ΥονϟʔΛެݴ͢Δਓ͕͍ͨͣͳͷͩ ͕ɾɾɾ
w ୭"NB[POΪϑτ݊Λٻͯ͠དྷͳ͔ͬͨ Կਓ͔ΥονϟʔΛެݴ͢Δਓ͕͍ͨͣͳͷͩ ͕ɾɾɾ ˠҙ֎ͱΈΜͳ༏͔ͬͨ͠
w ҙ֎ͱΈΜͳྑࣝ͋ΔେਓͩͬͨͷͰɺϖφϧςΟͷҙຯ ͕ͳ͔ͬͨ w ےτϨ͢Δͨͼʹ5XJUUFSʹॻ͖ࠐΉͷΊΜͲ͍͘͞͠ɺ ͳΜ͔Ξϐʔϧͯ͠ΔΈ͍ͨͰݏͩ
ͦ͜ͰࣗಈԽΛࢼΈΔ w िೋճےτϨΛߦΘͳ͍ͱɺࣗಈతʹΫϨδοτΧʔυ͔ Β͓ۚΛҾ͖མͱ͍ͯ͘͜͠ͱͰ͖ͳ͍͔ʁ w "QQMF8BUDI্Ͱಈ࡞͠ɺՃηϯαʔͰےτϨͷಈ ͖Λݕͯ͠ɺͦΕ͕Ұఆظ్ؒઈ͑ͨΒ͓ۚΛࣗಈతʹ Ҿ͖མͱ͍ͯͦ͘͠ΜͳΞϓϦ
ػೳ w J1IPOFΞϓϦͰϢʔβʹ݄ऩ खऔΓ ͱɺΫϨδοτΧʔυ ใΛೖྗͤ͞Δ w ےτϨͨ͠ࣄ͕ࣗݾਃࠂͩͱڏِͷਃࠂ͕ՄೳͳͷͰɺ"QQMF 8BUDIͰےτϨͷϞʔγϣϯΛݕ͠ɺهͰ͖ΔΑ͏ʹ͢Δ w
ےτϨͱ͍͍ͬͯΖ͍Ζϝχϡʔ͕͋Δ͕ɺͱΓ͋͑ͣෲے͕ هͰ͖Εྑ͠ͱ͢Δ w िʹೋճҎ্ɺه͕ߦΘΕͳ͔ͬͨΒɺೖྗ͞Ε݄ͨऩʹԠ ͯ͡ɺࣗಈతʹΧʔυ͔ΒҾ͖௨͠Λߦ͏ ʢϓϩτλΠϓͰ͜͜ະ࣮
ϓϩτλΠϓΛ࡞ͬͯ ݟͨ
None
None
γεςϜߏ Amazon DynamoDB Lambda function Amazon API Gateway* ܾࡁใ τϨʔχϯάͷه
ෲےͨ͜͠ͱΛݕ͢Δํ๏ w $PSF.PUJPOΛ༻͍ͯ"QQMF8BUDIͷճసΛर͏ w γϯϓϧʹɺϐον͕࣠Ұఆͷ֯มԽͨ͠Βɺෲے͕ߦ ΘΕͨ͜ͱʹ͢Δ ϩʔϧ ϐον Ϥʔ
σόΠεͷϞʔγϣϯΛर͏ ͨΊͷϋϯυϥΛొ͢Δ let motionManager = CMMotionManager() motionManager.deviceMotionUpdateInterval = 1.0 /
50 // 50hz motionManager.startDeviceMotionUpdates(to: queue) { (deviceMotion: CMDeviceMotion?, error: Error?) in if deviceMotion != nil { self.processDeviceMotion(deviceMotion!) } }
σόΠεͷϞʔγϣϯΛर͏ ͨΊͷϋϯυϥΛొ͢Δ let motionManager = CMMotionManager() motionManager.deviceMotionUpdateInterval = 1.0 /
50 // 50hz motionManager.startDeviceMotionUpdates(to: queue) { (deviceMotion: CMDeviceMotion?, error: Error?) in if deviceMotion != nil { self.processDeviceMotion(deviceMotion!) } }
ճసͷมԽΛݕग़͢Δ let pitchThreshold = 1.95 // Radians let rateThreshold =
3.5 // Radians/sec func processDeviceMotion(_ deviceMotion: CMDeviceMotion) { let rotationRate = deviceMotion.rotationRate let rateX = rotationRate.x // rateBuffer1ඵؒͷճసΛྻͰอ͍࣋ͯ͠Δ(50hzͳͷͰ50Πϕϯτ) rateBuffer.addSample(rateX) if !rateBuffer.isFull() { return } let accumulatedPitchRot = rateBuffer.sum() / 50 let peakRate = accumulatedPitchRot > 0 ? rateAlongGravityBuffer.max() : rateAlongGravityBuffer.min() if (accumulatedPitchRot > pitchThreshold && peakRate > rateThreshold) { incrementCountAndUpdateDelegate() } if (recentDetection && abs(rateBuffer.recentMean()) < resetThreshold) { recentDetection = false rateAlongGravityBuffer.reset() } }
ͦΕͬΆ͘ෲےΛΧϯτͰ ͖ͯྑ͍͕ɾɾ w ࢲͷෲے͔ͩΒ͏·͘ճΧϯτͰ͖ͯΔ͚Ͳɺ͏গ͠ νϡʔχϯάͷ༨͋Δؾ͕͢Δ w צͷྑ͍ਓ͓͔Γͷ௨ΓɺΛ͙ΔΜ͙ΔΜ͢Εෲےͨ͠ ͜ͱʹͳͬͯ͠·͏ w αʔϏεతͳɻ
͠िೋճͷෲے͕ߦΘΕͳ͚ΕɺϢʔβʹొͤͯ͞ΔΧʔ υΛͬͯҾ͖མͱ͕͠ߦΘΕΔ͕ɺܾࡁʹ༻͍͍ͯΔ4USJQFͷ ߹Ͱɺৼࠐઌ͕ࢲ͔ࣗ͠ࢦఆͰ͖ͳ͍
ͦΕͬΆ͘ෲےΛΧϯτͰ ͖ͯྑ͍͕ɾɾ w ࢲͷෲے͔ͩΒ͏·͘ճΧϯτͰ͖ͯΔ͚Ͳɺ͏গ͠ νϡʔχϯάͷ༨͋Δؾ͕͢Δ w צͷྑ͍ਓ͓͔Γͷ௨ΓɺΛ͙ΔΜ͙ΔΜ͢Εෲےͨ͠ ͜ͱʹͳͬͯ͠·͏ w αʔϏεతͳɻ
͠िೋճͷෲے͕ߦΘΕͳ͚ΕɺϢʔβʹొͤͯ͞ΔΧʔ υΛͬͯҾ͖མͱ͕͠ߦΘΕΔ͕ɺܾࡁʹ༻͍͍ͯΔ4USJQFͷ ߹Ͱɺৼࠐઌ͕ࢲ͔ࣗ͠ࢦఆͰ͖ͳ͍ ˠظͤͣͯ͠ϏδωενϟϯεΛग़ͯ͠͠·ͬͨ
·ͱΊ w ڧͳϖφϧςΟ͕͋ΔͱےτϨḿΔ w $PSF.PUJPOҙ֎ͱ؆୯ w ͜ͷΞϓϦΛଞਓʹΘͤͯͦ͜Ͱಘ͓ͨۚͰϥΠβοϓ ʹ͍͚ɺࢲݸਓͷ՝ղܾ͢ΔՄೳੑ͕͋Δ w ։ൃ͢Δߦҝ
ಈ࡞֬ೝͱ͔ ࣗମͰ͍ͩͿෲے͕͑ΒΕ ͨ