OmniAICreator/Qiita-1.07M huggingface dataset:
KEDAを使って、SQSのMessage数に応じたAutoScaleを実装してみる。　-構築編-

## はじめに
4/6に「[KEDA](https://keda.sh/)」（Kubernetes Event-driven Autoscaling）がCloud Native Computing Foundation（CNCF）プロジェクトに採用されたことが発表されました。

KEDAとは、Kubernetes-based Event Driven Autoscaling Componentの略で、SQSのメッセージ数などに応じてpodをscaleさせる機能を提供します。

そこで今回は、KEDAを使ってEKS上のpod数を、SQSのメッセージ数に応じてAutoScale In/Outさせてみようと思います。

今回は、環境構築までの流れを説明します。

## 構築手順
### 事前準備
今回、helmを使ってKEDAをデプロイするため、kubectlを発行する環境に[AWSの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/helm.html)に従ってhelmをインストールしておきます。

```
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh
```
### helmでKEDAをデプロイ
こちらを参考にさせていただきました。
https://keda.sh/docs/1.4/deploy/
https://www.slideshare.net/tsukasakatou9/kubernetes-keda


**1.helm repoを追加**

```
$ helm repo add kedacore https://kedacore.github.io/charts
"kedacore" has been added to your repositories
```
**2.helm repoをアップデート**

```
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "kedacore" chart repository
Update Complete. ⎈ Happy Helming!⎈
```
**3.KEDAのhelm chartをインストール**
helmのバージョンを確認します。

```
$ helm version
version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}
```

versionが3.xの場合は下記。

```
$ kubectl create namespace keda
namespace/keda created
$ helm install keda kedacore/keda --namespace keda
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
NAME: keda
LAST DEPLOYED: Wed May 20 13:08:49 2020
NAMESPACE: keda
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

**4.keda-operator podが起動したことを確認**

```
$ kubectl get pods -n keda
NAME                                               READY   STATUS    RESTARTS   AGE
keda-operator-5895ff46b9-vswhs                     1/1     Running   0          3m58s
keda-operator-metrics-apiserver-6774776dbc-p5m2j   1/1     Running   0          3m58s
```

これで、KEDAが動作するために必要なpodが起動していることが分かります。

## 最後に
今回は、一旦KEDAを動作させるための環境を用意するところまで説明しました。
次回は実際にSQSと連携さえてpodをAutoScaleIn?Outさせてみようと思います。
Bit全探索 ABC167

#ABC167 C問題(Bit全探索)
ABC167でBit全探索の問題をAC出来たので記事を書きました.
拙い記事ですが,勉強に役立ててもらえれば幸いです.
https://atcoder.jp/contests/abc167/tasks/abc167_c
##考えたこと
N,Mの制約が「1<=N,M<=12」と非常に厳しい.
選択肢が「買う」or「買わない」という二択なのでnetでググりながらBit全探索というものを試みた.
##実装
```python
n, m, x=map(int, input().split())
 
book=[list(map(int, input().split())) for i in range(n)]###参考書の情報を受け取る.
 
costs=[]
 
for i in range(2**n):
    t=[0]*m###m種類について「買う」or「買わない」の選択肢がある.
    cost=0
    for j in range(n):
        if ((i>>j)&1)==1:###「1」→「買う」として買った参考書で各理解度が上昇!.
            for k in range(m):
                t[k]+=book[j][k+1]###先頭は参考書の値段であることに注意する.
            cost+=book[j][0]
        
    if all(t[l]>=x for l in range(m)):###全ての理解度がx以上であるときcostsに追加
        costs.append(cost)
 
if len(costs)==0:###どの選び方でも目的を達成出来ない時
    print(-1)
else:
    print(min(costs))
```
##終わりに
コンテスト中にAC出来て嬉しかったです.
今の僕の実力ではD問題でいつも弾かれているので,D問題が解けるようになりたいなぁ...
jQueryでHTMLを取得する方法

DOMを取得する様々な方法です。個人的にはJSよりjQueryの方が
簡単に取得できると思います。

# IDセレクタ
html要素のID属性を付与しているセレクタを取得できます。
以下、例です。

```javascript
$("#red")
```
上記の例ではidがredのものを取り出していることになります。

#クラスセレクタ
html要素のクラス属性を付与しているセレクタを取得できます。
以下、例です。

```javascript
$(".red")
```
上記の例ではクラスがredのものを取り出していることになります。

#要素セレクタ
html要素のセレクタを取得できます。
以下、例です。

```javascript
$("h1")
```
上記の例ではh1の要素の中身を取り出していることになります。

色々取り出しかたがあるけど、**$マークをつけ忘れるのを気をつけた方がいい**かもしれません。
RailsプロジェクトにCircleCIを導入したがGemキャッシュが効いていない時の対応方法

Railsプロジェクトで使用するCICDツールとしてCircleCIを導入・[ドキュメント](https://circleci.com/docs/ja/2.0/language-ruby/)を参考にして設定ファイルを書いていましたが、キャッシュが効いていない動きを見せていました。

▼キャッシュが効いておらず、毎回`bundle install`をしているような動き
![スクリーンショット 2020-05-26 17.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348703/c3bb08e1-3599-cc29-a6a2-d83a55cb5ea7.png)

▶︎[この時点のジョブログ](https://app.circleci.com/pipelines/github/kenzoukenzou/study_stash/151/workflows/2a8fe77b-0b04-4a64-8823-e6864b931f49/jobs/222/steps)
▶︎[この時点の設定ファイル](https://github.com/kenzoukenzou/study_stash/blob/a4e5deeede9758ccebecb60a30951d032f7639f0/.circleci/config.yml)

以下、CircleCIで`bundle install`のキャッシュが効いていない時の対処方法についてです。

**解消方法**

- `bundle config set --local path`コマンドで、Gemインストール先指定
- 今までのキャッシュを使用しないよう設定ファイルを書き換え

下記を`bundle install`の前に追記して、対応しました。

```yml
command: bundle config set --local path 'vendor/bundle'
```

[Github](https://github.com/kenzoukenzou/study_stash/blob/06c475def1255d3f8f80b10ca288b3ea7bf79776/.circleci/config.yml#L22)でも見れるようにしてあります。

- キャッシュの対象を`vender/bundle`に指定しているが、そこにGemが見つからず毎回インストールが走ってしまっている（キャッシュが効いていない）
- `bundle install`コマンドはグローバルにGemをインストールする、プロジェクトローカルにGemたちをインストールしたいときは`--path`指定を入れる

以上から、CircleCI上でキャッシュがあるかどうかを確認しに行く先である`vender/bundle`にGemたちがインストールされるよう`bundle config set --local path 'vendor/bundle'`を追記。

ここまでの対応でキャッシュは効くかなと思いましたが、効きませんでした。理由としては、CircleCIの方で「`すでにキャッシュファイルあるので、キャッシュ保存スキップしますわ`」となってしまうから。

▼キャッシュ保存がスキップされる様子
![スクリーンショット 2020-05-26 17.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348703/9b230ca3-3dd2-461e-def6-08cbf9eace19.png)

▶︎[この時点のCircleCIログ](https://app.circleci.com/pipelines/github/kenzoukenzou/study_stash/158/workflows/ca275d7e-a7e3-4268-b6c0-974e48c9c6dd/jobs/232/steps)

キャッシュ保存が実行されるよう、今までのキャッシュを使用しないように設定ファイルを書き換える対応をしました。

▼修正箇所
![スクリーンショット 2020-05-26 17.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348703/cdf2124b-c981-b144-a31e-17d839626892.png)
p
▶︎[この時点のコミット](https://github.com/kenzoukenzou/study_stash/commit/8a7e1341b705114662a4fe495913a0144628d050)

---

以上の対応を行った結果、キャッシュはちゃんと効くようになりました。

▼キャッシュが効いている様子
![スクリーンショット 2020-05-26 17.31.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348703/e91ec122-6f46-c64f-d677-0fef77b2ebe5.png)


▶︎[この時点のCircleCIログ](https://app.circleci.com/pipelines/github/kenzoukenzou/study_stash/161/workflows/b7f9f9c3-67dc-40d7-8b1d-46a271ba6d13/jobs/236/steps)

---

**参考**

- [Clear project dependency cache](https://support.circleci.com/hc/en-us/articles/115015426888-Clear-project-dependency-cache)
- [bundle install時に--path vendor/bundleを付ける必要性は本当にあるのか、もう一度よく考えてみよう](https://qiita.com/jnchito/items/99b1dbea1767a5095d85)
【備忘録】ブラウザでカメラを使用する

ブラウザからデバイスのカメラを使用する場合。とりあえず記載しているのはカメラ1つの場合で、スマホやタブレットで前面／背面カメラがある場合は未調査。
撮影した画像はAPIに渡す想定で、base64エンコードするまで記載しています。
# 検証環境
* Google Chrome バージョン: 81.0.4044.138

# ソースコード
```html:html
<video id="video">Video stream not available.</video>
<canvas id="canvas"></canvas>
<input type="button" onclick="onClickCaptureButton()" value="capture"></input>
```
```javascript:javascript
const video  = document.getElementById('video');
const canvas = document.getElementById('canvas');

video.addEventListener('canplay', (event) => {
  canvas.setAttribute('width' , video.videoWidth);
  canvas.setAttribute('height', video.videoHeight);
}, false);

navigator.mediaDevices.getUserMedia({video:true, audio:false})
.then((stream) => {
  video.srcObject = stream;
  video.play();
})
.catch((err) => {
  console.log(err);
});

function onClickCaptureButton(event) {
  const ctx = canvas.getContext('2d');
  ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);

  const base64Image = canvas.toDataURL('image/jpeg', 0.95)
  // <!-- ここに画像の処理を書く。APIをコールするなり、imgタグを埋め込むなり。。。 -->
}
```
pytorchのtorch.utils.data.DataLoaderは無限イテレータに対応していない


表題の通り、pytorchのtorch.utils.data.DataLoaderは無限イテレータに対応していない。以下でそれを確かめる。

```python
import torch.utils.data


