自動テストの難しさと意味上の制約(機械翻訳された日本語で書かれた)

YAMLの壁に苦しんでいるすべての人は、セマンティクスをより意識する必要があります。通常のコンピューター言語は機械語コンパイルでき、比較的小さく固定された意味上の制約がある

通常のCPUの場合、ISAとABIに示すように、それらが存在すること、プログラムカウンター、スタックポインター、および破棄できるレジスタを予測できます。 パブリッククラウドの特派員は非常に多様です

HPCでの並列処理を意識した最適化には事前実行が必要であるため、kubectl、heat、ansibleおよびvagrantを使用した宣言型クラウドオーケストレーションには常に事前実行が必要です。

クラウドオーケストレーションで必要なメタレベル(リソース割り当て)ステートマシンの構築は、MPIを使用するHPCアプリケーションよりも非常に脆弱です。

私たちのフィールド経験から、そのような構築には、さまざまな組織化された統一リソースラベル付け規則(Linux udevからKubernetesラベル、ノード名へのパスまで)が含まれる場合があります。私たちは毎日新しいものを発明する必要があります。

それは摂食と繁殖に最適化された脳にとって大きな負担です。 YAMLの壁は、組み合わせの性質の心理学的負荷です。

一部のテストを自動化してCI / CDプロセスに統合しようとする場合(ため息)

実際には、テストの構築に失敗する前に、このようなテストの前提条件を知ることはできません。定義に含まれるコンテナー、リソース、ポイントツーポイントデータパスが含まれます。

オーケストレーションの宣言は、自動テストの「意味上の制約」です。私たちが宣言するものは、テストできるものの境界です。

おそらく私たちは、私たちの体、部屋、または町など、私たちが言うことの「大まかな事前実行」を実行する世界のモデルを持っています。 したがって、間違った宣言を書きたくない場合は、最初にクラウド回路基板を脳にマッピングする必要があります。

クラウド宣言の意味的依存関係は、必然的にDSLの構文-意味論の相互設計について考えることを余儀なくさせます。

JSON / YAMLのおかげで、解析について心配する必要はありません。私たちの問題は、一般にコンパイル時および実行時の制約チェックです。

私の知る限り、コンパイラー設計入門コースではオプティマイザーについて言及していません。上級コースでは通常、典型的なCPU設計のみを取り上げていると思います。リソース認識型のクラウド展開は、基盤がなく脆弱な領域です。 

おそらく、基盤は見つかりません。したがって、私たちの選択は次のとおりです。(1)YAMLの壁に取り組み、アドホックな最適化に苦痛な努力を続ける(2)無益な自動化を放棄する ...あなたのは?

 

Kubernetes速修コース(案)

Kubernetes the hard way がいくらなんでもハードル高すぎてやる意欲が出ないので、最低限これだけ試せばKubernetesの公式文書や世の中の実装非依存な説明が具体的な実装において何を意味しているかが判るという観点で研修コースのシラバスを作ってみた。なおLinuxについてはネットワーク周り含め基礎的な理解・スキルは前提

環境構築

(同時に複数人に説明する場合はあらかじめ環境を用意しておく)

何でどう作ってもいいのですが、個人で試す場合メモリもあんまり潤沢にないので

  1. ESXiなりVirtualBoxなりを用意
  2. AlpineVMを建てて各VMにDockerを入れる
    ※軽さを最重視した選択ですがコンテナのベースとしての使い勝手は良くないので、普通に使うならUbuntuとかのほうがいい、という意見を目にしました。なおRHEL8/CentOS8はDockerをサポートしないので非推奨です
  3. k3s でシングルマスタ構成のKubernetesクラスタを作る
  4. 以後、kubectlとcurlとyq/jqで操作をしていく

api-server篇

  1. kubectl api-resources
  2. Kubernetesのエンドポイントにcurlでリクエストを投げて各resourceに対応するGET/PUT/DELETE/POST等があることを確認する
  3. watchとwebhookどうしよう)
  4. etcdの中を見てみる
    ※k3sだとsqlite3でした。。具体的にどこ見ればいいか調べます

CRI(Docker)/kubelet篇

Docker以外のCRI(podman/CRI-OとかVMベースのやつ)だと様子がわからなくて死ぬ

  1. docker ps --no-trunc
  2. ps -efwww
  3. sudo ls /var/lib/docker/containers
  4. df
  5. ip -brief l
  6. ip -brief a
  7. docker exec <container> ip -brief l
  8. docker exec <container> ip -brief a

