Cocoa練習帳 -6ページ目

[OSX][Swift]プロセス間通信(Distributed Notifications)

以前、発表したプロセス間通信(Distributed Notifications)をSwiftで実装してみた。やってみてわかったのだが、NSConnectionはSwift未対応のようだ。使うのを控えてくれということか。

通知を受け取る側(DistributedServer)のコードは以下のとおり。

import Foundation
import Cocoa
 
protocol RemoteObjectProtocol {
    func receiveString(string: String)
}
 
class AppDelegate: NSObject, NSApplicationDelegate, RemoteObjectProtocol {
    @IBOutlet var window: NSWindow?
    @IBOutlet var label: NSTextField?
    
    func applicationDidFinishLaunching(notification: NSNotification) {
        debugPrint(__FUNCTION__)
        _registerForNotes()
        _registerForDistributedObjects()
    }
    
    func _registerForNotes() {
        debugPrint(__FUNCTION__)
        let dnc = NSDistributedNotificationCenter.defaultCenter()
        dnc.addObserver(self, selector: "_handleDistributedNote:", name: "DemoDistributedNote", object: nil)
    }
    
    func _handleDistributedNote(note: NSNotification) {
        debugPrint(__FUNCTION__, "Recieived Distributed Notification!:", note)
        if let label = self.label {
            label.stringValue = "Recieived Distributed Notification!"
        }
    }
    
    func _registerForDistributedObjects() {
        debugPrint(__FUNCTION__)
        /*
        let conn = NSConnection.defaultConnection()
        conn.rootObject = self
        if !conn.registerName("DistributedServer") {
            debugPrint(__FUNCTION__, "error")
        }
        */
    }
    
    func receiveString(string: String) {
        debugPrint(__FUNCTION__)
        if let label = self.label {
            label.stringValue = string
        }
    }
}

通知を送る側(DistributedClient)のコードは以下のとおり。

import Foundation
import Cocoa
 
protocol RemoteObjectProtocol {
    func receiveString(string: String)
}
 
class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet var window: NSWindow?
    
    func applicationDidFinishLaunching(notification: NSNotification) {
        debugPrint(__FUNCTION__)
        // _postNotes()
    }
    
    @IBAction func postNotes(sender: AnyObject) {
        debugPrint(__FUNCTION__)
        _postNotes()
    }
    
    @IBAction func postForDistributedObjects(sender: AnyObject) {
        debugPrint(__FUNCTION__)
        _postForDistributedObjects()
    }
    
    func _postNotes() {
        debugPrint(__FUNCTION__)
        let dnc = NSDistributedNotificationCenter.defaultCenter()
        dnc.postNotificationName("DemoDistributedNote", object: nil)
    }
    
    func _postForDistributedObjects() {
        debugPrint(__FUNCTION__)
        /*
        let remoteObject = NSConnection.rootProxyForConnectionWithRegisteredName("DistributedServer", host: "")
        remoteObject.setProtocolForProxy("RemoteObjectProtocol")
        remoteObject.receiveString(NSDate.date().description)
        */
    }
}

DistributedServerを起動した後に、DistributedClientを起動すると、アプリケーション間で通知が送られることが確認できる。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/DistributedServer - GitHub
https://github.com/murakami/workbook/tree/master/mac/DistributedClient - GitHub
関連情報 Cocoa Advent Calendar 2015
Cocoa in a Nutshell
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

[Cocoa]安全なプログラミング?

Swiftは安全なプログラミングを提供!という話を聞くと少しモヤモヤしてます。なので、この手の話題に関わりたくないので、ちょっと、違う視点から。

Swiftでもpublicやprivateが指定できるようになりがっかりした側なのだが、そもそも、それで何をしたいのか?隠すためだというが、Swiftのようなインタフェース部と実装部が分かれていない言語では、丸見えじゃん!と思ってしまう。

class Person {
    private var name = "名無しの権兵衛"
    
    func rename(newName: String) {
        name = newName;
    }
    
    private func secretWork() {
    }
}

では、C++はいいのかというと、privateなメンバーも、通常ヘッダーに記述するクラス定義で宣言しないといけないため、知りたくもない内部実装を見せられて、これもイマイチ。

 class Person {
    std::string name;
    void secretWork();
    
public:
    void rename(std::string newName);
};
void Person::secretWork()
{
}
 
