パルカワ2

PerlとRubyとイチャラブ

ラム肉を焼いた

この記事はつくりおきAdvent Calendar 2019の21日目の記事です。

昨日は id:kazuhi_ra さんの 風邪おき(昼 / 夜) - #つくりおき でした。お大事に…。

クリスマスだしニワトリをまるごと一羽焼こうって話をしていたんですが、ここならなんでもあるでしょと高を括って訪れた肉屋に「今日はないですね」と言われてしまい買えなかったので、代わりにラム肉を買ってきました。次はちゃんと予約します。

f:id:hisaichi5518:20191216204208j:plain

こいつを焼きます。

f:id:hisaichi5518:20191216204330j:plain

塩とブラックペッパーをまぶしました。

f:id:hisaichi5518:20191216204345j:plain

ローズマリーとトマトを適当にのせます。適当に乗せただけなのにすでにうまそう

f:id:hisaichi5518:20191216204622j:plain

にんにくも乗せます。
今回は音楽を聴いて熟成したにんにくを使います。セレブが好きそう(ド偏見)

f:id:hisaichi5518:20191216205119j:plain

一粒がでかい。一玉500円。シンプルに高い。

f:id:hisaichi5518:20191216205532j:plain

オリーブオイルを適当にかけてオーブンにぶち込みます。
オリーブオイルソムリエに肉と相性のいいオリーブオイルをくださいと言ったら出てきたオリーブオイルを使いました。
初めてオリーブオイルを食べ比べたんですが、全然違って面白かった。速水もこみちがオリーブオイルを好きな理由もわかる。

f:id:hisaichi5518:20191216205616j:plain

焼けました。オーブンを開ける前からいい香りがしてテンションぶちあがる。

f:id:hisaichi5518:20191216205840j:plain

皿に乗せます。クレソンのナムルを製造して、パンも焼いて一緒に食べます。
食べた感想ですが、かなりうまい。ラム肉は柔らかくさっぱりしていて食べ終えると次の肉へとドンドン手が伸びる。骨から肉がペリペリと剥がれる感覚は心地良く病みつきになる。オリーブオイルとローズマリーによっていい香りが放たれており、クリスマスを感じることもできる。完全な成功。ありがとうございます。

とはいえ、すべて食べてしまい #つくりおき とは???という感じですが、つくりおきは人それぞれ、おかないのもまた #つくりおき なのだと思うことにしました。

明日は、 id:minemuracoffee さんです。「どうにかなる」いい言葉ですね。
お粗末さまでした。

material/dialog.dart を読む

flutter/dialog.dart at master · flutter/flutter · GitHub

結局角丸+paddingの設定+footerを設定できるようにしたかったので、 RoundedDialog というWidgetを自分で作った。

AlertDialogのボタン下のスペースが空いてしまう!

FlatButtonを使ってAlertDialogのアクションを表現したら、微妙にアクションの下スペースが広い。 debug printを表示するとわかりやすい。

f:id:hisaichi5518:20191210160658p:plainf:id:hisaichi5518:20191210160338p:plain

AlertDialog(
  ...,
  actions: <Widget>[
    FlatButton(
      child: const Text("OK"),
      onPressed: () => ok(context),
    ),
  ],
);

FlatButtonにスペースが含まれているからだった。 次のようにしたら思った通りの表示になった。

f:id:hisaichi5518:20191210160748p:plain f:id:hisaichi5518:20191210160439p:plain

FlatButton(
  materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
  child: const Text("OK"),
  onPressed: () => ok(context),
),

Flutter + Android Studioで Logcatタブが出ない

会社のPCでは出るけど、家のPCでは出ないのなんでって思ってたけど、設定してなかったみたい。

02:24    Frameworks Detected
            Android framework is detected.
            Configure

Event Logにこういうのが出ているので、Configureを押したら設定できる。

このあたりも確認した。

get_it を使っていたけどやめた

get_it | Dart Package を使っていたがやめた。

// 登録さえすば
GetIt.instance.registerSingleton<Logger>(Logger());

// どのクラスでもLoggerを参照できる
class HogeBloc {
  final Logger logger = GetIt.instance.get<Logger>();
}

便利なんだけど次の問題があると思った。

  • クラスがなんの型に依存しているのか外からわからない
  • GetIt の instance に依存することになり、テストでも依存する
    • BuildContext に依存したくないからモデルの中でProviderを利用していないのだけど、代わりにGetItのインスタンスに依存することになる
    • FlutterなどのPlatformには依存しないので考えすぎかも
  • provider と共存させる場合、どっちになにを置くか両方に必要なのか考える必要がある

今回の場合、providerも使っているので、providerで値を受け取って愚直にDIをすると解決する。Loggerを使う場所で全部自分でinjectしていくのは正直めんどいがそれは別の方法で解決するといいかなと思う。[どうやって?] providerも使っていると外から何に依存しているのかがわからないとは思うのだけど、それ以外のメリットが大きいので採用している。

Dart で簡単に data class を作りたい

Kotlinではdata classはこのように書ける。

data class User(val name: String, val age: Int)

これは、 ただのクラスではなくて equals() / hashCode() / toString() / copy() が実装されるクラスになる。 なので次のコードはtrueが返る。

User(name: "hisaichi5518", age: 1) == User(name: "hisaichi5518", age: 1) //=> true

Dartでこういうクラスを作ってみて、上記のような比較するとfalseが返ってしまう。

class Hoge {
  final String name;
  final Int age;
  Hoge({this.name, this.age})
}

これは equals が実装されていないからそうなる。つまりKotlinのようなdata classを作るには自前でequalsなどを実装する必要がある。 Dartリポジトリにもイシューとしてあがっている Add data classes · Issue #314 · dart-lang/language · GitHub

この問題を解決するライブラリは次のようなのがある。

これらのライブラリは, Dartのextensionを使わない方法で実装されている。 Dart 2.6から入ったextensionを使ったらもっとスマートな実装になるのでは?と思ったので調べてみたが、結論からいうと無理だった。

@immutable
class Hoge {
  final String name;
  final int age;
  Hoge({this.name, this.age});
}

// このextensionを自動生成してimportしてあげれば動くんじゃないかと考えた
extension HogeDataClass on Hoge {
  bool operator ==(Hoge other) {
    return other is Hoge && name == other.name && age == other.age;
  }

  ...
}

@immutableがついたクラスにextensionで ==toString() を実装すればいいと思ったのだけど、以下のような制限があると知った。

Extensions can’t declare members with the same name as a member declared by ‘Object’. Diagnostic messages | Dart

悲しい!

provider 3.2.0 にアップデートした

APIが4.0.0で変わるようで、builder を create/update に変えるだけで今の所良かった。直感的になって良い変更だなとおもう。

RFC Renaming the parameter ‘builder’ of providers · Issue #259 · rrousselGit/provider · GitHub

ついでに4.0.0-devにするかと思ってやってみたけど、MultiProvider で StreamProvider を使おうとするとエラーになるのでやめた。たぶんこれの影響 Simplify the integration of custom widgets with MultiProvider · Issue #237 · rrousselGit/provider · GitHub