memo

<! --
	referrenced below sites.
	https://stackoverflow.com/questions/49456579/running-a-bat-file-using-an-html-button
	https://qiita.com/itasnasal/items/c9bd297c6c2050db6d76
	https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364421(v=msdn.10)?redirectedfrom=MSDN
	https://maywork.net/computer/powershell-xlsx-search/
-->

<html>
<head>
<title>Run Exe or Batch files with Javascript and HTA</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<!--
<HTA:APPLICATION
  APPLICATIONNAME="Run Exe or Batch files with Javascript and HTA"
  ID="MyHTMLapplication"
  VERSION="1.0"/> -->
</head>
<script language="Javascript">
function RunMe(){

    // get current path
    var path = location.pathname;

    fso = new ActiveXObject("Scripting.FileSystemObject");
    WshShell = new ActiveXObject("WScript.Shell");
    var temp = fso.GetSpecialFolder(2); // 2:%TEMP%

    var myself = function(){return fso.OpenTextFile(path).ReadAll();}(path);
//    myself = myself.replace(/^[\s\S]*\/\* powershell code from here/m, "" );
//    myself = myself.replace(/   powershell code to here \*\/*$/gm, "" );
    myself = myself.replace(/^[\s\S]*\/\* powershell code from here/m, "" ).replace(/   powershell code to here.+/, "" );

    var tempps1 = fso.BuildPath( temp, "searchFromExcel.ps1" );
    var ouf = fso.CreateTextFile( tempps1,true, false );
    ouf.Write( myself ); ouf.Close();
    
    var temptxt = fso.BuildPath( temp, "findFromExcel.txt" );

    
    var TargetDir = document.getElementById("TargetDir").value;
    var Keyword = document.getElementById("Keyword").value;
    
    if (TargetDir.replace(/^s+|s+$/g,'') == "") { alert("input directory path !"); return }
    if (Keyword.replace(/^s+|s+$/g,'') == "") { alert("input Keyword !"); return }
    
    var cmd = "powershell -NoProfile -ExecutionPolicy Unrestricted " + tempps1 + " " + TargetDir + " " + Keyword + " " + temptxt;

    WshShell.Run(cmd,1,true);
 //   fso.DeleteFile(tempps1);

}
</script>
Dir パス : <input name="TargetDir" id="TargetDir"><br><br>
検索文字 : <input name="Keyword" id="Keyword"><br><br><br>
<input type="button" Value="バッチ実行" onClick="RunMe();"
</html>


<!--//////////////////////////////////////////////////////////////////////
/* powershell code from here

function Release-Ref ($ref) { 
    ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0) 
    [System.GC]::Collect() 
    [System.GC]::WaitForPendingFinalizers() 
}

function Search-Excel
{
    param(
        [string] $fullPath,
        [string] $keyword,
        [string] $temptxtName
    )


    $Excel = New-Object -ComObject Excel.Application 
    try {

        $Excel.Visible = $False

#        Get-ChildItem $fullPath -Filter "*.xlsx" -Recurse | % {
        
            $fullPath = $_.FullName
            $workbook = $Excel.Workbooks.Open($fullPath)
            $workbook.Worksheets | % {

            $sheetName = $_.Name

            $range = $_.UsedRange
            $r = $range.Find($keyword)
            if ($r -eq $Null) {

            } else {

                $firstColumn = $r.Column
                $firstRow = $r.Row

                do {

                    $psObj = [PSCustomObject]@{
                        "FullPath"=$fullPath;
                        "Sheet" = $sheetName;
                        "Address" = $r.Address();
                        "Value" = $r.Value()} 
                       
                    if (Test-Path -Path $temptxtName ) {
                        Write-Output ($psObj.FullPath + "," + $psObj.Sheet + "," + $psObj.Address + "," + $psObj.Value) | Out-File  -Encoding utf8 -Append $temptxtName
                    } else {
                        Write-Output ($psObj.FullPath + "," + $psObj.Sheet + "," + $psObj.Address + "," + $psObj.Value) | Out-File  -Encoding utf8 $temptxtName
                    }


                    $r = $range.FindNext($r)

                    if ($r -eq $Null)
                    {
#                       Get-Content -Path $filepath | Sort-Object | Get-Unique -AsString
                        break
                    }

                } while ($r.Column -ne $firstColumn -Or $r.Row -ne $firstRow)
            }

            $workbook.Close() | Out-Null
        }
#        }
    } finally {
        $Excel.Quit() | Out-Null
        $a = Release-Ref($excel) 
    }
    
}

if (-not($MyInvocation.PSCommandPath)) {
    $TargetDir   = $Args[0]
    $Keyword     = $Args[1]
    $temptxtName = $Args[2]
#    Search-Excel  $TargetDir $Keyword $temptxtName
    Get-ChildItem $TargetDir -Filter "*.xlsx" -Recurse | % { Search-Excel $_.FullName $Keyword $temptxtName}
}

   powershell code to here */-->

