作ったプログラムをオープンソースにして公開しよう

いや、つらい。何がって

![Payload Too Large]()

↑これ。このタグが出た。画像上げすぎたのか Qiita にもう画像をアップロードできなくなった……

#ならば Git Hub を使えばいいじゃない
![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/master/img/2017-02/201702151752gif81.gif?raw=true)

まあ、そうなんだが、**じゃあ、そうする。**


![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/master/img/2017-02/201702160552a1b.png?raw=true)

（だったら、右上にある画像を貼り付けるボタンを改造したい……。自分が構築したサイトなら PHP をいじるところからやり始めるんだが、レンタルに文句を言っても仕方がない）

つらい……！

他人の所有物とか　製造物を　自分で作り直したくなってしまうのが　つらい……！

![Payload Too Large]()

おっと、また間違えた。

![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/3a12b6ba340aadd4f8907a471664384d1f2cf297/201702160552a2b.png?raw=true)

Git Hub には画像ファイルをアップすることもできて……。

![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/master/img/2017-02/201702160552a4b.png?raw=true)

ブランチ切って　ファイル上げとけば　右クリックで画像のアドレス　コピーして

```
![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/muzudho-img-1/201702160552a4b.png?raw=true)
```

こう書いときゃいいんだが　これでは　ろくなファイル管理ができない上に　手順が多い、つらい……。

#ならば　頭を使えばいいじゃない
マリーアントワネットがそんなこと言ったら新たな歴史が始まって面白いんだが　**どうせ手間なら　もう１手間掛けよう。手間がゼロでないものは便利ではないのだ。便利でないのなら利点を増やそう。**

![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/master/img/2017-02/201702160552a5b.png?raw=true)

月別にフォルダを掘って　画像を投げ入れて　コミットしてしまおう。Git Hub はそんなことをするためにあるんじゃない。**だが　マニュアル同梱　という体（てい）で行こう。プロ将棋では敗者が納得するまで感想戦は続けられる。** 納得が重要なのだ。

![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/master/img/2017-02/201702160552a6.png?raw=true)
**あっ！サムネイル表示がない！** しかも　コミットしようとするたびに　差分は無いかと　画像を全検索して更新はないです、と判定していたりするんだろ、地獄のようだ……。ラノベのタイトルを思いついた。だから僕は Git Hub の使い方を間違っている。

