OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelをmacOS Monterey 12.5.1 Mac mini M1にインストールメモ

※久しぶりに書いてます。愚痴が多いです。


Laravel環境を手持ちのMacに構築し、どこかでGitHubなどに移行して、レンタルサーバーなどにデプロイしてみたいと思った。

主にこちらの記事を参照。
https://grune.co.jp/blog/laravel-create-local-environment/

phpのインストールまでは順調。
php@8.0はインストールできたが、pathが通らない。

```
zsh: command not found: php
```


プロファイルに書き出すコマンドみたいのも、インストール終了後に出ていた。

```
これは「keg」（樽）なんです。
だから、シンボリック・リンクを貼らないんです。
```


みたいな説明が書いてあったが、意味がわからない。
eval expoert source何ちゃらというおまじないが出てきた。
それを入れたのにできなかった。

そこでGoogleで検索すると、こちらの記事がヒット
https://qiita.com/miya1221/items/cf425340baf577b246f9

```
brew --prefix php@8.0
```


出力：
```
/opt/homebrew/opt/php@8.0
```

```
jun@mac-mini ~ % cat ~/.zshrc
export PATH="/opt/homebrew/opt/php@8.0/bin:$PATH"
export PATH="/opt/homebrew/opt/php@8.0/sbin:$PATH"
export PATH="/opt/homebrew/opt/php@8.0/bin:$PATH"
export PATH="/opt/homebrew/opt/php@8.0/sbin:$PATH"
```
なんか、コマンドを２回打ったのか、行がダブってる。

```
export PATH="/opt/homebrew/opt/php@8.0/bin:$PATH"
```

上記を追加して、source。

```
jun@mac-mini ~ % php -v
PHP 8.0.22 (cli) (built: Aug  4 2022 10:20:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.22, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.22, Copyright (c), by Zend Technologies
```


できた。ほっ。

続いてComposerに取り掛かる。
以前にも、Composerがない環境、かつ、パッケージ管理システムにもない環境で、ソースからインストールしたことはあった。
curlっつー便利なもんがあるのか！とその時思いつつ、なんで、Composerとかそんなに色んなもんを使うのかなーとも思った。

今回は、brewにあった。macports上にはComposerがないらしい。
macportsの方が使い慣れていたのだが、今は気力がなくなって、ネット上に情報が多いbrewを使ってしまう。
そもそも、今回CakePHPじゃなくってLaravelにしたものそんな理由。
どちらがいいとかは、私には分からない。

問題なくインストールできた。次はLaravel。

と、ここで気づいたのだが、httpdはインストールしなくて良いのだろうか。
確か、Laravelのフレームワークにテスト用のサーバがあったような。

待てよ、DBとの接続も必要だから、DBも入れないといけないのか。

うーん、そういえば、mariaDBがMySQLから派生して、どうのこうの。
どうなったんだろう。
徐々に違いは出てきているようだが、今回は要件も特にないし、MySQLにした。

ほい。
```
brew install mysql
```
なんかできたみたいだが、再起動にいちいち、homebrewのパスを指定しなきゃなんない。
まあportsでも、/opt/usrとかやってたから、いいか。

ほい。
```
composer create-project laravel/laravel laravel9byexample
```

バージョンを省略すると、最新版の９になるのかな。
1回目、なぜかソケットエラーになった。もう１回打ったらできた。
なぜ？不安。

```
jun@mac-mini ~ % php artisan --version
Could not open input file: artisan
```


がーん。またパスかなぁ。
あ、実行場所が問題なのね。

```
cd larabel9byexample（←さっき作った）
```

ほい。

```
jun@mac-mini laravel9byexample % php artisan --version
Laravel Framework 9.26.1
jun@junnoMac-mini laravel9byexample % php artisan serve

   INFO  Server running on [http://127.0.0.1:8000].  

  Press Ctrl+C to stop the server

  2022-08-30 16:58:12 ................................................... ~ 0s
  2022-08-30 16:58:12 /favicon.ico ...................................... ~ 0s
```

おお、きたきた。

ん？httpdもDBも関係なかったような。
Laravelの学習だけなら、phpだけでいいんですかね。

ただ、まともなアプリを作るならhttpdやDBの設定が必要だから、これからちまちまやっていく。
で、何を作りましょうかねえ。

![スクリーンショット 2022-08-30 17.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139486/35bd35dc-d99d-4880-7e0e-159d9b5993e4.png)
python でオンラインデバッグなら AWS Cloud9 っつー話


普段は自分のマシンにVSCなどを導入してコードを書いています。
それが常に手元にあればよいのですが、持ち込み制限の現場やソフトウェアインストールが制限(インストールするには申請が必要とか)された端末を使うことも多いのでオンラインでいい感じにコード実行とデバッグできる環境が欲しいなと思っていました。
オンラインでコーディングできるサービスは多々ありますがデバッグできるサービスを見つけることができず、なんとかならんかなぁといった感じで過ごしておりました。

そんな折に AWS Cloud9 で簡潔にさくっと、無料利用枠の範囲内で環境を作ることができたので共有です。
(EC2のt2.microの無料利用枠を使うみたいなので他にEC2稼働させてたら請求きそうです。)

また非アクティブ時間が続いたらデフォルト(30分)で自動停止するので、EC2稼働させっぱなしで無駄な請求きちゃった的なことも防止できそうです。

# どげな感じ??
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110165/e04d8406-cfbf-7456-7fd9-daf831627cb8.png)


↑こんな感じです。

# 導入手順
1.AWS の Cloud9 のサービス画面で 「Create environment」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110165/0b2f3229-fe47-adc2-984b-8ef50f627d09.png)

2.Name と Description を好きなように入力し、「Next step」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110165/346aeba3-9432-1610-050a-9a449be013da.png)

3.すぐに使いたい場合はデフォルトでよさげです。「Next step」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110165/b38a7141-21f2-ce65-fbfc-9c15bd1bc18c.png)
※アクセス方法や、インスタンスタイプ、稼働するOSなどを指定することもできます。
  Network settings (advanced)では、稼働するVPC,サブネットを指定することもできます。その場合はパブリックサブネットを指定する必要があります。
(私はサブネットを指定して作成しました。)

4.Review 画面になるので、問題ないことを確認して「Create environment」をクリックします。

5.作成中の画面になります。待っているとエディタ画面にアクセスできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110165/7f1ae63c-df9e-0867-d3f7-26b754ff9c21.png)
※ちなですが裏で、Cloud Formation が流れています。

# デバッグどげんやってやるん?
ブレークポイントにしたいところをクリックして、画面下部の謎のアイコン(デバッグだから虫??)をクリックし緑色になった状態で、RUNで実行するとデバッグできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110165/ca3fcfb2-279d-58db-55df-437fe3b793e9.png)

# 終わり
Javaの日付け型の種類といくつかのメソッドについて


日付を扱うのが苦手で毎度混乱するので、整理しました。
(僕自身が業務で多用する4つの型について)

## 日付け型の種類


### Date
・日付けデータをミリ秒まで扱える
　　しかし、時分秒をセットするメソッドは非推奨になっている

##### よく利用するメソッド

・date型インスタンス.toString
  → Date型をString型に変換

・date型インスタンス.toLocalDate()
  → Date型をLocalDate型に変換

・Date.valueOf(LocalDate date)
  → LocalDate型をDate型に変換



### Timestamp
・日付けデータをナノ秒まで扱える

##### よく利用するメソッド

・Timestamp.valueOf(String s)
  → 文字列をTimestamp型に変換

・Timestamp型インスタンス.getTime()
  → Timestamp型のナノ秒単位を丸めこむ

・Timestamp型インスタンス.toString()
  → Timestamp型を文字列に変換

・Timestamp.valueOf(LocalDateTime dateTime)
  → LocalDateTime型をTimestamp型に変換


### LocalDate
日付(年-月-日として表示されることが多い)を表す不変の日付/時間オブジェクト

##### よく利用するメソッド

LocalDate.now()
  → 現在の日付を年月日まで取得


### LocalDateTime
日付/時間(年-月-日-時-分-秒として表示されることが多い)を表す不変の日付/時間オブジェクト

##### よく利用するメソッド

LocalDateTime.now()　
→ 現在の日付を年月日まで取得
GraalVM Technologies & Use-Cases

Hi, 

This is Nishikawa charging for Java Business　Development　at Oracle Japan.
I hereby would like to introduce GraalVM, the next generation Oracle JDK.

■　Overall
・　　https://www.oracle.com/java/graalvm/
・　　Free Dummies eBook Book Download :
　　　https://www.oracle.com/java/graalvm/graalvm-for-dummies-ebook/

■ Use Cases
a)　Pearson
Minutes to Seconds: Pearson VUE’s GraalVM Journey
https://www.oracle.com/nl/a/ocom/docs/customer-reference-pearson.pdf

b) Standard Chartered Bank
Simplifying the cloud native journey with GraalVM and Helidon
https://blogs.oracle.com/java/post/simplifying-the-cloud-native-journey-with-graalvm-and-helidon

