Cloud · Tech Misc

Troubleshooting Outlook add-in error with “Please sideload your add-in to see app body.”; Unable to right click for “Inspect”;

Symptom:

For our self developed Outlook add-in, with react.js and node.js, we deployed it through M365 to thousands of users. It works in most of the users device, but ~ 5 users reported that their add-in not functional for any button clicking, some with a white screen not loading any front end components; and some showing an error message “Please sideload your add-in to see app body.”

Further more, for these users, even unable to proceed a right clicking to show the menu nor further diagnose with the “Inspect” with the browser developer tool.

Solution:

Found the curial component is to install the webview2 on those users’ device.

WebView2 – Microsoft Edge Developer

After this installation, all affected users add-in works properly.

The info was obtained from MS support provided docs:

Browsers and webview controls used by Office Add-ins – Office Add-ins | Microsoft Learn

Debug Office Add-ins – Office Add-ins | Microsoft Learn

Cloud · Data Engineering

Logic App unable to call a backend service API with private endpoint (PEC), error: “BadRequest Http request failed as there is an error: The SSL connection could not be established.”

Background:

We have an Azure Logic App trying to call a Azure Language Service API. If both allowing public access, it’s working fine. But if we wish to setup the Private Endpoint Connection (PEC), for enterprise network isolation, then we hit a lot of errors, and here’s our workarounds.

Symptom:

BadRequest Http request failed as there is an error: The SSL connection could not be established.

Below screencap showing the Cert Subject Alternative Name only contains “*.cognitiveservice.azure.com”, but not containing a “*.privatelink.cognitiveservices.azure.com”; Thus it errors out a cert handshake error.

Solution:

we setup a DNS conditional forwarding in our internal DNS server: let the public DNS “*.cognitiveservice.azure.com” pointing to the private IP “10.xx.xx.xx”

In this way, DNS correct for cert, and IP correct for PEC, while achieving the blockage of public access to the Language Service.

Further follow up:

In case if your company don’t have a private DNS or the practice to setup conditional forwarding, the root cause is indeed Microsoft should have put the “*.privatelink.cognitiveservices.azure.com” into their cert trust list. To support the PEC setup natively. We have reported to MS product team, but not sure how long it takes to fix.

Oracle

How to change TDE password for RAC and Dataguard in 19c

Update:

If you using ExaCS in OCI, dont change passwords by DB commands, use dbaascli directly:

Primary:
[root@sgx9r2-node-ttgdn1 ~]# dbaascli tde changePassword --dbname CSGDWHT --prepareStandbyBlob true -blobLocation /tmp
Standby:
[root@sgx9r1-node-phnzp2 ~]# dbaascli tde changePassword --dbname CSGDWHT --standbyBlobFromPrimary /xxx/CSGDWHT_2023-04-06_12-09-18-PM.tar 

Reference:

https://docs.public.oneportal.content.oci.oraclecloud.com/en-us/iaas/exadata/doc/ecc-manage-databases.html


Oringinal post:

Flow Overview:

Primary

  1. open force password tde wallet;
  2. change new tde pw;
  3. rename tde autologin wallet;
  4. re-create tde autologin wallet;
  5. close password tde wallet;

Standby

  1. convert standby DB to snapshot standby;
  2. open force password tde wallet;
  3. change new tde pw;
  4. rename tde autologin wallet;
  5. re-create tde autologin wallet;
  6. close password tde wallet;
  7. convert standby DB back to physical standby;

Primary DB:

SQL>  select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 AUTOLOGIN		OPEN
	 2 AUTOLOGIN		OPEN
	 3 AUTOLOGIN		OPEN

SQL> administer key management set keystore open force keystore identified by "old_pw" container=all;

keystore altered.

SQL> select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 PASSWORD		OPEN
	 2 AUTOLOGIN		OPEN
	 3 AUTOLOGIN		OPEN

SQL> show parameter wallet_root

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
wallet_root			     string	 /var/opt/oracle/dbaas_acfs/CSG
						 DWHT/wallet_root
