くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

RecyclerView.ListAdapter でアイテム挿入後に何かしたい!非同期辛い!

RecyclerView を使って何かする時に ListAdapter を使ってますか? DIFFUtil を使うときに合わせて使うことが多いかなと思います。

問題点

submitList しても非同期で挿入されるため、 SubmitList() した直後にRecyclerView(Adapter) に対してあれこれすると古いリストに対して操作してしまう。

どのようなケースで問題になるのでしょうか?
具体的には以下にsubmitList した後に処理をするケースで問題になります。

// adpater は ListAdapter の実装クラス
adapter.submitList(emptyList())
// RecyclerView に適当な処理を加える
binding.RecyclerView.scrollToPosition(100)

Why?

SubmitList は内部で DIFFUtil を使い差分を計算する処理をバックグラウンドExecuter でしているからです。

そのため、submitList が発火した後に非同期的に差分計算をし、挿入したりしてます。

必ず挿入した後のリストに対して操作しなければいけない場合は?

コールバックを設定すれば大丈夫そうです。
ただ、もっとスッキリできる方法あるかも....

        adapter.registerAdapterDataObserver(object: RecyclerView.AdapterDataObserver(){
            override fun onItemRangeChanged(positionStart: Int, itemCount: Int) {
                super.onItemRangeChanged(positionStart, itemCount)
                // 変更されたのがコールバックされる
            }
        })

LiveData-Kotlin Extension を試してみた

基本的には、 Transformations の拡張関数の集合です。

implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.1.0-alpha04"
class MainActivityViewModel : ViewModel() {

    private val source1LiveData = Source1Livedata()

    // 同じものが流れてきたときにブロックしてくれる
    val distinctResult: LiveData<String> = source1LiveData.distinctUntilChanged()
    // 射影
    val mapResult: LiveData<String> = source1LiveData.map { it.toUpperCase() + it.toLowerCase() }
    // 新しいものが流れてきたら前のものを中止するマン
    val switchMapResult: LiveData<String> = source1LiveData.switchMap { name -> getFullName(name) }

    // このようなメソッドが必要かは置いておいてLiveData を返す関数の時に使うと良さそう
    fun getFullName(name: String): LiveData<FullName> {
        val liveData = MutableLiveData<String>()
        liveData.value = name + name
        return liveData
    }
}

// ちゃんとした型定義をすべき...
typealias FullName = String
class Source1Livedata : LiveData<String>()

TypeScript で コードの変更を検知して自動で Compile -> Unit Test までを実行する

TypeScript を書いてて Live Unit Testing みたいなのを やってみたいですよね。

Live Unit Testing とは、コードの変更を検知して即時に Unit Test を実行するものです。

さて、やっていきましょう

環境構築

  • typescript
  • mocha
    (- chai)

適当に TypeScript とか mocha とか tsc とかは使える前提でいきます。

tsc -w とかも試してみましたが、微妙にうまく動かないっぽいんで違うの使います。

npm install mocha @types/mocha 
npm install typescript watch -g

理想像

npm run-script co-build としたら継続的にファイル変更を検知してよしなにしてくれます。
npm run-script co-test としたら継続的に単体テストを実行して結果を表示してくれるようにします。

問題点

