OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】Cloud Firestoreのmap型で指定したプロパティのみを更新する

## はじめに
前回の投稿でもFirestoreの**map型**について書いたんですが、
今回はアプリからFirestoreの**map型**データの指定項目のみを更新する方法について、備考録として書きました。

■ 前回の投稿
[【Swift】Cloud Firestoreでmap型を取得するTips](https://qiita.com/lemonade_dot_log/items/f17472a0b40452800a6c)

## 動作環境
Xcode12.4 / iOS14.4

## Firestoreのデータ構造
Firestore内で定義したデータ構造は以下になります。
![FirestoreData.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/6e1ea81c-90b6-78dc-8d27-e1e13fd3cdb6.png)

## 今回の目的
map型の1つの単位は、`id`〜`price`までになりますが、今回は一番上のデータ（1）の`isOrderComplete: Bool`指定してそれだけを更新します。

## 実装
#### ソースコード
```swift
func updateOrderComplete(flag: Bool, completion: @escaping (_ succsess: Bool, _ _error: Error?) -> Void) {
        // まずは、更新対象のコレクションとドキュメントを指定
        let orderRef = db.collection("ordering").document("01")
        // map型の更新したいプロパティを[key].[property]という形式で指定する（詳細は解説に記載）
        orderRef.updateData(["1.isOrderComplete" : flag]) { _error in
            if let error = _error {
                // 失敗
                completion(false, error)
            } else {
                // 成功
                completion(true, nil)
            }
        }
    }
```
#### 解説
本題の解説の前に、Firestoreのmap型の構造を理解する必要があります。

| KEY | Value |
|:--|:--|
| 今回は「1」に該当する部分 | 更新対象の`isOrderComplete`を含め、<br>`id`〜`price`が格納されている部分|
map型の構造はこのような感じです。

今回のケースでは、`1（KEY）`の`isOrderComplete`を更新することが目的です。
map型の指定したプロパティを更新したい場合、Keyとプロパティの間を**ドット**で区切って指定することで実現できるようです。

以下、公式リファレンスを貼っておきます！
https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja#update_fields_in_nested_objects
Si-R G200でIPv6を使いたかった

# 環境
NTT系の通信でHGWを使用（ひかり電話契約）

# 結論
IPv6をブリッジすることで可能になる。
（おそらく当該機種はRAに対応していないため）

# 方法
今回は`lan0`にHGW、`lan1`にPCをつなぐものとします。

```
vlan 1 bridgegroup use on
vlan 2 bridgegroup use on
lan 0 vlan 1
lan 1 vlan 1
bridgegroup 0 ipv6 routing off
bridgegroup 0 ipv6 policy loose
```

解説になりますが、ただのVLANを使用したブリッジです。
一応、bridgegroupから`ip routing on`をする（初期状態）でv4のパケットはブリッジを通らなくなります。
初心者にもわかりやすくAuto MLを説明する

#1章：はじめに
## 記事の趣旨
ここ2〜3年の間に急激に一般化し、各種ハイバースケーラのクラウドプラットフォームにも取り込まれている技術に「Auto ML」があります。私も、DX関連のセッションなどで、「Auto ML」について説明させて頂く機会が多いため、その内容をまとめさせて頂きました。

#2章：「Auto ML」概要
##「Auto ML」とは
「Auto ML」とは、従来はデータ・サイエンティストが、統計処理ソフトウエアなどを用いて実施していた機械学習によるデータ予測を全自動で実施する技術です。まずは、これを理解するために、ビジネスにおける予測の変遷について説明します。ここでの予測とは、与信の審査（年齢、収入、勤続年数などからお金を貸してよいかどうかを決める）などをイメージしていただけるとわかり安いと思います。

（Step1）もっとも原始的な予測の方法は、人が頭をつかい、「勘や経験」、「過去の実績」に基づいて予測する方法です。原始的な方法といっても、いまでも多くのビジネスによる予測はこの方法がとられています。

（Step2）次のステップでは、人が数学・統計学の知識を用いて過去の実績データをもとに、予測モデルを作成する方法です。これを実施する人がデータサイエンティストであり、予測モデルのビジネス活用が機械学習活用やAI活用ということになります。この専門性を持っている人は限られているため、人材の争奪戦が起きており、新聞等でも人材難や給与の高騰の記事が出ていますよね。

（Step3）次の「Auto ML」であり、データサイエンティストが実施していた作業の多くの部分を自動化します。あくまでも、予測を自動化するだけであって、データサイエンスがやっている作業以上のことができるようになるわけではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/fa092890-b533-d79f-109b-e384d58012c6.png)


##予測の種類
データサイエンスを用いた予測には様々なものがありますが、2020年8月現在で「Auto ML」の対象となっているものは、「分類」と「回帰」です。「分類」とは、どのカテゴリに属しているかの予測です。（与信で例えると、お金を貸して良いか否かの判断などがあります。）「回帰」とは、数値の予測です。（与信の例で例えると、いくらまでお金を貸してよいかの提示などがあります。）「Auto ML」では、ユースケースをどちらかの命題に帰着させる必要があります。
※一部、ソフトウェアの最新の機能では時系列分析も一部対象となっていますが、今回は説明の対象外としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/86fc772a-1f84-898e-cb21-7b4f15db1e04.png)

##予測のプロセス
予測のプロセスとしては、予測の教師データとなる過去のデータを1枚の2次元データとして準備します。（複数データソースがある場合は、前準備として、1つにする必要があります。）そして、そのデータに対して、1つの予測したい項目（専門的な言い方では「目的変数」）とその値の変化に影響を与えていそうな項目（専門的な言い方では「目的変数」）を設定し、処理の実行を行います。（あとは、モデルが出来るのを待つだけです。）
処理が終わるとモデルが出来上がります。また、多くのソフトウェアでは、予測に対して、どの目的変数の影響高いか、また、作成されたモデルの精度はどのくらいなのかを教えてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/ced53aee-688f-afd8-715c-71c26dca330c.png)

##モデルの自動作成の仕組み
モデル作成に際しては、ハイパワーのGPUマシンの性能を駆使して、複数の予測モデルを作成・評価し、１番優秀なモデルを選出します。（下手な鉄砲も数打ちゃ当たる方式です。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/7c73e74f-54b3-1609-a86a-06ff2dd08084.png)

#3章：プレイヤー
実施にやってみたいと思った際に、どのようなプレイヤーがいるのかをざっと説明します。大きく分けて「ソフトウェア」と「クラウドプラットフォームでのSaaSサービス」に分類できると個人的には考えております。


##ソフトウエア
「Auto ML」のソフトウェアをライセンス販売しているプレイヤーです。最も有名なのは、「DataRobot」です。3〜4年前から既に日本市場に進出しています。アメリカでそれと双璧をなすのが「H2O社のDriverless AI」です。こちらは進出が遅れたため、日本での知名度は低めです。そのほか、NECからカーブアウトした「dotData」、Sonyが作る「PredictionOne」等があります。私の知る範囲では、三桁万円後半以上ののライセンス料が年単位で必要になります。

## クラウドプラットフォームでのSaaS
ここ1,2年でクラウドプラットフォームでの提供も開始されました。AWSの「SageMaker Autopilot」やGCPの「AutoML Tables」、IBMの「Watson Stuio Auto AI」などがあります。

## 違い（簡単に説明）
機械学習のアルゴリズムはオープンソースなので、「ソフトウェア」も「SaaS」も実施しているプロセスは変わりません。データサイエンティストがやっている細かな作業をどこまで手をかけて実施してくれるかに差がでます。SaaSは現状のレベル感だと、機械学習の初歩的な作業を自動でやってくれる程度のイメージです。（Pythonがかけて、ある程度の機械学習の知識がある人であれば同等のことができる。）

精度はという観点においては、命題となる問いの難易度により結果は違います。簡単な問いならば、「ソフトウェア」も「SaaS」も同じような精度になると思いますし、難しくなれば「ソフトウェア」が勝るでしょう。また、結果の評価の細かさなども、「ソフトウェア」の方が勝ります。

# 4章:やってみよう
なんとなくのイメージはついたと思うので、あとはやってみるが重要だと思います。

ここに関しては多くの方がチュートリアルを作成されているので参考にしてみてください。

https://qiita.com/dicekm-i/items/d44634e611df20bb88e2

https://qiita.com/bathtimefish/items/10f9e092d14c6b628db6

https://dev.classmethod.jp/articles/try-amazon-sagemaker-autopilot/
Vueのwatchで同時に複数の値を監視するTips

## はじめに
最近Vueを触ることがあって、面白いなと思ったので紹介します。Vueをあまり使い慣れていないので、書き方間違っていたらごめんなさい


## 実際の例

下のようにwatchで`hoge`と`fuga`という値を監視していて、それぞれが更新された時に同じ処理をする場合があります。

```vuejs
// hogeとfugaで同じ処理

watch: {
 hoge() {
  // 何らかの処理
 },
 fuga() {
  // hogeと同じ何らかの処理
 },
}
```

このとき、以下のようにして、2つの処理をまとめることができます。

```vue
computed: {
 hoge_fuga() {
  return `${this.hoge}_${this.fuga}`;
 }
},
watch: {
 hoge_fuga() {
  // 何らかの処理
 }
}

```

hogeとfugaのどちらかが変更されると、computedに定義した`hoge_fuga`が更新され、`hoge_fuga`をwatchで監視しているので処理が実行されます。
とても単純ですが、面白いなと思いました。


