pywebviewのjs_apiにwindowオブジェクトを注入するクラスを使いたい

起こったこと

pywebviewを使ったアプリを開発中である。

pywebview.flowrl.com

jsのapiを通してpython側でファイルを呼び出す「open_file_dialog」メソッドを使いたいのだが、このメソッドを呼ぶにはjs_apiにwindowオブジェクトを注入しなければならない気がした。

こうした

# main.py
import webview
from Api import Api

window = webview.create_window(
    'title',
    'path_to_html',
)

# windowオブジェクトをApiに注入
window._js_api = Api(window)
webview.start()

# Api.py
from webview import OPEN_DIALOG

class Api:
    def __init__(self, window):
        self.window = window

    def load_file_data(self):
        file_types = ('json (*.json)', 'All files (*.*)')
        paths = window.create_file_dialog(
            OPEN_DIALOG, allow_multiple=False, file_types=file_types)
        file_data = None
        with open(paths[0], 'r', encoding='utf-8') as f:
            file_data = f.read()
        # 以後、file_dataを使ったあれこれ

ただ、これはアンダースコアで開始するメンバー変数に対して直接記入している。これが本当に良いことなのかはちょっとわからない。若干ハック的な使い方なのかもしれない。

_single_leading_underscore: "内部でだけ使う" ことを示します。 たとえば from M import * は、アンダースコアで始まる名前のオブジェクトをimportしません。

pep8-ja.readthedocs.io

ちなみにjsではこんな感じ

const button = document.querySelector(".button");

button.addEventListener("click", async () => {
  // pywebviewというグローバルが追加されている。promiseなのでawaitを使うなどをする
  await pywebview.api.load_file_data();
});

GASのdoGet,doPostの型は型宣言ファイルはどこにあるの

起こったこと

gasを作る。claspから作ろうと思ったので以下をインストールした。

npm i -D @types/google-apps-script

しかし、doGetのタイプがどこにあるのかがよくわからなかった。

GoogleAppsScript.Events.DoGet

GoogleAppsScript.Events.DoGetとGoogleAppsScript.Events.DoGetだった。

const doGet = (e: GoogleAppsScript.Events.DoGet) => {
  const {} = e.parameter;
  // ...
}

AmplifyのテストフェーズでPlayWrightを実行してFailしたのだが、そのままデプロイされてしまった。

起こったこと

AmplifyでPlaywrightを使おうと思った。しかし、Playwrightのテスト結果が落ちてもデプロイを中止してくれなかった。(Failしているのにデプロイしてしまう)

おそらくだけど、テストコード内で終了コードを1にしてもデプロイを止めることはできないようだ。なお、テスト内でエラーをThrowしてもダメだった。

そもそも

そもそも現時点(2023/01/20)でAmplify上ではPlaywrightを対応していない。動作は保証されていないことに注意してほしい。

github.com

これを参考にしてほしい

github.com

検証結果が記載された何らかのデータに対して、postTestフェーズのシェルスクリプト内で読み込み、その内容を条件分岐してExitするというものだった。

テストが終わったらチャットツールだとかで通知したいし、結局このフェーズでスクリプトを書くことは良いことかもしれない。

mochawesome-report-generatorのコンテキストに動画挿入したい場合

起こったこと

MochawesomeのJSONを自前で作る必要が出てきた。

また、そのJSONをMochawesomeReportGeneratorに渡してHTMLで結果を表現したい。

しかし、動画リンクをmochawesome.jsonのどこに埋め込めばよいかがわからなかった。

tests配列内オブジェクトのcontext内に入れる。

 "tests": [
            {
              "title": "test title",
              "context": null, // ←ここ
              "code": "text",
              "err": {},
              ...
            }
          ]

context内に以下のような値の配列を入れる

[
  {
    "title": "str", // 何を表示するかのタイトル
    "value": "string" // ここは動画や画像の場合はパス名を入れる。
  }
]

stackoverflow.com

mochawesome-report-generatorを使ったjsオブジェクトからhtmlレポートを出力したい場合は