kube-proxy篇

usermode proxy誰も使ってないし、ipvsとかは必要な人が確認すればいい。nftables対応マダー?

  1. kubectl get pods --all-namespaces
  2. kubectl get services --all-namespaces
  3. iptables -t nat -L
  4. (上級者限定)https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/iptables/proxier.go

CNI篇(Flannel?Calico?)

正直これは悩む。Flannelの成立事情とか語りだしたらほんときりがない

  1. ls -R /etc/cni
  2. ls -R /opt/cni/bin
  3. ls -R /var/lib/cni
  4. kubectl api-resources
  5. ovs-vsctl?

Service/Ingress/Istio/CSIまわり

シラバスが思いつかない。実用上は絶対に要る知識なんだけどアーキテクチャ的にはかなりどうでもいいので別の研修にしたほうがいいかなあ。。

超上級者向け補講

Kubernetesの神髄といえる知識がここにあるのでわかる人は読んで人類に貢献してください。言語処理系とかWindowsC++でATLを使ってCOMコンポーネントとか開発できるレベルの人以外は読んでも知識として活かせないです(書いてる本人含め)

running minishift (ongoing)

Situation forced me to learn kubernetes..

[root@localhost ~]# minishift start --cpus 3 --memory 12GB --disk-size 30GB --skip-startup-checks
-- Starting profile 'minishift'
-- Starting the OpenShift cluster using 'kvm' hypervisor ...
-- Minishift VM will be configured with ...
   Memory:    12 GB
   vCPUs :    3
   Disk size: 30 GB
-- Starting Minishift VM ................. OK
-- Writing current configuration for static assignment of IP address ... WARN
   Importing 'openshift/origin-control-plane:v3.11.0' . CACHE MISS
   Importing 'openshift/origin-docker-registry:v3.11.0'  CACHE MISS
   Importing 'openshift/origin-haproxy-router:v3.11.0'  CACHE MISS
-- OpenShift cluster will be configured with ...
   Version: v3.11.0
