macOS Sierraとsqlite3 1.3.11でsegmentation fault

Mac初心者なので、El CapitanとかSierraとか言われてもよくわからないのですが、とりあえず今使っているSierraとsqlite3 1.3.11の組み合わせが良くないらしく、引っかかったのでメモ。
Mac OS"ではなくて、"macOS"なんですね。

環境

macOS 10.12 Sierra
ruby 2.3.3p222
sqlite3 1.3.11

症状

sqlite3 1.3.11をbundleでインストールした後、rails tを実行すると、最初の数回は正常に動いたが、その後以下のようなエラーを吐くようになった。

/Users/XXX/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/sqlite3_adapter.rb:27: [BUG] Segmentation fault at 0x00000000000110
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]

-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:                    
     * ~/Library/Logs/CrashReporter                                         
     * /Library/Logs/CrashReporter                                          
     * ~/Library/Logs/DiagnosticReports                                     
     * /Library/Logs/DiagnosticReports                                      
   for more details.                                                        
Don't forget to include the above Crash Report log file in bug reports.     

...

対策

sqlite3を1.3.12以降のものにする。
私の場合はGemfileで1.3.12を指定してbundle updateする事でうまくいきました。
それでもうまくいかない場合は、下記リンクのようにいったんgemを削除して、brew経由でsqlite3を持ってくる方法もあるみたいです。

関連

Segmentation fault with Rails after upgrading to OS Sierra, possibly related to sqlite3 gem - Stack Overflow

Segmentation fault with sqlite3 and Rails console on macOS Sierra · Petros Amiridis

rbenv環境をsudo時にも適用する

Amazon Linuxsinatraを80番ポートで動かそうとsudo rubyしたら、rbenvが適用されてなかったのでメモ。

やり方

echo $PATHsudo bash -c 'echo $PATH'の結果が異なり、sudoの方はどうやら/usr/bin/rubyの方を持ってきているようでした。
調べたところ、sudo時にはsudoersファイルのsecure_pathの値が$PATHとして適用されるらしいです。
もう一つ、env_keepという変数があり、ここに追加された環境変数sudo時に引き継がれるので、RBENV_ROOTを追加すればsudo rbenv installなども動きそうです。

手順としては、

$ sudo visudo

でsudoersファイルを開き、

Defaults    env_keep += "RBENV_ROOT"

env_keepがまとまってるところあたりに追加して、

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/local/rbenv/bin:/usr/local/rbenv/shims:/usr/bin

上のようにsecure_pathのところに/usr/binより前になるようにrbenvのパスを入れれば、rbenvで設定した方のrubyを持ってきてくれます。

参考にさせていただいたサイト

sudo 経由で rbenv を使えるようにする - Qiita
【Linux】CentOS6.5にrbenvをsudoで呼び出せるよう環境構築 | Web活

GX7 Mark II、こわれる

4ヶ月ほど前に買ったPanasonic GX7 Mark IIが故障しました。

突然充電ができなくなってしまったので、仕方なく修理に出しました。
保証期間内ですが、どうやら2,3週間かかるみたいです。

手持ち無沙汰なので使った感想を書いてみます。



この機種を購入する前は、同じPanasonicのGX1を使っていました。 なので、GX1との比較も交えながら書きたいと思います。

画質

GX1よりは確実に良くなっています。ただ劇的に良くなったかというとそうでもないのかなと思います。 解像感は上がった気がします。

これは、多分世代が近い無印GX7やGX8と比較したほうがいいのでしょうが、持っていないのでわかりません。
ただ、基本は無印GX7と同じセンサーらしいので、ローパスフィルターの有無と画像処理エンジンの違いの部分だけ差があるのかなと思います。
ベンチマークサイトやヨドバシの販売員さんの話によると、GX8には若干劣るみたいです。

www.dxomark.com

高感度

GX1とそんなに大差ない気がします。
マイクロフォーサーズはセンサーサイズの小ささから、高感度に弱いという欠点があります。 この機種も高感度はそこまで期待できません。
私はISO 1600までで使ってます。

Floating

手ぶれ補正

GX1にはなかった本体手ぶれ補正ですが、4段相当で結構強力に働いてくれます。
先程述べたように高感度に弱いのですが、明るい単焦点を使えば、夜間の手持ち撮影でもなんとか頑張れます。
レンズの手ぶれ補正と組み合わせたDual I.S.で本領発揮するらしいですが、対応レンズを持っていないのでわかりません。

ファインダー

これもGX1にはついていませんでした。(外付けのが売っているらしいですが高いので買いませんでした。)
ファインダーなしの撮影に慣れてしまったのと、この機種のファインダーが若干見づらいという理由から、使わないことのほうが多いですが、それでも逆光などで液晶が見づらいときには重宝します。
店頭で見た感じだと、GX8のファインダーのほうが見やすかったです。

Lモノクローム

かなり気に入っています。
陰影がはっきり出て、なおかつ潰れないので優秀なエフェクトです。 SILKYPIXだとあとから設定することもできます。

Yokohama

フォーカスセレクト、4Kフォト

この機種の売りらしいですが使ってません。

デザイン

気に入ってます。レンジファインダー風というのでしょうか。
外装がプラなので若干チープですが、黒だとそんなに気にならないです。

大きさ、重さ

GX1よりは若干大きく、重くなりました。
15mm summiluxを普段つけていますが、この組み合わせだと重く感じません。
他のフルサイズ一眼レフなどに比べればだいぶ小さいので、機動性はあると思います。

価格

15mm summiluxのセットをヨドバシで11.3万+10%ポイントで買いました。
現時点(2016/12/04)で9万で買えるらしいので、15mm summiluxが4万することを考えれば安いと思います。 ボディだけだと6.4万で売ってるみたいですね。
コストパフォーマンスのいい機種です。

その他

GX1より液晶がだいぶきれいになって良かったです。また、チルトもついたので、撮影しやすくなりました。
本体給電は便利なのですが、充電器がついていないのが残念です。買うと結構高いので迷ってますが、今回みたいに給電できなくなると困ります。 ボディキャップやレンズのリアキャップがついてなかったのも気になりました。

まとめ

買ってよかったと思います。
E-M1 Mark IIを買う予定だったのですが、デザインが良かったのと15mm summiluxがついてたのでこっちにしました。
12-32mmは家族が持っていますが、こちらもコンパクトでいいレンズだと思います。

View Controllerのユニットテスト

View ControllerのUIテストはともかく、ユニットテストはどうするのかわからなかったので調べました。Swift 3です。

class MapViewControllerTests: XCTestCase {
    
    var mapViewContoller : MapViewController?
    
    override func setUp() {
        super.setUp()

        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        mapViewController = storyboard.instantiateInitialViewController()
        
        UIApplication.shared.keyWindow?.rootViewController = mapViewController
        
        let _ = mapViewController.view
    }
}

let _ = mapViewController.viewとするのが肝心で、一度viewプロパティをよんであげることでViewDidLoad()などが呼ばれ、正しくView Controllerが準備されます。 後は普通のユニットテスト同様です。

UIViewController - UIKit | Apple Developer Documentation