OmniAICreator/Qiita-1.07M huggingface dataset:
iOS Simulator でタイムゾーンを変更して実行する方法


タイムゾーンを越えたテストなど、iOS Simulator のタイムゾーンを変更したいときってありますよね？

さっとググると、MacOSのタイムゾーンを変更しろ！なんて情報がありますけど、MacOS の他のアプリケーションにも影響しそうで積極的にはやりたくありません。

別の方法はあるのでしょうか？

いろいろと調べたところ、結論からいうと、ビルド時の環境変数 TZ を変更することで、ビルドしたアプリ限定でタイムゾーンを変更できるようです。
正確には Simulator のタイムゾーンは変更されないのですが、僕が確認したかった範囲ではこれで十分だったので有用と思いましてまとめました。

## 手順

まずは、xcode 左上のアプリ名のところを選択して、「Edit Scheme...」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39548/60fd52bd-2ccf-d898-f4a2-e03250ee5d71.png)

次に、、下図のように選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39548/e5772280-8f7f-7501-6356-92da4311751a.png)

③ のところには、Name に `TZ`、Value にタイムゾーンを示す文字列を入力します。


Value の指定は、[tz database](https://ja.wikipedia.org/wiki/Tz_database)　にある `Asia/Tokyo` といった文字列や、JST, PST のような略語文字列でも扱ってくれるようです。タイムゾーン指定の標準については詳しくないのですが、tz database から選ぶのが無難と思います。


## 確認方法と注意点

まずは注意点。この方法だと、正確には 、実行しているアプリ内でのみタイムゾーンが変化し、iOS Simulator 内のタイムゾーンは変化しません。
なので、iOS 上部のステータスバーの時刻は変わりません。ですが、アプリ内の時刻は指定したタイムゾーンで処理されています。

確認した方法は次のとおりです。

まずは、なにも指定無し（= MacOS 側のシステム設定）です。システム設定は、`Asia/Tokyo` です。


適当なところに以下のコードをコピペします。

```
    let today = Date.today()
    let df = DateFormatter()
    df.dateFormat = "hh:mm Z"
    df.timeZone = TimeZone.current
    print(today)
    print(df.timeZone!)
    print(df.string(from: today))
```

実行すると、以下のようにコンソールに表示されます。日本時間で正しく表示されています。

```
2020-07-28 03:19:29 +0000
Asia/Tokyo (current)
12:19 +0900
```


次に、`TZ` に `America/Los_Angeles` を設定して実行してみます。


```
2020-07-28 03:19:55 +0000
America/Los_Angeles (current)
08:19 -0700
```

適切にタイムゾーンが変更されていることを確認できました。

同様に、ちょっとマイナーな `IRST`（イラン標準時）を4文字略称で設定してみます。

```
2020-07-28 03:20:36 +0000
Asia/Tehran (current)
07:50 +0430
```

こちらも確認することができました。

## 参考文献
https://stackoverflow.com/questions/1699671/how-to-change-time-and-timezone-in-iphone-simulator

※ この記事は、xcode 11.4.1 で確認しています。
VScodeで使える便利ワザ

## はじめに
VScodeで僕が普段使っている便利なワザを紹介します。
（macでの使い方になります）

特段難しいことはなく量も限られてるので、まずはこれをマスターすればかなり効率的に書けるようになるかと思います。

初学者向けなのでそんな「基本的なこと…」というコメントはなしでお願いします笑
初学者用とはいえ、コピー＆ペーストのショートカットはここでは説明しません。

## コメントアウト
`command + /`でできます。
カーソル位置の行もしくは選択範囲の行全部がコメントアウトされます。
![431bdc9bc866798dce132b4c74c9e6bd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/73e6544a-1fd2-1f61-e993-71c9b2569397.gif)

## 同じ文字を同時に編集（マルチカーソル）
複数の文字を選択して同時に編集できます。下のようなイメージです。
![825bcd8adef9454be0f65bc4e099707a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/a99ff5ee-0860-6c8a-b959-e289a62ec9de.gif)

選択の仕方がいろいろあるので代表的なもの（よく使うもの）を紹介します。

■ `command + shift + L`で同じ文字を全て選択
![9bc19496151792254c4af5b5ffd2cef8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/4a0e056f-3e10-115a-b14d-90ba2b29db09.gif)

■ `command + D`で同じ文字をカーソル位置から順に選択
![5a216153034d55a809f6f900ac566cac.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/d7cbd47c-9796-9a13-159c-1fe5fab62bbc.gif)

■ `option + ドラッグ`で好きな範囲を選択
![a644b197055d2bee5a81e2843e06fbdf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/1d732648-52c7-b587-dbc7-64368d872b89.gif)

## 単語、行、全体を簡単に選択
■ ダブルクリックで単語を選択
![7d37449471e425550c2f45ae88b718a3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/3c1c329c-4bd0-23a7-ace2-ca93e14111f6.gif)

■ トリプルクリックで行全体を選択
![cbd9dfa8fc8714a237cb5e6b3682780b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/c593a827-7761-be81-823f-11fe9d2525f7.gif)

１行分コピーしたい場合は、選択したい行にカーソルがある状態で（選択はしない）`command + C`でコピーすれば１行分コピーされます

■ クアドラプルクリック（４回クリック）で全体を選択
![fa4e2c8ae079c2e94b8790d739d525ae.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/b1531e1b-6597-2455-abc3-ef3c183fee04.gif)

これに関しては`command + A`を使った方が

## カーソル位置から左を１行分全削除
これはVScodeじゃなくてもできます。（ブラウザ上の検索ボックスやテキストボックスなどどこでも）
`command + delete`で左側が１行消えてくれます。
![20377ab6ad33e6628ec2a0309a3a2f0e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/03080a07-3a64-0e74-983b-91d553971c22.gif)

ちなみに`command + K`で右側が１行消えてくれます。

## 行を入れ替え
`option + 矢印キー`で行をまるまる移動できます。
![c6e9282624fcf1e00425c094396526bc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/0e42d76e-9523-1fca-1a1c-fe5019da9905.gif)

## あとからクォーテーションをつける
クォーテーションをつけたい文字列を選択して`shift + 2(or 7)`を入力するだけです。
![02095e5eac175667685db71c36d33e50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/fc530478-a405-62a6-7f8d-d727d39c7bcc.gif)

## 検索
`command + P`でファイルを検索して、開くことができます
![ed503bd4fb0bed82cf9f2f5ec365fe71.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/1ed430c9-4bf6-f94e-cd2a-749ce3ff1145.gif)


## 最後に
ほかにも「このワザ知らないの？」というものがあればコメントでお願いします。
Excel終了後に空のExcelウィンドウを残す方法

#要点
・`.Save`して`.Close`して`.Quit`すると、

```vb
With ThisWorkbook
    .Save
    .Close
End With

Application.Quit
```

・空ウィンドウが残る。辛い。
![BlankPane.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637201/96c6f2ff-644a-d4e0-86a2-cf0cb2e10458.png)

##補足
-1. `.Close`だけなら当然残る

```vb
ThisWorkbook.Close
```

-2. これは残らない

```vb
ThisWorkbook.Close
Application.Quit
```

-3. これも残らない

```vb
ThisWorkbook.Save
Application.Quit
```

-4. これも残らない

```vb
ThisWorkbook.SaveAs "[filename]"
Application.Quit
```

-5. これは残る

```vb
With ThisWorkbook
    .SaveAs "[filename]"
    .Close
End With

Application.Quit
```

-6. いずれもMicrosoft Office Professional 2016 Excelバージョン2006での動作。上記の単純なコードのみのプロシージャを標準モジュールに書いてテストした。

-7. 冒頭のケース以外にも空のウィンドウが残ってしまう理由は多岐に亘りそうで、以下の参考サイトでは
「`.Close`や`.Quit`でトリガーされる`WorkBook_BeforeClose`イベントによって発生するループが原因、よって`.Close`の前後を`Application.EnableEvents`の`= False`と`= True`ではさんでこれを回避」
との指摘もある（disableしちゃっていいの？とは思うが、見過ごしそうなチェックポイントではある）。

##参考サイト
vba - How to close blank excel workbook along with Macro workbook? - Stack Overflow
https://stackoverflow.com/questions/24167475/how-to-close-blank-excel-workbook-along-with-macro-workbook
UnityのiOSビルド時にBuild SettingsやBuild Phases等の項目を自動追加する方法

## 実装環境
- Unity 2019.2.21f1
- Xcode 11.6

## 参考サイト
https://stackoverflow.com/questions/56479894/unity-3d-postprocessbuild-how-to-add-new-run-script-to-pbxproject-from-unity

## 方法
1. 参考サイト記載の[サンプルプログラム](https://drive.google.com/file/d/1TVv8ZNIgvv6tAomf7oGt9zPI3IA4rB1P/view)をダウンロードし、'Assets/Editor'フォルダ下に設置  

2. `Users/UserOnPostBuild.cs`内の`EditProj`メソッドを適宜書き換える

```C#:PostXcodeBuild.cs
    private static void EditProj(string pathToBuiltProject)
    {
            // 項目追加に必要な情報を取得(必須)
            var projPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
            var pbxProj = new Users.Custom.PBXProject();
            pbxProj.ReadFromFile(projPath);
            var targetGuid = pbxProj.TargetGuidByName("Unity-iPhone");

            // BuildPhasesの追加サンプル
            // 不要なら削除
            pbxProj.AppendShellScriptBuildPhase(targetGuid,"Run Script copy_test.sh","/bin/sh","./../Assets/Editor/copy_test.sh");

            // BuildSettingsの追加処理サンプル
            // 不要なら削除
            pbxProj.SetBuildProperty(targetGuid, "IPHONEOS_DEPLOYMENT_TARGET", "9.0");

            // Frameworkの追加処理サンプル
            // 不要なら削除
            pbxProj.AddFrameworkToProject(targetGuid, "CoreBluetooth.framework", true);

            // embedded frameworkの追加サンプル
            // 不要なら削除
            var defaultLocationInProj = "Frameworks/Plugins/iOS/EmbeddedFramework/";
            var relativeCoreFrameworkPath = "";
            string[] commonFrameworkNames=new string[]{"EmbeddedFramework1","EmbeddedFramework2"};
            foreach (var frameworkNameTemp in commonFrameworkNames) {
                var frameworkName = frameworkNameTemp+".framework";
                 relativeCoreFrameworkPath = Path.Combine(defaultLocationInProj, frameworkName);
                AddDynamicFrameworks (ref pbxProj,targetGuid,relativeCoreFrameworkPath);
            }

            // .dylibの追加サンプル
            // 不要なら削除
            pbxProj.AddFileToBuild(targetGuid, pbxProj.AddFile("usr/lib/libresolv.dylib", "Frameworks/libresolv.dylib", Users.Custom.PBXSourceTree.Sdk));

            // 追加処理を書き込む(必須)
            pbxProj.WriteToFile(projPath);
        }
```
[Git]よく使うgitコマンド一覧（初心者編2)

プログラミング初学者の発信です。
間違いがあれば、指摘いただけると助かります。

#commitの変更履歴をみる

```
$ git log
```

#ローカルの変更を確認する

```
$ git status
```

#addの取り消し
間違って違うファイルをaddしてしまった時によく使う。

```
$ git reset HEAD <ファイル名>
```

#commitの取り消し
HEAD^：直前のコミット
HEAD~{n} ：n個前のコミット

```
$ git reset --hard HEAD^
```

#commitメッセージの修正

```
$ git commit --amend "新しいコミットメッセージ"
```

#ブランチの作成

```
$ git branch <ブランチ名>
```

#ブランチの切り替え

```
$ git checkout <ブランチ名>
```

#ブランチの削除

```
$ git branch -d <ブランチ名>
```

#ローカルのブランチをリモートに反映

```
$ git push -u origin <ローカルのブランチ名>
```

3ヶ月間でよく使ったのはこれくらいかな。
Homestead環境でPHPUnitを実行しようとすると、`/usr/bin/env: ‘sh\r’: No such file or directory`というエラーが出た

# 環境

- Windows10 pro
- Virtualbox Version 6.1.10
- Vagrant 2.2.9
- Homestead v10.12.0

# 経緯
`vagrant up`にてHomestead環境を作成し、以下のようにフォルダをマップした。

```
folders:
    - map: C:\Users\user_name\Documents\project_folder\
      to: /home/vagrant/code
```

`/`のエンドポイントにブラウザアクセスするとページが表示され、Homestead上でLaravelのアプリケーションは正常に動作している状態。

# 発生したエラー

`phpunit ./tests/`を実行すると下記のようなエラーが発生した。

```
vagrant@homestead:~/code$ phpunit ./tests/Unit/ExampleTest.php 
/usr/bin/env: ‘sh\r’: No such file or directory
```

# 原因と解決方法

`vendor/` 以下のファイルが "CRLF" の改行コードになっていたのが原因だった。

以下コマンドを発行し、`vendor/`含むコンテンツの改行コードをすべて "CRLF" から "LF" に置き換えた。

```
find ./project_folder/ | grep -v 'node_modules' | xargs dos2unix
```

確認していないので断言はできないが、おそらく `vendor/` 以下のファイルをすべて削除し、再度Homestead上で `composer install` を実行してpackageを再インストールすれば、同様に問題は解決すると思う。DOSフォーマットでインストールしてくれるはずなので。
`dos2unix`での置換は時間がかかったので、以下をおすすめする。

```
rm -rf vendor/
composer install
```

経緯としては、
1. powershell等で事前に`composer install` して `vendor/` を作成した
2. `vendor/` 以下パッケージファイルがDOSフォーマットで生成された
4. 生成された `vendor/`を含むフォルダをマップした
5. Homestead環境上で、`vendor/bin/phpunit` を実行した
5. 改行コードが "LF" でないことが原因でエラーが発生した

というところだと思う。

# 学び
- windows側で`composer install`すると、パッケージファイルのファイルフォーマットはDOSフォーマットになる
- 仮想環境のLinux上で開発をする予定であれば、`composer install`は仮想環境のLinux上で実行したほうがよさそう
【Flask+Keras】サーバーで複数モデルを高速で推論させる方法

#結論
keras==2.2.4
tensorflow=1.14.0
numpy==1.16.4

###テストコード

```python
from flask import Flask
import time

import numpy as np
import tensorflow as tf
from keras.models import load_model
from keras.preprocessing.image import img_to_array, load_img

app = Flask(__name__)

model_path1 = "mnist.h5"
model1 = load_model(model_path1)
label1 = ["l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9"]
model1._make_predict_function()#＜めっちゃ重要＞predictの高速化
graph1 = tf.get_default_graph()


model_path2 = "mnist.h5"
model2 = load_model(model_path2)
label2 = ["l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9"]
model2._make_predict_function()
graph2 = tf.get_default_graph()

def model1_predict(img_path):
    img = img_to_array(load_img(img_path, target_size=(28, 28), grayscale=True))
    img_nad = img_to_array(img) / 255
    img_nad = img_nad[None, ...]
    global graph1
    with graph1.as_default():
        pred = model1.predict(img_nad, batch_size=1, verbose=0)
    score = np.max(pred)
    pred_label = label1[np.argmax(pred[0])]
    print("スコア：", score, "ラベル:", pred_label)

def model2_predict(img_path):
    img = img_to_array(load_img(img_path, target_size=(28, 28), grayscale=True))
    img_nad = img_to_array(img) / 255
    img_nad = img_nad[None, ...]
    global graph2
    with graph2.as_default():
        pred = model2.predict(img_nad, batch_size=1, verbose=0)
    score = np.max(pred)
    pred_label = label2[np.argmax(pred[0])]
    print("スコア：", score, "ラベル:", pred_label)

@app.route("/", methods=['GET', 'POST'])
def webapp():
    start1 = time.time()
    model1_predict("mnist_test.jpg")
    end1 = time.time()-start1
    print("処理時間<model1>: ", end1, "秒")

    start2 = time.time()
    model2_predict("mnist_test.jpg")
    end2 = time.time() - start2
    print("処理時間<model2>: ", end2, "秒")

    output = "<p>model1:"+str(round(end1, 3))+"秒</p><br><p>model2:"+str(round(end2, 3))+"秒</p>"
    return output

if __name__ == "__main__":
    app.run(port=5000, debug=False)
```

###重要な部分

```python
model1 = load_model(model_path1)
model1._make_predict_function()#＜めっちゃ重要＞predictの高速化
graph1 = tf.get_default_graph()

def model1_predict():
    global graph1
    with graph1.as_default():
        pred = model1.predict(***, batch_size=1, verbose=0)
```
【Xgboost】softmaxとsoftprobの違い


# softmax vs softprob
基本的に`softmax`も`softprob`も多クラス分類に利用される。

- `softmax`は予測が最大確率となっている1クラスを出力する。
- `softprob`は予測しようとしているそれぞれのクラスの確率値を出力する。

>**multi:softmax**: set XGBoost to do multiclass classification using the softmax objective, you also need to set num_class(number of classes)
**multi:softprob**: same as softmax, but output a vector of ndata * nclass, which can be further reshaped to ndata * nclass matrix. The result contains predicted probability of each data point belonging to each class.

# xgboostでの使用例
```
param = {'max_depth': 2, 'eta': 1, 'objective': 'multi:softmax', 'num_class': 3}
```
```
param = {'max_depth': 2, 'eta': 1, 'objective': 'multi:softprob', 'num_class': 3}
```

# 参考
- [What is the difference between softprob and softmax in Xgboost](https://discuss.analyticsvidhya.com/t/what-is-the-difference-between-softprob-and-softmax-in-xgboost/7063)
- [XGBoost Parameters](https://xgboost.readthedocs.io/en/latest/parameter.html)
Serverlessな環境でexpressを動かすときに気をつけたいProxyに関する設定

昨日，思わぬところでハマってしまったので，共有いたします．

## 状況

`aws_serverless_express`越しに，aws lambda上で，`express`を動かしたときに，`Set-Cookie`ヘッダが発行されないという問題に数時間悩まされました．

https://github.com/microsoft/TypeScript-Node-Starter/ を参考に，ほぼ同様の構成で，

- express
- express-session
- passport
  - providerは，microsoft 

でログイン機能をつけてみたのですが，oauth callbackが無事に呼ばれて，User認証できても，いっこうにブラウザにsession cookieが発行されず，ログインできないのでした．

結論としては，cookieのoptionに，`secure: true`をつけていたが，aws lambdaで実行しているexpressがlistenしているconnnectionは，httpsでないため，cookieが発行されない，ということでした．

## どういうことか

一般に，AWS上で，SAMアプリケーションを作ると，`Client -> API Gateway -> Lambda`という経路をたどることになります．このうち，`Client -> API Gateway`についてはもちろん，`API Gateway -> Lambda`もHTTPSでの通信になっています．このため，CookieのSecure属性を`true`にしても，問題なく動作すると考えていました．

ところが，`aws_serverless_express` を使っているというところに思わぬ見落としがありました．

そこで，`aws_serverless_express`がどういう処理をやっているのか覗いてみましょう．まず，APIGateway Lambda Integrationによって，http通信の情報を`APIGatewayEvent`というオブジェクトに格納して，Lambda関数が実行されます．

`aws_serverless_express`は，この`APIGatewayEvent`をその名も[apApiGatewayEventToHttpRequest](https://github.com/awslabs/aws-serverless-express/blob/b1025411ed4df7f7c28482d46c51bf617265060b/src/index.js#L41-L66)という関数に渡して，Node.jsの，`http.request`のoption引数に変換します．

そして，同一のプロセス内にexpress serverに起動して(!)，そこに向けてリクエストを投げているのです．

つまり，lamdbaまでの経路はすべてhttpsであっても，最後の最後，lambdaの実行プロセスからexpressのhandlerが実行される部分で，httpになっていたのです．

通常のproxyであれば，`X-Forward-For`に，自分自身のIPを追加したりしますが，`aws_serverless_express`は厳密には，proxyではないため，`X-Forward-For`を変更することなく，ヘッダ情報をほぼそのまま横流ししているため，HTTP Request/Respnseをデバッグしているだけでは見つけづらかった問題でした．

## 対応

原因がわかったので，対策に移りましょう．では，どうすればSecure属性を保ったまま，Cookieを発行できるかというと，

1. express全体の設定として，`trust proxy`を設定する

つまり，

```js
const app = express();
app.set("trust proxy", true);
```

または，

2. express-sessionのcookieに関する設定で，trustProxyを設定する


```js
const app = express();
app.use(
    session({
        // 本稿に関係のないオプションは非表示
        cookie: {
            proxy:true,
            secure: true,
            maxAge: 24 * 60 * 60 * 1000,
        },
    })
);
```

をします．`aws_serverless_express`を使うのなら，1を選択するのがおすすめですが，影響範囲が読めない場合2でもいいでしょう．

`trustProxy`を`true`にすると，どういう挙動になるか，expressの`req.protocol`の実装を見てみましょう．

```js
// https://github.com/expressjs/express/blob/4.17.1/lib/request.js#L307-L323
defineGetter(req, 'protocol', function protocol(){
  // (筆者コメント: aws_serverless_express越しなので，ここは，'http')
  var proto = this.connection.encrypted
    ? 'https'
    : 'http';
  var trust = this.app.get('trust proxy fn');

  // (筆者コメント: trustProxyがFalseの場合，ここで'http'が返され，secureじゃないねとなる)
  if (!trust(this.connection.remoteAddress, 0)) {
    return proto;
  }

  // (筆者コメント: trustProxyがTrueの場合，'X-Forwarded-Proto'を読みに行ってくれて，結果'https'となる)
  // Note: X-Forwarded-Proto is normally only ever a
  //       single value, but this is to be safe.
  var header = this.get('X-Forwarded-Proto') || proto
  var index = header.indexOf(',')

  return index !== -1
    ? header.substring(0, index).trim()
    : header.trim()
});
```

つまり，`trustProxy`を`true`にすると，今直接通信しているconnectionの状態ではなくて，HTTPの`X-Forwarded-Proto`ヘッダを信頼し，その設定を元に，secureかどうか判断するようになるというわけです．

結果，`aws_serverless_express`な環境でもSecureなcookieを発行することができました．

おしまい．
How to disable beep for PyCharm terminal - PyCharmのターミナルでビープ音を消す


#　はじめに

探してみたけれど意外と新しめの記事がないので
メモ代わりに残しておく

## How To

それぞれ以下の設定を入れれば良い

.inputrc

```
set bell-style none
```

.vimrc

```
set visualbell t_vb=
```

.ideavimrc

```
set visualbell
set noerrorbells
```
【AWS】EC２ インスタンス SSH接続エラーを解消（ssh: connect to host xxx.xxx.xxx.xxx port 22: Operation timed out）

# はじめに
Rails アプリをAWSにてデプロイしようと試みていた過程でEC2サーバにローカル環境からアクセス（SSH接続）しようとした際に、突然アクセスできなくなる、というトラブルに遭遇したので解決方法とともに残します。
（かなり初歩的な部分かと思います。）

原因は**場所を移動して作業したこと（接続場所によりIPアドレスが相違していたこと）**にありました。
以下で詳細について書きます。

※筆者はMacを使っており、接続方法はMacの仕様で行なっております。


# どのようなエラーが起きたのか？
ローカル環境（MacBookAir)から、該当のEC2インスタンスにSSHキーを使って、SSH接続を試みる。

```
# ターミナルにて

$ ssh -i .ssh/ファイル名.pem ec2-user@xxx.xxx.xxx.xxx（該当EC2インスタンスのパブリックIP）

ssh: connect to host xxx.xxx.xxx.xxx port 22: Operation timed out
```

すると、「接続操作がタイムアウトした」という内容のエラーメッセージが出てきて接続できない。

さっき（1時間程前）まで接続できていたのになぜ？！！

となった。

# エラー原因
元作業していた場所から、カフェに移動して作業を開始し、その際に起きたエラー。
**該当EC2インスタンスのセキュリティグループ、SSH接続設定と自分の接続元（IPアドレス）に問題があった**。

もう少し具体的にいうと、
元いた場所にて最初の設定で、該当EC2インスタンスのセキュリティグループのインバウンドルールのSSH接続のソース（接続元）を「マイIP」に限定していた。これにより、**その作業場所のIPアドレスからでないとSSH接続ができない設定がされる**。
自分が元作業していた場所を移動して、移動先のwifiで作業を開始しSSH接続をしようとしたところ、**ソース（接続元のIP）が変わってしまったため、接続元の許可がされておらずエラーが起きた**。



# 解決方法
その接続元の許可設定を移動先のIPアドレスに合わせて設定し直した。

①AWS該当EC2インスタンスのセキュリティグループから、「インバウンドルールを編集」をクリック
②タイプ:SSH の ソースで再度「マイIP」を選び直す。
③ルールを保存をクリック

<img width="1350" alt="スクリーンショット 2020-07-28 10.27.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621162/785ab66a-6d33-cc8c-3aa8-eef47681581a.png">

こうすることで、作業中の場所のIPアドレスからSSH接続を許可したことになるため、接続可能になった。

```
$ ssh -i .ssh/ファイル名.pem ec2-user@xxx.xxx.xxx.xxx（該当EC2インスタンスのパブリックIP）

[ec2-user@ip-xx-xx-xx-xx ~]$
```



# 最後に
SSHキーを所有しているため、セキュリティグループのインバウンドルールを「任意の場所」にすることでもまず不正に利用されるようなことはないと思いますが、「マイIP」に限定しておいた方が無難だと思います（万が一、キーが流出した際の危険性なども考慮して）。
ただ、接続元（場所、wifiなど）を変更した際にこの作業を毎回しなければならないので少し面倒です。

このエラーに遭遇したことでまた少し、ネットワークについても勉強になりました。

誤り、ご指摘等ありましたら気軽にコメント等いただけると幸いです。
ありがとうございました。
GitHub Pagesで自作portfolioを公開して、Google Analyticsでアクセス情報などを収集するようにした話

# これは何か
- portfolioを公開して、Google Analyticsでデータ収集するまでに自分が参考にしていたサイトをまとめを載せたもの
- 詰まった部分とそれをどう解決したのか記しておき、今後に活かす。
- 正直、ただのリンク集になっているが、備忘録を兼ねているのでOKかなと。
- 自分が作成したものは[こちら](https://shota-imazeki-108.github.io/portfolio.github.io/)。

# 背景
- 自分のGitリポジトリを整理していた際に、portfolioにして公開したら見やすいんじゃないかと思ったのがきっかけ。
- せっかくなら導入が簡単と聞くGoogle Analyticsを入れて、データの収集および分析ができるようにしても面白いのかも、実務にも活かせるかもと思い、それも採用

# 大まかな手順
- portfolioの公開
    - GitHubアカウントを作る。
    - テンプレートを使ってportfolioを作成する。
    - GitHub Pagesを使ってportfolioを公開する。
- Google Analyticsの導入
    - アカウントの作成
    - portfolioにトラッキングコードを仕込む
    - イベントトラッキングを仕込んでおく
    - APIを使ってPythonでデータを抜き取れるようにする(別記事にて掲載予定)

# 1. portfolioの公開
## 1.1 GitHubアカウントを作る。
- https://github.com/ からSign upしてアカウントを作成する。
- GitHubに秘密鍵を登録する際は、下記記事が参考になる。
    - [GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
- なお、Gitを使ったことがないという方は下記サイトなどを使って勉強しておくと良いと思います。エンジニア職であれば、今はほぼどこでも使うと思うので。
   - [サル先生のGit入門](https://backlog.com/ja/git-tutorial/)

## 1.2 テンプレートを使ってportfolioを作成する。
- [HTML5 UP](https://html5up.net/)でhtml5やcss3で作成されたオシャレなテンプレートがあるので、こちらを使う(各テンプレートにある `Free Download` ボタンをクリックするとダウンロードできる)。
- Webデザイナーの方はテンプレートは使わない方がいいかもしれない(筆者はデザイナーではないので詳しくはわからないが)。
- テンプレートをダウンロードしてきたら、それを編集してportfolioを作成する。
    - 基本的には、index.html(複数ページ作成したければ、他のhtmlファイルも)を編集すれば充分
    - htmlを全く読んだことないと言う方は[こちら](https://www.kanzaki.com/docs/html/lesson1.html)ですぐに基礎を学べると思います。
    - ただ、htmlのテキストやリンクの編集、画像の表示まではそこまで難しくないので、index.htmlをいきなり読み始めても問題ないと思います。

## 1.3 GitHub Pagesを使ってportfolioを公開する。
- これについては、下記記事でまとまっています。
    - https://qiita.com/tomotlab/items/0a8f2db2781d023aac4a

# 2. Google Analyticsの導入
## 2.1 アカウントの作成
- 必要なアカウントは2つです。
    - [Googleアカウント](https://accounts.google.com/signup/v2/webcreateaccount?continue=https%3A%2F%2Faccounts.google.com%2FManageAccount%3Fnc%3D1&hl=ja&flowName=GlifWebSignIn&flowEntry=SignUp)
    - [Google Analyticsアカウント](https://marketingplatform.google.com/about/analytics/)

## 2.2 portfolioにトラッキングコードを仕込む
- portfolioのアクセス情報を収集できるようにトラッキングコードを仕込みます。
- [こちら](https://www.yamatofinancial.jp/learning/know-how/googleanlytics-setting-startup.html)が参考になるかと思います。

## 2.3 イベントトラッキングを仕込んでおく
- ページの遷移を伴わない(ファイルのダウンロードやボタンのクリックなど)ユーザー行動を収集する際には、イベントトラッキングを使用する必要があります。
- [こちら](https://www.tnkj.com/google_analytics_gtag_event/)が参考になるかと思います。
- トラッキングコードの種類で埋めるタグが変わるようなので注意です。筆者はこれに気づかず、30分以上時間を費やしました...

## 2.4 APIを使ってPythonでデータを抜き取れるようにする(別記事にて掲載予定)
- 記載の通り、別記事にて掲載予定です。掲載したら、ここにリンク貼っておきます。

# おわりに
- qiitaに毎月１投稿を心がけていますが、今月はコンペに忙しく、あまり記事になるようなことができませんでした(普段からまともなものを書いているかもあやしいですが)。
- 来月はコンペが終わるので、もっと良いもの書きます！！
夜には星空の壁紙を（Python）

Windowsの壁紙を時刻に応じて変えるスクリプトを作ってみた話。

ポイント:

* `ctypes.windll.user32.SystemParametersInfoW`で壁紙を変えられる。
* 定期実行は無限ループ + 1秒スリープで十分。
* 実行はpythonwから実行すると、バックグラウンドで動くので良い（止めるときにtasks managerからしか止められないのは難点、しかもプロセス名がpythonwとなって分かりにくい）。
* タスクスケジューラーでスタートアップ時のタスクに登録しておけば、起動時に自動起動できる。

```python
import ctypes
import os
import datetime
import time


image_dir = r'D:\wallpaper'
current_image_name = None

while True:
    now = datetime.datetime.now()

    if now.hour < 6 or 19 <= now.hour:
        new_image_name = 'star.png'
    elif 17 <= now.hour:
        new_image_name = 'sunset.jpeg'
    else:
        new_image_name = 'daytime.jpeg'
    
    if new_image_name != current_image_name:
        abs_file_name = os.path.join(image_dir , new_image_name)
        ctypes.windll.user32.SystemParametersInfoW(20, 0,  abs_file_name, 0)
        current_image_name = new_image_name

    time.sleep(1)  # check every 1 sec
```

切り替え時にちらつくので、変更の有無をチェックして、変更があったときのみ`SystemParametersInfoW`を実行する。

季節ごとに変えても面白いかも。壁紙が窓のようになって、時間や季節が感じられると良いですね。
pythonのSeabornでlegendのラベルを自由に変更する

## こんな人に向けた記事

- pythonでseabornを最近使い始めてboxplot, violinplotなどをやりたい人
- violinplot, boxplotで自分で決めた文字列でラベルを設定したい人
- seabornだとラベルが自動で設定されてしまって困っている人

## 解決方法
legendのハンドルを設定する以下の２行で簡単に解決！

``` python:
handler, label = ax.get_legend_handles_labels()
ax.legend(handler, ["label1", "label2"])
```

##タイタニックデータを使ったプロット例
### データのダウンロード
例としてtitanicのデータを使用します。
titanicのデータセットはいろんなところで説明されています。例えば下記記事など。
参考:「Titanic：タイタニック号乗客者の生存状況（年齢や性別などの13項目）の表形式データセット」
https://www.atmarkit.co.jp/ait/articles/2007/02/news016.html

``` python:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set("talk")

df = sns.load_dataset('titanic')
df.head()
```
出力結果はこんな感じ。

![WS000147.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533584/cb7fe150-3d30-251c-2010-23f907b8fa9d.jpeg)

#### 旅客クラスごとの年代分布
ここではpclass(旅客クラス)ごとの年代分布をプロットしてみます。

``` python:
sns.violinplot(data=df, x='pclass', y='age')
```

![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533584/90db97f0-a0a1-fd92-c77b-02d59d4f08c6.png)


図をみるとpclass3では年代が若い層が多いことがわかります。
更に深堀りして，
「各クラスの年代分布で生死に違いがあったのか」
を見てみたいと思います。

``` python:
fig,ax=plt.subplots()
sns.violinplot(data=df, x='pclass', y='age',hue="alive",split=True, ax=ax)
ax.legend(loc='upper left',bbox_to_anchor=(1.05,1))
```

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533584/558f282d-2d50-b147-0fc0-96a02a93cdaa.png)

hueを指定することでviolinplotを２つに分けることができます。
凡例は見やすくするために図の外に配置しています。

#### ラベルの変更(本題)
ようやく本題です。ここで気になるのは凡例のラベル。
no, yesではあとからみたときなんのことかわからないですよね。
これはdfのalive列の中身no/yesをそのままラベルに指定していることが原因です。

そこで，labelのハンドルをgetして直接指定してあげます。

``` python:
fig,ax=plt.subplots()
sns.violinplot(data=df, x='pclass', y='age',hue="alive",split=True, ax=ax)
ax.legend(loc='upper left',bbox_to_anchor=(1.05,1))
handler, label = ax.get_legend_handles_labels()
ax.legend(handler, ["dead","alive"],loc='upper left',bbox_to_anchor=(1.05,1))
```

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533584/9bea66b5-b5a2-40e2-3e25-0cb6841755bf.png)

無事，ラベルがdead/aliveとなりあとから見ても生死に差がないかを判別することができますね。

ちなみに生死で分けることであたらしくわかったこととして

- pclass2,3のとき10代などの若い年代でaliveの割合が高い
- pclass3では30代ではdeadとaliveの割合が同程度だが，pclass2ではdeadの割合が高い
- pclass1は50代以上でdeadの割合が顕著に高くなっている。

など様々なことがわかりますね。


#### swarmplotの例
もちろんswarmplotでも同じことができます。

``` python:
fig,ax=plt.subplots()
sns.swarmplot(data=df, x='pclass', y='age',hue="alive",dodge=True, ax=ax)
ax.legend(loc='upper left',bbox_to_anchor=(1.05,1))
handler, label = ax.get_legend_handles_labels()
ax.legend(handler, ["dead","alive"],loc='upper left',bbox_to_anchor=(1.05,1))
```

## まとめ
- seabornでプロットすると列の中身がラベルになる
- ハンドルをgetして直接指定することでラベルを自由に編集できる

# 参考記事
Python: seaborn を使った可視化を試してみる https://blog.amedama.jp/entry/seaborn-plot
ActiveRecordが接続しているDBの設定情報を確認するコマンド

## 今回のユースケース
DBクライアントツールにDBの設定情報を入力するために、ActiveRecordが接続しているDBの設定情報を一覧で取得したい。

## 動作環境
- Rails 6.0.3.2
- Microsoft SQL Server 2014

## 手順
1. rails cでコンソールを起動する
2. console内でActiveRecord::Base.connection_configを実行する

```
$ rails c
Loading development environment (Rails 6.0.3.2)
[1] pry(main)> ActiveRecord::Base.connection_config
=> {:adapter=>"sqlserver",
 :encoding=>"utf8",
 :username=>"hoge",
 :password=>"fuga",
 :tds_version=>7.4,
 :host=>"127.0.0.1",
 :database=>"piyo",
 :timeout=>15000,
 :port=>1433}
```

※デフォルトのdevelopment環境以外の環境でDBの設定情報を確認したい場合は、rails c -e 環境名で環境を指定してコンソールを立ち上げて、console内でActiveRecord::Base.connection_configを実行することで確認が出来る。

```
$ rails c -e test
Loading test environment (Rails 6.0.3.2)
[1] pry(main)> ActiveRecord::Base.connection_config
=> {:adapter=>"sqlserver",
 :encoding=>"utf8",
 :username=>"hoge",
 :password=>"fuga",
 :tds_version=>7.4,
 :host=>"127.0.0.1",
 :database=>"piyo_test",
 :timeout=>5000}
```

## 参照
https://api.rubyonrails.org/classes/ActiveRecord/ConnectionHandling.html#method-i-connection_config

## 感想
環境変数で設定している値も一覧で確認できたので便利でした。
GCP環境間のCloudSQLデータのコピー

# CloudSQLのコピー
test1環境のCloudSQLのデータをtest2環境のCloudSQLにコピーする方法です
GCP環境間のやり取りだけで済む方法です

gcloudログインされていない場合は先にログインしておいてください
https://cloud.google.com/sdk/gcloud/reference/auth/login?hl=ja

### 1. コピー元の環境をセット
コピー元の環境をセット
 
```
$ gcloud config set project test1
```

### 2. storageの作成
* GCPコンソールからexportファイル用のstorageを作成

### 3. storage権限を付与
* GCPコンソールのSQLからサービスアカウントをコピー

exportするSQLのサービスアカウントの場所は以下の画像を参照
<img width="1118" alt="スクリーンショット 2020-07-27 15.38.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93260/d759d4d7-9f22-e1ef-0403-da928004f108.png">

* 権限付与のコマンドを叩く

  * `gs://*****` はstorageのリンク

```
$ gsutil iam ch serviceAccount:hogehoge@gcp-sa-cloud-sql.iam.gserviceaccount.com:admin gs://*****
```

### 4. Export

* コピー先のstorageは出力するファイル名も記載する
* もしregionでエラーが出るのであれば、エラーメッセージに記載されているregionでstorageを作り直す

```
$ gcloud sql export sql [コピー元のSQLインスタンス名] [コピー先のstorage/ファイル名] -d [コピー元のデータベース名]
```


### 5. コピー先の環境をセット
コピー先の環境をセット 

```
$ gcloud config set project test2
```

### 6. Import先(test2)の権限設定

test2のSQLのサービスアカウントにコピー先(test1)のstorageに対する権限を付与する

```
$ gsutil iam ch serviceAccount:hugahuga@gcp-sa-cloud-sql.iam.gserviceaccount.com:admin gs://*****
```

### 7. Import
データベース名は指定しなくても問題ないです

```
gcloud sql import sql [コピー先のSQLインスタンス名] --async [コピー先のstorage/ファイル名]
```

以上です
GatsbyJSの魅力を知った...

こんにちは(๑╹ω╹๑ )

実は私...

恥ずかしながら.....

つい数ヶ月までJavascriptと言えば

- Javascript（jQuery補助程度
- jQuery（長いこと書いていた
- Node.js（ほんの少々
- Vue.js（数年前に入門一周した程度

でした😇

根っからのバックエンドエンジニアで、
LAMP構成大好きでした🥺

でもでもでもでも！！

早く技術スタック見直さないと！

特にJavascript😭

という訳で2ヶ月ほどPHP書くのをお休みしてました！

```php
// 😪
sleep(60 * 60 * 24 * 60);
```

代わりにReact始めました🤝

（技術スタックが少しモダンになった気がします🙌

今では「LAMP構成愛してた？よ😘」と言わんばかりの浮気？心移り？

分かんないですが魅了されています😍

## React

尊いです😌

バインディング is 神！🧝‍♂️

実際にバインディングは内部で実装されていると思うのですが、

C言語のポインタ？🤔

PHPで言うとリファレンス渡し？🤔

そんな気分です🎉

## GatsbyJS

地球は青かった？(๑╹ω╹๑ )

いえいえ😅

GatsbyJSは爆速だった🙌

実は以前からGatsbyJSで実装されている爆速SPAがとても魅力的で仕方有りませんでした😊

※GatsbyJSを始めてまだ数日程なので、誤った認識があるかもしれないです🙏

### GatsbyJSの特徴

わくわくしながらLighthouseやGTmetrixで計測できる！

#### 画面サイズ毎に画像を書き出している

ビルド後のファイル群を直接触ることはないですが、

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/ff14fe90-a905-8d94-7d7f-74dcf42fcb4f.png" alt="GatsbyJSビルド後ファイル構成" width="200px">

画面幅毎に最適化されたサイズの画像を書き出していました！

![GatsbyJSビルド後iconsディレクトリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/1c5f9bc1-5418-11c7-f6a6-52b3e6768f07.png)


#### Data URLスキームの画像も書き出している

深い仕様までは分かっていないのですが、
画像によっては**Data URLスキーム**なインラインで出力されている画像も多く見受けられました！

#### 基本的にMinify

ビルド後に出力されたindex.htmlファイルを見ると確認できるのですが、
基本的には何もかもMinifyされていました😮

- CSSはstyleタグを用いたインライン化
- Javascriptは別ファイルでMify化

凄いです！！！！


### gatsby-config.js

Non WebPack構成でもビルド出来る！🎉

GatsbyJSの設定ファイル（[gatsby-config.js](https://www.gatsbyjs.org/docs/gatsby-config/)）であんなこと？やこんなこと？が出来ます😌

- [PrettierとEslint利用したい](https://www.gatsbyjs.org/packages/gatsby-plugin-prettier-eslint/)
- [Babel使いたい](https://www.gatsbyjs.org/docs/babel/)
- [PWA構築したい](https://www.gatsbyjs.org/packages/gatsby-plugin-offline/)
- [Styledコンポーネント書きたい](https://www.gatsbyjs.org/packages/gatsby-plugin-styled-components/)


**他にも！**

[gatsby-plugin-alias-imports](https://www.gatsbyjs.org/packages/gatsby-plugin-styled-components/)というプラグイン重宝しています！

```js
{
    resolve: `gatsby-plugin-alias-imports`,
    options: {
        alias: {
            '@components': 'src/components',
            '@images': 'src/images',
            '@styles': 'src/styles',
            '@stores': 'src/stores',
        },
        extensions: ['js'],
    },
},
```

上記のような設定のみで、

```js
import main from "../../../src/components/main/";
```

のような記述も、

```js
import main from "@components/main/";
```

のように実装できます！

※ gatsby-config.jsファイルからの相対パスを予めエイリアス登録出来る

## まとめ

JAMstack構成でもっとReactやGatsbyJSを触ってみます🤗
MQTT ブローカーとクライアント間の接続性の確認

MQTT ブローカーを立ち上げたものの、IoT デバイスとのアクセスが上手く行かない場合があります。セキュリティーソフトがインストールされている環境などで、ファイアウォールの設定が正しくなかったり、不十分であったりすることが多く、または Wi-Fi ルーターの設定が原因の場合もあります。

MQTT ブローカーとクライアント間の接続性について試験するには、Android および iOS の端末があれば手軽にできます。IoT デバイスの接続で上手く行かない場合に、スマートフォンやタブレットで試してみることで、問題の切り分けがしやすくなります。

Google の Play ストアおよび Apple の App Store には沢山の MQTT アプリがあります。MQTT ブローカーとの接続性を簡単に確かめる目的であれば、Android なら「Mqtt Client」というアプリが、iOS なら「MQTTool」というアプリが良いと思います。両アプリ共に、「Connect」というボタンを押して、「Connected」という表示になれば接続確認オッケーという感じで簡単です。

### Android の場合
Play ストアを開き「Mqtt Client」で検索して、以下のアプリをインストールします（アルファベットの大文字小文字の違いで同名のアプリが複数ありますが、黄色いアイコンの方です）。
![Google_Play.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/9a6df07c-b4dd-d51e-27df-8d32b3962a96.png)
アプリを開くと以下の様な画面が表示されます。
![Android_起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/f8c19d1a-e5c7-fe61-b068-0b33ee38b194.png)
上部の４項目は必須で、「Host」には、MQTT ブローカーの IP アドレスを、「Port」にはポート番号を、「Topic to subscribe」と「Topic to publish」については接続性の試験をする分には何でも良いので適当な文字列を入力します。MQTT ブローカーで、ID とパスワードを設定している場合は、「User」と「Pass」の項目も入力しましょう。
![Android_入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/1c02390d-67de-d500-2cb1-d3fd7dedf784.png)
入力し終えたら「CONNECT」ボタンを押します。以下の様に、「CONNECT」ボタンが「DISCONNECT」に変わり、ボタンの下のログ表示部に「connected」と表示されれば、MQTT ブローカーとの接続は成功です！！
![Android_完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/7a12e98c-7f36-e516-8c17-5e085d4a2f52.png)
### iOS の場合
App Store を開き「MQTTool」で検索して、以下のアプリをインストールします。
![iOS_ストア.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/d7dc6147-b878-1574-501c-12e2bbde0948.png)
アプリを開くと以下の様な画面が表示されます。
![iOS_起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/5c98f610-7dea-38b2-de94-0037cb34e3c8.png)
「Host」には、MQTT ブローカーの IP アドレスを入力し、MQTT ブローカーで、ID とパスワードを設定している場合は、「Username」と「Password」も入力しましょう。「Connect」と表示された部分を押したら、以下の様に「Connect」が「Disconnect」に変わり、一番下の「Status:」の表示部分に「Connected」と表示されれば、MQTT ブローカーとの接続は成功です！！
![iOS_完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491154/ddd02f4b-aca7-8550-0dfc-8331bbda2b3f.png)
### まとめ
Android と iOS 端末を使った、MQTT ブローカーとの接続試験をしてみました。上手く接続できなかった場合は、ブローカー側のファイアウォールを再確認してみたり、Wi-Fi ルーターの設定で「分離機能」が有効になっていたり、ポートマッピングが必要な環境でないかなどを確認してみてください。また、MQTT ブローカーのマシンにおいてセキュリティーソフトがインストールされている場合は、一度それを無効にし、MQTT ブローカーを再起動した上で試してみるのも有効な手段です。
Microsoft Acces Database Engine 2016 の32bit/64bit版の共存方法

Office 64bit版がインストールされているWindowsPCに32bit版のAccess Database Engine(データベースエンジン)2016をインストールするのに大変苦労しました。
結果的にOffice 64bit版に32bit/64bitのDatabase Engine2016のインストールができましたので、その方法について解説します。

# 環境情報
私のやり方では**圧縮・解凍ソフト**の**7-Zip**を使います。
7-Zipは以下からダウンロードできます。インストール方法についてはググってください。
https://sevenzip.osdn.jp/

■ Windows 10 64bit
■ Office 365 64bit　インストール済み（クイック実行版）
■ 7-Zip　インストール

■ Access Database Engine 2016がインストールされていない、できないPC


# 導入方法
すでにAccess Database Engine 2016 64bitがインストールされている方は、②③は飛ばしてください。
※私は64bit版がインストールされた状態ではやったことがありません。

①　公式から再配布版のAccess Database Engine 2016の32bit版,64bit版をダウンロードする
　　https://www.microsoft.com/en-us/download/details.aspx?id=54920

<img width="743" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/0f6e5161-6c37-5e40-0d31-32fc65db42da.png">

②　Access Database Engine 2016 64bit版のexeファイルを7zipを使って解凍する

<img width="452" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/b39fdae2-6b35-9201-23c1-ae14c4701e9c.png">

③　解凍したフォルダ内にある「aceredist.msi」ファイルをインストールをする
<img width="394" alt="003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/6fcb3ad4-b6b7-0a0b-c977-158a4f8adc63.png">

④　コマンドプロンプトを起動し、Access Database Engine 2016 32bit版がある場所まで移動する
<img width="260" alt="004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/d11c3198-ace3-0b15-98df-40f5d719f03d.png">
※格納されている場所は各自の環境や設定により異なります。
※画像では[ dir ]コマンドでファイル一覧を表示しています。

⑤　コマンドプロンプトで以下のコマンドを実行し、Access Database Engine2016 32bit版をインストールする

```console:command
$ AccessDatabaseEngine.exe /passive
```

※/passive コマンドはサイレントインストールをするコマンドなので、ダイアログ等表示されずインストールされます。
※ Access Database Engine 2016 再配布版はEngilishしかありませんが、それで問題ないです

# 確認方法
Windowsメニューから[**ODBC**]と検索し、開く。
開いたら[**ドライバー**]タブを開き、一覧にDatabase Engineが存在するかを確認する
<img width="234" alt="005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/e3252a1d-29fb-0892-70f1-12a5aec8dc59.png">
※画像では2つ表示されていますが、環境によっては１つだけの場合もあります。

# 参考・参照
・Microsoft Access Database Engine 2016 Redistributable　配布サイト
https://www.microsoft.com/en-us/download/details.aspx?id=54920
【#3 Java】Javaを勉強するならこれを読め！～厳選～




# 書籍

[スッキリわかるJava入門 第三版](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295007803/ref=sr_1_1?adgrpid=53024885013&dchild=1&gclid=CjwKCAjwx9_4BRAHEiwApAt0zjOvhgZ6p6TY0vyVI0Eas6zIRr-srCwk_miK6F6VbXYYAYPCSOLA0hoChy4QAvD_BwE&hvadid=338568555065&hvdev=c&hvlocphy=1009243&hvnetw=g&hvqmt=e&hvrand=2842124447025277056&hvtargid=kwd-334256431401&hydadcr=27266_11561146&jp-ad-ap=0&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bjava%E5%85%A5%E9%96%80&qid=1595414352&sr=8-1&tag=googhydr-22)
Javaの基礎からオブジェクト指向まで、Javaの「なぜ？」が分かる一冊。詳しい解説と豊富なイラストで、しっかり学べる内容になっています。注意点は、最初から最後までストーリー仕立てになっているため、項目ごとに調べるのには不向き。<br><br>
[2週間でJava SE Bronzeの基礎が学べる本 徹底攻略シリーズ](https://www.amazon.co.jp/2%E9%80%B1%E9%96%93%E3%81%A7Java-SE-Bronze%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%BF%97%E8%B3%80%E6%BE%84%E4%BA%BA-ebook/dp/B076F36Z89/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Java+%E5%88%9D%E5%BF%83%E8%80%85&qid=1595414873&sr=8-6)
未経験SEとして働いている友達に教えてもらった本。そもそもプログラミング言語とは？Javaとは？という所でつまづいていた私を助けてくれました:sob:


# サイト
[Java SE API & ドキュメント](https://www.oracle.com/jp/java/technologies/javase/documentation/api-jsp.html)
調べる際、初めはQiitaなどのサイトでもいいと思うのですが、投稿主の主観が入ってきてしまう恐れがあるため最終的にはやっぱり公式を見るのが一番だと思っています。
使用するバージョンに合ったドキュメントを見なければいけない点に注意！<br><br>
[java入門 javaのプログラムが走る喜び・快感を感じよう！](http://ysklog.net/java/)
「Javaで簡単なプログラミングが出来るようになる」ことを目的とした、初心者向けのサイト。
Javaの基本となるプログラム例と説明文が丁寧に記載されており、とても分かりやすいです。<br><br>
[Java道 Java基本](http://www.javaroad.jp/index_basic.htm#kihon)
基本的な知識の解説の他、疑問に思ったことや実現したいこと、エラーなどから解決策を探せるFAQもあり便利です。<br><br>
[Java コード入門](https://java-code.jp/)
説明、ソースコードの例がとても見やすく分かりやすいです。<br><br><br><br>
以上、Javaを勉強する際に読むべき個人的おすすめ書籍、サイトでした！
他にもこれおすすめだよ、というものがあったら是非教えてください！<br>
USキーボードに関するセッティングと感想

プログラミングを始めるようになって、あまり使っていなかった右手小指が腱鞘炎になったことから、キーボードを考えるきっかけになった。

## 結論
結論から言うと、僕にはUSキーボードは合っている。というか、いままでなぜUSキーボードにしなかったんだろう。食わず嫌いは良くないということですね。
USキーボードを使いやすいセッティングにするために少し時間を使ったが、試してみて良かったと思う。

今回、WindowsでUSキーボードを使うにあたり、セッティングが必要だったので備忘録として残しておく。

## 購入キーボード
[Anker ウルトラスリム Keyboard](https://www.ankerjapan.com/item/A7726.html)
定価2,000円くらい

とりあえず、はじめてUSキーボードを使うので、「使ってみて合わない！」となる可能性もあったので、金銭的なダメージの少なく、かつ、口コミの良いものを選んだ。
使ってみた感じだけど、約2000円のキーボードにしてはよくできていると思う。

## セッティング
### Windowsの設定変更
WindowsでUSキーボードを使う場合は、以下のリンクにあるようにUSキーボードを使える設定に変更する必要がある。これはすんなりできた。
https://kakakumag.com/pc-smartphone/?id=11863

### 日本語入力ON/OFFの設定
日本語入力ON/OFFの設定に少し手間取った。

#### 僕の現ベスト設定
＜日本語入力はGoogle IMEを使用＞
1. 下の部分をクリックし、プロパティを選択。
![コメント 2020-07-28 103704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540509/b4fb2e94-b600-012f-f7a2-ddd44615a8b0.png)
2. キー設定の編集を選択。
3. 入力キーが[Eisu]のものを下の画面のように変更。![コメント 2020-07-28 105332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540509/b5ca3d9f-0022-a3b3-3c3b-5c928ffcc2f0.png)

これで、
[Shift]+[CapsLock]
を押すと、日本語入力ON/OFFをスムーズに切り替えられるようになった。

#### 日本語入力その他
- [Alt]+[`]
これでもON/OFF変更できるが、毎回変更するのが大変だから、却下。

- [Shift]+[CapsLock]
MS-IMEだと、初期設定でIMEのON/OFFになった。
Google IMEは初期設定では、ひらがなと半角入力モードの切り替えになっている。この半角入力モードは、もう一度エンターを押さなければ入力が確定されない。むむむ、こんなんでは非効率。というわけで、上のような設定をしている。ま、MS-IMEを使えばいいだけの話なのかもしれないけど、最近Google IMEを使っているのでなんとなく、GoogleIMEで継続使用で行こうと思う。

### VSCodeのショートカットの設定
USキーボードにしたら、ショートカットがつかえなくなったものがあったので、変更した。
- ターミナル切り替え
元：Ctrl+\` -> 変更後：Ctrl+Alt+\`
このキーバインドにした理由は、これが他のショートカットして使われていなかったのと、Ctrl+Shift+\`が新ターミナル立ち上げだったから。
- ターミナルとエディタのフォーカス切り替え
`Ctrl+;`
ついでに、これもショートカットに加えた。もともと入っていないとのこと。https://qiita.com/rai_suta/items/05e69f0b9065989b19c1 を参照した。

## 感想など
- [・]箇条書きによく記すやつ。日本語入力時に[/]を押すだけ。最初、わからなくて「てん」と打って、変換してた（汗）
- ファンクションキーがそのまま使えないことが少し不満。F2（リネーム）F7（カタカナ変換）やF10（半角英数変換）,F12（ブラウザの検証ツール）はまあまあ使っていたので、Fnキーとの同時押しが必要になったが、常に押すものでもないからと、割り切れる。
- 最初は、Ctrl + Spaceで日本語入力変換を割り当てていたが、VSCodeのショートカットキー【候補のトリガー】とかぶったので上のように変更した。
- [Winキー]も[Command]でいけたので、意外にすんなり移行できた。
- [Ctrl]や[Alt],[Command(Winキー)]の位置が少し違うけど、これは慣れかな。
- ノートPCだけでさくっと何か調べ物したいときに、ノートPCのキーボードを使いたいときは、設定を戻さないと使えないので、めんどくさい。設定を戻したあと、再起動がめんどう。このあたりは今後、なんとかしていきたい。
Javaのテストで環境変数がいるとき

# やりたいこと

環境変数で値を上げてるところも含めてテストしたいときに、テスト時に環境変数がなくて死ぬのをなんとかしたい

# 解決策

pomに書く

```xml:pom.xml
                        <plugin>
                                <artifactId>maven-surefire-plugin</artifactId>
                                <version>{your version}</version>
+                               <configuration>
+                               <environmentVariables>
+                                       <TEST_ENV>100</TEST_ENV>
+                               </environmentVariables>
+                               </configuration>
                        </plugin>
```

これでコード内で`System.getenv("TEST_ENV")`としてるところで100がとれるようになる


# 参照
https://maven.apache.org/components/surefire-archives/surefire-3.0.0-M1/maven-surefire-plugin/test-mojo.html#environmentVariables
[JavaScript] Optional?.Chaining と Nullish ?? Coalescing の忘備録

# 概要

* JavaScript の新しい文法 `?.` と `??` について調べた結果の忘備録です。
* 随時追加されます。

## Optional?.Chaining

* `?.` により undefined と判定された後は、後続の `.` を `?.` にする必要がない。

```JavaScript:後続の?.は不要
const obj = {
    aaa: {}
}

obj.aaa.bbb             // undefined
obj.aaa.bbb?.ccc.ddd    // undefined (no error)
```

1. `obj.aaa.bbb?.ccc.ddd` で、`bbb?.` は undefined と判定される。
1. `.ccc` 以降は実行されず、直ちに undefined が返る。
1. `.ddd` は実行されないので、エラーにならない。 

```JavaScript
obj.aaa             // {}
obj.aaa?.bbb        // undefined
obj.aaa?.bbb.ccc    // Uncaught TypeError: 
                    // Cannot read property 'ccc' of undefined
```

1. `obj.aaa?.bbb.ccc` で、 `aaa?.` は undefined ではないため、`?.bbb` が実行される。
1. `.bbb` の後ろに `?.` がないので、後続の `.ccc` が実行される。
1. `.bbb` が undefined なので `.ccc` は エラーになる。

* `?.` の前項が `null` であっても、戻り値は `undefined` になる。

```JavaScript
const target = null

target?.toString()    // undefiend
```

## Nullish ?? Coalescing

* `??` の第二項の式は、第一項が `undefined` か `null` ではない場合には評価されない。

```JavaScript:第二項は実行されない。
function func () {
  console.log('Done second operand.')
  return 2
}

1 ?? func()            // 1 (no message)
false ?? func()        // false (no message)
'' ?? func()           // '' (no message)
NaN ?? func()          // NaN (no message)

undefined ?? func()    // 2 (message: Done second operand.)
null ?? func()         // 2 (message: Done second operand.)
```
javascriptではif(undefined&&undefined.undefined){}が許される

#JavaScriptで効率的にifを書きたい
JavaScriptではメソッド含め、全てがオブジェクトなので`a.b.c`みたいなのを頻繁に見かけます。
しかし、他の言語では`a.b`が存在しないのに`a.b.c`を参照すれば例外が吐かれるか、Segmentation Faultになりますよね。JavaScriptはとりあえず何があっても動くことを優先に作られている(私見)な言語なので、この辺が割と柔軟です。
論理積演算子で左側だけで成立していれば右側は問われません。どういうことかというと、

```javascript
if(undefined&&undefined.undefined) {
} //ok
console.log(!!(undefined&&undefined.undefined)) //false
```
&&演算子で繋げている場合、左側が`false`なので右側が例外を吐かれるような状態であっても問題なく`false`を返します。

ただし、左側が`true`な場合や論理和の時は例外を吐きます。

```javascript
if(true&&undefined.undefined) {
} //TypeError
console.log(!!(undefined||undefined.undefined)) //TypeError
```
GithubからPullしたNuxt.jsのアプリケーションが起動しない時の対処法

#はじめに
Nuxt.jsのアプリケーションをGithubからPullして、
起動を試みたのですが失敗しました。
本記事ではこのエラー解決法をまとめます。

#npm run dev(または、yarn dev)で失敗する

```
npm install
npm run dev
```
または、

```
yarn install
yarn dev
```

エラーが出て起動に失敗しました。
エラーログを見た結果、「nuxt」というコマンドがないためにエラーが出ていそうだなと判断しました。

#解決策

```
npm install --save nuxt
npm run dev
```
または、

```
yarn add nuxt
yarn dev
```

#typescriptを使用している場合

```
npm install --save nuxt-ts
npm run dev
```
または、

```
yarn add nuxt-ts
yarn dev
```
Rider for Unreal Engine ビルドログの文字化け対応

RiderからはUTF-8で起動と やることはやってくれている
```chcp 65001 >NUL && "C:\Program Files\Epic Games\UE_4.25\Engine\Build\BatchFiles\Build.bat```

## Visual Studioのツール群を英語で動作させる

Riderであってもこちらの対応で解決
https://usagi.hatenablog.jp/entry/2017/06/12/141928

ありがとうございます🙏
ESP32のカメラ画像をftpサーバにアップ。ftp clientライブラリのPASVモードのバグ修正

# 環境
- カメラ付きのESP32
- 利用した無料ホームページサービス [fc2](http://web.fc2.com/)
- Windows 10
- Arduino IDE ver.  1.8.13
- Arduinoのライブラリマネージャで esp32_ftpclient　ver.0.1.1 をインストール
- debugに利用  wireshark, ffftp

# やりたいこと
ESP32に繋いだカメラの画像をライブカメラとしてホームページにアップする。ftpでアップロードする

# かなり参考になるサンプルソース
[ldab/ESP32-CAM-Picture-Sharing](https://github.com/ldab/ESP32-CAM-Picture-Sharing)
色んな処理が入ってるので、もっとシンプルにしました。
具体的には、ループで　単にカメラから取得したjpg画像をアップロードし続けるだけにしました。

# 困ったこと
以下のようなエラーが出て、ファイルをアップできないことがありました。

```
Send PASV
Data port: 64359
Send STOR
FTP error: Offline
Write File
FTP error: Offline
```

で、暫く続けていると、アップロードできることもありました。
その時のシリアルモニタは以下のように表示されます。

```
Send TYPE
Type I
Send PASV
Data port: 64359
Data connection established
Send STOR
Writing
Close File
Connection closed
```
Windows desktop appのffftpだと　ほぼ毎回うまくアップロード出来ていました。
esp32 ftpclientのソースコードと、シリアルモニタログを見比べて、PASVコマンドに対するftpサーバからのレスポンスを受信後、レスポンスで指定されたPASVポートに対して接続しにいって、接続できていないことが分かりました。

ffftpで正常時のwiresharkログと、esp32 ftpclientのソースコードでPASVコマンド発行後の処理を見比べて　以下のことが分かりました。

- PASVに対するレスポンスではポート番号だけではなく、IPアドレスも設定されている。
- そのIPアドレスはftpサーバと異なることがある
- esp32 ftpclientでは、レスポンスのIPアドレスフィールドを参照しておらず、PASVポート番号のみ参照し、ftpサーバのPASVポート番号に接続しにいってる
- アップロードが成功したケースでは、PASVレスポンス内のIPアドレスが　たまたま　ftpサーバと同一だった。

# 対策
で、以下のようにPASVモードの処理を修正し、正常にftpサーバにアップロードできるようになりました。

```Arduino\libraries\esp32_ftpclient\src￥ESP32_FTPClient.cpp
(中略)
void ESP32_FTPClient::InitFile(const char* type){
(中略)

  //added
  IPAddress pasvServer(array_pasv[0],array_pasv[1],array_pasv[2],array_pasv[3]);
  //added

  FTPdbg(F("Data port: "));
  hiPort = hiPort | loPort;
  FTPdbgn(hiPort);

  //modified
  //if (dclient.connect(serverAdress, hiPort, timeout)) {
  if (dclient.connect(pasvServer, hiPort, timeout)) {
    FTPdbgn(F("Data connection established"));
  }
(以下略)

```


# その他
- esp32 ftpclientのlibrary以外も含めたソースコードは後日、GitHubにアップするかもしれません。
- [esp32 ftpclientのgit hub](https://github.com/ldab/ESP32_FTPClient/)にissueとして登録しました。　→（後日談）→　ownerのldabさんから。「fc2のサーバーで試してみたら　同じIPアドレスが返ってきたから　PASV responseのIPアドレスをparseする必要なし」の意味の回答あり。対応してくれなさそうなので、私自身の GitHubで修正版を公開予定です。→（後日談）→ forkして修正版をあげたんですが、その後、ldabさんが対応してくれたので、私のほうの修正版は削除しました。おしまい。
【Intellij IDEA】npm ではなく yarn の typescript を使う

npm から yarn に移行した際、IDEA の global な typescript へのパスを変更する必要があります。

- local ではなく global のモジュールを使いたい

タイトルには、typescript と書いてありますが、prettier や eslint でも同じです。

## 環境
- Windows 10 Pro
- IntelliJ IDEA Ultimate 2020.2
- node 14.10.1
- yarn 1.22.5

## スクリーンショット
![qiita_20200728_idea_yarn_ts_path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400553/e64ffd33-a0cf-09cf-5113-66f224c0bd0c.png)


## global な node_modules のパスを調べる

### npm の場合
```
npm root -g
```
C:\Program Files\nodejs\node_modules

### yarn の場合
```
yarn global bin
```
で出力されたパスの***1つ上***のディレクトリから`Data\global\node_modules`

C:\Users\ユーザー名\AppData\Local\Yarn\Data\global\node_modules\


## npm から yarn のパスに変更（一例）

### Before

```
~\AppData\Roaming\npm\node_modules\typescript
```

### After

```
~\AppData\Local\Yarn\Data\global\node_modules\typescript
```
RailsでIPベースでBasic認証をかける

社内システムでかつ、外部公開をする場合に社内なら認証なし＋社外からは認証かけたい場合のIPベースでの解決方法

## RailsでのBasic認証
https://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html
まずは公式参照

ほぼこの内容なので、条件をローカルネットワークなら認証必要に変える。
ちなみにこの公式の内容だと通常のログイン認証と併用できたりする。管理者アクセスとかに使えるかも。

``` application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  http_basic_authenticate_with name: "user", password: "pass"
end
```

## IPベースの判定
CIDRベースで指定したい。
`IPAddr`か`netaddr`でいけるみたい。今回は`netaddr`の方を使う。

github
https://github.com/dspinhirne/netaddr-rb
readmeに使い方はないので、テストケースを参照。

### サブネットで判定
https://github.com/dspinhirne/netaddr-rb/blob/master/test/ipv4net_test.rb
ここにいろいろあるテストケースから抜粋

``` ruby
	def test_contains
		net = NetAddr::IPv4Net.parse("1.0.0.8/29")
		ip1 = NetAddr::IPv4.parse("1.0.0.15")
		ip2 = NetAddr::IPv4.parse("1.0.0.16")
		ip3 = NetAddr::IPv4.parse("1.0.0.7")
		
		assert_equal(true, net.contains(ip1))
		assert_equal(false, net.contains(ip2))
		assert_equal(false, net.contains(ip3))
	end
```

このへんですね。
実際に書くと

``` ruby
    def is_local_access?
      return NetAddr::IPv4Net.parse('192.168.1.0/24').contains(NetAddr::IPv4.parse(request.ip))
    end
```

こんな感じでしょうか。
これで192.168.1.0/24のネットワークが判定できる。
（nginxとかリバースプロキシ挟んでるときは`request.ip`か`request.remote_ip`、nginxの設定によるかも）

もうちょっとやるならlocalリクエストも判定しておいたほうがいい。
`request.local?`

## application_controller

``` application_controller.rb
require 'netaddr'

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  http_basic_authenticate_with name: "user", password: "pass", unless: : is_local_access?

  private
    def is_local_access?
      return NetAddr::IPv4Net.parse('192.168.1.0/24').contains(NetAddr::IPv4.parse(request.ip))
    end
end
```
VSCodeのextensionを一括でExport/Importする

# 概要

PCを更新した際、VSCode の Extension を自力で移行させたので、その備忘録です。
今回は諸事情で使えませんでしたが Setting Sync という Extension を使えば Setting 等もまとめて管理できて便利らしいので、可能ならばそちらを使ったほうがいいと思います。

[【最新版】VSCodeの設定を共有しよう【Settings Sync】](https://qiita.com/kazurego7/items/3dc5a381811e4d429533)

[Setting Sync](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync)

# Export

PowerShellからコマンドで出力できます。

```powershell

code --list-extensions > extensions_list.txt

```

`code --list-extensions`で一覧を呼び出して、`> "ファイル名"`でファイルとして以下のように出力します。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439193/37ada2c6-8be5-9677-9be8-1f59b8d2f329.png)

# Import

EXportではまとめて出力出来ましたが、Importの場合は`code --install-extension "エクステンション名"` で一つずつ読み込むしかありません。
そこで、Exportしたファイルをまず読み込み、列記されたExtensionを読み込んでいくシェルコマンドを作成しました。
汎用性を考え、引数としてExportしたファイルを指定する形にしています。

```ps1:install_extensions.ps1

$text = Get-Content $args[0]
foreach ($line in $text) {
  code.cmd --install-extension $line
}

```

あとはこれを以下のコマンドで起動します。
ExecutionPolicyはPowerShellのスクリプトを実行する権限を一時的に解除するために入れています。

```powershell

PowerShell -ExecutionPolicy RemoteSigned "install_extensions.ps1" "extensions_list.txt"

```