1.PowerShell 始めよう

仕事中PowerShellを触ることになって忘れないようにちょっとずつメモしておきたくブログをはじめました。

 

1.PowerShellのソース編集用_EditorとしてPowerShell iseを使用します。

 キーボードでwindow キー + R 押す

    powershell ise を入力して Enterキー 押す

 

f:id:hellosungbum:20210407232725p:plain

powershell ise 開く

f:id:hellosungbum:20210407232857p:plain

powershell ise イメージ

白い部分(左上)はソースコードのEditor機能で

ダークブルー(左下)の部分はコンソールになります。

右部分はモジュールの導入情報です。

 

2.コンソールでaliasに登録されているコマンド一覧を確認します。

aliasと入力すると一覧が出てきます。

コーディングする時には非常に助かりますので、

覚えておくととても便利です。

長すぎるので一部だけキャプチャーしました。

 

f:id:hellosungbum:20210407234010p:plain

aliasコマンド実行結果

試しにls コマンドを実行してみます。

f:id:hellosungbum:20210407234353p:plain

ls コマンド

3.ファイル実行 

取り敢えずecho.ps1としてファイルに保存して実行してみましょう。

実行は赤い枠に囲まれている緑の開始ボタンを押せばコンソールに実行結果が表示されます。

ソースコード

# write-out で出力
$str = "Test-string"

Write-Host "Write-Host : ${str}"
Write-Output "Write-Output : ${str}"
echo "echo : ${str}"

 

 

f:id:hellosungbum:20210409232516p:plain

実行

 PS C:\Users\x121e> C:\powershell_memo\echo.ps1
このシステムではスクリプトの実行が無効になっているため、ファイル C:\powershell_memo\echo.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
+ CategoryInfo : セキュリティ エラー: (: ) []、ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess

 

何か怒っていますね。

実行権限がないので、コンソールで実行権限を付与してみます。

f:id:hellosungbum:20210409232951p:plain

権限付与

Set-ExecutionPolicy
-ExecutionPolicy RemoteSigned -Scope Process
を実行したらポップアップ画面が出てきますが、「すべて実行」を選択します。
細かい説明はこちら参照 => ponsuke0531 さんのQita


改めて緑の実行ボタンを押すと実行されます。

f:id:hellosungbum:20210409233447p:plain

実行成功
出力のコマンドにはecho、Write-Error、Write-HostやWrite-Outputなど色々あります。

細かい説明はこちら参照 => tooljp さんのブログ

デッバグする方法

処理を中断したい行にBreakpointを指定してデッバグします。
ショットキーF9あるいは下記のように操作します。

f:id:hellosungbum:20210409234628p:plain

debug
改めて緑の開始ボiンを押せば下記のように処理が中断されてbreakpoinの行まで実行結果がコンソールに表示されるのを確認できます。

f:id:hellosungbum:20210409234832p:plain

