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
筋トレを習慣化させる テクノロジー
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
Discover your Explorer Soul
emna__ayadi
2
1.3k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
420
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
YesSQL, Process and Tooling at Scale
rocio
174
15k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
920
Statistics for Hackers
jakevdp
799
230k
Tell your own story through comics
letsgokoyo
1
1.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
260
A Tale of Four Properties
chriscoyier
163
24k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
How to Talk to Developers About Accessibility
jct
2
560
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
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 ։ൃ͢Δߦҝ
ಈ࡞֬ೝͱ͔ ࣗମͰ͍ͩͿෲے͕͑ΒΕ ͨ