TypeScriptのunknown型

1

3.0から入ったunknown型がある

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html

というかunknown型が入ったこともあってmajor versionが上がったという認識をしている

2

コードベース中にJSON.parseをanyで受けているところをunknownにしてみるか〜と思って試したがうまくいかなかった

function main(x: unknown): string {
    if (typeof x !== 'object') {
        throw new Error('x');
    }

    if (x === null) {
        throw new Error('x');        
    }
    // この時点でxが{}まで絞れる

    // (1) typeof x.y  typeof x["y"]

    // (2)
    // if ('y' in x) {
    //     x.y
    // }
}

結局 1, 2で詰んでしまう。

まだtypeのnarrowがうまく効かなくて、issueはある状態。

自分の期待しうるunknownにはまだ遠くてJSON.parseの返り値に使うのは、真面目に書こうとする限り厳しいなぁという気持ち。

puppeteer.connectを試す

1

puppeteerの

https://github.com/GoogleChrome/puppeteer/blob/master/lib/Launcher.js

をながめていたら案外雑にchromiumを立ち上げていたのでpuppeteerではなく自分でchromiumのprocessを立ち上げて動くか試してみる。

この場合launchではなくconnectを使う

2

chromiumのversionは

Chromium 70.0.3538.77

以下でchromiumを立ち上げてみる

chromium --headless --hide-scrollbars --mute-audio --no-sandbox --disable-setuid-sandbox --remote-debugging-port=0 --disable-gpu --user-data-dir=/workdir/tmp about:blank

--remote-debugging-port=0をつけないと起動即終了してしまう。--no-sandboxはdockerのalpine上で動かしているため必要。

起動すると以下が吐かれるので、

DevTools listening on ws://127.0.0.1:33993/devtools/browser/dcc10d58-4c80-4e6c-9ad6-235039b0807d

このwsエンドポイントにpuppeteerからアクセスする。

puppeteer.connect({
    browserWSEndpoint: `ws://127.0.0.1:33993/devtools/browser/dcc10d58-4c80-4e6c-9ad6-235039b0807d`,
})
    .then(async browser => {
        const page = await browser.newPage();
        await page.goto('https://www.google.com');
        await page.screenshot({path: '/workdir/dist/screenshot.png'});
    })

動いた

f:id:hiroqn:20181212235750p:plain

3

まだ試せてないけどdockerの外とかつなぐ際に、localhostからしかまだ繋げなさそうな気がするのでbindするipを指定するオプションを調べる必要がありそう。

科学vs宗教

1

とあることから思ったが、

日本だと「科学vs宗教」という捉え方は割と一般的な感じがする。

けど、その捉え方って変だよね

確かに反科学というか科学的でない集団は確かにカルトっぽさがあるのが多い

そもそもカルトと宗教は別で考えるべきものなんだろうけど、多くはカルトと宗教を十分に区別していないように感じる

反科学 -> カルト -> 宗教という混同の流れから「科学vs宗教」というのは割とすんなり受け止めやすい土壌なのかもしれない

2

風邪をひいてしまって頭がまわらないので有識者求ム

netflixで見た奴話すシリーズ2

1

ミート・イーター料理の達人、を見ました。

www.netflix.com

これ表示の方法によってはシーズン1だったりシーズン7だったりして若干謎い。最初は古いシーズンを探してしまった。

もしかしたら、netflixにはないけどtvとかでやってたシーズンがあるのかしら

2

シンプルな感想ですけど、「肉を獲って食うって最高ですよね」

だいたいはスティーブンとその仲間が狩りに出かけて仕留めた獲物を食べるという構成。

ハンティングかと言われればそうなんだけど、やっぱ狩猟とスポーツハンティングは明確に違うと思わせてくる姿勢がスティーブンにある。

でもその違いってなんだっけ?

食べる食べないの違いがまず浮かぶけどそれだけではないと思う。

じゃあ生活の糧になっているかどうか?

そりゃ今の時代は狩猟をしなくても生活ができる、というより生活だけにこだわれば狩りという選択肢は現実的ではない。

そもそも生活の糧かどうかで決めること自体が愚かだ。サラリーマン生活が現実的と感じてしまうのは一種の病だろう。

とはいえ食わざるを得ないので、食うための行為として会社員をするのも一つだしこの人見たく映像を作るのも一つで生活としての労働はある。

じゃあ狩猟はレジャー?それも違う気がする。

一生のうちから義務を引き算した空間にレジャーとして突っ込まれたものではない。