npm のパッケージの watch を使っているんだけど、ファイルサイズ制限あったりするので大きなプロジェクトでは辛そう(私は小規模なものしか書いてない

やり方

package.json 芸人するだけですん

わざわざ build と test を分けてるのは、純粋に一緒になってるとごちゃごちゃしてみにくいんですよね。
あと、Buildが動いてないのかな〜?とか気づきにくい

Scripts 配下に置く
    "co-build": "watch 'tsc' src/**/",
    "co-test": "mocha --recursive lib/**/*.js --watch 'lib/**/*.js' ",

20卒地方Fラン大のウェブ系就活記録

あなたは誰?

基本情報

  • くぅ寿司大好き
  • 地方にあるFラン私立情報系に通う3回生
  • パソコン大好き

中学生の頃からプログラミングが大好きで、高校生の時にPHPWindows Phone 向けアプリの開発に熱中、C#にハマりMicrosoft信者に、大学生の時にXamarinのイベントを名古屋で開催したり技術書展で合同技術同人誌を販売した実績を表彰され2年生の時に日本で256人ぐらいしかいない「Microsoft MVP」を受賞、その後は、既存領域にこだわらずAndroidアプリ開発を中心に活動。最近はDDDや設計などのプラットフォームによらない技術に興味津々。

就活の状況は?

就活自体はほとんど終了しており、最終面接が残っている企業がいくつかありますが、どの企業が一番自分あってそうかを見極める段階です。
働く場所としては六本木から渋谷あたりになりそうな気がしてます。

企業的には、Web系とか言われる企業を受けており、Androidアプリエンジニアとしてのポジションを狙ってる感じです。
DroidKaigi と呼ばれるAndroidについてのカンファレンスのスポンサーをしている企業を中心に選考受けてる感じですね。

カンファレンスのスポンサー?

特定の技術領域のカンファレンスのスポンサーをしている企業は以下のような特徴があると考えてます。

  • その技術を持っている人を雇用しようと考えている
  • スポンサーをするぐらいにイケイケでお金に余裕がある(実際これは重要で余裕がないと色々大変
  • アウトプットに対して肯定的な企業が多そう

就活はいつぐらいに終えるの?

どんなに早くとも内定承諾するのは6月以降になりそうです。
理由としては、働く企業を決める前にインターンシップ等をして会社の雰囲気を掴んでからにしたいためです。
(この考えの人は周りによくいるので戦略としてはあってそう

なんのために書くの?

記録を残すため

記録に残すことで自分の中でのお気持ちが整理できるかなと考えています。

対象読者

  • 地方に住んでいる学生
  • ウェブ系企業で働きたいと考えている学生
  • 心理的安全が確保された会社で開発していきたい人

Give and take

ウェブ系企業での就活についての情報はリアルの周りの人や大学のOB・OGからは一切知ることができませんでした。
そのため、Twitterをはじめとするインターネットより取得していきました。恩返しです!!!

東京で就活を進める理由

情報量と機会

高校生の時にインターンシップしてた企業の人に連れられ日本マイクロソフトで開催された勉強会に初めて参加したのですが、参加者の多様性と刺激の多さに感動しました。

実際、東京に色々いる中で情報量の格差と機会の量の差はかなりのものだと思っています。

インターネットの発達より情報格差は減少傾向にあるかと一般的には思われますが、まだまだリアルコミュニケーションには勝てないと感じています。

機会の格差

東京ですと大規模カンファレンスがよく開催されていたり、勉強会がよく開催されています!(最近だと名古屋では絶対に見ない Kotlin にフォーカスした勉強会が開催されているようで感動した

重要なのはそれだけではないと考えています。
一応、転職者向けサービスやGitHubのアカウントを登録できるサービスに登録しています。
登録しているとやはりスカウトなどが飛んでくるのですが、私が東京に住んでいないとわかると「東京に引っ越してきたときは連絡ください〜」のような感じで断れてしまうことが多々あり将来的につらさになりそうと考えています。(とはいえ、交通費を出してくれる企業からは選考に進んだりしました。

お給料とお仕事内容

お給料についても大事だと考えています。

愛知県の場合車のT社や刈谷の会社など大手企業などはかなり給与水準が高かったりしますが、「新卒でIT企業」と考えた時に東京と比べて10~15ぐらい額面で違う気がしてます。(全ての企業がそうではなく、名古屋でもかなり出す企業があります。

「自社サービス系で新卒を大体的に募集している企業」と限ってしまうとほとんどが東京で福岡と京都にちらほら。ぐらいが適切な感覚ではないのかなと。

多様な人間がいる。自分に合う人が見つかる

地元ですと、どうしても同じ中学の人で固まるようないわゆる固定的な人が多いです。別に悪い人ではないと思ってますし、いい人たちばかりですが、私はその中でも変わった考えをしている人なのかなと思います。

しかし、東京など人が多いところに出てくると似た考えの人が見つかったりするので非常に良い。

しがらみがないうちに色々な場所で住んでみたい

長期間住んでいて色々なしがらみが出てきてしまうと色々な方面で制約が出てきてしまいます。

そんなのが出てきてしまう前に色々な自由に行動したい。

両方経験してみたい

地方と都会、両方経験してみたいってのが実情w

片方しか知らないのにもう片方をディスるおじさんにはなりたくない🙅‍♂️

情報収拾源について

Twitter 就活

基本的にはTwitterを使い就活しています。
Twitter就活は周りの人は割としていてお気軽で良さそう。

Twitter就活のメリット

具体的には以下のような事象がありました

  • 選考受けませんか?と誘われる
  • 先ずはランチに〜と誘われる
  • Twitterで繋がっている人と面接や遊びに行った時に出会う

いつも通りTwitterで技術についてのアウトプットをしているとそれが就活に直結する。

フォロワーさんと絡んでると就活で役立つ(役立つという言い方もおかしいですが、うーん🤔

中途採用募集

中途採用の募集って割といいと感じててその企業がどの技術について詳しい人が足りてないか、そもそもポジションが存在するのかをチェックすることができます。

また、その会社の給与レンジも確認することができるので夢を見ることができる or 現実を知れる

色々みてくとモバイルアプリエンジニアはかなり足りてなさそうなので穴場かもしれない(それを理由にモバイルアプリ作り始めるの辛そうだけど。。。

就活をする上で知っておきたかったこと

ブラック企業は意外に少ない

地元に住んでいる周りの大人たちは「IT企業はブラックで労働時間は長いし給料も安い」と言ってました。

実際に色々な企業を見ているとそんなことはなく幸せな企業がたくさんありました。いい世界だ。

具体的には以下のような感じで自由にやれる会社が多い

  • 楽しく心理的安全が確保された状態で働くことできる
  • 800万円とまでは行かないが日本人の平均年収を超える給料を貰える
  • 自分のなりたいキャリアを実現できそうか面接で相談できる
  • 同期にイケてる人が多い
  • Twitter等を使いアウトプットしている人が多い
  • フレックス勤務ができる(朝弱い人間)
  • 好きなキーボード・ヘッドホンを使って開発をすることができる

対象の会社で働きやすい技術領域を選択する

どんな感じのエンジニアになりたいんだっけ?ってのを最初に決めて、それに必要な能力ってどんなものだろ?ってのをある程度意識しておきたかった感が...(つよつよな人は別ですよ...

現実的にIT企業ではかなりの即戦力性を求められます。そのため技術的なミスマッチがあると... (辛い...

就活を楽に進めるためにしたこと

逆求人サービスを使う

逆求人とは、1日で大量の企業について知れるイベントです。ネットとかでいちいちググるのは面倒なのでこういうのを便利に利用すると良さそう。
このイベントでは、学生が企業の人事の人に対して自己紹介とかするだけでインターンシップの特別選考ルートに乗れたりします。実際私も逆求人経由で夏に4社のインターンシップに参加することができた感じ。良さそう。

まだ就活な時期じゃない人も、今のうちに登録しておくと空気感とかを感じとれるので良さそう。

地方に住んでても、交通費を出してくれるので心理的安全を得ることができる!!!!

登録すると特別にお金が貰えたり私が推薦できるようにフォームを用意したのでぜひ登録してみてください!

サポーターズ

DeNA, mercari, サイバーエージェント, Yahoo! を筆頭にメガベンチャー系に強い逆求人。
このフォームから登録すると1000円お互い貰えるのでオススメ!

talent.supporterz.jp

キャリアセレクト

メンターっぽい人にめちゃ優しく色々サポートしてもらえる!

cookpad, rakuten とかに出会える!

良さそうな人いたら紹介して〜って言われてるので機会を掴みたい人はフォームから送ってくれると推薦する!!(twitterアカウントがあると何してる人かわかるので嬉しい!

forms.gle

逆求人 by ジースタイラス

幅広い企業と接触できる逆求人を開催している企業

以下のURLから登録するとお互い3000円もらえるのでぜひ登録してみて!!(新しいモバイルバッテリーとか買っちゃいましょ!!

www.studenthunting.com

どの企業が一番いいの?

それぞれの逆求人を利用して出会える企業は違っているため全てに登録すべきだと思います!(あなたがつよつよなら別ですよ!私は全てを利用してましたw

就活で良さそうな振る舞いをしていた企業

この会社良さそうとかよりは就活のプロセスの中で良さそうなことをしている会社について書いていきます。

mercari

メルカリ社員とのランチを組んでいただき社員の方から話を聞けたことで面接を受ける前に会社の雰囲気を知ることができてほんとよかった

多分、この採用会食ってやつ

https://news.careerconnection.jp/?p=22472

内定もらった後に詳細なフィードバックもらえて他人から見た自分を知ることができてすごくよかった。

CA

地方の学生向けに採用イベントを開いてくれて、しかも交通費も支給されるから良さそう。って思いました。
みねさんのTwitterをフォローして情報を継続的に取得してると良さそう。

Yahoo!

選考の中で 1on1 が組まれて心理的安全が確保された状態で色々聞くことができてかなりよかった。

これですね。

https://www.onecareer.jp/companies/67/experiences/2019/196/73468

任天堂

任天堂インターンシップはほんとよかった。インターネットに書けないけど、UXが非常によかったのでぜひ...!

最後に

  • 地方に住んでいると満足のいく就活ができない
  • Fラン大学に通っていると学歴フィルターにかかってそもそもESで落とされる

とかよく言われますし書こうかなと思いましたが、自分自身きちんと対策をしていけばそこまで問題にはならなかったので良さそう。

何か困ったことがあればお助けできることはするので連絡待ってます〜 https://twitter.com/Fumiya_Kume

よろしかったらぜひ!

Amzon

https://www.amazon.jp/hz/wishlist/ls/3JRB0NZGII6Z?ref_=wl_share

Kyash

f:id:kuxumarin:20190327153101j:plain

kyash://qr/u/8925480749756694859

質問があればぜひ〜

くぅ はとの補集合の質問箱です | Peing -質問箱-

Android Architecture Components 勉強会 #5 に参加してきた。

せっかく東京にいるので、ということで AAC の勉強会に参加してきました。

Google で開催されてました。
GDE な人がたくさんいており技術難易度も結構高めだった気がします。

感想

めちゃめちゃ勉強になりました。

AAC は普段使っていてノリで色々しているので細かく確認できてよかったです。

また、ynzm さんの解説も大変わかりやすく非常によかった(語彙力

課題16 RandomLoadLiveData の実装について

最後に頑張ったら少しできたのでコードを公開してみます。

※まだの人はみない方が良さそう

speakerdeck.com

f:id:kuxumarin:20190325234116p:plain

import androidx.lifecycle.LiveData
import kotlin.random.Random

internal class RandomLoadLiveData : LiveData<Status<Long>>() {

    private var isLoad = false

    override fun onActive() {
        super.onActive()

        if (value == null || value is Status.Error) {
            load()
        }
    }

    fun load() {
        isLoad = true
        Thread.sleep(1000)
        if (Random.nextBoolean()) {
            value = Status.Success(System.currentTimeMillis())
        } else {
            value = Status.Error(Exception())
        }
        isLoad = false
    }

    fun reload() {
        if (!isLoad) {
            load()
        }
    }
}

最後に

4,5,6月は東京にいる気がするので次回も参加してみたい✨

Power Assert を TypeScript で書いてる時に has no default export って言われる件について。

Type Script よくわからないのでとりあえず解決方法だけ書く。

npm install hoge~

は済んでる前提。

以下のコードの時にダメって言われた。

import assert from 'power-assert'

動くコード

import * as  assert from 'power-assert'

Azure Functions を NodeJS で動かす時には NodeJS のバージョンを8 or 10 にしなければいけない

NodeJS の LTS は 6,8,10 がリリースされています。 f:id:kuxumarin:20190319165300p:plain

nodejs.org

Azure Functions は開発ポリシーでLTS しかサポートされないそうです。

github.com

解決策

NodeJS のバージョンをNVM とかで切り替えれば良さそうですね。