-- Pulling the OpenShift Container Image .............................................................. OK
-- Copying oc binary from the OpenShift container image to VM ... OK
-- Starting OpenShift cluster ..................................................................................................
Getting a Docker client ...
Checking if image openshift/origin-control-plane:v3.11.0 is available ...
Pulling image openshift/origin-cli:v3.11.0
E0113 09:54:47.761966    2505 helper.go:173] Reading docker config from /home/docker/.docker/config.json failed: open /home/docker/.docker/config.json: no such file or directory, will attempt to pull image docker.io/openshift/origin-cli:v3.11.0 anonymously
Image pull complete
Pulling image openshift/origin-node:v3.11.0
E0113 09:54:52.918260    2505 helper.go:173] Reading docker config from /home/docker/.docker/config.json failed: open /home/docker/.docker/config.json: no such file or directory, will attempt to pull image docker.io/openshift/origin-node:v3.11.0 anonymously
Pulled 5/6 layers, 84% complete
Pulled 5/6 layers, 87% complete
Pulled 5/6 layers, 88% complete
Pulled 5/6 layers, 92% complete
Pulled 5/6 layers, 97% complete
Pulled 6/6 layers, 100% complete
Extracting
Image pull complete
Checking type of volume mount ...
Determining server IP ...
Using public hostname IP 192.168.42.69 as the host IP
Checking if OpenShift is already running ...
Checking for supported Docker version (=>1.22) ...
Checking if insecured registry is configured properly in Docker ...
Checking if required ports are available ...
Checking if OpenShift client is configured properly ...
Checking if image openshift/origin-control-plane:v3.11.0 is available ...
Starting OpenShift using openshift/origin-control-plane:v3.11.0 ...
I0113 09:57:38.958438    2505 config.go:40] Running "create-master-config"
I0113 09:57:41.604090    2505 config.go:46] Running "create-node-config"
I0113 09:57:43.234295    2505 flags.go:30] Running "create-kubelet-flags"
I0113 09:57:43.722584    2505 run_kubelet.go:49] Running "start-kubelet"
I0113 09:57:43.959146    2505 run_self_hosted.go:181] Waiting for the kube-apiserver to be ready ...
I0113 10:00:25.016128    2505 interface.go:26] Installing "kube-proxy" ...
I0113 10:00:25.016237    2505 interface.go:26] Installing "kube-dns" ...
I0113 10:00:25.016281    2505 interface.go:26] Installing "openshift-service-cert-signer-operator" ...
I0113 10:00:25.016354    2505 interface.go:26] Installing "openshift-apiserver" ...
I0113 10:00:25.016441    2505 apply_template.go:81] Installing "kube-proxy"
I0113 10:00:25.016498    2505 apply_template.go:81] Installing "openshift-apiserver"
I0113 10:00:25.021750    2505 apply_template.go:81] Installing "kube-dns"
I0113 10:00:25.023147    2505 apply_template.go:81] Installing "openshift-service-cert-signer-operator"
I0113 10:00:29.387405    2505 interface.go:41] Finished installing "kube-proxy" "kube-dns" "openshift-service-cert-signer-operator" "openshift-apiserver"
I0113 10:03:39.479007    2505 run_self_hosted.go:242] openshift-apiserver available
I0113 10:03:39.479785    2505 interface.go:26] Installing "openshift-controller-manager" ...
I0113 10:03:39.479809    2505 apply_template.go:81] Installing "openshift-controller-manager"
I0113 10:03:42.732668    2505 interface.go:41] Finished installing "openshift-controller-manager"
Adding default OAuthClient redirect URIs ...
Adding registry ...
Adding router ...
Adding sample-templates ...
Adding persistent-volumes ...
Adding centos-imagestreams ...
Adding web-console ...
I0113 10:03:42.758204    2505 interface.go:26] Installing "openshift-image-registry" ...
I0113 10:03:42.758223    2505 interface.go:26] Installing "openshift-router" ...
I0113 10:03:42.758235    2505 interface.go:26] Installing "sample-templates" ...
I0113 10:03:42.758245    2505 interface.go:26] Installing "persistent-volumes" ...
I0113 10:03:42.758262    2505 interface.go:26] Installing "centos-imagestreams" ...
I0113 10:03:42.758277    2505 interface.go:26] Installing "openshift-web-console-operator" ...
I0113 10:03:42.758640    2505 apply_template.go:81] Installing "openshift-web-console-operator"
I0113 10:03:42.760233    2505 interface.go:26] Installing "sample-templates/dancer quickstart" ...
I0113 10:03:42.760263    2505 interface.go:26] Installing "sample-templates/django quickstart" ...
I0113 10:03:42.760278    2505 interface.go:26] Installing "sample-templates/nodejs quickstart" ...
I0113 10:03:42.760291    2505 interface.go:26] Installing "sample-templates/rails quickstart" ...
I0113 10:03:42.760304    2505 interface.go:26] Installing "sample-templates/jenkins pipeline ephemeral" ...
I0113 10:03:42.760316    2505 interface.go:26] Installing "sample-templates/mongodb" ...
I0113 10:03:42.760328    2505 interface.go:26] Installing "sample-templates/mariadb" ...
I0113 10:03:42.760341    2505 interface.go:26] Installing "sample-templates/mysql" ...
I0113 10:03:42.760354    2505 interface.go:26] Installing "sample-templates/postgresql" ...
I0113 10:03:42.760368    2505 interface.go:26] Installing "sample-templates/cakephp quickstart" ...
I0113 10:03:42.760381    2505 interface.go:26] Installing "sample-templates/sample pipeline" ...
I0113 10:03:42.760463    2505 apply_list.go:67] Installing "sample-templates/sample pipeline"
I0113 10:03:42.761561    2505 apply_list.go:67] Installing "centos-imagestreams"
I0113 10:03:42.761884    2505 apply_list.go:67] Installing "sample-templates/dancer quickstart"
I0113 10:03:42.762110    2505 apply_list.go:67] Installing "sample-templates/django quickstart"
I0113 10:03:42.762285    2505 apply_list.go:67] Installing "sample-templates/nodejs quickstart"
I0113 10:03:42.762469    2505 apply_list.go:67] Installing "sample-templates/rails quickstart"
I0113 10:03:42.762679    2505 apply_list.go:67] Installing "sample-templates/jenkins pipeline ephemeral"
I0113 10:03:42.762989    2505 apply_list.go:67] Installing "sample-templates/mongodb"
I0113 10:03:42.763211    2505 apply_list.go:67] Installing "sample-templates/mariadb"
I0113 10:03:42.763396    2505 apply_list.go:67] Installing "sample-templates/mysql"
I0113 10:03:42.763571    2505 apply_list.go:67] Installing "sample-templates/postgresql"
I0113 10:03:42.763844    2505 apply_list.go:67] Installing "sample-templates/cakephp quickstart"
I0113 10:03:56.694032    2505 interface.go:41] Finished installing "sample-templates/dancer quickstart" "sample-templates/django quickstart" "sample-templates/nodejs quickstart" "sample-templates/rails quickstart" "sample-templates/jenkins pipeline ephemeral" "sample-templates/mongodb" "sample-templates/mariadb" "sample-templates/mysql" "sample-templates/postgresql" "sample-templates/cakephp quickstart" "sample-templates/sample pipeline"
I0113 10:05:12.172803    2505 interface.go:41] Finished installing "openshift-image-registry" "openshift-router" "sample-templates" "persistent-volumes" "centos-imagestreams" "openshift-web-console-operator"
Login to server ...
Creating initial project "myproject" ...
Server Information ...
OpenShift server started.

