みんからきりまで

きりみんです。

夏コミ(C96)4日目にサークル参加して漫画や技術書典の既刊などを配布します

8/12(月)に開催される夏コミ4日目、スペース南キ05-aにてサークル「きりみんちゃんねる」としてVTuberきりみんちゃんの創作漫画や技術書典の既刊などを配布します。

詳細はこちらのページをご覧ください。

www.pixiv.net

夏コミでも技術書典と同様にpixiv PAYによる前払い取り置きを行います。
また、BOOTHにて電子版を販売中で累計1000部以上売れている「フリーランスを完全に理解出来る本」の紙版をイベント特別価格(という名の在庫整理)で半額の500円にて配布します。
コミケ4日目はTechBoosterなど技術本系のジャンルも配置されてる日なので、遊びにきてくれるとうれしいです。

https://fanbox.pixiv.net/images/post/485544/w/1200/2Y46ndKbeEXbITz9FMFNHT2K.jpeg

こんな漫画を(きりみんちゃんと一緒に)描きました。
ほのぼの日常姉妹百合エンジニアネタです。

https://fanbox.pixiv.net/images/post/485544/w/1200/tb1Ltltguyw5lua5M3FgkLlM.jpeg

https://fanbox.pixiv.net/images/post/485544/w/1200/fx6Qfg3jgoz4EzTiGsc7DqHb.jpeg

https://fanbox.pixiv.net/images/post/485544/w/1200/cve60uKp1o2qnTNX1VG0GgNp.jpeg

「エンジニアのためのマネジメントキャリアパス」は情熱プログラマーの次くらいに全エンジニアにオススメしたい仕事に関する本だった

少し前に話題になっていた「エンジニアのためのマネジメントキャリアパス」を読みました。

エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド

エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド

タイトルからは完全にEMやCTOなどを視野に入れ始めた中堅のつよつよエンジニア向けの本という印象を受けますが、実際には特にマネージャーになる予定がない若手エンジニアや学生、IT業界で働くエンジニア以外の職種の人にもオススメしたい汎用的な組織や仕事に関する知見が書かれた本でした。

たしかにこの本はエンジニア組織のマネージャー職について書かれた本であり、一番の想定読者はマネージャーになった(なる予定がある)エンジニアだと思うのですが、マネージャーや管理職という立場はどんな組織にも必ず存在し、かつ直接的にそういう肩書をもっていなくても誰もが時には役割を担う可能性のある業務なので、結果的にこの本を読むことで組織というものやそこで働く様々な立場の人達の考え方や事情が理解出来るようになっている。

また、この本では章ごとに段々と大きなスコープの話になっており、最初は「マネージメントを受ける側の心構え」といった内容があり、次に「メンターとして後輩と接する」といった、いわゆる管理職以外でのソフトスキルについても詳しく書かれている。

更に面白いと思ったのは、マネージャーオブマネージャーやVPO、CTOなど平のエンジニアにはあまり想像しにくい立場の人達がどんな課題や苦労に直面し、どういう行動を取るのが望ましいかということが書かれており、「よい上司とはどんな人物か」「組織の偉い人達はどんな事情を抱えているのか」といったことが想像できるようになる。

そういう意味で、むしろ学生や新卒の人こそこの本を読むことで会社組織というものがどういうものなのかという事が理解できるようになり、組織を意識した働き方や職場の良し悪しの判断がしやすくなるのではと感じた。

とにかくとてもオススメの本だとおもいました。
自分も定期的に再読したい。

pixiv App Nightで「アプリエンジニアでも神絵師になりたい!」というLTをしてきました

pixiv App Nightというイベントでお絵かきエンジニア枠という募集があって面白そうだったので、久しぶりにLTをしてきました。

pixiv.connpass.com

発表資料は以下になります。

speakerdeck.com

内容は以前このブログに描いたイラストの話と被ってる部分もありますが、2019年versionとして改めてという感じです。
あんまりアプリ開発と関係ない話になってしまったので大丈夫かな?と不安だったのですが、会場ではとても好評だったようで安心しました。

他の方の発表も単純なアプリの実装に留まらない内容で刺激をうけました。
特に趣味でTensorFlowを使ってイラストの画像識別をやっているという話がとても興味深くて、自分も機械学習に手を出したいなぁと思いました。

ピクシブ社のオフィスもおしゃれで普段インターネットで見る方々と交流できたりしてとてもたのしかったです。

こっそり連れて行ったきりみんちゃんもたのしそうでした。

Gboardに「ステッカー」という機能があることにようやく気がついたのでTwitterとかでLINEスタンプみたいなことが出来るアプリを試作してみた

