タグ

ブックマーク / blog.ishkawa.org (34)

  • CIでのCarthageのキャッシュの効率的な当て方

    Dec 6, 2018 Carthageによるフレームワークのビルドは時間が掛かるので、CIでは良い感じにキャッシュを当ててもらいたい。この記事の中ではそれをやってくれる平凡な設定を貼るのだけど、なぜそれが効率的なのか理解するにはCarthageとCIのキャッシュの仕組みを理解する必要があるので、まとめておく。我が社(エンジニア募集中)のCIはすべてCircleCIなのでCircleCIの話になるのだけど、たぶん他のCIサービスでも似た仕組みはありそう。 ちなみにこれは、半年ほど前に @chuganzy さんにTwitterで教えてもらったのがきっかけで調べ始めたもの。ずっとやろうと思ってたのだけど全然やってなくて、遂にやった。うっかりしている間に半年も経っていて、自分の先延ばし能力に驚かされた…。 Carthageのキャッシュ Carthage 0.20(2017年2月リリース)からCa

    CIでのCarthageのキャッシュの効率的な当て方
    invent
    invent 2018/12/06
  • MacBookを開いた時に自動的にテザリングを開始する

    Nov 9, 2018 最近お外で作業する機会が増えて、MacBookを開く度にメニューバーからテザリングを開始するのが億劫だと感じるようになった。当は単体でモバイル通信ができるMacBookがあれば良いのだけど、今のところそういうモデルはないので、自分が手動でやっていることを自動化することにした。この手順は「スリープ解除のイベントを捕まえる」と「Bluetoothのメニューバーを操作する」の2つに分解できる。少し調べてみると、前者はSleepWatcherで、後者はAppleScriptで実現できることがわかった。 SleepWatcherは今日まで全然知らなかったけど、歴史が長いらしい。ドキュメントではMac OS X 10.1についても言及されているので、2000年くらいから開発されていてるみたい。そして、macOS Majave(10.14)の今でもきちんと動く。こういうプロダク

    MacBookを開いた時に自動的にテザリングを開始する
    invent
    invent 2018/11/09
  • Storyboardとの付き合い方 2018

    Aug 12, 2018 少し前に、自分のStoryboardの使い方をツイートしたら割と反応があったので、改めてまとめてみようと思います。これまで何年かiOSアプリの開発をしてきて、Storyboardとの付き合い方は何度も変わりました。なので、今回紹介するものはあくまで2018年現在のもので、来年には変わっているかもしれません。 説明のイメージを掴みやすくするため、画面の例を用意しました。左が編集時のStoryboardで、右が実行時のiOSシミュレーターです。具体的なトピックが出た時に、この例を説明に使うことがあります。 記事の最後にこれが動作するサンプルコードも用意しましたので、興味があればどうぞ。 Storyboardを使う目的 以下の2つを重視して、Storyboardを選択しています。 動作確認に掛かる時間を短縮する 成果物の構造を把握しやすくする ただし、Storyboar

    Storyboardとの付き合い方 2018
    invent
    invent 2018/08/20
  • テストの準備の失敗をテストの失敗として扱う

    Mar 11, 2017 ユニットテストを書くときに、fixtureを読み込むなどの何らかの準備をすることがあります。そして、こういった処理もテスト対象の処理と同様に失敗する可能性があります。失敗を素直に表すならば、メソッドにthrowsをつけてエラーを投げられるようにします。 enum JSONFixture: String { struct FileNotFoundError: Error {} case foo case bar case baz func loadJSON() throws -> Any { let bundle = Bundle(for: TestBundleClass.self) guard let path = bundle.path(forResource: rawValue, ofType: "json") else { throw FileNotFoun

    テストの準備の失敗をテストの失敗として扱う
    invent
    invent 2017/06/21
  • APIKit: レスポンスに応じた独自のエラーを投げる

    { "message": "Validation Failed", "errors": [ { "resource": "Issue", "field": "title", "code": "missing_field" } ] } 今回は、このようなエラーをリクエストの呼び出し側に伝える方法を説明します。なお、この説明はDefining Request Protocol for Web Serviceのエラーの扱いをもう少し詳しく説明したものとなります。 サービス用のリクエストプロトコル APIKitでは、特定のサービス(Web API)向けのリクエストの特徴をまとめるために、サービス用のリクエストプロトコルを定義します。今回はGitHub APIを例としているので、baseURLのデフォルト値がhttps://api.github.comとなっているGitHubRequestを定義しま

    APIKit: レスポンスに応じた独自のエラーを投げる
    invent
    invent 2017/06/21
  • Vimの代わりとしてAtomを試してみた

    Aug 23, 2015 Vimに特に不満があったわけではないものの、新しいものも受け入れないとな〜と思ってセットアップしてみた。 Vim自体を辞めるつもりはないので、Atomはvim-modeで使っています。 メインの業務はXcodeかIntelliJ IDEAでやっていて、それぞれプラグインでVimのキーバインディングを割り当てています。 それ以外の以下のようなものには大体Vimを使っていました。 色んな設定ファイル Markdown Go Rust 自分が最低限使えるようにするまでにやったものを紹介します。 カーソルの履歴 AtomにはVimのノーマルモードのC-i, C-oにあたるものがなさそうだったのでt9md/atom-cursor-historyというプラグインで解決しました。 Vimっぽい動きが良かったので以下の設定を選びました。 'atom-text-editor.vim

    Vimの代わりとしてAtomを試してみた
    invent
    invent 2016/04/02
  • Circle CIでiOSアプリのリリース作業を自動化

    Jan 7, 2015 ※ 現在(2015/01/07)Circle CIのiOSビルドはベータとなっているため、利用するにはサポートへの連絡が必要です。 できること GitHubへのコミット毎に以下のタスクを実行します。 ユニットテストの実行 ipaの作成 ipaのバリデーション CrittercismにdSYMをアップロード Circle CIにテストレポートを出力 iTunes Connectにipaをアップロード これらの作業を自動化すると、masterブランチにgit pushするだけでテストが通ったアプリがiTunes Connectに登録され、 TestFlight(新)からダウンロードできるようになり、そのままApp Storeに申請することまで出来るようになります。 Circle CIのメリット 無料(1 container) 見た目がきれい private reposi

    Circle CIでiOSアプリのリリース作業を自動化
  • Carthage: Swift対応の新しいライブラリ管理

    Nov 20, 2014 iOS, OSXで利用できるライブラリ管理ツールといえばCocoaPodsが有名ですが、 それとはまた違った方針のCarthageというライブラリ管理ツールがリリースされました。 GitHubのデベロッパーを中心としたチームで開発が進められているようです。 https://github.com/Carthage/Carthage インストール方法 Releasesからpkgをダウンロードして、インストーラーを実行します。 使い方 Cartfileを書く carthage updateを実行する Carthage.buildに作成された.frameworkをXcodeに追加する Cartfileではgithub, gitの2種類のキーワードが利用でき、以下のように書きます。 サポート対象 Carthageはdynamic frameworkのみをサポートするため、C

    Carthage: Swift対応の新しいライブラリ管理
    invent
    invent 2014/11/21
    Carthage: Swift対応の新しいライブラリ管理 via @feedly
  • MantleのようなノリでJSON>NSManagedObjectを楽にしたかった

    invent
    invent 2014/08/12
  • Jenkinsのビルド完了後にGitHubのcommit statusを更新する

    Jul 2, 2014 Travis CIはリポジトリのすべてのコミットに対してビルドを実行し、そのコミットのビルドの成否をGitHubに返してくれるようになっています。 pull requestを送った時などに見られるチェックマークがそれです。 プライベートリポジトリではJenkinsを使っているので、Jenkinsでも同様の仕組みを実現してみました。 仕組みは簡単で、すべてのコミットのビルドの前後にGitHubのCommit Status APIを叩くだけです。 自分はiOSアプリのビルドタスクをRakefileにまとめているので、スクリプトを以下のように設定しました。 curl -X POST -H "Authorization: token ACCESS_TOKEN" https://api.github.com/repos/:owner/:repo/statuses/$(git

    Jenkinsのビルド完了後にGitHubのcommit statusを更新する
    invent
    invent 2014/07/02
  • NSRunLoop+PerformBlockをCocoaPodsに登録

    NSRunLoop-PerformBlockをCocoapPodsに登録しろLINE株式会社— laiso(レイソー) (@laiso) 2014, 5月 27 なぜかテスト関連のツールはマジカルな実装が多いのですが、自分は愚直にテストをしたいので愚直なライブラリを書きました。 書いたのは半年前だったのですが、需要があったのでCocoaPodsに登録しました。 ざっくり説明すると、以下のようなものです。 引数に渡したblockの実行中はNSRunLoopを回してテストケースが終了しないようする *finish = YESとするとblockから抜ける タイムアウトした場合は例外を投げてテストケースを失敗させる NSRunLoop+PerformBlock 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - (void)testPerformBl

    invent
    invent 2014/05/28
    NSRunLoop PerformBlockをCocoaPodsに登録
  • すべてのテストケースの前後にあれこれする

    iOSのアプリケーションテストを書いていると、各テストケースの前後に永続ストアやスタブサーバーなどをリセットしたくなることがあると思います。 リセットが必要なテストスイートのsetUp/tearDownに書いても良いのですが、書くのが面倒だったり書き忘れてしまうこともあるので、 すべてのテストケースについてリセットが走るようにしておいた方が心を穏やかにすることができると思います。 実現方法 すぐに思いついたのは以下のような方法です。 setUp/tearDownにリセット処理を加えたサブクラスを継承させる XCTestCaseのsetUp/tearDownをswizzleする サブクラスを継承させる方法には、KIFTestCaseなど他のライブラリのクラスには適用ができないという問題があります。 method swizzlingを利用する方法は、他のmethod swizzlingと衝突す

    invent
    invent 2014/04/30
  • 位置情報でリモコンを操作するiOSアプリをリリースしました

    Geo IR Geo IRという名前でリリースしました。例えば、以下のような用途に利用できます。 最寄り駅についたらでエアコンをつける 自宅に近づいたら照明を点灯させる 自宅から離れたら様々な電子機器の電源を落とす 特に1つ目の用途は便利で、冬には家に着く頃には部屋が暖まった状態にすることができますし、夏には冷えた状態にすることが出来ます。 利用できる位置情報 アプリを反応させるイベントには以下の2つを指定できます。 ターゲットエリア: 指定地点から半径nメートル トリガー: ターゲットエリアへの進入時または退出時 これらの情報を組み合わせて、”最寄り駅に付いた”や”自宅から離れた”といったイベントを定義します。 利用できるリモコン信号 基的にはどのようなリモコンも利用することができます。 その他必要なもの Geo IRの利用にはIRKitが必要です。IRKitAmazonで購入するこ

    位置情報でリモコンを操作するiOSアプリをリリースしました
    invent
    invent 2014/04/29
  • iOS開発とGitタグ

    いままでAppleにアプリを申請するタイミングでタグを打っていて、 その後にリジェクトされると以下のようなタグが残ることがありました。 非常にダサいですね。 1.0.0 1.0.0-2 1.0.0-3 最近は少し学習して、QAに入る段階でrelease/1.0.0といったブランチを切るようにしました。 審査に出した段階ではまだタグは打たず、もしもリジェクトされた場合は引き続きrelease/1.0.0を更新します。 審査を通過した場合はそこでタグを打って、release/1.0.0をmasterにマージします。 以下の図のようなイメージです。 このように運用することで、余計なタグが打たれることはありませんし、審査中のバージョンを見失うこともありません。 もしかしたら普通のiOSデベロッパーは当たり前のように実践していることなのかもしれませんが、 自分は最近までダサいタグを打ったり、タグを打

    iOS開発とGitタグ
    invent
    invent 2014/04/27
  • デバッグ中にJSONをサッと出力する

    NSDictionaryやNSArrayのdescriptionはそれとなく見やすいフォーマットで出力されますが、JSONで欲しくなる場合があります。 しかも、デバッグ中に欲しくなったりします。 XcodeのLLDBは~/.lldbinit-Xcodeに独自のコマンドを定義することができるので、 pretty printedなJSONを吐くコマンドを定義してカジュアルにJSONを得られるようにしてみました。 1 command regex pj 's/^(.+)$/po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:%1 options:1 error:nil] encoding:4]/' ここで定義したpjコマンドを使うと以下のようなNSDictionaryから 1 2 3 NSDiction

    invent
    invent 2014/01/09
  • xcodebuildのログをxcprettyで整える

    Xcode 5になってからxcodebuildも進化していて、Xcode 4までネックになっていたApplication Testsの実行も簡単になりました。 そういうわけで自分にとってのxctoolの必要性は薄まり、あとはログさえキレイになってくれればいいのになあと思っていたのですが、そんなときにxcprettyが登場しました。 mneorr/XCPretty xctoolとの違い xctoolはxcodebuildを置き換えることを目的としていましたが、xcprettyはxcodebuildと共存してログの整形のみを行います。 xctoolの場合、”xcodebuildでは動くけどxctoolでは動かない”という状況に遭遇することがありますが、 xcprettyはビルドやテストの実行自体にxcodebuildを利用するので、既にxcodebuildで進んでいるプロジェクトでは簡単に利用

    invent
    invent 2013/12/11
  • JSONにNSNullが入ってきたとき

    多くのiOSアプリはサーバーとの通信が必要で、やりとりされるデータのフォーマットにはJSONが採用されることが多いと思います。 iOS 5からは標準ライブラリにNSJSONSerializationが導入され、特に理由がなければJSONのエンコード/デコードにはこれを利用します。 NSJSONSerializationが扱うオブジェクトは以下の5種類のオブジェクトです。 NSString NSNumber NSArray NSDictionary NSNull そこで心配になるのが、予期しないところにNSNullが入ってきて”unrecognized selector sent to instance.“となってしまうことです。 NSNullではなくてnilが入っていてほしいと考える人は多いようですが、そもそもNSArrayやNSDictonaryはnilを含むことはできず、 そのような状

    invent
    invent 2013/11/17
  • 複数のiOSバージョンでのテストを自動的に実行する

    Xcode 5になってxcodebuildコマンドも進化したらしいのですが、あまり変更を追えていませんでした。 今日、ぼんやりとman xcodebuildを眺めていたら-destinationというオプションをみつけました。 これを使えば任意のiOSバージョンでテストを走らせられるなと思ってやってみました。 はじめはXCTestで実行したかったのですが、iPhoneSimulator6.0.sdkやiPhoneSimulator5.0.sdkには xctestという実行ファイルが含まれていないため、以下のようなコマンドでテストを実行することができませんでした。 (OS=7.0だと実行できます。) 1 xcodebuild test -scheme Example -destination "name=iPhone,OS=6.0" OCUnitを実行するounitという実行ファイルはiPh

  • iOS開発でのユニットテストを身につけるには

    テストがないコードはクソとか、このテストツールこそ至高みたいな話が世に溢れているわけですが、 そういう状況になってくると、どうやって始めたらいいのかわからなかったりすると思います。 そういう人のために、何を読んで勉強し、何を使って何を書くと始めやすいかという抽象的な解説をしようと思います。 テストフレームワークの選択 テスト初心者の最初の壁はフレームワークの選択です。 iOSのテストについて調べると、SenTestingKitはクソとかGHUnit最高とかKiwiこそ至高とか言っている人がいると思います。 ですが、入門に最も適しているのはSenTestingKitです。 セットアップが他と比べて簡単だということと、機能が十分に小さくて機能に溺れることがないということが理由です。 SenTestingKitの使い方を学ぶ いきなり突き放すようなんですが、Appleの公式のドキュメントを読むの

    invent
    invent 2013/10/28
  • GHFeedで利用しているライブラリ一覧

    先日GHFeedというGitHubのフィードを読めるiOSアプリをリリースしました。 今日はGHFeedの開発に利用したライブラリを紹介しようと思います。 NJKWebViewProgress UIWebViewの読み込み状況を取得してくれるライブラリです。 作者は@ninjinkunさんです。 このライブラリが出してくれる値は大体0.0, 0.1, 1.0なので、 GHFeedではこれらの値を補間するようなアニメーションを追加で実装しています。 KLSwitch フラットデザインなUIButtonのライブラリです。 UIAppearanceにも対応するなど、結構細かいところまで実装が行き届いていました。 TUSafariActivity UIActivityViewControllerにOpen in Safariを追加するライブラリです。 SSKeychain キーチェーンのwra

    invent
    invent 2013/08/28
    GHFeedで利用しているライブラリ一覧