1 | 2 | 3 | 4 | 5 |最初 次ページ >>
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/(ミラー・サイト)

AD
いいね!した人  |  コメント(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/(ミラー・サイト)
AD
いいね!した人  |  コメント(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/(ミラー・サイト)
AD
いいね!した人  |  コメント(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)
2017-01-30 23:28:58

[macOS]Foundation Tooleを試す

テーマ:ブログ

XcodeのNew Projectで、macOSのCommand Line Tooleを選択する。プロジェクト名は、ヒレガス本の通り"lottery"とする。

ヒレガス本で紹介されていたコードを自分がオーソドックスだと思っているSwiftでコーディングしてみる。

import Foundation
 
var array = [Int]()
for i in 0..<10 {
    let number = i * 3
    array.append(number)
}
print(array)
 
exit(EXIT_SUCCESS)

まず、ヒレガス本でAutoreleasePoolだったのをARCで記述している。

NSNumberは、SwiftのIntの配列とし、var宣言することによって、変更可能としている。

配列に格納されるのは、NSNumberから素直にIntとしている。

最後に、終了時に何もしないとプロセスは0を返すようだが、明示的にexit()を呼んでいる。

ソースコード 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-01-28 08:23:27

[macOS]macOS Cocoaプログラミングをはじめる

テーマ:ブログ

macOSのCocoaプログラミング状況は近年大きく変わった。理由は、iOSのCocoa touchからのフィードバックということになるのだろう。

iPhone SDKが出た時は、UI関連のフレームワークは、OS XとiPhoneで大きく異なったが、最新のフレームワークでは、iOSプログラミングの要領でmacOSプログラミングができるようになっていることに驚くプログラマーも多いと思う。この進化を続けているmacOS Cocoaプログラミングを今のタイミングで入門する際に役立つ情報を集めてみた。

最初に読んだ方が良い、全体を俯瞰する資料といえば、以下だろう。

具体的なコードの説明が足りないため、物足りないが、ある程度の技術が身についた後でも、気づかされる情報が説明されているので、お勧めだ。

macOSプログラミング環境は大きく変わってきている。Swiftもそうだし、ViewControllerなども大きく変わった。市販の書籍もこの進化に追いついていない。でも、逆の見方をすれば、どの書籍も最新の環境にあっていないので、どんな古い書籍でも役立つと言えるのでは?

ということで、著者が選択したのは、昔から人気があったヒレガス本。それも、最初の日本語訳版を頭から最新の環境に読み替えて取り組んでいこうと、個人的に考えている。

この書籍を紹介しているサイトを探したが、古すぎて見つけられなかった。残念。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/RandomApp - GitHub
関連情報 Mac App Programming Guide
Cocoa Study (connpass)
Cocoa勉強会 (connpass)
Cocoa Study (ATND)
MOSA (connpass)
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
いいね!した人  |  コメント(0)  |  リブログ(0)
2017-01-23 22:49:45

[macOS]始めよう

テーマ:ブログ

macOSプログラミングがマイブームだ。手始めに、初期のヒレガス本を最新の開発環境で頭からやってみることにする。

新規プロジェクトを作成。macOSでCocoa Applicationを選択。

以前と異なるのは、以前は自分でアプリケーションのコントローラとなるクラスAppControllerを生成したが、最新の開発環境では、iOSと同様に、AppDelegateとViewControllerが生成済み。

以前ならAppDelegateを選択したと思うが、ViewControllerにコントローラの処理を追加。

AppDelegateは、こんな感じ。

import Cocoa
 
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application
    }
 
    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}

ViewControllerに乱数生成のコードを追加。

import Cocoa
import GameplayKit
 
class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
 
    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
    
    @IBOutlet var textField: NSTextField?
 
    @IBAction func generate(sender: NSButton) {
        let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 99) + 1
        textField?.integerValue = randomNumber
    }
    
    @IBAction func seed(sender: NSButton) {
        textField?.stringValue = "Generator seeded"
    }
}
ソースコード 
関連情報 
【Cocoa練習帳】 
いいね!した人  |  コメント(0)  |  リブログ(0)
2017-01-22 23:18:43

[iOS]CloudKitを使う

テーマ:ブログ

Hackdrライダーにも悩みがある。

燃料計がない単車に乗っているのだが、給油時にトリップメータの値(走行距離)と消費量(給油量)から燃費を計算しないといけない。先ずは、フューエルタンクの容量を把握すること。そして、トリップメータの値から残量を予測し、給油のタイミングを判断することになる。

メーカーから、これの為のアプリが提供されているのだが、WebViewを使った手抜きで、使いづらい。なので、自作することにした。

記録データはサーバ上に置きたいが、自分で立てるのは避けたい。調べたら、iCloud関連が良さそうだ。

利用できるストレージの種類は以下のとおり。

  • キー値ストレージ
    UserDefaultsと同様
  • ドキュメントストレージ
    文書ファイル
  • CoreDataストレージ
    ←廃止
  • CloudKit
    他ユーザと共有できるデータ

CloudKitを利用することにする。

XcodeのCapabilitiesでCloudKitを有効に設定。

CloudKit Dashboardで形式を定義する。