def data_generator():
    while True:
        yield torch.Tensor([1,2,3])
        
dataloader = torch.utils.data.DataLoader(my_data, batch_size=2)

for i, z in enumerate(dataloader):
    print(z)
    if i > 10:
        break
```

上のコードを実行すると次のようになる。

```bash
TypeError: object of type 'generator' has no len()
```

`len()`を持っていないとダメみたいです。動きませんね。
Angular MaterialのRadio Button、CheckBox、Sliderの色を個別に変更する

Angular MaterialのRadio Buttonの色を変更するCSSを以下に記述する

CSS(Radio Buttonの色を指定)

```
.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element {
  opacity: 0 !important;
  background-color: #0caccd !important;
}

.mat-radio-button.mat-accent .mat-radio-inner-circle {
  background-color: #0caccd !important;
}

.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle {
  border-color: #0caccd !important;
}
```

CSS(CheckBoxの色を指定)

```
.mat-checkbox-checked.mat-accent .mat-checkbox-background,
.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background {
  background-color: #0caccd !important;
}
```

CSS(Sliderの色を指定)

```
.mat-accent .mat-slider-thumb,
.mat-accent .mat-slider-thumb-label,
.mat-accent .mat-slider-track-fill {
  background-color: #0caccd !important;
}

.mat-accent .mat-slider-thumb {
  background-color: #0caccd !important;
}

.mat-accent .mat-slider-thumb-label {
  background-color: #0caccd !important;
}

.mat-accent .mat-slider-track-fill {
  background-color: #0caccd !important;
}
```

上記の#0caccdの箇所に希望の色を指定すればOK
【Go】メソッド=関数でしょ？と考えてきちんと躓く

# メソッド = 関数でしょ？

なんででしょう。なんとなくこういう感覚でした。
**もちろん違いますね。オブジェクト指向をきちんと勉強しましょうね（自戒）**

とりあえず、一歩前進して以下の解釈になりました。

## 関数とは

[IT用語辞典 -- 関数  【 function 】  ファンクション](http://e-words.jp/w/%E9%96%A2%E6%95%B0.html)

> 関数とは、コンピュータプログラム上で定義されるサブルーチンの一種で、数学の関数のように与えられた値（引数）を元に何らかの計算や処理を行い、結果を呼び出し元に返すもののこと。

うん。こちらの意味は想像と一致してました。

## メソッドとは

[IT用語辞典 -- メソッド  【 method 】  メンバ関数](http://e-words.jp/w/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89.html)


> オブジェクト指向ではデータと手続きをオブジェクトとして一体化（カプセル化）して定義、利用する。この、オブジェクトに内包された手続き（データに対する処理内容を記述したプログラム）のことをメソッドという。言語によっては「メンバ関数」などということもあるが、ほぼ同じ機能を表す。

**オブジェクトに内包された手続き（データに対する処理内容を記述したプログラム）のことをメソッドという。（ここ大事）**

# Goで見てみる

## 関数

[A Tour of Go -- Functions](https://tour.golang.org/basics/4)

```functions.go 
package main

import "fmt"

func add(x int, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(42, 13))
}
```

これはとっても理解できました。最初は

### メソッド

[A Tour of Go -- Methods](https://tour.golang.org/methods)

> Go does not have classes. However, you can define methods on types.

クラスはありませんが、**types(型)に紐づく関数（メソッド）を定義できる**とのこと。

```methods.go
package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
	v := Vertex{3, 4}
	fmt.Println(v.Abs())
}

