Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

PackageManager

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

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

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

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

スクリーンショット 2016-06-30 11.15.56.png

$ export PATHでパスを通す。

export TOOLCHAINS=swift

入ったかどうかを確認

$ swift package --version 

スクリーンショット 2016-06-30 11.17.39.png
なんか出てきたが準備はととのったのか。

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

スクリーンショット 2016-06-30 11.43.00.png
をしてやると良いみたいだ。
そうすると
スクリーンショット 2016-06-30 11.50.09.png

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

ん?プロジェクト生成されてないような・・・・・・・と探りを入れてみたら
スクリーンショット 2016-06-30 11.55.05.png
上記のコマンドを叩けばプロジェクトが生成できるようだ。

スクリーンショット 2016-06-30 11.57.14.png

スクリーンショット 2016-06-30 11.59.41.png
しっかりとソース諸々が認識されている。

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

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

入れるにはpackage.swiftに自分が欲しいライブラリをスクリーンショット 2016-06-30 12.28.34.png
こんな感じで書けば良いらしい。(gradleっぽさがあるな)

スクリーンショット 2016-06-30 12.28.18.png
うぉ、まじでダウンロードされている。

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

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

LLDB

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

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

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

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

スクリーンショット 2016-06-30 12.53.16.png
この赤で囲ってある部分・・・・・実はキーボードで文字やら何やら入力が可能なのです。。。
本当に全然付かなかった・・・・・。

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

(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) 

何か書いたコードがドバーっと出てきた。

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

スクリーンショット 2016-06-30 13.12.29.png

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

スクリーンショット 2016-06-30 13.17.02.png
とりあえず適当にブレークポイントを貼る。

スクリーンショット 2016-06-30 13.17.31.png

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

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

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

スクリーンショット 2016-06-30 14.47.23.png

iの中身が110に。

次に配列
スクリーンショット 2016-06-30 15.01.55.png

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

p for k in 0 ..< 13 {print("ⅡDX" + beatmaniaVersions[k])}

for文で回してprintで文字を出力する。スクリーンショット 2016-06-30 15.07.59.png

この写真のようにメソッドがある場合
スクリーンショット 2016-06-30 15.31.09.png

スクリーンショット 2016-06-30 15.29.33.png

とメソッドを指定してやると
スクリーンショット 2016-06-30 15.32.52.png
指定したメソッドの処理が行われ結果が出力されるという。
たくさんのメソッドがあり行が長い時わざわざその場所に行ってブレークポイントを張らずともデバッグが
可能?になるのかこれは。。。

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

実際にやるとスクリーンショット 2016-06-30 15.40.58.png
と、要素の名前までしっかりと入っていてかなりわかりやいですね!

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

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

とりあえず使ってみる

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

スクリーンショット 2016-06-30 16.33.11.png

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

スクリーンショット 2016-06-30 16.33.00.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!!

steelhearts
音ゲーマーでネトゲーマでコンシュマー iOS/Androidマン  電気工事第2種 第一種(合格済み)電験3試験免除 ガス溶接その他もろもろ 音楽やってます http://soundcloud.com/x8dcxapiuzrh
topgate
Google技術を中心に取り扱う技術者集団
https://www.topgate.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away