こんにちは、VTuberきりみんちゃんのマネージャーをしているきりみんという者です。

LINEスタンプ、いいですよね。
好きなキャラクターのLINEスタンプが発売されるとつい無条件で買ってしまいますよね。
ちなみに使う機会はほぼありません。

LINEスタンプみたいな機能がTwitterにもあったら、ユーザーも合法的にキャラクターの画像を貼れるしTwitterも版権元も収益化ができてみんな幸せになりそうなのになぁ、と思っていたら、Gboardにステッカーという機能が存在することに気が付きました。

みなさんはGboardにこんなgifアニメステッカーを簡単に貼れる機能がついているのを知っていましたか?
ぼくは全く知りませんでした。

気になったので調べてみると、どうやら自分でもGboard用のステッカーアプリを作ることが出来るようです。
それなのにやはりあまり存在に気付いている人がいないのか、ストアで調べてもGboardステッカーアプリは数えるほどしかないっぽく、特に日本人向けのステッカーはほぼ存在していなさそうな感じでした。

もしかしてこれは一発当てるチャンスなのでは?と思い、実装方法を調べて実際にアプリをリリースしてみました。

実装

とりあえず公式の紹介記事をみる。が、情報が少なくてよくわからない。

android-developers.googleblog.com

Common builders for Indexable objects  |  Firebase

ググるといくつか解説しているエンジニアブログの記事があったのでそちらを参考にさせてもらいました。

spin.atomicobject.com

proandroiddev.com

基本的には上のエントリに実装方法が丁寧に書かれているので、そちらを読んでくださいという感じです。

ざっくりと実装コードを紹介します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="kirimin.me.emojires">

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_title"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="mystickers"/>
                <data android:host="sticker"/>
            </intent-filter>
        </activity>
        <service android:name=".StickerIndexingService"
                 android:permission="android.permission.BIND_JOB_SERVICE"/>
    </application>

</manifest>
class StickerIndexingService : JobIntentService() {

    companion object {
        private const val UNIQUE_JOB_ID = 42
        private const val URI = "mystickers://sticker/"
        
        private const val IS_PART_OF = "isPartOf"
        private const val HAS_STICKER = "hasSticker"
        private const val STICKER = "Sticker"
        private const val STICKER_PACK = "StickerPack"
        private const val STICKER_PACK_NAME = "emojirespack"

        fun enqueueWork(context: Context) {
            enqueueWork(context, StickerIndexingService::class.java, UNIQUE_JOB_ID, Intent())
        }
    }

    override fun onHandleWork(intent: Intent) {
        val update = FirebaseAppIndex.getInstance().update(
            Indexable.Builder(STICKER_PACK)
                .setName(STICKER_PACK_NAME)
                .setImage(convertUrlFromDrawableResId(applicationContext, R.drawable.teetee))
                .setUrl(URI + "pack/0")
                .setDescription("A sticker pack of Nihongo")
                .put(
                    HAS_STICKER,
                    Indexable.Builder(STICKER)
                        .setName("Etsu")
                        .setImage(convertUrlFromDrawableResId(applicationContext, R.drawable.etsu))
                        .setUrl(URI + "etsu")
                        .setDescription("Etsu")
                        .put(IS_PART_OF, STICKER_PACK_NAME)
                        .build(),
                    Indexable.Builder(STICKER)
                        .setName("Gomenne")
                        .setImage(convertUrlFromDrawableResId(applicationContext, R.drawable.gomenne))
                        .setUrl(URI + "gomenne")
                        .setDescription("Gomenne")
                        .put(IS_PART_OF, STICKER_PACK_NAME)
                        .build(),
                   // 以下略
                )
                .build()
        )
    }

    private fun convertUrlFromDrawableResId(context: Context, drawableResId: Int): String {
        val sb = StringBuilder()
        sb.append(ContentResolver.SCHEME_ANDROID_RESOURCE)
        sb.append("://")
        sb.append(context.resources.getResourcePackageName(drawableResId))
        sb.append("/")
        sb.append(context.resources.getResourceTypeName(drawableResId))
        sb.append("/")
        sb.append(context.resources.getResourceEntryName(drawableResId))
        return Uri.parse(sb.toString()).toString()
    }
}

要約すると、FirebaseのAppIndexingの機能を使ってGboardに自作アプリのステッカーを紐付けるだけです。 そのためにJobIntentServiceを継承したServiceクラスを作り、FirebaseAppIndexにStickerとStickerPackを登録します。
実装中、ImageとUrlに何を入れればいいのかよく分からなくて迷ったのですが、Imageにはステッカー画像のURL(ローカルデータならResourceのURI)、UrlにはURL Scheme(AndroidManifestに設定したものと一致していれば何でもいい)を入れれば動きました。

