OmniAICreator/Qiita-1.07M huggingface dataset:
includesを用いてN+1問題を解消する

## 関連付によって構文が異なるincludesメソッド

N+1問題を解消する目的で、メインページでのfeedメソッドに`includes`を導入しました。

伝えられる事としましては、関連付けの種類によって`includes`の構文が変わるという事です。

```ruby:controller.rb
def home
  :
  @feed_items = current_user.feed.page(params[:page])
  :
end
```

before

```ruby:user.rb（変更前
def feed
	Work.where(
		"user_id = ? OR user_id IN (?)",
		id,
		Relationship.where(follower_id: id).select(:followed_id)
	)
end
```

after

```ruby:user.rb（変更後
def feed
  Work.includes(
    [
      :comments,
      :likes,
      image_attachment: :blob,
      user: { avatar_attachment: :blob },
      illustrations: { photo_attachment: :blob }
    ]
  ).where(
    "user_id = ? OR user_id IN (?)",
    id,
    Relationship.where(follower_id: id).select(:followed_id)
  )
 end
```

このアプリケーションのER図です。
（自動生成されたものなので見ずらいかもしれません。すいません。

![erd](https://user-images.githubusercontent.com/72424114/117642894-cca3f100-b1c2-11eb-9052-64e8817ca58d.png)

今回は以上です！！
目を通して頂きありがとうございました！！
Filashirt store

Filashirt store, all the t-shirts, sweatshirts, hoodies, tank tops, mug that you could be looking for. Filashirt is an exclusive store for the world’s best animal themed apparels such as lion, donkey, mouse and so on.
Website: https://filashirt.com
Email: support@filashirt.com
Address: 4694 W Irlo Bronson Memorial Hwy, Kissimmee, FL 34746, United States
Phone: +14073961780
More Scial: 
http://ttlink.com/filashirtstore/detail
http://vnvista.com/forums/member86038.html
https://forums.prosportsdaily.com/member.php?977559-filashirtstore
https://www.bakespace.com/members/profile/filashirtstore/1184345/
https://community.atlassian.com/t5/user/viewprofilepage/user-id/4386606
https://support.panopto.com/s/profile/0055Y00000GlKp4
https://www.spyropress.com/forums/users/filashirtstore/
https://www.wysp.ws/filashirtstore/
https://qiita.com/filashirtstore
https://speakerdeck.com/filashirtstore
https://startupmatcher.com/p/filashirtstore
swift classとstruct違い

1. classは継承できるが、structは継承できない
2. classはオプショナル型でないプロパティを値をセットせずに宣言した場合、イニシャライザをクラス内に書く必要がある。structは書く必要がなくデフォルトで補完で宣言してくれる。
3. classは参照型でstructは値型である。参照型は例えば同じインスタンスを異なる変数名で２つ定義し、プロパティに値をセットするとそれが２つのインスタンス全てに変更が反映されてしまう。
値型の場合は、一つのインスタンスのプロパティに値をセットしてもそれがもう一つの同じインスタンスの方に反映されない。
Laravel 8 の Model を使って複数のキーでリレーションをする方法

こんにちは、最近またLaravelをゴリゴリ書いています。

以前Laravelを使ってからもう1.5年ほど経って、色々とお作法が変わっていたり忘れていたりしたので結構戸惑いました。

とくに、データベースのリレーションには苦労しましたです、はい…

ということで、タイトルの通り「複数のカラムの値を使って、別のテーブルのデータを絞り込んだ上で取り込みたい！」という願いを叶える方法を書き残しておきます。

## 上級サブクエリというなんかすごそうな名前の機能を使う

Laravelのドキュメントでいうと、下記のページにやり方が記載されています。

https://readouble.com/laravel/8.x/ja/eloquent.html

この中の上級サブクエリを使って求める結果を得るのです。

まず、下記のようなテーブルを用意します。

__companies__

| id | name |
|:-:|:-:|
| 1 | 有限会社倉敷 |
| 2 | 株式会社足軽 |
| 3 | 株式会社 |

__branch_offices__

| id | name | company_id |
|:-:|:-:|:-:|
| 1 | 東京本社 | 1 |
| 2 | 愛知本社 | 2 |
| 3 | 神奈川本社 | 3 |
| 4 | 長野支社 | 1 |
| 5 | 沖縄支社 | 1 |
| 6 | 東京支社 | 2 |
| 7 | 北海道支社 | 3 |

__emproyees__

| id | name | company_id | branch_office_id |
|:-:|:-:|:-:|:-:|
| 1 | 徳川 | 1 | 1 |
| 2 | 織田 | 1 | 4 |
| 3 | 上杉 | 1 | 5 |
| 4 | 源 | 2 | 2 |
| 5 | 坂本 | 2 | 6 |
| 6 | 西郷 | 3 | 7 |

これらをもとに、社名と勤務先を含んだ従業員 (emproyee) 一覧を作りたいとします。

そうなるとですよ、会社名はいいとして、勤め先の本社や支社は company_id, branch_office_id を使って絞り込む必要があるわけです。

最終的には下記のようなデータが欲しいわけですよ。

|ID	|名前	|会社名	|支店名|
|:-:|:-:|:-:|:-:|
|1	|徳川	|有限会社幕末	|東京本社|
|2	|西郷	|有限会社幕末	|長野支社|
|3	|中岡	|有限会社幕末	|沖縄支社|
|4	|上杉	|株式会社戦国	|愛知本社|
|5	|織田	|株式会社戦国	|東京支社|
|6	|スサノオ	|株式会社ヤマト	|北海道支社|

## Modeでサブクエリを書く

これを実現するために書くコードは下記の通り。

```php:Emproyee.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{
    use HasFactory;

    public function company()
    {
        return $this->belongsTo(Company::class);
    }
}
```

```php:HomeController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Employee;
use App\Models\BranchOffice;

class HomeController extends Controller
{
    public function home(Request $request)
    {
        $query = Employee::addSelect(['branch_office' => BranchOffice::select('name')
            ->whereColumn('company_id', 'branch_offices.company_id')
            ->whereColumn('branch_office_id', 'branch_offices.id')]);
        $employees = $query->get();

        foreach ($employees as $employee) {
            static $employeesArray;
            $employeesArray[] = [
                'id' => $employee->id,
                'name' => $employee->name,
                'company' => $employee->company->name,
                'branch_office' => $employee->branch_office,
            ];
        };

        return view('welcome', ['employees' => $employeesArray]);
    }
}
```

ということで、```addSelect```のサブクエリで```whereColumn```を2つ繋げばいいというだけでした。

わかってみれば非常に簡単に組み立てられますね。

この手の道具は普段から触っておかないとだめだな…
Dockerイメージからコンテナを立ち上げる

## 背景
Dockerイメージからコンテナを立ち上げる方法が毎回「どうやるんだっけ」となっているので、メモしておく。

ちゃんと検証してないので、間違っていたらすみません！自分用のメモです！

## 結論

```bash
foo@gpu:~$ docker run -it --name container_name -d -p 5060:5000 \
-e SOME_ENV=foobar -v /home/foo/bar:/var/bar --restart=unless-stopped \
image_name python /var/bar/baz.py
```

オプション(or上での文字列)|何をしているのか
-|-
`-i`|コンテナの標準入力を開きます。
`-t`|ttyをつなげます。
`--name`|コンテナ名を指定します。
`-d`|コンテナをバックグラウンドで実行します。
`-p`|ホストとコンテナのポートをつなぎます。(例ではホストの5060とコンテナの5000をつなぐ。)
`-e`|コンテナ内の環境変数を設定します。
`-v`|マウントします。(例ではホストの`/home/foo/bar`ディレクトリとコンテナの`/var/bar`ディレクトリ)
`--restart`|停止した場合に自動再起動するかどうかのオプション(no/on_failure/on_failure:回数n/always/unless-stopped)
(`image_name`)|利用するDockerイメージ名を指定します。
(`python /var/bar/baz.py`)|コンテナで実行するコマンド

※オプションは他にもありますが、基本的なものを列挙してます。

作ったコンテナに入るのは、以下。

```bash
foo@gpu:~$ docker exec -it container_name /bin/bash
```

## 補足
`docker-compose`で同じことをする場合は、以下の`docker-compose.yml`があるのと同じディレクトリで`docker-compose up -d`を実行します。

```yaml:docker-compose.yml
version: '3.8'

services:
  container_name:
    image: image_name
    container_name: container_name
    stdin_open: true
    tty: true
    ports:
      - 5060:5000
    environment:
      - SOME_ENV=foobar
    volumes:
      - /home/foo/bar:/var/bar
    restart: unless-stopped
    command: python /var/bar/baz.py
```
[自分用メモ]Dockerのまとめ

#はじめに
本記事は完全自分用の記事になります。予めご了承下さい

#Dockerとはなにか
コンテナ型の仮想環境を作成、実行するためのプラットフォームのこと

#ユースケース
・アプリケーション開発環境
・検証環境、本番環境
・Weｂサーバ、データベースサーバなどの構築

#Docker導入のメリット
・再現性の高い環境を用意できる
・プログラムの実行環境を素早く立ち上げることができる
・設定ファイル共有すればPJメンバーで同じ環境を立ち上げることができる
・PC環境を汚さずに済む（ごちゃつかない）

#ホスト型仮想化とコンテナ型仮想化

ホスト仮想型ハイパーバイザーのうえに、それぞれの複数の仮想マシンがあり、それぞれがゲストOSをもっている。そのため、イメージサイズが大きく、通常のOSと同じように起動に時間がかかる。また、ハードレベルで分離しているので分離レベルが大きい。

一方で、コンテナ型仮想化はDockerエンジンの上にこれぞれのコンテナがあり、これらはホストOSを共有する。そのため、イメージサイズが小さく軽量である。しかし、複数のOSは導入できない（ホストOSがひとつのため）。また、分離レベルは低い。

#Dockerイメージ
コンテナの雛形で、コンテナ実行に必要なファイルをまとめたファイルシステム。
イメージ上のデータはレイヤで構成され読み取り専用
コンテナを移動すると、コンテナレイヤーが追加され、このレイヤーは読み書き可能である

#コマンド一覧

以下にコマンドを一覧として記載してます。役割については、コメントアウトで記載中！

```
$ docker images #取得したイメージの一覧
$ docker tag docker/whalesay my_whalesay #イメージ名を変える、ただしImageIDは変わらない
$ docker tag docker/whalesay my_whalesay:ver1 #上記と同じだが、ImageIDも変わる

$ docker inspect my_whale #詳細情報の表示
$ docker rmi docker/whalesay　#イメージ削除
$ docker rmi -f docker/whalesay #イメージ強制削除
$ docker pull docer/whalesay　#イメージを取得

$ docker build -t docker-whale . #Dockerfileからイメージをビルドするコマンド

#docker huｂにプッシュするための一連操作
$ docker login 
$ docker tag docker-whale ~~~/docker-whale:ver1  # Docker ID リポジトリ名/イメージ名:タグ名
$ docker push ~~~/docker-whale:ver1 


$ docker run --name コンテナ名 -d -p ホスト側ポート番号:コンテナ型ポート番号　イメージ名#例：nginxのコンテナを立ち上げる方法(バックグラウンド)

#nginxのコンテナを立ち上げるコマンド〜バインドマウントを使用するケース〜
$ docker run --name コンテナ名 -d -v ホストディレクトリ:コンテナ側のマウントポイント:

$ docker cp <ホスト上のコピーしたいファイルパス>　<コンテナ名>:<コピー先>
$ docker cp <コンテナ名>:<コピーしたいファイルパス>　<コピー先のパス>

$ docker ps #コンテナ一覧　-aで起動してないものも表示

$ docker exec -it <コンテナ名>　/bin/bash # コンテナのシェルに接続するコマンド,exitしてもコンテナは終了しない


$ docker commit <コンテナ名>　<イメージ名>:<タグ名># コンテナからイメージを作成,docker hisｔoｒｙコマンドに記録されない

```

#おわりに

Dockerの勉強超絶楽しいです（笑）
引き続き続けてまいります！
brew cask実行方法が変わっていた


## 参考：
https://github.com/Homebrew/homebrew-cask/blob/master/USAGE.md
Homebrewアップデートしたら使えなくなりました。
元々非推奨だったようです。

## 例：
```bash
$ brew cask install docker // 旧
$ brew install docker --cask // 新
```
Rails の link_to メソッドで :delete や :put を指定しても GET のリクエストが送信されてしまう理由と対策

最近Railsの学習を始めたのですが、ログアウト機能を実装していた際にハマったので、メモとして残します。

#問題の概要
railsのlink_toメソッドを使って、以下のようにログアウト用のリンクを実装しました。

``` application.html.erb
<%= link_to 'ログアウト', logout_path, method: :delete, class: 'nav-link' %>
```
method: :delete として、HTTPメソッドをDELETEに指定しているのですが、なぜか最終的にGETになってリクエストが送られるという現象に遭遇しました。
ちなみにlink_toメソッドを使って生成されたHTMLのソースを確認したところ

```
<li class="nav-item">
    <a class="nav-link" rel="nofollow" data-method="delete" href="/logout">ログアウト</a>
</li>
```
となっており、きちんとaタグでdata-method="delete"となっていました。

#解決法
いろいろと情報を探っていると、RailsではJavaScriptを使って、サーバーにリクエストを送信することもあるようです。
なので、JavaScriptを導入できていなかった場合に上記のようなHTTPメソッドのerrorが起こってくるようです。
自分の場合、Webpackerを導入しようとしていて、どこかで、手順の漏れがあったようです。
結局、現在制作中のアプリ(Rails学習のため作成)にはWebpackerを導入する必要性がなさそうだったので、Rails newを実行した時にデフォルトで記載されていた、以下の記述に戻して

```application.html.erb
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```
app/asset/config内のapplication.jsに以下の記述を追加するとしっかりとDELETEでリクエストが送信できました。

```application.js
//= require jquery
//= require jquery_ujs
```
[Ubuntu] GPUのNVIDIAドライバ超簡単設定(easy setting NVIDIA-driver for GPU)

# Overview
仮想通貨をマイニングしようとしてNVIDIAドライバを設定しようとしました。しかし、他サイトは手順が多いので簡略手順を記述します。

(I tried to set the NVIDIA driver in an attempt to mine cryptocurrencies. However, other sites is since there are many procedures, I will describe a simplified procedure.)

# Environment 
- EC2 Incetanse: p2.xlarge
- GPU: NVIDIA Tesla K60
- Distribution: ubuntu 16.04 or ubuntu 18.04 or ubuntu 20.04

# Operation
## 1. Install repository of NVIDIA-driver on PPA
`$ sudo add-apt-repository ppa:graphics-drivers/ppa`
## 2. Update apt
`$ sudo apt update`
## 3. Install ubuntu-drivers-common
`$ sudo apt install ubuntu-drivers-common`
## 4. Check recommend driver
`$ ubuntu-drivers devices`

<font color="red">今回はnvidia-driver-460でした。(NVIDIA Tesla K60 is nvidia-driver-460）</font>

## 5. install nvidia-driver 
`$ sudo apt install nvidia-driver-460`

## 6. Reboot
`$ sudo reboot`

## 7. Check
`$ nvidia-smi`
client_loop: send disconnect: Broken pipe となってファイルの更新ができない

今までサーバーのファイル更新を行なっていたのに、急に出来なくなってしまった・・・
いや正確にはファイル更新を行なっている途中で必ず切断されてしまう

```
 DEBUG [21e580f4] 	client_loop: send disconnect: Broken pipe
 DEBUG [21e580f4] 	client_loop: send disconnect: Broken pipe
 DEBUG [21e580f4] 	rsync: writefd_unbuffered failed to write 32768 bytes [sender]: Broken pipe (32)
 DEBUG [21e580f4] 	rsync: connection unexpectedly closed (102 bytes received so far) [sender]
 DEBUG [21e580f4] 	rsync error: unexplained error (code 255) at 
```

ネットで調べるとほとんどの人は ~/.ssh/config に

```
ServerAliveInterval 60
TCPKeepAlive yes
```

を追記して解決しているけど、自分は全く効果なし・・・

解決した方法としては、こちらの記事を見つけ、ノートンの設定を一時的に遮断することでクリア！

https://discussions.apple.com/thread/252711285

![スクリーンショット 2021-05-10 18.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/68847c4f-c88b-ba8e-c84f-c9c219de782f.png)

原因はOSを最新（BigSur 11.3.1）にしたことによってセキュリティソフトとバッティングか何かしちゃったんだと思う

めちゃくちゃ解決に時間かかったわ・・・
エクセルのシートの非表示再表示

をしょっちゅう忘れるのでQiitaにメモる。

[ワークシートを非表示または再表示する - Office サポート](https://support.microsoft.com/ja-jp/office/%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B7%E3%83%BC%E3%83%88%E3%82%92%E9%9D%9E%E8%A1%A8%E7%A4%BA%E3%81%BE%E3%81%9F%E3%81%AF%E5%86%8D%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-69f2701a-21f5-4186-87d7-341a8cf53344#:~:text=%5B%E3%83%9B%E3%83%BC%E3%83%A0%5D%20%E3%82%BF%E3%83%96%E3%81%A7%E3%80%81%5B,OK%5D%20%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)

[ホーム] タブの [セル] グループで、[表示設定の書式設定] >[>非表示&シート>を非表示にする] をクリックします。

との事っ
同じLAN接続上のWindowsPCとMacでファイル共有をする話

## いきさつ
２年ほど前から持ち運び用のMacBookProと家でゲームしたりするPCとのファイル共有をしたかったが、「MacBook Windows ファイル共有」等で調べてもあんまし上手く行かなかったので長いこと放置していた。
改めて挑戦したところあっさりできたため覚え書きとして残す。

## モチベーション
同じLAN上のWindows PCとMacBook Proのファイルを転送したりしたい。

## 方法

### 前提
共有したいPCが同じLAN上にあることをipconfig等で確認する。
#### Windowsでやること
コントロール パネル -> すべてのコントロール パネル項目 -> ネットワークと共有センター -> 共有の詳細設定の変更から「ネットワーク探索」、「ファイルとプリンタの共有」を有効化する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210994/54b506a8-54db-d9a7-d882-484ca2f611f4.png" width=600>


#### Macでやること
システムと 環境設定-> 共有のウィンドウから、「オプション」を開き、「SMBを使用してファイルやフォルダを共有」にチェックを入れる。同じく、共有するユーザにチェックを入れる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210994/50d96dd9-fc87-8a5f-e891-a49566dfc269.png" width=600>

### WindowsPCからMacBook Proのファイルを閲覧,転送する
#### Macでやること
「システムと 環境設定」-> 「共有」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210994/50d96dd9-fc87-8a5f-e891-a49566dfc269.png" width=600>
1. コンピュータ名の下に
```ローカルネットワーク上のコンピュータから、次のアドレスでこのコンピュータにアクセスできます：```
と書かれており、アドレスが明記されている（編集ボタンを押すと編集もできる）ので、
そのアドレス（ここでは*MBpro.local*）を覚えておく。
2. ファイル共有のチェックを入れ、
共有フォルダに共有したいファイルの入ったフォルダを設定、ユーザに読み/書きの権限を与える。

#### Windowsでやること
先程覚えておいたアドレス（ここでは*MBpro.local*）をWindowsのエクスプローラーを開いて
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210994/d925e3cb-702d-6baf-9b30-bb8e45d89f6f.png" width=600>
アドレス欄に```\\<覚えたアドレス>```の形で入力。

### MacBook ProからWindowsPCのファイルを閲覧,転送する
#### Windowsでやること
Windows PCのローカルIPv4アドレスを覚えておく。Powershellでipconfigを叩くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210994/a8a1d4fb-6726-b2ff-6728-f2636e38ced0.png)
こんな感じで出てくるので、このIPv4アドレス（192.168.1.50）を覚えておく。

#### Macでやること
Finderの上部メニューから「移動」タブを開き、「サーバに接続」を選ぶ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210994/9c5500aa-04b7-4d8f-830a-86b1005b2b51.png" width=600>
こんな感じでプルダウンメニューのところに
```smb://<覚えたアドレス>```の形で入力、接続ボタンを押すとFinderのUIでWindowsPCのファイルをいじれる。
マウントするフォルダを問われることがあるので任意でえらぶ。

### 使用したPC
- MacbookPro 13-inch 2016 two thunderbolts
- Windows 10 Home Edition

### 参考にさせていただいたもの
- MacからWindowsコンピュータに接続する

https://support.apple.com/ja-jp/guide/mac-help/mchlp1660/mac

- Macユーザとファイルを共有できるようにWindowsを設定する

https://support.apple.com/ja-jp/guide/mac-help/mchlp1659/11.0/mac/11.0
【BacklogAPIレート制限対応】ユーザーごとのAPIレートの監視をする仕組みを作った

# 背景
**2021年7月末**からBacklog APIに対するレート制限が実装される。

レート制限に関するブログ : https://backlog.com/ja/blog/backlog-api-rate-limit-announcement/

このレート制限は、APIの種類ごと・ユーザー単位・分単位での制限となる。

この対応のために、まずBacklog APIを利用している各サービスでのAPI利用状況を把握し影響箇所を調査する必要がある。

# 方法
「レート制限情報の取得」APIが用意されている。このAPIを利用することで、その時点のAPI利用状況が把握できる。
https://developer.nulab.com/ja/docs/backlog/api/2/get-rate-limit/#

ただし、**得られる情報はAPIのリクエストを送った時点の情報のみ**であり、特定期間内における利用状況を把握するためには、その期間中に**定期的にこのAPIを実行し情報を取得する必要がある**。

そのために、以下の簡易な監視システムを構築した。

## 監視システム
![BacklogAPIレート監視 構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/2c6347d7-7145-226f-a0ae-3f0a64d90429.png)

### リポジトリ
作成したものは以下のリポジトリに格納。

https://github.com/mmclsntr/backlog_api_rate_monitoring

ソースコード等はこのリポジトリを参照

### 仕様・注意事項
- 調査したいBacklogユーザーのAPIキーを使い、レート制限情報の取得APIを定期実行して利用状況を把握する
    - https://developer.nulab.com/ja/docs/backlog/api/2/get-rate-limit/#
- 取得した情報はCloudWatchメトリクスにカスタムメトリクスとして値を格納し、ダッシュボードでグラフを参照できるようにする。
- 上記構成図の通り、バッチ処理はLambda + Eventbridgeで構成。
- 取得頻度は **約5秒**
    - Lambdaは1分毎に実行される。コード内で5秒置きに取得するように実装。
- 値の精度
    - Lambdaの重複実行に対する冪等な実装はしていない。
    - レート制限情報を取得する時間とメトリクスを作成する時間同じになるよう実装していないため、ms単位での誤差がある。
    - 以上のように **完全に正確な値であるとは保証されないが、利用状況の傾向や大幅なリクエスト増加を見る前提で、この精度で十分であると判断する。**
-  **このレート情報取得自体にreadが使われるため、readの値にはその分が上乗せされたで状態で集計される**

### メトリクス仕様
Namespace : BacklogApiRate

|メトリクス名|説明|
|---|---|
| Limit | 制限数|
| Remaining | 制限残数 (残り利用可能なリクエスト数)|
| Usage |利用数。Limit - Remaining|

|ディメンション|説明|
|---|---|
| ApiKey | 対象のAPIキーの先頭5文字 |
| ApiType | 対象のAPI種別。read = 読み込み , update = 更新 , search = 検索 , icon = アイコン。 [詳細](https://developer.nulab.com/ja/docs/backlog/rate-limit/#) |


### ダッシュボードを別途作成
収集したメトリクスをダッシュボード化して可視化。ダッシュボードは上記デプロイ後、別途作成。

作成例
![e9d230ae-80de-428d-adb8-4161f8f7afa1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/8fe6cd50-ed91-1121-dd30-7fd7e34868cb.png)

# まとめ
簡易ではあるが、傾向を把握するのには十分な精度で利用状況を可視化することができた。これを元に影響箇所を調査し対応することとした。
ただし、複数のワークロードにまたがって1つのユーザーをAPIに利用されていることもあるため、できればAPIキー単位でレート情報を取得できれば嬉しかった。
情熱プログラマーを読んでみた感想

##概要
情熱プログラマーという本を読んでみた感想を述べます。
本の詳細情報は以下サイトを参照
[情熱プログラマー ソフトウェア開発者の幸せな生き方](https://shop.ohmsha.co.jp/shopdetail/000000001848/)

##この本はどんな本？
ソフトウェア開発者として生きていく為に必要な考え方だったり行動の指針をつくる手助けとなる本でした。
5章から構成されており、本自体も薄い為1日でさくっと読める内容量です。
個人的に刺さったフレーズや行動見本などを章ごとに紹介します。

###第1章　市場をえらぶ
まずこの章では、自分自身の時間をどのビジネスに投資するのか考える必要があるとのことだった。
キャリアを考えていく中で、筆者も以下のように述べており、
>本当に情熱を持てる仕事を探そう

情熱を持って取り組める仕事を探す上で簡単な日誌を付けてみることを勧めている。
日誌にはその日のやる気度合いを記載し、継続的に付けることを第一としている。
そして2週間後、客観的に自分を判断することで、自分にとっての情熱を測ることが出来るというものだった。

###第2章　製品に投資する
第2章の中で最も印象に残った一文は以下である。
>本当に価値のあるものを生み出せるかどうかは、そこに注ぎ込んだ血と汗と資金によって決まる

筆者曰く、投資対象のスキルや技術をどのように選択するか、自分自身への投資方法について様々な方法があると述べ、その具体例を記してくれている。
例1
　「なぜ」「どうして」を考える
　その仕組みがどうなっているのか、そうなるのは何故かを考えると良い
例2
　手本となる人の特徴を書き出し、その人から見た自分はどんな特徴が上げられるのか、考えてみる
例3
　何かプロジェクトを選び、コードを本のように読んでいくこと
　要点はメモに残しつつ、そのプロジェクトの長所と短所を記載すると良い
　そしてそのプロジェクトの方法論を批評的な目で見てみるのだ。
　自分のコードに利用出来そうなものはないかも見ていくと良いだろうとのこと。

他にもいろいろな例があったが割愛

###第3章　実行にうつす
第3章は「実行にうつす」という題目の通り、実行にうつしてく際の心構えだったり、やっていくと良いことが記載されている。
その為には『「今できることは何だろう？」を口癖にすると良い』と本書では述べている。

####良いマネージャーって何？
良いマネージャーとはピンチヒッターではないとも述べている。以下引用文である。
>マネージャーとは、チームの仕事に優先順位を設定し、チームが仕事をこなす為に必要なものを用意し、チームがやる気と生産性を意地できるように配慮し、最終的に要求を実現すること

ミーティングはマネージャーが設定するものだとされているが、明日から、いや来週からいつ設定されているのか、マネージャー以外の人間は見ていく必要があると改めて実感した。
また、読み進めていくと以下のような記載があった。
>今日の自分に価値はあったのか、自問しろ

「自分に厳しく、他人に優しく」の精神があれば、同意できるものだったが、あくまで精神状態が正常な人向けで、もし精神が病んでいたり切羽詰まっている状態であれば、ただ自分を追い込むだけのものとなってしまうので、この文章は飛ばして読んでも良いと思った。業界にいる企業はピンキリなので。

####作業時間って何時間？
筆者は、週40時間以上働いてはいけないという主張を周囲がしていることに対して同意し、
仕事に使える時間はわずか8時間！と割り切って仕事をした方が効率が良い。と筆者は述べていた。
これは今の日本の多くの企業も同意し仕組みを変えていってもらいたいと思った。
緊急事態宣言が延長されても、尚出社を義務化し残業手当で稼ぐような働き方でしか雇用しない企業は山といるので、改善していってほしい
（私もかつて所謂ブラックと呼ばれる企業で働いていたので状況を知っている）

####相手を困らせない為の「できます」はNG
日本人なら誰しも幾度となく感じ、言ってきたであろう相手を困らせない為の「できます」
それは「嘘」になると筆者は述べている。
確かに、「できます」と言ったことによって出来なかったことが出来るようになり、嘘が本当になることもある。
しかし、それはよっぽどのリスクを抱えなければならない。なぜならその「嘘」がバレてしまう危険性を伴うからだ。
>できないことは出来ないとはっきり伝える

筆者は無理に自分を追い詰める必要はないとの考えだった。
これには、以前の私だったらおそらく同意出来なかった部分だと感じた。
周囲に「できない」と伝えることにより、自分の評価が下がるのではないか？
或いはもっと悪い展開になってしまうのではないかと恐れている自分もかつて存在したからだ。
この本を読み、発想の転換が少しなりとも発生した。（ただし浸透するには少し時間がかかった）

###第4章　マーケティング・・・スーツ族だけのものじゃない
自らの目標を立てる為の方法は2つあると筆者は言う。
>リーダーに自分の能力を理解させる方法
みんなに自分の存在を知ってもらい、持て余している難題を解決できる人物だとわかってもらう方法

2種類それぞれについて詳しく述べていく
####リーダーに自分の能力を理解させる方法
リーダーに自身の能力を理解してもらう方法として、まず、マネージャーの求める人物像を理解する必要がある。
恐らく、マネージャーは自分たちが進めるプロジェクトに安心感を与えてくれる人物を求めるだろう。
よって、その安心感を与えられるような人間になれば良いとのことだった。
「安心」とはすなわち「信頼」だと考え、行動例として自分の書いたコードを3回見直してみることや、開発日誌をつけることを勧めている。

####みんなに自分の存在を知ってもらい、持て余している難題を解決できる人物だとわかってもらう方法
こちらの方法については、仮に1週間かかると想定されていた仕事を1日で終えてみることを実践例として挙げていた。
自分自身が成し遂げたという事実を作り、解決に導くことで認識してもらうことが出来る。

###第5章　研鑽を怠らない
####終わりのない道
エンジニアとして働くということは、道に終わりがないと述べている。筆者は努力した過程にこそ注目してほしいと述べていた。
>昇給や昇進がゴールではなく、その成果を得る為に努力した時間が大切

##まとめ
###教訓
"好奇心を持って何事も地道に取り組み続ければ、いつかわかってくるようになる"

筆者は好奇心が人一倍強かったらしい。
なので、どんな小さな好奇心でも持って取り組めば、道になっていくとの主張にも捉えられた。
一見して当たり前と思われがちなことばかり書いてあったかもしれないが、改めて読み直すと学ぶことって多いと痛感した1冊でした。

##明日から実践出来そうな項目
・毎日やること
　開発日誌をつける
　ブログを書く
　個人的なやる気度合いやその日やったことを日誌として記録する

##おわりに
最後までお読みいただきありがとうございました。
各章ごとに割愛した箇所が多々あるので、詳細をもっと知りたいという方は自身で購入して読んでみてください！
【Java】URL文字列からドメインを取得する

# TL;DR
`URI.getRawAuthority`が良さげに見えました。

# やり方
やり方はいくつか考えられますが、ここでは`java.net.URI.getRawAuthority`を使ったやり方を紹介します。

```java:サンプルコード
import java.net.URI;
import java.util.stream.Stream;

Stream.of(
        new URI("url"),
        new URI("url.com"),
        new URI("./url/foo"),
        new URI("http://url"),
        new URI("http://url.com/"),
        new URI("http://aa.bb.cc.com/foo/bar"),
        new URI("https://あ.い")
).forEach(it -> System.out.println(it.getRawAuthority()));
```

```:実行結果
null
null
null
url
url.com
aa.bb.cc.com
あ.い
```

## 解説
サンプルコードからは以下のことが確認できます。

- 入力フォーマットは、`http(s)://`を頭につければ後ろが`FQDN`形式になっていなくてもOK
  - 相対パスを渡した際は`null`になる
- 日本語（多バイト文字）が入っていても動作する
- ドメイン末尾の`/`やパスは削除される

変なものを入れると`null`を返されてしまったり、`URISyntaxException`を投げられることが有る点には注意が必要です。
また、`getAuthority`ではなく`getRawAuthority`を用いている理由は、エスケープされた入力が意図せずデコードされるようなことを回避するためです。

`URI`からドメインを取得する方法は他にも有りますが、自分の要件ではこのやり方で十分動作したため、ここでは解説しません。

より詳細な解説は下記の`Javadoc`を参照ください。

https://docs.oracle.com/javase/jp/8/docs/api/java/net/URI.html

また、`URL`クラスはあまり良くないそうなので、必ず`URI`クラスを用いることをお勧めします。

https://stackoverflow.com/questions/9607903/get-domain-name-from-given-url
OpecCV C++ Mat 最小値・最大値・座標の取得

# はじめに
cv::minMaxLoc 関数を使った最小値・最大値・座標の取得方法をメモした。

# cv::minMaxLocの定義
cv::minMaxLoc関数を使って最小値・最大値・座標を取得することができる。
ただし、関数はシングルチャネル配列のみ適用可能。

マルチチャネル配列で適用したい場合、
cv::reshape() を用いて配列をシングルチャンネルに再編成するか
cv::extractImageCOI() や cv::mixChannels()、cv::split() などの関数を
用いて特定のチャンネルを抜き出す必要あり。

```c++
void minMaxLoc(
    const InputArray& src,
    double* minVal,
    double* maxVal = 0,
    Point* minLoc = 0,
    Point* maxLoc = 0,
    const InputArray& mask= noArray()
    )
```
※ n 次元の場合、src は  cv::SparseMat 型。

* 第 1 引数：src
シングルチャンネルの入力配列。

* 第 2 引数：minVal
最小値が入る変数へのポインタ。不要ならば NULL ( 0 ) を指定。

* 第 3 引数：maxVal
最大値が入る変数へのポインタ。不要ならば NULL ( 0 ) を指定。

* 第 4 引数：minLoc
( 2 次元の場合 ) 最小値の位置が入る変数へのポインタ。
不要ならば NULL ( 0 ) を指定。

* 第 5 引数：maxLoc
( 2 次元の場合 ) 最大値の位置が入る変数へのポインタ。
不要ならば NULL ( 0 ) を指定。

* 第 4 引数：minIdx int 型。
( n 次元の場合 ) 最小値の位置が入る変数へのポインタ。
不要ならば NULL ( 0 ) を指定。必要なら src.dims 要素の配列を指する。
各次元の最小要素の座標が順次格納される。
mat.dims：次元数

* 第 5 引数：maxIdx int 型。
( n 次元の場合 ) 最大値の位置が入る変数へのポインタ。
不要ならば NULL ( 0 ) を指定。

* 第 6 引数：mask
部分配列を選択する為に利用されるマスク。

# 実行例
```
 double mMin, mMax;
    cv::Point minP, maxP;
    cv::Mat mBar = (cv::Mat_<double>(3, 4) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
   
    cv::minMaxLoc(mBar, &mMin, &mMax, &minP, &maxP);
    std::cout << mBar << std::endl;
    std::cout << "min: " << mMin << ", point " << minP << std::endl;
    std::cout << "max: " << mMax << ", point " << maxP << std::endl;
    //pointは[x,y]で出力される
```

出力結果
[1,  2,  3,  4;
 5,  6,  7,  8;
 9,  10, 11, 12]
min:  1, point [0, 0]
max: 12, point [3, 2]

# 参考
https://docs.opencv.org/3.4/d2/de8/group__core__array.html#gab473bf2eb6d14ff97e89b355dac20707
GIF画像について

Web上で動きがループするアニメーションや動画を見かけたことがあると思います。SNSだと画像の下に「GIF(Graphics Interchange Format)」という言葉が付いているものもありますね。
GIFとは画像形式の一種で、簡易的なアニメーションを表示することができる画像ファイルフォーマットになります。動く画像です。では、静止画でもなく動画でもなく、GIF画像にするメリット・デメリットは何があるのでしょうか。

GIFのメリット
①GIFはユーザーの環境を選ばないユーザーの環境を選ばない
比較的早くから使われ出した画像ファイルのフォーマットなので、ほとんどの環境で標準的にサポートされています。PCでもスマホでも環境を選ばずに表示させることが可能です。

②再生ボタンを押す必要がない
通常の動画と違って、再生?停止ボタンがありません。勝手に再生してくれてずっとループしてくれます。いちいちボタンを押さなくても勝手に始まるので、ユーザーの手間も省けますね。

③比較的簡単に作れる
動画編集よりも簡単です。無料でGIFアニメを作れるツールも出ています。普段紙物のデザインをしている私でも画像が切り替わるGIFアニメは比較的簡単にできました。

GIFのデメリット
①GIFは音声が入れられない音声が入れられない
GIFはあくまで画像形式の一種です。したがって、動画のように音声を入れることはできません。

②長尺のアニメーションには不向き
時間が長くなればその分、データ容量も大きくなり、表示するのに時間がかかります。長尺の場合、動画ファイルよりもデータ容量が重くなることもあります。また、動画のようにコントロールバーを表示できないため、長尺の場合は利便性の点でも問題が出てきます。GIFの場合は短時間でさっと見られるものが相性が良いと思います。

③色数に制限がある
これが大きなデメリットで、表示できる色数に制限があります。最大256色までしか使えないので、複雑なグラデーションや実写の風景等はあまり綺麗に再現されません。

GIFに向いているもの
上記のメリット・デメリットから、GIFに向いている物は以下のように言えます。

①色数が少ない（グラデーションがないもの、カラーの風景画は厳しそう）
②低解像度
③短時間（単純に時間が短いもの、アニメーションのフレームが少ないもの）
「向いていないものだけどGIFにしたい…」そんな時は色数を減らす、画像サイズを小さくする、アニメーションのフレーム数を減らす等である程度は対応できます。それでもダメならGIF以外のものに変えた方がいいかもしれません。

実は面白いGIFは自分でも簡単に作ることができます。実際に作ってみる方法こちらへのビデオをご参考になってください（https://www.youtube.com/watch?v=27kENmtyj_s&t=82s）
readonlyでinput要素での入力を不可にする

最近ポートフォリオ内でレコード登録からデータベース反映までの機能を作成しました。

その際に、`入力フォームと同じフォームデザインで入力内容確認画面も作成したかった`のですが、入力フォームと同じフォームに入力した内容を表示するだけでは、`確認画面なのに入力内容を変更できてしまう`という問題にずっと悩んでました。
（前に作成したポートフォリオでは、入力内容確認をテーブルで表示していた為、入力フォームとテーブルで全く異なるデザインになってしまい統一感が無かった。）

結果、input要素内で`readonly`を指定してあげるだけで解決できました（笑）

とても短い内容ですが、今回は`readonly`についてご紹介するので是非参考にしてもらえればと思います！

#readonly
readonlyは、`input要素での入力を不可にし、編集ができない読み取り専用のinput要素にしてくれます`。

```
<input type="text" name="" value="" readonly>
```

1.登録内容を入力して確認画面に送信する。
2.確認画面フォームのinput要素で`readonly`と`valueに登録画面から取得したデータ`を指定。

これだけで、登録内容入力画面と同じデザインで統一感のある入力内容確認画面を作成することができます！

Tailwind CSSを使用されている方は、下記のサイトを参考にするとアプリらしいフォームを作成することが出来るので、是非ご覧になってみてください！
https://absarcs.info/how-to/customize-form-tailwind-css/

参考サイト
`readonly`について
http://html5.cyberlab.info/elements/forms/input-readonly.html
grepで正規表現をエスケープする

＃個人的なメモですみません。

## 背景
`grep`していて、ドット`.`が正規表現として解釈されちゃうなぁと思い、エスケープしようとバックラッシュ`\`をつけたが上手くいかず、調べた。
＃正規表現は勉強中。。

```bash
foo@gpu:~$ docker images | grep 3\.7
erudikaltd/scoold                                                                         latest                                276a123371e3        16 months ago       167MB
tensorflow/tensorflow                                                                     1.12.3-gpu-py3                        9b669e82b6ac        22 months ago       3.79GB
python                                                                                    3.7.3-stretch                         59a8c21b72d4        2 years ago         929MB
jupyterhub                                                                                latest                                c4bced83878a        2 years ago         9.05GB
```
この例では、`3.7`でひっかけようとして、`337`や`387`が引っかかってしまった。

## 結論
エスケープは、引用符の中でしか通用しないらしい。

```bash
foo@gpu:~$ docker images | grep "3\.7"
tensorflow/tensorflow                                                                     1.12.3-gpu-py3                        9b669e82b6ac        22 months ago       3.79GB
python                                                                                    3.7.3-stretch                         59a8c21b72d4        2 years ago         929MB
```

`-F`オプションをつけることで強制的に解釈をとめることができることもググって学んだ。

```
foo@gpu:~$ docker images | grep -F 3.7
tensorflow/tensorflow                                                                     1.12.3-gpu-py3                        9b669e82b6ac        22 months ago       3.79GB
python                                                                                    3.7.3-stretch                         59a8c21b72d4        2 years ago         929MB
```
【php】おみくじ、大吉・中吉・小吉・凶・大凶

```PHP
// おみくじを作る
// 比較演算子 == > < >= <= !=
//　大吉・中吉・小吉・凶・大凶
<?php
$omikuji = rand(1,10);
echo $omikuji."\n";
        if ($omikuji == 1) {
          echo "大吉";
        } elseif ($omikuji == 2) {
           echo "中吉";
        } elseif ($omikuji <= 4) {
           echo "小吉";               // 3,4
        } elseif ($omikuji <= 7) {    
           echo "凶";                // 5,6,7
        } else { 
           echo "大凶";              // 8,9,10
        }

?>
```
独学でHTML/CSS/Javascriptを学んだ素人がもう一度1から学びなおす Part3

<h1>レスポンシブデザインについて</h1>
レスポンシブデザインについて学んだことを書き留める。
実装方法はいくつかあるようだが、とりあえずはわかりやすかった方法で


◆サンプル

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>StayWorld</title>
    <link rel="stylesheet" href="mobile.css">
    <link rel="stylesheet" href="desktop.css" media="screen and (min-width: 600px)">

    
</head>
<body>
    <h1>Test</h1>
    
</body>
</html>
```
linkにmedia属性を付与する。
media="screen and (min-width: 600px)
screen：ブラウザを使う場合は基本これ
min(max)-width: スタイルを適用する条件（画面のサイズ）

<h4>cssはモバイルファースト</h4>
デスクトップからスタイルを設定したいところだが、PC画面のほうが往々にしてページが複雑化しやすい。モバイルのスタイルをベースとして、不足分にデスクトップのスタイルを適応するほうが冗長な記述が少なく済む。
[python] リストの特定の要素がいくつ含まれるかをカウントする

## 背景
ある要素がリスト内にいくつ含まれるのかを知りたいと思ったが、collections.Counterだと要らないのも出てきちゃうなぁと思い、ググって`count`メソッドの存在を知った(恥)。

## 結論

### どれか1つ特定の要素のカウントを知りたい場合
```python
some_list = ['foo', 'bar', 'baz', 'bar', 'qux', 'bar', 'bar']
print(some_list.count('bar'))
# 4
```

### 複数の要素のカウントを知りたい場合
```python
from collections import Counter

some_list = ['foo', 'bar', 'baz', 'bar', 'qux', 'bar', 'bar']
print(Counter(some_list))
# Counter({'bar': 4, 'foo': 1, 'baz': 1, 'qux': 1})
print(Counter(some_list)['bar'])
# 4
```
`collections.Counter`クラス(dictのサブクラス)として得られます。

```python
print(issubclass(type(dict(Counter(some_list))), dict))
# True
```
Rakefileでnamespace外のタスクを指定

Rakefileでnamespaceを使ったときにハマることがあります。

* namespaceの内と外で同じタスク名(例えば`foo`)を定義
* そのnamespaceの中から外の`foo`を参照したい

以下のようなことです。

```ruby:Rakefile
task :foo do
  puts '外のfoo'
end

namespace :bar do
  task :foo do
     puts 'bar:foo'
  end

  task baz: [:foo] do
    puts '"外のfoo" と表示されているはず'
  end
end
```

しかし `rake bar:baz` の結果は

```console:console
$ rake bar:baz
bar:foo
"外のfoo" と表示されているはず
```

つまりタスク `bar:foo` が外側のタスク `foo` をマスクします。こういうときはルートのnamespaceからのタスク名を指定(絶対指定)するか相対指定すると良いです。参照: [Rakefile Format > Name Resolution](https://github.com/ruby/rake/blob/master/doc/rakefile.rdoc#label-Name+Resolution)

絶対指定の例を記します。ルートのnamespaceは `rake` ですので、タスク `bar:baz` の依存タスクの指定は

```diff
-  task baz: [:foo] do
+  task baz: ['rake:foo'] do
```

のようにすればよいです。相対指定の例は省略します。
［Laravel］Implicit BindingとgetRouteKeyName() メソッドについて

LaravelのImplicit BindingとgetRouteKeyName() メソッドについて、備忘録でまとめます！

#1. ☆彡Implicit Bindingとは☆彡
URLからid を受け取って、Controllerでそのidを元にデータを引っ張ってくるという流れはよく行われるので、特に記述しなくても、自動的にモデルをデータに結びつけられるImplicit Bindingという仕組みが用意されているのだそう。

例えば、ブログサイトとかで個別記事のURLを『 http://127.0.0.1:8000/articles/1 』のようにしたかった場合。（環境はローカル環境を想定。）


ルートファイル（web.phpね。）の記述は、以下のようになる。

```
Route::get('/articles/{article}', 'ArticlesController@show'); 
```

これにヒットする、ArticlesControllerのshow()メソッドを以下のように書いたとすると。。。

```
public function show(Article $article) {
      return view('articles.show', ['article' => $article]);
    }
```

show(Article $article)の、仮引数の箇所の <b>『(Article \$article)』</b>の記述がImplicit Bindingとなる。
これは、Articleの部分がArticleモデルってことで、\$articleの部分が、Articleモデルのインスタンスってことになる。だから、このようなImplicit Bindingの書き方で書くと、<b>『必ずそのモデルのインスタンスが渡ってくる』</b>ってことになる。

で、ここで一つ知っておくべきことは、Implicit Bindingの場合、Laravelはデフォルトで、<b>『該当するモデルのインスタンスのidに対応するデータを取ってくる』</b>ということ。
だから、『 http://127.0.0.1:8000/articles/1 』とか、『 http://127.0.0.1:8000/articles/2 』のようなURLにしたい場合（idを普通の連番にした場合と想定。）は特に問題ないのだけれども、
『 http://127.0.0.1:8000/articles/my-profile 』とか、idではなくtitleとかの違うカラムのデータを引っ張ってきてURLにしたい場合はエラーになってしまう。
（※ ここで、idではないカラムのデータを引っ張ってきたい場合は、該当するモデルファイルにgetRouteKeyName() メソッドを追記することで解決できます。これに関しては後述しています。）

つまり、以下二つのコードは全く同じ結果を返すことになる。

```
 public function show($id) {
      $article = Article::findOrFail($id);
      return view('articles.show', ['article' => $article]);
    }
```

```
  public function show(Article $article) {
      return view('articles.show', ['article' => $article]);
    }
```

1つ目はImplicit Bindingではない書き方で、2つ目はImplicit Bindingで書いたもの。
Implicit Bindingは、『(Article \$article)』の部分で、既にArticleモデルのidを引っ張ってきているから、1つ目のコードように、わざわざ『Article::findOrFail(\$id);』とかを書かなくてもいいというわけ。
因みに、findOrFail()というメソッドですが、例えは『Article::find(\$id);』と書いたとすると、もしデータベースに登録のないidでアクセスされるとエラー表示されてしまうけれど、findOrFail()であればエラー表示ではなく、『404｜Not Found』が表示されるようになるそうです。

<font color="Red"><b>！！！注意点！！！</b></font>
ルートファイルで、ワイルドカード（URLの｛｝のところ）を変更したら、コントローラーの仮引数の部分も併せて変更しなくてはなりません！↓↓の例のように、赤い文字部分は全部合わせて！

『Route::get('/articles/<font color="Red"><b>{foobar}</b></font>', 'ArticlesController@show');』

    
『public function show(Article <font color="Red"><b>\$foobar</b></font>) {
      return view('articles.show', ['article' => <font color="Red"><b>\$foobar</b></font>]);
    } 』

#2. ☆彡getRouteKeyName() メソッドについて☆彡

さて、前述した通り、Implicit Bindingはデフォルトだと、該当するモデルのインスタンスのidを引っ張ってきてしまうわけすが、これをidではないものにしたい場合は、該当するモデルファイルにgetRouteKeyName() メソッドを以下のように追記することで解決できます。
※ 『return 'slug';』のslugとは、URLの末尾の部分を任意の文字列に指定できる機能のことらしい。

```Article.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    public function getRouteKeyName() {
      return 'slug'; //Article::where('slug', $article)->first() という意味。
    }
}
```

以上です！
troccoの導入で何が改善されたか

# はじめに
当社ではデータ分析基盤改善の一環として[trocco](https://trocco.io/lp/index.html)を導入しました。
この記事ではtrocco導入により何がどのように改善されたのかをまとめて記載します。


# 0. troccoとは
troccoは[Embulk](https://github.com/embulk/embulk)をSaaS版にしたようなサービスです。各種ストレージ、SaaS、DBなどのデータ転送をWEBのGUI上で設定、管理することができます。それ以外にもRedshift/BigQueryへのクエリ発行やtrocco上のジョブの管理等の便利機能もあり非常に使い勝手が良いのが特徴です。

# 1. trocco導入を検討した理由
当社ではプロダクション用DBのコピーをBigQueryに転送し分析に用いているのですが、この転送部分に対処しにくい2点の問題があった為troccoへの乗り換えを検討しました。詳細は以下の通りです。

## 1.1 Embulk+digdag on EC2の運用問題
当時の構成では、転送はEmbulkで行い、転送ジョブや転送テーブルの制御などをdigdagで作り込み、それらをEC2上でホスティングしていました。転送自体はdigdagのスケジューリングで毎日実行されるものの、転送エラーが発生したり、Embulkやdigdagのバージョンアップに追随できていないなど問題がありました。一方で、各種設定を行った方は既に退職されており詳細が不明瞭なことと、BigQueryでの分析が重要な役割を持つ為、現状動いているインスタンスを下手にいじることができず、手詰まりになっていました。

## 1.2 作り込み部分の問題
Embulk+digdagの作り込み部分にも改良したい点がありました。当社では[弁護士ドットコム](https://www.bengo4.com/)の他に[税理士ドットコム](https://www.zeiri4.com/)や[BUSINESS LAWYERS](https://www.businesslawyers.jp/)といった各種サービスを提供しています。サービス別にDBインスタンスは分けられているのですが、当社でのdigdagのジョブ管理の仕様上、ひとつのサービスのDBしか転送できないように作り込まれていました。ジョブ管理部分を一から書き直すには労力がかかり、仮にこれを解決しても1.1で記載したセルフホストの問題があるため躊躇していました。

# 2. trocco導入後の改善点
troccoを導入することにより問題点がどのように改善されたのかを記載します。

## 2.1 運用面
冒頭でも記載した通りtroccoはSaaS版Embulkと言えるサービスです。ユーザーがやることといえばEmbulk等の設定のみあり、それらが稼働するリソース管理を全てお任せできてしまうのは非常に嬉しいです。特に当社の場合は1.1で記載した通りEmbulkを稼働させる為のリソース管理で悩みがあったため、その恩恵は非常に大きなものでした。

## 2.2 機能面
各種DBへの接続設定は独立して作成することができるため、troccoに乗り換えたことで1.2の問題は解決されました。ここでは転送機能以外に当社が活用している便利機能をいくつか紹介します。

* DWH管理機能
    * BigQueryやRedShiftの任意のテーブルに対してクエリを発行する機能です。データ転送後に集計処理を噛ませた中間テーブルを作成したり、あるカラムの型変換をかけたりと何かと融通が利く使い方ができます。当社の場合は、元々digdagで実行させていた中間テーブル生成処理をこの機能に載せ替えました。
* ワークフロー機能
    * GUIを用い、転送・DWH管理などのジョブ単位でワークフローを作成できる機能です。ジョブA~Cが完了次第Dを実行する、といった依存関係も作成することができます。当社ではデータ転送後に中間テーブル生成ジョブを実行するよう設定しています。また、終了時にSlack通知することもできます。

これら以外にも便利機能はありますが、いずれも分析基盤の運用をtroccoに寄せていけるようなものになっていました。

# 3. まとめ
troccoの導入により当初抱えていた問題を解決することができました。
今後はtroccoを使い倒していきたいと思います。

導入を検討されている方の参考になれば幸いです。

# 参考
[trocco](https://trocco.io/lp/index.html)
VScodeで日本語版LaTexをコンパイルするためにWindows版Dockerでtexlive-jaをインストールした

下図のようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/1815d5b2-06d2-6885-35c1-6cabb6e50926.png)

```docker
>docker run -d -p 80:80 docker/getting-started
docker: error during connect: This error may indicate that the docker daemon is not running.: Post "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/create": open //./pipe/docker_engine: The system cannot find the file specified.
See 'docker run --help'.
```

daemonが動いていないと返答があったので原因を探った結果，Hyper-Vの有効化を行っていなかったことが原因だった

Hyper-Vの有効化
仮想マシンを使うために必要らしい
プログラムと機能＞Windowsの機能の有効化または無効化＞Hyper-V から設定できる
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/about/

QiitaにWSL2とHyper-Vの関係について詳しく書いてくださっている記事も載せておく

https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce#hyper-v-%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3hyper-v-%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6%E3%83%BC-%E3%81%8A%E3%82%88%E3%81%B3-hyper-v-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF

DockerDesktopのインストールとユーザー登録をおこなう
https://docs.docker.com/docker-for-windows/install/

インストールしたら
右上歯車マークを押してUse the WSL based engine のチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/f1ff845c-2e28-ffb8-46e8-c9eed902cb8e.png)


あとの作業は以下のサイトが詳しく説明してくださっている

https://korosuke613.hatenablog.com/entry/2019/06/24/171246

追記1
Overleafでも動かせた
下を参照

https://qiita.com/fujino-fpu/items/d92d185da730e25743cb
redmine+Apacheでファイル容量が大きくてアップロードができない時の設定項目

![_2021-05-10_110321.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/14f69539-798e-d167-538e-3f0c1d52327a.jpeg)

上記の画像のようにredmine側の設定で上限設定を20MBにしてもアップロードできない場合がある。

Apacheの設定項目で下記の内容が記載されていて


```****.conf
LimitRequestBody 10485760
```

この場合には10MBしかアップロード制限がない。
記述を変える

```****.conf
#LimitRequestBody 10485760
LimitRequestBody 20971520
```

Apache設定の場合は設定ファイルをしっかりと確認する必要がある。
kintoneでUPSERTしてみる

今回はkintone API を使ってUPSERTしてみたいと思います。
SQLでいうところの、UPSERTとは、指定のレコードがなかったらINSERT、あればUPDATEをかけるという処理です。kintoneでは、指定のレコードをGETしてみて、なかったらPOST、あればPUTという処理になります。

kintone JavaScript Client という便利なライブラリに[UPSERT](https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/record.md#upsertrecord)がありますが、今回は純粋なkintone REST APIを使ってやってみます。

# アプリの準備
文字列(1行)フィールドを3つ準備します。

| フィールド種類 | フィールドコード | 備考 |
|:-:|:-:|:-:|
| 文字列(1行)  |  ID |  重複を禁止 |
|文字列(1行)   |  名前 |   |
|文字列(1行)   | 好きな食べ物  |   |

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/462c2c97-6a04-78f8-0862-26dc815dc8ff.png" width=500>


# JavaScript

一覧の空白部分にテキストボックス3つとボタンを1つ、
kintone UI Componentを使って設置します。
そのあたりは下記を参考にしてくださいね！

https://kintone-ui-component.netlify.app/

https://developer.cybozu.io/hc/ja/articles/201942004#step5

コード内の変数はこんな感じとします。

| 種類 | 変数名 | 内容|
|:-:|:-:|:-:|
| スペース| spUpsert  | 一覧の上の空白スペース  |
| Text  | txtId  | ID入力用テキストボックス  |
| Text  | txtName  | 名前入力用  |
| Text  | txtFood  |  好きな食べ物入力用 |
| Button  | btn  | UPSERT走らせるボタン  |


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/6db81ac4-8dd0-4179-bf09-20b944d67fd3.png" width=600>



## ボタンクリック
ボタンクリックのイベントで非同期処理できるようにasync付けておきます。

```js
btn.addEventListener("click", async (event) => {
  // 処理
});
```

入力したIDのレコードがあるかどうかGETで調べます。totalCountをtrueにしておきましょう。

```js
// 指定のIDのレコード取得してくる
const respGet = await kintone.api(kintone.api.url("/k/v1/records", true),
  "GET",
  {
    app: kintone.app.getId(),
    query: `ID="${txtId.value}"`,
    totalCount: true,
  }
);
```

レコードがあったら更新、なかったら追加します。

```js
// レコードがあったら更新（PUT）,なかったら追加（POST）する
if (respGet.totalCount > 0) {
  //PUT
} else {
  //POST
}

//表示の更新
location.reload();
```

更新(PUT)する場合
※updateKeyには重複禁止のフィールドを指定する必要があります。

```js
const respPut = await kintone.api(  kintone.api.url("/k/v1/record", true),
  "PUT",
  {
    app: kintone.app.getId(),
    updateKey: { field: "ID", value: txtId.value },
    record: {
      名前: { value: txtName.value },
      好きな食べ物: { value: txtFood.value },
    },
  }
);
```

追加する場合(POST)

```js
const respPost = await kintone.api(  kintone.api.url("/k/v1/record", true),
  "POST",
  {
    app: kintone.app.getId(),
    record: {
      ID: { value: txtId.value },
      名前: { value: txtName.value },
      好きな食べ物: { value: txtFood.value },
    },
  }
);
```


GET、PUT、POSTを組み合わせてUPSERT、参考になれば嬉しいです！
MQL4 において mingw でコンパイルした DLL を使う

表題の通りですが、インターネットを渉猟してもあまり成果がなかったので、備忘録として残しておきます。

# 背景
MQL4 から DLL による共有メモリを利用したい。（他プロセスと通信する時に便利なので。）
お金を出せば売っているが、参入障壁が低い技術に4000円も払いたくない。
一方、MS の VC++ のコミュニティ版は古いし、製品版はバカ高くて手が出ない。
そこで、手軽な mingw を使えないか、画策してみることにした。

# コード
いきなりですが、作成した DLL のコードを載せておきます。

```c++:common.cc
#include <windows.h>

class SharedMemory {
 private:
  DWORD MemorySize = 1000 * 3 * sizeof(LONG);
  HANDLE handle = NULL;
  LPVOID lpPointer = NULL;

 public:
  SharedMemory(const char *name) {
    open(name);
  }

  ~SharedMemory() {
    close();
  }

  void write(int type, long tag, long value) {
    LONG *lpCell = (LONG *)lpPointer;
    lpCell[type * 3 + tag] = value;
  }

  long read(int type, long tag) {
    LONG *lpCell = (LONG *)lpPointer;
    return lpCell[type * 3 + tag];
  }

 private:
  void open(const char *name) {
    close();
    handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MemorySize, name);
    if (handle == NULL) {
      return;
    }
    lpPointer = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if (lpPointer == NULL) {
      CloseHandle(handle);
      return;
    }
    ZeroMemory(lpPointer, MemorySize);
  }

  void close() {
    if (lpPointer != NULL) {
      UnmapViewOfFile(lpPointer);
    }
    if (handle != NULL) {
      CloseHandle(handle);
    }
    }
  }
};

static SharedMemory mem("mql4_shared");

extern "C" __declspec(dllexport) void write_a(long tag, long value) {
        mem.write(0, tag, value);
}

extern "C" __declspec(dllexport) long read_a(long tag) {
        return mem.read(0, tag);
}

extern "C" __declspec(dllexport) void write_b(long tag, long value) {
        mem.write(1, tag, value);
}

extern "C" __declspec(dllexport) long read_b(long tag) {
        return mem.read(1, tag);
}

extern "C" __declspec(dllexport) void write_reg(long tag, long value) {
        mem.write(2, tag, value);
}

extern "C" __declspec(dllexport) long read_reg(long tag) {
        return mem.read(2, tag);
}
```

Windows の名前付き共有メモリを使っています。リソースの取得と解放が自動で行えるので、言語は C++ を使用しました。（エラートラップ全然入れていませんが、個人利用なので大目に見ることにします。）
ミソは export する関数を定義する際、**__stdcall を入れないこと**です。

これを mingw g++ コンパイラでコンパイルして dll を作成し、

```shell
g++ -o common.dll -shared common.cc
```

MQL4 のデータフォルダの Terminal > (ハッシュ文字列) > MQL4 > Libraries の下にコピーします。
libstdc++-6.dll, libgcc_s_dw2-1.dll にも依存しているので一緒にコピーします。
（mingw インストールフォルダの、mingw/bin の下にあります。）

あとは MQL4 のスクリプトで、

```c
#import "libgcc_s_dw2-1.dll"
#import "libstdc++-6.dll"
#import "common.dll"
  void write_a(int, int);
  int read_a(int);
  void write_b(int, int);
  int read_b(int);
  void write_reg(int, int);
  int read_reg(int);
#import
```

と定義すれば write_a(), ... 等の関数が利用できるようになります。
【php】1～5のランダムな数字を取得し、金賞、銀賞、銅賞の表示分けをせよ

```PHP
<?php
$place = rand(1,5); // 順位を1〜5の範囲でランダムに作られた数字を$placeに代入
echo "placeの中身:".$place."\n";
   if ($place == 1) {
          echo "金賞";
        } elseif ($place == 2) {
           echo "銀賞";
        } elseif ($place == 3) {
           echo "銅賞";
        } else {
           echo $place."位";
        }
?>
```

順位が1位だったら「金賞」と表示し、
順位が2位だったら「銀賞」と表示し、
順位が3位だったら「銅賞」と表示し、
それ以外だったら「○位」と表示するプログラムを作成せよ。
[Go Unity React] 3Dでライフゲームを試せるサイト作りました

# はじめに
ライフゲーム（海外だとGame of Life）という生物学的モデルシュミレーションを３次元で作成してみました。
サーバーサイド Golang, クライアントUnity & React使用です。
ゲームリンク↓

https://life3-dc-lient.vercel.app/#/tech

## そもそもライフゲームとは
聞いたことのない方が多いと思いますが、ライフゲームとは格子を生命とみなしたモデルシュミレーションです。
ユーザー自身がルールを定めてどのような生命活動が行われるかシュミレーションすることができます。

<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/525fbb78-3f5c-2ba8-6d52-12d01d5fc024.gif">
基本的には「縦 × 横」の二次元で作成されることが多いですが、
今回は「高さ」を加えた三次元で作ってみました！
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/25ea1b92-131d-0080-23f5-a2b4203b0c69.png">

## ゲーム詳細
#### ゲームリンクは[こちら](https://life3-dc-lient.vercel.app/#/)です。
#### アピールポイント

- いい感じに生命循環が見られたモデルを保存できるようにしたところ
- 他ユーザーが作成したモデルにいいねを付けられるようにして、ランキングの高いモデルマップを実際に動かせるようにしたところ
- ユーザーがシュミレーションを楽しめるようにするため、生命活動のルール変更や、ステージ編集をできるようにしたところ

<img width="432" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/1c8c5d43-95b1-43ad-9477-0ee3b581f895.png">
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/d543b3c2-6d0d-1662-54df-db7ee9dc726a.gif">

## 使用技術
#### アーキテクチャ図
<img width="700" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/d216f8c8-33d6-0f28-09b2-bfb2e9d4ed43.png">

## サーバーサイド系
### 環境
- docker
- Golang version1.16.2
- postgres, heroku

GitHubです↓

https://github.com/ishishow/game-of-life/tree/master/life3d

綺麗な依存関係を意識してアーキテクチャを組みました。
[こちら](https://github.com/bxcodec/go-clean-arch)のgo-clean-archを参考にしています。
DIツールの[wire](https://github.com/google/wire)を入れました。また、Postgresを使った理由としてはherokuの無料枠が優秀だったからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/f148037e-5737-0be5-0665-707e0e0bec36.png)

## クライアント系
### 環境
- Unity version2019
- JavaScript(react)
- Vercel(デプロイ先)

GitHubです↓

https://github.com/ishishow/game-of-life/tree/master/life3DClient

ゲーム部分はUnityで、
webGLビルドしたファイルをreactコンポーネントとして使用できる[react-unity-webgl](https://www.npmjs.com/package/react-unity-webgl)を使いました。
Javasciptでunityの関数も動かすことができるので非常に便利なライブラリだと思います。
<img width="350" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/b36b3673-d17a-8b5a-af24-edca3b5c1e93.png">  　<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/96facad1-477d-c0d4-c123-0770fc8450e3.png">

## 頑張ったこと
- 無料枠を意識した
 - herokuやVercelを利用してなんとか全部無料で永続化できました。
- ユーザーがモデルを保存できるところ
  - 3Dのライフゲームをネットで検索してみると、保存が効かないものが多く考察があまりできないことが多かったので頑張りました
 
## 改善したい箇所
- ルールなどの考察が開発者自身も不十分
 - 作成することに頭が行きがちだったので今後考察して改善していきたいです。
- UI...
 - 改善したいです。
 

## おわりに
ここまで読んでくださりありがとうございました！
実はこの製作物は友人とハッカソンのために面白そうだから作ったのですがあまり受けませんでした。。。（少し尖っていたかも）
本ゲームの不具合、改善点、技術的な疑問点などありましたらご気軽に質問ください！
また、よろしければ遊んでみてください！！
Grid.jsで単位ありのsortがしたい。

# 経緯
Grid.jsのsortオプションでは、以下の関数が動いている

```js
if (a > b) {
  return 1;
} else if (b > a) {
  return -1;
} else {
  return 0;
}
```
しかし、これだと```200円```や```10個```といった単位付きでの比較はできない。
表示されるDataを変更するオプションは存在するが、`a,b`には変更後のデータが格納されてしまうため、そこから数値のみを取り出して比較していく。

## 単位付きのままsortをかけてみる
ソースコードは画像の下にあります。
![chrome-capture.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252234/74fff550-d97a-3d1b-3739-b4e26bba8214.gif)

```js:index.js

<Grid
  data={[
    {id: '001', fruite: 'りんご', price: 200, sum: 20},
    {id: '002', fruite: 'バナナ', price: 150, sum: 10},
    {id: '003', fruite: 'ぶどう', price: 800, sum: 3},
    {id: '004', fruite: 'メロン', price: 2000, sum: 1},
  ]}
  columns={[
    { 
        id: 'id', 
        name: 'ID' 
    }, 
    { 
        id: 'fruite', 
        name: 'フルーツ', 
        sort: false, 
    }, 
    { 
        id: 'price',
        name: '価格',
        data: (row)=> row.price + '個',
    },    
    {
        id: 'sum',
        name: '個数',
        data: (row)=> row.sum + '個',
    }, 
  ]}
  sort={true}
  search={true}
/>

```

## 数値のみを取り出してsortをかける
```js:index.js

<Grid
  data={[
    {id: '001', fruite: 'りんご', price: 200, sum: 20},
    {id: '002', fruite: 'バナナ', price: 150, sum: 10},
    {id: '003', fruite: 'ぶどう', price: 800, sum: 3},
    {id: '004', fruite: 'メロン', price: 2000, sum: 1},
  ]}
  columns={[
    { 
        id: 'id', 
        name: 'ID' 
    }, 
    { 
        id: 'fruite', 
        name: 'フルーツ', 
        sort: false, 
    }, 
    { 
        id: 'price',
        name: '価格',
        data: (row)=> row.price + '個',
        sort: {
          compare: (a,b) => {
            // a,bから数値のみを取り出す正規表現
　　　　　　　// 結果を比較して1, -1, 0のいずれかを返す
          }
        }
    },    
    {
        id: 'sum',
        name: '個数',
        data: (row)=> row.sum + '個',
　　　　　sort: {
          compare: (a,b) => {
            // a,bから数値のみを取り出す正規表現
　　　　　　　// 結果を比較して1, -1, 0のいずれかを返す
          }
        }
    }, 
  ]}
  sort={true}
  search={true}
/>

```

## うまくいくと
こうなります。
![chrome-capture (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252234/96752781-edfc-2a7d-617d-7a398576942d.gif)
Lando で始める Drupal 開発環境構築

https://www.studio-umi.jp/blog/11/762

↑を参考に順番にやってく
メモ


## 事前確認
https://docs.lando.dev/basics/installation.html

- 必要な OS
macOS10.13 以降


- Docker エンジンの要件
https://docs.docker.com/docker-for-mac/#/what-to-know-before-you-install
インストールできたら OK ってことかな..?  



- ハードウェア要件
> 気弱な人向けではありません！
Landoは基本的にコンピューター上で実行されるPaaSであるため、電力が供給されていない限り、Landoを使用することはお勧めしません。

PaaS : ミドルウェアとかが既に用意されてるサービス



- 最小要件
  - 2コアx86互換プロセッサ
  - 4GB以上のRAM
  - 25GB以上の利用可能なディスク容量  

## Lando のインストール
https://github.com/lando/lando/releases

から `Latest release > lando-バージョン.dmg`
今回のバーションは v3.0.26  

順番に OK しとけばインストール完了

## Drupal の準備
```
composer create-project studioumi/drupal-project:9.x-dev ディレクトリの名前 --no-interaction
```
composer 管理で開発コストの軽減と drupal-paranoia によるセキュアな環境構築ができる
らしい

## Drupal へアクセス

```
cd ディレクトリの名前
```
ディレクトリに移動  

```
lando start
```  
land 起動

```
http://d9.lndo.site/
```
Drupal へアクセス

↓

このページは動作しておりません

↓

```
http://localhost:55007 
```
いけた

## Drupal インストール
```
lando info
```
DB 情報の確認
どれがどれかわかんねぇ..

`creds: { database: 'drupal9', password: 'drupal9', user: 'drupal9' }`  
とりあえず全部 drupal9  
高度な設定
ホスト名 : database
ポート : 3306  
↓  
いけた。

初めて(?) PaaS に触れた。
すごい。
hermes(JavaScript engine)を C++14 アプリに組み込むメモ

C++ アプリに JavaScript エンジン組み込みたい(JS で制御とか).
Duktape もいいけど, 

https://duktape.org/

グラフィックス処理などでパフォーマンスがほしいときもある.

hermes を考えます.

https://github.com/facebook/hermes

C++14 + cmake で依存ライブラリも一緒に入っている + MIT ライセンスで, 自前 C++ アプリに組み込みやすくなっています.

基本 add_subdirectory() でいけます.
ただ, hermes の CMakeLists.ext では global な `add_definition` とかしているので, 自前アプリや他の submodule となにかかち合うかもしれませんので注意しておきましょう.

また, hermes ライブラリは `add_target_libraries` に追加しても, うまくパスとおしてくれないようです. 自前でインクルードパス指定必要です.

binary(build)ディレクトリに `hermes/Support/Config.h` が生成されるのでこれへのパスも通しておきます.

```
  # 必要に応じて hermes の cmake オプション設定を上書き(override)
  # ...

  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/hermes hermes)


  set(EXT_LIBRARIES
    hermesVMRuntime
    hermesCompilerDriver
    hermesConsoleHost
    hermesAST
    hermesHBCBackend
    hermesBackend
    hermesOptimizer
    hermesFrontend
    hermesParser
    hermesSourceMap
    hermesSupport
    dtoa
    hermesInstrumentation
  )

  # hermes/Support/Config.h
  target_include_directories(${TARGET} PUBLIC ${CMAKE_BINARY_DIR}/hermes/include)

  target_include_directories(${TARGET} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/third_party/hermes/include)

```

とりあえずはこんな感じでしょうか.

あとは `$hermes/tools/hermes/` あたりの repl サンプルを参考にすればいけるはず... です!