void Person::rename(std::string newName)
{
    name = newName;
}

それを考えると、Objective-C 2.0は自分にとって理想的だ。

@interface Person : NSObject {
    NSString *name;
}
 
- (void)rename:(NSString *)newName;
@interface Person ()
- (void)secretWork;
@end
 
@implementation
- (void)rename:(NSString *)newName
{
    if (name) [name autorelease];
    name = [newName retain];
}
 
- (void)secretWork
{
}
@end

ヘッダーには見せたいことだけが記述されている。素晴らしい。

ただ、Swiftに慣れると、インタフェース部と実装部のファイルが分かれているのが、煩わしく感じてしまう気持ちも否定できないが。

関連情報 Cocoa Advent Calendar 2015
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

[iOS][Android]iBeacon

先日の第12回 MOSA Tech Meetingで得られた情報だ。

以前は、iBeacon機器の情報はApple Developerサイトで公開されていなかった為、AndroidアプリケーションをiBeaconに対応させる為には、ネットで得られる情報を信じて実装するしかなかった。

それが、iBeacon for Developersサイトの『Download Artwork and Specifications』のリンクから入手できるようになった。

当然の結果だが、『[iOS][Android]すれちがい通信(その8)』で紹介した実装で問題なかった。

詳しく説明したいのだが、仕様書ダウンロードの際に確認があるので、残念ながら、控えることにする。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/android/Wibree - GitHub
関連情報 Cocoa Advent Calendar 2015
[iOS][Android]すれちがい通信(その8)
iBeacon for Developers
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

第12回 MOSA Tech Meeting

MOSA Tech Meetingに参加してきたので、その内容をざっと紹介する。

今回のテーマは『iPad Pro祭』。発表はtvOS向け開発について、iPad Pro向け開発について、iPad Proのプレゼンでの活用方法、iBeaconやEddystoneについて、iPad Proで楽しめるアプリ紹介の5本だ。

Bluetooth LE関連については、自分も注目している分野なので、後で、詳しく説明してみる予定。

関連情報 Cocoa Advent Calendar 2015
【夜間】第12回 MOSA Tech Meeting 開催!
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

[tvOS]独自のコンテナViewController

tvOSでも、TabBarControllerやNavigationControllerは使えるが、TVのユーザインタフェースということを考えると、独自のコンテナViewControllerが必要になる場合があると思う。そこで、以前、iOS向けに検討したコンテナViewControllerをtvOSに組み込んでみた。

title

コンテナビューコントローラに子ビューコントローラを登録。

self.addChildViewController(titleViewController!)
self.addChildViewController(gameViewController!)

最初の画面を表示させる。

selectedViewController = titleViewController
self.view.addSubview(selectedViewController!.view)

画面を切り替えるコード。

    func toGameViewController() {
        transitionFromViewController(titleViewController!, toViewController: gameViewController!, duration: 1.0, options: .TransitionCrossDissolve, animations: nil, completion: { (finished: Bool) -> Void in self.selectedViewController = self.gameViewController })
    }
ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/tvos/Pokopen - GitHub
関連情報 Cocoa Advent Calendar 2015
[iOS]独自のコンテナViewController
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

関東第76回Cocoa勉強会のご案内

■関東第76回Cocoa勉強会のご案内
日時:2016/1/9(土) 13:00-17:00
会場:東京都千代田区岩本町2-14-2 イトーピア岩本町アネックス3階 会議室
集合:現地(セキュリティカードが必要なため、受付後入室になります)
会費:無料

関連情報 Cocoa Advent Calendar 2015
Cocoa勉強会
Cocoa勉強会
connpass
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

Google for Mobile

Google for Mobileに参加してきたので、興味があった点についてレポートする。

サブタイトルは『Develop. Engage. Earn』。これはセッションカテゴリにもなっていて、各セッションはこれのどれかに属しているものとなっている。そして会場はDevelop TrackとEngage & Earn Trackの2つ用意して、そのカテゴリに沿ったセッションが開催された。

