@kyanny's blog

My thoughts, my life. Views/opinions are my own.

マージン・コール

リーマンショックの話(フィクション)。淡々と重暗くて良かった。

徹底的に「組織」が描かれていて、力関係が透けて見えるやりとりなどにリアリティを感じた。

リストラされたおっさんの上司役が自転車ロードレース選手のクリス・フルームに似た顔だったが、それを悪役顔にした感じで、殺し屋のような雰囲気があった。厭世的な言動も目立ち(そういう役割を与えられた役柄なのだろう)、それがまた味があってよかった。

あと、「メンタリスト」の人も出演してて、やはりいけすかないキザ男という感じで似合っていた。

ラストシーンからのエンドロールの「音」の演出も印象的でよかった。

Grammarly Premium

f:id:a666666:20201128031610p:plain

ちょくちょく使っている Grammarly から Black Friday 当日限定でプレミアムプランが 55% オフ、というメールが来た。 Annual Plan だと年額 $139.95 のところ $62.97 で済む。ここまで値引きされてたら十分安いと判断してアップグレードした。 PayPal で払えた。

最近アップグレードしようかなと思ったことが何度かあったが、サインアップ直後は 40% オフだか 60% オフとか、なにのタイミングか忘れたが期間限定で 35% オフとか、ちょくちょく値引きをしてる印象があり、いずれまた大きな値引きがあったときを狙おうと思っていた矢先だった。

調べてみると最大 65% オフのオファーが来るタイミングもあるらしいが、まぁ半額以下なら十分。待ってる間にプレミアム機能を使えず学べない機会損失の方がトータルで損だろう。

サブスクリプションなので一年後は値引きなしの値段で更新になる。更新せずフリープランに戻って使い続けてるとまた値引きのオファーがくるのでそのタイミングで再びプレミアムに、というのが賢い?利用方法のようだ。

Grammarly はブラウザ拡張がとにかく素晴らしい。だいたいほとんどのサイトのテキストエリアで勝手に英文添削してくれるので、わざわざ使うために何かする必要がなく、従って使うのを忘れたり面倒くさくて使わないということがない。まれに有効にならないサイトもあるが、デスクトップアプリもあるのでそちらで添削できる。長い文章をじっくり書く場合もデスクトップアプリが適している。

iPhone アプリもインストールしていて、 iPhone で英文を書くときもキーボを切り替えて使っている。ただし、 iPhone デフォルトの英語キーボードとは typo 自動修正の挙動が違っていて、標準キーボードの方がさくさく書ける感じもするので、両方有効にして使い分けている。

欲を言えば VS Code や JetBrains 製品でも使えると、 Git のコミットログメッセージやコメントを書くとき添削されて便利なのだが。探したらプラグインあったりしないかな。

プレミアムならではの、文章の印象を判定して改善を提案する機能だとか、他にもいろいろあるやつを通して英語表現を学び英作文スキルを上げたい。学習目的。ビジネスに役立てる、みたいなのはまぁ。機会があれば。

Amazon ブラックフライデーで買ったもの

セブンイレブンで売り始めてから存在を知り、「セブンイレブンで高い買い物してみたい」と思っているうちにブラックフライデーで安くなると知ったので満を持して買った。 AirPods Pro も欲しいしノイズキャンセリングのためにいずれ買いそうなのでかぶるけど、まぁ安いし、手頃な値段のガジェットを久しく買ってなかったので。

VR ゴーグル(スマホをくくりつける簡易版)は一つ二つ買ったことはあって、しかし暇つぶしに使うには仰々しく準備も面倒くさくてろくに使わなかった。何かの拍子にこれをネットで見つけて、こういうタイプなら気軽に使えそうと思って気になっていたので、セール対象ではなかったけど買った。360度カメラを一度は使ってみたいと思っていて(まだ持ってないけど)、機運を高めるためにもまずはどんな風にみえるものなのか見たりするのをもう少し気楽に試したい。というのの布石の意味も込めて、まぁかなり安いしオモチャとして買った。

