トップ 追記

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|

2018-05-23 [Automatism]アプリ設計のパターン(機能設計)

どうコードを記述するか?この問題に対するアプローチは様々だ。

書籍『Effective ○○』を参考にする。デザインパターンに乗っ取る。コーディング・ルールに従う。どれも有益だとは思うが、今回は、自分がアプリケーション・プログラマに転身した際に参考にした、『iOS開発に置けるパターンによるオートマティズム』を現在の環境で取り組んでみる事にした。

今回取り上げるのはアプリ設計のパターンだ。

_ # 機能設計

今回、この記事を執筆するにあたって過去の教科書的なプログラム開発技法の書籍を読み返してみて気がつくのは、機能設計に相当することがほとんど触れられていないことだ。どんなサービスを開発するのかはユーザの問題で、技術者はユーザからの要求をいかに文書化するかが需要。また、既存のユーザ作業を図にしていくか、制作するプログラムを処理の図にしていくことが主な関心となっていた。

そういう状況から、iPhoneアプリケーションの開発から始まった、幅広い意味のデザインがアプリケーションを製作するエンジニアに期待される状況に変わっていったのは、画期的なことだったのだろう。

そういう訳で機能設計についてはよく使われる図式のようなものなく、様々な図式の技法で育ってきたプログラマにとって不安に感じる部分なのだが、そんなものは不要ということなのだろう。

それではやってみよう。GTDのような個人のワークフローを管理するiOSアプリケーショの機能設計を行ってみる。まずは機能の列挙だ。

  • 個人のワークフローを管理する。
    • 仕事を入力する。
      • 名称
      • 期限
    • 仕事のリストを並べ替える。
    • 仕事をするタイミングを伝える。
      • 通知を表示する。
    • 完了した仕事を済みにする。
      • 指定されて仕事をリストから削除する。

このアプリではデータをバックアップするとか他機器と同期するとかを考えないと、通信の機能は使わないで実装できそう。通知はローカル通知でいけそうだ。


2018-05-09 The Bash in Tokyo

今年も WWDC (Worldwide Developers Conference) の季節となりました。

WWDCについて詳しくない方もいらっしゃると思いますので説明しますと、Appleが毎年春ごろに一週間かけて開催される開発者向けイベントで、今年は6/4(月)〜8(金)に開催となります。そして、WWDC期間中の木曜日の午後にはBashと呼ばれる野外パーティが開催されています。

WWDCでは、開発者向けにMacやiPhoneの次期OSと、その新機能をプロダクトに組み込むための手法が発表されるのと、Appleのエンジニアに直接疑問をぶつけられるということで、開発者にとって関心が高いイベントですが、近年はiPhoneアプリケーション開発者の増加によって人気が高いイベントとなり、すぐにチケットがソールドアウトとなってしまいます。
今回も参加を希望されて、残念ながら抽選で外れた方もいらっしゃると思います。

そこで、MOXSSG (Mac OS X Server勉強会)というグループでは、WWDCのチケットが買えず、日本残留組となった方々と『The Bash in Tokyo』というイベントを開催していました。 今回、このイベントをより幅広い方が参加できるように、MOSAとMOXSSG、Cocoa勉強会 関東と合同で『The Bash in Tokyo』を開催することにいたしました。

本家と違って、会場も屋内でクールなバンドもきません。食べ物も飲み物も基本的に参加者の持ち込みとなります。 でも、WWDCについて語り合いたいという共通の目的がある方々が集まります。WWDCをつまみにビールでも飲みながら語らいましょう。

