カテゴリー別アーカイブ: mac

Swift2でリリースビルドの時にログ表示しないようにする


Xcode7(Swift2) でデバッグビルドの時だけデバッグ出力して、プロダクションビルドの時はセキュリティのためデバッグログを削る方法のメモ。

このコードにより、print, debugPrintln, NSLogの出力を制御することができます。

事前準備

XcodeプロジェクトのBuild Settings → Swift Compiler → Other Swift Flags の Debug に「-DDEBUG」を追加して下さい。

コード

AppDelegate.swift の冒頭に以下のグローバル関数を追加します。

他のファイルのほうがわかりやすければAppDelegate以外でも大丈夫です。

// リリースビルドでprint, debugPrintを無効化
func print(object: Any) {
  #if DEBUG
    Swift.print(object, terminator: "")
  #endif
}

func debugPrint(object: Any) {
  #if DEBUG
    Swift.debugPrint(object, terminator: "")
  #endif
}

// リリースビルドでNSLog無効化
func NSLog(message:String){
  #if DEBUG
    Foundation.NSLog(message)
  #endif
}
func NSLog(format:String, _ args:CVarArgType...){
  #if DEBUG
    Foundation.NSLog(String(format: format, arguments: args))
  #endif

}

この記事を書いた理由

print, debugPrintは出てきますが、SwiftでNSLogを非表示にする方法がどうしても出てこなかったので記事にしました。

Swift2から廃止されたprintln, debugPrintlnはここに書いていませんが、print, debugPrint と同様の方法で対応可能です。

ググると NSLogを消す方法として、プレフィクスヘッダファイル(.pchファイル)に #define NSLog を方法が出てきますが、こちらはObjective Cにしか効果がないようなので注意。

おまけ

代替案としては、より細かいログレベル制御が可能なXCGLoggerを使うのも手です。

AppDelegateで

import XCGLogger

let log: XCGLogger = {
  let log = XCGLogger.defaultInstance()
  #if DEBUG
    log.setup(.Debug, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil)
    #else
    log.setup(.Severe, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil)
  #endif
  let dateFormatter = NSDateFormatter()
  dateFormatter.dateFormat = "MM/dd/yyyy hh:mma"
  dateFormatter.locale = NSLocale.currentLocale()
  log.dateFormatter = dateFormatter
  
  return log
  }()

としておくと、

log.debug("Debugレベルのログです")
log.info("infoレベルのログです")

のようにログレベルごとのログ出力ができるようになります。

Mac OS X のバッテリー劣化状況を確認する


ほお、と思ったのでメモ。

MacBook AirやMacBook Pro をずっと使っていて、バッテリー(電池)の持ちがなんとなく悪くなった気がするなぁと思った事ありませんか。

そんなときにバッテリーの劣化状況を調べる方法がありました。

ターミナルから、下のコマンドを入力するだけ。

ioreg -c AppleSmartBattery | grep -i Capacity

実行すると、このように出力されます。

$ ioreg -c AppleSmartBattery | grep -i Capacity
    | |           "MaxCapacity" = 4745
    | |           "CurrentCapacity" = 3463
    | |           "LegacyBatteryInfo" = {"Amperage"=3290,"Flags"=7,"Capacity"=4745,"Current"=3463,"Voltage"=8282,"Cycle Count"=282}
    | |           "DesignCapacity" = 5100

MaxCapacityがバッテリーの最大容量、CurrentCapacyty が今のバッテリー残量、DesginCapacityが製品出荷時の(設計された)バッテリー最大容量です。

劣化状況は MaxCapacity ÷ DesginCapacity という計算をすると求められます。

上の例だと 4,745 ÷ 5,100 = 0.930392… となり、製品出荷時から比べるとパフォーマンスが93%(0.93)に減っているので、損耗率は 100 – 93 = 7% となります。

ちなみに上の例は買ってから1年のMacBook Airです。
1年フルに仕事で使ってたのですが、7%しか劣化していないのですね。
もっと劣化してると思っていたけど結構優秀。

【Mac OS X】スクリーンショットの保存場所を変える方法


デフォルトだと画面のスクリーンショット画像を撮るとデスクトップフォルダに保存されます。
裏ワザ、隠し機能的ですが、ターミナルから下のようなコマンドを入力すると画像の保存フォルダを変更することができます。

【ピクチャフォルダに保存する】

$ defaults write com.apple.screencapture location ~/Pictures
$ killall SystemUIServer

ピクチャ以外にも好きなディレクトリにすることもできます。

【ScreenShotsフォルダに保存する】

$ mkdir ~/ScreenShots
$ defaults write com.apple.screencapture location ~/ScreenShots
$ killall SystemUIServer

戻したくなったら下のコマンドで戻すこともできます。

【デフォルト(デスクトップ)に戻す】

$ defaults delete com.apple.screencapture location
$ killall SystemUIServer

以上、クリーンショット保存先を変える方法でした。
散らかってしまいがちなデスクトップもこれで綺麗に整理整頓されるかも。

Mac OS X で pkg-configでエラーになった


普段から OS Xのパッケージ管理には Homebrew を使っています。
Homebrew に含まれる一部パッケージ(pango)のバージョンを変えてインストールする必要があり、自分でビルドしてみようと思ったところすっかりはまってしまいました。

発生した症状

Homebrew でインストールしたパッケージ(cairo)に依存している箇所でエラーになってしまいました。

具体的には ./configure の実行中に pkg-config で依存しているパッケージの.pc ファイルが存在しないと怒られています。

# config.log
pkg-config --cflags --print-errors cairo 

Package xcb-shm was not found in the pkg-config search path.
Perhaps you should add the directory containing `xcb-shm.pc'
to the PKG_CONFIG_PATH environment variable
Package 'xcb-shm', required by 'cairo', not found

解決するには?

エラーメッセージどおり、環境変数 PKG_CONFIG_PATHの通るところに .pc ファイルを配置するか、環境変数にパスを追加して再実行することで解決しました。

PKG_CONFIG_PATHが空の場合のデフォルトは

/usr/local/lib/pkgconfig

です。

今回は /opt/X11/lib/pkgconfig/ の中に依存している .pcファイルがあったので、パス追加で対応しました。

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/opt/X11/lib/

再実行し、エラーが出なくなるのを確認します。

$ pkg-config --cflags --print-errors cairo

あとは通常通り、./configure, make などを実行すればOKです。

OS X では(Homebrewでは?) X11 関係の pkgconfigのパッケージ情報ファイル(.pcファイル)は /opt/X11/lib/pkgconfig/ にあるのですね。