The server is accessible via web console at:
    https://192.168.42.69:8443/console

You are logged in as:
    User:     developer
    Password: <any>

To login as administrator:
    oc login -u system:admin


-- Exporting of OpenShift images is occuring in background process with pid 9045.
[root@localhost ~]# oc login -u system:admin
Logged into "https://192.168.42.69:8443" as "system:admin" using existing credentials.

You have access to the following projects and can switch between them with 'oc project <projectname%gt;':

    default
    kube-dns
    kube-proxy
    kube-public
    kube-system
  * myproject
    openshift
    openshift-apiserver
    openshift-controller-manager
    openshift-core-operators
    openshift-infra
    openshift-node
    openshift-service-cert-signer
    openshift-web-console

Using project "myproject".
[root@localhost ~]# oc get all
No resources found.
[root@localhost ~]# oc -n kube-system get all
NAME                                    READY     STATUS    RESTARTS   AGE
pod/kube-controller-manager-localhost   1/1       Running   0          5m
pod/kube-scheduler-localhost            1/1       Running   0          6m
pod/master-api-localhost                1/1       Running   0          5m
pod/master-etcd-localhost               1/1       Running   0          6m
[root@localhost ~]# minishift test
Error: unknown command "test" for "minishift"
Run 'minishift --help' for usage.
unknown command "test" for "minishift"
[root@localhost ~]# minishift status
Minishift:  Running
Profile:    minishift
OpenShift:  Running (openshift v3.11.0+7876dd5-361)
DiskUsage:  11% of 29G (Mounted On: /mnt/sda1)
CacheUsage: 1.357 GB (used by oc binary, ISO or cached images)
    
