OmniAICreator/Qiita-1.07M huggingface dataset:
Xamarin.Android AlertDialog中のハードウェアキーボードを検知する方法

ハードウェアキーボードとは端末自体にキーボードが存在するものを考えています。
`onKeyDown:`をなぜ使わないかというとDialog表示中は、
キーイベントが検知できないので別の方法で用意してあげる必要があります。

その為の回避策はこちらです。

```C#
                        AlertDialog dialog = new AlertDialog.Builder(this)
                            .SetTitle("")
                            .SetMessage("ログインに失敗しました。")
                            .SetPositiveButton("OK", (sender, e) => {
                                Finish();
                            })
                            // キャンセル表示をする場合はコメント解除してください。
                            //.SetNegativeButton("Cancel", (sender, e) => { })
                            .Show(); // Important, or GetButton() will return null


                        dialog.KeyPress += (sender, e) => {
                            if (e.KeyCode == Keycode.Enter)
                            {
                                dialog.Dismiss();
                            }
                        };
```

`if(e.KeyCode == `でブレイクポイントを設定して、
ビルドして実際にハンドリングを行いたいボタンを押せば、
どうやってif文内に入力すればいいかわかります。
C++ EmbarcaderoコンパイラでDLLを作成する

## C++系の記事が少なかった  
社内システムでEmbarcaderoコンパイラを使用する際に公式のドキュメントやネットの記事が少なくてハマったのでメモ。

## 環境
- Windows 10 Enterprise x64
- Embarcadero C++ Compiler (bcc32x.exe)

## コード
コードはかなり適当です。ただC++の知見が無くDLLで使用する場合のグローバル変数の扱いが分からなかったのでそのテストも含まれています。
コードの内容は、DLLを使用する側から任意のタイミングでグローバル変数を書き換える（取得する）ことを意図したものです。

```c++
#include <stdio.h>

#define DllExport __declspec( dllexport )

#ifdef __cplusplus
extern "C" {
#endif

DllExport void __stdcall Hello(){
    printf("Hello!");
}

char status[50];
DllExport void __stdcall SetStatus(char* DLL_status){
    memset(&status, 0, sizeof(status));
    strcpy(status, DLL_status);
}

DllExport char* __stdcall GetStatus(){
    return status;
}

#ifdef __cplusplus
}
#endif

BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpReserved){
    switch (dwReason) {
        case DLL_PROCESS_ATTACH:
        SetStatus((char *)"DLL_PROCESS_ATTACH");
        break;

        case DLL_THREAD_ATTACH:
        SetStatus((char *)"DLL_THREAD_ATTACH");
        break;

        case DLL_THREAD_DETACH:
        SetStatus((char *)"DLL_THREAD_DETACH");
        break;

        case DLL_PROCESS_DETACH:
        SetStatus((char *)"DLL_PROCESS_DETACH");
        break;
    }
    return TRUE;
}
```

## ビルドコマンド

正直これを探すのが一番苦労しました。
ディレクトリ構成は以下の通り。

```
workspace/
    ├ build/
    ├ include/
    ├ lib/
    └ dll_test.cpp
```

`-tD`でLib向けにビルドできます。
`-o`は出力ファイル指定オプション。

```
$ bcc32x -tD dll_test.cpp -o .\build\lib_dll_test.dll
```

includeや依存しているライブラリがある場合はこんな感じで対応できます。

```
$ bcc32x -tD dll_test.cpp .\include\*.cpp .\lib\* -o .\build\lib_dll_test.dll
```

誰かの参考になればいいですが、希少種でしょうね...。
Windows set up memo

## 初めに
普段はmacを使っているのですが、最近良いグラボが乗ったWindowsを買ったので、普段使っているProcessingやopenframeworksの設定がてらこちらにメモを残していきます。

## oFのダウンロード
下記のダウンロードページからWindowsダウンロードを見つけダウンロードします。使うIDE(visual studio, qt creator)に合わせて専用のものをダウンロードします。
https://openframeworks.cc/ja/download/

ダウンロードしたzipファイルを展開するのですが、展開先のディレクトリが日本語だとvisual studioではビルド時にエラーが起きました。なので展開先はｃドライブ直下か、program fileを選ぶと良いでしょう。

## visual studioの設定
まずはvisual studioを下記のダウンロードページからインストラーダウンロードします。oFでは今のところvisual studio2017が推奨されてますので、2017をダウンロードします。
https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&amp;rel=15