とりあえずこれだけでこんな感じに動くアプリを作ることができました。

ストアにリリースしてます。 play.google.com

GitHubでもコードを公開しています。 github.com

今回はとりあえず試作なのでSlackみたいな文字スタンプを使いましたが、gifアニメにも対応しているのでLINEスタンプみたいな感じでいろいろなキャラクターのスタンプアプリを作れれば面白いんじゃないかなーと思いました。

というわけで(実装公開しちゃったけど)Gboardステッカーアプリ作りたいという案件お待ちしております。

#技術書典 6でフリーランス本などを出して579部売れた話と電子版が売れ続けてる話と振り返り【技術書典感想戦:まとめ編】

煽りタイトル失礼します。
技術書典6に参加した振り返りです。

2019/4/14に開催された技術書典6にサークル側として参加したので、そのレポートと振り返りエントリです。
今回はかなり張り切って取り組んだので、ひとつずつ振り返っていきたいと思います。

書いた本の内容はこちらをご覧ください。 kirimin.hatenablog.com

当日まで

技術書典にサークル参加するのは前回に続き2回目だったのですが、前回は体調が悪い時期と重なってしまったことなどがあり、あまり内容のない電子本を100円で配布するのがやっとでした。
結構つらい経験だったので、今回はサークル参加は見送ろうかと思っていたのですが、たしか誰かに「フリーランスについて書いたら?」と言われた事をきっかけに「その内容なら書けそうだし書きたい!」と一気に気持ちが高まって、勢いで申し込みました。

しばらくして当選のお知らせを受け取ったことで、本格的に執筆に取り組むことになりました。
この時点でフリーランスの本を出すことは決まっていて、余力があればきりみんちゃんのファンブックも出したいという温度感でした。

執筆

フリーランスを完全に理解できる本

kirimin-chan.booth.pm

フリーランス本の執筆にはRe:VIEWを使用しました。
Re:VIEWは環境構築のハードルが結構高くエンジニアでもなかなかビルドが通らないのですが、その辺りは前回参加時に環境構築を済ませていたので困りませんでした。
テンプレートにRe:View Starterというサービスを利用させていただきました。

Re:VIEW記法をググりながらブログを書くノリで粛々と書いていきました。
かなり執筆に苦しんだ前回とは違い、今回は書きたいことが明確だったため、実質的には数日で一気に書き上げました。
若干煽り気味なタイトルもわりと一瞬でエイヤと決めてしまいました。

執筆後、@mego_さんと@misadroidさんにレビューをしていただきました。
それぞれ、誤字脱字や内容について多数のツッコミをいただき大変感謝しております。

きりみんちゃん公式ファンブック

kirimin-chan.booth.pm

早めにフリーランス本を書き終わったので、新刊二冊目のきりみんちゃんファンブックに取り組み始めました。
こちらはPhotoShopで作った。
フリーランス本と違って内容がそれほど定まっていなかったので、こちらの方が悩んだ。
フルカラーの同人誌というのも初めての経験だったし、VTuberの公式ファンブックというものにどういう内容が含まれていれば喜んでもらえるのかを考えるのも結構むずかしかったです。
しかし結果的にはこちらも2週間程度で完成させ、無事、印刷所の最速早割に間に合うスケジュールに収めることができました。

入稿

入稿についてはイベント前にエントリを書いているので、そちらに詳しく書かれています。

kirimin.hatenablog.com

早割40%OFF+現金還元5%OFFでかなり安く入稿することができました。
早期入稿は正義!

被チェック数と宣伝

今回は事前の宣伝も結構がんばりました。
同人界隈には本を売るのではなく「配布する」と表現する文化があるように、あまり過剰に自分の本を宣伝することは美しくないというような意識が一部にはあるようです。
これは元々同人誌というのが二次創作ジャンルが強く、あくまで内輪コミュニティ内での行為であるという建前などが関係していたりもするのかと思っていますが、技術書典、特に自分の本に関しては完全に1次創作であり、また内容にも価値があると信じていたので、積極的に宣伝をしていくことにしました。

ブログと告知

まずはサークル一覧が一般公開されたタイミングでブログにて本の内容を紹介しました。

お品書きや目次などの画像を載せたこのツイートとエントリは非常に効果があり、最終的にインプレッション 67,879、メディアのエンゲージメント 1,845、リンクのクリック数 509という結果でした。 ブログエントリ自体のPVは5,688でした。

入稿体験についてのエントリを書いたり、pixiv PAYについてのエントリを書いたりしたのも、単純に状況共有やお知らせという意図がメインですが、宣伝の側面もそれなりにありました。