c）Facebook
GraalVM at Facebook
https://urldefense.com/v3/__https://medium.com/graalvm/graalvm-at-facebook-af09338ac519__;!!ACWV5N9M2RV99hQ!e3kNq_A7OMZc0rwP4bK8CiuMOzH6xkTq_6ya9CfeN2nE0A10PAEToRhoz0rti-qjtaC2Qw$

d）Alibaba
https://urldefense.com/v3/__https://medium.com/graalvm/alibaba-becomes-a-member-of-graalvm-advisory-board-dd3e99d5c702__;!!ACWV5N9M2RV99hQ!e3kNq_A7OMZc0rwP4bK8CiuMOzH6xkTq_6ya9CfeN2nE0A10PAEToRhoz0rti-oshin2CA$

e） Others
https://urldefense.com/v3/__https://www.graalvm.org/use-cases/__;!!ACWV5N9M2RV99hQ!e3kNq_A7OMZc0rwP4bK8CiuMOzH6xkTq_6ya9CfeN2nE0A10PAEToRhoz0rti-ogrETotA$

■　Technical Info.
・　Full Doc : https://docs.oracle.com/en/graalvm/enterprise/22/docs/overview/
・　GraalVM Enterprise downloads page ：
　　　https://www.oracle.com/jp/downloads/graalvm-downloads.html


Please freely contact with me through linkedIn for your question and comments.
→ https://www.linkedin.com/in/yojiro-nishikawa-22a268141/


Nishikawa ( yojiro.nishikawa@oracle.com )
Remix IDEでgenerativeNFTのコントラクトをコンパイルしてデプロイしていく作業中Error ”creation of cat_shortcake errored: "from" is not defined.〜”　が表示された。

Remix IDEでgenerativeNFTのコントラクトをコンパイルしてデプロイしていく作業中Error
”creation of cat_shortcake errored: "from" is not defined.〜”　が表示された。

調べた結果

Remix IDEのDEPROY & RUN TRANSACTIONで
CONTRACT下のDEPROYにある
_IN ITBASEURIと
_INIT NOTREVEAL EDURIに

![スクリーンショット 2022-08-30 17.20.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516464/c6ffeecc-fb9f-6dc0-2f40-0d633f7c9d95.png)

ipfs（hashlips art engine/src/config.js/const baseUri に記載）をペーストしたが
最後に「/」スラッシュ記号の入力が無かったことが判明。

対処してErrorは消えました。
アクセストークンとリフレッシュトークンの違い

## アクセストークン
headerにアクセストークンを持たせることでApiを叩くことができる。

## リフレッシュトークン
古いアクセストークン
もうAPIを叩くことができない。
しかし、リフレッシュトークンを渡すことで新しいアクセストークンを受け取ることができる。
再度ログインする必要がない。

# 流れ

## アクセストークンを得る
ログインする。
レスポンス↓
```
{
  expired_at: "2022-08-30 17:10:03"
  expires_in: 60
  token: "eyAAAAAAAAAAAAAAAAAAAAAAA.eyBBBBBBBBBBBBBBBBBBB.cccccccccccccccccccccccccccc"
  token_type: "bearer"
}
```

## アクセストークンが切れる
APIを叩くと401が返ってくる。
レスポンス↓

```
{
  error: Unauthorized
}
```

## リフレッシュする
 `/api/refresh` などのAPIを叩くと、新しいtokenが返ってくる。
ので古いtokenと交換する。
ログインをし直さないでも、tokenが更新される。
```
{
  expired_at: "2022-08-30 17:10:03"
  expires_in: 60
  token: "eyAAAAAAAAAAAAAAAAAAAAAAA.eyXXXXXXXXXXXXXXX.qqqqqqqqqqqqqqqqqqqq"
  token_type: "bearer"
}
```

## 環境設定
.envでアクセストークンの有効期限と、リフレッシュトークンの有効期限を変更することができる
lcobucci/jwtだと、
JWT_TTL(アクセストークンの有効期限)、JWT_REFRESH_TTL（リフレッシュトークンの有効期限）
で設定する。

https://github.com/lcobucci/jwt

## まとめ
アクセストークンが入場チケットで、
リフレッシュトークンが古い入場チケットで、チケット売り場で入場チケットと交換できる券みたいな感じかな。(そんなのないけど)
両方有効期限をつけることができるよ、という感じです。
Wheel Factorizationについて

# はじめに
https://qiita.com/ppza53893/items/e0f464340d6f97760cd5

上で紹介したアルゴリズムの中に「Wheel Factorization」があります。
これをもう少し詳しく説明していこうと思います。

# Wheel Factorizationとは
Wheel Factorizationは試し割り法をより効率的にする手法です。
素数判定アルゴリズムとして有名な試し割り法は、探索する数$N$について、$2\le k \lt N$の整数の$k$でひたすら割るアルゴリズムです。つまり計算量が$O(N)$になり、十分大きな整数が素数かどうかを判定するとなると、非常に時間がかかってしまいます。この$k$の範囲全てを割るのは効率的にも悪いため、できるだけ減らそうという手法がWheel Factorizationになります。

Wheel Factorizationでは、まず小さな素数のリスト$P$を用意します。簡単に、$P=\\{2,3,5\\}$としましょう。
このとき、この素数リスト全てを約数にもつ整数$X=\Pi_{P}x$(例の場合、$X=2\times 3\times 5=3$)のリスト(**円**)を作ります。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783413/2e9a30e8-d843-3038-427e-59f067c35a6a.png">

このリストから、1および$P$のいずれかで割れる数($P$の値そのものは除く)にチェックしていきます(赤色)

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783413/e3ce2dd7-2b70-dfd9-2fa6-8f077b49acc4.png">

このとき、未チェックの要素は全て素数、つまり$\\{2,3,5,7,11,13,17,19,23,29\\}$が残ります。
続いて、$X$を加算した要素を輪のリストの各要素に追加し、さきほどと同様に$P$のいずれかを約数に持つリストにチェックしていきます。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783413/810133a0-4aea-6316-f883-675eb93c3cb7.png">

次も同様にすると、

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/783413/9dbeebb9-aae0-4aad-3b70-1d70fc74da0c.png">

となり、$7\le k\le X+7$に着目すると輪に周期性が現れるのが確認できます。この間隔は$\mathrm{inc}=\\{4,2,4,2,4,6,2,6\\}$となります。
つまり、$\mathrm{inc}$を順番に加算していくことで表される数だけ試し割りに使う数にすればよい、これがWheel Factorizationの手法になります。

# 実装
Pythonで実装すると次のようになります。

```python
import itertools
import operator

# 既知の素数
P = (2, 3, 5)
# はじめの素数
startp = 7

# 総乗を求める
*_, X = itertools.accumulate(P, operator.mul)
X += 1

# [startp, X+startp]のリスト
p_list = list(range(startp+1,X+startp+1))

# 周期を作る
p_temp = [startp]
inc = []
for i, n in enumerate(p_list):
    divisible = False
    for _p in P:
        if n % _p == 0:
            divisible = True
            break
    if not divisible:
        # 割り切れない場合、nから直前の割り切れなかった数を引く
        inc.append(n - p_temp[-1])
        p_temp.append(n)

print(inc)
```

```text
[4, 2, 4, 2, 4, 6, 2, 6]
```

`P`と`startp`を変えればより大きな$\mathrm{inc}$が作れます。ただし、その周期の大きさは$X$と同程度になるので注意してください。

# どのくらい探索回数が減るのか
Wheel Factorizationは試し割に使う数を減らせることができます。言い換えれば、$\mathrm{inc}$が求まれば$P$の要素の倍数については調べる必要がなくなるわけです。

いくつかの数で比較してみましょう。$N=198491317$(11000000番目の素数です)を探索する場合、$\sqrt{N}$までの数で割ればいいので、試し割りは$14090$回探索されます。
Wheel Factorizationについて、$P$を様々なケースで探索すると、次のようになります。

|P|配列の要素数|探索回数|試し割と比べて(倍)|
|-----|-----|-----|-----|
|[2,3]|2|4696|3.00|
|[2,3,5]|8|3757|3.75|
|[2,3,5,7]|48|3220|4.38|
|[2,3,5,7,11]|480|2927|4.81|
|[2,3,5,7,11,13]|5760|2701|5.22|
|[2,3,5,7,11,13,17,19]|92160|2543|5.54|
|[2,3,5,7,11,13,17,19,23]|1658880|2410|5.85|
|[2,3,5,7,11,13,17,19,23,27]|36495360|2305|6.11|

(29以上は私のPCが持ちませんでした)

探索回数はそこまで大幅に減少しません。その一方で、配列の要素数は指数的に増加します。大きくすればいい、ということではないですね。
実際、探索回数は計算量で表記すると$O(N/(\log\log N))$[^1]になります、分母の発散は非常に遅いため、割と小さい$P$の方が効率が良いわけです。

[^1]: https://handwiki.org/wiki/Generating_primes

