最近入れて良かった開発・仕事効率化ツール9選

開発の仕事をしていても、PRを書いたりslackでやりとりしたり、何かと文章を書く機会は多いものです。
そこで入力を中心に色々と効率化用のツールを入れたので、記録がてら紹介してみます。
適当に書いていったら9選という半端な数になりました。

デスクトップアプリケーション

クリップボードアプリ clipy

clipy-app.com
1回コピーしたけど、その後で別のものをコピーしてしまって、またコピーし直す…というのが無駄なので入れました。
議事録を元にIssueを作るといったときも、必要情報をCtrl+Cでコピーしまくって、後で連続してペーストしていけるので便利です。

f:id:Gateau:20190102205242p:plain
設定したショートカットでコピー履歴を呼び出せる

日本語入力システム ATOK Passport

www.justmyshop.com

GoogleIMEが「再生成」を覚えてくれないので変えてみました。

便利なところ

  • typoの修正が賢い
    f:id:Gateau:20190102203301p:plain
    例えば母音の入力を飛ばしても自動変換される
  • 自動でどんどん辞書登録してくれる
    • 自分で登録した単語は8個、自動登録されたのは150個でした
  • ATOK Syncで複数のPC、スマートフォン含めて学習や辞書が同期される
    • PCは会社で2台と家で1台、スマートフォンは?台(わからない)あるので、全部で登録しなくて良いのが楽です(まず自分の名前が変換出来ないので、携帯変える度に登録するのも面倒ですしね…)
    • 最近お気に入りの登録単語は <img src="" width="320px"> です。githubスマートフォンのScreenshotを貼るとき、そのままだと大きすぎるので見た目上リサイズしてます。
      f:id:Gateau:20190102211818p:plain
      drug&drop後、タグを入力して画像URLをコピペする

      f:id:Gateau:20190102212136p:plain
      上がリサイズ版、下がそのまま。スクロールしなくても全体が見れる大きさに調整出来て便利
  • 「お気に入り文書」で改行がある文章も登録
    • まずはmarkdownのテーブルを登録してみました。他にも活用出来そうです。 f:id:Gateau:20190102210635p:plain

ATOKは多機能過ぎて使いこなせないぐらいなので、少しずつ慣れていきたいです。

keymapカスタムツール Karabiner Elements

Karabiner - Software for macOS

以前はゴリゴリカスタムしていたんですが、あまりやりすぎると普通のキーボードが打てなくなるので、今は1つの目的に絞ってます。
日本語配列の)セミコロンをEnterにすることです。
「US配列はEnterが近くて押しやすい」と聞き「むしろ使わないキーがホームポジションにあるじゃん?」と気付いて設定しました。
普段Kotlinしか書かないので出来る設定ですね。
一応、セミコロンも稀に必要にはなるのでCaps Lockに割り当ててあります。

1つ困った点があって、普通に設定すると Shift+; までEnter扱いになって + キーが使えなくなっていることですw
結構複雑な設定を頑張れば出来そうなのですが…これから頑張ってみます。

Chrome拡張機能

Create Link

chrome.google.com
今開いているページのタイトルとURLをコピーします。Plain TextやMarkdownなど複数から選択できます。いくつか探した中で、一番使いやすかったです。

Fireshot

chrome.google.com
前々から入れてましたが、全画面キャプチャ撮れるのが便利です。スクロールしながらキャプチャ撮るの大変なので。

Personal Blocklist (by Google)

chrome.google.com
特定のドメインのサイトを検索から除外したくて入れました。
stack overflowの内容を機械翻訳し、静的ページにしてSEOのランクを上げ、広告を貼り付けているサイトが増えているのが見づらくて邪魔なのです。
f:id:Gateau:20190102222411p:plain
ただ最近機能しなくなったようで、何とか追いついて欲しいところ…同じ機能の何かがあったら知りたいです。(別ツールを開発中との噂も?)

他にもGoogle翻訳Gmail、Pocket、はてブなどの拡張も入れてます。普通に有名なので省略。

Android Studio Plugin (JetBrains IDE Plugin)

CamelCase

plugins.jetbrains.com
snake_caseとCamelCaseを相互に変換出来ます。

Rainbow Brackets

plugins.jetbrains.com
対応する括弧を色分けでわかりやすくしてくれます。

Key Promoter X

plugins.jetbrains.com キーボードショートカットをポップアップ表示してくれます。

既存のショートカットや便利ツールも使いこなせていないので、使える範囲で入れていきたいですね。

より良いものを探したいツール

画像加工

キャプチャをちょっとリサイズしたいとか、トリミングしたいとかありますよね。
みんなツール何を使ってるんでしょう。Skitch?
お絵描きで使い慣れてるという理由でFireAlpacaを使ってますが、用途違うので替えようかなぁと思ってます。

メモ

以前はMacの「メモ」を使っていましたが、リッチ過ぎて使いづらいので今はGoogle Keepを使っています。
出来ればもう少し画面を大きく出来て、箇条書き内でTabを押したらインデントされるようなツールが欲しい!
軽量で同期もうまくやってくれるツールは限られる気がしていて、みんなが何を使っているのか気になります。

TODO管理

Wunderlistを使ってます。しかしいつ終了するのかとヒヤヒヤです。
TODOが書けて詳細も書けて、PC/スマートフォンで同期出来て、長生きしそうなツールを見つけておきたいです。

 

以上、何か役に立つものがあれば幸いです。

2018年に買って良かったものまとめ

今年は生活が変わるような良い買い物が多かったので、まとめておきます!

マグネットシャワーホルダー・バスルームラック

ダントツ良かったのがこれ。皆さん知ってました!?ユニットバスの壁って磁石がくっつくんです。