```

初見でコレを見たときは、関数定義時のこの点がよく理解できなかった

```
func (v Vertex) Abs() float64 {
     ↑↑これは？↑↑
```

こちらもきちんと説明がありました。

> A method is a function with a special receiver argument.
> 
> The receiver appears in its own argument list between the func keyword and the method name.

これは**receiver（レシーバー）と言い、どのtypes(型)と紐づいているかを明示している**とのこと。
そのため、main内では、Vertex（types）からメソッドを呼び出すことができていますね！

関数と違い、型と紐づいて初めてメソッドと呼ばれるようになるということだったのか。
前述のメソッドの意味ときちんと一致していますね。

> **オブジェクトに内包された手続き（データに対する処理内容を記述したプログラム）のことをメソッドという。（ここ大事）**

# 後書き
ようやく関数とメソッドの違いについて疑問に思うことができました。
正直なんとなく使っていた事に気づいて反省。
asdfでErlangのインストール時にNo usable OpenSSL found

# はじめに
asdfでErlangのインストール時に「No usable OpenSSL found」とエラーが出た時の対処方法
ある日 phoenixを最新版にしたくてmix local.phxをするとエラー
はてと思い、mix local.hexもエラー。。。
先日まで何事もなくいごきよったのに。。。


# 参考
[github:asdf-vm/asdf-erlang「No usable OpenSSL found #82」](https://github.com/asdf-vm/asdf-erlang/issues/82)
Special Thanks　@nishiuchikazuma 

# 環境
- macOS Catalina
- OpenSSL 1.1　Macのデフォルト
- IEx 1.9.1 (compiled with Erlang/OTP 22)
- erlang 22.1.5
- phoenix 1.4.16

# このバージョンにしたい。
- IEx 1.10.1 
- phoenix 1.5.3
- erlang 22.3.4.1


# 目次
- OpenSSLにパスを通そう
- 「No usable OpenSSL found」のエラー
- 環境変数：KERL_CONFIGURE_OPTIONSの設定

# OpenSSLにパスを通そう

```shell:
#pathの確認
$ which openssl
/usr/bin/openssl
#ん？どうもパスがおかしい。

#fishの設定ファイルを変更する。
$ cat $HOME/.config/fish/config.fish
function fish_user_key_bindings
  bind \cr 'peco_select_history (commandline -b)'
  # bind \cx\ck peco_kill
  bind \cx\cr peco_recentd
end
#こっから3行追記
source ~/.asdf/asdf.fish
set -g fish_user_paths "/usr/local/opt/openssl@1.1/bin" $fish_user_paths
set -g fish_user_paths "/usr/local/sbin" $fish_user_paths

#pathの確認
$ which openssl
/usr/local/opt/openssl@1.1/bin/openssl

```

# 「No usable OpenSSL found」のエラー

asdfでerlangをインストールするとエラーになる。

```shell:
#erlangのインストール
$ asdf install erlang 22.3.4.1
#こんなエラーがでる。
* crypto         : No usable OpenSSL found
* ssh            : No usable OpenSSL found
* ssl            : No usable OpenSSL found

```

# 環境変数：KERL_CONFIGURE_OPTIONSの設定
kerlの環境変数にOpenSSLの場所を指定することでエラーが解消されました。
※OpenSSLはMacに入っていたものを指定してます。(brewでインストールしたものはパスが違うので注意）

```shell:
#環境変数の設定
$ export KERL_CONFIGURE_OPTIONS="--disable-debug --disable-silent-rules --without-javac --enable-shared-zlib --enable-dynamic-ssl-lib --enable-hipe --enable-sctp --enable-smp-support --enable-threads --enable-kernel-poll --enable-wx --enable-darwin-64bit --with-ssl=/usr/local/opt/openssl"

#環境変数の設定(brew版)
export KERL_CONFIGURE_OPTIONS="--disable-debug --disable-silent-rules --without-javac --enable-shared-zlib --enable-dynamic-ssl-lib --enable-hipe --enable-sctp --enable-smp-support --enable-threads --enable-kernel-poll --enable-wx --enable-darwin-64bit --with-ssl=/usr/local/Cellar/openssl/1.0.2t"

$ asdf install erlang 22.3.4.1
#これで無事インストールできました

```

きっと自分を助ける備忘録になるはず。
カメ飼育入門(IoT)

記事をご覧くださりありがとうございます！
初めまして。AI/IoT分野のプロフェッショナルを目指して修行中の、のぶたんです。🐉

今回はESPマイコンやセンサーなどを駆使すると遠隔でリモコン操作したり、お家の様子を監視できることについて取り扱っている記事です！



#作った基板①
必要な部品
①赤外線LED←リモコン操作用
②抵抗
③CDSセル←部屋の明るさ監視用
④圧電ブザー←起動音・操作音出力用
![IMG_20200526_162838.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/e46f01ec-f9a3-2bb9-2897-d53ad991c275.jpeg)

#作った基板②
必要な部品
①圧力センサー←ドアの開閉状況監視用
※画像は省略(基板①のようにESPマイコンにセンサーをつないだだけ)
#作った基板③
必要な部品
⑥水温センサー←カメの水槽温度監視用
※画像は省略(基板①のようにESPマイコンにセンサーをつないだだけ)

#実際の監視、操作画面(室内の明るさ、シーリングライトリモコン操作・開閉状態)
![Screenshot_20200526-162547.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/34f6b2f7-1197-e810-d857-dd541c8e9dbe.jpeg)
→工夫ポイント：CDSセルにより室内の明るさを確認できるので、シーリングライトがちゃんと消灯できているかが確認できます。
![Screenshot_20200526-162608.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/6f7c1b45-4f3b-fbba-5bd0-19312b02e6f0.jpeg)

#実際の監視画面(カメの水槽温度)
![Screenshot_20200526-162531.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/45da8d8a-a740-5e9a-d71a-7e5b32c7b69e.jpeg)

#感想
リアルタイムにグラフがにょろにょろ動くので監視している気分が味わえます。
→今回は、**chart.js**を用いてグラフをつくりました！
さらに、これを家の全室に配置すれば、自宅警備員ごっこができます。

#ソースコード
しばし待たれよ！
#最後に

技術的な話をちょこっと。
★シーリングライト操作に関しての処理は下記のようになっています。
![EYhuIJuUwAEWfyO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/b4fef707-93d8-1a63-01c1-4f11e3450b5a.jpeg)
★センサデータのPOSTに関しての処理は
サーバ側にFlaskを使用しています。
一定周期でPOSTされたセンサーデータをjsonで記録して、それをajaxを用いて取得してchart.jsでグラフのフロント表示しています。

この記事では、全体像だけ説明したので作り方は、githubに乗っけようと思います。

それでは✋
DeepRunning　～Level１～

#Level１．間違いじゃないよ
　Qiitaを利用することになり、登録してみました。
　主にＡＩ関連の勉強をするのに活用してみようと思っています。
　継続がチカラとなるように、少しずつ頑張ってみよう。

##1-1.Ｇ検定との出会い
　昨年、ひょんなことからＡＩの勉強に興味を持ち、１週間がんばってＧ検定に合格しました。
　１０月末でした。
　上司と面接した際に、ＡＩの勉強してみようと思っていると話をした後、
　「そうだ、Ｇ検定って１２月にあったよな。やってみようかな。」

　・・・なーんて勘違いに気が付かず、受験を宣言しちゃった。。。

　さてさて、余裕をもって申し込んでみよう。
　ＪＤＬＡのホームページを開き、そうそう。１１月だったね。ＯＫ～！！

　・・・
　・・・
　・・・

　え？１１月？

　そう。2019年11月9日（土）だったんです。

　あと１週間しかない。たまたま、Amazonで参考書は買ってあったので、すぐに申し込み。

　それから、１週間は必死に頑張りました。

　でも、楽しかったんですね。
　ＡＩ関係の勉強って。勉強というより遊び感覚でした。

##1-2.Ｅ資格もやってみようじゃないか
　楽しくなっちゃったんです。
　勉強するために、それまで持っていた非力なＶＡＩＯじゃダメで、
　ＰＣを購入までしちゃいました。
　やるならちゃんと勉強しよう。
　Ｅ資格へのスタートでした。

##1-3.DeepLearningとDeepRunning
　タイトルどうしようかなって考えていて、
　DeepLearningの勉強するので少し遊んでつけました。
　勉強より楽しんで継続しようと思って。

　少し運動不足も気にしながら、レッツＥ資格！！

##1-4.運命的なStudy-AIさんとの出会い？
　Ｅ資格に向けて勉強していたところ、実装師Ａ級のお誘いを受けて、
　またまた、勉強のうえで合格できました。
　Ｅ資格と比べると安く受験できるので、軽い気持ちでした。

　合格後、ラビットチャレンジに参加させていただけるというありがたいご連絡が。
　会社にＪＤＬＡ認定の研修を受けさせてもらおうか悩んでいたところで、
　個人申し込みなら安く（それでも高いですけれど。。。）、
　余計な買い物をしないと決めて申し込みました。

　今は、ラビットチャレンジを頑張ろう。
　Qiitaの投稿はこうして幕を上げました。

　どうぞ、よろしくお願いいたします。
VNC サーバーをセットアップしてリモートアクセス

## 概要
いつもはvscodeを使って快適にssh接続して開発などをしてますが、
どうしてもリモート接続してアプリケーションなどを走らせ、GUIなどを見ないといけない場合があります。

その時、VNCを使って、接続したいサーバにVNC server を、
接続元のPCに　VNC Viewer をインストールすることで、
デスクトップにリモートアクセスできる。


## 手順

### 1. VNC account を作る。
注意点
このとき、個人的にリモートアクセスをするだけなのであれば、VNC Home と呼ばれる、
商用ではないアカウントを作る。このときに商用アカウントを作ると、30日間のトライアルが与えられ、その後失効する。
もし個人的な使い道なのであれば、このときにHomeをアカウントに紐付けておくこと。

### 2.  アクセスしたい先のPCにVNC Serverをインストールする。
このときアカウントが必要になるので、先ほど作ったアカウントを使うこと。

### 3. アクセス元のPCにVNC Viewer をインストールする。
これも同じ。

### 4. つないでみる
server をアクセス先のPCで立ち上げ、アカウントでログインする。
viewer をアクセス元のPCで立ち上げ、アカウントでログインする。
vieser 側に、同じアカウントに紐ついたサーバーが表示されるはずなので、アクセスする。


## まとめ
非常に簡単にリモートデスクトップを行うことができる。
商用でないのであれば、Homeを使うことをお勧めする。
ただし、ウェブサイト上ではHomeが存在することがよくわかりにくくなっているので注意すること。


おわり。
JavaのHttpClientにおける3つのTimeoutの違いに関して

ApacheのHttpClientを使う際に、以下の３つのタイムアウト値（ミリ秒）を設定できるものの、違いをよくわかっていなかったので自分なりにまとめてみた。

```java
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;

RequestConfig config = RequestConfig.custom()
    .setConnectTimeout(30000)
    .setConnectionRequestTimeout(30000)
    .setSocketTimeout(30000)
    .build();
      
HttpClient httpClient = HttpClients.custom()
    .setDefaultRequestConfig(config)
    .build();
```


#ConnetionTimeout
サーバーへの接続要求を送信して、接続が確立されたとレスポンスを受け取るまでのタイムアウト値。
要するに3ウェイハンドシェイクでコネクションが確立するまでに許容する時間を設定する。


#ConnectionRequestTimeout
上記の接続が完了した後、サーバーへリクエストを送ってレスポンスが返ってくるまでのタイムアウト値。


#SocketTimeut
ソケット通信の監視に使われるタイムアウト値。
ソケット通信では継続的にパケットを受信するが、受信間隔がこの値以上が開いた場合はタイムアウト(=SocketTimeoutException)となる。
[rails]新規登録ページ作成で苦労した点

チームでの共同開発にあたり、
新規登録フォームを担当したため
振り返りまとめです。


## 主な使用技術
- devise
- active_hash
- ウィザード形式

#工夫した点
- ウィザード形式を取り入れており、より多くの情報を見やすく入力

-都道府県の入力は「active_hash」を実装しており、入力をしなくても選択式となるように工夫

#苦労した点

- フロント実装部分
最も苦労しました。一見、簡単そうに見えますが以下の項目は時間かかりました、、、
 - 生年月日フォームの実装
 - フォームの大きさ
 - ▼のアイコンの設置(これも生年月日)

これに関しては、下記記事へフォームの記述を記載しました
https://qiita.com/ki-ku/items/040d84626f864ea2640e

- バリデーション
正規表現を用いたバリデーションの設定は苦労しました。
　- メールアドレスは@とドメインを含む必要がある
　- ユーザー本名は全角で入力させる

- 量が多い
正直、もっと簡単に終わるかなと思っていたのですが
ウィザード形式にしたのもあり、作成したビューはログインページ含めて4ページ、
また単体テストもusersモデルとaddressモデルを行う必要がありました。

結果として、どのアプリでも使うものになりますので
とても勉強になりましたが、予定よりも時間をつかてしまったため、
他のチームメンバーには大変助けて頂きました！

とっても感謝です！
【初心者】Azureをざっくり学べる公式ページ　ベスト３

# はじめに
仕事でMicrosoft Azureを利用するので色々調べましたが、振り返ると以下の公式ページを抑えていれば良いです。

* 1,2でアーキテクチャと各サービスについて学べます
* 3で実際の設定方法などを学べます


# 1. アーキテクチャセンター
やりたいことに対して、どんなアーキテクチャにすれば良いか整理しているページです。大抵のことは既に先人たちがやっているので、自分の頭で考えるよりもまずはここを見るのが良いです。
##### 参考
* [Azure アーキテクチャ センター](https://docs.microsoft.com/ja-jp/azure/architecture/)


# 2. 各サービスの利用用途
要件によってどのサービスを利用するのが適切か、Yes/Noで答えていくと適切なサービスが導かれます。
コンピューティング、ストレージ、ネットワーク、データベースサービスごとにあります。

> * コンピューティング関連の意思決定 。 運用面の複雑さを最小限に抑えるために、コンピューティング関連の選択肢をランディング ゾーンの目的に合わせて調整します。 この意思決定は、Azure Policy イニシアティブやランディング ゾーン ブループリントなど、自動化ツールチェーンを利用して強制できます。
> * ストレージ関連の意思決定 。 ワークロード要件を支援する正しい Azure Storage ソリューションを選択します。
> * ネットワーク関連の意思決定 。 組織のワークロード、ガバナンス、接続要件を支援するネットワーク関連のサービス、ツール、アーキテクチャを選択します。
> * データベース関連の意思決定 。 ワークロード要件に最適なデータベース テクノロジを決定しま

以下のイメージです。
##### フローで選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14760/b4ef096e-cac9-ddcf-3692-522792079cac.png)


##### 参考
* [目的別データベースサービス](https://azure.microsoft.com/ja-jp/product-categories/databases/)


# 3. 実践
シナリオに沿って一通りの操作が以下で出来るので、以下をまずやるのが良いです。

##### 参考
* [Azure データ ソリューションの実装 DP-200](https://github.com/MicrosoftLearning/DP-200JA-Implementing-an-Azure-Data-Solution)
.pkcs12ファイル → .pemファイル変換

#### pkcs12とは

Public Key Cryptography Standard#12。
公開鍵証明書および秘密鍵をパスワードベースの対象鍵で保護し、安全に保存または転送するために使用されるファイル形式

#### pemとは

任意の証明書、鍵をbase64エンコードしてBEGIN/END行で挟んで繋げたテキストファイル

## .pkcs12ファイル → .pemファイルに変換 (暗号化解除）

```
openssl pkcs12 -in file.p12 -out file.pem -nodes
```

「-nodes」オプションを指定すると、秘密鍵にパスフレーズを付けた暗号化が行われない。
使用するたびにパスワード入力求められないように。


## PKCSから証明書、鍵の抜き出し


```
・CA証明書だけ抜きだす 
$ openssl pkcs12 -in file.p12 -out ca.pem -cacerts -nokeys

・鍵と証明書を抜き出す
$ openssl pkcs12 -in file.p12 -out cert.pem -clcerts

・証明書だけ抜き出す
$ openssl pkcs12 -in file.p12 -out cert.pem -clcerts -nokeys

・鍵だけ抜き出す
$ openssl pkcs12 -in file.p12 -out key.pem -nocerts

・鍵だけ抜き出す(パスフレーズ解除）
$ openssl pkcs12 -in file.p12 -out key.nopass.pem -nocerts -nodes
```

### おまけ
curlでクライアント証明書と秘密鍵を指定してリクエスト

```
curl --key key.nopass.pem --cert cert.pem {URL}
```
IAM証明書アップロード

```
aws iam upload-server-certificate --server-certificate-name ExampleCertificate --certificate-body file://cert.pem --private-key file://key.nopass.pem
aws iam list-server-certificates
```

### 参考サイト

[opensslとcurlでクライアント証明書を使ってHTTPS接続する](https://hogem.hatenablog.com/entry/2015/09/28/233000)
[PEMファイルとは何ですか？](https://qastack.jp/server/9708/what-is-a-pem-file-and-how-does-it-differ-from-other-openssl-generated-key-file)
create react appで作ったアプリをIE11対応させる

# 動機
そろそろ世間的にIE11はフェードアウトしたかなと思っていたのですが、
2020年4月時点でまだ結構なシェアを誇っているとい非常に不都合な真実にぶち当たりました。
参考：https://webrage.jp/techblog/pc_browser_share/

如何にもモダンブラウザでしか動かなそうな機能を使っているならまだしも、
そうではない一般に公開するページで「ご利用のブラウザは非対応です。」と表示するわけにもいかないので、対応を試みました。

## TL;DR;
* [ポリフィル](https://github.com/facebook/create-react-app/tree/master/packages/react-app-polyfill)を投入
* 開発モードで動かない時には、package.jsonのbrowserslist.developmentをproductionと合わせる
* それでもダメならnode_modules>.cacheを消してからyarn or npm install

## ポリフィル
公式のpolyfillがあるので入れましょう。
https://github.com/facebook/create-react-app/tree/master/packages/react-app-polyfill

yarn か npmで追加した後、以下をindex.js またはindex.tsの頭につけてあげればOKです。

``` js
import 'react-app-polyfill/ie11';
import 'react-app-polyfill/stable';
```

## 開発環境でのテスト
当然、投入した後に `` yarn start`` あたりを叩いて起動検証を試みるわけですが、
残念ながらこのままでは動きません。

原因はpackage.jsonのbrowserlistにあります。

create-react-appでプロジェクトを作った後、変更を加えていないと以下のような感じのはずです。

``` json
 "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }

```

詳しい仕様は[公式](https://create-react-app.dev/docs/supported-browsers-features/)を参照していただきたいところですが、
開発モード(普通にstart)の場合、Chrome,Firefox,Safariの最新版のみを想定したビルドになってしまうので、polyfillをimportしてもIE11では動きません。
polyfillの適用具合を確認したい場合は、productionの内容でdevelopmentの方を上書きして試しましょう。

### それでも動かなかったら
``node_modules/.cache``にキャッシュが残ってしまっている可能性が高いので、
消してnpmなりyarnなりを叩き直しましょう。
intra-martワークフローの初歩の初歩

#はじめに
intra-martの初心者向けの基礎知識を備忘録として記します。
初投稿の為、多少お見苦しい点があるかと思いますがご容赦ください。

#対象
- intra-martを導入済みの方
- ワークフローの作成または利用を予定している
- 本質よりイメージを掴みたい方

#intra-martワークフローの構成
intra-martのワークフローは大まかに分けて、
1. 申請・承認画面
2. フロー定義
で構成されています。
つまり、この二つを作成すればオリジナルのワークフローを作成することができます。(しかも簡単！)
次に、詳細の説明をします。

#申請・承認画面
申請画面、承認画面はデータの入力をしたり、ワークフロー上で承認をする際に表示する画面です。
テキストボックスやプルダウンなどのアイテムを配置し、
入力した状態で申請ボタンを押す・・・ といったイメージです。
こういったページを作成するのにはJavascriptやCSSはもちろん、HTMLの知識も必要がありません。
Forma-designer(*1)を使用したワークフロー画面の作成は、メニューから好きなアイテムを選択しドラッグすることにより任意の場所にアイテムを配置することが可能です。
入力の初期値や大きさ、長さなどの詳細な設定も簡単に行えます。

もちろん、Javascriptの知識があればより詳細な挙動を実現することが可能です。
代表例としては、「アクション設定」を利用し、画面初期表示時にデータベース(以下、DB)に接続しデータのCRUD(*2)操作を行うことができます。

#フロー定義
フロー定義はワークフロー作成に必要な情報をまとめた設定です。
いくつかの設定があるのですが、重要な点を挙げると、
- ルート定義
- コンテンツ定義
があります。
他にもメール定義などがありますが、今回はスルーで。。。

また、印影や到達時処理などの細かい設定をすることもでき、
より便利なワークフローにするためには、ここの設定は頑張りたいところです。

##ルート定義
ルート定義は字のごとく、ワークフローを回した際の申請者と各承認者を結ぶルートを設定することを言います。
この設定により、承認者の数を指定したり、承認者の固定/可変の指定をすることができます。

##コンテンツ定義
コンテンツ定義は、画面の種別(申請用・承認用など)と画面の紐づけを行ったり、既存またはオリジナルのユーザープログラムを組み込んだりすることができます。
つまり、作成した申請・承認画面をここで「申請画面として使用する」と設定することで申請画面を表示した際に自分オリジナルの画面を表示されるように出来るわけです。

#まとめ
- intra-martワークフローはITの知識がなくても簡単に作成が可能！
- ルート設定や画面の設定をまとめた、フロー定義の設定をすることでワークフロー完成！
- ITの知識があればさらに幅広いワークフローの作成が可能！

#あとがき
初投稿ということと、別事情もあり画像を載せることができなかったため、
見づらい画面になってしまっていますね。。。
次回より善処します()。
お見苦しい記事だとは思いますが、ご覧いただきありがとうございます。

# 注釈
*1 ・・・UI上で簡単に画面を作成する機能のこと。
https://www.intramart.jp/document/library/forma/public/forma_appli_maker_guide/introduction.html
↑公式のガイドです
*2 ・・・C(reate)R(ead)U(pdate)D(elete)。DBの操作のこと。
Juliaインストール

# Juliaインストール

AIの開発言語を探していたところ、Juliaという言語を知りました。
特徴として、
 ・ Pythonと比較して処理が速い。
 ・ 発展途上。
などがあげられるらしい。
[Julia ウィキペディア](https://ja.wikipedia.org/wiki/Julia_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))


# インストール環境

・CentOS 7.7.1908
・julia 1.4
・参考[url](https://hshindo.github.io/julia-doc-ja-v0.6/manual/getting-started.html#Julia%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B-1)


# インストール手順
1.インストーラのDL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630870/da6a6846-8598-9d41-b558-4a864e0cbdb3.png)
より、対象をDLする。

コマンドラインより、

```
# wget https://julialang-s3.julialang.org/bin/linux/x64/1.4/julia-1.4.2-linux-x86_64.tar.gz
# tar zxvf julia-1.4.2-linux-x86_64.tar.gz 
```

解凍したファイルを移動

```
#  mv julia-1.4.2 /opt
```

PATHを追加

```
# vi .bash_profile

export PATH
export PATH=$PATH:/usr/local/go/bin

　↓

export PATH
export PATH=$PATH:/usr/local/go/bin:/opt/julia-1.4.1/bin/

```

反映・確認

```
# . .bash_profile
# julia --version

julia version 1.4.1
```

# 動作確認

終了はCtrl+d
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630870/c4b26d4b-a3bc-dc1e-af93-e4e4b92efd22.png)

とりあえず本日はここまで。
「text-decoration: underline」で下線を途切れる場合のCSSプロパティ

## 事象
こんな現象になった場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165108/b664301d-2f4e-31fa-7d80-5ead528b0508.png)

## 原因
chrome64から、`()`や`,`にはアンダーラインが重ならない仕様になった

## 対応
CSS以下のプロパティを指定すれば解決

```diff
+  text-decoration-skip-ink: none;
```

## 参考
- [Chrome 64 から下線がおかしい](http://var.blog.jp/archives/74242827.html)
- [Chrome 64 からリンクの下線が途切れる：text-decoration-skip-ink プロパティについて - Corredor](https://neos21.hatenablog.com/entry/2018/03/02/080000)
Image Searchのフィルタを検証してみる

V2から追加された IntAttr、StrAttrの挙動について調べました。

# フィルタを使った絞り込み
フィルタを使い場合は、setFilterにフィルタ条件を設定します。

```
request.setFilter("int_attr=10000 AND str_attr=\"あああ\"");
```

全体のソースは、【検索編】を参照してください。


# IntAttr の検証
int_attr フィールドは、>、>=、<、<=、= の演算子をサポートしています。

```
request.setFilter("int_attr=10000");
```
IntAttrの値が10,000の情報がヒットします。

```
request.setFilter("int_attr<10000");
```
IntAttrの値が10,000未満の情報がヒットします。

```
request.setFilter("int_attr>10000");
```

IntAttrの値が10,000より大きい情報と、**設定されていない（NULL）**のデータがヒットします。
設定されていない値が取れてしまうのは注意が必要ですね。

```
request.setFilter("int_attr>=10000 AND int_attr<=20000");
```
IntAttrの値が10,000以上、20,000以下のデータがヒットします。

```
request.setFilter("int_attr=");
```
エラーが返されます。値は設定する必要があります。

```
request.setFilter("int_attr<0");
```
0件のヒットです。整数しか設定できないので何もヒットしません。

```
request.setFilter("int_attr=30 OR int_attr=100000");
```
IntAttrの値が30か100,000の情報がヒットします。

```
request.setFilter("int_attr="+Integer.MAX_VALUE);
```
IntAttrを設定していない情報がヒット。どうやら、登録時にIntAttrを省略するとIntegerの最大値が設定されるようです。

# StrAttr の検証
str_attr フィールドは、=、!= の演算子をサポートしています。

```
request.setFilter("str_attr=\"家具\"");
```
"家具"に完全一致した情報がヒット。"家具、机"を設定した情報はヒットしなかった。

```
request.setFilter("str_attr!=\"家具：本棚\"");
```
"家具"に完全一致するもの以外と、StrAttrを設定していない情報がヒットする。

```
request.setFilter("str_attr=\"\"");
```
StrAttrの設定がされていない情報のみヒット。

# まとめ
フィルタ条件が設定されていないデータについての挙動は考慮する必要があります。それぞれ上記の内容で取得する事はできるのでフィルタ条件に設定してみてください。
また、複数の条件を"AND"と"OR"を使う事で設定する事ができます。IntAttrとStrAttrも同時にフィルタ可能です。
FirebaseのFlameプランが使えなくなっていた

タイトルのとおり＆今更なのですが、以前月額25ドルで利用できたFirebaseのFlameプランが2020年1月から新規加入できなくなってました。

ググっても日本語の情報があんまり情報が出てこなかったのでQiitaに残しておく。[^1]

[^1]: 海外の質問サイトとかは出てきたけど、「無くなったのなんで」とか「え、使えなくなったんですか？」みたいな質問が多かったので急にサイレント削除された感じかな…。

公式のリソースっぽいのはどうやら英語の[FAQ](https://firebase.google.com/support/faq/?authuser=0#flame-plan-legacy-label)のみっぽいです。しかも**日本語のFAQだとこの質問は掲載されていない[^2]という罠**。ざっと翻訳すると以下のようになります。

[^2]: 2020/05/26現在。

> Q. Flameプランに何が起こったのですか？
> A. 2020年1月の時点で、Flameプラン（25ドル/月）は、新規利用できなくなりました。
> ・既存のSparkおよびBlazeプランのプロジェクト及び新しいプロジェクトは、Flameプランを利用できなくなります。
> ・既存のFlameプランプロジェクトを別の課金プランに切り替えると、Flameプランに戻すことができません。
> ・既存のFlameプランプロジェクトは、今のところ引き続きFlameプランを使用できます。ただし、今後数か月以内に、別の課金プランに移行するために必要な情報が届きます。

> (中略)

> Q. Flameプランが廃止されるのはなぜですか？
> A. 長年にわたって、Flameプランの使用が減少していることを目にしてきました。このプランを使用するほとんどのプロジェクトは、その完全な価値を消費していません。この料金プランを維持することは一般に費用効果が高くありません。また、リソースが他のFirebaseイニシアチブに費やされれば、すべての人により良いサービスを提供できると考えています。

あと、公式のリソースではないのですが[こちらの質問サイトの回答](https://www.reddit.com/r/Firebase/comments/ept3f8/why_did_firebase_get_rid_of_the_flame_plan/
)が納得感あります。

まとめると

- 使ってる人が少ない
- 使っている人の殆どがコスト的に無駄遣いになっていてで、実際はBlazeプランにした方が安く上がる
- サービス運営としても需要が少ない課金体系を維持するのはコスパが良くないので、廃止したほうがお互いに良くなる

確かに、自プロジェクトでBlazeプランにした場合の料金試算を出した結果、Flameプランより全然安い価格になったことがありました。内容については納得なんですけど、定額だからこそ社内申請通しやすかったり、莫大な請求リスクを回避できたりできたんですが…という残念感はありますね。
【Swift】フローティングアクションボタンの作り方

フローティングアクションボタンの作り方。

####実装イメージ
TableViewCellの上に浮いてるデザインで、スライドしても固定されるように実装します。
<img width="412" alt="スクリーンショット 2020-05-26 15.49.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/20e351a7-bea8-0d92-f690-38e5fe5c5c13.png">

####Storyboard
まずbuttonのみを置いてAutoLayoutをつけます。
<img width="1792" alt="スクリーンショット 2020-05-26 15.54.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/e3cd627f-f2e0-b895-a133-475385330c6b.png">
<img width="378" alt="スクリーンショット 2020-05-26 15.32.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/0769bd00-743f-7aaf-c8ba-bb5a74fb05d8.png">
その上にTableView,TableViewCellを画面一杯に配置します。TableViewCellのIdentifierはCellに設定しましょう。
<img width="264" alt="スクリーンショット 2020-05-26 16.11.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592713/cfa40a20-5108-2baa-6a1e-6daff48b1eb8.png">

####ソースコード

```Swift:ViewController.Swift
import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var button: UIButton!
    
//    TableView
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        return cell
    }
    
//    FAB
    var startingFrame : CGRect!
    var endingFrame : CGRect!

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) && self.button.isHidden {
         self.button.isHidden = false
         self.button.frame = startingFrame 
         UIView.animate(withDuration: 1.0) {
          self.button.frame = self.endingFrame
         }
        }
    }
    func configureSizes() {
        let screenSize = UIScreen.main.bounds
        let screenWidth = screenSize.width
        let screenHeight = screenSize.height

        startingFrame = CGRect(x: 0, y: screenHeight+100, width: screenWidth, height: 100)
        endingFrame = CGRect(x: 0, y: screenHeight-100, width: screenWidth, height: 100)

    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

//        buttonを角丸にする
        button.layer.cornerRadius = 32
    }


}
```
flutterでimport 'package:http/http.dart' as http; をするのに必要な設定

# やりたいこと

main.dart 
にて

```dart
import 'package:http/http.dart' as http;
```

記載時、


```dart
Target of URI doesn't exist: 'package:http/http.dart'.
Try creating the file referenced by the URI, or Try using a URI for a file that does exist.darturi_does_not_exist
Peek Problem (Alt+F8)
No quick fixes available
```
になった場合の対処。

# 対処法

* pubspec.yaml を開く。

* dependencies: の記述を確認する。

* 下記のように追記する。

```dart
dependencies:
  http: ^0.12.0