## 最後に
読んでいただきありがとうございます！少しでも役立ったら嬉しいです！
千石の1cm 4極2相ステッピングモーターでスケッチ

千石で1つ200円で売られているとっても小さいモータをArdiunoで動かしてみた。

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194223/d2dbc311-e4e6-db30-9000-038a8409eb14.jpeg)


モータはネット通販でも購入できます。

https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5P7G

このサイズで4極2相のステッピングモータ。

軸は1.5mm。最初から付いている歯車は、2mm軸でよくある歯車とはギアの刻みが合わない。抜けるかと思って頑張ったけどギアは抜けないので諦める。

![70A93279-C505-46A7-B8B1-79E977FF4FFE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194223/b4c20703-0950-e129-a80e-891566a759e4.jpeg)
![BD91C8C0-5AA3-4488-A975-451A8E4CA4AE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194223/b2b36740-b768-1aa3-333d-4a161787438f.jpeg)

ドライバは秋月電子で販売されているDRV8835を使いました。

モータには端子しか出ていないので頑張って半田付けします。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194223/fed32492-2a1a-6058-343a-0daec8a62b11.jpeg)

4極2相ということはわかっているので、上から
A1
A2
B1
B2
だろうと見積もってみる。

うまく配線が作れたら、何も考えずモータドライバの左側にそのままの順番で上から接続。

ドライバの右側は、先人のスケッチを参考に
11
10
9
8
と接続してGNDもArdiunoと繋いでおく。

懸案なのは、何Vで繋ぐか。5vだろうけど3vで最初やってみた。

スケッチの解説は省きますがこちらを参考に。
https://www.arduino.cc/en/Reference/Stepper

で動作させてみましたが、まぐれで1回目で動作しました。カリカリと音を出しながら60度刻みで回転しています。

3vでも問題ないようですが、負荷をかけていないので、実際のところは不明です。

発熱はそこそこあります。長時間の動作はできないのではと思います。
続create-react-app + electrion-forge @Windows

# はじめに