せっかくのセールだから何か他にもついでに勢いで買いたいものはないかなと眺めていて、そういえばワイヤレス充電器に対応したスマホを使ってるのだからどんなものか体験してみたいと思い、レビューをみるとかなり評判は悪めなので迷ったが、まぁ三千円台になってたし、そのくらいならドブに捨てることになっても諦めもつくだろうと思って買った。

1Password の item link (permalink) について調べたメモ

iOS アプリの URL scheme ではなく、

Use item links to help others find shared items | 1Password

これの話。

「Copy Link(リンクをコピー)」で入手できる URL は以下のような形式になっている。

https://start.1password.com/open/i?a=3B2ZGWDZOZG6XDG5H2IJGUEADQ&v=boqzyrqxkbuidqbc7gle7vq5xq&i=queykooqcvbitd4rdvxemoauiq&h=my.1password.com

見やすさのために改行を入れると、こういう構造だとわかる。

https://start.1password.com/open/i
  ?a=3B2ZGWDZOZG6XDG5H2IJGUEADQ
  &v=boqzyrqxkbuidqbc7gle7vq5xq
  &i=queykooqcvbitd4rdvxemoauiq
  &h=my.1password.com

この URL をブラウザで開くと、以下の URL に遷移する。この遷移は HTTP リダイレクトではなく JavaScript によって発生している(後述)。

https://my.1password.com/signin?landing-page=%2Fvaults%2Fboqzyrqxkbuidqbc7gle7vq5xq%2Fallitems%2Fqueykooqcvbitd4rdvxemoauiq

https://my.1password.com/signin
  ?landing-page=
    %2Fvaults%2Fboqzyrqxkbuidqbc7gle7vq5xq
    %2Fallitems%2Fqueykooqcvbitd4rdvxemoauiq

後者の URL におけるクエリストリングも踏まえると、前者の URL におけるクエリストリングの各パラメータは以下のような意味と推察できる。

a と h が両方必要なのは何故?という疑問が浮かんだが、ページ遷移を JavaScript のみで行う(API リクエストを発生させない)ために、 URL 内に遷移先 URL の情報を含めているのだろう。

JavaScript によって遷移している箇所は、以下のように特定できる。

画像一枚目: 赤矢印の行が start.1password.com な URL に対するリクエスト。黄矢印の行が遷移先の URL に対するリクエスト。

f:id:a666666:20201127020702p:plain

画像二枚目: 遷移先 URL へのリクエストの Initiator の JavaScript (minified) を prettfiy した該当行。素朴に window.location.assign() している。

f:id:a666666:20201127021049p:plain

遷移先の URL をブラウザで開いたとき、 1Password アプリで開きますか?というダイアログが表示される(こともある。ダイアログが出る・出ない条件は詳しく調査していない。おそらく 1Password アプリのインストール状況やブラウザ拡張のインストール状況による)。

Mackerel API からサービスメトリクスの値を取得する

api_key = ''
service_name = ''
metric_name = ''

import requests
import json
import datetime
import pprint

headers = {
    'X-Api-Key': api_key,
}

payload = {
    'name': metric_name,
    'from': datetime.datetime.now().timestamp() - 60*60*24*30,
    'to': datetime.datetime.now().timestamp(),
}
r = requests.get(f"https://api.mackerelio.com/api/v0/services/{service_name}/metrics",
                    headers=headers,
                    params=payload,
                )
pprint.pprint(json.loads(r.text))

Mackerel API からサービスメトリクス名の一覧を取得する - @kyanny's blog と合わせて複数のサービスメトリクスの値を一度に取得する場合は以下のようにする。

api_key = ''
service_name = ''

import requests
import json
import datetime
import pprint

headers = {
    'X-Api-Key': api_key,
}

r = requests.get(f"https://api.mackerelio.com/api/v0/services/{service_name}/metric-names",
                 headers=headers,
                )
metric_names = json.loads(r.text)['names']

for metric_name in metric_names:
    payload = {
        'name': metric_name,
        'from': datetime.datetime.now().timestamp() - 60*60*24*30,
        'to': datetime.datetime.now().timestamp(),
    }
    r = requests.get(f"https://api.mackerelio.com/api/v0/services/{service_name}/metrics",
                        headers=headers,
                        params=payload,
                    )
    pprint.pprint(json.loads(r.text))