```

下記コマンドを実行する

```dart
flutter packages get
```

すると

```dart
Target of URI doesn't exist: 'package:http/http.dart'.
Try creating the file referenced by the URI, or Try using a URI for a file that does exist.darturi_does_not_exist
Peek Problem (Alt+F8)
No quick fixes available
```

が消える。


関連リンク
https://flutter.dev/docs/cookbook/networking/fetch-data
IQ Botインストール手順（７） IQ Botインストール後の諸設定

この記事は、以下の記事のサブカテゴリです。

[IQ Bot インストール手順](https://qiita.com/IQ_Bocchi/items/529dc72b6ab3d26dbfe0)　

前のステップ：
[（６）IQ Botのインストール](https://qiita.com/IQ_Bocchi/items/fef152c38a5d18cac896)

#（７） IQ Botインストール後の諸設定

## ①ABBYYの有効化 【必須】

日本語の帳票を扱うには、ABBYYの使用がほぼマストです（詳細は[こちら](https://qiita.com/IQ_Bocchi/items/8ad6ec8f5a6afd3c98a1#%E5%AE%9F%E8%B3%AA%E7%9A%84%E3%81%AB%E3%81%AFabbyy%E4%B8%80%E6%8A%9E)参照）。

手順は以下のページにあります。

[【リンク】IQ Bot：ABBYYのOCRを有効化する](https://qiita.com/IQ_Bocchi/items/e8e9ae41b398209186ed)

## ②Tegakiの有効化 【Tegakiを利用する場合は必須】

Tegakiを利用する場合は、IQ Bot以外にTegakiを利用するための申し込みやサーバーの調達が必要です。
そのあたりは別途、Automation Anywhere や Cogent Labs から案内されるはずですが、セットアップ済みのTegakiサーバーが届いてからIQ Botとつなげるまでの手順を以下で説明しています。

[【リンク】IQ Bot：Tegaki利用時のセットアップ手順](https://qiita.com/IQ_Bocchi/items/a5b6df8fa2ad8a1da881)

## ③必須ではないが、やっておくと便利な設定

以下の記事を参考に、よく使うフォルダのショートカットやセッティングファイルのパラメータ変更をしておくと便利です。

[リンク：オンプレでIQ Botを入れたとき、やっておくと便利な設定](https://qiita.com/IQ_Bocchi/items/8b8ec0963e3bed70f8b7)

##④ Bot Insight を落とす

IQ Botの検証用にIQ BotとCRを１台のマシンに同居させている場合は、パフォーマンスの観点からBot Insight を落としておくのがオススメです。
やりかたは以下のリンクにあります。

[【リンク】Bot Insight関連のサービスをまるっと落とす方法](https://qiita.com/IQ_Bocchi/items/cbea5d88ee2c7e06124d#bot-insight%E9%96%A2%E9%80%A3%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E3%81%BE%E3%82%8B%E3%81%A3%E3%81%A8%E8%90%BD%E3%81%A8%E3%81%99%E6%96%B9%E6%B3%95)


===

<details><summary>※ このセクションは、古いバージョンでは必要だったが最新版では必要なくなった手順のバックアップです。</summary><div>

## ABBYYの有効化に関する補足

V11の古いバージョンでは、[こちら](https://qiita.com/IQ_Bocchi/items/11c7a7640d6d0cc1054f)の手順にしたがってOCRをABBYYに切り替える必要がありましたが、細心のバージョンではインスタンス作成時にOCRを選べるようになっています。ただし、選択肢のデフォルトをABBYYにしておきたい場合はこの手順を実施します。

##カスタムロジックの有効化

この手順は、V11系統のV11.3.4以降のバージョンでは不要です。
2020.5.26現在発売されているA2019系統（～A2019.12）で必要になる手順です。

この手順によって、[カスタムロジック](https://qiita.com/IQ_Bocchi/items/1d8e7c77ad47e838476c)が使用可能になります。

以下の内容をメモ帳などにコピーして、「features.json」というファイル名で`C:\Program Files (x86)\Automation Anywhere IQ Bot \Configurations` 配下に保存します。

```json:features.json
{
"collapsableFields": false,
"communityEditionLogo": false,
"deleteValidatorMapping": false,
"designer:betterDocumentNavigation": false,
"disableMultiPage": false,
"disableUploadOnEdit": false,
"hideProduction": false,
"hideValidator": false,
"i18n:arabic": false,
"improvedValidatorMapping": false,
"limitDomains": false,
"limitNavigation": false,
"fieldLogic": true,
"tableLogic": true,
"logicEditor:fullscreen": true,
"showSampleDownload": false,
"showTitlebarHelp": false,
"showTrainingHelp": false,
"trialMode": false
}
```


</div></details>

===

#完了！！！！！

以上でIQ Botのインストールおよび初期設定は完了です。

お疲れさまでした！

……と言いたいところですが、インストールをしたからには稼働確認がマストですよね。
効率的な手順がわからない方は、以下を参考にしてみてください。

[【リンク】稼働確認のしかた（参考）](https://qiita.com/IQ_Bocchi/items/112e4e6bebb325566e05)

#設定も稼働確認も完了したら、次は……？

以下の記事を参考に、次のステップに進んでみてください。
[【リンク】はじめての IQ Bot：IQ Botを作ってみよう！](https://qiita.com/IQ_Bocchi/items/26c4a7065e4c8e64a427)
【AWS SAA】 曖昧な箇所をまとめてみた①

#背景

ポートフォリオにAWSの主要機能を盛り込みたい動機から、`各機能についての網羅的な学習`が必要であると考え、AWS SAAの学習をはじめました。

AWS SAA対策教材、学習手順については、下記の記事を非常に参考にしました。

- [AWS認定11冠制覇したのでオススメの勉強法などをまとめてみる](https://qiita.com/nakazax/items/20458e146d3d9f2aa615)、
- [AWS認定Associate3冠取得達成したので自分はどう勉強したのかを放流する](https://qiita.com/hedgehog051/items/22d13a9d0f9b487a19f6)

`最も本試験の難易度に近い`と言われているのが、<br>[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)であり、<br>この記事では、自分が解いていてつまづいた箇所をピックアップしました。





#◆ スケールイン/スケールアウト

|用語 |意味 |
|:-----|:--------|
|スケールイン|サーバ台数を**減らして**パフォーマンスを**低下させる**こと|
|スケールアウト|サーバ台数を**増やして**パフォーマンスを**向上させる**こと|


#◆ スケールアップ/スケールダウン

|用語 |意味 |
|:-----|:--------|
|スケールアップ|**上位スペック**への変換(メモリ/HDD)|
|スケールダウン|**下位スペック**への変換(メモリ/HDD)|


#◆ Amazon API Gateway/AWS Storage Gateway

|用語 |意味 |
|:-----|:--------|
|Amazon API Gateway|**Lambda**、**EC2**でAPIとして公開する際に使用する|
|AWS Storage Gateway|**オンプレミス環境**とクラウド環境を接続する際に使用する|



#◆ HVM/HSM

|用語 |意味 |
|:-----|:--------|
|HVM|インスタンスの仮想化方式。 ※**ParaVirtual**とセットで出てくる|
|HSM|暗号鍵や電子署名の管理を行う。　※**Certificate Manager**はSSL証明書管理|

#◆ SQS/SWF

|用語 |意味 |
|:-----|:--------|
|SQS|FIFOキュー(**1度きりの送信**/**順不同**)|
|SWF|処理を複数サーバに分散可能|

#◆ ゲートウェイエンドポイント/インターフェースエンドポイント

|用語 |意味 |
|:-----|:--------|
|ゲートウェイエンドポイント|**S3**・**DynamoDB**で**VPCピアリング接続**する際に使用|
|インターフェースエンドポイント|**Privatelink**を使用|

#◆ AWS config/EC2 config

|用語 |意味 |
|:-----|:--------|
|AWS config|リソースの**評価**/**監査**を行うサービス|
|EC2 config|**Windows**インスタンスの設定に使用|


#◆ SSE-S3/SSE-KMS/SSE-C

|用語 |意味 |
|:--------|:-------|
|SSE-S3|**AES-256**を利用した暗号化方式<br>S3がマスターキー/データキーを管理|
|SSE-KMS|**KMS**(Key Management Service)で**CMK**(カスタマーマスターキー)を管理する|
|SSE-C|**ユーザー側**でマスターキー、データキーを両方管理|


#◆ one-time/persistent

|用語 |意味 |
|:--------|:-------|
|one-time|**スポットインスタンス**起動で、リクエスト**失効**する|
|persistent|任意でキャンセルするまで、リクエスト**維持**する|


#◆ バケットポリシー/IAMポリシー

|用語 |意味 |
|:--------|:-------|
|バケットポリシー|バケット/オブジェクト単位のアクセス権をJSONで定義する|
|IAMポリシー|※バケットポリシー/IAMポリシーが同じアカウントの場合：**どちらかの許可**でOK<br>※バケットポリシー/IAMポリシーが異なるアカウントの場合：**両方の許可**が必要
db:migrate:status で　no file が消せない時の必殺技

###現状　

```
up     20200501121802  Sorcery core
   up     20200502092041  Add role to users
   up     20200503121531  Create boards
   up     20200510160306  Create comments
   up     20200524092414  ********** NO FILE **********
