SlideShare a Scribd company logo
⌚watchOS 2で
ゲーム作ってみた話
iOS 9 週連続 Bootcamp! vol5
@giginet
@giginet
趣味:ゲーム開発👾
cocos2d-xではじめるスマートフォンゲーム開発
このセッションでは
• watch OS2アプリの基本的な作り方を紹介
• ゲームを作る際に発生した問題をいろいろと
紹介
watchOS 2でゲーム作ってみた話
watchOS 2でゲーム作ってみた話
watchOS 2でゲーム作ってみた話
watchOS 2でゲーム作ってみた話
作ってみた
watch OS2
watch OS2 overview
• WatchKit -> watch OS2
• CoreFoundation
• HealthKit, HomeKit, PassKit, EventKit, Contacts
• WCSession
• Complications(ClockKit)
watchOS 2でゲーム作ってみた話
watchOS 2でゲーム作ってみた話
Rendering
watch アプリのUIデザイン
• UIViewのようなViewの任意配置ができない
• 動的にViewを増やすことができない
• 制約の中でどのようにゲーム的な画面を作る
か?
let imageView = UIImageView()
imageView.frame = CGRectMake(10, 10, 100, 100)
watch アプリのUIデザイン
• WKInterfaceController
• UIViewControllerに相当
• WKInterfaceObject
• UIViewに相当。Image/Button/Pickerなどを
サブクラスとして持つ
• alpha, width/height, inset, color, alignment
watch アプリのUIデザイン
• WKInterfaceGroup
• 子要素を縦、または横に整列できる
watchOS 2でゲーム作ってみた話
watchOS 2でゲーム作ってみた話
watchOS 2でゲーム作ってみた話
気合で頑張る
watchOS 2でゲーム作ってみた話
animationWithDuration
// 1秒かけて幅を0から100にする
self.imageView.setWidth(0)
self.animateWithDuration(1.0) { () -> Void in
self.imageView.setWidth(100)
}
animationWithDuration
• 制御できるものが限られている
• レイヤーを重ねられない
• 動的に要素を追加できない
func draw() {
UIGraphicsBeginImageContext(self.screenSize())
let context = UIGraphicsGetCurrentContext()
UIColor.greenColor().setStroke()
UIColor.whiteColor().setFill()
// Set ball position
let rect = CGRectMake(self.ballPosition.x, self.ballPosition.y, 10, 10)
let path = UIBezierPath(ovalInRect: rect)
path.lineWidth = 1.0
path.fill()
path.stroke()
let cgimage = CGBitmapContextCreateImage(context);
let uiimage = UIImage(CGImage: cgimage!)
UIGraphicsEndImageContext()
// Render UIImage
self.canvasView.setImage(uiimage)
}
UIImage + CGContext
UIImage + CGContext
• 何でも描ける
• 大変重い
watchOS 2でゲーム作ってみた話
Input
Detect Digital Crown
• watchOS2でDigital Crownを取得する方法は
ない
• タッチ位置も取得できない
watchOS 2でゲーム作ってみた話
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
// Focus to picker forcedly
self.controlPicker.focus()
// Create picker items
let numbers = (Array<Int>)(0...maxPaddleIndex)
let pickerItems = numbers.map({ (number : Int) -> WKPickerItem in
let pickerItem = WKPickerItem()
pickerItem.title = "(number)"
return pickerItem
})
// Initialise picker
self.controlPicker.setItems(pickerItems)
self.controlPicker.setSelectedItemIndex(0)
}
@IBAction func pickerDidChanged(index : Int) {
// Calc picker ratio
self.paddle.controlPickerRatio = CGFloat(index) /
CGFloat(maxPaddleIndex - 1)
}
In Doom
Run Loop
// Create queue
let queue: dispatch_queue_t = dispatch_queue_create("mainLoop",
DISPATCH_QUEUE_SERIAL)
// Create timer
let timer: dispatch_source_t =
dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
// Define main loop
dispatch_source_set_event_handler(timer, { () in
// Main loop
self.update()
self.draw()
})
let secondPerFrame: Double = 1.0 / 30.0
let startTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW,
Int64(NSEC_PER_SEC))
let interval: UInt64 = UInt64(Double(NSEC_PER_SEC) *
secondPerFrame)
// Start timer
dispatch_source_set_timer(timer, startTime, interval, 0)
dispatch_resume(timer)
Audio
func playSound(mediaURL: NSURL) -> Void {
let asset: WKAudioFileAsset = WKAudioFileAsset(URL: mediaURL)
let playerItem = WKAudioFilePlayerItem(asset: asset)
let player = WKAudioFilePlayer(playerItem: playerItem)
guard player.status == WKAudioFilePlayerStatus.ReadyToPlay else {
print("Audio is not available")
return
}
player.play()
}
WKAudioFilePlayer
watchOS 2でゲーム作ってみた話
func playSound(mediaURL: NSURL) -> Void {
// Show media player
self.presentMediaPlayerControllerWithURL(mediaURL,
options: nil,
completion: { (didPlayToEnd: Bool, endTime: NSTimeInterval,
error :NSError?) in
// callback
self.dismissMediaPlayerController()
})
}
presentMediaPlayer
watchOS 2でゲーム作ってみた話
WKInterfaceDevice.currentDevice().playHaptic(WKHapticType.Failure)
playHaptic
まとめ
• 任意の音をWatchのスピーカーから非同期に
鳴らす方法はない
• WCSessionなどを使ってiPhoneから音を鳴ら
すのはできるかも
• Hapticも効果音代わりに使える
HealthKit
HealthKit
• 脈拍に応じて球の速さを変えたい
❌
⭕
Query
Samples
func initialise()
{
// Check whether HealthKit is available
guard HKHealthStore.isHealthDataAvailable() else {
print("not available")
return
}
// Request Permissions
let dataTypes = Set([heartRateType])
healthStore.requestAuthorizationToShareTypes(nil, readTypes:
dataTypes) {
(success, error) -> Void in
if success {
print("authorized")
}
}
}
watchOS 2でゲーム作ってみた話
func executeAnchordObjectQuery() -> Void {
let healthStore = HKHealthStore()
let heartRateType =
HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHe
artRate)!
// Define predicate
let predicate =
HKQuery.predicateForSamplesWithStartDate(NSDate(), endDate: nil,
options: .None)
// Create query
let query = HKAnchoredObjectQuery(type: heartRateType,
predicate: predicate,
anchor: nil,
limit: Int(HKObjectQueryNoLimit)) {
(query, samples, deletedObjects, anchor, error) -> Void
in
// Callback
dispatch_async(dispatch_get_main_queue(), {() in
let rate = self.heartRateFromSamples(samples)
if rate != nil {
self.currentHeartRate = rate
}
})
}
query.updateHandler = {
(query, samples, deletedObjects, anchor, error) -> Void in
// on Update
dispatch_async(dispatch_get_main_queue(), {() in
let rate = self.heartRateFromSamples(samples)
if rate != nil {
self.currentHeartRate = rate
}
})
}
healthStore.executeQuery(query)
private func heartRateFromSamples(samples: [HKSample]?) -> Double?
{
guard let samples = samples as? [HKQuantitySample] else {
return nil
}
guard let sample = samples.last?.quantity else {
return nil
}
let unit = HKUnit(fromString: "count/min")
let rate = sample.doubleValueForUnit(unit)
return rate
}
60bpm 80bpm
まとめ
• watchOS 2になっても制約が多い
• がんばれば結構できる
Special Thanks
• shu223/watchOS-2-Sampler
• https://github.com/shu223/watchOS-2-Sampler
• Designing for Apple Watch - WWDC 2015 -
Videos - Apple Developer
• https://developer.apple.com/videos/play/
wwdc2015-802/
cocos2d-xではじめるスマートフォンゲーム開発
Questions?

