OmniAICreator/Qiita-1.07M huggingface dataset:
数学用語，色々備忘録

#Math tool: 数学用語
目次
inner product: 内積
vector product: 外積
extremem: 極値
determinant: 行列式
eigenvalue, eigenvector: 固有値，固有ベクトル
conditional probability: 条件付き確率
Bayes' theorem: ベイズの定理

##inner product: 内積
$\boldsymbol{a}$を$\boldsymbol{b}$の方向とその他の方向に分解した場合に$\boldsymbol{b}$で表現することができる最大値

##vector product: 外積
$\boldsymbol{a}$と$\boldsymbol{b}$の両方に直交するベクトルで，大きさが$\boldsymbol{a}$と$\boldsymbol{b}$から成る平行四辺形

##extremem: 極値
微小な変化量が増加から減少，または減少から増加に変化する点

##determinant: 行列式
もとの空間を1とした場合，$\boldsymbol{A}$で線形変換を行った際の空間の大きさの比率

##eigenvalue, eigenvector: 固有値，固有ベクトル
ある行列$\boldsymbol{A}$による線形変換を一つのベクトルで代用したもの

#Statistics tool: 統計用語
##conditional probability: 条件付き確率
$\mathrm{P}(B/A)$: ある事象$A$における，ある事象$B$を含むものの割合

##Bayes' theorem: ベイズの定理
条件付き確率の条件を厳しくしたもの
$\mathrm{P}(H_i/A)=\frac{\mathrm{P} (H_i)\mathrm{P} (A/H_i)}{\mathrm{P}(A)}$: ある事象$A$における，ある事象$H_i$を含むものの割合．ただし$H_i$同士は排反(互いに素)で$[\sum^n_{i=1}\mathrm{P} (A\cap H_i)=\sum^n_{i=1}\mathrm{P} (H_i)\mathrm{P} (A/ H_i)=A]$


*条件付き確率は正しくは$\mathrm{P}(B|A)$です．$\mathrm{P}(B/A)$としているのはわざとです．直感的で覚えやすい．

##Laspeyres Index, Paasche Index: ラスパイレス指数,パーシェ指数
数量を変化させて価格の変化を見る
ラスパイレス式が基準年の数量，パーシェ式が比較年の数量

##プールした分散
分散が等しい=分散の推定値の範囲を狭めることができる
2つの不偏標本分散をそれぞれ標本分散に戻した上で，新たな不偏分散を作る処理(ただし推定した期待値は2つなので自由度はすべての個数-推定した値の数)

$プールした分散=分散Aの自由度の割合\times分散A+分散Bの自由度の割合\times分散B$
$\hat{\sigma}^2=\frac{l-1}{l-1+m-1}\hat{\sigma}_A^2+\frac{m-1}{l-1+m-1}\hat{\sigma}_B^2$

$独立性の検定:期待値$
AとBが独立のとき$\mathrm{P}(A\cap B)=\mathrm{P}(A)\mathrm{P}(B)より$
期待値＝総数×(Aの確率×Bの確率)
[C++]初めてWindowsでC++を実行してみたいと思い立った人へ

#概要
C++をこれから学びたくて「まず何を準備したらいいのかな？」となった人向けの記事です。
初めの一歩になれば幸いです
#本文
##VisualStudioCommunity
まずはVisualStudioCommunityをインストールしてください。公式HPから無料でダウンロードできます。
##プロジェクトを用意する
プロジェクトはC++を記述するファイル群です。
ファイル > 新規作成 > プロジェクトと辿って
![スクリーンショット (2187).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ba52e291-2468-d863-d94f-05e35ac577c2.png)
スクショの様に選択項目からC++を選びます。
![スクリーンショット (2188).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a7ca721c-fdb5-0ca7-5d35-5e3008340a47.png)
C++のテンプレートを選べるようになります。C++をターミナル（文字だけが表示される味気ない画面）で実行させたり、Windowsらしくウィンドウ画面でC++を動かしたりといろいろ選べます。
今回は「コンソールアプリ」を選びました。「次へ」を押すとプロジェクトが作成されます。
![スクリーンショット (2189).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/46a646df-2519-7e7f-7172-cf1b3fa69b89.png)
##プロジェクトを扱う
ここからはC++コードを自由に書き込めるようになります。サンプルとして簡単なコードが最初から記述されていますが、コードを全部オリジナルで書きたい人は全部消してまっさらにしてから書き始めても大丈夫です。
![スクリーンショット (2190).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/4cc9f600-5e76-d764-7df2-8b86b6d20ce6.png)
スクショで丸をしている再生ボタンマークの部分を押すとC++コードを実行できます。（F5キーもしくはCtrl＋F5キーでも実行できます）
サンプルコードそのままなら表示されたウィンドウに「Hello World!」と表示されて正常に動作したことが確認できます。
![スクリーンショット (2191).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c4183e1a-b75e-a054-5c7d-c302b04bbea4.png)

#おまけ
UnrealEngine4のC++を勉強したかったのですが、実行のたびにかなり待たされるのが億劫でした。
VisualStudioCommunity１つだけでC++を実行できることに気づいたので記事にまとめておきました。
Python+Flaskで作ったWEBアプリをHerokuデプロイした

…ただの初心者の作業記録的なものなので、あまり参考にならないと思います。


udemyの"[The Python Mega Course: Build 10 Real World Applications](https://www.udemy.com/course/the-python-mega-course/)"を参考に、せっせと勉強アプリを作っているのだが、このチュートリアルの環境作りが古い。

とはいえ、「与えられた課題をクリアする」こと自体が好きなので、チュートリアルの中でどこが古くてどこを新しくすべきなのかを判断して、（チュートリアルのやり方には従わず）自分なりに調べた方法ですすめてみる。

つくるのは、Application3:Personal Website with Python and Flask。

##アプリをつくったディレクトリに仮想環境をつくる
チュートリアルではアプリを作ってから仮想環境をつくるという流れだが、私は環境づくりから先にやった。virtualenvが紹介されているが、Python 3.3 からはこれが標準機能として取り込まれてvenvとして扱われているそうなので、venvを使ってプロジェクト（アプリ）ごとに独立した仮想開発環境をつくる。

このまんますすめた。
[venv: Python 仮想環境管理 - Qiita]( https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)

venv activate `$ source [newenvname]/bin/activate`
activate した仮想環境の中でプログラムファイルをつくる。というか、作ったプログラムを仮想環境をactivateした状態で動かす。

finderを確認するとアプリがあるディレクトリの中に[newenvname]という名称のフォルダができている。それを見てから「さぁ、pythonファイルを作ろう！」と思った私は「はて、どこにファイルを置いたらいいの？venvの中なの、外なの？」という疑問にぶち当たってしまった。今から考えると、仮想環境の中で作業することと、物理的にファイルをどこに置くのかは、別の問題だということがわかっていなかったのだが。