SQL> !
[oracle@sgx9r2-node-ttgdn1 wallet_root]$ cd  /var/opt/oracle/dbaas_acfs/CSGDWHT/wallet_root/tde
[oracle@sgx9r2-node-ttgdn1 tde]$ ls -al
total 152
drwxr-xr-x 2 oracle oinstall 20480 Apr  6 10:11 .
drwxr-x--- 5 oracle oinstall 20480 Feb 16 06:34 ..
-rw------- 1 oracle asmadmin  5512 Apr  6 10:11 cwallet.sso
-rw------- 1 oracle oinstall     0 Feb  7 17:04 cwallet.sso.lck
-rw------- 1 oracle oinstall  2555 Nov  9 14:10 ewallet_2022101101044699.p12
-rw------- 1 oracle asmadmin  5467 Apr  6 09:29 ewallet_2023040601291644.p12
-rw------- 1 oracle oinstall  5467 Apr  6 09:29 ewallet.p12
-rw------- 1 oracle oinstall     0 Feb  7 17:04 ewallet.p12.lck

[oracle@sgx9r2-node-ttgdn1 tde]$ mv cwallet.sso cwallet.sso.bak_old_pw
[oracle@sgx9r2-node-ttgdn1 tde]$ exit
exit

SQL>  ADMINISTER KEY MANAGEMENT ALTER KEYSTORE PASSWORD IDENTIFIED BY old_pw set "new_pw" with backup; 

keystore altered.

SQL> administer key management create auto_login keystore from keystore identified by "new_pw";

keystore altered.

SQL>  ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED by "new_pw" container=all;

keystore altered.

SQL>  select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 AUTOLOGIN		OPEN
	 2 AUTOLOGIN		OPEN
	 3 AUTOLOGIN		OPEN


Standby DB:

SQL> select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 AUTOLOGIN		OPEN

[oracle@sgx9r1-node-phnzp1 ~]$  dgmgrl sys/sys_pw
convert database standby_dbname to snapshot standby;


SQL> show pdbs;

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 PDB_LFTDWH_DEV		  MOUNTED
SQL>  select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 AUTOLOGIN		OPEN
	 2 AUTOLOGIN		OPEN
	 3 AUTOLOGIN		OPEN

SQL> administer key management set keystore open force keystore identified by "old_pw" container=all;

keystore altered.

SQL> select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 PASSWORD		OPEN
	 2 AUTOLOGIN		OPEN
	 3 AUTOLOGIN		OPEN

SQL> show parameter wallet_root

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
wallet_root			     string	 /var/opt/oracle/dbaas_acfs/CSG
						 DWHT/wallet_root
SQL> !
[oracle@sgx9r2-node-ttgdn1 wallet_root]$ cd  /var/opt/oracle/dbaas_acfs/CSGDWHT/wallet_root/tde
[oracle@sgx9r2-node-ttgdn1 tde]$ ls -al
total 152
drwxr-xr-x 2 oracle oinstall 20480 Apr  6 10:11 .
drwxr-x--- 5 oracle oinstall 20480 Feb 16 06:34 ..
-rw------- 1 oracle asmadmin  5512 Apr  6 10:11 cwallet.sso
-rw------- 1 oracle oinstall     0 Feb  7 17:04 cwallet.sso.lck
-rw------- 1 oracle oinstall  2555 Nov  9 14:10 ewallet_2022101101044699.p12
-rw------- 1 oracle asmadmin  5467 Apr  6 09:29 ewallet_2023040601291644.p12
-rw------- 1 oracle oinstall  5467 Apr  6 09:29 ewallet.p12
-rw------- 1 oracle oinstall     0 Feb  7 17:04 ewallet.p12.lck

[oracle@sgx9r2-node-ttgdn1 tde]$ mv cwallet.sso cwallet.sso.bak_old_pw
[oracle@sgx9r2-node-ttgdn1 tde]$ exit
exit

SQL>  ADMINISTER KEY MANAGEMENT ALTER KEYSTORE PASSWORD IDENTIFIED BY old_pw set "new_pw" with backup; 

keystore altered.