強力なマグネットなので安定感抜群で、シャンプーを置いたままポンプを押してもびくともしません。またサビがついたりもしていません。
ユニットバスって物を置く場所が無くて、へりに置いて落としたり、洗面台側に手を伸ばしたりしがちなので、めっちゃおすすめです。

両面使える洗濯ネット

www.muji.net
これもすごく良い。「洗濯物を入れていざファスナーを閉めようとしたら裏返し」これ、がっくりするんですよね…
入れる前に表裏を確認しなくて良くなるし、家事は楽にしていきたい!

HARIO (ハリオ) ワンカップティーメーカー 200ml

HARIO (ハリオ) ワンカップティーメーカー 200ml ブラック OTM-1B

HARIO (ハリオ) ワンカップティーメーカー 200ml ブラック OTM-1B

ちょくちょく紅茶をいただくので、どうやって飲もうか探していたら見つけました。
1人暮らしでもとても気軽にお茶を入れられるようになったので、ほぼ毎日使ってます。

ふんわりお茶パック Mサイズ 60枚入

ふんわりお茶パック Mサイズ 60枚入

こういうお茶パックをかぶせてから茶葉を入れると、ジャンピングをさせつつ捨てるのも楽ちんです。

山善(YAMAZEN) 電気ケトル 0.8L 細口 温度設定機能・保温機能付き YKG-C800(B)

lohaco.jp

紅茶をよく飲むようになったのと合わせて、ケトルを買い換えました。
温度設定が出来る&見た目がスタイリッシュ&1人用でかさばらないのはこの機種だけです。
T-falのケトルも大変人気なのですが安全性のためかずんぐりした見た目のものしかなく、バルミューダはスタイリッシュだけど温度設定が出来ません。
猫舌なので、急いでいるときは低めの温度設定で入れちゃいます。早いし楽ちん。

ケーブルボックス タップ・ルーター収納ボックス

item.rakuten.co.jp

ごちゃつくケーブルを隠せる棚です。シリーズでいくつか買いました。
中でもこの扉付きが思った以上に便利でした。ずっと悩んでいたドライヤーの収納場所にぴったりだったのです。
「毎日使うのでコンセントに挿しっぱなしにしたい、かつ使うとき以外は隠しておきたい」という要望をかなえることができました。
上部の裏側にマルチタップが隠れています。

f:id:Gateau:20181230151138j:plain

edist closet (ファッションレンタルサービス)

EDIST. CLOSET - ファッションレンタルサービス 最旬コーデをセットでお届け

買ったというか、定期レンタルサービスを契約しています。毎月4着借りられます。試しに3ヶ月契約していて8,300円/月です。
こんなblogを書いておいて何ですが持たない暮らしが好きなのと、服を選ぶのが苦手なのでアウトソースした形です。
類似サービスよりターゲットの年齢層が高めで、体型をカバー出来たりポケットがついていたり、利便性も捨てたくない人向けです。
勉強会の懇親会とか、立食なので携帯を入れるポケットが欲しいんですよね。

夏場はカンファレンスTシャツばかり着ていましたが、このサービスを使うようになったら「かわいい」「おしゃれ」と言われるようになりました。
冬は服が高いので、買い物した月だけ急に出費が跳ね上がる、といったこともなく家計簿が安定します。
ただそんなにバリエーションは多くなく、みんな使うようになると絶対かぶるので勧めづらくもありますw

運営会社は違うようですが、先日までは男性版のサービスとコラボキャンペーンをしてました。
leeap.jp

Youtube Premium

こちらもサブスクリプションサービス。自分の好きそうな曲がどんどこ流れてきて幸せな生活を送ることが出来ます。
spotifyなども色々試していましたが、自分が求めていた体験はこれだったんだ…と確信が持てました。
元々は今YouTubeで毎週配信されている仮面ライダー電王をオフライン保存したくて契約したので、そちらも満足してます。

逆にAmazon Primeは持て余してて解約しようかと思っているので、良い活用法があったら知りたいです。
映画はあまり見なくて、Amazonでの買い物は月1ぐらい、デリバリープロバイダエリアに住んでます。
Amazon Fresh目的でしたが、配送が2日後ぐらいの商品が多くて、思ったより遅かったです。

スチームオーブンレンジ ビストロ(NE-BS1500-K)


一気に高価なものになりますw 最近、毎日のお弁当作りはほぼこれによって支えられています。
休日にハンバーグのタネや野菜の肉巻きを冷凍しておいて、朝はビストロ任せで冷凍した状態からこんがりおいしく焼いてくれます。
鮭も冷凍状態から、自動で両面良い焼き目がつきます。

蒸し野菜モードも便利で、根菜を良いゆで加減にしてくれます。
何分が適切か調べたり、少しずつ追加で温めたりしなくても良いので楽です。
ゆで卵や温泉卵も作れるので、卵好きには嬉しいです!

f:id:Gateau:20181230151733j:plain

iPad Pro & Apple pencil

言わずもがなという感じですが…お絵描きしてストレス発散をしたり、楽しんでます。
買ってみると意外と仕事にも使えて便利でした。プログラムを実装する前に思考を整理するのに使っています。
procreateというツールが使いやすく、漫画なんかも描けそうでチャレンジしてみたいですね。

f:id:Gateau:20181230151955j:plain
気軽にこんなお絵描きが出来るようになりました

みなさんもぜひ今年買って良かった商品があったら教えてください!

Android Test Night #5 - Androidテスト全書の回 - に参加してきた

testnight.connpass.com

大変有意義な会だったので、思わず久しぶりにblogを書きます。
トークでも懇親会でも「あるある」という共感が多くて面白かったです。

