M1 MacBookAir買ってやったこと

M1のMacBookAirを買ったので、セットアップ時にやったこと。多分M1なら、他のMacでも同じはず。できるだけbrewを使わずに色々入れてみる。基本的にいつも書きかけ。

macOS Monterey
バージョン 12.1

# Xcodeのインストール
App Storeから入れる。

## XCode Command Line Toolsのインストール
```
xcode-select --install
```

# GCCをソースから入れる試み(失敗)
[gccをソースからビルド／インストールする - Qiita](https://qiita.com/liveralmask/items/6ed4a98ebb3bf6b7f707)に従って、入れてみる。
gcc-11.2.0(2022/01/20当時最新版)をとってきて、tarballを展開、`./contrib/download_prerequisites`で必要なファイル群をダウンロードして、`${GCC_SRC}/build`を作って、このディレクトリから

```zsh
../configure --prefix=/Users/username/opt/gcc-11.2.0
```
でconfigureする。configureはひとまず動いた。そして、`make`を実行すると

```console
Error: configuring for an unreleased macOS version aarch64-apple-darwin21.2.0
make[2]: *** [configure-stage1-gcc] Error 1
make[1]: *** [stage1-bubble] Error 2
make: *** [all] Error 2
```
となって、失敗。

# oneAPIを入れる試み
[Intel® oneAPI Toolkits](https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html#base-kit)からインストラクションに従って、入れる。
**Fortran compiler**の文字列があったので、HPC Toolkitを入れれば良いのかな？と思ったけれど、どうもHPC Toolkiを入れる前にBase Toolkitが必要とのことだったので、まずはBase Toolkitから。

基本的にダウンロードサイトにインストラクションがあるけれど、「Downloadをクリック」→「m_BaseKit_p_yyyy.version.dmgをダブルクリック」→「現れるbootstrapperのアイコンをダブルクリック。」
Installation of component has failed のメッセージで失敗する。ぐぬぬ。(この後解決)

HPC Toolkitは「事前にBase Toolkitを入れよ」という忠告を無視して、入れてみたら入った。手続きは上のBase toolkiと一緒で、最初のファイル名が「m_HPCKit_p_yyyy.version.dmg」だっただけ。

```
. /opt/intel/oneapi/setvars.sh
```
でセットアップする。
テストコードを動かしたら、無事動いた。Base toolkitが入っていないので、MKLがないのがちょっと問題。(最悪自分でBLAS, LAPACK, FFTWあたりはビルドすれば良いは良いのだけれど。)
あと、Mac版はIntel MPIがHPC Toolkitに入っていないとの記述が見当たる。このケースでも、インストール時に候補があったのはFortranとCコンパイラーだけだった。

再度Base Toolkitのインストールに挑戦。Base Toolkitのインストーラー見てると、どうもIntel Distribution for Pythonのところでコケているので、これを外して入れれば大丈夫か？(エラーもテキストのコピーができないけれど)エラーのメッセージは`file:///opt/intel/oneapi/conda_channel/osx-64::numpy=1.2.1.2ゴニョゴニョ`とかが出てるし。
と思って、インストール時のリストからIntel Distribution for Pythonを外したら、他は全部うまく行った。

と思ったのも束の間、MKLをリンクしてBLASの機能を使ったら

```console
Intel MKL FATAL ERROR: This system does not meet the minimum requirements for use of the Intel(R) Math Kernel Library.
The processor must support the Intel(R) Supplemental Streaming SIMD Extensions 3 (Intel(R) SSSE3) instructions.
The processor must support the Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) instructions.
The processor must support the Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.
```
が出た。どうもそのままでは使えなさそう。BLAS, LAPACK, FFTWは自分で入れることにする。

# LAPACK


## 元祖LAPACKを入れる
ご本尊の[LAPACK&#8201;&#8212;&#8201;Linear Algebra PACKage](http://www.netlib.org/lapack/)から、lapack-3.10.0.tar.gz(2022/01/21時点最新版)をダウンロード。
tarballを展開して、できたディレクトリに入る。`${LAPACK_ROOT}/INSTALL/`下にMakefileの入力用`make.inc`のサンプルがいくつかある。インテルコンパイラ用の`make.inc.ifort`を`${LAPACK_ROOT}/make.inc`としてコピーをする。
ここまでお膳立てをして、`make`でビルドが始まる。makeが一通り終わると、`liblapack.a`, `librefblas.a`, `libtmglib.a`が出来ている。これらを`/Users/username/opt/lapack-3.10.0/intel_2021.5.0/lib`下に置く。
`librefblas.a`はそのままだと一般的なblasのリンク方向から考えて、紛らわしい。そこで、`ln -s librefblas.a libblas.a`として、`-llblas`でリンクできるようにしておく。

このようにして、[FortranコードにBLASをリンクする - Qiita](https://qiita.com/Yasushi-Shinohara/items/d81201912324d85dab5f)にあるコードを適当なディレクトリに用意して、

```zsh
ifort -L/Users/username/opt/lapack-3.10.0/intel_2021.5.0/lib main.f90 -llapack -lblas
```
とすることで、出来たa.outを実行すると、以下の出力を得た:

```console
 Total operations:    2.00200000000000      GFLOPs
 Hand-writting MM product
 Elapse time =  0.181405900000000       sec
   11.0360247378944       GFLOPs/s
 Linked BLAS
 Elapse time =  0.183711500000000       sec
   10.8975213854331       GFLOPs/s
 The matmul function
 Elapse time =  0.187821100000000       sec
   10.6590793047214       GFLOPs/s
```
手書きの行列行列積ルーチンが一番速いのは測定時の誤差のようで、何回かデータを取ると、どれも同じくらいの速度 という結果に。コンパイラが賢いのか、BLASの優位性がほとんど無い という何だかなぁ という感じに。
(ちなみにコンパイル時に`-fast`オプションをつけると、手書き行列積とmatmulは20 GFLOPs/sになって、BLASの意味が...)
とにかく、動いたのでヨシ👈

## OpenBLAS
最初は`make`を入力しただけでは、うまくビルドされなかったので、再挑戦。

```zsh
make FC=ifort CC=icc
```
にしたら、

```console

 OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)

  OS               ... Darwin             
  Architecture     ... x86_64               
  BINARY           ... 64bit                 
  C compiler       ... INTEL  (cmd & version : icc (ICC) 2021.5.0 20211109)
  Fortran compiler ... INTEL  (cmd & version : ifort (IFORT) 2021.5.0 20211109)
-n   Library Name     ... libopenblas_nehalemp-r0.3.17.a
 (Multi-threading; Max num-threads is 8)
WARNING: If you plan to use the dynamic library libopenblas_nehalemp-r0.3.17.dylib, you must run:

"make PREFIX=/your_installation_path/ install".

(or set PREFIX in Makefile.rule and run make install.
If you want to move the .dylib to a new location later, make sure you change
the internal name of the dylib with:

install_name_tool -id /new/absolute/path/to/libopenblas_nehalemp-r0.3.17.dylib libopenblas_nehalemp-r0.3.17.dylib

To install the library, you can run "make PREFIX=/path/to/your/installation install".
```
といった感じで、それらしい出力が得られていた。

```zsh
make PREFIX=/Users/username/opt/OpenBLAS-0.3.17/intel_2021.5.0 install
```
で所望の場所にインストール完了。

上でも使ったベンチマークを見ると

```console
 Total operations:    2.00200000000000      GFLOPs
 Hand-writting MM product
 Elapse time =  0.205514400000000       sec
   9.74140984767977       GFLOPs/s
 Linked BLAS
 Elapse time =  0.247410100000000       sec
   8.09182810240972       GFLOPs/s
 The matmul function
 Elapse time =  0.214815325000000       sec
   9.31963303828533       GFLOPs/s
```
となって、BLASがかなり残念な感じに。。。

# Emacsのインストール(半ば失敗)
`みんな大好きemacs`をソースからインストールする。
[Emacsをソースからビルドしてインストールする &mdash; my-emacs 0.1 ドキュメント](https://myemacs.readthedocs.io/ja/latest/build.html)を参考に、
http://ftp.jaist.ac.jp/pub/GNU/emacs/
から最新版(2022/01/21現在)の emacs-27.2.tar.gz をダウンロードする。tarballを展開して、ディレクトリで

```zsh
./configure --prefix=/Users/username/opt/emacs-27.2 CC=gcc
```
でビルドを試みると、

```console
configure: error: The following required libraries were not found:
     gnutls
Maybe some development libraries/packages are missing?
To build anyway, give:
     --with-gnutls=ifavailable
as options to configure.
```
なるエラーが表れた。gnutlsを入れるのは怠いので、教えていただいたオプションをくっつけて

```zsh
./configure --prefix=/Users/username/opt/emacs-27.2 CC=gcc --with-gnutls=ifavailable
```
でビルド。

```console
configure: WARNING: This configuration installs a 'movemail' program
that does not retrieve POP3 email.  By default, Emacs 25 and earlier
installed a 'movemail' program that retrieved POP3 email via only
insecure channels, a practice that is no longer recommended but that
you can continue to support by using './configure --with-pop'.
configure: You might want to install GNU Mailutils
<https://mailutils.org> and use './configure --with-mailutils'.
```
なる警告が出たけれど、特にメールを開く希望はないので、そのまま

```zsh
make
make install
```
を試みる。`${EMACS_ROOT}/src/emacs`ができていて、これを実行すると所謂emacsが起動するのだけれども、prefixで指定した箇所にemacsが置かれていない。謎。

# Open MPIをインストールする試み(失敗)
[Open MPI: Open Source High Performance Computing](https://www.open-mpi.org/)のDownloadから最新版(2022/01/21現在)の openmpi-4.1.2.tar.gz をダウンロードする。

```zsh
./configure --prefix=/Users/username/opt/openmpi-4.1.2/intel_2021.5.0 FC=ifort CC=icc CXX=icc
```
でconfigure(数十分かかる。私の環境の場合は35分くらいかかった。)。以下の感じの標準出力を得る:

```console

Open MPI configuration:
-----------------------
Version: 4.1.2
Build MPI C bindings: yes
Build MPI C++ bindings (deprecated): no
Build MPI Fortran bindings: mpif.h, use mpi, use mpi_f08
MPI Build Java bindings (experimental): no
Build Open SHMEM support: no (disabled)
Debug build: no
Platform file: (none)

Miscellaneous
-----------------------
CUDA support: no
HWLOC support: internal
Libevent support: internal
PMIx support: Internal
 
Transports
-----------------------
Cisco usNIC: no
Cray uGNI (Gemini/Aries): no
Intel Omnipath (PSM2): no
Intel TrueScale (PSM): no
Mellanox MXM: no
Open UCX: no
OpenFabrics OFI Libfabric: no
OpenFabrics Verbs: no
Portals4: no
Shared memory/copy in+copy out: yes
Shared memory/Linux CMA: no
Shared memory/Linux KNEM: no
Shared memory/XPMEM: no
TCP: yes
 
Resource Managers
-----------------------
Cray Alps: no
Grid Engine: no
LSF: no
Moab: no
Slurm: yes
ssh/rsh: yes
Torque: no
 
OMPIO File Systems
-----------------------
DDN Infinite Memory Engine: no
Generic Unix FS: yes
IBM Spectrum Scale/GPFS: no
Lustre: no
PVFS2/OrangeFS: no
 
```
からの`make`をするも

```console
ld: symbol(s) not found for architecture x86_64
make[2]: *** [opal_wrapper] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive] Error 1
```
なるエラーメッセージでコケる。ぐぬぬ。


# MPICHを入れる試み(失敗)
[MPICH | High-Performance Portable MPI](https://www.mpich.org/)からダウンロード。
tarballを展開して

```zsh
./configure --prefix=/Users/username/opt/mpich-4.0/intel FC=ifort CC=icc CXX=icpc
```
でconfigureすると、とおる。makeを実行すると

```console
ld: illegal thread local variable reference to regular symbol __tls___global_vci_poll_count for architecture x86_64
make[2]: *** [lib/libpmpi.la] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
```
でコケる。ぐぬぬ。

# FFTWを入れる試み
[FFTW Download Page](https://www.fftw.org/download.html)から最新版(2022/01/23現在)のfftw-3.3.10.tar.gz をダウンロードする。
tarballを展開して

```zsh
./configure --prefix=/Users/username/opt/fftw-3.3.10/intel FC=ifort CC=icc CXX=icpc
```
でconfigureすると通る。`make`, `make install`でビルド終了。

# python-3.10.2を入れる試み
[Python Release Python 3.10.2 | Python.org](https://www.python.org/downloads/release/python-3102/)からPython-3.10.2.tgzをダウンロード。

```zsh
./configure --prefix=/Users/username/opt/Python-3.10.2 --enable-optimizations
```
でconfigureすると通る。`make`, `make install`でビルド終了。`make`の時、`make install`の時に

```console
clang: warning: argument unused during compilation: '-fno-semantic-interposition' [-Wunused-command-line-argument]
gcc   -fno-semantic-interposition  -Wl,-stack_size,1000000  -framework CoreFoundation -o Programs/_testembed Programs/_testembed.o libpython3.10.a -ldl   -framework CoreFoundation    
```
```console
  WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
  distutils: /Users/username/opt/Python-3.10.2/include/python3.10/setuptools
  sysconfig: /Users/username/sources/Python-3.10.2/Include/setuptools
  WARNING: Value for scheme.headers does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
  distutils: /Users/username/opt/Python-3.10.2/include/python3.10/pip
  sysconfig: /Users/username/sources/Python-3.10.2/Include/pip
  WARNING: The scripts pip3 and pip3.10 are installed in '/Users/username/opt/Python-3.10.2/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
```
のwarningが出たけれど、とりあえずヨシ👈

# pyenvのインストール
```zsh
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```
でインストール。`~/.zshrc`に以下を追記

[公式](https://github.com/pyenv/pyenv#understanding-path)のMacOSの箇所を見て、`.profile`→`.zprofile`、`.bashrc`→`.zshrc`と読み替えて以下の設定を書き込んだ:

```zsh:.zprofile(追記)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
if [ -n "$PS1" -a -n "$BASH_VERSION" ]; then source ~/.bashrc; fi
```
```zsh:.zshrc(追記)
eval "$(pyenv init -)"
```

コンソールの再起動で使えるようになった。(なんかzsh使ってるのにBASHの文字列があるのに気になるが、ひとまずこれで動いてはいる。)

## Anaconda3-2021.11を入れる試み(失敗)
```zsh
pyenv install anaconda3-2021.11
```
を入力すると、

```console
ERROR: The binary distribution of Anaconda3 is not available for MacOSX-arm64.
```
ぐぬぬ。

## 3.10.2のインストール
```zsh
pyenv install 3.10.2
```
### 色々インストール

```zsh
pip3 install numpy
pip3 install jupyter
pip3 install scipy
pip3 install matplotlib
```



## インストールしたpythonにpathが通らない
当初、ネットで見つけた情報を頼りに、適当に以下の記載

```zsh:.zshrc(抜粋)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
をしたら、`python3`と入れても、pyenvで入れたものにpathが通っておらず、system defaultが実行される問題があった。少し調べたところ、結局公式の内容に沿って設定ファイルを置いたら、無事pathがとおるようになった。本セクションの冒頭に記載してある設定は、修正済みのもの。

# SALMON-TDDFT v.1.2.1をビルド
[SALMON TDDFTビルドの備忘録 - Qiita](https://qiita.com/Yasushi-Shinohara/items/c3696e460c7700e02a22)にある通り、[SALMON-TDDFT【公式】](http://salmon-tddft.jp/jp/index.html)からソースをダウンロードする。個人的好みで、最新版ではないSALMON-v.1.2.1.tar.gz を落としてくる。
Tarballを展開してできたディレクトリにある`${SALMON_ROOT}/gnu_makefiles`で、`Makefile.intel-without-mpi`を参考にして、以下のようなMakefileを作成した(現状OpenMPIもmpichも入っていないので、MPIなしでインストールできる構成にした。OpenMPのスレッド並列は使える。):

```make:Makefile
# intel without mpi environment

TARGET = salmon.cpu
FC = ifort
CC = icc
FFLAGS = -O3 -qopenmp -ansi-alias -fno-alias -fpp -nogen-interface -std03 -warn all
CFLAGS = -O3 -qopenmp -ansi-alias -fno-alias -Wall -restrict
FILE_MATHLIB = lapack
LIBLAPACK = -mkl=sequential
LIBLAPACK = -L/Users/username/opt/lapack-3.10.0/intel_2021.5.0/lib -llapack -lblas
LIBSCALAPACK = -mkl=sequential
LIBSCALAPACK = -L/Users/username/opt/lapack-3.10.0/intel_2021.5.0/lib -llapack -lblas
MODULE_SWITCH = -module
MPI_FLAG =

LIBXC_LIB =
LIBXC_INC =
# LIBXC_LIB = -Llibxc_installed_dir/lib -lxcf90
# LIBXC_INC = -DSALMON_USE_LIBXC -Ilibxc_installed_dir/include
# LIBXC_LIB = -Llibxc_installed_dir/lib -lxcf90
# LIBXC_INC = -DSALMON_USE_LIBXC -Ilibxc_installed_dir/include

ifneq (,$(wildcard make.body))
include make.body
else 
include gnu_makefiles/make.body
endif
```
にして、`make`。成功すると、`${SALMON_ROOT}/bin/salmon.cpu`が出来ている。
`otool -L salmon.cpu`を実行すると以下のような表示が得られる

```console
/Users/username/opt/SALMON/v.1.2.1/intel_2022.0.0/bin/salmon.cpu:
	/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib (compatibility version 1.0.0, current version 1.0.0)
	@rpath/libiomp5.dylib (compatibility version 5.0.0, current version 5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.0.0)
```
なんか`libBLAS.dylib`という入れた覚えのないライブリラリがリンクされていて、自分でビルドしたLAPACK/BLASがリンクされているのか、ちょっと不安。ただ、一応動かした範囲ではそれらしく動いている。

# gnuplot-5.4.3をインストール
[gnuplot download](http://www.gnuplot.info/download.html)のsource fourgeから最新版(2022/01/24現在)のgnuplot-5.4.3.tar.gzをダウンローしてくる。tarballを展開して以下のコマンドでインストール完了

```zsh
./configure --prefix=/Users/username/opt/gnuplot-5.4.3 
make 
make install
```
ひとまずこれで、x11, svgのターミナルは入ったので、よしとした。他にも使いたいものはまた使いたくなった時に入れる。

# gfortran 12-experimental for ARM, macOS 12 (Monterey)をインストール
GCCのgfortranのwiki [GFortran - GCC Wiki](https://gcc.gnu.org/wiki/GFortran)から「Quick links」→「Binaries」→「macOS」と辿っていくと、[Releases · fxcoudert/gfortran-for-macOS · GitHub](https://github.com/fxcoudert/gfortran-for-macOS/releases)に行き着く。
すると、19 Dec 2021に[Release gfortran 12-experimental for ARM, macOS 12 (Monterey) · fxcoudert/gfortran-for-macOS · GitHub](https://github.com/fxcoudert/gfortran-for-macOS/releases/tag/12-arm-alpha)が見つかる。*experimental*の文字は見つかるので、こちらもそういった気持ちで利用してみることにする。
`gfortran-ARM-12.0-Monterey.dmg`があるので、これをダウンロードして、ダブルクリック。現れたフォルダの中にある`gfortran.pkg`をダブルクリック。ウィザードに従って、インストールすることで、インストール完了。
`which gfortran`で`/usr/local/bin/gfortran`にアプリがあることがわかる。`gfortran -v`のコマンドで

```console
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/gfortran/libexec/gcc/aarch64-apple-darwin21/12.0.0/lto-wrapper
Target: aarch64-apple-darwin21
Configured with: ../gcc/configure --prefix=/usr/local/gfortran --with-gmp=/Users/fx/devel/gcc/build_package/deps --enable-languages=c,c++,fortran,objc,obj-c++ --build=aarch64-apple-darwin21 --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 12.0.0 20211218 (experimental) (GCC) 
```
なる表示を得る。

## gfortran-lapack
`${LAPACK_ROOT}/INSTALL/`の`make.inc.gfortran`を`make.inc`として用意し、makeする。

oneAPIでもやったように、[FortranコードにBLASをリンクする - Qiita](https://qiita.com/Yasushi-Shinohara/items/d81201912324d85dab5f)にあるコードを適当なディレクトリに用意して、

```zsh
gfortran -Ofast -march=native /Users/username/opt/lapack-3.10.0/gfortran_12.0.0/lib/librefblas.a ./main.f90
```
とすることで、出来たa.outを実行すると、以下の出力を得た:

```console
Total operations:    2.0019999999999998      GFLOPs
 Hand-writting MM product
 Elapse time =  0.55250850000000007       sec
   3.6234736660159972       GFLOPs/s
 Linked BLAS
 Elapse time =  0.33096490000000006       sec
   6.0489798162886741       GFLOPs/s
 The matmul function
 Elapse time =   4.8477800000000043E-002  sec
   41.297253588240352       GFLOPs/s
```

~~BLASの速度が270 GFLOPs/s出てるんだけど、ほんとかな。。。~~
~~**多分これは、コンパイラーの最適化でlinked BLAS部分が実行されないように最適化されている可能性が高い。**~~
これは当初`-lblas`のオプションをつけてコンパイルしていて、Macのaccelerate framework(後述)をリンクしていたために見られていた症状だった。gfotranでビルドしたlapack-3.10.0は大体上記の速度。

### gfortranでaccelerate.frameworkをリンク
Macにはアーキテクチャごとに最適化されたいくつかの関数・ルーチン・ライブラリがaccelerate.frameworkとして用意されているとのことである。BLAS以外にも、いろいろ準備されているみたい。
参考: [MacのRの行列演算を高速化 - J](https://joker.hatenablog.com/entry/2014/11/20/013332)
公式: [Apple Developer Documentation](https://developer.apple.com/documentation/accelerate)
これをリンクするためには

```zsh
gfortran -Ofast -march=native ./main.f90 -lblas
```
で良く(何もしなくてもPATHが通っているので)、実行すると

```console
 Total operations:    2.0019999999999998      GFLOPs
 Hand-writting MM product
 Elapse time =  0.55206569999999999       sec
   3.6263799761513886       GFLOPs/s
 Linked BLAS
 Elapse time =   7.4235000000000724E-003  sec
   269.68411126826703       GFLOPs/s
 The matmul function
 Elapse time =   4.8407599999999995E-002  sec
   41.357142266916760       GFLOPs/s
```
となって、大体270 GFLOPS/sくらいの速度が出る。速い🚅
確かにaccelerateがリンクされていることを確認したければ`ottol -l ./a.out`で

```console
./a.out:
	/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib (compatibility version 1.0.0, current version 1.0.0)
	@rpath/libgfortran.5.dylib (compatibility version 6.0.0, current version 6.0.0)
	@rpath/libquadmath.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.0.0)
```
となって、`libBLAS.dylib`がリンクされていることがわかる。

# Vimでsyntaxで色を付ける

```vim:~/.vimrc
syntax on
```
で最低限の色がつく。