OmniAICreator/Qiita-1.07M huggingface dataset:
タグフォーム「Voerro Vue Tags Input v2」にタグ追加ボタンをつけた

簡単にタグフォームを設置できる「Voerro Vue Tags Input v2」、
**ボタンをクリックでもタグの追加** が出来るようにしました。

## 前提：用意されたタグ追加タイミングはキー入力のみ

「Voerro Vue Tags Input v2」で用意されているタグの追加タイミングは以下
1. Enterキー押下
2. カンマ(,)入力



https://github.com/voerro/vue-tagsinput/blob/master/dist/voerro-vue-tagsinput.js
https://github.com/voerro/vue-tagsinput/blob/master/src/VoerroTagsInput.vue


## 方法：タグ追加時に実行される関数を使用

タグ追加時に実行される関数
```tagFromInput();``` を使用します。

```
<input type="button" name="" value="追加" @click="addTag"></button>
```


```
addTag: function() {
    // voerro-vue-tagsinput.jsでタグ追加時に実行される関数
    this.$refs.tagsInput.tagFromInput();
},
```



## その他「Voerro Vue Tags Input v2」組み込みに参考にしたリンク

組み込み方
https://www.kabanoki.net/5059/

機能カスタマイズ
https://voerro.github.io/vue-tagsinput/

cssのカスタマイズ
http://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=https%3A%2F%2Fgithub.com%2Fvoerro%2Fvue-tagsinput

リポジトリ
https://github.com/voerro/vue-tagsinput?ref=kabanoki.net
Atcoder Beginner Contest の A, B 問題でありがちな入力まとめ Python

整数 $N$ を入力する
例：`1`

```
N = int(input())
```

整数の組 $A, B, C$ を入力する
例：`1 4 3`

```
A, B, C = map(int, input().split())
```

整数の組 $A_1, A_2, A_3, \cdots$ を入力する
例：`1 4 3 2 5 2`

```
# list型
A = list(map(int, input().split()))  # [1, 4, 3, 2, 5, 2]

# list型（昇順に並び替え）
A = sorted(map(int, input().split()))  # [1, 2, 2, 3, 4, 5]

# set型（重複を削除）
A = sorted(map(int, input().split()))  # {1, 2, 3, 4, 5}
```
Azure Machine Learningで使用するAnaconda仮想環境の構築とJupyterとの連携方法

# はじめに
[Azure Machine Learning](https://docs.microsoft.com/ja-jp/azure/machine-learning/overview-what-is-azure-ml)上のJupyter notebooksを使用して機械学習環境を構築するための方法をまとめたものです。

Azure Machine Learning StudioとJupyter notebooksの起動が行える状態を前提としています。
仮想環境の構築や切り替えにはAnacondaを使用します。

## Anacondaとは
データサイエンス向けのPythonパッケージ集合体
- 1,500以上のパッケージに対応
- GUIとコマンドラインの両方に対応
- `conda`コマンドを使って操作できる

Anacondaを使うことでライブラリのインストール等に時間を取られることなく簡単に開発環境の構築や切り替えを行うことが可能です。

参考：https://www.creativevillage.ne.jp/72837

# 手順
## 1. jupyter notebooks上でTerminalを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/1cba912e-bfe0-8510-c5ca-7249c6eb6f82.png)

## 2. Anaconda仮想環境のセットアップとJupyter連携
以下手順はJupyter上のTerminalに入力していきます。
### 2.1 condaによる仮想環境の構築
```bash
$ conda create --name my_notebook_env python=3.7 -y
```
`-name my_notebook_env`：仮想環境の名前. 好きなものを設定できる
`python=3.7`：仮想環境で使用するPythonバージョン
`-y`：確認項目に自動的にyesで応答する

※conda環境の一覧を表示：`jupyter kernelspec list`

### 2.2 仮想環境の有効化
```bash
$ conda activate my_notebook_env
```

※無効化するには：`conda deactivate`

### 2.3 仮想環境内でのライブラリのインストール
Azure Machine Learning SDK for Python をインストールします。

```bash
$ pip install --upgrade azureml-sdk[explain,automl,interpret,notebooks]
```
インストールしてるコンポーネントの詳細については下記をご覧ください。
[Azure Machine Learning SDK for Python](https://docs.microsoft.com/ja-jp/python/api/overview/azure/ml/install?view=azure-ml-py)

### 2.4 Jupyterへの仮想環境カーネルの追加
仮想環境をアクティベートした状態のまま下記コマンドを実行します。

```bash
$ ipython kernel install --user --name=my_notebook_env --display-name=my_notebook_env
```
`--user`：現在のユーザー環境にインストール
`--name`：カーネルの名前を指定
`--display-name`：カーネルの表示名。今回はカーネル名と同一にしたが、ここに分かりやすい表示名を設定できる。

※Jupyterカーネル一覧の表示：`jupyter kernelspec list`
※カーネルの削除：`jupyter kernelspec uninstall my_notebook_env`

## 3. Jupyter notebooks上でのカーネル切り替え
### 3.1 Jupyterのリロード
変更を反映させるため、開いているノードブックがあれば、ブラウザのリロードを行う等して再読み込みを行います。

### 3.2 カーネルの切り替え
ノードブック上でKernel→Change kernelを選択し、今回作成した仮想環境 (my_notebook_env)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/32329af6-dadd-0db3-0aa0-82fd291a64ff.png)

ノードブック画面右上の表示が正しく切り替わっていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57724/ae086e0e-42f2-bac4-d8d6-a67ed750df6f.png)

# まとめ
Anacondaを使うことで簡単に開発環境の構築や切り替えを行えます。
Azure Machine Learningを使うことで使い慣れたJupyter環境での機械学習を行っていけます。

