pyenvのために.bash_profileを編集

MacOSX (Yosemite)でpyenvでPython 3.4.2をインストールしたのですが、それを実行することができていない状況でした。

$ python -V
Python 2.7.6
$ pyenv versions
  system
  2.7.6
* 3.4.2 (set by /Users/kaoru/.pyenv/version)
$ which python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python

.bash_profileを見てみると、PATHが$HOME/.pyenv/bin:$PATHとなっていたので、export PATH="$HOME/.pyenv/shims:$PATHに変更しました。

# export PATH="$HOME/.pyenv/bin:$PATH"
export PATH="$HOME/.pyenv/shims:$PATH"
eval "$(pyenv init -)"

この他に、.bash_profileの最後に以下の記述があったので、すべてコメントアウトしました。

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
# PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
# export PATH

# Setting PATH for Python 3.4
# The orginal version is saved in .bash_profile.pysave
# PATH="/Library/Frameworks/Python.framework/Versions/3.4/bin:${PATH}"
# export PATH

これでPython 3.4.2を実行可能になりました。

$ source .bash_profile
$ python -V
Python 3.4.2
$ which python
/Users/kaoru/.pyenv/shims/python

参考:MacOSX - Mac OSX Mavericks で pyenv - Qiita

MacOSX (Yosemite)にpyenvでPython 3.4.2をインストール

いろいろとトラブルがありそうな気もしましたが、Yosemiteにアップグレードしました。この環境に固有の問題かはわかりませんが、pyenvでPython 3.4.2をインストールしようとしたところ、以下のエラーが発生しました。

$ pyenv install 3.4.2
Downloading Python-3.4.2.tgz...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/yyuu/pyenv/wiki/Common-build-problems

BUILD FAILED (OS X 10.10.1 using python-build 20141028)

以下のコマンドを実行することでPython 3.4.2をインストールすることができました。

$ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.4.2

参考:クリーンインストールしてないMavericks環境でのpyenv install - ウラガミ・ライフ

YosemiteにバージョンアップしてPostgreSQLが動作しない場合の対処

MacOSXでHomebrewを利用してPostgreSQL環境を構築しているのですが、メジャーバージョンアップの度に動作しなくなるのが当たり前という感じになってきました。Yosemiteにバージョンアップした今回も動作しなくなったので、以下のようにして修復しました。

$ cd /usr/local/var/postgres
$ mkdir {pg_tblspc,pg_twophase,pg_stat_tmp}
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

SwiftでHealthKitを利用して体温データを保存する方法

SwiftでHealthKitを利用する方法を調べていました。

このコードをViewController.swiftに以下のようにして動作させることができました。

//  ViewController.swift

import UIKit
import HealthKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        saveBodyTemperature()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /**
    引数に渡された文字列を指定のデータへ変換してHealthStoreへ永続化します。
    渡される文字列は、Double型へキャスト出来る形式である必要があります。
    
    :param: unit       健康情報の単位型
    :param: type       健康情報のデータ型
    :param: valueStr   データ文字列
    :param: completion 永続化処理完了時に実行される処理
    */
    func saveHealthValueWithUnit(unit: HKUnit! , type: HKQuantityType!, valueStr: NSString!, completion: ((success: Bool, error: NSError!) -> Void)) {
        // 保存領域オブジェクトをインスタンス化します。
        let healthStore: HKHealthStore = HKHealthStore()
        
        // 数値オブジェクトを生成します。単位と値が入ります。
        let quantity: HKQuantity = HKQuantity(unit: unit, doubleValue: valueStr.doubleValue)
        
        // HKObjectのサブクラスである、HKQuantitySampleオブジェクトを生成します。
        // 計測の開始時刻と終了時刻が同じ場合は同じ値を設定します。
        let sample: HKQuantitySample = HKQuantitySample(type: type, quantity: quantity, startDate: NSDate(), endDate: NSDate())
        
        // 健康情報のデータ型を保持したNSSetオブジェクトを生成します。
        // 永続化したい情報が複数ある場合はobjectに複数のデータ型配列を設定します。
        let types: NSSet! = NSSet(object: type)
        
        let authStatus:HKAuthorizationStatus = healthStore.authorizationStatusForType(type)
        
        if authStatus == .SharingAuthorized {
            healthStore.saveObject(sample, withCompletion:completion)
        } else {
            
            // 体温型のデータをHealthStoreに永続化するために、ユーザーへ許可を求めます。
            // 許可されたデータのみ、アプリケーションからHealthStoreへ書き込みする権限が与えられます。
            // ヘルスケアの[ソース]タブ画面がモーダルで表示されます。
            // 第1引数に指定したNSSet!型のshareTypesの書き込み許可を求めます。
            // 第2引数に指定したNSSet!型のreadTypesの読み込み許可を求めます。
            
            healthStore.requestAuthorizationToShareTypes(types, readTypes: types) {
                success, error in
                
                if error != nil {
                    NSLog(error.description);
                    return
                }
                
                if success {
                    NSLog("保存可能");
                    healthStore.saveObject(sample, withCompletion:completion)
                }
            }
        }
    }
    
    func saveBodyTemperature() {
        // let textStr: NSString! = NSString(format: "\(tfBodyTemperature.text)")
        let textStr: NSString! = NSString(format: "36.0")
        // 体温の単位を生成します。単位は℃(摂氏)です。
        let btUnit: HKUnit! = HKUnit.degreeCelsiusUnit()
        // 体温情報の型を生成します。
        let btType: HKQuantityType! = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyTemperature)
        
        // 永続化処理完了時に非同期で呼び出されます。
        saveHealthValueWithUnit(btUnit, type: btType, valueStr: textStr, completion: {
            success, error in
            
            if error != nil {
                NSLog(error.description)
                return
            }
            
            if success {
                NSLog("体温データの永続化に成功しました。")
            }
        })
    }
}