答えは、[Pythonファイルをvenvフォルダーのどこに配置すればよいですか？ - Javaer101]( https://www.javaer101.com/article/1072627.html)のとおり、「仮想環境はあなたのものではないファイルを管理します。自分のファイルをどのように管理するかは関係ありません。venvディレクトリツリー内ではなく、意味のある場所に配置してください。」すなわち、どこでもいいけどvenvディレクトリの外が良いってことらしい。

##Flaskを使ってwebページを作る

flaskをimportしたpythonプログラムを作成。home.html、about.html、layout.html、main.cssを参照する感じの簡単なもの。

````python:script.py

from flask import Flask, render_template
app=Flask(__name__)

@app.route('/')
def home():
    return render_template("home.html")

@app.route('/about/')
def about():
    return render_template("about.html")

if __name__=="__main__":
    app.run(debug=True)

````

###アプリをGithubにPushし、Herokuにデプロイ

requirements.txtを作成

`$ pip freeze > requirements.txt`

Procfileを作成
参照：Herokuに必要なProcfileの書き方についてまとめておく | ハイパー猫背 https://creepfablic.site/2019/06/15/heroku-procfile-matome/#index_id1

今回はPythonとFlaskを使ったアプリを作ったので、Heroku上で動作させるためには、gunicornというWSGI(Webアプリとサーバーをつなぐもの)が必要なのだそう。そこでHerokuのシステムに「gunicornを使います」ということを記述する。今回はscript.pyというpythonアプリだから、それを入れる。そんで、作成したProcfileはアプリケーションの/ (ルートディレクトリ)に置く。

````html:Procfile

web: gunicorn script:app

````

Appの後ろに`--log-file -`と記述すれば，HerokuのログでWSGIの挙動のログが出力されるが、なくてもOK.

Git pushした後、heroku にデプロイしてOpen Appボタンを押すと（https://アプリ名.herokuapp.com/　を表示させると）、Application Errorが出てしまった。


##ダメだったところ

Herokuのログを確認（`$ heroku logs --tail`）

###・gunicornをインストールしていなかった

言われるがままにProcfileを記述したため、gunicornのインストールをしていなかった（嘘でしょ！）。仮想環境（venv）で`pip install gunicorn`し、requirements.txtを書き直す（`$ pip freeze > requirements.txt`）。

###・script.pyを削除してアップしていた
信じられない話だが、アプリファイルそのものを削除していた。ゴミ箱に残っていたものをrestoreして、再push。

###・script.pyに書いた参照ファイル名が間違っていた
これでもまだ、`at=error code=H10 desc="App crashed" method=GET path="/"`などのエラーが出るので、ググールして参考サイトを確認しつつ、エラーメッセージを目を凝らしてみたら、「index.htmlファイルなんて存在しないぜ！」というメッセージがある。確かに、最初はindex.htmlとしていたファイルをhome.htmlに変えたんだった。それを保存していなかったっぽい。

----

通った。

学びは、（１）答えはエラーメッセージに隠されている、（２）難しいことをする前に自分の凡ミスを疑え、の２点。自分のミスの酷さに涙が出そうだが、問題解決にかける時間が短くなってきたような気もする。

肩こりがひどい。
linux format install memo




```bash
sudo apt update &&sudo apt install -y wget git&&sudo  apt install build-essential -y&& git clone https://github.com/pyenv/pyenv.git ~/.pyenv &&\
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile &&\
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile &&\
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.profile &&\
source ~/.profile &&\
sudo apt install -y gcc make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev &&\
pyenv install 3.7.4 &&\
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv &&\
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.profile &&\
source ~/.profile &&\
pyenv virtualenv 3.7.4 myenv && pyenv global 3.7.4 && \

sudo apt-get update &&\
sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common &&\
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - &&\
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable" &&\
sudo apt-get update &&\
sudo apt-get install -y docker-ce docker-ce-cli containerd.io &&\
sudo apt-get install -y docker-compose &&\
sudo apt-get install -y ibus-mozc
```
for文

### for文
リストの要素をすべて出力したい場合、
<pre> 例：　fruits = ['apple','banana','orange']　
 print('好きな果物は'+fruits[0]+'です')  ※print(f"好きな果物は{fruits[0]}です") と記述しても出力できます
 print('好きな果物は'+fruits[1]+'です')
 print('好きな果物は'+fruits[2]+'です')
</pre>
と記述すれば`apple,banana,orange`が出力できるが、同じ記述を何回も書くのは工数がかかります。
その際に、for文を用いると、簡単に記述することができます。
記述は`for 変数名 in リスト:` と記述することで、リストの要素の数だけ処理を繰り返す事ができます。
<pre>例： fruits = ['apple','banana','orange']
  for fruit in fruits:
      print('好きな果物は'+fruit+'です')　※ここでも、print(f"好きな果物は{fruit}です")と記述しても出力できます
</pre>
と記述することで、同様に`apple,banana,orange`が出力できます。

これはfruitという変数の中に、リストの要素が先頭から順に１つずつ入っていき、その上でfor文の処理が実行されます。処理はリストの要素の数だけ繰り返されます。(変数名は自由ですが、リストの単数形にすることが慣習的に多い)
###for文の流れ
①変数fruitに'apple'が代入され、for文の処理が実行される
↓
②変数fruitに'banana'が代入され、for文の処理が実行される
↓
③変数fruitに'orange'が代入され、for文の処理が実行される
ServiceNow - リストにsys_idを表示する

# 概要
関連したテーブルにデータを登録している時にsys_idを見たい場合があります。標準ではsys_idは非表示ですが、スクリプト無しで表示させることもできます。
標準：
![display_sysid_in_list_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/b1453064-7b6c-cc7e-8241-e52866dd0c76.png)
sys_idを表示：
![display_sysid_in_list_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/09a1796d-0988-af9a-9c67-bb0f545449b2.png)

# 手順
## リストに関連したテーブル名を特定
1. sys_idを表示したいリストを開き、リストヘッダを右クリックして「構成」－「辞書」を選択。<br/>![display_sysid_in_list_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/8cc1e6e4-2a9e-1a8d-1c1e-13f5485cc354.png)
1. 列「テーブル」でテーブル名を取得。継承している場合は親テーブル名も表示されるので注意。今回はハードウエア資産リストにsys_id列を追加するのでテーブル名は「alm_hardware」です。<br/>![display_sysid_in_list_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/ab592c98-4250-2891-1556-a84f764f0b9a.png)

## リストにsys_idを追加
1. アプリケーションナビゲータから「システム UI」(「システム」と「UI」の間に半角スペースがあります)を検索して、「システム UI」下の「Lists」を選択します。<br/>![display_sysid_in_list_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/991051d6-7d62-e453-5e0e-82f9b8b88b21.png)
1. 上で見つけたテーブル名を検索します。<br/>検索条件を「テーブル」にして「alm_hardware」を検索。<br/>![display_sysid_in_list_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/eef03011-c414-06ac-ef58-a001bbd9d06a.png)
1. 結果からテーブル名を選択。ハードウエア資産は親テーブルが空です。<br/>![display_sysid_in_list_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/523d625e-8df1-4002-5cec-1c05c451033e.png)
1. 「新規」ボタンを押下。<br/>![display_sysid_in_list_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/f3774ebe-572d-1a58-2496-fb760138403c.png)
1. 「要素」に「sys_id」を入力して「送信」ボタンを押下。<br/>![display_sysid_in_list_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d07dff55-d708-8bce-b8e4-a0e3f7fae49c.png)

## sys_id列を表示
ServiceNowは設定をメモリ上かから取得するため、上の設定だけではsys_id列は表示されません。列を表示するためにはメモリを初期化します。
1. アプリケーションナビゲータに「cache.do」を入力してEnterキーを押下。<br/>![display_sysid_in_list_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/3847164e-0001-f80e-24cf-b8ec0c836082.png)
1. 初期化されると次のようなページが表示されます。<br/>![display_sysid_in_list_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d9a13ede-4663-c8de-75d4-c1cc381e10e8.png)
1. sys_id列が表示されます。<br/>![display_sysid_in_list_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/09a1796d-0988-af9a-9c67-bb0f545449b2.png)

以上
Laravelで404, 500ステータスコードを返すシンプルなAPI実装

仕事の関係で、Laravel＋Vueの開発をやっています。Laravelを使うのは初めてなので、学んだものを記録します。

## 学んだこと
Web APIの基本作りです。
今回はステータスコードのみ、非常にシンプルなレスポンスを返すWeb APIを作成してみました。

手順としては、
- API Controllerの作成
- Routeの設定

以上です。

## API Controllerの作成
`app/Http/Controllers`の配下に`TestHttpStatus.php`を作成しました。

`e404`, `e500`という二つの関数を作成し、それぞれ400, 500のステータスコードを設定します。

```php

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class TestHttpStatus extends Controller
{
    public function e400(Request $request)
    {
        return response()->json([], 404, ['Content-Type' => 'application/json'], JSON_UNESCAPED_UNICODE);
    }
    public function e500(Request $request)
    {
        return response()->json([], 500, ['Content-Type' => 'application/json'], JSON_UNESCAPED_UNICODE);
    }
}

```

## Route

`routes/api.php`にAPIのルートを追加する。

```

use App\Http\Controllers\TestHttpStatus;

...

Route::get('test_e404', [TestHttpStatus::class, 'e404'])->name('e404');
Route::get('test_e500', [TestHttpStatus::class, 'e500'])->name('e500');
```

`http://localhost/test_e404`にアクセスすると400エラーが発生します。
`http://localhost/test_e500`にアクセスすると500エラーが発生します。

## 応用
404, 500エラーをテストしたい時に使えると思います。
また、Routeの部分ですが、`routes/api.php`ではなく、`routes/web.php`にルートに設定するとカスタマイズの404, 500ページも検証できると思いました。
次回のチャンスがある際にメモします。
PHP json_encodeとjson_decodeについて

#比較
**encodeはphpの記述（文字列、数値、オブジェクト、配列など）をjson形式に**
**decodeはjsonの記述をphpの記述に**

それぞれ変更する

参考
[encode](https://www.php.net/manual/ja/function.json-encode.php)
[decode](https://www.php.net/manual/ja/function.json-decode.php)
AWS Glueを使った時にハマったこと

#はじめに#

エキサイトの坂本です。
今回は初めてGlueを使うので、素直に初心者の感想を書きます。

#Glueスクリプトなど保存S3バケット変更#

Glueジョブ登録の際に自動でS3バケットが作成されます。１つはスクリプト保存バケットともう１つは一時的なデータ保存バケットが作成されます。これは事前にS3バケットを用意して、選択できます。

```
事前に作成バケット
 |- スクリプト保存フォルダ
 |- 一時的データ保存フォルダ
```
最後に以下のポリシー追加します

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "{Dev/Prod}ExciteHcAnalysis",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{dev/prodのaccount-id}:role/excite_glue_iam_role"
            },
            "Action": "*",
            "Resource": [
                "arn:aws:s3:::excite-{dev/prod}-analysis-glue",
                "arn:aws:s3:::excite-{dev/prod}-analysis-glue/*"
            ]
        }
    ]
}
```

#データのサイズオーバー#

事前にRedshift側にテーブル作成が前提です。
Glueジョブ実行したあと、Redshift側のデータを確認したら、なぜか既存カラムっぽいのカラムが増えていますね。これは従来のカラムにデータが入らないため、Glueが勝手に新しいカラムを追加しています。

Redshiftはsmallint型がありますが、Glueジョブの都合でINTになってしまうことで、Redshiftに書き込みの際にサイズオーバーになってしまいます。この場合はsmallintからintに変更すれば、解決です。

#コード品質を保つ#

Pythonで開発したら、フォーマットツールとして、isort、autopep8、autoflakeを導入したいですね。
これらを使ったら、Glueジョブの注釈ブロックには「##」（２個）から「#」（１個）に変換されます。ジョブ再登録の際にジョブ実行で特にエラーが発生しないが、ダイアグラムが生成されない。

以上です。
オブジェクトにreduceを用いる

vueでreduceメソッドを久しぶりに用いて混乱した部分があるので整理した。
また、オブジェクトにreduceを用いて解説した記事はなかったので自分でまとめた。
##ソースコード

```html:index.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>

