5.1さらうどん

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

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です。 今年の誕生日はいろいろな方からいろいろいただいたのでお礼を兼ねてまとめます(到着順)。皆様ありがとうございました。

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

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

[asin:4757550456:detail]

[twitter:@chezou]さんありがとうございました

Hanabi

[asin:B01BTSQH6C:detail]

[twitter:@sakuriver]さんありがとうございました

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

[twitter:@tunacook]さんありがとうございました

カタン

[twitter:@cnosuke]さんありがとうございました

日本酒

[asin:B00B7GH5CW:detail]

[twitter:@pwdtnx]さんありがとうございました

海底探検

[asin:B00PU5C5IA:detail]

[twitter:@morishin127]さんありがとうございました

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

[asin:B00C0LT0LW:detail]

[twitter:@AttaQjp]さんありがとうございました

ラストリベリオン

[asin:B002MZYEQM:detail]

[twitter:@lyrica09]さんありがとうございました

リラックマ

[asin:B015VYNB8W:detail]

[twitter:@dotdister]さんありがとうございました

モダンアート

[asin:B00O9N37EK:detail]

[twitter:@taihaku0415]さんありがとうございました

PyConJP 2016で『はじめて作るDjangoプラグイン』というトークをしました #pyconjp

こんにちは。@giginetです。 このたび、9/21, 9/22に開催されたPyCon JP 2016において、『はじめて作るDjangoプラグイン』という発表をさせていただきました。

詳細は以下。

giginet.hateblo.jp

内容としては、上記の記事で紹介しているようなプラグインの開発・保守管理の経験を生かして、 Pythonライブラリのテストやドキュメンテーション、デプロイなどの開発手法をお話ししました。

スライドは以下です。

なんと、録画も配信されています。

ご興味のある方は是非。僕は恥ずかしいので見直していません。

以下、お気持ちなので読まなくて大丈夫です。

発表してみて

とにかく、準備が大変だったの一言に尽きます。

CFPが採択されたのは6月中旬で、丸3ヶ月以上時間があったのですが、 あれこれ構成を考えていたり、下調べをしていたり、既存のライブラリに手を加えていたりで、めちゃくちゃ時間を使いました。

45分の発表時間分のスライドを作るのはもちろん大変だし、発表練習も何度かしたので非常に大変でした。

直前までできていないと焦るタイプなので、10日前には全てスライドと台本はできあがっていたんですが、当日まで落ち着かなくて非常に疲れたので、終わった後のやりきった感は格別でしたね。

一つ言えることは、あんまり根を詰めて準備すると疲れてしまうので、「俺の発表が酷くてもCFPを通した運営が悪いのであって俺は悪くない!!!」ぐらいの気持ちで準備すると心が軽くなってよかったです。もちろん、手を抜いたつもりはありませんが。

個人的には話したいことはすべて話せたし、練習しただけあって、発表自体は全力でできたんじゃないかと思います。

とはいえ、反省の多く残る発表になりました。

まず、テーマ設定というか、タイトルがニッチだったので、お客さんを選んでしまったこと、浅く広く話しすぎてあんまり実装に踏み込めなかったことなどは気にかかっています。

あと、僕は仕事でPythonを使ってるわけでもないし、モバイルアプリやってたり、なぜかゲームの本を書いていたりして、ちょっといろいろやりすぎていて、やはり専門的にやってる人との知識量とか経験の差みたいなのをまざまざと感じたので、もうちょっと一つのことを集中して突き詰めた方がよいなと思いました。

と反省点は多かったんですが「知人が絶賛してた」、「網羅的にまとまっていてよかった」、などの声も聞こえたし、発表してよかったと思います。

PyCon 2016について

今年のPyConは5トラックもあって、扱われているテーマやレベルなどが広く、誰もが楽しめるカンファレンスだったんじゃないかと思います。 やはりPythonの言語の特性上、研究者が多いので、懇親会などでも物理学や、天文学、気象学とか、いろいろな学問の人が集まっていて面白かったです。

去年はPandasやJupyter Notebookといった、データ分析系の分野の勢いを感じたのですが、今年はやはりディープラーニング界隈が盛り上がってましたね。 最近趣味でディープラーニングの勉強を始めていたおかげで、理解が捗ってよかったです。(近々それについての記事も書きたい)

TensorFlowとかもそのうち触ってみたいけど、技術的な興味はあっても、解決したい問題に対するモチベーションがあんまりないというのが悩みです。

反面、同時に5トラックもあって、見たかったのに見れなかったトークがたくさんあったのが残念なところ。 幸い、全て動画が公開されているようなので、そのうち見返したいと思います。

PyConはいいぞ

過去4年出ているのですが、今年は規模も最高だったし、会場も広かったし、基調講演も豪華だったし、Pythonの勢いを感じました。モチベーションも上がった。 運営の皆さん、ありがとうございました。

特に今年はスピーカー懇親会にも参加したのですが、スピーカー懇親会はやはりハイレベルで、いろいろなOSSのコミッターがゴロゴロいるみたいな感じで割と場違い感を感じていました。 スピーカーになると、人見知りでも他の人と話しやすいので、準備は大変だけど、軽い気持ちでCFPを出してみるとよいと思います。

現場からは以上です。