iRSSの日記

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

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)

WWDC 2017メモ

Xcode9

github対応したよ
ファイルをプロジェクトのフォルダ間で移動すると、自裁のファイルも動く
テストはMあcサーバーで
ケーブル無しで接続して、デバイスと接続可能。Wifi経由でできるんだ!

CoreML

https://developer.apple.com/videos/play/wwdc2017/703/
モデルファイルを XcodeにDrag And Dropするだけで 対応するクラスが生成される。

同じ機能を持つ、モデルでもサイズが違ったりするが、 i/o が同じなら交換可能

モデルはいろんなコミュニティで作られてるので、使いたいのを見つけてCoreMLに変換すれば、OK