OmniAICreator/Qiita-1.07M huggingface dataset:
Jetson Xavier NX でルートファイルシステムを NVMe SSD ドライブへ変更した際の注意点

# はじめに
ルートファイルシステムを NVMe SSD ドライブへ変更すると OS の起動時間や起動後の動作が劇的に改善するとのことで、さっそく試してみました。
最初に SD カードからの起動は変わりませんが、systemd によるシステム起動シーケンスで initrd からルートファイルシステムへの chroot 先を SD カードから NVMe SSD ドライブへ切り替えることにより起動時間が早くなります。

## OS 起動時間の比較
systemd-analyze で OS 起動時間を比較したところ 33.2 秒 → 17.3 秒へ短縮されました。

```bash
$ systemd-analyze plot > result.svg
```

左: <a href="https://drive.google.com/file/d/19zfnHntS359Mc6OQJzrbA_Diq0iYVa4f/view?usp=sharing">SD カード</a>、右: <a href="https://drive.google.com/file/d/1N-au7cWVSZ-CQ73E3hIQSWo9fm9SkHGy/view?usp=sharing">NVMe SSD ドライブ</a> (result.svg の表示例)
![systemd_analyze.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7d8a49be-18fc-2a92-f200-8c751b42cf6d.png)

## カーネルビルド時間の比較
<a href="https://github.com/JetsonHacksNano/buildKernelAndModules">buildKernelAndModules</a> ツールを使用してカーネルイメージやモジュールのビルド時間を比較したところ以下のように短縮されました。

```bash
$ ./makeKernel.sh
real    111m40.689s
user    44m39.048s
sys     3m40.908s
↓
real    22m50.904s
user    92m5.668s
sys     8m16.444s

$ ./makeModules.sh
real    207m34.403s
user    108m12.652s
sys     9m6.864s
↓
real    27m43.071s
user    123m45.088s
sys     10m5.556s
```

## ルートファイルシステムを NVMe SSD ドライブへ変更する手順
パーティションを作成します。

```bash
$ sudo fdisk /dev/nvme0n1

Command (m for help): n ← n を入力

Select (default p): p ← p を入力
Partition number (1-4, default 1): (改行) ← Enter を入力
First sector (2048-250069679, default 2048): (改行) ← Enter を入力
Last sector, +sectors or +size{K,M,G,T,P} (2048-250069679, default 250069679): (改行) ← Enter を入力

Command (m for help): w ← w を入力
```

ファイルシステムを ext4 でフォーマットします。

```bash
$ sudo mkfs -t ext4 /dev/nvme0n1p1
```

<a href="https://www.jetsonhacks.com/2020/05/29/jetson-xavier-nx-run-from-ssd/">JetsonHacks</a> のスクリプトをダウンロードして実行します。

```bash
$ git clone https://github.com/jetsonhacks/rootOnNVMe.git
$ cd rootOnNVMe/
$ ./copy-rootfs-ssd.sh
$ ./setup-service.sh
```

最後に再起動します。

```bash
$ sudo reboot
```

# 変更後の注意点
<a href="https://www.jetsonhacks.com/2020/05/29/jetson-xavier-nx-run-from-ssd/">JetsonHacks</a> にも記載されていますが、カーネルイメージやカーネルモジュールを更新した場合は SD カードへの反映も必要になります。
<img width="707" alt="スクリーンショット 2020-06-06 21.44.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3f0ad3a3-1871-95b7-bcc3-7c2d723de637.png">

カーネルイメージとモジュールを更新した後に SD カードへ反映するコマンドのサンプルです。
( &lt;UUID&gt; の部分は デバイス毎に変わるため mount や df コマンド等で確認)

```bash
$ sudo rsync -av /boot/ /media/jetson/<UUID>/boot/
$ sudo rsync -av /lib/modules/4.9.140-tegra/ /media/jetson/<UUID>/lib/modules/4.9.140-tegra/
```

例.

```bash
$ sudo rsync -av /boot/ /media/jetson/239f3029-4825-443b-972e-4392c57f5749/boot/
$ sudo rsync -av /lib/modules/4.9.140-tegra/ /media/jetson/239f3029-4825-443b-972e-4392c57f5749/lib/modules/4.9.140-tegra/
```
開発者とユーザー間でギャップを生じやすいこと＝使いにくくなる要素について

自分の実績で**直感的ではないな**、**使いにくくなってるな**と感じたものを記述。

#序数の扱い
* **開発者は0はじまり**したがるけど
* **一般ユーザーは1はじまり**がふつう

開発者の立場からすると序数を0から始めたくなるのは理解できる（UIで指定された序数をそのままプログラムに投入できるため）。
だが一般の感覚からするとまず**第一に慣れない**ので違和感しかない（優しくない）。

* １番目（日常で「０番目のお客様〜」とか聞いたことない）
* ビルの階数（1F〜）

*コンサート会場なんかだと１列目よりも前の特別感を表すために０列目　なんてのもあったりするけど（笑）*

なので**日常では先頭は「1」なわけ**で、UIで序数を指定させる場合には**「1」はじまりが優しい**と言える。

というか**UIで指定する際の序数をプログラム内部のインデックスに変換する程度を面倒くさがるのどうなの**、と個人的には思う。



# 自由な表現のさせ方について

* **開発者は正規表現**を使わせたがるけど
* **一般ユーザーは*（ワイルドカード）**がせいぜい

正規表現が使えると便利ではあるが、それを使わせる対象と必須／任意は慎重に選ぶべき。

* 正規表現はプログラム要素であること  
シンタックスエラーや無限ループの原因にもなる。  
予想外の負荷がかかるケースも。
* 一般ユーザーはおろかシステム管理者であっても知らない場合がある
* テストする機能が欲しい（対象がeメールの宛先などは確認できないため）
* 否定が意外と難しい
  「?!」などでできる場合もあるがやはり難しい。

* 日常的な運用で正規表現を編集させるような場合は、そもそも**その運用を疑ったほうがいい**。


##正規表現を使いたくない状況

* **ネットワークアドレス**  
ネットワークアドレス（xx.xx.xx.0/24）とかも専門的（非一般ユーザー向け）であるが、クラスAとCはともかくクラスBやCIDR、またIPv6に至ってはもはや正規表現には無理がある。
* **DNS（FQDN）**  
サブドメイン名とか意味のある指定の仕方ができるようになってて欲しい。



# チェックボックスのON/OFF

* 開発者はコード中の分岐に関わる変数（True/False）をそのままチェックボックスにしたがる
* 一般ユーザーはONなら目的の機能が動く
（有効なことを）期待し、　OFFなら動かない（無効なこと）を期待する

よくあるのは**「無効にする」というチェックボックス**。

間違ってないんだろうけど、基本的には**否定の否定は直感的ではない**ので、**ONなら目的の機能がONで、OFFなら目的の機能がOFFになる**ようにするべき。



# ファイルパスの指定方法

* 開発者は¥（バックスラッシュ）などはエスケープするか/に置き換えて指定することを暗黙に期待している
* 一般ユーザーはエスケープする必要性も/に置き換えることも、知る由もない

Javaで開発されているソフトウェアとかで**設定ファイルフォーマットに「\*.propetiesファイル」をそのまま採用している場合**なんですが。

Javaなら\*.properties、.NETなら\*.configあたりだけど、あれをそのままユーザー向けの設定ファイルとして採用するのかどうかは一考するべき。
（受託開発なんかだとこういう部分の非機能要件は全く見向きもされないので、なおさら放置される傾向にある。）

* **半角スペースを含む場合は""で括らないといけない**

のも、（一般ユーザーからすると）**暗黙のルールすぎ**て使い勝手を下げている。

そもそも設定ファイルベースである時点で、**設定変更（編集）時にシンタックスチェックが行われず、シンタックスの妥当性責任がユーザーに委ねられてるため優しいとは言いづらい。**


# ディレクトリパスの末尾に¥（あるいは/）をつけさせるかどうか


* 開発者はプログラムコードが期待する形式を強制させたがる
* 一般ユーザーは**末尾の¥（あるいは/）がついてるついてないぐらいの違いで動かなくならないで欲しい**

要するに

```javascript:example.js
let any_path = user_input + "¥¥hoge.txt";

//user_input には C:¥Users¥foo などを期待している。
//C:¥Users¥foo¥ としてしまうと動かない可能性がある。
```

あるいは

```javascript:example2.js
let any_path = user_input + "hoge.txt";

//user_input には C:¥Users¥foo¥ などを期待している。
//C:¥Users¥foo としてしまうと意図しない出力されてしまう。
```

など
*（実際にはNode.jsなどの場合、¥（や/）の有無を意識せずにパスとして連結する機能があるけど）*

こういうのは手順や設定例に書いてあれば試行錯誤せずに済むが、**やってみないとどういう結果になるか分からない、というのは非常に優しくない**。