# 参考
[Azure Machine Learning とは](https://docs.microsoft.com/ja-jp/azure/machine-learning/overview-what-is-azure-ml)
[Azure Machine Learning SDK for Python](https://docs.microsoft.com/ja-jp/python/api/overview/azure/ml/install?view=azure-ml-py)
[Anaconda (conda)の簡単な使い方メモ](https://qiita.com/aical/items/5d632a7ee4a3233bb8fc)
【Amazon Connect】電話でEC2インスタンスを停止したり、再起動したりする。

#解決したいこと
```
仮想カスタマ「しもしも！？　サーバーの調子おかしいんだけど！？？マッハでリブートして！！」
オペレータ　「おかのした」
※フィクション
```

ここからカスタマの情報を確認して、EC2インスタンスの状態をチェックして、カスタマのインスタンスかどうかをダブルチェックして、オペレータが心の準備をしてからインスタンスを再起動する。

#いや、無駄ちゃう？
自分はセールスなんで実際に作業をしている訳ではないですが、割と前述みたいな電話がかかってくることは多いです。
そして、確認して作業して…。
大したこと無い作業ですが、その割には影響が大きい（聞いたことはありませんが、他のインスタンスをリブートしたりとかのリスクを懸念する）ので、脳味噌ゼロでやれるようなことでもありません。

いやでもそれにしてもこんなことに時間を取られるのは如何なものか。
「いっそ、電話受付無くしたら？」という声も聞きますが、それならそれに代わるサービスを考えねばなりません。

#お客様で作業を完結してもらう
電話受付を無くす＆お客様で作業をしていただく方向性で考えました。

**【使うもの】**
**Amazon Connect、Lambda(node.js)、EC2**

![connect.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/3358f82f-c5ab-47f6-072e-0b6b4f1d89bf.jpeg)
Amazon Connectはこんな感じに作成して、
[電話をかける] → [自動音声に従いどれかをプッシュ(1.起動、2.停止、3.再起動)] → [プッシュに応じたLambdaが処理]
という流れにしてます。

EC2起動Lambdaの中身はこんな感じ。

```index.js
const INSTANCE_ID = '対象のインスタンスIDを入れる';

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-1';

function ec2Start(cb){
var ec2 = new AWS.EC2();
var params = {
InstanceIds: [
INSTANCE_ID
]
};

ec2.startInstances(params, function(err, data) {
if (!!err) {
console.log(err, err.stack);
} else {
console.log(data);
cb();
}
});
}
exports.handler = function(event, context) {
console.log('start');
ec2Start(function() {
context.done(null, 'Started Instance');
});
};
```

#メリット
・Lambdaを作り込めばEC2以外の操作をしたり、複数のインスタンスから指定して処理することもできる。
・電話番号と契約サーバが紐付くので、人的オペレーションミスが無くなる。
・電話オペレーションによる人件費が削減。
・電話の自動応答操作なので、老若男女問わず使える。
　(専用のコンパネを作ったのに、「使い方が…」という電話すら無くなる)

#デメリット
・カスタマ毎にAmazon ConnectとLambdaを設定する必要がある為、構築費用が必要。
・数台程度なら本構成で問題無いが、何十台とインスタンスがある場合には不向き。
　(というか、そういう案件で使うことは想定していない)

#まとめ
同じ電話かけるなら、こっちの方が弊社にもカスタマにも時間の無駄が無くて良いよね。

あと開発環境とか、帰社後に「あ、そういえば消し忘れたな」って時に
携帯一本で落とせるのでコンパネに入る必要も無く、割と便利です。
Fedoraをアップグレードするスクリプト

## 元ネタはこちら

@glires さんの[馬鹿の一つ覚え: Fedoraをアップグレード](https://qiita.com/glires/items/6bc71c0392c638661e13) を参考にしています。

## シェルスクリプト

以下の２つのスクリプトを/rootに作成しておき、rootアカウントで、2つのシェルを順番に実行します。

```shell:/root/upgrade-step1.sh
#!/bin/sh
dnf -y update
dnf -y --refresh upgrade
sync
shutdown -r now
```

* 再起動後にこちらを実行します。
  * 現在のバージョンを取得して＋１したものを変数に格納して実行します

```shell:/root/upgrade-step2.sh
#!/bin/sh
curVer=`cat /etc/redhat-release | awk '{print $3}'`
newVer=`expr $curVer + 1`

dnf -y install dnf-plugin-system-upgrade
dnf -y --refresh --releasever=$newVer system-upgrade download
dnf system-upgrade reboot
```
読書要点「プリンシプルオブプログラミング」第3章 UNIX哲学

## UNIX哲学

UNIXの考え方とも言えるUNIXの設計の哲学である。
今なお使われるUNIXがもつ設計判断の正しさを考えれば、設計判断及びその理由は現在の開発でも通用する重要な考え方である。
これから紹介する定理の他に、小定理と呼ばれる群がある。

- 環境カスタマイズ
- 軽薄短小カーネル
- 小文字使用
- 森林保護
- 沈黙は金並列思考
- 部品コラボレーション
- 90パーセント解
- 劣るが優る
- 階層指向


### 小は美なり

小さいソフトウェアはシンプルで扱いやすく、優れている。
大きいソフトウェアは複雑な上に不測の事態に対応しにくい。
ソフトウェアはできる限り小さく作り、各所の小ささを保つようにすべきである。

### 1つ1仕事

1つのソフトウェアには1つの仕事をさせるようにする。
問題が複雑化するとコードも複雑化させる方向に行きがちだが、ソフトウェアの仕事を1つに絞り、それを連携させていくことでそれぞれがピュアとなり扱いやすくなる。

### 即行プロトタイプ

できるだけ早くプロトタイプに着手するのが良い。
設計段階で構想段階のものよりも、プロトタイプが完成しており製品の全体像を把握できている方が開発の上では圧倒的に安心感がある。
要件の不備の発見など、設計の初期段階にも関わるため、その作業は早ければ早いほど良い。

### 効率性より移植性

ソフトウェアの開発の上では、開発の効率性と移植性とであれば移植性を取るべきである。
様々なハードウェアで動作する移植性の高いソフトウェアは、結果的に寿命が長くなる。
ハードウェアに依存しないコードで書くことで、様々なハードウェアで利用しやすくなる。

### データはテキスト

データを保存するときはテキストファイルに保存するのが良い。
テキストファイルはバイナリとファイルと比べて使い勝手が良い。
移植性、人による可読性がよく、特別な変換処理も必要ない。
オペレーティングシステムに依存しないフォーマットのテキストファイルを採用していきたい。


### レバレッジ・ソフトウェア

レバレッジとは梃子のことである。
この定理は、ソフトウェアを組み合わせて利用することで、梃子のように個々以上の力を発揮できるようになるということを示す。
他のソフトウェアを利用することで、少ない労力で大きな成果を得ることにつながる。
使う側も使われる側も価値が増す。
ソフトウェアは小さく作り、ソフトウェアをつなげていくことで機能を実現していくのが良い。

### シェルスクリプト活用

シェルスクリプトは広範に使われているため、ソフトウェアの連結の際に利用することで、梃子の効果を高めたり移植性を高めることにつながる。
シェルスクリプトは信頼の置ける動作、高い移植性という面で環境依存のものに比べて大きなアドバンテージを持っている。

### 対話インターフェース回避

ユーザーとマシンが対話する形式のインターフェースは避けるべきである。
対話形式だとユーザーもマシンも束縛されてしまうことになる。
ユーザーは独自の対話に対応しなければならない。
マシン側もソフトウェア同士の対話を制限されたり、人間の入力待ちというマシンでどうにもならないボトルネックが発生してしまう。
人間用のインターフェースに合わせたコードは煩雑になりがちで、結果的に望ましくない他機能主義的なソフトウェアになりかねない。

ソフトウェアの対話の相手はソフトウェアであるべきで、処理を一つ行ったらコマンドインタプリタに制御を返すようなソフトウェアにすると接続性が高まる。

### フィルタ化

ソフトウェア設計時は、入力からデータを受け取り、加工されたデータを引き渡すフィルタとして設計するのが良い。
データを生成するのはユーザーたる人間であり、ソフトウェアはそれを扱うフィルタである。
ソフトウェアは断りもなくデータを生成し続けるようなものではなく、受け取ったデータを処理するものである。良くなる。

標準の入出力を利用できると接続性が
【SQL】SUBSTR

★SUBSTR(文字列,文字開始位置,文字長)
・引数を対象に指定の文字数をキャラクタ単位で取り出せる

★SUBSTRB(文字列,文字開始位置,文字長)
・引数を対象に指定の文字数をバイト単位で取り出せる

文字開始位置の指定で0を指定した場合1と同様の処理となる。
指定が整数の場合は文字先頭からの数える。
指定が負数の場合は文字末尾からの数える。
【SQL】DECODE

★DECODE(列名,値1,結果1,値2,結果2,結果3)
　[列名]が値1と同値なら結果1を返し、値2と同値なら結果2を返し、それ以外なら結果3を返す。
値と結果値がセットで引数になっていて、最大127セットまで引数として設定が可能。
PHP,Laravel導入

# php インストール
```:ターミナル
brew install php@7.1
```
## pathを通す
```:ターミナル
  echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.zshrc
  echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.zshrc
```
更新

```:ターミナル
source .zshrc
```
# php バージョン切り替え
```:ターミナル
7.1から7.3に切り替えたい場合。
brew unlink php@7.1
brew link php@7.3
```
# パスの変更
`vi .zshrc`

```
export PATH="/usr/local/opt/php@7.3/bin:$PATH"
export PATH="/usr/local/opt/php@7.3/sbin:$PATH"
```
```
source .zshrc
```

# laravel
## composerインストール
```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```
## laravelインストール
```
composer global require laravel/installer
```
### パスの設定
* usernameの部分を適宜変更してください。

```
export PATH="$PATH:/Users/username/.config/composer/vendor/bin"
```
```
source .zshrc
```
フロントエンド開発における CI/CD について

# CI/CD とは

https://ja.wikipedia.org/wiki/継続的インテグレーション
https://ja.wikipedia.org/wiki/継続的デリバリー

# Cloud Build

> Cloud Build は、Google Cloud Platform インフラストラクチャでビルドを行うサービスです。

https://cloud.google.com/cloud-build?hl=ja

## 準備

- リポジトリの接続をする
    - リポジトリに対して Admin の Role が必要
- トリガーを作成

## 構成ファイル

```cloudbuild.yaml
steps:
  - name: node
    entrypoint: yarn
    args: ['install']
  - name: node
    entrypoint: yarn
    args: ['run', 'test']
  - name: node
    entrypoint: yarn
    args: ['run', 'build']
  - name: node
    entrypoint: bash
    args:
      - '-c'
      - |
        yarn build-storybook || exit 0
  - name: 'gcr.io/cloud-builders/gcloud'
    args: ['app', 'deploy', '--no-promote']
  - name: 'gcr.io/cloud-builders/gcloud'
    args: ['app', 'deploy', 'app.storybook.yaml', '--no-promote']
```

```app.yaml
runtime: nodejs10
handlers:
  - url: /
    static_files: dist/index.html
    upload: dist/index.html
  - url: /(.*)
    static_files: dist/\1
    upload: dist/(.*)
```

↑ 参考にしたサイト忘れてしまった・・・

```app.storybook.yaml
service: storybook
runtime: nodejs10
handlers:
  - url: /
    static_files: storybook-static/index.html
    upload: storybook-static/index.html
  - url: /(.*)
    static_files: storybook-static/\1
    upload: storybook-static/(.*)
```

# リファレンス

https://cloud.google.com/cloud-build/docs/building/build-nodejs?hl=ja
https://cloud.google.com/cloud-build/docs/deploying-builds/deploy-appengine?hl=ja
Visual Studioでコマンドパレットを出す

## 概要

表題の通りで、VSCodeでいう(Ctrl + Shift + P)、IntelliJ IDEAでいう(Ctrl + Shift + A)をVisual Studio 2019で出す方法を探して ~~ます~~ ました。

## 出し方

`Ctrl + Q`で、表示できました。

注意点としては、日本語にしていると日本語で検索しないと表示されないです。

## 英語化

日本語だと検索が面倒なので、英語にします。
Visual StudioはデフォルトだとWindowsの言語設定を参考に言語設定をするみたいなので、Windowsが日本語の方は日本語がデフォルトになります。

Visual Studio Installerから英語もダウンロードしてきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107221/5bfb50b9-d3fd-020f-cd78-63864be48193.png)

言語設定は
`ツール->オプション->環境->国際対応の設定`
でできます。
詳細は参考リンクを参照。

## 参考

- [Visual Studio：メニューなどの表示言語を切り替えるには？：.NET TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/1502/17/news094.html)
- [Visual Studio の UI を英語から日本語に変更する方法 - Visual Studio 入門 - C# 入門](https://csharp.sql55.com/visual-studio/how-to-change-language-for-visual-studio-ui.php)
- [Visual Studioにもマップモードとかコマンドパレットとかあるんだ。 - stealthinu のブックマーク / はてなブックマーク](https://b.hatena.ne.jp/entry/299119853/comment/stealthinu)
【PostgreSQL】User、DBを作成してスクリプトファイルを実行するまで

[Goプログラミング実践入門　標準ライブラリでゼロからWebアプリを作る](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV) の 6.3 GO言語とSQL で、PostgreSQLをセットアップする箇所があったのですが、コマンドが違ったりしたのでメモしておきます。
自身のOSはMacです。

##  User、DBの作成

```
$ psql # ログイン
psql (12.3)
Type "help" for help.

tagawahirotaka=# 

tagawahirotaka=# create user gwp; # ユーザー作成
CREATE ROLE

tagawahirotaka=# \password gwp;　# パスワードを設定
Enter new password:
Enter it again:

tagawahirotaka=# create database gwp;　# データベースを作成
CREATE DATABASE

tagawahirotaka=# \connect gwp　# データベースの切り替え
You are now connected to database "gwp" as user "tagawahirotaka".

gwp=# \connect - gwp; # ユーザーの切り替え
You are now connected to database "gwp" as user "gwp".
```

## スクリプトファイルの実行

``\i``の後に実行したいスクリプトファイルのパスを指定します。

```
gwp-> \i ../
```

を入力した時点でtabキーを押すと上にファイル一覧(自分の場合はデスクトップにあるファイル群)が表示されるので、相対パスがわかります。

```
gwp-> \i ../gowebprog/ch06/06sql_store1/setup.sql
psql:../gowebprog/ch06/06sql_store1/setup.sql:1: ERROR:  table "posts" does not exist
CREATE TABLE
```

エラーが出てますが無事にテーブルが作成されました。
文字列をmd5ハッシュ化して返す

##文字列をmd5Hash化

まあ自分メモです。
ライブラリとかあるみたいなので使わなそうですけど。
この方法は`MessageDigest`を使います。

下記のソースの`strHash` の部分がハッシュ化したい文字列です。
任意の文字列ってことになります。
ハッシュ化した結果は`str`の値です。


```java:md5Hash.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * md5Hash
 * 入力された文字列をmd5Hash化して返す
 */

public class md5Hash {
    public static void main(String[] args) {
        /**ハッシュ化したい文字列：strHash */
        String strHash = "12345";
        System.out.println("ハッシュ化する文字列：" + strHash);

        try{
            // メッセージダイジェストのインスタンスを生成
            MessageDigest md5 = MessageDigest.getInstance("MD5");

            byte[] result = md5.digest(strHash.getBytes());
            
            // 16進数に変換して桁を整える
            int[] i = new int[result.length];
            StringBuffer sb = new StringBuffer();
            for (int j=0; j < result.length; j++){
                i[j] = (int)result[j] & 0xff;
                if (i[j]<=15){
                    sb.append("0");
                }
                sb.append(Integer.toHexString(i[j]));
            }
            String str = sb.toString();
            System.out.println("ハッシュ化後の文字列：" + str);

        } catch (NoSuchAlgorithmException x){

        }     
    }
}

```
上記を実行すると下記のような結果が得られるかと思います。

```text:結果
ハッシュ化する文字列：12345
ハッシュ化後の文字列：827ccb0eea8a706c4c34a16891f84e7b
```



###参考
[Java で MD5 ダイジェスト値を求める方法](https://weblabo.oscasierra.net/java-md5-1/)
[【java】文字列をMD5ハッシュ化](https://rmrmrmarmrmrm.hatenablog.com/entry/409693028.html)
Ensembl Bacteriaゲノムブラウザで細菌のゲノムを見る

1. [Ensembl Bacteria](http://bacteria.ensembl.org/index.html)のサイトに行き、Search for a genomeに見たい細菌種名を入力して検索します。ここではEscherichia coli str. K-12 substr. MG1655とします。
<img width="1437" alt="Ensembl_Bacteria.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/486bde49-de18-a4a6-2b36-1ca99abb5494.png">

2. ヒットした細菌種（株）が出てくるのでクリックします。
<img width="1451" alt="Species_List.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/3a276e67-bf81-5646-dd09-4bca9532bcbd.png">

3. 見たい領域が決まっている場合、遺伝子名か「 Chromosome:2750115-2750708」のようにポジションを入力します。ここではpseudo geneの「yjhE」を検索してみます。
<img width="1434" alt="Escherichia_coli_str__K-12_substr__MG1655_-_Ensembl_Genomes_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/5f6e0387-ea3a-b8a6-13dc-95ece87bf518.png">

4. Locatioinをクリックします。
<img width="1451" alt="yjhE_-_Search_results_for__yjhE__-_Escherichia_coli_str__K-12_substr__MG1655_-_Ensembl_Genomes_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/819eb26e-ea6c-f302-106f-c4d99f16883a.png">

5. ゲノム上の位置や塩基配列がグラフィカルに表示されます。検索した遺伝子名でラベルされた配列を見たいときは、左上の「Gene」タブをクリックします。
<img width="1457" alt="Chromosome__4_506_812-4_507_158_-_Region_in_detail_-_Escherichia_coli_str__K-12_substr__MG1655_-_Ensembl_Genomes_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/fab239c0-79ee-a9a0-5dff-47c8554065ac.png">

6. 遺伝子の説明の下に遺伝子名がラベルされた配列が表示されます。この図は表示させる情報をカスタマイズしたり、画像ファイルとしてエクスポートすることが可能です。
<img width="1537" alt="Gene__yjhE__b4282__-_Summary_-_Escherichia_coli_str__K-12_substr__MG1655_-_Ensembl_Genomes_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/870895e2-358b-0ec4-7389-8070921d23a8.png">
[Rails] バリデーションの書き方

Progate学習メモ

```models/post.rb
class Post < ApplicationRecord

  validates :検証するカラム名, {検証する内容}

end
```

# 色々なバリデーション
カラムが存在するかどうか
`validates :content, {presence: true}`

最大140文字まで受け付ける
`validates :content, {length: {maximum: 140}}`

重複がないか
`validates :email, {uniqueness: true}`

# バリデーションをまとめて書く

```models.post.rb
class Post < ApprocationRecord

  validates :content, {presence: true, length: {maximum: 140}}

end
```
[UE4]UE4がサポートしている Subversion( SVN )のバージョンを確認する方法について

`Engine\Binaries\ThirdParty\svn\Subversion.tps` にて確認可能です。

```xml:Subversion.tps
<?xml version="1.0" encoding="utf-8"?>
<TpsData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name>Subversion 1.9.5</Name>
  <Location>/Engine/Binaries/ThirdParty/svn/</Location>
  <Date>2016-06-16T12:01:00.8219478-04:00</Date>
  <Function>Adds support for version control systems other than Perforce</Function>
  <Justification>Subversion provides all the features we need and can be used as a close analogue to Perforce (as opposed to say, GIT).</Justification>
  <Eula>http://www.apache.org/licenses/LICENSE-2.0</Eula>
  <RedistributeTo>
    <EndUserGroup>Licensees</EndUserGroup>
    <EndUserGroup>Git</EndUserGroup>
    <EndUserGroup>P4</EndUserGroup>
  </RedistributeTo>
  <LicenseFolder>/Engine/Source/ThirdParty/Licenses/Subversion_License.txt</LicenseFolder>
</TpsData>
```

1.10以降のバージョンでも動作する可能性はありますが、何らかの不具合が発生する可能性もあるため、`Subversion.tps`に記載されたバージョンに合わせることを推奨いたします。
ちなみに、2017年頃からずっと1.9.5です。 

Subversion 1.9.5のダウンロードはこちらから。
https://osdn.net/projects/tortoisesvn/storage/Archive/1.9.5/

SVNって何？という方はこちらをどうぞ
公式ドキュメント「ソース コントロールとして SVN を使用する」
https://docs.unrealengine.com/ja/Engine/Basics/SourceControl/SVN/index.html
go修行10日目　embeded

## embeded

- Go言語には継承がなくてその代わり
- VertexをVertex3Dがembededしている

```golang


package main

import "fmt"

type Vertex struct{
	x, y int
}

func (v Vertex) Area() int{
	return v.x * v.y
}

func (v *Vertex) Scale(i int){
	v.x = v.x * i
	v.y = v.y * i
}

type Vertex3D struct{
	Vertex
	z int
}

func (v Vertex3D) Area3D() int{
	return v.x * v.y * v.z
}

func (v *Vertex3D) Scale3D(i int){
	v.x = v.x * i
	v.y = v.y * i
	v.z = v.z * i
}

func New(x, y, z int) *Vertex3D{
	return &Vertex3D{Vertex{x, y}, z}
}

func main() {
	v := New(3,4,5)
	v.Scale(10)
	fmt.Println(v.Area())
	fmt.Println(v.Area3D())
}
```

```
1200
6000
```
railsでDATABASE_URLを使う際の注意点

# 概要
環境変数のDATABASE_URLを使うとユーザー名やパスワードなど複数の項目を1つの環境変数で指定出来て便利です。
しかしハマりポイントもあるのでDATABASE_URLを使う際の注意点を紹介します。
なお本番環境にはあまり関係ない話です。

投稿時点でのrailsのバージョンは6.0.3.2です。

# 優先順位について
database設定の優先順位は下記の通りです。

1. database.ymlのurl項目
2. 環境変数DATABASE_URL
3. database.yml

参考url
https://railsguides.jp/configuring.html#%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A

# DATABASE_URLが使われるのは現在のRAILS_ENVだけ
DATABASE_URLが使われるのは現在のRAILS_ENVだけのようです。
しかしRAILS_ENVがdevelopmentの場合はtestに対してもtaskが実行されます。
そのためdevelopmentで `db:create` を行うとtestに対しても `db:create` が実行されますがtestではDATABASE_URLを参照されないため失敗するなどといった問題が発生します。

回避策としてはdatabase.ymlのurlでDATABASE_URLを使うように明示的に指定する方法があります。
ただしこれも今後は注意が必要そうです。

# 今後の注意点
上記の問題修正のためにDATABASE_URLが設定されていた場合はRAILS_ENVがdevelopmentでもtestに対してtaskを実行しない修正が行われました。
すでにmasterにはマージ済みでおそらく6.1でリリースされると思われます。

https://github.com/rails/rails/pull/37351

現在developmentでDATABASE_URLを使っている場合はdevelopmentとtestでdatabaseのズレが発生するようになることが予想されます。
今後はtest環境で別途手動でtaskを実行するのを忘れない、もしくはそもそもdevelopmentではDATABASE_URLを使わないなどの対応が必要そうです。
Laravelで便利なおすすめComposerパッケージ一覧

# はじめに
Laravelでアプリを作るときに
使うことが多い便利なパッケージをまとめました。
全てComposerでインストール可能なパッケージです。

主に管理画面系のwebアプリ構築の経験が多いため、
パッケージの選定もそのようなアプリで利用するものが多いです。

他にも便利なおすすめパッケージがあれば
ぜひコメントよろしくお願いします。

# 必須
### barryvdh/laravel-debugbar
https://github.com/barryvdh/laravel-debugbar
ブラウザ下部にデバッグバーを表示する。
その時にリクエストで発行されたSQL一覧や、今持っているセッション情報一覧など
デバッグに便利な情報がブラウザ上で確認できるようになる。

### barryvdh/laravel-ide-helper
https://github.com/barryvdh/laravel-ide-helper
IDEを利用してコーディングする際に、
コード補完を強化する。
変数からアローを書いたときにメソッドやプロパティのサジェスチョンがたくさん表示されたり、
メソッド定義元へのジャンプできる範囲が増えたり。
　
### laravelcollective/html
https://github.com/LaravelCollective/html
bladeファイルでフォームを書くときに便利なメソッドを提供する。
CSRFトークンを自動で埋め込んでくれたり、
モデルとフォームを紐づけて自動で初期値を入れてくれたり。
　
### doctrine/dbal
https://github.com/doctrine/dbal
migrationでカラム定義変更をする場合にインストールしておく必要あり。
　

# よく使う
### wildside/userstamps
https://github.com/WildSideUK/Laravel-Userstamps
データを作成、更新した際に
created_by、updated_byのカラムを
ログイン中ユーザIDで自動更新してくれる。

### guzzlehttp/guzzle
https://github.com/guzzle/guzzle
簡単にHTTPリクエストを送信するコードが書ける。
外部サービスのAPIにリクエストするときや
フロントエンドからajaxでAPIリクエストするときに利用。

### laracasts/flash
https://github.com/laracasts/flash
フラッシュメッセージを簡単に表示できる。
データ登録完了時や削除完了時に
画面上部に「登録完了しました。」みたいなメッセージ表示をする。

### kyslik/column-sortable
https://github.com/Kyslik/column-sortable
一覧系画面で簡単にソート機能を実装できる。
一覧テーブルのヘッダー行をクリックするだけで
昇順、降順ソートを切り替えられる。

### league/flysystem-aws-s3-v3
https://github.com/thephpleague/flysystem-aws-s3-v3
S3にファイルアップロード、ダウンロードをする場合に利用。

### aws/aws-sdk-php-laravel
https://github.com/aws/aws-sdk-php-laravel
その他AWSサービス利用時に必要。
SESでメール送信など。


# アプリによっては使う
### orangehill/iseed
https://github.com/orangehill/iseed
実際にDBに入っているデータからseederファイルを逆生成する。

### Enum
・[marc-mabe/php-enum](https://github.com/marc-mabe/php-enum)
・[myclabs/php-enum](https://github.com/myclabs/php-enum)
・[bensampo/laravel-enum](https://github.com/BenSampo/laravel-enum)
LaravelでEnumを実装したいときに利用。
似たようなパッケージがいくつかあり、どれがベストかはまだわからない。

### spatie/laravel-menu
https://github.com/spatie/laravel-menu
階層になっているメニューを生成できる。

### spatie/laravel-permission
https://github.com/spatie/laravel-permission
ユーザ、ロール、権限
の制御を簡単にできる。
ユーザ、ロール、権限を
多対多対多で管理するようなアプリでは非常に便利。

ユーザへのロール・権限の付与、はく奪の処理や
ユーザのロール・権限によるアクセス制御などが簡単。

### davejamesmiller/laravel-breadcrumbs
https://github.com/davejamesmiller/laravel-breadcrumbs
パンくずリストの表示や管理がしやすくなる。

### league/csv
https://github.com/thephpleague/csv
CSVのインポート・エクスポート処理を簡単にしてくれる。

### barryvdh/laravel-dompdf
https://github.com/barryvdh/laravel-dompdf
PDF出力処理を簡単にできる。

### jenssegers/agent
https://github.com/jenssegers/agent
ユーザエージェントの取得、判定処理をできる。

# 公式パッケージ
[Laravelドキュメント](https://readouble.com/laravel/7.x/ja/)の
「公式パッケージ」の欄にいろいろ載っています。

課金システムを作れる[Cachier](https://readouble.com/laravel/7.x/ja/billing.html)や
全文検索処理のための[Scout](https://readouble.com/laravel/7.x/ja/scout.html)、
SNSなど外部システム認証を導入するための[Socialite](https://readouble.com/laravel/7.x/ja/socialite.html)など、
もしアプリ要件にあれば導入必須となるような強力なパッケージがいくつかあります。


# laravel-awesome-project紹介パッケージ
[laravel-awesome-project](https://github.com/chiraggude/awesome-laravel#popular-packages)のページの
「popular-packages」の欄に、
便利なパッケージがカテゴリ別で大量に紹介されています。
この一覧をざーっと確認して
自分のアプリに導入できるようなパッケージがないか確認するのはおすすめです。
独自のデータセットでUGATITをトレーニング

UGATITは最先端の機械学習画像変換です。
[*論文](https://arxiv.org/abs/1907.10830)
[* GitHubプロジェクトページ](https://github.com/taki0112/UGATIT)
![teaser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/95a0f36f-d331-f049-c0c0-fc1dfb351f00.png)
このモデルを独自のデータセットでトレーニングできます。

このトレーニングでは、無料のGPUを使用できるGoogle Colaboratoryノートブックをお勧めします。UGATITには強力な計算能力が必要だからです。

1、上のGitHubプロジェクトページからのクローン。

```shell
git clone https://github.com/taki0112/UGATIT.git
cd UGATIT
```

2、TensorFlow1.14をインストールします（TensorFlow1がない場合。このモデルはTensorFlow2.0ではなくTensorFlow1で作成されているためです）。

```shell
pip install tensorflow-gpu==1.14
```

3、独自のデータセットを作成します。6200枚の画像を使用することをお勧めします（TrainA（DomainA）：3000、TrainB（DomainB）：3000、TestA（DomainA）：100、TestB（DomainB）：100）。元のプロジェクトのselfie2animeデータセットにはこの量の画像があるためです。画像のサイズは重要ではありません。UGATITutilsは自動的に画像のサイズを変更します。データセットディレクトリを作成し、その中にドメインごとにディレクトリを作成します。

<img width="553" alt="スクリーンショット 2020-06-24 7.47.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/126eef97-1b11-ec4e-3256-bc83e426e1f1.png">
データセットのディレクトリ名を指定します（例：“ selfie2anime”）。そして、データセットディレクトリをUGATITディレクトリに配置します。

4、trainスクリプトを実行します。“ — dataset”引数で独自のデータセット名を指定する必要があります。

```python
python main.py --dataset your_dataset_name --phase train
```

トレーニングが始まり、途中結果画像とチェックポイントが出力されます。

Any question?

Twitterフォローしてくださいお願いします！
https://twitter.com/JackdeS11
VSCode：LiveServer：Multi-root Workspacesでのrootの設定

# 0. 前提

- [Multi-root Workspace](https://code.visualstudio.com/docs/editor/multi-root-workspaces)で、１つのWorkspace内に複数のプロジェクトフォルダを格納している。

- 例えば、以下のように、フロントとバックのプロジェクトフォルダをworkspaceフォルダに格納。（以下では、ビルドフォルダは非表示設定にしている。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/c273e748-d24b-0f50-d065-9504e3b532bc.png)

- [ワークスペース名].code-workspaceファイルには以下のようにプロジェクトフォルダを記述。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/0860dad6-6d7a-93bc-e780-2640a88bde43.png)



# 1.Muti Root Workspac内の対象となるプロジェクトフォルダ名設定

- 「File > Preference > workspace > settings」を開く。
- Muti-root Workspace内で、LiveServerで表示したいソースがあるプロジェクトディレクトリ名を記入。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/df48bd12-1932-d214-e1cc-a6e8a822c0c9.png)


# 2.プロジェクト内のrootディレクトリを設定

- settingsの「Root」セクションの「Edit in settings.json」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/d4d25a43-1eb0-3bca-68f9-187d8763c163.png)

- 「liveServer.settings.root」にプロジェクトディレクトリをトップとして、サーバのRootディレクトリを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/fffb0411-21af-cd7a-746b-dd04a50cac74.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/390283c4-67bc-b255-0429-6f1ed15d004b.png)

- 上記で設定したフォルダをルートとしてサーバが起動する。

以上
fish shell + anyenvでのGo開発環境構築

fish shell + anyenvというパターンでのGoの環境構築の記事がなかったので、備忘録としてまとめます。

実行バージョン
- `fish 3.0.2`
- `anyenv 1.1.1`

# anyenvでのgoenvのインストールと設定

まずanyenvでGoのバージョン管理システムのgoenvをインストールします。

```bash
$ anyenv instal goenv
```

そして、goenv用の環境変数やaliasの設定をfish shellの設定ファイル`~/.config/fish/config.fish`に追記します。この部分がzshやbashとは違うので注意です。

```bash
set -x GOENV_ROOT "$HOME/.anyenv/envs/goenv"
set -x PATH $PATH "$GOENV_ROOT/bin"

set -gx PATH "$GOENV_ROOT/shims" $PATH
set -gx GOENV_SHELL fish
source "$GOENV_ROOT/libexec/../completions/goenv.fish"
command goenv rehash 2>/dev/null
function goenv
  set command $argv[1]
  set -e argv[1]

  switch "$command"
  case rehash shell
    source (goenv "sh-$command" $argv|psub)
  case '*'
    command goenv "$command" $argv
  end
end
```

これで準備は出来たのでfish shellを再起動して、goの指定バージョンをインストールしましょう。

```bash
# インストール可能なバージョンを取得
$ goenv install --list

# 指定バージョンのインストール
$ goenv install 1.14.3

# デフォルト利用バージョンを指定
$ goenv global 1.14.3
```

一応`go env`で環境変数を出力して各種設定が正しく出来ていることを確認しましょう。

```
$ go env
```

無事出力されれば完了です。:tada:


# VSCodeでの設定
VSCodeでのGoを開発する場合は以下エクステンションをインストールします。

[Go with Visual Studio Code](https://code.visualstudio.com/docs/languages/go)

anyenv利用の場合は環境変数が通常と異なり、このままでは動作しないのでVSCodeの`setting.json`に以下を追記します。

`go.gopath`は`go env | grep GOPATH`の値、
`go.goroot`は`go env | grep GOPATH`の値です。

```json
"go.gopath": "/Users/<ユーザー名>/go/<Goバージョン名>",
"go.goroot": "/Users/<ユーザー名>/.anyenv/envs/goenv/versions/<Goバージョン名>"
```

最後go関連の各種ツールをインストールします。
補完やデバッグ関連に必要です。

`command + shift + p`でコントロールパネルを開き、`Go: Install/Update tools`を選択します。
ダイアログが開くので全てチェックを入れてOKでインストールが始まります。

<img width="770" alt="スクリーンショット 2020-06-02 21.15.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/fc3176ba-0603-270b-5200-06313782c061.png">


VSCodeでのGo開発環境構築も完了です。:tada:



# 参考

https://gist.github.com/patorash/b5a1033c08d2c4df103457866b2dcaa2
汎用ポインタ(void *)の使い方

# 汎用ポインタ(void *)とは
ポインタ(*)型でのみ使用できる、void型の変数のこと。
CやC++などの標準ライブラリで見られる。

汎用という単語の通り、**あらゆるポインタ型に変換可能。ポインタ型であればどのような型でも受け取ることができる。**

char*型やint*型と異なり対象のサイズがないので用途に応じてキャストして使う。

### C 標準ライブラリでの使用例
#### 1. memcpy
srcの先頭からlenバイト分をdestへコピーする関数。
引数のdestとsrcはvoid*型であり、関数内でchar*型にキャストされる。

```C:memcpy.c
void *memcpy(void *dest, const void *src, size_t len)
{
    char *d_cpy;
    const char *s_cpy;

    d_cpy = (char *)dest; //char*型にキャスト
    s_cpy = (const char*)src; //const char*型にキャスト
    while (len--)
        *d_cpy++ = *s_cpy++;
    return (dest);
}
```

#### 2. memchr
srcの先頭からlenバイト分検索し、文字chがある位置のポインタを返す関数。
引数のsrcがconst void*型であり、関数内でconst char*型にキャストされる。

※const: 中身を書き換えられたくない値に対して書き込み禁止とする修飾子

```C:memchr.c
void *memchr(const void *src, int ch, size_t len)
{
    const char *src_cpy;
    int        count;

    src_cpy = (const char *)src; //const char*型にキャスト
    count = 0;
    while (len--)
    {
        if (src_cpy[count] == ch)
            return ((void *)&src_cpy[count]);
        count++;
    }
    return (NULL);
}
```

C標準ライブラリのmem-関数では、**メモリそのものを処理対象とする**ため、あらゆる型に対応できるよう汎用ポインタ(void *)型が用いられる。

その特性上、mem-関数は

- strcpy関数のように戻り値のポインタの終端にnull('¥0')を付与することはない(返すのは文字列ではなくメモリ領域だから)
- srcの途中にnull('¥0')が含まれていてもコピーや検索を中断しない。

#汎用ポインタ(void *)のメリット
- あらゆる型を出入力に使うことができる
- ポインタの参照先の型が見えないようにすることでメモリアクセスを制限する
Chrome拡張機能「Link to Text Fragment」動作確認

ちょっと便利な機能。ページ内リンクが有効になるブラウザが限定なのがおしい。

○: リンクページ内に移動する。
×: リンクページ内に移動しない。

○ PC Chrome・新Edge
× PC FireFox
○ Android Chrome
× iphone Safari・Chrome

Webページの特定のテキストにリンクを張れるChrome拡張機能、Googleが公開 - ITmedia NEWS
https://www.itmedia.co.jp/news/articles/2006/19/news109.html
php アルゴリズム備忘録

## 文字列の切り出し

任意の文字列とその文字列の「**何文字目**」から「**何文字**」取得するかをプログラムする構文

``` php:hoge.php
<?php 
  $X = fgets(STDIN); 
  $Y = fgets(STDIN);
  echo substr($X, 0, $Y) . "\n";
?>
```

#### substr関数
文字を切り出す関数 

substr(任意の文字列、　X文字目から、　Y文字切り取る)　

## 絶対値取得

#### abs関数

``` php:hoge.php
<?php 
  $num = fgets(STDIN);
  echo abs($num), PHP_EOL;
```

## 標準入力

```php:hoge.php
$input=explode(' ',trim(fgets(STDIN)));
echo $input[0];
echo $input[1];
echo $input[2]; .............
```

自動的に配列に入れてくれる

## 大文字から小文字に変換

#### strtoupper関数
[string] [to] [upper]ね、、読みづら、、、、

```php:hoge.php
<?php
  $str = trim(fgets(STDIN));
  echo strtoupper($str) . "\n";
?>
```
(自分用)Flask_ex(templatesとstatic)

# 項目
1. FlaskでテンプレートHTMLを使えない!→`templates`
2. FlaskでテンプレートHTMLに書いた画像が表示されない!→`static`
3. FlaskでテンプレートHTMLに対応したCSSが動作しない!→`static`
4. Flaskでtxtデータ使いたいのに見てくれない!→`static`

# 1.FlaskでテンプレートHTMLを使えない!
- 作業pyファイルと同格の場所に`templates`ってフォルダを作ってテンプレートHTMLを全部そこにぶち込むんだ!

# 2.FlaskでテンプレートHTMLに書いた画像が表示されない!
- 作業pyファイルと同格の場所に`static`ってフォルダを作って画像系全部そこにぶち込め!(参照する時に`/static/staticのなかにフォルダあるならフォルダ名/イメージ名`ってするの忘れずに)

# 3.FlaskでテンプレートHTMLに対応したCSSが動作しない!
- 作業pyファイルと同格の場所に`static`ってフォルダを作ってCSSも全部そこにぶち込め!(上と同じ)

# 4.Flaskでtxtデータ使いたいのに見てくれない!
- 作業pyファイルと同格の場所に`static`ってフォルダを作ってtxtも全部そこにぶち込め!(上と同じ)
【Python】Flaskで静的ディレクトリを追加したい【static以外も使いたい】

#結論

```python
# coding: utf-8
from flask import Flask, Blueprint

app = Flask(__name__)

#静的ディレクトリの追加
add_app = Blueprint("images", __name__, static_url_path="/images", static_folder="./images")
app.register_blueprint(add_app)

if __name__ == '__main__':
    app.run()
```
オンライン授業にPython+Seleniumで自動出席したい！

# オンライン授業に自動で出席したい

> **2021/3/6追記**
> [MacでSelenum+PyautoGUIを使ってZoomに自動出席](https://qiita.com/LemniscaterN/items/d137d8b0a0bb7b8af7c5)できましたが、こちらの記事はSeleniumのみの挑戦として残しておきます。


今時、多くの学生がオンライン授業を受けていると思います。

出席確認が、「Zoomミーティングに参加してる」だけのオンライン授業なら、自動出席のコードを書けないかと考えた訳です。

念の為に補足しておきますが、**ネタです**。当然ですが、**授業はちゃんと受けましょう！**笑

さてさて、本題。

やりたいことは「**授業時間前にZoomのミーティングに参加する**」、「**授業時間終了間際にミーティングから退出する**」、この2点。

時間に関しては、sleepとかを使えば何とかなりそう。
問題は**どうやってミーティングに入るか**。

Zoomはブラウザからミーティングに参加出来るので、参加自体はブラウザ操作が出来れば何とかなりそうな気がします。

## 事前準備
ブラウザ操作って事で、Python+seleniumを使います。
seleniumは初めてですが、Youtubeにあった[PythonでのWebスクレイピングチュートリアル動画](https://www.youtube.com/watch?v=LgZ8Li97yoM&t=1595s)でさらっと学習。

ちなみにMac、Anaconadaはインストール済、Python 3.7.4です。
JupyterLabを使いましたが、使わなくてもいけます。

使い方が大体分かったところで、自分がZoomのホストになり、テスト用のミーティングを開始、URLを取得しておきます。

ひとまず、seleniumをインストールしてURLを開いてみます。

```test.py
#インストール出来ていない場合はインストールします
!pip install selenium

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.implicitly_wait(3)

browser.get("Zoomのテスト用ミーティングURL")
time.sleep(5)
```

無事に開けました。

ミーティングID等と一緒に下記の文章が表示されます。
「If you have Zoom Client installed, **launch meeting**. Otherwise, **download and run Zoom**.If you cannot download or run the application, **join from your browser**.」

ブラウザでZoomに参加しようとすると、reCAPTCHA(bot対策)に阻まれるのでインストール済みのZoom起動を目標にします。

Chromeなら右クリック「検証」から、「launch meeting」のfullXpathを取得します。
あとはxpathで要素を指定してクリックします。

```test.py
PATH='/html/body/div[2]/div/div/div/div/div[2]/h3[1]/a[1]'
launchButton = browser.find_element_by_xpath(PATH)
time.sleep(3)
launchButton.click()
```

実行すると、「zoom.usを開きますか？　キャンセル　zoomを開く」
といったポップアップが表示されました。

確認ポップアップ(Confirm)っぽいのでswitch_to.alertで何とかなりそうです。

>[JavaScript alerts, prompts and confirmations](https://www.selenium.dev/documentation/en/webdriver/js_alerts_prompts_and_confirmations/)



```test.py
alert = browser.switch_to.alerttext = alert.text
alert.dismiss()
```
実行すると
Message: no such alert
ぬぬ？？

## ポップステップアップ

色々確認＆調べてみたら、Seleniumが操作出来るのはJavaScriptsのポップアップのみで、表示されているのはシステムダイアログの模様。

そして、[システムダイアログはSeleniumで操作出来ない](https://stackoverflow.com/questions/42753959/selenium-python-interact-with-system-modal-dialogs)との記述を発見。

なら、システムダイアログを表示しないように設定すれば良いじゃん。
って事で、[Chromeで外部アプリ起動時の確認画面を非表示にする方法](https://blog.asial.co.jp/1712)を参考に外部アプリ起動時のダイアログを省略するように設定。

```
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool true
```

一旦、自分でブラウザを操作して、次回以降ダイアログを表示しないように設定、再びSeleniumで実行。

失敗。
「次回以降は省略しますか？」と聞かれてしまう。。
Seleniumで開いたウィンドウではZoomのページを初めて訪れるから、かなぁ。

## 結論
Chromeの代わりにSafariを使ったりしてみましたが、同様のシステムダイアログに阻まれました。
思うように出来ませんでしたが、seleniumを初めて使ったこともあり、なかなか良い勉強になりました。
とりあえず、一つ言えることは「**授業はちゃんと出席しましょう！!**」
以上。
（ちなみに今は朝の4時過ぎ。授業がぁ。。。）

###追記
Chromeの設定を弄って、外部アプリ起動時の確認画面を非表示にしました。
が、セキュリティ的にちょっと不安なので直します。

```
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool false
```

と実行しても、非表示のままでした。
実行後、Chromeを終了して、開き直したり、Cookies削除したりしていたら戻りました。一安心。
PowerShellでログ探索するにはSelect-Stringで気合を入れる

## 大量のログファイル探索

大量のログファイルから情報を調べようとすると面倒くさい。  
例えば、以下のようなディレクトリ構成になっていて延々と毎日積み重なっていくものとする。

[![Image from Gyazo](https://i.gyazo.com/5867394ba51f67b9519fafc5925fba35.jpg)](https://gyazo.com/5867394ba51f67b9519fafc5925fba35)

このうちの、数千行に渡るA.logの中から"Start"と"End"の行の入ったログを調べるという作業をしたとする。実際の業務では、もう少し多数のパターンで調べているので更に頭を悩ませているのだが...。

Linuxであれば、grepやawkなどでテキスト探索や加工などできるが、Windowsの場合だとどうするか、というところ。

PowerShellでやってしまおうじゃないか、なあ？

## Select-String

PowerShellでテキスト探索をしようとする場合には、[Select\-String](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-7) コマンドレットを使うのが容易い。

仮に、root中にある日付ファイルからServerXとServerYの双方のディレクトリにあるA.logの中にある、「start」から始まる行と「end」から始まる行を抽出したいとする。

```PowerShell
Set-Location C:\root
Select-String -Pattern "(^start .*$|^end .*$)" -Path .\20200624\Server[XY]\A.log
```

### 実行結果

では、実際に試してみる。適当なランダムファイルに意図的に、start行とend行を加えたテキストファイルを作成。なお、一つのファイルには8000行のファイルを作成した。

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

こんな感じ。目が痛くなる。まあ、それでもいちいち開いて、検索とすればできなくはない。ただ、コマンド一発でやりたいじゃないか。

ということで、コマンドを打ってみた。

```PowerShell
PS C:\root> Select-String -Pattern "(^start .*$|^end .*$)" -Path .\20200624\Server[XY]\A.log

20200624\ServerX\A.log:116:start tjl7LG#[xz%>y4t2x6E0Fg>uyg(|&l#Y6RF%C:wdH&tXuSXT8}sLg%khqwiDpQ0XBkMBvv|Lqpt(z.(2^(Hvd5>1EUY0r%wfPB
20200624\ServerX\A.log:6100:end cRdEjo]a*eN7Xgxr@y5a}t|DG*dtmySBw4PbJraH/p5Uhn#_gfnrB9G%BQbk8u/k40AD(]GCiW^urCob+7yFin)S%pWV1]ba;yA 
:fz+u*mDC|*4fK1J@m2vhEf7z
20200624\ServerY\A.log:116:start tjl7LG#[xz%>y4t2x6E0Fg>uyg(|&l#Y6RF%C:wdH&tXuSXT8}sLg%khqwiDpQ0XBkMBvv|Lqpt(z.(2^(Hvd5>1EUY0r%wfPB 
-F2quC+P1kZv7$7[jq;08$_7
20200624\ServerY\A.log:6100:end cRdEjo]a*eN7Xgxr@y5a}t|DG*dtmySBw4PbJraH/p5Uhn#_gfnrB9G%BQbk8u/k40AD(]GCiW^urCob+7yFin)S%pWV1]ba;yA 
:fz+u*mDC|*4fK1J@m2vhEf7z
```

このように、ファイルパス:行数:文字列といった表示がされる。

### 実行時間

実行時間は、約0.66秒であった。

```PowerShell
PS C:\root> Measure-Command {  Select-String -Pattern "(^start .*$|^end .*$)" -Path .\20200624\Server[XY]\A.log }

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 66
Ticks             : 660679
TotalDays         : 7.64674768518519E-07
TotalHours        : 1.83521944444444E-05
TotalMinutes      : 0.00110113166666667
TotalSeconds      : 0.0660679
TotalMilliseconds : 66.0679
```

## 応用など

8000行をわざわざ目を通すよりも遥かに楽なのは言うまでもない。応用して、その月のすべてのServerXのB.logのstartとendを調べるなどもできる。サーバー内のディレクトリ構成さえ決まっているならばいろいろな探索ができるだろう。

```PowerShell
Set-Location C:\root
Select-String -Pattern "(^start .*$|^end .*$)" -Path .\202006..\ServerX\B.log
```

## 文末

感想・コメントなど書いていただけると嬉しいです

twitter [ねこ \(@gat3ta\) / Twitter](https://twitter.com/gat3ta)
【感想】Vue.js & FirebaseでTwitterライクなSNSアプリを作ろう

## はじめに

- 今回、私が学習に使用した教材はこちらです。教材提供サイトはこちら[Techpit](https://www.techpit.jp/)です。

- [Vue.js & FirebaseでTwitterライクなSNSアプリを作ろう](https://www.techpit.jp/p/vue-js-firebase-twitter-like)

※有料です。

## 開発環境

- Vue.js

- Node.js

- Firebase

## 今回作ったもの
- Twitterのようにユーザーが投稿できるSNSのようなものを実装しました。
![SNS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594117/d525de81-699b-45d7-f548-d2516ad62a99.png)

- 教材の通りにデプロイまで完了しています。

## 感想
- Googleアカウントでのサインイン
- 投稿の新規作成、リスト表示、更新、削除です。

上記の2点が機能として今回この教材で実装でき、それらについて学ぶことが出来ます。
要するにCRUDの実装とGoogleアカウントを用いたユーザー登録ですね。

個人的にはこういう個人開発に近しいものを「いざ作ろう！」となっても開発するのってすごくハードルが高いと思っていて、このようなアプリが教材形式で学ぶことが出来るのは最近始めた初学者の方や今回だとフロント周りを軽くしか触っていない自分とかにはハードルが下がってとても良いと思うんですよね。

開発の流れやこの機能を実装するにはどうしたらいいだろう？とか考えたり、その教材で使用する技術について勉強になりますし良いことしかないと思います。

正直な話自分がプログラミングを勉強し始めた時ぐらいにこういう教材などがあって気軽に学べてデプロイまでできるような環境があったらもっとフロント周りをゴリゴリやって開発していた気がします。(笑)

今からでも全然遅くないとは思っていますが。

教材を作って頂いた製作者の方やこのサイトを運営されてる方に見られるか分かりませんが、このような環境と教材を提供していただいて感謝しています。

## 最後に
自分は普段はインフラ・クラウド・セキュリティの方面を主に勉強していてフロント周りは軽く触ったことがあるくらいだったのですが、特に問題もなく教材通りに学びながら1日かからずにデプロイまで出来ました。(普通は時間をかけてゆっくりやるものだと思いますが、自分はサクサクやっていたのであまり参考にはならないかもしれません。)

今後もTechpitで学んだことを感想としてアウトプットしたり、自分が普段やってる方面のことなどをアウトプットしていきたいと思っています。

暇な時に流し読みでも記事を読んでいただけたらと思っています。(笑)
Google広告 認定資格取得備忘録

Google広告の各種認定試験を取得したので記録を残しておくだけのエントリ。
以前はGoogle Adsの各種試験の中から2つに合格すると資格取得が認定されていたようですが、2019年頃に改訂されたようです。現在はそれぞれが独立した資格になっています。
私は検索広告、ディスプレイ広告、ショッピング広告の3つを取得しました。

#試験について
種類：検索広告 / ディスプレイ広告 / ショッピング広告 / 動画広告 / アプリ広告 / 広告の測定
試験時間：各75分
問題数：各46~70問 (選択式)
合格ライン：80%以上
受験料：無料
受験形式：オンライン
有効期限：1年間
※不合格の場合は24時間待てば再度受験可能

#勉強方法
[Google Skillshop](https://skillshop.exceedlms.com/student/catalog/browse)にて学習。
ひたすら内容を順に読んで理解度チェックを繰り返す。

#勉強時間
各1~5時間程度
それぞれ内容が被る部分もあるので、数を重ねると勉強時間も少なくなっていきます。

#感想
理解度テストからもそのまま出るので、最低でも理解度テストは完璧にしておくこと。
何度でも再受験できるので、一通りコースを受講し終えたら一旦受験してみると良いと思う。
受験後に表示されるのは正答率のみで、どの問題を間違えたかはわからないのが難点。

例え普段の仕事に直接関わる内容ではなくても、普段目にするGoogle広告がどのような仕組みになっているのかがわかって面白いと思う。
functools.wraps

#functools.wraps使う場合

```py
import functools


def d(f):
    @functools.wraps(f)
    def w():
        """Wrapper docstring"""
        print('decorator')
        return f()
    return w


@d
def example():
    """Example docstring"""
    print('example')


print(example.__doc__)  # Example docstring
```
##functools.wraps使わない場合

```py
import functools


def d(f):
    #@functools.wraps(f)
    def w():
        """Wrapper docstring"""
        print('decorator')
        return f()
    return w


@d
def example():
    """Example docstring"""
    print('example')


print(example.__doc__)  # Wrapper docstring
```
RubyでBlackJack-cliを作ってみた感想とか

Qiitaでこんな記事を見つけたので、BlackJackをRubyで作ってみました。
[プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし | Qiita](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)



![blackjack_ruby_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285374/7faba8db-bc50-1cb9-b2f4-8817bb963211.gif)




感想としては簡単なゲームを作るだけですが、とても楽しかったです。BlackJackを作ってみてゲーム以外にも色々作れそうな気がしたのでもう少しBlackJackのコードを変えながら遊んでみてから次何を作るか考えようかなと思ってます。
<br>

全てのコードはGithub上に上げているのでこちらから確認できます
[BlackJack Ruby | Ryutaro - Github](https://github.com/Ryutaro95/BlackJack_Ruby)

## ブラックジャックのルール

ブラックジャックのルールについては、[こちら](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)の記事に書かれているルールを基準に作成しました。


> - 初期カードは52枚。引く際にカードの重複は無いようにする
> - プレイヤーとディーラーの2人対戦。プレイヤーは実行者、ディーラーは自動的に実行
> - 実行開始時、プレイヤーとディーラーはそれぞれ、カードを2枚引く。引いたカードは画面に表示する。ただし、ディーラーの2枚目のカードは分からないようにする
> - その後、先にプレイヤーがカードを引く。プレイヤーが21を超えていたらバースト、その時点でゲーム終了
> - プレイヤーは、カードを引くたびに、次のカードを引くか選択できる
> - プレイヤーが引き終えたら、その後ディーラーは、自分の手札が17以上になるまで引き続ける
> - プレイヤーとディーラーが引き終えたら勝負。より21に近い方の勝ち
> - JとQとKは10として扱う
> - Aはとりあえず「1」としてだけ扱う。「11」にはしない
> - ダブルダウンなし、スプリットなし、サレンダーなし、その他特殊そうなルールなし
> 


<br>

## 悩んだところ
- 用意するクラスについて
- インスタンスメソッドまたはクラスメソッドどっちにするか
- データをどこで保持させるべきか（山札や手札など）


<br>

### 用意したクラス
次の6つのクラスを作成しました。
それぞれのクラスの役割は次になります。

```ruby
# カードNumberとダイヤやハートなどのマークをそれぞれ配列で用意するクラス
class Card

# 用意したカードから山札を作成してシャッフルするクラス、Cardクラスを継承している
class Deck < Card

# プレイヤーとディーラーのスーパークラスでそれぞれの共通処理をするクラス
class PlayerBase

# プレイヤー専用の処理を作成している、PlayerBaseを継承している
class Player < PlayerBase

# ディーラー専用の処理を作成している、PlayerBaseを継承している
class Dealer < PlayerBase

# ゲームの進行に必要な処理や手札や山札などのデータを保持するクラス
class BlackJack
```

プレイヤーとディーラーで共通する処理が多かったため`PlayerBase`というスーパークラスを作成することでメソッドの使い回しができるようになり楽に進められた気がします。

<br>

### インススタンスメソッドまたはクラスメソッドにすべきか

これについてもめちゃくちゃ悩んで「ruby インスタンスメソッド クラスメソッド　違い」みたいなことを何回もググりました。

結果的に「基本的にはインスタンスメソッドで作成して、ちょっとインスタンスメソッドだと使いづらいかな？と感じたところはクラスメソッドにしよう」という少し抽象的な判断で決めています。

<br>

**クラスメソッド**例

```ruby
class Card
  class << self
    def numbers
      no = [1, 2, 3, 4, 5, 6, 7 ,8 ,9 ,10, 11, 12, 13]
    end

    def suit
      suit = ["ダイヤ", "ハート", "クラブ", "スペード"]
    end
  end
end
```

**インスタンスメソッド**例

```ruby
class PlayerBase

  def create_hand(deck)
    deck.pop(2)
  end
# .
# .
# .
```


### 手札や山札などのデータをどのクラスで保持するべきか

データの保管場所が一番悩んだところです。当初は「プレイヤーの手札だからPlayerクラスで、ディーラーの手札だからDealerクラスで管理しよう。山札に関しては共通のものだからPlayerBaseクラスだよね」と思ったのですが、進めていく途中でインスタンスを生成した際に2つの山札が作られてしまうなど色々面倒なことが多かったので、BlackJackクラスで全てのデータを保持する方針で決まりました。


<br>


## 詳細なコード説明

詳細なコードの説明はまた別で記事にしようと思います。今回は感想や苦労したところを書いてみました。

<br>
PRML　演習問題 5.10 （基本）

## 問題

> 固有方程式 (5.33) を持つヘッセ行列 $\mathbf{H}$ を考える。全ての固有値が正であるとき、またそのときに限り $\mathbf{H}$ は正定値であることを示せ。


## 方針
基本的には、教科書本文に記載のある、以下の式などを用いて証明します。

```math
\begin{align*}
\mathbf{H u}_{i}=\lambda_{i} \mathbf{u}_{i}
\tag{5.33}
\end{align*}
```

```math
\begin{align*}
\mathbf{u}_{i}^{\mathrm{T}} \mathbf{u}_{j}=\delta_{i j}
\tag{5.34}
\end{align*}
```

```math
\begin{align*}
\mathbf{v}=\sum_{i} c_{i} \mathbf{u}_{i}
\tag{5.38}
\end{align*}
```

(5.33)に示されている通り、$\mathbf{u}_{i}$ は $\mathbf{H}$ の固有ベクトルです。

$\mathbf{u}_{i}$ は、正規直交系であるため、（5.34）が成り立ち、

また(5.38)のように、任意のベクトル$\mathbf{v}$ は $\mathbf{u}_{i}$ の線形結合で表されることなどに注意します。


## 解答

(5.33)、(5.34)より、

```math
\begin{align*}
\mathbf{u}_{i}^{\mathrm{T}} \mathbf{H} \mathbf{u}_{i}=\mathbf{u}_{i}^{\mathrm{T}} \lambda_{i} \mathbf{u}_{i}=\lambda_{i}
\tag{1}
\end{align*}
```

$\mathbf{H}$ が正定値の時、

```math
\begin{align*}
\mathbf{v}^{\mathrm{T}} \mathbf{H} \mathbf{v}>0 \quad \text { for all } \mathbf{v}
\tag{5.37}
\end{align*}
```

が成り立つ。
この時、$\mathbf{v} = \mathbf{u}_{i}$ とすると、式(1)より、

```math
\begin{align*}
\lambda_{i}=\mathbf{u}_{i}^{\mathrm{T}} \mathbf{H} \mathbf{u}_{i}>0
\tag{2}
\end{align*}
```

よって、$\mathbf{H}$ が正定値の時、全ての固有値は正となる。

次に、全ての固有値が正である場合を考える。
この時、任意のベクトル $\mathbf{v}$ に対して、(5.33)、(5.34)、(5.38)より、

```math
\begin{align*}
\mathbf{v}^{\mathrm{T}} \mathbf{H} \mathbf{v} &=\left(\sum_{i} c_{i} \mathbf{u}_{i}\right)^{\mathrm{T}} \mathbf{H}\left(\sum_{j} c_{j} \mathbf{u}_{j}\right) \\
&=\left(\sum_{i} c_{i} \mathbf{u}_{i}\right)^{\mathrm{T}}\left(\sum_{j} \lambda_{j} c_{j} \mathbf{u}_{j}\right) \\
&=\sum_{i} \lambda_{i} c_{i}^{2}>0
\end{align*}
```

よって、固有値が全て正である時、$\mathbf{H}$ は正定値である。

以上より、題意は示された。
エンジニアがポートフォリオを作ったら、紆余曲折あってお仕事が貰えたはなし

# はじめに
元々クラウドワークスで副業をしていたのですが、
自分で仕事の受け口を作れば、マージンも取られないし、セルフブランディングにもつながるのでは...?と思い立ち、
実際にポートフォリオを作ってみたはいいけど、まったく閲覧数が伸びず、
それでも作り直したり、紆余曲折あって仕事が貰えるレベルになったという話です。

最初は自分でつくってみました
仕事ではメイン言語としてPHPを使っているので、
勉強もかねて、最近のモダンなJavaScriptフレームワークであるVue.js + netlifyで作ったのですが、結論から言うと惨敗でした。
公開から1カ月経っても閲覧がまったく伸びず...(1日当たり5件いかないくらい...?)、
ポートフォリオ経由で仕事が来る気配はありませんでした。

## ポートフォリオサービスが作れるサービスで作り直す事にしました
閲覧が伸びない敗因として、このように思っていました。
 1. **SEO対策に関する知識が不足している**
 2. **コンテンツが魅力的ではない(UI/UXの知識不足...)**

1番はネットで書いてある事をひたすら取り組んではみたのですが、効果があまり感じられず...、
エンジニア向けのポートフォリオサービスで作り直すことにしました。
私が調べて見つけたサービスです。

[Storynote | エンジニアのためのポートフォリオサービス](https://storynote.io/)
私が見た中で唯一、独自ドメインの設定とSSL証明書の発行が無料でした。また、ポートフォリオのデザインが細かくカスタマイズ出来たり、Qiitaの記事と連携出来るのが良かったです。

[Forkwell Portfolio - エンジニア向けポートフォリオサービス](https://portfolio.forkwell.com/)
Gitリポジトリを解析して、どの位コミットしているかだったり、どの言語を使っているのかが可視化できます。
プライベートでも何か作っていたり、オープンソースに積極的に貢献している人だと良いポートフォリオが作れそうです。
逆に、仕事用のGitアカウントしかない場合には、連携出来ないと思うので難しいかなと思います。


[ITエンジニア向けポートフォリオ作成サービス SPECH](http://spech.me/)
シンプルなデザインのポートフォリオです。指示に従って、スキルや担当業務を入力していくだけで簡単にポートフォリオが作成できるのが良かったです。
デザインはカスタマイズできるわけではないですが、手っ取り早くポートフォリオが作れるのは良いかと思いました。

これらのサービス全てでポートフォリオを作ってみましたが、（どれも無料です）
現在はStorynoteというサービスでポートフォリオを運用していて、ちらほらお仕事の相談を頂けるようになりました。
もしよかったら、私のポートフォリオを見てください。
React初心者が試行錯誤しながらサイト作ってみた（その1）

# つまずいた部分のメモ

## Material-UIはどうやってスタイル変えるの！？
パッと(これが原因で後でエラーが...)調べたところ`makeStyles`と`withStyles`が出てきた

今回は`makeStyles`を使うことにしました．

## makeStyles が使えない事件!!
早速使って見たら以下のエラーが，，，

```javascript:Header.js
const useStyles = makeStyles({
  title: {
    flexGrow: 1,
  },
});
export default class Header extends.React.Component() {
  render (){
    const classes = useStyles();//Error
    return (...);
  }
}
```

ちゃんと公式サイトで調べたら`makeStyles`はフックAPIだということが判明! <-- ちゃんと調べろ自分
というわけで関数コンポーネントに変更したらできました．

```javascript:Header.js
const useStyles = makeStyles({
  title: {
    flexGrow: 1,
  },
});
export default function Header() {
  const classes = useStyles();//OK
  return (...);
}
```
---
その他のスタイル変更

```javascript:Header.js
//style={{...: ...}}で各種変更可
<AppBar style={{ background: '#d1c4e9' }}>//AppBarの背景の色変更
<MenuIcon style={{ color: purple[800]}}>//MenuIconの色変更
//makeStylesを実際に適用
const useStyles = makeStyles({
  title: {
    flexGrow: 1,
  },
});
export default function Header() {
  const classes = useStyles();
  return (
     <Typography variant="h6" className={classes.title}>//適用
       Title
     </Typography>
  );
}
```
次はTeitterとGithubのアイコン表示や，メニューボタン押したら一覧が出てくる機能を追加してみます．
Font Awesome Pro版で、使うアイコンに絞ったjsファイルを作成する

# Font Awesome Pro版で、使うアイコンに絞ったjsファイルを作成する

投稿初心者です。fontawesome proのツールでこれがあっさりできたので、faのhelpに感謝しつつざっくりご紹介します。
2020年6月24日現在β版とのことです。

本稿執筆時点ではβのため、proのアカウント設定でBeta Features:をEnabledにするとダウンロードのメニューに「Font Awesome Pro Subsetter for Windows」 (または Mac)が出ますのでダウンロードしてインストールします。
windows,Macというのは生成ツールを動かす環境のことなのですね。

### 利用イメージ
画像を見たほうが早いと思うので・・・
ツールを起動した状態です。左側で使うアイコンを選択します。右側は選択済みのアイコンです。
![subsettool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118824/89b13023-9f38-b5cd-a91b-9e77d1363832.png)

右下の「Build ... Subset」ボタンで溜めたアイコンのzipファイルを作成します。中身はこちら。
![フォルダ一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118824/bf469c73-270f-f67e-048a-57291d9883e8.png)

jsフォルダの中身はこちら。
![js内ファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118824/73452562-e5c5-282f-4724-223f7cd56ee3.png)

今回選択したアイコンは108です。期待通り、小さくまとまることがわかりました。
今回絞り込みはGUIで選択しましたが、projectをsaveするとyaml形式のファイルで記録されていました。
ということはhtmlからアイコン名を自動抽出してprojectの定義ファイルを作成する、なんてこともできそうです。

```sample.yaml
projectName: 'C:\Users\xxx\sample'
version: 5.13.1
icons:
  - plus-square:
      - solid
  - address-card:
      - regular
      - solid
  - bookmark:
      - regular
  - check-circle:
      - regular
      - solid
 ```