# おわりに
Wheel Factorizationについて紹介しました。$\\{4, 2, 4, 2, 4, 6, 2, 6\\}$は割と覚えやすい数列なので、2,3,5の倍数を飛ばしたいときは是非つかってみるのをおすすめします。
ただ、この手法は結局$N$に比例して大きくなるので、使える場はわりと限られますが。
【Laravel】データベースのテーブルを関連付けする方法（1対1）

# データベースを操作するEloquentとは？

データベースの操作にはSQL文が必要です

しかし、Laravelには`Eloquent(エロクエント）`という
SQL文が分からなくても`自動でSQL文に翻訳してくれる機能`が存在し
`簡素な命令文`を記述していくことでデータベースを操作することができます



## 1対1の関連付けに必要なEloquent

- 親テーブルを操作するモデルへ`hasOne`メソッドを記述する
- 子テーブルの列（カラム）へ`〇〇〇〇_id`という名の外部キーを用意する（重要）


###  見本のテーブル

ここでは`usersテーブル`を親テーブル
`profilesテーブル`を子テーブルとして
関連付けを行うものとします。
![スクリーンショット 2022-08-30 15.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/3e2303b0-8f1e-938f-dbd0-23e1f24048c1.png)



## hasOneメソッドとは

hasOneは`親テーブル`のあるレコードに対して
1つの`子テーブル`が紐付けられるときに用いられます。
つまり`1対1`の関連性を付与したい場合に適用します

## 1対1とは何か（例）


例：マイナンバーカードと人の関係性を表す場合
- マイナンバーカードは特定の個人を識別するための番号が記されたカードなので1対1になる

例：クレジットカードと人の関係性を表す場合
- 人はクレジットカードを複数枚持つことがあるので関係性は1対多となる

## リレーションにおいて重要なポイント

- 関連付けするためには`親テーブル側と子テーブル側で全く同じな値の列（カラム）が必要`です。
- 見本では親テーブルの`id`そして子テーブル側の`users_id`が同じ値をのため、それが`外部キー`として適用されます
- 元々IDは主キーとして扱われているため、Laravelでのリレーションを設定する際には自動で`外部キー`として適用されます
- 子テーブル側でもIDは主キーとして存在しますがそれとは別に、`親テーブルの名前_id`という列をあらかじめ登録する必要があります


## hasOneメソッドの使い方


app/親テーブルのモデル

```php
class Users extends Model
{
    //hasOne設定
  public function profiles()
  {
      return $this->hasOne('App\Profiles');
  }
}
```

```php
class 親テーブルの名前 extends Model
{
    //hasOne設定
  public function 子テーブルの名前()
  {
  return $this->hasOne('App\子テーブルのモデル名');
  }
}
```


- `public function` の名前は任意で設定できますが一般的には
   関連させる子テーブルの名前が適切です
- `public function`　には命名規則がないため全て小文字にします



## 関連付けに必要なEloquentの外部キー

外部キーとは2つ（もしくはそれ以上の複数）のテーブルを結ぶための
`同じ値が入った列のこと`を指し見本の場合は
usersテーブルの`id`とprofilesテーブルの`users_id`を指します


![スクリーンショット 2022-08-30 15.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/3e2303b0-8f1e-938f-dbd0-23e1f24048c1.png)


## Eloquentによるリレーションの重要な説明
Eloquentによるリレーションでは自動的に以下の列で紐づけするため
子テーブルには必ず次の列（カラム）が必要になります。


列名：`「親モデル名_id」`　
※よって今回の見本の場合は`users_id`が自動で外部キーの扱いになります

## コントローラーへの書き方

モデルにてリレーションの設定が済めば、コントローラーで変数にモデルの情報を代入し
ビューへ変数を渡す必要があります

```php

<?php

namespace App\Http\Controllers;
use App\Users;

 public function index()
    {
        $users = Users::all();
        

        return view('welcome',['users' => $users]);


    }

```
```php

<?php

namespace App\Http\Controllers;
use App\親モデル名;

 public function index()
    {
        $users = 親モデル名::all();
        
        return view('welcome',['親テーブル名' => $親テーブル名]);

    }

```
- 変数の渡し方はリレーションの設定をしていても他の変数を渡す時と何も変わりません
- `use宣言`は外部のファイルを読み込むための記述です

#### use宣言がない場合
- function内部でモデルを参照する際、次のようにフルパスをいちいち宣言しなければなりません
- `namespaceの直下`にuse記載がない場合は見本のようなパスを記述しておきます
- `視認性を良くするため`にも`use宣言`を利用することが推奨されます。 


```php

 public function index()
    {
        $users = \App\親モデル名::all();
        
        return view('ビューのファイル名',['親テーブル名' => $親テーブル名]);

    }

```



## ビューでの使い方

- ビューに渡した変数は`コレクション変数の状態`のため`複数のレコードがまとまった状態`です
- 繰り返し処理（@foreach）を利用し、`1レコードずつに分解`する必要があります。
- 分解したレコードの参照方法は次のとおりです。


```php
@foreach($users as $user)

    <p>{{$user->name}}</p>
    <p>{{$user->profiles->e-mail}}</p>

@endforeach
```
```php
@foreach($users as $user)

    <p>{{$親テーブル名->親テーブルの列名}}</p>
    <p>{{$親テーブル名->子テーブル名->子テーブルの列名}}</p>

@endforeach
```
【備忘録】VScode settings.jsonにつまづいた話（初心者向け）

Visual Studio Codeのsettings.jsonに拡張機能のキーバインドを設定しようといじっていた時、もともと存在していた{}のそとにコピペしたところエラー`End of file expected. jsonc`が出た。

調べてみたところ、jsonファイルは一番最初と最後に{}がないといけないらしい。（知らないとはまるやつ）→もともと存在していた{}の中にコピペして解決（なかったら{}をつけたす）

するとさらにエラーが出る`Expected comma. jsonc(514)`エラーの名前からわかる通りコンマが足りない?らしい。→もともと{}の中に入っていたコードのしりに,をつけて解決
JSONのオブジェクトと配列

# 概要

- JSONのオブジェクトと配列について簡単にまとめる。

# 前提

- 下記を用いてJSONの構文が誤っていないことを確認した

https://lab.syncer.jp/Tool/JSON-Viewer/

# 配列

- `[]`で囲まれた中に値を列挙することで定義する事ができる。

    ```json
    [
      "foo", 
      "var"
    ]
    ```

# オブジェクト

- `{}`で囲まれた中に`"key": "value"`の形式で値を格納することで定義する事ができる。

    ```json
    {
      "id": 1,
      "name": "miriwo"
    }
    ```

- オブジェクトの中にオブジェクトを格納することもできる。

    ```json
    {
      "id": 1,
      "name": "miriwo",
      "other": {
        "id": 1,
        "string": "foo"
      }
    }
    ```

- オブジェクトの中に配列を格納することもできる。

    ```json
    {
      "id": 1,
      "name": "miriwo",
      "string": [
        "foo",
        "var"
      ]
    }
    ```
メタマスク便利ツール　複数ウォレット残高チェック

# メタマスク便利ツール　複数残高チェックツール
__メタマスクなどのイーサリアム系のウォレットをセキュリティ上や用途に分けて複数お持ちの方必見の便利ツール！！__

ウォレット残高を確認する際、作成したメタマスクを一つ一つ開くのにストレスを感じたことはありませんか？

メタマスクの場合さらにチェーンごとに開いて確認しないといけないですよね、、

ワンクリックで同時にすべてのウォレット残高を確認できたらいいのに...
とずっと思っていたら便利なツールを発見しました:relaxed:


__使用方法__


１．ダウンロードした圧縮ファイルをWinRARなどの解凍ソフトで任意のフォルダに解凍
![h000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641705/155e5d59-1c98-222c-c90f-a38d8d06683e.gif)


２．解凍したフォルダ内のwalet.txtを開く
![h001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641705/4393e9d1-c30e-f004-aac0-f7a460e3ba60.jpeg)



３．開いたwalet.txtフォルダ内に任意のアドレスを入力
![h003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641705/f2f082ba-0d59-0bc4-3f65-f2c53099bab7.jpeg)




４．MultiWalletChecker.exe　クリックで起動
![h002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641705/a93ed59e-6711-1d57-87e7-b2f4c5636d96.jpeg)