テストデータの話

最近Google Maps Platformを使っていて、そのテストがしづらいのをつぶやいたところ質問で拾っていただきました。
で、その回答からの気付きと、その後の懇親会などで知ったこと。

本の内容は読んでて知ってるんですが、あまり自動/手動を区別して考えてなかったので、そういえばと気付きを得ました。
本番データを持ってくる話は、クックパッドさんのこちらです。だいぶ前の記事ですが、当時話題になりましたね。
techlife.cookpad.com
今うちではGCPを使ってるのですが、同じように出来るのかな…

ただうちの場合、本番データを丸々持ってくるのは少々オーバースペック感もあります。
以前の職場では、自動テスト用に、yamlでデータを定義すると適切な型・形式になって返ってくる仕組みがありました。
あれをAndroidの実装中も使いたい気持ちになります。(当時はバックエンド書いてたので色々話は違いそう)
Kotlinだと「ちょっとここのデータだけ書き換えて確認したいな」と思っても「それvalやで」と出来なかったりするので…
自動・手動の良いところを組み合わせて効率化できないかなー

Google Play Consoleに組み込まれているテスト

「今はFirebase Test LabがGoogle Play Consoleにも組み込まれてますよね」という話題が出ました。

support.google.com

これのことですね。リリース前レポート、いろんな画面のキャプチャも撮っておいてくれたりして、
「あのバージョンのあの画面って、どんな仕様だったっけ?」と振り返りたいときに便利そうだなぁと思っています。
ログイン認証情報を設定する を使うと要ログインな画面もテストされます。どんどん高機能化しててすごい。

f:id:Gateau:20181201112322p:plain

ただ、リリース版のapkで実行されるので不安だなー、と思ったら後で懇親会で教えてもらいました。

なるほどー!と思ったものの、よくよく考えてみると実行して良い処理・良くない処理を分けていくのも大変なので、
やはりちゃんとFirebase TestLabを使ってQA環境で動かした方が良いんだろうなぁ。
良さを実感出来るという意味では、Play Consoleに組み込まれてるのは良いですね。

QAを楽にしたい

手動テストの課題でパッと思いついたテストデータの用意の話だったんですが、他にも色々あるよなーと思ってます。

  • テストケース・QA結果のわかりやすいまとめ方
    • 現状、普通にspreadsheetにまとめている。横スクロールがめっちゃ長くなりがちじゃないですか?専用ツールがあって良い。
  • iOSと簡単に見比べたい
    • TestLabのスクリーンショット機能、iOSにはまだ無いっぽい。あったらデザインや仕様をすぐ確認出来て楽そうだなぁ。
  • 仕様の管理
    • QAというか実装中もぶつかる問題なのですが、「最終的な理想の仕様」と「今回のバージョンではここまでやる」仕様がよくわからなくなります。

他にもいろいろありそう。うちはこんなツール使ってるよ!とかあれば知りたいです。

本読んでテスト書いてます!

質問のときにそんな声が出てましたが、自分も読んでテスト書いてます!
まだごく一部しかないので増やしていきたいです。
それは自動化して楽にする目的もありますし、どういう設計がテスタブルなのか学びたいという目的も大きいです。

f:id:Gateau:20181201115820j:plain

懇親会で著者の皆さまにサインをもらいました!
本にサインがあると、著者の皆さまの力をしっかり吸収するぞ!という意欲がわいてくるのでおすすめです。
査読に協力させていただいたおかげで、関係者の皆さまが自分のことを知ってくださっていたのも嬉しかったです。

もう買っている方が多いと思いますが、本の紹介リンクも貼っておきますね!
peaks.cc
今年Androidエンジニアに転職した初心者の自分にはまさにピッタリの本で、良いタイミングに感謝しかありません。
会でも編集力を絶賛されていた @mhidaka さんに日常的に詳細の解説をしてもらえたり、本当に恵まれた環境にいるのでたくさん活かしていきます!
著者の皆さま、執筆本当にお疲れさまでした!!

DroidKaigi 2018スタッフ業の思い出を振り返る

DroidKaigi2018が終わったー!!!お疲れさまでしたー!
終わってすぐ病に倒れてしまったので遅くなりましたが、たくさん振り返ってエモさ出していきます。

2017での後悔

前回のDroidKaigi2017では事務局長という役割を担っていました。
代表の片腕、副長、全体統括とでも言うのでしょうか。
準備はもちろん当日も「スタッフへの指示出しは任せる」と言われていました。
が、受付の長蛇の列を前に、それを整理するのも受付無しという英断をするのも出来ませんでした。
他にも連絡が上手く出来てなかったり、ランチでトラブルがあったりと全然きちんとした進行が出来ませんでした。

またDroidKaigi当日に仕事の方でもリリーストラブルがあり、会社の代表電話にクレームが何件も来るなど、色んな方に迷惑をかけてしまいました。 トラブル発生時にはPO代理にエスカレするようメンバーには伝えていたのですがなされておらず、体制を作っておけなかった力不足さにショックを受けました。

そんなこんなで2017の終了後は1ヶ月ぐらい引きずって落ち込んでいました。 でもだんだん「リベンジしたい!次こそ思いっきり楽しみたい!」という思いが強くなり、2018も続けることにしました。

2018でやったこと

色々察してくれてか、今回2018では事務局長という役割はなくなりました。
今回は自分がやりたいタスクを拾ったり、人手不足な役割のヘルプなどをしました。
これまで実現出来なかったことをたくさん出来て、とてもやって良かったし、最高に楽しかったです!!!

2018開催に向けてのメンバー増強

常にオンラインでレスポンスが早いので、メンバーの権限管理をよく行っています。
友人をスタッフに引き込んだりもしました。