一生自体に営みとして混ざって分離できない体験ができるのが狩猟なんじゃないだろうか

3

そう思わせてくれる作品でした。

僕ぐらいの世代は小学生の時Lv100のカモネギを持っていた

1

タイトルあんま関係ないですが、鴨の皮がスープ用に売ってましたので出汁を取りたくなって買いました。

ちょっと前に昆布締めに買った昆布が余っていたのでまず昆布を

f:id:hiroqn:20181209221951j:plain

30分ほっておいて加熱

f:id:hiroqn:20181209222511j:plain

ぽい感じです。誤算があるとすれば昆布が案外デカかったことです。

2

f:id:hiroqn:20181209222627j:plain

加熱します。めちゃくちゃ脂が出ます。

f:id:hiroqn:20181209222826j:plain

ネギを(写り込んだニンニクはゲストです。今回は使われませんでした)

f:id:hiroqn:20181209222950j:plain

デカすぎて火が通らねぇ

f:id:hiroqn:20181209223142j:plain

電チンしました。(先にすればよかった)

3

f:id:hiroqn:20181209223254j:plain

出汁に

  • たまり
  • 日本酒(が少ししかなかったので紹興酒が8割)
  • 砂糖

入れて煮込んだ図、菜箸についた脂のせいで見た目が脂汗をかいたオタク

f:id:hiroqn:20181209223649j:plain

それっぽいですね。

4

サトウキビから作られた砂糖だったので甘みが薄かったので調整

ネギを溶けたアイスぐらデロデロにしたので加熱中にこれを書いています。

この後、うどんにぶっかける可能性が高いです。

bucklescript自体をnixでbuild

1

ここ最近の自由研究としてbucklescript、厳密にはbs-platform自体をnixでbuildしようとてしました。

大変な部分もあって難航したが、一旦なんとかなったっぽいので公開します。

2

bs-platformは結構たくさんのツールチェーンの集合体なので、まず付属のOCamlをビルドしていきます。

ちょっとバージョンが古いのですがそこはまぁ取り組んでいた期間を想像してください。

あと、ビルド方法はいろんなところにいろんな手法が記述されていますが、CONTRIBUTING.mdを見るのが現状正しいです。

nixなのでopamは使いません。

{ stdenv, fetchFromGitHub, }:
let
  src = fetchFromGitHub {
    owner = "BuckleScript";
    repo = "bucklescript";
    rev = "484740cd56981130573efc81757c41f5662f4f0e";
    sha256 = "1mcz283jjwbwq52r51nzz5wjwc7y6g4fhgv0zbgs1wwp496mpjpy";
  };
in
stdenv.mkDerivation {
  version = "4.02.3";
  name = "ocaml-4.02.3+buckle-master";
  inherit src;
  configurePhase = ''
    cd vendor/ocaml
    ./configure -prefix $out
  '';
  buildPhase = ''
    make world.opt
  '';
  installPhase = ''
    make install
  '';

  meta = with stdenv.lib; {
    homepage = http://caml.inria.fr/ocaml;
    branch = "4.02";
    description = "Most popular variant of the Caml language";
    platforms = with platforms; linux ++ darwin;
  };
}

結構昔はgit submoduleになっていたのですが、現在はvendor/ocamlにcommitされています。 nixなので./configure -prefix $outをするのを忘れなければそんなに問題ないです

3

ここからが面倒でbsc.exeなどをビルドしていく上でopam install camlp4 cppoする必要がありますがopam抜きで済まします。

(ここに)https://github.com/NixOS/nixpkgs/blob/13882234569e75df7ecc39e97bdac98709b57530/pkgs/top-level/ocaml-packages.nix便利なツールがあるのでこれを使うといい感じになります。

しかしcamlp4OCamlのversionを見てDLしてくるようなnixが書かれているのが若干不安ですが一旦なんとかなりました。(要検証)

最終的に以下のようになります。

{ stdenv, fetchFromGitHub, callPackage, ninja, nodejs }:

let
  src = fetchFromGitHub {
    owner = "BuckleScript";
    repo = "bucklescript";
    rev = "484740cd56981130573efc81757c41f5662f4f0e";
    sha256 = "1mcz283jjwbwq52r51nzz5wjwc7y6g4fhgv0zbgs1wwp496mpjpy";
  };
  ocaml = callPackage ./ocaml.nix {};
  mkOcamlPackages =  (callPackage <nixpkgs/pkgs/top-level/ocaml-packages.nix> {}).mkOcamlPackages;
  ocamlPackages = mkOcamlPackages ocaml (self: super: { });