[root@localhost ~]# cut -b 68-196 dockerpsnotrunc.txt | sort -u | perl -pae 's/\s+$/\n/;'
docker.io/openshift/origin-control-plane@sha256:baebaf5dbc8c30f5e3730de826702d9456553af1b6b215bc71e4aa48acf589eb
docker.io/openshift/origin-hyperkube@sha256:51cd1e7ffcffa1d773a26e91905939399487cfc383d7171f68c1aacf416ee9dc
docker.io/openshift/origin-hypershift@sha256:5bb68a87855adac26bfd986567db619f54293e91f8f2018efb9f636fd98c314c
docker.io/openshift/origin-service-serving-cert-signer@sha256:699e649874fb8549f2e560a83c4805296bdf2cef03a5b41fa82b3820823393de
IMAGE
openshift/origin-node:v3.11.0
openshift/origin-pod:v3.11.0
sha256:47dadf9d43b6773bdc8e10548556523183520011c9af9c1b821ecf980bf8ea1e
sha256:4f31abec8dcc8c816e64c78dcfa3b1ec79093c9e02a3220a860386dc72e97dcb
sha256:7aaff4d7211b65aab66cb1b79629d0a8b2943d057fffb6c5934b7fac912f86c8
sha256:9dffb2abf1ddfb74db55e1852d71e6441f872c174559ecb7171d0ce0a1157a21
sha256:be30b6cce5fa6dd97c555e8983874137e4b3b64672093ce6551b65ea80cb17b8
[root@localhost ~]# cut -b 197-2066 dockerpsnotrunc.txt | sort -u | perl -pae 's/\s+$/\n/;'
"/bin/bash -c '#!/bin/bash\nset -euo pipefail\nif  -f /etc/origin/master/master.env ; then\n  set -o allexport\n  source /etc/origin/master/master.env\nfi\nexec hypershift openshift-kube-apiserver --config=/etc/origin/master/master-config.yaml\n'"
"/bin/bash -c '#/bin/bash -xe\nfunction generate_pv() {\n  local basedir=\"${1}\"\n  local name=\"${2}\"\ncat <<EOF\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: ${name}\n  labels:\n    volume: ${name}\nspec:\n  capacity:\n    storage: 100Gi\n  accessModes:\n    - ReadWriteOnce\n    - ReadWriteMany\n    - ReadOnlyMany\n  hostPath:\n    path: ${basedir}/${name}\n  persistentVolumeReclaimPolicy: Recycle\nEOF\n}\n\nfunction setup_pv_dir() {\n  local dir=\"${1}\"\n  if  ! -d \"${dir}\" ; then\n    mkdir -p \"${dir}\"\n  fi\n  if ! chcon -t svirt_sandbox_file_t \"${dir}\" &> /dev/null; then\n    echo \"Not setting SELinux content for ${dir}\"\n  fi\n  chmod 770 \"${dir}\"\n}\n\nfunction create_pv() {\n  local basedir=\"${1}\"\n  local name=\"${2}\"\n\n  setup_pv_dir \"${basedir}/${name}\"\n  if ! oc get pv \"${name}\" &> /dev/null; then\n    generate_pv \"${basedir}\" \"${name}\" | oc create -f -\n  else\n    echo \"persistentvolume ${name} already exists\"\n  fi\n}\n\nbasedir=\"/var/lib/minishift/base/openshift.local.pv\"\n\nfor i in $(seq -f \"%04g\" 1 100); do\n  create_pv \"${basedir}\" \"pv${i}\"\ndone\n'"
"/bin/bash -c '#!/bin/sh\nset -o allexport\nexec openshift start etcd --config=/etc/origin/master/master-config.yaml\n'"
"/bin/sh -c '/usr/bin/dockerregistry ${REGISTRY_CONFIGURATION_PATH}'"
COMMAND
"hyperkube kube-controller-manager --enable-dynamic-provisioning=true --use-service-account-credentials=true --leader-elect-retry-period=3s --leader-elect-resource-lock=configmaps --controllers=* --controllers=-ttl --controllers=-bootstrapsigner --controllers=-tokencleaner --controllers=-horizontalpodautoscaling --pod-eviction-timeout=5m --cluster-signing-key-file= --cluster-signing-cert-file= --experimental-cluster-signing-duration=720h --root-ca-file=/etc/origin/master/ca-bundle.crt --port=10252 --service-account-private-key-file=/etc/origin/master/serviceaccounts.private.key --kubeconfig=/etc/origin/master/openshift-master.kubeconfig --openshift-config=/etc/origin/master/master-config.yaml"
"hyperkube kubelet --address=0.0.0.0 --allow-privileged=true --anonymous-auth=true --authentication-token-webhook=true --authentication-token-webhook-cache-ttl=5m --authorization-mode=Webhook --authorization-webhook-cache-authorized-ttl=5m --authorization-webhook-cache-unauthorized-ttl=5m --cadvisor-port=0 --cgroup-driver=systemd --client-ca-file=/var/lib/origin/openshift.local.config/node/node-client-ca.crt --cluster-domain=cluster.local --container-runtime-endpoint=unix:///var/run/dockershim.sock --containerized=true --experimental-dockershim-root-directory=/var/lib/dockershim --fail-swap-on=false --healthz-bind-address= --healthz-port=0 --host-ipc-sources=api --host-ipc-sources=file --host-network-sources=api --host-network-sources=file --host-pid-sources=api --host-pid-sources=file --hostname-override=localhost --http-check-frequency=0s --image-service-endpoint=unix:///var/run/dockershim.sock --iptables-masquerade-bit=0 --kubeconfig=/var/lib/origin/openshift.local.config/node/node.kubeconfig --max-pods=250 --network-plugin= --node-ip= --pod-infra-container-image=openshift/origin-pod:v3.11.0 --port=10250 --read-only-port=0 --register-node=true --root-dir=/var/lib/minishift/base/openshift.local.volumes --tls-cert-file=/var/lib/origin/openshift.local.config/node/server.crt --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 --tls-cipher-suites=TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256
"hyperkube kube-scheduler --leader-elect=true --leader-elect-resource-lock=configmaps --port=10251 --kubeconfig=/etc/origin/master/openshift-master.kubeconfig --policy-config-file="
"hypershift experimental openshift-webconsole-operator --config=/var/run/configmaps/config/operator-config.yaml -v=0"
"hypershift openshift-apiserver --config=/etc/origin/master/master-config.yaml -v=0"
"hypershift openshift-controller-manager --config=/etc/origin/master/master-config.yaml --v=0"
"openshift start network --enable=dns --config=/etc/origin/node/node-config.yaml"
"openshift start network --enable=proxy --listen=https://0.0.0.0:8444 --config=/etc/origin/node/node-config.yaml"
"service-serving-cert-signer apiservice-cabundle-injector --config=/var/run/configmaps/config/controller-config.yaml -v=4"
"service-serving-cert-signer operator --config=/var/run/configmaps/config/operator-config.yaml -v=4"
"service-serving-cert-signer serving-cert-signer --config=/var/run/configmaps/config/controller-config.yaml -v=4"
"/usr/bin/openshift-router"
"/usr/bin/origin-web-console --audit-log-path=- --config=/var/webconsole-config/webconsole-config.yaml -v=0"
"/usr/bin/pod"

