たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

Javascriptの日時 (date & time)

Javascript標準で日時を扱うにはDateオブジェクトを使う.
使い方は割と簡単で、いくつか問題点はあるけどとりあえず使う分にはまぁ

概要

こんな風になっている
f:id:tarepan5884:20170910222214p:plain

inputはローカル時間 (日本時間とかアメリカ時間とか。時差のようなもの) の情報を持っているが、気にせずDateオブジェクトに入れてしまう.
Dateオブジェクトがローカル時間を良い感じに扱ってくれ、内部ではローカル時に影響されないUnix時間という時間表現で時間を保持している.
Dateオブジェクトから日時情報を取り出す際には様々な書式を設定でき、ISO8601表記や、月(month)のみの取り出しなどが出来る.ローカル時間に合わせた表記ももちろんできるよ、優秀!

  • input:
    • コンストラクタ: new Date(args)
    • setter: dateObj.setMonth()など
  • internal: Unix時間
  • output:
    • 全情報
      • Unix時間: Date.getTime()
        • => 1505049236671
      • 地域時間: Date.toLocaleString()
        • => "2017/9/10 22:48:41"
      • ISO8601-UTC: Date.toISOString()
        • => "2017-09-10T13:48:41.083Z"
      • ISO8601-localTime: なんと、無い!!
      • JSON用: Date.toJSON()
    • 個別の年、月、日など
      • dateObj.getMonth(): 月(month)のみ返してくる
      • etc.etc.

コンストラクタや各種setter, getterはググれば簡単にわかる。上記の全体像が大事.

良く上げられる問題点

  • getterの返り値が直感的ではない
    • 1月が"0"で返ってくる。ゆえに9月は8!! ミスリーディング!!
  • 実装依存の部分が非常に多い
    • 仕様書を見る限り、最近はかなり標準化されているみたい
    • 古いブラウザ使うなら機能豊富なライブラリを使うべし
  • ISO8601のローカル時間表記が出来ない
    • ローカルにかかわる情報もってんだろおんどれ、もうちとがんばれ!!

オブジェクト内部の時間表現

以下は興味のある人向け

Dateオブジェクト内ではUnix時間で日時が表現されている.

A Date object contains a Number indicating a particular instant in time to within a millisecond. Such a Number is called a time value. A time value may also be NaN, indicating that the Date object does not represent a specific instant of time.
Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC.
https://www.ecma-international.org/ecma-262/6.0/#sec-time-values-and-time-range
https://www.ecma-international.org/ecma-262/7.0/#sec-time-values-and-time-range
* ECMAScript 2015 ~ 2018-draft まで 20.3.1.1Time Values and Time Range に変更なし

ECMAScript仕様

