heihei blog

Blog icon by Unsplash https://unsplash.com/@virussinside

2019年4月を振り返る

( ;゚Д゚)ナ、ナンダッテー!!(゚Д゚;(゚Д゚; )

GWも残りあと数日...!それでは4月を振り返ります。

真新しいことが多かった

4月になり、いろいろなものが真新しくなったのですが、一番変わったといえばオフィスが変わったことでした。

新オフィスになり、新しい建物の匂いがすごくしたり、オフィスの中の景色が変わったりといろいろと新しかったです。GW明けから社食なるものが本格的に開始するのでそれも個人的には楽しみです。

他にももちろん人の異動だったり新しいメンバーがジョインしたり、新しいことだらけでした。(新しいしか言っていない気がする)

夜のチェアリングをした

会社の上司の方に誘っていただき、初チェアリングを体験しました@代々木公園。仕事の話はもちろん、プライベートの話などいろいろ話ができて楽しかったです。そして、これがりんちゃん(ゆるキャン)がみてた景色かーとそわそわしました。

f:id:shaunkawano:20190503185247j:plain

f:id:shaunkawano:20190503185257j:plain

社会人バスケを見に行った

GW中、久しぶりにあって軽く茶をしばいた高校時代の友人から、「これから試合あるんだけど見に来ない?」と言われ急遽いくことに。@品川

あたりまえだけど高校時代のバスケとは全然違って迫力ありました。

f:id:shaunkawano:20190503185324j:plain

振り返りのために写真を見返したら思っていた以上にご飯の写真が多かった。。汗

そして最近インプット・アウトプット含めあまりブログに書けるほどできていないことに反省。GWリフレッシュできたので、気持ちリセットで、少しずつでもまたやっていきます。

以上です、4月もお疲れ様でした!

「人事と採用のセオリー」を読んだ

会社の先輩が「面白そう」と言っていたのを思い出して買って読んでみました。さくっと読み終えての印象とハイライトを3つほど紹介します。

内容

内容としては、採用難・人手不足(人口減少)という大きな今の時代の背景がある中で、どのように人事と採用を行っていくことで企業は生き残れるのか、リクルートの実例など交えて効果的な手法や考え方を紹介する、というようなものでした。

こういうときにはこうするほうが効果的である、というようなAに対してはBを、というパターン付けのような書き方が多かった印象ですが、本書のあとがきに

普遍的・体型的な人事と採用の考え方をまとめたい

とあるとおり、主に人事と採用の「考え方」に重きをおいた本だと感じました。

こんな人におすすめ

もしかしたら長年人事や採用を担当されている方からすると既知の内容も多少はあるかもしれないですが、現在人事や採用担当の方、人事や採用に関わる社員の方や、これからそのようなポジションになる方などで興味がある方はぜひ読んでみると良いかもと思いました。また、最後のほうにある海外出身人材の採用などの話も個人的には面白かったです。

最後に、ハイライトした文章の中から特に印象的だったものを3つあげて締めます。

ハイライト3つ

事業戦略に合わせて組織のあり方も変化させなくてはなりません。しかし難しいのは、組織には「慣性」が存在するため、変化が容易ではないことです。

制度だけ導入しても、制度を活かすベースがなければ効果は出ません。ベースを構築する上で最も重要なのが、「誰が」「何を」「どのように」のうちの「誰が」の部分

一般に「組織が環境変化に対応するには、外部環境と同等の多様性を組織内に作る必要がある」と言われます。

2019年3月を振り返る

ヮ(゚д゚)ォ!

それでは4月も半ばになってしまいましたが、3月を振り返ります。

一瞬で過ぎた

目の前のことをこなしていたらいっぱいいっぱいになり、それだけで一瞬で一ヶ月が過ぎ去ったというような感じでした。バタバタしてしまったので、反省するところは反省して、しっかり前進できるように切り替える。とりあえずGWはリフレッシュする予定。

花見した

小田急線沿いのとあるところに行った。きれいだった〜。桜見るとやはり日本最高!となる。

f:id:shaunkawano:20190416005551p:plain

その他

  • ディズニーシー行った

何年ぶりかわからないくらいぶりに。夕方から行ってさくさくっとアトラクションいくつか楽しんで(タートルトークとか)、ご飯食べて帰った。楽しかった!

  • 「バジュランギおじさんと、小さな迷子」を観た

結構感動した。日本との文化の違いとかもあからさまで、面白かった。

www.youtube.com

以上です、3月もお疲れ様でした!

ReycyclerView:setLayoutFrozen/isLayoutFrozen

f:id:shaunkawano:20190414191718p:plain

setLayoutFrozen/isLayoutFrozenという(面白い名前の)APIを見つけたのでメモ程度に紹介です。

業務でCoordinatorLayout + RecyclerViewを用いた画面を実装中に見つけました。画面起動をすると、RecyclerViewが意図せず微妙にスクロールしてしまうという問題があり、原因などが掴みきれず、どのように修正するか、暫定対応含めいろいろ方法そ漁っていたときに見つけたプロパティです。(根本原因はまだ分かっていないです。もし知っている方などいたら教えていただけると嬉しいです🙏)

※そもそも自分の場合のような、意図しないスクロールが走るからといってレイアウトを凍結させるようなことをするのは本質的ではないのですが、ユーザーのタッチイベントによるレイアウト処理やスクロール処理をどうしても制限したい場合があれば、もしかしたらこのAPIが使えるかもしれません。

なお、この記事で参照されているRecyclerViewのソースコードのバージョンはandroidx.recyclerview:recyclerview:1.0.0です。

mLayoutFrozen

RecyclerViewクラスの内部には、

boolean mLayoutFrozen;

上記のようにフィールドが定義されており、このmLayoutFrozenのtrue/falseを切り替えるのがsetLayoutFrozen APIです。mLayoutFrozenはRecyclerViewのpublicなAPIや内部ロジックなど、様々な箇所で参照されています。たとえば、RecyclerViewには特定の位置へとスクロールするためのscrollToPositionというAPIがありますが、この関数の内部でも、mLayoutFrozenが参照されています。

public void scrollToPosition(int position) {
  if (mLayoutFrozen) {
    return;
  }
  ... 
}

上記では、mLayotuFrozenの値がtrueの場合はスクロール処理など何もせずにreturnするというガード句が記述されています。このように、setLayoutFrozenのAPIを用いてこのプロパティの値を切り替えることで、RecyclerView内部で本来発生するレイアウト処理やスクロール処理を制御できます。

setLayoutFrozen(true / false)

名前の通りレイアウトを凍結させるかどうかを指定するAPIです。trueで凍結しfalseで凍結を解除します。凍結すると、RecyclerViewのレイアウト処理やスクロールを解凍するまで発生させないように設定できます。

この関数はRecyclerViewがレイアウトを更新している最中やスクロールの最中には呼び出しできません。setLayoutFrozen関数の内部では、まずRecyclerViewが現在レイアウト処理またはスクロール処理を行っている最中かどうかを判定し、もし何らかの処理を行っている最中であればIllegalStateExceptionが投げられるような実装になっています。ちゃんとした理由はわかっていませんが、きっと描画処理の途中で動きを止めてしまうことで予期せぬ描画だったり挙動が発生しやすくなるからではないかと予想しています。

もしレイアウトを解凍する場合、

  • mLayoutFrozenの値をfalseにしrequestLayoutを必要に応じて呼び出します。

もしレイアウトを凍結する場合、

  • 空のタッチイベントをonTouchEventに送り、
  • mLayoutFrozenの値をtrueにし、
  • スクロール処理を終了させています。

以下、該当するsetLayoutFrozenのコードです。

public void setLayoutFrozen(boolean frozen) {
  if (frozen != mLayoutFrozen) {
    assertNotInLayoutOrScroll("Do not setLayoutFrozen in layout or scroll");
      if (!frozen) {
        mLayoutFrozen = false;
          if (mLayoutWasDefered && mLayout != null && mAdapter != null) {
            requestLayout();
          }
            mLayoutWasDefered = false;
          } else {
            final long now = SystemClock.uptimeMillis();
            MotionEvent cancelEvent = MotionEvent.obtain(
                now, now, MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
            onTouchEvent(cancelEvent);
            mLayoutFrozen = true;
            mIgnoreMotionEventTillDown = true;
            stopScroll();
          }
      }
  }
}

isLayoutFrozen

isLayoutFrozenは純粋にmLayoutFrozenフィールドを返すだけです。

public boolean isLayoutFrozen() {
  return mLayoutFrozen;
}

ちなみに

自分の困っていた勝手にスクロールしちゃう問題は、周りのAndoridメンバーのアイディアでRecyclerViewのdescendantFocusabilityFOCUS_BLOCK_DESCENDANTSに設定することで不要なフォーカスが当たらないようにして解消しました。(satoshun氏ありがとうございます🙏)

setLayoutFrozenを用いるよりも健全な対応策かと思います。

https://developer.android.com/reference/android/view/ViewGroup#setDescendantFocusability(int)

まとめ

  • RecyclerViewにはsetLayoutFrozenというAPIがあり、これによりRecyclerViewを「凍結」し、RecyclerViewのレイアウト処理やスクロールを「解凍」するまで発生させないように設定できる。
  • setLayoutFrozenはレイアウト処理やスクロール処理を行っている最中の呼び出しはできないように制限されている。
  • RecyclerView内部ではmLayoutFrozenというフィールドが定義されておりRecyclerView内部の様々な場所から参照されている

知らないAPIに出くわしたときはどんな形でもいいのでメモにして忘れないようにしていきたい。。

以上です!

2019年2月を振り返る

2019年も約20%が終わったとのことです。驚愕・゚・(*ノДノ)・゚・

それでは2月を振り返ります。

DroidKaigiに参加した

DroidKaigiについてはこちらの記事で振り返りをしました。昨年に引き続き、今年も登壇することができたのは嬉しかったです。今年は技術的というよりはエモ的なところに振り切ったので、来年のCFPはより技術的な内容に振り切ったものにしたいです。

Android Weekenedを開催した

2月もAndroidWeekendを開催しました。本当に少しずつではあるのですが、参加人数も増えてきてはいるので、この調子で続けていきたい所存。(英語を話す練習をしたい人、ぜひ!)

次回は、4月中を予定しています。@渋谷の新オフィス

下記は、Android WeekendでNavigation Componentについて発表しているEoinさん。

f:id:shaunkawano:20190312233022p:plain

懇親会の様子。

f:id:shaunkawano:20190312233028p:plain

twitter.com

CyberAgent Android Beerbash!のLTとFireSide Chatに参加した

cyberagent.connpass.com

LTと、Fireside Chatということで、DroidKaigiに関わった弊社メンバーとゆるく話すようなセッションにて話しました。今のチームの話とか、Google I/Oの話とか評価の話とかDroidKaigiの話とかとか。

懇親会は特に盛り上がり、11時過ぎとかまで会場でみんなで立ち話をしたりしてわいわいと楽しめたのが良かったです。弊社に興味のある方はぜひTwitterのDMでも何でも良いのでご一報ください。

その他

フレンチトーストづくりにハマってきた

そのまま。同居人がパンなどを食べるのが好きということで、自分もはちみつやらメイプルシロップが好きなので作り始めたのがきっかけで、極めようという気持ちになりつつあります。

合計3回目。ちょとずつ慣れてきた。

f:id:shaunkawano:20190312233025p:plain

東京タワーを階段で登ってきた

同じくそのまま。めちゃめちゃ疲れましたが、爽快感ありました。

約600段ありますが、15分程度で、ところどころ登る最中にクイズパネルなどが設置されていて足を止めて考えたりして楽しみながら登れます。まだ試したことない人はぜひ。

f:id:shaunkawano:20190312233018p:plain

以上です、2月もお疲れ様でした!!

Robolectric 4.2の変更点とアップデートできずに詰まっている点について

f:id:shaunkawano:20190312231526p:plain

Robolectricとは

RobolectricとはAndroidのためのオープンソースユニットテストフレームワークです。レミュレータや実機を起動してテストを実行せずとも、JVM内の擬似的Android環境上でテストを実行することで、テスト実行時にActivityなどのAndroidプラットフォームのクラスを利用・テストできます。

github.com

Robolectric 4.2

一ヶ月弱前に、最新バージョンとして4.2がリリースされました。

※詳しくはrobolectricのreleaseページを御覧ください。

今回のリリース含め、DeprecatedになったAPI一覧はこちらです:

robolectric.org

バイス上での実行時と挙動を同じにする

Robolectric 4.2からは、Robolectricテスト実行時の挙動とデバイス上でテストを実行した時の挙動を統一するような変更が行われています。

具体的には、今までRobolectricを使ってActivityを起動するようなテストやContextを用いたテストを実行するためにActivityを起動する際のテストを記述する際には、下記のようにしていました。

val scenario = ActivityScenario.launch(FragmentActivity::class.java)
...

scenario.onActivity {
  ... // assert some text with activity as `it`
}

今回の変更から、Robolectricを用いたテストではこのようなActivit起動の指定の仕方はNPEで落ちるというような挙動となっています。そしてこれは、Robolectric側の意図した挙動となっています。

どういうことかというと、今まで上記のような指定でActivity起動をしていた際には、Robolectricでは暗黙的かつ自動的にAndroidManifestのエントリーを作成しテストが実行できるように制御してくれていたのですが、それはRobolectric独自の挙動でありデバイス上での実行時と挙動が異なるものであったため、バージョン4.2からは自動でそのような自動生成だったり独自制御をせず、基本的にはAndroidFrameworkの挙動に準拠するようになった、ということになります。

バイス上での実行と仮想環境での実行を統一するという流れは理にかなっているかと思います。

なので今後RobolectricでActivitを用いたテストを実行する際には、実際のAndroidManifest.xmlにテストで利用するActivityを定義しておいて、それをテスト時に参照する、ということが必要となります。

未解決の課題

ただ、執筆時点では、最新バージョンに上げるためには、まだ課題が残っています。どういう課題かというと、現状のAndroid Gradle Pluginの課題(もしくはRobolectric側で解決できる課題?)として、testImplementationで指定したモジュール内のAndroidManifest.xmlをマージしてくれないというものです。

https://issuetracker.google.com/issues/127986458

この解決策として、Robolectricのレポジトリのissueには、テスト専用のモジュール(たとえばtestsupportモジュール)をプロジェクト内で定義した場合には、そのモジュールをapp/build.gradle側でimplementationしつつ、testsupport/build.gradleではimplementation project(':app')することで暫定対応できるとの紹介がされています。

github.com

ただ、素直にこの解決策をサンプルレポジトリを作って試してみたのですが、自分ではうまく解決できなかったため、今のところアップデートできずに詰まっているという状態です。

具体的にどういう実装になっているかご覧になりたい方は下記をご覧ください。

github.com

自分の指定の方法が間違っている、勘違いしている箇所がある、ということはかなりありえるので、なにか気づいたことなどあればコメントなどでご教授いただけると幸いです🙏

アップデートに成功した際には、下に追記していく形でこの記事を更新していく所存です。

以上、詰まってアップデートできていない、という話でした。

2019年1月を振り返る

あっという間に1月が終わりましたね(゚∀゚)キタコレ 執筆時点では、なんと2019年、90%を切りました [壁]ョ゚ω゚;)))ガクブル