最近気になっていること

 データ転送主体の情報処理におけるアルゴリズムの役割(の小ささ)

メインフレームの場合はたとえば夜間バッチとかで途中でミスったらやり直す前提になっていて

 日本の場合だと銀行が15時に窓口を閉めることでデータに大域ロックをかけれているわけだけど、例えば決済を24時間化することでバッチ処理でできないことが増えている、というより、オンライン処理というのはロックの間隔の極端に短いバッチ処理の連続としてとらえるべきなのだろう

 

想定しているのはメインフレーム上のCOBOLとか、最近のクラウド上のサーバレス(function as a service)とか関数型不変データ構造とかなんだけど、データの読み取りも書き出しも共有ストレージに対して行うことを強要されていて、冪等性がある、っていう要件の情報処理のパターンをひとつのクラスとして定義したいと思ってる

何が辛いって基本的にほとんど計算量の下限がO(n)になること

要するにローカルメモリ上で延々と破壊的変更をやる場合にだけ「アルゴリズム的思考」って有効なんじゃないか?という、その破壊的変更が並列化とか冪等性とか安全な冗長化と両立しないっぽい

冗長化って要するに並列処理して片方の結果を捨てることだから

 

追記:というか、自分が常々主張してる「余計算」(cocomputation)の例だと思うんだけど、直列なアルゴリズムを並列化すると情報インフラがアルゴリズムのグラフ表現に漸近して、最終的には回路図とか固有値とかで書かないといけなくなる

追記2:たとえばメモリのアドレッシングがO(1)なのって、ラッチを横に並べただけ並列処理できてるからだよね。。じゃあ、リニアなアドレス空間がなくなってJSON/YAML/XMLみたいな文脈自由言語のアドレスになったら並列性の恩恵が無いし、たとえばラッチに相当する1語分のメモリが1つのRESTのエンドポイントに対応するとなったら?これは冗談ではなくてそうなりかけてるクラウドアプリ屋さん絶対居るはず

通信村と金融村とアプリ村とゲーム村と制御村の温度差についての文化人類学的な何か

日本人は誇り高い部族主義者で、ソフトウェア産業はバルカン化されてる

自分は通信村しか見えてないので通信村の前提を整理したい、金融村に行くには自分は規範意識が弱すぎて無理だし、アプリやゲームや制御で要求される細かな知識もない

ひょっとすると日本の地形が険阻なせいで通信の役割が大きすぎるし、そのせいで発注者としての電話会社の地位が優越的すぎる

半群的世界観と群的世界観

連続群を理解するための数学的な前置きはなぜあんなに長いのか、というのが気になっていて、確かにあれは位数というような量は持たないんだけど、かわりに次元とか極性とかそういう有限性の制約を受けていて、だから代数的計算ができるし、こんどは次元や極性の対称性自体が有限群をなしている、ということになる

ざっと考えてみるに、どうも

  • 半群論をベースにする計算機科学
  • 群論をベースにする数理物理学

