いつしかいった大きなカンファレンスで気になったものに触れる

もう３ヶ月前に登ることTry!swiftに行って帰って来たきり気になっているものはいくつかあったが
触れてはいなかった。
今更だが触れていく。

#PackageManager
私は開発するときにライブラリはcocoapodで入れているが
このカンファレンスではpackagemanagerがなんども出てきている。

結構使いやすいのかな。。。とにかく使ってみる。

https://swift.org/download/#releases

ここから持ってくるようだ。


<img width="773" alt="スクリーンショット 2016-06-30 11.15.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/3fa544ab-afcb-b0d8-5c6a-2f759f6ac94b.png">


$ export PATHでパスを通す。

```
export TOOLCHAINS=swift
```

入ったかどうかを確認

```
$ swift package --version 
```

<img width="874" alt="スクリーンショット 2016-06-30 11.17.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/1de772fa-7518-c01b-0115-3b19d9e997e7.png">
なんか出てきたが準備はととのったのか。

とりあえず適当なディレクトリを作って

![スクリーンショット 2016-06-30 11.43.00.png](https://qiita-image-store.s3.amazonaws.com/0/84002/ba1ab0a1-48ad-894d-8dcc-fa72c5c351b0.png)
をしてやると良いみたいだ。
そうすると
![スクリーンショット 2016-06-30 11.50.09.png](https://qiita-image-store.s3.amazonaws.com/0/84002/78026ef7-e6d9-76e4-736d-1b4c79bcb08b.png)

なんか自動生成された。(gitignoreまで生成されるんかぁ)

ん？プロジェクト生成されてないような・・・・・・・と探りを入れてみたら
![スクリーンショット 2016-06-30 11.55.05.png](https://qiita-image-store.s3.amazonaws.com/0/84002/7a364025-4606-c5d7-16e1-e803e0777e01.png)
上記のコマンドを叩けばプロジェクトが生成できるようだ。

![スクリーンショット 2016-06-30 11.57.14.png](https://qiita-image-store.s3.amazonaws.com/0/84002/03953339-f977-14df-46c7-fa53e23df744.png)

<img width="1396" alt="スクリーンショット 2016-06-30 11.59.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/e76046fb-306d-8008-baf6-97222722e7c4.png">
しっかりとソース諸々が認識されている。

さて、次はライブラリを入れるぞ！！

パッケージマネージャで入れられるライブラリは以下のサイトで確認ができるみたいだ。
https://swiftmodules.com/

入れるにはpackage.swiftに自分が欲しいライブラリを<img width="448" alt="スクリーンショット 2016-06-30 12.28.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/1c4e9ba4-4d64-c1cb-a74b-3f7bbf7f4eb6.png">
こんな感じで書けば良いらしい。（gradleっぽさがあるな）

![スクリーンショット 2016-06-30 12.28.18.png](https://qiita-image-store.s3.amazonaws.com/0/84002/00381a65-ce59-9961-053d-0b66fbe7c28c.png)
うぉ、まじでダウンロードされている。

こんな感じで使っていけば酔うのではないのか。

個人的にはcocoapodsの方が良い気がしなくもないけど、gitignoreが自動的にひっついてくるのは良いなぁ、Androidマンがiosやるとき何か馴染むものがあってこっちの方がいいのかなぁという感じでした。

#LLDB
次に気になったのは、swiftコンパイラとLLDBの連携。

LLDBでswiftをデバッグするというもの。

より早くエラーを見つけることが可能になるとかなんとかのお話だった気がする。

どうやるのか・・・・・・
Xcode使っていて全然気づかなかったのですが

<img width="1057" alt="スクリーンショット 2016-06-30 12.53.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/8185f303-0a61-34be-f7d3-562e2acdf88f.png">
この赤で囲ってある部分・・・・・実はキーボードで文字やら何やら入力が可能なのです。。。
本当に全然付かなかった・・・・・。

とりあえずぽちぽちしてみる

```swift
(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) 
```
何か書いたコードがドバーっと出てきた。

これではよくわからなすぎるので
超短いコードでやることにする。

<img width="292" alt="スクリーンショット 2016-06-30 13.12.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/1d415e47-d60c-6802-ea3a-b45e9e7cce4f.png">

こんな感じのものを用意して

<img width="307" alt="スクリーンショット 2016-06-30 13.17.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/0a56f7e1-c211-3408-3d5b-1caf58b33262.png">
とりあえず適当にブレークポイントを貼る。

<img width="879" alt="スクリーンショット 2016-06-30 13.17.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/01ddab63-7560-05fc-296b-dc2271fa9bbb.png">

ここからlldbでイジイジしていく。

変数の中身いじり倒したいー！という時は　"p"を先頭につけた```p　[処理]```　的なことをすれば
できるみたいです。

例えば今"i"という値が10になっていますが、これを```p i
 = 110 ```とすると

<img width="446" alt="スクリーンショット 2016-06-30 14.47.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/6ce53412-93d1-96a9-7060-44b1ac81cd5d.png">

iの中身が110に。

次に配列
<img width="784" alt="スクリーンショット 2016-06-30 15.01.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/e3270fad-83d8-cf73-7004-0cde58fe1e2f.png">

lldbで　コードを書き結果も出力できるらしい。

```
p for k in 0 ..< 13 {print("ⅡDX" + beatmaniaVersions[k])}
```
for文で回してprintで文字を出力する。<img width="1028" alt="スクリーンショット 2016-06-30 15.07.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/d23ca063-f274-0fd4-30a5-f0ce42164121.png">

この写真のようにメソッドがある場合
<img width="312" alt="スクリーンショット 2016-06-30 15.31.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/80143d48-0ce8-5801-53ff-392af6a96643.png">

<img width="109" alt="スクリーンショット 2016-06-30 15.29.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/1ec58d79-6d60-d5b0-dc17-af19c4d5bfb2.png">

とメソッドを指定してやると
<img width="170" alt="スクリーンショット 2016-06-30 15.32.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/6878e1b5-4ed8-f88e-a0a6-e8767664e83a.png">
指定したメソッドの処理が行われ結果が出力されるという。
たくさんのメソッドがあり行が長い時わざわざその場所に行ってブレークポイントを張らずともデバッグが
可能？になるのかこれは。。。

スライドでは CGRectMakeを使いどんな値が入っているのかが迅速にわかるぜ！的なことが書かれていました。

実際にやると<img width="631" alt="スクリーンショット 2016-06-30 15.40.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/0d8e883c-642c-7dba-ee61-886ed71db4b2.png">
と、要素の名前までしっかりと入っていてかなりわかりやいですね！

それと下記のようにするとエラー箇所にbreakPoint貼ることも可能だとか
```breakpoint set -E swift ```
```-E swift``` の後ろに ```-O つけたいオプション```
とやることで特定の条件で検出することができるそうです。

"p"　コマンドともう一個　”po"　というコマンドがあるそうな。
こいつは何者なのか・・・・

とりあえず使ってみる

スライドではネストされた要素も扱えるんだぜ的なことだと思う。

<img width="592" alt="スクリーンショット 2016-06-30 16.33.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/5ef4799b-be42-7616-f938-8a3f5e2c2c9d.png">

こんな感じで用意して"po"してやると

<img width="198" alt="スクリーンショット 2016-06-30 16.33.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/84002/57754a5f-749a-793c-e485-4b11a0f9b448.png">
lldbにネストされた値を出力できるようで。

うまく扱えるようになると開発効率が上がりそうな気がしますが、使いこなすのに時間かかりそう・・・・・。


# 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!!