Pipelineを使うJenkinsで、グローバルの設定でPATHを付け加えたい場合はPATH+EXTRAを使用する

こんばんは。Jenkinsと戯れている今日この頃です。

キー: PATH
値: /usr/local/bin:$PATH

ではなくて、

キー: PATH+EXTRA
値: /usr/local/bin

とする必要がある。こちらからは以上です。

swift-llvmがLLVM 6.0に追従した模様

これでSwiftのWebAssembly対応もちょっと捗るのかもしれない?

参考: https://github.com/kripken/emscripten/issues/2427#issuecomment-372025515

MintでSwiftPM製のCLIツールを管理する

Swift界隈では、Swift Package Manager (SwiftPM) で作られたCLIツールが増えつつあって、それのインストールやバージョン管理をどうしようかという問題がある。一部のツールはHomebrewやCocoaPodsでの配布もしているけど、全ては賄えない。となると各ツールのリポジトリをチェックアウトして$ swift buildしてパス通った箇所にコピーするなどしないといけないけど流石にそれは面倒。

というところで https://github.com/yonaskolb/Mint を使うとその辺の管理が楽になりそう(Mint自体はHomebrewでインストールできる)。

$ mint run yonaskolb/XcodeGen@1.2.4 xcodegen --spec spec.yml # pass some arguments
$ mint install yonaskolb/XcodeGen@1.2.4 --global=false # installs a certain version but not globally
$ mint install yonaskolb/XcodeGen # install newest tag
$ mint run yonaskolb/XcodeGen@1.2.4 # run 1.2.4
$ mint run XcodeGen # use newest tag and find XcodeGen in installed tools

$ mint install/usr/local/binにもリンクしてくれるようなので便利そう。

参考: Swift Package Managerを使って作成したコマンドをMintでインストールする

SwiftでCLIツールを書くためのArgument Parser

SwiftでCLIツールを書く時のArgument Parser(引数やサブコマンドをいい感じに解釈してくれるやつ)の選択肢を書き連ねておきます。これら以外の良い選択肢をご存知の方はぜひ教えてください 🙏

Cirrus CIというCIサービスを知った

(当然)macOSではないのでXcodeは動かせないけど、Swift on LinuxのCIには使えるかもしれない。

Trailing Closureを禁止する

SwiftLint 0.22で追加された multiple_closures_with_trailing_closure というルールをご存知でしょうか。これは次のような複数のクロージャを引数に取るAPIを使用する時に、最後の引数のクロージャTrailing Closureとして渡すことを警告するというルールです。

func fetch(id: Int, success: () -> Void, failure: (Error) -> Void) { ... }

// NG
fetch(
    id: 12345, 
    success: { print("success") }
) { error in
    print("error: \(error)"
}

// OK
fetch(
    id: 12345, 
    success: { print("success") }, 
    failure: { error in print("error: \(error)")}
)

こうしたAPIでは最後のクロージャだけ引数ラベルが落ちてしまうと、各引数の間の対称性がなくなってしまってコードが読みにくくなってしまいそうです。普段よく使うであろうAPIとしては UIView.animate(withDuration:animations:completion:) が挙げられると思います。

// With trailing closure
UIView.animate(
    withDuration: 0.3,
    animations: { ... }
) { finished in
    ...
}

// Without trailing closure
UIView.animate(
    withDuration: 0.3,
    animations: { ... },
    completion: { finished in ... }
)

さて、Lintで利用者側がこうした使用方法を警告・禁止できるとしても、ライブラリの提供者側で禁止することはできないでしょうか。以下に1つのアイデアを示してみようと思います。

func fetch(id: Int, success: () -> Void, failure: (Error) -> Void, _ tcDisabler: () = ()) { ... }

考え方としては単純で、クロージャが最後の引数にならないようにしてあげるだけですね。意味のない値をデフォルト引数として設定しておくことで、利用者サイドは特に気にせずに利用できるはずです。引数名や値に考える余地はありそうですが、他にもいい手段がないか、ご意見お待ちしています。

Xcodeのブレークポイントで音を鳴らす

Xcodeブレークポイントでは音を鳴らすことができて、これは結構便利です。例えばシミュレーターの動作を目で確認する一方で、ブレークポイントを通過したかどうかは耳で確認することができます。シミュレーターの画面を見ながらコンソールのログを追うのは大変ですからね。

また "Automatically continue after evaluating actions" という実行を停止させないオプションと組み合わせるとさらによいですね。ちなみに僕は "Frog" の音が好きです。

f:id:ikesyo:20171218210226p:plain
Sound ActionとAutomatically continue after evaluating actions

これは便利なので仕事中にもたまに使うことがありますが、その時には当然Macのミュートを解除する必要があります。そうすると今度はデバッグの最中にメールやSlackの通知音がオフィスに鳴り響いたりしてちょっとやりづらい。なのでデバッグを始めようとすると、いそいそとイヤホンをMacにつなぎ出すようになっているここ最近です*1

AirPodsでも買ったらいいんでしょうか。

*1:仕事中に音楽は聞かないタイプです