More Related Content

KEY
Ojagnaha vol7
Shusaku Fukumine
 
PDF
Creating physics game in 1 hour
Linkou Bian
 
PPTX
HTML5 Games with CreateJS
Dave Kelleher
 
PDF
DEF CON 23 - Phil Polstra - one device to pwn them all
Felipe Prado
 
PDF
iOS 2D Gamedev @ CocoaHeads
Alain Hufkens
 
KEY
Node.js 0.8 features
Nicholas McClay
 
PPTX
Create online games with node.js and socket.io
grrd01
 
PDF
Gatling.pptx
Nalini Kanth
 
Ojagnaha vol7
Shusaku Fukumine
 
Creating physics game in 1 hour
Linkou Bian
 
HTML5 Games with CreateJS
Dave Kelleher
 
DEF CON 23 - Phil Polstra - one device to pwn them all
Felipe Prado
 
iOS 2D Gamedev @ CocoaHeads
Alain Hufkens
 
Node.js 0.8 features
Nicholas McClay
 
Create online games with node.js and socket.io
grrd01
 
Gatling.pptx
Nalini Kanth
 

What's hot (20)

PDF
Puppeteer can automate that! - Frontmania
Önder Ceylan
 
PDF
Getting started with DataStax .NET Driver for Cassandra
Luke Tillman
 