[昨日](https://qiita.com/uk-taniyama/items/bfde703088888c6eb168)の続きで、asarを制御する方法を調べてみた。
asarを指定すると、作成したファイルがapp.asarのファイルにまとめられる。
でも、中に入っているファイルがわからないから、ちょっと困る。
そこで、確認するためには、以下のいずれかの方法がある。

1. app.asarの中身を覗く。
2. asarの指定を動的に変更できるようにする。

## 1. app.asarの中身を覗く方法

node_modules/.binを覗いてみると、asarがCLIも提供しているみたいなので、それを調べてみると、以下のような感じでできる。

```sh
npx asar list <ファイル名>
```

今回の場合は、こんな感じで一覧が出てくる。

```sh
$ npx asar list out/electron-react-win32-x64/resources/app.asar
```

このため、以下のようにすると、package後に、ファイルが参照できる。

```json:package.json
  "run": {
    "forge:package": "cross-env FORGE_ASAR=false electron-forge package",
    "postforge:package": "asar list out/electron-react-win32-x64/resources/app.asar",
    ...
```

## 2. asarの指定を動的に変更できるようにする。

基本的に、electron-forgeの設定はpackage.jsonのconfig.forgeで指定する。

```json:package.json(before)
...
  "config": {
    "forge": {
      "packagerConfig": {
        ...
      },
      "makers": [
        ...
      ]
    }
  }
}
```

しかし、electron-forgeもご多分に漏れず、こんな感じで設定をjsファイルに外だしできる。

```json:package.json(after)
...
  "config": {
    "forge": "./forge.config.js"
  }
}
```
```js:forge.config.js
module.exports = {
  packagerConfig: {
    ...
  },
  makers: [
    ...
  ]
}
```

設定がjsファイルになってしまえば、あとは、process.env.XXXを参照するようにすれば、自由に変更することができる。
package.jsonのrun-scriptsにcross-envあたりで定義しつつ、electron-forgeを実行してあげればよい。
例えば、以下のようにする。

```json:package.json
  "run": {
    "forge:package": "cross-env FORGE_ASAR=false electron-forge package",
    "forge:make": "electron-forge make",
    ...
```
```js:forge.config.js
module.exports = {
  packagerConfig: {
    asar: process.env.FORGE_ASAR !== 'false'
  },
```

このようにすると、
```npm run forge:package```でパッケージを作ると、out/xxx/resources/app配下にファイルが格納され、
```npm run forge:make```でインストーラを作るときは、app.asarが作成されることになる。
Dart入門(2)

# Dartの変数と定数

## 型アノテーションとは

<font color="Red">注意：Null safetyについて記載なしです。</font>

DartはJavaやC言語のような**静的型付け**をする言語とは違い**型付けが任意**となっている。

型を明示するためには**型アノテーション**を利用する。利用しない場合は**型推論**される。

型アノテーションには

* コードが読みやすくなる
* コンパイラやエディタの静的分析による実行時エラーを減らすことができる

と言った利点がある。

正しく(考えて)利用することでこのDartシステムの恩恵を最大限受けることができる！

新しい単語で難しく思うかもしれないが、型名(クラス名)を書くだけなので`java` や`c言語`を知っていればそれほど難しくはないはず。

## 変数宣言

### 型アノテーションなし

型アノテーションなしでの変数宣言時には `var` キーワードを使用する。

```dart
// 構文
var 変数名 = 値;

// 例
var flg;
var n = 1.2;
var s = "strings";
```

### 型アノテーションあり

```dart
// 構文
型アノテーション 変数名 = 値;

// 例
bool flg;
double n = 1.2;
String s = "strings";
```

## 定数宣言

定数宣言時には `final` or `const` キーワードを使用する。

`final` と `const` の違いは以下のようになる

|`final`|`const`|
|:---:|:---:|
|値への参照が固定される|値自体が固定される(コンパイル時定数)|

### 型アノテーションなし

```dart
// 構文
final 変数名 = 値;
const 変数名 = 値;

// 例
final n = 1.2;
const s = "strings";
```

### 型アノテーションあり

```dart
// 構文
final 型アノテーション 変数名 = 値;
const 型アノテーション 変数名 = 値;

// 例
final double n = 1.2;
const String s = "strings";
```

## 型アノテーションはどのような時に使うの？

**型がわからない時**、**型を指定したい時**に使うと良い。

例えば

```dart
final String s = 'text';
```

この場合は右辺で文字列を代入していることから型アノテーションがなくても、変数`s`は`String`であることがわかる。
→ 型が簡単に推測できる場合は書く必要がない
→ `final`や`const`の場合はほとんど必要ないと言ってもいい(初期化時に判別できる)

ただ

```dart
final s = func();
```

のように、コード上に型のヒントとなる情報が少ない場合はあってもいいと思う。
ただこの場合、`func`定義時に戻り値に型アノテーションを使用していればエディタがサポートしてくれるので、なくてもコーディングにはあまり問題がない。
（あくまでも任意なので...あるといいよねって感じ）

---

参考リンク
[Dart型システム](https://dart.dev/guides/language/type-system)
Dart入門(1)

# Dartとは

2011年にGoogleから発表された[^1]オブジェクト指向のプログラム言語で、

* __任意型アノテーション__
* __Hot reload__
* __ネイティブコードやJavaScriptへのコンパイル__

と言った特徴を持つ。

JavaScriptの代替を目指して開発され、DartVMがChromeにも統合される予定だったが思ったように普及が進まなかったため断念。[^2]また、[TypeScript](https://www.typescriptlang.org/)がGoogleの標準言語として採用されたという少し悲しい経緯を持つ。[^3]

現在は主に[__Flutter__](https://flutter.dev/)フレームワークの言語としてアプリケーション開発に使われている。

## Dartによる開発のメリット

* 型付けにより実行時のエラーを減らし、可読性を高めることができる。
* 開発時と公開時で利用するコンパイラを分けることで効率よく開発ができる
* [Pub](https://pub.dev/)と呼ばれるパッケージ管理を利用することができる

### 任意型アノテーション

Dart1までは任意型付けの言語であったが、
Dart2からは強い静的型付けの言語となっている。[^4]

型アノテーション(と呼ばれる型orクラス名)をつけない場合は型推論により型が決まり、

```dart
// 型をつけない場合
main() {
  var a = 1;
  var b = 1.2;
  var s = 'strings';
}
```

つけるとc言語などと同じように静的に型を指定できる。

```dart
// 型をつける場合
void main() {
  int a = 1;
  double b = 1.2;
  String s = 'strings';
}
```

### コンパイラ

* 開発時にはデバッグやHot reloadといった豊富な開発サポートを可能としている。
* 公開時にはARMやx64といったネイティブコードに変換することでアプリの高速化が期待できる。

表にすると以下のようになっており、必要なコンパイラを利用する形になる。

||Dart native|Dart web|
|:---:|:---:|:---:|
|開発時|Dart VM (JIT compiler)|Dart development compiler|
|公開時|Dart AOT compiler|Dart to js compiler|

* [JITコンパイラ](https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)とは*Just-In-Time compiler*の略であり、JavaやJavaScriptなどがこの方式を利用している
* [AOTコンパイラ](https://ja.wikipedia.org/wiki/%E4%BA%8B%E5%89%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)とは*Ahead-Of-Time compiler*の略であり、cやc++などがこの方式を利用している

### Pub (package manager)

* パッケージとは他の開発者のプログラムを再利用できるようにまとめられたもの
* `pubspec.yaml`というファイルに記載し、パッケージを管理する
* [node.js](https://nodejs.org/ja/) (JavaScript) でいう`npm`である

例えば、アプリケーションで[email_validator](https://pub.dev/packages/email_validator)というパッケージを使いたい場合は`pubspec.yaml`に

```yaml
# 以下を追加
dependencies:
  email_validator: ^1.0.5
```

を追記し

```bash
$ pub get
```

とすることで、簡単にパッケージを導入することができる。

#### 注意：サーバサイド と クライアントサイド

Dartには__サーバサイド__用と__クライアントサイド__用のライブラリがあり、サーバサイドで利用できる機能がクライアントサイドで利用できないことがある。（目的が違うのでね...）

||サーバーサイドDart|クライアントサイドDart|
|:--:|:--:|:--:|
|ライブラリ|[dart:io](https://api.dart.dev/stable/2.10.5/dart-io/dart-io-library.html) など|[dart:html](https://api.dart.dev/stable/2.10.5/dart-html/dart-html-library.html) など|
|操作|端末のI/OのAPIなどにアクセス|ブラウザのDOMやAPIにアクセス|
|目的|ファイル操作など|シングルページWebアプリケーションなど|

[^1]: https://www.publickey1.jp/blog/11/dartjavascriptweb.html
[^2]: https://forest.watch.impress.co.jp/docs/news/1138315.html
[^3]: https://www.publickey1.jp/blog/17/typescriptdartgoogle.html
[^4]: http://www.cresc.ne.jp/tech/java/Google_Dart2/language/overview/overview.html
AWS IAM（AWS Identity and Access Managemment）とは


IAM とは AWS サービス間の認可をするための AWS ユーザーを管理するためのサービスだ。
このサービス自体はとっても地味だが、 AWS で何をするにも必ず関わってくるサービスなので、おさえておくと良い。

# IAM 利用イメージ

![iam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/50fa6cf3-248e-5c11-90d5-c65492abb580.png)

# IAM ベストプラクティス

### １）利用者ごとに IAM ユーザーを払い出し、IAM ユーザーを使いまわさない

CloudTrail 等で監査的なログを出力していても誰が何を使っているのか分からなくなってしまうため。

### ２）役割ごとの IAM グループを作成し、 IAM グループに権限を振る

IAM グループを活用することで、例えば、インフラ専用グループ、アプリ専用グループ等、用途によって分けることが望ましい。
これは、規模が大きくなればなるほど運用が楽になるメリットがある。
また、小規模の場合でも IAM ユーザー単位に権限を割り振ると権限の付け間違い等を防ぐことができる。

### ３）権限は必要最小限のものを割り当て、必要になったら増やす

権限は必要になったタイミングで付与するようにすることで事故を防げる。

### ４）定期的に棚卸しをする

使わなくなった権限は、定期的に削除する。
これも予期せぬ事故を防止するために実施する。

### ５）プログラムから利用する場合、アクセスキー、シークレットキーではなく IAM ロールを利用できないかを考える

クレデンシャルはプログラムに埋め込まない。
うっかりパブリックなところにソースコードごとアップロードしてしまうと事故危険あり。
なので、そもそもクレデンシャルは、ロールに代替できないかを検討するのが良い。
AWS 間の利用であれば、大抵の場合は IAM ロールで賄える。
中小企業が求人を出すことの苦労

#はじめに
企業にとって採用活動ほど、大変なものはありません。
一つの求人サイトに出すだけで数十万から百万単位の金額がかかります。
プランも様々で月額固定のものもあれば、成功報酬で年収の約30%のものあります。
その為、せっかく内定しても直前で辞退されたり、
離職されるとそれだけ損失が大きくなります。
採用は水物などとよく言われますが本当にその通りで、
どれだけ面接でいい人だと思った人でも、心の中までは読めません。
つまりはそういうことなのです。

##採用の基準はなにか
もちろん企業によって異なるが、共通して言えることは 

__いかに長くこの会社で活躍してくれるか__ 

という点です。
さきに述べた通り、どれだけ優秀でもすぐ辞められてしまっては意味がありません。
その為、応募者とのマッチングを選考の過程で見極める必要があります。

##マッチング成功のポイントは？
応募者とのミスマッチをできる限り減らす方法のうちの一つに__インターン__があります。
__インターン__の最大の利点は、__実務を通してスキルや能力、社風に合うか__を時間をかけて
じっくり見ることができる点にあります。応募者は実際にその会社で働くことで、__社内の雰囲気や仕事内容__をリアルに知ることができます。また、企業側は学歴だけではわからないその人本来の能力や人柄、性格を見ることができます。しかし、デメリットとして長期インターンになるとお給料の支払いが発生することです。逆に短期インターンですとお給料の支払いは発生しませんが、セミナーやワークショップ的要素が強くなりその人本来の能力を図ることが難しくなります。
体力と時間のある会社は長期インターンが断然おすすめですね。ただ、そうでない中小企業はどうするのか。

##中小企業が優秀な人材を採用する手段
インターンを開催する余裕がない我々、中小企業はどうすればいいのか。一番手取り早いのは、__ヘッドハンティング__です。他社に在籍する優秀な人材を、好条件でこちらに移籍させることができれば、手間も採用コストもかかりません。さらに、お互いのことをよく知っているのでミスマッチングも起こりにくいです。次に、こちらから__スカウト__をして積極的にアプローチすることでしょう。誰でもスカウトがくれば悪い気はしませんし、転職活動をしてる人は少なくとも現状に不満を持っているからだと思うので、こちらの求めるスキルとマッチしているならばバンバンスカウトしてみることが大切です。そして、実際に社内の雰囲気や仕事内容をみてもらい、条件のすり合わせでお互いが合意すれば確定です。芸能界も、スカウトによって埋もれていた一般人が大スターが生まれ変わったりしています。しかし、どれだけ能力が高くても社内の風紀を乱されたりされては困るので、スカウトした後はしっかりその人が__社風に合うかを見極める必要__があります。

##最後に
よくアメリカの就職活動は例に出されることがあります。
確かに、アメリカの就職活動制度には見習うべきものも多くあります。
ただ、そのすべてを日本でのそれに当てはめてはいけません。
たとえば、アメリカでは能力だけをみるので人柄なんてもは全然みません。
アメリカの経営者にクセが強い人が多いのがその証拠です。
しかし、それで成り立つのはそういうお国柄だからです。
日本でこんなことをすると、下に誰もついて来なくなり、結局なにもうまくいかなくなります。
日本では人柄も重要視されるのです。だからこそ、今の日本があるのです。
いいところは変化吸収し、変えるべきでないところはそのままにする。
そういう柔軟性がいまの日本には求められているのかもしれません。
EC2/ Linux Python3 pip3をインストール


#pip3のインストールログ
""
   sudo yum install python36-pip
   pip -V
   pip3 -V
   which pip3



   sudo yum --enablerepo=epel install python36-pip
   sudo yum --enablerepo=epel install python36-pip3
   pip3 -V
   sudo python3 get-pip.py 
    
   python3 -m pip list
   curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
   sudo python3 get-pip.py 
   pip3 -V
  ""
Amazon Linux 2 に MySQL 5.6 を入れる (2021年2月版)


MySQL5.6　が、EOL になったので、お客さんの本番サーバーを、アップグレードする前に、開発環境として、Amazon Linux 2 に mysql-56-community をいれる必要がありました。

その手順を書き残しておきます。

参考：Amazon Linux2にmysql-56-communityをいれる
https://qiita.com/sasanquaneuf/items/f392cd961d0b70d30fd8

ありがとうございます！
2年前の記事なので、今、やろうとすると、エラーになってしまいます。
最新版 MySQL 8.0 のレポジトリを利用する必要があります。

以下、参考記事を最新版にアップデートしたコマンド内容です。

```
## MySQL 8.0 のレポジトリをインストール
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
## MySQL のレポジトリリストを確認。mysql80-community/x86_64 が enabled になっているはず。
sudo yum repolist all | grep mysql
## yum-config-manager が使えるか確認。yum-ulils が入っていたらOK
sudo yum list installed | grep yum-utils
## MySQL 8.0 をインストールしないように設定
sudo yum-config-manager --disable mysql80-community 
## MySQL 5.6 をインストールするように設定
sudo yum-config-manager --enable mysql56-community
## mysql56-community/x86_64 がenabled になっているか確認
sudo yum repolist all | grep mysql
## MySQL 5.6 Server をインストール。（Client などもインストールされるはず)
sudo yum install mysql-community-server
```
アプリ開発実践入門4 Controllerとview レイアウト

今日の教科書

#レイアウトを作る

##レイアウトファイルについて
railsではアクションとテンプレートに<body>タグだけあればWebページを表示できる。
`application.html.erb`：デフォルトのレイアウト
`mailer.html.erb`：HTMLメールのレイアウト
`mailer.text.erb`：テキストメールのレイアウト

###application.html.erbについて

`<%= csrf_meta_tags %>`：CSRF対策のタグ。自動でレンダリング時に対策をしてくれるタグを生成する。
`<%= csp_meta_tag %>`：JavaScriptのセキュリティのためのタグをヘッダーに出力してくれる。
`<%= stylesheet_link_tag 'application', media: 'all',
   'data-turbolinks-track': 'reload' %>`：スタイルシート関連のタグを出力してくれる。ページそのもののスタイルシートと、アプリ全体のスタイルシートの両方を読み込む際に、必要な<link>タグを生成する。
`<%= javascript_pack_tag 'application', 'data-turbolinks-track':
   'reload' %>`：railsが必要とするJavaScriptのライブラリをロードするためのタグを生成する。
`<%= yield %>`：表示されるページの内容を出力する。<body>のなかにこれだけあればいい。

##メインのレイアウトを作ろう
新しいファイルを「コントローラ名.html.erb」で「layouts」フォルダ内に作る。
必要なソースコードを記述する。

###BootstrapのCSSのスタイルシートを使う
[HTML 外部リソースへのリンク要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/link)

`<link href="main.css" rel="stylesheet">`:<head>内に記述すると外のスタイルシートとリンクする。
現状、main.cssにはBootstrapへのパスを入れて読み込ませている。


###renderでヘッダー・フッター表示

ヘッダー部分に`<%= @title %>`を追加。
ボディにヘッダーとフッターの2つのテンプレートをレンダリングし出力するタグを追加。。
`<%= render template:'layouts/コントローラ名_header' %>`：ヘッダーの出力
`<%= render template:'layouts/コントローラ名_footer' %>`：フッターの出力
レイアウトフォルダ内のヘッダーとフッターのテンプレートを読み込み、出力。

##ヘッダー・フッターを作る
レイアウトフォルダ内に「コントローラ名_header.html.erb」のファイルを作成する。フッターも同様。
ソースコードを記述する。
HTMLテンプレートも修正しておく。
コントローラも修正。
ここで`layout`を記述。対応するコントローラで使用するレイアウトをを設定する値。横にコントローラ名を書くだけで
「layouts」フォルダ内のHTMLテンプレートがレイアウトとして使われる。「application」にすればそっちのテンプレートが使われる。
Dockerコンテナ名の変更方法

# Dockerコンテナ名を変更する方法
Dockerコンテナの名前を変更するには、下記コマンドで変更可能。

```shell
$ docker rename old_name new_name
```
old_nameには今のコンテナ名を、new_nameには新しいコンテナ名を記述。

### 実行例
hogeというコンテナの名前をpiyoと変更するには下記コマンドを実行。

```shell
$ docker rename hoge piyo
```
また、docker psコマンドにて名前変更を確認。
VRoid Studioの編集データ(.vroid)をPC間で共有する【Mac/Win】

# はじめに

[VRoid Studio](https://vroid.com/studio)を扱う時、通常はそれぞれのPCにデータが保存されています。ただ、「編集作業はWindowsでやって、撮影だけMacでやりたい」など、同じアバターを複数PCで参照/編修したい場合があったので、今回はその方法を紹介します。

なお、現時点のVRoid Studio（v0.13.1）では特に問題は発生していませんが、自己責任でお願いします。バージョン毎にフォーマットが変わる可能性や、OS毎に保存方法が変更される可能性もあるのでご注意ください。


# 環境

- macOS Catalina: 10.15.7（19H114）
- Windows 10

今回はMac-Windos間で共有していますが、Mac-MacでもWin-Winでも大丈夫です。


# 共有フォルダの準備

Win/Macそれぞれの環境からファイル共有ができる環境を用意してください。

ローカルネットワークでのファイル共有でもいいですし、DropboxやGoogle Driveなどのサービスを使っても構いません（私はDropboxでやりました）。

共有フォルダが用意できたら、共有したい編修データ(.vroid)を移しておきます。

Macなら`Users/[ユーザー名]/vroid`に、Windowsなら`C:\Users\[ユーザー名]\Documents\vroid`に入っているので、vroidというフォルダ毎もってきておいてください（ユーザー名の部分は適宜読み替えてください）。

# シンボリックリンクの作成

VRoid Studioでは編修データを読み込むディレクトリを編修できません。そのため、共有フォルダ内のファイルを直接参照することができないので、シンボリックリンクというOS標準の機能を使って解決します。

これを使うと、VRoid Studioデフォルトの編修データが入っているところにアクセスすると、実際には共有フォルダ内にアクセスさせることができます。VRoid Studioを騙して別の場所を読み込ませる、みたいなイメージです。ショートカットとは別のもので、手順が少し難しいです。

次にOSごとの設定をしていきますが、どちらからやっても大丈夫です。

## Windowsの場合

Windowsメニューを開き、コマンドプロンプトと検索します（数文字打つと出てくると思います）。右側の「管理者として実行」をクリックして起動します。許可が求められた場合は許可してください。

![EubFUPxVoAItAc_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/073d40b0-a5de-ff3b-645f-84d902134b27.png)

次にコマンドを打ち込んでいきます。注意事項を読んでから、下記のように入力してください。

- ユーザー名の部分は適宜読み替えてください。
- 今回は共有フォルダにDropboxを使っているので、他の環境の場合はそこも読み替えてください。
- フォルダ名にスペース等を含む場合は、パスを`""`で囲ってみるといい気がします。
- Documentsフォルダ以下にvroidフォルダが残っていると作成できません。削除するか、別の名前`vroid_`に変更してから実行してください。

```
mklink /D C:\Users\[ユーザー名]\Documents\vroid  C:\Users\[ユーザー名]\Dropbox\vroid
```

入力してエンターを押したら成功しているか確認してみます。Documentsフォルダを開いてみて、こんなアイコン付きのフォルダができていれば成功です。中身を開くと共有フォルダの中にアクセスできると思います。

![EubGxZPVkAQlTWV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/46262e06-0129-9653-405d-f339fc7d222a.png)

この状態でVRoid Studioを一度終了して、再度起動してみてください。共有フォルダに入れたアバターが一覧に表示されていれば成功です。

# Macの場合

ターミナルを開いき、注意事項を読んでから下記のように打ち込んでください。

- ユーザー名の部分は適宜読み替えてください。
- 今回は共有フォルダにDropboxを使っているので、他の環境の場合はそこも読み替えてください。
- フォルダ名にスペース等を含む場合は、パスを`""`で囲ってみるといい気がします。
- [ユーザー名]のフォルダ以下にvroidフォルダが残っていると作成できません。削除するか、別の名前`vroid_`に変更してから実行してください。

```
$ ln -s /Users/[ユーザー名]/Dropbox/vroid /Users/[ユーザー名]
```

入力してエンターを押したら成功しているか確認してみます。[ユーザー名]のフォルダを開いてみて、こんなアイコン付きのフォルダができていれば成功です。中身を開くと共有フォルダの中にアクセスできると思います。

![スクリーンショット 2021-02-17 20.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/7387e666-ff1b-eb0c-868b-6b7bcf0f395a.png)

この状態でVRoid Studioを一度終了して、再度起動してみてください。共有フォルダに入れたアバターが一覧に表示されていれば成功です。

# 最後に

同時に編修して保存すると上書きとかされちゃうと思うので、その辺りはお気をつけください。

Twitterやっているので、もしよかったらフォローしてください！
https://twitter.com/nkjzm

（答えられるか分かりませんが、分からないあればDMとかで質問してもらっても大丈夫です！）
データを読み取る条件式

#WHY
情報が入ってるか否かでよく使うのがnil?やblank?といったものですがいまいち違いがわからなかったため、調べてみました。
結果、記事はたくさんみつかったのですが忘れないためにもアウトプットしていきます。

-----

```ruby
def index
    @items = Item.all
end
```
コントローラーでこのような記述をしたとします。
このときHTML文で

```html
 @itemsにデータがあるとき↓を表示させたい！
<% @items.each do |item|%>
  <%= image_tag(item.image, class: "item-img") %>
<% end %>


 @itemsにデータがない時表示させたい！
<%= image_tag "sample.jpg", class: "item-img" %>
```

このような記述をします。
Itemsテーブルにデータがあれば<b>true</b>なければ<b>false</b>と言う感じにすればいいのですがすでにeach文ではItemsテーブルにデータがあれば繰り返し処理を、なければなにも表示されません。
なので下のコードだけ
Itemsテーブルにデータがあれば表示しない、データがなければ表示するとします。

ここで今回のメインテーマですがif文の条件式に何を持って来ればいいのか？
候補は<b>nil? , empty? , blank?</b>の３つです。
それぞれのあてはめて考えてみましょう

```ruby
if @items.nil?
```
nilだと＠itemsという変数自体の有無になります。
＠itemsという変数自体は定義して存在しているのでこれだと中のデータがあろうがなかろうが結果はfalseです。

```ruby
if @items.empty?
```
emptyだと@itemsが存在していることが前提で中の情報を判断するのでいけそうですね！trueが帰ってきます！

```ruby
if @items.blank?
```
blankは変数およびその中のデータもみてくれるのでいけますね！
nilとemptyが合わさったようになります！
ちなみにblankはrailsで拡張されたメソッドなのでRubyだけでは使えないらしいです

今回お世話になったサイトです
https://railsdoc.com/active_support

------
条件式もまだまだあいまいではありますが引き続き学習頑張っていきます！！
Lit-Elementで外部cssを取り込む方法

## Lit-Elementのスタイリング
公式サイトでは、`css`関数をインポートして、タグ付きテンプレートリテラルで書くことを勧めています。

```js
import { LitElement, css } from "lit-element"

class MyElement extends LitElement {
  static styles = css`
    :host {
      display: block;
    }
  `;
}
```

ですが、文字列として書くのでlintもシンタックスハイライトも付きません。そんな状態で規模が大きくなるとかなり見づらい。  
そこで、.cssファイルを外部に定義してそれをインポートしたいと誰もが思いますが、公式の外部スタイルシートの[取り込み例](https://lit-element.polymer-jp.org/guide/styles#external-stylesheet)がコレジャナイだったので、ここにメモとして残しておきます。

## 外部cssを取り込む方法

```js
import { LitElement, css, unsafeCSS } from "lit-element"
import styles from "path/to/css"

class MyElement extends LitElement {
    static styles = unsafeCSS(styles)
    // static styles = [ unsafeCSS(styles), unsafeCSS(otherStyles) ] 複数ある場合
}
```

webpack

```js
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [ "raw-loader" ] // raw-loaderで文字列としてインポートする
            }
        ]
    }
```

cssをそのまま文字列として読み込み、`unsafeCSS`でCSSResultオブジェクトに変換します。  
`unsafeCSS`は、この関数の引数にユーザが任意の値を渡せてしまうと、悪意のあるコードが実行できてしまうのでunsafeのようです。
webpackでバンドルする文字列だけ渡すのでこのケースでは問題ありません。

各種csspreprocessorも`raw-loader`かませば多分読み込めます。

## 問題点
`raw-loader`だとcssのminifyができない。  
何かいい方法があれば教えてください。
EC CubeをAWS(EC2)で構築するのに参考にした記事一覧

#はじめに
AWS EC2(Ubuntu)を用いてEC Cube4を構築するまでの道のりをメモとして残しておきます。
Route53を使った独自ドメインの適用やSSL化、SESのメール配信についても触れています。

#リージョン選び
まずはリージョン選びから始まります。
リージョンによっては値段が変わったり、使える機能が変わります。
例えばメール配信サービスのSESでメールが受信できるリージョンは執筆時点では限られており、日本だから東京リージョンというのは気が早いかもしれないです。
下記リンクの記事によると、米国東部(バージニア北部)リージョンが早くから新たなサービスが使えることが多く、特に理由がなければこのリージョンを選ぶとよいみたいです。
https://business.ntt-east.co.jp/content/cloudsolution/column-54.html

#メインとなる記事
EC2のインスタンスをどれを選ぶかでLinuxの中でも必要なコマンドが変わります。
ちなみにAmazon Linux2はCentOS系のコマンドみたいです。
基本的には以下の記事を参照すればある程度は作れるのですが、ときどき詰まったり足りないことがありました。
メインとなる記事（CentOS系）
https://xp-cloud.jp/blog/2020/12/10/9070/
Ubuntuの場合
https://www.mahirokazuko.com/entry/2020/01/03/235548

##Linuxコマンド
https://qiita.com/arene-calix/items/41d8d4ba572f1d652727

##Vimコマンド
https://qiita.com/hide/items/5bfe5b322872c61a6896

##Ubuntu で apache2のDocument rootを変更する方法
https://qiita.com/bluesDD/items/3cf77298ece0c83e9968

#Apacheの再起動・起動・停止コマンド
https://deep-blog.jp/engineer/12315/

```
[再起動] 
sudo service apache2 restart

[起動] 
sudo service apache2 start

[停止] 
sudo service apache2 stop
```

##Elastic IPアドレス（固定IP）
そんなに難しくないので公式ページ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

##Route 53（独自ドメインとIPアドレスの紐づけ）
https://avinton.com/academy/route53-dns-vhost/
Route53は無料枠がなく、毎月＄0.5かかります。

##SSL化(Certification ManagerとElastic Load Balancing)
https://www.leon-tec.co.jp/blog/yoshida/7570/
SSL化は永久に無料だけど、ELBの方は12か月の無料期間後有料。

##phpのページがソースしか表示されないとき
https://qiita.com/niQSun/items/0ec27c2eaa185a682827

##SES（メールの送信）
一斉にメールを送るためのサービスで一部リージョンのみ受信ができる。
受信はできるけど、読めるとは言ってない。（S3にメールをためて、ハッシュ化されたような文字列のファイルをダウンロードして、ファイルの拡張子を変更して初めて読めるようになる）
https://qiita.com/leomaro7/items/1f17e17162f0829c20e5

WorkMailという普通のメールサービスは毎月$4なので、こっち使うのもあり（もちろん受信したメールを読める）。
https://aws.amazon.com/jp/workmail/

（参考）Lamdaを使ってほかのメアドに転送する方法
https://skill-up-engineering.com/2019/06/15/amazon-ses%E3%81%A7%E3%81%AE%E5%8F%97%E4%BF%A1%E2%86%92s3%E2%86%92lambda%E3%81%A7%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E8%BB%A2%E9%80%81/

##Webインストーラー
公式の設定方法
固定IPを打つだけだけではphpのソースが表示されたので、http://から打とう。Route53の設定が終わっていれば、独自ドメインでもOK。
https://doc4.ec-cube.net/quickstart_install/web-installer

##CSSをカスタマイズするためにnode.jsをインストール
https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-ja

##Scssのビルド方法（カスタマイズ）
https://doc4.ec-cube.net/design_sass

ビルド時のコマンド

```
npm run build # scssをstyle.cssとstyle.min.cssに書き出します 
```

##CSSカスタマイズしても反映されないとき
スーパーリロードは必須
Windows：CtrlキーとF5キーを同時押し
Mac ：commandキーとshiftキーとRキーを同時押し

https://www.sejuku.net/blog/100015


#あとがき
無料期間の12カ月を過ぎた後はレンタルサーバー使った方が安いし、作るのがめちゃくちゃ大変なので、さくっと作りたい人はクイックインストールができるレンタルサーバーを借りた方が圧倒的に楽。
あと、AWSはググれば情報がたくさん出てくるから開発はしやすかった（途中いろんなところで詰まったけど）。
全ての工程を自分自身で組み立てるので、エンジニアとしての勉強としてはありかも。
Ubuntu の動画編集ソフト shotcut で作成した動画を Twitter に上げて失敗する場合の対処方

Ubuntu の動画編集ソフト shotcut で作成した動画を Twitter に上げて失敗する場合の対処方です。

まずは shotcut のインストールの仕方

````bash
sudo apt install libsdl2-2.0-0 ;
sudo snap install shotcut --classic ;
````
起動画面（結構フィルターがあります）
![Screenshot from 2021-02-17 19-35-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115935/9427d0b7-5abe-9d8c-e84f-03073e03852a.png)
動画を書き出す際に mp4 に設定をし h264 のコーデックを「libx264」に指定する必要があります。

また、もし既存の動画をアップしたいは場合は、下記コマンドで変換して対応可能です。

````bash
ffmpeg -i input.avi -vcodec libx264 -pix_fmt yuv420p -strict -2 -acodec aac output.mp4 ;

# 横幅を640にして時間を2分20秒にする場合
ffmpeg -i input.avi -vcodec libx264 -pix_fmt yuv420p -strict -2 -acodec aac -vf scale=640:-1 -t 140 output.mp4 ; 
````
アップロードの結果（キャプチャ画面）
![FireShot _ Twitter - twitter.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115935/e2e2ae97-7211-8088-8e73-cbf54e6e2f22.png)
他の制限事項

|項目  |値  |
|---|---|
|動画形式|MP4（H264形式、AACオーディオ）|
|動画サイズ|512MBまで|
|動画の時間|2分20秒まで|
|最小解像度|32 x 32から|
|最大解像度|1920 x 1200、または1200 x 1900まで|
|縦横比|1:2.39 ～ 2.39:1|
|最大フレームレート|40fpsまで|
|最大ビットレート|25Mbpsまで|
###参考リンク

- [Twitterに動画投稿する方法！サイズや形式、撮影方法や注意点 [ツイッター(Twitter)の使い方] All About ](https://allabout.co.jp/gm/gc/473086/)
- [Shotcut's videos cannot be uploaded to twitter - Help/How To - Shotcut Forum]( https://forum.shotcut.org/t/shotcuts-videos-cannot-be-uploaded-to-twitter/3783/3)
- [Dashboard - Streamable ](https://streamable.com/)
- [ビデオ編集アプリ「Shotcut」の最新版をUbuntuにインストールする方法 | LFI ](https://linuxfan.info/shotcut-ubuntu)
vue-clickawayを使って要素外のクリックを簡単に探知する

こんにちは、[Yui](https://twitter.com/yui_active)です。

ドロップダウンメニュー、モーダル、ポップアップなどを実装することはよくあると思うのですが、要素外をクリックしたときに閉じるという実装、地味にめんどくさいですよね。

わたしはいつもその部分をクリックされた場所を探知してそれが要素外だったら閉じる、というような処理を書いていたんですが、**vue-clickaway**を使うと簡単に実装できて最高だったので紹介します。

公式のREADMEがめちゃくちゃわかりやすいので[公式](https://github.com/simplesmiler/vue-clickaway)も合わせてご確認ください。


## インストール

```
$ npm install vue-clickaway --save

or

$ yarn add vue-clickaway
```

※もちろんCDNでも読み込めます。その場合は以下を記載

```javascript

<script src="https://cdn.jsdelivr.net/npm/vue-clickaway@2.2.2/dist/vue-clickaway.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-clickaway/2.2.2/vue-clickaway.min.js"></script>
<script src="https://cdn.rawgit.com/simplesmiler/vue-clickaway/2.2.2/dist/vue-clickaway.min.js"></script>
```

## 利用方法

まずは以下でvue-clickawayを読み込んだら、mixinsでclickawayを指定します。

```
import { mixin as clickaway } from 'vue-clickaway';
```

```
mixins: [ clickaway ],
```

そして今回はアイコンをクリックしたらisActiveをtrueにして、isActiveがtrueの場合にModalコンポーネントを開くようにして組んでたので以下。

```
<Modal v-if="isActive" v-on-clickaway="close" />
```

ここで、外部をクリックしたら閉じたい要素を``v-on-clickaway="close"``という形で指定します。
今回だったらModalコンポーネント以外をクリックしたらModalコンポーネントを閉じるようにして組みたかったので上記のようになります。


全体のコードはこちら。

```vuejs

<template>
  <div class="main-container">
    <div class="container">
      <div class="icon" @click="open">
        <img
          class="image" 
          src="@/assets/images/icon/open.svg"
          alt/>
      </div>
    </div>
   <Modal v-if="isActive" v-on-clickaway="close" />
  </div>
</template>
<script>
import Modal from '@/components/Modal.vue';
import { mixin as clickaway } from 'vue-clickaway';
export default {
  components: {
    Modal
  },
  data() {
    return {
      isActive: false
    };
  },
  mixins: [ clickaway ],
  methods: {
    open() {
      this.isActive = true
    },
    close() {
      this.isActive = false
    },
  },
};
</script>
```

もちろんvue-clickawayをpluginsで読み込んでグローバルで使えるようにしても良かったんですが、今回はこのファイルのみでしか使う予定がなかったのでファイル内で読み込んでいます。

もしpluginsでグローバルに読み込む場合は以下で読み込めると思います。

```plugins/vue-clickaway.js

import Vue from 'vue'
import { directive as onClickaway } from 'vue-clickaway';
Vue.directive('onClickaway', onClickaway);
```

そしてnuxt.config.jsで読み込み

```nuxt.config.js
  plugins: [
    { src: "@/plugins/vue-clickaway", ssr: false }
  ],
```

## 感想

今まで外部エリアのクリック探知を地道に書いてましたがこんなに簡単に使えるとは驚きです。
今後も使っていこうと思います♪
[Ruby on rails, JavaScript] カード情報   token(トークン)がnilの場合

カードの情報を暗号化して送るtokenのエラーでの備忘録を書いて行きます。


###最初に

**＊**今回は**formオブジェクトパターン**を使ったやり方になっています。
なので、**attr_accessor :token**
をmodelに記入してあります。
　　

　　
**カード情報**

```card.js
const card = {
      number: formData.get("purchase_management_shipping_address[number]"),
      cvc: formData.get("purchase_management_shipping_address[cvc]"),
      exp_month: formData.get("purchase_management_shipping_address[exp_month]"),
      exp_year: `20${formData.get("purchase_management_shipping_address[exp_year]")}`,
    };
```
**・formDate.get**の後の引数の**name属性の値**が間違っている可能性がある。
検証のコンソールを使って必要とする値を照らし合わせて**name属性**を記述する必要がある。

　　

**・id情報**

```card.js
document.getElementById("card-number").removeAttribute("name");
      document.getElementById("card_cvc").removeAttribute("name");
      document.getElementById("card-exp-month").removeAttribute("name");
      document.getElementById("card_exp_year").removeAttribute("name");
```
こちらは**id情報**なので、コンソールで照らし合わせて、カード情報のidを記述してあげる。

***
　　　
結局、エラーの原因は記述ミスでした。
よく誤字、脱字するので以後気をつけたいと思います。



##追記
**「tokenのバリデーションについて」**
**token**はordersテーブルに存在しないため、本来はOrderモデルのバリデーションとしては記載することはできません。
最初に**attr_accessor :token**と記載したことにより、tokenについてのバリデーションを記述することができます。
laravel 電話番号の型の設定とDBに保存する方法

#はじめに
登録する際に電話番号も登録できるようにしたところ、phpMyAdminで確認すると電話番号の最初の`0`が消えていたのでこれを`0`から登録できるように改良します!!
スクショで以下のようになっているのでこれを修正します。
![“スクリーンショット” 2021-02-17 18.41.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/54847b99-30e4-d099-6224-214d0893f71e.jpeg)

#投稿者の環境
MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
macOS Big Sur バージョン11.0.1
PHP 7.3.23
Laravel Framework 6.20.7

###ステップ1 電話番号のバリデーションの設定
電話番号は10桁または11桁になります。バリデーションを10桁または11桁にします。


```RegisterController.php
'phone' => ['required','numeric','digits_between:10,11'],
```

###ステップ2 電話番号のデータ型の設定
ここで自分はどハマりして中々突破できませんでした。
結論から言うと、電話番号の型は`unsignedBigInteger`にします。

```add_column_to_users_table.php
$table->unsignedBigInteger('phone')->after('address');//電話番号
```
データ型`int(11)`にするとMysql「Warning: #1264 Out of range value for column 'カラム名' at row 1）」とエラーが出ます。理由は以下のスクショになります
![“スクリーンショット” 2021-02-17 19.06.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/72d87fa6-5418-104d-b962-af1d008b06b7.jpeg)

###ステップ3 電話番号を0から表示するように設定
このまま登録をしたとしても、0から表示はされません。phpMyAdminで０から表示されるように変更します。属性のところを`UNSIGNED ZERO`に変更します。最後に`保存する`を選択
![“スクリーンショット” 2021-02-17 19.14.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/8f2b96a1-57dc-6383-74ac-6880b860b74d.jpeg)
このように表示されると思います。
![“スクリーンショット” 2021-02-17 19.25.50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/320af5df-ea42-d12d-59d9-e933c97dd168.jpeg)

#最後に
数字のデータ型を全てint型にするとこのようなエラーに遭遇する可能性があるのでもっと知るべきだなと思った出来事になりました。

#参考URL
[電話番号の桁数のQiita](https://qiita.com/tukiyo3/items/b994ffafb7f01e79fe34)
[電話番号カラムのデータ型とその扱い[PHP][MYSQL][データ型][int型][integer][桁あふれ][telカラム]](http://sigisi.hatenablog.com/entry/20100829/1283100665)
Google Cloud Platform の Geocoding API に HTTP リファラ制限をかけられない

https://developers.google.com/maps/faq#using-google-maps-apis

これによると Geocoding API は IP による制限しかかけられないのであきらめるしかない。フロントで使いたい場合はバックでプロキシしたりする感じか。

GCPのAPIキーの設定画面だとGeocoding APIをHTTPリファラーで制限しても特に何も言われないが、このAPIキーを使ってGeocoding APIを使おうとすると以下のように怒られる。

```json
{
   "error_message" : "API keys with referer restrictions cannot be used with this API.",
   "results" : [],
   "status" : "REQUEST_DENIED"
}
```
UE4 Paper2Dコンボ攻撃

#記事の完成イメージ
![GAS_Sprite_04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/dd472292-202a-b278-04fa-8fea2b1f550f.gif)

#はじめに
この記事は、[**前記事≫【UE4 Gameplay Ability System で2Dコンボ攻撃**】](https://qiita.com/O_Y_G/items/30c2d5618a3bdfbd649d)
の比較検討用に作られた、副産物的な検証データになります。

コンボ攻撃の方法は、多種多様にあり、今回の方法は、一例として確認してもらえればと思います。
UE4のコンボ攻撃をネット上で検索すると、あまり定番的な情報がヒットしにくいのもあり、
一応の参考になればいいなと思います。

#環境
バージョン　UE4 4.25.4
ブループリントテンプレートで、2Dサイドスクロール を最低限の編集をしたものです。
![qiita_gas_101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/2f90403a-190a-28d4-a7f6-454867969c84.jpeg)

#ソースコード
出来たものを置いておくので、データを確認してみてください。
**https://github.com/O-Y-G/BP_PaperCombo**

#簡易説明
上部の黄色いコメントの部分は、2DSideScrollerCharacterを少し整理しただけの部分です。
![qiita_212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/0c0720e7-374d-45ff-b4d2-6489af81a191.jpeg)

下部の緑色のコメント部分が、コンボ攻撃の仕組みになります。
![qiita_213.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/c5e2da18-70c6-37e8-1ac6-9e456270a66c.jpeg)

左側が、コンボの遷移。右側が、ダメージの判定処理です。

1コンボ目の処理
![qiita_216.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/4804814e-bcce-b60d-c4ca-2e510ed33c80.jpeg)
順番に説明しようかと思いましたが、文字で説明しにくいので、動画で説明したいと思います。

[**動画URL≫https://youtu.be/3Y0ifa_lAUY**](https://youtu.be/3Y0ifa_lAUY)

#おわりに
ソースコードを見ればわかると思いますが、
動画での説明も置いておきます。


関連記事
[**UE4 Gameplay Ability System で2Dコンボ攻撃（1/2）導入編**](https://qiita.com/O_Y_G/items/30c2d5618a3bdfbd649d)
[**UE4 Gameplay Ability System で2Dコンボ攻撃（2/2）実装編**](https://qiita.com/O_Y_G/items/70ae6f353d06de54d1c1)
AWS EC2の負荷試験[CPU/メモリ/Disk]

# はじめに
CloudWatchアラームをアラート状態にして、発報を確認する際に、CPU/メモリ/Diskに対する負荷をかけるコマンドまとめます。

# 実行コマンド
1. 下記を実行してCPUに負荷をかけます。

    ```sh:CPU負荷コマンド
    # 実行コマンド
    while true; do (/dev/null < $(yes) &); done

    # 確認用コマンド
    top
    ```

2. 下記を実行してメモリに負荷をかけます。

    ```sh:メモリ負荷コマンド
    # インストール
    sudo yum install stress -y

    # 実行コマンド
    stress --vm 3 --vm-bytes 6G --vm-keep

    # 確認用コマンド
    watch 'free -mh'
    ```
※　オプションのvmはプロセス数、vm-bytesはメモリサイズ、vm-keepは処理を持続させます。

3. 下記を実行してDiskに負荷をかけます。

    ```sh:Disk負荷コマンド
    # 実行コマンド
    dd if=/dev/zero of=70G.dummy bs=700M count=100

    # 確認用コマンド
    watch 'df -h'
    ```
※　オプションのofはファイル名、bsはバイト数、countは生成処理の実行回数です。
Safariがhostsファイルを中々反映しないのを解決する

#本稿の目的
非生産的なネットサーフィンをどうにしかして辞めたいSafari使いのために
###どういう人向け
ネットサーフィンしてしまいがちな貴方、私。browser毎に素敵な遮断Pluginを入れてもいいんだけど、アップデートの隙間や、OSレベルで遮断したいという人向け
Chromeとか使ってる人はPluginの方が遥かに柔軟だと思います
###環境
Mac OS Mojave/Safari 14.0.3

##ハマりポイント

大まかな流れは
###1.hostsを編集

```terminal
sudo vi /etc/hosts
```

hostsファイルに
```127.0.0.1 *+****.com(遮断したいwebsiteのhost)
```
と書いて保存
###2.dnsキャッシュをクリア
```terminal
sudo dscacheutil -flushcache
```

ここまでは良いのですが、**依然としてsafariがhostsを反映せず、サイトが見られる
状態が続いています。この回避策としてlogoutや再起動など提示されています。**
(＊ブラウザ再起動とlogoutは意味がなかったです)

一応hostsに記載した、ブロックしたいサイトに対して
```ping **********.com
```
を打つと127.0.0.1に繋がるのでos的には認識しているようです

##解決策

[Stackexchange](https://apple.stackexchange.com/questions/92710/why-is-safari-ignoring-my-etc-hosts-file "Why is ignoring my /etc/hosts file?")
を参照したところsafariはIpv6でも名前解決を試みるようで、そちらも同様に書かなければならないそうです。
試しにhostsに
```fe80::1 ******.com
```
を追記しdnsキャッシュクリアしたところ立ち所にサイトがブロックされました！

###おまけ
モダンなbrowserはIpv6をサポートしているでしょうから、他のブラウザでこういうことがあるかもしれませんね。
Ipv6は従来のIpv4と違って32bitから128bit長なので16bit毎に:で区切った表記をするそうです。同じ表現が続く場合は::でその区間を省略できるようです。
Ipv4に見られるlocalhostを表すアドレスの先頭127に対応するのが
Ipv6だとfe80です。最後はどちらも1ですね。
OpenShift 4.4を構築してアプリを動かしてみる - ソフトウェア準備編 -

2021年1月現在、VMware ESXiのバージョンは7.0が登場していますが、稼働実績のある6.7で構築いたします。
また、純正では私のNUCのネットワークインターフェイスが認識されないとの報告があるため、カスタマイズ版のソフトウェアを準備します。

## VMware Power CLIのインストール
WindowsでPowerShellを管理者として実行します。

1.Install-Module でVMware.PowerCLIをインストールします。

```powershell:
Install-Module -Name VMware.PowerCLI
```

2.ESXi-Customizer-PSからESXi-Customizer-PS-v2.6.0.ps1をダウンロードします。
http://vibsdepot.v-front.de/tools/ESXi-Customizer-PS-v2.6.0.ps1

3.ESXi-Customizer PSを実行し、version 6.7とne1000のドライバを指定して実行します。
うまくいくと、isoが作成作成されるのでメディアに焼きます。

```powershell:
ESXi-Customizer-PS-v2.6.0.ps1 -v67 -load ne1000
(snip)
Running with PowerShell version 5.1 and VMware PowerCLI version 11.3.0.13964826
 
Connecting the VMware ESXi Online depot ... [OK]
 
Getting Imageprofiles, please wait ... [OK]
 
Using Imageprofile ESXi-6.7.0-20190604001-standard ...
(dated 06/20/2019 14:51:56, AcceptanceLevel: PartnerSupported,
Updates ESXi 6.7 Image Profile-ESXi-6.7.0-20190604001-standard)
 
Load additional VIBs from Online depots ...
   Add VIB ne1000 0.8.4-2vmw.670.2.48.13006603 [IGNORED, already added]
 
Exporting the Imageprofile to 'C:\Users\Administrator\Desktop\ESXi-6.7.0-20201104001-standard.iso'. Please be patient ...
 
 
All done.
```

## 注意事項
### 実行ポリシーの変更
1.Get-ExecutionPolicyを実行ポリシーを確認してください。

```powershell
Get-ExecutionPolicy
Restricted
```

Restrictedの場合、制限が厳しいので一時的にポリシーを緩和させます

```powershell
Set-ExecutionPolicy Unrestricted
```

### [WinError 10054] ??????????????????????????????
実行後、文字化けのエラーが発生する場合、TLS接続によるエラーの可能性が高いです。
以下のようにTLS 1.2の使用を明示的に指定してから実行します

```powershell
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
```
async/awaitの使い方について(超初級)

今回はプログラミング学習において避けては通れない非同期処理について学習したことを記事にさせていただきたいと思います。

まず非同期処理とは
処理Aを実行中に処理Bを実行するときに処理Aは処理を進めたまま処理Bも処理を進めます。

逆に同期処理とは
処理Aを実行中に処理Bを実行するときは処理Aの処理を一度止めたから処理Bを進め、その処理が終わってから処理Aを再開する流れになってます。
![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/970553/436217be-91af-80c2-70cb-85ba6c657b78.jpeg)


非同期処理の方が処理を止めずに進めるので早いのですがデメリットとしては
処理Aのレスポンスを利用して処理Bを実行したいときにはレスポンスが帰ってくる前に処理Bが実行され思っていた結果が得られないことがあります。
よくconsoleで表示した内容がundefinedになって困ったことはありませんか？

これを解決するのが今回紹介するasync/awaitです。
まずはasync/awaitを使わないで行った処理です。

```main.js
function callApi() {
  const res = fetch("https://jsonplaceholder.typicode.com/posts");
  const users = res.json();
  console.log(users);
}

callApi();
```

コンソールの結果

```index.html
index.js:3 Uncaught TypeError: res.json is not a function
    at callApi (index.js:3)
    at index.js:7
```

エラーが出ちゃいましたね。
これはfetch()で取得した結果が変数resに入る前にres.json()を呼び出したために起きたエラーです。

次はasync/awaitを使って書いてみましょう

```main.js
async function callApi() {
  const res = await fetch("https://jsonplaceholder.typicode.com/posts");
  const users = await res.json();
  console.log(users);
}

callApi();
```
コンソールの結果

```index.html
(100) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {userId: 1, id: 1, title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body: "quia et suscipit↵suscipit recusandae consequuntur …strum rerum est autem sunt rem eveniet architecto"}
1: {userId: 1, id: 2, title: "qui est esse", body: "est rerum tempore vitae↵sequi sint nihil reprehend…aperiam non debitis possimus qui neque nisi nulla"}
2: {userId: 1, id: 3, title: "ea molestias quasi exercitationem repellat qui ipsa sit aut", body: "et iusto sed quo iure↵voluptatem occaecati omnis e…↵molestiae porro eius odio et labore et velit aut"}
3: {userId: 1, id: 4, title: "eum et est occaecati", body: "ullam et saepe reiciendis voluptatem adipisci↵sit … ipsam iure↵quis sunt voluptatem rerum illo velit"}
.
.
.
```

しっかりとres.jsonの結果が表示されました。
これはcallApi()に対してasyncをつけることによって非同期関数にします。
この関数の中ではawaitが使うことができ、
await fetch("https://jsonplaceholder.typicode.com/posts");
が完了するまでは次の処理には進めないようにしてます。
よってres.json()の中身がundefinedにはならず上手く実行結果を得ることができました。
非同期処理に関してはasync/await以外にもやり方があるのですがこのやり方が一番使われていると思います。

以上がasync/awaitの使い方(超初級)でした。
SymPyの関数にまとめて代入したい



PythonのSymPyで関数を作り、一気に変数に値を代入したかったのですが、「python sympy subs」などで調べてみても、日本語のテキストがなかなか見つからなかったため、SymPyのドキュメントに書いていたメソッドを紹介しておきます。
#使ってみる

```python:
import sympy as sym

x=sym.Symbol("x")
y=sym.Symbol("y")
z=sym.Symbol("z")

f=x*y*z

print(f.subs([(x,1),(y,2),(z,3)]))
```

#結果

```
6
```

引数にはリストで括ってそれぞれをタプルに入れる必要があります。結果は1×2×3で6です。xとyとzに値を入れてみたように、3つ4つと代入する値を入れることも可能です。
以上です。


>https://docs.sympy.org/latest/tutorial/basic_operations.html
VSCode + Markdown + PlantUMLを簡単設置、ローカル環境を汚さず！

# PlantUML 設定(windows)
必要なパッケージを scoop を使用してインストール

## scoop インストール

```powershell
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
```

## エラーが発生した場合は、実行ポリシーを変更する

```powershell
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
```

## scoop のバケット追加

```powershell
scoop bucket add extras
scoop bucket add java
```

## plantuml は VSCode の拡張機能でインストールすれば不要

```powershell
scoop install openjdk Graphviz plantuml
```

## VSCode 拡張機能追加

  * PlantUML
  * Markdown Preview Enhanced
Javascriptでワンライナー湯婆婆

湯婆婆ブームは過ぎたのは知ってるけどね。書きたい衝動を抑えられなかったんだよね。仕方ないね。
# この記事で目指すこと
@Nemesis様の記事、[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)の内容をJavascriptで、なおかつ**ワンライナーで実装します**。
なおワンライナーとは一行だけで書かれたコードのことを指しますが、**Javascriptにおいて文の終わりを示すセミコロンは一切記述しないものとします**。つまり、一文で書きます。
それと、最小文字数記録更新を狙っているわけではないのでMinify化はしません。

#とりあえずまずは普通に書く
いきなりコードを一行で書くのは無謀なので、まずは機能ごとに分解して普通に書いてみます。
##契約書
元の記事では、コンソールからの入力で契約書にサインを求めてきます。
ただ、Javascriptにはコンソールへの入力を受け付ける関数がありません。代わりに`window.prompt()`でテキストボックスを含むダイアログを表示させ、入力された文字列を契約者の名前とします。

```js
var name = prompt("契約書だよ。そこに名前を書きな。")
confirm("フン。"+name +"というのかい。贅沢な名だねぇ。")
```

##名前を奪う
入力された文字から乱数によって一文字を選んで抜き出し、新しい名前として与えます。
契約書へのサインをダイアログで行ったので、名前を与えるのもダイアログにします。

```js
var num = Math.floor(Math.random() * name.length)//1から文字列の長さまでの整数の乱数を生成
var newName = name[num]//生成された乱数の場所にある文字を抽出
confirm("今からお前の名前は"+newName+"だ。いいかい、"+newName+"だよ。分かったら返事をするんだ、"+newName+"!!")
```

ところで、知識をお持ちの方は「なんで`window.alert()`じゃなくて`window.confirm()`使うんだ」と思われるかもしれません。わざとです。
後者の関数を使うと「はい」のほかに「キャンセル」という選択肢が増えるため、サインした名前が自分の名前であるという事実を「キャンセル」できたり、湯婆婆に名前を奪われるのを「キャンセル」できるわけです。
~~まぁキャンセルしたところで実行結果は変わらないんですがね~~
# ワンライナー湯婆婆
ここまでが普通に実装した場合のJavascript湯婆婆です。
さて、この記事の目的は「ワンライナー湯婆婆を作る」ことなので、これらのコードを一文にします。
こうなりました:

```js
((name) => {((_, newName) => {confirm("今からお前の名前は"+newName+"だ。いいかい、"+newName+"だよ。分かったら返事をするんだ、"+newName+"!!")}).call(this, confirm("フン。"+name +"というのかい。贅沢な名だねぇ。"), name[Math.floor(Math.random() * name.length)])}).call(this, prompt("契約書だよ。そこに名前を書きな。"))
```

アロー関数を繋げて`call()`したり、その引数内で`confilm`させたりしています。
これをコピーし、お使いのブラウザのコンソールにコピーして実行してみてください。ダイアログで湯婆婆とのやりとりが楽しめます。

#クラッシュ湯婆婆があったりなかったり
元の記事のコードでは、名前を空文字列とした場合に例外が発生、つまり**クラッシュ湯婆婆**という現象が発生します。このワンライナー湯婆婆の場合、サインをするときの行動によってクラッシュ湯婆婆が発生したりしなかったりします。
契約書に何も書き込まなかった場合、「フン。というのかい。...」のあとに「undefined」が名前として与えられます。一文字より長い名前を与えられるのは嬉しいですね。
そして、契約書への書き込みを「キャンセル」すると、名前が勝手にnullになった後にクラッシュ湯婆婆が発生します。

#おわり
以上、Javascriptでワンライナー湯婆婆を作ってみた話でした。
最後に、このコードは僕の貧弱な知識+Google検索で情報を手探りしながら書いたコードです。
もしもっと簡潔に書ける場合はコメントで教えていただけると嬉しいです！
【HTML】target="_blank"の問題点

#プログラミング勉強日記
2021年2月17日
Twitterでtarget="_blank"問題という言葉を見て知らなかったので、調べて簡単にまとめる。

#target="_blank"とは
　HTMLタグの1つでリンク先を別のタブで新しく開くように指定するもの。

```html
<a href="リンク先のURL" target="_blank">新規タブで開く</a>
```

#target="_blank"の問題点

##1. セキュリティにおける問題点
　target="_blank"のリンクは別タブで開かれるので、リンク元のページとリンク先のページの両方が1つのブラウザ内に存在していることになる。リンク先のページに、悪意のあるJavaScriptが記載されていた場合、リンク元であるページを好き勝手改竄することができる。

　自分のサイト内のページにtarget="_blank"でリンクを貼ったサイトが、悪意のある人によって作られたページだった場合、開かれた新しいタブ側でリンク元のページのURL操作が可能になってしまう。

##2. パフォーマンスにおける問題点
　リンク元のページとリンク先のページは全く同じプロセスを通して実行され、リンク先のページで高い負荷を与えるJavaScriptが実行されているとリンク元のページにも影響を及ぼし、パフォーマンスが低下することがある。

#対処法

##1. noopenerを指定する
　noopenerを指定すると、リンク先からwindow.openerを使ってリンク元が参照できなくなる。また、リンク先とリンク元が別のものとして扱われるので、パフォーマンスの問題点を改善できる。

##2. noreffererを指定する
　noreffererを指定すると、リンク先にリンク元のリンク情報が送られないようになる。ブラウザによってはnoreffererがサポートされていないので、noreffererを指定するといい。


```html
<a href="リンク先のURL" target="_blank" rel="noopener noreferrer">新規タブで開く</a>
```


#参考文献
[最近話題の『target=”_blank”問題』は何が問題なの？今さら聞けない問題の要点と対処法を解説します。](https://affiplus1.com/archives/2762)
[「別タブで開く」リンク(target="_blank")は脆弱性あり？【SEO情報まとめ】](https://webtan.impress.co.jp/e/2020/03/13/35510)
productionで動かしながら、サーバーによって専用Gemを追加

Stagingを構築する場合でもRails.envを変更しないことがよいとされています。
[config/environments/staging.rb はアンチパターン！](https://qiita.com/tonluqclml/items/196280783bbefbd9ac76)
Stagingでテストデータを作りたいとき、ベタ書きでSeedを作ろうとしましたが、メンテナンス性を考え[FactoryBot](https://github.com/thoughtbot/factory_bot)で実装する方法を示します。

## Stagingだけ読み込みたいGemがある例

```ruby
group :development, :test do
  gem 'factory_bot_rails', group: :staging
  gem 'ffaker', group: :staging
end
```

本番サーバー

```bash
bundle install --without development test staging
```

stagingサーバー

```bash
bundle install --without development test
```

```ruby
require 'factory_bot'
10.times { FactoryBot.create(:user) }
```

## Herokuだけ読み込みたいGemがある例

app.json

```json
{
  "env": {
    "RAILS_GROUPS": {
      "value": "heroku"
    }
  }
}
```

Gemfile

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

group :heroku do
  gem 'rails_12factor'
end
```

## 参考
https://apidock.com/rails/Rails/groups/class
「【素数・素因数分解・エラトステネスの篩】数学一切できない文系Fラン卒の俺が素数系のコードを解説する」を参考にWolframAlphaとSymPy Liveでやってみた。

(オリジナルポスト)

https://qiita.com/saito_ry/items/f3cb594f4dc9e1ec09b7

#WolframAlphaで
####WolframAlphaで「31が素数」

https://www.wolframalpha.com/input/?i=31+%E3%81%8C%E7%B4%A0%E6%95%B0&lang=ja

入力:
31は素数ですか？
結果:
31は 素数です

####WolframAlphaで「30以下の素数」

https://www.wolframalpha.com/input/?i=30%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0&lang=ja

入力解釈:
素数 | 30以下
値:
2 | 3 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29 (10 素数)

####WolframAlphaで「120の素因数分解」

https://www.wolframalpha.com/input/?i=120%E3%81%AE%E7%B4%A0%E5%9B%A0%E6%95%B0%E5%88%86%E8%A7%A3&lang=ja

入力解釈:
因数分解 | 120
結果:
2^3×3×5 (相異なる素因数の個数：3個，重複も含めた素因数の総数：5個)

####(参考)WolframAlphaで「素数」
https://www.wolframalpha.com/input/?i=%E7%B4%A0%E6%95%B0&lang=ja

素数のリストを生成する：
百以下の素数
入力解釈:
素数 | 100以下
値:
2 | 3 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29 | 31 | 37 | 41 | 43 | 47 | 53 | 59 | 61 | 67 | 71 | ... (25 素数)

####(参考)WolframAlphaで「合成数」
合成数

https://www.wolframalpha.com/input/?i=%E5%90%88%E6%88%90%E6%95%B0&lang=ja

入力:
Composite[n]
値:
Composite[n] | 4 | 6 | 8 | 9 | 10

####(結果)素数と合成数
最小の素数は 2 である。<wikipedia
素数ではない 2 以上の自然数を合成数と呼ぶ。<wikipedia
100 以下の素数一覧表あり<wikipedia
1 ?
2 素数
3 素数
4 合成数
5 素数
6 合成数
7 素数
8 合成数
9 合成数
10 合成数
以下続く.............

####(参考)エラトステネスの篩＜WolframAlpha
https://www.wolframalpha.com/input/?i=%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9&lang=ja

#SymPy Liveで
https://live.sympy.org/

####SymPy Liveで「31が素数」
入力:
print(isprime(31))
出力:
True

####SymPy Liveで「30以下の素数」
入力:
print([i for i in sieve.primerange(1, 30)])
出力:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

####SymPy Liveで「120の素因数分解」
入力:
print(factorint(12))
出力:
{2: 2, 3: 1}


####(参考)素数と合成数、素因数分解＜Python 数値計算入門Jupyter NoteBook を活用した Python3 プログラミング学習サイト
https://python.atelierkobato.com/prime_number/