って折り合い悪いというか、なにか対立する世界観だと思う
この対立はもちろん計算論には存在していなくて語の問題というのは両方に関係するし、もちろん両方に足を突っ込んでるBaezみたいなつわものもいるし、最近の量子力学(や動学マクロ経済学)の教科書はオートマタが最初のほうのページで出てきたりもする
理論物理の人がなぜ半群なのに繰り込み群と意図的に間違った名前で呼び続けてるかというと、要するにリー群の閉じた属とかW*環とか解析的連接層とかを考えていて、エネルギー保存がexactに成り立っている(詳細釣り合い)ような十分に大きな系をとればそれは群の直和に分解できる、という確信があるからであって(経路積分の数学的正当化もおそらく似たような話)、しかし計算機サイドはそういう閉じた系をほとんど常に想定しない(無限に伸びたテープ!)

で、逆に数理物理的な見方を計算機クラウドとかを考えるときに使うことはありうるか?余帰納性のあるところには繰り込み群があるとはいえそうなので

記憶とはなにか?

記憶とはなにか?

それは「相関を切る」ことだ、と答えたい。

たとえばキーボードから文字を入力するとき、コンピュータが記憶する文字列はキーボード上の指の座標と運動量とそれらの高次モーメントと相関する。入力した文字が短いタイムラグで画面に表示されるなら、指のモーメントと画面上の表示の変化も相関する。

しかしいったん記憶した文字列はもはやコンピュータの外のいかなる現実ともほとんど相関しない。強烈な電磁ノイズでその記憶を破壊することはできるだろう、その文字列がオブジェクトとして持っているハンドルを知っている人間ならハンドルを指定して消去や編集できるだろう。

しかし、ハンドルを知っているとはどういうことか。つまりその文字列に用事がある、縁があるとは限らないが、少なくともそのコンピュータに用があるのだ。本人が書いたわけではなくとも、たとえばその人間がそのコンピュータにアクセスして文字列ハンドル一覧を取得するなどした場合、その人間の記憶とコンピュータの状態全体は相関している。その結果としてその人間はコンピュータの記憶した文字列にアクセスできる。

人間は草食動物たりうるか?

追記:オーガニック死霊のはらわた
この小説読んだのに忘れてた…

性行動と食性の可塑性

ヒトの性行動には可塑性があることが知られている。男性同性愛者は全人口の5%を占めるといわれる(これは遺伝的要因も強いらしい)。人口の伸びの止まった豊かな国ではこの可塑性は文化的に抑圧されず、政治的に配慮が進み、また性行動や文化的なジェンダーの多型化傾向が強まるように見える(ここではこの件を追究しない)。性行動の可塑性のひとつとして、性行動の減退、というものがあり、男性の「草食化」などと日本語では俗称される。
いっぽうでヒトの食性は基本的には雑食(動物性と植物性の食物を摂取する必要がある)とされているが、大豆など、不足するアミノ酸を補うことで菜食で生きることは可能ではある。カロリーを穀物に多く依存する東アジア人の腸は欧米人のそれに比べ長い傾向があるとされる。
ヒトを文字通り「草食化」させる方法について考えてみたい。

ヒトと細菌の共生と、ウシと細菌の共生の違い

ヒトの腸に共生する微生物群(腸内細菌叢)は近年のヒト医学・生理学において活発に研究されているトピックである。腸の自己免疫疾患を糞便移植によって治療できる、という報告は多くの注目をあつめた。
食品業界でいわば「工業的に生産できる食物繊維」として脚光を浴びている、難消化性デキストリンという物質がある。これはデンプンを加水分解する際に僅かに生じる、分枝をもつ多糖類であって、胃で分解できないが、腸に到達するとそこで代謝され、腸内細菌叢の栄養源として利用される。
腸内細菌叢による難消化性デキストリン代謝のメカニズムは、ウシの第一胃(ルーメン)に共生する微生物群によるセルロース代謝のメカニズムと類似している。では、ウシのルーメンの中身ないしそれに似たものをヒトの腸に共生させたら、ヒトは草食性になりうるだろうか?

腸と脳と人格

ヒトの腸のクロム親和性細胞は脳神経同様にセロトニンを生産することが知られており、腸内の単糖類の濃度が上昇した場合、これらの細胞の活動に影響を与える可能性がある。そもそもクロム親和性細胞は獲得免疫機構との関連が指摘されていて、むしろヒトの脳自体が免疫機構の高度化のいわば副産物として知能を獲得した可能性すらある。
腸の内容物をコントロールすることで我々は高次脳機能を間接的にコントロールできる見込みが高いし、将来的には「人格」というものの独自性は次第に失われると考えられる。