ツールの公式サイトは[こちら](https://bit.ly/3i9gbNC)
初心者　Flutter x MySQL8 に挑戦する 21 with mysql_client

# 重複を回避、はできないままだけど　

　今日はペライチの長〜いfileを脱却したい。

　最初にトライしたのは、mysql1と同じ【接続】【表示】の２枚方式。ところが、接続をうまく独立させられない。あっちが赤くなったり、こっちが赤くなったり、切りがない。たぶん、用語が微妙に違う。

　ほかに方法はないか？　

　で、用途別に分けることにした。つまりサンプルに含まれる【変更】【追加】【選択】、この３つが今は【接続】の後ろにずらずら並んでいる。これを３つのfileに分ける。残念だけど、それぞれの頭には、全く同じ【接続】の記述をつけている。重複も甚だしいけど、まあ、仕方がない。　

　具体的には、こんな手順で作業した。まあ、笑ってやってください。

- ペライチmain.dartを複製して四枚のfileをつく。
- ファイルを選択するためのフロントページを作る。
- main.dartのMyHomepage以降を削除して、フロントページに遷移する。
- 複製したfileの一枚を、【変更】ページとして、runApp等の部分と【追加】【選択】の部分を削除する。
- 同様に【追加】ページから【変更】と【選択】を、【選択】ページから【追加】【変更】を削除する。
- フロントページから、各ページに遷移するボタンを作る。

　Flutterを始めて一年、さすがにページ遷移は迷わずできるようになった。

　よし、やってみよう。　debug、行け。　

　なんもデザインしていないので、なぜか真っ黒な画面に緑の小さな文字で【変更】【追加】【選択】のボタンが並んでいる。　よしよし。　

　まずは【変更】ページに移動。フローティングアクションボタンを押す。何か表示させるようにはなってないので、何も変わらないが、consoleには変更の表示がある。SequelAceで確認すると、ちゃんと変更されている。　よしよし。 

 ていうか、連打してない、一発で行った。これ、作業を１つに絞った効果なのかな。

　いったん戻って、今度は【追加】ページに移動。こちらも即、反応して、新しいユーザーが追加された。　よしよし。

　また戻って、【選択】ページ。今回はユーザの名前が表示されるはず。　

　行け！　出た！！！

　名前以外のものも出したい。Eメール出そう。Eメールの表示欄を作る。で、どうすればいい。？　

        name = row.colAt(0)!;
        email = row.colAt(1)!;

　これでどうでしょう。　あら、怒られた。(1)なんてないよと。　

　ああ、そうだ、名前だけ取ってたんだわ。じゃあ、全部取ってこよう。　

　お、出た。でも、変。え・・・っと、nameのところにidが、emailに名前が入ってる。なるほど、じゃ、これでどうでしょう。　

        name = row.colAt(1)!;
        email = row.colAt(2)!;

　よっ〜〜しゃ！、名前とEメール、出ました！！　

　でも、今、表示できてるのは、「最後の１行」だけ。consoleには全部プリントされているんんだから、次は全部、表示したい。　


![スクリーンショット 2022-08-30 16.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646810/e5bb0c74-3941-1e1d-d8cc-315f9ec4b7ae.png)


## 明日こそは、リスト表示に挑戦するぞ〜。

https://qiita.com/dongri727/items/c32d328aed5dcca3bba1

https://qiita.com/dongri727/items/422a07e83e21c34a1d68
Ansible で "Failed to import the required Python library (botocore or boto3)…" のエラーが出たときの対処方法

# 状況
Windows PC 上で WSL の Ubuntu を起動し、ここから Ansible で AWS の IAM グループを操作しようとしたところ、以下のようなエラーが発生しました。  
メッセージ中の xxxxxxx は使用している PC のデバイス名です。
```
failed: [localhost] (item={'name': 'group1'}) => {"ansible_loop_var": "item", "changed": false, "item": {"name": "group1"}, "msg": "Failed to import the required Python library (botocore or boto3) on xxxxxxxx's Python /usr/bin/python3. Please read the module documentation and install it in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter"}

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/install-botocore.html
```
ググると、このエラーの対処方法はいくつか出てきますが、どれを試しても解決しなかったのでこちらに対処方法を記載しておきます。

# やってみたこと 
- Playbook 実行時に python のパスを指定 -> 改善せず
    ```
    ansible-playbook -i inventory -e ansible_python_interpreter=/usr/bin/python3
    ```
- ansible.cfg に interpreter_python を追加 -> 改善せず
    ```
    [defaults]
    interpreter_python=/usr/bin/python3
    ```
- そもそも WSL 上に botocore、boto3 がインストールされているのかを確認 -> インストールされている
    ```
    $ pip list |grep boto*
    boto3                  1.24.57
    botocore               1.27.61
    ```
WSL の方は問題なさそうです。ということは、Windows 側の問題か？
# 最終的な解決方法
Windows マシン上に python3 と botocore、boto3 を導入することでエラーが解消されました。  
1. Windows に python3 をインストール
インストーラのダウンロードは[こちら](https://www.python.org/downloads/)から
2. pip をインストール
PowerShellから以下のコマンドでインストールできます。
    ```
    py -m pip install --upgrade pip
    ```
3. botocore、boto3 のインストール
こちらも、PowerShellで実行します。
    ```
    py -m pip install botocore
    py -m pip install boto3
    ```
これで再度 WSL から Ansible の Playbook を実行したところ、エラーが出ずに実行されました。
Windows 側に borocore、boto3 のインストールが必要だったとは…。  

「やってみたこと」の項目で設定した内容はそのまま残してあるので、Windows 側の作業だけで改善しない場合は、ansible.cfg の設定と WSL 上にも botocore 、boto3 が入っていることを確認してみてください。
Flutterで階層操作するやつ

階層を削除したり、追加できる便利な機能です。

![スクリーンショット-676-edited.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627142/a4fbf094-c7d0-d3e5-6dcd-497947d7bccf.jpeg)

これの各OS,VSCode,AndroidStudioでの表示の仕方。

VSCode
Win or Linux : Ctr + .
Mac : Cmd + .

AndroidStudio
Win or Linux : Alt + Enter
Mac : Option + Enter

Qiita初めて書いたので雑かもしれません。
プライベートメソッドのテストを書くな (プログラミングの作法)

# 書かない理由: パブリックメソッドのテストで必要十分だから

「美味しいカレーを作るメソッド」があるとする。

この場合にテストで保証したいのは「美味しいカレーが出来ること」だけなのだ。
どんな包丁や鍋を使うかは全く関係ない。

どんな包丁の使い方をしたかはお客には関係ないのだ。
包丁の使い方までテストしたら、レトルトカレーを使うことにした場合にどうする？

# 書かない理由: リファクタリングの邪魔になる

テスト対象が内部実装の詳細にまで及んでいると、テストに縛られてリファクタリング出来なくなる。
テストが実装を縛るなどあってはならないことである。

仮にプライベートメソッドの構成が変わるたびにそのテストを変更するとしても大層な手間だ。

僕らはテストをするためにテストをしているわけではない。機能保証のためにテストをしているのだ。

# 書かない理由: 書く理由がないから

書いたほうが良い妥当な理由を思い浮かばないのであればそれは書かなくて良いということだ。

「なんとなく書く」「テストが簡単になるから書く」という理由であれば見直した方が良い。


# 書かない理由: テストファーストじゃないから

もしプライベートメソッドのテストの是非について迷ったら「仮にテストファーストならどうしていた？」と考えてみよう。

テストファーストで開発する時に考慮するのはインプットとアウトプットである。
コードの詳細も決まっていない段階でプライベートメソッドのテストなど思いもつかないだろう。

テストファーストで作りようのないテストとは不要なテストだ。

# 例

ここにパブリックメソッドfooがある。
(fooメソッドのテストもあるとする)

```rb
class Example
  def foo
     # 色々な処理
     # 色々な処理
     # 色々な処理
  end
end
```

あなたはこの処理をリファクタリングした。
新しくプライベートメソッドbarを作り、パブリックメソッドbarから呼び出すようにしたのだ。

```rb
class Example
  def foo
     # 色々な処理
     bar
     # 色々な処理
  end

  private

  def bar
     # 色々な処理
  end
end
```


ここであなたはプライベートメソッドbarのテストも追加しようとする。
ちょっと待て。本当に必要か？

今までのfooのテストで動作を保証できていたのに、何故新しくテストを追加するのだ？
たしかにコードはリファクタリングしたが、やっていることは何ひとつ変わっていないはずだ。

メソッドの数だけ律儀にテストを作る必要は何だ？

(そして時が経ち)

あなたはやはりメソッドを元に戻すことにした。




```rb
class Example
  def foo
     # 色々な処理
     # 色々な処理
     # 色々な処理
  end
end
```

プライベートメソッドbarは削除した。
だからそれに対応するテストも削除した。

だがメソッドが1個消えることで不要または実行不可能になるテストであれば、そもそも最初から不要だったのではないだろうか。

# それでもプライベートメソッドのテストが必要な場合

クラス設計の見直しタイミングなのかもしれない。

>プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを示唆している場合があります。テストがどうしても書きたい場合は、その責務はテスト対象のプライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。テスト対象のプライベートメソッドを「クラスの抽出」や「メソッド/関数の移動」を使って、テスト対象のコラボレータのパブリックメソッドとして抽出し、普通にパブリックメソッドとしてテストしましょう。

https://t-wada.hatenablog.jp/entry/should-we-test-private-methods#%E5%88%A5%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8%E3%81%99%E3%82%8B


<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
Reactを基礎から学ぶ①


Reactとは
---
### 1. Composable コンポーネント指向
Reactはコードを細分化することができます。
従来のHTMLだとヘッダーからフッターまでコードを同じページに書くので、見通しが悪いです。
しかし、Reactでは下記のようにコンポーネントに分けて、それらを組み合わて使います。
コンポーネントに分けることによって、管理しやすくなり、様々な場所で再利用することができます。

```jsx
<body>
    <Header />
    <Main />
    <Footer />
</body>
```

### 2. Decleartive 宣言型

Decleartiveとは、宣言型。
簡単にいうと、**「どうやるかではなく、何をするか教えて！」** といった感じです

反対の意味でImperative(命令型)があります。
こちらは **「どうやるか一から教えてください！」** と手順を命令する必要があります。

宣言型のReact vs 命令型のVanilla JavaScriptを見てみます！
例としてブラウザに`<h1 class="header">Hello World!</h1>`を出力します。

```react:React
ReactDom.render(<h1 className="header">Hello World!</h1>, document.getElementById('root'))
```

Vanilla JavaScriptで書き直すと、、
```javascript:Vanilla JS
const h1 = document.createElement("h1");
h1.textContent = "Hello World!";
h1.className = "header";
document.getElementById("root").append(h1);
```
React(JSX)を使うことで、より短く直感的に書くことができますね。


JSX
---
次にReactを使う上で欠かせないJSXについてです。
JSXとは、JavaScript風のHTMLです。(と認識してます。）
JSXを使うことでHTMLのように直感的に書くことが可能になります。
```javascript:JavaScript
const h1 = document.createElement("h1");
h1.textContent = "Hello";
h1.className = "header";
console.log(h1)
ReactDOM.render(element, document.getElementById("root"));

//コンソール出力結果: <h1 className="header">Hello</h1>
```

```javascript:JSX
const element = <h1 className="header">This is jsx</h1>
console.log(element)
ReactDOM.render(element, document.getElementById("root"));

/* コンソール出力結果： JSオブジェクトを返す
{
...
props: {
    className: 'header', 
    children: 'This is jsx'
 }
ref: null
type: "h1"
_owner: null
_store: {validated: false}
...
}
*/
```
【Visual Studio】HoloLens2へのアプリ配置が失敗するときに確認すべきこと

### ビルドの設定の確認
基本的には，「Release」「ARM64」PCと有線接続で「デバイス」を選ぶ．
アプリでARM64のものを使っていなければARMでもいいらしい（ここはよくわからない）

### 配置に失敗するとき→リモートでの配置を試す
有線接続で「ブーストラップにマシンが接続できませんでした」などと出て配置失敗するときは<b>「Release」「ARM64」「リモートコンピュータ」</b>に変更して再度配置してみる（詳しくは↓参照）．

### リモートコンピュータへの配置手順
Visual Studioで「デバッグ」→「（アプリ名）のデバッグプロパティ」→「デバッグ」→「コンピュータ名」にHoloLens2のIPアドレス入力（IPアドレスはHoloLens2の開発者モードで確認可能）してビルド．


それでもできないときは，PCにすでにある .slnファイルと アプリ名フォルダ を一旦削除→Unityで再ビルド で正しくHoloLens2に配置できた（再現性あるかは不明）．

・同じアプリをすでにバックグラウンドで開いていたら，新しく開いたアプリのほうには何も表示されなくなる？

### それでもビルドできないときは
・HoloLens2再起動
・HoloLens2の電源が切れていないか確認
・配置できない「.sln」ファイルとアプリ名のフォルダをPCから一旦削除，HoloLens2からもアプリをアンインストール→Unityで再度ビルドしなおす→再びVisual Studioから配置

今のところはこいつら全部やればなんとかなっている

※リモートコンピュータで配置するときはPCとHoloLens2を同じネットワークにつなぐ必要があることに注意！
有線LANのコンピュータの場合はWi-Fiにつなげるドングルなどを使用すると良い．
Packages excluded due to repository priority protections の解決方法

EC2 で、clamd が、OUTDATED だぞーと怒られ、新しいパッケージにしないとfreshclam できない問題が発生した。


```
# yum update clamd
```

しかし、アップデートできない。これは、Packages excluded due to repository priority protections ということらしい。これを解決するために、以下のコマンドを実行した。

```
# sed -i 's/priority/#priority/g' /etc/yum.repos.d/amzn2-core.repo
```

アップデートできた。
また戻しておいた。また怒られたらやってみるということで。
```
# sed -i 's/#priority/priority/g' /etc/yum.repos.d/amzn2-core.repo
```

これでもうまく yum update できなければ、普通に以下で対応。


```
# yum --disablerepo="*" --enablerepo=epel update clamd
```

(参考)
https://support.plesk.com/hc/en-us/articles/213958545-Plesk-upgrade-on-CentOS-RHEL-fails-Packages-excluded-due-to-repository-priority-protections-
システムを止めない工夫

システムは動くと便利だ。
その分止まってしまうと困る。
なのでシステムが止まらない信頼性を高める手法が用いられます。

# デュアルシステム
```２組のシステムを使って```信頼性を高めます。
システムを```並列に繋げて処理結果も検証```される。
しかし２台分のお金がかかる

# デュプレックスシステム
こっちも```２台システム(主系と従系)```を用意するが処理を分担している。
主系は```正常に運転する、従系はバッチ処理```を分担して処理する。
主系が故障した場合は、```従系が主系の処理を代替```する。
切り替えには２種類ある。

デュプレックスには２重という意味がある。

## 切り替えの種類
### ホットスタンバイ
主系が故障しても
いざという時に```瞬時に切り替える```ことができる。
そのため
主系の処理を```引き継ぐために必要なプログラムを起動しておく```。

### コールドスタンバイ
従系は出番が来るまで```別の作業をしていたり、電源がオフの状態```だったりする。
そのため
```コストダウンはできるが、切り替えに時間がかかる```。

# 問題を解いた時の気づき
## マルチプロセッサシステムとは？
* 1台のコンピュータに```複数のCPUを搭載して一連の処理を行うシステム```のことである。
出典 https://www.weblio.jp/content/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0

* マルチプロセッサシステムは、```複数のプロセッサを有する```単一のコンピュータシステムです。マルチプロセッサシステムの目的は```処理能力の向上や可用性の向上```です。
出典 https://basics.k-labo.work/2017/10/11/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/

## マルチユーザシステムとは？
* 一人のユーザーではなく、```複数のユーザーが同時にログインして利用する```ことを前提とするシステム。計算機資源が乏しかった時代には、複数のユーザーで1つの計算機を共有できるようにするため、この方式が広く利用されていた。現在でも、大型計算機やUNIXシステムなどは、マルチユーザーシステムをそのまま継承している。
    出典　https://kotobank.jp/word/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-13293#:~:text=%E4%B8%80%E4%BA%BA%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F,%E5%BA%83%E3%81%8F%E5%88%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%9F%E3%80%82

* ```同時に複数のユーザが使用可能```なシステムのこと。
    出典 " https://gihyo.jp/book/2020/978-4-297-11781-8 "のp６１８
Sandbox 組織の拡張ドメイン適用タイミングの変更


いやぁ、悪魔の調べみたいなメールが確かに届いた。何をやっったらいいんだと思っていたら質問に上がってました。
[ATTENTION: Change in Enhanced Domains Enforcement Timing for Your Sandbox Org](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J7eWH)

この更新は、ユーザーがシングル サインオン (SSO) 経由でサンドボックスにアクセスすることを確認したため、以下の表の組織 ID に対する拡張ドメインの適用が Spring '23 リリースに延期されることをお知らせするものです。

# 回答の整理

詳しく述べられていますが、私の組織ではあんまり関係ないかな？
４番だけは気にしておこう。

1. 更新が開始されていない場合でも、[私のドメイン] ページで [ルーティング] セクションの [拡張ドメインの適用を Spring '23 まで延期する] チェックボックスをオンにすることで、Spring '23 リリースまで適用を延期できます。
2. あなたのより広い質問に対する答えは、「場合による」です。組織の URL が変更されるため、特定の MFA メソッドと SSO メソッドは Sandbox 組織で機能しなくなります。これらの方法のいずれかに依存している場合、少なくとも一部のユーザーがログインの問題を経験する可能性があります。ユーザーがユーザー名/パスワードと、URL に依存しない多要素認証方法を使用してログインする場合、ユーザーは現在行っていることを続行できるはずです。デバイスの Touch Id や、デバイスのポートに直接差し込む U2F キーなどの「組み込みのオーセンティケータ」は、破損する可能性があります。(私たちはこれらの方法のどちらも使用していないので、私が知っているのはこれだけです。)
3. Azure Active Directory などのサード パーティの ID プロバイダーを使用して SSO による ID 管理を処理する場合、おそらく問題が発生します。これにより、潜在的な問題を完全に理解することなく、展開をテストしたサンドボックスから締め出されました.
4. 使用する他のログイン方法に関係なく、**管理者権限を持つ少なくとも 1 人のユーザーが、ローカル資格情報 (ユーザー名/パスワード) + 多要素認証を使用して組織にログインできることを確認する必要があります。** 組織でこれを行うには、(a) Salesforce Authenticator を MFA メソッドとして接続し、(b) セッション設定で多要素認証を高保証ログイン メソッドとして追加しました。2 番目 (b) のステップは重要です。なぜなら、管理者プロファイルにはログインの高度な保証要件があるからです。この手順を怠ると、MFA は高保証の方法として認識されず、設定していない可能性があります。   

MFA に Salesforce Authenticator を使用する必要はありません。Google と Microsoft には、TOTP (一時的なワンタイム パスワード) を生成できるアプリがあります。SSO ログインに Microsoft Authenticator を既に使用していたため、Salesforce Authenticator を使用しました。また、SF Authenticator はネイティブであり、プッシュ通知を送信するため、1 回のタップで承認でき、検証コードをいじる必要がありません。

URL は変更されないため、本番組織ではこの問題は発生しませんが、特に SSO を使用している場合は、管理者用の 2 番目のログイン方法が必要です。
Eclipse SQLファイルの文字が見にくい問題

## 前提
Windowsです
職場でeclipseを使っているのですが、
ずっとVSCodeを使っていたので見にくく感じ、
テーマをVSCodeみたいに変更しました
\_\_**[参考にしたサイト](https://qiita.com/oh_yeah_sayryo/items/aa8cb1a82fe2471598a9)**\_\_

テーマを変更したのはいいものの、SQLファイルの文字が黒くて見えにくかったので、
文字の色を変更しました。

## 方法
[1] ウィンドウ>設定から
`データ管理`>`SQL開発`>`SQLエディタ`>`構文の色指定`
[2] `その他`の`色(C)`の横にあるチェックボックス（`デフォルトの前景色(F)`）を外す
[3] 色を変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661107/2e85e676-42d0-d325-4183-5fe27ceb524a.png)
[4] eclipseを再起動する

\_\_**[参考にしたサイト](https://www.web-dev-qa-db-ja.com/ja/sql/eclipsesql%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%81%AE%E9%80%9A%E5%B8%B8%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E8%89%B2/1050382736/)**\_\

参考になれば幸いです
もし、手順通りにやってできなかったら教えてください
(引用) エンジニアに必要な自律型人材とは

>自立型人材は、物事の原因を自分に求めます。というよりも、世の中に対して善悪の二元論でものを捉えず、今より良い状態にするために自分がどうしたらよいか？という問いを常に抱えています。そのため、課題に対して正面から向き合うことができ、解決のためには、人間関係のリスクを恐れずに勇気を出して、行動をとることができます。

広木 大地. エンジニアリング組織論への招待　～不確実性に向き合う思考と組織のリファクタリング (Japanese Edition) (Kindle の位置No.1506-1509). Kindle 版. 

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
UnrealEngineで特定のアクタを自分だけ映さないようにする

マルチプレイやSceneCaotureComponentがある中で特定のアクタを自分（プレイヤーのカメラ）だけ映さないようにする方法をメモしておきます。

# 確認環境

UE4.27.2

# Visibility、HiddenInGameを使う方法

ComponentのVisibilityかActorのHiddenInGameを使って対象を非表示にします。

ただし、マルチプレイの場合はActorやComponentのReplication設定によってサーバーでの変更がクライアントに反映され、サーバーのみ不可視にするのが不可能な場合があります。
HiddinInGameの場合は、ActorのReplication設定でAlways RelevantとReplicatesがオンの場合やActorのReplicatesがオンでStaticMeshComponentなどのComponent Replicatesがオンの場合にサーバーでの変更がクライアントにも反映されていました。
Visibilityの場合は、ActorのReplicatesがオンでStaticMeshComponentなどのComponent Replicatesがオンの場合にサーバーでの変更がクライアントにも反映されていました。
（上記以外でもサーバーの変更が反映される条件があるかもしれません）

また、対象はSceneCaptureComponentやプレイヤーのカメラに一律に映らなくなります。

# 自分だけ映さない方法

[APlayerControllerのHiddenActors](https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/GameFramework/APlayerController/HiddenActors/)に隠したいアクタを追加します。
マルチプレイでも他のサーバーやクライアントには影響しません。
また、プレイヤーのカメラだけに映らなくなってSceneCaptureComponentには映ります。

HiddenActorsはBlueprintに公開されていないのでAPlayerControllerを継承したクラスで以下のようにしておくとBlueprintから利用できます。

```cpp
	UFUNCTION(BlueprintCallable)
	void AddHiddenActor(AActor* Actor)
    {
       HiddenActors.Add(Actor);
    }
```

[HiddenPrimitiveComponent](https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/GameFramework/APlayerController/HiddenPrimitiveComponents/)もあるのでそちらも使えそうです。

# おまけ：SceneCaptureComponentで特定のアクタを映さないようにする

[HiddenActors](https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Components/USceneCaptureComponent/HiddenActors/)があってBlueprintにも公開されています。
[HiddenComponents](https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Components/USceneCaptureComponent/HiddenComponents/)もありますがBlueprintには公開されていません。
そのかわり、[HideActorComponents](https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Components/USceneCaptureComponent/HideActorComponents/)、[HideComponent](https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Components/USceneCaptureComponent/HideComponent/)、[ClearHiddenComponents](https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/Components/USceneCaptureComponent/ClearHiddenComponents/)などのメソッドは用意されてるみたいでBlueprintから利用できます。
３点を通る円「高知女子大学2009年前期生活デザイン学科第２問(1)」をwolframAlphaとsympyでやってみた。

３点(0,0),(4,0),(1,3)を通る円

オリジナル

https://mathmathmass.exblog.jp/32201943/

上と同じです。大学入試数学問題集成＞【２】

https://mathexamtest.web.fc2.com/2009/200911821/2009118210200mj.html

# wolframAlphaで

https://www.wolframalpha.com/input?i=%E5%86%86+%280%2C0%29%2C%284%2C0%29%2C%281%2C3%29&lang=ja

# sympyで
＞円の方程式の一般形からいくのが普通ですが，
　円の中心は，弦の垂直二等分線２本の交点で求められる，という別解もあります。(オリジナルより)
sympyに【解答3】もありました。


【解答1】(T氏様の手順)
```python
from sympy import *
var('x y p q r')
En=Eq(x**2+y**2+p*x+q*y+r,0)
En1=En.subs({x:0,y:0})
En2=En.subs({x:4,y:0})
En3=En.subs({x:1,y:3})
ans=solve([En1,En2,En3],[p,q,r])
print("#",Circle(En.subs({p:ans[p],q:ans[q],r:ans[r]}).lhs))
# Circle(Point2D(2, 1), sqrt(5))
```
上と同じです。
```python
from sympy import *
var('x y p q r')
En=Eq(x**2+y**2+p*x+q*y+r,0)
ans=solve([En.subs({x:0,y:0}),
           En.subs({x:4,y:0}),
           En.subs({x:1,y:3})
          ],[p,q,r])
print("#",Circle(En.subs({p:ans[p],q:ans[q],r:ans[r]}).lhs))
# Circle(Point2D(2, 1), sqrt(5))
```




【解答2】(T氏様の手順)
```python
from sympy import *
O=Point(0,0)
A=Point(4,0)
B=Point(1,3)
OAM=Line(O,A).perpendicular_line(Rational(1,2)*(O+A))
ABM=Line(A,B).perpendicular_line(Rational(1,2)*(A+B))
M=OAM.intersection(ABM)[0]
print("#",Circle(M,M.distance(A)))
# Circle(Point2D(2, 1), sqrt(5))
```
【解答3】
```python
from sympy import *
print("#",Circle(Point(0,0),Point(4,0),Point(1,3)))
# Circle(Point2D(2, 1), sqrt(5))
```



# 参考
【解答4】
解答方法は、他にもエクセルVBAソルバーあります。解は、小数点表示です。ルート(√)表示できません。
以下,値は異なります。(0,3)(-1,0)(-3,4)

https://qiita.com/mrrclb48z/items/52efe33c951381f71b1a

【解答5】
Tuple

https://qiita.com/mrrclb48z/items/36eb751ac44698659612#sympy%E3%81%A7
文系新卒がAWS SAAを3週間で合格

こんにちはー
今年、法学部を卒業したバリバリ文系の新卒です。


# バックグラウンド
僕は4月の時点ではMacのショートカットという概念も、Excelの関数という概念も知りませんでした。
(大学ではWordしか使わなかったので、、、)
そのため、データベースやクラウドなど知るはずもありません。



そんな状態から、IT企業に就職をすることになったので、勉強を始めることにしました。
結果、AWS CLFを5月に取得していたのが前提条件ですが、SAAを3週間の勉強で7月中旬に合格しました。



ではどのようにテスト対策をしたのか書いていきます


# 勉強方法
シンプルですが、どうかご勘弁を！
1.オレンジ本を読む(わからないのは当たり前なので、とりあえず一通り読む）

2.Udemyで模擬試験問題集を購入し、全てのテストで90%を取れるようにひたすら繰り返す



以上です。

僕は特にAWSを使っていないので、本当にこれだけしかしていないです。

テストに合格するだけなら、これで十分かと思います。



ただ、本番では模擬試験と同じ問題がほとんど出ません。知らないサービス名もでます。

いかに慎重に、集中力を持続させて解くのかが重要となります。



ではでは
メソッドは何行に納めるべきか

`メソッドは20行以内に収めましょう` なんてコーディング規約がある。

少なすぎない？って話もあるだろうけど、所詮はコーディング規約なので、20行を超えても害はない。

じゃぁこの20行というのはどこからきたのか。

コンピュータにとっては行数などどうでもいい。メソッド分割されてあちこちに飛ばされるオーバーヘッドだけをみればむしろマイナス。なので行数を納めるのは人間のため。

人間にとっての20行というのは「1画面に収まる範囲」ということ。いやもっと入るよと言う意見もあるかもしれないけど、100行ってわけにはいかず、せいぜい30行程度でしょう。

じゃぁもう意思をしてて無理やりメソッドを分割すればいいんだよねと分けても、変数のスコープがメソッドの外にあったら「1画面で収まる」にはならない。グローバル変数がダメだと言われてるのは、その変数がどこで何されてるかが分からないから。メソッドを分割するだけではなく変数のスコープも1画面に収まっていてほしい。

だからグローバル変数はもちろんのこと、インスタンス変数もむやみに使わない方がいい。DBコネクションのように「プログラム全体を通じて覚えていてほしいもの」だけがスコープの外にあるべき。

メソッドだけではなくループを書くときもループの外に変数があると、分かりづらいから配列を変換するだけならmapを使う方が、変数のスコープが一つ減る。ループの中で何かを集計する場合でも集計済の変数を外で定義するのとスコープが広くなりすぎるので、すべて再帰でやりましょうという主義もある。

すべて再帰でかけばループの変数のスコープを閉じ込めることはできるんだけど、「メソッドが20行以内」に収まっていれば、どうせ1画面に収まってるのでありがたみは少ない。
Pythonで AWSのAccount内のIAMユーザ一覧 を取得してみました

## 概要

AWS の あるAccount内の IAMユーザを取得する Pythonプログラムを作成してみました。

- IAMユーザの取得方法は、以下２パターン
  - Client情報としての取得 : dict型で取得されます
  - Resource情報としての取得 : list型で取得されます

### 実行環境

macOS Monterey 12.3.1 
python 3.8.12


### 実行プログラム

```python:GetUsers.py
import boto3
import pprint

## Client としてのユーザ一覧の取得
def get_users_client():
    session = boto3.session.Session(profile_name='iapp')
    client = session.client('iam')

    # client = boto3.client('iam')
    users = client.list_users()
    print("\nAccount内のユーザ一覧をClient情報として取得")
    pprint.pprint(users)
    print(type(users))
    print("")


## Resource としてのユーザ一覧の取得
def get_users_resource():
    session = boto3.session.Session(profile_name='iapp')
    resource = session.resource('iam')

    # resource = boto3.resource('iam')
    users = list(resource.users.all())
    print("\nAccount内のユーザ一覧をResource情報として取得")
    pprint.pprint(users)
    print(type(users))
    print("")


# メイン
if __name__ == '__main__':
    get_users_client()
    get_users_resource()
```

### プログラムの実行

```
## それぞれの方法による User一覧情報の取得
$ python GetUsers.py

Account内のユーザ一覧をClient情報として取得
{'IsTruncated': False,
 'ResponseMetadata': {'HTTPHeaders': {'content-length': '3187',
                                      'content-type': 'text/xml',
                                      'date': 'Tue, 30 Aug 2022 01:53:51 GMT',
                                      'x-amzn-requestid': 'c68c68b8-cccc-aaaa-8536-24d8124d814f'},
                      'HTTPStatusCode': 200,
                      'RequestId': 'c68c68b8-cccc-aaaa-8536-24d8124d814f',
                      'RetryAttempts': 0},
 'Users': [{'Arn': 'arn:aws:iam::222222222222:user/user001',
            'CreateDate': datetime.datetime(2021, 4, 16, 1, 13, 8, tzinfo=tzutc()),
            'PasswordLastUsed': datetime.datetime(2022, 5, 27, 5, 35, 40, tzinfo=tzutc()),
            'Path': '/',
            'UserId': 'AAAA2SLAHHH4QQQQQQQQQ',
            'UserName': 'user001'},
           {'Arn': 'arn:aws:iam::222222222222:user/costusage',
            'CreateDate': datetime.datetime(2022, 8, 22, 7, 10, 58, tzinfo=tzutc()),
            'Path': '/',
            'UserId': 'AAAA2SLAHHH4TTTTTTTTT',
            'UserName': 'costusage'},
           {'Arn': 'arn:aws:iam::222222222222:user/vRealizeInsight',
            'CreateDate': datetime.datetime(2019, 12, 18, 2, 25, 14, tzinfo=tzutc()),
            'Path': '/',
            'UserId': 'AAAA2SLAHHH4RRRRRRRRR',
            'UserName': 'vRealizeInsight'}]}
<class 'dict'>


Account内のユーザ一覧をResource情報として取得
[iam.User(name='user001'),
 iam.User(name='costusage'),
 iam.User(name='vRealizeInsight')]
<class 'list'>
```

### まとめ

これで Account内の IAMユーザ一覧 を取得できるようになりました

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[Boto3（AWS SDK for Python）の利用する認証情報](https://qiita.com/tsukamoto/items/00ec8ef7e9a4ce4fb0e9)
QuickSightにおけるビジュアルの表示・非表示制御

# ＜はじめに＞
今回はQuickSightの機能に関する紹介です。
QuickSightで複数のビジュアルを表示する際に、ダッシュボード内に多数のビジュアルがあることで特定のグラフが小さくて見ずらいことや配置スペースに困ってしまうことはありませんでしょうか？

今回そんな場合に使うことが出来るビジュアルの表示・非表示制御に関する設定方法をご紹介します。


# ＜前提条件＞
QuickSight バージョン：2022/08/30以降のもの
QuickSight エディション：Standard以上
AUTHORユーザであること

# ＜作業手順＞
①分析の設定を「フリーフォーム」に設定
②表示制御用パラメータの作成
③表示制御用のコントロールの作成
④ビジュアルの表示制御設定
⑤ビジュアルの表示位置の調整
⑥ダッシュボードの公開

## ①分析の設定を「フリーフォーム」に設定
設定を行う分析を開き、メニューの「設定」からレイアウトの形式を「フリーフォーム」にチェックを入れ「適用」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/16bb88f2-8d48-98f8-f812-a799d00d03cc.png)

## ②表示制御用パラメータの作成
表示切替を行うための制御用パラメータを作成します。
メニューの「パラメータ」から、「+」を押下し下記のパラメータを作成します。
~~~
＜設定値＞
    名前：任意の名称（今回はSwitch）
    データタイプ：文字列
    値：単一の値
    静的デフォルト値：任意の値（今回は棒グラフ）
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/1bf2a167-5152-237d-17b0-143a2f1458ce.png)
## ③表示制御用のコントロールの作成
作成したパラメータに対して、下記設定内容にてコントロールを作成します。
~~~
＜設定値＞
    名前：任意の名称（今回は表示方法切替）
    スタイル：ドロップダウン
    値：特定の値
    　　棒グラフ
    　　円グラフ
    パラメータにデフォルト値が設定されている場合、コントロール値から「すべてを選択」オプションを非表示にします：有効
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/bcde11bc-eafe-d887-fba7-bb17efe4df39.png)

## ④ビジュアルの表示制御設定
対象のビジュアルを選択し、「✎」ボタンから「ビジュアルのフォーマット」の設定を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/fcb565f4-abf6-cd28-d6fc-eee7a208f715.png)

「ビジュアルのフォーマット」の「ルール」から「このビジュアルをデフォルトで非表示にする」を有効化し、「ルール」を追加を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/c732910c-aef2-9202-b369-8992b546a030.png)

下記内容にてルールの設定を行い、「追加」を押下する。
~~~
＜設定値＞
    パラメータ：手順②にて作成したパラメータ（今回はSwitch）
    条件：次と等しい
    条件内容：棒グラフ
    処理：このビジュアルを表示する
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/5db82875-7151-d894-9432-cbb66e60cdb3.png)

同様の手順にて、「円グラフ」を表示しているビジュアルに対しても条件内容を「円グラフ」として設定を行います。

## ⑤ビジュアルの表示位置の調整
2つのビジュアルの位置調整を行い、今回の手順ではオブジェクトを重ねた位置に配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/fa19be28-7870-9e54-0d83-d6d4e098c3b2.png)

