書いて覚えるSwift入門

第45回 swift package manager

この記事を読むのに必要な時間:およそ 4 分

リリース版をビルド

SPMの各コマンドは,デフォルトではテスト版をビルドします。リリース版をビルドするには,-creleaseを付けます。さらに-Xswiftc -enabletestingを付けると,リリース版でテストもできます。swift-bignumの開発では,これが実際に必要になりました。任意精度有理数型BigRatと任意精度浮動小数点数型BigFloatを提供するモジュールですが,エッジケースが多いのでテストケースが1万5,000を超え,その結果普通にswift testすると筆者の環境で200秒以上かかります図2)⁠

図2 swift testの実行に200秒かかる

% swift test
(……省略……)
Test Suite 'RationalTests' passed at 2018-12-17 12:17:46.703.
   Executed 10 tests, with 0 failures (0 unexpected) in 0.055 (0.055) seconds
Test Suite 'BigNumPackageTests.xctest' passed at 2018-12-17 12:17:46.703.
   Executed 22 tests, with 0 failures (0 unexpected) in 231.611 (231.612) seconds
Test Suite 'All tests' passed at 2018-12-17 12:17:46.703.
   Executed 22 tests, with 0 failures (0 unexpected) in 231.611 (231.612) seconds

Travis CIではもっとかかるので,-c release-Xswiftc -enable-testingを指定するようにしたところ10秒で完了するようになりました図3)⁠

図3 Travis CIでテストを実行した場合

% swift test -c release -Xswiftc -enable-testing
(……省略……)
Test Suite 'RationalTests' passed at 2018-12-17 12:11:59.578.
   Executed 10 tests, with 0 failures (0 unexpected) in 0.009 (0.009) seconds
Test Suite 'BigNumPackageTests.xctest' passed at 2018-12-17 12:11:59.578.
   Executed 22 tests, with 0 failures (0 unexpected) in 10.176 (10.178) seconds
Test Suite 'All tests' passed at 2018-12-17 12:11:59.578.
   Executed 22 tests, with 0 failures (0 unexpected) in 10.176 (10.178) seconds

未サポートのiOSでもSPMしたい

SPMはCPANやRuby Gemsといったほかの言語のパッケージマネージャーにおける開発に慣れた人には非常にとっつきやすいツールですが,Swiftという言語の性格上,1つ重大な問題があります。現時点ではiOSにまったく対応していないのです。前述のswift-complexはもともとほかのモジュールに依存しなかったのですが,swift-floatingpointmathを分離した途端に「オレのiOSどうしてくれるんだ!」という文句が押し寄せました。筆者がとった苦肉の策は,依存ファイルを全部まとめたファイルを自動生成するというもので,scripts/makemono.plというPerlスクリプトでそれを実現していますリスト1)⁠

リスト1 scripts/makemono.pl

#!/usr/bin/env perl
use strict;
use warnings;
use feature ':all';
use FileHandle;
use Fatal;

my $dep = 'FloatingPointMath';
my $target = 'monoComplex.swift';

sub find {
    my $name = shift;
    use File::Find ();
    my @dirs = ('.build/checkouts');
    my @paths;
    File::Find::find(
        {
            wanted => sub {
                $_ eq $name and push @paths, $File::Find::name;
            }
        },
        @dirs
    );
    die "$name not found" if !@paths;
    return @paths;
}
system qw/swift build/;
my $wfh = FileHandle->new($target, 'w');
for my $fn ( <Sources/Complex/*.swift>, find( $dep . '.swift' ) ) {
    my $rfh = FileHandle->new($fn, 'r');
    for (<$rfh>) {
        next if /\Aimport $dep/;
        $wfh->print($_);
    }
}

swift-complex程度の小さなモジュールであればまだいいのですが,これがswift-bignumのような大きくかつ最適化を施さないと実用的な速度が出ないものだと,この手法には無理があります。SPM自体がiOSをサポートしてくれることを首を長くして待っています。

モバイルコンピューティングにモバイルプログラミングを

iOSにネイティブ開発環境がない辛さ。今まで「あればうれしい」だったのが「ないと辛い」になったと一段と強く実感するようになったのが,位置ゲーの隆盛。Ingressで芽吹き,Pokémon GOで花開いた位置ゲーは街角の様相を一変させました。何もなさそうなところに人だかりができても「ああポケモンのジムがあるよね」とお巡りさんも納得する現在,フィールドテストでフィールドデバッグができないもどかしさはどれほどのものか。

その位置ゲーも,テクテクテクテクでNiantic社の寡占状態がいよいよ崩れようとしています図4,図5)⁠ポケストップやジムといった点から点への移動が街区という面を塗りつぶすという同ゲームのメインテーマは画期的で,移動軌跡を後で塗る「予約塗り」と,塗り終わった街区に隣接していればTTPというコストを支払うことでそこにいなくても塗れる「となり塗り」という機能を用意したのは実に見事です。後発だけあってPokémon GOの痒いところがかなり解消されているのですが,それでも実際にフィールドテストすればすぐわかる問題が残っていたのが実に印象的でした。

図4 注目の位置ゲー「テクテクテクテク」マップ表示

図4 注目の位置ゲー「テクテクテクテク」マップ表示

図5 注目の位置ゲー「テクテクテクテク」キャラのステータス表示

図5 注目の位置ゲー「テクテクテクテク」キャラのステータス表示

「街区が広過ぎて,お邪魔モンスターが見つけられない」⁠⁠街区が小さ過ぎて,99%から進まない」⁠これは実際に行けばたちどころにわかるけど室内ではなかなか実感できないことの典型で,現状ではその場でできるのは報告だけで,ちょっとした手直しも難しい。すべてのロジックをサーバ側に持たせてSSHでログインして修正を加えるのは理論的にはできますが現実離れも甚だしい。アプリ全体のリビルドはさておき,その場でパラメータを調整するぐらいのことはできてほしい。iOSアプリをクロスコンパイルしていたのはMacよりも非力だからという技術的な課題はとうの昔に解決しています。位置ゲーに限らず「現場で直したい」課題は増えることはあっても減ることはありません。船上で直せるものは直せるようにしませんか,クック船長?

次回予告

話を戻して,swift-floatingmathではDoubleFloatを直接extendするのではなく,Float ingPointMathというプロトコルを用意したうえでそれらの型を準拠させるようにしています。なぜそうしたのか?――次回はモジュールとプロトコルの関係について解説します。

Software Design

本誌最新号をチェック!
Software Design 2019年6月号

2019年5月17日発売
B5判/176ページ
定価(本体1,220円+税)

  • 第1特集
    仕事に役立つ実例で使いどころがわかる
    思わず実践したくなるシェル&シェルスクリプト
  • 第2特集
    IT業界ビギナーのためのDocker+k8s入門講座[Docker編]
    図解で深く理解して最先端にキャッチアップ!
  • 特別企画
    クラウドへのルータ接続実践ノウハウ
    【1】AWSとオンプレミスをつなごう
  • 一般記事
    「WebAuthn」が導く新時代のパスワードレス認証
    【前編】FIDOとWebAuthnが変えるもの
  • 一般記事
    チームを成長させるコードレビューの秘訣
    漠然と読んであいまいにコメントするのはもうやめよう
  • 短期連載
    Mattermost[導入+構築]入門
    【3】ご存じですか? chat導入のメリット

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。