<body>
  <div id="app">
    <p>合計:{{ totalPrice }}</p>
  </div>
  <script>
    const items = [
      {
        name: '鉛筆',
        price: 300,
        quantity: 3
      },
      {
        name: 'ノート',
        price: 400,
        quantity: 4
      },
      {
        name: '消しゴム',
        price: 500,
        quantity: 1
      },
    ]
    const vm = new Vue({
      el: '#app',
      data: {
        items: items
      },
      computed: {
        totalPrice: function () {
          return this.items.reduce(function (sum, item) {
          return sum + (item.price * item.quantity)
          },0)
        },
      }
    })
  </script>
</body>
```

この時の `reduce` の挙動を `totalPrice` のなかで初期値などを変えつつ整理する

##ケース1：初期値を0としたとき

###ソースコード
```html:index.html
totalPrice: function () {
          return this.items.reduce(function (sum, item) {
            return sum + (item.price * item.quantity)
          },0)
```

|  | 1回目 | 2回目 | 3回目 |
|:-:|:-:|:-:|:-:|
|  sum  | 0                       |  900                     | 2500  |
|  item |  オブジェクト（鉛筆の内容） | オブジェクト（ノートの内容）  |  オブジェクト（消しゴムの内容） |

`reduce` は配列の内容を出力するので1回目の `item` はオブジェクト（鉛筆の内容）となります。
2回目の `sum` では1回目の戻り値が入るので、 ` sum(初期値0) + (300 * 3)` の値となり`900` となります。
3回目の `sum` では2回目の戻り値が入るので、 ` sum(0 + 900) + (400 * 4)` の値となり`2500` となります。
最後の `return sum + (item.price * item.quantity)` では3回目の戻り値が `sum` に入り　`2500 + (500（消しゴムの値段） * 1)`となるので `3000` となります。

##ケース2:初期値を設定しないとき
###ソースコード
```html:index.html
totalPrice: function () {
          return this.items.reduce(function (sum, item) {
            return sum + (item.price * item.quantity)
          })
```


|  | 1回目 | 2回目 | 3回目 |
|:-:|:-:|:-:|:-:|
|  sum  | オブジェクト（鉛筆の内容） |  [object Object]1600      | なし  |
|  item | オブジェクト（ノートの内容)| オブジェクト（消しゴムの内容） | なし  |

1回目の `sum` に入る値は `items[0]` つまり鉛筆のオブジェクトとなるので各値は上記のようになります。
1回目の `item` は 配列の2番目の要素が入るので、`index[1]`が対象となり、 `オブジェクト（ノートの内容)` となります。
2回目の `sum` は1回目の戻り値が入るので `オブジェクト（ノートの内容) + （400 * 4）`となり `[object Object]1600` となります。
2回目の　`item` は配列の3番目の要素が入るので、`index[2]` が対象となり、 オブジェクト（消しゴムの内容) となります。
3回目の `sum` はすでに2回目の `item` で `items` の要素を出力し切っているので実行されません。
3回目の `item` はこちらも試行回数は終わっているので実行されません。
最後の ` return sum + (item.price * item.quantity)` では2回目の戻り値が `sum` に入るので、 `[object Object]1600 + 500 `となります。`[object Object]1600`は文字列とみなされてこのような表記になると思います。
file_get_contentsで取得したファイルにfile_put_contentsで記述を追加する方法

#テキスト追加の例

txt.txt

```
このファイルはファイルプットコンテンツで書き換えられます
どうぞ
ご確認ください
```

file_put.php

```php
$file = 'txt.txt';
// ファイルをオープンして既存のコンテンツを取得します
$current = file_get_contents($file);
echo $current;
$current .= "\n"."この行は追加ファイルです。\n";
// 結果をファイルに書き出します
file_put_contents($file, $current);
```
上記実行後のtxt.txt

```
このファイルはファイルプットコンテンツで書き換えられます
どうぞ
ご確認ください

この行は追加ファイルです。
```

###テキスト上書きの例(file_put.php)

```php
<?php 
$file = 'txt.txt';
$new_txt .= "新規記述です\n";
// 結果をファイルに書き出します
file_put_contents($file, $new_txt);
```

実行後のtxt.txt

```
新規記述です
```

以上。
応用すれば条件によってファイルの出力や取得を使って色々出来そう。
AWS Glueジョブ作成時の備忘録

#はじめに#

エキサイトの坂本です。久しぶり投稿します。

Privateサブネットに配置しているOracleからPublicサブネットに配置している分析用のRedshiftにデータ転送の際に、AWS Glueを使えば非常に便利です。基本的にAWSコンソールからGlueジョブが自動で発行されますが、ニーズに応じて諸々カスタマイズが必要です。

#事例#

##ジョブのパラメータ受け取る##
現場でDev環境とLive環境のDB名が違うので、Devで発行したGlueスクリプトはDev環境のDB名が入っていますので、Live環境でGlueジョブ再登録すると、DBを書き換えしたくないですね。その場合は、Glueジョブのパラメータを使えば、解決できます。

例）

```
...
## @params: [TempDir, JOB_NAME, DATASOURCE_DB_NAME]
args = getResolvedOptions(
    sys.argv, ['TempDir', 'JOB_NAME', 'DATASOURCE_DB_NAME'])

# テーブル名
datasource_table_name = f"{args['DATASOURCE_DB_NAME']}_excite_hc_users"
...
```

##RedshiftにInsert前にTruncateしたい##

```
datasink5 = glueContext.write_dynamic_frame.from_jdbc_conf(
    frame=resolvechoice4,
    catalog_connection="excite-glue-connection-redshift",
    connection_options={
        "preactions": "truncate table users",
        "dbtable": "users",
        "database": "excite",
    },
    redshift_tmp_dir=args["TempDir"],
    transformation_ctx="datasink5"
)
```

＊注意：connection_optionsはfrom_jdbc_confのみ使えます。詳細はGlueのドキュメントをご確認ください

##電話番号のマスキング##

Publicサブネットに配置しているRedshiftに個人情報を転送してはいけないですね

```
import hashlib
...
# 電話番号のマスキング処理
def maskPhoneNumber(dynamicRecord):
    dynamicRecord["number_hash_hex"] = hashlib.md5(
        dynamicRecord["number_hash_hex"].encode("utf8")).hexdigest()
    return dynamicRecord
...
# 電話番号をマスキング
masked_dynamic_frame = Map.apply(
    frame=applymapping1,
    f=maskPhoneNumber
)
```

##１行ずつデータをチェックしたい##

```
def checkifmailaddr(val): return hashlib.md5(
    val.encode("utf8")).hexdigest() if val else "hoge"
...
# Dataframeに変換
df_list = resolvechoice4.toDF().collect()

result_list = []
for row in df_list:
    result_list.append(
        Row(
            userid=row['userid'],
            mailaddr_hash_hex=checkifmailaddr(row['mailaddr_hash_hex'])
        )
    )

df = spark.createDataFrame(result_list)
result_data_frame = DynamicFrame.fromDF(df, glueContext, 'result_data_frame')