KEY
Building Dojo in the Cloud
James Thomas
 
PDF
Intro to Sail.js
Nicholas McClay
 
PDF
Puppeteer can automate that! - AmsterdamJS
Önder Ceylan
 
PDF
Денис Ковалев «Python в игровой индустрии»
DataArt
 
PDF
Solaris 11 base box for Vagrant using Packer
Alan Chalmers
 
PPTX
Snake in the DOM!
Gil Steiner
 
PPTX
CKAN 2.2 Installation
Chun Cheng Lin
 
PDF
Chipを使ってみる
Yuki Yamamoto
 
PDF
Dev Day 2019: Mirko Seifert – Next Level Integration Testing mit Docker und T...
DevDay Dresden
 
PDF
Elasticsearch sur Azure : Make sense of your (BIG) data !
Microsoft
 
PDF
スマートフォン勉強会@関東 #11 LT 5分で語る SQLite暗号化
Taro Matsuzawa
 
PPTX
Web rtc, Media stream, Peer connection, Setting up STUN and TURN on Linux and...
Amitesh Madhur
 
PDF
Node meetup feb_20_12
jafar104
 
PPTX
Beyond Golden Containers: Complementing Docker with Puppet
lutter
 
PDF
Cmd Alt I - Chrome Dev tools
Giacomo Zinetti
 
PPTX
How to create a secured multi tenancy for clustered ML with JupyterHub
Tiago Simões
 
PPT
jQuery Loves You
DotNetMarche
 
PPTX
How to go the extra mile on monitoring
Tiago Simões
 
Puppeteer can automate that! - Frontmania
Önder Ceylan
 
Getting started with DataStax .NET Driver for Cassandra
Luke Tillman
 
Building Dojo in the Cloud
James Thomas
 
Intro to Sail.js
Nicholas McClay
 
Puppeteer can automate that! - AmsterdamJS
Önder Ceylan
 
Денис Ковалев «Python в игровой индустрии»
DataArt
 
Solaris 11 base box for Vagrant using Packer
Alan Chalmers
 
Snake in the DOM!
Gil Steiner
 
CKAN 2.2 Installation
Chun Cheng Lin
 
Chipを使ってみる
Yuki Yamamoto
 
Dev Day 2019: Mirko Seifert – Next Level Integration Testing mit Docker und T...
DevDay Dresden
 
Elasticsearch sur Azure : Make sense of your (BIG) data !
Microsoft
 
スマートフォン勉強会@関東 #11 LT 5分で語る SQLite暗号化
Taro Matsuzawa
 
Web rtc, Media stream, Peer connection, Setting up STUN and TURN on Linux and...
Amitesh Madhur
 