## ⑥ダッシュボードの公開
ダッシュボードを公開し、コントロール「表示方法切替」にてダッシュボード内のビジュアルの表示内容が切り替わっていることを確認します。

**・「表示方法切替」にて「棒グラフ」を選択**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/b537320c-f7ab-3b50-5723-e97113c3c730.png)

**・「表示方法切替」にて「円グラフ」を選択**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711422/54f79ac8-e13a-4b24-3a64-9329003ee78e.png)

# ＜おわりに＞
パラメータおよびコントロールを活用することで、表示するビジュアルを切り替えることが出来るようになりました。
これにより限られたスペースを活用して表示内容を切り替えて表示することも出来ますので、1つのダッシュボードで表現できる内容の幅が広がるようになります。
Pythonで Boto3（AWS SDK for Python）の利用する認証情報を取得してみました

## 概要

Boto3（AWS SDK for Python）の利用する認証情報取得後、Account_ID を取得する Pythonプログラムを作成してみました。

- 利用する認証情報の取得方法は、以下３パターン
  - カレント接続情報 : ~/.zchenv 等に定義している AWSの認証情報
  - プロファイル情報 : ~/.aws/credentials に定義している AWSの認証情報
  - 環境変数情報 : 別途、~/.zchenv 等で定義した AWSの認証情報