breakpoint
F11キーを押せば一歩ずつ進みます。
最後まで実行する場合はF5を押します。

f:id:hellosungbum:20210409235106p:plain

一歩ずつ
次回はExcel操作についてメモしておきます。






2017.03.21 CDH5で擬似分散モードのHadoopクラスタを構築する

転載: http://www.task-notes.com/entry/20150608/1433732400

JDKのインストール

OracleJDKをインストールします。 Java Development Kit Installation によるとJDK1.8も対象です。JDKのインストールについての詳細は CentOSにJava(JDK)をRPMでインストール を参照。

# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.rpm" -O jdk-8u45-linux-x64.rpm
# yum -y localinstall jdk-8u45-linux-x64.rpm
# java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
# echo "export JAVA_HOME=/usr/java/default" > /etc/profile.d/jdk.sh
# source /etc/profile.d/jdk.sh

 CDH 5 Requirements and Supported Versions

CDH5のインストール

CDH5 の RPM をダウンロードしてインストールします。

# wget http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm
# yum -y --nogpgcheck localinstall cloudera-cdh-5-0.x86_64.rpm
# yum clean all

CDH5 は直接リポジトリを追加してもいいです。

# wget http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/cloudera-cdh5.repo -P /etc/yum.repos.d/

パッケージの公開鍵を先にインポートしておく場合は実行してください。

# rpm --import http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera

 Installing CDH 5

擬似分散環境の設定

擬似分散環境用の設定ファイルhadoop-conf-pseudoをインストールします。依存関係のあるモジュールも自動でインストールされるため、HDFSやYARNも含まれています。

# yum -y install hadoop-conf-pseudo

今回はローカルの仮想マシンで構築しているのでファイアーウォールを無効化しておきます。これでローカルマシンからアクセスできるようになります。

# service iptables stop
# chkconfig iptables off

Hadoopはホスト名を参照するので次のように設定しておきます。

# vi /etc/hosts
127.0.0.1       localhost
192.168.33.100  vm-cluster

localhostをホスト名に変更します。

# vi /etc/hadoop/conf/core-site.xml
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://vm-cluster:8020</value>
</property>

こちらも同じくlocalhostをホスト名に変更して下さい。これでWeb管理画面にアクセスできるようになります。

# vi /etc/hadoop/conf/mapred-site.xml
<property>
  <name>mapred.job.tracker</name>
  <value>vm-cluster:8021</value>
</property>

<property>
  <name>mapreduce.jobhistory.address</name>
  <value>vm-cluster:10020</value>
</property>

<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>vm-cluster:19888</value>
</property>

HDFSの起動

Namenodeのフォーマットをします。JDKをインストールしてJAVA_HOMEをセットしていない、またはホスト名を書いてないとエラーになります。

# sudo -u hdfs hdfs namenode -format

HDFS(Namenode / Secondarynamenode / Datanode)を起動します。擬似分散環境の場合、ひとつのサーバーで構築するので Secondarynamenode は必要ありませんが起動しても特に問題ありません。

# for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done
starting datanode, logging to /var/log/hadoop-hdfs/hadoop-hdfs-datanode-vm-cluster.out
Started Hadoop datanode (hadoop-hdfs-datanode):            [  OK  ]
starting namenode, logging to /var/log/hadoop-hdfs/hadoop-hdfs-namenode-vm-cluster.out
Started Hadoop namenode:                                   [  OK  ]
starting secondarynamenode, logging to /var/log/hadoop-hdfs/hadoop-hdfs-secondarynamenode-vm-cluster.out
Started Hadoop secondarynamenode:                          [  OK  ]

起動できたらブラウザでhttp://192.168.33.10:50070/にアクセスしてみましょう。HDFSのWeb管理画面が表示されれば成功です。

YARNの起動

HDFS上に各種ディレクトリを作成します。スクリプトが用意されてるので実行しましょう。これをしてないと YARN の起動で失敗します。

