変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

[Oracle19c]どうやって起動 するん?

まず、SQLPLUSからCONNECTしようとしたら

ORA-12162: TNS:net service name is incorrectly specified

原因は、ORACLE_SIDを環境変数に登録していなかったせいらしい。

~/.bash_profileに追加して

$ source ~/.bash_prodile
$ sqlplus /NOLOG
SQL> connect AS SYSDBA
Enter user-name: sys
Enter password: ****************
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area 2432695832 bytes
Fixed Size		    9137688 bytes
Variable Size		  570425344 bytes
Database Buffers	 1845493760 bytes
Redo Buffers		    7639040 bytes
Database mounted.
Database opened.
SQL> 

終わる時は、shutdown、quit。

さて、A5から直接接続できるか試してみたけど

ORA-12514: TNS:listener does not currently know of service requestion in connect description

から先に進めなかったので、

順当にOracleClientをインストし、

ORACLEデータベースをインストしたLINUXにあるtnsnames.oraから下記をコピペして、

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ***)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ****)
    )
  )
HOST = ***はPCからデータベースをインストしたサーバの名前かIPアドレス
SERVICE_NAME=****はそのまま使う。

PCの適当なフォルダにtnsnames.oraファイルを保存し、

保存先フォルダ名はユーザ環境変数「TNS_ADMIN」に保持。※システム環境変数の方がいいはず

ODBCデータソースアドミニストレイーターで、データソースを新規追加する。

ORACLEクライアントを選択して

TNSサービス名にSID(ここではtnsnames.oraでORCLだから)を入れ、「接続テスト」
ユーザー名とパスワードを入れて
で、良かったらしい。

さて、A5では

な感じで「テスト接続」は、

だったので、【OK】して保存。

こんな調子で大丈夫なのか?と自分でもツッコミをいれたくなったけど

管理ツールタグを見れば

なので大丈夫らしい。

あとはPDBにテーブルを作って、アクセスできればOKかな?



[Linux]xrdpインスト

1.CentOS7の場合

epelを追加

# yum -y install epel-release
## yumコマンドに --enablerepo=epel オプションを指定した場合のみ epel が有効になる様に
# vi /etc/yum.repos.d/epel.repo
enable = 1 ⇒ 0 に修正。

パッケージをインスト

# yum -y --enablerepo=epel install xrdp
# yum -y --enablerepo=epel install tigervnc-server
## エラーが起きやすい設定を修正
# vi /etc/xrdp/xrdp.ini
max_bpp=32 ⇒ 24 に修正
# systemctl start xrdp
# systemctl enable xrdp

ファイアウォールの設定変更

# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload

オマケで

yum update

2.CentOS8の場合

epelを追加

# dnf -y install epel-release
## dnfコマンドに --enablerepo=epel オプションを指定した場合のみ epel が有効になる様に
# vi /etc/yum.repos.d/epel.repo
enable = 1 ⇒ 0 に修正。

パッケージをインスト

# dnf -y --enablerepo=epel install xrdp
# dnf -y --enablerepo=epel install tigervnc-server
## エラーが起きやすい設定を修正
# vi /etc/xrdp/xrdp.ini
max_bpp=32 ⇒ 24 に修正
# systemctl start xrdp
# systemctl enable xrdp

ファイアウォールの設定変更

# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload

オマケで

# dnf update


[ActiveX]ブラウザでActiveXを使いたい

EdgeのIEモードもいつまであるのか判らないので・・・

C#のEXEでRESTサービスサーバを作り、ブラウサからデータベースにSQLでアクセスできる様な仕組みをポチポチと作ってみる。勿論、ポート開放なんてしない。

しかし思っていた以上に面倒なことが判明した。

public static object? CreateObject(string progId)
{
Type? t = Type.GetTypeFromProgID(progId);
return t == null ? null : Activator.CreateInstance(t);
}
object? activeXObject = CreateObject("ADODB.Connection");

それっぽいオブジェクトは出来るが、activeXObject変数のクラス名が”System.__ComObject”で、希望するメソッドやプロパティの情報は取得できず、ウォッチビューで中身を見ると[動的ビュー]の中にそれっぽいプロパティが見えるがアクセスする方法は判らなかった。

但し、その変数をそのActiveXObjectのクラスに置き換えると、Accessファイルも開けてしまうのでとりあえず、キャストしてコードを書けば良いらしい。

object? activeXObject
ADODB.Connection? cn = activeXObject;
cn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:C:\\Users\・・・\Database1.accd\"");