### 実行環境

macOS Monterey 12.3.1 
python 3.8.12

### 設定ファイルの例

```python:.zchenv
# AWS
export AWS_ACCESS_KEY_ID=AAAAAAAAAAAAAAAAAAAA
export AWS_SECRET_ACCESS_KEY=DEPAP77776666KLxvbLA75075OtttJUUU+ch5pr7
export AWS_DEFAULT_REGION=ap-northeast-1

# AWS Billing
export AWS_COST_ALL_ID=BBBBBBBBBBBBBBBBBBBB
export AWS_COST_ALL_KEY=BIPAP55554444KLxvbLA53053OtttJUUU+ch3pr5
```

```python:.aws/credentials
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = DEPAP77776666KLxvbLA75075OtttJUUU+ch5pr7
[billing]
aws_access_key_id = BBBBBBBBBBBBBBBBBBBB
aws_secret_access_key = BIPAP55554444KLxvbLA53053OtttJUUU+ch3pr5
[iapp]
aws_access_key_id = CCCCCCCCCCCCCCCCCCCC
aws_secret_access_key = IAPAP33332222KLxvbLA31031OtttJUUU+ch1pr3
```


### 実行プログラム

```python:GetAccountId.py
import os
import boto3

#
# カレント接続情報からの Account_IDの取得
#
def get_current_account_id():
    client = boto3.client('sts')
    account_id = client.get_caller_identity()["Account"]
    print("\nカレント接続情報からの Account_IDの取得 : ", account_id, "\n")


#
# プロファイル情報からの Account_IDの取得
#
def get_profile_account_id():
    session = boto3.session.Session(profile_name='iapp')
    client = session.client('sts')
    account_id = client.get_caller_identity()["Account"]
    print("プロファイル情報からの Account_IDの取得 : ", account_id, "\n")


#
# 環境変数情報からの Account_IDの取得
#
# 各アカウントの認証情報
ACCOUNT_ENV = {
    "BILLING_ID": os.environ['AWS_COST_ALL_ID'],
    "BILLING_KEY": os.environ['AWS_COST_ALL_KEY']
}

def get_environment_account_id():
    session = boto3.session.Session(aws_access_key_id=ACCOUNT_ENV['BILLING_ID'], aws_secret_access_key=ACCOUNT_ENV['BILLING_KEY'])
    client = session.client('sts')
    account_id = client.get_caller_identity()["Account"]
    print("環境変数情報からの Account_IDの取得 : ", account_id, "\n")


# メイン
if __name__ == '__main__':
    get_current_account_id()
    get_profile_account_id()
    get_environment_account_id()
```