(ECMAScript 2015, 2016, 2017, 2018-draft)
20.3 Date Objects (https://tc39.github.io/ecma262/#sec-date-objects)にて詳しく規定

変更履歴

language specification 20.3をdiff

2015 -> 2016

20.3.1.16 Date Time String Formatだけ変更点がありそう
ほかは表記上の変更のみにみえる

2016 -> 2017

20.3.3.4に変更点

2017 -> 2018-draft

20.3.4.41-42に大幅変更?

内部動作

DateValue internal slotが全ての肝.
DateValueはDateインスタンスの持つ内部時間表現。Unix時間(1970-01-01T00:00zからの経過ミリ秒)で表現されている.
コンストラクタもsetterも、いろいろな入力をUnix時間へ変更してDateValueに入れる仕事をしている.
getterはどれもUnix時間を適切な出力フォーマットへ変換する仕事をしている.

読み解くのに重要な内部関数

thisTimeValue(value)  
/*
 * @argument {Object} value - argument object
 * @return {?} - value.[[DateValue]] || Type Error exception
 */
// 20.3.4

"this time value"は thisTimeValue(this)の返り値 (20.3.4)
Date prototype objectはDateValue internal slotを持たない(20.3.4)
インスタンスが初期化されたとに DateValue == time valueになるもよう (20.3.4)

20.3.1.15 TimeClip (time): time => NaN || parseInt(time)

MakeDate() -> TimeClip(UTC(finalDate)) -> DateValue
ほとんどのsetterでは、setterコール時にUnix時間からYear等を再計算し、setterの引数と再計算値を用いて(internalな)MakeDate()を行ってUnix時間へ再変換してる.

mermaid.jsでガントチャートを書く

mermaid.jsには様々な機能がある。その中でもガントチャート機能に着目した。

mermaid.jsガントチャートの特徴

  • 利点
  • 欠点
    • 拡張性なし (モジュールAPIなど)
    • タスクの依存先は1つのみ (and条件などは無理)
    • 公式docが整備不十分

そもそも論だが、ガントチャートは依存関係を書く機能を有するグラフなのか?

#

mermaid.js対応エディタがたくさんあるみたいで、彼らを使うのも手かも?

mermaid.jsのatomエディタ拡張、これはぐぅ神.
github.com

本家

レポジトリ
github.com

gitbook, readme代わり
mermaid · GitBook
特にgantt部分
Gantt diagram · GitBook

なんとlive editorが!
https://mermaidjs.github.io/mermaid-live-editor/#/edit/c2VxdWVuY2VEaWFncmFtCkEtPj4gQjogUXVlcnkKQi0+PiBDOiBGb3J3YXJkIHF1ZXJ5Ck5vdGUgcmlnaHQgb2YgQzogVGhpbmtpbmcuLi4KQy0+PiBCOiBSZXNwb25zZQpCLT4+IEE6IEZvcndhcmQgcmVzcG9uc2UK

関連記事

色設定の仕方
qiita.com

簡単な使い方
qiita.com

後で読む
作図系ツール・ライブラリまとめ · GitHub

ガントチャートjsライブラリ
magnet88jp.hateblo.jp
blog.htmlhifive.com

plantuml.com

google chart
Gantt Charts  |  Charts  |  Google Developers

内部解析

ガントチャートソース
mermaid/src/diagrams/gantt at master · knsv/mermaid · GitHub

Jisonとやらでparserを作製・js化している模様。

ganttRenderer.js
mermaid/ganttRenderer.js at master · knsv/mermaid · GitHub
こいつがガントチャート部の肝その1。
exportしてるオブジェクトは

  • setConf: configを渡すとganttRenderer内部のconfigを更新
  • draw: 描写

のみ。
draw()の中ではひたすら愚直にd3.jsで要素を作っている。健気だ…
draw()内では本当にrenderingしかしておらず、依存関係に基づいたstart-time計算などはされていない。parser側かな?
gantt.yy.getTasks()でtaskArrayを取得している。このgetTasks()があやしい

ganttDb.js内のgetStartDate()が鍵だった。
“after"を正規表現で検出し、依存タスクの時間関係をDateにコンパイルしている。こうすれば後は描写するだけ
mermaid/ganttDb.js at master · knsv/mermaid · GitHub

d3.jsのバージョンは3.5.17で固定 (package.jsonより mermaid/package.json at master · knsv/mermaid · GitHub )。やっぱり古くからのライブラリはv4に移行しづらいよな。

draw

annotation by myself

/**
 * Draw gantt chart
 * @param {string} text - gantt data, which will be parsed soon
 * @param {string} id - id of something HTML object
 * @returns {void}
 */
function draw(text, id){}

text引数は (“./parser/gantt”).parser.parse()で即座にパースして終わり。
id引数はgetElementByIdでelemを出すために即使用して終わり.

構造まとめ

parser => "after" compiler => draw (d3.js)

生物学実験プロトコルの記述と自動化

プロトコルマークアップ

  • 利点
    • 実験時間の自動見積もり
    • 実験スケジュールの自動構築
  • 欠点
    • human readability は少し下がる (MLなら読めはするけど)
    • 一度構築するまでがめんどくさい

バイオ実験の特徴

  • 特徴
    • 木構造で表現するならDAGになるはず
      • というか、木構造に必ずしもならない(分岐と合流)
      • 単純なstep by stepでは表現が不十分 (“and"条件があるから)

私がとりあえずしたいこと

  • 実験時間をささっと自動で出す
  • 実操作時間が知りたい

    • 並行で実験を仕掛けるのにとても重要
    • 待たなきゃいけない時間と待てる時間
    • 階層
  • 木構造をどうやって表現するんだ?

必要なもの・抽象度

high level

low level

MLを基本にしてフローチャートを自動生成?
MLで操作とかも全部記述?

実装

  • mergaid.js
  • D3.js

関連

protocols.io: 実験プロトコルの共有サイト protocols.io - Life Sciences Protocol Repository

Autoprotocol: 言語らしい。 Autoprotocol
Transcripticというcloud実験企業がもともと開発したみたい?

EXACT: 実験操作オントロジー Aberystwyth University - EXACT

BioStream: 実験プロトコル記述言語、non activeぽい https://groups.google.com/forum/#!topic/diybio/g-o4sq75jY0

Antha: 実験プロトコル記述言語 antha-lang, coding biology.

SBML: Systems Biology Markup Language SBML - Wikipedia

記述言語を用いた細胞生理学実験シミュレーション手法: 記述言語を用いた細胞生理学実験シミュレーション手法

googleフォーラム、プロトコルの共有について
https://groups.google.com/forum/#!topic/diybio/2SZqjV4umeQ

Google assistantとApi.ai

Google assistantとApi.aiの関係、またActions on Googleとの関係はどのようなものか。

概要

この図のようになってる。
f:id:tarepan5884:20170805031405p:plain
Google assistantが全ての基礎にいる。
Google assistantからActionをトリガーすると、Api.aiに引き渡される。
Api.aiはcustom logicでfulfillmentを埋めつつ、ユーザーと対話する。
Actions on Googleは、Api.aiで作った会話セット (Action?)を公開するためのプラットフォーム。
Google assistantでAction名を言うと事前ダウンロードなしで作ったActionをトリガーしてくれる。これはActions on Googleのおかげ.

予備実験

本実験の前におこなわれる(資源的に)小規模な実験 実験科学の予備実験に議論は絞りたい

  • 予備実験
  • 予備的実験

  • 予備データ(Preliminary data)

  • パイロットプラント (プラントだけど)
  • プロトタイプ
  • 概念検証 (Proof of Concept)

予備実験はスケールが小さい本実験
-> 本実験の計画が出来ていないと実行不可能

利点・意義

予備実験をおこなう意義とは

資源的に小規模 -> 外した時の損害が小さい

  • 損害
    • お金
    • モノ
    • 時間
    • 信用

外したらどうするのか
-> 本実験計画を改良・変更・中止できる
実験計画に撤収基準を盛り込むべき
を撤収する

Pilot experiment - Wikipedia

転写開始点

一般に、転写開始点が厳密に決まっているとは限らない.
複数個所からのスタートもありうる

T7プロモーター

T7プロモーターからの転写: 転写開始点が厳密に決まっている模様

The +1 base (in bold) is the first base incorporated into RNA during transcription. The underline shows the minimum promoter sequence needed for efficient transcription. mMESSAGE mMACHINE T7 Transcription Kit - Thermo Fisher Scientific
マニュアル