```

no FILEになった経緯。
rails g hoge modelでモデルを作り、そのあとmigrateをして、スキーマに記載された。
その後、rails d hoge modelで削除。
結果、あれこれ残ってるんだけど・・・って状態。

###いくつかの対策案⓵

```
$ rails db:migrate:status
```
で出てきたNO FILE の数字の部分( 今回なら'20200524092414')
#####↓
`touch db/migrate/20200524092414＿hoge.rb
`
参考 https://qiita.com/sakatan_1/items/9bf321f81d3b84042694
で、名前付きの偽名ファイルができて,
rollbackなり、削除なりできるらしいがなぜかできない・・・

ということで`rails db:reset`もしくは`rails db:migration:reset`で無理やり解決しました。
ただ、このやり方はDBのデータも全部おじゃんになるので、実装後に備えてちゃんと知識を調べて問題解決しないといけないですね・・・

###追記

```
class AddRoleToUsers < ActiveRecord::Migration[5.2]
end
```
作成ファイルのここの部分が空白だったことがどうやら原因でした。解決
PostgreSQLで文字列の中の発音記号を取り除くには、CREATE EXTENSION unaccent

調べた時間の割にあまりにも簡単に実現できてしまったので、記事にしました。

#PostgreSQLで発音記号を取り除く方法(関数)の導入方法

```sql
CREATE EXTENSION unaccent;
```
上記SQLを実行したデータベースで必要な箇所で **unaccent()** の関数を呼ぶだけです。

####サンプルSQL
```sql

