たれぱんのびぼーろく

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

プログラミングにおける副作用

副作用(プログラミング)== 定められた範囲の外側に対して「値渡し」以外の作用を与えること.

関数の副作用: 関数外に対し、値を渡す以外の何かをすること.

副作用の問題点

副作用を意識して呼び出しをおこなわなければいけなくなる.
「この関数を呼び出しても世界は破滅しないのか?」
「この関数を呼び出したら本番サーバーのユーザーデータを変更しちゃわないか?」

副作用less

値を返す以外何もしないことが保証される.
返ってきた値を捨てれば外部への影響がないことが保証できる.
だから何度呼び出しても安全.

安全に何度も呼べる (re-play可)
-> 開発/デバッグ
-> テスト
-> リプレイ

範囲「内」なら値渡し以外をしていい

/*
 * 3倍する.
 */
function pure3times(a: number): number {
  let output = 0;
  for (let i = 1; i <= 3; i++) {
    output = output + a;
  }
  return output;
}

const i = 3;
const o = pure3times(i);
console.log(`${i}, ${o}`);
// > 3, 9

世界にはioしかなくて、pure3timesしてもiが変わっていないのでpure3timesは副作用無し1.
でもpure3timesの中ではoutputの書き換えをしてる.
"関数の副作用"は関数外という範囲に対して副作用を持つかどうかという話.

参考: STモナド


  1. console.logは見なかったことにして.

JavaScriptのNumber: 2進数表現の不思議

まとめ: Numberは適当に使うと痛い目にあうよ

変な振る舞い

入力した数値が勝手に変更される.

console.log(1.01234567890123456789);
// 1.0123456789012346

「ああ、有効数字(小数点の桁)の話?」と思いきや、もっと不思議な振る舞いをする.

for (let i =0; i<10;i++){console.log(parseFloat(`${10**i}.01234567890123456789`));};

//         1.0123456789012346
//        10.012345678901234
//       100.01234567890124
//      1000.0123456789013
//     10000.0123456789
//    100000.0123456789
//   1000000.0123456789
//  10000000.01234568
// 100000000.01234567
//1000000000.0123457

どうしてこうなった?

二進数による少数表記の限界.
JavaScriptのNumberは二進数で数字を持っている、これが原因。
JavaScriptダメダメやな」と感じた人はプログラミング言語が一般にどうやって数字を表現するのか勉強するとよい。

ちなみにfloat (浮動小数点) はまた別の話(decimal/十進数のfloatもある)。

Amazon ECS仕様早見表

ECSは色々抽象化してくれているが、いざ不具合にであうと内部が見えなくて困る事が多い(抽象化とは).
なので詳細仕様の早見表をつくった.

Amazon Linux 2 based

対象:

Storage

Docs

  • Linux
    • storage
      • root device: /dev/xvda
      • root volume: 30 GiB
      • file system: ext4
  • Docker
    • storage driver: overlay2

Docker storage size

コンテナに割り当てるストレージの大きさ
ストレージドライバの種類によって大きく異なる。

overlay2 driver

標準的な環境でのデフォルトドライバ。
/var/lib/docker/overlay2/配下にimageとコンテナ(read-only layerとr/w layer)が置かれてmergedがファイルシステムの実体になっている.

標準的な設定ではoverlay2/のあるボリュームの全容量が使える(制限はかけられない).
特定条件下でoverlay2.sizeオプションにより制限可能(project quota機能を利用)

dockerd | Docker Documentation

Device Mapper

昔のやつ。
デフォルトで10GB制約が設定されている。
dm.basesizeで変更.

デバッグ方法: AWS BatchがRunnableで止まってインスタンスが立ち上がらない

A: Auto Scalingのログを確認せよ.

Runnableでジョブが停止、でもenvやqueueは正常、なのにenvのインスタンスが全く立ち上がらないというケース.
Auto scalingに失敗しているので、そのログ(Activity)を確認するよろし.

console URL (regionは適宜変更): https://us-west-2.console.aws.amazon.com/ec2autoscaling/home

外部スクリプトを実行する、という枠組み

ブラウザ & JavaScript

C++ブラウザ / JSエンジン/ JSスクリプト

JSは(エンジンが提供する)サンドボックス内で動く。
サンドボックス外へのアクセス用に色々インターフェイスが生やされてるのでそれを使う (e.g. DOM API).

ブラウザ & WASM

C++ブラウザ / WASMエンジン/ WASMスクリプト

Unity & WASM

C++Unity / WASMエンジン / WASMスクリプト

WASMエンジンがUnity APIを叩けるようにしておけばWASMスクリプトからUnityを動かせる.
動的ローディング可能なバーチャルオブジェクトのための仕様と実装の提案

UGCメディアの法則

第一原理: クリエイター out > in => 寿命

クリエイターはどこへいっても作れる存在.
不満が溜まれば無言で消えて、他所でまた作り始める
言葉数が少ないのは、作ることの意味を良く知っているから.
時間と共にクリエイターは移ろって/outしていく.
新規クリエイター/inが少なければ、必ずそのUGCメディアは衰退する.