Node meetup feb_20_12
jafar104
 
Beyond Golden Containers: Complementing Docker with Puppet
lutter
 
Cmd Alt I - Chrome Dev tools
Giacomo Zinetti
 
How to create a secured multi tenancy for clustered ML with JupyterHub
Tiago Simões
 
jQuery Loves You
DotNetMarche
 
How to go the extra mile on monitoring
Tiago Simões
 
Ad

Viewers also liked (16)

PDF
エターナらないゲーム開発
Kohki Miki
 
KEY
TDDBC 札幌 2.0自己紹介スライド
Kohki Miki
 
PDF
Mapkitframework io9week
Yuki Hirai
 
PDF
Learn watchOS Programming!
Snehal Patil
 
PPTX
Apple - what's new in iOS 10, watchOS 3 & tvOS 10
Accedo
 
PDF
Dependent things dependency management for apple sw - slideshare
Cavelle Benjamin
 
PPTX
Apple Watch Technology & WatchOS 2
Saransh Viswari
 
PDF
[CocoaHeads Tricity] watchOS 2 - native apps are coming
Mateusz Klimczak
 
PPTX
Transfer data from iPhone to iWatch
Pawan Ramteke
 
PDF
C language in our world 2016
Juraj Michálek
 
PDF
Apple watch course
bestonlinecoursescoupon
 
PDF
D2 OPEN SEMINAR - WWDC 핫 이슈
NAVER D2
 
PDF
Decksetがよかった話
Kohki Miki
 
PDF
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
narumi_
 
PDF
Development of Mobile Applications
Dávid Kaya
 
PDF
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
Yuki Tamura
 
エターナらないゲーム開発
Kohki Miki
 
TDDBC 札幌 2.0自己紹介スライド
Kohki Miki
 
Mapkitframework io9week
Yuki Hirai
 
Learn watchOS Programming!
Snehal Patil
 
Apple - what's new in iOS 10, watchOS 3 & tvOS 10
Accedo
 
Dependent things dependency management for apple sw - slideshare
Cavelle Benjamin
 
Apple Watch Technology & WatchOS 2
Saransh Viswari
 
[CocoaHeads Tricity] watchOS 2 - native apps are coming
Mateusz Klimczak
 
Transfer data from iPhone to iWatch
Pawan Ramteke
 
C language in our world 2016
Juraj Michálek
 
Apple watch course
bestonlinecoursescoupon
 
D2 OPEN SEMINAR - WWDC 핫 이슈
NAVER D2
 
Decksetがよかった話
Kohki Miki
 
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
narumi_
 
Development of Mobile Applications
Dávid Kaya
 
失敗から学ぶゲーム開発(ドラゴンジェネシス〜聖戦の絆〜の場合)
Yuki Tamura
 
Ad

Similar to watchOS 2でゲーム作ってみた話 (20)

PDF
Asynchronous Programming at Netflix
C4Media
 
PDF
UIImageView vs Metal [日本語版] #tryswiftconf
Shuichi Tsutsumi
 
PDF
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Chris Adamson
 
PDF
AVFoundation @ TACOW 2013 05 14
Ryder Mackay
 
PDF
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Chris Adamson
 
PPT
iOS Training Session-3
Hussain Behestee
 
PDF
Building Video Applications with YouTube APIs
Jarek Wilkiewicz
 
PDF
Scraping recalcitrant web sites with Python & Selenium
Roger Barnes
 
PPTX
Workingwithunity 110519054824-phpapp01
Srijib Roy
 
PPTX
Game development via_sprite_kit
Buşra Deniz, CSM
 
PDF
Browsers with Wings
Remy Sharp
 
PDF
飛び道具ではないMetal #iOSDC
Shuichi Tsutsumi
 
