タグ

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

  • ソフトウェアエンジニアを募集しています

    Jun 3, 2019 タベリーという、料理と買い物の負担を肩代わりするモバイルアプリをつくっています。最近、オンライン注文機能をリリースして、いよいよ買い物の領域にも腰を入れ始めました。また、会社の資金調達も同時に発表しており、このタイミングで仲間になってくれるソフトウェアエンジニアも募集しています。 https://10x.co.jp/news/2019-05-14.html 会社が取り組んでいる課題や市場、文化については下記のスライドにまとまっています。 どんな人を求めているか 一言で言えば、チームの可能性を広げられる人を求めています。いまは7名の小規模チームでなんとか市場にエントリーできる場所に漕ぎ着けました。しかし、あるべき体験に到達するためには、解決しなければならない問題がたくさんあります。チームに新しいメンバーを迎えることで、これまでのチームでは出来なかったことを出来るよう

    ソフトウェアエンジニアを募集しています
    koogawa
    koogawa 2019/06/03
  • CIでのCarthageのキャッシュの効率的な当て方

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

    CIでのCarthageのキャッシュの効率的な当て方
    koogawa
    koogawa 2018/12/06
  • Optionalを考慮したXCTestのassertion

    Mar 2, 2015 XCTAssertを利用しているとforced unwarpしたい場面が出てくる。例えば、

    Optionalを考慮したXCTestのassertion
    koogawa
    koogawa 2018/09/15
    わかりみ
  • iOSDCでUICollectionViewの実装アプローチを変えたら何が起きるのかという話をします

    koogawa
    koogawa 2018/08/20
    めも:2018/08/31 15:10〜 Track A
  • Storyboardとの付き合い方 2018

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

    Storyboardとの付き合い方 2018
    koogawa
    koogawa 2018/08/13
    “編集時と実行時の表示を一致させる” これ、諦めてしまうことが多いんだけど、「仕方がない」で受け入れてしまうと確かにStoryboardを使う意味が薄れてしまうんだよね
  • iOSのCI環境をCircleCIに移行した

    Feb 8, 2018 移行前はBitriseの$50のプランでiOSのCIをしていました。最近はサーバーやAndroidの開発もやっているのですが、そちらのCIには元々CircleCIを使っていて、workflowの使いやすさやページの軽快さが気に入っていました。 CircleCImacOSマシンは$39から始められるのですが、一定時間以上使うとそこから従量課金制になります。CircleCI上でのビルドにどのくらい時間が掛かるか完全には読めなかったので、実際に移行してみて費用が安くなるのか高くなるのか不確定だったというわけです。そういう状況だと、わざわざ確認のために新しい環境でCIをセットアップするのも億劫に感じてしまい、なかなか手をつけられずにいました。 ところがある日、サーバーのリソースを見直した結果、月に$250ほど節約できることがわかりました。なぜかその時に背中を押されて、iO

    iOSのCI環境をCircleCIに移行した
    koogawa
    koogawa 2018/02/09
  • モバイルアプリでgRPCを使う

    Feb 7, 2018 最近は、モバイルアプリとサーバーの通信にgRPCを使っています。gRPCは、サーバー同士の通信では徐々に使われ始めている印象がありますが、モバイルアプリでの使用例はまだ少ないと思うので、動機とか、感想とか、ウチはこうしてるというものを共有します。 リクエストとレスポンスの定義を1箇所にまとめる 今のプロジェクトでは、同じデータをサーバー, iOS, Android, Webで扱う予定がありました。普通のREST APIでは同じデータを4つの言語に翻訳する必要がありましたが、これをprotoへの翻訳の1回だけで済ませたいというのが、gRPCを使う最初の動機でした。 gRPCでは、リクエストとレスポンスの全ての情報をprotoファイル上で表現し、それを元に各言語のコードを自動生成します。APIドキュメントを人間が各言語に翻訳する場合と比べると、コードを書く手間が省けます

    モバイルアプリでgRPCを使う
    koogawa
    koogawa 2018/02/08
    採用事例が増えてきてる感
  • 株式会社10Xを始めました

    Jan 1, 2018 去年の7月に、メルカリで同僚だった矢さん(@yamotty3)と株式会社10Xを始めました。矢さんが代表で、自分は開発全般を見ています。会社やプロダクトのストーリーは矢さんのポエムに任せることにして、自分はエンジニアとして会社を立ち上げた雑感を書きます。 仕事を選ぶ理由は人それぞれですが、同じ人でも時期によって何を重視するかは違ってくると思います。新卒時に重視していたことは「開発ができるようになれること」でしたが、今の自分は少し変わって以下の3つを重視しているようです。 人が抱えている問題を解決すること 技術の幅を広げること チームとして機能すること いざ書いてみると月並みという感じですが、、。会社を始めるということをあまり想定していなかったタイプなのですが、それでも踏み切れた理由は、この3つがきちんと満たせそうだと思えたからではないかと思います。 以下、それ

    株式会社10Xを始めました
    koogawa
    koogawa 2018/01/01
    “iOS開発に専念するのではなく、必要に応じて幅広い技術扱うべき” ここはすごく共感
  • iOSDCで「コード生成による静的なDependency Injection」について話した & 口頭原稿を公開

    Sep 18, 2017 このところかなり忙しく、iOSDCでちゃんとしたことを話せるのか不安でしたが、なんとか無事に終わりました。あまり会場を盛り上げることができず、後半はしどろもどろで死にたくなりましたが、面白かったと言ってくれた方もそれなりにいたので少し安心しました。 DIは今回の話以外にも色々なことに挑戦していて、最初はデフォルト引数を使った手動のinitializer injectionから始めて、SwinjectやCleanseなどのライブラリを試してみたり、Cake Patternを模倣してみたりしていました。それらを通じて、自分が求めるDIのプラクティスは 依存の宣言とインスタンスの取得のためのコードが単純かつ十分に少ない コンパイル時に依存関係の解決が検証される というものだとわかりました。もしも「dependencyの宣言さえしておけば、あとはコンパイルエラーを直してい

    iOSDCで「コード生成による静的なDependency Injection」について話した & 口頭原稿を公開
    koogawa
    koogawa 2017/09/19
  • テストの準備の失敗をテストの失敗として扱う

    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

    テストの準備の失敗をテストの失敗として扱う
    koogawa
    koogawa 2017/03/11
  • iOSDCでRxSwiftを紹介してきた + ReactiveCocoaの補足

    Aug 23, 2016 オタクなのでRxSwiftの話になるとつい早口にアレコレ喋りまくってしまうのですが、今回はそういった気持ちをそっと胸にしまって、RxSwiftを導入するとアプリ開発にどういう変化が起こるのか、なるべく多くの方に伝わるように心がけて話しました。 スライド: http://blog.ishkawa.org/talks/2016-08-20-iosdc/ ビデオ: https://abemafresh.tv/tech-conference/32381 (1:00:00~) 3行で書くと以下の通りです。 RxSwiftはイベントストリームをObservableで抽象化するライブラリ 大抵のイベント処理はObservableからObserverへの接続で実装できる イベントストリームの依存関係はオペレーターから読み取れる その他、以下の3つについても話そうと思っていましたが

    iOSDCでRxSwiftを紹介してきた + ReactiveCocoaの補足
    koogawa
    koogawa 2016/08/24
    いきなり RxSwift から入った勢なので、"補足"が勉強になる
  • Himotokiのdecodeが上手く書けなかったときの対処法

    public struct Event: Decodable { public let id: String public let createdAt: NSDate public let payload: Payload public static func decode(e: Extractor) throws -> Event { guard let typeObject = e.rawValue["type"] else { throw DecodeError.MissingKeyPath("type") } guard let typeString = typeObject as? String else { throw DecodeError.TypeMismatch(expected: "String", actual: "\(typeObject)", keyPath: "

    Himotokiのdecodeが上手く書けなかったときの対処法
    koogawa
    koogawa 2016/05/28
  • 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: レスポンスに応じた独自のエラーを投げる
    koogawa
    koogawa 2016/05/25
    interceptObject便利だ
  • 頑張ってOCLintを使ってみた結果

    koogawa
    koogawa 2016/05/19
  • TestSchedulerとSessionAdapterTypeを使った仮想時間上のテスト

    May 7, 2016 TestScheduler RxSwiftにはVirtualTimeSchedulerというSchedulerがあって、仮想的な時間でイベントストリームを扱えます。仮想的な時間というとなんだか難しそうですが、要は時間を自分で操作できるSchedulerということです。 RxSwiftのテストライブラリのRxTestsには、TestSchedulerというSchedulerも用意されています。これはVirtualTimeSchedulerにテスト向けの機能をつけたもので、イベントを記録できたりします。記録したイベントはXCTAssertEqual(_:_:)で検証できるので、どの時刻にどの値が来くるかテストできるというわけです。 func test() { let scheduler = TestScheduler(initialClock: 0) let obser

    TestSchedulerとSessionAdapterTypeを使った仮想時間上のテスト
    koogawa
    koogawa 2016/05/09
  • Rxで1つ前の値を取得する

    Apr 19, 2016 Twitter for iOSには選択中のタブをもう1度タップしたら最上部までスクロールするという機能があります。便利ですね。 こういう機能を実装するには、1つ前に選択されていた値が何なのか知る必要があります。 桶の時代にはプロパティに前回の値を保存するのが定石でしたが、川の時代にはskip(1)してzip()するというのが定石です(たぶん)。 let tappedIndex: Observable<Int> = ... Observable .zip(tappedIndex, tappedIndex.skip(1)) { previousIndex, currentIndex in return previousIndex == currentIndex } .filter { $0 } .subscribeNext { _ in // 最上部までスクロール }

    Rxで1つ前の値を取得する
    koogawa
    koogawa 2016/04/21
    φ(..)メモメモ。ちなみに選択中のタブをもう1度タップしたら最上部までスクロールのはiOS標準の動きだと思っていた
  • try! Swiftにスピーカーとして参加しました

    Mar 12, 2016 良いセッションはたくさんあったのですが、書き切れませんね。 平常心で型を消し去る (Gwendolyn Weston) Associated Typeを持つプロトコルは型制約でしか使えないため、型パラメーターが利用側に波及しがちになるという問題があります。セッションでは型パラメーター地獄について話していなかったと思いますが、紹介されていたAnyPokemonのようなパターンは(表面上の)型を消すことでこの問題を解決できそうだなあと思いました。また、このパターンはRxSwiftでもAnyObserverで使われています。 完全に余談ですが、Gwendolyn Westonさんはスピーカーディナー後のカラオケパーティでモーニング娘のLOVEマシーンを歌っていて、めっちゃ上手かったです。 Swiftのエラー処理についての三つの話 (Yuta Koshizawa) Swi

    try! Swiftにスピーカーとして参加しました
    koogawa
    koogawa 2016/04/18
  • 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アプリのリリース作業を自動化
    koogawa
    koogawa 2016/01/30
  • 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対応の新しいライブラリ管理
    koogawa
    koogawa 2016/01/24
  • 2015年

    Dec 31, 2015 2015年にあったことのまとめ。 APIKit 2月に開発を始めて、もう少しで500 starsとなりそう。はじまりは標準ライブラリを読んでいたときで、SequenceTypeなどのプロトコルがtypealias(associated type)を持つという設計にえらく感心して、それをWeb APIに持ち込んだのがAPIKitだった。0.0.1では以下の2つのプロトコルしか提供していなくて潔い。 public protocol Request { typealias Response: Any var URLRequest: NSURLRequest { get } func responseFromObject(object: AnyObject) -> Response? } public protocol API { class func sendReque

    2015年
    koogawa
    koogawa 2016/01/01
    “クライアントサイドしかできない人の意見は判断が難しいことがある”