SQL> administer key management create auto_login keystore from keystore identified by "new_pw";

keystore altered.

SQL>  ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED by "new_pw" container=all;

keystore altered.

SQL>  select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 AUTOLOGIN		OPEN
	 2 AUTOLOGIN		OPEN
	 3 AUTOLOGIN		OPEN

srvctl stop database standby_dbname ;
srvctl start database -db standby_dbname -o mount;

[oracle@sgx9r1-node-phnzp1 ~]$  dgmgrl sys/sys_pw
convert database standby_dbname to physical standby;

SQL> select con_id, wallet_type, status from v$encryption_wallet order by 1,2;

    CON_ID WALLET_TYPE		STATUS
---------- -------------------- ------------------------------
	 1 AUTOLOGIN		OPEN

Reference:

https://logic.edchen.org/how-to-disable-auto-login-keystore/

https://onlinedbalearning.blogspot.com/2018/07/how-to-configure-auto-login-wallet.html

Oracle

Monitoring shared pool usage

with a few more useful links:
ORA-04031 Due To High Shared Pool Usage To “GCS DYNAMIC RESOURCES FG” With In-Memory Option (DBIM) (Doc ID 2200825.1)
Bug 27824540 – ORA-4031 Error In Shared Pool Due To Leakage Of ‘ges resource dynamic’ Chunk In RAC Env (Doc ID 27824540.8)
http://blog.chinaunix.net/uid-22948773-id-3284131.html
https://forums.oracle.com/ords/apexds/post/too-much-shared-pool-usage-3456

Technology Blog

Monitoring shared pool usage

–SHARED POOL QUICK CHECK NOTES:

select 'You may need to increase the SHARED_POOL_RESERVED_SIZE' Description,
'Request Failures = '||REQUEST_FAILURES Logic
from v$shared_pool_reserved
where REQUEST_FAILURES > 0
and 0 != (select to_number(VALUE) from v$parameter where NAME = 'shared_pool_reserved_size')
union
select 'You may be able to decrease the SHARED_POOL_RESERVED_SIZE' Description,
'Request Failures = '||REQUEST_FAILURES Logic
from v$shared_pool_reserved where REQUEST_FAILURES < 5
and 0 != ( select to_number(VALUE) from v$parameter where NAME = 'shared_pool_reserved_size')

–SHARED POOL MEMORY USAGE NOTES:>
V$DB_OBJECT_CACHE
This view displays database objects that are cached in the library cache. Objects include tables, indexes,
clusters, synonym definitions, PL/SQL procedures and packages, and triggers.

select OWNER, NAME||' - '||TYPE object, SHARABLE_MEM
from v$db_object_cache
where SHARABLE_MEM > 10000
and type in ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE')
order by SHARABLE_MEM desc

–LOADS INTO SHARED POOL NOTES:
select OWNER, NAME||’ – ‘||TYPE object, LOADS
from v$db_object_cache
where LOADS > 3
and type in (‘PACKAGE’,’PACKAGE BODY’,’FUNCTION’,’PROCEDURE’)

View original post 746 more words

Oracle

Oracle EMCC 13c edit database user or “Create Like” action hitting error “Session Information Unavailable” (or other privilege related errors)

Symptom:

While try to click to edit database, error out “Session Information Unavailable”. MOS Doc ID 2232136.1 mentioning the problem but the patch provided not relevant as we are on EMCC 13.5 already.

Solution:

Tested that the DB user need the minimal below privileges granted, (most importantly “select_catalog_role” is not enough, and the problem solver is to grant “select any dictionary”). Then re-login the DB user within EMCC page to take effective.

grant create session, alter system, create user, alter user, select any dictionary to c##oem_tl container=all;

Furthermore:

If any other similar EMCC page access issues happened, one very helpful tool is DB privilege capture. i.e.

  1. Note down the EMCC page you facing access issue.
  2. Grant dba to the DB user for full access, see if the page able to open up.
  3. Enable a privilege capture job for that user.
  4. Re-access the page again.
  5. Stop the capture and view privilege analysis report, to find out what privileges was Used to perform the action.
  6. revoke dba and grant proper minimal privileges to the db user and try again.