SELECT unaccent('Hôtel');
```
####実行結果
```sql

Hotel
```

#参考資料
[stack Overflow](https://stackoverflow.com/questions/13596638/function-to-remove-accents-in-postgresql)
[海外サイト](https://www.dbrnd.com/2019/05/postgresql-how-to-remove-accents-diacritic-signs-from-lexemes/)

#検索経過
ドイツ語などにあるアルファベットに発音記号の付いた文字 **Ä,Ö,Ü** （ドイツ語では「ウムラウト」と言うみたいです）の表記に揺れがあり、検索が上手くヒットできず困っていました。

比較的メジャーな課題な気がしたので、気軽な気分で検索しましたが、結果は出ず。
日本語でもありそうな気がしましたが、探し方が悪いのか見つけることが出来ませんでした。

PHPで言うところの**mb_convert**系のような処理体系がある気が勝手にしてて方向を見失っていました。関数名を見ると**アクセント**をキーワードに検索するのが正解だったようです。
HaskellのMonadを理解半ばで使う

#HaskellのMonadをあまり理解もしてないけど、使ってみました

Monadはまだよく分かりませんが、使ってみないことには分からないままなので、簡単なプログラムを走らせてみました。
ただ、コンパイルすると、ワーニングが出てしまいます。

```
warning: [-Wmissing-methods]
    ? No explicit implementation for
        either ‘<*>’ or ‘GHC.Base.liftA2’
    ? In the instance declaration for ‘Applicative Clock’
  |