この場で発表される新しいことはなく、Googleから日本の状況に対応した情報が伝えられる場という印象を持った。その中で気になったのが、アプリ申請の審査について。以下の点について気にして欲しいということのようだ。

  • レビューしやすい環境を用意するのは問題ないが、レビューの内容を誘導するのはNG。
  • ストアでアプリを検索する場合に影響を与える、適切でないキーワード。
  • 性的表現についてはグローバルな場なので、グローバルな基準となっている。それ家族に見せれますか?という視点で判断して欲しい。
  • 知的財産侵害には気をつけているが、正当な権利があっても審査側ではわからない状況があると思う。審査チームに伝える手段を用意しているので活用して欲しい。
  • ポリシー違反の場合、メールでも連絡しているので、アカウント作成時に登録したメルアドを確認して欲しい。要するに社長などのメルアドを登録していと思うが、そこに届けられている可能性があるよだと思う。
関連情報 Cocoa Advent Calendar 2015
Google for Mobile
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

WWDCノススメ

WWDCは、Worldwide Developers Conferenceの略で、Appleが年に一回、世界中の開発者を集めて、新技術の紹介や開発にあたっての細かな技術を説明するためのイベントだ。2002年まではAppleの本社があるSan Joseで開催されていたが、2003年からはSan FranciscoのMoscone Westという会場で開催されている。

日本国内で開催される技術系のイベントは、どうしても海外の技術をお勉強するための場という感じになってしまうが、WWDCの特徴は担当部分の責任者であったり、実装を行っているAppleの技術者とやりとりでき、最新の情報が入手できるとともに、それが発表されるタイミングで自分の製品に組み込んだものをリリースできるという利点がある。また、どの分野に注目が集まっているのか、逆にトレンドから外れそうなものなど、流れを感じることができるという利点もある。

開催時期は以前は春から夏の間で変動があったが、最近では6月の第2週あたりに開催されるようになった。月曜日から金曜日に開催され、日本の土曜日に出発すると現地の土曜日に到着し、日曜日で時差ボケの体を慣らして月曜日からのセッションに備え、帰国は現地の土曜日に出発し、日本に日曜日に到着するというのがスタンダードなスケジュールになるのかな?

WWDC参加費以外にかかる費用をどう抑えるかだが、航空機代は頑張るしかない。日本の航空会社にこだわらなくてもかな。宿泊代だが、私のオススメはユースホステル。WWDC期間中は参加さが多く宿泊しており不安も少なく、多少の不便があっても一泊3千円程度は魅力的だ。

関連情報 Cocoa Advent Calendar 2015
WWDC
WWDCノススメ2010
WWDCノススメ2009
WWDCノススメ2008
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

[tvOS]tvOS アプリケーション プログラミングガイド

tvOSアプリケーション開発の日本語文書が公開された。これは助かる。

ざっと、自分にとってポイントになる点を列挙してみる。

  • Apple TV Remoteを使っての操作上、フォーカスの制御が大事。なので、既存のiOSアプリをそのまま動作させることは難しい。
  • ゲームコントローラが接続されている可能性がある。制作するのがゲームでなくても、ゲームコントローラで操作されて問題ない?
  • Apple TV のユーザインタフェースガイドライン。iOSのままの操作でいいの?
  • リソース管理。ローカルに保存できるのはちょっとだけ。iCloudを使う。そして、ダウンロードしたリソースは削除される可能性があるので、それでも問題ないように作る。

本日は電車トラブルで帰宅が深夜となってしまったので、続きは後日。¥

関連情報 Cocoa Advent Calendar 2015
tvOS アプリケーション プログラミングガイド
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

[OSX][iOS][watchOS][tvOS]Swift.org

WWDCでの約束通り、Swiftがオープンソース化された。

Swiftが登場してからC言語について意識するようになったが、Swiftを知れば知る程、C言語の素晴らしさに気付かられる。また、C++言語についても問題も多いが、C++が適切な分野はあると思う。例えば、Swift自身はC++で記述されているし。でも、C++でなくてもいいじゃんというシチュエーションに遭遇することは多い。

Appleの事だから、言語趣味的な事はなく、実用的なアプリケーション開発のプロが使う道具として割り切ったものだと思うので、そういう部分は好感を持っている。今後に期待しているので、裏切らないでよ!

Swiftのオープンソース化については、他にも投稿があると思うので、ちょっと変わった視点でのお話を。

マルチプラットフォーム向けのプロダクトだと思うが、ビルドシステムに何を使っているのだろうか?調べてみると、Ninjaビルドシステムというのを使っているようだ。

Ninjya

説明を読むと、軽量なシステムということだが、期待していいのかな?

関連情報 Cocoa Advent Calendar 2015
Swift
Swift.org
GitHub
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)