iRSSの日記

はてなダイアリーiRSSの日記の続き

mochaに起動時にいろいろ(カスタム引数を渡すとか)やる

.mocharc.jsにてbootstrapをrequire

"use strict";

const { dirname } = require("path");

module.exports = {
  require: [ __dirname + "/test/bootstrap"],
  timeout: 10000,
};

/test/bootstrap.jsがmocha起動時に実行される

// project root dir 基準の module path を可能に
import { addPath } from "app-module-path";
addPath(__dirname + "/..");

// mochaにカスタム変数を渡せる
const useWtf = process.argv.find((v) => v.indexOf("--wtf") == 0);

process.env.GOOGLE_APPLICATION_CREDENTIALS =
  __dirname + "/../config/gcp-service-account/1234.json";

import * as wtf from "wtfnode";
exports.mochaHooks = {
  afterAll() {
    // mochaのプロセスが終了しないときの調査ツール
    // wftは残ってるprocessを教えてくれる https://github.com/myndzi/wtfnode , https://boneskull.com/mocha-v4-nears-release/#mochawontforceexit
    if (useWtf) wtf.dump();
  },
};

参照 stackoverflow.com

thisの動きに惑う

typescript
type Handler = (name: string) => void;

class A {
  public hello(name: string) {
    console.log("hello " + name, "this:`", this, "`");
  }
}

class B {
  public world(name: string) {
    console.log("world " + name, "this:`", this, "`");
  }
}

const a = new A();
a.hello("tokyo");

const b = new B();
b.world("aichi");

class Runner {
  public handlers: { [path: string]: Handler } = {
    "/hello": a.hello,
    "/world": b.world,
  };

  public run(path: string, name: string) {
    this.handlers[path](name);
  }
}

new Runner().run("/hello", "hokkaido");

helloで、呼び出された、a.helloのthisがaになると思うのだけど、そんなことはないのが、jsのthis.

f:id:iRSS:20200724204209p:plain


## 解決できた

class Runner {
  public handlers: { [path: string]: Handler } = {
    "/hello": a.hello.bind(a),  // <-ここでbindすれば、よいのだ(いやだけど)
    "/world": b.world.bind(b),
  };

  public run(path: string, name: string) {
    this.handlers[path](name);
  }
}

Reactでも出てきたやつだ。繋がった。
ja.reactjs.org

f:id:iRSS:20200724205907p:plain

Big Query 今日の開始時刻を取得するユーザー定義の関数を作った


昨日1日分のレコードを取得したいときとかに、タイムゾーンを指定して、昨日の午前0時と、午後11時59分59.999999秒のTIMESTAMPを取得したいので、つくった。

CREATE TEMPORARY FUNCTION BEGINNING_OF_DAY_CURRENT_DATE_SUB(expr INT64, timezone STRING) RETURNS TIMESTAMP AS (
  TIMESTAMP_SUB(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY, timezone), INTERVAL 24 * expr HOUR)
);
CREATE TEMPORARY FUNCTION END_OF_DAY_CURRENT_DATE_SUB(expr INT64, timezone STRING) RETURNS TIMESTAMP AS (
  TIMESTAMP_SUB(TIMESTAMP_SUB(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY, timezone), INTERVAL 24 * (expr - 1) HOUR), INTERVAL 1 MICROSECOND)
);

SELECT
    CURRENT_DATETIME() AS utc_now,
    CURRENT_DATETIME('Asia/Tokyo') AS local_now,
    BEGINNING_OF_DAY_CURRENT_DATE_SUB(0, 'Asia/Tokyo') AS beginning_of_today,
    END_OF_DAY_CURRENT_DATE_SUB(0, 'Asia/Tokyo') AS end_of_today,
    BEGINNING_OF_DAY_CURRENT_DATE_SUB(1, 'Asia/Tokyo') AS beginning_of_yesterday,
    END_OF_DAY_CURRENT_DATE_SUB(1, 'Asia/Tokyo') AS end_of_yesterday,
    BEGINNING_OF_DAY_CURRENT_DATE_SUB(5, 'Asia/Tokyo') AS beginning_of_5days_ago,
    END_OF_DAY_CURRENT_DATE_SUB(5, 'Asia/Tokyo') AS end_of_5days_ago,
    FORMAT_TIMESTAMP("%Y%m%d",BEGINNING_OF_DAY_CURRENT_DATE_SUB(5, 'Asia/Tokyo')) AS TABLE_SUFFIX_from_5days_ago,
    FORMAT_TIMESTAMP("%Y%m%d",END_OF_DAY_CURRENT_DATE_SUB(1, 'Asia/Tokyo')) AS TABLE_SUFFIX_to_yesterday
[
  {
    "utc_now": "2018-10-05T01:06:56.595840",
    "local_now": "2018-10-05T10:06:56.595840",
    "beginning_of_today": "2018-10-04 15:00:00 UTC",
    "end_of_today": "2018-10-05 14:59:59.999999 UTC",
    "beginning_of_yesterday": "2018-10-03 15:00:00 UTC",
    "end_of_yesterday": "2018-10-04 14:59:59.999999 UTC",
    "beginning_of_5days_ago": "2018-09-29 15:00:00 UTC",
    "end_of_5days_ago": "2018-09-30 14:59:59.999999 UTC",
    "TABLE_SUFFIX_from_5days_ago": "20180929",
    "TABLE_SUFFIX_to_yesterday": "20181004"
  }
]

_TABLE_SUFFIXとtimeカラムをつかって絞り込む

_TABLE_SUFFIXで必要なテーブルの日付を決定しつつ、時刻が入っているtimeカラムをつかって、狙った期間のレコードを対象とする

こんなテーブルがあったとする

sample_20180928
sample_20180929
sample_20180930
...

スキーマはこんな↓感じを想定

  SELECT
    *
  FROM `sample_*`
  WHERE
    _TABLE_SUFFIX BETWEEN FORMAT_TIMESTAMP("%Y%m%d",BEGINNING_OF_DAY_CURRENT_DATE_SUB(6, 'Asia/Tokyo')) AND FORMAT_TIMESTAMP("%Y%m%d",END_OF_DAY_CURRENT_DATE_SUB(1, 'Asia/Tokyo')) AND
    time BETWEEN UNIX_SECONDS(BEGINNING_OF_DAY_CURRENT_DATE_SUB(6, 'Asia/Tokyo')) AND UNIX_SECONDS(END_OF_DAY_CURRENT_DATE_SUB(6, 'Asia/Tokyo'))

減量によって、どのくらい速く走れるかを推定する式が出ていた。
計算用のスプレッドシートを作成した。

https://goo.gl/csrN98

フルマラソンの記録と、記録を出した時の体重を入力すると、減量後の推定時間が計算されます

"ActiveResource::Collection" をconnection対応する


用意されているのは以下

Array, ArrayConnection
ActiveRecord::Relation, RelationConnection
Sequel::Dataset, RelationConnection

ActiveResource::Collection は含まれない。



https://github.com/rmosolgo/graphql-ruby/blob/v1.7.14/guides/relay/connections.md#connection-objects
をみると、 ActiveResource::Collection向けのConnectionを定義する必要がありそうだ


とりあえず、config/initializers/graphql.rb を作って ActiveResource::CollectionとGraphQL::Relay::ArrayConnectionを紐づければうごいた

GraphQL::Relay::BaseConnection.register_connection_implementation( ActiveResource::Collection, GraphQL::Relay::ArrayConnection)