Twitterでも #技術書典 タグを積極的に使い、被チェック数や準備について積極的にツイートしていました。

被チェック数

被チェック数を毎日ツイートで報告することについては賛否あるようで、大衆受けを煽ったり被チェック数の少ないサークルへのマウントになるのではというような懸念もあり、そもそもチェック機能はユーザーが利用するものなのでサークル側が一喜一憂するべきではないというような意見も見られました。

しかし、自分自身が今回入稿数を決めたり実売数を予測するのに前回までの技術書典での被チェック数推移を公開し、それをまとめてくれている人達の情報が非常に役に立ったということや、単純にこういう情報は多くの人がオープンにしてくれていた方が個人的には様々な判断がしやすいということもあり、個人的には悪いことではないかなと思って続けました。

実際の被チェック数の推移は以下のようになりました。

https://i.gyazo.com/3a08fde32eab41ef415c77043e7e540e.png

被チェック数は入稿した3/23の時点で87、この数字から最終的な実売数を予測するのはかなり難しいですが、前回までの参加者の公開してくれていた被チェック数の推移傾向や実売数の情報を参考にして予測を立てました。
その結果、「フリーランスを完全に理解できる本」を800部、「きりみんちゃん公式ファンブック」を100部入稿することに決めました。
当時の被チェック数からはかなり乖離した数字なので、情報が何もなければ多分200部くらいにしていたと思います。
とはいえ800部はさすがにやりすぎたと思い、翌日からずっと「600部にしておけばよかった...」と思い続け誰にも部数を明かせない日々を過ごしました。

被チェック数は順調に伸び続けましたが、かなり早いタイミングで積極的に宣伝をして需要を前借りしてしまったせいか、予測よりは伸びるペースは若干少なかったです。
しかしやはり最後の数日の伸びはすごく、かなり脳汁がでました。

当日の様子

https://i.gyazo.com/611c6f90e6e5a86b21c9d0dc5203f593.jpg

https://i.gyazo.com/e23fc2b15075de0b2fcbb7d0f8938c52.jpg

(当日のフル設営状態の写真を撮り逃した...)

当日は@mego_さんに売り子をお願いしていたのですが、自分の部数への認識が甘く、「おそらく一番混む最初の1,2時間だけ手伝ってもらえれば大丈夫です!」という感じで頼んでいました。
前日くらいになり「被チェック数が200部以上なら最後尾札を作った方がいい」という文章を読んで「あれ、これヤバいのでは?」と気付き慌てて最後尾札と列途中札を作りました。

当日は9:40頃に会場入りし、設営を始めました。前回は本を雑に置くだけでしたが、今回は色々用意していたこともあり結構設営も大変で、しかも途中で運営の方から「行列のリスクがあるサークルさんに声をかけて回っているのですが、机の上の展示をすべて下ろしてもらって常に二人並列態勢で売り子をしてください。もし列が爆発しそうだったらすぐに運営を呼んでください」と言われ、一体何がはじまるんです?という気持ちでした。

指示どおり一旦展示などは椅子の後ろに置き、本だけを平積みした状態で開会を迎えました。
結果的には今回の技術書典では午前有料化や入場制限がかなり適切に運用されていたらしいことと、弊サークルの場所が入り口からかなり人の流れがない場所だったこともあり、実際に最後尾札を使う機会はありませんでした。
一般入場が始まった13時ごろから「この感じだったら展示やポスターなどでもっとアピールしないと厳しいな」と気付き、設営をし直しポスターを掲げて積極的に存在をアピールし始めました。
行列が出来るまではいかないものの、常に一定数の人が買ってくれるという状況が続いたため、閉会ギリギリまで一冊でも多く売るためにスペースを離れることが出来ず、結局売り子の@mego_さんには閉会までずっと一緒に売り子をして頂いてしまいました。本当にありがとうございます。すみませんでした...。

250冊(ダンボール一箱分)ほど在庫が残ってしまったので、会場からBOOTHの倉庫に直送していただきました。

閉会時には心身ともに疲れ切っており、売り切ることが出来なかったという多少の悔しさもあり、フラフラと帰路につきました。
しかし、少し落ち着いたら売り切れなかった悔しさよりもたくさん買ってもらったり声を掛けてもらった嬉しさや達成感などが湧いてきました。
当日本を買ってくれた方、挨拶をしてくれた方、きりみんちゃん本も買ってくれた方、本当にありがとうございました!!

pixiv PAYによる前払い取り置き

今回、pixiv PAYによる取り置きのサービスを行いました。詳細は別エントリに書いていますが、技術書典らしい面白い試みが出来たかなと思っています。

