2020-06-18 アトレティコ、オサスナに大勝

朝5時に起きて、ラ・リーガ第29節、オサスナアトレティコ・マドリードを見る。

アトレティコは29節時点で6位、残りは10節しかないので、CL圏に入るには確実に勝ち点3をおさえておきたい試合。 前節のビルバオ戦はボールがつながらなくて苦しい内容だったけど、今節はジョアン・フェリックスのダイナミックな動きのおかげでボールがうまくつながっていた。

前半、サウールのシュートのこぼれ球をフェリックスが押し込んで先制。これは見ていてスカッとするゴラッソだった。その後にジエゴ・コスタのお膳立ての横バスからごっちゃんゴールで2点目。多分、ドブレーテは今シーズンはじめてじゃないかな?コロナの中断から、一回り成長して帰ってきてくれたような気がする。

その後に、リバプール戦の勝利の立役者、マルコス・ジョレンテがドリブル突破で3点目。ここらへんからオサスナ厭戦ムードになって、その後にモラタ、カラスコがダメ押しでさらに点を入れた。

結果として、0-5で大勝。今シーズンで一番気持ちのいい勝ち方だった。この結果、暫定で4位に浮上。CL圏に戻ることができた。とはいっても、ヘタフェ、ソシエダと勝ち点の差はほとんどないので、まだまだ気は抜けない。でも、今日のような試合内容を継続していくことができるなら先行きは明るい気がする。

TEDをランダムで見る

教養を広げたい、というか、普段の生活では意識していないけど知っておいたほうがよさそうなことと触れる機会を増やすために TED をランダムで見はじめた。

ランダムトークというカテゴリがあって、https://www.tedxtokyo.com/talks?cat_id=120&lang=ja を開くとランダムでトークが表示される。大体、ひとつ、ふたつは気になるトークが表示されるが、なかったときはリロードする。

ひとつのトークの時間は15~20分くらいなので、朝のちょっとした時間や夜寝る前に見ることができる。集中して聞くためにタイトルから問いを立てたり、終わった後に Scrapbox に要約と感想を書くようにしている。

2020-05-24 オートミール

先週はずっと雨だったけど、土曜から天気が回復。洗濯物が溜まっていたので、洗って干す。

社長がオートミールを推していたのを先週、思い出して、試しに買ってみた。

食物繊維が豊富なのと低GIなのがポイント。朝にちょっとずつ食べている。一度に食べる量は50~80gが自分にはよさそう。以前、100gちょっとを食べようと思ったら途中でお腹いっぱいになってしまった。
食べ方としては、白米の代わりとして考えて、納豆、卵、キムチあたりと一緒に食べるのがおすすめ。最初、海外で食べてそうな牛乳と蜂蜜でいってみたんだけど、あんまり美味しくなかった。他にもお茶漬けとかおじやにするとおいしいという話も聞いたので今度試してみる。

2020-04-29 ゆっくり身体を休める

土日に疲れがうまく取れなくて倦怠感があったので、横になって、本を読んだり、映像を見たりして、身体を休めた。

ネタバレっぽいことを書くので注意してね!

攻殻機動隊 SAC_2045 があと3話くらい残っていたので、一気に見た。結局、3日くらいで全部見てしまった(頑張った日のご褒美というか、ちょっとずつ見ようと思っていたんだけど)。
面白かったんだけど、(昔のやつのほうがよかった、みたいなおじさんみたいなことはあまり言いたくないが)過去のシリーズと比べると物足りなさがあった。 過去のシリーズは、スタンドアローンエピソードはある時はヒューマンドラマや恋愛物、あるときはバチバチのアクションだったりとバラエティに富んでおり、見終わった後に得体のしれない恐怖や奇妙な満足に似た余韻を抱かせるものも多かった。コンプレックスエピソードは話が程よく難解だったり、伏線が散りばめられていて、何回見直しても新しい発見がある面白さがあった。それと比べると、今回のシリーズはCGをうまく活用したSFアクションというかんじだった。
ただ、最後のエピソードはこれまでのシリーズにあった得体のしれない恐怖を彷彿とさせるものがあったので、続編が楽しみ。

最近、音読している英語のテキスト集に「風と共に去りぬ」が入っていたので、話の内容をおさえておきたくて、NHKオンデマンドで100分de名著のを見た。この題材は講師の解説が異常に面白かった。物語、登場人物の関係の構造の可視化や、その時間的な変化を丁寧に説明しつつ、筆者の視点や執筆のプロセスにまで踏み込んでいた。カラマーゾフの兄弟も同じ感じだった気がする。

2020-04-07 昼下がりの気分転換

昼下がりは、人間、頭がぼーっとするようにできている。

最近は13時ごろに15分の昼寝をしている。寝る前にコーヒーを飲んで、起きるころにカフェインが効いて、シャキっと目が覚めるように工夫。在宅勤務のうれしいところは電気を消したり、服を着替えたり、昼寝のために環境を整えることができること。

昼寝をしても、ぼーっとしたり、なんか気分が乗らないなぁ、というときは10分間の休憩を入れて、英語の音読と筋トレをやっている。声を出したらやる気が出てくるみたいなのを何かの本で読んだんだけど、思い出せない... ただ大きい声を出すだけだと不審者なので、英語の勉強を兼ねて、英語の文章の音読をやっている。使っている教材はアルゴリズム音読というやつ。