2017年8月 グローバルチームキックオフ

新しいスタッフに「もっとDroidKaigiの国際化を推進したい!」という方が多く発足したチームです。
今回からの人しかいないと色々困るだろうと思い、これまでやってきたことなんかを説明しました。

2017年10月 会場下見

2018の場所は2017と同じくベルサール新宿グランドですが、1階ホールは見たことがなかったので行きました。
現実感が出てやる気がわいてくるし、当日迷ったりしなくなるので下見は良いです。遠足みたいで楽しいし。
f:id:Gateau:20171025112923j:plain
こんなに広い場所に人が埋まって、こんな視線で代表は話すのかなぁと考えて撮った一枚。

2017年11月 グッズ発注業者の選定

今回、ふらっと実店舗に行ってみたらサンプルがたくさんあって楽しかったです。
行ってみると「このグッズはここの店舗にサンプルが豊富ですよ」など教えてくれたり、
インターネットだけでは知れない情報も得られるので脚を使うの楽しいです。

2017年12月 マスキングテープ作り

f:id:Gateau:20180215190915p:plain
スタッフ同士で飲んでたときに作りたいねという話が出て作りました。歴代のAndroidコードネームお菓子をモチーフに。
2017のOP動画で作成されたアイコン素材をいただきイラレで頑張りました!
youtu.be

またこのマステの色使い、見覚えがありませんか?
マテリアルデザインColor paletteのPrimaryColorから取りました。細かすぎて伝わらないネタ。
Color - Style - Material Design
ちなみにマステ作りは今回のスポンサーでもあるPixivさんのPixiv Factoryを使わせていただきました!小ロットで作れて便利!

名札ピックアップシミュレーション

受付改善をするにあたり、シミュレーションをしよう!となり、その準備をしていました。
つまり準備の準備です。机の調達、マーキングするテープ・筆記用具・付箋など必要そうなものを考えて用意したり、地味にやることはあります。
でもこれすごいやって良かった。

2018年1月 オリジナルビール

f:id:Gateau:20180215202238j:plain プレパーティで出したDroidKaigiBeerです!こちらも飲み会の話題で作りたいという話が出て作りましたw
デザイナーさんのリソースがパツパツだったので、急遽姉に頼んでラベルを作ってもらいました。 結構反響がありまして、可愛い・美味しいと言ってもらえて嬉しいです!

2018年1月 ボランティア保険の申し込み

こういう地味な事務作業もあります。事務は苦手な方も多いですが自分は特に苦もありません。やれば終わるね、という気持ち。
他にもスタッフの当日参加可否集め、シフト表のベース作りなど、ちまちまやることはあります。

2018年2月 Contributorのアイコン集め

非常に細かいとこで言うと「ウェルカムトークで紹介したい」ということでDroidKaigi2018アプリのContributorのアイコン集めをしました。
以前作ったスクリプトでシュッと取れたのですが、有り難いことに100人を超えてたので思ったより手間はかかりましたw

2018年2月 その他諸々。。

直前に物を買い足したは良いけども、私が寝落ちしたばっかりに受け渡しに失敗した楽しい思い出もありますw
あとは搬出計画のヘルプに入ったりしましたが、複数のタスクを同時に持たないようにしてたので余裕を持って終わらせました。
荷物を計測して搬出容積を計算しておいたのが勝因だったと思います。

DroidKaigi 2018 プレパーティ〜当日〜その後

この辺は来場者の皆さまが見た通りです。
不便な点はあったかもしれませんが、前回と比較し大きなトラブルもなく何とか終えることが出来ました。
大画面でパネルでポンを出来たのもめっちゃ嬉しかったですw
終わってホッとする面と、寂しく感じる面があります。そしてまた次をやりたくなってしまい、悪循環の図を思い出しますw
みんなの笑顔の写真を見返すと、本当にやって良かった、最高!!という気分です。 f:id:Gateau:20180208182732j:plain

唯一の後悔

終了後のスタッフ打ち上げの記憶がほとんど無いことです!!!
というのも1日目の夜から歯痛に襲われ、終わる頃には激痛で痛み止めを10錠ぐらい飲んでたんですね。
にも関わらずテンション上がって正常な判断力を失った私はアルコールを摂取してしまいました… なのでみんな、打ち上げもう1回やろうな!!!!

歯痛は何だったのか

痛すぎて3連休ずっと寝込み、平日にやっと歯医者に行ったところ、歯の神経が死んでたそうです。
そりゃ痛いわ!!意識は朦朧とする割に眠れないほどの激痛にもなるわ!!!
虫歯でもないのに突然死するのは相当珍しいようです。

寝込んでいる間、色んな方に来て看病してもらったり、連絡をもらったりしました。
そのほとんどがDroidKaigiのスタッフ仲間で、私はスタッフ業を通じかけがえのない友人が出来たと気付き感謝しました。

なぜスタッフをやるのか

たまになぜ自分はスタッフをやるのか、他の人達はなぜスタッフをやっているのか考えることがあります。
自分は「コミュニティの発展に貢献したい」といった高尚なことは考えていなくて、
この好きなメンバーと力を合わせて最高のカンファレンスを作り出すのが楽しいからだなと思いました。
他の人達はどう思っているのか、ビールでも飲みながら語り合いたいものです。

感謝の言葉

自分は日頃から、感謝の気持ちをきちんと伝えようと心掛けています。
それはスタッフ業と実は相性が良いのかな、なんてのも思いました。
スタッフ業はボランティアで、報酬や見返りを求めてやるものではありません。
そんな場では、感謝を伝え、「そう言ってもらえると報われる」「感激です」といった言葉をもらえたとき、
くすぐったくもあり、嬉しく思うのです。

