面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

SourceTreeでgit-svnのリモートが表示されなくなった問題

現場ではSourceTreeを用いてgit-svnでバージョン管理を行っています。
そんなある日、リモートにあるSubversionの名前の横にある▷が表示されなくなっていました。

以下加工画像によるイメージ
before:
f:id:aryzae:20161024004255p:plain

after:
f:id:aryzae:20161024004258p:plain

これではサーバからプルもプッシュ何もできません。
設定も環境も弄っていないのに、突然こんな状態になっためサーバ側が何かやったのだろうー
と思い、問い合わせるも何もしていないし、アカウントも正常に許可されているとのことでした。

結局原因も不明な上、調べても情報が何も出てこなかったですが、
現場の他の方が解決方法を見つけてくださったので
他に遭遇した人がいた時のために残しておきます。


【解決方法】
1. SourceTreeの設定 > リモートタブ > Config がいるを編集… の順に選択
f:id:aryzae:20161024143755p:plain
f:id:aryzae:20161024143748p:plain

2. ConfigファイルのSVN関係の箇所で branches の末尾を/branches/*に変更して保存

// 例1
branches = branches/*:refs/remotes/svn/*
を↓のように書き換える
branches = branches/*:refs/remotes/svn/branches/*

// 例2
branches = branches/*:refs/remotes/origin/*
を↓のように書き換える
branches = branches/*:refs/remotes/origin/branches/*

3. リモートのSubversionをフェッチ。
    これで▷が復活してリモートのSubversionが使えるようになります。

4. 手順「2.」でやった書き換えを元に戻す。(重要)
    最後の書き換えた内容を元に戻さないと、
    プッシュ時に謎のコンフリクトが発生するようになり、正常にコミットされなくなります。

Slackでアンケート機能を使う

現場の作業で、ルールを決めたり、コードの書き方に迷った時にこういう書き方はありかなしか
というのを聞きたいなーと思うことがしばしばある。

チームでSlack使っているし、アンケート形式で聞けたら解決できそうかなと思い、
Slackでアンケート機能を使うための方法をまとめておく。

バニラなSlackにはアンケート機能がないため、Pollyという連携機能を使用します。
www.polly.ai


【手順1.】
上記のSlackのPollyサイトから"Add Polly to Slack"をクリックして、使用しているSlackチームに追加する。
f:id:aryzae:20161024001123p:plain

【手順2. 】
Authorizeをクリックしてpollyのbotやコマンドの追加を許可する
f:id:aryzae:20161024001147p:plain

【手順3.】
アンケート機能を使いたいチャンネルで、下記コマンドを入力する
/invite @polly

【手順4.】
下記形式で入力するとアンケートが作成できます。("は半角のダブルクォーテーションです。)
/poll “質問” “選択1” “選択2” “選択3"

f:id:aryzae:20161024002332p:plain
誰かが選択支を選ぶとこんな感じで表示されます。
1人1票で、何度でも選び直すことができます。
f:id:aryzae:20161024002437p:plain


【削除方法】
割と場所をとるため、不要になった時に削除したいこともあると思います。
そんな時は、/poll deleteと入力すると、
f:id:aryzae:20161024002854p:plain
のように、消すためのアンケートのkeyを表示してくれますので、
該当する質問のkeyを含んだコマンドをコピペして入力します。


【おまけ】
Pollyのサイトで異なった内容のアンケートを作れるようです。
(試していないため、具体的には把握していません。)
f:id:aryzae:20161024003155p:plain

UIImageViewを継承しているCustomViewはdrawRectを通らない

うっかり忘れるので書いておく。

タイトル通り。
UIViewを継承しているUIImageViewなので、
LifecycleとしてdrawRectを通りそうなものの、
UIImageViewを継承しているCustomViewは通らないため
処理を書いても意味がない。

あると便利なextension"find"

Swiftで色々便利になったり、融通が効きやすくなったけど、
個々の状況では不便だな〜とか、こういうメソッドあったらいいのに〜と
思うことも多々ある。

そんな時はextensionして使い勝手良くしてしまえばいい。
現場で教えて貰ったextensionで便利だなーと思ったのがあったので書いておく。

"find"は、filterで条件絞って、その中から先頭を抜き出すのに少し手間がかかるので、
条件に合った先頭を最初から返すようにしたもの。

// Swift2
extension SequenceType {
    func find(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? {
        for element in self {
            if try predicate(element) {
                return element
            }
        }
        return nil
    }
}
// Swift3
extension Sequence {
    func find(predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.Iterator.Element? {
        for element in self {
            if try predicate(element) {
                return element
            }
        }
        return nil
    }
}

教えて貰ったコードが、Swift2だったのでそれをそのままと
主流がSwift3になりつつあるのでSwift3のコードも併せて記載。

// 使用例
let array = [1, 20, 321, 77, 900]

let extract1 = array.find { $0 >= 50 }
print(extract1) // "Optional(321)\n"

let extract2 = array.find { $0 >= 10 }
print(extract2) // "Optional(20)\n"

Swift3.0で繰り返し処理の速度比較

処理速度の速い今となっては意味があるかわからないが、
とりあえず気になったから検証してみる
(計測方法が合ってるか不安あり)

比較項目
  • for-in (単純列挙)
  • forEach (単純列挙)
  • enumerated (index付列挙)
  • enumerated.map (index付列挙)
実験環境
  • Xcode8.0 (8A218a)
  • Swift3.0
  • Playground
結果

f:id:aryzae:20160920154555p:plain

処理 時間
for-in 0.000577032566070557
forEach 0.000515997409820557
enumerated 0.000134050846099854
enumerated.map 0.000425994396209717

enumeratedが最速ってことで本当にいいんですかね?
(さりげなくSwift2.0でenumerateだったのが、enumeratedに変わってるのね。コメントは綴り間違えてるし)
実験前はindexとか余計なものが付かないfor-inforEachが最速と思っていたんですけど・・・。

納得いく理由が思いつかないから、計測の仕方間違えてるんじゃないかとさえ思える・・・何か理由わかる人いたら教えてください。