OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Private Registry with Let's Encrypt on Ubuntu 20.04

# はじめに
DockerのプライベートRegistryを作る方法。Let's Encryptも使う。
サイトでApacheやNginxなど導入すると書いてあるところがあったけど、大げさなので利用しない。
なるべくシンプルな方法を記載。

構築するregistryのURLはregistry.octopt.comとする。

certbotは次の通りインストール

```bash
$ sudo add-apt-repository ppa:certbot/certbot -y
$ sudo apt update
$ sudo apt install certbot -y
```
Dockerは公式のインストール方法を推奨する。
https://docs.docker.com/engine/install/ubuntu/

# Docker レジストリの作成
```bash
# 以下は全部rootでやる
$ sudo su

# certbotでファイルを取得
$ certbot certonly --standalone --preferred-challenges http --non-interactive  --staple-ocsp --agree-tos -m dev@octopt.com -d registry.octopt.com

# Let's Encryptの自動更新の設定
$ cat <<EOF > /etc/cron.d/letencrypt
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
30 2 * * 1 root /usr/bin/certbot renew >> /var/log/letsencrypt-renew.log && cd /etc/letsencrypt/live/registry.octopt.com && cp privkey.pem domain.key && cat cert.pem chain.pem > domain.crt && chmod 777 domain.*
EOF

# SSL certificatesのリネーム
$ cd /etc/letsencrypt/live/registry.octopt.com && \
cp privkey.pem domain.key && \
cat cert.pem chain.pem > domain.crt && \
chmod 777 domain.*

#ログインしてPushするようにする。usernameはfoouser, passwordはbazzpassとする。
$ mkdir -p /mnt/docker-registry
$ docker run --entrypoint htpasswd registry:2.7.0 -Bbn foouser bazzpass > /mnt/docker-registry/passfile
  
docker run -d -p 443:5000 --restart=always --name registry \
  -v /etc/letsencrypt/live/registry.octopt.com:/certs \
  -v /mnt/docker-registry:/var/lib/registry \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -e REGISTRY_AUTH=htpasswd \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/var/lib/registry/passfile \
  registry:2.7.0
```

以上。
ポート４４３は開けておくこと。
外部から無事できているか確認してみる。

```bash
$ curl https://foouser:bazzpass@registry.octopt.com/v2/_catalog
```
{"repositories":[]}
がかえってこればOK

# Pushしてみる
まずdocker ログインする必要がある。

```bash
$ docker login -u foouser -p bazzpass registry.octopt.com:443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
```

となる。その後はPushできる。手元にあったmyalpineをpushする。pushする前に一度docker tagしてpush する

```bash
$ docker tag alpine:latest registry.octopt.com:443/myalpine
$ docker push registry.octopt.com:443/myalpine
The push refers to repository [registry.octopt.com:443/myalpine]
50644c29ef5a: Pushed 
latest: digest: sha256:a15790640a6690aa1730c38cf0a440e2aa44aaca9b0e8931a9f2b0d7cc90fd65 size: 528
```

OK.


# 参考文献
https://gadelkareem.com/2018/10/23/deploy-a-docker-registry-with-letsencrypt-certificates-on-ubuntu-18-04/
基礎Webアプリケーション作成　Servlet/JSP（投稿画面）