6 | instance Applicative Clock where
```

##プログラム

```haskell:monad.hs
data Clock a = Hour a | Minute a | Second a | Over

instance Functor Clock where
    fmap _ _ = Over

instance Applicative Clock where
    pure _ = Over

instance Monad Clock where
    Over >>= f = Over
    Hour a >>= f = f a
    Minute a >>= f = f a
    Second a >>= f = f a
    return a = Hour a

h :: Int -> Clock Int
h x = let i = x + 1
      in
       if i > 24
           then Over
           else Hour i

clockToString :: Clock Int -> (String , Int)
clockToString x =
    case x of
        Hour a -> ("Hour" , a)
        Minute a -> ("Minute" , a)
        Second a -> ("Second" , a)
        Over -> ("Over" , 0)

main::IO()
main = do
    let b = return 10 >>= h >>= h

    let c = clockToString b
    print c
```

実行結果

```
("Hour",12)
```

##解説

```haskell
data Clock a = Hour a | Minute a | Second a | Over
```

型`Clock`は、時分秒と、あり得ない数（例えば85秒など）`Over`をデータコンストラクタとして持っています。

```haskell
instance Functor Clock where
    fmap _ _ = Over

instance Applicative Clock where
    pure _ = Over

instance Monad Clock where
    Over >>= f = Over
    Hour a >>= f = f a
    Minute a >>= f = f a
    Second a >>= f = f a
    return a = Hour a
```

`Clock`のインスタンスです。`Monad`をインスタンスにする場合`Functor`と`Applicative`をインスタンスにしないといけないみたいです？

```haskell
h :: Int -> Clock Int
h x = let i = x + 1
      in
       if i > 24
           then Over
           else Hour i
```

関数`h`は、24を超えたら`Over`を、そうでなければ、引数の数を+1して`Hour`に付けて返します。

```haskell
let b = return 10 >>= h >>= h
```

`>>=`演算子で、10に1づつ足して、`clockToString`関数で`Clock`型を`(String , Int)`にして、最後に結果を表示します。
ARC 081 E Don't Be a Subsequence

##問題
https://atcoder.jp/contests/arc081/tasks/arc081_c
##見た感じ
全然わからなくて、まず部分文字列の解説をみてすこし糸口がつかめた感じだった。
まず、$nxt[i][c]=i文字目以降で文字cが出てくる最小のindex$としすると、いろいろと便利で、例えばi文字目以降で文字cがあるかどうかから、あるなら何文字先にあるかとかまでが分かる上、文字の種類全体に対してdpしたいときにもi文字目を使ってi文字目までに作れる部分文字列全体の集合をdp[i]としておくと、ここに文字cを右につけてできる部分文字列の個数はdp[nxt[i][c]]に足されるべきとかいろいろ考えやすくなる。
今回は部分文字列に現れない辞書順最小の文字列を求めたいので、これまでの文字列にa~zまで全部出てきたら求める文字列の長さは最低2で、a~zまで出てきた後にまたa~zまで出てきたら、最低３になるというように、a~z全体が何回出てきたか、つまり与えられた文字列をa~zを含む区間でぶつ切りにしていったときに、何個に分けられるかを計算したい。
だから、以下のような漸化式を計算した。

```math
s:与えられた文字列
dp[i]=i文字目以降の部分文字列に含まれない文字列の最短の長さ\\
dp[i]=\min_{c}dp[nxt[i][c]+1]+1\\
dp[|s|]=1,dp[|s|+1]=0
```
##解法
まず、上の漸化式からdptableを埋める。
次に、目的の文字列を作るために以下の問題を考える。

---
与えられた文字列のi文字目以降の文字列s[i]を与えれた文字列とする問題の解となる文字列の長さが与えられたときその文字列の最初の文字は何か??

---
この答えは上の漸化式からわかる。というのも上の漸化式による$dp[i]$の値を決定するのは$dp[nxt[i][c]+1]+1$が最小となるcであるからだ。つまり、dptableはこのような文字列長が最小になるcを選んでいくことで更新されていっている。
よって、上の問題の答えは、解が辞書順最小であることも考えると

```math
\min_{c}(\{c\in \{1,2,\dots ,26\}|dp[nxt[i][c]+1]+1==dp[i]\})
```
である。よって、i=0の時の最初の文字をans[0]として、そこからi=dp[nxt[i][ans[0]]]+1としたときの最初の文字をansにつけ足していけば、辞書順最小の文字列がふくげんできる
##ソースコード
```c++
const int N_MAX=200010;
string s;
int dp[N_MAX];
int nxt[N_MAX][26];

void solve(){
    int n=s.size();
    rep(i,n+1){
        rep(j,26){
            nxt[i][j]=n;
        }
    }
    for(int i = n-1;i>=0;i--){
        rep(j,26)nxt[i][j]=nxt[i+1][j];
        nxt[i][s[i]-'a']=i;
    }
    dp[n+1]=0;
    dp[n]=1;
    for(int i = n-1;i>=0;i--){
        int res=INF10;
        rep(j,26){
            minin(res,dp[nxt[i][j]+1]+1);\\minな方をresにin
        }
        dp[i]=res;
    }
}