### プログラムの実行

```
## それぞれの方法による Account_ID の取得
$ python GetAccountId.py   

カレント接続情報からの Account_IDの取得 :  111111111111

プロファイル情報からの Account_IDの取得 :  222222222222 

環境変数情報からの Account_IDの取得 :  333333333333
```

### まとめ

これで Lambda/Functions の利用時、環境変数で定義した認証情報を取得できるようになりました

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[Boto3（AWS SDK for Python）の利用する認証情報](https://qiita.com/tsukamoto/items/00ec8ef7e9a4ce4fb0e9)
Pythonで configparser を利用して設定ファイルから設定情報を取得してみました

## 概要

セクション付きの設定ファイルから設定情報を取得する Pythonプログラムを作成してみました。標準ライブラリの configparser を使用しています。

### 実行環境

macOS Monterey 12.3.1 
python 3.8.12

### 設定ファイルの準備

本来なら、「.ini」ファイルだと思いますが、手っ取り早く実施するために「~/.aws/credentials」ファイルを利用します。

```python: .aws/credentials
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = DEPAP77776666KLxvbLA75075OtttJUUU+ch5pr7
[billing]
aws_access_key_id = BBBBBBBBBBBBBBBBBBBB
aws_secret_access_key = BIPAP55554444KLxvbLA53053OtttJUUU+ch3pr5
[iapp]
aws_access_key_id = CCCCCCCCCCCCCCCCCCCC
aws_secret_access_key = IAPAP33332222KLxvbLA31031OtttJUUU+ch1pr3
```


### 実行プログラム

```python:GetConfigParser.py
import os
import sys

# 設定元ファイルの確認表示
with open("/Users/myuser/.aws/credentials", "r") as fr:
    out = os.path.expandvars(fr.read())
    sys.stdout.write(out)


################ ここからが本題、、、、、
import configparser

# 設定ファイルを読み込む準備
config_ini = configparser.ConfigParser()
config_ini.read('/Users/myuser/.aws/credentials', encoding='utf-8')

# セクションを指定しての読み込み
config = config_ini['iapp']

# 変数の読み込み
iam_id = config.get('aws_access_key_id')
iam_key = config.get('aws_secret_access_key')

# ターミナル出力
print('\nid = ', iam_id, '    key = ', iam_key, "\n")
```

### プログラムの実行

```
## 設定情報の取得
$ python GetConfigParser.py      
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = DEPAP77776666KLxvbLA75075OtttJUUU+ch5pr7
[billing]
aws_access_key_id = BBBBBBBBBBBBBBBBBBBB
aws_secret_access_key = BIPAP55554444KLxvbLA53053OtttJUUU+ch3pr5
[iapp]
aws_access_key_id = CCCCCCCCCCCCCCCCCCCC
aws_secret_access_key = IAPAP33332222KLxvbLA31031OtttJUUU+ch1pr3

id =  CCCCCCCCCCCCCCCCCCCC     key =  IAPAP33332222KLxvbLA31031OtttJUUU+ch1pr3 
```

### まとめ

環境変数を利用しない方法もありですね。

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[Pythonで設定ファイルを読み込む処理をラップしてクラスとして扱うと便利](https://nainaistar.hatenablog.com/entry/2021/10/01/120000)
qube render farm submit aftereffects job and convert to mp4

Download all the job file here
https://github.com/aizwellenstan/AfterEffects_qube_render_job/archive/refs/heads/main.zip

Step 1. Toolbar -> Submit->Job From File
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/9fe1d37c-77bb-e6d9-c77d-35d6dfb089bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/5549b0ab-16ea-cd6f-22d9-9c82fd3d1b33.png)

Step 2. Change Settings and Submit
- Project file
- Composition
- Output File Path
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/f36818f5-b272-defc-a425-1e7afa9c5ccf.png)