in
stdenv.mkDerivation rec {
    name = "bucklescript-${version}";
    version = "4.0.6";
    inherit src;
    buildInputs = [ ocaml ocamlPackages.cppo ocamlPackages.camlp4 ];
    phase = [ "buildPhase" "installPhase" ];
    buildPhase = ''
      mkdir -p $out
      cp -R lib jscomp Makefile bsconfig.json package.json $out
      cd $out
      make
      make install
      ln -s ${ninja}/bin/ninja $out/lib/ninja.exe
    '';
    installPhase = ''
      mkdir -p $out/bin
      ln -s $out/lib/bsb $out/bin/bsb
      ln -s $out/lib/bsc $out/bin/bsc
      ln -s $out/lib/bsrefmt $out/bin/bsrefmt
    '';
}

Makefile中に中間ファイルを容赦無くsrc中にぶっこんでくるので、一旦全て$outにcpするなど辛い構成になっています。

document中ではnpm -g install .するように書いてありますが、npmのinstall hookなどでアクロバットにninjaなどがdlしたりビルドしたりするためのものなので不要です。 突然pythonが要求されて何故?ってなります。 今回はnixpkgsからninjaを持ってきてlinkしていますが、若干versionがずれてしまうのできにする場合がninjaのversionを固定するようなnixが必要になります。

4

最終的なnixファイルを見るとそんなに辛そうに見えませんがビルド周りがイケてない場合、このファイルを各仮定でかなりのソースを読むことになります。 終わり。

folio(ios)のui/ux辛いところ

folioのアプリで諸々の諸行無常をチェックするのだが、UI上辛いところがあるので書く。株価が上がらなくて辛いところは書かない。

リバランス手続き

リバランス手続きというものがあって、あるテーマの株のバランスが価格の変動で変わってきたから情弱の君にサジェストしてあげるよっていう機能である。

f:id:hiroqn:20181207231640p:plain

このソニー+1株というのは新しく1株足すというのはわかるんだけど、元の株数が幾つなのかわからないのである。

一応、リバランス前のタブを押せばわかるんだけどこのように複数の種類についていちいち切り替えるのがクソ面倒で手続きする気を失ってしまう。

今4株持っているので、4(+1)4 -> 5とかでいいでしょ。

株価表示

まぁ、株価が見れるんですけど。

f:id:hiroqn:20181207232607p:plain

そもそもこの画面は結構操作しにくいんだけどそれは日付を見てわかるように結構長いスパンなのだ。

あと、いつこの株を買ったのか出して欲しい。それかなり大事な情報じゃない?

テーマの価格遷移

あるテーマの価格遷移を見ることができる。それがこれだ。

f:id:hiroqn:20181207233206p:plain

この2018/10/26の部分を見て欲しい。ここは株が爆上げしてHappyという図ではなく、ただ単にリバランス手続きをして持ち株が増えただけなのである。

これはマジ???っていう気持ちになって、このグラフ結構無意味やんけ...ってなった。気持ちの問題としてリバランス手続きが損に思えてしまう。

複数テーマをリバランスした際に

あるテーマでは会社Aの株が減るんだけど、別のテーマでは会社Aの株が増える時にそれ手続き的にどうなるねん、って思って何もしなかった。

割とマイナー部分で調べたけど出てこなかった感じ。

全ての資産

アプリトップで全ての資産が見える。(ちょっと出すわけには行かない、低いので)

実はこれ持っている株の合計じゃなくて、folio中の株の価格+folio口座の中の購入金額になっている。

しかも、その下に含み損益の金額とパーセントが出ているが過去に買った株の価格に対するパーセントなので、全ての資産に対するパーセントを期待すると違和感がある。

儲かってる感のUX

今まで書いた部分を若干含んでしまってはいるが「テーマを買っておいて良かったな」という部分があまり訴求される感じがない。

例えば、持ち株の中でこの一ヶ月で変動が大きかった株を出すとか。テーマ全体で下がることよりある会社が原因で下がる方が多いように感じる。

あと、テーマ自体が何故下がっているか何故上がっているかのレポートがあると嬉しいと思った。

あまりに漠然とマイナス、プラスというだけで(そして本当にプラスなのかもよくわからんグラフ)心理的にプラスにさせる部分がない。

まぁ全テーマが結構プラスな人はどうでもいいかもしれませんけどね(いるのか?)。