自動テストの難しさと意味上の制約(機械翻訳された日本語で書かれた)
all who suffer from wall of YAML should be more aware of semantics. ordinary computer languages can compiled to machine language, with relatively small and fixed semantical constraints
— (change of )*state (@TuvianNavy) July 24, 2020
YAMLの壁に苦しんでいるすべての人は、セマンティクスをより意識する必要があります。通常のコンピューター言語は機械語にコンパイルでき、比較的小さく固定された意味上の制約がある
通常のCPUの場合、ISAとABIに示すように、それらが存在すること、プログラムカウンター、スタックポインター、および破棄できるレジスタを予測できます。 パブリッククラウドの特派員は非常に多様です
HPCでの並列処理を意識した最適化には事前実行が必要であるため、kubectl、heat、ansibleおよびvagrantを使用した宣言型クラウドオーケストレーションには常に事前実行が必要です。
クラウドオーケストレーションで必要なメタレベル(リソース割り当て)ステートマシンの構築は、MPIを使用するHPCアプリケーションよりも非常に脆弱です。
私たちのフィールド経験から、そのような構築には、さまざまな組織化された統一リソースラベル付け規則(Linux udevからKubernetesラベル、ノード名へのパスまで)が含まれる場合があります。私たちは毎日新しいものを発明する必要があります。
それは摂食と繁殖に最適化された脳にとって大きな負担です。 YAMLの壁は、組み合わせの性質の心理学的負荷です。
一部のテストを自動化してCI / CDプロセスに統合しようとする場合(ため息)
実際には、テストの構築に失敗する前に、このようなテストの前提条件を知ることはできません。定義に含まれるコンテナー、リソース、ポイントツーポイントデータパスが含まれます。
オーケストレーションの宣言は、自動テストの「意味上の制約」です。私たちが宣言するものは、テストできるものの境界です。
おそらく私たちは、私たちの体、部屋、または町など、私たちが言うことの「大まかな事前実行」を実行する世界のモデルを持っています。 したがって、間違った宣言を書きたくない場合は、最初にクラウド回路基板を脳にマッピングする必要があります。
semantical dependency in cloud declaration forces me inevitably to think about syntax-semantics interdesign in DSLs. https://t.co/CUhD5nbMoS
— (change of )*state (@TuvianNavy) July 24, 2020
クラウド宣言の意味的依存関係は、必然的にDSLの構文-意味論の相互設計について考えることを余儀なくさせます。
JSON / YAMLのおかげで、解析について心配する必要はありません。私たちの問題は、一般にコンパイル時および実行時の制約チェックです。
私の知る限り、コンパイラー設計入門コースではオプティマイザーについて言及していません。上級コースでは通常、典型的なCPU設計のみを取り上げていると思います。リソース認識型のクラウド展開は、基盤がなく脆弱な領域です。
おそらく、基盤は見つかりません。したがって、私たちの選択は次のとおりです。(1)YAMLの壁に取り組み、アドホックな最適化に苦痛な努力を続ける(2)無益な自動化を放棄する ...あなたのは?
Kubernetes速修コース(案)
Kubernetes the hard way がいくらなんでもハードル高すぎてやる意欲が出ないので、最低限これだけ試せばKubernetesの公式文書や世の中の実装非依存な説明が具体的な実装において何を意味しているかが判るという観点で研修コースのシラバスを作ってみた。なおLinuxについてはネットワーク周り含め基礎的な理解・スキルは前提
環境構築
(同時に複数人に説明する場合はあらかじめ環境を用意しておく)
何でどう作ってもいいのですが、個人で試す場合メモリもあんまり潤沢にないので
- ESXiなりVirtualBoxなりを用意
- Alpine でVMを建てて各VMにDockerを入れる
※軽さを最重視した選択ですがコンテナのベースとしての使い勝手は良くないので、普通に使うならUbuntuとかのほうがいい、という意見を目にしました。なおRHEL8/CentOS8はDockerをサポートしないので非推奨です - k3s でシングルマスタ構成のKubernetesクラスタを作る
- 以後、kubectlとcurlとyq/jqで操作をしていく
api-server篇
- kubectl api-resources
- Kubernetesのエンドポイントにcurlでリクエストを投げて各resourceに対応するGET/PUT/DELETE/POST等があることを確認する
- (watchとwebhookどうしよう)
- etcdの中を見てみる
※k3sだとsqlite3でした。。具体的にどこ見ればいいか調べます
CRI(Docker)/kubelet篇
Docker以外のCRI(podman/CRI-OとかVMベースのやつ)だと様子がわからなくて死ぬ
- docker ps --no-trunc
- ps -efwww
- sudo ls /var/lib/docker/containers
- df
- ip -brief l
- ip -brief a
- docker exec <container> ip -brief l
- docker exec <container> ip -brief a
kube-proxy篇
usermode proxy誰も使ってないし、ipvsとかは必要な人が確認すればいい。nftables対応マダー?
- kubectl get pods --all-namespaces
- kubectl get services --all-namespaces
- iptables -t nat -L
- (上級者限定)https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/iptables/proxier.go
CNI篇(Flannel?Calico?)
正直これは悩む。Flannelの成立事情とか語りだしたらほんときりがない
- ls -R /etc/cni
- ls -R /opt/cni/bin
- ls -R /var/lib/cni
- kubectl api-resources
- ovs-vsctl?
Service/Ingress/Istio/CSIまわり
シラバスが思いつかない。実用上は絶対に要る知識なんだけどアーキテクチャ的にはかなりどうでもいいので別の研修にしたほうがいいかなあ。。
超上級者向け補講
Kubernetesの神髄といえる知識がここにあるのでわかる人は読んで人類に貢献してください。言語処理系とかWindowsのC++でATLを使ってCOMコンポーネントとか開発できるレベルの人以外は読んでも知識として活かせないです(書いてる本人含め)
running minishift (ongoing)
Situation forced me to learn kubernetes..
- machine: Intel(R) Core(TM) i3-7100U CPU @ 2.40GHz 32GB RAM / 240GB SSD / RTL8x11 / I219-V (Liva Z plus)
- os: CentOS Linux release 7.7.1908 (Core), updated, minimal + libvirt stuffs + GUI + virt-install + (epel) Xfce + (epel) dkms + (epel) xrdp + Intel e1000e driver
- first obtain minishift tarball and docker-machine-driver-kvm-centos7 binary renamed as docker-machine-driver-kvm and place them under /usr/local/bin
- minishift fetches artifacts under $HOME/.minishift/cache (keep them)
- https://github.com/minishift/minishift/releases/download/v1.34.2/minishift-1.34.2-linux-amd64.tgz
- https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.10.0/docker-machine-driver-kvm-centos7
- https://github.com/minishift/minishift-centos-iso/releases/download/v1.16.0/minishift-centos7.iso
[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%を占めるといわれる(これは遺伝的要因も強いらしい)。人口の伸びの止まった豊かな国ではこの可塑性は文化的に抑圧されず、政治的に配慮が進み、また性行動や文化的なジェンダーの多型化傾向が強まるように見える(ここではこの件を追究しない)。性行動の可塑性のひとつとして、性行動の減退、というものがあり、男性の「草食化」などと日本語では俗称される。
いっぽうでヒトの食性は基本的には雑食(動物性と植物性の食物を摂取する必要がある)とされているが、大豆など、不足するアミノ酸を補うことで菜食で生きることは可能ではある。カロリーを穀物に多く依存する東アジア人の腸は欧米人のそれに比べ長い傾向があるとされる。
ヒトを文字通り「草食化」させる方法について考えてみたい。
ヒトと細菌の共生と、ウシと細菌の共生の違い
ヒトの腸に共生する微生物群(腸内細菌叢)は近年のヒト医学・生理学において活発に研究されているトピックである。腸の自己免疫疾患を糞便移植によって治療できる、という報告は多くの注目をあつめた。
食品業界でいわば「工業的に生産できる食物繊維」として脚光を浴びている、難消化性デキストリンという物質がある。これはデンプンを加水分解する際に僅かに生じる、分枝をもつ多糖類であって、胃で分解できないが、腸に到達するとそこで代謝され、腸内細菌叢の栄養源として利用される。
腸内細菌叢による難消化性デキストリンの代謝のメカニズムは、ウシの第一胃(ルーメン)に共生する微生物群によるセルロースの代謝のメカニズムと類似している。では、ウシのルーメンの中身ないしそれに似たものをヒトの腸に共生させたら、ヒトは草食性になりうるだろうか?