_ # 参加条件

  • アルコール提供イベントの為、20歳以上とさせて頂きます。
  • イベントの様子の写真は撮影しますのでご了承ください。(SNS等で公開予定)
  • コンサルタントやエンジニア、ライターなど、Appleの最新技術に興味がある方。
  • 飲食の持ち込みをお願いします。例えば、缶ビール1セットやワイン、ピザなどです。
  • _ # イベント概要

  • WWDCセッション動画を皆で視聴します。
  • WWDCで発表された気になるトピックを希望者が発表します。
  • 今回のWWDCについて、皆でディスカッションします
  • _ # 当日のタイムスケジュール(予定)

    17:00 受付
    * WWDCセッション動画(Keynote)の視聴
    18:00 乾杯
    18:00 キーノート(テクノロジーライター 大谷 和利)
    18:30
    * WWDCセッション動画(リクエスト または State of the Union)の視聴
    * 発表数本
    * ディスカッション
    21:00 終了
    22:00までに解散
    

    _ # 申し込み

    ※各グループのメンバーが定員オーバで申し込めないという状況を避けるため、グループ毎に申し込みページを用意しています。  Cocoa勉強会は上記となります。


    2018-05-01 WWDC18について

    今年のWWDCは6月4日から8日までサンノゼで開催される。参加申し込みは抽選方式となった。

    昨年から開催地がサンノゼに戻ったことにより、過去のWWDC情報に役立たない部分があると思うが、パッと見つけたものを列挙してみる。

    _ 以下は事前のイベント。

    _ WWDCと連動したイベント。


    2018-04-12 PubHack.swift 2018-04に行ってきた

    2018年4月12日(木)の夜間、東京都豊島区のTHE DUBLINERS' IRISH PUB 新宿店におきまして、「PubHack.swift 2018-04」を開催致しました。

    PubHack.swift 2018-04

    PubHack.swiftは今年からはじめました新しい形のイベントで、飲み会イベントを通じて、macOS/iOS/tvOS/watchOS/Androidエンジニアの人たちの交流を目的としています。
    名前の由来を説明しますと、PubHackは英国 Pub Rock からとりました。
    Pubは飲み会、Hackはプログラミング、.swiftはmacOS/iOS/tvOS/watchOS系です。

    始めたばっかりということで、正直、浸透していませんが、それでも参加人数は7名と、予想した人数より多くなり大変嬉しいです。
    また、参加された方のバックグラウンドも多彩で、新しいイベントとしては、よかったのではないかと思っています。

    PubHack.swift 2018-04

    純粋な飲み会イベントということで、長々と文章で説明するのも野暮だと思いますが、出てきた話題を何個かピックアップしますと、以下のとおりです。

    • ブロックチェーンの採掘についての理論と実装について。自分はこうしてます。
    • ブロックチェーン関連の開発で収入を得る方法。
    • Mac App Storeで食っていけますか?
    • App Storeで上位にランキングされるということ。
    • 公式に認められた副業について。誰か受注してくれませんか?
    PubHack.swift 2018-04

    次回は5月開催を予定しています!


    2018-04-04 BUKURO.swift 2018-04

    22018年4月4日(水)の夜間、東京都豊島区の池袋コワーキングスペース OpenOffice FORESTにおきまして、「BUKURO.swift 2018-04」を開催致しました。

    BUKURO.swiftも浸透して来たようで、先月と同様に多くの方が申し込まれました。
    初めて参加される方に、どうやってBUKURO.swiftを知ったのか伺ったところ、会社でmacOSプログラミングで悩んでいたところ、同僚から紹介されたとのこと。
    ありがとうございます。
    これからもアプリケーション・プログラマの方々が役立つ勉強会になるよう精進いたします!
    そして、今回の発表はどれもプログラマの好奇心をくすぐるものでした。
    よし、自分も頑張ろう!という気持ちにさせていただきました!

    BUKURO.swift 2018-04

    _ イベント概要

    • 東京 池袋で開催される Cocoa勉強会 と MOSA の合同勉強会です。
    • macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。
    • 初心者大歓迎です。
    • 関連があれば、他の環境についてもOKです。
    • プログラマーが楽しくプログラミングできるようにサポートする場を提供したい
      • 勉強会に参加された方全員が学びを得られる様にサポートします!
      • 勉強会に参加できない方にも学び得られるよう、勉強会の成果を可能な限りアウトプットします!
      • プログラマの拠り所となる場を目指します!

    Cocoa勉強会 関東には、以下のFacebookグループから、ご参加ください。

    https://www.facebook.com/groups/cocoa.kanto/

    MOSAのconnpassグループには、以下から、ご参加ください。

    https://mosa.connpass.com/

    発表資料はconnpassページからどうぞ!
    また、会場の様子は、ハッシュタグ『#cocoastudy #mosa #bukuroswift』でtweetしています。

    _ 矩形の移動

    NSMatrixが非推奨になっているそうです。そこで、代替機能として、同じ大きさの矩形を整列させるための支援コードの発表です!

    _ Swiftの文字列

    以前、Cocoa勉強会 関東で発表されましたが、その後の状況の変化を加味した発表でした。
    自分自身も、その後、経験を積み、前回と比較して理解度も上がり、プログラマの好奇心をくすぐる内容に楽しまさせていただきました。
    SwiftのStringがUnicodeに高い割合で準拠しているのは知っていたのですが、例えば、文字をどういう用語で扱っているのか説明できずもどかしかったのですが、拡張書記素クラスタ(CodePoint)というのですね。そして、例えば、RubyはUnicodeスカラーで、JavaはUTF-16、PythonはUTF-8で扱うため、得られる文字列長が異なるとか、macOSのファイルシステムでの文字列がModified NFDとなっている理由。それから得られる日本語としての恩恵。文字の比較でUnicodeの一貫性のなさからNFDで比較すればいいという訳でない事。
    曖昧に理解していた事が再確認できて、とても有益でした。

    _ 個人製作Unityゲームのデモ

    Unityを使った2Dと3DのWebGLアプリのデモです。十分遊べる完成度に驚かされました。やりますね!

    本日は、ここで時間切れ。今回発表できなかった資料は次回の勉強会で!

    次回は5月11日(金)開催を予定しています!
    また、4月12日(木)にエンジニア飲み会 PubHack.swift 2018-04 を開催しますので、ご都合が宜しければ是非!待ってます!


    2018-03-16 [BUKURO.swift]関東swift勉強会2018–03

    画像の説明

    2018年3月16日(金)の夜間、東京都豊島区の池袋コワーキングスペース OpenOffice FORESTにおきまして、「関東swift勉強会2018-03」を開催致しました。

    画像の説明

    _ イベント概要

    • 東京 池袋で開催される Cocoa勉強会 と MOSA の合同勉強会です。
    • macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。
    • 初心者大歓迎です。
    • 関連があれば、他の環境についてもOKです。
    • プログラマーが楽しくプログラミングできるようにサポートする場を提供したい
      • 勉強会に参加された方全員が学びを得られる様にサポートします!
      • 勉強会に参加できない方にも学び得られるよう、勉強会の成果を可能な限りアウトプットします!
      • プログラマの拠り所となる場を目指します!

    Cocoa勉強会 関東には、以下のFacebookグループから、ご参加ください。

    https://www.facebook.com/groups/cocoa.kanto/

    MOSAのconnpassグループには、以下から、ご参加ください。

    https://mosa.connpass.com/

    発表資料はconnpassページからどうぞ!
    また、会場の様子は、ハッシュタグ『#cocoastudy #mosa #bukuroswift』でtweetしています。

    _ キーイベント処理

    スライドが用意できなかったということでホワイトボードを使った発表となりました。
    macOSのアプリで、標準的なショートカットでない手段でキーボード操作を実現するための方法。例えばCMDキーの二重押下や長押しに対応するために行った手法が説明されました。
    macOSアプリについて詳しくないので、自分もちょっと調べて見ようかなと思って聞いていたのですが、やりたい事ばかりなので、果たしていつ実現できるのか?

    画像の説明

    _ 独自Documentクラス

    発表者のTIPSとして、独自のDocumentクラスを用意する方法が紹介されました。

    _ NSTableVIew macOS 10.7以降

    行をドラッグ&ドロップで入れ替える操作の対応について、macOS 10.7以降のモダンな手法が紹介されました。資料とサンプルコードは、AirDropで配布となりました。

    _ Developer's Tech Lab 『Swiftでフレームワークを作る方法について』

    MOSA de BBで質問があって、Swiftでフレームワーを作る方法について、調べたことの発表について、参加者と意見を交換しました。

    _ Developer's Tech Lab 『DocumentクラスとNSFileWrapperについて』

    独自のDocumentクラスでもNSFileWapperを使いたいのですが、その方法について、参加者と意見を交換しました。

    _ Developer's Tech Lab 『iPhone X画面対応について』

    iPhone X画面対応について、参加者と意見を交換しました。

    次回もCocoa勉強会 関東との合同勉強会を4月に予定しています!
    勉強したい方や、同じ業界の方々と情報交換したい方、お待ちしています!


    2018-02-28 [macOS][iOS]SwiftでFrameworkを実装する

    サンプル・コードの構成を説明すると、macOSアプリケーションにEmbedded Frameworkを組み込んで確認を行った。

    Embedded Frameworkに以下の内容のクラスを追加する。

    public class QuickDraw: NSObject {
        @objc public func dbgmsg() {
            print("QuickDraw")
        }
    }
    

    アプリケーション側のObjective-Cコードから呼び出す例は以下となる。

    @import Toolbox;
     
    @implementation Exam
     
    - (void)dbgmsg
    {
        NSLog(@"%s", __func__);
        QuickDraw *qd = [QuickDraw new];
        [qd dbgmsg];
    }
     
    @end
    

    Swiftコードから呼び出す例は以下となる。

    import Toolbox
     
    class ViewController: NSViewController {
     
        override func viewDidLoad() {
            super.viewDidLoad()
     
            let exam = Exam()
            exam.dbgmsg()
            
            let qd = QuickDraw()
            qd.dbgmsg()
        }
     
        override var representedObject: Any? {
            didSet {
            // Update the view, if already loaded.
            }
        }
    }
    

    Frameworkはモジュールということになるので、モジュール内で定義したクラスを外部からアクセスするためには、openまたはpublicで宣言されている必要がある。

    Frameworkのクラスは、Objective-CでもSwiftでも、モジュールをimportするだけでアクセスできた。

    _ ソースコード

    GitHubからどうぞ。
    https://github.com/murakami/workbook/tree/master/mac/Bedrock - GitHub

    2018-02-26 [macOS][iOS]独自Documentクラス

    Traditional version of MVC as a compound pattern

    MVC

    Cocoa version of MVC as a compound design pattern

    Cocoa
    NS
    • iOS 5 からUIDocumentクラスが用意されたが、少々、オーバースペック。
    • 筆者は、以前から、独自のDocumentクラスを用意していた。

    Documentクラスはモデル・コントローラ

    Document
    
    

    Documentクラスの例

     class Document {
        var version: String
        
        private var _uniqueIdentifier: String
        var uniqueIdentifier: String {
            return _uniqueIdentifier
        }
        
        static let sharedInstance: Document = {
            let instance = Document()
            return instance
        }()
        
        init() {
            let infoDictionary = Bundle.main.infoDictionary! as Dictionary
            self.version = infoDictionary["CFBundleShortVersionString"]! as! String
            self._uniqueIdentifier = ""
        }
        
        deinit {
        }
        
        func load() {
            loadDefaults()
        }
        
        func save() {
            updateDefaults()
        }
        
        private func clearDefaults() {
            let userDefaults = UserDefaults.standard
            if userDefaults.object(forKey: "version") != nil {
                userDefaults.removeObject(forKey: "version")
            }
            if userDefaults.object(forKey: "uniqueIdentifier") != nil {
                userDefaults.removeObject(forKey: "uniqueIdentifier")
            }
        }
        
        private func updateDefaults() {
            let userDefaults = UserDefaults.standard
            
            var versionString: String = ""
            if userDefaults.object(forKey: "version") != nil {
                versionString = userDefaults.object(forKey: "version") as! String
            }
            if versionString.compare(self.version) != .orderedSame {
                userDefaults.setValue(self.version, forKey: "version")
                userDefaults.synchronize()
            }
            
            var uniqueIdentifier: String = ""
            if userDefaults.object(forKey: "uniqueIdentifier") != nil {
                uniqueIdentifier = userDefaults.object(forKey: "uniqueIdentifier") as! String
            }
            if uniqueIdentifier.compare(self.uniqueIdentifier) != .orderedSame {
                userDefaults.setValue(self.uniqueIdentifier, forKey: "uniqueIdentifier")
                userDefaults.synchronize()
            }
        }
       private func loadDefaults() {
            let userDefaults = UserDefaults.standard
            
            var versionString: String = ""
            if userDefaults.object(forKey: "version") != nil {
                versionString = userDefaults.object(forKey: "version") as! String
            }
            if versionString.compare(self.version) != .orderedSame {
                /* バージョン不一致対応 */
                clearDefaults()
                _uniqueIdentifier = UUID.init().uuidString
            }
            else {
                /* 読み出し */
                if userDefaults.object(forKey: "uniqueIdentifier") != nil {
                    _uniqueIdentifier = userDefaults.object(forKey: "uniqueIdentifier") as! String
                }
            }
        }
        
        private func modelDir() -> String {
            let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
            if paths.count < 1 {
                return ""
            }
            var path = paths[0]
            
            path = path.appending(".model")
            return path
        }
        
        private func modelPath() -> String {
            let path = modelDir().appending("/model.dat")
            return path;
        }
    }
    

    シングルトンを使わない例

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
       public let document = Document()
        :
    }
    
     let delegate = UIApplication.shared.delegate as! AppDelegate
    let document = delegate.document
    print(document)
    

    2018-02-16 第108回 Cocoa勉強会 関東 BUKURO.swift 2018-02 レポート(2/16)

    2018年2月16日(金)の夜間、東京都豊島区の池袋コワーキングスペース OpenOffice FORESTにおきまして、「BUKURO.swift 2017-12」を開催致しました。

    _ イベント概要

    • Cocoa勉強会 関東とMOSAの合同勉強会です。
    • macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。
    • 初心者大歓迎です。
    • 関連があれば、他の環境についてもOKです。
    • プログラマーが楽しくプログラミングできるようにサポートする場を提供したい
      • 勉強会に参加された方全員が学びを得られる様にサポートします!
      • 勉強会に参加できない方にも学び得られるよう、勉強会の成果を可能な限りアウトプットします!
      • プログラマの拠り所となる場を目指します!

    Cocoa勉強会 関東には、以下のFacebookグループから、ご参加ください。

    MOSAのconnpassグループには、以下から、ご参加ください。

    発表資料はconnpassページからどうぞ!
    また、会場の様子は、ハッシュタグ『#cocoastudy #mosa #bukuroswift』でtweetしています。

    _ デザイン・パターン

    iOSアプリケーション開発の現場ではデザインパターンが話題となっていますが、最近の傾向では、Microsoftの.NETフレームワーク由来のものが流行っているようです。
    でも、そもそも異なる環境向けのものを無理やり適用しようとしているように見えますし、そこで説明されるMVCはCocoaとは異なるものです。
    この発表は、とはいっても現場で.NET由来のデザインパターンが選択されたら従うしかないということで、それぞれのフレームワークの内容を発表者が理解するために、資料化したものです。

    _ NSDcoument複数ファイルフォーマット その2

    意図せず、今回は『Document-based Application特集』になってしまいました。
    発表者が製作中のアウトラインプロセッサにOPML形式ファイルのサポートを追加する際の試行錯誤の発表です。
    自動保存機能が追加された事による「Save To...」と「Export...」のメニュー項目問題が勉強になりました。

    _ NSDcoument複数ファイルフォーマット その3

    新規ドキュメントの機能にテンプレートを組み込むお話です。
    これについては、他で説明されているのを見たことがないので、貴重だと思います。

    _ Developer's Tech Lab

    _ Document-based Applicationについて

    MOSA de BB掲示板であった質問を切っ掛けに、取り上げることにして見ました。
    ホストも興味がある項目なので勉強になったのと、参加者のコメントから、認識に間違いがないか確認できたのがよかったです。

    _ BUKURO.makers

    BUKURO.swiftの運営が軌道に乗ってきたということで、今後、色々と挑戦して見たいと思っています。その一つに、ある分野に特化した勉強会で、以下を考えています。

    * BUKURO.makers
    
 ものづくり
    * BUKURO.games
    
 ゲーム開発
    * BUKURO.ai
    
 人工知能
    * BUKURO.blockchain
    
 ブロックチェーン

    今回はその第一弾でMakers関連をやってみました。将来的には独立した勉強会にしたいのですが、まだ早いと思うので、BUKURO.swiftに間借りしてやってみました。

    _ コピー機を作る

    BUKURO.makersの第一回の発表を参加された方が事前に用意していくれたのが嬉しいです。
    なんと、コピー機を自作するという内容でした。今後が楽しみです。

    _ Arduino UNOにESP-WROOM-02をつなぐ

    水位計を自作するため、Auduino UnoにWiFiシールドを繋ぐという発表でした。

    次回もCocoa勉強会 関東との合同勉強会を3月に予定しています!
    BUKURO.gamesというゲーム制作のコーナーを設ける予定です!


    2018-01-17 [macOS][iOS]サーバーレスアーキテクチャで悩んでます

    今回は、AKIBA.swift 第12回 質疑トーク回! で発表した内容だ。この回は、発表者の課題を参加者とディスカッションして解決するという内容のため、この投稿には結論はないので悪しからず。

    作りたいアプリは
    • サーバを避けたい
      • プログラム作成が面倒
      • 維持費がかかる
      • アプリがヒットしてしまい、サーバへのアクセスが増えると、開発者の負担がます
      • 規模が大きくなると、性能問題や、ダウンした際の対応など、課題が出てくる
    • 必要な機能は?
      • データの読み書きの機能が用意されている。
      • バックアップとしても利用できる。
      • 持っている複数の機器で共有できる。
      • 容量制限を超えたら、ユーザに料金の請求が行く。
      • 他ユーザと共有できる機能があると嬉しい。
    • 検討しているサービス
      • iCloudストレージサービス
        • キー値ストレージ
        • ドキュメントストレージ
        • CloudKit
      • Firebase
        • Realtime Database
        • Cloud Firestore
        • Cloud Storage
      • IBM Cloud (Bluemix) は?
      • AWS は?
    • iCloudキー値ストレージ
      • UserDefaultsのクラウド版。
      • ユーザごとに1 MB以内。
      • 指定できるキーは1024個まで。
      • 各キーに対応する値のサイズはそれぞれ1 MB以内。
    • iCloudドキュメントストレージ
      • macOSの場合、~/Library/Mobile Documents/iCloud~バンドルID/ 配下に格納される。
      • Info.plist に NSUbiquitousContainersキー を追加すれば、iCloud Driveに格納される。
        