#はじめに
今回は前回、[基礎Webアプリケーション作成　Servlet/JSP（ログイン機能）](https://qiita.com/tatufut/items/184f10564c5cd50f770b)の続きを行います。
この記事で目指すのは投稿画面でのログインしているかしていないかの確認やしていない場合の処理をすることを目指します。

##実行環境
- Eclipse4.16
- Tomcat9
- Java11

##1.投稿のModel作成
投稿画面を表示するので投稿情報のモデルを作成します。
投稿にはユーザー名と文章が存在することとする。

```java:Article.java
public class Article implements Serializable{

	private String userName;
	private String text;

	Article(){}

	Article(String userName,String text){
		this.userName = userName;
		this.text = text;
	}

	public String getUserName() {
		return this.userName;
	}

	public String getText() {
		return this.text;
	}
}
```

##2.記事に関するリクエスト処理のコントローラ
このコントローラでログインしているかの確認の処理を行い

- ログインしている場合→`bulletin-board.jspをフォワード`
- ログインしていない場合→`ログイン画面へリダイレクト`

```java:BulletinBoard.java
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletContext application = this.getServletContext();
		List<Article> articleList = (List<Article>) application.getAttribute("articleList");  // 1
		if(articleList == null) {
			articleList = new ArrayList<Article>();
			application.setAttribute("articleList",articleList);  // 2
		}

		HttpSession session = request.getSession();
		User loginUser = (User) session.getAttribute("loginUser");  // 3

		if(loginUser == null) {
			response.sendRedirect("./login");  // 4
		}else {
			request.getRequestDispatcher("/WEB-INF/view/bulletin-board.jsp").forward(request, response);  // 5
		}
	}
```

1. アプリケーションスコープから取得
2. １が`null`の場合、空の記事リストをアプリケーションスコープにセット
3. セッションスコープから取得
4. ログインしていない場合ログイン画面にリダイレクト
5. ログインしている場合掲示板画面を表示

##3.掲示板画面のビュー作成

```jsp:bulletin-board.jsp
<h2>こちらは掲示板画面です。</h2>
<p><c:out value="${loginUser.name}"/>さんがログイン中です。</p>
```
2行目で誰がログインしているか出力します。

##4.実行
動作確認してログインしていれば掲示板画面が表示されて
ログインしていなければログインページにリダイレクトされれば成功！
一度セッションスコープを削除したい場合は以下を記載する
>request.getSession().removeAttribute("loginUser");

##最後に
次回はログアウト機能実装を行います。
メモC++

# C++勉強メモ
プログラミング・C++初心者のメモです．
知らなかったことをメモして記録していきます．
(C言語すらまともに理解できていないため，C言語のこともメモに入っていると思います．)
##(1)コンストラクタ：メンバ変数()
コンストラクタの定義前のコロンの後のメンバ変数()では，()内の値によるメンバ変数の初期化を行っている．

##(2).c_str()
std::string型はそのままでは出力できないため，変数名.c_str()で変換を行ってから出力する．
std::string型から**char*型**を引っ張り出してくるもの．

##(3)ストリーム出力演算子
ストリームに出力する際に，自作のクラスなどを対応させることが可能らしい(理解次第追加する)．

##(4)tolower(引数)
英大文字を小文字に変換する．

##(5)isalpha(引数)
引数が英文字なら真，それ以外なら偽を返す．（whileで利用？）

##(6).at(要素番号)
これで配列要素にアクセスできる．[]を使う場合と同様に要素番号を与えればいい．
Windowsのwsl2+docker試してみた

2020/07/19の備忘録

マイクロソフト公式の通りインストール
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10


1. Windows Subsystem for Linux のインストール

    ```
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    ```

2. Microsoft Store を開き、希望する Linux ディストリビューションをインストール。（今回は「Debian GNU/Linux」）

3. インストールしたディストリビューション起動＆セットアップ。もしコンソール画面に「0x8007019e」エラーが発生したらPCを再起動

    ```
    Installing, this may take a few minutes...
    WslRegisterDistribution failed with error: 0x8007019e
    The Windows Subsystem for Linux optional component is not enabled. Please enable it and try again.
    See https://aka.ms/wslinstall for details.
    Press any key to continue...
    ```

4. "仮想マシン プラットフォーム" のオプション コンポーネントを有効にする

    ```
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    ```

5. WSL 2 を既定のバージョンとして設定する

    ```
    # 現在のバージョンを確認
    wsl -l -v
    wsl --set-default-version 2
    ```

6. 下記表示が出たら https://aka.ms/wsl2kernel に従って、WSL 2 で使用する Linux カーネルをコンピューターにインストール

    ```
    WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください
    ```

7. リンク先でLinux カーネル更新プログラム パッケージをダウンロード＆インストールする

8. 再度確認

    ```
    wsl --set-default-version 2
    wsl --set-version Debian 2
    wsl -l -v
    ```

ちなみにエクスプローラーのパスに`\\wsl$`を入力すると、インストールしたlinuxのディレクトリにアクセスできる

# windowsにDockerインストール

公式からインストーラーDL
https://www.docker.com/products/docker-desktop

「Enable WSL 2 Window Features」のチェックをして
インストール

# wsl2+Docker速度検証

- Windows10 MSI製デスクトップPC
 - CPU：core i7-8700 3.2GHz 6コア 12スレッド
 - メモリ:16GB
 - シネベンチR20：1924

実運用しているPJのDockerビルド時間
→22分2秒

- MacBook Pro 15inc(2019)
 - CPU： core i7 2.6GHz 6コア 12スレッド
 - メモリ：32GB
 - シネベンチR20：1547

実運用しているPJのDockerビルド時間
→20分14秒

# まとめ
Macbook Proの方が早いのはなぜ。。。メモリの差？
elasticsearch.ymlのnetwork.host項目を編集する

ダウンロードして展開してハイlocalhost:9200でアクセスできました。じゃあウチの環境に合わせてアクセスしやすいようにちょっと設定変えるか、アレ動かないぞ、どうすりゃいいんだ。というよくあるやつ。
セキュリティの問題もあるので正しく設定したい。`0.0.0.0`に逃げるのは無し。

# バージョンとか
Windows版
Elasticsearch 6.7.2～を想定
もっと古いと書き方が違う。


# elasticsearch.yml
`\config\elasticsearch.yml`
ほとんどの設定はこれに書く。何か違っているとブートストラップチェックで容赦なく止まる。
Windows版だとShift-JISであり、このままだとコメントに日本語を書くとエラーになる。半角カタカナもだめ。日本語コメントを付けたい場合UTF8にすること。

# network.host設定

## この設定の意味

[公式のリファレンス](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html)

Elasticsearchはデフォルトではlocalhostからのリクエストしか受け付けない。他からのリクエストを受け付けさせる時にこの設定を編集する。
「network.hostに書いたIPアドレスからのリクエストを受け付ける」**ではない**。
「network.hostに書いた名前でリクエストされたら返事する」が正解。

>network.host
>ノードはこのホスト名またはIPアドレスにバインドし、このホストをクラスター内の他のノードに公開（アドバタイズ）します。

初めてElasticsearch使いだした頃、ここの勘違いで3日くらい流れた思い出深い設定箇所。世界中の質問サイトに似たような勘違いをした質問があって惑わされまくった…。


## 特別な値

IPアドレスの他、いくつかの特別な語で指定が可能。
公式リファレンスに[特別な値](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html#network-interface-values)について記載がある。

>\_[networkInterface]_
>たとえば、ネットワークインターフェイスのアドレス_en0_。
>\_local_
>システム上のループバックアドレス（例：）127.0.0.1。
>\_site_
>システム上のサイトローカルアドレス（例：）192.168.0.1。
>\_global_
>システム上のグローバルスコープのアドレス（例：）8.8.8.8。

### \_[networkInterface]_

特定のNICから来るリクエストを受け付ける。存在しないインターフェースを指定するとブートストラップチェックで止まる。
書き方のバリエーションがいろいろあって、複数NICがあってクラスタ組むときに使うと便利に指定できるらしい。

### \_local_

localhostでのリクエストを受け付ける。デフォルト値。
他の指定するときにうっかり書き忘れて、localhost:9200でアクセスできない！とあせるのはよくあること。

### \_site_

いわゆるプライベートIPアドレスでのリクエストを受け付ける。セグメント異なっていてもOK。 ~~クラスの異なるプライベートIPアドレス間で受けられるかは試してない。~~ クラスが異なってもプライベートIPアドレスであれば受け付ける。

補足：サイトローカルアドレス
古いIPv6用語で、IPv6でIPv4同様のプライベートアドレスのことを指して一時期使われていた言葉。昔IPv6について勉強した人は聞いたことのある言葉のはず。
ElasticsearchはIPv6を受け付けているのでこの言葉を使って表現し、今もリファレンスを直してないままのようだ。
現在は廃止になって「ユニークローカルアドレス」という別の規格が定められている。
[RFC 4193](https://tools.ietf.org/html/rfc4193)


### \_global_
グローバルIPアドレスでのリクエストを受け付ける。外部公開してしまう要注意設定。
グローバルアドレスの存在を検知できない場合、ブートストラップチェックで止まる。

## とりあえず動かしてみたいなら
`network.host: _local_,_site_`
`discovery.type: single-node`

single-nodeについてはこちらの記事を参照のこと。
[シングル構成のelasticsearchでnetwork.hostを設定すると起動しない（development modeとproduction mode ）](https://qiita.com/henatyokotraveler/items/5e3e2d329793c982adb5)


# セキュリティ問題

## 良くない設定：0.0.0.0

`0.0.0.0`を設定するとどこからのアクセスでも受け付けるようになる。セキュリティ上良くない。この設定はテストや問題の切り分けを行う特別な用途以外では使うべきでない。
こういうガバ設定に慣れてしまうのは「こんなものだろ」と油断精神に染まりそうなのも良くないと思う。

## アクセス制御

`_local_`や`_site_`設定なら外からアクセスできない。しかし、ネットワーク内に侵入された場合はアクセスし放題、やはり良くない。あるいは、組織内部にいる不心得者がしてほしくない形で勝手なアクセスをするかもしれない、これも良くない。
業務利用では多少なりとセンシティブな情報扱うのだから、別の方法でアクセス制御をすべき。
公式ではX-Pack Securityで認証ユーザー設定する方法を紹介している。(6.8.0 / 7.1.0から無償化され誰でも使える)
[Securityを始めてみよう](https://www.elastic.co/guide/jp/x-pack/current/security-getting-started.html)

ファイアウォール等でセグメント別の制限を加えるとなお良い。防御は複数要素で。
文字列の分割（Java）

##はじめに
文字の分割のいろいろなパターンをまとめてみた。

##区切り文字1つ、第2引数なしのパターン
```
public class Sample {
	public static void main(String[] args) {
		String str = "1,2,3,4";
		String[] strs = str.split(",");
		for (String num : strs) {
			System.out.println(num);
		}
		System.out.println("配列の数:"+strs.length);
	}
}
```

```実行結果.
1
2
3
4
配列の数:4
```

##区切り文字1つ、第2引数ありのパターン（第2引数が0より大きいとき）
```
public class Sample {
	public static void main(String[] args) {
		String str = "1,2,3,4";
		String[] strs = str.split(",",3);
		for (String num : strs) {
			System.out.println(num);
		}
		System.out.println("配列の数:"+strs.length);
	}
}
```

```実行結果.
1
2
3,4
配列の数:3
```

第2引数は要素数を指定する。
今回の場合は3を指定したため、要素数が3つになる。

####区切り文字1つ、第2引数ありのパターン（第2引数が負の値のとき）
```
public class Sample {
	public static void main(String[] args) {
		String str = "1,2,3,4,";
		String[] strs = str.split(",",-1);
		for (String num : strs) {
			System.out.println(num);
		}
		System.out.println("配列の数:"+strs.length);
	}
}
```

```実行結果.
1
2
3
4

配列の数:5
```

第2引数が負の値のときは配列の要素数は制限されず、配列の終わりの空の文字列は削除されない。
今回の場合は-1を指定したが負の値のため要素数は制限されていない。また、空の文字列も含んでいる。

##区切り文字が複数のとき
```
public class Sample {
	public static void main(String[] args) {
		String str = "1+2=3";
		String[] strs = str.split("[=+]");
		for (String num : strs) {
			System.out.println(num);
		}
		System.out.println("配列の数:"+strs.length);
	}
}
```

```実行結果.
1
2
3
配列の数:3
```

区切り文字を複数指定する場合は[]内に区切る文字を入れる。

##区切り文字を含めて区切るとき
```
public class Sample {
	public static void main(String[] args) {
		String str = "1,2,3";
		String[] strs = str.split("(?<=,)");
		for (String num : strs) {
			System.out.println(num);
		}
		System.out.println("配列の数:"+strs.length);
	}
}
```
```実行結果.
1,
2,
3
配列の数:3
```

区切り文字を含める場合は(?<=)を使用する。

##複数の区切り文字を含めて区切るとき
```
public class Sample {
	public static void main(String[] args) {
		String str = "1,2a3";
		String[] strs = str.split("(?<=[,a])");
		for (String num : strs) {
			System.out.println(num);
		}
		System.out.println("配列の数:"+strs.length);
	}
}
```

```実行結果.
1,
2a
3
配列の数:3
```
複数の区切り文字を含める場合は(?<=[])の[]内に区切る文字を入れる。
VScode Json形式で設定メニューを開く


「Code」→「基本設定」→「設定」
「ユーザー」が選ばれているのを気をつけてボタンをおす

動画はこちら

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VScodeの設定をJsonで表示する<br>という作業をMACの「QuickTime Player」を使って撮影してみました👍<br><br>補足でQiitaも書いていこうと思いますが、やっぱり画像を何枚も使うよりは動画で情報を与えるのは、とても効率的ですね！ <a href="https://t.co/HcczZlaqpg">pic.twitter.com/HcczZlaqpg</a></p>&mdash; kiku@駆け出しエンジニア| ▼転職活動開始▼ | 雑食系エンジニアサロン参加中| (@kiku_kakedashi) <a href="https://twitter.com/kiku_kakedashi/status/1285136338702888960?ref_src=twsrc%5Etfw">July 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
JavaScriptで各ブラウザの使用言語を検出する方法

##  概要

JavaScriptではnavigatorオブジェクトのプロパティであるlanguageを利用することで、ブラウザで設定されている使用言語を簡単に検出することができます。
ここではlanguageプロパティと各ブラウザによる挙動の違いについてまとめます。

##  Languageプロパティとは
navigatorとはユーザーが利用しているブラウザの詳細な情報を取得するオブジェクトであり、そのプロパティであるlanguageではブラウザの使用言語を検出することができます。

navigatorオブジェクトはwindowオブジェクトのプロパティの一つであるため、そのプロパティのプロパティであるlanguageには`window.navigator.language`といったコードでアクセスします。

このlanguageプロパティは主要なブラウザではほぼ使用可能ですが、ブラウザのバージョンによっては未対応な場合もあります。

## 各ブラウザの動き
### Chrome / Safari / Firefox / Edge
Chrome・Safari・Firefox・Edgeではlanguageプロパティが利用できます。
これらのブラウザは使用言語を複数設定できますが、languageプロパティはその中で一番優先順位が高い言語を取得します。
以下はChromeの動作例です。

**前提条件**
日本語を最優先に5つの言語を設定してあります。
![スクリーンショット 2020-07-17 16.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677774/30d6bba0-e1ff-1423-20e3-d93d3fd0f9cd.png)

```chrome
> window.navigator.language
> "ja"
```

一番上に設定されている日本語が返ってくることがわかります。

また、navigatorオブジェクトにはlanguagesプロパティという設定している全ての使用言語を取得できるプロパティも存在します。この一覧はブラウザで設定している優先順位通りの順で返ります。

```chrome
> window.navigator.languages
> (5) ["ja", "en", "az", "en-US", "en-GB"]
```

なおlanguageプロパティは基本的には"ja"や"en"などの言語コードのみを返しますが、英語（アメリカ合衆国）、英語（イギリス）など国名を含めた言語を選択している場合は言語コードに国コードを組み合わせた"en-US""en-GB"といった値になるため注意が必要です。

### Internet Explorer
最新バージョンのIE11はlanguageプロパティを利用できますが、それより前のバージョンでは非対応であり使おうとすると`undefined`が返ります。

代替としてIEではブラウザの言語設定を検出するためのプロパティとして`browserLanguage`が存在し、これは古いバージョンでも使えます。また最新のIE11でもこのプロパティは残っています。

なおChromeなどで利用できるlanguagesプロパティには非対応です。

**前提条件**
日本語を最優先に2つの言語を設定してあります。私が検証したIE11&Windows10の環境ではブラウザの言語設定をしようとするとWindows全体の言語設定画面に遷移しました。

<img width="366" alt="コメント 2020-07-17 140605.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677774/2c4efe75-c3a3-4d93-c475-f0ccbc23b323.png">


```IE
> window.navigator.browserLanguage
> "ja-JP"
```

**補足**
TypeScriptを使っている場合上記の`window.navigator.browserLanguage`という書き方では以下のようなエラーが出ます。

```
Property 'browserLanguage' does not exist on type 'Navigator'
```

これはTypeScriptがbrowserLanguageをnavigatorオブジェクトのプロパティとして認識していないことが原因であり、ドットではなく角括弧を使うことで回避できます。

```IE
> window.navigator['browserLanguage']
> "ja-JP"
```

IEでは単に「日本語」を選択しても"ja-JP"といった国名付きの言語コードが返るようです。

### Opera
OperaもIE同様、古いバージョンではlanguageプロパティに対応しておらず、代わりに`browserLanguage`や`userLanguage`などを使う必要がありました。
しかし現行のバージョンではlanguageプロパティ及びlanguagesプロパティに対応しています。
その代わりなのか`browserLanguage`や`userLanguage`は利用できなくなっています。こちらはIEと異なる点です。

## まとめ
- 主なブラウザの最新バージョンはどれもlanguageプロパティが使える
- まだまだ古いバージョンのIEを使っている人は多いのでその辺りのフォローは必要
- OperaなどIE以外でも古いバージョンだとlanguageプロパティが使えないブラウザはあるが、少しマイナー感があるブラウザをどこまでサポートするかは悩みどころ
法人登記簿QRコードから法人番号を抽出して諸情報を得る

#法人登記簿にQRが！
- 2020年1月14日から、不動産登記の登記事項証明書等や、商業・法人等の登記事項証明書、印鑑証明書、代表者事項証明書に、[QRコードが印字されるようになりました](http://www.moj.go.jp/content/001309413.pdf)。QRコードを読み取って会社名や住所を抽出することができたので報告です。
- ここでは**法人の登記簿謄本(登記事項証明書)**について調査結果を述べます。

#事前準備
- 国税庁の法人番号公表サイトの**法人番号システム Web-API**ページから申し込んで、**アプリケーションID**を入手しておく必要があります。https://www.houjin-bangou.nta.go.jp/webapi/

#QRコードの出現位置
登記簿の最終ページ右下に追加されました。エンジニアにとっては**「1ページめの右上とか、出現位置が決め打ちできる様式にしてほしかった…」**といささか残念ですね。

#QRコードの情報
- 30桁の英数字からなる文字列
- 左から1～2桁：　`B3`固定
- 3～6桁(4桁)：　法務局の登記所コード
- **7～18桁(12桁)：　法人番号**
- 19～30桁(12桁)：　管理番号

#QR読み取り結果から法人番号を抽出(エクセル)
- QRコードリーダーやQR読み取りアプリで読み取った結果がA1セルにある場合は、
- `=mid(A1,7,12)` で抽出可能

#法人番号から法人名を取得(エクセル)
- 法人番号を、法人番号システムWeb-APIに投げることで、種々情報を取得することができます。
- 法人番号は13桁の文字列ですが、抽出したのは12桁です。
- 12桁の部分を「基礎番号」と言います。先頭(一番左)にはチェックディジット(「検査用数字」と言う)が付加されます。
- このため、**チェックディジットを加えた13桁をAPIに投げなければなりません。**
- 検査用数字の理屈については[こちら](https://www.houjin-bangou.nta.go.jp/documents/checkdigit.pdf)
- 12桁の基礎番号がエクセルのB1セルに入っているものとして、以下で法人名が取得できます。

```法人名の取得
=FILTERXML(WEBSERVICE("https://api.houjin-bangou.nta.go.jp/4/num?id=アプリケーションID&number="&(9-MOD(SUMPRODUCT(MID(TEXT(B1,"0000000000000"),{2,3,4,5,6,7,8,9,10,11,12,13},1)*{2,1,2,1,2,1,2,1,2,1,2,1}),9))&B1&"&type=12"),"//name")
``` 

- 「アプリケーションID」には、事前に入手したアプリケーションID文字列に置き換えてください。
- 上記例では「B1」が2か所出てきますのでご注意を。

#住所なども取得
- 上記の`//name`を`//prefectureName`に変えると、都道府県が取得できます。
- `//cityName`に変えると、市区町村が取得できます。
- `//streetNumber`に変えると、番地が取得できます。

#その他
- 他にも取得できる情報があります。詳細はAPIのリソース定義書や仕様書をご覧ください。
- リソース定義書　https://www.houjin-bangou.nta.go.jp/documents/k-resource-dl-ver4.pdf
- API仕様書　https://www.houjin-bangou.nta.go.jp/documents/k-web-api-kinou-ver4.pdf
OpenFOAMを色々見ながらインストールした話

# 参考にした方々
@yotakagi77 氏
https://qiita.com/yotakagi77/items/c3ef017d9ecb981ce633

@matsubaradaisuke 氏
https://qiita.com/matsubaradaisuke/items/d41e876883c187a6ab44

このお二方のを見ながらすれば大丈夫だと思います。

# 本記事の目的
私は色々あってtcshを利用しているのでtcshで書き換えた所や、
使用しているPCのスペックの問題で変更せざるを得なかった点について、
等々の備忘録です。
詳しい所はお二方のを参考にしてください。

#スペック等の話
使用しているPCの問題で、GCCの4.8.5バージョンでストップ。
OpenFOAM-v2006は4.8.5以上を要求され、インストールできませんでした。
そうしたことから、OpenFOAM-v1906をインストールしました。

#既存のcshrcで変更した所
```.cshrc
// ... 略

# [WM_COMPILER_TYPE] - Compiler location:
# = system | ThirdParty
setenv WM_COMPILER_TYPE "ThirdParty"
// ... 略

# [WM_LABEL_SIZE] - Label size in bits:
# = 32 | 64
setenv WM_LABEL_SIZE "64"
// ... 略

# = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPI | MPICH | MPICH-GM |
#   HPMPI | CRAY-MPICH | FJMPI | QSMPI | SGIMPI | INTELMPI | USERMPI
# Also possible to use INTELMPI-xyz etc and define your own wmake rule
setenv WM_MPLIB "OPENMPI"
```
`""`の部分が変更したところです。
また、見落としていたのですが後ろの方に、

```.cshrc
// ... 略
# [WM_ARCH_OPTION] - compiling with -m32 option on 64-bit system
# = 32 | 64
#   * on a 64-bit OS this can be 32 or 64
#   * on a 32-bit OS this option is ignored (always 32-bit)
#setenv WM_ARCH_OPTION 64
```
とあったので、コメントアウトを外せばyotakagi77氏のように、
configからいじらなくても `cshrc` の方は良かったかもしれません。

また、私の場合、GCCがこんな感じだったので、
Qtのバージョンを5.1.1に変更しました。
ですので、makeParaViewがこんな感じになりました。

```
./makeParaView -no-gl2 -qmake platforms/linux64Gcc/qt-5.1.1/bin -cmake platforms/linux64Gcc/cmake-3.6.0/bin
```
特にエラーも出ずに生成できたのですが、
ParaView Readerをビルドした際に`./Allwclean' → './Allwmake`
で、変数の設定がうまくいってないゾと怒られ、
ParaViewのコマンドが使えませんでした。

後日、sourceでcshrcを読み直すとParaViewが使えるようになりました。
何故?
まぁ次はgraphicの出力が出来ねぇんだよ!と怒られましたが…
画面出力する気が無かったので、それはそれでいいんですけど…。

色々不思議な目には遭いましたが、何とかなりましたネ!
OpenCVでトラックバーを利用して画像の閾値調整

# はじめに

OpenCVのトラックバーを使用して、
画像処理時のパラメータを調整するためのテストプログラム。
今回は、ガンマ補正した画像に対して二値化を行う。

# テスト用画像の読み込み

カメラから取得した画像を使用する。
取得した画像をグレースケールに変換して画素値の最大を取得(ガンマ補正用)

```
import cv2
import sys

cameraId = 0

capCam = cv2.VideoCapture(cameraId)
if not capCam.isOpened():
    sys.exit()

ret, frame = capCam.read()

gray = cv2.cvtColor(frame, cv2.COLOR_RGBA2GRAY)
grayMax = gray.max()
```

# トラックバーを生成する

ガンマ補正値(gamma)と閾値(threshold1)を調整するためのトラックバーを生成する

```
gamma = 0.5
threshold = 28

def nothing(x):
    pass

cv2.namedWindow('window')

cv2.createTrackbar('gamma','window', int(gamma*10) , 50, nothing)
cv2.createTrackbar('threshold1','window', threshold , 255, nothing)
```

引数は以下のようになっている
CreateTrackbar(trackbarName, windowName, value, count, onChange)
- trackbarname : 作成されるトラックバーの名前
- windowName : 作成されるトラックバーの親として用いられるウィンドウの名前(事前に生成しておく)
- value : 作成時のスライダー位置
- count : スライダーの最大値(最小値は0固定)
- onChange : スライダーの位置変更時のコールバック

gammaには0.1刻みの値を適用したいため、
トラックバー上は10倍した値としている。

# トラックバーと画像の表示

トラックバーから値を取得して画像に適用する

```
import numpy as np

delay = 1
ESC_KEY = 27

while True:
    # ESCキーを入力したら終了
    if cv2.waitKey(delay) == ESC_KEY:
        break

    # トラックバーから値を取得
    gamma = cv2.getTrackbarPos('gamma','window')
    threshold = cv2.getTrackbarPos('threshold1','window')

    if gamma > 0:
        gamma /= 10
    else:
        gamma = 0.1

    # ガンマ補正
    lut = np.zeros((256, 1), dtype='uint8')
    for i in range(256):
        lut[i][0] = grayMax * pow(float(i)/grayMax, 1.0/gamma)
    gray_gamma = cv2.LUT(gray, lut)

    # 二値化
    ret, threshold = cv2.threshold(gray_gamma, threshold, 255, cv2.THRESH_BINARY)

    # 描画
    cv2.imshow("window", threshold)
```

gammaは1/10にした値を使用する。
0は許容できない(div/0で落ちる)ため、0.1に補正する。

表示させると以下のようなイメージとなる。
スライダーでパラメータを変更すると適用された値で描画される。

![2020-07-20-165504_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673343/70389b05-042f-77fc-384d-98d7be0864d1.png)
Elastic BeanstalkでSSM ParameterStoreからパラメータ取得しようとして詰まったこと


## 経緯
- EBのマルチコンテナ環境って結局裏でECS動いてるだけだから、大体ECSの機能使えるだろと思ってた
- もともとEBの環境プロパティにDBの接続情報をぶち込んでいたが、平文であんまりよろしくないので、ParameterStoreに移そうと話が上がった。
- ECSでParameterStoreを利用したケースはあり、EBのMultiContainerは実質ECSで動作するがわかっていたため、タスク定義に指定すればおわりやろとおもっていた。

## Dockerrun.aws.jsonで指定した場合

- EBのDockerrun.aws.jsonの[ContainerDifinission](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_docker_v2config.html#create_deploy_docker_v2config_dockerrun_format)のformatは[ECS](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html#secrets-envvar-parameters)とおなじとのことで、containerDefinitionsにsecretを追加して、EBのサービスRoleにParameterStoreを取得できるようポリシー設定した。
- `executionRoleArn` はECSタスク実行用のRole、[ここ](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html#secrets-iam-parameters)を参考にIAMポリシーを付与したRolearnを設定
- 結果的に　`executionRoleArn`　はDockerrun.aws.jsonでは無効なプロパティ扱いされ、`executionRoleArn` を指定しろというECSのエラーが表示された。フォーマットが一緒のため検証時点ではエラーにならないが、適用されない模様。
- ECSタスクの実行Roleは指定できず、最終的は別の方法をとった


``` Dockerrun.aws.json
{
    "AWSEBDockerrunVersion": 2,
    "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
    "containerDefinitions": [
        {
            "name": "api",
            "image": "xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/eb-secret:latest",
            "essential": true,
            "memory": 128,
            "portMappings": [
                {
                    "hostPort": 80,
                    "containerPort": 5000
                }
            ],
            "environment": [],
            "secrets": [{
                "name": "environment_variable_name",
                "valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
    }]
        }
    ]
  }
  
```

## entrypoint.shでコンテナの環境変数に展開する方法

― この方法ではコンテナ内にAWSCLI(とjq)を用意する必要がある
- 最終的にこの方法を利用した

```entrypoint.sh
#!/bin/bash
export AWS_DEFAULT_REGION = ap-northeast-1
export AWS_DEFAULT_OUTPUT = json
export ENVIRONMENT_VARIABLE = $(aws ssm get-parameter --name parameter_name \
                                --with-decryption | jq -r '.Parameters[].Value')

```

## 要約
- Elastic BeanstalkのMultiContainer環境ではコンテナ定義によってSSM ParameterStoreから取得したパラメータを環境変数に格納することはできないっぽい？
- ParameterStoreからDBの接続情報を取得するためには、コンテナ起動時にentorypoint.shでawscliを利用して、環境変数に格納する
- もしくは、アプリから直接SSM ParameterStoreに取りに行く必要がある
- 複数台一気にアプリを立ち上げるような場合はParameterStoreのスループット上限を気にするように。標準は40tps、引き上げは可能
【Docker】俺的にまとめた初学者向けDocker超基本コマンド(チートシート)

## 目次
- Dockerfileからイメージを作成
- コンテナを起動
- コンテナを停止
- イメージからコンテナを作成
- イメージの一覧を表示、イメージID確認
- イメージを削除
- コンテナの一覧を表示、コンテナID確認
- コンテナの削除
- 実行中のコンテナでコマンドを実行

## 概要
Docker初めて1週間の初心者Docker使いによる初心者のためのチートシートを作成しました。
コマンドがたくさんあり、どれから使ってみればいいのかわからない。
そもそも各コマンドはどんな動きをするの？といった方向けです。

下記のチートシートのコマンドを使えるようになれば、Dockerをなんとか動かせるようになるのではないかと思います。

オプションの詳細等は公式ドキュメントのリンクを貼っているのでそちらを参照してください。
全コマンドの公式リファレンスはこちら=>[公式リファレンス-コマンド一覧](https://docs.docker.jp/engine/reference/commandline/)
## Dockerfileからイメージを作成
```
docker build [オプション] パス | URL | -
```
[【docker-build】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/build.html "【docker-build】公式リファレンス")
  例）```docker build -t pythondev .```
  (カレントディレクトリ＝Dockerfileが存在するディレクトリ)

+ オプション(よく使うものを抜粋)
    + -t, --tag=[] '名前:タグ' 形式で名前とオプションのタグを指定
    + -f, --file="" Dockerfileの名前 (デフォルトは 'PATH/Dockerfile')

## コンテナを起動
```
docker start コンテナID
```
[【docker-start】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/start.html "【docker-start】公式リファレンス")

## コンテナを停止
```
docker stop コンテナID
```
[【docker-stop】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/stop.html "【docker-stop】公式リファレンス")

## イメージからコンテナを作成
```
docker run {イメージ名 | イメージID}
```
[【docker-run】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/run.html "【docker-run】公式リファレンス")

+ オプション(よく使うものを抜粋)
    + -it ホストとコンテナの標準入出力を接続
    + -d  バックグラウンドで実行
    + -p  「ホストマシンのポート:コンテナのポート」でホスト側とコンテナを接続
    + --name コンテナの名前を指定

## イメージの一覧を表示、イメージID確認
```
docker images [オプション]
```
[【docker-images】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/images.html "【docker-images】公式リファレンス")

+ オプション(よく使うものを抜粋)
    + -a, --all=fa

## イメージを削除
```
docker rmi [オプション] イメージID
```
[【docker-rmi】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/rmi.html "【docker-rmi】公式リファレンス")
※コンテナが作成されている場合は削除できない。

+ オプション(よく使うものを抜粋)
    + -f, --force 強制削除

## コンテナの一覧を表示、コンテナID確認
```
docker ps [オプション]
```
[【docker-ps】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/ps.html "【docker-ps】公式リファレンス")

+ オプション(よく使うものを抜粋)
    + -l, --latest          最後に作成したコンテナを表示 (どのような状態でも)
    + -a, --all             全てのコンテナを表示 (デフォルトは実行中コンテナのみ表示)

## コンテナの削除
```
docker rm [オプション] コンテナID
```
[【docker-rm】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/rm.html "【docker-rm】公式リファレンス")

+ オプション(よく使うものを抜粋)
    + -f, --force 実行中のコンテナを（SIGKILLを使い）強制的に削除
    + -v, --volumes コンテナと関連づけられたボリュームを削除

## 実行中のコンテナでコマンドを実行
```
docker exec [オプション] コンテナID コマンド
```
[【docker-exec】公式リファレンス](https://docs.docker.jp/engine/reference/commandline/exec.html "【docker-exec】公式リファレンス")
 ※コンテナは起動中でないといけない。
 例：起動中コンテナのbashを起動
``` exec -it {コンテナID} /bin/bash```

+ オプション(よく使うものを抜粋)
    + -t, --tty=false 疑似ターミナル (pseudo-TTY) の割り当て
    + -i, --interactive=false アタッチしていなくても STDIN をオープンにし続ける
    + -u, --user= ユーザ名か UID (書式: <名前|uid>[:<グループ|gid>]
有益だけど難しいwebpackをlaravel-mixでかんたん便利に

# TL;DR
1. 生のwebpackでやるとかんたんに死ねるよ(できなきゃないけど)
2. laravel-mix使えば秒殺、laravel-mixは救世主

# 久しぶりにwebpackやってみた
もともとlaravelでアプリケーション結構書いていたのにもかからわず何故かlaravel-mixの存在をすっかり忘れていた小生ですが、後輩くんのプルリクを見ながら話していて「( ﾟдﾟ)ﾊｯ!」と気が付きました。

我々には***laravel-mix***があると。

小生は古いシステムのメンテナンスを担当しているのですが、オモテ面だけをきれいにしようということで今UIリニューアルをかけています。その際にどうせならwebpackしてしまおうと欲を出したのが事の始まり。

# 生でwebpackを書くと・・・
1. babel / polyfillどうする
2. scssのコンパイルどうする
3. cssのロードはどうする
4. jsのES5とか
5. jqueryとか他のライブラリとかは別で読み込みたいはどうするんだ
6. dev環境ではsource mapが欲しいはどうするんだ
7. js / cssの圧縮とか
8. npm run devとかで動かしたい、watchしたい
9. プラグインのロードどないするねん

考えなきゃいけないことがたくさんあって、考慮すればするほどwebpack.config.jsが長くなっていきます・・・。調べなきゃならないことも増えて、(　ﾟ皿ﾟ)ｷｰｯ!!

# laravel-mixだと
webpack.mix.jsは31行で終了しました。まじで。
## package.jsonを書く
* dev / prd / watchとか
    * npm run watchってやれば変更したらすぐ反映してくれる

```
    "scripts": {
        "dev": "NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "hot": "NODE_ENV=development webpack-dev-server --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
        "production": "NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
```

## webpack.mix.jsの例

```
  1 const mix = require('laravel-mix');
  2 const dist = 'dist';
  3
  4 mix
  5   .webpackConfig({
  6     module: {
  7         rules: [
  8           {
  9             test: /\.scss/,
 10             enforce: "pre",
 11             loader: 'import-glob-loader'
 12           }
 13         ]
 14       }
 15   })
 16   .setPublicPath(dist)
 17   .js('src/index.js', dist + '/js/')
 18   .sass('src/index.scss', dist + '/css/')
 19   .options({
 20     processCssUrls: false
 21   })
 22   .sass('src/vendor.scss', dist + '/css/')
 23   .extract([
 24     'jquery',
 25   ]);
 26
 27 if (mix.inProduction()) {
 28   mix.version();
 29 } else {
 30   mix.sourceMaps();
 31 }
```

### import-glob-loaderは*でimportしてるときに必要
* scss内でimport 'layout/*.scss'などとしてたら必要です

### processCssUrls
* falseでscss内でbackgroud-urlなどのパスを解決しない
    * その代わり適切な場所に適切な画像ファイルを置く必要あり

### extractでライブラリ的Jsを別ファイルにわけます
* アプリでつくったjsとjQuery的なライブラリファイルを別にします
* ライブラリ的なのは変更されることはないので、別ファイルに分けることでキャッシュを効かせやすくなります

# 結論
1. 生でWebpackしてもいいけど、けっこうしんどいよ
2. webpack使うなら、laravel-mix使うべし
grepコマンドの使い方と頻出サンプル

# grepコマンド
正規表現でマッチする行を検索するコマンド

# 構文
grep [オプション] パターン [ファイル]
ex: grep -n abc aaa.txt

# 重要度
★★★★★（5/5）
必須。これを覚えていないと普段の業務に支障が出るレベル。

# オプションたち
## 覚えたいオプション
* -e : 正規表現を使う（regexのe?）
* -n : 検索結果に行番号を表示する(number。よくある省略)
* -C5 : 検索結果に一致した箇所から前後に指定した5行表示する(行数は任意。多分Cに意味はない、A,B,Cでそれぞれ一致した前、あと、前後なので、ABCどれかだなと覚えればよいかも)
* -r : ディレクトリ内も検索対象とする(recursive。よくある省略)
* -i : 大文字と小文字を区別せず検索する(case insensitiveのi。多分。。。)

## できれば覚えたいオプション
* -v : 一致しないもの
* -B3 : 一致した前3行を表示する（数は任意の数字）
* -A2 : 一致した後2行を表示する（数は任意の数字）

## 覚えなくてもよさそうなオプション（ひとそれぞれですが）
* -E : 拡張正規表現で検索を行う
* -l : 検索結果にファイル名のみ表示する
* -h : 検索結果にファイル名を表示しない
* -o : 検索結果に一致した文字を表示する
* -L : 該当しないファイルを表示する

# サンプル
* grep '^A' sample.csv → 行の頭にAがついている
* grep '\[0-9]' sample.csv → '[0-9]'の文字列が含まれている行を抽出
* ps aux | grep python → pythonという文字が含まれているプロセスを抽出
* grep -v '^A' sample.csv　→　行の頭にAがついていない
* grep -e aaa -e bbb sample.csv → aaaとbbbどちらかが含まれる行を抽出
* grep -i aaa sample.csv → 大文字小文字を区別せず、aaaが含まれる行を抽出

# appendix
## grepでAND検索したい場合

```bash
grep aaa sample.csv | grep bbb
```
 → aaaが含まれているものに絞って、さらにbbbが含まれているものに絞る
## grepでOR検索したい場合

```bash
grep -e aaa-e bbb sample.csv
```
 → -eオプションを複数回繰り返す。aaaを含む行とbbbを含む行を取り出す。

## 特定のファイル名のものを抽出したい

```bash
ls ./ | grep aaa
```
→カレントディレクトリ（現在のディレクトリ）にあるaaa（ファイル名）を含むファイルを抽出。

## 特定の内容を含むファイルを抽出したい

```bash
grep aaa -rl ./
```
→カレントディレクトリ（現在のディレクトリ）にあるファイルの中身にaaaが含まれるもの

## 実行したコマンドの履歴から特定の文字列を含む直近のコマンドを調べたい

```bash
history | grep aaa | tail
```
→ヒストリーコマンドからaaaを含むコマンドを抽出。tailで最後の5つに絞り込む。

# まとめ
grepコマンドは必須なので、しっかり覚えておくことをおすすめします！
Seller（出品者）がnilの場合に出品できないとするテストをパスするコードの書き方と理屈

まず気を付けないといけないのは出品項目のsellerのテストを知るわけだが、このsellerが何に依存しているのかを考えなければならない。

もとを辿ればsellerはuserのalias(あだ名)として存在していることになる。
これをもとに

users.rbに
```
FactoryBot.define do
  factory :user,aliases:[:seller] do
    nickname {"フリマ"}
    email{"japan@gmail.com"}
    password{"japan12"}
    password_confirmation{"japan12"}
    family_name{"山田"}
    first_name{"太郎"}
    family_name_kana{"ヤマダ"}
    first_name_kana{"タロウ"}
    birthday{20200523}
  end
end
```
,alias:[:seller] doを追記することによってusers.rb内のfactory.botをsellerでも使用可能にできます。

この準備をすることでitem.rbに
```
it "seller_idが空の場合は出品できない" do
        item = build(:item, seller_id: nil)
        item.valid?
        expect(item.errors[:seller]).to include("を入力してください")
      end
```
と記述することでテストをパスすることができるようになります。
【初心者】N+1問題を発見！Bulletの使い方


##N+1問題とは
扱うデータの数に比例して発行されるSQLの数が増えること。
この問題はパフォーマンスに影響を与えるので解決したい問題。
よく聞く例えとして、買い物でたくさん商品を買った際にお会計を1点づつしかやってくれない状態がN+1問題です。

##bulletとは
「N+1問題」を見つけてくれるライブラリです。
##導入方法
```ruby:Gemfile
group :development do
  gem 'bullet'
end
```

bundle installします。
設定します。

```ruby:config/environments/development.rb

Rails.application.configure do 
 #途中省略

  config.after_initialize do
    Bullet.enable = true #Bullet gemを有効
    Bullet.alert = true　#ブラウザにJavaScriptアラートをポップアップ
    Bullet.bullet_logger = true #Bulletログファイル（Rails.root/log/bullet.log）に記録
    Bullet.console = true #警告をブラウザーのconsole.logに記録
    Bullet.rails_logger = true #警告を直接Railsログに追加
  end
end
```
##解決方法
bulletを使うと警告画面とログが出てきます。

例えば、ユーザーと投稿の関係を1対多にします。

```ruby:user.rb
class User < ApplicationRecord
  has_many :posts
end
```

```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user
end
```
全ての投稿に対するユーザー名を出力します。

```
Post.all.each do |post|
  puts post.user.name
end
```


```
USE eager loading detected
Psot => [:user]
Add to your finder::incluedes => [:user]
```
このようなログや警告メッセージが出てきます。
そこで、

```
Post.inculudes(:user).each do |post|
  puts post.user.name
end
```

とすればOKです。
EJS まとめ

## EJSとは
JavaScriptで利用するシンプルなテンプレートエンジン。
拡張子は「.ejs」で、ビルドでHTMLを書き出します。
複数ページで共通のパーツがある時にPHPのようにまとめることができます。
[EJS公式サイト](https://ejs.co/)

## EJSの導入
前提として、npmコマンドを使える状態にしておいてください。
### プロジェクトファイル作成
dirという名前でプロジェクトフォルダを作成します。
dirという名前はお好きな名前に変えてOKです。

```terminal:ターミナル
mkdir dir
cd dir
```

### npm初期化

```terminal:ターミナル
npm init -y
```

### EJS CLIのインストール

```terminal:ターミナル
npm i -D ejs-cli
```

### package.jsonの書き換え

```json:package.json
"scripts": {
  "build:ejs": "ejs-cli -b ejs/ -f '!(_)*.ejs' -o ./"
}
```

### EJSファイルを作成
プロジェクトファイル直下にejsという名前でフォルダを作成
ejsフォルダにejsファイルを作成(ページ以外は先頭に_(アンダーライン)をつける)

#### フォルダ構成イメージ

```
- dir
    - node_modules
    - package.json
    - ejs
        - index.ejs
        - _header.ejs
        - _footer.ejs
    - index.html ## 書き出されたHTMLファイル
```

### ビルド
ビルドコマンドを使用して、HTMLファイルを書き出します。

```terminal:ターミナル
npm run build:ejs
```

## EJS 記法
基本的にEJSは、感覚的にPHPのような感じで使っていきます。

### &lt;% %&gt;
このタグの中に、JavaScriptのように記述します。
変数の値は、他のファイルに引き継がれます。

```html:ejs
<% var hoge = 'Hello World'; %>
<% include _header %>
```

### &lt;%= %&gt;
このタグの中に、出力したいコードを書いていきます。
HTMLエスケープされて出力されます。

```html:ejs
<% var hoge = '<p>Hello World</p>'; %>
<%= hoge %>
```

```html:出力されるHTMLファイル


<p>Hello World</p>
```

### &lt;%- %&gt;
このタグの中に、出力したいコードを書いていきます。
HTMLエスケープされないで出力されます。

```html:ejs
<% var hoge = '<p>Hello World</p>'; %>
<%- hoge %>
```

```html:出力されるHTMLファイル


&lt;Hello World&gt;
```

### &lt;%_ _%&gt;
このタグの中に、JavaScriptのように記述します。
<% %>との違いは、ホワイトスペースが取り除かれることです。
例えばif文の条件に当てはまらない時に余計な空白を消せるので出力されたコードがすっきりします。

```html:ejs
<%_ var hoge = '<p>Hello World'; _%>
<%= hoge %>
```

```html:出力されるHTMLファイル
<p>Hello World</p>
```

### &lt;% -%&gt;
このタグの中に、JavaScriptのように記述します。
<% %>との違いは、改行をなくすことができることです。
includeを使った時に改行されることがありますが、それをなくせるので、出力されたコードがすっきりします。

```html:ejs
<% include _header -%>
```

### &lt;%# %&gt;
このタグの中に、出力されたコードで表示したくないコメントを記述します。

```html:ejs
<%# コメント %>
```

## EJS 文法
### for文
繰り返しHTMLを生成したい場合はfor文を使うことができます。

```html:ejs
<ul>
<%_ for (var i = 1; i <= 3; i++) { _%>
  <li><%= i %></li>
<%_ } _%>
</ul>
```

```html:出力されるHTMLファイル
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
```

### if文
条件によってHTMLを生成したい場合はif文を使うことができます。

```html:ejs
<%_ var hoge = 'yes'; _%>
<%_ if(hoge === 'yes') { _%>
  <p>Yes！！！</p>
<%_ } else { _%>
  <p>No！！！</p>
<%_ } _%>
```

```html:出力されるHTMLファイル
<p>Yes！！！</p>
```

### include (引数なし)
引数なしの場合は、includeしたいejsファイルをそのまま書いていきます。

```html:ejs
<% include _header %>
```

### include (引数あり)
引数ありの場合は、includeしたいejsファイルを第1引数で引数を第2引数で書いていきます。

```html:ejs
<% include('_header', {
  pageTitle: 'タイトル',
  pageDescription: 'ディスクリプション'
%>
```

## まとめ

| 書き方 | 出力の仕方 |
|:--|:--|
| <% %> | 改行あり。ホワイトスペースあり。出力されない。 |
| <%= %> | エスケープあり。改行なし。ホワイトスペースなし。出力される。 |
| <%- %> | エスケープなし。改行なし。ホワイトスペースなし。出力される。 |
| <%_ _%> | 改行なし。ホワイトスペースなし。出力されない。 |
| <% -%> | 改行なし。ホワイトスペースなし。出力されない。 |
| <%# %> | 出力されない。コメント。 |

この記事が良いと思った方は、LGTMをしていただければ嬉しいです！
フォローも是非お願い致します(^^)
ビューファイルにbinding.pryを使う方法

####binding.pryをビューファイルで使用する方法

自分がbinding.pryをビューファイルで使う時に[- binding.pry]を動作を確認したい行の下に記述すれば良いだけと認識していたが、なぜかsyntaxerrorとで出てしまい、それだけではbinding.pryを行えなかったため。記載しました。

####使い方
至って単純で、ビューファイルの下の行にインデントを合わせる事でbinding.pryを行う事ができました。


```ruby:ビューファイル
            - binding.pry
            =@sending_destinaton.post_code

#下の行のインデントを合わせて記述する。
```
CentOS8でemacs-anthyが使いたい

#はじめに
CentOS7まではEPEL packageにemacs-anthyが収録されてたのですが、CentOS8ではEPELに入ってないようです。

仕方ないので野良buildしてみました。

注意事項: 野良buildはOSのパッケージ管理が壊れます。
自己責任でお願いします。

#以下の作業は最悪OSが壊れます。

#ソースコード
このあたりにあります。
> https://dl.fedoraproject.org/pub/epel/7/SRPMS/Packages/a/

ここから

>anthy-9100h-XX.el7.src.rpm

で一番あたらしいのをダウンロードしてください。

#OS前準備
rpmbuildができるよう以下を導入してください。

```
dnf install rpm-build
dnf groupinstall "開発ツール"
```

#コンパイル
```
rpm -i anthy-9100h-XX.el7.src.rpm
cd /root/rpmbuild/SPECS
rpmbuild -bb anthy.spec
```

#インストール。
```
cd /root/rpmbuild/RPMS/x86_64
rpm -i anthy-9100h-XX.el8.x86_64.rpm
cd /root/rpmbuild/RPMS/noarch
rpm -i emacs-anthy-9100h-XX.el8.noarch
```

あと~/.emacs に anthyの設定をしてください。詳細は各自おしらべください。

動くようになりました(^_^)
AR.jsを使ってマスクにARマスクを被せてみる

最近はどこにいても見かけるようになったマスク姿。
中には凝ったデザインのマスクも作られるようになりましたが、そうは言ってもまだまだ不織布や布の白地マスクが一般的です。
目元から下がみんな同じというのもあまり面白くないですよね。
そんなわけでAR.jsを使ってオリジナルのマスクを表示できるようにしてみました！

# 必要なもの
・白いマスク
・マスクの3Dモデル（今回は.glb形式）
・カメラのあるデバイス（スマホとか）
# ページ作成
まずはARを表示するページを作成します。AR.jsはaframe.jsと一緒にhtmlファイルに埋め込むことで使えるようになります。
なのでCSSやJavaScriptを書く必要はありません。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>demo</title>
  </head>
  <body style='margin: 0; overflow: hidden;'>
    <a-scene embedded arjs="debugUIEnabled:false;">
      <!-- 表示するモデルの読み込み -->
      <a-assets id="assets">
        <a-asset-item id='model' src='mask.glb'>
      </a-assets>

      <!-- マーカーの読み込みとモデルの表示部分 -->
      <a-marker id="marker" type="pattern" url="marker.patt">
        <a-entity gltf-model='#model' play-all-model-animations='' position='0 0.1 0' scale='1 1 1' rotation="0 0 0" visible='true'>
      </a-marker>
      <!-- カメラの表示部分 -->
      <a-entity camera></a-entity>
    </a-scene>
    
    <!-- ライブラリの読み込み -->           
    <script src="https://aframe.io/releases/0.8.2/aframe.min.js"></script>
    <script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.6.2/aframe/build/aframe-ar.js"></script>
  </body>
</html>
```
読み込むモデルはindex.htmlと同階層に配置しますが、別にフォルダを作って相対パスで指定してもいいです。
作ったページを確認するためにサーバーが必要ですが、ローカルホストを立ち上げてもいいですし、GitPageやS3でも表示されます。
# マーカー作り
次にオリジナルのマーカーを作ります。
[AR.js Marker Training](https://jeromeetienne.github.io/AR.js/three.js/examples/marker-training/examples/generator.html)というページで自分が用意した画像を使ってオリジナルのマーカーを作成することができますので、こちらを利用します。
今回は会社名をそのままマーカーにしてみました。

マーカーは外の黒枠は固定ですが、黒枠の太さや中の文字は変えることができます。最近では黒枠さえあれば中に写真を入れることも可能になりました。

そして作ったマーカーをおもむろにマスクに貼り付けます。
![mask.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668610/d6415a71-30f8-46c6-d517-c2655e241bb7.jpeg)



# 実演
サーバーから作成したページにアクセスします。ページを表示する際にカメラの使用を許可するとカメラの映像が表示されます。
そのままマーカーの全体が収まるようにカメラを向けると・・・

![demo1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668610/95b98765-87f6-d6ad-e256-50b206ff8761.gif)

表示されました！（だいぶ緑っぽい＆凹凸がありますが）
ARマスクの大きさや位置は"a-entity要素のpositionやscaleで自由に変えることができますので、例えばマーカーを鼻先ではなく左右の頬に貼り付けることもできます。

ちなみに人間がマスクを着けても問題なく表示されます。
<img width="200" alt="demo2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668610/f3f20f3d-d416-064c-ecc7-f1471806e1d8.png">

今回使用したマスクの3Dモデルですが、実物の写真（or動画）を撮影して[3DF Zephyrの無料版](https://www.3dflow.net/3df-zephyr-free/)でglTFファイル形式で出力し、[Blender](https://www.blender.org/)で大きさや向きを調整して作りました。
初めて触るものなので色合いや凹凸の修正ができていませんが、すでに使い慣れている方ならいくらでも応用が効くと思います。
# 終わりに
簡単ですが、マーカーを使ってマスクにARマスクを表示してみました。
これからはマーカーも従来のような四角ではなく自由に決められるようになるでしょうし、マーカーレスもどんどん進歩しています。
なんかAppleがまたスマートグラスを作っているという噂もありますし、もっと身近にAR技術を感じられるようになるんじゃないでしょうか。
WORKSPACESに繋がらなくなった話とパウリ効果

# 何もしてないのに壊れた
※技術的にはしょーもない話なのですがご了承ください。

はい皆さんこんにちは

このタイトルをあまりITに詳しくない人間に言われたエンジニアは結構な数いるのではないでしょうか。

かくいう私もその一人です。

理不尽な内容から、エンジニアなんだからプリンターも直せるでしょ？という広告が思い浮かびます。


# 起
ある日WORKSPACESに接続出来なくなったとユーザーから連絡がありました。

話を聞いてみると、
・いつもの作業端末で接続しているが繋がらない
・最後に繋がったのは結構前
・端末には何もしてない

等と供述しており・・・
調査をすることに。

# 承
WORKSPACESのアクセスログを見ると確かに、最後にログインした日付が古い。
⇒これはClouwdWatchのイベント・ルール監視で"WorkSpaces Access"を見てます。

インスタンスは起動している。
⇒これはWORKSPACESのステータスが”AVAILABLE”になっていればOKです。

なんなら自分の環境からはWORKSPACESにログインできる
⇒WORKSPACESのIP アクセスコントロールグループは未設定でした。
⇒”信頼された Windows デバイスのみに WorkSpaces へのアクセスを許可”の設定は有効でした。


# 転
というわけでユーザーに証明書は端末に入ってますか？という返事をしました。

（証明書って何処で見るんだっけとか色々あったのはカットして）

すると翌日、証明書インストールし直したら接続出来ましたと連絡がありました。


# 結
直って良かったね！という感じでクローズしましたが、

何もしてないのに壊れた　というのは世の中無いわけで、何かしら原因があるんですよね。

この現象に名前とか付いているのか？という疑問があったので調べてみたら

パウリ効果　だったわけです。

##感想
証明書じゃなくて、IP制限の方にしたったら良かったなぁと思いました


**ありがとうございました。**
Nuxtでビルドしたファイルがドット(.)から始まるファイル名の場合

Nuxtでビルドした際にビルドされたファイルが`.12345678.js`のようなファイル名になってしまう場合がありました。
ドットから始まるファイルなので、隠しファイル扱いとなり、正常にファイルの読み込みが完了しませんでした。

ドキュメントを参考にチャンクの設定を見直しました。
https://ja.nuxtjs.org/api/configuration-build/#filenames

元々デフォルトの設定と同じですが、なぜか違う出力となっていました。
以下の記述を追記しました。

```nuxt.config.js

export default {
  build: {
    filenames: {
      chunk: ({ isDev }) => isDev ? '[name].js' : '[contenthash].js'
    }
  }
}
```

ファイル名が以下のようになり正常に読み込めまるようになりました。
`523574247686ba92d86d.js`
Windows10で画面を効果的に使う方法

# 効果的に画面を使う方法
マルチモニタがなくてもWindows10の機能を使えば複数画面で操作しているような効率的な環境を作り出すことができるテクニックをご紹介します。

##　利用するシーン
・2つの画面を見ながら作業したい場合
・複数のアプリケーションを同時に立ち上げておきすぐに切り替えて使いたい。
・オンライン講座受講の際に講師の画面と自分の画面の切り替えに困っている。

これからご紹介する画面の切り替え、画面分割、仮想デスクトップの中からお好きなものを選択していただければと思います。

## アプリケーションの画面切り替え　Altキー＋Tabキー
アプリケーションで最上位に表示するアプリケーションを切り替えられます。
おそらくWindows10より以前からWindowsをお使いのPCユーザーは、**Altキー＋Tabキー**でアプリケーションを切り替えているのではないでしょうか？以前からある一般的な方法です。ただし、アプリケーションを複数起動していると思ったように簡単に目的のアプリケーションに切り替わってくれない場合があります。

##　画面分割　Windowsキー＋左右矢印キー
次にご紹介するのは、画面分割です。これは、一画面の中で複数のアプリケーションを左右に並べて表示する方法です。

**Windowsキー+矢印キーの右または左**で画面半分に分割できます。これを使えば、左側と右側で異なるアプリケーションの画面を表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/1c0a0725-8f7b-182d-4514-00197d49a3b7.png)

上記の例では左側にブラウザを表示、右側にWordを表示しています。
この例では以下のような操作をしています。
ブラウザを選択し、**Windowsキー＋左矢印キー**
Wordを選択し、**Windowsキー＋右矢印キー**

さらにWindowsキー＋上矢印または下矢印にすると上半分や下半分に表示することもでできます。
この方法を使うと、マウス操作で画面のサイズを調整するよりも簡単に、しかも同じ大きさに画面を縮小、同じ位置に移動することができるようになります。

##　仮想デスクトップの切り替え　Windowsキー＋Tabキー
仮想的に複数のデスクトップを作成して切り替えることができます。

Windowsキー＋Tabキーで下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/0ad73179-12a9-42b0-ecab-bdea94e8b88a.png)

画面上部の「新しいデスクトップ」と表示された＋のアイコンをクリックすると新しい仮想デスクトップが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/3129dd56-660a-83f6-1468-e1987bccbca8.png)

上記の例では、ブラウザ、Word、Tableau、Slackを別々の仮想デスクトップに割り当てています。割り当てるときはアプリケーションを新しいデスクトップで開くか、以下の画面のように開いているアプリケーションを割り当てたいデスクトップ数字にドラッグ＆ドロップするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563351/9a5980e2-faae-84b2-9cb9-59f262a9f598.png)

仮想デスクトップを切り替えるには
**Windowsキー＋Ctrlキー＋矢印キー（右または左）**　
を使います。

さぁこれで一画面しかない環境でも十分に作業効率を上げることができます。

###おまけ
画面のキャプチャーを画像として取りたいときはWindowsキー＋Shiftキー＋S　を使います。
貼り付ける場合にはCtrl+VキーでWordやPowerPointに画像として貼り付けることができます。


オンライン講座をしているとデュアルディスプレイの環境がない方もいらっしゃいます。これらのTipsが皆様のお役に立てば幸いです。おすすめは仮想デスクトップを使用して、**Windowsキー＋Ctrlキー＋左右矢印キー**による切り替えです。

いかがでしたでしょうか？新しいモニタを買わなくても少しは便利になったはず？です。もし疑問点や質問、もっと便利な方法がありましたらコメント欄にメッセージいただけましたら幸いです。

最後までお読みいただきありがとうございます。
MSVC ヘッダ/ライブラリ関連のメモ

## 背景

* Linux で Windows C/C++ アプリをクロスコンパイルしたいが, MSVC 周りのライセンスが気になる

C++ Build Tools/Visual Studio

基本は VS のライセンスが必要と思われます.
third pary library など, 個別で定義されている場合はそのライセンスに従います.


VS(BuildTools) のパッケージの crt に, いくつかヘッダとソースコードが公開されています.

## stl

最近(VS2019 で確認)では, OSS 公開(Apache 2.0 license)のが同梱されています.

https://github.com/microsoft/STL



## vcruntime

clang でいう compiler-rt 相当? デバッグとかに使うっぽい.

ソースコードは公開されているっぽい?(VC パッケージにある).
ただし copyright 記述のみなので, ライセンス形態は不明である.
(一部 Intel copyright のものもある)

MSVC/clang-cl でコンパイル可能. MinGW clang/gcc は不可.
上記 stl などはこの vcruntime に依存している.

## vccontrib

Visual Studio デバッガーや, C++/CLI とかとの連携用?
一部 C++/CLI らしき拡張があります(pure な C++ コードではない)

## concrt

https://docs.microsoft.com/en-us/cpp/parallel/concrt/concurrency-runtime?view=vs-2019

並行ランタイム. C++17 parallel STL とかで使うのでしょうか?

Intel TBB(Thread Building Blocks)でも使われているようです.
【始め方】Pythonプロジェクト開始時にやること

## はじめに
Pythonを使ったプロジェクトを開始する際にやることのメモです。

## 必要なものインストール
### [anyenv](https://github.com/anyenv/anyenv#getting-started)

env系を管理するもの
*envを入れるなら入れておいた方が便利

```bash 
brew install anyenv
anyenv init
```

*envを一括でアップデートできる以下のプラグインも便利
https://github.com/znz/anyenv-update

### [pyenv](https://github.com/pyenv/pyenv)
pythonを複数バージョン扱うのを可能にしてくれるもの

```bash
anyenv install pyenv
```

### [Poetry](https://github.com/python-poetry/poetry)

プロジェクト毎のpythonのバージョンやパッケージの管理をするもの

```bash
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

# シェル再読み込み
exec $SHELL -l
# 仮想環境をプロジェクトフォルダに作成するように変更
poetry config virtualenvs.in-project true
```

## 環境作成
```shell
pyenv local 3.7.7 # poetryは自動でpythonのバージョンを切り替えてくれないので、手動で変える
poetry init
# pyenvのpythonは使わないので、.python-versionを削除
rm .python-version

# 2回目以降
poetry shell
```

## フォーマッター等インストール
```shell
which python # poetryのpythonを使っているかチェック
poetry add -D yapf flake8 pep8-naming mypy
```

### 設定ファイルの追加

```sh
echo '[style]\nbased_on_style = facebook' > .style.yapf
echo '[flake8]\nmax-line-length = 160' > .flake8
```


## VSCodeの設定

```
"python.linting.flake8Enabled": true,
"python.linting.mypyEnabled": true,
"python.formatting.provider": "yapf"
```
AWS 認定ソリューションアーキテクト試験当日までの流れと注意

先日以下の記事を投稿させていただきましたが思った以上に高評価をいただくことができました
[AWS初心者がAWS 認定ソリューションアーキテクト アソシエイトを取得するまで](https://qiita.com/satorongai/items/e8b2be9e6edf309430f9)
今回は前回の記事に補足する形で試験当日までの流れと当日の注意点を記事にしようと思います。

#試験への申し込み
##アカウントの作成
試験への申し込みにはamazonのアカウントを作成後に、Amazonアカウントからシングルサインオンで認定用アカウント登録します。
登録完了後、対象となる各試験への申し込みを行うことができます。

 - 以下のリンクより試験のスケジュールを立てるをクリック  
 [AWS 認定 ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
 - ログイン画面が表示されるのでamazonアカウントまたはAPNパートナー用のアカウントを保持している場合はそのままログインへ、ない場合はamazonアカウントの作成を行う
 - 入力したamazonアカウントからAWS認定用アカウントの作成を行う

##試験のスケジュールを立てる
AWS認定アカウントの登録を行うとAWS認定アカウント用のダッシュボード画面を利用することができます。
<img width="1321" alt="スクリーンショット 2020-07-20 14.28.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/7aae8409-8f2a-2abd-93fa-a8ffd8ad2929.png">
試験の申し込みはコンソール画面内の```試験の申し込み```タブを選択肢、対象の試験を選択します
※今回の場合であれば```AWS Certified Solutions Architect - Associate```をの```PSIによるスケジュール```をクリック
<img width="1158" alt="スクリーンショット 2020-07-20 14.44.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/71b3321f-dd70-ed63-56bd-53219f3e8ccb.png">
※上記ではPSIによるスケジュール(最寄りのテストセンター)での受験を選択しておりますが、ピアソンVUE(オンライン試験)の選択も可能です(ただしこちらは英語での案内となりますので英語に自信がない方はPSIによるスケジュールを推奨いたします)

PSIによるスケジュールを選択した場合の流れは以下になります

 - 対象試験の画面に移動するので```日程の決定```をクリック(ちなみに右上に言語設定の変更項目があるので日本語にしておく)
 - 確認画面が出るので```続行```をクリック
 - 言語の選択と試験場の選択画面が出てくるので任意の場所を選択  
   ※試験場によって試験中にカメラで常に監視が入るテストセンターとそうでない場所があるそうです  
    ちなみに都内では私が受験した新宿と銀座ではカメラでの監視はないのでおすすめします
 - 対象の場所を選ぶと日付の選択が表示されるので任意の日付を選択後```続行```をクリック　　
　　※試験日の変更は登録後2回目まで変更が可能です・また24時間前までであれば試験のキャンセルを行うことも可能です
 - 支払い画面に移動しますのでカード決済にて支払い後申し込み完了です  
　　※支払い方法は現状クレジットカードのみとなります

#試験当日まで
とにかくお勉強あるのみです！
試験の勉強法については先日投稿した以下を参考にしてみてください！
[AWS初心者がAWS 認定ソリューションアーキテクト アソシエイトを取得するまで](https://qiita.com/satorongai/items/e8b2be9e6edf309430f9)

#試験当日
##試験前の流れと注意
 - 持ち物の確認  
    試験では以下の２種類の身分証明書を提出する必要があります(電子ファイル不可)  
    1:自署、正式な氏名、および顔写真が含まれる、現行の有効な政府発行の身分証明書(免許証・パスポート)  
    2:自署および正式な氏名が含まれている証明書(クレジットカード・銀行カード・社員証など)
 - 試験会場へ移動(試験開始の15分前までにつくように移動すること)
 - 身分証明書の提示・持ち物を身分証明書以外全て指定されたロッカーにしまう(ポケットの中までチェックされますので注意)
 - ★試験会場は寒くトイレにいきたくなることがありますので忘れずに事前にいっておきましょう(私はトイレを我慢しながらの受験となってしまいました...)

##試験中
案内されたPCでの受験となります。
試験前にメモ用紙を渡されますのでメモを取りながらテストを進めることができます(※ただし最後に回収されますのであくまでテスト用として活用してください)
また、試験の画面では問題にチェックマークを入れたり、問題を飛ばし後から解くことも可能です（自信がない問題・その時点ではわからない問題は飛ばしながら最後の方で余裕を持って解くのが良いかと思います）

 - 試験時間：130分
 - 問題数：65問
 - 合格点:720~ (1000点満点)  
※ちなみに私は732点というギリギリの範囲で合格となりました。上記で書いたようにわからない問題にチェックを入れて後から見返してギリギリ取れたような気がしますので最後まで諦めない心が大事です

##試験後
一通り問題をとき終わり終了ボタンを押すと簡単なアンケートが出てきます。
アンケートに答えると試験結果が画面上に表示されます
その後正式な通知は試験を完了してから5営業日以内に試験結果が記載されたメールが届きます
また詳細な点数などについてはAWS認定アカウント用のダッシュボード画面の```これまでの受験履歴 ```から確認することができます
インテルPC上でARMのコンテナを作る

インテルPC（というか非ARM CPU）のホストLinux上でarm 32-bitまたは64-bitのゲストコンテナを作る手順です。ホスト・ゲスト共にDebian or Ubuntuを仮定しますが、それ以外のLinuxでも似た手順でできるはずです。コンテナは systemd-nspawn で実行します。LXCでも同様にできるはずです。

# qeum-user-static のインストール

`apt-get install qemu-user-static` 。これは、他のCPUのためのLinux実行ファイルを例えばインテルCPUで動作するホストLinuxで実行するパッケージです。以下のバグが修正されているバージョンのqemu-user-staticでないと、もしかすると動作に問題が起きるかも知れません

* [armhf countainer cannot be started on amd64 host](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=964289)
* [armhf focal guest container fails on amd64 host with Failed to enqueue loopback interface start request: Operation not supported](https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1887606)

問題が生じた場合、[上記のバグを修正したパッケージ](https://packages.debian.org/sid/qemu-user-static) をインストールすると解消できます。その他に `mmdebstrap` と `systemd-container` と `binfmt-support` パッケージをインストールしておきます。

# コンテナのファイルシステムの構築
ARM 32-bitのゲストを構築したい場合以下の `arm64` をすべて `armhf` に置き換えること。

## ゲストがUbuntuの場合

`mmdebstrap --components="main restricted universe multiverse" --variant=standard --architectures=arm64 focal /var/lib/machines/arm64-guest http://ports.ubuntu.com/ubuntu-ports/`

## ゲストがDebianの場合

`mmdebstrap --components="main contrib non-free" --architectures=arm64 --variant=standard buster /var/lib/machines/arm64-guest http://deb.debian.org/debian`

# コンテナの開始とログイン
## コンテナの開始

`systemd-nspawn -M arm64-guest -b`

## コンテナへのログイン

`machinectl shell arm64-guest`