1日10分で4技能が身につく アルゴリズム音読

1日10分で4技能が身につく アルゴリズム音読

筋トレもやる気につながるというのを何かの本で読んだのだけど、これも思い出せない... 筋トレはランニングのフォームの改善につなげるためにお尻と足の筋肉を鍛える以下のツイートのやつとワイドスクワットをやっている。

2020-04-06 ねぎま鍋と蕎麦

月に一度、ご褒美に外食で美味しいものを食べることを生きがいにしていたのだけど、新型コロナウィルスのせいでそれができなくなってしまった...
代わりに生産者を応援するのも兼ねて、週に一度、ちょっぴり高級なものを買ってなにか作ることにした。

先週の金曜は、ねぎま鍋を作った。ねぎま鍋は、江戸時代にマグロがたくさん獲れて、余って捨てられていたトロの部分を美味しく食べることができないか、という江戸庶民の知恵から生まれた。トロは今となっては高級食材だけども、脂っこいものが当時の人の舌に合わなかったり、保存が効かないという理由で捨てられるか、肥料になっていたらしい。
人間の味覚は時代と共に変わっていることを表すエピソードだなぁ...

ねぎま鍋の由来を鑑みると、もっと庶民的な(もはやマグロではない)カジキあたりで作ってみようかと思ったのだけど、そもそもの週に一度、高級なものを買って楽しもうという趣旨を貫いて、メバチマグロの赤身と本マグロの中トロのサクを買った。

作り方は簡単で、以下の通り。

  1. ネギをぶつ切りにして火で炙って焦げ目をつくる
  2. めんつゆ(ストレート)400mlに醤油 大さじ2と酒 大さじ2をいれて、中火にかける
  3. マグロを一口大に切る。脂が多い部分は火にかけると形が崩れやすいので、太めに切る
  4. つゆが沸騰してきたら、ネギとマグロ、あれば木綿豆腐をいれる
  5. ひと煮立ちさせたら、セリ、クレソンをいれる。この2つは火が通りやすいので、数十秒ぐらい火に通せばOK。火を通しすぎるとシャキシャキ感がなくなって美味しくなくなる

マグロの臭みが気になる場合は七味や山椒をかけるとよい。

ねぎま鍋の主役は実はマグロではなく、ネギだったりする。マグロの旨味が溶け込んだつゆを吸ったトロトロのネギが最高なんです。

〆にマグロと焦がしたネギの旨味が溶け込んだつゆで、蕎麦をやるのもおすすめ。
今回の〆は具が入ってないですが、適当な野菜を火で炙ったり酒煎りにして、つゆに浸して具にするとおいしいです。自分のオススメは、しめじとネギの白い部分のぶつ切り、あるいはしめじとピーマンの組み合わせ。冷蔵庫にある余った野菜で色々トライしてみるのも面白いと思います。
マグロの匂いが気になる場合は、刻んだ三つ葉を上からたっぷり載せて、三つ葉そばにするのもオススメです。

Dart あるいは Firebase Admin SDK のない言語でユーザー管理

Dart で Firebase Auth のユーザー情報を取得したり、ユーザーを削除したかったのだけど、Firebase Admin SDKDart では提供されていなくて困った。REST API の仕様も正式に公開されていない。

調べたら、Firebase Auth の認証機構は Google IdentityToolkit と統合されていて、IdentityToolkit の REST API を使うことで Firebase Admin SDK 相当の操作ができることがわかった。 IdentityToolkit のクライアントは googleapis のパッケージで提供されているので、それを利用すればOK。

ユーザー情報の取得

import 'package:googleapis/identitytoolkit/v3.dart';
import 'package:googleapis_auth/auth.dart';
import 'package:googleapis_auth/auth_io.dart';

void main() async {
    final credentials =
        ServiceAccountCredentials.fromJson("service_account.json の内容");
    final httpClient = await clientViaServiceAccount(
        credentials, ['https://www.googleapis.com/auth/identitytoolkit']);
    final identityToolkit = IdentitytoolkitApi(httpClient);
    final relyingParty = identityToolkit.relyingparty;
    final request = IdentitytoolkitRelyingpartyGetAccountInfoRequest()
      ..localId = ["UID"];
    final response = await relyingParty.getAccountInfo(request);
    print(response.users[0].name);
    print(response.users[0].email);
}

ユーザーの削除

import 'package:googleapis/identitytoolkit/v3.dart';
import 'package:googleapis_auth/auth.dart';
import 'package:googleapis_auth/auth_io.dart';

void main() async {
    final credentials = ServiceAccountCredentials.fromJson("service_account.json の内容");
    final httpClient = await clientViaServiceAccount(
        credentials, ['https://www.googleapis.com/auth/identitytoolkit']);
    final identityToolkit = IdentitytoolkitApi(httpClient);
    final relyingParty = identityToolkit.relyingparty;
    final request = IdentitytoolkitRelyingpartyDeleteAccountRequest()
      ..localId = "UID";
    await relyingParty.deleteAccount(request);
}