仮の追加コードを用意して見た。

@IBAction func add(sender: UIButton) {
    let privateDatabase : CKDatabase = CKContainer.default().privateCloudDatabase
    let refuelRecord: CKRecord = CKRecord(recordType: "Refuels")
    refuelRecord["Identifier"] = NSUUID().uuidString as CKRecordValue?
    privateDatabase.save(refuelRecord) {
        record, error in
        if error == nil {
            print("Saved : \(record)")
        } else {
            print("Error : \(error)")
        }
    }
}

追加した内容を確認するコードだ。

@IBAction func search(sender: UIButton) {
    let privateDatabase : CKDatabase = CKContainer.default().privateCloudDatabase
    let predicate = NSPredicate(format: "Identifier != %@", "nil")
    let query : CKQuery = CKQuery(recordType: "Refuels", predicate: predicate)
    privateDatabase.perform(query, inZoneWith: nil, completionHandler: {
        results, error in
        print("\(results)")
    })
}

ソースコード 

GitHubからどうぞ。
https://github.com/murakami/MotorcycleNotebook - GitHub


関連情報 

CloudKitクイックスタート
Cocoa Study (connpass)
Cocoa勉強会 (connpass)
Cocoa Study (ATND)
MOSA (connpass)
 

【Cocoa練習帳】 

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

いいね!した人  |  コメント(0)  |  リブログ(0)
2016-12-25 15:22:15

勉強会のご案内

テーマ:ブログ

参加していた勉強会の運営に変更があり、今年度は、主に池袋と松戸で定期的に勉強会が解されるようになった。

渋谷で開催された勉強会は、以下のとおり。

  • Cocoa Study at Shibuya #1
    日時:2016/03/17(木) 19:30-21:00
    会場:電源カフェbeez 渋谷
  • Cocoa Study at Shibuya #2
    日時:2016/04/14(木) 19:30-21:00
    会場:電源カフェbeez 渋谷

渋谷の会場が都合で使えなくなったため、池袋で開催されるようになった。

松戸でも開催されるようになった。松戸では、今後は、初心者向け、かつ、macOS関連の発表を充実させて行く予定だ。ただ、会の内容を決めるのは発表者なので、参加者次第となるが。

今年度から、NPO法人MOSAの理事になり、MOSA自習室という勉強会を開催。

どんな内容なのかは、各勉強会のページに発表資料のリンクがあるので、それで確認してほしい。

年明けも、以下の勉強会の開催が決まっているので、興味がある方は、申し込みを。

自分が考えている発表は、一つは、よりCoolなSwiftによるプログラミングを調べた『Swiftyを試してみる』と、macOSの開発をしたくなったので、近年、大きく変わったmacOS関連の基本的なアプリケーションについてを考えている。

 

関連情報

Cocoa Study at Ikebukuro #6 (BUKURO.swift)
Cocoa Study (connpass グループ)
Cocoa Study (ATND グループ)
Cocoa勉強会
Cocoa勉強会(関東)
Cocoa勉強会 関東 (connpass グループ)
Cocoa勉強会関西
Cocoa勉強会関西ビギナーズ
MOSA
MOSA (connpass グループ)

 

【Cocoa練習帳】

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

いいね!した人  |  コメント(0)  |  リブログ(0)
2016-12-24 09:10:06

何を学ぶべきか?

テーマ:ブログ

業務上、CやC++、Objective-C、Swift、Java、C#を同時に利用するという機会があるのだが、それで得られた感想は、プログラミング言語の違いによる差はない、だ。単に記法が異なるだけ。

違いが出るのは、どんなフレームワークを使っているかで、そういう意味から、Objective-CとSwiftの差はないと思う。

○○言語の方が簡単で効率的!といわれる場合があるが、ワインバーグさんが言っているように、これは経営側からの視点の言葉だと思う。○○言語の方が安全といわれる場合もあるが、これはあるレベルのスキルがある関係ないと思う。今後定年がなくなると言われる状況で、ずっとプロでやって行くことを考えると、安全なプログラミング言語でないと危険な仕事をしているようではと思う。

自分の経験から、自分がまだプログラミングの仕事ができているのは、以下を学ぶことができたからかなと考えている。

  • Bourne Shell
  • C言語
  • Cocoa

Swiftを知って、あらためてC言語の素晴らしさを実感しているが、C言語のスキルを得るために、Swift主流の時代ににSwiftしか知らないのでObjective-Cを学ぶのは難しいとは思う。かと行って、hello, worldレベルの学習をしてもしょうがない。難しい状況だな。

Cocoaのような本格的で大規模なGUIライブラリを知っておくのは、大事だと思う。違うものが主流になっても、その経験は生きるので。

ソースコード GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/ios/Hand - GitHub
関連情報 文化を調和させる
【Cocoa練習帳】 http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
いいね!した人  |  コメント(0)  |  リブログ(0)
1 | 2 | 3 | 4 | 5 |最初 次ページ >>

AD

Ameba人気のブログ

Amebaトピックス

      ランキング

      • 総合
      • 新登場
      • 急上昇
      • トレンド

      ブログをはじめる

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

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

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

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

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