# これでRedshiftに書き込み
datasink5 = glueContext.write_dynamic_frame.from_jdbc_conf(
    frame=result_data_frame,
    ...
)
```

## 転送対象データを絞り込み##

膨大なテーブルで全データを入れ直すと、時間やコストがかかりますので、2日の差分だけ転送したい場面もありますね

```
# 直近x日だけ取得
JST = datetime.timezone(datetime.timedelta(hours=+9))
today = datetime.datetime.today().astimezone(JST)
n_days_ago = today.date() - datetime.timedelta(days=7)
n_days_ago_formatted = n_days_ago.strftime('%Y-%m-%d')
target_df = datasource0.toDF().where(f"ap_regdate >= '{n_days_ago_formatted}'")
datasource0 = DynamicFrame.fromDF(target_df, glueContext, "datasource")

# Redshift側に直近x日のデータ削除
preaction_query = f"delete from users where regdate >= TO_DATE('{n_days_ago_formatted}', 'YYYY-MM-DD HH24:MI:SS')"

# 次は普通に使えます
applymapping1 = ApplyMapping.apply(
    frame=datasource0,
    mappings=[
       ...
    ],
    transformation_ctx="applymapping1"
)

# Redshiftにデータ書き込み
datasink5 = glueContext.write_dynamic_frame.from_jdbc_conf(
    frame=resolvechoice4,
    catalog_connection="excite-glue-connection-redshift",
    connection_options={
        "preactions": preaction_query,
        "dbtable": "users",
        "database": "excite",
    },
    redshift_tmp_dir=args["TempDir"],
    transformation_ctx="datasink5"
)
```

以上です
PHP $_SEVERについて

さらに詳しく考察した記事を書いた（リンクは以下）
 [$_SERVERについて　〜さらに詳しく〜](https://qiita.com/H-Toshi/items/47ad8f4f22feed3bbd39)
#各オプションの使い方
###$_SEVER['PHP_SELF']
![スクリーンショット 2021-04-05 15.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/7ff9d668-8f3c-da55-694c-0fc6aabbc016.png)
上記公式の情報を参考に検証していく
![スクリーンショット 2021-04-05 15.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/60c5ff12-ab8c-7fa4-18d7-4bdbfd308050.png)

MAMPで上記画像の様な階層で検証する。（ドキュメントルート はhtdocs）
```htdocs/test2/do/dec1.php```
上記ファイル内で

```php
<?php 
echo $_SERVER['PHP_SELF'];
```
を実行すると
```test2/do/dec1.php```
が表示される。

次に
```htdocs/test2/sever.php```


上記ファイル内で同様に試すと
```test2/sever.php```
と表示される。

この例から公式で
```http://example.com/foo/bar.php```
での表示が
```/foo/bar.php```
となっていることが
ドキュメントルートに対してそれ以下のディレクトリとファイル名が表示されると分かった。
Ruby on Railsの基本について

# 概要
RailsはRubyで最もメジャーなフレームワークでRubyによるWebアプリ開発に
特化した言語である。
Railsには理念が二つの理念が存在する。

一つはDRY（Don't Repeat Yourself)。
直訳すると「同じことを繰り返すな」で（自分なりに）意訳すると
「いろいろなところに同じコードを書かず共通となるコードは流用しろ」となる。
Rubyは少ない記述で様々な機能を実現できる特徴があるので、
このDRYの理念に沿っていると言える。

もう一つはCOC（Convention Over Configuration）
直訳は「設定より規約を優先しろ」。
RailsはWebアプリを開発するに際して必要だが、手間となる初期作業（DB設定,etc）などを
予め規約として定義しているため、そういった手間を省くことでより効率的に
Webアプリ開発を行うことができる。

# 考え方
MVCモデルを採用している。それぞれざっくり解説していく。
* Model（モデル）
RailsにおけるDB（データベース）へのアクセスといった情報のやり取りを司っている。
そのためモデルがないとテーブルをRailsで管理できない。
１テーブルに対してテーブルを管理するために１モデルが存在する。（１：１の関係）

* View（ビュー）
Railsがブラウザに対してユーザーにレスポンスするページを指す。
貴方が今ブラウザで見ているページがRailsにおけるビューとなる。

* Controler（コントローラー）
Rails ⇔ ユーザー間のリクエスト・レスポンスを司っている。
「あれやって、これやって」と指示している上司のようなイメージ。
コントローラーにはRailsにおけるデータの表示や保存、削除といった処理を
行う「７つのアクション」というものが存在する。

# 最後に
今回、初めてQiitaに投稿しましたが正直にいって自分がQiitaのような不特定多数が
閲覧できる場に記事を投稿するなんて想像していませんでした。
極力、簡素に分かりやすく書いているつもりですがこうして人に見せる記事を書いていくことで
自分の中にある知識などをより上手く言語化できるようになれたらと思います。
数年後の自分がこの記事を読み返したら「下手だったな〜」と笑えるくらい成長できるように
精進していきたいと思います。
Raspberry PiにPython3.9をインストールする

###Raspberry PiにPython3.9をインストールする
0.準備
1.ソースのダウンロード
2.ダウンロードしたソースの展開
3.コンパイル＆インストール
4.バージョン確認

```
#準備
 sudo apt-get update
 sudo apt-get upgrade -y
#ソースのダウンロード
 wget https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz
#ダウンロードしたソースの展開
tar zxvf Python-3.9.4.tgz
#コンパイル＆インストール
 cd Python-3.9.4
 ./configure
 make
 sudo make install
#バージョン確認
 python3.9 -v
```

```
pi@raspberrypi:~/Python-3.9.4 $ python3.9 -V
Python 3.9.4
```
MySQLのSQL文の書き方 メモ

# CREATE TABLE
```sql
CREATE TABLE IF NOT EXISTS users(
    id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name varchar(30) NOT NULL,
    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```

# ALTER TABLE
## カラム追加

```sql
ALTER TABLE
    users
ADD
    COLUMN カラム名 INT UNSIGNED NOT NULL;

-- 複数追加
ALTER TABLE
    users
ADD
    COLUMN カラム名 INT UNSIGNED NOT NULL
    COLUMN カラム名 VARCHAR(255);

```

## FOREIGN KEY追加

```sql
ALTER TABLE
    users
ADD
    COLUMN usersの参照元にするカラム名 INT UNSIGNED NOT NULL
ADD
    CONSTRAINT フォーリンキー名 FOREIGN KEY (usersの参照元にするカラム名)
    REFERENCES 参照するテーブル (参照するテーブルのカラム)
    ON DELETE CASCADE
    ON UPDATE CASCADE;
```

## カラム削除

```sql
ALTER TABLE
    users
DROP
    COLUMN カラム名;

-- 複数削除
ALTER TABLE
    users
DROP
    COLUMN カラム名,
DROP 
    COLUMN カラム名;

```

## FOREIGN KEY削除

```sql
ALTER TABLE
    users
DROP
    CONSTRAINT フォーリンキー名 FOREIGN KEY (usersの参照元にするカラム名)
    REFERENCES 参照するテーブル (参照するテーブルのカラム)
    ON DELETE CASCADE
    ON UPDATE CASCADE
DROP
    COLUMN usersの参照元にするカラム名 INT UNSIGNED NOT NULL;
;
```
Noto Font CJKをOTFからTTFへ変換する方法

## OTFからTTFへ変換する方法
巷に溢れているOTFからTTFの変換方法は、サブセット化を行ってTTFを作成する方法です
この記事ではOTFからサブセット化せずに、TTFを作成する方法を紹介したいと思います
### 前提
NotoFontCJKをサブセット化せずに、フォントを削らないでTTFファイルを利用したい人向け

### 成果物
NotoFontCJKのTTFファイル約30MB