kirimin.hatenablog.com

売れた数

雑に数えた速報値なので多少誤差があるかもしれませんが、最終的な当日販売数と利益は以下のようになりました。

https://i.gyazo.com/d5dc525cb3ad2d1a359b7481a956d8b0.png

フリーランス本は図やコードなどがない純粋な文章だけの本ということもありページ数が少なかったので、印刷単価も安めで、収支はかなりプラスになりました。
きりみんちゃん本の方はフルカラー+少部数なので単価が高かったのですが、1000円という技術書典物価を反映させた価格にさせて頂いたこともあり、こちらも黒字でした。

今回サークル参加して学んだ一番のことは、コミケなどでフルカラーの創作イラスト本を500円(コミケ相場ではイラスト本は500円が多い)で配布しているサークルはおそらくほぼ赤字で配布してくれているのだなぁという事でした。
個人的には好きな絵師様のイラスト本であれば1000円でも買いますが、ありがたいことだなぁと思いました。
もっと多くの1次創作系サークルさんがBOOTHで電子版を配布してくれれば、販売価格がほぼそのまま利益になるし、イベントに参加しなくても気軽に購入することが出来るので嬉しいなぁと個人的には思っています。

BOOTHによる電子版の販売

当日の夜からBOOTHでフリーランス本の電子版を販売し始めました。
公開から24時間で100部以上売れて驚きました。
4/20 19:00現在で182部も購入いただいています。
もちろん技術書典というリアルイベントがあってこそ電子版を買ってもらえるのですが、イベントに行ったり紙の本を送ったりしなくても同人誌を配布したくさんの人に読んでもらい、利益が得られるというのは素晴らしい世の中になったなぁと感慨深いです。

評判

もちろん期待はずれだった同人誌についてわざわざ言及する辛辣な人はあまりいないという前提はありつつ、たくさんの好評の声をもらい、とても嬉しいです。

togetter.com

正直、いつもブログを書いているようなノリでページ数もそれほど多くなく、技術的に専門的な内容というわけでもない本書に満足して貰えるのか不安な気持ちもあったのですが、レビューは本当に励みになります。
とはいえやはりエンジニアとして技術以外の情報発信ばかりをしているのもアレなので、もっと技術的なアウトプットもしていかないとなぁという気持ちもあります。

KPT

最後に今回のKPTを書いて締めようとおもいます。

Keep

  • 自分が伝えたいと思った情報を本にして多くの人に読んでもらうことが出来た
  • 最速早割で入稿することが出来た
  • 新刊を2冊も出すことが出来た
  • 早期に売り切れという事態を回避した
  • 内容について高評価をもらえた
  • 大きな失敗や事故などを起こさなかった
  • pixiv PAYによる前置きという決済オタクとしてのチャレンジに成功した

Problem

  • フリーランス本にいくつかTypoがあった
  • きりみんちゃん本に大きな誤植があった(「きりのんの名前が鮭乃きりみ」になっている)
  • きりみんちゃん本に描き下ろしのイラストなどをあまり盛り込めなかった
  • 入稿時に色々トラブった
  • いろいろ準備していたつもりだったけど、他のサークルを見るともっとスペース作りに力を入れてもよかった
  • フリーランス本の表紙はもっと凝ればよかった。ちゃんと描き下ろしのイラストで表紙をデザインしてキャッチーかつ内容が伝わる表紙に出来ればもっと手にとって貰えたかもしれない
  • これだけ集客できるならイベント用にきりみんちゃんグッズをちゃんと作ってちゃんと配布すればよかった
  • フリーランス本の販売部数を完全に読みきれなかった。600部でもよかった
  • 当日のオペレーションの負荷を甘く見ていた。売り子は午前と午後で二人にお願いした方がよかったし申し訳なかった

Try

  • 入稿前にもっとよく内容を精査、確認する
  • 他の人気の本を参考に表紙デザインにもっと時間をかける
  • 他のサークルやネットの情報を研究してスペース作りをもっと工夫する
  • 次は出来れば技術的な内容の本を出す
  • 売り子をちゃんと依頼する

宣伝

BOOTHにて電子版を販売中です。
物理本は入荷までにもう少し時間がかかるそうなので、紙の本がほしい方はしばらくお待ちいただけたら幸いです。
(とらのあなさんの方に送った方は即日販売が開始されたらしいので、そちらに送ればよかったと少し思っている。。。)

BOOTHではきりみんちゃんグッズも販売しているのでよかったら買ってね!

kirimin-chan.booth.pm

きりみんちゃんねるもよろしくね。

www.youtube.com