5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

あのゲームっぽく飯画像を撮るアプリ、『Camp Camera』をリリースしました

Camp Camera

f:id:gigi-net:20161221232434p:plain

この度、あのゲームっぽくお飯の画像を撮るiOSアプリ『Camp Camera』を公開しました。

Camp Camera

Camp Camera

  • gigi-net.net
  • Food & Drink
  • Free

思いついてシュッと1週間ぐらいで作った。

右下にウィンドウが付くほか、ゲーム画面っぽく見えるように良い感じに写真を加工してくれるアプリです。 普段のお飯がステータスアップしそうな感じに撮影できます。

f:id:gigi-net:20161221235622j:plain

無料でダウンロードできますので、良かったら是非使ってみてください。

技術的な見所

アプリ開発自体は、仕事でいつもアプリを作っているのでシュッと作れた。 この週末で作らないとAppleの冬休みの関係で年内にリリースができないので、締めきり駆動開発みたいな感じで一気に作った。

技術的には強いて言えば、この辺が面白い気がする

Core Image

お飯の画像をゲーム画面っぽくするのに、iOSCore Imageというやつを使っている。

最初はMetalなどを使ってシェーダーを書こうと思っていたけど、シェーディング言語は、一応GLSLを触ったことはあるけど、ほぼ書いたことがなかったので学習コストがかかりそうだったのと、よくよく調べたら、デフォルトで実装されているフィルタを組み合わせればやりたいことはできそうだったので、結局はbuilt-inのフィルタだけを使ってそれっぽく実現した。

並べてみるとこんな感じで変換される。陰影が消えてゲームっぽい。

Before After
f:id:gigi-net:20160831115628j:plain f:id:gigi-net:20161222000454j:plain

ドキュメントが公開されているのだが、パラメータの調整などについて、全く資料がなくて、このアプリの開発時間の半分ぐらいはフィルタを良い感じにするためのパラメータ調整に費やされた。 iOS9から追加された、被写界深度を調整するフィルタなどを利用しているのだけど、どこにも資料がなくて厳しかった。

Core Image Filter Reference

それに加えて、このアプリを作るに当たって、わざわざCore Imageの知見を学び直したりして勉強になった。

What's New in Core Image - WWDC 2015 - Videos - Apple Developer

Developing Core Image Filters for iOS - WWDC 2014 - Videos - Apple Developer

まだまだ無限に調整の余地があるのでいい感じにしていきたい。

Core Text

ユーザーが任意のレシピ名を入力して、右下のウィンドウにそれっぽく入れるのにはCore Textを使っている。

ウィンドウは、Sketchでベクターデータとしてそれっぽく目コピーして作り直した。

f:id:gigi-net:20161221234207p:plain

アプリ内ではこのデータを保持していて、Core Textを使って動的にレシピ名を合成して描画している。

f:id:gigi-net:20161221234748p:plain

Core Text、上手くやれば影や縁取りなども簡単にできるし、頑張ればこれぐらいのリッチな表現はできる。

まとめ

Camp Camera

Camp Camera

  • gigi-net.net
  • Food & Drink
  • Free

思いついて誰かに先を越されないか気にしつつ、1週間弱でガッと作ったけど、いろいろ勉強になって良かった。 ほかにも地味にPure Swift 3で書かれていたり、fastlaneでサブミットまでできるようになってたり、中身は無駄にモダンです。

どうぞご利用ください。

冒頭の親子丼は、職場の近くにあるお店の究極の親子丼というメニューで美味しかった。

恵比寿 鶏味座

食べログ恵比寿 鶏味座

こんな感じで毎日美味しいものを食べながらデバッグできてモチベーションを維持できて良かった。

他にも取材と称して昼から3500円の鰻などを食べたりしていて、完全に気が狂っていた。美味しかったです。

f:id:gigi-net:20161221235931p:plain

XcodeのPlaygroundを簡単に管理できるツール「Toybox」を作りました

Toybox

このたび、Toyboxというコマンドラインユーティリティを作ったので紹介します。

github.com

普段、Swiftのコードを書いていて、

  • 思いついた実装を試してみたい
  • コードレビューで別の書き方を提案したときに、ちゃんと動くか動作確認したい
  • バグっぽい挙動をしてるので最小コードで確かめたい
  • もっといい書き方ができないか試行錯誤したい

なんてときによくXcodeのPlaygroundを使うと思います。

f:id:gigi-net:20160929023410g:plain

でも、Playgroundの作成は操作が煩雑だし、名前や保存場所を決めなきゃダメなのがものすごく億劫で、デスクトップにMyPlayground.playgroundみたいなファイルがたまり続けていて困っていました。

怠け者の僕は、新しく作るのすら怠いので、デスクトップに適当に落ちてる過去のPlaygroundを開いてスニペットを書いていたりして散々な運用だった。

というわけで、CLIからPlaygroundを簡単に生成、管理してくれるツールを作りました。

$ toybox create Foobar

とかやると、勝手にFoobar.playgroundが開かれて即座にスニペットが書ける。

f:id:gigi-net:20160929023436g:plain

