OmniAICreator/Qiita-1.07M huggingface dataset:
windows 10 homeで Docker Desktop for windowsを使って開発環境をつくる


##Dockerとは

Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。by wikipedia
[公式ページ]https://docs.docker.com/get-started/overview/


##特徴

1. コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
1. 作成した環境を配布しやすい。
1. スクラップ＆ビルドが容易にできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557940/f391dd2f-b1fe-b2f6-4105-49df97a4298f.png)


https://knowledge.sakura.ad.jp/13265/

何となく、ホストOSの機能を利用して素早く仮想化できますよ。くらいの認識だった。。
チーム開発とかでは、便利なんだろうなあ、、?


##ドキュメントに従ってインストールする。

https://docs.docker.com/docker-for-windows/install/

windowsでdockerを使うためには、デスクトップアプリdocker for windows　が推奨されていた。

toolboxでインストールする方法と、デスクトップアプリをインストールするやり方の2種類があるみたいだ。

公式の説明では

`Legacy desktop solution. Docker Toolbox is for older Mac and Windows systems that do not meet the requirements of Docker for Mac and Docker for Windows. We recommend updating to the newer applications, if possible.
`
と書いてあり、Toolbox は　古いやり方?ですと書いてある。



`システム要件
Windows 10 Home マシンで Docker Desktop を実行するには、以下の要件が必要です。
Windows 10, version 2004 またはそれ以上のインストール
Windows 上で WSL2 機能の有効化。詳細な手順は マイクロソフトのドキュメント をご覧ください。
以下は、Windows 10 以上で Hyper-V クライアントを問題なく実行するために必要なハードウェア要件
64 ビット [SLAT Second Level Address Translation 対応プロセッサ
4GB システムメモリ
BIOS レベルでのハードウェア仮想化が、BIOS 設定で有効にする必要。詳細な情報は 仮想化 を参照
Linux カーネル更新パッケージ のダウンロードとインストール
`

windowsでdockerを動かす場合、3つの種類があるみたいだ。

https://www.atmarkit.co.jp/ait/articles/2011/20/news015.html

WSL2をインストール

Windowsに備わっている、WSL2(Windows Subsystem for Linux)を使う

Powershellをつかって、WSL2を有効にする。