追加でコンポーネントを選択できますので、[oFのVisual Studioセットアップガイド](https://openframeworks.cc/ja/setup/vs/)に合わせてコンポーネントを設定します。

## Processingはドキュメントに置くな
これはやられました。ドキュメントがあったら置きたくなります。でもProcessigフォルダを日本語ディレクトリに置くとライブラリパスが上手く通らないことがあります。なので違うところに置きましょう。

自分は、"c/Users/<自分>/Documents"に置くことにしたのですが、どこに置くのが正解なんですかね？ついでにその他のフォルダも一緒に移しました。
BEM記法でBootstrapを導入しようとして諦めた件

# やりたこと（やりたかったこと）
BEM記法を踏襲しつつ、Bootstrap導入したい。（したかった。）

[こちら](https://qiita.com/isuke/items/e132669d54523c934b96)にも記載されている通り、BootstrapなどのCSSフレームワークは文章構造とスタイル情報の分離ができない。
なんとかBootstrapを使いつつ文章構造とスタイルの分離ができないか検討する。

# 結論
できなくはないが、Bootstrapの気軽に導入できるメリットがなくなってしまうので諦めた。
詳細は以下の手順を参照。

目的にもよるが、現在の自分はスピード感を持ってプロトタイプを作成するフェーズなので、スタイル情報がHTMLに含まれてしまうことを許容し、Bootstrapを利用することとした。

# 環境
* node-sass4.14.1
* bootstrap4.5.2

# 作業手順
## 前提
以下の手順でSass環境は構築されている前提
https://qiita.com/learn_tech1/items/348e78f9ba5efbabf603

## yarnでbootstrapを追加
`yarn add bootstrap`でBootstrapを追加する。
package.jsonに追加される。

```package.json
  "dependencies": {
    "bootstrap": "^4.5.2",
  }
```

## style.sassでBootstrapをimportする。
```resources/scss/style.scss
@import "../../node_modules/bootstrap/scss/bootstrap";
```
## sassに@extendでbootstrapを参照
上記まで完了すれば、以下のように@extendでBootstapのクラスを継承できる。（内容は適当）
ボタン程度であればこれぐらいで済むが、グリッドとかをやり出したらめちゃくちゃなことになりそうなので諦める。

```
.button-area {
    &__back-button {
        @extend .btn;
        @extend .btn-secondary;
        margin: auto;
    }

    &__next-button {
        @extend .btn;
        @extend .btn-primary;
        margin: auto;
    }

}
```
# 参照
https://qiita.com/isuke/items/e132669d54523c934b96
RSSのデータをZabbixへ格納する(Zabbix sender編)

　前回は、Zabbix の外部チェック機能を使って、RSS のデータを Zabbix へ格納する処理について、記述をしましたが、いまいち、美しくない点と、今後 AWS Lambda などに移し替えることを考えると、別のやり方のほうが良いかもしれないと思い、Zabbix sender を使用して実装することにしました。

前回の記事はこちら ⇒ [RSSのデータをZabbixへ格納する(外部チェック編)](https://qiita.com/yossy121/items/8fc069bc974ea6c76000)

## 環境 (前回と同じ)
- CentOS 8.0 (インターネットへアクセスできること)
- Python 3.6
- Zabbix 5.0

## 実現したこと (前回と同じ)
- Python を使って RSS を取得する
- 前回からのアップデート分を取得し、Zabbix のアイテムへ格納する

## ここではお話しないこと (前回と同じ)
- Python の初期設定方法
- Zabbix のインストール方法
- Zabbix の一般的な機能説明

## Pythonで実現したこと
　基本的に流れは同じです。唯一違うのは、最後に Zabbix へ向けて、Zabbix sender を実行している点です。

　コードは以下の通りです。

```  RSS_Checker.py
#!/bin/env python3
import feedparser
from datetime import datetime, timedelta, timezone
from pyzabbix import ZabbixMetric, ZabbixSender

# 前回の期間を設定 (今回は1時間前の時間を指定)
lasttime = (datetime.utcnow() - timedelta(hours=1))

#RSSのURL
RSS_URL = "(URLを指定)"
feed = feedparser.parse(RSS_URL)

# 前回の時間以降にアップデートされた記事を取得
def f(entry):
    return datetime(*entry.updated_parsed[:6]).date() >= lasttime

# フィルタ関数を使用しデータを選定し、update時刻でソート
rdflists = list(filter(f, feed.entries))
rdflists.sort(key=lambda x: x['updated'])

# 何もない時は処理を終わる
if not rdflists:
    sys.exit()

msgs = []
for entry in rdflists:
    title = entry.title
    link = entry.link
    time = entry.updated

    msg = title + ' / ' + link + ' / ' + time
    msgs.append(ZabbixMetric('(ホスト名)', '(key名)', msg))

result = ZabbixSender(use_config=True).send(msgs)

```

## Zabbixサーバへのコードの配置
　今回は Zabbix からの実行ではなく、cron によって実行するため、配置場所とユーザはご自身の環境に合わせて設定してください。

　また、今回は実施していませんが、コードを実行するサーバへの配置でも構いませんが、コードの最終行の設定を一部変更する必要がありますので、ご注意ください。

## Zabbixで設定したこと
　Zabbix では、前回と同じように専用の Item を作成します。

![Item 設定画面.JPeG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103369/6c8b6619-81f5-6457-0d80-40ccbd722cdb.jpeg "Item 設定画面")

　今回は、タイプに「Zabbix トラッパー」を指定します。前回とは違い、Zabbix は処理を待つだけですので、間隔の指定は有りません。

## 前回実現できなかったことができた
　上記を設定し、いざ実行すると、無事に更新情報1件に対し、ヒストリ1レコードに格納できました！
　この方法では、Zabbix サーバ以外でも処理が実行できるので、別の用途でも使用することができるかもしれません。

### 参考サイト
- [Pythonでrssからデータを取得する方法 - 知的好奇心](https://intellectual-curiosity.tokyo/2019/03/28/python%E3%81%A7rss%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
- [Python, feedparserでRSS, Atomフィードを解析 - note.nkmk.me](https://note.nkmk.me/python-feedparser-tutorial/)
- [Module pyzabbix.sender](https://py-zabbix.readthedocs.io/en/latest/sender.html)
TeXのフォルダを整頓してテンプレートつくった

# はじめに
TeXファイルを章ごとに分割して書きたかった時に見つけて作ったテンプレートについて，つらつら書きます．参考にしたサイトは以下の3つです．
-[Subfiles and Referencing](https://tex.stackexchange.com/questions/235973/subfiles-and-referencing)
-[分割した LaTeX ファイルを subfiles を使ってコンパイルする](https://qiita.com/sankichi92/items/1e113fcf6cc045eb64f7)
-[How to use \graphicspath?](https://tex.stackexchange.com/questions/139401/how-to-use-graphicspath)

作ったテンプレ―トは，チャプターや章ごとにコンパイルでき，全体をまとめたファイルでもコンパイルできます．参考文献もつきます．

# 環境
subfileとprovidecommand，graphicspathという基本的な関数を使っているだけなので，古すぎない TeXLive を入れていれば大体できるかと思います．一応書いておくと，自分は更新してないので TeXLive2018 が入ってます．

自分の所属しているところでは，TeXLiveを皆が入れていてパスがまちまちなので，指定は相対パスで動かします．ほかの人に送って動くことを意識したので，.latexmkrc や bibファイル等をプロジェクトフォルダの中で完結させています．

# フォルダ構成
フォルダ構成は以下のようになっています．

```text:フォルダ構成
template  <- ここを今回 homedir として指定している
│  Bib.bib
│  latexmkrc
│  main.tex
├─chapter
│  ├─conclusion
│  │      conclusion.tex
│  │      latexmkrc
│  └─ ...（上と同じ構成のもの）
├─content
│  └─conclusion
└─layout
        mytemplate.sty
```
※ mytemplate.sty は，usepackage を並べて自分用の関数等をいれたもので今回は関係ないです．

# 今回のキモ
ドキュメントクラスは，プリアンブルの最初に書かなくても動くらしいです．これを使うことで，パスを指定する関数を作って \providecommand で上書きをしないようにすれば相対パスを使えます．

```latex:main.tex
\documentclass[11pt, a4paper, twocolumn]{ltjsarticle}
\providecommand{\homedir}{.}	% \homedir ってのはここを指すよっていう宣言
\providecommand{\subBiblio}{}
\usepackage{subfiles}
\graphicspath{{\homedir/content/}{\homedir/content/principle/}}
　　% (プリアンブル略)
\begin{document}
\subfile{\homedir/chapter/conclusion/conclusion}
　　% (他チャプターのsubfile)
\bibliographystyle{junsrt}
\bibliography{\homedir/Bib}
\end{document}
```

```latex:conclusion.tex
% subfile単体で実行した場合のやつ
\providecommand{\homedir}{../../}	% `\homedir/'から始まるのは，上の上のフォルダだよって宣言
\providecommand{\subBiblio}{
    \bibliographystyle{junsrt}
    \bibliography{\homedir/Bib}}	% 参考文献用

% subfileにより本体のプリアンブルを呼び出す
\documentclass[\homedir/main.tex]{subfiles}
\begin{document}
　　% (省略)
\subBiblio
\end{document}
```

\homedir という関数がキモで，conclusion.tex をコンパイルするときも main.tex をコンパイルするときも main.tex のあるフォルダを指します．また，biblio 関数も main.tex と同じ場所の Bib.bib を指してbibliography を呼び出します．

また，graphicspathを，\homedir/content にしているので，画像を入れるときはファイル名だけで動くはずです．

# 簡単な説明（補足）

### graphicspathとは
指定したフォルダを画像を呼び出すときのパスに追加するコマンドです．追加しておけば，いままで \includegraphics{ ./folder/... /hoge.pdf } としていたものを\in(略）{ hoge.pdf }だけで呼び出せるようになります．

```text:graphicspathの使い方
\grahpicspath{{dir1}{dir2}....{dirN}}
```

### prvidecommandとは
既に同名の関数が定義されている場合は定義しない関数です．基本的には \newcommand 等と同じ使い方です．

### subfileとは
subfileコマンドは，親のプリアンブル（宣言したコマンド等）を読みだせるものです．使い方は\begin{document}から\end{document}の間に

```latex:parent.tex
\subfile{子のファイルへのパス}
```
と入れて，子のファイルのドキュメントクラスの定義のときに

```latex:child.tex
\documentclass[親のファイルへのパス]{subfile}
```
という形で使います．
gcloudをzshにいれる | Catalina

![dhdhdhdhdh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/b06fb21b-771d-ae93-9633-a1825c058bc6.png)


## google-cloud-sdkを入れてあることを確認する

```
"/Users/ユーザー名/google-cloud-sdk" already exists and may contain out of date files.
Remove it before installing? (y/N): n
```

## パスを通す

```

% sudo vi /Users/ユーザー名/.zshrc
% source /Users/ユーザー名/.zshrc
```

## .zshrc を編集する

```
# The next line updates PATH for the Google Cloud SDK.
source '/Users/ユーザー名/google-cloud-sdk/path.zsh.inc'

# The next line enables bash completion for gcloud.
source '/Users/ユーザー名/google-cloud-sdk/completion.zsh.inc'

```

## gcloud --version 

```
% gcloud --version
Google Cloud SDK 307.0.0
bq 2.0.59
core 2020.08.21
gsutil 4.53

```
Swift + Chartsでグリッド表示間隔をカスタマイズ

## 目的
[この記事](https://qiita.com/onizine/items/3c43f96eef27bcb982fa)でグリッド線のカスタマイズなんてことをやってました。
グリッド線はChartsにセットされているデータから自動的に等間隔でグリッド線が引かれますが、これを任意の値のときだけ引くようにしたい、またはより細かくカスタマイズしたいということもあるでしょう。

※サンプルソースと画面イメージ追記しました。

## ライブラリ

[danielgindi/Charts](https://github.com/danielgindi/Charts)

## AxisRendererBaseのcomputeAxisValuesメソッド

継承したクラスでこのメソッドをoverrideすれば割と自由に対応できます。

```swift

axis.entries.append(v)
```

としている箇所がグリッド線を表示する値を作り込んでいる場所になります。

最終的にグリッド線を表示する位置は

```swift:XAxisRenderer.swift

open override func renderGridLines(context: CGContext)

    ~ 省略 ~

    let valueToPixelMatrix = transformer.valueToPixelMatrix
        
    var position = CGPoint(x: 0.0, y: 0.0)
        
    let entries = xAxis.entries
        
    for i in stride(from: 0, to: entries.count, by: 1)
    {
        position.x = CGFloat(entries[i])
        position.y = position.x
        // この辺？
        position = position.applying(valueToPixelMatrix)
            
        drawGridLine(context: context, x: position.x, y: position.y)
    }

    ~ 省略 ~

```

で行っているようです。
したがってAxisのentriesプロパティに登録する値さえ制御してしまえば、よしなにグリッド線をコントロールすることができます。

例えば対数グラフのようなメモリ線を引きたいという場合、
例として、XAxisRendererを継承したカスタムクラスの中で以下のようにします。

```swift:CustomXAxisRender.swift
class CustomXAxisRender: XAxisRenderer {
    ~ 中略 ~
    @objc open override func computeAxisValues(min: Double, max: Double)
    {
       ~ 中略 ~
       // 独自のフラグで分岐
        if self.isSpecialMode {
            interval = Double(range) / Double(labelCount - 1)
            
            // Ensure stops contains at least n elements.
            axis.entries.removeAll(keepingCapacity: true)
            axis.entries.reserveCapacity(labelCount)
            
            var v = yMin
            
            var subInterval = interval
            // 最大値を超えるまでループ
            while v < yMax
            {
                // このあたりはそれっぽく見せるためにしてるだけです
                if subInterval < 0.05 {
                    subInterval = interval
                } else {
                    subInterval = subInterval / 2
                }
                
                axis.entries.append(v)
                v += subInterval
            }
            
            n = labelCount
            
            
        }
```
とすると、このような線が表示できます。
（メモリラベル表示は修正してないので変な値ですが）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59457/d242adf3-742a-dabb-6313-13a6a9f6b4c2.png" width=200px />
AlibabaのオープンソースSentinel Javaフロー制御プロジェクトとHystrixの比較

本記事シリーズでは、**Alibaba**のオープンソースの**Sentinel Java**フローコントロールプロジェクトを**Hystrix**と比較しながらご紹介します。

ハイストリックスはここ数年でかなり人気がありました。現在はメンテナンスモードに入っているため、多くの人が代替案を探しています。この記事では、オープンソースのJavaフローコントロールプロジェクトであるSentinelを紹介します。より多くの人に親しまれているHystrixと比較しながら紹介します。このパートでは、この2つをより高いレベルで比較します。次回は、いくつかのコード例を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a88035f7-bfe9-51cf-8d97-e7366edcf5e7.png)


#Sentinelとは？
簡単に言えば、サーキットブレーカーです。サーキットブレーカーは、特定のリソースが故障し続けたときに起動されます。すでに故障しているリソースを叩き続けるのではなく、 サーキットブレーカはリクエストを傍受して故障信号を返します。これは、すべてのサーキットブレーカーのパターンと似ているように聞こえます。しかし、Sentinelは、フローシェーピング、過負荷保護、フォールトトレランスなど、より多くの選択肢を提供します。

#Sentinelの歴史
- 2012: アリババのフロー制御コンポーネントとしてSentinelがスタート
- 2013年～2017年: マイクロサービスの飛躍的な成長に伴い、信頼性への挑戦が訪れる。Sentinelはあっという間にカスケードする災害を防ぐツールへと成長する。
- 2018: Sentinelはアリババによってオープンソース化される。

#Sentinelは何のためにあるのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a5350e70-e2e3-64fc-bf45-f17bd72ffa41.png)

- Sentialには、フロー制御を処理するための多くのオプションが用意されています。ユーザーは、QPS、スレッドプール数、システム負荷に基づいてトラフィックを形成することができ、また、コマンドを直接使用してトラフィックを停止したり、コールドスタートを実行したりすることもできます。また、ユーザーは異なるルールを組み合わせて使用することもできます。Hystrixは、包括的なトラフィックシェーピングを提供していません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/04d2ad4b-d732-8c78-2921-fc88fb5dc014.png)

- Sentinalは、フォールトアイソレーションとサーキットブレーキングを提供しています。これはHystrixに似ています。しかし、それらのアプローチは異なっています。
- Sentinalはリアルタイム監視を提供します。また、分散システムからの情報を集約するダッシュボードも提供します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b41756e6-2abc-b51e-44f7-12e61b80bd43.png)

#SentinelとHystrixの違いは？
この2つの主な違いは、分離をどのように実現するかにあります。Hystrixは通常、バルクヘッドパターンを使用して依存関係を分離します。Hystrixは、それぞれの依存関係を別々のスレッドプールに置きます。この方法の主な利点は、クリーンカットを提供することです。欠点は、主にスレッドプール管理に発生するオーバーヘッドです。

一方、Sentinelは、各依存関係に対してカウンタを使用します。そうすることで、スレッドプール管理のオーバーヘッドを節約できるだけでなく、ユーザにより多くのコントロールを与えることができます。ユーザーは、フローの劣化の粒度を決めることができるようになりました。

この表は、設計と実装におけるHystrixとSentinelの違いの詳細を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4d5968af-8414-4df9-99b6-3a5df2fa0b98.png)

これは少し圧倒されているように見えるかもしれません。しかし、ユーザーはユーザーエクスペリエンスの観点からはあまり違いに気づかないでしょう。

#エコシステム
Sentinalはクラウドネイティブ環境に適しています。他の一般的なクラウドネイティブソリューションと統合することができます。その一つがSpring Cloudです。また、中国で人気のあるJava分散フレームワークにはDubboがあります。Sentinalは、IstioやEnvoyなどのサービスメッシュソリューションと並べて動作することもできます。

#参考文献
Sentinal はまもなく Spring Boot フレームワークの一部としてリリースされる予定です。詳細については、彼らのGitHub[レポ](https://github.com/alibaba/Sentinel?spm=a2c65.11461447.0.0.691c3053Rs2Lw0)を参照してください。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*
【Xcode】Module compiled with Swift 5.x.x cannot be imported by the Swift 5.x compiler【Carthage】

複数のSwiftバージョンの違うXcodeをインストールした状態でアプリをビルドすると

```
Module compiled with Swift 5.x.x cannot be imported by the Swift 5.x compiler
```
のエラーが発生することがあります（xのところは具体的なバージョン）。これはCarthageのモジュールとXcodeでビルドしようとしているもののSwiftバージョンが異なりますというエラーです。
その場合はCarthageのビルドを使いたいXcodeのSwiftバージョンに合わせなければなりません。
その際は`xcode-select`コマンドを使います。

```
sudo xcode-select -switch /Applications/Xcode-beta.app/Contents/Developer
```
のようにxcode-selectコマンドでCarthageが見るXcodeの向き先を変えてあげます。
念の為に、変更前に現在のpathを確認したい場合は

```
sudo xcode-select -p
```

で現在のpathがわかるので、戻したい場合は現在のpathをメモっておくと安心です。
iOSで物体追跡【Vision】


![Sep-01-2020 12-34-38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3df77fad-bf82-f21f-eaaa-1ac99389d970.gif)
連続するフレームで物体を追跡できます。
物体位置をCGRectで指定すると、次のフレームで追跡します。

###手順

１、追跡用のシーケンスハンドラをつくります。

```swift
let requestHandler = VNSequenceRequestHandler()
```

２、物体を囲むCGRectで、物体観測をつくります。

```swift
var inputObservation = VNDetectedObjectObservation(boundingBox: cgrect)
```

３、「１、」で作った物体観測で、追跡リクエストをつくります。

```swift
let request = VNTrackObjectRequest(detectedObjectObservation: inputObservation)
```

４、シーケンスハンドラでフレームを追跡リクエストに渡して実行します。

```swift
do {
    try requestHandler.perform([request], on: pixelBuffer, orientation: videoOrientation)
   } catch {
    print("Tracking failed.")
   }
```

５、追跡結果観測が返ってきたら、その観測で次のリクエストを作って、次のフレームで実行します（３〜５の繰り返し）。

```swift
guard let observation = request.results?.first as? VNDetectedObjectObservation else { return }
inputObservation = observation
```

###Tips

+ 指定する物体観測は、手動でCGRectを指定することもできますし、Visionの顔・胴体・手・動物などの検出結果、Core MLの物体検出結果を直接指定することもできます。

+ リクエストは追跡レベルを「速さ優先」「精度優先」を指定できます。

```swift
request.trackingLevel = .fast
```

+ 複数の物体も追跡できます。それぞれリクエストを作って配列でハンドラに渡します。

+ リアルタイムでカメラフレームを追跡するときはAVCaptureVideoOutputのデリゲートメソッドで、動画ファイルで追跡するときはAVAssetReaderでそれぞれフレームを取得できます。

+ メインスレッドで実行すると重くなるので、別キューで実行しましょう。


****
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
大量のコミットを一つにまとめたい時

#はじめに
Railsでポートフォリオ作成中にcircleCIでCIを導入してたときに、testコミットが33個になってしまったので、一つにまとめる過程をメモとして書きたいと思います。

#やりたいこと
masterブランチからtestというブランチを切って、CIの設定をあれやこれやと試していたらコミットが33個になってしまって、それをmaterにmergeするのは嫌だったので、一つにまとめたい。

#やったこと
- [こちらの記事](https://dev.classmethod.jp/articles/git-rebase-fixup/)を参考にコミットをまとめる。
まとめたいコミットの数を数え（自分の場合は33）、以下のコマンドを叩く。
`git rebase -i HEAD~まとめたいコミット数`
するとvimが開くので一番上のコミット以外のpickをfに変換する。
[こちら](https://qiita.com/waoooon/items/8d982e49692c8145ca4b)を参考に自分はvimの置換機能を使いました。

- 自分の場合はもともとのコミットメッセージがtestだったので、これを`Fix CI settings`みたいに変えたかったので、[こちら](https://www.granfairs.com/blog/staff/git-commit-fix)を参考に変更。

- testブランチをmasterにmerge。[こちら](https://techacademy.jp/magazine/10264)の記事を参考にしました。

#終わりに
gitの操作は何回やっても忘れてしまうので、今回記事に残せてよかったです。

#参考リンク
https://dev.classmethod.jp/articles/git-rebase-fixup/
https://www.granfairs.com/blog/staff/git-commit-fix
https://qiita.com/waoooon/items/8d982e49692c8145ca4b
https://techacademy.jp/magazine/10264
今さらTeratermのデフォルト設定いじってみた

#<h1>経緯</h1>
最近ssh経由でサーバーを操作することが多く、久しぶりにteratermを多用している。ログインとかログ取得とか本当に煩わしいので、デフォルト設定をいじってみたのでメモ
#<h1>やり方</h1>
##<h3>ログイン設定</h3>
まず、煩わしいのは「ポート番号」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/66aeffa7-e60e-2dcd-636d-5be7c73de95c.png)

後は「ユーザー名」「パスフレーズ」「認証方式」「秘密鍵ファイルのパス」※RSA認証にしてます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/1fe484dc-30ad-b961-e5cf-52b3f6e27c7b.png)

これらを設定するには、
①まずは一旦ログインして「設定」＞「SSH認証」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/124dc053-8bcf-0cd3-de60-2253c7b6718a.png)

②「デフォルトユーザー名を使用」、「認証方式」を設定⇒「OK」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/4479622d-ba68-bdac-903d-082b1406be50.png)

③「設定の保存」>Teratermのインストールフォルダにある「TERATERM.INI」を上書きする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/ee3542ee-48eb-5df3-647d-ac932962ff6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/b23778cd-94d4-a43d-13f0-c9c76194bf6c.png)



<b>次回利用時からデフォルト設定がされた状態で利用可能になる。「ポート番号」も設定の保存をしたタイミングで保存される。ただ残念ながらパスフレーズを保存する方法は見つからず.....ま、セキュリティ的には正しい動作なのでしょうがないかな....</b>

##<h3>ログの取得設定</h3>
作業してると後から「あの時なにしたんだっけ？」と思う事が多々ある。なのでログはデフォルトで保存されるようにしたい。

この設定はまずログインした上で
①「設定」＞「その他の設定」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/f7c4cee7-3e90-49f0-636e-64da31952f21.png)

②必要事項を入力する。ポイントは標準ログファイル名を「&h_%Y%m%d_%H%M%S.log」とすることと、「自動的にログ採取を開始する」のチェックをすること！全部入力したら「OK」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/bd481418-6892-3193-6885-6aa09de2f299.png)

④設定の保存を忘れずに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632397/46a5e648-8222-0d0e-7c40-2d1ea444d351.png)

⑤オプションとして、ログにタイムスタンプを表示する設定もしておく。
参考：https://www.j-oosk.com/teraterm/logging/115/


#<h1>参考サイト</h1>
https://www.j-oosk.com/teraterm/authorized_keys/306/
https://www.j-oosk.com/teraterm/logging/114/
B+木インデックス

応用情報技術者平成30年春期 午前問26

関係データベースのテーブルにレコードを1件追加したところ，インデックスとして使う，図のB+木のリーフノードCがノードC1とC2に分割された。ノード分割後のB+木構造はどれか。ここで，矢印はノードへのポインタとする。また，中間ノードAには十分な空きがあるものとする。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/435f7864-1b69-8109-d338-73a6664b4ed3.png)


１、B+木インデックスは、
・木の深さが一定で、
・節点はキー値と子部分木へのポインタをもち、
・葉のみが値をもつ平衡木(バランス木)を用いたインデックス法です。

関係データベースのインデックス法として現在最も普及しています。


設問のケースではリーフノードCがC1とC2に分割されたため、葉ノード同士の前後関係を保つには「B⇄C1⇄C2⇄D」というリンク状態になっていなくてはなりません。そして木の深さを一定に保つためにノードAにはC2へのポインタを持たせます。

下記のようなります：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2e233214-d03d-eb5c-bb3a-d92f3da3a9e6.png)



例：B＋木の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b3347b8a-729b-0465-d09a-c7b606b84f4c.png)


参照：
https://www.ap-siken.com/kakomon/30_haru/q26.html
3次元の物体を表すコンピュータグラフィックスの手法ーサーフェスモデル、ワイヤフレームモデル、ソリッドモデル

応用情報技術者平成30年春期 午前問25

3次元の物体を表すコンピュータグラフィックスの手法に関する記述のうち，サーフェスモデルの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/cfc3b49a-111d-220c-b062-e3ee316317cb.png)


１、サーフェスモデルは、 surface model
3DCGにおいて表面のみが定義された3次元構造、またはそれらを作成する目的のモデリング体系のことです。中身が詰まっていないため張り子、張りぼてとも形容されます。
物体を，ポリゴンや曲面パッチを用いて表現する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3840ab8f-f329-870d-95b3-e51f9b3cc5c0.png)

・ポリゴン
多角形。三次元のコンピューターグラフィックスにおける立体形状を表現するために使われる多角形を指すことが多い。物体表面を小さい多角形（主に三角形）に分割し、その位置や角度、模様、質感などの見え方を個々に

・パッチ
3次元のサーフェスを構成する四方をスプライン曲線で構成された曲面の1つ1つ。


※3DCG
3次元コンピュータグラフィックス（さんじげんコンピュータグラフィックス、英: three-dimensional computer graphics）は、コンピュータの演算によって3次元空間内の仮想的な立体物を2次元である平面上の情報に変換することで奥行き感（立体感）のある画像を作る手法である。3DCG（スリーディーシージー）と略記されることも多い。


２、ワイヤフレームモデル wireframe model
物体を，頂点と頂点をつなぐ線で結び、針金で構成されているように表現する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/efa43f6a-3ff5-913c-5b81-b58313d7e03c.png)

※ワイヤ＝針金（金属を細い線状に延ばしたもの）　＝metal rope


３、ソリッドモデルの説明 solid model
物体を，中身の詰まった固形物として表現する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/122d1343-9452-d4e2-7556-61bd2a48318b.png)

４、物体を球やだ円体の集合として擬似的にモデル化する技法であるメタボールの説明
物体を，メタボールと呼ぶ構造を使い、球体を変形させることで得られる滑らかな曲線で表現する。

・メタボール（Metaball）は、コンピュータグラフィックス用語で、複数のオブジェクト同士が接近し、融合し、1つのオブジェクトとなる過程を描く、n 次元の有機的なオブジェクトを表す言葉である。数学的には、陰関数曲面の一種。メタボールをレンダリングするための技術は、ジム・ブリンによって 1980 年代初期に発明された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/56839c51-f0ac-7885-130f-b81fd80d421f.png)


参照：

3Dモデルの表現方法
https://d-engineer.com/3dcad/3dmsyurui.html

メタボール
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E3%83%9C%E3%83%BC%E3%83%AB#:~:text=%E3%83%A1%E3%82%BF%E3%83%9C%E3%83%BC%E3%83%AB%EF%BC%88Metaball%EF%BC%89%E3%81%AF%E3%80%81%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF,%E9%99%B0%E9%96%A2%E6%95%B0%E6%9B%B2%E9%9D%A2%E3%81%AE%E4%B8%80%E7%A8%AE%E3%80%82


https://www.ap-siken.com/kakomon/30_haru/q25.html

3DCG
https://ja.wikipedia.org/wiki/3%E6%AC%A1%E5%85%83%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9
SendGridにログインできない

発行してもらったSendGridのサブアカウントに初回はログインできて、
無事に登録も諸々終わった状態。

数日後にもう1回ログインしようとすると、ログインできない。なぜだ。

https://app.sendgrid.com/login
![SendGrid 2020-09-01 11-52-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/cf79eb6f-2367-e1fb-daf9-d4eed4292302.png)

パスワードはパスワードマネージャで管理してるから、間違いってことはないと思うんだけど、
`Forgot your password?` からリセット処理を実行。

![SendGrid 2020-09-01 11-53-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/1a42776f-44eb-ab0d-677b-a3ea3f6cecee.png)

なぜか全然メールが届かない。どうなってるんだ。
こいつぁSendGrid側のバグだな！！！問い合わせてやる！！！

返信

> ***Please keep in mind that you must use your username, not your email address, when resetting your password.***
> (パスワードを再設定する際には、メールアドレスではなくユーザー名を使用する必要がありますので、ご注意ください。)

画面よくみたらたしかに「Username」って書いてある。
メアドを入れるもんだとばかり思ってたっていう、しょーもないオチではありました・・・。
GCP - Slackボットのパフォーマンスについて(ロケーション)

Slackボット作成にあたっては、Event APIや、Slash Command、Interactive Messageなどの
APIを使用することになりますが、いずれも3秒でタイムアウトする仕様であるため、パフォーマンスを
考えることはかなり重要になってきます。

今回は、処理を行うサーバーのロケーションについて、確認してみました。

### 経緯

今まで、Google App Scriptで運用してきたSlackボットを、Cloud Functionsに移植しましたが、
日本人が使うツールなんだし東京リージョンやろと、深く考えずにデプロイしたことによって、
頻発するタイムアウトに悩まされることになりました。
言語のローカライゼーションや、データレジデンシー機能の実装などで、何となく勘違いしていましたが、
Slackのサービス自体は米国で提供されているんですね。
(すぐに米国内のリージョンにデプロイし直しましたが、データの移行が面倒くさかったです。)


## 検証

### 概要
Cloud Functionsに限った話ではありませんが、Slackボットへの応答時間を向上するにあたっては、
以下のような項目があげられると思います。

|#|項目|内容|目安|
|:-:|:--|:--|:--|
|1|ロケーション|通信時間に影響するため、なるべくSlackに近い地域にデプロイする。|数十ms〜数百ms|
|2|コールドスタート対応|FaaSは、必要に応じてインスタンスを立ち上げるので、デプロイ直後や一定時間経過後などに、インスタンス起動やライブラリの読み込み等のオーバーヘッドが発生する|数百ms|
|3|関数の実行時間|関数自体の実行時間(DB処理含む)|なるべく削る|
|4|処理の非同期化|SlackのAPIは、とりあえずHTTP200を返してあげれば満足するので、本処理は非同期で行うように実装してあげる。|-|


### サーバ環境
ボットの処理を行うサーバは以下のとおりとし、東京とバージニアの2つのリージョンで比較してみます。

- 使用するGCPのサービス
  - Cloud Functions: Python3.7
- デプロイするリージョン
  - asia-northeast1 (東京)
  - us-east4 (北バージニア)

### クライアント環境
Slack APIを模してリクエストを送信するクライアントを以下のとおり準備します。

- 使用するGCPのサービス
  - Google Compute Engine: Debian9
- デプロイするリージョン
  - us-central1 (アイオワ)

### 測定の仕方
結論を出すにはちょっと乱暴ですが、一旦以下の通りとしました。
日にちや曜日、時間帯といったことにも着目したいところですが、とりあえず。

1. 各リージョンごとに100個リクエストを送信する。
2. クライアント側で、かかった時間を計測する。
3. Functionsの処理時間を 2 から減算する。

### 結果
以下のような結果となりました。

設計値としては、
東京リージョンにデプロイする場合は約800ms、
バージニアリージョンにデプロイする場合は約200ms、 
といったところを見込んでおく必要がありそうです。

|リージョン|99パーセンタイル|90パーセンタイル|50パーセンタイル|平均値|
|:-:|--:|--:|--:|--:|--:|
|東京|799ms|783ms|751ms|543ms|
|バージニア|188ms|178ms|55ms|79ms|

- 東京
![無題のプレゼンテーション (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/6b536306-bb3e-8cdd-2002-42965a8a375c.jpeg)

- バージニア
![無題のプレゼンテーション (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/d2c9be72-3d93-3682-68aa-6dfdacf56d85.jpeg)


### 結論

現時点では、Slackボットを実装するロケーションは、米国内が無難な選択と思います。
しかしながら、Slackのサービス自体が地域ごとに提供されるようなことになった場合を想定し、
なるべく簡単にボットやデータを移行できるように実装してあげるのが肝要と思われます。
ズラーっと並んだ画像を整理したい人におすすめgem(Kaminari)について紹介



どうもこんにちは、

フリーターのブロガーのエンジニア志望です。（ながっ）

<br/>
今回は、僕が実際に使ってとてつもなく衝撃を受けたGemの一つである

<h1>kaminari</h1>

というかっこいい名前のGemを紹介しさせてもらいたいと思います！！



投稿型アプリ開発をしている中で商品画像が溜まってくると見づらくなって嫌だな〜と思うことありませんか？

そんな悩みを解決してくれるGemなので、投稿型アプリを作っている方はぜひ使ってみてください！！

<br/>
まず前提として、
今回は既存アプリに導入するﾃｲで話させてもらいます。


なのでまだ投稿機能ができていないよ〜
という方はそこから始めてください。


ではまず最初にGemfileを開き

```
gem 'kaminari'
```
と下の方に書き込み

```
bundle install
```
してあげましょう

次にページネーションを適用したいviewファイル,
controllerファイルに
記入を加えます
僕の場合は本をページネーションしたかったので、
こう書きました

```books_controller.rb

  def index
   @books =Book.all
   @books = Book.page(params[:page]).per(1).order('updated_at DESC')
   @book =Book.includes(:user)
   set_book_column 
  end
```

```book.html.erb
<%# 本の情報 %>
  <div>
    <% @books.each do |book|%>
     <% if book.present?%>
      <tr>
        <td> <h3 class="item-name"><%= book.genre.type %></h3></td>
        <td> <h2 class="item-name"><%= book.name %></h2></td>
        <%= link_to "/books/#{book.id}" do %>
        <td><%= image_tag book.image , id: 'slideshow' if book.image.attached?%></td>
        <% end %>
      </tr>
     <%end%>
    <% end %>
   </div>
   <div id="page">
     <%=paginate @books %>
   </div>
    
```

加えた記述は


```books_controller.rb
   @books = Book.page(params[:page]).per(1).order('updated_at DESC')
```

```index.html.erb
<%=paginate @books %>
```
<br/>
まさかのこれ
だけ:sunny:


gemすげーってなります笑　(語彙力）


ちなみに
```
.order('updated_at DESC')
```
と加えると順番を最新のやつからにできるので
こだわりたい人は入れてみましょう。


また、デザインを良くしたい人は

```application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Books</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">一文をを追加！！
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css" integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay" crossorigin="anonymous">
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```

してから

```
rails g kaminari:views bootstrap3
```


するとデフォルトでまぁまぁなデザインができます

ぜひ使ってみてください！！

また、
何か間違っている所があれば、
大変お手数ですが、この記事を見てくださった人が被害を受けないためにもコメントお願いします！！


この記事は以下の情報を参考にして執筆しました。

- [【Rails初心者】ページネーションを実装して自分好みにデザインを変える](https://qiita.com/rio_threehouse/items/313824b90a31268b0074)
- [【Ruby on Rails】gem(Kaminari)でページネーション機能を追加してBootstrapを適用する。](https://qiita.com/residenti/items/1ae1e5ceb59c0729c0b9)
正規表現　メモランダム

***
ドットインストールの学習メモです
***
##正規表現　
- 文字列の検索パターンを表現するた目の記法

正規表現で検索する　command + f  .*をクリック。
![スクリーンショット 2020-09-01 9.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/5a7cbcdb-4fa0-9494-d24e-47e5eaf79859.png)

#リテラル・メタ文字・エスケープ
![スクリーンショット 2020-09-01 10.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/06721b52-e680-309e-a855-e850bf55bfea.png)


#文字種　\d, \w, \s 検索と置換
![スクリーンショット 2020-09-01 10.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/980e4aa3-0e37-73dc-3a1b-859a3afa4767.png)

#量指定子　\d{5}, \w{3}など繰り返しを指定
![スクリーンショット 2020-09-01 10.22.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/a42a191f-5572-5774-f9f8-008fbb041615.png)


#?, +, *　0以上１以下、　0以上、　1以上でヒットを増やす
![スクリーンショット 2020-09-01 10.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/44545659-8d5f-bb03-4408-eb38cc036373.png)

#？　一番短い文字列にマッチさせる
![スクリーンショット 2020-09-01 10.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/75fbb5ce-3bc5-f359-b9d8-326bb2ba87f4.png)

#^, $, \b 
- ^ 行の先頭 ^\d
- $ 行の末尾　\d＄
- \b 単語の区切り \bseki\b

![スクリーンショット 2020-09-01 10.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/bfe3c725-bca3-c3ff-1a8e-144cf1e098a3.png)

#選択子

[abc|123]  abc or 123

```
example.com
example.net

example\.com|example.net
example\.(com|net)
```

#文字クラス
[abc]  a,b,cのどれか一文字

```
bat cat hat

bat|cat|hat
(b|c|h)at
[bch]at
```

#文字クラス内で使えるメタ文字
^  否定　[の直後[^の場合だけ

```
bat cat hat eat

[^c]at c以外の一文字の後にat bat hat eat
[^cb]at cb以外の一文字の後にat hat eat
```

**「-」 範囲を意味する。**
しかし文字コード表に沿った内容でしか指定できないのが注意。

```
A1
Q31
N23
E56
L4

[A-F]\d+　 A~Fの英字の後に数字一字以上
```

#文字クラス内のエスケープ文字
文字クラス内で特殊な意味を持つ^ -をエスケープさせる必要がある。

```
03-2234-5678
03^2234^5678
03.2234.5678
03 2234 5678

^\d{2}[\^\-.]
^\d{2}[-.^ ]　上と同じ
^\d{2}[-.^ ]\d{4}[-.^ ]\d{4}　全てマッチさせるとこうなる
```

#タブと改行

タブと改行
\t  タブ
\n  改行（macOS）
\r\n|\r|\n  (全てのos)

```
改行がめちゃくちゃなファイルの空の改行をなくす。
abc
a
bb
cc
cc

\n+ で検索　改行数が1以上
\n に置換　ただの改行
```

#キャプチャ　(),$1, $2

```
キャプチャを使って置換

検索
サイト名とurlのリストを
htmlのlinkタグにしておく場合。
サイト名(.+)
カンマとスペースのあるなし ,\s
url (.+)

置換
サイト名は$1
urlは$2で取り出せる。

<a href="$2">$1</a>
```


#後方参照

```

3,4,5,6,4,4,5,5,7,8,9,9,

\d,\d
前と後ろの\dが同じか確かめたかった場合
最初の\dを（）でキャプチャ。
正規表現の中では、\1,\2などで比べる。

(\d),\1

```
数字の範囲を絞って入力を制限したい

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのように使うのか</b>

<b>3.補足</b>



1.結論
----------------------------------------
<b>validates_inclusion_of :(カラム名), in:(数字)..(数字)</b> を使う！
<br>
2.どのように使うのか
----------------------------------------
バリデーションの数字の範囲指定になります！

```ruby:models
validates_inclusion_of :
```
の”:（コロン）以降”はmigarteフォルダやDBのカラムで設定している任意の名前をいれます！記載する場所はmodelsの任意のフォルダ名になります！
<br>

```ruby:models
in:..
```
の部分は".."の前後に範囲にしたい数字を入れます！
<br>
例えば100から2000であれば


```ruby:models
validates_inclusion_of :item_price, in:100..2000
```
とすることで、100〜2000以外は入力できません！
<br>

3.補足
----------------------------------------
また、エラーバンドリング名を変えたければ、
in:100..2000のあとに

```ruby:models
, message: "outside the limits(自由に命名) "
```
と入れれば、

"item_price(カラム名によります） outside the limits"

と表示できます！
<br>
Realmについて

#Gradle設定
[【初学者向け】AndroidでRealmを実装する](https://qiita.com/TaigaNatto/items/3093e570ac107e0ab221)

[KotlinでRealm（他のDBとの概要比較）](https://qiita.com/175atsu/items/357cbd3b97a6573b034c)

[Kotlin + Android でRealmをつかってみた。]
(https://qiita.com/Juju_62q/items/eaf55c7722b826156404)

Projectの`build.gradle`に下記を加えます。

```gradle
dependencies {
        classpath "io.realm:realm-gradle-plugin:3.5.0"
}
```
Moduleの`build.gradle`に下記を加えます。
今回Recyclerviewを使うのでそれも追加します。

```app/build.gradle

apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'

//省略
dependencies {
    //省略
    //Realm
    implementation 'io.realm:android-adapters:3.1.0'

    //recyclerview
    implementation 'androidx.recyclerview:recyclerview:1.1.0'

}
```

#条件指定
[or文の例](https://realm.io/jp/docs/java/0.72.0/)
```
return mRealm.where(Tasks::class.java)
            .equalTo("remember_date",remindDate[0])
            .or()
            .equalTo("remember_date",remindDate[1])
            .or()
            .equalTo("remember_date",remindDate[2])
            .or()
            .equalTo("remember_date",remindDate[3])
            .findAll()
```
GKE(kubenetes)でcustomなGCEでnode poolを作成する

# 背景
node-poolのインスタンスマシーンにカスタムインスタンスを指定したい場合。
`n1-standard-1` とかの標準マシーンじゃなくて、 `CPU x 1 & memory x 10GB` みたいなカスタム構成のインスタンスを使いたいケース。

# やり方
`gcloud beta container` を使i, `--machine-type` に `custom-{cpu}-{memory_MBi}` でカスタムを指定する。
↓CPU x 2 で 約12GB のメモリを使いたい場合。

```bash
gcloud beta container node-pools create batch-pool --cluster asia-northeast1-gldp-prod-3aaa380e-gke --project tekitou --zone asia-northeast1-b --machine-type=custom-2-12800 --enable-autoscaling --num-nodes=1
```

# 参考
[GKE node pool custom machine type CLI
](https://stackoverflow.com/questions/49241418/gke-node-pool-custom-machine-type-cli)
Webページの設計のアクセシビリティ

応用情報技術者平成30年春期 午前問24

Webページの設計の例のうち，アクセシビリティを高める観点から最も適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/36e88dc8-e7ca-af40-f527-916e4c26277f.png)

１、アクセシビリティ(Accessibility)とは、
高齢者・障害者を含む誰もが、さまざまな製品や建物やサービスなどを支障なく利用できるかどうか、あるいはその度合いのことです。
Webページにおいては、そのページが、高齢者や障害者も含めた、誰もが情報を取得・発信できるように柔軟に設計されていて、アクセスした誰もが同様に情報を共有できるか、あるいはその度合いを意味します。

基本は、下記条件を満たしなかればなりません：
・高齢者・障害者なども支障なく利用できるになるか
・普通の方にとっては、もっと便利的に利用できるのはいいが、不便を及ぼすのはだめです。



２、音声を利用者に聞かせるために，表示時に自動で再生する。
・聴覚にハンデキャップのある人にとっては、音声の再生を認識できません。
・なお、突然音が鳴るとビックリしてウィンドウを閉じてしまうユーザもいるので、ユーザビリティの面からみても不適切です。

上記の理由で不適切ですが、
目が不自由の方には、音声の再生は、いいではないかと思っておりますがね。
これがだめとの理由は、恐れく、アクセシビリティを高めるとは、不自由の方にアクセスできるようになったがよいが、普通の方にとっては、影響はないようも考慮しなければならないでしょう。


３、体裁の良いレイアウトにするために，表組みを用いる。
Webデザインにおける表組みとは、本来は表を定義するためのtableタグを入れ子にして、その中にコンテンツを配置していく手法です。表組みは初心者でもレイアウト崩れが少なく、以前は慣用的にレイアウト手法として使用されていました。
しかし表組みは、
・視覚に障害のある人がWebを閲覧するのに使用する音声読み上げブラウザにおいて、コンテンツが正しい順序で読み上げられないという弊害が生じる可能性があり、アクセシビリティの面から使用が推奨されていません。

体裁の良いレイアウトは、普通の方に見やすいけど、視覚に不自由方にとっては使いにくくなるので、不適切ですね。


４、入力が必須な項目は，色で強調するだけでなく，項目名の隣に"(必須)"などと明記する。
Webサイトを閲覧するユーザの中には、色弱や色盲といった障害を抱える人もいます。必須項目と任意項目が色だけで分類されていた場合、これらの人々には違いを認識することができません。色だけに頼らず文字によっても項目を分類することで、アクセシビリティの向上が望めます。

普通の方に色だけで十分ですが、色弱や色盲の方にとっては、役に立ちますので、適切ですね。


５、ハイパリンク先の内容が推測できるように，ハイパリンク画像のalt属性にリンク先のURLを付記する。
alt属性は、そのタグの内容を表す文字情報を指定する属性です。英数字や記号の羅列であるURLでは、閲覧したユーザがリンク先ページの内容がどのようなものか想像することができません。音声読み上げブラウザでは画像の代わりにalt属性の情報が読み上げられるため、URLではなく具体的なリンク先ページの内容をalt属性に指定することが望まれます。

URLは、www.google.co.jpのような物ので、見ても分からないですね、視覚に不自由方にとっては意味がないかもしれません。
仮に、”グーグルサイト”という内容を読んだと、　視覚に不自由方にとっても、役に立ちますね。


参照：

https://www.ap-siken.com/kakomon/30_haru/q24.html
Redisとphpredisのインストール

# Redisのインストール
#### Redis5.05をダウンロードして解凍する
```
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar -xvf /home/ec2-user/redis-5.0.5
```

#### makeするためのツールをインストール
```
$sudo yum install tcl-devel
$sudo yum install gcc
$sudo yum install make
```

#### makeしてインストール
```
$cd /home/ec2-user/redis-5.0.5/deps
$sudo make hiredis jemalloc linenoise lua geohash-int
$cd ..
$sudo make install
```
makeコマンドが完了すると、/usr/local/binにRedisバイナリが作成されてます。

#### Redisが動くか確認する
```
$ redis-server
$ redis-cli
```

# phpredisのインストール（AmazonLinux2でPHP7.3の場合）
#### Remiリポジトリのインストール
```
$ amazon-linux-extras enable epel
$yum install epel-release
$yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

#### redisモジュールの存在を確認
```
$sudo yum list | grep php73 | grep redis
php73-php-pecl-redis4.x86_64           4.3.0-1.el7.remi               remi-safe
php73-php-pecl-redis5.x86_64           5.1.1-1.el7.remi               remi-safe
php73-php-phpiredis.x86_64             1.0.0-10.el7.remi              remi-safe
```

#### php73-php-pecl-redis5をインストールする
```
$ sudo yum install php73-php-pecl-redis5
```

#### シンボリックリンクを張る
```
sudo ln -s /opt/remi/php73/root/usr/lib64/php/modules/redis.so /usr/lib64/php/modules/redis.so
sudo ln -s /opt/remi/php73/root/usr/lib64/php/modules/igbinary.so /usr/lib64/php/modules/igbinary.so
sudo ln -s /opt/remi/php73/root/usr/lib64/php/modules/msgpack.so /usr/lib64/php/modules/msgpack.so
```

#### iniファイルのコピー
```
sudo cp /etc/opt/remi/php73/php.d/50-redis.ini /etc/php.d/50-redis.ini
sudo cp /etc/opt/remi/php73/php.d/40-igbinary.ini /etc/php.d/40-igbinary.ini
sudo cp /etc/opt/remi/php73/php.d/40-msgpack.ini /etc/php.d/40-msgpack.ini
```

#### webサーバ(Apaceh)を再起動して適用する
```
sudo systemctl restart httpd
```

#### phpでphpredisが読み込まれているか確認するコマンド
```
php -m | grep redis
```
Rails.Rspecにおける click_on  find().clickなどの使い分け 

テストコードの話になります。

```ruby
find().click
```
と言われるコードが出てきます。

これは検証ツールを使い
クリックしたい場所のinput要素とname属性を探して
()の中に書きます

```ruby
find(‘input[name=“commit”]’).click
```

これを入力することで
そのページのこの要素を持つボタンやリンクをclick
してくれるって書いてます。

つまり…
クリックしたい要素を！
その場所まで飛んで！
検証ツールで探して！
見つけたらそれを入力して！
って書いてます。

ご安心ください。
簡単なコード！
ご用意しました。

クリックしたいものがボタンの場合

```
<button>送信</button>
<input type="submit" value="送信">
form_with内の
<%= f.submit "送信" %=>
```
こんな形の場合。


```
click_button 'ボタンの表示名'
```
これを使います。　
押したいボタンの名前は「送信」なので

```
click_button '送信'
```
これでOKです。
簡単！！これで押したいボタンの表示名がわかれば設定可能ですね！
ただこれはリンクが押せません。

クリックしたいものがリンク(a要素やlink_to.)


```
<a href="rspec">RSpecについて</a>

<%= link_to "RSpecについて", rspec %> 
```
今回は「RSpecについて」の文字をクリックすると
そのページに行けるとします。
この場合は

```
click_link 'リンクの表示名'
```
を入力します

```
click_link ‘RSpecについて’
```
はい出来た。
余裕ですね。

これなら押して欲しいリンクの表示名だけわかればできます！
こっちはボタンが押せません。



そして！
ここにきてもう１段階進化します。(ごめんなさい長いです)

クリックしたいものがリンクなのかボタンなのか
分からないあなた！
安心してください！！
あります。

ボタンかリンクかわからんけど！
とりあえずここクリックして！

そんなあなたにはこれ！

```
click_on 'クリックしたい場所の表示名'
```
これはボタンでもリンクでもクリックしてくれます。

```
click_on ‘送信’
click_on ‘RSpecについて’
```

こんなこともできます！

ただし例外があります。

リンク先のないボタンや、リンクは押せません。
a要素の中にhrefを入力していない場合などは押せません。

```
<a>RSpecについて</a>
```

これにはhrefがないので押せません。

基本的にはclick_onで解決できるが、場合によっては他のものを使う必要がありそう。

以上です。
kicad(5.99)のdrc

##概要
今までeagleを使っていたけれど、フリーでSTEPファイルのexport機能も充実しているkicadを今後使っていこうと思うので、JLCPCB向けのDRCとgerberファイルの出力のやり方をメモ。
JLCPCBはElecrowの用にdrc用.druファイルやcamプロセッサ用.camファイルがないので、パターンクリアランスなどは公式サイトを見ながら手入力します。


##環境
- Windows 10 64bit
- Kicad 5.99.0-2849-g8bca145b75 (Nightly-build)

> :pushpin: 私がインストールしたNightlyは [こちら](https://kicad-downloads.s3.cern.ch/index.html?prefix=windows/nightly/)の2020年8/19バージョンです。多分ご覧になる方は同じのをダウンロードできないと思いますが、ご参考まで。

## Capabilities

JLCPCBのホームページ上の方のメニューから[CAPABILITIES](https://jlcpcb.com/capabilities/Capabilities)のリンクに飛ぶ。
同ページにデザインルールが細かく書かれている。

## KicadのBoard Setup
前節のデザインルールの数字ををKicadのPCBNEW -> File -> Board Setup に反映させる。次の写真のようになる。

![jlcpcb_nightly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691828/af04234c-9ae0-ee77-0330-b89e862ea43c.png)

![jlcpcb_nightly_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691828/b23d705c-a8fd-3a8d-7240-b7b5b3bc7e62.png)

## Gerberファイルの出力方法
[公式](https://support.jlcpcb.com/article/102-kicad-515---generating-gerber-and-drill-files)の通りなので詳しくは書かないけれど、注意点をいくつか追加：

- Nightlyのため、設定画面が少し違うが、ドリルデータの出力の時NPTHとPTHが１つのファイルになるように設定すること

- Nightlyのためか、ドリルデータがKicadのGerber-Viewerにうまく反映されないようであるが、JLCPCBのGerber-Viewer上では問題ないように見える。納品されたら、要確認。（執筆時点で発注した直後）。

安倍さんには辞めてほしくなかったですが、致し方ないですね。再登板も見据えて今後も頑張ってほしいです。
2020年9月1日
NEM Symbol トランザクションタイプ一覧

NEM Symbolで使用されるトランザクションタイプ(TransactionType)の一覧です。
ドキュメントなどでは16進数表記で説明されていますが、デバッグ中などは10進数表記で出力されることもあり、対応表があると便利と思ったために作成しました。


参考元
https://docs.symbolplatform.com/ja/concepts/transaction.html
https://github.com/nemtech/symbol-sdk-typescript-javascript/blob/main/src/model/transaction/TransactionType.ts
https://docs.symbolplatform.com/symbol-sdk-typescript-javascript/0.21.0/enums/_model_transaction_transactiontype_.transactiontype.html


| 名称 | 16進数表記 | 10進数表記 |説明|
|:-----------|:------------|:-------------|---|
|ACCOUNT_ADDRESS_RESTRICTION|0x4150|16720|Account restriction address transaction type|
|ACCOUNT_KEY_LINK|0x414c|16716|Link account transaction type|
|ACCOUNT_METADATA|0x4144|16708|Account metadata transaction|
|ACCOUNT_MOSAIC_RESTRICTION|0x4250|16976|Account restriction mosaic transaction type|
|ACCOUNT_OPERATION_RESTRICTION|0x4350|17232|Account restriction operation transaction type|
|ADDRESS_ALIAS|0x424e|16974|Address alias transaction type|
|AGGREGATE_BONDED|0x4241|16961|Aggregate bonded transaction type|
|AGGREGATE_COMPLETE|0x4141|16705|Aggregate complete transaction type.|
|HASH_LOCK|0x4148|16712|Lock transaction type|
|MOSAIC_ADDRESS_RESTRICTION|0x4251|16977|Mosaic address restriction type|
|MOSAIC_ALIAS|0x434e|17230|Mosaic alias transaction type|
|MOSAIC_DEFINITION|0x414d|16717|Mosaic definition transaction type.|
|MOSAIC_GLOBAL_RESTRICTION|0x4151|16721|Mosaic global restriction type|
|MOSAIC_METADATA|0x4244|16964|Mosaic metadata transaction|
|MOSAIC_SUPPLY_CHANGE|0x424d|16973|Mosaic supply change transaction.|
|MULTISIG_ACCOUNT_MODIFICATION|0x4155|16725|Modify multisig account transaction type.|
|NAMESPACE_METADATA|0x4344|17220|Namespace metadata transaction|
|NAMESPACE_REGISTRATION|0x414e|16718|Register namespace transaction type.|
|NODE_KEY_LINK|0x424c|16972|Link node key transaction|
|SECRET_LOCK|0x4152|16722|Secret Lock Transaction type|
|SECRET_PROOF|0x4252|16978|Secret Proof transaction type|
|TRANSFER|0x4154|16724|Transfer Transaction transaction type.|
|VOTING_KEY_LINK|0x4143|16707|Link voting key transaction|
|VRF_KEY_LINK|0x4243|16963|Link vrf key transaction|
【Unity】ビルドせずに実機デバッグできるAR Foundation Editor Remote


#AR Foundation Editor Remoteについて
[Asset Store](https://assetstore.unity.com/packages/tools/utilities/ar-foundation-editor-remote-168773)

公式ドキュメントを元にして、iOSで使う場合について説明します。

ARCompanionアプリをビルドしてiPhoneにインストールすると、iPhoneとPCでカメラの情報を通信できるようになり、UnityのGameSceneで確認ができるというものです。


##自分の環境
Unity 2019.4.1f1
ARFoundation 3.0.1
ARKit XR Plugin 3.0.1

Macbook Pro 13 2017 Mid メモリ8GB
MacOS 10.14.6

iPhone XS
iOS 13.6


#使い方
##推奨環境
ARFoundation 3.0.1
ARKit XR Plugin 3.0.1

iOSのフェイストラッキングを有効にするには、パッケージマネージャ経由でARKit Face Tracking 3.0.1をインストールします

(XR Management パッケージ v.3.2.10以降をサポートしているUnityのバージョンでのみ必要です。
Project Settings → XR Plug-in Management → PC, Mac & Linux Standalone でAR Foundation Remote providerを有効にする)

##1. ビルド
Package Managerから
ARFoundation 3.0.1
ARKit XR Plugin 3.0.1
をインストールします。

フェイストラッキングを使う場合、ARKit Face Tracking 3.0.1もインストールします。

Asset StoreからAR Foundation Editor Remoteをインポートして、iPhoneをPCと接続します。

ターゲットプラットフォームをiOSに変更して、Project/Plugins/ARFoundationRemoteInstallerのInstaller.assetのinstall AR Companion appボタンをクリックするとXcodeが立ち上がり、アプリのビルドが始まります。
この時Unityでエラーが起こっている場合はボタンを押す前に解決しておいてください。

![スクリーンショット 2020-09-01 11.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/ca5f0347-e9ad-789f-d3ef-ada68a7af488.png)


AR Companion appのインストールに失敗した場合は、エラーを修正し、Delete Companion app build folderボタンを押してからインストールを繰り返します。
**Assets/Plugins/ARFoundationRemoteInstaller/Scenes/Senderに入っているSceneを変更するとビルドがうまくいかなくなります。**




##2. 実機テスト
iPhoneでARCompanion Appを起動します。

UnityのAssets/Plugins/ARFoundationRemoteInstaller/Resources/Settings.assetのIPに、iPhoneに表示されているIPを入力します。

iPhoneでアプリを立ち上げたままUnityをPlayすると、GameSceneでARの様子が確認できるようになります。
画面タップも反応します。

以上です！
Zabbix：クエリでSQLServerのパフォーマンス監視

# TODO
 * 動的管理ビュー(DMV)のパフォーマンスをzabbixで監視する
 * zabbix_agentd.confのUserParameterを活用

## SQLServer
### スクリプト配置

#### Get-CountSuspended.bat

```bash
@echo off
PowerShell -NoProfile -command "C:\workspace\ps1\Get-CountSuspended.ps1"
```

#### Get-CountSuspended.ps1

```powershell
$curPath = "C:\workspace\ps1\"
Import-Module "${curPath}Get-CountSql.psm1"
$sql = "select count(*) as cnt from sys.dm_exec_requests as er where er.status = 'suspended'"
$ret = Get-CountSql -CurPath $curPath  -Sql $sql
$ret
```

### Get-CountSql.psm1
クエリ共通

```powershell
function Get-CountSql
{
    param(
        [string]$CurPath,
        [string]$Sql
    )
    $ret = 0
    try
    {
        #$sql = $Args[1]
        #$sql = "select count(*) as cnt from sys.dm_exec_requests as er where er.status =  'suspended'"
        $settings = Get-Content "${CurPath}conf\conn.txt" | ConvertFrom-StringData
        $connectionString = $settings.ConnectionString
        #Trust
        $connection = New-Object -TypeName System.Data.SqlClient.SqlConnection
        $connection.ConnectionString = $connectionString
        $command = $connection.CreateCommand()
        $command.CommandType = [System.Data.CommandType]::Text
        $command.CommandText = $Sql
        $command.CommandTimeout = 300
        $connection.Open()
        $da = New-Object System.Data.SqlClient.SqlDataAdapter
        $da.SelectCommand = $command
        $dtSet = New-Object System.Data.DataSet
        [void]$da.Fill([System.Data.DataSet]$dtSet)
        #$recordCount = $dtSet.Tables[0].Rows.Count
        $ret = $dtSet.Tables[0].cnt
        #$dtSet.Tables[0] > dmv.log
    }
    catch [Exception]
    {
        $Error[0] > Get-CountSql.log
    }
    return $ret
}
```

### Zabbix Agent
#### zabbix_agentd.conf
```bash
UserParameter=dmv.suspended-count,C:\workspace\ps1\Get-CountSuspended.bat
```


## Zabbix
### アイテム
 * dmv.クエリ実行待ち
 * タイプ：Zabbixエージェント（アクティブ）
 * キー：dmv.suspended-count
 * データ型：数値(整数)

### トリガー
 * 連続3回100未満がゼロ = 連続3回100超過
 * {db-pub:dmv.suspended-count.count(#3,100,"lt")}=0


## おまけ
### Get-CountRuntime.bat
```bash
@echo off
PowerShell -NoProfile -command "C:\workspace\ps1\Get-CountRuntime.ps1"
```
### Get-CountRuntime.ps1
```powershell
$curPath = "C:\workspace\ps1\"
Import-Module "${curPath}Get-CountSql.psm1"
$sql = "
SELECT max(datediff(MINUTE, der.start_time, GETDATE())) as cnt
FROM sys.dm_exec_requests der
JOIN sys.dm_exec_sessions des ON des.session_id = der.session_id
WHERE der.status in ('running','runnable','suspended')
"
$ret = Get-CountSql -CurPath $curPath  -Sql $sql
$ret

UserParameter=dmv.runtime-count,C:\workspace\ps1\Get-CountRuntime.bat
```
Docker で CocoaPods のバージョン管理をする

rbenv や Bundler を用いてCocoaPods のバージョン管理しているチームは多いと思います。
以下は rbenv と Bundler を使い Ruby と CocoaPods のバージョンを管理する例です。
Ruby のバージョンを 2.7.1, Bundler のバージョンを 2.1.4, CocoaPods のバージョンを 1.9.2 に固定しています。

```bash
$ brew install rbenv ruby-build
$ rbenv install 2.7.1
$ gem install bundler -v 2.1.4
$ bundle config set path vendor/bundle
$ bundle _2.1.4_ install
$ bundle exec pod install
```

```:.ruby-version
2.7.1
```

```Ruby:Gemfile
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'cocoapods', '1.9.2'
gem 'cocoapods-binary', '0.4.4'
```

この方法では rbenv のインストールの必要があり、デザイナーさんなどエンジニア以外の人の環境構築のハードルが少し高いです。
今回は Docker で CocoaPods を管理することで、そのハードルを少し下げてみました。

以下のような DockerFile を用意し、イメージをビルドします。
好みでプラグインを追加したりレイヤーを統合したりしてください。

```Dockerfile:Dockerfile
FROM ruby:2.7.1

RUN gem install cocoapods -v 1.9.2
RUN gem install cocoapods-binary -v 0.4.4
RUN adduser cocoapods
USER cocoapods
RUN pod setup
WORKDIR /project
```

```bash
$ docker build -t cocoapods-docker .
```

プロジェクトのディレクトリに移動し、ビルドしたイメージを使い `pod install` を行います。

```bash
$ docker run --rm -v $PWD:/project cocoapods-docker pod install
```

こちらのリポジトリを参考にさせていただきました。

[gdevillele/docker-cocoapods](https://github.com/gdevillele/docker-cocoapods)