### 必要なツール/ファイル
[birdfont](https://birdfont.org/)
[NotoFontCJK日本語](https://www.google.com/get/noto/help/cjk/)

## 手順

### birdfontにOTFファイルを読み込ませる
```
後で書く
```
### birdfontからTTFファイルをエクスポートする
```
後で書く
```

FontForgeを使ってもファイル変換できなかったときは絶望しました
この記事が誰かの時短になれば幸いです

##　宣伝
ツイッターもやってます
技術や製品開発に関する事などを呟いてますので、フォローお願いします
https://twitter.com/wkyIghw8MlLpyJE
Terraform で Azure 仮想マシンのカスタムスクリプトを書く

# はじめに

Azure には、Linux 等の仮想マシンを構築する際に特権ユーザーで初期スクリプト（カスタムスクリプト）を実行する仕組みがあります。
Terraform では  [azurerm_virtual_machine_extension](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_machine_extension) でカスタムスクリプトを設定できます。
azurerm_virtual_machine_extension の書き方に難儀したので、記録しておきます。

# Linux の場合

azurerm_virtual_machine_extension で module があるディレクトリの直下に作成した `.sh` のプレースホルダーを変換しながらに読み込みます。

```main.tf
resource "azurerm_virtual_machine_extension" "custom" {
    name                 = "CustomScript"
    virtual_machine_id   = azurerm_linux_virtual_machine.vm.id
    publisher            = "Microsoft.Azure.Extensions"
    type                 = "CustomScript"
    type_handler_version = "2.0"

    settings = <<-SETTINGS
        {"script": "${base64encode(templatefile("${path.module}/customscript.sh", {
            data_disk_lun_01 = azurerm_virtual_machine_data_disk_attachment.vmdda01.lun
            data_disk_lun_02 = azurerm_virtual_machine_data_disk_attachment.vmdda02.lun
        }))}"}
    SETTINGS
}
```

`.sh` ではプレースホルダーを `${変数名}` の形式で書きます。なお、`.sh` 内の変数は、`${変数名}` を使うとプレースホルダーと勘違いされてエラーになるため、`$変数名` で参照します。

```${path.module}/customscript.sh
DIR_DATADRIVE=/datadrive01
DISKNAME=/dev/$(dmesg | grep SCSI | grep 3:0:0:${data_disk_lun_01} | sed s/^.*\\[//g | sed s/\\].*//g)
sudo mkfs.ext4 $DISKNAME
partprobe $DISKNAME
sudo mkdir $DIR_DATADRIVE
sudo mount $DISKNAME $DIR_DATADRIVE
```

# Windows の場合

Windows の場合、PowerShell でカスタムスクリプトを書きます。Windows には、スクリプトをそのまま渡すのではなく、実行コマンドを渡します。実行コマンドがやや複雑なので、プレースホルダーの変換は `template_file` に外出ししています。

```main.tf
data "template_file" "customscript" {
    template = file("${path.module}/customscript.ps1")
    vars = {
        proxy_server = var.vm_setting.proxy.server
        proxy_port   = var.vm_setting.proxy.port
    }
}

resource "azurerm_virtual_machine_extension" "custom" {
    virtual_machine_id   = azurerm_windows_virtual_machine.vm.id
    name                 = "CustomScript"
    publisher            = "Microsoft.Compute"
    type                 = "CustomScriptExtension"
    type_handler_version = "1.10"

    protected_settings = <<SETTINGS
        {
            "commandToExecute": "powershell -command \"[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('${base64encode(data.template_file.customscript.rendered)}')) | Out-File -filepath customscript.ps1\" && powershell -ExecutionPolicy Unrestricted -File customscript.ps1"
        }
    SETTINGS
}
```
文字コード指定したHTMLファイルが、ブラウザで文字化けした件について

#はじめに
こんにちは。
先日、文字コードをShift-JISで指定したHTMLファイルをブラウザで開いたところ、文字化けを起こしてしまいました。ここではその失敗談と解決策を書き留めます。

#HTMLで文字コードを指定する方法
HTMLで文字コードを指定する方法は簡単。HTMLファイルのhead開始タグのあとに、文字コードを指定するための一文を書き加えます。たとえばutf-8で指定するならこのように、

```
<meta charset = "utf-8">
```
meta要素でcharset属性を使用することで、文字コードを指定できます。
実際に以下のHTMLファイル("makuranosousi.html")をブラウザで開いてみます。

```html:makuranosousi.html
<!DOCTYPE html>
<html lang = "ja">
	<head>
		<meta charset = "utf-8">
        <title>枕草子</title>
	</head>
	<body>
        <p>春はあけぼの。やうやう白くなりゆく、山ぎはすこしあかりて、むらさきだちたる雲のほそくたなびきたる。</p>
		<p>夏は...</p>
	</body>
</html>

```
ブラウザで開くと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280080/7abb5df6-adac-57eb-4dbe-e74db989db15.png)
しっかりと文字が表示されていることが確認できます。

#文字化けの発生
つづいて、先程文字コードをutf-8で指定していたところを、Shift-JISに変えてブラウザで開いてみます。

```
<meta charset = "Shift-JIS">
```
これをブラウザで開いてみたところ、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280080/e7af4ffa-1a6e-5a43-b6b1-706cbfdc64a8.png)
見事に文字化けが発生してしまいました。
なぜShift-JISで文字コードをしっかりと指定したのに、文字化けしてしまったのでしょうか。

#原因と解決策
この文字化けの原因は、
ファイルを保存する際に使用した文字コードと、ブラウザがファイルを読み込むために指定した文字コードが異なっていたことにありました。

私がmakuranosousi.htmlのファイルをutf-8で保存してしまっていたので、ブラウザで開くと文字化けが起きたというわけです。

これを解決するためには、
makuranosousi.htmlのファイルを文字コードShift-JISを使用して保存します。ファイル保存に使用する文字コードは、テキストエディタの設定から変更することができます。

ちなみにVScodeやAtomではファイルを開いた際に、右下のバーに使用している文字コードが表示されるので、そこをクリックして変更することができます。
![Inkedvscode_makuranosousi_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1280080/913720ec-7d18-5146-b269-9af063f6736c.jpeg)
お使いのテキストエディタの機能で確認してみてください。エディタでShift-JISに変更して保存したあと、再度ブラウザで読み込んでみると文字化けが解消されたことが確認できるはずです。

最近の文字コードではutf-8が主流なので、基本的にutf-8を選択しておくことをおすすめします。みなさんもファイルを保存する際の文字コードには気をつけましょう。

>「HTMLファイルを保存する際に使用する文字コード」と、
「HTMLファイル内で指定する文字コード」
を一致させる。
iTerm2でコピーモードとの再会

# 2019年、夏、こいつと出会った
やけに暑い日々の中、
なにかの操作ミスで突然現れたこいつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/ea6bef6d-f8cb-8f70-9b25-296406ceb748.png)
名前もわからなかったので、カクテルグラスと名付けていた
名前がわからないんじゃ、調べようもない
当然`カクテルグラス　カーソル`で、検索ヒットするわけもなく…

どうやってこのカーソルになったかもわからないので
もとのカーソルに戻す方法もわからなかった

# 2020年、春、カクテルグラスになったら画面を閉じて、また開いた日々
いつもより長めに桜が咲いていたんじゃないかと記憶している
またこいつと出会うことになる、何度も、だ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/7954d360-e847-cc04-7eb6-16adf81779f0.png)
こいっつってば、画面を縦横無尽に移動することを知った
どうやら、`Cmd + Shift + C` ででてくることがわかった
`Cocktail（カクテル）`も頭文字は`C`だ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/abe7b33c-3eb5-e3a8-16f6-0693efdb4650.png)


# 2020年、冬、またこいつと再会する、もう怖くない
今年は雪があまり降らないな、と、空を見上げたりもした
操作ミスでこいつに再会する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/6afd5337-6eb4-cf3d-b69e-284b34a4f0eb.png)
だけど、もう一度`Cmd + Shift + C`を押下すればもとに戻ることを知ったため
怖くなくなっていた

（しかし、こいつはなんのために生まれてきたのだろう…？）
そう思いながら、私は`Cmd + Shift + C` を押下し、
もとのこのカーソルに戻すのだった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/e7665f89-047f-6930-66b1-9b4e881e85bd.png)
その日は少し多めに点滅していた
まるで私に雪を見せてくれているかのように

# 2021年、春、こいつの機能を知る
今年の桜は早めに散ってしまったな、と、ひとりごちながら、コンビニから帰ってきた
操作ミスも少なくなっていたので、忘れてかけていたが
またこいつと再会する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/a976c79b-3888-bb61-b2cd-bd7d51222756.png)
そういえば、`Cmd + Shift + C` だっけ
`C` ということはコピーに関することなのかな
気づくのがおそすぎた私である
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/8a8dd93c-e4ce-2316-28bc-001a2fe069d6.png)
コピーモード…？
ようやく検索でヒットするであろう単語を知るのである

折も折、ファイル名達をコピーし、シートに一覧とする作業の中、
このコピーモードを使用してみる

# `Cmd + Shift + C`で`コピーモード`にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/0a21d787-7cc0-8964-2be8-c6f79a8e86d7.png)
また、会ったな

# 十字キーもしくはVim操作での上下左右で画面を縦横無尽に動かし、コピーしたい箇所に向かわせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/735e4c76-5fb6-31ba-c02e-c14e832708e6.png)
ひゃほい

# `v`を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/e6ebcebe-2672-e174-942d-d5a6951dc94f.png)
なんだか少し色が変わった気がする
さしずめギムレットが注がれたようである
この機能を知ったことを言いたかったがために、
長々とこの文章を書いてきたのである

`Cmd + c`で、選択された（色の変わった）箇所がコピーされる
`Ctrl + v`で、短径選択、`Shift + V`で行選択、Vim操作と同じだ

### 2021年、春、新たな知識を得る、そして桜はまた来年、咲くのである
[Symbol]ハーベストをメールとSlackで通知してくれるSymbol Watcherを作りました

![スクリーンショット 2021-04-05 15.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/fcfb9cb5-3659-c9a7-9431-07a015d5916b.png)