<key>NSUbiquitousContainers</key>
        
 <dict>
        
 <key>iCloud.com.example.MyApp</key>
        
 <dict>
        
 <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        
 <true/>
        
 <key>NSUbiquitousContainerSupportedFolderLevels</key>
        
 <string>Any</string>
        
 <key>NSUbiquitousContainerName</key>
        
 <string>アプリ名など</string>
        
 </dict>
        
 </dict>
    • iCloud CloudKit
      • 容量制限があり、超えると開発者の負担となる。
      • アプリケーションのモデルの格納先を想定していない。
      • 差分などのデータの受け渡しや、ユーザ間でのデータの共有のためのサービス。
    • Firebase Realtime Database
      • データの保存と同期がリアルタイムで。
      • クロスプラットフォーム(iOSやAndroid)。
      • 料金プラン
        
開発者の負担の上限が設定できる。
        • 無料
          同時に100接続。1GB。10GB/月。
        • 月額固定($25/月)
          
同時に100k接続。2.5GB。20GB/月。
        • 従量課金
          
同時に100k/db。$5/GB。$1/GB。
    • Firebase Cloud Firestore
      • Realtime Databaseの次のデータベース。
      • Realtime Databaseと比較すると、階層的なデータに対応している。
    • Firebase Cloud Strage
      • ストレージ。
      • 共有できる
      • 料金プラン
        • 無料
          
5GB。1GB/日。2万操作/日。5万取得操作/日。
        • 月額固定($25/月)
          
50GB。50GB/日。100k操作/日。25万取得操作/日。
        • 従量課金
          
$0.026/GB。$0.12/GB。$0.05/10k。$0.004/10k。