[iOS][Swift] Swiftっぽくレコードをソートをする

NSSortDescriptorはObjective-Cでも使えるレコードの配列をレコードキーでソートするのに便利な方法ですが、Arrayのsort()メソッドやsorted()メソッドを使うとよりSwiftっぽくクロージャでソートすることができます。

変更前:

let records = NSMutableArray()
let sortDescriptor = NSSortDescriptor(key: "fileSize", ascending: true)
records.sortedArrayUsingDescriptors([sortDescriptor])
// レコード投入
let record1 = NSMutableDictionary()
record1["filePath"] = "/path/to/file1"
record1["fileSize"] = 1000
records.addObject(record1)
let record2 = NSMutableDictionary()
record2["filePath"] = "/path/to/file2"
record2["fileSize"] = 100
records.addObject(record2)
let record3 = NSMutableDictionary()
record3["filePath"] = "/path/to/file3"
record3["fileSize"] = 500
records.addObject(record3)
println(records)

続きを読む [iOS][Swift] Swiftっぽくレコードをソートをする

【Android】 ndk-build clean でシンタックスエラー。原因はNDK r8eのバグか?

Android で NDKビルドを動かすとndk-build cleanでエラーになってしまった。

こういうの。

dk-build clean 
Clean: gnustl_shared [armeabi-v7e] 
/bin/sh: -c: line 0: syntax error near unexpected token `(' 
/bin/sh: -c: line 0: `rm -rf (TARGET_OBJS)' 
make: *** [clean-gnustl_shared-armeabi] Error 1

色々調べたところ、原因は Android NDK r8eの問題のようで
android-ndk/build/core/build-binary.mk

の49行目を次のように修正したらエラーが出なくなった。

変更前:

$(cleantarget): PRIVATE_CLEAN_FILES := ($(my)OBJS)

変更後:

$(cleantarget): PRIVATE_CLEAN_FILES := $($(my)OBJS)

変更後の実行結果:

/Library/android-ndk/ndk-build clean NDK_DEBUG=1 all 
Clean: cvjava [armeabi-v7a]
Clean: gnustl_shared [armeabi-v7a]
Clean: gnustl_static [armeabi-v7a]
Clean: scv [armeabi-v7a]

再現環境はインストールしたバージョンは NDK r8e の OS X 64ビット版(android-ndk-r8e-darwin-x86_64.tar.bz2)
でした。
他の環境で試したわけではないのですが、他の環境ではこれでエラーがでないのでしょうか。

追記

Linux 64bit r8e でも再現するという情報をいただきました。対策も同様でいいそうです。

【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

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

【Sublime Text 2】Mac OS Xで日本語入力のタブ変換ができなくなった場合の対処方法

Sublime Text 2 をしばらく使っていて、Mac OS Xで日本語入力のタブ変換が出来ないことにふと気づきました。

ひらがなを入力したら変換候補が出てきますが、ここでタブを押して変換候補を切り替えようとしたら、タブキーを押した途端に変換候補の欄が閉じて、入力中の文字が消えてしまう。

カーソルで変換候補を切り替えればいつも通り入力はできます。
でも、つい癖でタブキーを押すたび、入力をやり直すハメになって、手が止まる…。

これじゃいけないとタブ関係のキーバインドを見なおしたら何とかなったので、
修正方法をメモしておきます。

解決方法

メニューからPreferences > Key Bindings – Default を開きます。
すると、下のような怪しい部分があるので…

{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
"context":
[
{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
]
},

これをコメントアウトしてしまいます。

/*
{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
{ "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
"context":
[
{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
]
},
*/

あとは保存すればOK。

これで、ストレスなく快適にSublime Text 2を使えるようになりました。

それで原因は?

なんでしょうね…。
色々とプラグインを入れて使っているため、何が原因かは不明なんです。
情報求む。

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/ にあるのですね。

Mac OS X でポートを開いているプログラムを調べる

WindowsやLinuxでは netstat の -bオプションや-pオプションでポートを待ち受けているプロセスを調べる事ができるのに、Mac OS Xではそんなオプションが無く困った。

なんとか方法が他にないか調べた所、
Mac OS X では lsof を使うのが一番簡単そう。

$ lsof -i | grep LISTEN

結果はこんな感じになる。

$ lsof -i | grep LISTEN
Dropbox     303   user   19u  IPv4 0xffffff0123456789      0t0  TCP *:17500 (LISTEN)
Dropbox     303   user   25u  IPv4 0xffffff0123456789      0t0  TCP localhost:26165 (LISTEN)
node      56728   user    8u  IPv4 0xffffff0123456789      0t0  TCP *:hbci (LISTEN)
mongod    57071   user    6u  IPv4 0xffffff0123456789      0t0  TCP localhost:28017 (LISTEN)
mongod    57071   user    7u  IPv4 0xffffff0123456789      0t0  TCP localhost:27017 (LISTEN)

調べようと思った動機は mongodb のListenポートをど忘れして確認したかっただけでした。
実行結果を見ると mongodb は TCP localhost:27017, TCP localhost:28017とあるので、
待ち受けているポートはTCPポート27017, 28017の2つですね。

WineでInstall Mono 2.8 or greaterエラーになった時の対応方法

LinuxでWindowsアプリケーションを実行する必要があったためWineでの実行を試したところ、

$ wine foo.exe
wine: Install Mono 2.8 or greater for Windows to run .NET 4.0 applications. 

と言われてしまいました。wine 2.10 を入れてるのに。

Wine内で動くmonoライブラリのバージョンが古いのだろうと判断し、
winetricksを使って.Net Frameworkライブラリのdotnet40を
インストールしたら動くようになりました。

手順は以下のとおりです。 続きを読む WineでInstall Mono 2.8 or greaterエラーになった時の対応方法