# はじめに
ハーベストしていますか？まだしていませんか？
気になって毎回ウォレットを確認したりしていませんか？

私もずっと気になって夜中にふと目覚めるとハーベストしていないか確認してしまうなんて事が多々ありました。

今回はそんな悩みを解決するべくハーベストをメールとSlackで通知してくれるツールを作成しました。
よかったら使ってみてくださいm(_ _)m

ツールはこちら
https://symbol-tool-sesp4y4epa-an.a.run.app/symbol/Harvest/notification

# メール通知の使い方

メール通知は至って簡単です。

## 自分のハーベストしているアドレスをコピーして
![スクリーンショット_2021-04-05_15_09_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/dc161dee-e74e-050b-4844-46709f28ec66.png)

Symbolアドレスを入れます
**ノード管理者の人はbeneficiaryAddressを入れるといいですね！** 
**間違っても秘密鍵を入れないでください** 

![スクリーンショット_2021-04-05_15_06_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/1496530f-84a8-b6a3-4713-cc0910cba16c.png)


## 通知依頼を行うボタンを押すとこんなメールが届きます

![スクリーンショット_2021-04-05_15_13_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/37dba381-18a8-59e5-175c-cae896b1ea28.png)

URLをクリックするだけで通知がONになります

![スクリーンショット_2021-04-05_15_17_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/2fe873aa-b109-74e8-224b-5534cf3274d8.png)


## 通知内容
![スクリーンショット_2021-04-05_15_19_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/799dfd74-2031-9a97-0276-e6286125d7eb.png)

こんな内容が通知されます。
通知をとめたい場合は一番下のURLをクリックしてくれればそのまま通知停止となります
再度通知を始めたい場合は最初からやり直してください

（後々メールに紐づいているSymbolアドレス一覧を送ってくれる機能を作る予定です)


# Salck通知の使い方

Slackの通知はIncoming Webhookを使用して通知しています。
使い方はたくさん記事がありますので調べてみてください

・ワークスペースを作成
・チャンネルを作成
・Appを作成して

ここまでは割愛します

## Incoming Webhookを有効化
![スクリーンショット 2021-04-05 15.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/c223d0f8-1695-bc20-5b23-5bd9b670041c.png)

## チャンネルのwebhookURLをコピー
![スクリーンショット_2021-04-05_15_31_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/ef16c591-7600-91d6-5367-48068dc67bb1.png)

![スクリーンショット_2021-04-05_15_34_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/dadd5018-b5ed-9463-2774-aec1692ed862.png)

## あとはメールと同じ内容がSlackに届くので認証すれば通知が届きます

認証Slack
![スクリーンショット_2021-04-05_15_36_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/9b0ebc26-2463-4fd9-af31-9fbccddb83b3.png)


![スクリーンショット_2021-04-05_15_40_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/25bde602-e4d6-28b0-b873-8a7dd82de733.png)


# 最後に
ハーベストしたのに通知が届かない！
使い方がわからない！などありましたら作成者情報よりDMをもらえればと思います。

それでは良いハーベストライフをお送りください
起動するたびにクラウドのインスタンスのIP変わっちゃうの毎回調べるのめんどくさいよって時

# 毎回取得する方法

instance id で毎回 ip 取得して ProxyCommand で netcat で繋ぐ。
１度繋いだら作業終了まで繋ぎっぱなしの場合とか。

aws ec2 ならこんな感じ。

```bash:~/.ssh/config
Host your-instance
	User ec2-user
	IdentityFile ~/.ssh/your-instance.pem
	StrictHostKeyChecking no
	UserKnownHostsFile=/dev/null
	ProxyCommand nc $(aws ec2 describe-instances --instance-ids i-00000000000000000 --query "Reservations[*].Instances[*].{PublicIpAddress:PublicIpAddress}" --output text) %p
```

# ssh_config に出力する方法

頻繁に繋いだり切断したりを繰り返す場合は config に出力してしまうと良いかも。

```bash:tpl
# ${Name} ${InstanceId}
Host node
	HostName ${PublicIpAddress}
	User ec2-user
	IdentityFile ~/.ssh/${KeyName}.pem
	StrictHostKeyChecking no
	UserKnownHostsFile=/dev/null
```

```json:export.jq
.Reservations[0].Instances[0]
| {
  InstanceId,
  KeyName,
  PublicIpAddress,
  Name: ((.Tags[]?|select(.Key=="Name").Value) // .InstanceId),
}
| keys[] as $k | "\($k)=\(.[$k])"
```

```bash:bash
$ export $(aws ec2 describe-instances --instance-ids i-00000000000000000 | jq -r -f export.jq) && envsubst <tpl >your-instance.ssh
```

とかやると、こんな感じになるので、

```bash:your-instance.ssh
# your-instance i-00000000000000000
Host node
    HostName X.X.X.X
    User ec2-user
    IdentityFile ~/.ssh/your-instance.pem
    StrictHostKeyChecking no
    UserKnownHostsFile=/dev/null
```

-F で指定して ssh する。

```bash:bash
$ ssh -F your-instance.ssh node
```

# requirements

* みんな大好き jq
https://stedolan.github.io/jq/

* `envsubst` は gettext に入ってる
https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html
Rubocopの導入

# Rubocopの導入について

Rubocop（ルボコップ）はRubyの静的コード解析ツール。
「インデントが揃っていない」「余分な改行やスペースがある」などの指摘をRubyStyleGuideに基づいて行ってくれる。

Rubocopを導入することにより、レビューにかかる時間を減らし、コードの品質を担保できるようになる。


ターミナル上で、

```ruby:ターミナル
#Rubocopを実行
%  bundle exec rubocop
```
と実行するだけで、ターミナル上に吐き出してくれる。

## Rubocopの導入

まずは、Gemfileに以下を追記。

```Ruby:Gemfile
group :development do
  gem 'rubocop', require: false
end
```
次に「bundle install」を実行

```Ruby:ターミナル
%  bundle install
```

すると、以下のファイルが作成される

.rubocop.yml


次にRubocopの設定を記述するファイルを新規作成する。

```Ruby:ターミナル
%  touch .rubocop.yml
```

次にRubocopの設定を行う。

```Ruby:.rubocop.yml
AllCops:
# 除外するディレクトリ（自動生成されたファイル）
# デフォルト設定にある"vendor/**/*"が無効化されないように記述
 Exclude:
   - "vendor/**/*" # rubocop config/default.yml
   - "db/**/*"
   - "config/**/*"
   - "bin/*"
   - "node_modules/**/*"
   - "Gemfile"


# 1行あたりの文字数をチェックする
Layout/LineLength:
 Max: 130
# 下記ファイルはチェックの対象から外す
 Exclude:
   - "Rakefile"
   - "spec/rails_helper.rb"
   - "spec/spec_helper.rb"

# RSpecは1つのブロックあたりの行数が多くなるため、チェックの除外から外す
# ブロック内の行数をチェックする
Metrics/BlockLength:
 Exclude:
   - "spec/**/*"

# Assignment: 変数への代入
# Branch: メソッド呼び出し
# Condition: 条件文
# 上記項目をRubocopが計算して基準値を超えると警告を出す（上記頭文字をとって'Abc'）
Metrics/AbcSize:
 Max: 50

# メソッドの中身が複雑になっていないか、Rubocopが計算して基準値を超えると警告を出す
Metrics/PerceivedComplexity:
 Max: 8

# 循環的複雑度が高すぎないかをチェック（ifやforなどを1メソッド内で使いすぎている）
Metrics/CyclomaticComplexity:
 Max: 10

# メソッドの行数が多すぎないかをチェック
Metrics/MethodLength:
 Max: 30

# ネストが深すぎないかをチェック（if文のネストもチェック）
Metrics/BlockNesting:
 Max: 5

# クラスの行数をチェック（無効）
Metrics/ClassLength:
 Enabled: false

# 空メソッドの場合に、1行のスタイルにしない　NG例：def style1; end
Style/EmptyMethod:
 EnforcedStyle: expanded

# クラス内にクラスが定義されていないかチェック（無効）
Style/ClassAndModuleChildren:
 Enabled: false

# 日本語でのコメントを許可
Style/AsciiComments:
 Enabled: false

# クラスやモジュール定義前に、それらの説明書きがあるかをチェック（無効）
Style/Documentation:
 Enabled: false

# ％i（）構文を使用していないシンボルで構成される配列リテラルをチェック（無効）
Style/SymbolArray:
 Enabled: false

# 文字列に値が代入されて変わっていないかチェック（無効）
Style/FrozenStringLiteralComment:
 Enabled: false

# メソッドパラメータ名の最小文字数を設定
Naming/MethodParameterName:
 MinNameLength: 1
```
ダッシュボードのパフォーマンス改善

#複数のページ
ダッシュボードに複数のページが含まれている場合、インスペクタを各ページで実行します。インスペクタは現在のページの結果のみを提供します。