#CSVファイルの空行を読み飛ばしてくれない

* 開発者は**ユーザーはきっちり指定のフォーマットでCSVを用意する**と思ってる
* 一般ユーザーは**多少の空行などはうまく読み飛ばしてくれる**と思ってる

一見して気づかない空行や改行コードの違い、ファイル先頭のBOM（バイトオーダーマーク）ぐらいは、**うまく処理して（読み飛ばして）欲しい**と思う。

というか、**自分が使う時にきっちり過ぎたら不便**とは思わないのだろうか？？

ユーザーにとって使いやすいアプリケーションって、仕様どおりであることも大事なんだけど、こういったちょっとした柔軟性（許容性）だと思っている。

日本のITをとりまく環境の悪さは、ビジネスオーナーが開発オーナーではないこと、に由来していると思う。
laravel、docker、nginxのimageを使ってroot以外のページが404 Not Foundになってしまう

laravelの環境をdockerでnginxのimageを使ってやる際に、他のページなどでさらっとnginxのconfが書かれていて、自作したとき、ハマってしまいました。

locationに```try_files $uri $uri/ /index.php?$query_string;```がないとroot(localhost/)はページが表示できるのですが、自分で設定したlocalhost/usersなどは404 Not Foundになってしまいます。

答えは公式に書いてました。

```nginx:default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    try_files $uri $uri/ /index.php?$query_string; # <=======これを加筆
  }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }
```

参考サイト
[Installation \- Laravel \- The PHP Framework For Web Artisans](https://laravel.com/docs/7.x)
Laravel 特定のカラムがNULLでないものだけ取ってくる

##今回の題
タイトルの通り

複数のソーシャルログインに対応したサービスを作る時、どのアクセストークンを持っているかでユーザーを仕分けするときなんかに使ったのでメモ。

##方法

usersテーブルに各ソーシャルログインのアクセストークンを置くカラムがあるとする。
それらにはdefault値としてnullを設定しておく。
例えば、facebookでログインすると、facebook_access_tokenというカラムに値が入るようにする。

すると、以下でfacebookを使ってログインしているユーザーを引っ張ってくることができる。

```php
User::whereNotNull('facebook_access_token')->get()；
```
他のソーシャルログインをしていると、このカラムはNUllなのでこれで仕分けできるということ。

##余談
反対に、特定のカラムがNULLのものだけ取ってくるときはこう。

```php
User::whereNull('facebook_access_token')->get()；
```
CSVファイルの読み込み：pandas

csvファイルの読み込み方法について、メモしておく

#csvファイルの内容
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/5ad040ea-b958-185c-9ecf-b180722503cf.png)
上記のような簡易のもので確認していく

#pandasのインポート

```
import pandas as pd
```

#読み込みと表示

```
data = pd.read_csv('csvファイルのパス/ファイル名.csv')
print(data)
```
1行目でcsvファイルを読み込み、2行目で表示。
下記が表示される

![csv表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/2dae6a81-c918-f452-1133-aedc3c6f113b.png)

#ヘッダー情報

```
print(data.columns)
```
上記のコードを実行すると、下記のようなヘッダー情報が表示される

![インデックス1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/dd440f79-bef2-6018-88a8-84d3641608b5.png)

csvファイルの1行目がヘッダーとして認識される

#ヘッダーの割当：連番

```
data = pd.read_csv('csvファイルのパス/ファイル名.csv',header=None)
print(data)
```

![連番.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/6743026d-9aee-277c-53ea-a5386761685f.png)

0 1 2 3 4 のヘッダーがcsvファイル内容とは別に設定される。

#ヘッダーの割当：指定

```
data = pd.read_csv('csvファイルのパス/ファイル名.csv',names=('A','B','C','D','E'))
print(data)
```

![指定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/b81718a9-1441-6b42-d3f9-6c466331c08b.png)

指定したA B C D Eがヘッダーとして設定される。

#indexを時系列とする

使用したcsvファイル

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/364a31d7-a651-02df-1ec8-1dc047c76466.png)


```
data = pd.read_csv('csvファイルのパス/ファイル名.csv',names=('A','B','C','D','E'),index_col=0, parse_dates=True))
print(data)
```

![表示2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/d6c64fbc-0956-d6cf-6b92-902377cf7eb9.png)

```
print(data.index)
```

![スクリーンショット 2020-06-06 22.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548325/a4853a4c-6809-9c77-0827-ee3f0caa3cb9.png)

indexはdatetimeとして認識されている。


※もし間違い等あれば、ご意見・ご教授願います。
pipで[SSL: CERTIFICATE_VERIFY_FAILED]が出る場合の解決法

## 経緯
pipでパッケージをインストールしようとしたところエラーが発生し、インストールできず。
どのパッケージでも同様のエラーとなり、pipの不具合かと思ってpipのアップデートをしようとしたがそれもできない。
Pythonを入れなおしても解消せず。

## 環境
OS：Windows10
python version：3.8.2

## エラー内容
```
PS C:\Users\user> python -m pip install -U pip
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))': /simple/pip/
(省略)
```
SSLエラーとある。このエラーが出てるのは会社PCなので、何かセキュリティで引っかかっているのかもしれない。エラーメッセージを検索してみると、以下のサイトに記載されていたやり方でエラーが解消した。
https://github.com/pypa/pip/issues/5448

## 解決法
%APPDATA%\pip\pip.ini を作成し、以下を記述する。

```
[global]
trusted-host = pypi.python.org
               pypi.org
               files.pythonhosted.org
```
Spring Boot 2.3のApplication Availability