#何をするプログラムなのか説明しよう
もうコミット回数が 14 で差分がゴミのようだ。
![Please, click here(Animation.gif)](https://github.com/muzudho/StellaQL/blob/master/img/2017-02/201702160552a7b.png?raw=true)

ここの文章、２、３時間考えては書き直し、を繰り返している。今　見に行っても　また文面が変わっているだろう。

何をするプログラムなのかは　孫ニュースサイト　とかに取り上げてもらうのがよく、大元のサイトでは　**イッツ・ア・グレート・ツール！ ダウンロード！** とでも書いておけばいい気もするんだが、**類似の別の物と間違ってダウンロード** されない程度の説明にしておけばいいだろう。広告クリックとは逆の発想だ。

#インストール方法も書いた方がいいのでは？
今　書き直してくる。

続きは　あとで　この記事に追記していく。

##文章の構成

- プログラム名
- 特長１
- 特長２
- 免責
- 価格
- ライセンス
- 導入方法

と並べるところまでは書いた。このあと、使い方の概要、設定方法を書いていかないといけない。

使い方を説明するのが先か、設定方法を説明するのが先か。

ひとまず　チュートリアルを完成させるか。

#チュートリアルに書かねばならないこととは。

コマンド・リファレンスに書いてある内容には全て触れたい。ざっと　リストすると　こんな感じ。

- 行コメント
- 大文字、小文字は区別
- 単語は１つ以上のスペース区切り
- 命令文はセミコロン区切り
- 対応しているリテラル文字列のエスケープシーケンスは \\ \" \r \n の４つ
- リテラル文字列は検索時は正規表現。 \ を検索したいときは \\ 。
- LAYER INSERT WORDS NewLayer1 "New Layer2"
- STATE INSERT WORDS WhiteCat "White Dog" WHERE "Base Layer"
- STATE UPDATE SET speed 1.23 speedParameterActive true speedParameter 4.5 WHERE "Base Layer\.Cat"
- STATE DELETE WORDS WhiteCat "White Dog" WHERE "Base Layer"
- STATE SELECT WHERE ".*Cat"
- STATE SELECT WHERE ".*Cat" THE Zoo1 ; STATE SELECT WHERE ".*Dog" THE Zoo2
- TRANSITION INSERT FROM "Base Layer\.Cat" TO "Base Layer\.Dog"
- TRANSITION ANYSTATE INSERT FROM "Base Layer" TO "Base Layer\.Foo"
- TRANSITION ENTRY INSERT FROM "Base Layer" TO "Base Layer\.Foo"
- TRANSITION EXIT INSERT FROM "Base Layer\.Foo"
- TRANSITION UPDATE SET exitTime 1.0 duration 0 FROM "Base Layer\.Cat" TO   "Base Layer\.Dog"
- TRANSITION DELETE FROM "Base Layer\.Cat" TO "Base Layer\.Dog"
- TRANSITION SELECT FROM ".*" TO ".*"
- TRANSITION SELECT FROM ".*" TO ".*" THE Zoo1
- FROM、TOの正規表現 FROM "Base Layer\.Cat" TO "Base Layer\.Dog"
- タグ ("AND" 操作) FROM TAG ( Alpha Beta ) TO TAG ( Cee Dee )
- タグは Unityのタグではなく、StellaQLのタグです。 C#のソースに定数で書いておいてください。
- タグは スペース区切り。
- ( ) はすべてのタグ一致検索。
- 括弧は入れ子可能。 ((A B)(C D))
- ただし ((A B)  C ) はダメ。 ((A B) (C)) はＯＫ。
- タグ ("OR" 操作) FROM TAG [ Alpha Beta ] TO TAG [ Cee Dee ]
- [  ] は、どれか１つでも一致検索。
- タグ ("NOT" 操作) FROM TAG { Alpha Beta } TO TAG { Cee Dee }
- { } は、１つも一致しない検索。
- SET 句 (STATE 文の場合) SET name "WhiteCat" tag "enjoy" speed 1.23 speedParameterActive true speedParameter "Monday" mirror true mirrorParameterActive true mirrorParameter "Tuesday" cycleOffset 4.56 cycleOffsetParameterActive true cycleOffsetParameter "Wednesday" iKOnFeet true writeDefaultValues false
- SET 句 (TRANSITION 文の場合) SET solo true mute true hasExitTime true exitTime 12.3 hasFixedDuration false duration 4.56 offset 7.89 orderedInterruption false tag "excellent"
- その他。CSHARPSCRIPT GENERATE_FULLPATH [Generate C# (Fullpath of all states)]ボタンを押下するのと同じです。

で、ここで伝えたいのは　基本操作の習得だ。何ができるか調べたい人向けの内容はコマンド・リファレンスに投げる。一筆書きのツアーにするような、シナリオを考えていきたい。そこで大雑把に重複する情報を消してみよう。

##通りたいポイントを絞り込んでいく。

- 行コメント
- 大文字、小文字は区別
- 単語は１つ以上のスペース区切り
- 対応しているリテラル文字列のエスケープシーケンスは \\ \" \r \n の４つ
- リテラル文字列は検索時は正規表現。 \ を検索したいときは \\ 。
- レイヤーの挿入（LAYER INSERT）、WORD句（WORDS NewLayer1 "New Layer2"）
- ステートの挿入（STATE INSERT）、WHERE句（WHERE "Base Layer"）
 - 更新（UPDATE）、SET句（SET）文字列型（tag "enjoy"）、浮動小数点数型（speed 1.23）、論理値型（speedParameterActive true）、他に整数型。
 - 削除（DELETE）
 - 選択（SELECT）
  - THE Zoo1
- 命令文はセミコロン区切り。 式A  ; 式B
- トランジション挿入（TRANSITION INSERT） FROM "Base Layer\.Cat" TO FROM句とTO句。
 - 正規表現 FROM TO
 - ANYSTATE INSERT
 - ENTRY INSERT
 - EXIT INSERT
 - UPDATE SET句
 - DELETE
 - SELECT
- タグ ("AND" 操作) FROM TAG と TO TAG句。 ( Alpha Beta )
 - ( ) はすべてのタグ一致検索。
 - タグは Unityのタグではなく、StellaQLのタグ。 C#のソースに定数で書いておいてください。
 - タグは スペース区切り。
 - 括弧は入れ子可能。 ((A B)(C D))
 - ただし ((A B)  C ) はダメ。 ((A B) (C)) はＯＫ。
 -  ("OR" 操作) TAG [ Alpha Beta ]
  - [  ] は、どれか１つでも一致検索。
 -  ("NOT" 操作) TAG { Alpha Beta }
  - { } は、１つも一致しない検索。
- STATE文の SET句 コマンドリファレンスに丸投げ。
- TRANSITION文の SET句 コマンドリファレンスに丸投げ。
- CSHARPSCRIPT GENERATE_FULLPATH [Generate C# (Fullpath of all states)]ボタンを押下するのと同じ

このうち、挿入、更新、削除は　一連の流れにできるだろう。また、ステートとトランジションで基本操作の説明をしておけば、レイヤー等の説明を省こう。

##削っていく。

- トランジション挿入（TRANSITION INSERT） FROM "Base Layer\.Cat" TO FROM句とTO句。 → UPDATE SET句 → SELECT → DELETE。
- ステートの挿入（STATE INSERT）、WORD句（WORDS NewLayer1 "New Layer2"）、WHERE句（WHERE "Base Layer"）→ 更新（UPDATE）、SET句（SET）文字列型（tag "enjoy"）、浮動小数点数型（speed 1.23）、論理値型（speedParameterActive true）、他に整数型。→ 選択（SELECT）→ THE Zoo1 → 削除（DELETE）。
 - 正規表現 FROM TO
- タグ ("AND" 操作) FROM TAG と TO TAG句。 ( Alpha Beta )
 - ( ) はすべてのタグ一致検索。
 - タグは Unityのタグではなく、StellaQLのタグ。 C#のソースに定数で書いておいてください。
 - タグは スペース区切り。
 - 括弧は入れ子可能。 ((A B)(C D))
 - ただし ((A B)  C ) はダメ。 ((A B) (C)) はＯＫ。
 -  ("OR" 操作) TAG [ Alpha Beta ]
  - [ ] は、どれか１つでも一致検索。
 -  ("NOT" 操作) TAG { Alpha Beta }
  - { } は、１つも一致しない検索。
- 明示的な説明を省略：
 - レイヤーの挿入（LAYER INSERT）
 - CSHARPSCRIPT GENERATE_FULLPATH [Generate C# (Fullpath of all states)]ボタンを押下するのと同じ
 - トランジション各種挿入(INSERT) ANYSTATE → ENTRY → EXIT INSERT
 - 行コメント、大文字、小文字は区別、単語は１つ以上のスペース区切り
 - 対応しているリテラル文字列のエスケープシーケンスは \\ \" \r \n の４つ
 - リテラル文字列は検索時は正規表現。 \ を検索したいときは \\ 。
 - 命令文はセミコロン区切り。 式A  ; 式B
 - コマンドリファレンスに丸投げ。（STATE文の SET句、TRANSITION文の SET句）

ざっくり削ったので、流れを考えよう。

##流れ
-第一部 トランジション
 - 猫と犬をつなげる。(FROM、TO）
 - フーと、名前にNが含まれるステートをつなげる。（正規表現 FROM TO）
 - 一覧を出力する(SELECT)
  - THE Zoo1付き。
 - フーから伸びている線を全部消す。(DELETE)
 - 猫と犬の線のプロパティを更新（UPDATE文 SET句)
  - 文字列型（tag "enjoy"）、浮動小数点数型（exitTime 1.23）、論理値型（solo true）、他に整数型。
-第二部 ステート
 - 白アルパカ、白熊、白猫、白犬を作る（STATE INSERT）WORD句（WORDS NewLayer1 "New Layer2"）WHERE句（WHERE "Base Layer"）
 - 白猫のプロパティーを更新（UPDATE）
 - 白い動物全部 削除（DELETE）
-第三部 タグ 
 - 名前に A I O の全部含む ("AND" 操作) FROM TAG と TO TAG句。 ( Alpha Ai Ou )。 ( ) はすべてのタグ一致検索。
  - タグは Unityのタグではなく、StellaQLのタグ。 C#のソースに定数で書いておいてください。
  - タグは スペース区切り。
 - 名前に A I O のいずれかを含む。("OR" 操作) TAG [ Alpha Ai Ou ]。 [ ] は、どれか１つでも一致検索。
 - 名前に A I O のいずれかは含むが、 E は含まない。 ("NOT" 操作) ( [ Alpha Ai Ou ] { Eee } )。 { } は、１つも一致しない検索。
  - 括弧は入れ子可能。 ((A B)(C D))
  - ただし ((A B)  C ) はダメ。 ((A B) (C)) はＯＫ。
- 明示的な説明を省略：
 - ステート選択（SELECT）

こんなけ　まとまってくれば、作りながら調整していこう。

#で、書いたチュートリアルはこんな感じ

```チュートリアル
---------------------------------------------------------------
StellaQL チュートリアル
Tutorial of StellaQL
---------------------------------------------------------------
    作者  : 高橋 智史 (ハンドルネーム: むずでょ)
    Author: TAKAHASHI Satoshi (Handle. Muzudho)
---------------------------------------------------------------


手順1
Step 1

    あなたのUnityプロジェクトのバックアップは取っておいてください。
    Please keep a backup of your data.

    エラー等で中断した際、データの復元機能は付いていません。
    There is no rollback at error suspension.


手順2
Step 2

    既にやっていると思いますが、メニューから[Window] - [State Machine Command Line (StellaQL)] をクリックしてください。
    I think you are doing it already. [Window] - [State Machine Command Line (StellaQL)] is here.


手順3
Step 3

    "Assets/StellaQL/AnimatorControllers/Demo_Zoo.controller"ファイルを開いてださい。
    Please, open "Assets/StellaQL/AnimatorControllers/Demo_Zoo.controller".

    また、その Demo_Zoo.controller ファイルを [Animation Controller Drag & Drop] 枠にドラッグ＆ドロップしてください。
    And Drag&Drop the Demo_Zoo.controller file to [Animation Controller Drag & Drop] box.


手順4 (任意)
Step 4 (Option)

    始める前に、開発者が夜中に StellaQL を壊していないか、テストすることができます。
    Before you begin, developers can test whether they break StellaQL at midnight.

        [Window] - [Editor Tests Runner] ... [StellaQL] - [StellaQLTest].
        [Window] - [Editor Tests Runner] ... [StellaQL] - [StellaQLTest].

    そして [Run All]を押してください。チェックが全て緑色ならＯＫです。
    And [Run All]. Please, click is all greens.

    ただし、既に Demo_Zoo を編集していた場合は結果が異なります。
    However, if you have already edited Demo_Zoo, the result will be different.


手順5
Step 5

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 5
    TRANSITION INSERT
    FROM "Base Layer\.Cat"
    TO   "Base Layer\.Dog"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Base Layer.Catステートから Base Layer.Dog ステートへ線が引かれていることを確認してください。
    Please confirm that a line is drawn from Base Layer.Cat state to Base Layer.Dog state.


手順6
Step 6

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 6
    TRANSITION INSERT
    FROM "Base Layer\.Foo"
    TO   "Base Layer\..*[Nn].*"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Fooステートから、名前に N が含まれるステートに線が引かれました。
    From the Foo state, a line was drawn in the state whose name contained N.


手順7
Step 7

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 7
    TRANSITION SELECT
    FROM
        "Base Layer\.Foo"
    TO
        ".*"
    THE
        Zoo001

    そして、Executeボタンを押してください。
    Then press the Execute button.

    プロジェクト・フォルダの中に CSVファイルが作られています。
    A CSV file is created in the project folder.

    フーから伸びている線が一覧されています。
    The lines extending from Foo are listed.


手順8
Step 8

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 8
    TRANSITION UPDATE
    SET
        exitTime 1.0
        duration 0
    FROM
        "Base Layer\.Foo"
    TO
        "Base Layer\..*[Nn].*"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    exitTime と duration が一斉に更新されました。
    ExitTime and duration were updated all at once.

    SELECT してみるのもいいでしょう。
    You may want to SELECT it.

    # Zoo001 to Zoo002
    TRANSITION SELECT FROM "Base Layer\.Foo" TO ".*" THE Zoo002

    でも、こんな線要らないですね。
    But, I do not need this line.


手順9
Step 9

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 9
    TRANSITION DELETE
    FROM "Base Layer\.Foo"
    TO   "Base Layer\..*"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Foo ステートから伸びている線が全て消えました。
    All the lines extending from the Foo state disappeared.

    Cat ステートから Dog ステートへの線はつながったままなことを確認してください。
    Please confirm that the line from Cat state to Dog state remains connected.


手順10
Step 10

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 10
    STATE UPDATE
    SET
        speedParameterActive true
        speedParameter       "New Float"
        speed                1.23
    WHERE
        "Base Layer\.Cat"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Inspector ウィンドウを見て猫ステートのプロパティーが更新されていることを確認してください。
    Please check the Inspector window and check that the property of the cat state is updated.


手順11
Step 11

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 11
    STATE INSERT
    WORDS
        WhiteAlpaca
        "White Bear"
        "\"White\" Cat"
        "White\\Gray\\Black Dog"
    WHERE "Base Layer"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    ステートが４つ作成されました。
    Four states have been created.


手順12
Step 12

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 12
    STATE DELETE
    WORDS
        ".*(White).*"
    WHERE
        "Base Layer"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    名前に White を含むステートが削除されました。
    A state including White in the name has been deleted.


手順13
Step 13

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 13
    TRANSITION INSERT
    FROM TAG ( Ei I )
    TO   "Base Layer\.Foo"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    A と E を含む動物から Foo に線が引かれました。
    A line from Foo was drawn from animals including A and E.

    丸括弧は全てのタグに一致するものを探します。
    Parentheses look for matches for all tags.

手順14
Step 14

    Projectウィンドウから Assets / StellaQL / AnimatorControllers / Demo_Zoo をダブルクリックしてC#スクリプト・ファイルを開いてください。
    Double click Assets / StellaQL / AnimatorControllers / Demo_Zoo from the Project window to open the C# script file.

    ステートに１つ１つタグを設定しています。エイ、ビー、シー...
    I set the tag one by one in the state.Ei, Bi, Si...

    このタグはUnityとは関係なく、ただの文字列です。
    This tag is just a character string, regardless of Unity.

    ユニティーエディターに戻ってください。
    Please return to the unity editor.


手順15
Step 15

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 15
    TRANSITION INSERT
    FROM "Base Layer\.Foo"
    TO TAG [ Eks Uai Zi ]

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Foo から X と Y と Z のいずれかを含む動物に線が引かれました。
    A line was drawn from animals containing X, Y and Z from Foo.

    角括弧は１つでもタグが一致するものを探します。
    We look for something that matches at least one square bracket.

手順16
Step 16

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 16
    TRANSITION DELETE
    FROM "Base Layer\.Foo"
    TO   TAG { I Ai Uai }

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Foo から E と I と Y の１つも含まない動物への線は消されました。
    The line from Foo to an animal that does not contain E, I and Y is erased.

    中括弧はタグが１つも一致しないものを探します。
    Curly braces look for matches that do not match any tags.


手順17
Step 17

    一旦 全てのトランザクションを消しましょう。
    Let's delete all transactions once.

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 17
    TRANSITION DELETE
    FROM ".*"
    TO   ".*"

    そして、Executeボタンを押してください。
    Then press the Execute button.

    全てのトランザクションが削除されました。
    All transactions have been deleted.


手順18
Step 18

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 18
    TRANSITION INSERT
    FROM "Base Layer\.Foo"
    TO TAG ( [ Ei Ou ] { I } )

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Fooから、A か O を含み、E は含まない動物へ線が引かれました。
    From Foo, lines were drawn from animals containing A or O, but not E.

    タグは囲ってください。  ((A B ) (C) ) はＯＫ。((A B ) C ) はダメ。
    Please surround the tag. ((A B) (C)) is OK. ((A B) C) is not good.


手順19
Step 19

    難しい場合はセミコロンで命令文を分けましょう。
    If it is difficult, let's divide the statement with a semicolon.

    もう一度、全てのトランザクションを消します。
    Turn off all transactions again.

    次の文をクエリー・テキストボックスに入力してください。
    Please enter the following statement in the Query text box.

    # Step 19
    TRANSITION DELETE FROM ".*" TO ".*";
    TRANSITION INSERT FROM "Base Layer\.Foo" TO TAG [ Ei Ou ];
    TRANSITION DELETE FROM "Base Layer\.Foo" TO TAG ( I ) ;

    そして、Executeボタンを押してください。
    Then press the Execute button.

    Fooから、A か O を含み、E は含まない動物へ線が引かれました。
    From Foo, lines were drawn from animals containing A or O, but not E.


基本操作の説明は以上です。
The explanation of the basic operation is above.

その他のクエリーは、コマンド リファレンスボタンを押して調べてください。
For other queries, please check by pressing the command reference button.

サンキュー☆（＾ｑ＾）
Thank you.
```

- 詰め込みたいネタを一覧して
- 削って
- 一筆書きできるように　一石二鳥にまとめたり、並び替えたり、更に削ったりして
- 一直線上にプロットが並べられ
- 書きながら調整する

というマンガみたいな流れ　おわり。

まだ続く。

というか　シナリオを考えずに　チュートリアルを作ってしまった。何か事例があってそれに沿うようにチュートリアルを作ることを　**シナリオがある** と言うんだが　腹が減っていて　何も考えずに　もう作ってしまったからいいだろう。

まだ　スプレッドシートの解説を何もしていないし、プログラムのコメントを英語化できていない。
　
続きは　あとで　この記事に追記していく。

#よし、書き上げた。
StellaQL
https://github.com/muzudho/StellaQL

## Table of content
[Table of content](#table-of-content) じゃなくて ［見出し］（＃URLの一部）　を半角で書くことでページ内リンクも貼れるようだ。アルファベットは小文字にして、スペースはマイナス記号に置き換える。

## コマンドリファレンスの簡単なやつもつけた。
更新がめんどくさそうだが、手間を掛けておくか。