昔は「別に」「めんどくさい」が口癖で、文化祭なんかもサボる冷めた人間だったのですが、こんなエモいこと書くようになるのも不思議ですね。
最後に、開催翌日の片付け時に撮った写真を貼っておきます。
f:id:Gateau:20180215213551j:plain

助手席で「これレインボーブリッジ!?封鎖出来ないやつ!?」とか言ってバシャバシャ写真撮ってたり、ドライブ気分で楽しんでました。
スタッフ大変でしょうとよく言われるし実際大変なんですが、わりと自分には合っているようでこれからもみんなとワイワイ楽しみたいと思います。
小並感なエモいお話でした。

近況+DroidKaigiの名札生成スクリプトを書いた話や裏話

こちらは ex-mixi Advent Calendar 2017 の6日目の記事です。
プログラミング以外の話が多くなったので、qiitaではなく自分のblogに書きます。
 
(注:昨日の記事で女性エンジニアの話を書いてますが、そこでの「会社」はミクシィのことではありません!新卒で入った、地元の古い体質の会社のことです。ミクシィは大変良い人達ばかりだったので誤解なきよう。)
 

自分と近況

@wiroha です。mixiでの名前はガジラです。
2010年10月〜2014年1月と在籍し、日記やつぶやき、カレンダー、プロフィール、通知などを担当しました。

ミクシィ卒業後、最近までは女性ターゲットのアプリを担当し、ディレクションやマネジメントなど何でも屋さんでした。
複数のプロダクトを持ち、合計100万人以上のユーザへ届く機能を自分の一存で決められる環境*1で、やりがいがあるし思考力も鍛えられました。
 
担当プロダクトは前々回の記事にもある通り譲渡したため、今はエンジニアポジションに戻り、これまた前の記事の通り3年のブランクを埋めるべく勉強しているところです。

まだ仕事面では技術ネタが無いので、DroidKaigiでの話を書きます。

DroidKaigi

DroidKaigiはAndroidエンジニア向けの技術カンファレンスで、2015年4月から年1回開催しています。
私は2015年11月頃、ミクシィ時代の同僚に誘われスタッフにjoinしました。
仕事でも個人でも出来ないことをやって楽しんでいます!

前回、2017の話

今年3月に行われたDroidKaigi 2017では事務局長という役割に任命いただき、進捗管理屋さんをしていました。 
役割に限らず、名札*2やconnpassページやスタッフ用マニュアルを作ったりと、ここでも何でも屋さんです。
名札は手作業での作成は大変なので、テンプレを用意し中身は自動化しました。

実行スクリプトを選択後、名簿csvを選ぶと画像が流し込まれます。

f:id:Gateau:20171206120811g:plain

記事の最後にコードも載せておきます*3。誰かの参考になれば幸いです。

裏話

アイコン送付のなかったスピーカーには、代表のmhidaka画伯によるドロイド君が描かれました。
冗談と思いきや本当に使いました。

f:id:Gateau:20171204153307p:plainf:id:Gateau:20171204153319p:plainf:id:Gateau:20171204165303p:plain

 このアイコンになった方に感想を聞いたところ、「ちゃんと画像送れば良かったです」と言われました。印刷した実行犯は私です。ごめんね!

2018の話

DroidKaigiは現在2018のチケットを販売中です!
2日間で多くのセッションを聞けるのは勿論、交流などにも工夫を凝らしています。
より良い会にするための実験的要素もあり、楽しみでありつつどういう反応をされるか不安もありつつです。
 
実は前回、当日も全体管理(セッションが時間通り進行しているかのチェックや、人が足りない係への応援指示、最終撤収など)をしていたため緊張やトラブルで落ち着かず、楽しみ切れなかった後悔があります。
 
今回は当日の役割は未定ですが、事前準備を入念に行い、当日は気を張りすぎず思いっきり満喫しようと思っています。
たくさんの方々に会えるのを楽しみにしています!
ミクシィグループはプラチナスポンサーです!ありがとうございます!!!
卒業後も勉強会やDroidKaigiのMTGでよくお邪魔してますし、大変お世話になってます!!

今後

在籍当時も社内ハッカソン(Weekend Challenge 2.5の第2回)で優勝をいただいたりしましたが、今もこうしてスタッフをしたり、技術系同人誌を書いたり、Google I/Oに行ったり、イベントやものづくりを楽しんでいます。
今後もたくさんの人に楽しまれる・感謝されるプロダクトを作っていけたら幸せです。
 
Androidや女性向けの会を中心に勉強会に参加しているので、会ったらぜひ絡んでください!!
このアドベントカレンダー作成者のesugitaさん!ぜひまた写真を撮る会に誘ってください!(私信)(懐かしい)
今の会社も3年経ち、良いところがあれば次を考えてもいいと思っているので、興味を持たれた方は焼肉に連れて行ってください!(話題になってたtweet)

 
明日はkitaindia-san、カレーじゃなくて日本料理屋の話なんですね!?お願いします!!
 

最後にillustrator script

