もう3ヶ月前に登ることTry!swiftに行って帰って来たきり気になっているものはいくつかあったが
触れてはいなかった。
今更だが触れていく。
PackageManager
私は開発するときにライブラリはcocoapodで入れているが
このカンファレンスではpackagemanagerがなんども出てきている。
結構使いやすいのかな。。。とにかく使ってみる。
ここから持ってくるようだ。
$ export PATHでパスを通す。
export TOOLCHAINS=swift
入ったかどうかを確認
$ swift package --version
とりあえず適当なディレクトリを作って
なんか自動生成された。(gitignoreまで生成されるんかぁ)
ん?プロジェクト生成されてないような・・・・・・・と探りを入れてみたら
上記のコマンドを叩けばプロジェクトが生成できるようだ。
さて、次はライブラリを入れるぞ!!
パッケージマネージャで入れられるライブラリは以下のサイトで確認ができるみたいだ。
https://swiftmodules.com/
入れるにはpackage.swiftに自分が欲しいライブラリを
こんな感じで書けば良いらしい。(gradleっぽさがあるな)
こんな感じで使っていけば酔うのではないのか。
個人的にはcocoapodsの方が良い気がしなくもないけど、gitignoreが自動的にひっついてくるのは良いなぁ、Androidマンがiosやるとき何か馴染むものがあってこっちの方がいいのかなぁという感じでした。
LLDB
次に気になったのは、swiftコンパイラとLLDBの連携。
LLDBでswiftをデバッグするというもの。
より早くエラーを見つけることが可能になるとかなんとかのお話だった気がする。
どうやるのか・・・・・・
Xcode使っていて全然気づかなかったのですが
この赤で囲ってある部分・・・・・実はキーボードで文字やら何やら入力が可能なのです。。。
本当に全然付かなかった・・・・・。
とりあえずぽちぽちしてみる
(lldb) l
25
26 // Draw previous image into context
27 image?.drawInRect(bounds)
28
29 drawStroke(context, touch: touch)
30
31 // Update image
32 image = UIGraphicsGetImageFromCurrentImageContext()
33 UIGraphicsEndImageContext()
34 }
(lldb) l
35
36 private func drawStroke(context: CGContext?, touch: UITouch) {
37 let previousLocation = touch.previousLocationInView(self)
38 let location = touch.locationInView(self)
39
40 // Calculate line width for drawing stroke
41 let lineWidth = lineWidthForDrawing(context, touch: touch)
42
43 // Set color
44 drawColor.setStroke()
(lldb) l
45
46 // Configure line
47 CGContextSetLineWidth(context, lineWidth)
48 CGContextSetLineCap(context, .Round)
49
50
51 // Set up the points
52 CGContextMoveToPoint(context, previousLocation.x, previousLocation.y)
53 CGContextAddLineToPoint(context, location.x, location.y)
54 // Draw the stroke
(lldb) l
55 CGContextStrokePath(context)
56
57 }
58
59 private func lineWidthForDrawing(context: CGContext?, touch: UITouch) -> CGFloat {
60
61 var lineWidth = defaultLineWidth
62
63 return lineWidth
64 }
(lldb) l
65
66 func clearCanvas(animated animated: Bool) {
67 if animated {
68 UIView.animateWithDuration(0.5, animations: {
69 self.alpha = 0
70 }, completion: { finished in
71 self.alpha = 1
72 self.image = nil
73 })
74 } else {
(lldb) l
75 image = nil
76 }
77 }
78
79
80 /*
81 private let linewidth:CGFloat = 10
82
83 private var drawSetColor: UIColor = UIColor.blackColor()
84
(lldb) l
85 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
86 guard let touch = touches.first else { return }
87
88 UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
89
90 let context = UIGraphicsGetCurrentContext()
91
92 image?.drawInRect(bounds)
93
94 draw(context, touch: touch)
(lldb) l
95
96 image = UIGraphicsGetImageFromCurrentImageContext()
97 UIGraphicsEndImageContext()
98
99 }
100
101 private func draw(context: CGContext?, touch: UITouch){
102 let previosuLocation = touch.previousLocationInView(self)
103 let location = touch.locationInView(self)
104
(lldb) l
105 let lineWidth = specifiedSizeDrawing(context, touch: touch)
106
107 drawSetColor.setStroke()
108
109 CGContextSetLineWidth(context, lineWidth)
110 CGContextSetLineCap(context, .Round)
111
112
113 CGContextMoveToPoint(context, previosuLocation.x, previosuLocation.y)
114 CGContextAddLineToPoint(context, location.x, location.y)
(lldb) l
115
116 CGContextStrokePath(context)
117 }
118
119 private func specifiedSizeDrawing(context: CGContext?, touch: UITouch) -> CGFloat {
120
121 var drawLineWidth = linewidth
122
123 return drawLineWidth
124 }
(lldb) l
125
126 func clearCanvas(animated animated: Bool) {
127 if animated {
128 UIView.animateWithDuration(0.5, animations: {
129 self.alpha = 0
130 }, completion: { finished in
131 self.alpha = 1
132 self.image = nil
133 })
134 } else {
(lldb) l
135 image = nil
136 }
137 }
138 */
139 }
(lldb)
何か書いたコードがドバーっと出てきた。
これではよくわからなすぎるので
超短いコードでやることにする。
こんな感じのものを用意して
ここからlldbでイジイジしていく。
変数の中身いじり倒したいー!という時は "p"を先頭につけたp [処理]
的なことをすれば
できるみたいです。
例えば今"i"という値が10になっていますが、これをp i
とすると
= 110
iの中身が110に。
lldbで コードを書き結果も出力できるらしい。
p for k in 0 ..< 13 {print("ⅡDX" + beatmaniaVersions[k])}
とメソッドを指定してやると
指定したメソッドの処理が行われ結果が出力されるという。
たくさんのメソッドがあり行が長い時わざわざその場所に行ってブレークポイントを張らずともデバッグが
可能?になるのかこれは。。。
スライドでは CGRectMakeを使いどんな値が入っているのかが迅速にわかるぜ!的なことが書かれていました。
実際にやると
と、要素の名前までしっかりと入っていてかなりわかりやいですね!
それと下記のようにするとエラー箇所にbreakPoint貼ることも可能だとか
breakpoint set -E swift
-E swift
の後ろに -O つけたいオプション
とやることで特定の条件で検出することができるそうです。
"p" コマンドともう一個 ”po" というコマンドがあるそうな。
こいつは何者なのか・・・・
とりあえず使ってみる
スライドではネストされた要素も扱えるんだぜ的なことだと思う。
こんな感じで用意して"po"してやると
うまく扱えるようになると開発効率が上がりそうな気がしますが、使いこなすのに時間かかりそう・・・・・。
Homekit
最後、これが一番気になって仕方なかった。
本来ならappleでHomekit製品を買ってやるのが良いのだが残念ながら
手元にないので色々眺めるだけにする。
appleが提供するiosが入っている端末で制御できる家具。
制御するためのアプリをデベロップするための物がHomeKitである。
対応している家具にはApple Homekit印のラベルがある。
またこのHomeKit対応製品はSiriを使ってコントロールができるという。
https://developer.apple.com/reference/homekit
リファレンスをさらっと見るとHMHomeクラスこいつが主軸臭がする。
部屋ごとや領域ごとの管理、ユーザーやイベントの管理といったことが詰まっている。
セキュリティとかはどうすんの?という問題についてはappleの方でよろしくやってくれるようなので
開発する人間は気にせず開発に取り組めるだとか。
ちなみに下記のURLからHomeKit対応アクセサリを見ることができる。(メーカーで探せば他にもある)
http://www.apple.com/jp/shop/ipad/ipad-accessories/home-automation
つい最近WWDCにて新たにカメラやドアのインターフォンと連携できるアクセサリが追加されとの発表がありましたね。
また、アクセサリにより多くの情報を送れるようになったとか。
またHomelkitOnlyではなく、最近流行り?のRaspberryPiとHomebridgeを使った事例などが出てますね。
赤外線リモコンで制御できる家電まで広がったとか、
なかなか奥が深いこと。
お風呂自動清掃アクセサリーとか欲しいですよねぇ〜。 家からの距離を計算してある一定の距離に入ったら自動的に洗ってくれてお湯を入れてくれる・・・・(やるのがだるいだけです・・・)
そのうち家電製品だけではなくバック側もHomeKit化できるのではと思ってしまったり。。(多分しても意味ない気もするけど)
電気の経験があるせいか、あれができるんじゃない?これとこれ組み合わせられるだろうとか色々考えてしまい、
なんだか楽しくてしょうがないです。
今度はHomekitの製品を買って試そうと思います。(ラズパイ買ったのはいいけどやれてないので、こちらもなんとかやりたいところ)
まだまだこれから色々なアクセサリ追加されると思うとワクワクが止まらないですな!
将来的には自作ハードでできたらなぁとか思ったりしてます。
今回のお触りは以上で!(最後は違う気がするけど)
Let'sら home hacking!!