OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでMetatrader5からヒストリカルデータをダウンロードする方法

# Metatrader5のダウンロード、設定
1. この[リンク](https://www.metatrader5.com/ja/download)からMetatrader5をダウンロードし、インストールしてください。
1. デモアカウントが存在するか確認し、存在しない場合デモアカウントを作成します。
![create-demo-account.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130763/6844d114-1f83-5fd1-6b73-38957d24ad3b.gif)
3. ツールからオプションを開き、チャートバーに移動します。
3. チャートバーにある一番下のチャート最大バー数のパラメーターをUnlimitedに変更します。
![change-max-bars-in-chart.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130763/28e824a7-73fe-a56f-1b36-c3d4bac42e9c.gif)

# Metatrader5パッケージのインストール
コンソールで以下のコマンドを実行し、Metatrader5パッケージをインストールしてください。
```console
pip install Metatrader5
```

# pythonでFXの履歴データをダウンロードする
```python
import MetaTrader5 as mt5
import pandas as pd

# MetaTrader5に接続する
init = mt5.initialize()
assert init

# EURUSDの1時間足で現在のバーから100のバーを取得する
r = mt5.copy_rates_from_pos("EURUSD", mt5.TIMEFRAME_H1, 0, 100)
# 取得したデータからDataFrameを作成する
df = pd.DataFrame(r)
# 秒での時間をdatetime形式に変換する
df['time']=pd.to_datetime(df['time'], unit='s')

# dfの最後の5行を表示する
print(df.tail())
```
```
                  time     open     high  ...  tick_volume  spread  real_volume
95 2022-02-28 05:00:00  1.11574  1.11608  ...         4243       0            0
96 2022-02-28 06:00:00  1.11507  1.11528  ...         2865       0            0
97 2022-02-28 07:00:00  1.11456  1.11586  ...         2616       0            0
98 2022-02-28 08:00:00  1.11565  1.11683  ...         4197       0            0
99 2022-02-28 09:00:00  1.11590  1.11762  ...         3957       0            0
```
```python
# CSVファイルとして保存する。
df.to_csv("EURUSDH1.csv")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130763/9975d9df-ffd5-d861-60ae-cff810f40fa0.png)
> [www.mql5.com](https://www.mql5.com/ja/docs/integration/python_metatrader5/mt5copyratesfrompos_py)から引用
Node.jsのバージョン管理 n でバージョンが切り替わらない

# 事象
Node.jsのローカル環境でのバージョン管理にはnというバージョン管理ツールがオススメという記事が多数あったので、インストールした。その際に、n　でインストールしたNodeバージョンに切り替わらなかった時の対応方法まとめ。　※ nのインストール方法は省略。

生じた現状は以下。

```
usr@usrMacBook-Pro ~ % n stable
   installed : v16.14.0 to /Users/ogasawarasatoru/.n/bin/node
      active : v17.0.1 at /usr/local/opt/nvm/versions/node/v17.0.1/bin/node
usr@usrMacBook-Pro ~ % node -v
v17.0.1
```
`n stable`でNodeのLTSをインストール後、`node -v`で確認すると、activeのバージョンが違う。

# 原因
どうやら、最初から入っていたnvmのNodeがactiveとして設定されていたようで、n でインストールしたnodeが適用されなかった。（これ自体は正常な動き）

```
usr@usrMacBook-Pro ~ % which node
/usr/local/opt/nvm/versions/node/v17.0.1/bin/node
```

ちなみにnの向き先は以下。
```
usr@usrMacBook-Pro ~ % which n
/usr/local/bin/n
```

# 解決方法
ネットの記事を読む限り、nvmにシンボリックリンクを貼って向き先をnに変えたり、nvmの読み込み設定を削除したり、といった方法があった。自分の場合は、nvmをアンインストール、設定削除で解決。

1. bash_profileからnvmの設定削除。
1. bash_profile更新
1. nvmのアンインストール
1. nodeを入れてみて、バージョンを確認して終了

### bash_profileからnvmの設定削除
エディターで`.bash_profile`を開いてnvmの記述を削除でもオッケー。ターミナルから実行する場合は、
```
$ vi ~/.bash_profile
```
で`.bash_profile`を開く。[vimコマンド](https://qiita.com/colorrabbit/items/755cfbb0e97d48280775)を使って↓を削除。
```
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
```
保存して編集完了(`escキー` → `:`　→　`w`+`q`)

### bash_profile更新
```
source ~/.bash_profile
```
### nvmのアンインストール
nvmをアンインストールするにはディレクトリを削除すれば良いとのこと。

```
usr@usrMacBook-Pro ~ % echo $NVM_DIR
/usr/local/opt/nvm
usr@usrMacBook-Pro ~ % rm -rf $NVM_DIR
```
> 参考: [nvm(Node Version Manager)のアンインストール(削除)](https://webree.jp/article/nvm-uninstall/)

### nodeを入れてみて、バージョンを確認して終了
```
usr@usrMacBook-Pro ~ %　n stable
   installed : v16.14.0 (with npm 8.3.1)
usr@usrMacBook-Pro ~ %　node -v
v16.14.0
```
`active`が表記からなくなり、正常にインストール完了。nodeの向き先がnに変わった様子。
```
usr@usrMacBook-Pro ~ %　which node
/Users/username/.n/bin/node
usr@usrMacBook-Pro ~ %　which n 
/usr/local/bin/n
```

# 参考記事
> 1. [Node.js のバージョンが変わらなくてイラッとしたときの解消法](https://qiita.com/Kintech/items/36f3f930c0a6f0c2db96#%E8%A7%A3%E6%B1%BA%E6%B3%95)
> 1. [node js のバージョンアップができない...](https://teratail.com/questions/300386)
> 1. [n <version> command does not activate specified version](https://stackoverflow.com/questions/61109509/n-version-command-does-not-activate-specified-version)
> 1. [【ln】Linuxでファイルやディレクトリにリンクを作成するコマンド](https://uxmilk.jp/51271)
> 1. [開発用アプリケーションのインストール...](https://www.youtube.com/watch?v=a8E0H3fC_Bk)
mysql5.7での所有権エラーを直そう！！

# rails でmysqlを使ったらエラー出た。。

```
Mysql2::Error::ConnectionError (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)):
ERROR! The server quit without updating PID file (/usr/local/var/mysql/**.local.pid)
```
# 環境
	MySQL ： 5.7.37
	macOS  :  10.14.6
	ruby  :  2.7.2
	rails :  6.0.3

![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1385887/c415ecdf-9903-8e9e-7e07-4d1b44601273.png)

調べると、所有権に問題があるというので、ログインするため下のコマンドを試してみました。

## まずは、ログイン
```console
mysql -u root -p
```  

パスワードを何度打っても通らなかったので、パスワードがわからなくなったか、何らかの変更が加わったと思ったので、　mysql5.7を入れ直すことにしました。

***

まず入れ直すときに、大事なのはもともとあるファイルをしっかり削除することです。入れ直す場合、前のファイルが残っていると、エラーを引き起こし、スムーズにいかなくなる可能性があります。

※削除すると,DBの情報が削除されるので、大事な情報を入れている場合は気おつけてください。

### ファイル削除
```console
sudo rm -rf /usr/local/var/mysql
sudo rm -rf /usr/local/Cellar/mysql*
sudo rm -rf /usr/local/bin/mysql*
sudo rm -rf /usr/local/var/mysql*
sudo rm -rf /usr/local/etc/my.cnf
sudo rm -rf /usr/local/share/mysql*
sudo rm -rf /usr/local/opt/mysql*
sudo rm -rf /etc/my.cnf
```

### mysql.sock  mysql.sock.lock も削除する。
```console
cd /tmp
ls  # ファイル確認。
sudo rm -rf mysql.sock mysql.sock.lock 
```

プロセスを削除してください。

```console
ps aux | grep mysql  # 確認
kill -9 ???? # 権限を消す
```
プロセスは、自分が実行したプログラムのことです。
### mysql@5.7 アンインストールする。
```console
brew uninstall mysql@5.7
```
アンインストールされているか心配ならコマンドで確かめてみてください。
### mysql@5.7 インストールする。
```console
brew install mysql@5.7
which mysql #mysqlが入っているか確認
```

インストールした後パスというのを通さないと、スムーズに進まないので、しっかりとコマンドを打っておきましょう！！

### パスを通す。
```console
 echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
```
パスとは、、
macの中のメモ帳に書いておいて、いつでも取り出せるようにしておくということ。。

### パスを有効にするコマンド
```console
 source ~/.bash_profile
```
### ログイン
```console
mysql -u root -p     
```

ログインして、パスワードをしっかりと変更する。変更するコマンドはこれです。

### パスワード変更
```console
UPDATE user SET authentication_string=password('新しいパスワード') WHERE user='root';
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 1
```
### 変更を反映
```console
flush privileges;
Query OK, 0 rows affected (0.00 sec)
```
### データベースを作る。
```console
rails db:create 
```
めちゃめちゃ大変だったと思いますが、これで完成です！！

### ローカルサーバーを立ち上げる。
```console
rails s 
```

特にエラーの内容がよくわからない場合、結構さまようと思いますが、落ち着いて検索し、メモしつつ整理していけば、解決できることが多いので、落ち着いて頑張ってください！！

## お世話になった記事
 https://gonzaemon.site/posts/2019/10/04/_2.html

 https://qiita.com/ksugawara61/items/d8d69b7d57a3afcef980

 https://qiita.com/ksugawara61/items/d8d69b7d57a3afcef980

 https://weblabo.oscasierra.net/mysql-57-init-setup/
 
 https://gonzaemon.site/posts/2019/10/04/_2.html
ワークフローエンジンActivitiで詰まった話

# 目次
[1. まずActivitiとは](#1-まずActivitiとは)
[2. 今回詰まったこと](#2-今回詰まったこと)
[3. 解決法](#3-解決法)

# 1. まずActivitiとは
ActivitiとはJavaで実装されたオープンソースのワークフローエンジンです。
仕事や業務の流れを制御してくれて、フローを簡単に構築してくれる便利なツールです。
フリーで提供されているので、人気も高いそうです！

# 2. 今回詰まったこと
Activitiを構成するXMLファイルにて、ワークフローのタスク名のラベル表示を変更したのですが、修正後に画面をF5で更新しても変更が全く反映されず。。。
修正箇所は絶対に合っているのになぜ。。。。

★修正箇所★
activiti:candidateGroups="作業内容承認"
↓
activiti:candidateGroups="作業内容\n(承認)"
```
<userTask id="作業内容承認" name="承認" activiti:candidateUsers="${CeoRole}" activiti:candidateGroups="作業内容\n(承認)" activiti:assignee="${assignee}">
      <extensionElements>
          <activiti:formProperty id="" type="enum" variable="action" required="true">
              <activiti:value id="back" name="差戻し"></activiti:value>
              <activiti:value id="approve" name="承認"></activiti:value>
              </activiti:formProperty>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${CeoRole}" activiti:elementVariable="assignee">
          <completionCondition>${action!='approve'}</completionCondition>
      </multiInstanceLoopCharacteristics>
</userTask>
```

# 3. 解決法
画面更新ではなく、ワークフローを新たに申請しなおすことで、変更が反映されました！！！

というのも、まずActivitiが提供するワークフローの仕組みを理解できていませんでした。。
Activitiを使用して作成したワークフローは、
ワークフローを開始(申請)すると、その時点でのXMLの内容が"ACT_xxxx"というテーブルにそのまま保存されます。
(このテーブルは1つの申請に対して1つ作成されます。)
一度申請したものはこのテーブルの中のXMLの内容をもとにフローが進んでいくため、
画面だけ更新しても変更が反映されなかったということでした。

なので、新たに申請することで、最新状態のXMLの内容でワークフローを進めることができたということです！

単純なことでしたが、もし誰かのお役に立てれば嬉しいです！
読んでいただきありがとうございましたm(__)m
画面遷移するとjQueryが動かないときはTurbolinksが悪さをしているかもしれない

**環境:**
Ruby 2.7.3
Rails 6.1.4.4
# **問題**
jQueryを使って、例えば「ボタンをクリックしたらモーダルウィンドウが表示される」といったアクションを実装したとする。すると、最初にページに訪れたときは正常に動くのに、ページ遷移を挟んだら動かなくなり、ページをリロードするとまた動き出す...といった不具合が発生する。

サンプルはこんな形↓(「open」というIDを持つオブジェクトをクリックすると、モーダルウィンドウが表示されるような処理)

```jsx
$(function () {

    $("#open").click(function(){
					-----処理------
        });

});
```

# **原因**

**Turbolinksがjsの読み込みを邪魔している。**

まず、

```jsx
$(function() {});
```

1行目のこれはコードの省略形で、正確に書くと以下のようになる。

```jsx
$(document).ready(function {

//処理

});
```

これが意味するのは、「ページが読み込まれたら、以下のファンクションを起動します」というもので、謂わばトリガー条件を書いていることになる。ただ、ここでTurbolinksの仕様と競合してしまう。

Turbolinksでは、ページを遷移する際にすべてを再度読み込むのではなく、headやbodyの中身だけをリロードすることによって処理の高速化を実現している(詳しくいえばもっと工程があるが割愛する)。そのため、Turbolinksで遷移したときはJSが読み込まれない問題が発生する。

# **解決方法**

### **1)jQueryを丁寧に記述する**

```jsx
$(document).ready(function {

//処理

});
```

これが諸悪の根源なので、

```jsx
$(document).on('turbolinks:load', function(){

//処理

});
```

と、「Turbolinksでロードが入ったときに発火させる」と丁寧に書いてあげれば解決。

### **2)Turbolinksを切る**

そもそもTurbolinksがなければ問題は起きないので、application.jsでturbolinksを無効化しておく(強硬手段ではある)

```jsx
// 変更前
//= require turbolinks　

// 変更後
// require turbolinks
```

### 参考記事
https://qiita.com/r_ishimori/items/35d8676d73779549ebc8

https://kray.jp/blog/must-know-about-turbolinks/
ARC136 D問題をRuby(NArray)で計算

[AtCoder Regular Contest 136 : D - Without Carry](https://atcoder.jp/contests/arc136/tasks/arc136_d)

私のレベルだと普段はこの辺の問題は解けないのですが、これに関してはうまくいった（比較的簡単な方法で解けた）のでメモしておきます。なお、[公式解説](https://atcoder.jp/contests/arc136/editorial/3465)のほうは難しくてまだ理解できていません。

## コード
Ruby で多次元配列を簡単・高速に扱うために、 Numo::NArray を使っています。

```ruby
require 'numo/narray'

L = 6
S = 10**L - 1  # == 999999

n = gets.to_i
a = gets.split.map!(&:to_i)

na = Numo::UInt32.zeros(*Array.new(L, 10)).inplace!
a.each { |ai| na[ai] += 1 }
na.ndim.times { |k| na = na.cumsum(k) }

cnt = a.sum { |ai| na[S - ai] }
cnt -= na[S / 9 * 4]
cnt /= 2

puts cnt
```

各次元の大きさが 10 の L 次元配列 `na` を作り、その累積和を計算しています。計算量は O(N + L &middot; 10<sup>L</sup>) です。

## 考え方
簡単のため、最大2桁（L=2）で考えてみます。

以下の入力を例にとります。

```text:input
9
31 41 59 26 53 58 97 93 23
```

例えば `41` に足して繰り上がりの起きない数は `[31, 41, 26, 53, 58, 23]` の6つです。というのも、これらは `99 - 41 == 58` よりも **各桁で数字が小さい（または同じ）** ためです。

また、例えば「 `53` が繰り上がりを起こさないなら `[23, 31, 41]` も起こさない」ということが言えます。そのためより大きな数値には**その下の情報も合算しておく**のが良さそうです。今回の場合は**累積和**で簡単に作れます。

ある数 `s` よりも各桁で数字が小さい（または同じ）要素数を表にしてみます。各桁は別々に考えられるので、桁数ぶんの多次元配列を作ればいいです。

```ruby
#--- aの要素数を各桁の数字別にカウント ---#
Numo::UInt32#shape=[10,10]
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 1, 0, 0, 1, 0, 0, 0], 
 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 1, 0, 0, 0, 0, 1, 1], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 1, 0, 0, 0, 1, 0, 0]]

#--- その累積和 ---#
Numo::UInt32#shape=[10,10]
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 1, 1, 1, 2, 2, 2, 2], 
 [0, 1, 1, 2, 2, 2, 3, 3, 3, 3], 
 [0, 2, 2, 3, 3, 3, 4, 4, 4, 4], 
 [0, 2, 2, 4, 4, 4, 5, 5, 6, 7], 
 [0, 2, 2, 4, 4, 4, 5, 5, 6, 7], 
 [0, 2, 2, 4, 4, 4, 5, 5, 6, 7], 
 [0, 2, 2, 4, 4, 4, 5, 5, 6, 7], 
 [0, 2, 2, 5, 5, 5, 6, 7, 8, 9]]
```

この表を使うと、例えば `41` に足して繰り上がりの起きない数の個数は `na[9-4, 9-1] == 6` というふうに O(L) で求まります。全要素に対してカウントすると O(NL) です。間に合うか微妙ですが一旦これで行きます。

---

最後に設問に合わせてカウントを補正します。聞かれている個数は `i < j` の組のみですが、上の数え方だと `i == j` や `i > j` も含んでいます。

`i == j` というのは「自分同士を足して繰り上がりが起きない」ということです。これは全桁が 0〜4 だけの数値が該当します。まずはこの個数を引きます。（全要素に対して判定してもいいですが、既に累積和があるので `na[4, 4]` を参照すれば一発です。）

`i == j` を引いた後は、 `i < j` と `i > j` というふうに必ず二重カウントしています。なので2で割れば設問通りの個数が求まります。

## 表へのアクセス高速化
上の考え方で提出したら、いくつかTLEになってしまいました。累積和の計算部分は N に依らず O(L &middot; 10<sup>L</sup>) なので、与えられた数を L 桁に分解して多次元配列にアクセスするのが遅いようです。（Rubyなので尚更）

考えた表を見返してみると、各次元の大きさが 10 なので、 `na[5, 8]` というのは `na[58]` と同じことです。つまり**配列を1次元とみなしてアクセスすれば桁を分解する必要がありません**。 `na[9-4, 9-1]` も `na[99-41]` と書き直せます。これなら表へのアクセスは O(L) でなく O(1) で済みます。

C言語などであれば、最初から1次元配列として作っておき、累積和の計算時のみ擬似的に多次元配列として扱えばいいと思います。
※ 公式解説のコードは、結果的にこの累積和を計算しているのでしょうか？
inDesignでセクションマーカーを再設定したときに、柱が消えてしまう

inDesignで柱を作成するときにセクションマーカーを使って作るという説明があったので作ってみた。
順調にできていたが、間違ったページにセクションマーカーを設定してしまったため、消して違うページに再設定した。
そうすると、セクションマーカーを消した部分の柱が消えてしまった。

いろいろいじっていたら、うまいこと消せたのでメモで残します。

![スクリーンショット 2022-02-28 15.34.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/855350f0-df85-072b-4eee-e67a1f537e2c.png)


上のようにマスターページに特殊文字のセクションマーカーを作る

さらに、
![スクリーンショット 2022-02-28 15.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/566eaf86-92ef-eb93-e3f3-3cbe28082621.png)

図のように1ページ目に　「ページ番号とセクションの設定」からセクションマーカーのところに「第１章はじまり」と指定する。

こうすれば、これ以降のページではセクションマーカーに入れなくても全て「第1章はじまり」が入る

![スクリーンショット 2022-02-28 15.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/43b65fd1-6824-aa8d-c90f-e39f726c3325.png)

これを4ページ目から「第2章そして」に変えたいとする。
![スクリーンショット 2022-02-28 15.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/95085fab-7c90-fe45-6f8c-21ee76a200db.png)

上のように4ページ目でセクションマーカーのところに設定すると、うまいこと以降のページでは「第2章そして」に切り替わる。

ただ、これをその後の編集で5ページ目からセクションマーカーを「第２章そして」に変えたいとする。

だから、4ページ目のセクションマーカーの設定を消して、5ページ目にそれを設定したい。

![スクリーンショット 2022-02-28 15.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/6ced7581-a6ca-e1af-3954-c6319271b703.png)

しかし、図のように4ページ目にセクションマーカーを消したら、第１章のセクションマーカーが入らない。


![スクリーンショット 2022-02-28 15.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/b1224b74-ec5c-9032-6079-9bd9683f5ce5.png)

上の図のように消したのにセクションマーカー空白で設定されている。

これに対して、解決法は
![スクリーンショット 2022-02-28 15.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/e8119dce-de3a-2827-e923-e4edc89037f4.png)

セクションマーカーの文字だけを消すのではなく、開始セクションのチェックボックスを外さないといけなかった。

それでうまくいった。

![スクリーンショット 2022-02-28 15.46.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/c8601060-bdd3-8f53-0a57-7499997bbadf.png)


ページの方の三角マークも消えていることから、ちゃんと設定が消えていることがわかる
シークライズ

「Sequelize（シークライズ）」は、Node.jsを利用してデータベースへ効率的かつ簡単にアクセスするためのORM（Object-Relational Mapping）ライブラリです。私自身、このライブラリの読み方を「シークライズ」と表記・呼称していますが、一部の方は「シーカライズ」と読む場合もあります。

Sequelizeは、TypeScriptやJavaScriptを使用して開発する際に活用することができ、リレーショナルデータベース（例えば、MySQLやPostgreSQL、SQLite、MariaDBなど）とのやり取りを簡素化するための豊富な機能を備えています。これにより、データベース操作をコード上で直感的に記述することが可能です。
MySQLのコマンド

### コマンド

| MySQLコマンド | 内容 |
|:-----------|:------------|
| mysql -u ユーザ -p | MySQLへログイン(パスワードは後から入力) |
| mysql -u ユーザ -pパスワード | MySQLへログイン |
| mysqldump -u ユーザ -pパスワード DB名 > ダンプファイル名 | DBのダンプ |
| BEGIN | トランザクション開始 |
| ROLLBACK | トランザクション中の修正をロールバック |
| COMMIT | トランザクション中の修正を反映 |
| EXPLAIN 確認したいSQL | 実行計画の確認 |
| show index from インデックスを確認したいテーブル名 | テーブルのインデックスを確認 |
| create index インデックス名 ON 対象のテーブル (対象のカラムリスト(カンマ区切り)) | インデックスを貼る |
| drop index インデックス名 ON 対象のテーブル | インデックスを削除 |
| INSERT INTO test.table1 (id, column1, column2) SELECT id, column1, column2 FROM test.table2 WHERE column1 = 'hoge' | SELECTの結果をベースにINSERTする |

### 参考
https://qiita.com/tsurumiii/items/0b70f1a1ee0499be2002
M1 MacでLabelImgがうまく立ち上がらないときの対処

## 概要
M1 MacでLabelImgを実行しようと思ったのですが、うまく起動しなかったときの対処方法についての記事です。普段Pythonはpyenvで管理していますが、それだとうまくいかないようでbrew経由でPythonをインストールすることになりました。なお、Pythonはpipenv環境での実行です。

## brew経由でPython3.7系をinstallする

intel版のbrew経由で行う点に注意です。

```shell
arch -x86_64 /usr/local/bin/brew install python@3.7
```

ここでこける可能性もあるかなと思いますが、私はうまくインストールできました。

## labelImgのインストール

インストールはGitHub経由で行います。ここは問題なくインストールできるはずです。ポイントはその次です。
pipenvで先ほどインストールしたpythonをフルパスで指定します。

```shell
git clone https://github.com/tzutalin/labelImg.git && cd labelImg
pipenv --python /usr/local/opt/python@3.7/bin/python3
> Successfully created virtual environment! これがでればOK
```

## 必要なライブラリのインストールとビルド

ここまでこればあとはビルドして実行するだけです。

```shell
pipenv run pip install pyqt5==5.14.1 lxml
pipenv run make qt5py3
pipenv run python3 labelImg.py # 起動すれば成功
```

## 最後に

intel版のPythonをインストールしていることがポイントになりますので、上記と同じ手順を踏めばPython3.8でも問題ないかと思います。

## 参考にしたサイト

https://note.com/26thpn/n/n6fe4237bdcd7
新人エンジニアはnewsletterを読もう

エンジニアには「技術的な議論についていけるようになりたい」とか「自分が伸ばしたい分野の最新情報をちゃんと追いかけたい」とか悩んでいる人が多いと思う。

例に漏れず私も悩んでいて、以前からいろいろ試していたが、[同僚](https://www.lifull.blog/entry/2020/12/02/000000)が紹介していた「newsletterを購読する」方法が一番ためになった。

> まず不足しがちな情報として、コミュニティの最新動向をキャッチアップするためにはnewsletterを購読している。
> newsletterとは有志がある技術に関する最新動向をまとめて定期的に配信するメディアで、僕が購読しているものだと
> https://this-week-in-rust.org/
> https://www.cncf.io/kubeweekly/
> などがある。
> 大体は「<技術名> newsletter」で検索するとそれっぽいものが引っかかるのでそれをsubscribeすればよい。
>
> まともなnewsletterがなかったり、技術自体が新しくてnewsletterが存在しないケースもある。
> その場合はRedditで似たような情報収集ができるため利用することができる。
> Redditはsubredditと呼ばれるトピックごとに分かれた古典的な掲示板で、多くの技術のsubredditが存在する。
> Redditは執筆者が直接投稿することも多く、newsletterと比べて一次情報に直接アクセスできるという点が強みだ。

「ある程度コンテンツが厳選されており、週一で更新されたものを読めばいいので、忙しい時期でも無理なく続けられる」点が良い。私は英語は苦手だが、概要を把握するにはGoogle翻訳で十分で、多少わからなかったとしても重要なトピックは繰り返し紹介されているのでそこまで問題ではないと感じている。

ちなみに、私は「[Data Engineering Weekly](https://www.dataengineeringweekly.com/p/data-engineering-weekly-76?utm_source=url)」を購読していて、「最新のデータ管理ツール」から「KPI測定をエンジニア観点でサポートする方法」みたいな内容が含まれていて、私の興味に合っている。

「基礎的な知識を日本語の評判の良い本で学んで、それ移行はnewsletterで追う」という方法は、別の分野を学ぶときにも役立つ汎用的な方法じゃないかと思う。具体的に言うと、データエンジニアリング分野では『[ビッグデータを支える技術](https://gihyo.jp/book/2021/978-4-297-11952-2)』とか『[実践的データ基盤への処方箋](https://gihyo.jp/book/2021/978-4-297-12445-8)』等を読んだ後に[Data Engineering Weekly](https://www.dataengineeringweekly.com/p/data-engineering-weekly-76?utm_source=url)を追っていくのが、少なくとも私にとっては最善の方法だった。

ぜひ試してほしい。
Windowsの標準コマンドでパケットキャプチャ

## はじめに
Windowsサーバ等でパケットキャプチャしたいけど、サーバにサードパーティ製のアプリはあまりインストールしたくない時に… netsh コマンドでキャプチャできます。
netsh コマンドでキャプチャしたデータは、そのままでは Wireshark で読み込めないので etl2pcapng で変換します。

## キャプチャを開始します
```
c:\NetTraces>netsh trace start capture=yes traceFile="NetTrace.etl"

トレース構成:
-------------------------------------------------------------------
ステータス:           実行中
トレース ファイル:    c:\NetTraces\NetTrace.etl
追加:                 オフ
循環:                 オン
最大サイズ:           512 MB
レポート:             オフ
```

## キャプチャの状況表示するには
```
c:\NetTraces>netsh trace show status
```

## キャプチャを停止します
```
c:\NetTraces>netsh trace stop
トレースの結合中... 完了
データ収集を生成しています ... 完了
トレース ファイルと追加のトラブルシューティング情報は、"c:\NetTraces\NetTrace.cab" としてコンパイルされました。
ファイルの場所 = c:\NetTraces\NetTrace.etl
トレース セッションは正常に停止しました。
```

## コマンドラインオプション

| オプション | 意味 |
| :-- | :-- |
| CaptureInterface="ローカル エリア接続" | インターフェースを指定します |
| Ethernet.Type=IPv4 | イーサネットタイプを指定します |
| Protocol=TCP | プロトコルを指定します |
| IPv4.Address=192.0.2.1 | IPアドレスを指定します |
| IPv4.SourceAddress=192.0.2.1 | 送信元IPアドレスを指定します |
| IPv4.DestinationAddress=192.0.2.1 | 送信先IPアドレスを指定します |
| persistent=yes | 再起動後もキャプチャを続けます |
| traceFile=NetTrace.etl | 出力ファイルを指定します |
| maxSize=500 | 出力ファイルの最大サイズを指定します |

## 出力したファイル(NetTrace.etl)を Wireshark がインストールされたクライアントへコピーします

## コピーしたファイル(NetTrace.etl)を Wireshark で開ける形式に変換します

### etl2pcapng をダウンロード・展開します
[etl2pcapng](https://github.com/microsoft/etl2pcapng/releases) のサイトから **etl2pcapng.zip** をダウンロードし展開します

### NetTrace.etl を変換します
```
etl2pcapng.exe NetTrace.etl out.pcapng
```

### 変換したファイル(out.pcapng)を Wireshark で開きます
【Power Automate 業務効率化】 teams 活用術 その二

今回は業務効率化の第二弾という事で、Power Automateを利用した自動化フローを記事にしたいと思います。

前回は、ノーコードで作成できるteams bot作成方法を執筆させて頂きました。
https://qiita.com/TA6335/items/f3f82510950ff3f05b6b

---
## E-mail 受信の自動通知

【自動化フローを作成しようしたきっかけ】
　業務上各部署からの問い合わせやアラーム通知などかなり多くのメールが毎日飛んでくるため
　outlookの通知では、見逃しが多い。
　
　特定のメール(outlook)を受信した際に、teams通知することにより　見逃しや対応遅れの防止を行いたく
　このフローを作成しました。

---

## 作成手順　(Outlookの場合)
Outlookでフロー作成しましたが、G-mailでも可能です。

1.Office 365 のサイトよりPower Automate のアイコンをClickする
2.画面左にあるメニューの作成から、自動化したクラウドフローをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/1af2d210-12ac-48ca-4d8b-3de3d9f4ecb2.png)

3.自動化したクラウドフローを構築するというウィンドウが開かれる

3.1.フロー名：任意の名前
3.2.フローのトリガーを選択する
今回は、新しいメールが届いたときにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/825df019-cc80-5885-3dd0-32daf9772324.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/3f338c0a-fc88-5534-274d-78fe6be8b5bf.png)

4.トリガーを決定したら、作成をClickする

5.詳細オプションを表示するをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/e4f51aa5-83e0-917c-1fe7-669597cbd1ce.png)

6.条件を入力する
自分は差出人と件名フィルターを指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/112a5268-d8cd-6a28-6d23-809cc507b4a8.png)

7.新しいステップをClickする

8.Microsoft TeamsをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/5e9da332-98a0-e0e9-8076-de077237279f.png)

9.チャットまたはチャネルでメッセージを投稿するをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/6c82ff76-fde8-ca42-1db7-0cbe5e67dc31.png)

10.必要情報の入力

投稿者：フローボットのままでいいです

投稿先：グループチャットにします（ご自身で作成したチャネルにも投稿は可能です）

グループチャット：投稿したいChat名を選択する（参加しているchatが一覧表示されます）
出てこない場合は、検索機能もあります。

※自分が作成した時は、一覧表示で出てきました。

メッセージは投稿内容とリンクの設定などができます。

設定が完了したら、保存しテストをClickしてフローのテストを行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/1b7f7bbb-1413-3db9-44b7-2f9f944a256d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/dfcd2ece-f85a-ff97-b5c1-264c538efbd6.png)

11.手動を選択しテストをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/1ba9d2b0-f0a4-d2fb-f8dd-ba996d737810.png)

12.teams通知には件名、メール本文が表示されます。
【Flutter】routemasterで相対パスを使用する方法

[routemaster](https://pub.dev/packages/routemaster)で色々な画面から呼び出される画面の場合、相対パスを使いたくなりますが、デフォルトでは設定できませんでした。。
理解不足で、できたらすみません！！

下記を追加すれば、/hogeRouteName/　→ hogeRouteName/で使えるようになりました！感謝😭
https://github.com/tomgilder/routemaster/issues/5
Errors were encountered while... で実機が起動しない場合

[環境]
Xcode 12.5.1
iOS 15.3.1

実機ビルドしようとしたら以下のメッセージが出て実行できない場合の対処方法
```
Errors were encountered while preparing your device for development. Please check the Devices and Simulators Window
```

[解決方法]
MacBookとiPhoneを再起動したら解決できた。
Spring Bootで使われるアノテーションをまとめてみた

業務上、Spring Bootを使っており、その中で結構な数のアノテーション（@でクラスとかにかかれているやつ）が出てくるので備忘録も兼ねてまとめてみました。

#「Spring Boot」とは
Spring Framework（Javaのフレームワーク）のひとつでアプリケーションを作るための仕組み。
Spring Boot以外にも下記リンクあるような様々なプロダクトが用意されている。
[Spring | Projects](https://spring.io/projects)

Spring Bootの特徴として、
　`・あらかじめオススメのプロジェクト（プロダクト）の組み合わせが含まれている`
　`・自動で設定が含まれている`
　`・組み込みサーバが同梱されている`
といったことが挙げられる。

#アノテーション一覧
個人的に重要そうだなと思ったアノテーションは太字にしています。

| アノテーション | 説明 |
|:-|:-|
|**`@SpringBootApprication`**|Springアプリケーションにつけることで、諸々の設定が不要になる。後述する`@EnableAutoConfiguration`、`@Configuration`、`@ComponentScan`を組み合わせたもの。|
|**`@RestController`**|「REST」」Webアプリケーションにおけるリクエストを受けるクラスであることを表す。|
|`@GetMapping`|HTTPリクエストのメソッドにGETがあるように、GETメソッドを受け付けることを表す。PostMappingなども存在する。|
|`@Configuration`|「JavaConfig」用のクラスであることを表す|
|`@Bean`|「DIコンテナ」に管理させたいBean（実装）を生成するメソッドに付与する。|
|`@EnableAutoConfiguration`|Spring Bootの自動設定を有効にする。|
|`@Import`|`@Configuration`をつけたクラスを引数に設定する。例) `@Import(AppConfig.class)`|
|**`@Autowired`**|DIコンテナで管理するフィールドに付与する。自動的に管理されているDIコンテナから合致する型のオブジェクトをインジェクションする。(オート・ワイヤリング)|
|`@ComponentScan`|同じパッケージ配下で、DIコンテナに登録するクラスを走査する|
|`@Controller`|Spring MVCのコントローラであることを示す|
|`@Service`|サービスクラスであることを示す。`@Component`と機能的には違いはなし|
|`@Repository`|リポジトリクラスに付与する。|
|`@Transactional`|クラスをDIコンテナから取得し、そのクラスのメソッドが呼ばれた時、自動的にDBトランザクションの制御をする|
|`@Query`|クエリ文に付与する|
|`@ResponseStatus`|HTTPのリクエストに対するレスポンスステータスを指定する。例) `@ResponseStatus(HttpStatus.OK)`|
|`@RequestBody`|HTTPリクエストの時に設定するBody部に付与する|
|`@PageableDefault`|リクエストパラメータでパラメータが指定されなかった際に、デフォルト値を設定するために付与する|
|`@Validated`|情報の入力値チェックを行う際に付与する|

#./mvnwコマンド一覧
以下spring bootを学習する上で出てきたmvnwコマンドたち

| コマンド | 説明 |
|:-|:-|
|`./mvnw dependenct:tree`|使用可能なライブラリの一覧を表示する|
|`./mvnw spring-boot:run`|アプリケーションを「起動」する|
|`./mvnw package`|アプリケーションのjarファイルを作成する|

若干説明が中途半端で分かりづらいところがありましたので、個別で調べていきたいと思います。あと、RestControllerでなにかAPI作ってみてもいいですね。
Rails Consoleを使うんだ（単数形↔複数形）

モデルやアソシエーションを書くときに、複数形と単数形がわからない。
もうググらなくていい。

## 複数形を知りたい

```ruby
pry(main)> "hoge".pluralize
=> "hoges"
```

## 単数形を知りたい
```ruby
pry(main)> "hoges".singularize
=> "hoge"
```
別のLambdaを同時に呼び出して実行する方法【備忘録】


## 背景
Lambdaを使って日付ごとにデータをスクレイピングすることがあった。
大量のデータであったが、繰り返し文で日付を変えながら行うプログラムとしていたため、非常に時間がかかった。

そこで、①実行指示Lambdaと②スクレイピングLambdaに分けてプログラムを作成し、①にて変数を入れ替えながら②に指示するような構成にすることで、Lambdaの同時実行が可能になったので、備忘録として記載する。

参考記事については複数層に分けて大量のLambda実行を可能としているが、今回はわかりやすさ優先で、（親）と（子）の2層構造でLambdaを同時実行してみる。

## イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414468/49578015-605e-e696-d64f-c0bab0855d94.png)

## 親Lambda

```Python:parent

import json
import io

client = boto3.client('lambda')

date_list = ['2022/01','2022/02','2022/03','2022/04']
category_list = ['setosa','versicolor','virginica','other']

def lambda_handler(event, context):
    # 子Lambda の呼び出し
    for i in range(len(date_list)):
        response = client.invoke(
            FunctionName='children',#Lambdaで記載している関数名を記載
            InvocationType='Event',
            Payload=json.dumps({'DATE': date_list[i]
                                ,'CATEGORY': category_list[i]
                                })
        )
```
上記のように、親Lambda内で子Lambdaを呼び出している。for文でdate_listの数（4回）だけ呼び出しをするように指示している。

## 子Lambda

```Python:children

import json
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

def lambda_handler(event, context):
    date = str(event.get('DATE'))
    category = str(event.get('CATEGORY'))

    driver = headless_chrome()
    wait = WebDriverWait(driver, 30)

    driver.get("http://〇〇…")
    ・・・
```
親Lambdaで呼び出された子Lambdaは、event.getで親Lambdaから渡された変数を読み込むことができる。


## 終わりに
上記は基本形の形であるが、参考記事のように複数層で呼び出しー呼び出され構成にすることで、並列処理チックな構成を組むことが可能。
大量データのスクレイピングだけではなく、大量データの集計・解析作業の高速化につながることを期待。

## 参考記事
https://note.com/yusugomori/n/n80a15f5a8232
Warning: Error searching on GitHub: GitHub API Error: Bad credentials The GitHub credentials in the macOS keychain may be invalid.

# 事象 : アプリを検索したらなんか言われた

```bash
$ brew search docker 
Warning: Error searching on GitHub: GitHub API Error: Bad credentials
The GitHub credentials in the macOS keychain may be invalid.
Clear them with:
  printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase
Create a GitHub personal access token:
    https://github.com/settings/tokens/new?scopes=gist,public_repo,workflow&description=Homebrew
  echo 'export HOMEBREW_GITHUB_API_TOKEN=your_token_here' >> ~/.zshrc

==> Formulae
# ...省略...
```

## 原因 : GitHubの認証情報が無効だから？

メッセージを愚直に訳してみると

> 警告:GitHubでの検索エラー:
> GitHub APIエラー:不正な認証情報
> macOSキーチェーンのGitHub認証情報が無効である可能性があります。

HomebrewでGitをインストールすると「httpsを使用するときの認証情報を保存する」ようになるらしい。
参考 : [【Mac】gitでパスワードを毎回聞かれたく無い](https://www.rail-c.com/%E3%80%90mac%E3%80%91git%E3%81%A7%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E6%AF%8E%E5%9B%9E%E8%81%9E%E3%81%8B%E3%82%8C%E3%81%9F%E3%81%8F%E7%84%A1%E3%81%84/)

```bash
# 認証情報がキャッシュされるように設定されている
$ git config --system -l
credential.helper=osxkeychain

# credential-osxkeychainサブコマンドは使えるようになっている
$ git credential-osxkeychain
usage: git credential-osxkeychain <get|store|erase>
```

それとも自分で[git-credential-manager — Homebrew Formulae](https://formulae.brew.sh/formula/git-credential-manager)をインストールして設定でもしたのだろうか？

> Mac を使っているなら、Git の “osxkeychain” モードが使えます。これを使うと、OS のキーチェーン（システムアカウントと紐づく）に認証情報がキャッシュされます。 このモードでも認証情報がディスクに保存され、有効期限切れもありません。ただし先ほどとは違い、保存内容は暗号化（HTTPS 証明書や Safari の自動入力の暗号化と同じ仕組み）されます。
> [Git - 認証情報の保存](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98)

### 対応 : 保存された認証情報をクリアする
メッセージに言われた通りのコマンドを使って認証情報をクリアする。

```bash
# プロトコルが「https」でホストが「github.com」の認証情報をクリアする
$ printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase

# 次は何も言われなくなった
$ brew search docker 
==> Formulae
# ...省略...
```
強制pushはやめよう(戒め)

## はじめに
githubのレポジトリにファイルを挙げる際、強制pushでやらかしたので自分への戒めとして書きます。

## 何が起きたか
とあるファイルをgithubに挙げようとするがエラー
　　　　↓
git push -f origin main で強制的に投稿できるという記事を見る
　　　　↓
~~何も考えず~~実行する
　　　　↓
ちゃんと投稿されていることを確認しに行く
　　　　↓
以前投稿したファイルが全部なくなっていることに気づく(!?)

## やらかした原因
直接の原因はこれ。-fを使ったこと。完全に上書きしてしまって前の情報がなくなってしまいました。

```git
git push -f origin main
```


そもそも強制pushをすることになったのは、知識不足が根底にあるのですが。。。
足りない頭を更に使って、下記の資料を参考に何とか戻せました(これが本当にいいかはさておき)。

https://www-creators.com/archives/1282#git_reset_HEAD

## まとめ
**強制pushはダメ、ゼッタイ**
知識不足は本かprogateで学ぶことにします。
【個人開発】匿名とニックネームを自由に切り替えれる機能をwebサービスに追加してみた

# はじめに
1か月前にLisdomという投稿サービスをリリースしました。

ゆるーく自由なサービスと謳っていたのですが、昨日、ニックネームとかプロフィールが公開されていたら投稿したりコメントするのに億劫になると友人からの意見、、、
どうしようかな～と考えていたら、切り替え出来たら便利じゃん！と思い、忘れないうちに実装するため、早速実装してみました。


# 匿名とニックネーム表示の切り替え機能
今までは、以下のように、投稿主とコメント主のプロフィール画像とニックネームが公開されていました。
![qiita2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503691/63cdce54-cacf-bea2-e74d-297ccbdc4333.png)

匿名希望さんのボタンをONにして投稿すると↓↓↓
![qiita9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503691/519abcc1-bcec-2d61-29ec-a00e1af3943b.png)
![qiita4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503691/6d59fb1d-72b9-4e92-a928-b3a2fb04923c.png)
このようにニックネームとプロフィール画像は匿名用のモノに置き換えられます。
投稿とコメントに関しては切り替えが可能であり、通知にも誰がコメントしたかは分からないようになっています。
また、投稿に関しては編集画面でも切り替えられます。

![qiita7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503691/2347ae6f-af3a-30c1-9e13-d6701b66f545.png)

実装としては、boolean型のカラムを一つ追加し、匿名にするかどうかの判定を取っています。
```ruby
class AddTokumeiToPosts < ActiveRecord::Migration[6.1]
  def change
    add_column :posts, :Tokumei, :boolean, default: false, null: false
  end
end
```

# 開発環境
ruby
ruby on rails6
heroku
※今回の機能に関してはgemをつかっていません

# 終わりに
友人からの意見でこの度実装することになりましたが、改めて周りからの意見は大事だな～と思いました。
機能としてはboolean型のカラムを一つ追加するだけでできてしまう簡単なものでしたが、意見がなければ実装は叶いませんでした。友人に感謝です。
最後までご覧いただきありがとうございました。
もしよろしければ匿名切り替えボタンを使って投稿やコメントしてみてください。

https://lisdom.jp/
グレーアウトなよる

# 背景

フロント実装にてクリック契機等で既存画面をグレーアウトして新たな要素を出す仕組みを書いたのでその備忘録も兼ねて。
単純にモーダル機能としてだけであればBootstrapで事足りるのですがそれだと少し痒いところに手が届かないよって方向けに。。

# 実装例

ボタンクリックで背景グレーアウト→画像表示

```Grayout.vue
<template>
  <b-button @click="display" variant="primary" class="btn">表示</b-button>

  <div id="grayout" v-show="showFlag">
    <div id="contents">
      <!-- コンテンツを記載 -->
      <img id="image" :src="imgUrl"/>
    </div>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        imgUrl: '',
        showFlag: false
      }
    },
    methods: {
      display () {
        let random = 0 + Math.floor( Math.random() * 3 );
        if (random == 0) {
          // 大吉
          this.imgUrl = 'https://3.bp.blogspot.com/-vQSPQf-ytsc/T3K7QM3qaQI/AAAAAAAAE-s/6SB2q7ltxwg/s1600/omikuji_daikichi.png'
        } else if (random == 1) {
          // 吉
          this.imgUrl = 'https://2.bp.blogspot.com/-27IG0CNV-ZE/VKYfn_1-ycI/AAAAAAAAqXw/fr6Y72lOP9s/s800/omikuji_kichi.png'
        } else {
          // 凶
          this.imgUrl = 'https://4.bp.blogspot.com/-qCfF4H7YOvE/T3K7R5ZjQVI/AAAAAAAAE-4/Hd1u2tzMG3Q/s1600/omikuji_kyou.png'
        }
        this.showFlag = true
      }
    }
  }
</script>
```

```Grayout.css
<style>
#grayout{
  z-index:1000;
  position:fixed;
  top:0;
  left:0;
  width:100%;
  height:100%;
  background-color:rgba(0,0,0,0.5);
  display: flex;
  align-items: center;
  justify-content: center;
}

#contents{
  z-index:1001;
}
```

z-indexでコンテンツの出す層を設定できます。(数が大きい方が前面に表示)
様々な要素が重なり合う場合の厳密な制御が可能になりますが、1,2,3...で刻むよりは1,10,100,1000...とする方が後々改修する時に楽だったり単純にパッと見でわかりやすいのでおすすめ。
バッファキャッシュとページキャッシュというのがあるらしい

## 勉強前イメージ

どっちもキャッシュ？種類があるの知らんかった

## 調査

### バッファキャッシュ とは

ブロックデバイス(データ転送をブロック単位で行うHDDなどを指す)に直接アクセスするときに使用されるキャッシュで
実装上はブロックデバイスに対するページキャッシュになっています。
freeコマンドでは `buffers` の箇所に当たります。
以下のfreeコマンドを見てみると、4.1MBがバッファキャッシュとして持っていることがわかります。

```
# free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           3.7G        425M        1.6G         48M        4.1M        1.7G        3.0G
Swap:          819M          0B        819M
```

以下のvmstatコマンドだと、buffになります。
これはMB単位で見やすくしているので、4になっています。

```
# vmstat -wSm
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0            0         1713            4         1809    0    0     1     4   31   46   0   0 100   0   0
```

### ページキャッシュ とは

ディスクから読み込んだデータをキャッシュする、ファイルシステムに対するキャッシュです。
ファイル単位でアクセスする際に使用されます。
ファイルへ書き込んだときは残るので、読み込むときにキャッシュのデータを利用できます。
freeコマンドでは `cache` にあたります。
以下ではページキャッシュは1.7GB持ってることがわかります。


```
# free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           3.7G        425M        1.6G         48M        4.1M        1.7G        3.0G
Swap:          819M          0B        819M
```

以下のvmstatコマンドだと、cacheになります。

```
# vmstat -wSm
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0            0         1713            4         1809    0    0     1     4   31   46   0   0 100   0   0
```

### おまけ

- freeコマンド

`free -h -w`
-h : 表示をGB、MBで見やすく
-w : ワイド表示(デフォルトだと buff/cache で一緒になってしまってる)

```
# free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           3.7G        425M        1.6G         48M        4.1M        1.7G        3.0G
Swap:          819M          0B        819M
```

- vmstat

`vmstat -wSm`
-w : ワイド表示
-Sm : 単位をMBにする

```
# vmstat -wSm
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0            0         1713            4         1809    0    0     1     4   31   46   0   0 100   0   0
```

## 勉強後イメージ

キャッシュにもいろいろあるのね。
freeコマンドとかvmstatとか使ったことあったけどちゃんと見れてなかった。

## 参考

- [Linux ファイルシステム 徹底入門](https://www.kimullaa.com/entry/2019/12/01/130347#%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A8%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5)
- [freeコマンド](https://linuc.org/study/knowledge/439/)
Power Appsをバージョン管理（Azure DevOpsのgitで）[2]

## はじめに

* Power Apps で、gitリポジトリと連携する話の２回目です。
* git用のボタンが増えているので、このボタンを押したらどうなるかやってみます。

![009_git関連ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/39eca232-a28a-1180-4990-d5ff7b0f631e.png)

## 増えたgit関連ボタンを押してみる

変更前
![01_変更前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/7fcd3cc5-20b5-57cd-30d4-3de7299bfba2.png)

変更後。
FirstScreenを複製しました。

![02_変更後01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/14eaa443-dbc2-091a-c1a0-034ef7947a0d.png)

このあと、冒頭に話題にした回転のボタンをクリック。
※ボタンラベルは「変更をコミットして、gitの更新を確認する」という名前

![03_2_ボタンラベル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/d2725f17-02dd-2167-8459-90c5163e6d7c.png)

クリックしてみると、画面上の変化はありませんでした。

![03_変更後02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/46bcec98-8860-d3a5-6094-c12e8e8ac78d.png)

gitリポジトリのほうを見てみると、１バージョン更新がされていて、更新時のコメントは「Commit」でした。

![04_git上の変化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/8d33b845-e2a7-4c05-067e-7badf61deaca.png)

これだと、確かにバージョン更新はされたのですが、何を更新されたかがわかりません。

## メニューからコメント付きで保存する

代わりに、メニューから保存するときにコメント付きで保存ができるのでそちらをやってみます。
先ほど複製したScreenの名前を変更します

![11_画面上の変更後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/71c361fb-7e1d-d6e4-b0cb-fe36fc36158d.png)

メニューからコメント付きで保存します。

![12_保存コメントをつけて保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/44b15724-8fac-23ac-d348-00dc21e0fa05.png)


gitリポジトリのほうを見てみると、保存時のコメントが表示されました。保存時はこちらのほうが、過去の履歴を追うのに有効そうです。

![13_保存時のコメントがgitに表示される.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52550/67590d06-aefd-14c5-0806-0291661d6fa7.png)

## 次回について

今度は、gitにコミットされた内容を見ていくことにします。
Amplifyのoverride.tsで環境名を取得する

## 課題
Amplify CLIではAuthなどのCFnテンプレートを上書きするためのファイルとして、override.tsが提供されています。このoverride.tsは`aws-cdk`内の一部のメソッドのみを利用できるようになっています。
本来、`getProjectInfo()`でAmplifyのプロジェクトの詳細を取得することができるのですが、2022/2/28現在このメソッドはアクセス権限に関する以下のエラーが発生するため利用できません。
```
⠇ Building resource storage/MyStorage🛑 Error: Skipping override due to VMError: Access denied to require 'os'
```

override.ts内で環境名を取得する必要がある場合、上記メソッドを使わずに取得する方法をご紹介します。

## 解決策
※注意
本記事で紹介する解決策は邪道です。issue(https://github.com/aws-amplify/amplify-cli/issues/9063 )が対応され次第修正した方が良いです。

Amplify CLIではプロジェクトの環境等のメタ情報を`amplify/backend/amplify-meta.json`にて保持しています。このファイルは`amplify env checkout ...`などのコマンドで環境が変更された際、`amplify/team-provider-info.json`、`amplify/backend/backend-config.json`の情報を元に構築されるものです。今回はここから環境名を取得します。

### 手順１:amplify-meta.jsonのモジュール化
`amplify-meta.json`をモジュールとしてシンボリックリンクを貼ります。ファイルを直接読みにいくことも可能のようですが、私の環境ではエラーが発生し読み込めなかったためこの手順を踏んでいます
```
cd amplify/backend
yarn add link:./amplify-meta.json
```

### 手順2:override内でStackNameの取得
`amplify-meta.json`のStackNameを取得します。StackNameは`amplify-[プロジェクト名]-[環境名]-[プロジェクト番号]`で構成されているため、文字列を分解すれば環境名を取得することができます。

```override.ts
export function override(resources: AmplifyAuthCognitoStackTemplate) {
  const amplify_meta_json = require('amplify-meta.json')
  const env_name = amplify_meta_json.providers.awscloudformation.StackName.split("-").slice(-2, -1).pop()
//省略
}
```

## まとめ
override.ts内で環境名を取得する機会は多いと思われるので、誰かの参考になれば幸いです。
また、この対応はissue内のcespin氏を参考にしております。この場を借りてお礼申し上げます。

## 参考
- [不具合のissue](https://qiita.com/naniwadari/items/7944b31ce52f85646e2c)
- [Override Amplify-generated Cognito resources(公式Doc)](https://docs.amplify.aws/cli/auth/override/#customize-amplify-generated-cognito-auth-resources)
スマホでのタップ時に四角い枠を表示させないようTailwind CSSで設定する方法

こちらのブラウザゲームを作成する中でのことです。
[ゴロゴロ円周率](https://gorogoropanda.com)
操作感を向上させるため、ボタンがタップに反応する領域を、ボタンの視覚的な領域よりも広くしました。
その結果悩まされたのが、タップ時に表示される、四角い影です。
<img width="300" alt="screen shot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643075/e9b2d864-20cc-8119-a90e-0a66c8a9acdc.png">

CSSであれば、以下のように書けば、この影が消えます（一般化のため、`a`タグにしてあります）。
```css
a {
 -webkit-tap-highlight-color:rgba(0,0,0,0);
}
```
しかし、Tailwindではこれに対応するクラスが存在しません。
対応策としては、`tailwind.config.js`に、以下のように記述してください。
```js
const plugin = require('tailwindcss/plugin')

module.exports = {
  // ...
  plugins: [
    plugin(function ({ addUtilities }) {
      addUtilities({
        '.no-tap-highlighting': {
          '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',
        }
      })
    })
  ]
}
```
これで、`no-tap-highlighting`というクラスを使用すれば、タップ時に四角い影が表示されなくなります。

**参考**
- https://tailwindcss.com/docs/adding-custom-styles
- https://serversideup.net/using-tailwindcss-to-design-your-mobile-app/
卒論や修論の要旨で埋め込みサブセットを通すときに見るメモ

## はじめに
卒論や修論の発表において、要旨が求められます。注意が必要なことの一つに、フォントを埋め込む必要があること。ここでは LaTex で要旨を書く皆様への tips となることを目指し、メモを書いておきます。Word だったらどんだけ楽だろう…

## そもそも埋め込みサブセットとは？
文字を埋め込む、とは、簡単に言うと「どのデバイスでみても文字化けしないようにするための処理」です。
私は一時期「pdfはニアリーイコール画像だから、文字の編集などはできない」と誤解していましたが、実際は文字の編集はできるし、ノットイコールです。
何がいいたいかと言うと、
**pdfの文字は環境依存する（PCによって見れるかどうか変わる）** ということです。行書体が認識できないPCでは、行書体を見ることはできないのです。

## 文字が埋め込まれているかどうかを確認する方法
pdf を adobe で開き、文書のプロパティのフォントタブで確認できます。埋め込みサブセットとカッコ書きされているとOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2536951/bb1be42a-63ec-47a9-bc91-f20e4feec40e.png)

adobe で開く方法は、開きたいファイルをエクスプローラーで選択した状態で、右クリック→プログラムから開くにて可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2536951/6b88f6e1-51ff-4834-8935-96f2d36eebb1.png)
こんなアイコンのを選んでください。もしなかったら、インストールするか、adobe が入っている周りの人のPCを使って確認しましょう。

## 埋め込まれていない原因と対策？
多分、以下のどこかが原因です。LaTex を開き、原因となる場所を探すために、コメントアウトを繰り返してどこが原因か探してみましょう。
```
・ギリシャ文字がある（\alpha \beta \gamma etc.）
・図のどっかにある。マユラードローやPythonで作成しているのは特に怪しい
```

では、どうするのか。最適とは思えないけど、一応回避できた方法を書いておきます。
① ひっかかっている図を bmp にする。マユラードローからではなく、コピペでパワポに貼り付けて、パワポで bmp 保存も検討してもいいと思う。
② bmp から pdf にする。
③ \AtBegin... を挿入する。以下に挿入例を示す。
```TeX:\AtBeginDviを挿入する
\documentclass[...
\AtBeginDvi{\special{pdf:mapfile dlbase14.map}}
\usepackage[dvipdfmx]{graphicx,color}
```
④ dlbase14.map を LaTex と同じフォルダに入れる。dlbase14.map の中身は参考記事 1 を参照してください。
⑤ 参考記事 2 を真似する。

これで対応できる…かと思います。多分。わざわざ重い bmp にしなくても、png などに変換してやるだけでできるケースもあるようですが、今のところ、詳細はわかっておりません。

## 参考
[1. TeXでPDFにフォントを埋め込む(dvipdfmx) ](http://did2.blog64.fc2.com/blog-entry-363.html)
[2. pdf ファイルのフォント埋め込みについて](http://blog.livedoor.jp/tmako123-programming/archives/34963494.html)
terraform入門メモ

## terraform入門
### terraformチュートリアル（AWS）
https://learn.hashicorp.com/collections/terraform/aws-get-started

### tfenvインストール
```bash
brew install tfenv

tfenv --version
> tfenv 2.2.2

# 使用可能なバージョン一覧
tfenv list-remote

# 指定バージョンインストール
tfenv install 1.1.5

# 使用バージョン指定
tfenv use 1.1.5

# 現在インストールされているバージョン
tfenv list
> * 1.1.5 (set by /usr/local/Cellar/tfenv/2.2.2/version)

terraform -v
> Terraform v1.1.5
> on darwin_amd64

```

### required_providersについて
required_providersのバージョンは公式のレジストリから確認すると良い
https://registry.terraform.io/providers/hashicorp/aws

- `version = ">= 1.0"`は最小バージョン指定。1.0以上
- `version = "~> 3.27"`はパッチバージョンのみ許可。3.27.0以上、3.28.0未満

```
terraform {
  required_version = ">= 1.1.5"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }
}

provider "aws" {
  profile = "dev-user"
  region  = "ap-northeast-1"
}
```

### tfstateファイルをS3で共有管理するためバケット作成

参考
https://qiita.com/mintak21/items/ecc8d568c2859210c0c4

### ECRにイメージプッシュ

参考
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/getting-started-cli.html

```bash
# ecrログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

# リポジトリ作成
aws ecr create-repository \
    --repository-name y-oka/nginx \
    --image-scanning-configuration scanOnPush=true \
    --region ap-northeast-1

# タグ作成＆push
docker pull nginx:latest
docker tag nginx:latest xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/y-oka/nginx:latest
docker push xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/y-oka/nginx:latest

```

### terraformを触ってみてのQ&A
#### Q1. 違うユーザーでソース（tfファイル）を更新、applyしたらインフラはどうなる？
A1. 追加で同じインフラが作成される。複数のユーザーでインフラを管理したい場合はtfstateファイルを共有する必要がある

#### Q2. destroyを使わず特定のインフラを削除したい場合、たとえばドメインをtfファイルから削除したら、そのドメインも消える？
A2. tfstateファイルとtfファイルとの差分で削除される。tfstateファイルで管理されていない場合は削除されない。

#### Q3. tfファイルのリソース名を変更しても、インフラに影響ない？
A3. 影響ある。リソース名を変更してしまうと、削除→新規作成されてしまう。planで確認する

#### Q4. tfファイルのリソース内のパラメータを変更しても、インフラへの影響は最小限で済む？
A4. 分からない。planで確認する

#### Q5. tfファイルとtfstateファイルに差分がある状態でdestroyした場合どうなる？
A5. tfstateに存在するインフラが削除される。

#### Q6. 既存のインフラをterraformで管理したい場合はどうする？
A6. importコマンドで1つ1つ、tfファイルとtfstateファイルに取り込んでいく必要がある。はじめて管理する場合は「Terraformer」というツールでまとめてインポートしてから修正していくと良さそう。
Rust 言語仕様04 ジェネリクス

今回はジェネリックについてアウトプットしていこうと思います。
トレイトを使って型を定義することも多くあります。

### まずはコードから

```rust
struct PointTaple<T, U, G> { // 構造体
    x: T,
    y: U,
    z: G,
}


let g = PointTaple { // 実態
    x: "Rust",
    y: "a",
    z: 4,
};

println!("{} {} {}", g.x, g.y, g.z);

```

`<T, U, G>`のところがgenericsを利用した箇所になります。
genericsが役立つタイミングは抽象的な言い回しですが、動的な割り当てをしたい時に役立ちます。


### トレイト

共通の振る舞いを抽象的に定義でき、トレイト境界を使用するとあるジェネリックが特定の振る舞いをもつあらゆる型になり得ることを指定する。
端的にいいますと、ジェネリクスだけでは範囲が広いのでもう少しだけ定義する時に役立ちます。

トレイトを使用するとき、`Rust`で用意されているものがありますのでそちらを使って定義していきます。
Prismaを3.10.0にしたらseed出来なかった時の対処法

Prismaを3.10.0にしたらseedが出来なく15分くらいハマったので備忘録
# エラー内容
```
An error occured while running the seed command:
Error: Command was killed with SIGKILL (Forced termination): ts-node -r tsconfig-paths/register prisma/seed.ts
```
# ググってみる

https://github.com/prisma/prisma/discussions/12015

同じ人がいました。
node_modulesの依存関係の問題っぽいです。
# 解決方法
`yarn.lock`と`node_modules`を削除して再度`yarn install`したら無事解決しました。
jQueryのAJAX通信でリクエストヘッダ送る際の備忘録

タイトル通り、jQueryのAJAX通信でAPIに対してリクエストヘッダに値を設定して送る時の備忘録です。
基本的にはheadersに値を設定して送る事になると思います。
記述例としては以下のような感じ。

```javascript
var _data = JSON.stringify({});
$.ajax({
  url: '[APIのURL]',
  headers: {
    '[送信したい値のkey名]' : '[送信したい値]',
  },
  type: 'POST',
  contentType:'application/json; charset=utf-8',
  data: _data,
  dataType: 'json',
  crossDomain: true,
  cache: false,
  xhrFields: {
    withCredentials: true
  }
});
```

注意点としては、送るのがリクエストヘッダだけで送るデータがなかったとしても
空のデータをJSON化してdataに指定して送っておかないと400エラーが出ます。
※PHPのエラーには「Required request body is missing: public java.lang.String」といった感じのものが出る。
100日でSQLの達人になる@LeetCode! Day28 <SUM(CASE WHEN句)>

## 1393. Capital Gain/Loss （問題レベル: Medium）要課金
今日の問題はこれ。
銘柄ごとに売買の総合計をリストアップするという問題。

今日は`Medium`問題だが比較的簡単な問題。
サクッと回答できました。
`CASE WHEN`句を使って、`Buy`ならマイナス値を`Sell`ならプラス値を返して、総合計を求めるだけの問題でした。

ポイントは条件に合わせて集計した結果を報告するには`SUM(CASE WHEN)`を使うだった。

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
100日でSQLの達人になる@LeetCode! Day27 <GROUP BYとUNIONを一緒に使う時は注意が必要>

## 1341. Movie Rating （問題レベル: Medium）要課金
今日の問題はこれ。
最も多くの映画にratingを投票しているユーザー名と最も平均レビュー点数が高い映画をリストアップするという問題。

全く異なる変数をリストアップする問題のため`UNION`を使うことはすぐに分かりました。
また、一人だけ、一本だけリストするために`SELECT TOP1 変数名`もすぐに分かりました。
ユーザー名だけ、映画名だけをリストするのはすぐに出来ましたが、`UNION`でエラーが出てしまう。
調べると`MS SQL Server`(だけではない!?)では`GROUP BY`と`UNION`を一緒に使う時にはエラーがおきるようだ。

つまり、これでは駄目で（注：説明のため、簡略化して記載するためにこの問題の回答とは異なります）
```:MS SQL Server
SELECT TOP 1 mr.user_id AS result
FROM movierating mr
GROUP BY mr.user_id
ORDER BY count(*), mr.user_id ASC
UNION
SELECT TOP 1 mr.movie_id  AS result
FROM movierating mr
GROUP BY mr.movie_id
ORDER BY count(*), mr.movie_id ASC
```

```:MS SQL Server
SELECT t1.user_id AS result
FROM (
SELECT TOP 1 mr.user_id
FROM movierating mr
GROUP BY mr.user_id
ORDER BY COUNT(*), mr.user_id ASC
) t1
UNION
SELECT t2.movie_id AS result
FROM (
SELECT TOP 1 mr.movie_id
FROM movierating mr
GROUP BY mr.movie_id
ORDER BY COUNT(*), mr.movie_id ASC
) t2
```
のように一旦テーブルの中で`GROUP BY`, `ORDER BY`をした結果を`SELECT`文でもう一度取り出す形になる。

今日のポイントは`GROUP BY`と`UNION`を一緒に使う時には注意が必要！

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
Automation Anywhere V11⇒A360移行時のグローバル値（その１）

# はじめに
Automation Anywhere V11のBotをAutomation 360用に変換すると変換後Botの中にグローバル値が現れることがあります。
Automation 360を初めて使うときはコントロールルームにグローバル値がないのでBotがエラーになります。
では、その場合にグローバル値として何を登録するのが良いのでしょうか？

Automation Anywhere社のWebでは日本語ページがうまく表示されないようで、英語ページを見ながら調べてみました。

移行のグローバル値に関する日本語のページ
https://docs.automationanywhere.com/ja-JP/bundle/enterprise-v2019/page/enterprise-cloud/topics/migration/global-values-for-migration.html

移行のグローバル値に関する英語のページ
https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/migration/global-values-for-migration.html

#  日付(Date)の移行
まず、簡単なところから。
V11でシステム変数Dateを変数workに代入する場合です。
```
  Variable Operation: $Date$ To $work$ 
```

この1行はAutomation 360では2行に変換されますが、ここでグローバル値AADefaultDateFormatが現れます。
![date001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/c93b5c64-3fbf-c648-a1aa-d188daf51845.jpeg)

![date002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/d606e309-bea8-90ff-f69a-cba5e927a762.jpeg)

この行がエラーになるので、グローバル値AADefaultDateFormatを登録します。
どのような値を登録するかは、Automation Anywhere V11のSystem VariablesでDateをどう設定しているかに合わせます。
V11の標準では
```
  mm/dd/yyyy HH:mm:ss
```
になっていますが、そのままAuomation 360のグローバル値に入れると結果が間違いになります。
少しややこしいですがグローバル値AADefaultDateFormatとして
```
  MM/dd/yyyy HH:mm:ss
```
を設定します。

#  Eメールの設定
Eメールの送信をAutomation 360に変換すると多くのグローバル値が現れます。
![email001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632535/f8bdd8c8-1f86-9118-e8cb-c1f4b3490ea6.jpeg)

これはEメールのSMTPサーバであるとかポート番号であるとか、接続時に認証が必要であるかなどを登録します。
内容自体は難しくありませんが、型が文字型・数字型・ブール型といろいろあるのでグローバル値の登録の際に注意が必要です。

#  最後に
移行後にグローバル値を使わないという選択肢もありますが、移行するBotが大量にある場合はグローバル値を設定したほうが移行が楽だと思います。

「その２」として、AAApplicationPathとAABasePathを書いてみます。