int main(){
    int x,y;
    //入力
    cin>>s;
    //処理
    solve();
    long color,now=0,res=dp[now];
    char ans[res+1];
    rep(j,res){
        rep(i,26){
            if(dp[nxt[now][i]+1]+1==res-j){
                color=i;
                break;
            } 
        }
        ans[j]=color+'a';
        now=nxt[now][color]+1;
    }
    ans[res]='\0';
    //出力
    cout << ans <<endl;
}
```
##振り返り
nxt[i][c]の置き方は一列に並んだ有限個のシンボルについての問題でもそのまま有効に使えて便利そう。
IQ Bot：ABBYYのOCRを有効化する

IQ BotでABBYYのOCRを使用可能にするためには、インストール後に以下の設定を行う必要があります。

# IQ BotでABBYYを使用するための設定

OCR Pluginsという圧縮ファイルをベンダーの公式ダウンロードサイトからダウンロードし、解凍して`C:\Program Files (x86)\Automation Anywhere IQ Bot`配下に置きます。

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/8559940d-6697-71c9-67b4-fe65eda94ebd.jpeg)

## 注意点

- フォルダ名が「OCR Plugins」になっていること（バージョンの名前とか、余計なものがついていないこと）
- OCR Plugins配下に直接「ABBYY SDK」フォルダが入っていること（下図参照）

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/85a57668-4d21-8949-f74a-d892746d9086.jpeg)

ファイルの解凍のしかたによっては「OCR Plugins」フォルダが二重になっていてうまく動かない場合があるので注意です！
IQ Bot：OCRエンジンの切り替え

IQ Botでは、使用するOCRエンジンをインスタンスごとに切り替えることが可能です。

OCRエンジンの切替方法はバージョンによって異なります。
この記事では、それぞれのバージョンにあわせたエンジンの切替方法を説明します。

##A2019およびV11.3.5以降の場合

画面から切替が可能です。
詳細は以下のリンクで説明しています。

[【リンク】「はじめての IQ Bot：IQ Botを作ってみよう！」より、OCRエンジンの選択](https://qiita.com/IQ_Bocchi/items/26c4a7065e4c8e64a427#newocr%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%AE%E9%81%B8%E6%8A%9Ea2019%E4%BB%A5%E9%99%8D%E3%81%8A%E3%82%88%E3%81%B3v1135%E4%BB%A5%E9%99%8D%E3%81%AE%E5%A0%B4%E5%90%88)

##V11.3.4以前の場合

V11.3.4以前の場合、OCRの切替のためにIQ Botサーバ―上の設定ファイルを修正する必要があります。

###1) Settingsファイルの修正

`C:\Program Files (x86)\Automation Anywhere IQ Bot \Configurations`配下の「Settings.txt」をメモ帳等で開きます。
![04_Settings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/66a70f20-2c2c-df64-b253-02f2e70cf606.jpeg)

下記の赤枠のパラメーターを、下表の要領で変更して保存します。
![04_Settings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/29fc48f7-bc79-b917-e93f-b66576423ddc.jpeg)

|OCR|パラメータ設定内容|
|:-----------------|:------------------|
|Tessaract4|OCREngine=**Tessaract4**<br>PDFBoxOCREnabled=true|
|ABBYY|OCREngine=**ABBYY**<br>PDFBoxOCREnabled=true|
|Microsoft Computer Vision|OCREngine=**MicrosoftAzureAPI**<br>PDFBoxOCREnabled=true|
|Google Vision|OCREngine=**GoogleVisionAPI**<br>PDFBoxOCREnabled=**false**|

どのOCRを選ぶべきかを判断するコツは[こちら](https://qiita.com/IQ_Bocchi/items/8ad6ec8f5a6afd3c98a1)参照。

###2) 変更の反映

上記のセッティングファイルの変更を反映するために、`C:\Program Files (x86)\Automation Anywhere IQ Bot \Configurations`配下の①stopanduninstallallservices.bat　→　②installandstartallservices.batを順に実行します。
（右クリック→管理者として実行）

![05_Restart.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/0939496b-833c-a47c-2151-fb9435f4b360.jpeg)

以上で、OCRの変更が反映されます。
IQ Bot：選択可能なOCRとそれぞれの特徴

IQ Botは様々なOCRエンジンをインスタンスごとに切り替えて使用することができます。

OCRエンジンの切替方法は以下の記事で案内していますが、それぞれのOCRにはどのような特徴があるのでしょうか？
[【リンク】IQ Bot：OCRエンジンの切り替え](https://qiita.com/IQ_Bocchi/items/11c7a7640d6d0cc1054f)

ということで、各OCRの特徴を一覧にしてみましたので、選定時の参考にしてみてください。

#IQ Botで使えるOCRの選択肢（2021年1月27日現在）

記事公開日時点で使用できるIQ BotのOCRには、以下の選択肢があります。

|OCRエンジン|特徴|
|:-----------------|:------------------|:------------------|
|Tessaract4|完全オンプレに対応・クラウド版でも使用可能<br>日本語の精度は低い（英数字用）<br>手書きは未対応|
|**ABBYY** (オススメ)|完全オンプレに対応・クラウド版でも使用可能<br>日本語の活字に対応<br>手書きには未対応|
|Microsoft Computer Vision|オンプレ・クラウド版ともに使用可能だが、オンプレ版で使用する際もインターネット接続が必須<br>英数字の手書きに対応<br>日本語の精度は低い<br>単独の文字の抽出に弱い|
|**Google Vision** (オススメ)|オンプレ・クラウド版ともに使用可能だが、オンプレ版で使用する際もインターネット接続が必須<br>日本語の活字・手書きに対応<br>手書きの精度はTegakiには劣るが、インフラを軽くしたい人にはオススメ<br>文脈を認識し確度の高い結果を抽出[^1]<br>~~単独の文字の抽出に弱い~~ ← 最近かなり改善された(しかし完璧ではない)|
|**Tegaki** (超オススメ)|オンプレ必須<br>※CR,IQ Bot,Tegakiともにオンプレで構える必要あり（IaasはOK）<br>手書きの他、低画質の帳票の活字もかなり読める<br>単独の文字の検出は完璧ではない（Google Visionよりはかなりましだが完璧ではない）<br>|

[^1]: 例えば「ABC株式会社」と帳票に書いてあった場合に、「株式会社」の「株」の文字がつぶれて印刷されていたとしても、「式会社」の前に来る文字は「株」しかないだろう、というような感じで文脈から正解を推測してくれます。したがって、Googleは単体の文字を認識させたときと、ある程度の長さのある言葉や文の中で文字を認識させたときとで精度が変わります（後者の方が高い）。また、文字単体としてはまったく形の同じ画像を文脈上のどこに置くかによって読み取り結果が変わるという挙動も見られます。たとえば、縦の線を「● am Japanese」の●の位置に置くとI（大文字のアイ）、●2345の●の位置に置くと「1」（数字のイチ）、「●ove」の●の位置に置くとl(小文字のエル)、と読むなどです。


※ バージョンによって利用できないOCRもあります。

#2020年前半頃までは「実質ABBYY一択」だったが、Google Visionの精度が徐々に向上

この記事を最初に執筆したのは2020年5月末頃だったのですが、その当時はこんなこと↓を書いていました。

<details><summary>こんなこと</summary><div>

上記のとおり、さまざまなOCRの選択肢がありますが、筆者がこれまで約１年間IQ Bot案件に携わってきた経験上、**実質的にはABBYY一択**と言っていいと思います。

上記の表に挙げた特徴と対応しているバージョンを合わせ、OCR選定のフローを図に示したのが以下です。

![OCR意思決定フロー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/7e3d63b5-6725-f04f-ddb1-88bcc9e99f7f.jpeg)

オンプレ対応が可能である点、対応しているバージョンの幅が広い点、単独の文字も含めバランスよく識字が可能である点などから、これまで筆者が実施してきたIQ Bot案件ではOCRはほぼABBYY一択の状態でした。

ABBYYは低画質の帳票（200dpi以下）になると精度が著しく下がるので、**帳票の画質を上げる対策とセット**で利用した方がいいです。

日本語の手書きを正式サポートしている新しいエンジンが入ってくれば状況は変わると思いますので、その際はまた記事を更新します。

</div></details>

ところが、最近になってGoogle側の「単独の文字をミスる問題」がかなり改善され、IQ Botで読み取る際に重要になる位置の識別なども安定してきたことから、今(2020年7月末現在)となっては**インターネット利用さえOKなら、Googleはかなりオススメ**といえるクオリティになってきました。

一概にGoogleがABBYYより優れていると言えるわけではなく、帳票による向き不向きもあります。
ABBYYだと処理できない帳票がGoogleだと処理できたり、逆もまたしかりです。

インターネット利用が可能な場合は、両方を比べてみて結果の良かった方を採用すると良いと思います。
（インターネット不可の場合は、依然としてABBYY一択）

ABBYYとGoogleそれぞれで処理をかけて結果を突合し、不一致があった場合のみ人間が検証、といったフローの構築も現実味を帯びてきました。

Googleはクラウドサービスであるため、IQ Botのバージョンに関わらず、Google側のアップデートは常に反映されます。

#2021年2月、待望のTegakiがリリース！

2021年2月からは、IQ BotのOCRの選択肢としてTegakiが使えるようになります。

テスト版はすでにリリースされていますが、精度が高くて非常にオススメです。
※「精度が高い」という言い方は本当はあまりしたくないです。詳細は[こちら](https://qiita.com/IQ_Bocchi/items/51f9dd965235fde34701)参照。

ただし、クラウド推しのAutomation Anywhereにしては少し意外な「オンプレ限定」の制約があるため、精度のためにインフラに投資できるかという部分がTegaki利用可否の鍵になると思います。

Tegakiと接続するためにはSettingファイルをいじる必要があるため、CR／IQ Botもオンプレで構える必要があります。

今後、Tegakiもクラウドで利用できるようになればよいのですが、まだ明確なロードマップはないようです。
文章力向上のためにブログを始めます

# １．はじめに
最近、文章を書くのが下手すぎる（うまく表現できない、時間がかかりすぎる）ことを痛感したので、
少しでもレベルアップしたくて、ブログを書き始めました。

為になったことや資格勉強内容、ただの日記など、初めは気張らず継続重視で書いていきます。

# ２．自己紹介
文系出身の5年目SEです。

4月から部署が変わりAWSに関わり始めました。

これまではネットワークにつながらない部屋でCOBOLの保守開発をしていたので、
やることが大きく変わり、勉強の毎日です。

1ヶ月半勉強してAWS SAAを取得したので
次はAWS SOAの勉強を始めようかなと思ってます。


## 今まで使ったことある言語
- COBOL


## 保有資格
基本情報技術者、Oracle Master Bronze、AWS プラクティショナー、AWS SAA


## 趣味
旅行（電車）、オンラインゲーム（FPS)、競馬


## 最近気になってること
- AWS（特にCloud Formation）
- 競馬予想システム

# ３．おわりに
今後は資料作成が増えてくるみたいなので、少しでも文章が書けるように
がんばってブログ続けます。


目標：週1ペースで記事投稿
【MS ACCESS】帳票フォームにセットしたrecordsourceのカレントレコードの値を取得



メモとして残します。



#■やり方

```VBA

Me.Controls("colname")
```


#■さいごに
`recordset.Fields("fieldname")`だとうまくいかないケースが稀によくあるから、上記のやり方が良さそう。


毎度、ACCESSは些細なことで時間がとられる。。。
知見も少ないし、WEBアプリで使う言語と違って直観的じゃないし一苦労(; ･`д･´)