[Spring Boot Features - 1.6. Application Availability](https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/reference/html/spring-boot-features.html#boot-features-application-availability)を動かしただけのメモ。

```gradle:build.gradle
plugins {
  id 'org.springframework.boot' version '2.3.0.RELEASE'
  id 'io.spring.dependency-management' version '1.0.9.RELEASE'
  id 'java'
}

sourceCompatibility = '11'
repositories {
  mavenCentral()
}
dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-actuator'
  implementation 'org.springframework.boot:spring-boot-starter-web'
  testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
  }
}
test {
  useJUnitPlatform()
}
```

```java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {
 
  public static void main(String[] args) {
    SpringApplication.run(Main.class, args);
  }
}

```

```text:application.properties
management.health.probes.enabled=true
```

これで```http://localhost:8080/actuator/health/liveness```とか```http://localhost:8080/actuator/health/readiness```にアクセスすると以下が返ってくる。

```json
{"status":"UP"}
```
Dockerを使ってAnaconda環境を作ってみた！

## 目的
Pythonでデータ解析を行う際に、Anacondaをインストールのが一番簡単な方法である。
しかし、ホストの環境に直接Anacondaをインストールする事で、PC環境が変わってしまう可能性がある。
そこで、今回は、Dockerを使って、仮想環境にAnacondaをインストールして、Jupyter notebookを起動させるまでを行いたいと思います。

## 動作環境
Mac: Catalinaバージョン10.15.5
Docker: 19.03.8

## インストール方法
Dockerの[公式ページ](https://www.docker.com/get-started)で、インストーラーをダウンロードして、Dockerをインストールする。

作業を行うフォルダに以下のDockerfileを保存する。

 ```Dockerfile
 FROM ubuntu:latest

 RUN apt-get update && apt-get -y upgrade && \
     apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 
 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6 wget -y && \
     wget -P /opt https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh && \
     bash /opt/Anaconda3-2020.02-Linux-x86_64.sh -b -p /opt/anaconda3 && \
     rm /opt/Anaconda3-2020.02-Linux-x86_64.sh && \
     echo "export PATH=/opt/anaconda3/bin:$PATH" >> ~/.bashrc && \
     . ~/.bashrc && \
     conda init
 ```

Dockerfileを保存したフォルダで、Dockerのimageをビルドします。

```
docker build . -t anaconda_sample
```

ビルドしたimageからcontainerを作成します。

```
docker run -p 8888:8888 -it anaconda_sample /bin/bash
```

jupyterを起動したいディレクトリに移動して、jupyternotebookを起動させます。

```
jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root
```

## 参考文献
[Dockerfileで、あえてsourceコマンドで環境変数を設定](https://qiita.com/lilacs/items/4d4e3f169a04560dee76)
[dockerでjupyter notebookが動く環境を付け加える作業](https://qiita.com/tand826/items/0c478bf63ead75427782)
TypeScriptで軽量DIコンテナtsyringeを使う

## はじめに

TypeScriptのDIコンテナについて調査した所、主に**[InversifyJs](https://github.com/inversify/InversifyJS)**と**[tsyringe](https://github.com/microsoft/tsyringe)**の2つが使われていると分かりました。今回は自分にとって必要十分な機能があるtsyringeを導入することにします。



業務ではVue/NuxtでDBやaxiosでAPIを叩くというユースケースが多いので、例えば複数のRepository層のオブジェクトをUseCase層のクラスに注入することで、テストやモックとして使用するRepositoryクラスのやり取りを容易にするという場合に使いたいと思います。
数が多くなければFactoryパターンでも解決できるでしょうが、複数のRepositoryオブジェクトを注入する際はFactoryでは難しいでしょう。またUseCaseクラスを使うたびにいちいち注入するのは面倒というのもあるので、この辺りを一つの設定ファイルにまとめられると楽ではないかと思います。



## 例

GitHubにあげているので、詳しくはこちらを参照。
[devinoue/di-container-tyringe-sample](https://github.com/devinoue/di-container-tyringe-sample)
## インストール

```shell
 yarn add --save tsyringe reflect-metadata
```

次にTypeScriptの設定ファイル`tsconfig.json`の`compilerOptions`に追加

```shell
{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}
```

使用するトップ層でReflect APIのポリフィルを呼び出します。

```typescript
import "reflect-metadata";
```

これでOK。

## 使用例

以下のように役割ごとにディレクトリ/ファイルごとに分けました。

```shell
src
├ Repository
│ ├ DBRepository.ts
│ └ ApiRepository.ts
├ UseCase
│ └ UseCase.ts
├ Controller
│ └ Registry.ts
├ types
│ └ index.ts
└ index.ts
```

### types/index.ts

注入したい依存のインターフェースを定義しています。よくある例ですが、Repositroy層のインターフェースを定義しています。

```typescript
export interface IRepository {
    fetch(): string
}
```



### Repository/DBRepository

上記のインターフェースを実装した具象クラスの一例。ApiRepositoryもありますが省略
注入したいオブジェクトのクラスの上に`@injectable`デコレータを追加しています。

```TypeScript
import { injectable } from 'tsyringe'
import { IRepository } from '../types'

@injectable()
export class DBRepository implements IRepository {
  fetch() {
    return 'DBデータ'
  }
}
```

### Controller/Registry

ここでインスタンスとトークンの登録をしています。紐付け、ということですね。
今回はUseRepositoryというトークンにDBRepositoryを登録しています。

```typescript
import { container } from 'tsyringe'
import { DBRepository } from '../Repository/DBRepository'
import { UseCase } from '../UseCase/UseCase'

container.register('UserRepository', { useClass: DBRepository })
container.register<UseCase>('UseCase', { useClass: UseCase })

export { container }
```

### UseCase/UseCase.ts

ここでは`@inject`デコレータに注目してください。この文字列が紐付けのトークンとなっています。

```typescript
import { injectable, inject } from 'tsyringe'
import { IRepository } from '../types'

@injectable()
export class UseCase {
  constructor(@inject('UserRepository') private repo: IRepository) {}

  execute() {
    return this.repo.fetch()
  }
}

```



### エントリーポイントindex.ts

ここでトークンからインスタンスの解決(Resolution)を試みています。

```typescript
import 'reflect-metadata'
import { UseCase } from './UseCase/UseCase'
import { container } from './Controller/Resgistry'

const useCase = container.resolve<UseCase>('UseCase')
console.log(useCase.execute())

```

以上、依存関係をRegistry.tsにまとめたおかげで、エントリーポイントがすっきりしましたね！



## 参考
[DIコンテナの実装を理解して、軽量 DI コンテナを自作しよう](https://qiita.com/sadnessOjisan/items/d05e35e34d2d1fb7e844)
[epsilonGtMyon/tsyringe-sandbox](https://github.com/epsilonGtMyon/tsyringe-sandbox)

autoinjectionについては[この辺り](https://github.com/microsoft/tsyringe/blob/3fa3816c9bc755fe9b353b5ef434dec0a7fe8b1d/tests/auto-injectable.test.ts)が参考になる
2020年6月時点でMacで将棋AIのGUI環境を整えるそこそこ簡単な方法

はじめに
========

将棋は大好きで最近はOnline中継も増えてきて良い時代になったものです。また、難解な局面でも将棋AIがどういう形勢かを教えてくれるのも素人が見ていて楽しめるようになった要因の一つだと思います。

数年前にMacの将棋AI環境をなんとか整えたのですが、今日ちょっと調べていたらとても簡単にできるようになっていたので、共有します。

結論からいうと
=====
「将棋GUI」と「GUIが使う将棋思考Engine」が必要になりますが、

- [将棋所Mac](http://shogidokoro.starfree.jp/mac/index.html) を GUIにして、
- 思考Engineに[この記事](https://qiita.com/Hikoyu/items/afc2cf372367f0d93331) にあるように技巧２をhomebrewでInstallする

が、そこそこ簡単な方法だと思います。

もう少し詳しく
==========

将棋所Mac
----------
[将棋所Mac](http://shogidokoro.starfree.jp/mac/index.html) は名前の通り、「将棋所」のMac版でとても軽快に(今のところ)不具合もない感じです。以前は、「将棋ぶらうざQ」を使っていたのですが、ちょいちょい落ちたりすることもあったりしました。

「対局」「局面の検討」「棋譜解析」などが簡単操作でできます。
Install方法は、リンク先に書いてあるとおり(dmgをDownloadして開いてAppをアプリケーションフォルダにコピー)です。そこにも書いてありますが、セキュリティ関連でMacOSがすぐには実行させてくれませんが、システム環境設定から許可すればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11124/6448cf80-3e42-1c32-5fc3-0a4b5914df36.png)
※ 画像はリンク先の画像のコピーです

技巧２
------
[この記事](https://qiita.com/Hikoyu/items/afc2cf372367f0d93331) の方が、色々な将棋思考Engineをbuildしてhomebrew化してくれています。なんて素晴らしい！

### Homebrew の Install
Homebrewを入れていない人は、 [ここ](https://brew.sh/index_ja) をみて最初に書いてある通りに Homebrew をInstallしてください。


### 技巧2 の Install

```
brew tap hikoyu/shogi
brew install gikou
brew test gikou 
```

として、エラーが特にでなければInstall成功です。
他にも、elmoとかも公開されていたのですが、 ~~私の環境だとSegmentation Faultになって動かなかったです~~ 。まあ、１つあれば十分なので、良しとします。

#### 【2020年6月9日追記】 
上記brewのFomula作者の @Hikoyu さんが動くようにしてくれました！ 

```
brew install elmo
brew install uonuma-yaneuraou
```

等で、YaneuraouをベースとしたEngineもInstallできます。

将棋所Mac に 技巧２を登録する
---------

メニューの「対局 → エンジン管理」から、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11124/d1831529-f76e-84b1-0dd8-47d668e9e8e4.png)

先程Installした技巧2を選べば良いんですが、ダイアログからInstallした先の `/usr/local/Cellar/gikou/2.0.2/gikou_2.0.2` を選ぶことが一見できません。

-----------
### [追記: 2020/9/22]
@rubellum さんからのコメントで `Command + Shift + G` を押すことでPATHを直接入力できるダイアログが更に出てくることを教えてもらいました！ 

--------

そこで `Command + Shift + G` を同時押しして出てくるダイアログに `/usr/local/Cellar` を入力してBrewのDirectoryに移動して、`gikou` ディレクトリを辿っていき、 `gikou_2.0.2` というファイルを選べばOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11124/4a88a4ba-2dce-05d6-6d82-29850650d790.png)

こんな画面が出てくれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11124/4ec6928d-7f37-a57e-8289-1e1ab42329ed.png)

さいごに
=======

~~Symlinkとか張らなくてよければ、とっても簡単と言えるんですけどね...~~
`Command + Shift + G` の出現によりだいぶ楽にInstallできるようになった気がします。興味がある人は是非やってみてください。
同一ネットワーク上のフォルダにアクセスする方法

# ①SMB/CIFS (共有フォルダ) サービスを利用する
フォルダに共有設定を行う。
※NTFSアクセル権もアクセスできるよう設定しておく

# ②ActiveDirectoryのドメインサービスを利用している場合
ユーザーのログイン可能PCにアクセス先のPCを追加しておく

疑問
①の方法より、SMBサービスを利用するとドメインサービスのログイン可能PCの制御は無視されるということ?
Shell の変更と Dockerでコンテナからイメージを作る＆Windowsとのファイル共有

### Shell
シェル変更

```
chsh -s $(which zsh)
```

### git
ユーザー名パスワード関連

```
git config --global credential.helper store
```

### socketの使い方サンプル

https://gitlab.com/group7102/sample/-/tree/develop


### Docker

コンテナ作ってみる。

ubuntuのイメージの'A0'のコンテナ作る（のが多いょ）

```
docker run --name="A0" -it ubuntu:latest
```

いろいろインストールしてみる

```
/# apt-get update
/# apt-get install curl vim git net-tools build-essential -y
/# apt-get install zsh -y
/# apt-get install cmake -y -6 -79
```

作業ディレクトリ作成

```
/# mkdir /home/products
```

コミットし、dev_01のイメージを作ります。

```
docker commit A0 dev_01
```

バインドの設定
ホストのフォルダーをDockerから見れるようにします。

※ Docker Toolbox on Windows でのやり方です。

1. Oracle VM VirtualBox を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490235/b4bfea42-b446-8ca3-b488-cf863576c405.png)

defaultというのが左にできています。
設定(S)をクックして下の画面を出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490235/d41cb997-4012-6101-7bda-115e5e1132a9.png)

左の共有フォルダーを選択して共有フォルダーを設定します。

名前(AAA)を憶えておきます。

先ほど作ったイメージdev_01を実行してみましょう。

```
docker run -it -v /AAA:/home/products dev_01 /bin/zsh
```

共有フォルダの設定で作った、名前 products を 使います。

これでWindows側の、c:\AAAの中身がDocker側の/home/productsで読み書きできます。
とりあえずRubyの拡張ライブラリでHelloWorldする

# はじめに

Cで書いたライブラリをRubyから呼び出す方法を簡単に説明します。
公式を含めいくつか説明するサイトはあるのですが、もっとシンプルに教えてほしかったので……。

## 参考

https://ruby-doc.org/core-2.5.3/doc/extension_ja_rdoc.html
https://qiita.com/suketa/items/ab6b88093de4a54b3b06

## 作ったサンプル

https://github.com/hakua-doublemoon/rb_ext_hello

# さっそく作ってみる
## CでRuby用のライブラリを作成する

上に示したサンプルの[Cのコード](https://github.com/hakua-doublemoon/rb_ext_hello/blob/master/hello.c)のとおり。
Initの関数でクラスを定義し（モジュールの定義もできる）、メソッドの定義とそれに対応する関数を作ります。
メソッドにおいては、公式ドキュメントの冒頭に書いてありますが、RubyとCでは型の使い方が違うので、互いにやり取りする場合は専用の関数を使います。つまりは下記のような感じ。

```hello.c
    return rb_str_new("Hello World", 11);
```

## Makefileを作ってmake

Makefileは自分で書かないです。extconf.rbを作って、これで `ruby extconf.rb` することで作れます。これもサンプルに入ってます。
（Rubyがインストールされていれば実行できると思いますが、もしかしたら`ruby-dev`とか必要？）
`create_makefile()` で指定するモジュール名（クラス名？）はファイル名の大文字小文字が一致しなくても良いです。なのでCファイル名は小文字で`hello.c`、クラス名は型名っぽく`Hello`とかにしました。
`ruby extconf.rb`してMakefileができたら`make`します。
ちなみに、Cファイルを作る前にextconf.rbを書いても、makeできないMakefileができたりします。

## 実行してみる

せっかくなので使ってみるところまで書きます。
サンプルに書きましたが下記のようにできます。

```ruby
require "./Hello"

hello = Hello::new

hello.methods
#=> [:say, :instance_variable_set, :instance_variable_defined?, ...
#    ^ここに作ったメソッドがありますね。 

hello.say
#=> "Hello World"

hello.say.class
#=> String
```

# 作ってみた背景

最初はCで作ったプログラムをコマンドとしてRubyから実行すればいいかと思っていたのですが、popenのオーバーヘッドがかなり大きいことを知ったので、共有ライブラリを作ってみることにしました。
単発でpopenする場合は、あまりオーバーヘッドは見えません。ただ、1000回ぐらいpopenで実行するか、もしくはライブラリをロードして実行するかでは大きな差が出ると思います。（実行環境によると思いますが）
下記が実験してみた結果。

```
Hello WorldするCプログラムをpopenで1000回実行した結果:
                 user     system      total        real
Case01       0.125000   0.296875   2.625000 ( 11.617396)

今回作ってみたライブラリを1000回実行した結果:
                 user     system      total        real
Case01       0.000000   0.000000   0.000000 (  0.000436)

今回作ってみたライブラリを1000*1000回実行した結果:
                 user     system      total        real
Case01       0.109375   0.015625   0.125000 (  0.130412)
```

# おわりに
Rubyを使う人間としてはRubyのpopenが激重な原因を探してみてもいいかもしれません……。
wsl2でgitlabのdocker

# 内容
　windows10の**home**でwsl2でgitlabのdockerを動かす方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/5b0d8991-5275-424d-ab39-0a838305aa75.png)

# 準備
　wsl2でdocker desktopが動いていること
　https://docs.docker.com/docker-for-windows/install/

  docker volume create gitlabopt

  っでvolumeを作る方がいいみたい。

# コマンド
次のコマンドをgitlab.batとして作成して、起動するだけ

```gitlab.bat
docker run --detach ^
    --hostname localhost ^
    --env 'GITLAB_PORT=8083' ^
    --publish 443:443 --publish 8083:80 --publish 22:22 --publish 8004:8001 ^
    --name gitlab ^
    --restart always ^
    -v /mnt/c/users/xxx/gitlab/etc:/etc/gitlab ^
    -v /mnt/c/users/xxx/gitlab/log:/var/log/gitlab ^
    -v gitlabopt:/var/opt/gitlab ^
    gitlab/gitlab-ce:latest
```
注：xxxは利用しているuser名。また、8083,8004とかは既に利用しているポートと衝突しないようにずらしているので任意（まあ、dockerを使っている人だったら自明か・・）

# 動作イメージ
docker desktopで起動状況(stats)を確認しているとこ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/d98a4e49-e199-448b-5103-06a64ed94d9c.png)



# まだ検証中
　とりあえず、自分のusers/xxx/gitlabというディレクトリを作成して、etc,log,optのディレクトリを作成して起動したが、このディレクトリの作成方法にちょっと悩んでます。なんか、postgreのデータのためvolumeを作成しました
製薬企業研究者がPythonを用いたデータベース操作についてまとめてみた

# はじめに

ここでは、PythonでMySQLを操作する方法について解説します。


# レコードの新規作成

csvで保存しているテーブルをMySQLに登録するには、以下のようにします。

```python
import pandas as pd
import sqlalchemy as sa


url = データベース接続情報
engine = sa.create_engine(url)

df = pd.read_csv(ファイル名)
df.to_sql(テーブル名, engine, index=False, if_exists='replace')
```

`pandas.to_sql`メソッドの`if_exists`は`append`にすることで、上書きではなく追記になります。

# まとめ

ここでは、Pythonを用いてMySQLにデータを追加する方法について解説しました。
SQL Alchemyを使うと、直接SQLを記述しなくてもデータベースにデータを登録することができます。

# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)
VScodeでpryと打つとbinding.pryに変換してくれる設定

##はじめに
Railsで開発していると必ず使うであろうデバッグ(binding.pry)をVScodeで簡単に出せる方法を紹介します。

##設定
###1 VScode上でcommand +shift + P →　Configure User Snippetsを選択
<img width="642" alt="スクリーンショット 2020-06-06 20.37.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/15cc7788-bd57-7d09-9f6a-e489294f7bc8.png">

###2 ruby.jsonを選択
<img width="628" alt="スクリーンショット 2020-06-06 20.38.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/c89db2d0-545b-1636-9c6e-e991790b9502.png">

###3 下記のコードを追加
"prefix"の値を変えるとpryではなく好きな文字からbinding.pryに変換できます。

```ruby.json
"Debug Console": {
  "prefix": "pry",
  "body": "binding.pry\n",
  "description": "A runtime developer console"
}
```

###4 pry + Enterで binding.pryに変換される
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/f457211d-98e9-cb56-fc38-bb15d95b3cb2.gif)
Defcon DFIR CTF 2018 HR Server- Changes Q1 2

#問題

https://defcon2018.ctfd.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3e324d49-d1ab-66e2-3df3-f2b1e6678fc8.png)

368701440の更新シーケンス番号で変更が記録されたファイルの名前は何ですか？

#解いてみた

ログを見てみましょう。

```
$J
$LogFile
$MFT
```

をイメージから取得してNTFS Log Trackerで読み込んでみます。

結果の中からジャーナルログのところのUSNが似たような数字なのでここの数字で検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fdf33aa8-e1ed-a01a-c9e5-20d45c780cca.png)

検索すると一つだけヒットしたのでこれが答えです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/38f2ea02-5496-d2be-5acd-6c3c33ac76d8.png)
【Golang】ゴルーチン⑦チャネルのセレクト

#【Golang】ゴルーチン⑦チャネルのセレクト
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main 
//channelとselect
//selectを使った受信
//複数のチャネルを使った受信の分岐

//マルチプロセスのよう

import (
	"fmt"
	"time"
)

func goroutine1(c chan int) {
	//無限ループを避ける場合、条件を決め、close()する
	//下記、無限ループ
    for {
		c <- 100
		//1秒
		time.Sleep(1 * time.Second)
	}
}

func goroutine2(c chan string) {
    for {
		c <- "groutin2"
		time.Sleep(3 * time.Second)
	}
}

func main() {
	c1 := make(chan int)
	c2 := make(chan string)
 
	go goroutine1(c1)
	go goroutine2(c2)

	//無限ループする
	for {
		//channelで分岐できる
		select {
		//ch1からの受信
		case msg1 := <- c1:
			fmt.Println(msg1)
		//ch2からの受信
		case msg2 := <- c2:
			fmt.Println(msg2)
		}
	}
}
```
Java/Google Sheets API V4/APIキー認証の場合はデータの更新処理(update)は401エラー(OAuth認証が必要)さらにSheetsオブジェクトにcredentialを渡すインタフェースが無い

できないならできないと書いておいて欲しい。=>Googleさん

# 環境

| 項目 | バージョン等 |
|:--|:--|
| java  | 1.8  |
| Sheets API Version | 4 |
| スプレッドシートの所有状態  | 所有かつURLを知っていれば誰でも編集可能  |

# 症状

- スプレットシートを所有しているアカウントでGoogle API Projectを作成
- Sheets APIを有効可
- APIキーを作成(Sheet API使用を割り当て)
- APIキーを使ってスプレッドシートにアクセス
    - 読み込み(get)はOK
    - 書き込み(update)で401エラー
        - 例外は`GoogleJsonResponseException`
        - エラーメッセージ:`401 Unauthorized`

# 原因

(どこにも書いてないが)書き込みの場合は、APIキー認証では不可でOAuth2認証が必要な模様。

どこにも書いてないのに、この結論を得られたのは`API Explorer`のおかげ。
ブラウザからAPIリクエストを実行できるよくある機能ですが、リクエストパラメタ設定だけでなく、認証方法も選択して実行できます。
その結果、API Key認証だと401エラー。OAuth2認証だと成功しました。

[API Explorer](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update)はこちら。

| Request設定 | 利用する認証設定 |
|:-:|:-:|
| [![Image from Gyazo](https://i.gyazo.com/a4b796ffca3af288fde10c70f3cc412f.png)](https://gyazo.com/a4b796ffca3af288fde10c70f3cc412f)  | [![Image from Gyazo](https://i.gyazo.com/86c3e6fd25473d28c77f3a830d63530c.png)](https://gyazo.com/86c3e6fd25473d28c77f3a830d63530c)  |  

## 参考

### 失敗レスポンス

```json
{
  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED"
  }
}
```

## 参考/成功レスポンス
```json
{
  "spreadsheetId": "1aAk_HFTmn*********************************",
  "updatedRange": "'p01'!B3:M3",
  "updatedRows": 1,
  "updatedColumns": 12,
  "updatedCells": 12
}
```

# [悲報]Sheets APIのJavaライブラリではSheetsインスタンスにOAuth2の認証情報を渡す方法がわからない

QuickStartのサンプルコードだと、Sheets.Builderコンストラクターの第三引数で`credential`を渡せるようになっているのですが、実際は`httpInitializer`になっていて、渡せません(コンパイルエラー)。

bigQueryのように`builder()`後にsetしたりできるのかと散々探しましたが、ダメ。Sheetsインスタンスの作成は全てのサンプルが存在しないコンストラクタになっています。Googleさん、勘弁してよ…。

**
```java
BigQuery bigquery = 
       BigQueryOptions.newBuilder()
          ★.setCredentials(credentials)★
          .setProjectId(projectId)
          .build()
          .getService();
```



httpInitializerのHttpRequestにSetOAuthTokenというインタフェースがあるので、これを使うのかな？

もうJavaじゃなくていいや。

**サンプルコード**

```java
Sheets service = 
       new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, ★getCredentials(HTTP_TRANSPORT)★)
           .setApplicationName(APPLICATION_NAME)
           .build();
```

**実際/公式APIドキュメントより**

https://developers.google.com/resources/api-libraries/documentation/sheets/v4/java/latest/

```java
Builder(
  com.google.api.client.http.HttpTransport transport, 
  com.google.api.client.json.JsonFactory jsonFactory, 
  com.google.api.client.http.HttpRequestInitializer ★httpRequestInitializer★)
```

![](https://i.gyazo.com/60b93066be5e52585625df13ff06e743.png)
JSでスライドショーを作る

❶スライドショーに使うイメージの配列を作る
　１定数の配列imagesを用意→画像のパスを登録
　２変数を作り、０を代入する（今何枚目の画像を表示しているか保存するため）
```

```
const images = ['images/image1.jpg', 'images/image2.jpg', 'images/image3.jpg', 'images/image4.jpg', 'images/image5.jpg'];
let current = 0;　//今何枚目の画像を表示しているか保存
```

❷ボタンをクリックしたときのイベントを津樹る

```
document.getElementById('prev').onclick = function(){
    changeImage(-1);
};
document.getElementById('next').onclick = function(){
    changeImage(1);};
```

❸ボタンをクリックしたときのファンクションを用意
   ボタンをクリックしたときに渡される１や−１はパラメータnumに代入

```
function changeImage(num){
```


❹functionに入れる条件式を設定（０〜写真の枚数を再現）
lengthは項目の数
current + numが０以上、current + numが配列imagesの項目より少ない▶︎true スライド実行

```

if (current + num >= 0 && current + num < images.length){
```
:sunny:次へのボタンをクリック
  1.ボタンクリックする（current num = 0+1=1） 0以上,
　2.項目数は５個（１<５）

:sunny:前へのボタンをクリック
１.current num = 0-1=-1▶︎条件外のためfalse
動かない

❺functionの(current + num >= 0 && current + num < images.length)がtrueになる
currentに際代入

```
current += num;　//進んだ時は１　後退した時は−１なので
```

❻imgタグを取得しsedにcuurent番目のデータ（画像パス）を設定する

```
document.getElementById('main_image').src = images[current];
```
src▶︎画像を切り替える
【言語処理100本ノック 2020】Pythonによる解答例まとめ

## はじめに
自然言語処理の問題集として有名な言語処理100本ノックの[2020年版](https://nlp100.github.io/ja/)が公開されました。
この記事では全100問のPythonによる解答例を紹介します。間違いやより良い方法など、お気づきの点があればぜひお気軽にコメントください。

本編は以下のリンク先に移転しました。
https://amaru-ai.hatenablog.com/entry/2022/10/15/204035
[AWS] Amazon Auroraについて

#Auroraとは
完全マネージド型(=AWSが管理してくれる)のリレーショナルデータベースエンジン。
スループット(=処理できる量)は最大でMySQLの5倍、PostgreSQLの3倍。これら2つのデータベースとは互換性もあるので導入もしやすい。

# Amazon Aurora DB クラスター
1つ以上のDBインスタンスと、DBインスタンスのデータを管理する1つのクラスターボリュームから構成されているもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605944/5ec6af40-5255-9fe2-550a-2a689eefec8f.png)

**クラスターボリューム**
データのコピーをとってくれる。複数AZに跨っているため、1つのAZに障害が起きても安心。

**DBインスタンス**
データベースに対して書き込んだり読み込んだりするもの。**プライマリDBインスタンス**と**Auroraレプリカ**がある。

**プライマリDBインスタンス**
データベースに対して書き込みと読み込み両方できるDBインスタンス。基本的には1つのDBクラスターに1つ。

**Auroraレプリカ**
通称**リードレプリカ**。その名前の通り読み込み専用。**最大15個**まで1つのDBクラスター内に設置できる。プライマリDBインスタンスが使用できない時、自動的にリードレプリカにフェイルオーバーしてくれる。

#Auroraのセキュリティ
3つのレベルがある。

####Auroraの設定などの変更に対する制限をしたい時
AmazonRDSの管理オペレーションの実行に必要なアクセス許可を付与する**IAMポリシー**をユーザーに適用する。要するに**IAM**を用いてアクセス制限を行う。

####DBインスタンスに接続できるデバイスを制限したい時
DBインスタンスのエンドポイントとポートに対して接続を開くことができるデバイスを**VPCセキュリティグループ**を用いて制御する。

####Amazon Aurora DB クラスターに対するログインとアクセス権限を制御したい時
・MySQLやPostgreSQLのログインとアクセス許可を認証するための技法を使用する。
・Aurora MySQLにIAMデータベース認証を使用する。
のいずれかの方法を用いる。

#最後に
とりあえず基本になりそうなところをまとめてみました。

参考
https://docs.aws.amazon.com/rds/index.html

いつか理解したい
https://qiita.com/kumagi/items/67f9ac0fb4e6f70c056d
Ruby シンボルについて

# シンボル
シンボルとは、任意の文字列と一対一に対応するオブジェクトのこと。
シンボルの構文は、シンボルはコロン(:)に続けて任意の名前を定義する。

`:シンボルの名前`

(例)

```ruby
:sushi 
:ruby
:pen 
```

## シンボルと文字列の違い

```ruby
:sushi.class # =>Symbol
'sushi'.class # =>String
```
シンボルはSymbolクラスのオブジェクト
文字列はStringクラスのオブジェクト

```ruby
string = 'sushi'
string.upcase! # => "SUSHI"

# シンボルは、イミュータブルなので、破壊的な変更は不可能
symbol = :sushi 
symbol.upcase! # => ruby.rb:5:in `<main>': undefined method `upcase!' for :sushi:Symbol (NoMethodError)
```

文字列は破壊的な変更が可能
シンボルは不可能

ミュータブルは、`変更可能な`という意味で、
イミュータブルは、`変更できない、不変の`という意味です。

文字列といった、ミュータブルなオブジェクトには破壊的な変更が適用できます。
しかし、
シンボルなどのイミュータブルなオブジェクトでは破壊的な変更が適用できません。
なので、シンボルは「何かに名前をつけたい、名前なので誰かによって勝手に変更されては困る」という用途に向いています。

◎イミュータブルなオブジェクトはデータ型で4種類

- 数値: integer・floatクラス
- シンボル: symbolクラス
- 真偽値: true,falseクラス
- nil: nilクラス

## シンボルの特徴/ 主な用途

- 表面上は文字列っぽいので、プログラマにとって理解しやすい
- 内部的には整数なので、コンピュータは高速に値を比較できる
- 同じシンボルは同じオブジェクトであるため、メモリの使用効率が良い
- イミュータブルなので、勝手に値が変えられる心配がない

※ シンボルは同じシンボルであれば、全く同じオブジェクトであるという特徴があります。
このため、「大量の同じ文字列」と「大量の同じシンボル」を作成した場合、シンボルの方がメモリの使用効率が良くなります。

シンボルがよく使われるのは、ソースコード上では名前を識別できるようにしたいが、その名前が必ずしも文字列である必要がない場合です。
代表的な利用例は、ハッシュのキーです。
ハッシュのキーにシンボルを使うと、文字列よりも高速に値を取り出すことができます。

## 参考にした文献

[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/dp/4774193976/ref=cm_sw_em_r_mt_dp_U_shaUEbXSFD416)
Mac の「復旧サーバ上のインストーラ情報が壊れています。」を解決した

# 復旧サーバ上のインストーラ情報が壊れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/61b9958e-3de9-42be-33ac-a6922de25ee5.png)

「復旧サーバ上のインストーラ情報が壊れています。」と言われても『どないすんねん』という感じで途方に暮れたんですが、なんとか解決できたので、その方法を残しておきます。

※試行錯誤の中での解決のため、あまり画像等残せていません。各手順に関して特に複雑なことはやっていないので、もしこの記事の方法試す場合、手順以外は他記事を参考にしていただいた方がわかりやすいかもしれないです。

# PC情報

Macbook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)

# やったこと

1. システム終了

2. macOS 復元
https://support.apple.com/ja-jp/HT201314

3. 地球儀の画面で Wifi 設定
復元用のインストールが走るのでしばらく待つ -> macOSユーティリティが開く(自動で開かなければもう一度復元の手順で開く)

4. ディスクユーティリティでストレージデバイスを消去して再フォーマット
内蔵ディスクの構成がごちゃっとしていたりするので、思い切って全て消して再フォーマットをかける
https://support.apple.com/ja-jp/guide/disk-utility/dskutl14079/mac

5. macOSユーティリティのホームに戻り、「macOSを再インストール」
規約等の同意を済ませてインストール開始
うまくインストールできればここまで
「復旧サーバ上のインストーラ情報が壊れています。」のメッセージ、インストールが中断される、等でうまくインストールできない場合は `1.` からやり直す


# 気になったこと
「復旧サーバ上のインストーラ情報が壊れています。」のメッセージが表示された時にインストールしようとしていた OS は **「macOS Sierra」** だったんですが、正常にインストールできた時にインストールしていた OS は **「macOS Catalina」** でした。
内部情報によってインストール先が切り替わって、その関係で「復旧サーバ上のインストーラ情報が壊れています。」のエラーがでる場合がある…？とかなんでしょうか？

# 背景
「最近特定の Wifi につながりにくいな〜」「買ってからしばらく経ってるけど初期化してないな〜」ということで初期化作業を行っていました。
Visual Studio Code で AsciiDoc を

環境構築についてわかった(つもりになっていること)を記します。
AsciiDoc歴は数日です。

# VSCodeを使ってAsciiDocファイルをどうしたいか

1. 作成したり編集したりしたい
2. 1 + プレビューを表示したい
3. 2 + HTMLで出力したい

とはいえ、1だけなら、テキストエディタだけで十分可能です。AsciiDocファイルは、テキスト
で書かれていますので。

# インストールするもの

これだけでよい。

* Visual Studio Code本体
* Visual Studio Codeの拡張機能：AsciiDoc


# インストール手順

### *Visual Studio Code本体*

* Visual Studio Codeのダウンロードサイト https://code.visualstudio.com/download にアクセスする。
* 次図赤枠箇所("Windows"の囲み)をクリックする。exeのダウンロードが開始されるので、完了まで待つ。
<img alt="DownloadPage.png" width="515" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402403/70924757-104b-ad0d-df41-407a0843c167.png">

* ダウンロードされたexe(※)をダブルクリックして開き、インストールを開始する。
※2020年6月6日現在、64bitPCでは VSCodeUserSetup-x64-1.45.1.exe

* あとは、表示されるダイアログに沿ってインストールを進めていけば、完了する。

### *拡張機能：AsciiDoc*

* Visual Studio Codeを起動する。
* ウインドウ左方真ん中あたりにある拡張機能のアイコン
<img width="3%" alt="ExtentionIcon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402403/97de7b45-916b-2368-95bd-4203cf63cbbd.png">
をクリックする。
* カーソルが検索枠の中に移動するので"AsciiDoc"と入力する。
* 赤いアイコンのもの<img width="15%" height="" alt="AsciiDocIcon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402403/3f7526aa-e0e9-23c1-508f-42fea20f285b.png">を選択し、[Install]をクリックする。
* Visual Studio Codeを再起動する。


# 動作確認

### *プレビュー表示*
- Visual Studio Codeを起動する。

- 上方左側のメニュー[File]→[New File]をクリックし、Untitled-1のタブを開く。

- 続けて[File]→[Save]をクリックし、test.adoc として保存する。 

- test.adoc にの1行目に以下の内容をコピー&ペーストする。

```json:test.adoc
= タイトル文字列

== はじめに

はじめの文章など。

== 概要

. これと
. これが
. これで
```

- 右上の"Open Preview to the Side"のアイコン<img width="25" alt="PreviewIcon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402403/b2130245-4a5c-1063-e2d8-5d62d3394f38.png"> をクリックする。
- 次のようなプレビューが表示されればOK。

<img width="416" alt="PreviewResult.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402403/1421ae99-495b-7dcd-1643-88bc6b88d8ac.png">

### *HTML出力*

* Visual Studio Codeを起動し、test.adoc を開く。

* 上方のメニュー[View]→[Command Palette]をクリックする。

* AsciiDoc: Save HTML Document と入力し、Enterキーを押下すると、test.adoc と同じフォルダに test.html が作成される。これをChromeやSafariなどのブラウザで開けばOK。

# まとめ

Visual Studio CodeでAsciiDocを開き、編集、プレビュー表示、HTML出力ができることがわかった。


# 参考
☆参考にさせていただきました。感謝いたします。
　https://qiita.com/xmeta/items/de667a8b8a0f982e123a
　https://qiita.com/tamikura@github/items/5d3f62dae55617ee42bb
作った vue アプリケーションをubuntuとapache2でawsにデプロイする方法

環境

ubuntu 18.04
apache2　2.4

今回はawsで開発していきます。
インスタンスを作成して、ssh接続をしたところから解説していきます.

今回はapache2を使うので、
インバウンドで80ポートを開放しておかないとapache２が適応されないので注意してください。

```
$ sudo apt update
$ sudo apt install apache2
$ sudo apt install nodejs
$ sudo apt install npm
$ sudo apt purge nodejs npm
$ npm install --save
```
と順番に打って必要なモジュールをインストールします。

次にデプロイするアプリケーションを引っ張ってきます。


先にローカルで作っておいたファイルをgithubで保存して、それをダウンロードしていきます。

```
$ git clone <githubのパス>.git
```

次に本番環境用のディレクトリを作ります。
アプリケーションを作る際に特に設定をいじっていなかったら

```
$ npm run build
```

でデプロイ用のディレクトリ(dist)が作れると思います。


次にapache2の設定を書き換えていきます。


```
$ vim cd /etc/apache2/sites-available/vue.conf
```

(confファイルの名前はなんでもいい)


```/etc/apache2/sites-available/vue.conf

<VirtualHost *:80>
  ServerName <パブリックdns>または<パブリックipアドレス>
  DocumentRoot git colneを打ったディレクトリの絶対パス/dist
</VirtualHost>
```
と書き換えます。

これで完成です。
GitエラーPermission denied (publickey).の解決方法

Gitでpushしようとしたらエラーになりました。

## エラーメッセージ

ターミナルから返ってきたエラー文は下記の通りです。

```
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

リモートリポジトリが読み込めず、アクセス権を作成してくださいとのことでした。

## 解決方法

SSH key（公開鍵）を登録、もしくは再設定するとpushできるようになるとの事でしたので試してみました。
### 登録の流れ

 - 公開鍵の生成
 - 公開鍵をコピー
 - GItHubにペーストして登録


### SHHコマンドとは？

<blockquote>SSHは暗号技術を使い、リモートホストで安全にコマンドを実行するためのプロトコルで、「ssh」はそのプロトコルを利用してリモートサーバーを遠隔操作するコマンドです。

<a href="https://www.atmarkit.co.jp/ait/articles/1503/23/news004.html">@IT</a></blockquote>

SHHコマンドを使えば、リモートホスト（SSHサーバー）にログインできるようになるとの事です。
なるほど、勉強になりました。

### SHH Keys（公開鍵）の設定方法

.sshディレクトリに移動して、

```
$ cd ~/.ssh
```

コマンドを実行します。

```
$ ssh-keygen
```

id_rsa.pubにpublic key（公開鍵）が生成されます。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa): 
/Users/xxxx/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
our identification has been saved in /Users/xxxx/.ssh/id_rsa.
Your public key has been saved in /Users/xxxx/.ssh/id_rsa.pub.
```

pbcopyのコマンドでコピーして、

```
$ pbcopy &lt; ~/.ssh/id_rsa.pub
```

GitHubのsetting画面から「New SSH」で公開鍵をペーストします。
公開鍵が正しければ、以下の画面になります。

![SSH_Keys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/ba1ab9aa-8020-fe0a-ad01-5ab91da43dbd.png)

公開鍵が間違っていると、下記のエラーが返ります。

```
Key is invalid. You must supply a key in OpenSSH public key format.
```

下記のコマンドをうって、

```
$ ssh -T git@github.com
```

successfully authenticatedを返ってくれば、登録が成功しています。

```
Enter passphrase for key '/Users/xxxx.ssh/id_rsa':
Hi user-name! You've successfully authenticated, but GitHub does not provide shell access.
```

Google翻訳してみると、「認証に成功しましたが、GitHubはシェルアクセスを提供しません。」との事。

シェルアクセスはできませんが、SSHアクセスはできるようになりました。
写真ACのダウンロード数をグラフ化したい【スクレイピング実装編】 〜1日10行コーディング〜

## 3日目

今回は写真のダウンロード数がグラフ化されるようなものを作ろうと思います。

**詳細**
写真ACという著作権フリーの画像投稿サイトがあるのですが、そこでは前日にダウンロードされた数が出るのですが、次の日になったら2日前のダウンロード数とかが見れないので1日1回取得してそれをDBに入れて最終的にグラフにするといったことをしようと思います。
https://www.photo-ac.com/
![](https://i.imgur.com/t4lJqLG.png)
(これでアカウント止められてたりしたら自己責任でお願いします笑)

### 【技術テーマ】
スクレイピング

### 言語
* ruby

### 目標成果物
今日のところは一旦サイトから情報を取得する部分を実装したいと思います。

### コードと資料

#### 1. htmlから必要な情報を取得
前回とは違い、今回はログイン周りが関係してくるのでMechanizeを利用します。

```Gemfile
source 'https://rubygems.org/'

gem 'nokogiri'
gem 'mechanize'
```

この状態で

```
bundle install --path .bundle
```
なんで--pathでパスを指定してるかって言うと、指定しないとローカルの環境全てに反映されてしまって、後々面倒なことになるからです。

実際の取得してくる部分のコードはこちら

```crawler.rb
require 'nokogiri'
require 'mechanize'

agent = Mechanize.new
agent.get("https://www.photo-ac.com")

agent.post("https://www.photo-ac.com/auth/login",{
  acc_type: 'cr',
  email: 'メールアドレス',
  password: 'パスワード',
  remember_me: '1'
})

page = agent.get("https://www.photo-ac.com/creator/list/?pl_q=&pl_order=-releasedate&pl_pp=200&pl_disp=all&pl_ntagsec=&pl_tags50over=&pl_chkpsd=")
doc = Nokogiri::HTML.parse(page.body, nil, 'utf-8')
doc.css(".photo-list").each{|div|
  p div.css(".sectiondata li")[0].text
  p div.css(".sectionimg .preview")[0].text
}
```

こちらを実行すると

```
"ID：2875969"
"0"
"ID：2875964"
"0"
"ID：2875028"
"0"
"ID：2875022"
"0"
"ID：2874964"
"0"
"ID：2871884"
"0"
"ID：2871883"
"0"
"ID：2871879"
"0"
"ID：2871873"
"0"
"ID：2871870"
"0"
"ID：2837286"
"0"
"ID：2837285"
"0"
"ID：2837282"
"0"
"ID：2837281"
"0"
"ID：2837280"
"0"
"ID：2837277"
"0"
"ID：2837276"
"0"
"ID：2836745"
"0"
"ID：2836741"
"3"
"ID：2836737"
"1"
"ID：2836735"
"2"
"ID：2836730"
"1"
"ID：2836723"
"0"
"ID：2836718"
"1"
"ID：2746521"
"6"
"ID：2746517"
"11"
"ID：2746513"
"1"
"ID：2746505"
"1"
"ID：2746086"
"1"
"ID：2746084"
"4"
"ID：2746070"
"15"
"ID：2746066"
"16"
"ID：2742664"
"10"
"ID：2742530"
"17"
"ID：2742522"
"6"
"ID：2742517"
"3"
"ID：2741719"
"4"
"ID：2741715"
"16"
"ID：2741708"
"2"
"ID：2741705"
"0"
"ID：2741700"
"0"
"ID：2741699"
"0"
"ID：2741675"
"21"
"ID：2741674"
"2"
"ID：2741653"
"0"
"ID：2741629"
"1"
"ID：2741567"
"0"
"ID：2741381"
"22"
"ID：2741336"
"7"
"ID：2733068"
"14"
"ID：2733060"
"0"
"ID：2733050"
"1"
"ID：2690326"
"2"
"ID：2690291"
"7"
"ID：2690259"
"1"
```

上記のように画像のIDと、現在のダウンロード数がわかります。
これを1日1回DBに入れて、データを貯めればグラフ化するのは簡単そうですね。
非エンジニアのためのcsv編集

楽天、yahooなどの販売ページ用のcsvを編集する事が多いです。
今回はフリーソフトのsmooth csvでの僕の使い方をまとめました。
（sql処理を書きたくて記事にしました。そこまでの説明はざっくりです。）

##そもそもcsvとは
カンマで区切った値（Comma Separated Value）のことです。
excelでも編集できますが、値が変更される癖があるので専用のcsvソフトで編集したほうが良いです。

##ダウンロード
[smooth csv](https://smoothcsv.com/product)をダウンロード。
javaが必要なため、それもダウンロード。

##smooth csvの良いところ

- excelのような見た目で使えます。
- データ量が多くても軽いです。
- 検索したときに、マーカーがつくのでわかりやすい。
- grepが使える（あまり使ってないけど）
- sqlが使える（selectのみ　これが書きたくて記事を書きました。）

##よく使うショートカット
- 選択範囲を埋める　ctrl + ALT + D
- 後ろの行を増やす　ctrl+;
- 後ろの列を増やす　ctrl+shift+; 
- 行を削除　shift+D 
- 列を削除　shift+ctrl+D

![csv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/645dd465-f157-8846-6366-1782e8b323b0.gif)

僕のPCは、ショートカットを別の動作に割り当ててる関係で
埋める処理だけ、編集→選択範囲を埋めるの流れになっています。

あとは、思った見た目でファイルが開いていない時は
ctrl+F5で開き方を指定できます。

##SQL処理

書きたかった事です。
select処理のみですが、よく使います。
僕の場合は、セール対象となったデータだけをかき集めたいときによく利用してます。

基本的な文
**select * from csvtable('item.csv') where "2" = 'aaaa'**

item.csvの２列目の値が、aaaaを集めろ。　出力列項目は全部にて。（*)

![csv2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/b7dcc312-397e-0f3f-60b4-1c73ba24be42.gif)

"2" = 'aaaa'の所は他にもこのような書き方もできます。

**nullじゃないもの**
"2" not null


**頭に「なんとか」があって、aaがつくもの**
"2" like '%aa'

%はワイルドカードです。


**かっこで括った値で**
"2" in ('aaaa','bbbb')


最後のかっこで括った処理は遅めで
出力結果が重複したり、バラバラになることがあったのでお勧めはしないです。

僕がここで使うのはunion allです。
selectを結合させて、結果を重ねる処理です。

select * from csvtable('item.csv') where "2" = 'aaaa'
union all
select * from csvtable('item.csv') where "2" ='bbbb'

こんな感じです。
２つのselect文をunion allで結合します。
出力結果は、持ってきたリストと同じ並びで出力してくれます。

もちろん手入力では大変なのでエクセルを使ってみましょう。

![csv3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/b1ebad3b-385b-a20b-c5a4-81251c6906f4.gif)

最初のunion all はいらないので消してください。

union all select～　aaaa
union all select～  bbbb
これを。

select～　aaaa
union all select～  bbbb
こう。

できた！と思ってもsqlに貼り付けると、不要な所にダブルクォーテーションがついてきます。
テキストエディタで置換をしてください。

##EXCELアドイン

置換が面倒なので、excelアドインを作ってみました。
動作保証はしかねます。
![csv4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/f5a95a90-4d1b-c7f2-cbda-397cd7bf8bab.gif)

https://github.com/tensai-man/excel-sql
（初めてのgithub公開）

##補足

andも使えます。

例
**select * from csvtable('item.csv')
where "4" like '%防水%' and "2" not like '%防水%'**

4列目の商品説明文には「防水」と書いてて、
2列目の商品名に「防水」と書いていないもの　修正しなきゃ！

smooth csvは、selectだけなので確認用に。
更新updateも使いたくなったら、accessなど別のやり方で
【Windows】ライセンス認証方法の違いをざっくりまとめました。

# はじめに
業務でWindowsServerやWindows10を触っています。
今回は、Windowsのライセンス認証方式について紹介していきたいと思います。

# ライセンス認証方式の種類

Windowsのライセンス認証方式は、2つあります。

- **MAC**
- **KMS**

こちらの認証方式について今回は解説していきたいと思います。

## MAKとは？

**「マルチプルアクティベーションキー」の略。**
個別のパソコンがインターネット経由でMicrosoftにアクセスし、直接ライセンス認証を行う方式。

※インターネット接続ができない場合も認証可能
① Microsoftのコールセンターへ連絡し、MAK認証コードを取得
②スクリプトを利用して認証コードをインストール


### MAKの特徴

- 1回のアクティベーションで、ハードウェアが大幅に変わらない限り使い続けることが可能
- ライセンスキーには回数の上限が設定されている
- ライセンスキーの使用個数はMicrosoftプロダクト認証センターにて管理される

### MAKの図

![MAK.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/47445a6b-e408-764c-630d-16aefa9c11e7.jpeg)


## KMSとは？

**キーマネジメントサービスの略。**
各PCがKMSホストと呼ばれるライセンス認証サーバーに接続することによって、ライセンス認証を行う方式。

### KMSの特徴とは？

- KMSホストの構築が必要
- クライアント台数が25台以上でネットワークに接続している場合に適している
- MAKとは違い、180日間の有効期限がある
- デフォルトでは、7日間毎に有効期限の延長を行う。(アクティベーション)
- MAKのように1つ1つライセンス認証を実施する必要がない

### KMSの図

![KMS.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/25c1c600-1984-f22e-2929-bdeedbffa4f3.jpeg)


# まとめ

|  認証方式  | 説明   |
| ---- | ---- |
|  MAK  |  Microsoftへアクセスし、直接ライセンス認証を行う方式  |
|  KMS  |  KMSホストより25台以上のクライアントPCに対して、ライセンス認証を行う方式   |


# 参考

[マイクロソフト、ボリュームライセンスのライセンスキーMAK・KMSとは](http://www.putise.com/server/windows-server-2008/ms-activation-mak-kms)
[C++]線形代数ライブラリEigen3.3.7環境構築

# 環境
 - Ubuntu 20.04 LTS
 - g++ 9.3.0
 - GNU Make 4.2.1

#はじめに
タイトルの通り`Eigen 3.3.7`を使うための準備をします。

# `Eigen`の入手
[ここから](http://eigen.tuxfamily.org/index.php?title=Main_Page)入手。
2020年6月6日現在、安定した最新版は3.3.7でした。

# セットアップ
`Eigen-3.3.7`の中の`Eigen`をコピーして`main.cpp`と同じディレクトリに配置。

# ディレクトリの構成
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246294/fbdb2e8c-ce3f-1d58-29ac-9ed22738da55.png)



# ソース
[Getting started](http://eigen.tuxfamily.org/dox/GettingStarted.html)を参考に、`Makefile`とC++のソースを書きます。

```Makefile:Makefile
build:
	g++ -I ./ main.cpp -o main

run:
	./main
```

```main.cpp
#include <iostream>
#include <Eigen/Dense>

using Eigen::MatrixXd;

int main(void){

	MatrixXd m(2,2);
	
	m(0,0) = 3;
	m(1,0) = 2.5;
	m(0,1) = -1;
	m(1,1) = m(1,0) + m(0,1);
	
	std::cout << m << std::endl;

return 0;
}
```

# 実行結果
```
  3  -1
2.5 1.5
```

# 最後に
行列の`(1,1)`成分が、ソース中だと`(0,0)`になるので、そこを気をつけて使わなければ。

# `Eigen`へのリンク
[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)
[Documentation](http://eigen.tuxfamily.org/dox/)
WSL2でDocker初挑戦【PostgreSQL12 + pgAdmin4環境構築】

#はじめに
Windows 10 May 2020 Updateが正式にリリースされましたので、WSL2でDockerに初挑戦してみました。

#環境構築
[「Windows10 2004でWSL2を設定してVSCodeからDockerに接続する」](https://qiita.com/cold-wisteria/items/9db8a5560bdec99f428a)で詳しい記事がありましたので、参考にさせていただきました。

#ファイル作成
D:\docker\pgsql12に「Dockerfile」「docker-compose.yml」を作成します。

```:Dockerfile
FROM postgres:12
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8
```

```:docker-compose.yml
version: '3'
services:
    db:
      build: .
      volumes:
        - postgresql:/var/lib/postgresql/data
      ports:
        - "5432:5432"
      environment:
        POSTGRES_USER: admin
        POSTGRES_PASSWORD: password
        POSTGRES_DB: postgres
        LANG: ja_JP.UTF-8
    adm:
      image: dpage/pgadmin4:latest
      volumes:
        - pgadmin:/var/lib/pgadmin:z 
      ports:
        - "8000:80"
      environment:
         PGADMIN_DEFAULT_EMAIL: admin
         PGADMIN_DEFAULT_PASSWORD: password
volumes:
  postgresql:
    driver: local
  pgadmin:
    driver: local
```

#イメージをビルド
「/mnt/d/docker/pgsql12」にパスを移動して、以下のコマンドを実行します。

```Bash
docker-compose build
```

#起動

```Bash
docker-compose up -d
```

#確認
dashboardで確認することができます。
![docker1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/25332e82-dcbe-ae56-87dd-4ea22560231b.jpeg)

#pgAdminへの接続
pgAdminのポートは8000に設定しましたので、
http://localhost:8000/
にアクセスします。

PGADMIN_DEFAULT_EMAIL: admin
PGADMIN_DEFAULT_PASSWORD: password

で設定したID、パスワードでログインしてください。

日本語を選択することもできます。

#pgAdminからPostgesSQLへの接続

今回のサンプルではホスト名/アドレスに「pgsql12_db_1」としますと接続できます。
![docker2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/7f0bf5ba-d055-7076-8d5d-137d8af48715.jpeg)

接続完了です。
![docker3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/f1f82ebe-49a9-5e77-524a-95826749c25b.jpeg)


#まとめ
Docker初挑戦でした。まず、「Dockerfile」「docker-compose.yml」をどこに書けばよいのか、そこから分かりませんでした。
グーグル先生に聞きますと、どこでも良いと書いてあり、どこでも良いと言われても・・・。
という感じでした。

volumesの保存先指定も苦戦しました。
結局任意のフォルダに指定する方法は分からずじまいです。

とりあえずこれで私がやりたかったことはできました。

初DockerをWindowsで、しかもリリースされたばかりのWSL2での挑戦はハードルが高かったかな。

#参考/出展
[「Windows10 2004でWSL2を設定してVSCodeからDockerに接続する」](https://qiita.com/cold-wisteria/items/9db8a5560bdec99f428a)

[docker-composeで日本語モードのPostgreSQLとpgAdmin4を起動するには](https://denor.jp/docker-compose%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AEpostgresql%E3%81%A8pgadmin4%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)