Step3. Submit avi2mp4 job
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/4d5de084-7c9c-62ce-f7a2-832d8402190d.png)

Step4. 
- make sure output file path is the same as Step2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/18dc9207-cd5f-526a-3dc9-1cbc59856d96.png)

- click on "Expert Mode"
- add Dependency with your job id
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/c4e21038-042b-41db-70c0-67cb5c0b0f80.png)

* berfore sumbit check if your folder already have a output mp4, if exists remove it.

---
```aecs6.bat
@echo off
"C:\Program Files\Adobe\Adobe After Effects CS6\Support Files\aerender.exe" %*
```
```ae2020.bat
@echo off
"C:\Program Files\Adobe\Adobe After Effects 2020\Support Files\aerender.exe" %*
```
```ae2021.bat
@echo off
"C:\Program Files\Adobe\Adobe After Effects 2021\Support Files\aerender.exe" %*
```
```ae2022.bat
@echo off
"C:\Program Files\Adobe\Adobe After Effects 2022\Support Files\aerender.exe" %*
```

Download ffmpeg
https://github.com/BtbN/FFmpeg-Builds/releases

```avi2mp4.bat
@echo off
set arg=%*

setlocal enabledelayedexpansion

set args=%*
set arr.length=0

if #!args!==# goto :usage

for %%I in ("%args: =" "%") do (
    set val=%%I
    set arr[!arr.length!]=!val:"=!
    set /a arr.length=!arr.length! + 1
)

set /a arr.Ubound=%arr.length% - 1
set targetFile = ""
for /L %%I in (0, 1, %arr.Ubound%) do (
    echo !arr[%%I]!|find "output" >nul
    if not errorlevel 1 (
      set /a idx=%%I+1
    )
    if %%I == !idx! (
      I:/script/bin/td/tools/ffmpeg-master-latest-win64-gpl-shared/bin/ffmpeg.exe  -i !arr[%%I]! -qscale 0 !arr[%%I]:~0,-4!.mp4
      goto :EOF
    )
)
```