#インスペクタで表示されるデータ
![スクリーンショット 2021-04-05 15.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/d1857aad-a893-be14-cbbf-0f8ec848180f.png)

#Summer '19 以降
クエリにエラーがあって実行できない場合、ダッシュボードインスペクタ (1) を開き、エラーのあるクエリ (2) を選択します。[詳細を参照] ボタン (3) を使用して、バインド構文エラー、クエリレベルエラー、実行されたクエリの詳細情報を確認します。

#インスペクタでみれること
![スクリーンショット 2021-04-05 15.26.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385774/1aaf3bdd-8be7-9d83-c731-cbf8924eb672.png)

* 初期クエリ数
* 初期読み込み時間
* パフォーマンス要素
 * クエリの許容数
 * 結合する必要があるクエリがありません
 * 重複するクエリがありません




#参考文献
[ダッシュボードのパフォーマンスの最適化](https://dreamevent.secure.force.com/articleView?id=sf.bi_dashboards_inspector.htm&type=5)
[クエリの最適化](https://dreamevent.secure.force.com/articleView?id=sf.bi_dashboard_step_optimize.htm&type=5)
つぶやきBGP


# BGP (Border Gateway Protocol)

* AS（１つまたは複数のISPで構成されるネットワーク）間のルーティングを担うプロトコルです。
* ASから他のASへ至る経路のうち、経由するASのパスの数が最小となるようなルートを選択する**パスベクタ方式**を用いています。
* 静的な経路制御と比べて、自動で回線断や機器障害を検知し、トラフィックを迂回できるという利点があります。

## BGPメッセージ５種類

### OPEN

BGPセッション開始時に交換されるメッセージ。自AS番号、ルータID、BGPversionなどの情報を含みます。

### UPDATE

BGPの経路情報の交換に使用されるメッセージ。経路の追加や削除が発生した場合に送信されます。

### NOTIFICATION

BGPセッションの切断やエラーを検知した場合に送信されるメッセージです。

### KEEPALIVE

生存確認を行うときに交換されるメッセージ。通常、BGPルータの間で30秒間隔でやりとりし、相手側から90秒以上このメッセージを受信しない場合は、回線もしくは機器の故障と判断して経路情報を変更します。

### ROUTE-REFRESH

相手ルータに対しすべての経路情報を要求するメッセージです。

# 参考

* https://www.itbook.info/study/p14.html
スタッキングアグリゲータ概観

スタッキングアグリゲータとは、複数のモデルを組み合わせる方法。

パイプラインが線形にデータがモデルを通過していくのに対して、スタッキングアグリゲータはツリー上になる。

図にするとこうなる。

![figure2.pptx.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/2977ceb4-f9ff-a653-3248-cca59604f25a.jpeg)

要は、スタックが２段になると、その分入力を４分割（２＊２）する。

KNNとGBRからのそれぞれの出力をdf(data frame)にまとめ、ExtraTreeに入力する。

スタッキングアグリゲータは大変そうだ。

理由１：推定器関連のチューニング　←　製品レベルの話になってくるそうだ
理由２：アルゴリズムの組み合わせや特徴エンジニアリングに話になってくるそうだ

なので、この辺でやめておく。
PHP substr()の引数について

#引数についての考察

[substr](https://www.php.net/manual/ja/function.substr.php)

例）

```php

var_dump(substr('abcdef', 0, 4)); // "abcd"
var_dump(substr('abcdef', -3, 1)); // "d"
var_dump(substr('abcdef', -3, -1)); // "de"
var_dump(substr('abcdef', -3, -2)); // "d"
var_dump(substr('abcdef', -3, -3)); // ""
```

- 第一引数：対象文字列
- 第二引数：ポインタの位置
- 第三引数：ポインタから正の方向にn文字 or 文末から負の方向に移動し、オフセットから負の方向に移動した分を除いた文字を表示


第三引数が難しい印象だ
JS~mapの使い方~

今回はmapというメソッドの使い方について学習していきます。

#mapとは
このメソッドには配列から配列を取り出すことができます。また、もとにある配列を壊さずに新しい配列を作ることができます。引数では、もとの配列の各要素を受け取って、新たな配列の要素を返り値とすることができます。

```index.js
<script>
    'use strict'

    const numbers = [1,2,3];
    const upnumber = numbers.map((price) => {
     return price * 2
    });

    document.write(upnumber);
  </script>
```
return（返り値）▶与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列のことです。
今回はpriceの2倍の値が表示されているはずです。
![スクリーンショット 2021-04-05 14.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/70d71e12-2c2b-c7d2-77ea-88f3ceaf9f46.png)

mupは新しい配列が生成されるため、その配列を使わない場合は、mupは使いません。

上記のように書くことができますが、省略することもできます。

```index.js
 <script>
    'use strict'

    const numbers = [1,2,3];
    const upnumber = numbers.map(price => price * 2);

    document.write(upnumber);
  </script>
```
今回は引数はひとつなので、()は省略することができます。
Databricks と AWS の VPC ピアリング接続設定

##はじめに
今回は異なる AWS アカウント上に立てた RDS と Databricks を、ピアリング接続する方法について紹介したいと思います。
Databricks の下記のドキュメントを参考にしておりますので、詳細については下記リンク先を参照。

■リンク
・[VPC peering
](https://docs.databricks.com/administration-guide/cloud-configurations/aws/vpc-peering.html)


###前提条件
ピアリング接続を実施するにあたり、確認すべき項目があります。
少なくとも下記の2つは満たしていないと、VPC の構築からやり直す必要があるので気をつけましょう。

■ピアリング接続の条件
・接続する VPC は互いに異なる CIDR 範囲であること
・接続する VPC は同じリージョンにあること

今回ピアリング接続を実施する環境の情報は以下となります。

| AWSアカウント情報 | Databricks| RDS |CIDR範囲|リージョン|
|:---:|:---:|:---:|:-----:|:------:|
|AWSアカウントA |あり     |なし        　　　|AWSアカウントBと異なる|東京リージョン|
|AWSアカウントB |なし      |あり（Oracle RDS）|AWSアカウントAと異なる|東京リージョン|



##手順1
###AWSアカウントA
①Databricks 側のVPCコンソール画面で、左にある「ピアリング接続」をクリック
②「ピアリング接続の作成」をクリック
③必要情報を入力して作成。無事に作成できたら、「ピアリング接続の承認待ち」というステータスになるので、AWSアカウントB側で承認されるのを待つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/344b8066-3e89-64c2-a0ec-bf68a4d2f6e4.png)

###AWSアカウントB
①VPCコンソールの「ピアリング接続」タブを確認
②AWSアカウントAよりピアリング接続の承認依頼が来ているので（直ぐに表示されない場合があるので、まだ表示されてなかったら更新などして待つ）、表示されているピアリング接続をクリックし、「アクション」→「承認」と選択
③AWSアカウントAよりピアリング接続の承認依頼が来たのを確認したら、表示されているピアリング接続をクリックし「アクション」→「承認」と選択


##手順2
###AWSアカウントA
①VPCダッシュボードの「ピアリング接続」を選択
②承認されたピアリング接続を選択したら、「アクション」→「DNS編集」を選択
③「DNS解決を有効」にして保存

###AWSアカウントB
①VPC ダッシュボードの「ピアリング接続」を選択
②承認したピアリング接続を選択したら、「アクション」→「DNS編集」を選択
③「DNS 解決を有効」にして保存



##手順3
###AWSアカウントA
①VPC ダッシュボードにある「ルートテーブル」を選択し、該当 VPC のルートテーブルを検索
②ルートテーブルの「編集」を選択し、ピアリング接続している AWS アカウントB の VPC の CIDR 範囲を「送信先」に入力し、「ターゲット」に作成したピアリングを選択して保存


###AWSアカウントB
①VPC ダッシュボードにある「ルートテーブル」を選択し、該当 VPC のルートテーブルを検索
②ルートテーブルの「編集」を選択し、ピアリング接続している AWS アカウントA の VPC の CIDR 範囲を「送信先」に入力し、「ターゲット」に作成したピアリングを選択して保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/2b07bc49-f9e6-b57c-3734-7307a825cf37.png)

##手順4
###AWSアカウントA
①VPCダッシュボードで「セキュリティグループ」を選択し、Databricks と連携している VPC の ID で検索をかける
②検索をかけた際、セキュリティグループの説明の部分に「Unmanaged security group 」と記載があるセキュリティグループのIDをコピーして、アカウントB側に情報を提供する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/f9d6bf61-65e2-05ca-23f3-2fc0550dae9b.png)


###AWSアカウントB
①VPCダッシュボードで「セキュリティグループ」を選択し、RDSを構築している VPC の ID で検索をかける
②検索して出てきたセキュリティグループを選択し、「編集」を選択し、「ルールの追加」を選択
③「タイプ」には「Oracle-RDS」 を選択し、AWSアカウントA側で提供された「Unmanaged security group」の ID を「ソース」に入れて保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/a0b0f348-4e1f-6cee-f542-74b0ff28f109.png)