(function() {
    IMAGE_WIDTH = 77; // 画像が埋め込まれる正方形の1辺の長さ(pixel)
    CURRENT_DIR = String(app.documents[0].fullName).replace(app.documents[0].name, "");
    IMAGE_INDEX = 2; //CSVの何列目に画像ファイルの項目があるか

    var CSVConverter = function() {
        this.lines = [];  // 
        this.groups = []; // イラレ上のグループが入っていく
        this.column_name_list = null; // CSVの1行目の項目リスト
        this.variables = app.activeDocument.variables; // The active (frontmost) document in Illustrator

        // イラレアートボード上のグループをloopし、グループリストに格納する
        for (var i = 0; i < this.variables.length; i++) {
            this.groups.push(this.variables[i].pageItems[0]);
        }
    };

    CSVConverter.prototype = {
        read_csv: function() {
            var csv_path = File.openDialog("CSVファイルを選択してください。");
            if (! csv_path) { return; }

            var csv_file = new File(csv_path);
            if (! csv_file.open("r", "", "")) { return; }

            var lines = csv_file.read().split("\n");

            // CSVを読み込み、カラム名リストと値リストへ格納する
            for (var i = 0, n = lines.length; i < n; i++) {
                var line = lines[i];
                if (! line) { continue; }

                if (i == 0) {
                    this.column_name_list = line.split(",");
                } else {
                    this.lines.push(line.split(","));
                }
            }
            csv_file.close();
        },
        write: function() {
            var group_num = 0; // いくつ目のグループか。描画成功すると次のグループへ。
            
            for (var i = 0; i < this.lines.length; i++) {
                var img_file = this._get_filename(this.lines[i][IMAGE_INDEX]);
                if( img_file == null) { continue; } // 画像がない場合は次の人へ

                // 画像がある場合のみテキストの描画 
                var textFrame = this.groups[group_num].textFrames[0]; // テキスト表示領域(今回は1つ)
                var text = String(textFrame.contents);
                
                // csvカラム名と、アートボード上のテキストを一致させればloop有効
                for (var key in this.column_name_list) {
                    if (text.indexOf(this.column_name_list[key]) != -1) {
                        textFrame.contents = this.lines[i][key];
                    }
                }

                // 画像描画
                var rect = this.groups[group_num].pathItems[0]; // 画像描画領域(今回は1つ)
                var pItem = activeDocument.placedItems.add();
                pItem.file = img_file;

                // resizeの引数は%を整数で指定する
                var resize_percentage = IMAGE_WIDTH / pItem.width * 100;
                pItem.resize(resize_percentage, resize_percentage);

                // 描画領域に位置を合わせる
                this._createPosition(pItem, rect);

                // マスクして描画してマスクを解除する
                var mask = activeDocument.pathItems.rectangle(rect.top, rect.left, rect.width, rect.height);
                mask.stroke = true;
                mask.filled = true;
                var holder = app.activeDocument.groupItems.add();
                pItem.move(holder, ElementPlacement.PLACEATEND);
                mask.move(holder, ElementPlacement.PLACEATBEGINNING);
                holder.clipped = true;
                rect.remove();
group_num++; } }, _get_filename: function(github_id) { var name_jpg = decodeURI(github_id) + ".jpg" // githubのID + 拡張子 var name_png = decodeURI(github_id) + ".png" // githubのID + 拡張子 var file = new File(CURRENT_DIR + "/img/" + name_jpg); // プロフ画像 if ( file.length < 0 ){ file = new File(CURRENT_DIR + "/img/" + name_png); // プロフ画像 } if (file.length < 0 ){ file = null; } return file; }, _createPosition: function(profile_image, draw_area) { profile_image.left = draw_area.left; profile_image.top = draw_area.top; } }; var converter = new CSVConverter(); converter.read_csv(); converter.write(); })();
 
 

*1:もちろん上長に共有・相談はしますがかなり自由です。

*2:スピーカー・スタッフ向けのみ。一般参加の方向けには「参加者の名は」を使わせていただきました。 https://yoshiko-pg.github.io/your-name/

*3: 参考元サイトの微妙な実装が残っていますが、もうイラレが無い&今回から名札は別の方法で作るのでメンテはしません… https://bulan.co/swings/illustrator_script/

「女性エンジニア」としての体験談

こちらの記事を読み色々思い出したことがあるので、書いてみる。
自分は男女差別について「こうすべき」「こうしてほしい」といった意見をするつもりはなく、
他の女性も同じ体験をしたとは思っていないので、一個人の体験談として参考程度に気軽に読んで欲しい。
(追記:この記事に出てくる「会社」は地元の田舎の古い体質の企業で、転職済み)
 

女性で不便だと思ったこと

お酌の強要 

新卒1年目の時の会社の飲み会で、上司からかけられた言葉である
「若い女の子からお酌してもらった方が嬉しいんだから、社長にお酌してきなさい」
と言われた。あぁこれが社会なのかと思った。
男女どちらにせよ1年目であればいろんな人に挨拶は必要なので、受け入れた。

深夜に痴漢にあった

開発が楽しくて、ハイになって終電まで残業したときのこと。
最寄り駅から家までの道で、自転車に乗った男性に追い抜きざまに胸を触られた。
いくら仕事をしたくても、男性よりおさえた方が良いときがあると学んだ。
電車で痴漢にあい、しばらく電車に乗れなくなった友人もいる。
そのため住む場所が限られたり、余計なことに精神を消耗することがある。

男性と話が合わない

これもまた会社のチームでの飲み会のことである。
男性7、女性1(自分)ぐらいの飲み会で、話題がすぐにAVの話(たぶん)になったことがある。
そもそも知らないので何の話かもわからなかったが
「女性もいるんだから」と諌めてくれる人がいて、何となく察した
「あー自分は邪魔なんだな」と思う。
 
また、飲み会後に男性達だけで(たぶん)キャバクラに行っていたこともある。
「ここからは男の世界だから」と帰された。
多数派である男性だけが連帯感を強めていて、羨ましく思った。

勉強会で居づらい 

逆を想像してみてほしい。女性100人の中に男性が自分1人だったら。
何かを言われる訳でなくとも、居心地は悪いと思う。(嬉しい人もいるだろうけども)
そして大抵、早めに席に着いていると、いくら混んできても自分の周りだけガラガラなのだ。*1
気まずいし来たのは迷惑だったかなと思う。
 
気のせいかと思い女性エンジニアの友人に聞くと「わかる。でも慣れた。」と言う人と、
「わかる。そうなると懇親会で、卓に置かれた食事が食べ放題で気まずい。
 でも今日はあなたが申し込んでたから、女性1人じゃないと思って参加申し込めた。」と言う人がいた。

特に勉強会の懇親会で居づらい 

「男性が多い環境なんて慣れてるでしょ」と言われることがある。
実際学生時代からそんな環境で慣れている女性も多いが、
私個人は男兄弟もおらず文系だったので、女性が多い環境で育った。
大学で男友達が出来るまでほぼ女性としか交流がなかったので、理系で育った男性と似たようなものだと思う。
慣れてるようにみえるとしたら、それは頑張って気を張って話しかけているだけである。
 
(ちなみに女性が多い会があって不思議に思い声をかけたところ、
「登壇者と友達で聞きたくて」という人が何人もいた。イベントでの参考までに。)
 
先日もある会で珍しく女性がいたので声をかけたら「勉強会に参加するのはじめてで、知り合いもいないし帰ろうかと思った。
あなたに声をかけてもらえて良かった。」と言われた。
男女どちらも、知らない異性に話しかけるのは勇気がいると思う。なのでぼっちリスクが高い。
一旦ぼっちでなくなれば男性でも話しかけやすくなるようで、輪が広がる。
男女関わらず、懇親会での交流はもっと何とかしたいと思う。
 
(追記 :懇親会でナンパされると面倒なので女性限定の勉強会しか行かないという声もよく聞く。
自分はナンパととるか微妙な経験が一度、気に入られてハグされたことが一度、ツーショット写真をせがまれたことが一度ある。
大多数は良い人だし、こういうことを言うと被害妄想だとか自意識過剰だとか批判されるので、声が表に出にくいのだと思う。)

女性で優遇されていると思ったこと

重い荷物運びなどの仕事をしなくて済む 

席替えのとき男性が代わりにディスプレイを運んでくれたりする。優しい。
(追記:反響として、そんなのしてもらってない!という女性も結構いた。)

覚えてもらえる 

勉強会にて、私は相手を覚えていなかったが「何度か来てますよね」と声をかけてもらえた。
女性は少ないのでうまく活かすことも出来そうに思う。(ただし悪目立ちする面もある)

採用? 

特に女性ターゲットのプロダクトでは「女性エンジニアが欲しい」という声を聞くので、
有利に働いたことはあるのではと思う。ただ採用側の人間ではないため確かとは言えない。

モテる? 

これは他の職業の女性と比較しようがないのでわからない。
私個人で言うと31歳独身で彼氏もいない…(あっ、察し)
周りの女性エンジニアで言うとほとんどお相手もエンジニアで、話が合いそうだなとは思う。
 
 
まぁこんなところで、思い出せる範囲ということはそんなに男女の違いを感じていないのかもしれない。
結婚したり、子育てしてみるとまた何か感じるのだろう。
男性批判する気も無いし、環境を変えたのもあり現在はさして困ってはいない。
とりあえず今の自分は女性として生まれたことに満足している。
 
もっと聞いてみたいなどあればtwitterや直接でも @wiroha に声をかけてください。
 

*1:追記:この問題は、遅れて行って空いている席に座れば回避可能

iOS・Androidアプリを別developerアカウントへ移行する際の知見

アプリの譲渡・移行は実施が稀で情報が少ないので、誰かの役に立てばと書き残しておきます。

一番大切なのは、公式ドキュメントを熟読することです。
が、わりと誤りや不明点もあるので、問い合わせにかかる時間も含めて余裕を持ちましょう。
また、厳密な予定を組むのは不可能と心得て、関係者の合意も取りましょう。

移行の公式ドキュメント

iOS

iOSはずっと1つ目を見ていましたが、本エントリ作成中に2つ目を発見しました。
2つ目の方が新しいですが翻訳がかなり怪しく、英語版が確実です。

Android

最初にやること

移行可能な条件に適合しているか確認

大事。だいぶ話が進んだときにAndroidで「定期購入アイテムを提供するアプリの移行はできません」という一文を見つけ大慌てしました。
問い合わせたところ、ドキュメントが古かっただけで可能でした。(現在は修正済みの模様、感謝!)
iOS/Androidでの相違点も多いため、混同しないよう注意しましょう。

移行フロー

iOS/Androidともに、所要日数の記載が無いのがツラいところです。
ストア反映の完了通知もありません。気付いたら変わっています…
簡易ですがフローを図示します。

iOS

 移行元から移行申請  
   ↓  
   ↓ 数日以内?  
   ↓  
 移行先へ受諾可能となった通知が届く、受諾する  
   ↓  
   ↓ 最大2営業日(のはず)  
   ↓  
 移行完了、ストア反映  

iOSはstepが多く複雑です。「移行申請日」「受諾可能日」「移行完了日」など用語の定義をおすすめします。
「移行しました!」など曖昧な伝え方が発生し、齟齬が発生するためです。

Android

 移行元から移行申請  
   ↓  
   ↓ 数時間〜数日以内?  
   ↓  
 移行完了、ストア反映  

Androidはシンプルで、iOSより早い場合が多いようです。
ただiOSと異なり受諾無しで完了するため、移行先による日程のコントロールが出来ません。
自分は疲れからかiOSと同じかと勘違いし、大失敗しました。

事前準備

必要情報の準備

各OS、チームIDや注文番号などが必要です。
Google注文番号はアカウントの登録時にメールで来る番号です。正直そんな昔のもの失くすよね
もし準備出来ない場合は問い合わせが必要です。

スケジュールの検討

移行と同日にアプリもアップデート予定でしたが、iOSは審査等のため不可能でした。

理想は、審査を通しリリース可能な状態にしておく→developer移行→新しい名義側でリリース でしたが、公開待ちでは移管申請が出来ないと途中で気付きました。

結果、リリース→developer移行 となり、1週間ほど差が出てしまいました。
このずれがあっても問題ないよう開発・運用の予定を引きましょう。

※公式に「移行可能な状態」は書いてあるのですが、「移行不可能な状態」の方が注意出来て有り難いので、本エントリの最後に付録として書きました。

レポートのexport

移行後は出来なくなるため、事前にとっておく必要があります。
ただしAndroidはレポート別に1ヶ月ずつしかDL出来ず、全期間のDLを試みると死にました。
普段からとっておくか、gsutilでも使っていれば楽出来たのかな…?

移行実施

移行申請

iOSで2点弾かれました。

TestFlightエラー

TestFlight ベータ版テスト:譲渡する App からすべてのビルドおよびテスターを削除し、テスト情報の各フィールドのデータを消去する必要があります。

TestFlightは使っていませんでしたが、自動的にupされていたようで消したところ解決しました。

課金系エラー

App 用共有シークレット(購入者と共有する必要があります)を生成済みの場合、自動更新、無料、および非更新の登録を含む App のみ譲渡できます。
こちらは課金機能をリリースしたことはないのに弾かれ、iTunesConnectの不具合のようです。問い合わせたところ進めてもらえました。
移行は実施が稀な分、ストア側にも未発見の不具合があるのかもしれません。
複数申請した内の1アプリだけ弾かれ、返答待ちで予定が読めず手順もややこしくなりました。

移行中

iOSは移行申請の翌日に受諾可能通知が来ました。

ステータスが「Pending App Transfer」になると書いてありますが、普通に「配信準備完了(Ready for Sale)」のままでした。
ただしバージョン追加ボタンがdisableで、普段とは違うことはわかりました。
権限の強いアカウントなら詳細を見られるのかもしれません。

移行完了

完了タイミング

Androidは移行申請の翌日にストア反映されました。残作業は無いためこれで完了です:tada:
iOSは受諾後早いものは1時間以内に反映されましたが、遅いものは3日経っても反映されず問い合わせました。
こちらも不具合だったようで個別対応してもらい、受諾から16日で反映されました。
普通は即座に終わるものだそうなので、1日かかった段階でも問い合わせて良さそうです。

iOSはPush, widgetがあるとその設定も必要です。

Push証明書の再設定

プッシュ通知用に関連付けられたクライアントSSL証明書は譲渡されません。アプリケーションでApple Push Notificationサービス(APN)が使用されていた場合は、譲渡先ではMember Centerを使用してクライアントSSL証明書を作成し、このサービスを再度有効にする必要があります。

公式のこの説明を読み、移行完了時点で即座に証明書が使えなくなる=Pushが届かなくなると思っていましたが、
新しい証明書適用までの数時間も普通に届いていました。
差し替えずいつまで使えるのかは不明です。

App Groupsの再設定

widgetでApp Groupsを使用しています。公式に記載はありませんが、これも無効化されるようです。
この辺りを見るに、移行元からグループを削除し、移行先で再登録すれば良いようでした。

ただPushと同じく、移行完了〜再登録までの数時間もwidgetは動いていました。
アップデートするまでは動作するのか、iOS弱いので要勉強です…

移行のつらいこと

テスト出来ない

移行は1度きりです。試すのも、早めにやっておくのも、失敗したら戻すのも出来ません。
作業途中でエラーとなるポイントも未知数でした。

いつ終わるかわからない

各所から日にちを聞かれるものの、答えられません。
Androidは作業時間を教えてくれたので1日以内のぶれで済みましたがiOSは全く読めず、
Push証明書等の後作業や告知日時の調整に苦労しました。
休暇も決めづらく、不在時に反映された場合用の準備などタスクが増えました。

事前には無理でも、せめて変わったらすぐ気付けるよう監視スクリプトを組んでおけばよかったです。

権限上、出来ないことが多い

ストア周りは会社であれば段階的にアカウント権限を振っていると思うのですが、
adminしか出来ない作業が多く、調査や依頼に苦労しました。
admin権限者と拠点が離れており、画面だけ見せてもらうことも出来ず手間取りました。

社外の人に聞けない

開発の相談ならば社外の人にも出来ますが、移行は特殊な事情なので明かす訳にはいきません。
日数の目安でも聞ければ、調整や時期の合意を取りやすかったと思います。

まとめ:大変

今回はアプリに絞って書きました。実際はサーバも移行しますし、関連作業の方が大変です。いやもう本当に。
しかし移行の仕組みが無かった頃よりは、選択肢が広がって有り難いことです。

アプリに関して言えば、情報さえあれば苦労しなかった面はあるので、本エントリを書きました。
もしもっと詳しい話を聞いてみたい方がいたら、 @wiroha までお声掛けください。
移行する人は少ないと思いますが、誰かの役に立てば幸いです。

 

付録

移行不可能な状態

Viewing and Changing Your App’s Status and Availabilityと突き合わせると下記の通り。
RejectedはOKで、Metadata RejectedはNGだと気付き面白い。

  • Waiting For Review
  • In Review
  • 契約の保留(Pending Contract)
  • 輸出コンプライアンス待ち(Waiting For Export Compliance)
  • Pending Developer Release
  • App Store用に処理中(Processing for App Store)
  • Appleのリリース待ち(Pending Apple Release)
  • Metadata Rejected
  • Removed From Sale
  • Developer Removed From Sale