5.1さらうどん

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

2016年にやったことを振り返ってみた

振り返る

なんか流行ってるっぽいので今年の活動をまとめた

出したアプリ

ふっかつのじゅもん(3月)

〜ふっかつのじゅもん〜

〜ふっかつのじゅもん〜

  • gigi-net.net
  • ゲーム
  • 無料

今年のGGJ(48時間でゲームを作るイベント)で作ったアプリを手直ししてほぼそのまま出した。 プレイ時間は2~3分で終わるけど、そこそこの完成度だし、自己紹介代わりに人に見せたり、アイスブレイキングに最適な作品になった気がする。

48時間2人で作れるゲームとしてはボリューム、完成度共に事実上限界に近い気がするので、来年以降のGGJのあり方を考えていかなければならない

あの日々を思い出す脱出ゲーム『ふっかつのじゅもん』をリリースしました - Kawaz広報ブログ

Camp Camera(12月)

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

Camp Camera

Camp Camera

  • gigi-net.net
  • フード/ドリンク
  • 無料

この前出したやつ。FF15っぽい飯画像が撮影できる。 年末駆動で思いついて1週間ぐらいでガッと作ってみた。ちゃんと使えてるし満足。

地味にゲーム以外のアプリを個人でリリースしたのは初めて。

VOXQUEST(11月)

https://itunes.apple.com/jp/app/voxquest-okusukuesuto/id517568666?mt=8&uo=4&at=10l8JW&ct=hatenablog

2012年ぐらいにリリースしたゲームが、iOS10で動かなくなっていたので、この機会に基幹部分をドラスティックに作り直した。 昔作って思い入れの強いゲームは今後遊べなくなると辛いので、継続的にメンテしていきたい。

続編のVOXCHRONICLEなどは未だに32bitで開発していて、そろそろヤバいと思うので保守管理に着手していきたい。

OSS

今年は仕事が開発基盤系の仕事に移った関係もあり、OSSを作ろうという気概が高まり、ちゃんと使える形にした物は過去最高レベルで多かった。

未完成でボツになった奴も多いけれど、ちゃんと使える状態まで作ったぞ!というのをまとめてみた。

作ったやつ 概要 時期 言語
0 giginet/CCBlowingDitector cocos2d-x for iOSでマイクからの息を検知するやつ 1月 C++
11 giginet/JSONMatcher SwiftでJSONのテストケース書くやつ 5月 Swift
5 giginet/NibLoaderKit UIKitのカスタムビューを簡単に読み込むやつ 7月 Swift
1 giginet/alfred-irkit-workflow AlfredからIRKitで部屋のリモコン弄るやつ 7月 Python
15 giginet/CustomKeyboardTextField UIKitでピッカー付きのテキストフィールドを簡単に作る奴 8月 Swift
3 giginet/beddit-python Beddit Sleep TrackerというIoTのAPI叩くやつ 8月 Python
2 giginet/django-slack-invitation Djangoでユーザー登録時にSlackチームに招待するやつ 8月 Python
11 cookpad/Phakchi iOSアプリのCDC Testingするやつ 9月 Swift
47 giginet/Toybox CLIからXcode Playgroundの管理するやつ 9月 Swift
72 giginet/xcprofiler Xcodeプロジェクトのビルド時間を計測するやつ 12月 Ruby

OSSだから当たり前だけどちゃんと他人が使えるような形で出すこと、未完成でもお蔵入りになるよりは拘らずに出すことを強く意識した。

大体ほとんどのプロジェクトは思いつきではじめられて、土日でガッと作ってリリースみたいなのが多くて長続きしない。 スターの最高は数日前に出したxcprofilerの72個で、ありがたいことにGitHubのTrending1位にも入れた。

反面、ひそかに今年の抱負に★100個を掲げていたので、そこまでは到達せずに残念である。 とはいえ、まあ今までちゃんと出してこなかったので、質・量的にわりと良いのではと言う感じ。

あと、多くのモノはちゃんと実用しているものが多くて良かったと思う。 プロダクトに組み込むとか、業務で利用していくようにしないと、一度作ったモノを継続的に保守管理していくのは難しいと認識した。

Contribution

今年github.comで出したPRは84件だった。とはいえ、自分のモノに出したり、個人プロジェクトに出したりも多いので、純粋なパッチ自体はそこまで多くなさそうだし、ちょっと寂しい。まだまだ増やせると思う。

今年よくPRを出したのはfastlaneで、5件ほど出していた。 今年の抱負に掲げていたけど、達成できなかったので、来年はSwiftとかPythonとか言語自体にcontributionしたい。

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

育てた草

ブログ記事

何か作るごとに書いていた。ありがたいことにコンスタントにブクマをいただけている。