##手順5 
###AWSアカウントA
①Databricks 側でクラスターを用意
②notebook で下記のコマンドを入力して、疎通を確認

```
%sh nc -zv <hostname> <port>
```
・hostname：RDS のエンドポイント
・port：ポート番号（Oracle の場合は1521）


##おわりに
これで、異なる AWS アカウントにある Databricks と RDS ピアリング接続することが可能となりました。
【VBA - 備忘録】メール送信

##初期設定
コードを書く前に、Outlookのアカウントを作り、OutlookのオブジェクトライブラリーをVBAに読み込む必要がある

以下は、Outlookのオブジェクトライブラリの読み込み方

（１）「ツール」から「参照設定」に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360425/bff6632c-b206-74c2-eb2b-6d6746d8d0df.png)
（２）参照設定で、Microsoft Outlook 16.0 Object Libraryを選択し、OKボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360425/18ed129e-43fd-7858-9fb6-87ea8cd2cf8d.png)

##MailItemオブジェクトの指定

まずは、変数Outlookオブジェクトを作成し、さらにそれに対して、変数MailItemオブジェクトを指定する

```vb
Sub SendEmail()
Dim OutlookObj As Outlook.Application
Dim MailItemObj As Outlook.MailItem

Set OutlookObj = New Outlook.Application
Set MailItemObj = OutlookObj.CreateItem(olMailItem)
End Sub
```

##各設定
MailItemオブジェクトに対して宛先や本文などを設定する

```vb
Sub SendEmail()
Dim OutlookObj As Outlook.Application
Dim MailItemObj As Outlook.MailItem

Set OutlookObj = New Outlook.Application
Set MailItemObj = OutlookObj.CreateItem(olMailItem)

With MailItemObj
 .To = "メールの宛先"
 .Subject = "メールの件名"
 .Body = "メールの本文"
 .Send '送信動作
End With
End Sub
```

##HTMLメールの設定方法
各MailItemオブジェクトに対して、HTMLメールを設定する

```vb
'Sub SendEmail() '既に説明済のコードはコメントアウトしています

'Dim OutlookObj As Outlook.Application
'Dim MailItemObj As Outlook.MailItem

'Set OutlookObj = New Outlook.Application
'Set MailItemObj = OutlookObj.CreateItem(olMailItem)

'With MailItemObj
' .To = "メールの宛先"
' .Subject = "メールの件名"
 .BodyFormat = olFormatHTML 'HTMLメールと設定
 .HTMLBody = "HTMLメールの本文" ' "<h1>Hello World</h1>" の様に、HTMLで書く
' .Send '送信動作
'End With
'End Sub
```
##ファイルを添付する
ファイルを添付するには、ファイルまでのパスを作成し、それをMailItemオブジェクトに対して添付設定として加えます。

```vb
'Sub SendEmail() '既に説明済のコードはコメントアウトしています

'Dim OutlookObj As Outlook.Application
'Dim MailItemObj As Outlook.MailItem

'Set OutlookObj = New Outlook.Application
'Set MailItemObj = OutlookObj.CreateItem(olMailItem)

Dim attachmentPath As String
    attachmentPath = "C:\Desktop\attachment.pdf" 'ファイルまでのパスに応じて変える

'With MailItemObj
' .To = "メールの宛先"
' .Subject = "メールの件名"
' .BodyFormat = olFormatHTML 'HTMLメールと設定
' .HTMLBody = "HTMLメールの本文" ' "<h1>Hello World</h1>" の様に、HTMLで書く
　.Attachments.Add (attachmentPath)
' .Send '送信動作
'End With
'End Sub
```
【Raspi4】OAK-D　VS　市販USBカメラ 処理速度比較

![S__23494662.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040271/424aace7-8482-a037-b368-63afb30e71c2.jpeg)
ラズパイ４との組み合わせでOAK-DとUSBCAMそれぞれで処理速度にどれほど差が出るか比較。

既知の通りGPU非搭載のラズパイでは機械学習を利用した物体検出処理が遅く実用場面は限られる。

#USBカメラ+　Raspberry pi4　実行結果
こちらはTensor Flowで作成された人工知能モデルを利用したサンプルコードmobilenet SSDを利用した実行結果。



![S__23494663.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040271/8b43f711-aeb2-8c34-c890-c2384dfc209e.jpeg)

判定までに288.89ms

産業用ロボットのピッキング処理に利用しようと考えていますが、
この画像処理だけでこれだけの時間がかかるのは実用面で不具合があります。

#OAK-D +　Raspberry pi4　実行結果
こちらはOpenCV のサンプルコードdepthai_demo.pyを利用した実行結果

![S__23494666.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040271/96196f4f-f5f9-cdcd-e416-c29031ddaab6.jpeg)

FPS30(約33.3ms)
ラズパイとのセットでの環境でも前評判通りの数値が出ました。


USBカメラでもマイコンをJetsonNano等のGPU搭載機にすれば
処理速度は速くなりますが、とりあえず、OAK-Dとラズパイのセットで
産業用ロボットによる化粧品容器ピッキングの実用面で通用するか
テストしたいと思います。
PHP ヒアドキュメントとナウドキュメントの書き方

#ヒアドキュメント


[ヒアドキュメント　PHPドキュメント](https://www.php.net/manual/ja/language.types.string.php)
![スクリーンショット 2021-04-05 14.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/3d807f5b-a4c6-ef67-f6ef-929a479119a5.png)

###例）

```php
$name = '太郎';
print <<<HERE
これはヒアドキュメントです。
改行も効きます。変数はこう入れます→私の名前は"$name"です。
終わりのIDはインデントはしてはいけません。セミコロンを忘れずに。
HERE;

//結果
/*
これはヒアドキュメントです。
改行も効きます。変数はこう入れます→私の名前は"太郎"です。
終わりのIDはインデントはしてはいけません。セミコロンを忘れずに。
*/
```

###注意点
・ヒアドキュメントの開始と終了のID（今回でいうtestID）は英数字、アンダースコアを含んだ数字ではない文字またはアンダースコアで開始する。
つまりこの内容を守れば自由に設定可能。
・変数は```" "```で括ると使用可能。
・よくある記述は

- EOD（End of Document）
- EOM（End of Message）
- EOF（End of File）

・終了IDはインデントしてはいけない（以下公式ドキュメントより）
![スクリーンショット 2021-04-05 14.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/faffedf8-6911-7466-c645-d54f038bfdc8.png)

#ナウドキュメント
- ヒアドキュメントがダブルクォートで囲んだ文字列として扱われるのに対して、 Nowdoc はシングルクォートで囲んだ文字列として扱われる
- Nowdoc の書き方は、ヒアドキュメントと同じように <<< を使用。 しかし、その後に続く識別子をシングルクォートで囲んで <<<'EOT' のようにする
- ヒアドキュメントの識別子に関する決まりがすべて Nowdoc の識別子にも当てはまる
- 特に終了識別子の書き方に関する決まりに注意する(インデント不可の件）

###例）
```php
print <<<'NOW'
これはナウドキュメントです。
改行も効きます。変数は文字列になります。→私の名前は"$name"です。
終わりのIDはインデントはしてはいけません。セミコロンを忘れずに。
NOW;

//結果
/*
これはナウドキュメントです。
改行も効きます。変数は文字列になります。→私の名前は"$name"です。
終わりのIDはインデントはしてはいけません。セミコロンを忘れずに。
*/
```


以上。
Unityバグ取り生配信#01まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/06c9a151-3298-d0ac-1ab6-37b06efc240c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/c1771f49-a6f8-0613-1456-f6055693cad4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/9cb7f43b-4b3b-cff4-0acd-2a912a656414.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/1be8a1c6-4070-764a-1030-f1d3f46acb8e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/c09167b7-5a0e-304e-c774-8777d13ef37b.png)
【Windows】Windowsに表示される組織名と使用者名の変更方法【cmd】

regeditで

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion

組織名：RegisterdOrganization
使用者名：RegisterdOwner

を編集する。

```cmd:コマンドによる実行
REM 組織名の編集
reg add HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion /v RegisterdOrganization /t REG_SZ /d 組織名

reg add HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion /v RegisterdOwner /t REG_SZ /d 使用者名 
```
VR空間でのUI



https://assetstore.unity.com/packages/tools/gui/curved-ui-vr-ready-solution-to-bend-warp-your-canvas-53258


https://qiita.com/HamachiTaro/items/ce63e39008d0517981c2


https://kan-kikuchi.hatenablog.com/entry/UI_VR

https://bibinbaleo.hatenablog.com/entry/2018/05/25/160027