OmniAICreator/Qiita-1.07M huggingface dataset:
【Golang】TinyGo で WebAssembly.instantiate(): Import #0 module="wasi_snapshot_preview1" error: module is not an object or function

<h1>Docker の TinyGo で疲労コンパイる</h1>

> TinyGo の Docker イメージ `tinygo/tinygo:latest` で `wasm`（WebAssembly のバイナリ）をビルドして実行したら、"`wasi_snapshot_preview1`" エラーがブラウザのデベロッパーツールのコンソールに表示される。
>
> ```text:consoleログ
> WebAssembly.instantiate(): Import #0 module="wasi_snapshot_preview1" error: module is not an object or function
> ```

`wasi_snapshot_preview1` モジュールがないのはわかるのですが、よくわりません。

でも TinyGo のコンパイラではなく Go の標準コンパイラで `wasm` にコンパイルすると動くんです。

[「`WebAssembly.instantiate(): Import #0 module= "wasi_snapshot_preview1" error: module is not an object or function`」でググって](https://www.google.com/search?q=WebAssembly.instantiate()%3A+Import+%230+module%3D+%22wasi_snapshot_preview1%22+error%3A+module+is+not+an+object+or+function)も node.js の内容ばかり。Golang のスポンサー情報が欲しいのです

TinyGo 公式の ["wasi_snapshot_preview1" がらみの Issues](https://github.com/tinygo-org/tinygo/issues?q=is%3Aissue+wasi_snapshot_preview1) を見ても、むしろ `wasi_unstable` だったのを `wasi_snapshot_preview1` にしたくらいの情報しかありません。どうしよう。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. 原因
    - コンパイラれたものと違う（互換のない）`wasm_exec.js` が使われています。
1. 対策
    - `wasm_exec.js` は、使用しているコンパイラが提供している `wasm_exec.js` を使うこと。
    - Go のマスターブランチから持って来てはいけない。
1. `wasm_exec.js` がある場所:
    - コンパイラが Go の場合:
        - `$(go env GOROOT)/misc/wasm/wasm_exec.js`
    - コンパイラが TinyGo の場合:
        - `/usr/local/tinygo/targets/wasm_exec.js`

## TS;WM <sub><sup>（kwsk）</sup></sub>

- `wasm_exec.js` は `*.wasm` バイナリと Javascript の関数を紐づけるスクリプトです。コンパイラが異なるとバイナリも異なり、モジュールの紐付けができなくなります。（モジュールが見つからなくなります）
- 利用中のコンパイラで提供している `wasm_exec.js` を使うこと
    - [can't run wasm module in browser: LinkError: WebAssembly Instantiation](https://github.com/golang/go/issues/29827#issuecomment-455747409) | Issue #29827 | Go | Golang @ GitHub
- TinyGo の Docker を使う場合は `wasm_exec.js` も実行環境にコピーするのを忘れないように
    - [Building](https://tinygo.org/docs/guides/webassembly/#building) | Using WebAssembly | Guides | Docs @ TinyGo.org

---

### 所感 <sub><sup>（<ruby>正妻<rt>公式ドキュメント嫁</rt></ruby>に叱られる）</sup></sub>

「Go で `wasm` 動いた！」と `Hello, world!` したくらいで喜んでいたのも束の間。せっかちなものだから次の基本を踏まずに「いままで作ったアプリを `wasm` る！」と思うも `test` が思うように動かない。わざと失敗させてるエラーもパスしてしまうのです。

「Golang で `wasm` るベストプラクティス」なる記事を読んでいたら「`wasm` を `gzip` するのがブラウザ（ネットワーク）に優しいけど、TinyGo 使ったらもっと小さくなるでよ」的なことが書いてありました。

- "[Best Practices for WebAssembly using GoLang (1.15+)](https://levelup.gitconnected.com/best-practices-for-webassembly-using-golang-1-15-8dfa439827b8)" | GitConnected @ Medium

確かに、なんかそれっぽいことはネットサーフィンしていて見かけた気がします。しかし、公式ドキュメントをしっかり読まないで思いつきで動いちゃうものだから、動くものも動かない。ちゃんと書いてありました。

どうせまた忘れるので、未来の自分のググラビリティとして<ruby>備忘録<rt>Qiita</rt></ruby>に残します。
【Jackson】JSONから特定プロパティだけデシリアライズする

## やりたいこと
以下のような`JSON`から、`value`プロパティだけを、型を付けてデシリアライズします。

```javascript
{
    "value": "10", // このプロパティは有ったりなかったりする

    /* 他にも沢山のフィールド */

}
```

## やり方
以下のような読み出し関数を作ることでできます。
サンプルコードは`Kotlin`ですが、`Java`でも問題なく動くと思います。

```kotlin
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

val mapper: ObjectMapper = jacksonObjectMapper()

/**
 * @param json 読み出し対象JSON
 * @param targetPropertyName 読み出し対象プロパティ名
 * @param dst デシリアライズ先クラス
 */
fun <T> readProperty(json: JsonNode, targetPropertyName: String, dst: Class<T>): T? {
    // プロパティの読み出し（getの場合無ければnullが返ってくる）
    val readedNode: JsonNode? = json.get(targetPropertyName)

    // プロパティを読み出せた場合、dstに指定した型へデシリアライズする
    return readedNode?.let { mapper.treeToValue(it, dst) }
}
```

使い方は以下のとおりです。
サンプルコードでは、`value`プロパティを文字列や整数として読み出せることと、値が`null`のプロパティも問題なく読み出せることを示しています。

```kotlin
val rawJson = """
    {
        "value": "10",
        "hoge": null,
        "fuga": "aaa",
        "piyo": 0
    }
""".trimIndent()

val json: JsonNode = mapper.readTree(rawJson)

// 文字列として読み出し
val asString: String = readProperty(json, "value", String::class.java)!! // "10"
// 整数として読み出し
val asInt: Int = readProperty(json, "value", Int::class.java)!! // 10

// nullも読み出せる
val asNull: Int? = readProperty(json, "hoge", Int::class.java)
```

### 補足1: 再帰的にプロパティを見つけたい場合
ネストした`JSON`で、深い階層に有るプロパティも処理対象としたい場合、`findValue`での読み出しが使えます。

```diff_kotlin
- val readedNode: JsonNode? = json.get(targetPropertyName)
+ val readedNode: JsonNode? = json.findValue(targetPropertyName)
```

### 補足2: カスタムデシリアライザについて
サンプルコード内で利用している`ObjectMapper`にカスタムデシリアライザを登録することで、`treeToValue`の処理時にデシリアライザを適用することが可能です。
gitについて / Ubuntuでgitをインストール

#gitとは
<details><summary>分散型のバージョン管理システムのこと。</summary>
複数人で共有するリポジトリ（=リモートリポジトリ）・ユーザ1人に作業リポジトリ（ローカルリポジトリ）があり、、普段の作業はユーザそれぞれのローカルリポジトリ上で変更を管理する。
公開可能な状態になれば、リモートリポジトリに対してアップをする。対して、リモートリポジトリから更新が必要になった際には、各ユーザのタイミングでローカルリポジトリへ反映が可能。</details>
※ソースコードのバージョン管理システムにgitを使用したソフトウェア開発のプラットフォームとして特に有名なのが"<a href="https://github.co.jp/" target="_blank">**GitHub**</a>"であり、プライベートリポジトリ（履歴管理を行う場所）を無料で使用可能。

###バージョン管理システムがなぜ必要なのか
バージョン管理システムがなかった時代は、ファイル名やフォルダ名で差別化を図ったり、ソースコードにコメントで修正内容や日時をメモしていたが、こうしたやり方では特に管理に気を使わなければならないことが多く、問題発生のリスクが非常に高かった（作業者によって手法や表現方法が異なったり、見落としが増えやすかった）。

gitによる問題解決は多く、特に効果的なのは以下の3点。
<dl>
<dt>1.履歴管理</dt>
<dd>⇒バグの発生日時、コード編集者の特定、過去のコード内容など</dd>
<dt>2.リリース管理</dt>
<dd>⇒どのバージョンのコードがいつリリースされたかを記録・管理</dd>
<dt>3.昨日の管理</dt>
<dd>⇒該当の機能に関する修正範囲を把握し、機能単位でコードを追うことが可能</dd>

#Ubuntuでgitをインストールする

###はじめに
<details><summary>Ubuntuとは</summary>OS（WindowsやMacなどのOSと呼ばれるパソコンの基本ソフトの1つ）としてのLinux（LinuxもOSの1つで、無償で改変可能なオープンソースのOS）の1つ。LinuxをOSとして使うために必要なソフトウェアとLinuxが一緒になったパッケージを"<a href="https://wa3.i-3-i.info/word15508.html" target="_black">**Linuxディストリビューション**</a>"といい、その1つでもある。</details>

##インストール手順
Windowsならコマンドプロント、MacならTerminalを使用してコードを実行していく。

###・インストール

```
$ sudo apt-get install git
```

※sudoとは、管理者権限（スーパーユーザ=rootユーザ）で実行を行う宣言のこと。

###・gitの設定
　変更をコミット（=変更対象のファイルをローカルリポジトリに反映させる）する際に表示される自身の名前と、変更を加えた内容に他の人が問い合わせるときに使えるメールアドレスを設定する。

```
$ git config --global user.name "a bc"
$ git config --global user.email "abc@email.com"
```

###・上手く設定されたか確認

```
$ git config --global --list
user.name=a bc
use.email=abc@email.com
```

内容を変更したい場合には、再度コマンドを実行して上書きをする。

###・gitをTerminal（Windowsならコマンドプロンプト）で見るときの出力をカラー表示にする設定

```
$ git config --glibal color.ui "auto"
```

###・リポジトリの設定

既存の管理したいファイルがあるディレクトリ（作業ツリーとも言い、ファイルなどを格納している場所を指す）又は今からファイルを作成していくディレクトリを新規作成し、そのディレクトリへ移動し、そのディレクトリで実行。

```
// ディレクトリのある場所まで移動
$ cd ディレクトリ名
// もしくはディレクトリのある階層まで追っていく
$ cd /階層1/階層2/階層3/.../ディレクトリ名
```

```
// リポジトリの設定の実行
$ git init
```

".git"というディレクトリが作られ、リポジトリに必要なすべてのファイルが格納され、これで管理準備が完了した。

###・更新内容を登録

登録は2段階で行い、まず更新対象とするファイルを選択し、選択したファイルを更新（コミット）することで登録が完了。

```
$ git add index.html
```

"."を指定することで、全てのファイルを追加可能。

```
$ git commit -m "add new file."
```

"-m"オプションを付けると、コミットメッセージを指定してコミットが可能。
コミットすることで、リポジトリに格納される1つ1つの履歴となる。

```
// 履歴の確認
$ git log
~
~
~
 add new file.
```

###・更新の追跡

コミットするためには、変更したファイルをインデックス（コミットしたいファイルやファイルの一部を登録する場所）に移動させなければならない。

```
// コミットするためにインデックスに移動させる
$ git add index.html
```

```
// 再度確認
// 変更されたファイルの一覧を表示
$git status
```

ファイルを更新すると、gitはファイルが変化したことを認識する。

######参考サイト
 [Ubuntu インストールしたらやること](http://zorinos.seesaa.net/article/450953625.html)
CPUの使用率が上がらない

CPUの使用率を上げよとの課題を先輩から出されました。

いろいろ調べたところによるとstressコマンドとかstress-ngコマンドでCPUに負荷をかけるという方法が良さげだったので試してみました。
参考にしたのはこちらの記事。

https://qiita.com/hana_shin/items/0a3a615274717c89c0a4

stress-ngコマンドはstressコマンドの上位互換的なことを聞いたのでじゃあstress-ngにするかみたいな気持ちです。

この通りにCPUの負荷を上げるも…できない。
モニタリングしてみても20％くらいにしかならない。

ちなみに実施したコマンドがこちら。

```ruby:qiita.rb
stress-ng --cpu 2 -l 90 -t 5
```

コマンドの意味としては、CPUのコア数2つに対して5秒後に90％までの負荷をかけようねっていう話。
なんでだろうと思ってしばらく調べましたが解決策が出ないので先輩に泣きついたところ、すぐに解決してくれました！

これはどうやらCPUのコア数2つに対して5秒後に90％までの負荷をかけようねっていう話じゃないらしい。

×　CPUのコア数2つに対して5秒後に90％までの負荷をかけようねっていう話。
○　CPUのコア数2つに対して5秒間、90％までの負荷をかけようねっていう話。

負荷をかける時間が5秒間じゃ短すぎて使用率上がらないらしい！
なんだ～～～

```ruby:qiita.rb
stress-ng --cpu 2 -l 90 -t 10m
```

これで試したところCPUの使用率は見事に90％を超えました！おめでとう！！
【無料】コードネームを移調するアプリを作ったら便利すぎたｗｗｗｗｗｗｗｗｗｗｗ


コードネームのテキストを、簡単に移調するウェブアプリを作りました！

https://o-to.khufrudamonotes.com/o-to-degree-change

# 機能と使い方

入力した**コード進行のテキスト**を、任意のキー（またはディグリーネーム）へ一瞬で書き換えられます。

使い方もカンタン。

コードネームのテキストをコピペして、キーを選択するだけです！

![コード移調の例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486558/b0e9df73-d6e7-28ba-7d90-b3b55994da6c.png)

アルファベットでの入力も可能です。
![コード移調の解説文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486558/c3092abc-7ea3-7105-b38c-31d2e58990b1.png)

## 想定している用途

### ・コード進行メモを別のキーへ変更する
オリジナル曲などのキーを変更したくなったとき、いちいち書き直す必要はありません。

テキストを貼り付けてキーを設定するだけでOKです。

### ・コード進行のアイデアメモをディグリーネームへ変換する
良さそうなコード進行をディグリーネームでメモしたいときありますよね。

変換後のキーを「ディグリーネーム表記」にすれば簡単に変換できます。


# 便利過ぎて、草。
今までの人生で、コード進行のメモを別のキーへちまちま書き換える作業を何度やったか分かりません。

でも、もうやる必要は無くなりました。

これを使えば一瞬で終わるので！！

ぜひ使ってみてください！(๑˃̵ᴗ˂̵)و

https://o-to.khufrudamonotes.com/o-to-degree-change
legoでLet's EncryptのSSL/TLS証明書を発行し、自動更新するよう設定する

AWSやGCP等のクラウドサービスを使っていると、SSL/TLS証明書のマネージドサービスが提供されていることが多く、大変手軽で便利ですよね。一方で、マネージドサービスがない場合や、あってもその証明書を使えないケースが私の周りでもたまにあり、自前でSSL/TLS証明書を発行・管理しなければならないことがあります。

ドメイン認証であれば [Let's Encrypt](https://letsencrypt.org/ja/) で十分なことがほとんどなので、無料でSSL/TLS証明書を発行・自動更新することができます。

# certbot-autoを使うという情報が多いようだが…

私も数年前まではcertbot-autoというツールを使っていたのですが、コマンドを実行するとデフォルトで自動アップデートされるようになっています。自動アップデートを抑制するオプションを付けずにSSL/TLS証明書を自動更新するように設定してしまうと、certbot-autoが自動アップデートされて、Pythonに関するエラーによってSSL/TLS証明書を自動更新できなくなるという現象が起こっていました。

2021年8月2日現在、certbot-autoは非推奨となっており、代わりにsnapでインストールしたCertbotを使うのが推奨されているようです。しかし、新しいCertbotもPythonに依存しており、ふとした拍子に動かなくなることがあるかもしれません（最近のCertbot事情はあまりよく知らないので杞憂かも）。

https://community.letsencrypt.org/t/certbot-auto-no-longer-works-on-debian-based-systems/139702/7

そこで、今回は __lego__ というツールを使って、SSL/TLS証明書を発行・管理する方法を紹介します。

https://github.com/go-acme/lego

# legoをインストール

legoはGo製のツールで、実行環境に応じたバイナリをダウンロードすればすぐに実行できます。

https://github.com/go-acme/lego/releases

2021年8月2日現在の最新バージョンである4.4.0を使います。サーバでは最も多いであろうLinux AMD64のバイナリを使いますが、各自の環境に合うものを使ってください。

```sh
$ wget https://github.com/go-acme/lego/releases/download/v4.4.0/lego_v4.4.0_linux_amd64.tar.gz -O /opt/lego_v4.4.0_linux_amd64.tar.gz
$ mkdir /opt/lego
$ tar zxf /opt/lego_v4.4.0_linux_amd64.tar.gz -C /opt/lego
```

バイナリに実行権限が付いているので、すぐに実行できます。

```sh
$ /opt/lego/lego -v
```

```:実行結果
lego version 4.4.0 linux/amd64
```

# SSL/TLS証明書を発行

DNSのTXTレコードを設定してドメインの所有確認を行う方法もありますが、DNSの設定を自由に変更できないことがあるので、今回はHTTPの方式にします。nginxの場合、以下のような設定が必要です。

```config:/etc/nginx/conf.d/default.conf
location ^~ /.well-known/acme-challenge/ {
    root /var/www; # 任意のパスでOK
}
```

コマンドを実行し、SSL/TLS証明書を発行しましょう。

```sh
$ /opt/lego/lego --accept-tos \
                 --path "/etc/lego" \ # 任意のパスでOK
                 --http \
                 --http.webroot "/var/www" \ # nginxのドキュメントルート
                 --domains "tls.example.com" \ # 各自の所有しているドメイン
                 --email "your-email@example.com" \ # 各自のメールアドレス
                 run
```

SSL/TLS証明書の発行に成功すると、 `/etc/lego/certificates` 以下に証明書が生成されます。

```sh
$ ls /etc/lego/certificates
```

```:実行結果
tls.example.com.crt         tls.example.com.json
tls.example.com.issuer.crt  tls.example.com.key
```

ここまでできれば、後は証明書のパスをWebサーバの設定ファイルに追記して再起動するだけです。nginxの場合、以下のような設定になります。

```config:/etc/nginx/conf.d/ssl.conf
ssl_certificate /etc/lego/certificates/tls.example.com.crt;
ssl_certificate_key /etc/lego/certificates/tls.example.com.key;
```

これで、HTTPSが使えるようになりました :tada: 

# SSL/TLS証明書を自動更新

自動更新のコマンドは、発行する際のコマンドとほぼ同じです。cronが動いている環境であればcrontabで設定しましょう。 `--renew-hook` オプションで、自動更新後に実行するコマンドを指定できます。

```sh
0 0 1 * * /opt/lego/lego --path "/etc/lego" --http --http.webroot "/var/www" --domains "tls.example.com" --email "your-email@example.com" --renew-hook "/usr/bin/systemctl reload nginx"
```

以上で、無料で発行したSSL/TLS証明書を自動更新できるようになります。証明書の期限切れに怯えることもありません :sparkles: 

# 最後に

クラウドサービスには便利なマネージドサービスが次々に追加されていきますが、やりたいことに合ったサービスがなかったり、あったとしてもうまく合致しないことはよくあります。今回のように自前で設定する方法も含め、いろいろな手段を持っておきたいですね。
PyCharm 2021.2にUpgradeしたらPy:DEDENT エラーが出る件の対処法

# はじめに
先日 PyCharm 2021.2 に Upgradeしたら、今まで問題なかったPythonのコードが文法エラー `Statement expected, found Py:DEDENT` で真っ赤になってしまいました。変なプラグインとバッティングしたのかと思って、全部無効にしてみても治らない。

どうも普通に PyCharmのバグのようです。
→ https://youtrack.jetbrains.com/issue/PY-49970

## 環境
私の環境です。

```
PyCharm 2021.2 (Professional Edition)
Build #PY-212.4746.96, built on July 27, 2021
Licensed to XXXXXXXXXXXX
Subscription is active until March 27, 2022.
Runtime version: 11.0.11+9-b1504.13 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 11.5.1
GC: G1 Young Generation, G1 Old Generation
Memory: 2048M
Cores: 4
```


# 対処法
上記にも書いてありますが、
- PyCharmのメニューから `HELP` -> `Edit Custom VM Options` を開く
- `-ea` を 書き足す 
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11124/78e5f9a3-a05c-ffad-619a-80e547d23545.png)
- PyCharm を再起動する

と治りました。

# さいごに

書き足したOptionの意味をわかっていないから、次回Updateして問題が修正されたら書き足した分は削除した方がいいのかよくわからないなぁ... まあ、削除して試すかな。。。
Seriesの生成

#概要
Pabdasのデータ構造の一つで、１次元の配列の配列のように扱う事が可能。
pandasをインポートし、**pandas.Series(辞書型のリスト)**とする事でSeriesを作成する。
また、**pandas.Series(データ配列, index=インデックス配列）**の様にデータとそれに関連付けたインデックスを指定する事でもSeriesを作成可能。

Seriesを出力した際に**dtype: int64**と出力されるのは、**Seriesに格納されている値が int64という型であること** を示している。
dtypeとはData typeの事でデータ型の事。（データが整数であれば**int**、小数があれば**float**)



##pandas.Series(辞書型のリスト)
```python
import pandas as pd

fruits = {"banana": 3, "orange": 2}
print(pd.Series(fruits))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/80b62e33-fd70-9130-410f-01003fcb56ad.png)



##pandas.Series(データ配列, index=インデックス配列）
```python
import pandas as pd

fruits = ["apple", "orange", "banana", "straberry", "kiwifruit"]
data = [10, 5, 1, 2, 3]

series = pd.Series(data, index = fruits)

print(series)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/14a26377-5c96-691c-77f4-9d26f3201da4.png)
【Salesforce】VisualforceページでLightning ExperienceとSalesforce Classicの判別をする

#VisualforceページでLightning ExperienceとSalesforce Classicの判別をする
Visualforceページを作っていて、Lightning ExperienceとSalesforce Classicでコードの処理内容を分岐させたいと思った事があるのではないだろうか。今回はJavaScriptを用いてユーザーがどちらのUIを使用しているのかを判別する方法を記述する。

```HTML:IsLightningOrSalesforceClassic.vfp
<apex:page >
    <apex:includeScript value="https://code.jquery.com/jquery-3.2.1.min.js"/>
    <script type="text/javascript" import="true">
    function IsLightningOrSalesforceClassic() {
        return((typeof sforce != 'undefined') && sforce && (!!sforce.one));
    }
    function checkExperience(){
        if(IsLightningOrSalesforceClassic()) {
            alert('LightningExperienceです');
        } else {
            alert('ClassicExperienceです');
        }
    }
    
    $(function(){
        checkExperience();
    });
    </script>
</apex:page>
```
##説明
内容としては簡単である。"sforceオブジェクトが定義されているか"そして定義されている場合はoneプロパティが有効化されているかどうかを確認している。
sforceオブジェクトが定義されていない場合はClassic UIで、かつsforceオブジェクトが定義されつつも.oneプロパティが有効になっている場合はSalesforceアプリ(Salesforce1アプリ)であると判断出来る。
Salesforceオブジェクトが定義されており、かつ.oneプロパティが無効になっている場合はLightning Experienceであると判断できるという仕組みである。
docker-composeのportsの設定が反映されない

# 0. 前提

- サーバ等全く起動させずコンテナを実行する。

# １．現象

- docker-composeにportsを指定しているが、ホスト側から指定したポートにアクセスできない。
- docker-composeと起動コマンドは以下。

```yml:docker-compose.yml
version: '3'

services:
  app:
    build:
      context: docker 
      dockerfile: Dockerfile
    ports:
      - 80:80
```
- コンテナを実行し、bashを使えるようにする。

```sh:run
docker-comopse run app bash
```

- docker-compose psでポートのフォワード状態をみるが、フォワードされていない。

```sh
docker-compose ps

                      Name                        Command   State                 Ports
----------------------------------------------------------------------------------------------------
コンテナ名   bash      Up       80/tcp
```

# ２．原因

- 「docker-compose run」で実行すると、docker-compose.yml内のportsの設定は反映されない。

# ３－１．対応（１）：-pオプションを付けて実行。

- 「-p」オプションをつけることでportの開放とフォワードができる。
- この場合、portsの設定は不要。

```sh
docker-compose run -p 80:80 app bash
```

- ポートの状態を確認。

```sh
docker-compose ps

                      Name                        Command   State                 Ports
----------------------------------------------------------------------------------------------------
コンテナ名  bash      Up        0.0.0.0:80->80/tcp,:::80->80/tcp

```

- 「-p」オプションについて：[公式：docker-compose run](https://docs.docker.com/compose/reference/run/)

# ３－２．対応（２）：「tty:true」を設定し、「up」コマンドで起動状態を維持。

```yml:docker-compose.yml
version: '3'

services:
  app:
    build:
      context: docker 
      dockerfile: Dockerfile
    ports:
      - 80:80
    tty: true
```
- コンテナを実行し起動状態を維持。

```sh:run
docker-compose up
```
- ポートの状態を確認。

```sh
docker-compose ps

                      Name                        Command   State                 Ports
----------------------------------------------------------------------------------------------------
コンテナ名  bash      Up        0.0.0.0:80->80/tcp,:::80->80/tcp

```

- 「tty」については、以下の記事で詳しく説明されており、参考になります。

https://zenn.dev/hohner/articles/43a0da20181d34
RedmineにBasic認証を追加する。

#概要
RedmineにBasic認証を追加する方法を記載する。
早い話がログイン時に下記認証を走らせるようにする
![Basic認証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/bf0410ad-104c-e78f-ad36-9841bfa076ab.png)


#作業実施
```shell:rootユーザにスイッチ
bitnami@ip-172-26-15-172:/var/lib$ sudo su -
root@ip-172-26-15-172:~# 
```
```shell:Basic認証用アカウント作成
root@ip-172-26-15-172:~# htpasswd -c /opt/bitnami/apache2/.htpasswd ユーザ名
New password: 
Re-type new password: 
Adding password for user ユーザ名
```

```shell:/opt/bitnami/apps/redmine/conf/httpd-app.confの設定変更
RewriteEngine On
RewriteRule /<none> / [L,R]

<Directory "/opt/bitnami/apps/redmine/htdocs/public">
    Options -MultiViews
    AllowOverride All
    AuthType Basic
    AuthName MyAuthName
    AuthUserFile "/opt/bitnami/apache2/.htpasswd"
    Require valid-user

<IfVersion < 2.3 >
Order allow,deny
Allow from all
    </IfVersion>
    <IfVersion >= 2.3>
#Require all granted
    </IfVersion>

PassengerEnabled on
    #SetEnv RAILS_RELATIVE_URL_ROOT "/redmine"
    PassengerAppRoot "/opt/bitnami/apps/redmine/htdocs/"
    <IfModule pagespeed_module>
ModPagespeedDisallow "*"
    </IfModule>


Include "/opt/bitnami/apps/redmine/conf/banner.conf"
</Directory>
```

```shell:apacheの再起動
root@ip-172-26-15-172:~# apachectl configtest
Syntax OK
root@ip-172-26-15-172:~# /opt/bitnami/ctlscript.sh restart apache
Unmonitored apache
Syntax OK
```
仮想通貨交換業者の決算情報まとめとオススメの取引所紹介

## 20210802のMainTopics

HIDEのエディタが改善されたそうなので、#72 [Substack](https://nobumei.substack.com/)で書いているメルマガを転載しています。

---


「SBI 利益の源泉 探りたい」。どうも[@nobu_mei](https://twitter.com/nobu_mei)です。

このメルマガが即日で英語訳されるようになりました。昨日の記事に関する内容が英訳されていす。即日翻訳していただけるのは本当にありがたいです



## [仮想通貨交換業者の決算をまとめました。2021年版。](https://www.notion.so/2021-027b2e0894634ff2ade6dff4b892937a)

日本の仮想通貨事業者の決算まとめが出てました。ちょっと見ていきましょう。


![](https://firebasestorage.googleapis.com/v0/b/hideaki-97c59.appspot.com/o/images%2FlHn2Bn5im1Zex0k1pQyMp0W8eJn2%2FYuzYVybrq.png?alt=media)



2021年度決算です。コインチェックが圧倒的な利益を上げているのが目立ちますね。決算月が12月の取引所があり、Q1-Q2の上げ相場の恩恵を受けていない取引所があるので、横並びで比べると数字を見誤りますが、3月決算の取引所で言うと【コインチェック】＞【SBI VC】＞【DMM】の順に利益を上げています。

![](https://firebasestorage.googleapis.com/v0/b/hideaki-97c59.appspot.com/o/images%2FlHn2Bn5im1Zex0k1pQyMp0W8eJn2%2FA276KDk4r.png?alt=media)
【2021年決算】[ソース](https://twitter.com/papico_chupa/status/1421244213878947842)


2018年のNEM流出事件のときには流出した580億円を保証できるほどに儲かっていたので前回のバブルほどでは無いですが、コインチェックは今回の仮想通貨の上げ相場の恩恵を受けており、日本での仮想通貨市場のインパクトを把握する上での基準になります。

[CoinCheckの仮想通貨不正流出、過去最大580億円GOX: 日本経済新聞](https://www.notion.so/CoinCheck-580-GOX-57c73d5c39fc4dc28bf25fa08918e112) 

bitFlyerは前年度赤字だった所を黒字に転換、コインチェックが爆益、bitbank, GMO, DMMなどちゃんとした取引所も安定した利益を出しているのが分かる反面、人がおらず販売所しか持たない手数料も高い取引所は赤字になっているところも多いですね。やはり、後発はトレーダーにちゃんとしたメリットを提示できないと戦えない様子が伺えます。

SBIが異彩を放っていますね。周りでも使っているという方を見たことがないです。

### 2020年と比較

横並びでの比較だけでなく、前年度の比較もしていきましょう。同じ方が前年の決算もまとめてくれているのでそちらを引用します。

2020年の3月決算取引所は【SBI VC】＞【DMM】＞【コインチェック】の順に利益を上げています。2020年と2021年の預かり資産がだいたい倍になっているので市場が1年で2倍程度に成長したのかなということが伺えます

![](https://firebasestorage.googleapis.com/v0/b/hideaki-97c59.appspot.com/o/images%2FlHn2Bn5im1Zex0k1pQyMp0W8eJn2%2Fzao3Cn8e0.png?alt=media)
【2020年決算】[ソース](https://twitter.com/papico_chupa/status/1292072428777046016/photo/1)

2020年は仮想通貨市場にとっては厳しい市場が続きましたので、赤字の企業が多いです。

その中でもSBI VCトレードはすごいですね。周りでSBIを使ってトレードしている人を全く見ませんが、かなりの利益を上げています。預かり資産が4億程度で48億円の利益を上げるカラクリはどうなっているんでしょうね（すっとぼけ）

そして、2020年のSBI VCの利益は42億の利益を上げており、2021年は48億円の利益を上げています。あれ、2021年Q1-Q2は仮想通貨の上げ相場で利益を上げやすかったのに対して6億しか積まれていませんね。恩恵を受けていないのでしょうか？

SBIは毎年、定常的に40億程度の利益を上げてきており、実に不思議です。その辺の謎に関しての推測はこちらに書いていますので興味があれば見てみてください

[[Daily Topics]SBIが定期的にXRP PumpをさせてくるScam行為は市場価格操作なのか](https://www.notion.so/Daily-Topics-SBI-XRP-Pump-Scam-d0bcb0b978274442a238e23183c243f6) ⇒ [英語記事はこちら](https://bridges.inc/news/2021-07-30-is-xrp-a-scam)

## 仮想通貨を買うのであれば

**オススメの取引所は「bitbank」、海外送金するのであれば「GMOコイン」です。**前回は海外送金するならDMMと言っていましたが、GMO使ってみると断然使いやすかったので入れ替えました。

内容はこちらに記載しています。

[オススメの暗号通貨取引所について](https://www.notion.so/660b327f11ec4b019450d1948e3f6312) 

[販売所・取引所一覧](https://www.notion.so/3689a016f90440d1bf9dbf9e9b442188)

手数料などをまとめたDBのご用意していますのでご参照ください。ともいちゃんがアンケート取っていた結果と同じなので、そんなに間違ってないと思います。

![](https://firebasestorage.googleapis.com/v0/b/hideaki-97c59.appspot.com/o/images%2FlHn2Bn5im1Zex0k1pQyMp0W8eJn2%2F1B2HNJI86.png?alt=media)


取引所に支払う手数料はムダなので、なるべく減らして自分の資産を増やしましょう。
パブリッククラウドの簡単な差別化（AWS、Azure、GCP）

#はじめに
クラウド（AWSメイン）の教養を得るために勉強中の初学者です。
今回は「パブリッククラウドの簡単な差別化」を記事にします。
主に自分用のメモ&アウトプット練習として利用しますが、間違った情報等ございましたら、ご教授頂けますと幸いです。

##パブリッククラウド
ネットワークを経由して、サービスの形で企業や個人など不特定多数のユーザーに対してリソースを提供するクラウドコンピューティング。
物理的なサーバー、ストレージなどハードウェアのコンピュータ資源を管理する、オンプレミスとは異なる。

<details><summary>オンプレミスとは</summary><div>

[こちらを参考にしました。](https://www.kagoya.jp/howto/rentalserver/on-premises/)
要は、物理的なサーバーやネットワーク機器を自社で保有し、運用するシステムの利用形態で、クラウドが浸透する前の主流。

</div></details>

★メリット
1. 素早く利用を開始、停止することが可能。　※利用者は、ハードウェアの購入等の必要がないため。
2. 従量課金であることからコスト管理も容易。
3. 世界各地に環境があるため、提供地域のネットワーク遅延の影響を受けない。
4. 特定地域での災害や障害の影響を受けない。

##主要なクラウドサービスの特徴
###AWS
・Amazonが提供しているサービス。
・パブリッククラウドを一番最初に提供開始したパイオニア。
・現在も最も利用されているサービスと言われている。
・仮想サーバー構築→EC2

###Azure
・Microsoftが提供しているサービス。
・Windowsベースで構築されている環境のため、Windowsを利用しているエンジニアには使いやすい。
・仮想サーバー構築→Azure Virtual Machines

###GCP
・Googleが提供しているサービス。
・Google検索、Gmail、Youtube等、各種サービスを支える性能、セキュリティ、安定性を持った強固なインフラを利用できる。
・Google製品(GoogleApps等)を利用している場合、これらと連携するクラウドサービスとしては最適。
・AI、機械学習関連の技術において選択されることが多く、大規模データ解析([BigQuery](https://cloud.google.com/bigquery/docs?hl=ja)等)のインフラを、他社に比べて安価で利用することが出来る。
・仮想サーバー構築→Compute Engine

##最後に
今回は、パブリッククラウドの一例をあげて差別化してみました。
間違った情報等ございましたら、ご教授頂けますと幸いです。
Wine で MIDITrail  を動かしてみる

(夏休み企画 4/20)

MIDITrail は MIDI シーケンスを 3D 空間上に可視化できる MIDI プレーヤー。
MS-Windows / OSX / iOS 対応 だけど Linux でも Wine で動かせる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0d846dce-b3fa-06fc-5c0a-59d0387b56b1.png)

以下は Ubuntu 20.04 LTS で動かした記録。



# 環境

- Ubuntu Linux 20.04
- MIDITrail 1.3.3
- Wine5.0

Wine は Ubuntu ディストリビューション付属のものではなく、5.0です。
以下の記事でインストールしているものです。
「Kindle for PC 1.26.0 x Wine5 x Ubuntu20.04」
https://qiita.com/nanbuwks/items/042235c6a07d37f1af86



# インストール

https://ja.osdn.net/projects/miditrail/
ここから
MIDITrail-Ver.1.3.3-Windows.zip
をダウンロード。


解凍して MIDITrail.exe を実行すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ba9ef6e0-940a-a78f-2878-4e4f1fc306e6.png)

Q4Wine 画面を経由して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e6c8c392-8ad5-c725-d4a0-34b4f6fc0af8.png)

黒い画面が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/96c3dc95-f6d7-984c-6221-355ff482e390.png)

File-Open File で .mid ファイルを選択してプレイできるが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/75b372b6-d7c8-8354-37cc-967f4a1cdb24.png)

音が出ない。

# Winetricks でライブラリインストール
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MIDITrailを動作させるためにwinetricksで追加したライブラリは、d3dx9,devenum,dinput,dinput8の4つ。</p>&mdash; WADA Masashi (@wd_mss) <a href="https://twitter.com/wd_mss/status/833312597277421568?ref_src=twsrc%5Etfw">February 19, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

> MIDITrailを動作させるためにwinetricksで追加したライブラリは、d3dx9,devenum,dinput,dinput8の4つ。

ということで、

winetricks を起動して以下の画面のように、d3dx9をインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3137d7ff-f653-4b8a-1e9f-51ddf74c3ca4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5172ec37-b829-57c7-8146-edfb1244947f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/57494bca-e5ae-b850-2634-4e7a226a2b91.png)

試しに d3dx9 のみインストールして、 devenum,dinput,dinput8 は入れないでみた。

# 音源を用意

今回は、
「MIDI 仮想キーボードと物理キーボードを Ubuntu で試す」
https://qiita.com/nanbuwks/items/055cffd9beb2caf4acb0
でためした VPMK を使ってみました。
VPMKを起動して、
「Edit」-「MIDI Connections」を以下のようにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7f52a97e-b618-87fe-9922-555e811554f3.png)


# MIDI OUT を選択

Option-MIDI OUT


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/61e08328-1270-a196-2411-47263e3f7532.png)
となっているのを

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/70980fdb-b28a-5ea2-c770-b62198a4e371.png)

としてみたら、鳴りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6abb8dd0-b9fb-18d3-5373-d4464999059a.png)
excelizeをgo installするとエラー

### excelizeをインストールする際に下記のエラー
**ラスト2行を訳すと`github.com/xuri/excelize/v2`のパスが必要だけど、`github.com/360EntSecGroup-Skylar/excelize/v2`が宣言されているよ**とのこと
ついこの間まで使えていたので、なんか変更が入ったみたい

```console
$ go install github.com/360EntSecGroup-Skylar/excelize/v2
go: finding module for package github.com/360EntSecGroup-Skylar/excelize/v2
go: downloading github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.1
go: found github.com/360EntSecGroup-Skylar/excelize/v2 in github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.1
go: github.com/360EntSecGroup-Skylar/excelize/v2: github.com/360EntSecGroup-Skylar/excelize/v2@v2.4.1: parsing go.mod:
	module declares its path as: github.com/xuri/excelize/v2
	        but was required as: github.com/360EntSecGroup-Skylar/excelize/v2
```


公式のgithubを確認

https://github.com/qax-os/excelize

Installationのところに

```
If your packages are managed using Go Modules, please install with following command.
go get github.com/xuri/excelize/v2
```
とあるので、まずmain.goのインポートのパスを変更

```go
import (
	"fmt"
	"github.com/xuri/excelize/v2"
)
```

次に実行コマンドに指定のパスを変更

```console
$ go install github.com/xuri/excelize/v2
go: finding module for package github.com/xuri/excelize/v2
go: found github.com/xuri/excelize/v2 in github.com/xuri/excelize/v2 v2.4.1
```
成功しました
JavaScriptを基本からまとめてみた【8】【addEventListener関数】【随時更新】

##はじめに

####学習するに至った経緯

2020年より、未経験からエンジニアへの転職を目指し、某プログラミングスクールへ通う。
入学後、『Ruby』を未経験から学ぶ人が多いのと『Ruby』の求人が思っていた以上に少ないので、
卒業後、フロントエンドのエンジニアを目指す事に。
Javascriptの学習した事を言語化し、認識の深化による備忘録として記載。

##addEventListener関数を使い方
削除ボタンを押したときに何かの処理を実行したいときは
addEventListener関数を使う。

第一引数にはイベント(クリック,スクロールなど)を第二引数には実行したい関数を渡す。

削除ボタンが押されたときにタスクを削除したいので
『deleteButton』がクリックされたときにdeleteTaskを呼び出して欲しいとする。

関数の定義方法はいくつか種類があるが、一番良く使用されているアロー関数を使用。

```
deleteButton.addEventListener('click', () => deleteTask(taskId))
```

次にdeleteTask関数を作成。

deleteTaskの引数には削除したいタスクのIDを渡す。
remove関数を呼び出してタスク(テーブルの一行の要素)を削除する。

```
const deleteTask = (taskId) => {
  const task = document.getElementById(taskId)
  task.remove()
}
```
営業職のAWSソリューションアーキテクトアソシエイト(SAA-C02)合格体験記

#はじめに
2015年4月に社会人になって以来ずっと営業をやっています。
営業職の私が2021年7月28日にAWSソリューションアーキテクトアソシエイト(SAA-C02)に合格しました:sparkles:
本記事では、営業職の視点で受験の背景や試験合格に向けた勉強方法、受けてみた感想をまとめました:pencil2:

こちらがスコアレポートです。(ギリギリ合格でした:sweat_smile:)
![スコアレポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/7aeee933-dbe2-ffed-dcef-42f9775d9ee7.png)


#受験の背景と試験前のスキルセット
2021年2月末にクラウドプラクティショナー試験に合格したので、SAA試験合格を次の目標にしました。
(クラウドプラクティショナー試験の合格体験記については別途記事を書こうと思います！)

AWSについては、クラウドプラクティショナー試験の勉強をするまでは触ったことはおろか、具体的な内容についての知識は皆無でした。
(ほんとに「AWS」という単語を知っている程度でした…:sweat_smile:)
そのため、詳細は別の記事でまとめたいと思いますが、クラウドプラクティショナー試験の勉強をはじめてから合格するまでは6ヶ月くらいかかりました:sob:

クラウドプラクティショナー試験でAWSについての基本的な知識や勉強方法は身についていたので、SAA試験の勉強はクラウドプラクティショナー試験の勉強を開始した時よりは取り組みやすかったです:shamrock:

#勉強方法
**1.出題範囲の知識習得**
主にUdemyの講座をメインで利用しました。
・これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）
https://www.udemy.com/share/101WKk2@Pm5KfVpeT10KdUVDBmJOfT5t/

まずは、突破講座を一通り受講して、出題範囲を把握しました。
私は書かないと覚えないタイプなので、要点はノートにまとめて、見返せるようにしました:green_book:
講義の中で出てきた意味の分からない単語やサービスについても調べて、理解するようにしました。
![20210729_161944.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/c6aeb667-abc1-f327-d0a6-69988508caf2.jpeg)


アナログで泥臭い方法ですが、普段業務でAWSを触っていないので、自分で調べない限り自分の理解が合っているか答え合わせすることが出来ないと思い1つ1つ調べました:mag:

突破講座は、ハンズオンも含まれています。
ハンズオンに取り組むことで勉強した内容と実際のAWSの画面が紐づくので、理解が進みました:smiley:
注意点としては、ハンズオンで実際のAWSサービスを使うと課金されます:money_with_wings:
短期集中で取り組んで立ち上げたらすぐにハンズオンして終了出来る場合は良いのですが、間が空くとお金がそれなりに掛かってしまうので、一旦停止するなどして費用を抑えるようにすることをおすすめします。

**2.試験対策**
同じくUdemyの模擬試験を活用しました。
・【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）
https://www.udemy.com/share/101rfM2@PW5jfWFKS1ELe0JEAXNzfT1tSg==/

模擬試験は、1回目で合格ラインを超えることは難しいので、間違えた問題の解説を確認して、2回目、3回目で満点近く取れるようにしました:100:
問題によっては、解説を読んだだけだと頭に入らなかったので、突破講座同様にノートにまとめました。
試験直前は、このノートを何度も見返して同じような問題が出たときに間違えないように復習しました。
![20210730_101201.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/e188c512-ee5e-ce3e-4151-78e3e8f659ad.jpeg)

**3.それ以外で取り組んだこと**
AWS主催のウェビナーに参加しました。
AWS主催のウェビナーというと、ハンズオンや技術者向けの内容が多いイメージですが、初心者向けの内容も充実しています:beginner:
初心者向けのウェビナーだと「コンテナとは？」や「ECSを使うメリット」のような話を分かりやすく説明してくれますので、自分の理解の答え合わせになります。
他にもウェビナーのなかで事例や実際の操作画面を知ることができたのもよかったです。

また、ウェビナー参加後にアンケートに答えるとAWSのクレジットコードがもらえることがあり、ハンズオンの時に発生する費用負担を軽減することができます:v:
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/e9b5e16a-41a2-b7b3-31d4-f761fb8ec2ba.png)

#実際に試験を受けてみて
暗記で答えられる問題は少なく、「ソリューションアーキテクトとしてどのように対応するのがベストか？」という視点に立った問題が多く、本質的に理解出来ているかを問うているように感じました。
前述の模試でもそういった問題が多く含まれているので、自分が理解できるまで調べたり繰り返し問題を解いたりすることをお勧めします:point_up:

余談ですが、何を焦っていたのか会場についてすぐに受付→試験に入りました。
暑さの影響か、試験開始20分くらいは頭が働かず最初の10問くらいはまともに答えることができませんでした:scream:
一通り解いた後、時間ぎりぎりまで見直しをして、何問か答えを修正しました。
会場に着いたらしっかり水分補給して呼吸を整えてから試験に臨むことをお勧めします。笑
GitLab(オンプレ版)にisoファイルをアップロードさせない(Premium Edition)

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

そんなことする人いないと思うと思うのですが、時々GitにISOファイルを放り込む人がいます....。
管理者としては「ヒー、やめて～」と思うのですが、知らない人は気にせずにやっちゃいますよね。

そこで、それを防止するためにGitLabの機能(Push Rules:有償機能)を使って制限しましょう。
というお話です。

**`本機能は、有償版(13.9以降Premium Edition)となっております。ご注意ください。`**

# 1. 前提条件

GitLabのバージョン: 14.1.1-ee

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/ec4fdd4c-0e77-ac2a-a42c-8585f795fd88.png)

# 2. 管理画面

「Admin」＞「プッシュルール」を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/19de7306-acfd-2175-78d4-00dacaeabd30.png)

# 3. isoで終わるファイル名を禁止する

Prohibited file namesに「\.iso$」と入力して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/dde66ea2-893c-e499-93b9-7c6df1c445d3.png)

# 4. おまけ

ちょっと頭のいい人なら、拡張子がisoファイルじゃなければいいんじゃない？と拡張子だけ変えてアップロードする人もいるかもしれません。。。。
そういう人向けの対策としては、「そもそもGitに100MB以上のファイルをアップロードさせない」と言ったことも可能です。
以下の`Maximum file size (MB)`にメガバイトサイズを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/cd68d2d6-f8ba-58c6-6548-80310a7259eb.png)

# 5. まとめ

Premiumの機能ですが、管理者の苦労をちょっと軽減してくれると思います。
M1 Mac Django環境構築

Homebrewはインストールしてある。

```bash
brew install pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

arch -arch x86_64 env PATH=${PATH/\/opt\/homebrew\/bin:/} pyenv install 3.8.7
brew install bzip2 libffi libxml2 libxmlsec1 openssl readline sqlite xz zlib
pyenv install 3.8.7
pyenv local 3.8.7
pyenv rehash

pip3 install virtualenv
virtualenv 仮想環境名
source 仮想環境名/bin/activate
pip install django==3.0.1 #バージョンはお好きなもので
```
これでDjangoがインストールでいました。
Javascriptの豆知識(...について)

###背景###
最近のJavascriptのコードを見たら、よく...を見ます。私は2014以降では業務上でjavascriptを触っていないため、最初...を見る時に、不思議でした。

###役割###

####残余引数(rest parameters)####
ES6以降では、...を残余引数として使えるようになりました。

```js
const test = (a,...args) => {
    console.log(a)
    console.log(args)
}
test("a",1,2,3,4,5)
```

```sh
a <- 1番目の引数です
[ 1, 2, 3, 4, 5 ] <- ...argsです、一つの配列にまとめています。

```

...argsは残余引数になります。

注意点としては、
***...argsを引数の最後に位置付ける必要があります***
***...argsにデフォルト値を与えることはできないです***
***...argsの可能な値は配列です、undefinedまた単一な値になることはないです***

参考リンク
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/rest_parameters


####スプレッド構文####
残余引数はたくさんの引数を一つの配列にまとめることです
スプレッド構文は逆の役割をもっています。一つの配列を一つずつの関数の引数や要素に展開します。

```js
const arr = [1,2,3]
console.log(arr)
console.log(...arr)
console.log(["a",...arr])
```

```sh
[ 1, 2, 3 ] <- 元な配列
1 2 3 <- 展開した配列
[ 'a', 1, 2, 3 ]　<- 展開した配列
```


参考リンク
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax
Javascriptの豆知識(let,var,クロージャーに関する面接問題)

###背景###
皆さんはjavascriptのletとvarのスコープ(変数の有効範囲)の違いがご存知だと思います。その違いを表せる一つの例を紹介します。この例はよく面接にも出ます。

####varを使う場合1####
####コード####
```javascript
const main = () => {
    const funcs = []
    for (var i=0;i<5;i++) { <--ここのiをvarで定義しています
        funcs.push(()=>{
            console.log(i)
        })
    }
    for (let func of funcs){
        func()
    }
}
main()
```

####結果####
```sh
5
5
5
5
5
```

####letを使う場合####
####コード####
```javascript
const main = () => {
    const funcs = []
    for (let i=0;i<5;i++) {　 <--ここのiをletで定義しています
        funcs.push(()=>{
            console.log(i)
        })
    }
    for (let func of funcs){
        func()
    }
}
main()
```

```sh
0
1
2
3
4
```

###解説###
case1とcase2の違いは一箇所だけです。それはforの中,iを宣伝する方法は違います。
case1はvarを使っています。
case2はletを使っています。
そして出力はcase2、for分にletを使っているコードは予想通りに動いていました。

ここで三つの知識点を説明いたします。

***1. varを使うと、スコープはfor文ではなく、for分の上のmain関数になります***
***2. letを使うと、スコープはfor分になり、毎回ループするときに、新しいスコープを作っています***
***3. クロージャーは直上のスコープにアクセスしています***

varを使うと、for分ごとにクロージャーを作っていますが、クロージャーからアクセスできる直上のスコープはmain関数のスコープです。main関数スコープのiはfor分のループと共に変化され、最終形態はi=5になります。closures配列にある五つのクロージャーから出力しようとしたiもmain関数スコープにあるiになり、すべてのクロージャーは同じiをアクセスし、すべてのクロージャーは同じ値を出力しています。
![closure scope.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/a3d793de-dece-c0d7-f2d4-83835839cf4a.jpeg)




letを使うと、新しいスコープもループと共に作成されています。毎回のループにあるiは新しく作成されたスコープにあります。それぞれのクロージャーはアクセスできるスコープは直上のスコープはmain関数のスコープではなく、新しい作成されたfor分のスコープです。closures配列にある五つのクロージャーからアクセスできるスコープも五つにあり、それぞれ独立されています。それぞれ独立されてあるスコープにあるiはそれぞれ異なるため、当然クロージャーからの出力はそれぞれ異なります。

![closure scope.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/75575522-a011-9f3a-4aac-c61ce288ec23.jpeg)


<iframe width="560" height="315" src="https://www.youtube.com/embed/xSsqW8OBIb4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

###感想###
どんな言語も深く考えれば、楽しみを味わえます。
【AWS】データ通知／連携処理サービス

# データ通知／連携処理サービス

## データ通知／連携処理サービスの概要
アプリケーションで自ら実装しなくても、**データの通知／連携処理**を簡単に行うことができるサービス

- Eメール送信を実現する**Amazon Simple Email Service（SES）**
- プロトコルやサービスにデータの配信を行う**Amazon Simple Notification Service（SNS）**
など


## メッセージキューイング処理サービス
### ◉Amazon Simple Queue Service（SQS）
メッセージをキューイングすることで、処理負荷の大きいビデオのエンコーディング（圧縮作業）などのバッチ処理を、複数のEC2インスタンスに振り分けて分散処理する場合に利用する

#### ◎メッセージキューイング
- 異なるソフトウェア間でデータを送受信する手法の一つ
- 直接データを渡すのではなく一旦第三者のソフトウェアに預けることで、**送信側も受信側も好きなタイミングで送受信処理を行うことができる**ようにする方式

:::note info
・通常、実行中のプログラム間でデータの受け渡しを行うには、送信処理と受信処理をタイミングを合わせて同時に行う必要がある
・お互い相手側の処理が開始あるいは完了するのを待たなければならない

バッチ処理
あらかじめ登録した一連の処理を自動的に実行する処理方式
:::

## 通知処理サービス
### ◉Amazon Simple Email Service（SES）
WebアプリケーションからSESで提供される**APIを実行する**ことで、メールを利用して簡単に通知を行うことができる

### ◉Amazon Simple Notification Service（SNS）
- AWSで提供されるメッセージ通知サービス
- 任意のメッセージを**HTTPSなどの様々なプロトコル**でアプリケーションから簡単に送信することができる
- **CloudWatch／SQS／Lambda**など様々なサービスへの通知／連携が可能

#### ◎SNSの要素
##### トピック
- メッセージを受信するアクセスポイント
- 作成し、購読者がトピックを購読（サブスクライブ）することで通知の送受信が可能になる

##### 購読者（サブスクライバ）
- 対象となるトピックから発信されるメッセージの購読者（サブスクライバ）を設定する
    - HTTP／HTTPS
    - Email
    - SQS
    - Lambda
など

##### メッセージの発行（パブリッシュ）
- 作成したトピックに対して、アプリケーションからメッセージを発行する
- SNSサービスを通じて登録されているサブスクライバへ配信される

:::note info
メッセージを配信（パブリッシュ）／購読（サブスクライブ）する形式をPub／Subと呼ばれる
:::

[![Image from Gyazo](https://i.gyazo.com/1f7f52c1ade905f7af66694a29e0277f.png)](https://gyazo.com/1f7f52c1ade905f7af66694a29e0277f)

## パイプライン処理サービス
### ◉AWS Data Pipeline
DBからデータの**取り出し／変換／保存（ELT：Extract Transform Load）**など、データに対して**順次処理（パイプライン処理）**を行うサービス

#### ◎Data Pipelineの特徴
- ELT処理を**スケジュール機能で自動化**
- データのパイプライン処理を**ワークフロー形式で定義**
- 処理の成功／失敗などの**イベントの通知が可能**
- **オンプレミス環境との連携が可能**

[![Image from Gyazo](https://i.gyazo.com/12cf3fe00ec01dd5e6f6598d82e45d3e.png)](https://gyazo.com/12cf3fe00ec01dd5e6f6598d82e45d3e)

## ストリーミング処理サービス
### ◉Amazon Kinesis
IoTなどのデバイスからデータをリアルタイムに受信して分析する場合に利用する

#### ◎Kinesisの構成サービス
| 種類 | 内容 |
|:-:|:-:|
| Kinesis Data Streams  | ストリーミングデータの収集  |
| Kinesis Data Firehose | ストリーミングデータの保存  |
| Kinesis Data Analytics  | ストリーミングデータの分析  |
| Kinesis Video Streams  | 動画のストリーミング処理  |

## イベント連携処理サービス
### ◉Amazon EventBridge
AWS各種サービスや外部のSaaSなどの様々なイベントソースを他サービスの様々なターゲットに**リアルタイムに連携するハブのようなサービス**

[![Image from Gyazo](https://i.gyazo.com/51d5574c50b0758f928a7b748b1fea84.png)](https://gyazo.com/51d5574c50b0758f928a7b748b1fea84)

#### 参考
https://aws.amazon.com/jp/sqs/

https://e-words.jp/w/%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0.html

https://www.otsuka-shokai.co.jp/words/batch-processing.html

https://aws.amazon.com/jp/ses/

https://aws.amazon.com/jp/sns/faqs/

https://aws.amazon.com/jp/datapipeline/faqs/

https://aws.amazon.com/jp/kinesis/

https://aws.amazon.com/jp/eventbridge/
基本情報技術者試験に二回連続で合格点を取った話

（合格したとはいっていない）というのが、タイトルの後ろにつきます。だって２回受けたんだもん。
1回目は選択問題の選択をしなかったために不合格。（レポートでは午前83.75点/午後66.3点）
2回目は選択をしたので合格できました。(レポートでは午前66.25点/午後89点)

# スペック
- IT業界微経験(PGではありません)
- 41歳

# 受験理由
- プログラミングスクール卒業後の転職活動中に、未経験は基本情報くらい取ってこい的な少数の大きな声が聞こえたから。（コロナで試験が中止になっていたにも関わらず）
- 上記理由と年齢も高く転職活動のハードルが高く感じたから。（結局はITパスポートのみで内定を頂きましたが）
- 上記の内定を頂いた会社に夜勤勤務があり体に合わず、転職を考えた時ITパスポートだけだと弱いと感じたから。(次の会社で内定を頂いた時、基本情報技術者持ってませんでしたが)

# 勉強期間
- 詳細は不明ですが、数ヶ月。

詳細不明の理由は、コロナの影響で受験が中止になり、結構飛び飛びで勉強したため。
ググると100〜200時間目安とあったので、多分それくらいは勉強したと思います。

個人的には３ヶ月程を目安にするのがいいと思ってます。
午前を初日／午後を最終日くらいで申し込み、午前１ヶ月／午後２ヶ月くらいの期間にすれば、勉強の区切りがつきやすいかなと思ってます。

# （合格した振り返りからの）勉強について
## 必須と考える教材　　

- 基本情報技術者 パーフェクトラーニング過去問題集 (情報処理技術者試験) 
- [基本情報技術者ドットコム](https://www.fe-siken.com/)
- YouTube

過去問題集は最新版を用意するのがいいです。理由は、特典の過去問の問題と解説にダウンロード期間があるからです。
基本情報ドットコムで解説のない箇所があったので、過去問題集最強です。
基本情報技術者ドットコムは、マウスでポチポチやれるので楽ですね。

YouTubeを必須に入れている理由ですが、動画で解説されている方がおられるので、過去問題集よりも理解が深まるからです。
わからない問題があれば、YouTubeで探してみるといいかもしれません。

## 勉強方法
### 午前

ひたすら過去問を解く。
まずは過去３年分で、不安だったり余裕があれば５年分くらいやっとけばいいと思ってます。

何度も解いて解説を読んでも６割取れる気がしないという方は、ITパスポートの勉強をした方がいいかなと思います。

### 午後
ひたすら過去問を解く。
乱暴な言い方ですが、情報セキュリティ・アルゴリズム・プログラミングが満点であれば7割取れるので、過去問をやり込んで満点を取れるまでやればと思います。

例えば、アルゴリズムが良くわからないという場合は、参考書（「うかる！ 基本情報技術者 [午後・アルゴリズム編]」や「基本情報技術者試験のアルゴリズム問題がちゃんと解ける本」等）を一冊買って、考え方や解き方を身につければいいと思います。

プログラミングは、自信のあるものか点数が取りやすいと言われている物を選べばいいと思ってます。
僕は、簡単だと言われている表計算を選びました。
アセンブラも簡単だと言われていたので少し勉強しましたが、難しく理解出来なかったので、表計算を選びました。
ちなみに、表計算は全くやったことがなかったので「基本情報技術者 表計算とっておきの解法」を買いました。かなり助けになりました。

他の選択問題は、その期によってどれになるかわからないので、情報収集をして対策を立てるといいと思います。

# 個人的な振り返りとまとめ
１回目の選択問題の選択が出来ず不合格だったので、無駄に勉強時間が伸びました。
受験中も気になってたので、思い切って試験管にどこで選択出来るか聞いておけばよかったと後悔しました。

2回目は、１回目で試験傾向と対策がわかったのでセキュリティ以外満点でした。6割で合格なので、無駄に勉強した感が否めません。
仕事で必要なら技術や知識向上のため10割目指した勉強をするんですが、現状業務で全く使わない事ばかりなので、絶対合格してやるという追い込みで力を入れすぎました。

基本情報技術者試験は難しいと言われていますし、実際そうだと思います。
転職活動で受けたとある会社は、7回までなら不合格でも受験料を会社が出すと仰ってました。それほどまでに難しかった（過去形）んだと思います。
CBTになった今では合格率が跳ね上がっているようなので、資格取るなら今がチャンスだと思います。
【Rails】サンプルユーザーを増やす！Fakerの導入でサクラを作る方法


#対象者

* 作成したサイトにテストユーザーを大量に導入したい方


#目的

* Gem「Faker」を使用してデータを増やすこと

#実際の手順と実例
###1.Fakerとは

Fakerとは実際にいそうなユーザー名（ユーザー以外も行ける？？）を作成するGemです。

これの導入によって手作業で１人ずつユーザー登録をしていくという作業や手間をカットできます。


###2.Faker導入方法

#####1.gemに導入

```Gemfile
:
:
gem 'rails',                   '6.0.3'
gem 'bcrypt',                  '3.1.13'
gem 'faker',                   '2.1.2'
gem 'will_paginate',           '3.1.8'
:
`````

この後**bundle install**を実行します

#####2.サンプルユーザー作成

seedファイルに作成していきます。

まずメインとなるユーザーを１人作成します

`````db/seed.rb
User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar")
````

続いて、追加で偽物を何人作成するのか決めていきます。

`````db/seed.rb
#上記と同じ
User.create!(name:  "Example User",
             email: "example@gmail.com",
             password:              "foobar",
             password_confirmation: "foobar")

#ここから追記
99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@gmail.com"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password)
end

``````
これで完了です。ここでは９９人のユーザーを作成しました。
この後、**rails db:seed**を実行すれば完了です。

#####⚠先に何かデータが入っていいる場合、rails db:migrate:resetするといいかもしれません！また、サーバー起動中はrails db:migrate:resetがうまくできないこともあるそうなので、再起動して実行がおすすめです！



#参照

>[Rails tutorial 10.3.2サンプルのユーザー](https://railstutorial.jp/chapters/updating_and_deleting_users?version=6.0#sec-sample_users)


####投稿者コメント

Rails tutolialを進めてたら何やら面白そうなGemがあるなあとおもって記事にしました。
これからPF作成もあるので、使ってみようかなと思っています！

####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
【DR対策】AWSを利用した障害復旧シナリオ

# 概要
　クラウドサービスを利用するにあたって、障害が生じた際にどれだけ迅速に復旧が実行できる構成が取れているか、という観点が重要だと言われている（Design for Failure）。
　AWSのホワイトペーパーで取り上げられている以下の4つの DR 対策をまとめる。

- バックアップとリストア
- パイロットライト
- ウォームスタンバイ
- マルチサイト（ホットスタンバイ）

### 注意されたい事項
記述される構成は一例であるということ。
DNS のフェイルオーバーに関しては省略する。
本番環境は On-premise または Region 1, スタンバイ環境は Region 2 とする。

# バックアップとリストア

![backup_and_restore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431877/caec24c3-7910-2bbb-d352-6ee369040f35.png)

　準備段階においては、Storage Gateway のボリュームゲートウェイ（Gateway-cached Volumes）を使用して On-premise 環境から S3 にバックアップを取る。
　復旧段階においては、AWS 環境で EC2 インスタンスを立ち上げ、取得済みのバックアップ（ここでは EBS スナップショット）から EBS ボリュームを復元し、インスタンスへアタッチする。
　バックアップとリストアは`バックアップを取得しておいて、障害時にはリソースを展開し、データをバックアップから復旧させる`手法。

# パイロットライト

![pilotlight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431877/61eb98eb-4cac-a9e1-f797-7f448aea90d9.png)

　pilotlight は種火という意味。ガスコンロを使用するときの "カチカチカチ" って鳴るあれを思い出すと良い。pilotlight 自体は小さな火であるが、ガスに点火することによって一気に炎が広がっていく。
　この様子を障害復旧の構成に例えたものである。
準備段階においては、本番環境で起動しているインスタンスの AMI をスタンバイ環境に保存し、DB のリードレプリカを配置しておく。
　復旧段階においては、AMI からインスタンスを起動、リードレプリカをメイン DB に昇格させることで障害時の対応を行う。
　パイロットライトは`復旧リージョンで最小限の構成を行っておいて、障害時にはそれらに基づいてリソースを展開して復旧を図る`手法。

# ウォームスタンバイ

![warm_standby.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431877/4019f29d-a215-f8c3-aea3-3df20ba2ef9e.png)

　準備段階においては、スタンバイ環境で本番環境と同様の構成でリソースを配置し起動しておく。ただしこのとき、リソースのスペックは本番環境に比べて低いものを配置しておく。
　復旧段階においては、トラフィックをスタンバイ環境に向け、本番環境のアクセス数に対応できるように、スケールアウト・スケールアップを行う。
　ウォームスタンバイはパイロットライトの拡張版で、`低スペックのリソースを配置して起動しておき、障害時にはそれらのリソースのスケールアップ・スケールアウトを行って復旧を図る`手法。

# マルチサイト（ホットスタンバイ）

![multi-site.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431877/dab97ad7-5dfa-1736-1d0d-107b0c846d75.png)

　準備段階において、スタンバイ環境でリソースを本番環境と同様の構成かつスペックで配置し起動しておく。
　復旧段階においては、トラフィックをスタンバイ環境に向ける。
　マルチサイトはウォームスタンバイの拡張版で、`本番環境と同じ構成をスタンバイ環境で取っておき、障害時に迅速に復旧を図る`手法。

# 参考

https://aws.amazon.com/jp/whitepapers/using-aws-for-disaster-recovery/

https://media.amazonwebservices.com/jp/AWS_Disaster_Recovery_01242012.pdf

https://d1.awsstatic.com/whitepapers/aws-disaster-recovery.121b65092f931567af5370b47dd12cb18866089c.pdf
ReactのReduxについての備忘録

最近、開発を勉強しようと思って始めたのがReactでその中でReduxの概念を†完全に理解†したので備忘録としてメモを書きます。
あくまでも<b>自分用</b> として書くのでご了承ください。また、間違え等ありましたらご指摘くださると幸いです。

<h2>そもそもReduxとは??</h2>
Reduxとは、Reactのライブラリの１つで(実はReact専用ではないが)、Stateをグローバルな状態に保持するのに役に立つ。
ReactHooksのuseStateは、各々のコンポーネントの状態を保持できるがそれを他のコンポーネントに伝えるためには Props　を使い、順番に伝達していかなければならない。それだと、同じ状態を複数のコンポーネントで使うためには、その使用するコンポーネント全てにPropsを通して伝える必要があり、管理やメンテナンスがとても大変だった。
しかし、 <b>その状態を同じ場所で一括に管理できる</b>ようにしたのがReduxである。
各々のコンポーネントである状態を知りたい時、同じ参照先、Reduxの言葉だと<b>Store</b>を見ればよくなる。

<h2>Reduxで使う用語</h2>
大まかな概念は以上の通りなのだが、Reduxを難しく感じさせる理由はその手順、手続きにある。
例えば、あるボタンをクリックした時 count　というStateを＋１したいとする。
大雑把にやりたいことを実現しようとすると、以下の様な流れが直感的だ。
<b>(クリックしたという情報をStoreに伝える)=>(Storeにあるcountという状態を+1する)</b>
しかし、現実には以下のような手続きを踏むことになる。
<b>(クリックする)=>("+1したい"というActionが発行される)=>
("+1したい"というActionがStoreに伝えられる(これをdispatchという) )=>
(Storeのcountを変更するためにReducerという関数を通す)=>
(Reducerを通してできた新しいcountを値をStoreのcountに設定する)</b>

以上のような、わけのわからない手続きを踏むことで、ようやく状態が変更されるわけだ。
しかし、偉い人が考えたのだから、めんどくさいのにもちゃんと理由がある。ここで、用語を１つづつ解説する。
<h3>・Store</h3>
上でも説明したが、ここで全体の状態を管理する。どこのコンポーネントからでもその中身に一発でアクセスできる。
ただし、読み込みは一発でアクセスできるが、書き込みは上の手続きを通さないとしてはいけない。
また、Storeは１つだけしか持ってはいけない。
<h3>・Action</h3>
これはボタンを押したり、特定のイベントが発生した時に発行される(これを実現したい!)というだけのただの命令が書かれた紙である。
<h3>・Dispatch</h3>
dispatch(action)の様なふうに使われる、Action(指令)をStoreに伝えるための伝達役だ。
<h3>・Reducer</h3>
こいつが一番えらい。 Storeの中の情報を書き換える権限を与えられた唯一のやつ。
なお、古い(現時点での)Stateとdispatchによって伝えられたやりたいActionの２つを引数にとり、新しいStateを戻り値として返す。
超簡単に書くと　(OldState,Action)=>NewState を行うだけの関数。
ただし、これは純粋関数(外の情報を変更しない)である必要がある。 Reactの根本にある、関数型プログラミング的な思想を知らないと理解しにくいかもしれないが、そうすることでバグを減らせる(らしい)
また、直接Stateを変更するのではなく、コピーをとり新しい値を返すことで、
Chrome拡張のRedux Devtoolsを使いいつでもその状態を再現することができる.


<h2>まとめ</h2>
Reduxを使うためには、Reactの根本にある思想、データフローは単方向であるべしというものを理解した上でないと、理解するのが難しいかもしれない。 
ちなみに初心者なので、useReducerとかとの違いはまだ知りません。
VueでWeb制作から公開まで【総6時間】

#まずは完成品をどうぞ
渋谷のギラギラ感を出したかったのでネオンライト風CSSを使った。
<img width="600" alt="スクリーンショット 2021-07-24 18.58.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057425/b9e505c0-5e8b-286b-8146-b631608ede7d.png">
スクロールするとこんな感じ。
試しにGoogleMapAPIも使ってみた。
<img width="600" alt="スクリーンショット 2021-07-24 18.58.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057425/7915be99-ddc5-c4d5-965e-dbfc17c7f39e.png">
スマホで見るとちょっとデザインが変わります。
<img width="380" alt="スクリーンショット 2021-07-24 19.14.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057425/a422321e-e81e-d237-6396-e3d5e1805a80.png">

実際にWeb公開しているURLは[ここ](https://midori-design.github.io/shibuya-website/)です。
ちょっと重たいかも。
#作り方
##まずは作った動機
vue-CLIとGitHub Pagesの組み合わせで簡単にweb公開できることを知って
試しに何か作ってみたくなったというお話。

総制作時間6時間くらいで、もちろん費用はかかっていない。
結局一通り出来上がってからレスポンシブやらなんやらの調整に一番時間かかった。

割と見た目ができていればOKくらいの気持ちで作った。

##Web公開の方法
まずGitHubでリポジトリを作ってクローンして、vue-CLIを使って実装をしていく。

実装する前にまずPagesの設定をして、vueのサンプルページがうまく表示されるかを確認した。
実際にvueの生成物をPagesでの公開する方法の詳細は[こちらの記事](https://qiita.com/Threen/items/9d426c59c3c38bc0e90a)から。
##XDを使ってデザインをなんとなく考える
XDはadobeのデザイン作成ソフト。
Web制作ではよく使われる上に、無料で使える模様。

[adobe公式サイト](https://www.adobe.com/jp/products/xd.html?mv=affiliate&mv2=red)のスターターキットダウンロードで入手できる。

##トップのイメージを探す
素材に関してはおなじみの[unsplash](https://unsplash.com/)で見つけた。
無料とは思えないクオリティの素材を発掘できるので重宝している。

##vueでトップページを作成
詳しい説明は割愛するが、HTMLとCSSに関しては、ドットインストールの[はじめてのWeb制作](https://dotinstall.com/lessons/basic_website)とvue-cliの使い方をググればできるレベル。
ドットインストールは初心者におすすめ。

##ネオンライト風のCSS
[CSSで美しいネオンライトのエフェクトをテキストやボタン、ボーダーに実装するテクニックのまとめ](https://coliss.com/articles/build-websites/operation/css/css-neon-sign-effects.html)を参考にした。

##GoogleMapAPI
[ライブラリなしでGoogle MapをVue.jsで使う方法](https://reffect.co.jp/vue/google-map-vue)を参考にした。

##レスポンシブデザイン
PCで見るのとスマホで見るのとで幅が変わるのでデザインを変更した。
これも"レスポンシブデザイン"でググったら出てくるレベルで作成。(全然解説になってない)

#まとめ
以上が全貌。

結局何が難しいってフレームワークを決めることとデザイン自体の2つ。
この2点に関しては正解がないので常に最適解に近づけていく必要がある。

それ以外に関しては大体ググったら正解が手に入る。

あとは、デザインの勉強のためにWebサイト制作をしてみたが、
正直XDでお絵描きして終わりでもいいような気がする。

デザイン＋実装するなると半日はかかるので、量産ができない。

いずれにしても、今後も架空のWebサイトデザインを作っていきたい。