事前にメソッドの名前さえ判っているなら、動的にメソッドを呼ぶ方法が使える。(カモ

参照:https://dobon.net/vb/dotnet/programing/typeinvokemember.html

string progId="ADODB.Connection";
activeXObject = ActiveX.CreateObject(progId);
// TEST
if (activeXObject != null)
{
    Type t = activeXObject.GetType();
    t.InvokeMember("Open",
        BindingFlags.InvokeMethod,
        null,
        activeXObject,
        new object[] { "Provider=Microsoft.ACE.OLEDB・・・\Database1.accdb\"" });
}
実行すると例外発生
Exception ex:
{"Exception has been thrown by the target of an invocation."}

ん?クラス名がダメなのかな?正しいTypeを取得する方法は予想の斜め上にあった

参照:https://docs.microsoft.com/ja-jp/dotnet/api/system.type.gettype?view=net-6.0#system-type-gettype(system-string)

string progId="ADODB.Connection";
activeXObject = ActiveX.CreateObject(progId);
// TEST
if (activeXObject != null)
{
    Type t = Type.GetType(progId);
    t.InvokeMember("Open",
        BindingFlags.InvokeMethod,
        null,
        activeXObject,
        new object[] { "Provider=Microsoft.ACE.OLEDB・・・\Database1.accdb\"" });
}

これで、メソッドを呼び出すことができたので、キャストだらけのコードも改良の余地がありそうだ。

何でも(メソッド)勘でも(プロパティ)非同期通信で処理すると重そうので、newの後に一式プロパティを送信し、メソッドの実行後に置き換わりそうなプロパティを戻り値を[activeXObject]と[returnValue]に纏めて送信することにする。メソッドを実行するオブジェクトは、ハッシュ管理し、ブラウザからはハッシュを指定して実行する様にした。

※というか

IEの場合、
var table_name = schema.Fields("TABLE_NAME").Value

IE以外の場合、※(…)を[…]に書き換えるしかない様だ。
var table_name = schema.Fields["TABLE_NAME"].Value

な呼び出しをする場合が多い、ここにawait 入れると解読不能になるとしか思えなかった。(ので

※ハッシュ値は諸事象から $”{クラス名}_{ハッシュ値:x}” にした。

javascriptのnewはasyncが指定できないので、newの直後にJavaScript側でプロパティやメソッドの入り口を用意しておく。メソッド実行時にまだハッシュを受信していない場合は、ハッシュ受信時にonobjectIDを処理し、再度メソッド実行を送信するようにする。

※ブラウザ側で不要になったと判断したActiveXObjectオブジェクトは、ActiveXObject.term()を呼び出して、DELETEメソッドでオブジェクトの消去をするように。(できたらいいなぁ

if (this.objectID == null) {
    this.onobjectID = async function () {
        let rc = await this[methodName].apply(this, args);
        resolve(rc);
        return;
     }
} else {
     let path = `ActiveXObject/${this.objectID}/${collectionName}/${methodName}`;
     return new Promise(async (resolve, reject) => {
     let json = await ActiveXObject.staticSendMessage('PUT', this.domain, this.port, path, args);
obj.objectID = json["objectID"];
if (typeof (obj.onobjectID) !== 'undefined')
{
    obj.onobjectID();
}

JavaScript側でActiveXオブジェクトのインスタンスを配列で管理すると使用済みでも残ってしまうので、

インスタンスの管理はC#側のみで行う。

非同期通信の処理待ちをするため await を差し込まないといけないのは面倒だが仕方が無い。

await指定で呼び出す関数の方はasync指定して最後にresolveを渡す様にする。

何気に途中でreturn ; してるケースも同様。

※resolve(true)で処理が途切れるかと思い、手抜きしたら、ダブルresolve(true)してしまい動作が変になったので、直後にreturn を入れておく。

async function xxxxxx () {
・・・・・最後に
Promise.resolve(true);
return;
}

C#側から返す値はJSON形式にしたけど、javascript側からオブジェクトを渡すパラメータはtoStringで済ませているのでちゃんとしないとまずいなぁ。(そのうち何とかしよう

とか、簡単にしようとするとハマるパターンだ。

ちゃんと同期が取れていると

所感)

ブラウザとVisualStudioの両方でブレークポイントを指定して順に動かしていくと、ブラウザとVisualStudioが交互にポップアップして切り替わるのが面白かった。一度お試しあれ。



[Oracle19c]Linux版

AlmaLinux9やOracleLinux9のように新しいOSでは

アレが無い、コレが無いと、dnfがお得意の関連パッケージの自動インストール機能がうまく機能していない。

しかし、古いCentOS7なら、あまり面倒なことをせずに19Cのインストーラの初期画面まで進んだ。

※但し

  • 前提条件のチェックを全てクリアするために、
  • CPU4個、メモリ16GB、スワップ領域16GBに増量。
    • パッケージのアップデート時にX-Windowの画面が固まり操作不能になるので、CPU+3個
    • インスト時にスワップ領域不足の警告が出るのでスワップ領域を増量。
      • 8GBではstartup時にシェアメモリ不足(ORA-27104)が発生。更に増量(16GB)
    • インスト時にシェアメモリ不足の警告が出るのでメモリ増量してカーネルパラメータを再計算
  • リスナー作成直後に再起動するとリスナが起動してないので
    • /etc/hostsにノード名が無かったので追記し、lsnrctl startする。
  • アドバンスモードではOracle Enterprise Manager のポートに何を指定してもダメだったので、チェックを外した。

参考1:CentOS7 Stream Oracle Database 19c : インストール では日本語でインストーラが動いた。

CentOS8は OSのサポートが2021年12月末で終了し、https://ftp.riken.jp/Linux/centos/8.5.2111/isos/x86_64/ のリンクも無くなったので、

CentOS8 Streamを使う事になる。

CentOS Stream 8 へ https://ftp.riken.jp/Linux/centos/8-stream/isos/x86_64/

参考2-1:Oracle Dtabase 19c(CentOS8) は、最終的には「なぜかうまくいかない」。

※参考2-1は、メモリ8GBで試行している。

以下、変更点

1.カーネルパラメータの設定方法

元々は固定値で設定していたが、割り当てたメモリ量から計算する様に修正。

# MEMTOTAL=$(free -b | sed -n '2p' | awk '{print $2}')
# SHMMAX=$(expr $MEMTOTAL / 2)
# SHMMNI=4096
# PAGESIZE=$(getconf PAGE_SIZE)
# cat > /etc/sysctl.d/50-oracle.conf << EOF
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmmax = $SHMMAX
kernel.shmall = $(expr \( $SHMMAX / $PAGESIZE \) \* \( $SHMMNI / 16 \))
kernel.shmmni = $SHMMNI
kernel.sem = 250 32000 100 128
kernel.panic_on_oops = 1
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF

2.インストールするパッケージの追加

インストーラを起動するとエラーが出たので、それっぽいパッケージを追加。

# dnf -y install libnsl

ダウンロードしたrpmをインストールする手順が抜けていたので追加

# dnf localinstall  *.rpm       ※個別にrpmファイルをしてして実行したけど、多分これでいいはず

差し替えるJDKのパスを

# cp -r /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-11.el8.x86_64/jre /u01/app/oracle/product/19.3.0/dbhome_1/jdk/jre

hostsに自分のマシン名が無いので

127.0.0.1   ******.******.****** localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         ******.******.****** localhost localhost.localdomain localhost6 localhost6.localdomain6

ここまでやっても、

「インストール」ボタンを押して7%まで進んだあたりで

「ファイル%filename%が見つかりません」

と出るエラーが出る、「継続」押下で続けるが・・・

100%まで進んるのになぁ
OpenJDKに差し替えて動いたけど、どこかで互換性が無くて失敗したっぽい。
DBCAの構成で失敗してるので、日本語対応のJREに差し替えたせいかもしれない。

※メモリ16GBでの動作は未確認。

参考2ー2:CentOS8 Stream Oracle Database 19c : インストール のページはインスト直前まで。

login: oracle
Password:xxxxxxx

$ vi ~/.bash_profile
# 最終行に追記
umask 022
export ORACLE_BASE=/u01/app/oracle

# インストール用 Dir 作成
$ mkdir database

LANG=Cを付けてインストーラを起動すると真っ白になる。とりあえず、保留。

参考2ー3:CentOS8 Oracle Database 19c : インストール すると日本語文字化けするので

cd database
$ unzip LINUX.X64_193000_db_home.zip
$ export CV_ASSUME_DISTID=RHEL8.2
$ export LANG=C
$ ./runInstaller

CentOS8系では、インストーラのJREの日本語フォントとX-Windowの日本語フォントがうまくマッピングされず日本語モードでは文字化けするが、英語モードでのインストールなら問題無し。

しかし、メモリ8GBで得たシェアメモリの容量ではstartupでシェアメモリの容量不足となり16GBに増量し、カーネルパラメータを再計算したところ、startupに成功した。

CentOS8 stream でメモリ8GBでも使えるカーネルパラメータの計算方法があればいいんだけど。

そんな訳で、CentOS8系は微妙。

参照2-3に参照2-1のJRE差し替えを混ぜるといいのかもしれない。

Hyper-Vの起動画面よりもXRDPでWindowsのリモートデスクトップ越しにインストーラを起動した方がマウスカーソルもオーバーラップするしコピペもできインストールもスムーズ。

・・・

と書いたものの、実際やってみると手順通りにヌルっとインストールできず、ドコかでアハってしまう。

rootでシェル起動してもいい?ってメッセージをちょっと放置したら画面が固まるけど、それはOSアップデートが後追いでやってきたせいな気もする。

yumやdnfのアップデートでおきる僅かな修正で何かがうまくいっていないんだろう。

インストーラのチューニングが攻めすぎなんだろうね。

Linux「9」なんて無理そうだから、ここで調査を終了。

とりあえず、CentOS7がアンパイだ。



買ってよかったもの

モバイルモニター タッチパネル

自作PCが不調な時にデスクの上のモニタを持ち運ぶのが面倒だったので購入。今時のWindowsならスクリーンキーボードを併用すれば、キーボードとマウスも不要。今時のCPUならUSBケーブルのみで利用も可。

ロジクール ワイヤレスマウス 無線 マウス Pebble M350GR

とにかく薄っぺらなところが良い。



[CentOS]どうしよう

開発もサポートも切れるので乗り換えないといけない。

とりあえず、AlmaLinux 9.x に乗り換える予定。

GUIをインストするには

# dnf grouplist

でグループパッケージを探してみるが、GNOME Desktopは無かったので

# dnf groupinstall "SERVER with GUI"

で我慢する。

XRDPをインストしようとしたらパッケージが無いとか散々。

ぐぐってみるとちゃんとAlmaLinux9でのインストページがあった。

epelリポジトリィを追加するのを忘れていたせいか。

無事、リモートデスクトップに繋がったものの、コレジャナイ感が漂う。



[ActiveX]JavascriptのActiveXの代案 ※検討中

Windows11でIEが消えていたので、IE用のJavaScriptでActiveXを使ってブラウザでMDBの中身を見るツールが使えない。

そこで、C#でローカルWEB(+REST)サーバEXEを作り、ActiveXをEXEで処理してブラウザは非同期通信でリモートでコントロールさせてみたい。

IE用のindex.htmlとJSファイルはEXEのwwwrootフォルダに入れておき

C#のMainから8000ポートを開き、GETコマンドリクエストがあれば、exeファイルのトコのwwwrootフォルダのファイルを返す様にしておく。

参考文献:簡易Webサーバを実装するには?[2.0のみ、C#、VB]

using System;
using System.IO;
using System.Net;

namespace LocalWebServer
{
class WebFileServer
{
  static void Main()
  {
    string root = @"wwwroot\"; // ドキュメント・ルートは好きな場所でOK
    string prefix = "http://localhost:8000/"; // URLはしっかり書かないとエラる
    // ブラウザでindex.htmlを開く。ココからjsファイルもGETされるハズ
    System.Diagnostics.Process.Start(prefix + "index.html");
  //
    HttpListener listener = new HttpListener();
    listener.Prefixes.Add(prefix); // プレフィックスの登録
    listener.Start();
    while (true) {
      HttpListenerContext context = listener.GetContext();
      HttpListenerRequest req = context.Request;
      HttpListenerResponse res = context.Response;
      Console.WriteLine(req.RawUrl);
      // リクエストされたURLからファイルのパスを求める
      string path = root + req.RawUrl.Replace("/", "\\");
      // ファイルがあれば出力
      if (File.Exists(path)) {
        byte[] content = File.ReadAllBytes(path);
        res.OutputStream.Write(content, 0, content.Length);
      } else {
         // TODO エラー処理 404 あるいはREST処理をしないといけないかもしれない
      }
      res.Close();
    }
  }
}
}

とRESTのWEBサービスっぽく

HTMLファイルは、

<script src="./ActiveX.js">
・・・
<script src="./${他のjsファイル}">

と付け加え、JavaScript上のActiveX(“xxxxx”)の実装を差替える。

ActiveX(objectID) => {
  let promise = new Promise( (resolve, reject) => {
    let domain = "localhost";
    let port = 8000;
    let xhr = new XMLHttpRequest();
    xhr.open('GET', `http://${domain}:${port}/ActiveX/`, true);
    xhr.responseType = 'json';
    xhr.send(null);
    xhr.onload = function(e) {
      if (xhr.readyState == 4) {
        if (xhr.status == 200 ) {
          resolve(JSON.parse(xhr.response));
        }
      }
    };
  });
  return promise;
};

ActiveXの予備元やそのメソッドの呼び出しは全てawaitを追記

async function  xxxx(...)
{
  let obj = await ActiveX("xxxxx");
}

プロパティ呼び出しはC#側でデータを展開しておいた方が良さそう

しかし、メソッドもプロパティもいっぱいあるので

class  ADODB_xxxxxx
    constractor()
    {
        this.className = "ADODB.xxxxxx";
        dummy_properties();
        dummy_methods();
    }
    dummy_properties()
    {
      let properties = ['BOF','EOF',....,'fields'];
      properties.foreach( (p) => {
          this[p] = new Function (`
            set ${p}(v) {
               alert('set ${p} no support.');
            }
            get ${p}() {
               alert('get ${p} no support.');
            }
          `);
      });
    }
    dummy_methods()
    {
      let methods = ['BOF','EOF',....,'fields'];
      methods.foreach( (m) => {
          this[m] = new Function (`
               alert('set ${m} no support.');            
          `);
      });
    }

で、TODO風に作っておいて、後で実装を考えた方が良さそう。

あるいは、各ActiveX用のクラスJSファイルは、ワーカースレッドよろしく

var adodbWorkers = [];
・・・
adodbWorkers["ADODB.xxxxxx"] = new Worker('ADODB.xxxxxx.js');

とやって

adodbWorkers["ADODB.xxxxxx"].postMessage(${メソッド名},${パラメータ1},...,${パラメータn});

onmessage = function(e) {
 switch(e)
 {
   case "BOF":
    どうしよう
     break;
    ・・・
 }
}

adodbWorkers["ADODB.xxxxxx"].onmessage = function(e) {
  何とかかんとか  
 resolve(e,data)とか
}

して、がら空きの実装で使うとこだけ実装する方式で済ませるのがいいかもしれない。



[Oracle12c]コンテナ・データベース

最近のOracleのデータベースのインスタンスを作成する時に「コンテナ・データベース(CDB)として作成する」ができる様だ。

今までのデータベース(区別するためにプラガブル・データベース(PDB)と名前が付いている)を複数個格納できるコンテナなデータベースらしい。

各データベース(CDB,PDB)の接続方法は

  • 新たなコンテナ・データベース(CDB)はローカル接続のみ。
  • 今までのデータベース(PDB)はリモート接続のみに変わる。

ということで、一般ユーザ(アプリを含む)からは、何も変わらない気がするけどね。

ただ、安易にCDBを作成するとPDBの接頭語を指定してpdb1,pdb2,pdb3とか名前が自動的に割り振られてしまうようなので、リモート接続のインスタンス(あるいはサービス名?)は変更しないといけなさそう。

そんな訳で、コンテナDBの管理者に

  • CDBにローカル接続
  • CDBで共通ユーザを作って、ログ収集用とか最適化用とかIMPORT/EXPORT用とかロールを割当る。
    • 共通ユーザ名は「C##またはc##」の接頭語が必要らしい。
  • ALTER SESSION SET CONTAINER = ${PDBの名前}; でPDBを指定して、
  • 各PDBの管理者や一般ユーザのアカウントの登録とロールを設定する。

をしてもらえば、後は概ね今まで通りで良いんじゃないのかな?

各PDBのテーブル登録は各PDBの管理者がリモートできるから便利になるかもかも

後、データベース・サーバの移行は・・・

移行元サーバのデータベースがCDBなら、

  1. 移行先サーバで空のCDBを作成
  2. SQL Developerの接続先に移行先・元サーバを追加
  3. SQL Developerで移行元サーバの移行したいPDBで
    1. 「状態の変更」
    2. 「プラガブル・データベースの切断」
  4. 移行したいPDBをフォルダ毎、移行先サーバへコピー(これが難物)
  5. SQL Developerで移行先サーバで
  6. CDBで「プラガブル・データベースのプラグイン」
    1. アンプラグした時に生成したXMLファイルをPDB名を指定

となるらしい。

EXPORT/IMPORTの方が手順が短いけど、IMPORTで難解なエラーに悩むかもしれない事を考えると、楽そうではある。

最もDBが巨大なファイル(100GBとか)になっていたら、rsyncするか、DB移行アプリでも作って一週間も動かし続けるとかかもしれないけどね。

参考文献1:ユージ&ギョータの実践データベース講座

参考文献2:rsync専用の秘密鍵を使ってサーバ間でrsyncする



[三国英雄の夜明け]これからどうなるんだろう?

魂玉を7品質にレベルアップするため、全戦力は1600万台に下がってます。

上位キャラ強化 < 下位キャラ弱体化

そんな中、ランク表でナンバー1のキャラが休止に入ったらしい。

ボクより下の方に下がっていたから、探し出すのが大変だった。

どうやら、装備一式や副将を外してる様だ。

とりあえず、ゲームのマップ上は大混戦になっている。

そして今、一番気になるのは!

演武大会で誰にオッズすればいいんだ?

ps.

悩んでいるうちに投票時刻はとっくに過ぎていました。(メデタシメデタシ



[物理]地球と月の角運動量の保存則?

動画を観ていたら、

地球の自転速度が遅くなると「角運動量の保存則」から遅くなった分、月の公転速度があがり、月が遠くなる。

という説明がよく判らなかった。

「地球の自転が遅くなると月が遠くなる」をググってみると

同様の説明をする人もいて、

フィギュアースケートで手を伸ばすと回転速度が下がるのと同じです。

とのこと。

フィギュアースケート選手の胴と手は肩と腕で柔軟だけど物理的に繋がってるので、選手が体を維持できる限りは慣性モーメントを考える上では一体と考えていい。

手を伸ばすと、胴の周りで円を描く手が円運動する半径が大きくなり手が1周回る距離が長くなる、しかし手の運動速度は変わらないから周回ペースが落ちるのは容易に想像ができる。

マラソンを100mでペースタイムを測っていたのに、手を伸ばしたら勝手に200mでペースタイムを測りだして、あれ?遅くなった!とか云いだすのと同じ。これはただの錯乱ですけど、原理は同じ。

回転する物体に対する人間の感性(思い込みあるいは刷り込み)が現実とかけ離れているだけっす。

もし地球と月の間で角運動量の保存則が成立するなら、何か目に見えないもので繋がっているハズ。一応地球の重力で繋がってるし、これで人工衛星のフライバイなんかも角運動量が保存されるけど、これは地球が太陽を周回しているので地球の重力圏が楕円軌道を描いているせいで、人工衛星は近づく時と離れる時で重力の働きに不均衡が生じるから加速したり減速したりしてしまうので、違う気がした。

とは云え、複雑で理解が難解だけどちゃんとした原理はあるもののそれを説明よりも、簡易なそれっぽい説明をする方が現象の理解や同意を得やすいんだと思うことにした。

しかし、年を取ると・・・

騙されてるダケって気がするんだよね(笑

ANDとORとかのデジタル論地回路が一通りあればコンピュータできますとかもそう。

できないことは無い。メモリアドレスを入力としアクセスされたROMメモリセルに予め計算しておいた結果を収めておけばいいのだ。

だが、回路の規模は半端無いし事前に全ての計算結果を出す手間がかかり過ぎので、同様な製品の販売競争によりあっという間に商品としての価値が陳腐化してしまうから過去の遺産をずーっと活用できる浮動小数点演算コプロセッサの関数のマップ以外はほぼ絶滅していると思う。

今は演算の単位を適当なサイズに抑えて全体の回路の規模が少くし、手順に沿って色んな演算を組み合わせて計算結果を得る方式を取っている。

例を挙げれば、普通の人が沢山のお手玉を回すにはとりあえずお手玉の数だけ手が必要だろうけど、熟練した器用な手が2つあれば十分であることは曲芸師が証明しているし、今のコンピュータは概ね計算の曲芸師として活躍している訳だ。

※僕の場合は同じ計算を10回も繰り返すと飽きるので、プログラムにしてしまおうって感じるのですけどね。

今世紀の自動運転自動車のレベル5も近いかな?運用しながら教訓を得る方針に間違っていないけど

誰も事故には遭いたくない

という素朴な真理には勝てなかったね。

ps.2022/06/25

地球と月を合わせた質点を中心に地球も月も楕円運動している事を失念していた。この場合、楕円運動をしているから、互いに角運動の保存則が成立し、どっちも同じ方向に楕円運動しているので、質量が軽いため運動速度が地球より速い月の方が加速するだろう。一方減速するのは地球圏内での地球の楕円運動なので、地球の自転に影響を与える様にはまだ思えない感じがする。




top