# sudo /usr/lib/hadoop/libexec/init-hdfs.sh

終わったら次のコマンドでHDFS上のディレクトリを確認してください。

# sudo -u hdfs hadoop fs -ls -R /

YARNを起動します。

# sudo service hadoop-yarn-resourcemanager start
starting resourcemanager, logging to /var/log/hadoop-yarn/yarn-yarn-resourcemanager-vm-cluster.out
Started Hadoop resourcemanager:                            [  OK  ]
# sudo service hadoop-yarn-nodemanager start
starting nodemanager, logging to /var/log/hadoop-yarn/yarn-yarn-nodemanager-vm-cluster.out
Started Hadoop nodemanager:                                [  OK  ]
# sudo service hadoop-mapreduce-historyserver start
starting historyserver, logging to /var/log/hadoop-mapreduce/mapred-mapred-historyserver-vm-cluster.out
...
Started Hadoop historyserver:                              [  OK  ]

起動できたら以下のWeb管理画面にアクセスしてみます。

WordCountの実行

HDFSとYARNのインストールが終わったので、MapReduceのサンプルプログラムを実行します。

ディレクトリを作成してテストデータを用意してください。

# sudo su - hdfs
# echo "hoge fuga bar foo hoge fuga" > wordcount.txt
# hadoop fs -mkdir -p /user/hdfs/input
# hadoop fs -put wordcount.txt /user/hdfs/input
# hadoop fs -cat /user/hdfs/input/wordcount.txt
hoge fuga bar foo hoge fuga

WordCoundのサンプルプログラムは既に用意されてるので次のコマンドで実行します。

# hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount /user/hdfs/input/wordcount.txt /user/hdfs/output

以下のようにログが流れたら成功です。

15/06/04 01:38:25 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
15/06/04 01:38:27 INFO input.FileInputFormat: Total input paths to process : 1
15/06/04 01:38:27 INFO mapreduce.JobSubmitter: number of splits:1
15/06/04 01:38:27 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1433381720702_0001
15/06/04 01:38:28 INFO impl.YarnClientImpl: Submitted application application_1433381720702_0001
15/06/04 01:38:28 INFO mapreduce.Job: The url to track the job: http://vm-cluster:8088/proxy/application_1433381720702_0001/
15/06/04 01:38:28 INFO mapreduce.Job: Running job: job_1433381720702_0001
15/06/04 01:38:38 INFO mapreduce.Job: Job job_1433381720702_0001 running in uber mode : false
15/06/04 01:38:38 INFO mapreduce.Job:  map 0% reduce 0%
15/06/04 01:38:45 INFO mapreduce.Job:  map 100% reduce 0%
15/06/04 01:38:59 INFO mapreduce.Job:  map 100% reduce 100%
15/06/04 01:39:00 INFO mapreduce.Job: Job job_1433381720702_0001 completed successfully
...

出力されたファイルを確認してみましょう。単語毎にカウントされました。

$ hadoop fs -ls -R /user/hdfs/output
-rw-r--r--   1 hdfs supergroup          0 2015-06-04 01:38 /user/hdfs/output/_SUCCESS
-rw-r--r--   1 hdfs supergroup         26 2015-06-04 01:38 /user/hdfs/output/part-r-00000
$ hadoop fs -cat /user/hdfs/output/part-r-00000
bar 1
foo 1
fuga    2
hoge    2

Vagrantで自動構築

以上の内容でVagrantスクリプトを書きました。VagrantVirtualBoxがすでにインストールされてるなら次のコマンドだけで擬似分散モードの仮想マシンが作成できます。詳細は README を参考にしてみて下さい。 tasukujp/hadoop-pseudo-distributed · GitHub

$ git clone git@github.com:tasukujp/hadoop-pseudo-distributed.git
$ cd hadoop-pseudo-distributed
$ vagrant up

2017.03.21 Hadoop使いのためのRPMの便利な使い方5つ

 転載 : http://linux.wwing.net/WordPress/?p=134