[Microsoftドキュメント](https://docs.microsoft.com/en-us/windows/wsl/install-win10)

OSのeditionやbuildの要件もあるのでアップデートする必要もあるかもしれない。詳しくはマイクロソフトのドキュメント。

WSL2の設定途中で


```
wsl --set-default-version 2
```
powershellでWSL２をデフォルトバージョンとして設定するコマンドでエラーが発生。

おそらくVirtualBoxをインストールしていたのでそれが原因かと思われる。

https://daysput.com/blogs/environment/2020/0811.html#wsl2%E3%81%A8%E3%81%AF

こちらを参考にして解決

あとは、公式ドキュメントで簡単なアプリケーションを起動する練習

https://docs.docker.com/get-started/
Amazon Linux 2のオンプレ実行で悩んだこと(パスワード設定)

小ネタ。Amazon Linux 2 限定でなくcloud-initの話でした。

### Amazon Linux 2 のオンプレミスでの実行

公式

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-2-virtual-machine.html

Qiitaならこれ(VMware ESXi画面キャプチャつき)

https://qiita.com/daisuke0115/items/edd671ac8f61cedbd65b

### cloud-initでのパスワード設定

`user-data`ファイルにcloud-initとして設定する。AWSのドキュメントのサンプルには下記があるが、

```yaml
#cloud-config
#vim:syntax=yaml
users:
# A user by the name `ec2-user` is created in the image by default.
  - default
chpasswd:
  list: |
    ec2-user:plain_text_password
# In the above line, do not add any spaces after 'ec2-user:'.
```

[コメント除いたQiita記事](https://qiita.com/daisuke0115/items/edd671ac8f61cedbd65b)を見たのと、公式ドキュメントをちゃんと見なかったので、はいはい、ec2-userがkeyでパスワードをYAMLのvalueにするのだな、と勘違いし、ec2-userとパスワードの間にスペースを入れてしまった。

```diff
-    ec2-user: plain_text_password
+    ec2-user:plain_text_password
```

OSはちゃんと起動しているし、ホスト名は設定されているし、IPアドレスも設定されている。しばらくにらめっこし、これは`chpasswd`コマンドへの引数であり`ec2-user:plain_text_password`と`:`がデリミタで繋いでいるものということに気がつく。っていうかそれ**ちゃんとサンプルのコメントに書いてある**し。

とりあえずseed.isoで設定済みのパスワードの先頭にスペースを追加してログインはできた。

### まとめ

`In the above line, do not add any spaces after 'ec2-user:'.`って書いてある通り。なのでスペースを挟んじゃいけないし、この理由はchpasswdでパスワードを設定しているから。これは、他のcloud-initでchpasswdによりパスワード初期化するOSも同じ。
テンプレートマッチングを使って複数検出する[C++][OpenCV]

#はじめに
`cv::matchTemplate()`のサンプルコードとして

```C++:C++
cv::matchTemplate(search_img, tmp_img, result_img, cv::TM_CCOEFF_NORMED);
cv::Point max_pt;
double maxVal;
cv::minMaxLoc(result_img, NULL, &maxVal, NULL, &max_pt);
```
がありますが、`cv::minMaxLoc()`は最大値を求めるので1箇所しか検出することができません。
1つの画像から複数箇所を検出したい場合、Pythonでは`np.where()`などがありますが、C++にはないので自分で実装する必要があります。

Googleで[ opencv テンプレートマッチング 複数 c++ ]と検索すると
[OpenCV のテンプレートマッチを使って駒を検出](http://www.moonmile.net/blog/archives/2468
"OpenCV のテンプレートマッチを使って駒を検出")
[[OpenCV][C++]テンプレートマッチングを使って複数検出してみた]
(https://qiita.com/satsukiya/items/c8828f48be7673007007
"[OpenCV][C++]テンプレートマッチングを使って複数検出してみた")
これらの記事がよく見られていますが、自分で書いたコードが違う感じになったので
記事に残しておこうと思います。

#使用するデータ
[チュートリアル](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html
"チュートリアル")ではマリオが使われているのでそれに習って画像を用意しました
![Screenshot from 2021-07-12 09-29-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578702/054ba380-8f4e-02ef-79f5-412d30a5380e.png)

テンプレート画像
![Screenshot from 2021-07-12 09-29-10-coin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578702/91ffe439-107b-b73a-b703-7d063a96d305.png)


#サンプルコード
```C++:find_multi_template.cpp
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#define THRESHOLD 0.7
#define FIND_TARGET_NUM 30

int main(int argc, char** argv){
  //元画像と検出画像の追加
  cv::Mat src = cv::imread("../picture/src.png", 1);
  cv::Mat tmp = cv::imread("../picture/template.png", 1);

  //マッチング結果の画像と出力用画像の宣言
  cv::Mat result, dist;
  src.copyTo(dist);
  //テンプレートマッチングの実行
  cv::matchTemplate(src, tmp, result, cv::TM_CCOEFF_NORMED);

  //最大値を持つ画素の検索
  double val;
  cv::Point loc;
  cv::minMaxLoc(result,NULL,&val,NULL,&loc);

  for(int i=0;i<FIND_TARGET_NUM && fabs(val) > THRESHOLD; ++i){

    //検出部分のマスク
    cv::rectangle(result, cv::Point(loc.x-tmp.cols/2,loc.y-tmp.rows/2), cv::Point(loc.x+tmp.cols/2, loc.y+tmp.rows/2), cv::Scalar(0), -1);
    //出力用画像への描画
    cv::rectangle(dist, cv::Point(loc.x,loc.y), cv::Point(loc.x+tmp.cols, loc.y+tmp.rows), cv::Scalar(0,0,255), 2);
    //再度最大値を持つ画素の検索
    cv::minMaxLoc(result,NULL,&val,NULL,&loc);
  }

  //結果画像の出力
  cv::imwrite("../picture/output.png", dist);

  return 0;
}
```
#結果
出力画像は以下のようになります。
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578702/13bd79c5-4299-8962-4453-270aa77b19ce.png)

#まとめ
今回使用したコードは以下のリポジトリにおいておくのでご自由に使用してください
pictureディレクトリの画像を変更すれば汎用的に使用できます
[find_multi_template](https://github.com/Mouri-Yasuhiro/find_multi_template
"find_multi_template")
Herokuでデプロイ後の画面表示エラー

##　Herokuエラーのまとめ
ローカル環境では問題がなかったのに、
Herokuにデプロイ後にエラーになってしまった時の対応をまとめました。

### 1.実例)エラー画面
![スクリーンショット 2021-07-12 16.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1335471/93edb069-baa3-2354-c980-0acf7fc7a35b.png)

エラー文章は
`We're sorry, but something went wrong.`
`If you are the application owner check the logs for more information.`

###　2.とにかくエラーログを見ろ！
基本的に、エラー画面が出た時の対応はこちらです。

1.エラー画面が表示されたら作業ストップ
2.そのままターミナルへ移動
3.`% heroku logs`を実行
4.ログの下の行を見ていくと、エラーのHTTPステータスがある
5.HTTPのステータス番号をチェックする


過去に遭遇した私のエラーでのログはこちらです。


 ```bash
2021-07-11T13:41:37.358040+00:00 app[web.1]: [3026cb21-3b24-4b7d-bfe0-61607329c87e] app/controllers/users_controller.rb:4:in `show'
2021-07-11T13:41:37.364921+00:00 heroku[router]: at=info method=GET path="/users/15" host=zabuton-dayori.herokuapp.com request_id=3026cb21-3b24-4b7d-bfe0-61607329c87e fwd="133.106.152.132" dyno=web.1 connect=1ms service=82ms status=500 bytes=1827 protocol=https
```

状況は、ログインユーザーのマイページ(showアクション)へ遷移したいのに、
遷移できずにエラーになった。

確かにログでは
`app/controllers/users_controller.rb:4:in show`
があります！！

さらに下の行では`status=500 `の文字が！
※HTMLステータスの番号については、こちらのサイトがおすすめです。

https://www.itmanage.co.jp/column/http-www-request-response-statuscode/#:~:text=HTTP%20300%E7%95%AA%E5%8F%B0%20Redirection%EF%BC%88%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%89&text=%E3%80%8C301%20Moved%20Permanently%E3%80%8D%E3%81%AF301,%E3%83%9A%E3%83%BC%E3%82%B8%E7%A7%BB%E5%8B%95%E3%82%92%E3%81%97%E3%81%BE%E3%81%99%E3%80%82


### 3.HTTPステータス番号で理由を探る！
私が遭遇した500番のエラーは`何らかのサーバ内で起きたエラー。`
また、ログを見ていると

```bash
ActiveRecord::StatementInvalid (Mysql2::Error: Table 'heroku_5c5fbb7e936a5dc.memos' doesn't exist):
```

`Mysql2::Error`とありました。
サーバーに問題があるのは間違いなさそうです。
`memos`というのは、
このアプリのマイページで、メモ機能をつけるために私が作成したテーブルです。
`doesn't exist`ということは、
memoのDBが存在していない。

はて？？

ここで気づきました。
`herokuでmigrateしていない！`
つまり
`ローカル環境とDBの状態が違うままだ！`
そこでターミナルでherokuへのmigrateを実行します。

```bash
heroku run rails db:migrate
```

その後、確認をするとローカル環境と同じように表示されました！
Herokuのエラーが出ると、なかなか特定するのに大変そうと思われますが、
こうやってログを確認していけば、ローカル環境の時と同様にエラー原因を見つけることができます。
Instagram投稿表示のためのアクセストークンを無期限で取得したはずが切れる原因

#はじめに
Facebookの投稿やinstagramの投稿をwebサイトで表示させるために、有効期限無制限のアクセストークンを取得しGraph APIを使用して表示させていたが、「有効期限無制限」というわりにたびたび表示されないことがあった。
アクセストークンを入れ替えるなどして対応していたが、あまりに手間がかかりすぎる。

[Instagram投稿表示に必要な無期限アクセストークンの取得方法はこちら。](https://qiita.com/ari-chel/items/1bb8c0135dd7ec33d261)

#原因
暫定的な原因だが下記。
>アプリの非アクティブ化
期限までにDUCを完了できなかった場合、APIは、DUCが完了するまでアプリによって行われたすべてのクエリを拒否します。

[https://developers.facebook.com/docs/development/maintaining-data-access/data-use-checkup?locale=ja_JP
](https://developers.facebook.com/docs/development/maintaining-data-access/data-use-checkup?locale=ja_JP
)
グラフAPI v8.0(2020年8月4日(火))で発表したアクセスレベルモデルに、v10.0(2021年2月23日)からはpublic_profile (デフォルト公開プロフィールフィールド)アクセス許可とemailアクセス許可が追加された。
このプロセスでは、開発者はFacebookプラットフォームAPI経由で自分たちがアクセスするデータのタイプをレビューし、データの利用方法がFacebookの規約とポリシーに準拠していることを期間内に確認する必要がある。

期限が過ぎると、期限の翌月の1か月間にわたってAPI呼び出しがスロットリングされ、プラットフォームアクセスの取り消しが開始される。

アプリごとにデータの使用状況の確認を行い、非アクティブとなったアプリをアクティブに戻す(非アクティブとならないように確認を行う)必要がある。
なお、期限の60日、3​​0日、10日、3日前にアラートが届くようになっている。

#手順
- [https://developers.facebook.com/](https://developers.facebook.com/)にアクセス。
- ログイン
- 「マイアプリ」を選択
![FireShot Capture 014 - Facebook for Developers - developers.facebook.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543077/820f0476-3d48-b35b-4744-b679461c3213.png)

- データの使用状況の確認をクリック 
  - アラートなし　→ 期限は先
  - 緑色　→ 確認済み
  - 黄色　→ 確認必要期間(失効まで60日)
  - 赤色　→ 期限超過

![FireShot-Capture-012---(21)-すべてのアプリ---Facebook-for-Developers---developers.facebook.com_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543077/db757a7d-12c7-a752-4218-25a0f5821eec.jpeg)

- 各権限、機能、または製品の説明を読み、チェックボックスをオン
- [続行]をクリック
- チェックボックスをオンにして、プラットフォーム規約と開発者ポリシーに準拠していることを証明し、[続行]をクリック
- [送信]をクリックして、チェックを完了
![スクリーンショット 2021-07-12 14.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543077/0dc87bdc-ec5e-2159-ac2f-4057b978f7bb.png)


#注意
期限から1か月を過ぎるとプラットフォームアクセスは完全に取り消されるため注意が必要。
完全に取り消されたアクセスは、アプリレビューを申請する必要がある。

#あとがき
年ごととの記載があるが、体感ではもっと頻繁に切れていた印象がある。もしかしたら別の原因があるのかもしれない。
期限にさえ気をつけていればトークンの入れ替えをしなくても済むため手間がグッと減った。

#参考
https://developers.facebook.com/blog/post/2020/07/01/platform-terms-developer-policies/?locale=ja_JP
https://developers.facebook.com/docs/development/maintaining-data-access/data-use-checkup?locale=ja_JP
PHP usortユーザ定義ソートを使ってみる

Every Qiita #10
のんびり独学初学者の毎日投稿チャレンジ 10日目
今回は・・・
前回記事でご教示頂いたソートに関しての備忘録です。
[@tadsan](https://qiita.com/tadsan)さんありがとうございました！

###前回の多重連想配列構造

```php
$arrs = [
    ["fruit" => "apple" ,"num" => 1 ],
    ["fruit" => "banana" ,"num" => 3 ],
    ["fruit" => "melon" ,"num" => 5 ],
    ["fruit" => "orange" ,"num" => 4 ],
    ["fruit" => "peach" ,"num" => 2 ],
];
```
こちらをnumを基準として昇順でソートするのが目標になります。

####前回の実装の流れ
1. asortを使って昇順ソートする
1. asortを多重配列で使う場合は、配列の最初の値が比較対象になる。
 1. fruitが対象なのでローマ字昇順になってしまう
1. numを配列の最初に配置する
1. 再びasortで並び替える

下記ソースコード

```php
//numとfruitの入れ替え
$replace_arrs=[];
foreach ($arrs as $key => $value) {
    $replace_arrs[] = array_reverse($arrs[$key]);
}
//numを基準に昇順ソート
asort($replace_arrs);

foreach ($replace_arrs as $value) {
    echo $value["num"].$value["fruit"]."<br>";
}
```
*上記でもnumで昇順ソートできておりますが、配列構造が変わっているので最適解ではありませんでした・・・*

###ご教示頂いた実装の流れ
1. usortを使ってユーザ定義でソートする
1. 第二引数でnumを指定し昇順ソート
  
下記ソースコード

```php
usort($arrs, fn($a, $b) => $a['num'] <=> $b['num']);
```
**これだけで構造を変えずにスマートにソートできるみたいです。すごい・・・**

####解読
- `usort`：第一引数を配列、第二引数を比較関数で渡す。（比較関数の返り値は-1,0,1のいずれかである必要があります。）
  配列の全てのパターンを比較し、-1であれば随時入れ替えるみたいです。条件は任意で決めることができます。
- ` fn($a, $b) => $a['num'] <=> $b['num']`:アロー関数を使い、[`宇宙船演算子`](https://www.php.net/manual/ja/language.operators.comparison.php#:~:text=%E5%AE%87%E5%AE%99%E8%88%B9%E6%BC%94%E7%AE%97%E5%AD%90)でnumの値を比較処理しています。
上記は下記のコードと同等です。

```php5
// アロー関数で下記を簡略可
// 引数にはusort第一引数の配列が自動で全通り入ります
function fn($a, $b){
// 宇宙船演算子で下記を簡略可
  if($a['num'] == $b['num']{
    return 0;
  }
  return ($a['num'] < $b['num']) ? 1 : -1;
}
```
phpのビルトイン関数は常に進化し続けていることを実感しました・・・
  ロジックを考えるのってやっぱり楽しいですし奥が深いです:smile:
ご教示頂いた皆様ありがとうございました！！
【CentOS7】MariaDBアンインストール時、削除されたpostfixを再インストールする【MySQL】

この記事では、CentOS7環境でMariaDBアンインストール時、一緒に削除したpostfixを再インストールする手順をメモ的にまとめています。

#postfixを再インストールできない
AWSでウェブサーバー構築時（環境はCentOS7）、MySQLを使うためにMariaDBを削除した際、依存関係にあるpostfixも削除していました。
構築したウェブサーバー内でメール送信処理も実装しようとして、postfixをインストールしようとして下記コマンドを実行。

```
# yum install postfix
```

するとエラーでインストールできず。

```
エラー: パッケージ: 2:postfix-2.10.1-9.el7.x86_64 (base)
             要求: libmysqlclient.so.18(libmysqlclient_18)(64bit)
エラー: パッケージ: 2:postfix-2.10.1-9.el7.x86_64 (base)
             要求: libmysqlclient.so.18()(64bit)
```
「libmysqlclient.so.18」がないとのこと。
いろいろ検索して、似たようなエラー対処がヒット。
[Linux maria dbをアンインストール時に消されてしまったpostfixの再インストールができない](https://teratail.com/questions/228262)

#postfix再インストール手順
上記記事の回答内容を参考にしてpostfixの再インストールができたので、手順をまとめておきます。
まずはインストールされているrpmパッケージを一覧表示するコマンドを使って、インストールしている「mysql-community-」を確認します

```
# rpm -qa
```

「mysql-community-」と付くパッケージを確認し、アンインストールします。

```
# rpm -evh {パッケージ名}
```

次にCentOS7で使えるMySQL Communityのyumリポジトリをダウンロードします。

```
# yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
```

`https://dev.mysql.com/get/`以降は、公式サイト[MySQL Community Downloads](https://dev.mysql.com/downloads/repo/yum/)で対象のリポジトリを探し、()内の名前（語尾が.rpm）を指定すればOK。
その後、mysql-community-clientをインストール。

```
# yum install mysql-community-client
```

その他依存関連もインストールされたことを確認

```
インストール:
  mysql-community-client.x86_64 0:8.0.25-1.el7                                                                                                          

依存性関連をインストールしました:
  mysql-community-client-plugins.x86_64 0:8.0.25-1.el7    mysql-community-common.x86_64 0:8.0.25-1.el7    mysql-community-libs.x86_64 0:8.0.25-1.el7
```

postfixインストール

```
# yum install postfix
```

インストールされているか確認する。

```
# yum list installed | grep postfix
```

postfixが表示されたらインストールが完了です。

#postfixの依存関係に注意
CentOS7は初期設定でMariaDBが入っていますが、MySQLを使うためにはMariaDBを削除する必要があります。
postfixはMariaDBに依存しているので、MariaDBを削除する際postfixも消えてしまっていました。
いろいろ調べて解決できましたが、依存関係には注意したいところです。
M1 Macでのlibtorch、HDF5、Boostその他のintel版をインストール

機械学習ライブラリのPyTorchはそのC++版のlibtorchがあります。M1 Macにおいて、このlibtorchを使って自分のコードをcmakeでコンパイルするのにハマりましたので、解決策を書いておきます。
libtorchは2021年7月12日現在intel版(x86_64)しかありませんので、Rosetta 2で動かすことになります。しかし、libtorchと同時にBoostやHDF5などのライブラリを同時に使いたい場合、こちらはarm版が入っているので、コンパイルのリンクの時にエラーがでてよくわからない状態になります。混ぜた場合のコンパイルの方法はあるのかもしれませんが、ここでは全部Rosetta 2で動かすという解決策を提示します。

# 問題
MacのbrewでHDF5やBoostを入れようとするとarm64版が入ってしまいます。これに困りました。

# 解決策
intel版のbrewを別の場所にインストールし、arm64版と共存させます。[こちら](https://stackoverflow.com/questions/67386941/using-x86-libraries-and-openmp-on-macos-arm64-architecture)を参考にしました。

以下の手順で入れるとbrewのx86_64版が入ります。Rosetta 2は先に入れておいてください。

```zsh
# まず、x86_64でzshを起動します。
arch -x86_64 zsh  
# x86_64版のbrewを入れます。
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
ここで入れたbrewは

```zsh
/usr/local/bin/brew
```
に入っておりまして、arm64版は

```zsh
/opt/homebrew/bin/brew
```
に入っていますから、共存ができています。

HDF5やBoostのintel版のパッケージを入れたい場合には、

```zsh
arch -x86_64 /usr/local/bin/brew install hdf5
arch -x86_64 /usr/local/bin/brew install boost
```
とすればOKです。gccやclangなどもこの方法でならx86_64版を入れることが可能です。
ラビットチャレンジ 応用数学 レポート

(1)線形代数

スカラーは、一般的な数で、四則演算などの演算ができる、大きさだけを持つもの。

ベクトルは、大きさと向きを持ち、(向きを強調して矢印などで表されることもある)スカラーを複数並べたものである。スカラーを係数に持てる。

行列は、ベクトルを並べたもの(スカラーを縦横に並べたもの)であり、縦向きの成分は列、横向きの成分は行という。

単位行列は対角成分が一、その他が零の正方行列で、ある行列Aの左右どちらから掛けても積がAとなる。

逆行列は、ある行列Aの左右どちらから掛けても積が単位行列になる正方行列で、このようなAを正則行列といい、行列式が0ではない。逆行列は正則行列に対して一意に定まる。

行列式は、ある行列に対して一意に定まるスカラーであり、サラスの方法や余因子展開などによって求められる。

固有値は、ある正方行列とあるベクトルの積があるスカラー(これが固有値)と同じベクトルとの積と一致するようなあるスカラーのことで、ここであるベクトルは零ベクトルではない。ある正方行列から固有値と単位行列を引いたものの行列式が零であることから、求められる。

固有値分解は、ある正方行列を、固有ベクトルを並べた行列(V)、固有値をVと同じ順に対角成分として並べた(他は零)行列、Vの逆行列の積として表すことであり、累乗の計算が簡単になるなどの利点がある。

特異値分解は、正方行列いがいの行列に対して固有値分解にあたる操作をするものである。
ここで、特異値を並べた行列の左右に掛かる行列は直交行列である。

(2)確率

客観確率は、ある事象が発生する頻度を表す。
籤の確率などはふつう客観確率で表される。

主観確率は、ベイズ確率とも言う。ある事柄についての信念の度合いを表すもので、病理診断などがこれにあたる。

条件付き確率は、ある事象の前提条件のもとでの別の事象の確率のことであり、AのもとでのBの条件付き確率はAとBの同時確率をAの確率で割った商である。

二つの事象が独立である場合、その同時確率は互いの確率の積で表される。

ベイズの定理は、BのもとでのAの条件付き確率がAの確率とAのもとでのBの条件付き確率の積をBの確率で割った商で表されるというものである。

確率変数は、事象そのもの、またはそれを示す数値のことである。

確率分布は、ある事象についての確率の分布であり、連続値であれば平面上の線で、離散値であれば表で表せる。

期待値は、ある事象についての確率変数の平均値であり、連続値であれば確率変数と確率密度変数の積の定積分で、離散値であれば確率変数と確率密度変数の和で表される。

分散は、事象(データ点)のバラつきを表すもので、確率変数の2乗の期待値から確率変数の期待値の2乗を引いた差で計算される。

共分散は、ある2つの事象の間の分布の近さを表すもので、二つの事象の積の期待値から二つの事象の期待値の積を引いた差で表される。

ベルヌーイ分布は、2値のどちらかをとる事象の分布で、コイントスが代表例である。

マルチヌーイ分布は、3値以上のどれかをとる事象の分布で、サイコロの出目などが代表例である。

2項分布は、ベルヌーイ分布をn回繰り返したときの分布である。

ガウス分布は、正規分布とも言い、グラフが釣鐘型または山型になる分布である。

(3)情報理論

自己情報量は、前後のエントロピーの差でも表され、底が2の対数で表されるとき、単位にビットを用いる。また、単位が自然対数の底であるときに、単位にはナットを用いる。I(x)と書き、確率の逆数の対数で求められる。

シャノンエントロピーは、自己情報量の期待値でH(x)と書き、確率と確率の逆数の対数の積の和にマイナス一を掛けて求められる。

カルバックライブラーダイバージェンスは、よくKLダイバージェンスと表記され、ひとつの同じ事象について、異なる確率分布の違いを表すもので、二つの確率分布におけるある事象の確率の対数の差の期待値で定義される。

交差エントロピーは、KLダイバージェンスの一部分と捉えることができ、H(M,N)と表記されるときはMの自己情報量とMとNのKLダイバージェンスの和で計算され、Nに関する自己情報量をMの分布で平均する事と同値である。
Elasticsearchのコアを理解しましょう

# Elasticsearchのコア

- インデックス

初心者の場合にはただデータベースだと思えばよい。データ保存してる場所です。たくさんドキュメントの集まり

- マッピング
  - 例えば：name→string,birth→date,id→int

- ドキュメント
  - 検索の最小単位
  - Key:valueで構成される
  - Jsonオブジェクト

- シャード
  - 二種類がある、プライマリーシャードとインデックス
  - ディフォルトでプライマリーシャード5個とレプリカシャードを1で作ることになってます。
  ![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/c171102e-2084-914e-82e8-82a628c3c48a.png)  
  - 実際にデータ保存の場所
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/bdea7c3f-2cbe-0b37-5adc-2a20bae9087b.png)
↑この構成だと、たとえノード3が死んでも、何の影響もない
  -  Inverted Index
  
  例えば: 以下のようなデータが保存されてます。

   > 1. The quick brown fox jumped over the lazy dog
   > 2. Quick brown foxes leap over lazy dogs in summer

　保存の場所は以下通り

　![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/3798c88e-5541-3940-88bf-44e75b7bd565.png)
　
　　この時に「quick brown」を検索したい時どのDocを見ればよいでしょう。

　![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/0fe66915-b40e-fe75-a94a-13ed7fbc7ae5.png)

　　そうすると、検索の際にDoc1だけ見ればよいわけだ。

https://www.elastic.co/guide/en/elasticsearch/guide/current/inverted-index.html
アメリカ化学会(ACS)の論文テンプレートAchemsoの使用メモ

# 初めに

アメリカ化学会に論文を投稿する際のLatexテンプレートとして、[achemso style package](https://pubs.acs.org/page/4authors/submission/tex.html)というものがあります。
[Overleaf](https://www.overleaf.com/)にも標準で入っています。少しLaTeXに慣れるとMSWordで書くよりも全然快適だと思います。
これの書き方のメモです。

# 本文
## Document Classの指定
テンプレートを開くと、一番初めに下記のような記述があるはずです。

```tex
\documentclass[journal=jacsat,manuscript=article]{achemso}
```

journalのところは、投稿したいジャーナル名に合わせる必要があります（どうもジャーナルによって微妙にルールが異なるらしいです）。
このジャーナル名の文字列は、投稿先のジャーナルのurlを確認すれば良いです。
例えば、この画像のようにACS Catalysisに投稿したい場合は、urlの`pubs.acs.org/journal/`以下が`accacs`なので、これを指定すればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24675/52228e08-4884-f691-f9c0-aa58febc4c8c.png)

`manuscript=`のところは、`article`, `note`, `communication`, `review`,`letter`, `perspective`から選べばOK

## Authorの指定
`maketitle`は不要です。

## 化学式の挿入

usepackageとして、下記のような宣言がテンプレートに書かれていると思います。
`\usepackage[version=3]{mhchem}`

文中で化学式を挿入するときは、
`\ce{HSO3^{-}}`のように書けば、自然に HSO<sub>3</sub><sup>-</sup>のように表示してくれるはずです。つまり、普通に数字を入れれば下付文字に、イオン価数などのように上付にしたいものだけ`^{}`で入れれば良いです。
`[]`で括ることもできます。

## 図など
図としては、`figure`意外にも、`scheme`として入れることもあります。下記のように入れればOK.

```tex
\begin{figure}
    \centering
    \includegraphics{figures/structure.pdf}
    \caption{The structure of the molecule A.}
    \label{fig:structure}
\end{figure}

\begin{scheme}
    \centering
    \includegraphics{figures/react_mechanism.pdf}
    \caption{The reaction mechanism of the molecule A.}
    \label{fig:react_mechanism}
\end{scheme}
```

# Supporting Information

冒頭の`documentclass`の指定のオプションに`suppinfo`を指定すればOKです。
表紙のタイトルの上にSupporing Information: と表示されるようになります。
また、Figureなどの番号が、Figure S1, Table S2... と行ったように番号の前にSが付加されるようになります。

```tex
\documentclass[journal=jacsat,manuscript=suppinfo]{achemso}
```

もし他のジャーナルに投稿するときなどに使う場合、ラベルを変える必要がある場合(例えば、RSC系列はFig 1, Fig2...と振られる)は、下記のような記述を書いておけばOKです。

```tex
\renewcommand{\figurename}{Fig.~}
```

## SIの目次など

SIが長い際は目次を入れたほうが良いかと思います。(`\tableofcontents`)
セクションのタイトルの前に番号を入れたいときは、`\begin{document}`の前に`\SectionNumbersOn`を入れる。

```tex
\SectionNumbersOn # セクション名の前に番号を入れる。
\begin{document}
\tableofcontents  # 目次をタイトルページの次に入れる。
%省略
```

# 投稿するとき

投稿時は出力したpdf原稿だけでなく、本文のLatexソース一式をzipにして提出することが求められていますのでお忘れなく。
Visual Studio Codeのvsixファイルをダウンロードする

インターネットに接続できない環境で作業したいとき、オフライン環境で環境構築できるようにvsixファイルを集めてくる必要がある。インターネットに接続できている環境があれば、`code --list-extensions --show-versions`で必要な情報を表示して、`awk`で組み立てれば、ダウンロードできるURLを得られる。

```bash
code --list-extensions --show-versions | awk -F'[\.@]' '{print "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/"$1"/vsextensions/"$2"/"$3"."$4"."$5"/vspackage"}'
```

ライセンスを確認するときはこちら

```bash
code --list-extensions --show-versions | awk -F'[\.@]' '{print "https://marketplace.visualstudio.com/items/"$1"."$2"/license"}'
```
Ruby on rails データベース操作の最低限知るべきコマンド

⚫︎データベース操作作成

```
#Model作成
$ rails g model <model名> カラム名:型　　

#Modelと対応するmigrationファイル作成
$ rails g migration <migration名> カラム名:型

#データベース作成
$ rails db:create

##データベース削除
$ rails db:drop

#migration データベースへの反映
$ rails db:migrate

#migration データベースを元に戻す
$ rails db:rollback

#初期でデータ投入
$ rails db:seed

#データベースのリセット
$ rails db:reset    *基本は使わないのがおすすめ

#データベースリセット
$ rails db:migrate:reset *ゼロからmigrationファイルを実行してDBを再作成するコマンド

```
【JavaScript】問題！何が返るでしょうか？

# はじめに
こんにちは。暑い日が続きますね。こんな暑い日でもホットコーヒーを淹れ、冷まして飲みます、筆者です :coffee:  

さて、MDNの**JavaScript**のリファレンスを読んでいて、**おっと？:thinking:**と思わずつぶやていてしまったコードを見つけましたので、クイズにしてみました(笑)

これで夏の暑さが少し和らぐことを願っております :pray:

# 問題！何が返るでしょうか？

```js:quiz.js
const main = (n) => {
 return 
   n
}

console.log(main(1))
```

# 正解

```js
> undefined
```

# 理由
**自動セミコロン挿入**のセクションに記載の通り、以下のように評価されるため、`undefined`が返却されている次第です。

```js
return
a + b

// ↓

return;
a + b;
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Lexical_grammar#automatic_semicolon_insertion

# おわりに
そりゃそうかと思いつつ、ちょっと理解が深まりました :bow: 

暑い日が続きますが、水分は十分にとってくださいませ :pray:

それでは！
AtCoderログ：0015 - ABC 209 B

# 問題：[ABC 209 B - Can you buy them all?](https://atcoder.jp/contests/abc209/tasks/abc209_b)

## 問題文
> 高橋商店では $N$ 個の商品が売られています。$i~(1 \le i \le N)$ 番目の商品の定価は $A_i$ 円です。
> 今日はセールが行われており、偶数番目の商品は定価の $1$ 円引きの値段で買うことができます。奇数番目の商品は定価で売られています。
> あなたの所持金は $X$ 円です。これら $N$ 個の商品を全て買うことができますか？

## 制約
> ・$1 \le N \le 100$
> ・$1 \le X \le 10000$
> ・$1 \le A_i \le 100$
> ・入力は全て整数

# 回答1 (AC)

処理の流れは、各商品の定価を配列 a() で受け取り、値引き後の n 個の売価の合計 sum を算出し、所持金 X がそれより大きければ Yes, そうでなければ No を出力する、となります。コードの添え字は 0 から始まっているので、コードでは奇数番目の商品を値引きすることに注意が必要です。以下のコードでACとなりました。[提出コード](https://atcoder.jp/contests/abc209/submissions/24119592)も同じ方針でした。

```C++:abc209b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n, x;
  cin >> n >> x;
 
  vector<int> a(n);
  for ( int i=0; i<n; i++ ) {
    cin >> a.at(i);
  }

  int sum = 0;
  for ( int i=0; i<n; i++ ) {
    if ( i%2==1 ) {
      a.at(i) -= 1;
    }
    sum += a.at(i);
  }

  if ( x>=sum ) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
}
```

# 回答2 (AC)

回答1を改良します。この問題では売価の合計がわかれば良いので、各商品の売価を保存する必要がなく、配列 a は不要です。また、割引額の合計は、0 から n-1 までの奇数の個数なので、割引額の合計は n/2 円となり、まとめて割り引くことができます。以上の考察をコードに適用すると以下のようになり、ちょっとだけシンプルになりました。

```C++:abc209b-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n, x;
  cin >> n >> x;
 
  int a, sum = 0;
  for ( int i=0; i<n; i++ ) {
    cin >> a;
    sum += a;
  }
  sum -= n/2;
 
  if ( x>=sum ) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc209/tasks/abc209_b/editorial) → [公式解説](https://atcoder.jp/contests/abc209/editorial/2226)
回答1と同じ方針でした。max(0,b-a+1) とすると場合分けが不要になるとのこと。なるほど。

# リンク
- 前の記事 → [AtCoderログ：0014 - ABC 209 A](https://qiita.com/RoadLynton/items/ad080d4b17ce17424c29)
- 次の記事 → [AtCoderログ：0016 - ABC 209 C](https://qiita.com/RoadLynton/items/2463043b53f5ac24e044)
【AtCoder】ABC209をPython3で解説

ABC209の解説。

https://atcoder.jp/contests/abc209

## A - Counting
### 解説
$A$以上かつ$B$以下の整数はいくつあるか。

そもそも$A$が$B$よりも大きかったら、満たされる数がないので$0$を出力。

$A$以上かつ$B$以下なら、整数の個数は、$B$から$A$を引いて$1$を引いた数。

### コード
```python
a, b = map(int, input().split())

if a > b:
    print(0)
else:
    print(b-a+1)
```

## B - Can you buy them all?
### 解説
所持金$X$円で、$N$個の商品を買うことができるか。なお、$A_i$で$i$が偶数のときは、1円引きで商品が買えるものとする。

偶数のときに1円引きされるので、$N$個の商品の合計金額から、偶数の数ぶん1円引いてやれば良い。

### コード
```python
n, x = map(int, input().split())

alist = list(map(int, input().split()))

if sum(alist) - n // 2 <= x:
    print('Yes')
else:
    print('No')
```

## C - Not Equal
### 解説
条件を満たす長さ$N$の整数列$A$の個数を求める。条件は、

条件1$1： \leq A_i \leq C_i$→整数$A_i$は1以上$C_i$以下

条件2：$A_i \neq A_j$→整数列Aのなかに同じ数字を含んではならない

入力例1でみていく。```1 3```の入力でこの条件を満たすようにするにはどうすればよいか。まず、条件1だが、```1```の選択肢は、```1```のみ。```3```の選択肢は、```1, 2, 3```となる。条件2を見ると、$A_i$が同じ数になってはいけないことがわかる。つまり、```1, 2, 3```のうち```1```は棄却される。

つまり、答えの整数列は```(1, 2)```と```(1, 3)```の2とおりとなる。

入力例2でみていく。```3 3 4 4```の入力だ。まず、条件1だが、```3```の選択肢は、```1, 2, 3```、```4```の選択肢は、```1, 2, 3, 4```となる。条件2を見ると、同じ数になってはいけないので、```1, 2, 3```のうち1つを選ぶと、次の```3```では、選択肢が1つなくなる。同様に```4```でも選択肢が1つなくなり、結果できる整数列の個数は、$(3-0) \times (3-1) \times (4-2) \times (4-3)$となる。

つまり、```sort```した整数列をインデックス番号を引きながら、乗算していくと答えを導き出せるということがわかる。

なお、そのまま計算するとオーバーフローしてしまう恐れがあるので、適宜$MOD = 10^9 + 7$ で割った余りを出す必要がある。

これの説明についてはこちら。
→https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a

### コード
```python
n = int(input())
clist = list(map(int, input().split()))
MOD = (10**9 + 7)

clist.sort()

ans = 1

for i in range(n):
    ans = ans * (clist[i] - i) % MOD
    
print(ans)
```

## 編集後記

灰灰灰のコンテスト多くないか...?
microk8sにminioをインストールする

#microk8sのインストール
```
$ sudo snap install microk8s --classic
```

#コマンド権限の設定
```$ sudo usermod -a -G microk8s $USER
```

#キャッシュディレクトリにアクセスできるようにする
```
$ sudo chown -f -R $USER ~/.kube
```

#aliasの登録(kubectlのプラグインが動かなく可能性があるので今回はシェルスクリプトを作った)
```
echo alias kubectl="'microk8s kubectl'" >> $HOME/.bashrc
sudo su - $USER
```
#動作確認
```
kubectl get node
```
きちんと認識している
![スクリーンショット 2021-07-12 9.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690609/e872aa82-ec83-a2df-147b-269c5fa6259f.png)

microk8sの導入が完了したらminioをインストールする

#プラグインのインストール
今回はkrewをインストールする

```
(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" &&
  tar zxvf krew.tar.gz &&
  KREW=./krew-"${OS}_${ARCH}" &&
  "$KREW" install krew
)

export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
```

#minioのインストール
警告がでるが無視

```
   kubectl krew update
   kubectl krew install minio
```

#Operatorの初期化
```
kubectl minio init
```

#新規テナントの作成
テナントを作成
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3639303630392f32376535313765382d373635382d633330302d643339642d6538316261326666616634322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690609/01c1bf42-598d-03de-82e3-7ddf6210b309.png)


PodとServiceが作成された
![スクリーンショット 2021-07-12 12.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690609/f4176273-b144-a031-6799-e6ea84d7217e.png)




#おまけ
PATHの設定中にすべてのコマンドを受け付けなくなってしまった

```
$ export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin":$PATH
```
このコマンドを打つことで解決
[Unity] 別のオブジェクトのスクリプトを参照する方法

他のゲームオブジェクトのスクリプトを参照するコードです。

######構文
        weapon = GameObject.Find(ゲームオブジェクト名(文字列));
        weaponScript = weapon.GetComponent<スクリプト名>();


```cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveControl : MonoBehaviour
{

    //武器
    private GameObject weapon;       //ゲームオブジェクト
    private Weapon weaponScript;    //スクリプト　型はスクリプト名

    void Start()
    {             
        weapon = GameObject.Find("Weapon");
        weaponScript = weapon.GetComponent<Weapon>();   //武器
    }

    void Update()
    {
      
    }

}

```
IBM Security Verify API ユーザー検索(/v2.0/Users)利用上の注意点について

# はじめに
トライアル環境のユーザー数上限は10,000ユーザーとなります。
この範囲内でユーザー登録を行い、/v2.0/Usersによるユーザー検索を試してみました。

- testuser0001～testuser9989まで登録。合計9992ユーザーがいるディレクトリを準備
- カスタム属性deptcodeを作成
- deptcodeに任意の英字4桁＋任意の数字3桁のデータを登録

例)
![userapi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/eb3448d6-0383-c070-ef49-9351bcde1c3b.png)

# 1.検索結果の最大値について

testuserというキーワードで検索します。

![userapi (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/c50b78bc-8fc5-9d6e-74ca-d5113b4e2326.png)

検索結果としては、2500件が返ってきています。

![userapi (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/0a91eed2-3509-0b0e-3534-91cdbe479688.png)

この2500件という値は、get /v2.0/Users APIで一度に取得できるユーザー数の上限値となります。
ユーザー情報の検索の際には、2500件という上限値を意識しておく必要があります。


# 2.カスタム属性の検索について

今回は以下のユーザーを利用して検索を試します。

|項目  |属性名  |設定値値  |
|---|---|---|
|ユーザー名  |username |testuser2000|
|カスタム属性  |deptcode|QQVB817|

##2.1. 管理コンソールでユーザー名を検索する

管理画面でtestuser2000を検索すると、fulltextという全文索引を利用したリクエストが行われます。

`````
リクエストURL：
GET https://<テナント名>.verify.ibm.com/v2.0/Users?count=200&sortBy=urn:ietf:params:scim:schemas:extension:ibm:2.0:User:lastLogin&sortOrder=descending&startIndex=1&fullText=testuser2000
`````

testuser2000の結果が戻ってきます。
![userapi (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/0ba97ac5-67d7-ebb8-8877-9d6c83ebceb9.png)

##2.2. 管理コンソールでカスタム属性を検索する

次に、管理画面でカスタム属性に設定した値を検索します。
fulltextオプションでの検索は、カスタム属性は対象外になるため、検索に該当するものはないという結果が表示されます。

![userapi (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/008cda15-75a6-907e-724e-87261e5d185a.png)

##2.3. APIでカスタム属性を検索する
APIでカスタム属性（deptcode) が"QQVB817"に該当するレコードを検索するためには、filterオプションを利用して検索できます。
先頭大文字のFilterではフィルタされないため小文字filterの利用が必要です。


```
リクエストURL例（一部割愛）
GET https://<テナント名>.verify.ibm.com/v2.0/Users?filter=urn:ietf:params:scim:schemas:extension:ibm:2.0:User:customAttributes.deptcode eq "QQVB817"
```

PostmanでAPIを実行すると、検索結果が戻ってきます。

![userapi (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/6aa66285-da40-d972-4ffd-55ec672faa1a.png)

# 最後に

今回はユーザー検索の注意点についてご紹介しました。
APIを利用した検索の際には以下の点をご注意頂ければと思います。

- get /v2.0/users APIによる**検索結果の上限値は 2500件**となる
- **fulltextオプションはカスタム属性が対象外**となる
- **カスタム属性はfilterオプションで検索**できる(filterはすべて小文字)
[Unity] 子のオブジェクトのCollisionを取得する方法

画像な位置にコリジョンがありそのオブジェクトがプレイヤーの子のオブジェクトだった場合の子のオブジェクトのCollisionの取得方法です。

#####説明
子のスクリプトで親のスクリプト取得してそこに関数の引数にCollision,collider を入れて親オブジェクトの関数が参照されるという仕組みです。





![スクリーンショット 2021-07-12 102520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521308/2c750cfa-e605-6988-72bb-41ef21fb4e63.png)
![スクリーンショット 2021-07-12 122921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521308/5b194020-7106-b422-844f-2d6cf0f8182c.png)


子のオブジェクト

```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AttackCol : MonoBehaviour
{

    GameObject moveControl;
    MoveControl moveControlScript;

    // Use this for initialization
    void Start()
    {       
        moveControl = transform.parent.gameObject;
        moveControlScript = moveControl.GetComponent<MoveControl>();
    }

    void Update()
    {
        
    }

    //親のmoveControlスクリプトで判定
    private void OnTriggerStay(Collider other)
    {
        //Debug.Log("Attack col");
        moveControlScript.AttackStay(other);
    }

    //親のmoveControlスクリプトで判定
    private void OnTriggerExit(Collider other)
    {
        //Debug.Log("Attack col");
        moveControlScript.AttackExit(other);
    }
}
```

親オブジェクト

```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveControl : MonoBehaviour
{
    private bool isAttack;

    void Start()
    {     
        isAttack = false;    
    }

    void Update()
    {
      
    }

    //子のTriggerStay
    public void AttackStay(Collider other)
    {
      //ここに処理を書く
    }

    //子のTriggerExit
    public void AttackExit(Collider other)
    {
      //ここに処理を書く
    }
}

```
Clone all repositories in your github organization with php

* source

```php
	$gat = getenv('GITHUB_ACCESS_TOKEN');
	$go = getenv('GITHUB_ORGANIZATION');
	$p = 1;
	do {
		$o = `curl -H "Authorization: token $gat" https://api.github.com/orgs/$go/repos?page=$p`;
		$arr = json_decode($o);
		foreach($arr as $k => $v) {
			$sshurl = $v->ssh_url;
			print($sshurl."\n");
			`cd ~/src; git clone $sshurl`;
		}
		$p++;
	} while (count($arr));
	echo "done";
```
初学者がrailsで作ったウェブサイトをherokuでデプロイしたときに出たエラー「The page you were looking for doesn't exist.」

herokuでウェブサイトを公開しようとしたときにでたエラーの話です。


デプロイまでの手順はhttps://qiita.com/misakigumi/items/68d3557c67739c552ef5
こちらの記事を参考にしました！

デプロイまでの手順も色々とエラーが起きましたが、
設定箇所
1. Gemfile
2. config/database.yml
3. config/environments/production.rb
この３つをしっかり確認して、エラーコードをみて修正するとなんとかうまくいきました。

そして

```
% git push heroku master
```
これを実施して、デプロイすると
「The page you were looking for doesn't exist.」
「探していたページが存在しません。」

このままググってみると、ルートがうまく設定できていないと判明

記事の設定箇所に
4.config/routes.rb
rootページ(例：root 'questions#index')が設定されているか確認する（設定されていないとエラーになってしまう）
と書かれているにも関わらず無視して続けてしまっていました。

```routers.rb
root 'home#about'
```
ウェブサイトのトップヘージに繋がるようルートを設定しました！

すると無事デプロイすることができました。
マインドマップでAWSのデータ分析サービスを勉強【データ分析編】第２回 − Redshift, Athena

AWSのデータ分析系のサービスを体系的に勉強シリーズです。

一般的なデータ分析流れに含まれる、データ収集、データ保存、データ処理、データ分析、データ可視化、といったステップにそれぞれが利用するサービスを学び、マインドマップに整理しました。
今回はデータ分析編のRedshiftとAthenaです。

※ こちらの記事は、AWSのホワイトペーパー、クラウドサービス活用資料集とUdemyにあるAWS Certified Data Analytics Specialty 2021 - Hands onコースを参照しております。


![AWS Analytics - Athena, Redshift.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/492803f7-536d-20bd-3a72-296da620be26.png)
Python boto3でWindows Passwordを復号する関数

## 経緯
boto3には(get_)password_dataという関数があり、
Windowsインスタンスの場合は、暗号化されたpasswordを返してくれます

CLIだとパラメータにキーファイルを渡せば復号化までやってくれますが、
boto3は自分でやらないといけません

車輪の再発明は私はあまりやりたくない人なので、どなたかのお役に立つかと思い、
今回作成した関数を共有します
（実際に作成したのはメソッドでQiitaに投稿するにあたり関数にしました。
　変換の過程でミスがあるかも知れません）

## 処理の説明
特に難しいことはやっていないと思います
キーファイルを読み込んで復号化して返しているだけです

Linuxの場合はパスワードがセットされていないので、復号化の処理をスキップしています
password_dataの返す値がbase64でエンコードされているので、復号化しています
エラー処理は適当に変えてください
復号化した後はbyteになっているので、strに変換しています

```decrypt.py
import boto3
import base64
import rsa
from rsa.pkcs1 import DecryptionError, VerificationError

def get_password_data(private_key_file: str, instance_id: str) -> str:
    # load private key
    with open(private_key_file, "r") as f:
        private_key_data = f.read()
    loaded_pk_data = rsa.PrivateKey.load_pkcs1(private_key_data, format="PEM")

    ec2 = boto3.resource('ec2')
    instance_obj = ec2.Instance(instance_id)
    resp = instance_obj.password_data()
    # Windows Only
    if resp["PasswordData"]:
        try:
            password = rsa.decrypt(
                base64.b64decode(resp["PasswordData"].encode(encoding='utf-8')),
                loaded_pk_data
            )
        except (DecryptionError ,VerificationError) as e:
            lggr = self.get_logger("get_password_data")
            lggr.error(e)
        else:
            return password.decode()

    return ""

```
【Google Cloud Day'21】「CTC が考えるマルチ クラウド構成のセキュリティ勘所」を視聴して

CTC が考えるマルチ クラウド構成のセキュリティ勘所
CTC でご支援させて頂いているエンドユーザー様では、マルチ クラウド構成を採用される場合が多く、それにともなってセキュリティ関連のご要望を多くいただきます。本セッションでは、公共のエンドユーザー様の案件から、ポイントとなる検討事項とソリューションをご紹介します。
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d3-gl-28

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>今後の見通し</th>
		<td></td>
	</tr>
	<tr>
		<th>マルチクラウドのメリット、デメリット</th>
		<td></td>
	</tr>
	<tr>
		<th>ネットワークのセキュリティ</th>
		<td></td>
	</tr>
	<tr>
		<th>認証、認可のセキュリティ</th>
		<td></td>
	</tr>
	<tr>
		<th>アクティビティ監査</th>
		<td></td>
	</tr>
	<tr>
		<th>CTCの提供するGCPサービス</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/e08d89df-9d2d-b814-a678-3e26d1a4b0f5.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/6fc1bdec-8ced-897d-fa7f-e90a3fa496dd.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2776e1ef-dafa-a6f5-711a-e41443fe0bd9.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4b22ae44-7074-83ce-6093-38b415519fa2.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4653f8eb-8527-b884-adb6-757eddc5fbb3.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/e44b56fe-ea5c-e227-5a28-c7c3d271c982.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9611e661-7917-9714-a4d5-7632242e036c.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/08571807-cb59-c367-7e62-a3802f8ac1bb.png)
【Google Cloud Day'21】「ハイブリッドへの第一歩、オンプレからのクラウド移行で押さえるべきポイントとは」を視聴して

ハイブリッドへの第一歩、オンプレからのクラウド移行で押さえるべきポイントとは
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d3-pl-12

"クラウド利用では、複数のクラウド及びオンプレを併用する、ハイブリッド環境が珍しいことでは無くなってきています。
そのような環境構築において、オンプレで vSphere をご利用の多くの方が最初に直面する課題はスムーズなクラウド移行ではないでしょうか。
本セッションでは、GCVE にて提供されている VMware HCX を活用したクラウド移行について、いくつかの具体的な事例を交えてご紹介いたします。"

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>課題</th>
		<td></td>
	</tr>
	<tr>
		<th>マイグレーションの選択肢</th>
		<td>vshereが稼働してればそのまま移行できる</td>
	</tr>
	<tr>
		<th>一般的な移行方法</th>
		<td>VMの停止が必要になってしまう。状況によりどの方法が適しているかは異なる。</td>
	</tr>
	<tr>
		<th>GCVEについて</th>
		<td>オンプレと同様の仮想化が可能。より簡単に移行ができるVMware HCXが使える</td>
	</tr>
	<tr>
		<th>VM HCXの特徴</th>
		<td></td>
	</tr>
	<tr>
		<th>移行シナリオ１</th>
		<td></td>
	</tr>
	<tr>
		<th>移行シナリオ2</th>
		<td></td>
	</tr>
	<tr>
		<th>検討フロー</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a57b84ae-8fc9-2d35-41c6-d64d733b90d6.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/cf2a9c19-0d28-7c24-67fe-095976d5e743.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/02719441-bfa6-40cf-7857-e7fe586f1cad.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/db15ffc4-c4ed-e47a-e40d-f7bf0cf43b46.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d6f5aba5-0b84-afad-49f1-a3dc1c981ffa.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/ed41fec4-4cc9-bef7-8a98-812c10424f68.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4099a754-d2d8-7f08-a6e5-b98c9fecb4ce.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f54f2fc4-6e0f-6295-3a8a-2ccf3e40f6ac.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/729e8104-4ff4-d1cf-e57e-4a21b9210311.png)
テックキャンプを受講した感想

ご覧いただきありがとうございます。

昨年の１０月からテックキャンプ短期集中コースを受講し、無事就活が終わったのでその感想を書きたいと思います。

まず初めに、就活めちゃめちゃ大変でした、、、

受講前に想像していたより何倍も上手くいかず、かなり大変でした。

コロナ禍ということもありますがエンジニアの供給が素人目からみても溢れていました。
その中でテックキャンプさんにはとてもお世話になりました。

プログラミングに興味があり、スクールに行くか、またどこのスクールに通うべきか考えておられる方もいると思いますので、

実際にテックキャンプを受講し、就職まで終えた私の思った

テックキャンプの
・よかったこと
・よくなかったこと
をご紹介したいと思います。


・よかったこと
①カリキュラムがわかりやすい
②メンターにすぐ聞ける環境
③同じ期生とのアウトプットがある

１つずつ説明していきます。

①カリキュラムがわかりやすい
普通であれば教室に通い学習をするはずだったのですが、コロナの関係で私は完全オンラインで学習をしていました。（希望者は週に数回教室利用可）
オンラインだと理解しにくかったりしないかな？と心配していましたがとても分かりやすくまとめられていて、分からない問題も自分で試行錯誤して取り組むことができました。

②メンターにすぐ聞ける環境
分からないことがあった時、メンターにチャット、電話をボタンひとつでできる環境がありました。
こちらもオンラインだったので心配をしていましたが、全く問題ありませんでした。

③同じ期生とのアウトプットがある
個人的にこれが一番受講してよかったなと思うポイントです。
私自身何度も独学で挫折をしてスクールに通うことを決めたので、同じような環境の人たちと意見や知識を話し合いながら学習を進められたことが大きなモチベーションになりましたし、とても有意義だったと思います。


・よくなかったこと
①メンターの使い方
②求人紹介がほぼなかった

こちらも１つずつ説明していきます。

①メンターの使い方
しっかりと自分の頭で考えてからメンターに質問できる環境作りがされていましたが、それ故に本当に分からないことがあった時は聞くことができず丸一日エラーで進まなかったことがありました。
自走力はとても大事だと思いますが、同期にも同じような方が何人もいたのでそういったところが改善されればもっと良いと思いました。

②求人紹介がほぼなかった(東京はあるみたいです)
私は中部地方で就職活動をしていましたが、求人の紹介を受けず自己応募で内定をいただきました。
コロナ禍ということもあり仕方ないことだと思いますが、今後もっと増えるといいなと思います。

以上です。
最後までご覧いただきありがとうございました。
Rails6でデータベースをpostgreSQLに変更したその後のエラー



##開発環境
Railsアプリケーションの開発
Rails ver. 6.1.3
Ruby ver. 2.6.3
postgreSQL ver. 13.2

##エラー①
Rails6ではデータベースの変更がコマンド１つでできるので、
こちらの方の記事を参考に
https://qiita.com/vinaka/items/fbdb17bebe75d40de995

Herokuへデプロイする予定なのでデータベースをdevelopment、production含め
一括でpostgreSQLに変更しようと考えた
以下のコマンドを実行し、bundle install

```
$ rails db:system:change --to=postgresql
$ bundle install --clean
```
railsサーバーを起動すると


```
ActiveRecord::ConnectionNotEstablished (could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
):
```
このようなエラーが発生

エラー文で調べてみるとQiitaの記事がヒット
https://qiita.com/masayuki14/items/27ca4764d0bcae4affea

これを参考に
`config/application.rb`にて記述を追加

```config/application.rb
require_relative "boot"

require "rails"

# 以下4行を追加
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "active_storage/engine"
.
.

```
それでも解決しなかったので
こちらの記事に辿り着き
https://qiita.com/hirocueki2/items/327dc6e87005edf622ad

試行錯誤の末、、

```
$ postgres -V
postgres (PostgreSQL) 13.2

$ brew postgresql-upgrade-database
Error: postgresql data already upgraded!

$ rm /usr/local/var/postgres/postmaster.pid

$ brew services restart postgresql
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```
無事に上記のエラーは解決

##エラー②
その後`rails db:migrate`を実行すると新たなエラーが

```
ActiveRecord::NoDatabaseError (FATAL:  database "datebase_development" does not exist
):
```

これはデータベースがないがために起こるエラーのようで`rails db:create`を実行

```
rails db:create
Created database 'database_development'
Created database 'database_test'
```
コマンドの実行によりデータベースは作成されたようで

```
$ rails db:migrate
== 20210711110107 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0177s
== 20210711110107 CreateUsers: migrated (0.0178s) =============================
```

`rails db:migrate`に成功！

困ってる人の助けになれれば幸いです。
間違い・ご指摘等ありましたら教えてください。
遠隔でJetsonの管理を実現する方法－スクリーンショットの取得

#はじめに
[前回の記事](https://qiita.com/Koharu1993/items/4ebe4f38b1f74e0e9e91)ではアラート通知機能をご紹介しましたが、
今回はスクリーンショットの取得機能を皆様にご紹介していきたいと思います！
ぜひ最後まで見て頂けたら嬉しいです！

#Allxon DMSについて
Allxon Device Management Solutions (Allxon DMS) は、
多数のデバイスを容易に一元管理できるサービスです。
SIer企業及びサービスプロバイダ企業に対して、
シンプルにナビゲートしやすいデバイス管理サービスを提供します。
事業部をまたぐ多用なデバイス管理すらもひとつのAllxonアカウントから実行できるため、
デバイス上の問題解決のみならず、人件費と運用コストの大幅削減にも実現可能です。

#スクリーンショット取得機能について
例えばデバイスが復旧後、ちゃんと画面上も復旧前と同じようなステータスになっているかは、
ユーザーがスクリーンショット機能を利用することによって、
デバイスまたはサービスの復旧状況を確認することができます。


#スクリーンショット取得の設定手順
①デバイスページにある右上の操作ボタンを押していただき、
スクリーンショットを選んでください。
![未命名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/6137cd8f-f692-9400-045f-ef552e2295ad.png)

②スクリーンショットをクリックすると、対象デバイスの画面キャプチャを取得することが可能です。
![擷取.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/8b544578-bc04-5c5b-3cd5-a6d9119e218c.png)

③保存ボタンを押しましたら、JPGファイルとしてPCに保存されます。
![00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509678/1bd23bc1-f02e-9daf-bdc4-9c952ced81a4.jpeg)


#終わりに
いかがでしょうか！とても簡単で便利ですよね！
また、すでにAllxon DMSをダウンロードした方に是非こちらの”**[マニュアル](https://app.hubspot.com/documents/7375543/summary/3800002)**”をご覧になって、
操作してみて頂ければと思います。
毎週火曜日に記事を更新致しますので、
ご意見または感想がございましたら、ぜひコメント欄に書いて頂けると嬉しいです！
都道府県ローマ字pandasデータフレーム


都道府県のデータフレームをコピペ用に作成しました。

todoufuken = ["hokkaido",
         "aomori","iwate","miyagi","akita","yamagata","fukushima",
         "ibaraki","tochigi","gunma","saitama","chiba","tokyo","kanagawa",
         "niigata","toyama","ishikawa","fukui","yamanashi","nagano","gifu","shizuoka","aichi",
         "mie","shiga","kyoto","osaka","hyogo","nara","wakayama",
         "tottori","shimane","okayama","hiroshima","yamaguchi",
         "tokushima","kagawa","ehime","kochi",
         "fukuoka","saga","nagasaki","kumamoto","oita","miyazaki","kagoshima","okinawa"]

Todoufuken = ["北海道","青森","岩手","宮城","秋田","山形","福島",
         "茨城","栃木","群馬","埼玉","千葉","東京","神奈川",
         "新潟","富山","石川","福井","山梨","長野","岐阜","静岡","愛知",
         "三重","滋賀","京都","大阪","兵庫","奈良","和歌山",
         "鳥取","島根","岡山","広島","山口",
         "徳島","香川","愛媛","高知",
         "福岡","佐賀","長崎","熊本","大分","宮崎","鹿児島","沖縄"]

参考サイト

https://www.start-point.net/maps/tool/

時短になれば幸いです。
Google Cloud Certified Professional Cloud Architect 合格しました

先日、Google Cloud認定資格Professional Cloud Architectの試験を受験し、合格しました！
その記録を残しておきます。

Google Cloudの試験は今回初めてでした。以下は直近2年間の資格試験の履歴です (リンクは合格体験記)。

- 2019年9月 AWS Certified Solutions Architect - Associate
- 2019年10月 [AWS Certified Big Data - Specialty](https://qiita.com/suzuki-navi/items/8b2fe5a35a4439013461)
- 2019年11月 [AWS Certified Machine Learning – Specialty](https://qiita.com/suzuki-navi/items/3664bfbc102052717426)
- 2020年5月 [統計検定2級](https://qiita.com/suzuki-navi/items/e353b8dfbc6e872f9f41)
- 2020年7月 [G検定](https://qiita.com/suzuki-navi/items/fd3607f8f0e670bba887)
- 2020年10月 [AWS Certified Database - Specialty](https://qiita.com/suzuki-navi/items/59f8a4a94ad9a22dd569)
- 2021年7月 [AWS Certified Developer - Associate](https://qiita.com/suzuki-navi/items/dfb343130da83d560ce4)
- 2021年7月 Google Cloud Certified Professional Cloud Architect (今回)

GCPは少しは触るものの、AWSほどの経験はなく、細かいサービス仕様だとかの知識は正直まだ乏しいです。

# 勉強方法

試験の1週間前に申し込みをし、その時に公式の模擬試験を解きました。そして、試験前日の夜にUdemyの模擬試験を買いました。模擬試験には2回分の問題が含まれていましたが、時間がなく1回分だけやりました。

[前回のAWSの試験](https://qiita.com/suzuki-navi/items/dfb343130da83d560ce4)とは対照的に、勉強時間は数時間しか確保できませんでした。試験を申し込んだのは前回のAWS試験よりも前で、その時点でGCPの勉強をする余裕がなく、AWSの試験が終わって数日後に今回のGCPの試験で、前日夜に初めて勉強するありさまでした。

# 試験当日

オンライン試験はいろいろ面倒そうなので、試験会場に赴いて受験しました。

50問120分ですが、ゆっくりやって1時間ぐらいで終わり、その後30分ぐらい見直しして終了としました。

半分くらいの問題に「見直しフラグ」を付けましたが、見直し時はすべての問題を見直しました。

# 結果

合格。スコアは開示されないみたいです。

# 所感

[前回のAWS](https://qiita.com/suzuki-navi/items/dfb343130da83d560ce4)ではUdemyの模擬試験と実際の試験の難易度にギャップを感じましたが、GCPの今回の試験では模擬試験どおりでした。模擬試験と似た問題もありました。

AWSの試験のようにマニアックな細かいサービス仕様を問われることは少ないです。模擬試験をやっておいて、その範囲でサービスの概要を理解しておけば大丈夫でした。

GCPにあるデータベースのサービス（Cloud SQL、Spanner、Datastore、Bigtable、BigQuery）は、それぞれの特徴や使い分けをある程度理解しておくとよさそうです。とはいっても半分くらいわかっていれば合格できそうです。私はよくわからずに感で回答したものもありました。

App Engineはスタンダード環境とフレキシブル環境の違いを理解しておく必要があります。

Transfer Appliance、Dedicated Interconnectあたりも出てきました。
[Unity3D] プレイヤーを中心に回転するカメラを実装する方法

マリオ64、モンハン等のプレイヤーを中心に回転するカメラを実装したので置いておきます。Rotate();関数がカメラで関係ありませんがZoom関数はカメラをマウスホイールで拡大してプレイヤーにカメラを近寄らせます。


######使い方
カメラにアタッチしてプレイヤーや追尾してほしいオブジェクトをスクリプトにアタッチ


```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/* ###########################################################################################
 * カメラ追尾 
 * 
 * 
 * 
 * 
  #############################################################################################*/



public class Camera_Tracking : MonoBehaviour
{

    public GameObject playerObject;         //追尾 オブジェクト
    public Vector2 rotationSpeed;           //回転速度
    private Vector3 lastMousePosition;      //最後のマウス座標
    private Vector3 lastTargetPosition;     //最後の追尾オブジェクトの座標


    private float zoom;

    void Start()
    {
        zoom = 0.0f;
        lastMousePosition = Input.mousePosition;
        lastTargetPosition = playerObject.transform.position;
    }

    void Update()
    {

        Rotate();
        Zoom();
    }


    void Rotate()
    {
        transform.position += playerObject.transform.position - lastTargetPosition;
        lastTargetPosition = playerObject.transform.position;

        if (Input.GetMouseButton(1))
        {

            Vector3 nowMouseValue = Input.mousePosition - lastMousePosition;

            var newAngle = Vector3.zero;
            newAngle.x = rotationSpeed.x * nowMouseValue.x;
            newAngle.y = rotationSpeed.y * nowMouseValue.y;

            transform.RotateAround(playerObject.transform.position, Vector3.up, newAngle.x);
            transform.RotateAround(playerObject.transform.position, transform.right, -newAngle.y);
        }

        lastMousePosition = Input.mousePosition;
    }


    //拡大縮小
    void Zoom()
    {
        zoom = Input.GetAxis("Mouse ScrollWheel");
        Vector3 offset = new Vector3(0,0,0);
        Vector3 pos = playerObject.transform.position - transform.position;

        if (zoom > 0)
        {
            offset = pos.normalized * 1;
        }
        else if (zoom < 0)
        {
            offset = -pos.normalized * 1;

        }
        transform.position = transform.position + offset;
    }


}
```