やはりtests配列内のオブジェクト、context内に上記の値を入れる必要があるのだが、contextはあくまで文字列しか受け付けないらしい。

なのでこうなる

const tests = [
  {
    title: "test title",
    context: JSON.stringify([{
      title: "str",
      value: "動画や画像の場合はパス名を入れる。"
    }]),
    code: "text",
    error: {},
    .....
  }
]

今日は定時にあがれるか、という問いを毎日聞かれるのでリマインダーをつけた

起こったこと

僕たち家族は二人ともリモートワークなのだが、毎日、妻に「あなたが今日、定時であがれるのかがわからない」と悲しそうに言っていた。

妻は僕と一緒にご飯を食べたいのだが、僕が遅いせいでご飯が冷めてしまうのが悲しいというのと、単純にさみしいということだった。

カレンダーでリマインドするようにした

二人ともiPhoneなので共通カレンダーを作り、会社の定時1時間前に予定を設定、通知するようにした。

内容は「定時確認」として、定時になったら現在の進捗状況から定時に上がれそうか上がれなさそうかを伝えるようにした。

これにより毎日の問いが機械に代替されるようになり「妻が僕に聞きずらい状況」というのがなくなった。

アレクサでもリマインドするようにした

上記のカレンダーだと毎日予定が入ることになるのでカレンダーの見栄えが悪くなった。

そこで、お役御免となったKindle8があったので、アレクサの定型アクションにセットするようにした。

また、定時になったら蛍の光も流れるようにした。

そのうち、上記カレンダーによるリマインドから完全に移行したい

日本の自動二輪の区分について

起こったこと

「小型二輪は250ccのバイクを指すか?」ということを問われて何と答えたら良いかわからなかった。

2つの法律と免許の区分

バイクは道路交通法道路運送車両法はそれぞれの法律で区分の仕方が異なる。また免許での区分も存在する。ただ、いずれも排気量をベースに区分する仕組みとなっている。

道路交通法

道交法では車両区分として50cc以下が原付、50cc超400cc未満が普通自動二輪、400cc以上が大型自動二輪になる。

運転免許の区分

運転免許の区分は道路交通法とほぼ一緒だが、原付と普通自動二輪の間に50cc超125cc以下で普通自動二輪(小型)と呼ばれる区分があり、これを俗称として小型二輪と呼ぶことがある。

道路運送車両法

道路運送車両法では道路運送車両法施行規則として50cc以下が第1種原付、50cc超125cc以下が第2種原付、125cc超250cc以下が軽自動車二輪、250cc超が「二輪の小型自動車」と分類される。

小型二輪でググる

www.google.com

大体が免許区分での「小型二輪」になる。なじみがあるのも「小型二輪」である。

なので

上記のググったら出てくる免許区分が一般的であるとして、「小型二輪は250ccのバイクを指すか?」という問いに対してはNoと答えていい気がする。

これから陸運局に向かう人からこの問いを聞かれた場合は「だいたいあってる」と答えるのが正しいかもしれない。

参考

www.tossnet.or.jp

www.goobike.com

elaws.e-gov.go.jp

Lambdaでzipを作ってレスポンスしてたけど解凍がうまくかなかった

起こったこと

LambdaでZipをつくって返却しようとしていたのだが、返却されたzipが解凍できなかった。

ハンドラーでやったこと

const buffer = zip.toBuffer();
return {
  statusCode: 200,
  headers: {
    "Content-Type": "application/zip",
    'Content-Disposition': 'attachment; filename=diff.zip',
  },
  body: buffer.toString("base64"),
  isBase64Encoded: true,
};

bufferをbase64エンコードして渡す + isBase64Encodedtrueにする。

CDKでやったこと

Apiゲートウェイのバイナリメディアタイプを設定する。

const api = new aws_apigateway.RestApi(this, `${pjName}-apigateway`, {
  restApiName: `${pjName}-apigateway`,
  binaryMediaTypes: ["application/zip"] // ここ
});

参考

stackoverflow.com