Hadoop使いのためのRPMの便利な使い方5つ

Hadoopにどっぷりつかってもうすぐほぼ一年。去年の今頃はKVMやCluster、Linuxのパフォーマンスチューニングやらで休む暇もなかったわけですが、今年はより自転車操業的生活を送っています。

– * – * – * –

さて、Hadoopクラスタを構築する場合、エンタープライズで安定して利用できるとということからRed Hat Enterprise LinuxCentOSを選ぶ方は多いでしょう。これらのOSにHadoopをインストールする場合、ClouderaのCDH(Cloudera’s distribution including Apache Hadoop)をRPMパッケージ[1]を利用すると便利です。あるいは、前回紹介したCloudera Managerを利用すればもっと簡単にセットアップできます。

今回はRPMの便利な使い方を5つ紹介します。インストールや削除などの基本的な使い方には触れていませんので、興味があればRed Hat 社のDeployment Guideなどをご覧ください。
断りのない限り、下記のコマンドは全てrootユーザーあるいはsudoで実行する必要があります。

1.パッケージがインストールされているかを調べる


hadoopパッケージがインストールされているかを確認したいことはありますよね?そんなときには rpm -qa | grep <文字列>が便利です。-qa オプションによりインストールされている全てのパッケージが一覧できるので、その結果をgrepすることで、探したいパッケージを抽出できます。例えばhadopパッケージがインストールされているかを調べる場合は以下のように行います。

[root@node2 ~]# rpm -qa |grep hadoop
hadoop-httpfs-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64
hadoop-hdfs-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64
hadoop-0.20-mapreduce-0.20.2+1215-1.cdh4.0.0.p0.23.el6.x86_64
hadoop-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64
hadoop-mapreduce-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64
hadoop-yarn-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64
hadoop-client-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64
[root@node2 ~]#

検索したい文字列が思い浮かばないと探しにくい、というデメリットはありますが、個人的には最も利用しているかもしれません。

2. 最後にインストールしたパッケージを表示する

前回書いたCloudera Managerを使ってセットアップしたような場合、何のパッケージがインストールされたかが気になることがあります。こういうときは rpm -qa –last を利用することができます。

[root@node2 ~]# rpm -qa –last |more
cloudera-manager-daemons-4.0.1-1.cm401.p0.44 2012年06月30日 10時07分57秒
cloudera-manager-agent-4.0.1-1.cm401.p0.44 2012年06月30日 10時00分23秒
hue-2.0.0+58-1.cdh4.0.0.p0.16.el6 2012年06月30日 10時00分00秒
hue-shell-2.0.0+58-1.cdh4.0.0.p0.16.el6 2012年06月30日 09時59分51秒
hue-useradmin-2.0.0+58-1.cdh4.0.0.p0.16.el6 2012年06月30日 09時59分43秒
hue-beeswax-2.0.0+58-1.cdh4.0.0.p0.16.el6 2012年06月30日 09時59分34秒
hue-jobsub-2.0.0+58-1.cdh4.0.0.p0.16.el6 2012年06月30日 09時59分24秒
(略)

インストールされた時間もわかります。yumを使ってインストールした場合には/var/log/yum.logを確認しても良いでしょう。

3. コマンドやファイルがどのパッケージに属しているかを確認する

インストールされたファイルが、いったいどのRPMパッケージに属しているのかを調べたいことはないでしょうか?例えば yarn というコマンド、どのRPMパッケージでインストールされたんだっけ?という場合に役立ちます。RPMパッケージが特定できればアンインストールするなんてこともできますしね。

[root@node2 ~]# which yarn
/usr/bin/yarn
[root@node2 ~]# rpm -qf /usr/bin/yarn
hadoop-yarn-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64
[root@node2 ~]#

4. RPMパッケージのインストールでどのファイルが更新されたのかを調べる

