【書評】二十歳の原点/高野悦子

Written by じび on 5月 5th, 2018

ちきりんさんが「人生を変えた一冊」と評していたので、読んで見ました。

人生を変えた一冊 – Chikirinの日記

が、残念なことに私にはあまり内容に思うところはありませんでした。

学生運動の話が多くて、その時代の空気を知らないからか、はたまた私が男だからか・・・

 

1×4材の棚

Written by じび on 4月 21st, 2018

机の横に置く本棚を作りました。

高さは105cm、幅64cm、、奥行き30cm。
材料費を抑えるため、棚板の部分を1×4材でスノコ状にして見ました。
木材とネジで材料費は1,700円くらいです。

組み立てやすさを考えて、棚板を作ってから横に柱を取り付ける手順にしたのですが、天面の見た目がイマイチですね。
今度作るときは側板を作ってから、棚板を付ける手順にしてみます。

 

[Swift] Arrayのインデックスに範囲外の値を入れてもクラッシュしないようにする

Written by じび on 10月 22nd, 2017

概要

配列の要素のアクセスにて、クラッシュする”[]”の代わりに、nilを返す”[safe: ]”を追加して使う方法です。

序文

SwiftではArrayのインデックスに範囲外の値を指定するとクラッシュします。

    let array = ["A", "B", "C"]
    let index = 3
    let item = array[index]  // EXC_BAD_INSTRUCTION でクラッシュ

そのため、要素にアクセスする前に、インデックスのチェックを行う方法があります。

    let array = ["A", "B", "C"]
    let index = 3
    guard array.indices.contains(index) else {
        // インデックスの範囲外なら、nilを返す
        return nil
    }
    let item = array[index]  // 実行されない
}

面倒なのでついついサボって省略してしまい、後でクラッシュすることがあります。

実装

そこで、安全にアクセスできる”[safe: ]”を追加して、”[]”の代わりに使います。
これはインデックスが範囲外の場合、nilを返してくれます。
“[]”(subscript(Self.Index))はCollectionプロトコルのメソッドなので、同様にCollectionプロトコルに追加します。

extension Collection {
    subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

用例

“[]”の代わりに”[safe: ]”を使うと、インデックスが範囲外でもクラッシュせずにnilを返します。

    let array = ["A", "B", "C"]
    let index = 3
    let item = array[safe: index]  // nilを返す

注意

ちなみに配列の要素にnilが入っていた場合、戻り値の型は”Type??”になります。

    let array = ["A", "B", "C", nil]
    let index = 3
    let item = array[safe: index]  // item : String??

itemに対する最初のunwrapでnilならインデックスが範囲外、2度目のunwrapでnilなら要素がnilです。

    guard let firstUnwrappedItem = item else {
        return nil  // インデックスが範囲外
    }
    
    guard let secondUnwrappedItem = firstUnwrappedItem else {
        return nil  // 要素がnil
    }

追記

「そもそも範囲外のインデックスにアクセスするのはバグなのだから、nilを返すよりクラッシュさせてしまうべき」との意見もあるのですが、ユーザーにとってはアプリがクラッシュするのは最悪の事態なので、クラッシュするよりも動かない(nilチェックでリターンさせているとほとんどこの動きになります)方がはるかに良いと考えてます。

これは組込み系でよくある、フェイルセーフの考え方が主軸になっています。

参考

xcode – Safe (bounds-checked) array lookup in Swift, through optional bindings? – Stack Overflow

 

MTBのタイヤをちょっと細いのに変えてみた

Written by じび on 9月 24th, 2017

なんちゃってMTBのタイヤの側面が裂けてしまったので、タイヤを交換しました。

交換前のタイヤはセンタースリックで、太さは2.0インチです。

リムテープも交換しました。
今まで入っていたのはよくあるゴム製のやつでしたが、これは塩化ビニールのような材質で硬いです。

新しいタイヤはセンターリッジで、太さは1.75インチです。
基本的にオンロードのみで、グラベルは走らないため、ロードよりのパターンにしました。

バルブを米式にしてみました。
バイクや車で米式に慣れているので、試しに使ってみることにしました。
これで虫ゴムの心配とはおさらばです。

走ってみたところ、以前よりだいぶ軽快に走れるようになりました。

 

AdMob on iPhone X

Written by じび on 9月 24th, 2017

自分のアプリをiPhone Xのシミュレーターで表示してみたのですが、AdMobの部分がセーフゾーンに収まらないですね。AdMobをバージョンアップすれば出来たりするのかな?

【追記】
と思ったら、別のアプリだとちゃんとセーフゾーンに収まっている・・・
やはりフレームワークのバージョンかなー。
どこでバージョン見れるんだろう。

【さらに追記】
原因は私のミスでした・・・
ちゃんとセーフゾーンに収まっていたアプリは、AdMobのバナーをStoryboard上で定義していて、ちゃんと下端が Bottom Layout Guide に合うように設定していました。
一方、セーフゾーンからはみ出していたアプリは、AdMobのバナーをソースコード上で定義していて、しかも Autolayout を使わずに、viewController.view.frame の下端に合うように frameを設定していました。

AdMobのバナーをStoryboard上で定義していて、下端が Bottom Layout Guide に合うように設定したところ、セーフゾーン内に収まるように表示されました。