記事
SwiftでJSONのテストを良い感じにするJSONMatcher作った - 5.1さらうどん
XIBを読み込んで良い感じにViewを生成できるライブラリ作った - 5.1さらうどん
UITextFieldに簡単にカスタムキーボード貼るライブラリ作った+iOS UIライブラリのCI改善の話 - 5.1さらうどん
PyCon 2016でPythonのライブラリ開発についてトークします - 5.1さらうどん
PyConJP 2016で『はじめて作るDjangoプラグイン』というトークをしました #pyconjp - 5.1さらうどん
バースデープレゼント2016 - 5.1さらうどん
XcodeのPlaygroundを簡単に管理できるツール「Toybox」を作りました - 5.1さらうどん
あのゲームっぽく飯画像を撮るアプリ、『Camp Camera』をリリースしました - 5.1さらうどん
Swiftプロジェクトのビルド時間を計測・改善するxcprofilerを作った話 - クックパッド開発者ブログ
iOSアプリの継続的デリバリーへの取り組みについての勉強会を開催しました - クックパッド開発者ブログ

意外と爆発的に流行った記事はなかった。来年はゲームの記事とか書きたい。

発表

今年デカかったのはPyConで発表したこと。 懇親会などで聞いた話によると、結構対抗が少ない分野で運が良かった気がする。

準備がひたすら大変だった記憶しか無い。

あとは体調が悪くて、今年の大半は引きこもっていて何もしていない。秋ぐらいからちょっとマシになってきたので出歩くようになってきた。 iOS/Swiftのデカいカンファレンスで話せていないので、来年は何か話したい。特に海外カンファレンスは行ってみたい。

あと、発表ではないのだが、ご縁でPodcastに出たりとかした。自分の声が嫌いなのであまり表に出たくない。

遊んだゲーム

Kawaz - 今年遊んだゲームを振り返ってみる2016【Kawaz Advent Calendar 12/19】

55本ほど買ってた。新作は20本ほど。印象に残ったのはクラロワ、P5、Undertale辺り

続けていたこと

Coursera Machine learning

流行には乗っておこうと思って、CourseraのMachine Learnngコース修了した。 なんだかんだで11週無事にやり遂げた。

まだ何にも実装できていないが、基礎的な所は学べたので、「マシンラーニングでドーン」みたいな雑な発言をしなくて済むようになった。オススメ。

来年はアイディアはあるのでChainerとか使って何か雑に画像判定とか作ってみたい。

日記

5月中旬ぐらいから1日も欠かさず毎日書いていた。わりと続いたと思う。

すぐに記憶が揮発するので、読んだ本の感想とか、作業記録とか、飲み会で話したこととか書いておくと良い。

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

DMM英会話

2ヶ月ぐらいは毎日やってたけどその後飽きて続かなかった。

読んだ本

何冊読んだか数えてないけど2~30冊ぐらい読んだ気がする。書評はパブリックにはしてないけど、日記とかには書くようにしてた。

印象に残ったやつ

[asin:B00UY3K04O:detail]

[asin:4478062579:detail]

[asin:4862761828:detail]

[asin:B00UAAK07S:detail]

あと、身体ぶっ壊してたので、とにかく辛くて、睡眠とか、マインドフルネスとか、哲学とか、普段絶対読まないような怪しげな書物に傾倒していたのが印象深かった。

まとめ

今年はとにかく体調をぶっ壊してアカンかった。 今振り返れば、1月からひたすら具合悪いと言ってる記憶しか無かった。 特に夏ぐらいが最悪で、いきなり過呼吸で病院に運ばれたり、仕事以外に外に出歩けないようになっていた。 具合悪すぎて、MRIとか大腸内視鏡とか突っ込んだけど特に病変はなくて良かった。結局原因はよくわからなかった。 それが原因で、引きこもって1人で風呂に入りながら本読んでたりとか、出歩かずにコード書いていたりしていて、対外的な活動があんまりできなかった。

11月中旬ぐらいになってようやっと調子がよくなってきて、普段の生活を取り戻せたけど、今年はとにかくそれが辛かった。 とにかく来年は辛い思いをすることなく健康に生きたい。

皆様身体には本当に気をつけて欲しい。

今振り返ってみると、勢いだけでガッと進める短期プロジェクトが多いので、来年は趣味のゲーム開発とかを含めて、半年ぐらい長期で続けられることをしていきたい。 特にゲームはもうちょっと出したい。

今年もお世話になりました。来年もよろしくお願いします。

あのゲームっぽく飯画像を撮るアプリ、『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でサブミットまでできるようになってたり、中身は無駄にモダンです。

どうぞご利用ください。

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

[tabelog:407265:detail]

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

他にも取材と称して昼から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のパーサーを書いたからこの辺を機能増やしてライブラリ化すると良いかもしれない