RPMパッケージにはインストールするファイルのリストが入っています。rpm -ql <パッケージ名> により、パッケージのインストールした時に変更(追加)されたファイルを確認できます。

[root@node2 ~]# rpm -ql hadoop-yarn
/etc/hadoop/conf.empty/yarn-env.sh
/etc/hadoop/conf.empty/yarn-site.xml
/etc/security/limits.d/yarn.conf
/usr/bin/yarn
/usr/lib/hadoop-yarn
/usr/lib/hadoop-yarn/bin
/usr/lib/hadoop-yarn/bin/container-executor
/usr/lib/hadoop-yarn/bin/mapred
/usr/lib/hadoop-yarn/bin/yarn
/usr/lib/hadoop-yarn/cloudera
/usr/lib/hadoop-yarn/cloudera/cdh_version.properties
/usr/lib/hadoop-yarn/etc
(略)

これを一歩応用し、RPMパッケージをインストールする前に、追加されるファイルを確認をすることも可能です。これには上記のコマンドのオプションを少し変更して、rpm -qlp のようにパッケージのファイル名を指定をします。

例えばyumdownloaderというコマンドを利用してrpmファイルをダウンロードし、追加されるファイルを確認してみましょう。(yumdownloaderがインストールされていない場合、yum install yum-utilsによりyum-utilsパッケージをインストールしておいてください)

[root@node2 ~]# yumdownloader hadoop-yarn-nodemanager
Loaded plugins: fastestmirror, refresh-packagekit
Loading mirror speeds from cached hostfile
* base: ftp.nara.wide.ad.jp
* extras: ftp.nara.wide.ad.jp
* updates: ftp.nara.wide.ad.jp
hadoop-yarn-nodemanager-2.0.0+88-1.cdh4.0.0.p0.26.el6.x8 | 4.7 kB 00:00
[root@node2 ~]#
[root@node2 ~]# rpm -qlp hadoop-yarn-nodemanager-2.0.0+88-1.cdh4.0.0.p0.26.el6.x86_64.rpm
/etc/default/hadoop-yarn-nodemanager
/etc/rc.d/init.d/hadoop-yarn-nodemanager
[root@node2 ~]#

このように、インストールしなくても初期スクリプトが含まれていることがわかります。便利ですね。

5. パッケージインストール時に実行されるスクリプトを確認する

RPMパッケージをインストール/アンインストール時に、スクリプトを自動で実行させることができます。例えばパッケージをインストールしたときにユーザーを作成したり、必要なディレクトリを作成すれば、人の手を介さずに実行させることができるので便利です。その一方、パッケージのインストール時に何を行っているのか確認したい場合もあるでしょう。そんなときには rpm -q <パッケージ名> –scripts と指定してみましょう。

[root@node2 ~]# rpm -q hadoop-yarn –scripts
preinstall scriptlet (using /bin/sh):
getent group yarn >/dev/null || groupadd -r yarn
getent passwd yarn >/dev/null || /usr/sbin/useradd –comment “Hadoop Yarn” –shell /bin/bash -M -r -g yarn -G hadoop –home /var/lib/hadoop-yarn yarn
[root@node2 ~]#

preinstはインストールする前に実行されるスクリプト、postinstはインストール後に実行されるスクリプト
preuninstはアンインストール前に実行されるスクリプト、postuninstはアンインストール後に実行されるスクリプトです。
この例ではインストールする前に、yarnというグループとユーザーを作成し、ホームディレクトリを/var/lib/hadoop/yarn に設定しているようなことがわかりますね。

このようにRPMパッケージは意外に情報が含まれているので、インストールや削除以外の使い方を知っていると役立つかもしれません。これらHadoop使いのためのRPMの便利な使い方5つ[2]を活用してHadoopライフを満喫してください。 🙂

[1] RPM=RPM Package Mangerの略称。 昔は RedHat Package Mangerの略だった。
[2] 実はHadoopとは全く関係ないRPMの話だったことに気づきました?