Reference:

Research

Resolving EndNote Capture Reference Login Loop on Mac Safari

Symptom:

After adding the “Capture Reference” bookmark from EndNote Online, every once click on the bookmark will always showing this “Log into EndNote” in a loop, despite already entered correct username and password.

Cite While You Write Login Loop

The official FAQ ask for reinstall the plug-in which is not helpful.

If you receive a continuous login loop while using Cite While You Write for Windows, reinstall the latest Cite While You Write plug-in.

Solution:

Turns out it can be resolved by un-ticking the “Prevent cross-site tracking” in the Safari setting (cmd+,) -> Privacy -> Website tracking.

Click the bookmark and login, now it works!

Oracle

RMAN duplicate for standby from active database; multiple channels parallelism with SECTION SIZE splitting and COMPRESSION

Highlight prior steps:

  1. Copy pfile / password file to standby $ORALCE_HOME/dbs
  2. Standby DB startup nomount
  3. Edit & reload listener.ora file for static registration
  4. rman command for reference:
  5. From our OCI ExaCC enviorment:
    • 8 compression channels would occupy 100% of 4 OCPU.
      • Each channel occupies network throughput around 50Mbps
$ rman target 'sys/password'@//172.x.x.x/PRIMARY_DBSERVICE auxiliary 'sys/password'@//10.x.x.x/STANDBY_DBSERVICE
connected to target database: XXXX (DBID=xxxx)
connected to auxiliary database: XXXX (not mounted)

RMAN> run{
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate auxiliary channel stby1 type disk;
allocate auxiliary channel stby2 type disk;
allocate auxiliary channel stby3 type disk;
allocate auxiliary channel stby4 type disk;

DUPLICATE DATABASE FOR STANDBY FROM ACTIVE DATABASE 
SECTION SIZE 100G 
USING COMPRESSED BACKUPSET
NOFILENAMECHECK DORECOVER;
}

Reference:

How to Add Second Standby in Existing Dataguard Configuration With Broker Using DGMGRL (Doc ID 842822.1)

Oracle

Oracle Datapatch ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound] Error at line 16580: script rdbms/admin/catlmnr.sql

While running datapatch for 19.13.1 seeing error below:

Patch 33516456 apply (pdb PDB_LFTDWH): WITH ERRORS
logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33516456/24583503/33516456_apply_C19DW_PDB_LFTDWH_2022May29_09_58_39.log (errors)
-> Error at line 822: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 831: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 840: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 849: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 858: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 867: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 876: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 885: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 894: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 903: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 912: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 921: script rdbms/admin/backport_files/bug_31193292_apply.sql
- ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:objnotfound],
- [1308], [], [], [], [], [], [], [], [], [], []
-> Error at line 55665: script rdbms/admin/catlmnr.sql
- ORA-00904: "BUILD_OP": invalid identifier

Solution:

Run below commands in the error PDB, according to LOGMNR_BUILDLOG ORA-00600: Internal Error Code, Arguments: [kkpo_rcinfo_ (Doc ID 2755867.1)

insert into deferred_stg$ (obj#, flags_stg, cmpflag_stg, cmplvl_stg)
 select t.obj#, 8, 0, 0
 from tab$ t
 where bitand(property, 17179869184)=17179869184
 and obj# not in (select obj# from deferred_stg$);

insert into deferred_stg$ (obj#, pctfree_stg, flags_stg, cmpflag_stg,
cmplvl_stg)
 select i.obj#, 10, 0, 0, 0
 from ind$ i
 where bitand(flags, 67108864)=67108864
 and obj# not in (select obj# from deferred_stg$);

commit;

Then rerun the datapatch. Issue fixed.

Oracle

oracle 19.12.2 datapatch hitting error: PDB$SEED(2):ORA-1652: unable to extend temp segment by 128 in tablespace TEMP [PDB$SEED]

Problem:

    The following interim patches will be applied:
      33561310 (OJVM RELEASE UPDATE: 19.14.0.0.220118 (33561310))

DBD::Oracle::st bind_param failed: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP (DBD ERROR: OCILobWrite in dbd_rebind_ph_lob) [for Statement "BEGIN
           INSERT INTO sys.dba_registry_sqlpatch_ru_info
             (patch_id,
              patch_uid,
              patch_descriptor,
              ru_version,
              ru_build_description,
              ru_build_timestamp,
              patch_directory)
           VALUES
             (:patch_id,
              :patch_uid,
              :patch_descriptor,
              :ru_version,
              :ru_build_description,
              TO_TIMESTAMP(:ru_build_timestamp, 'YYMMDDHH24MISS'),
              :patch_directory);
           COMMIT;
         END;" with ParamValues: :patch_descriptor=OCIXMLTypePtr=SCALAR(0x3c6bae0), :patch_directory='PK.........(2Tې.᤮..¾r......33494256_apply.sqlˮ[oچ.@࠽+񂫮6¼Kڠu.51`ɮ嵛}.(...."C.l5毟!š¨Kº.W....Z±ţ3ޜ9.򯔮.o~.ݜ.¸}.ֻ...
                           ܯ´³,.
?.2¡ݥ¹.y¿լɮئ㼲mg`Y.{񧹫Ĩ¨Ʃꮊ`ʵ.µ.ljʹ򣮫.V|.«ON預Fğ'¿.]~.jw8Vo....ij[񎵿þюӭ'^4)ݼЖ¯󴰐򜰤}_񻲮¥񳏮y8.8}©.𲳷.񲯭b¬>\^þ ©.W¯ܲ䤯l¼;¼.ޜ¾[!T7ֲ0=?򑸽+򷥿l|¡6.½)¿嵺rþﬦ𤟡¼$.¿>󾯒𵭷ru1..O_n~Ʃ簼ysv;.\.ݾ8{;󩷳q~6..ݟ..þ$ۮjgᯫ񺾽¹¾Ю¾
                                                                                            <ǷgW_o߈ϏN~.¾½.U.e,¼\D񭔥ß...εv...ޞ\
¦I1Q.O«?$.G"󣧋󶪟
î°򸆽.
þ.W±ݜ.tĢ箯Odr¿>yuӤ.h..Zþɖ...䢮ʤ¯.]ܮodv../®GZ)齃΍pt;..¿.^.Ǯ%m¾þj".ɮ.i..._yA.̟M.³9鴭Cw'.
                                                                                     ⊩¼­J§§'ϻ󮯵·£鮳_..۰秺f򉺮	ؾ.¿?}..
                       c.½뮪ǝ1񭭮l.{𬮍®G¯󓀡..zþ§,̅u񍆝..§·*.	̮.µiꧭ.p.ٮX.®mۦ
        µi篮񼹑l.ä. פ¡.....».X..Ŵ.걳..jԐu¶౹.µi                         ·¹
ۮݮ¤شMŴ.6ܦ.$֦m𻾣..Ǥ6 ֤ӷ¬#µ?.cr..kеt³w.˨0&·..&+2½¯꼒.r/.Ůaڲ..Ŧ𛳻͡.n.b.񝞁µ½D.ްW¦з.㴸...', :patch_id='33494256', :patch_uid='24593356', :ru_build_description='Release_Update_Revision', :ru_build_timestamp='220113181912', :ru_version='19.12.2.0.0'] at /u01/app/oracle/product/19.12.2/dbhome_1/sqlpatch/sqlpatch.pm line 5830.


Please refer to MOS Note 1609718.1 and/or the invocation log

Solution:

alter database tempfile '+xxx/temp.1724.1033209735' autoextend on next 1g maxsize unlimited;

ORA-1652 When Running Datapatch and ORA-600[4736] when Attempting to Resize Tempfile (Doc ID 2267731.1)

Basically the PDB$SEED default temp size only 64M would cause problems sooner or later.

Math

弦论科普

本文节选翻译自(Everything is Now: Revolutionary Ideas from String Theory: Spence, Bill)

英国作为世界上其中一位最具非凡创造力的数学家的故乡,与有荣焉——牛津大学的罗杰·彭罗斯(Roger Penrose)(*译者注:2020年诺贝尔物理学奖得主),他年轻时即已开始产出开创性的思想,而今88岁高龄,依然如是。他写下了一些重磅级的著作(字面意义上,有些书可以做砖头),记述他的理论以及很多独具慧眼的思考。

他的早期数学发明之一,根本性的改变了我们对空间和时间的理解。即起源于1960年代的扭量理论(Twistor Theory)。在此之前,物理学家纯粹是根据空间中的某个地点某个时间,发生的某个事件来描述世界的,换句话说就是“时空中的某个坐标点”。(将“时空”视为各种事件所有可能发生的地点与时间的组合。时空中的一个“坐标点”就是一个“事件”,既一个地点和一个时间)。这是如此平凡,如此想当然,以至于这个设定很难被识别出来,更难想象还能如何去换一种方式思考它。 

虽然量子力学已经非常成功地与狭义相对论结合,形成了量子场论,但它具有相当令人不安的特征,即该理论中的大多数计算都能得出同一个结果——无穷大!(或者有时是负无穷大,并不让人感到安慰。)这个“无穷大”本身并不是一个数字,而是一个数学对象,比您能想到的任何数字都大,就像不停做1+1+1+…到无穷无尽,所得到的东西。 

让我们实验物理界的同仁去验证无穷大有点强人所难,因为我们在进行任何测量时总会得到某个确定的,有限的数值。幸运的是,有个素来有效的方法可以用在这里。既在一开始,就将另一组具有相反符号的无穷大放入数学公式中,用于抵消原本计算中出现的那些无穷大。它有一个似乎让人放心的名字“重整化(renormalization)”。但这不是一个真正的科学家会满意的东西,而且永远不会让人真正信服,虽然它具有两个非常有力的特征:首先,它实际上是一个完备的数学方法;其次,它给出了明确的有限的可被测试的结果,在某些情况下,与精确度可达亿分之一的实验结果相吻合。 

量子力学和狭义相对论结合时,其中所产生的某些无穷大,是由于一些特定事件引起的,例如时空上某个特定点上粒子彼此之间的相互作用。众所周知,将量子粒子强制定位在精确的位置会产生各种问题,因为量子对象喜欢“不确定”,所以也许这并不出奇。处理量子场论中出现的无穷大的其中一种想法是,是否可以用一种不是“点状”的语言来表达它,从而解决这个问题。但这意味着要找一种截然不同的概念和思路,以及用以描述它的必要数学方法。 

这其实正是弦论中所发生的事情,我们将在后面看到,但现在让我们先来考虑一个乍看似乎完全不同的问题,“质量”是什么?在构成所有物质的基本粒子中,有些粒子具有质量,例如质子和电子,有些粒子则没有质量,例如组成光的光子。这其实挺奇怪的,这种被称为“质量”的东西到底是什么?为什么有些粒子有而有些却没有?与常识相反,我们有理由认为“质量”并不是一个基本的属性,它其实是随着粒子的运动而出现的。从直觉上理解,质量是对运动的一种阻力,对于有质量的量子粒子,这里有一种类比,这些粒子的质量也许来源于:它们被浸没在粒子海洋中,其它粒子对它们进行着拉扯,使它们减速。 

为什么这么说?根本原因是在量子理论中,实际上没有“虚无(nothing)”这种东西。让我们简单设想一下如何制备一个“虚无”,找一个盒子,然后从盒子中取出所有东西,这样里面剩下的就是“什么都没有”。但是里面还有空气呢?在物理学中,一个没有任何空气或其他物质的空盒子的内部被称为“真空”。星星彼此之间的空间非常接近真空——每立方厘米(方糖大小的区域)中大约有一百万个分子。实际上,从一个盒子里拿出所有的东西,是非常困难的——人造的真空实验室中,每立方厘米仍有100亿个分子。这些分子大多数是氢和氦。与此相比,我们呼吸的空气每立方厘米有超过1000亿亿个分子。可能您还是觉得,也许还有某种方式方法,能够将一个盒子里的所有分子捕获并取出,什么都不留在里面。 

但这是不可能的,在量子理论中,有一个反直觉的结论是,粗略地说,粒子们可以(*凭空“借来”能量)从虚无中产生,只要它们消失的足够快(*与对应的反粒子湮灭并归还能量)(*译者注:量子涨落)。这可以理解为不确定性原理(Uncertainty Principle)的一个产物。众所周知的不确定性原理指出,我们无法同时知道量子粒子的确切位置与它的动量(质量乘以速度),且两者之间存在反比关系。即我们知道的其中一种越准确,对另一种的测量就越不准确。 

还有另一个不确定性原理以相同的方式关联了能量与时间,该原理表明,对于某个事件,我们越确定其发生的精确时间,则越不能确定其中所涉及的能量,反之亦然。由于这一不确定性原理,在真空中,一些能量可以以粒子的方式短暂出现,只要持续的时间不长。因此,在取出所有的实粒子后,量子理论中的“真空”,不是虚无,而是一片虚粒子之海,它们从虚无中冒出来,又迅速消失。 

接下来,当把一个实粒子引入真空中时,用日常语言来说,如果刚好附近冒出了一些虚粒子,它会碰到那些虚粒子,然后被撞偏方向或者减慢速度。这并不必然会为该实粒子产生一个质量,但有时候确实会——例如,希格斯粒子。该粒子于1964年被预测,终于在2012年被真正发现,其行为表现正如前所述——真空中的虚粒子海洋,为希格斯粒子创造了质量(*译者注:希格斯场,2013年诺贝尔物理学奖)。 

这里提及的某些思想稍后会再次浮现,但此处要得出的结论是,我们可以将质量视为一个衍生出来的量,某样东西的副产物。所以在某种程度上,其实无质量的粒子,才是更本质和更基础的。因此,让我们把注意力集中在它们身上。 

无质量粒子的非凡特征是,当它们自由移动时,它们始终以光速行进。这当然快得令人难以置信,而这也是为什么您可以与世界另一端的人,通过电气化的方式,进行几乎实时的通信的原因。因为用于编码文本语音或视频的电流,是由电荷间的相互作用产生,而这种相互作用由光子传递,以光速行进。光速也是最大速度——如果您试图将有质量的粒子推升至光速,它们将变得越来越重(狭义相对论的预测之一),进而加速它们也就变得越来越难。您将永远无法使这类有质量的粒子达到光速,因为这将需要无穷大的能量。 

光速确实非常快,但这还并不是它最为有趣的原因。接下来考虑狭义相对论的另一个推论,既移动中的物体的时间会变慢。同一位观察者看一个移动中的时钟,与一个静止的时钟相比,它的指针会跳转的更慢。我们察觉不到这一点,因为我们的日常生活中到处都是速度很慢的物体,但是随着速度接近光速,它会开始起作用。然后,从数学上来看,到达光速时,时钟应该会慢至完全停止。尽管我们的时间在不停运转,但一个放在光子上的时钟并不会动。简而言之,结合我们前面的思考,对一个自由的无质量粒子来说,“一切都在现在”(Everything Is Now)。尽管这是狭义相对论的推论,但我们稍后会看到,在一种弦论中出现的诠释中,那些有意思的基本的量子性质,全都是一些自由的无质量实粒子所造成的。因此,本书起名为Everything Is Now。(*译者注:本书中文译名取自其双关语,物理学上把能最终达成大统一,解释一切物理现象的理论称为The Theory of Everything,万有理论。) 

如本章开头所述,彭罗斯(Penrose)提出,在物理学中,不要将时空仅仅视为事件发生的基本区域,而应考虑某些与无质量粒子相关联的东西,因为它们很可能更接近本质。无质量粒子以光速行进,变成有点像光线的东西。因此,彭罗斯提出这样一个空间用作物理学的新数学基础,一个由各种类似光线的射线所组成的空间。这个空间称为扭量空间,我们可以把这些扭量想象为一些光束。该理论的思想是用这些光束取代那些时空坐标点的概念,以期解决量子场论中存在的问题,及消除其中产生的那些无穷大。 

我们该如何想象它的样子?从数学意义出发,描绘“空间”相对比较简单。例如,平面二维空间就像无限大的纸面。它是二维的,因为我们需要给出两个数字来描述纸上任意点的位置——垂直距离与水平距离。三维平面空间可考虑为环绕我们身边的空间,要描述某个东西的位置,需要给出它与我们所处的距离有多远,即向前或向后,向左或向右以及向上或向下。描绘四维空间稍微难些,因为要去思考一个我们所感知的三个维度以外的第四个维度,它似乎无处可放。尽管如此,数学上可以这样去定义四维空间,即该空间中任意一个坐标点由四个坐标值来确定。四维时空包含三个空间维度和一个时间维度,可以视作所有“事件”的集合——用以描述事件发生的位置(用三个坐标值)和时间(一个坐标值)。 

描绘一个扭量空间更难一些。一束光,例如手电筒的光束,在我们三维空间中只是一条直线。在四维时空中,光速恒定这一事实,在数学上可以示意为一条特定斜率的线(*译者注:斜率=光的三维位置变化/时间=光速)。因此,从某一确定位置点发出的光线,可由这条特定斜率的四维直线上的任意一个点来表示(*译者注:此例可理解为三维位置点确定,只有时间维度的坐标值不确定)。进而,从某个三维坐标点在所有时间向所有方向发出的所有可能的光线所划出的空间,在四维时空中看起来像一个圆锥(*译者注:圆锥斜边的斜率即光速,因而也称光锥),每条光线对应圆锥的表面上的一个点(*译者注:其中每个点都可以做为顶点再划出光锥,即以该时刻为分界线,在时空中划分出过去与将来,形如两个顶点相对,互相倒立的圆锥),数学上其实又可以表示为一种常规球面(*译者注:黎曼球面:从远处一点向一复平面做球极平面投影所形成的球面,即平面与球面的映射。从某一顶点看向过去的光锥,所有能被观测到的点都是过去某个时间地点向现在所发出的光线,以这一观测者所处的顶点作为球的北极,将所观测到的时空平面投影到一个球面)。这种球面即被描述于扭量空间中。在此设定下,四维时空中的每一个坐标点对应扭量空间中的一个球面;反过来,扭量空间视角中观测到的每个坐标点则对应时空中的一条光线。故事的确切版本要更复杂一些(字面意义上,用上复数)。有些示意图可以用以描绘“扭量”,例如图2.1。(*译者注:图为一个扭量,即扭量空间中的一个点,在传统四维时空中的示意图。一个扭量可以依据其螺旋量为正,负或零分为三类。螺旋量Helicity,是自旋角动量在动量方向上的投影,描述一个物体沿运动方向的自旋方向。如果螺旋量为正,则物体运动形如右手定则;螺旋量为负,则形如左手定则;如果螺旋量为零,意为物体没有进行自旋,只沿动量方向运动。图2.1中是一个螺旋量为负的扭量。本书原文中对这些细节并没有详细说明,但其为读者打开了一扇大门,介绍了扭量理论是学界的研究趋势,让感兴趣的读者得以了解该从何处着手学习。) 

扭量空间本质上是一个四维复空间(*译者注:四个坐标值,每个值都是复数)。也可以被想成用来描述成对的旋量(Spinors),这是我们稍后还会遇到的对象。扭量空间是一种美妙的数学结构,有着许多有趣的特征,自1960年后,一群兴致勃勃的学者曾对其跟进研究。但是这一理论路线在物理学界却并未被广泛理解与流行。尽管其基本思想很清晰,也为人认可,但实践上它似乎并没有给出什么更好的方法来解决一些实际问题,或提出更有用的概念框架来推动新的进展。在其后的40年中,这一潜在的宝藏基本上是无人问津,直到接下来您将看到的,弦论重新发现了它,并振兴了属于它的一个新的时代,使一些研究量子物理的崭新方法得以迅速崛起,在相关领域取得了大量进展。