1 | 2 | 3 | 4 | 5 |最初 次ページ >>
2017-08-22 00:05:55

[お金を扱う]カード決済

テーマ:ブログ

FeliCaに対応したiPhone 7 (jp)の登場で、iOS関連のカード決済が盛り上がってきたので、カードを使った決済について調べてみた。

カード クレジットカード
銀聯カード
電子マネー 交通系IC
QUICPay
iD

NFC TYPE-A/BとFeliCa(NFC TYPE-F)の関係がよくわからなかったのだが、前者は非接触EMVのクレジットカードで利用され、後者は電子マネーで利用されているようで、両者に対応したサービスにお目にかかれないのは、これが理由のようだ。

関連情報 Cocoa勉強会 BUKURO.swift (connpass)
Swift勉強会 関東 (connpass)
Cocoa勉強会 BUKURO.swift (ATND)
Cocoa勉強会 BUKURO.swift (Peatix)
MOSA BUKURO.swift (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
AD
いいね!した人  |  コメント(0)  |  リブログ(0)
最近の画像つき記事
 もっと見る >>
2017-07-23 20:27:39

[BUKURO.swift]空配列

テーマ:ブログ

関東swift勉強会2017-7 で発表した小ネタ。各言語での個数0の空配列を宣言する方法だ。

Java

String[] array = new String[0];

C#

string[] array = new string[] {};

Objective-C

NSArray *array = [[NSArray alloc] init];
NSArray *array = @[];

Swift

var array: String[] = []
var array: Array = []
var array = String[]()

関連情報 

関東swift勉強会2017-7
Cocoa勉強会 BUKURO.swift (connpass)
Swift勉強会 関東 (connpass)
Cocoa勉強会 BUKURO.swift (ATND)
MOSA BUKURO.swift (connpass)
 

【Cocoa練習帳】 

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

AD
いいね!した人  |  コメント(0)  |  リブログ(0)
2017-07-20 23:52:12

[BUKURO.swift]人工知能を実装する「意味ネットワーク」

テーマ:ブログ

知能を製作するためには、いろいろな道がある。

知識表現は様々。人工知能の研究の歴史は知識表現の歴史といってもいい?

意味ネットワーク

これを実装の観点から生まれたのが?フレーム・システムかな?

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/Semantic - GitHub
関連情報 Turbo Cによる人工知能
Cocoa勉強会 BUKURO.swift (connpass)
Swift勉強会 関東 (connpass)
Cocoa勉強会 BUKURO.swift (ATND)
MOSA BUKURO.swift (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
AD
いいね!した人  |  コメント(0)  |  リブログ(0)
2017-06-25 23:06:15

[BUKURO.swift]Machスレッドスタック

テーマ:ブログ

Swift勉強会 関東で、Darwinのスタックについて話題となったので調べてみた。

 

UNIXプログラムのメモリモデル

 

Machプログラムのメモリモデル

 

UNIXプログラムのメモリモデルだと、メモリが確保できる限り、スタックは確保できるが、Machプログラムのメモリモデルだと、決められたサイズのスレッドスタックが確保されるので、メモリに余裕があっても、スタックが枯渇するという現象が発生する。なので、再帰呼び出しは避けた方がいい。

 

関連情報

Machオペレーティングシステム―プログラミングと概念
Cocoa勉強会 BUKURO.swift (connpass)
Swift勉強会 関東 (connpass)
Cocoa勉強会 BUKURO.swift (ATND)
MOSA BUKURO.swift (connpass)
 

【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

いいね!した人  |  コメント(0)  |  リブログ(0)
2017-06-16 00:47:06

[BUKURO.swift]WWDC2017

テーマ:ブログ

MOSA BUKURO.swift #10 の発表資料。WWDC2017からきになる項目をリストアップした。

  • WWDC.family
    • https://wwdc.family/
    • 参加者同士で位置情報を共有。
  • Apple File System (APFS)
    • macOSでもAPFSが標準に。
  • What's New in Audio
    • AVAudioEngine
      • OS8から存在していたが気づいていませんでした。
      • AudioUnitのCocoa版?
    • AudioUnit Ver.3
      • AudioUnit がバージョンアップ。
      • そもそも、バージョン番号があることを知らなかった。
  • Metal 2
    • virtual reality (VR) 対応
    • Debug
    • 最適化
  • MusicKit
    • API for the Apple Music subscription service
    • 簡単に分かりやすく説明すると、アプリからiPodが利用できるということ?
  • Core ML
    • Machine learning
  • High Efficiency Image File Format (HEIF) and High Efficiency Video Coding (HEVC)
    • 画像ファイルの書式
    • H.265
  • ARKit
    • カメラとモーション機能の統合
    • https://developer.apple.com/documentation/arkit/understanding_augmented_reality
  • natural language processing (NLP) API
    • 自然言語処理のフレームワーク
  • new Drag and Drop APIs
    • iOSでドラッグ&ドロップ実装をサポートするAPIが追加?
  • Vision
    • 特徴の検出など
    • Core MLが利用されている。
  • Depth API
    • iPhone 7 Plus のカメラで測定されたデータを利用するフレームワーク。
  • Filesアプリ
    • 各機器のストレージの内容をクラウド経由で同期させる。
    • これを想定したファイル管理APIが?
  • ColorSync
    • APIがCocoaフレームワークされた?
  • PDFKit
    • ついに、iOSでも。
  • Identity Lookup
    • メッセージのフィルタ
  • DeviceCheck
    • サーバでの利用も想定
    • 初回起動判定などで利用できる
  • FileProvider
    • Filesアプリ関連で、異なるアプリ間でファイルを共有する口?
  • Core NFC
    • iOSをメンバー管理や、鉄道の利用状況アクセスが期待できる?
    • Suicaの乗車履歴が読み取れる?
  • StoreKit
    • 変更があった?
  • Xcode
    • GitHub
    • Debugging and Analysis
    • Runtime Sanitizers
    • Testing and Continuous Integration
    • Wireless Development
  • App Store
    • 段階的アップデート
    • 使用していないアプリの削除機能
関連情報 MOSA BUKURO.swift #10 【WWDC2017特集!】
Cocoa勉強会 BUKURO.swift (connpass)
Swift勉強会 関東 (connpass)
Cocoa勉強会 BUKURO.swift (ATND)
MOSA BUKURO.swift (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
いいね!した人  |  コメント(0)  |  リブログ(0)
2017-05-29 00:21:22

[Swift]ポインタを引数に持つC言語の関数

テーマ:ブログ

先日の『BUKURO.swift x AKIBA.swift 合同勉強会』で説明したコードは、withUnsafeMutablePointer(to:_:) の使用方法に間違いがあった。正しい記述内容が分かったので発表する。

withUnsafeMutablePointer(to:_:) は、ポインタを引数に持つC言語の関数をSwiftで利用するt目の総称型関数だ。

func withUnsafeMutablePointer(to arg: inout T, _ body: (UnsafeMutablePointer) throws -> Result) rethrows -> Result

正しい記述内容は、以下のとおり。

var valueQueryResult: AnyObject?
result = withUnsafeMutablePointer(to: &valueQueryResult) {
    SecItemCopyMatching(valueQuery as CFDictionary, UnsafeMutablePointer($0))
}

渡したい変数valueQueryResultの型は、AnyObject? 。

withUnsafeMutablePointer()の引数toにポインタを渡す。

C言語の関数はクロージャ内で呼び出す。

この関数の戻り値は、クロージャの返した値を返す。クロージャ内のコードが式1つならその値を戻り値として返すので、SecItemCopyMatching() の戻り値は、resultに設定される。

ここを理解していなくて間違えていた。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/ios/Identifier - GitHub
関連情報 BUKURO.swift x AKIBA.swift 合同勉強会
Cocoa Study 池袋 (connpass)
Cocoa勉強会 関東 (connpass)
Cocoa Study (ATND)
BUKURO.swift (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

いいね!した人  |  コメント(0)  |  リブログ(0)
2017-04-03 00:26:48

[macOS]ヘルパ・オブジェクト

テーマ:ブログ

今回は、ヒレガス本の日本語版初版のヘルパ・オブジェクトの章。サンプルは、前回のものの拡張だ。

最新の開発環境との違いが出る原因の一つが、今回もStoryboard。

ヒレガス本で説明されている、オブジェクト関連図は以下のとおり。

以前のMyDocumentの部分、Storyboardを利用した場合、NSViewControllerが間に入るため、Viewに関連するコードはViewControllerに、モデル管理のコードはDocumentに、とした。

Objective-Cではキー値コーディングを活用するのが賢明で、ヒレガス本では動的な記述をされていた。Swift時代、Swiftyな感覚だと異なる方法が選択されると思うが、Swiftだとどうなるのか試してみたかったので、したがってみた。

    /* カラム:行に表示するインスタンスを返す */
    func tableView(_ aTableView: NSTableView,
                   objectValueFor tableColumn: NSTableColumn?,
                   row: Int) -> Any? {
        let identifier = tableColumn?.identifier
        let person = myDocument?.employees[row]
        return person?.value(forKey: identifier!)
    }
    
    /* 入力されたインスタンスを受け取る */
    func tableView(_ aTableView: NSTableView,
                   setObjectValue object: Any?,
                   for tableColumn: NSTableColumn?,
                   row: Int) {
        let identifier = tableColumn?.identifier
        let person = myDocument?.employees[row]
        person?.setValue(object, forKey: identifier!)
    }

最後にはまったところ。最新の環境でテーブルビューを作成すると、View Basedとなるが、ヒレガス本はCell Based。Cell Basedにすれば動くのだが、せっかくなので、View Basedに挑戦。NSTableViewDelegateの対応が必要になる。

これがCell Basedの場合。

    func tableView(_ aTableView: NSTableView,
                   objectValueFor tableColumn: NSTableColumn?,
                   row: Int) -> Any? {
        let identifier = tableColumn?.identifier
        let person = myDocument?.employees[row]
        return person?.value(forKey: identifier!)
    }

View Based<だと以下となる。/p>

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        let cell = tableView.make(withIdentifier: (tableColumn?.identifier)!, owner: self) as! NSTableCellView
        let person = myDocument?.employees[row]
        if let tcol = tableColumn {
            let identifier = tcol.identifier
            if(identifier == "personName") {
                cell.textField?.stringValue = person?.value(forKey: identifier) as! String
            }
            else if(identifier == "expectedRaise") {
                cell.textField?.floatValue = person?.value(forKey: identifier) as! Float
            }
        }
        return cell
    }

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/RaiseMan - GitHub
関連情報 Aaron Hillegass
Cocoa Study (connpass)
Cocoa勉強会 (connpass)
Cocoa Study (ATND)
BUKURO.swift (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

いいね!した人  |  コメント(0)  |  リブログ(0)
2017-03-12 00:51:37

[macOS]Document-based Application

テーマ:ブログ

今回は、ヒレガス本の日本語版初版のコントロールの章。サンプルは、Document-based Applicationだ。

以前の開発環境との大きな違いは、NSViewControllerがiOSのUIViewControllerに近づいたのとStoryboardだ。最新の環境でもStorybardを使用しないで新規プロジェクトを生成すると、以前に近いのだが、Sgtoryboardを使用すると大きく異なる。

macOSではInterfaceBuilderは汎用的で、nibのFile's Ownerに設定されるクラスは多様だ。iOSではUIViewControllerなど、File's Ownerに設定されるクラスの種類は少なように感じるが、これがmacOSアプリケーションの開発を難しく感じてしまう原因の一つではないかと思っている。

Storyboardを使わない場合、Document.xibが生成され、ウィンドウに配置されたコントローラに対するOutletとActionはDocumentクラスに用意されることになる。

class Document: NSDocument {
    @IBOutlet public weak var deleteButton: NSButton!
    @IBOutlet public weak var nextButton: NSButton!
    @IBOutlet public weak var previousButton: NSButton!
    @IBOutlet public weak var nameField: NSTextField!
    @IBOutlet public weak var raiseField: NSTextField!
    @IBOutlet public weak var box: NSBox!
    
    @IBAction func nextEmployee(sender: AnyObject) {
    }
    
    @IBAction func previousEmployee(sender: AnyObject) {
    }
    
    @IBAction func deleteEmployee(sender: AnyObject) {
    }
    
    @IBAction func newEmployee(sender: AnyObject) {
    }
}

Storyboardを使った場合、OutletはViewControllerで持つのが自然だろう。Actionについては、ViewControllerでも、DocumentでもどちらでもOKだが、今回は、ViewControllerで持ち、ViewControllerがDocumentを操作し、Documentの更新を通知でViewControlelrで受けるようにした。

import Cocoa
 
class ViewController: NSViewController {
    
    @IBOutlet public weak var deleteButton: NSButton!
    @IBOutlet public weak var nextButton: NSButton!
    @IBOutlet public weak var previousButton: NSButton!
    @IBOutlet public weak var nameField: NSTextField!
    @IBOutlet public weak var raiseField: NSTextField!
    @IBOutlet public weak var box: NSBox!
    
    var myDocument: Document?
    
    override func awakeFromNib() {
        self.view.window?.initialFirstResponder = self.nameField
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override var representedObject: Any? {
        didSet {
        }
    }
    
    override func viewWillAppear() {
        super.viewWillAppear()
        
        self.myDocument = self.view.window?.windowController?.document as? Document
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(type(of: self).updateUI(notification:)),
                                               name: Document.updateKey,
                                               object: nil)
    }
    
    override func viewWillDisappear() {
        NotificationCenter.default.removeObserver(self, name: Document.updateKey, object: nil)
        super.viewWillDisappear()
    }
    
    @IBAction func nextEmployee(sender: AnyObject) {
        self.myDocument?.nextEmployee(personName: nameField.stringValue, expectedRaise: raiseField.floatValue)
    }
    
    @IBAction func previousEmployee(sender: AnyObject) {
        self.myDocument?.previousEmployee(personName: nameField.stringValue, expectedRaise: raiseField.floatValue)
    }
    
    @IBAction func deleteEmployee(sender: AnyObject) {
        self.myDocument?.deleteEmployee()
    }
    
    @IBAction func newEmployee(sender: AnyObject) {
        self.myDocument?.newEmployee(personName: nameField.stringValue, expectedRaise: raiseField.floatValue)
    }
    
    @objc private func updateUI(notification: Notification) {
        let recordText = "Record \((self.myDocument?.currentIndex)! + 1) of \(self.myDocument?.employees.count)"
        let currentEmployee = self.myDocument?.employees[(self.myDocument?.currentIndex)!]
        nameField.stringValue = (currentEmployee?.personName)!
        raiseField.floatValue = (currentEmployee?.expectedRaise)!
        box.title = recordText
        previousButton.isEnabled = ((self.myDocument?.currentIndex)! > 0)
        nextButton.isEnabled = ((self.myDocument?.currentIndex)! < ((self.myDocument?.employees.count)! - 1))
        deleteButton.isEnabled = ((self.myDocument?.employees.count)! > 1)
    }
}
import Cocoa
 
class Person {
    public var personName: String = "New Employee"
    public var expectedRaise: Float = 0.0
}
 
class Document: NSDocument {
    public static let updateKey = NSNotification.Name("updateUI")
    
    public var employees = [Person]()
    public var currentIndex: Int = 0
    
    override init() {
        super.init()
        createNewEmployee()
    }
    
    override class func autosavesInPlace() -> Bool {
        return true
    }
    
    override func makeWindowControllers() {
        let storyboard = NSStoryboard(name: "Main", bundle: nil)
        let windowController = storyboard.instantiateController(withIdentifier: "Document Window Controller") as! NSWindowController
        self.addWindowController(windowController)
    }
    
    override func data(ofType typeName: String) throws -> Data {
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }
    
    override func read(from data: Data, ofType typeName: String) throws {
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }
    
    public func nextEmployee(personName: String, expectedRaise: Float) {
        updateEmployee(personName: personName, expectedRaise: expectedRaise)
        currentIndex += 1
        updateUI()
    }
    
    public func previousEmployee(personName: String, expectedRaise: Float) {
        updateEmployee(personName: personName, expectedRaise: expectedRaise)
        currentIndex -= 1
        updateUI()
    }
    
    public func deleteEmployee() {
        employees.remove(at: currentIndex)
        if currentIndex != 0 {
            currentIndex -= 1
        }
        updateUI()
    }
    
    public func newEmployee(personName: String, expectedRaise: Float) {
        updateEmployee(personName: personName, expectedRaise: expectedRaise)
        createNewEmployee()
        updateUI()
    }
    
    private func createNewEmployee() {
        let newEmployee = Person()
        employees.append(newEmployee)
        currentIndex = employees.count - 1
    }
    
    private func updateEmployee(personName: String, expectedRaise: Float) {
        var currentEmployee = employees[currentIndex]
        currentEmployee.personName = personName
        currentEmployee.expectedRaise = expectedRaise
    }
    
    private func updateUI() {
        NotificationCenter.default.post(name: Document.updateKey, object: nil, userInfo: nil)
    }
}

次に問題になったのは、NSWindowのinitialFirstResponder。Storyboardを使わない場合、WindowのOutletをViewにつなぐことができるが、Storyboardを使う場合は、別Sceneなので繋げられない。

今回は、awakeFromNib()で、コードで設定するようにした。

class ViewController: NSViewController {¥
    override func awakeFromNib() {
        self.view.window?.initialFirstResponder = self.nameField
    }
}

今回は、Cocoa勉強会で知り合った方々の情報で課題が解決できた。ありがとう。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/RaiseMan - GitHub
関連情報 storyboardの中のNSWindow initialFirstResponderが効かない問題について (2)
Aaron Hillegass
Cocoa Study (connpass)
Cocoa勉強会 (connpass)
Cocoa Study (ATND)
MOSA (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
いいね!した人  |  コメント(0)  |  リブログ(0)
2017-02-05 20:24:14

[macOS]クラスを作成する

テーマ:ブログ

前回のコマンドライン・プログラムをクラスを使うように書き換えた。

作成したクラスは以下のとおり。

import Foundation
import GameplayKit
 
class LotteryEntry {
    var entryDate: Date
    
    private var _firstNumber: Int
    var firstNumber: Int {
        return _firstNumber
    }
    
    private var _secondNumber: Int
    var secondNumber: Int {
        return _secondNumber
    }
    
    init() {
        self.entryDate = Date()
        self._firstNumber = 0
        self._secondNumber = 0
    }
    
    deinit {
        print("Destroying \(self)")
    }
    
    func description() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") as Locale!
        dateFormatter.timeStyle = .short
        dateFormatter.dateStyle = .short
        let date = dateFormatter.string(from: entryDate)
        return "\(date) = \(firstNumber) and \(secondNumber)"
    }
    
    func setNumbersRandomly() {
        self._firstNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 99) + 1
        self._secondNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 99) + 1
    }
}

主関数は以下のように変更した。

import Foundation
 
var array = [LotteryEntry]()
for i in 0..<10 {
    /*
    let number = i * 3
    array.append(number)
    */
    var entry = LotteryEntry()
    entry.setNumbersRandomly()
    entry.entryDate = Date(timeIntervalSinceNow: (60.0 * 60.0 * 24.0 * 7.0 * Double(i)))
    array.append(entry)
}
print(array)
for entry in array {
    print(entry.description())
}
 
exit(EXIT_SUCCESS)

新規作成したクラスLotteryEntryは、ヒレガス本ではNSObjectを継承したクラスだったが、Swiftなので何も継承しないクラスとした。そこで、後で気がついたのだが、クラスの内容をダンプするために、description()関数を追加したのだが、これは、NSObjectの場合だったようだ。

ヒレガス本では、NSCalendarDateが使われていたが、これは廃止されたクラスなので、Dateクラスを利用している。

乱数の生成は、GameplayKitフレームワークを利用している。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/lottery - GitHub
関連情報 Aaron Hillegass
Cocoa Study (connpass)
Cocoa勉強会 (connpass)
Cocoa Study (ATND)
MOSA (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
いいね!した人  |  コメント(0)  |  リブログ(0)
2017-02-04 00:33:46

[macOS]継承vs使用

テーマ:ブログ

最新の環境でCocoaプログラミングを復習していると、思わぬ発見がある。

クラスの継承を選択するのはCococaプログラミングの初心者が陥りやすい罠で、熟練者は使用を選択する。

C++のような強い型付けの言語では、継承は必要不可欠だが、Objective-Cのような弱い型付け言語では、継承はタイプング量を減らすための、その場しのぎだそうだ。この考えは、InterfaceBuilderでも感じられる。

Swiftは強い型付け限度だが、それによって、大量の間違った継承の選択による問題発生を危惧したのか、Structの利用を推奨し、プロトコル指向を勧めているみたい。

ただ、Struct好きおじさんによる、間違ったStructの選択による悲劇が耳に入ってきているので、何事もほどほどが一番のようだ。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/lottery - GitHub
関連情報 Aaron Hillegass
Cocoa Study (connpass)
Cocoa勉強会 (connpass)
Cocoa Study (ATND)
MOSA (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
いいね!した人  |  コメント(0)  |  リブログ(0)
1 | 2 | 3 | 4 | 5 |最初 次ページ >>

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。