guntamania

各国のエンジニアの生活

[2019-09-20 Fri]

Youtube でエンジニア生活をアップロードしている動画がいくつかあって、 結構見ている。

それぞれの理想の生活を押し出しているようで面白い。

これなんかも。 ロボットのように生活している。 独身でリモートワークとかだと自分で生活のリズム作れるだろうから、 朝5時に起きる生活もなんとか実現できるのかもしれないけど。

これもいいな。 フィリピンはタギッグ。 エンジニアだと基本的にボーダレスなんで、世界各国の様子が見れていい。

ソフトウェアエンジニアの働き方は、場所や時間に縛られない自由を手に入れながら、どこかストイックな生活をするというイメージがあるっぽい。 これは日本でも共通の感覚なんじゃないかな。 国境や文化を越えて同じイメージを共有しているっていうのは面白い。

気になるのは、生活自体は動画用にある程度取り繕ってるとして (例えば掃除、洗濯全くしてないけど、そのあたりどうしてんの?)、 一日中コードを書いているということだ。

いくらプロフェッショナルなプログラマであり、日本と違ってジョブスクリプションによって自分の業務範囲がある程度明確化されているとしても、全く打合せとかインタラプションなく一日が終わるなんてことはないんじゃないかな。 彼らとて、もっと泥臭いやり取りをしていると思うんだけど。

気になった点はそれくらいか。あと、カメラ入れても平気な会社って大丈夫か?

Android DataBinding

[2019-09-24 Tue]

DataBinding をいじってたときに、 Spinnerとの双方向データバインディングってどうすんだ?って気になったので、メモ。

Android Simple Two Way Data Binging With Spinner Without BindingAdapter (Kotlin) | Lua Software Code

<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:selectedItemPosition="@={viewModel.spinnerPosition}"
/>

とする。@= で双方向バインディングだね。

で、ViewModel側はLiveData使うと便利。 値を読み書きしたいだけならこれで十分。

class SampleViewModel() : ViewModel() {
  val itemPosition = MutableLiveData<Int>()
}

最近(ここ1年くらい)DataBindingの勉強始めたので 歴史的なところに引っかかるとすぐわけがわからなくなるんだけど、 昔は BindingAdapter とやらを使って双方向バインディングを実装してたんだね。 そっちの記事ばっかりヒットして困ってた。

今は gradle いじって

android{
    :
    dataBinding {
        enabled = true
    }
    :
}

ってすればすぐに使えるんだから、便利だよね。

値の読書きだけだと上の記事で十分なんだけど、 スピナーは往々にしてリスナーをはりたいという時がある。 値の変更通知を受け取りたいときには

class SampleViewModel(
    private val app: Application
) : AndroidViewModel(app){
   :
   val spinnerPosition = MutableLiveData<Int>()
   :
   fun initViewModel() {
      spinnerPosition.observe(app as LifecycleOwner, Observer { pos -> /* do some awesome works */ })
   }
   :
}

ってやると良い。 ViewModel でなく、 AndroidViewModel を継承してやるのがポイント。

Blue Print での双方向バインディングの状況

[2019-09-27 Fri]

では、Blueprintのサンプルではどうなっているか。

android/architecture-samples | Github

過去には AndroidViewModel を使っていたみたいなんだけど、 今は削除されている。

xmlをのぞくと `onClick` を設定してコールバックをXMLから呼んでいるようだ。

<CheckBox
    android:id="@+id/task_detail_complete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:onClick="@{(view) -> listener.onCompleteChanged(view)}"
    android:checked="@{viewmodel.completed}" />

双方向バインディングでよくあるパターンとしては viewmodel.completedsubscribe したりするもんだけど、Androidだと LifeCycle に依存してしまうから、 こっちのほうが却ってシンプルにかけるのかもしれない。