PDF
Visual Component Testing -- w/ Gil Tayar (Applitools) and Gleb Bahmutov (Cyp...
Applitools
 
PDF
Videos on Android - Stuff What I Learned
Mark Hemmings
 
PDF
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
ssuserb6c2641
 
PDF
BYOD: Build Your First VR Experience with Unreal Engine
Michael Sheyahshe
 
PPTX
Unity3D Programming
Michael Ivanov
 
PDF
libGDX: Scene2D
Jussi Pohjolainen
 
PPTX
Kotlin. One language to dominate them all.
Daniel Llanos Muñoz
 
PDF
The Ring programming language version 1.3 book - Part 8 of 88
Mahmoud Samir Fayed
 
Asynchronous Programming at Netflix
C4Media
 
UIImageView vs Metal [日本語版] #tryswiftconf
Shuichi Tsutsumi
 
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Chris Adamson
 
AVFoundation @ TACOW 2013 05 14
Ryder Mackay
 
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Chris Adamson
 
iOS Training Session-3
Hussain Behestee
 
Building Video Applications with YouTube APIs
Jarek Wilkiewicz
 
Scraping recalcitrant web sites with Python & Selenium
Roger Barnes
 
Workingwithunity 110519054824-phpapp01
Srijib Roy
 
Game development via_sprite_kit
Buşra Deniz, CSM
 
Browsers with Wings
Remy Sharp
 
飛び道具ではないMetal #iOSDC
Shuichi Tsutsumi
 
Visual Component Testing -- w/ Gil Tayar (Applitools) and Gleb Bahmutov (Cyp...
Applitools
 
Videos on Android - Stuff What I Learned
Mark Hemmings
 
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
ssuserb6c2641
 
BYOD: Build Your First VR Experience with Unreal Engine
Michael Sheyahshe
 
Unity3D Programming
Michael Ivanov
 
libGDX: Scene2D
Jussi Pohjolainen
 
Kotlin. One language to dominate them all.
Daniel Llanos Muñoz
 
The Ring programming language version 1.3 book - Part 8 of 88
Mahmoud Samir Fayed
 

More from Kohki Miki (19)

PDF
cocos2d-consoleでパッケージ管理
Kohki Miki
 
PDF
ゲームコミュニティサミット2014に参加してきた話
Kohki Miki
 
PDF
ゲームコミュニティサミット2014「*いどのなかにいる*」
Kohki Miki
 
PDF
札幌ゲーム製作者コミュニティKawaz「いどのなかにいる」
Kohki Miki
 
PDF
Kawaz Hipchat超入門
Kohki Miki
 
PDF
Kawaz Third Impact
Kohki Miki
 
PDF
Unite Japanに参加してきた話
Kohki Miki
 
PDF
nomad-cliの紹介
Kohki Miki
 
PDF
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
Kohki Miki
 
PDF
VOXCHRONICLE企画草案
Kohki Miki
 
PDF
〜ゲーム制作を始めてみよう〜 Kawaz入会希望者向けスライド
Kohki Miki
 
KEY
Kawaz的jQuery入門
Kohki Miki
 
PDF
Kobold2Dで始めるゲーム開発
Kohki Miki
 
PDF
【TDDBC2.1】やる夫で学ぶTDD
Kohki Miki
 
KEY
はてな技術勉強会 #4LT「札幌ゲーム制作者コミュニティKawaz」について
Kohki Miki
 
KEY
はてなインターンシップ2011、ワークショップ発表プレゼン
Kohki Miki
 
KEY
cocos2で始める iPhoneゲーム開発入門
Kohki Miki
 
KEY
PyGame入門
Kohki Miki
 
KEY
cocos2d入門
Kohki Miki
 
cocos2d-consoleでパッケージ管理
Kohki Miki
 
ゲームコミュニティサミット2014に参加してきた話
Kohki Miki
 
ゲームコミュニティサミット2014「*いどのなかにいる*」
Kohki Miki
 
札幌ゲーム製作者コミュニティKawaz「いどのなかにいる」
Kohki Miki
 
Kawaz Hipchat超入門
Kohki Miki
 
Kawaz Third Impact
Kohki Miki
 
Unite Japanに参加してきた話
Kohki Miki
 
nomad-cliの紹介
Kohki Miki
 
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
Kohki Miki
 
VOXCHRONICLE企画草案
Kohki Miki
 
〜ゲーム制作を始めてみよう〜 Kawaz入会希望者向けスライド
Kohki Miki
 
Kawaz的jQuery入門
Kohki Miki
 
Kobold2Dで始めるゲーム開発
Kohki Miki
 
【TDDBC2.1】やる夫で学ぶTDD
Kohki Miki
 
はてな技術勉強会 #4LT「札幌ゲーム制作者コミュニティKawaz」について
Kohki Miki
 
はてなインターンシップ2011、ワークショップ発表プレゼン
Kohki Miki
 
cocos2で始める iPhoneゲーム開発入門
Kohki Miki
 
PyGame入門
Kohki Miki
 
cocos2d入門
Kohki Miki
 

Recently uploaded (20)

PDF
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
PDF
lesson-2-rules-of-netiquette.pdf.bshhsjdj
jasmenrojas249
 
PDF
Balancing Resource Capacity and Workloads with OnePlan – Avoid Overloading Te...
OnePlan Solutions
 
PDF
vAdobe Premiere Pro 2025 (v25.2.3.004) Crack Pre-Activated Latest
imang66g
 
PDF
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
PPTX
Explanation about Structures in C language.pptx
Veeral Rathod
 
PPTX
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
PDF
49784907924775488180_LRN2959_Data_Pump_23ai.pdf
Abilash868456
 
PPTX
Presentation about Database and Database Administrator
abhishekchauhan86963
 
PDF
WatchTraderHub - Watch Dealer software with inventory management and multi-ch...
WatchDealer Pavel
 
PPTX
Presentation about variables and constant.pptx
kr2589474
 
PPT
Activate_Methodology_Summary presentatio
annapureddyn
 
PDF
An Experience-Based Look at AI Lead Generation Pricing, Features & B2B Results
Thomas albart
 
PPTX
classification of computer and basic part of digital computer
ravisinghrajpurohit3
 
PPTX
ConcordeApp: Engineering Global Impact & Unlocking Billions in Event ROI with AI
chastechaste14
 
PPTX
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
PDF
Key Features to Look for in Arizona App Development Services
Net-Craft.com
 
PDF
Salesforce Implementation Services Provider.pdf
VALiNTRY360
 
PPTX
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 
PPT
Why Reliable Server Maintenance Service in New York is Crucial for Your Business
Sam Vohra
 
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
lesson-2-rules-of-netiquette.pdf.bshhsjdj
jasmenrojas249
 
Balancing Resource Capacity and Workloads with OnePlan – Avoid Overloading Te...
OnePlan Solutions
 
vAdobe Premiere Pro 2025 (v25.2.3.004) Crack Pre-Activated Latest
imang66g
 
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
Explanation about Structures in C language.pptx
Veeral Rathod
 
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
49784907924775488180_LRN2959_Data_Pump_23ai.pdf
Abilash868456
 
Presentation about Database and Database Administrator
abhishekchauhan86963
 
WatchTraderHub - Watch Dealer software with inventory management and multi-ch...
WatchDealer Pavel
 
Presentation about variables and constant.pptx
kr2589474
 
Activate_Methodology_Summary presentatio
annapureddyn
 
An Experience-Based Look at AI Lead Generation Pricing, Features & B2B Results
Thomas albart
 
classification of computer and basic part of digital computer
ravisinghrajpurohit3
 
ConcordeApp: Engineering Global Impact & Unlocking Billions in Event ROI with AI
chastechaste14
 
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
Key Features to Look for in Arizona App Development Services
Net-Craft.com
 
Salesforce Implementation Services Provider.pdf
VALiNTRY360
 
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 
Why Reliable Server Maintenance Service in New York is Crucial for Your Business
Sam Vohra
 

watchOS 2でゲーム作ってみた話