一度作成したものは

$ toybox list
$ toybox open Foobar

などで管理できる。特定の場所に全て管理されてファイルが散らばらない。

思想はghqを参考にしている。

開発中から仕事に使ってみていたけれど、僕のような片付けのできない人間にとっては、ファイルがあちこちに散らばらなくて割と重宝している。

さらに機能とか

詳しくはREADMEを読めば書いているんだけど、便利機能もいくつか用意している。

名前すら決めるのが億劫な人向けに自動的に名前を生成してくれる機能もある。

$ toybox create # 20160929015019.playground

ただ、これを使うとあとからどのファイルかよくわからなくなるのであまりオススメできない

$ pbpaste | toybox create --input

このように、標準入力から中身を作る機能もついていて、コピペしたり、curlでgistを読み込んできたいときなどに役に立つかもしれない。

わざわざzsh/bashの保管関数も書いてみた。

どうぞご利用ください。Homebrewかインストーラーから導入できます。

github.com

作ってみて

Swift 3

iOSのツールなんだからSwiftで書かれているべきだろ!と特に考えもせず、今回は初めて全てSwift3で書いてみた。 Swift3は最高の言語で、移行するのは面倒だけど、新規に書く分には快適に書けて非常に良かった。

Swift3を使うための問題は、やはりライブラリの互換性。 しかし、メジャーなものはあらかたSwift 3化が進んでいるし、自分が使いたいやつが2のままでも3化に貢献するチャンスだと思うので、ガンガンPRを送っていくと良いと思う。

今回はオプションパーサーライブラリとして、Carthageに使用されているCommandantというライブラリを使ってる。 Toyboxを開発し始めた当初は3対応がされていなくて、forkして使っていたり、本家にも3化のPRを送って進めていたのだけど、 ほかにも親切な方が進めてくれて、結局僕のコードはマージされなかった。

とはいえ、Swift3化の際にCarthageの中の強い人にレビューしていただいて、なるほどこう書くのか〜とSwift3移行への知見が深められて良かった。 優しい世界。

Swiftでコマンドラインツールを作る

Commandantが使えてしまえば、あとは作るだけ。開発はほとんど、Carthageの構成を参考にして実装した。 Playgroundのパースやファイル操作といった部分はToyboxKitなど、新しいFrameworkを作ってそこに押し込み、 本体のバイナリはオプションをパースして、適切にFrameworkを叩くだけといった構成が良さそうだった。

全体の工程の中で、一番大変だったのが、実行可能形式にして使ってもらうようにするというところ。 Swiftには統一されたバイナリの配布方法ないのでCarthageのMakefileやHomebrew Formulaをパクってきていい感じに書き換えた。

良い方法はないので、結局Makefileをガリガリ書いて、ビルドしたバイナリとFrameworkを適切な位置に配置してあげるというインストーラーを書くしかなさそう。

感想

僕には便利だし、今後使っていきそうなプロダクトができてよかった。ほかにも刺さる人がいれば嬉しいです。

前述したようなオプションパーサーのSwift3化や配布周りでひたすらMakefileを書くみたいなYak Shavingが多すぎてSwiftでコマンドラインツールを作るのは面倒だった。 こんな感じのツールはRubyなりで書いて、Rubygemsにドーンするのに限る。

Swiftはその辺のエコシステムがまだまだ弱くて、パッケージとして配信する方法もHomebrewしかない上に、手順も正規化されていないので、かなり敷居が高い印象だった。 Swift Package Managerは現在、アプリから使うFrameworkの管理という問題に絞って開発が進められている。 将来的にはgo getのように実行可能バイナリを簡単に扱う機能も拡張していってほしい。

今後の展望

  • Alfredから使いたいからWorkflow作る
  • 作ってるときに思いついたけど、最後に作ったやつを開く便利コマンドがほしい
  • 今回、適当なPlaygroundのパーサーを書いたからこの辺を機能増やしてライブラリ化すると良いかもしれない

バースデープレゼント2016

こんにちは、giginetです。 今年の誕生日はいろいろな方からいろいろいただいたのでお礼を兼ねてまとめます(到着順)。皆様ありがとうございました。

なお、プレゼントはいつでも大歓迎です

しんでしまうとはなにごとだ

@さんありがとうございました

Hanabi

花火(HANABI) 日本語版

花火(HANABI) 日本語版

@さんありがとうございました

テイルズ・オブ・ジ・アビス オリジナル・サウンドトラック

@さんありがとうございました

カタン

カタンの開拓者たち 航海者版

カタンの開拓者たち 航海者版

@さんありがとうございました

日本酒

日本酒 死神 720ml

日本酒 死神 720ml

@さんありがとうございました

海底探検

海底探険

海底探険

@さんありがとうございました

寝ながらインターネットするやつ

@さんありがとうございました

ラストリベリオン

ラストリベリオン

ラストリベリオン

@さんありがとうございました

リラックマ

@さんありがとうございました

ダンアート

モダンアート modern art 日本語版

モダンアート modern art 日本語版

@さんありがとうございました