それでは1月を振り返ります。

年明けからの初詣

f:id:shaunkawano:20190304003655p:plain

代々木八幡宮へ。

f:id:shaunkawano:20190304003658p:plain

中吉。去年は小吉だったと思うので、良き。

実家帰省

タイミングずらしたほうが飛行機代が安いので、年が明けて少し経ってから実家に一時帰省ました。

f:id:shaunkawano:20190304003701p:plain

写真は阿蘇神社内にて。

Matching Dev Meetup#2 - ServerSide開催

f:id:shaunkawano:20190304003703p:plain

写真はMatching Dev Meetup会場のEureka, Inc.にて。

弊社からはSREチームのエンジニアのるいさんと、エンジニアリングマネージャーの河野さんが登壇しました!次回もまた別テーマで開催予定なので乞うご期待・・!もうすぐconnpassページ公開かも?

その他

I Feel Prettyを観た

自分の体型が気になる女性が頭を打ったことで自分が理想の見た目を手に入れたと錯覚し(実際の見た目は何も変わっていない)、それがきっかけで他の人との接し方や環境が変わっていく、という物語でした。

www.youtube.com

どんなに自分が羨む人や自信たっぷりに見える人でも、きっと不安なことがあるだろうし、みんな自尊心を持っているわけではない。自信がなかったり自分のことを褒めれない人は、自分の考え方をちょっと変えれば、もしかしたら自信が少しずつでも生まれてくるかも、ということが伝わりました。

あとボヘミアン・ラプソディも観ました。映画館で見てよかった映画でした!

文喫に行った

六本木にある「文喫」という本屋さんに行ってきました。

bunkitsu.jp

一回1500円でWi-Fi / 電源 / ロッカーがあり、コーヒーなどは飲み放題です。本持たくさんおいてありもちろん手にとったり席で読み漁るのも自由なので、1500円は少し高いかなと思いましたが、お金を払ったのでちゃんと読まねばという気持ちになり、一気に読み切るのが苦手な自分ですが、その場で一冊読み終えることができました。

イーロン・マスク完全に理解した。

f:id:shaunkawano:20190304003708p:plain

こんな感じで本がずらっとあります。

f:id:shaunkawano:20190304003711p:plain

作業スペースやゴロンとしながら本を読めるスペースもあり、よさそうでした。

月2くらいで来たいな〜というくらい集中できる場所でした。

あとは27歳になったり、ひたすらDroidKaigiの資料作りについて考えていました。

点での振り返りが多いですが、1月はこのような形でした。 雑だな💩

1月もお疲れ様でした!!