OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu LinuxでYOLOのデモ

YOLO
===
YOLOの説明は、説明できるほど中身を理解していないため省略します。
【参考】[WindowsでYOLOのデモ](https://qiita.com/n-yamanaka/items/b5c45a961560340b3004)


ビルド環境構築
===

1. Ubuntu Linux 20.04 に CUDA Toolkit をインストールする
  【参考】[NVIDIA CUDA toolkit on Ubuntu20.04](https://qiita.com/n-yamanaka/items/8301c5085bb4b972f274)

2. cmake、opencvライブラリをインストールする

    ```bash
    $ sudo apt-get install cmake libopencv-dev
    ```


YOLO（darknet）のビルド
===

1. ソースコードの入手

    ```bash
    $ git clone https://github.com/pjreddie/darknet.git
    ```

2. ソースコードのビルド

    ```bash
    $ cd darknet/
    $ ./build.sh
    ```


YOLOのweightのダウンロード
===

darknet.exe を使用するためには YOLO の weights を入手する必要があります。

- [yolov3.weights](https://pjreddie.com/media/files/yolov3.weights) (237 MB)
- [yolov3-tiny.weights](https://pjreddie.com/media/files/yolov3-tiny.weights) (33.7 MB)

- [yolov4.weights](https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights) (245 MB)
- [yolov4-tiny.weights](https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights) (23.1 MB)


Darknetで物体検出
===

## 画像ファイルに映る物体の検出

darknet のソースの中にサンプルの写真が何枚か入っていますので、それを利用して動作確認ができます。

- YOLO v3の場合

    ```bash
    $ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
    ```

    ![darknet_yolov3_dog.jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/f68703a2-7bb5-39c3-0258-e52c4a11fd21.png)


- YOLO v4の場合

    ```bash
    $ ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg
    ```

    ![darknet_yolov4_dog.jpg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/0912708f-9a4c-5b5b-8e95-5933c30b45b3.png)


## カメラに映る映像のリアルタイム物体検出

[WindowsでYOLOのデモ](https://qiita.com/n-yamanaka/items/b5c45a961560340b3004#%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AB%E6%98%A0%E3%82%8B%E6%98%A0%E5%83%8F%E3%81%AE%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA) と同様、GeForce 1050で 約7フレーム/秒 くらいでした。
OSの違いによる性能差は、知覚できるほど顕著には現れないようです。

  ```bash
  $ ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights
  ```


## MP4動画映像のリアルタイム物体検出

  ```bash
  $ ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.5 data/test.mp4 -dont_show 1 -out_filename result/test_out.mp4
  ```


その他
===
偏見かもしれませんが、機械学習関連のフレームワークを動かそうとすると Windows より Linux（特に Ubuntu ）の方が、設定、動作環境構築が楽な気がします。
Google ColaboratoryをベースにRstudio serverを立ち上げる。

R Advent Calendar 2020 3日目の記事になります。


[Google Colaboratory](https://colab.research.google.com/)は無償で使用可能なクラウドのNotebook環境ですが、Pythonでの使用が主です。  
RユーザーとしてはRstudioを使いたいのですが、無償のクラウド環境としては選択肢として[Rstudio cloud](https://rstudio.cloud/)くらいしか見当たりません。   
[localtunnel](https://github.com/localtunnel/localtunnel)を使うと、ローカルサーバーを外部公開できるということで、これを使ってColab上にRstudio serverを立てれば、R分析環境が確立できるのでは？と思って作ってみました。

https://colab.research.google.com/github/naru-T/RstudioServer_on_Colab/blob/master/Rstudio_server.ipynb

👆のnotebookを立ち上げ、一個ずつセルを実行していきます。流れとしては以下のとおりです。
1. rstudioユーザーの追加とパスワードの設定
2. 関連ツールのインストール。分析内容により追加、削除してください。自分は地理情報の分析をするので関連のツールを加えています。
3.localtunnelによるRstudio serverの外部公開URLの発行  
  
https://XXXXXXXXXXX.loca.it
のようなURLが発行されるので、それに`/auth-sign`を末尾につけます。
https://XXXXXXXXXXX.loca.it/auth-sign

![Screen Shot 2020-12-01 at 17.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224794/b9115c45-f6d4-7478-419c-fdc91a19f3f2.png)

このURLにいくとRstudio serverが立ち上がっているのがわかります。１で作成したrstudioユーザーと設定したパスワードを入力するとRstudioにアクセスできます。

クリーンな環境なのでパッケージなどはマニュアルで設定する必要があります。
なお、[rstudioユーザーはroot権限がない](https://support.rstudio.com/hc/en-us/articles/200552306-Getting-Started)ため、google driveに直接アクセスできません。が、googledriveパッケージをインストールすることでIOが可能となります。gitも使えるのでgithubやgitlabからデータの入出力を実施することももちろん可能です。
PKCEにおけるcode_challenge生成について

# 概要

OAuth2.0の文脈にて、パブリッククライアントが構成要素に含まれる場合にはよくお世話になるPKCE(Proof Key for Code Exchange)のcode_challengeの生成について記述します。

また、ここでは`code_challenge_method`が`S256`の時のことのみを考えます。

**OAuth2.0の話や、PKCEの効用などは述べません。**

## code_challenge生成方法

[RFC7636](https://tools.ietf.org/html/rfc7636)によると、code_challengeの生成方法は以下のように定義されています。

```
      code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
```

RFCにて、`code_challenge_method`が`S256`の時の具体例として、
`code_verifier`が`dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk`のときには、
`code_challenge`は`E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM`になる
とあるので、この例について説明していきます。

### code_verifierをSHA256でハッシュ値にする

前提として`code_verifier`は`アルファベット`、`数字`、`-`、`.`、`_`、`~`からなり、43~128文字から成ります。

```
   ABNF for "code_verifier" is as follows.

   code-verifier = 43*128unreserved
   unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
   ALPHA = %x41-5A / %x61-7A
   DIGIT = %x30-39
```
`code_verifier`のハッシュ値変換は、定義における`SHA256(ASCII(code_verifier))`の部分で実施しています。
これをgit-bash上で実施すると以下のようになります。

```
$ echo -n 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk' | shasum -a 256
13d31e961a1ad8ec2f16b10c4c982e0876a878ad6df144566ee1894acb70f9c3 *-
```

`13D31E961A1AD8EC2F16B10C4C982E0876A878AD6DF144566EE1894ACB70F9C3`というハッシュ値が得られたことがわかります。

### 得られたハッシュ値をBASE64エンコードする

上記で得られたハッシュ値をBASE64エンコードするのですが、**この値は16進数で表記されたものとして扱わなければいけません。
つまり、以下コマンドのように上記ハッシュ値を文字列としてBASE64エンコードしても、望む値は得られません。**

```
$ echo -n '13D31E961A1AD8EC2F16B10C4C982E0876A878AD6DF144566EE1894ACB70F9C3' | base64
MTNEMzFFOTYxQTFBRDhFQzJGMTZCMTBDNEM5ODJFMDg3NkE4NzhBRDZERjE0NDU2NkVFMTg5NEFD
QjcwRjlDMw==
```

代わりに、xxdコマンドを使って値を16進数表記された文字列としてみると、期待する結果に近い値が取得できます。(下記、WSLで実行。git-bashにxxdコマンドがないため)

```
nannany@MyComputer:/mnt/c/WINDOWS/system32$ echo "13D31E961A1AD8EC2F16B10C4C982E0876A878AD6DF144566EE1894ACB70F9C3" | xxd -r -p | base64
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw+cM=
```

得られた`E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw+cM=`をURLとして使える値にするために、

* パディングの`=`を削除
* `+`を`-`に変換
* `/`を`_`に変換

します。

その結果、期待した`code_challenge`を取得することができます。

```
nannany@MyComputer:/mnt/c/WINDOWS/system32$ echo "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw+cM=" | sed -e 's/=//g' | sed -e 's/+/-/g' | sed -e 's/\//_/g' | xargs -I {} test "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM" == {} ; echo $?
0
```

# 雑感

得られたハッシュ値を文字列として扱ってはまりました。

# 参考

[code_challengeの生成方法](https://tools.ietf.org/html/rfc7636#section-4.2)
[code_challenge_methodがS256の時の具体例](https://tools.ietf.org/html/rfc7636#appendix-B)
【AWS】アカウント申請 - 無料ベーシックプラン

# アカウント使用の流れ

0. [開始前知っておくべきポイント](https://qiita.com/hello112334/items/d9beef22cc5d66fbf578#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E4%BD%BF%E7%94%A8%E3%81%AE%E6%B5%81%E3%82%8C)
1. **アカウント申請**
2. [ログイン](https://qiita.com/hello112334/items/235993219d1f16ac7434)
3. [IAM設定](https://qiita.com/hello112334/items/052f1232f6f54a2531c1)
4. [MFA多要素認証](https://qiita.com/hello112334/items/2180a1f59c4d4d69d4a4)
5. [アカウント削除](https://qiita.com/hello112334/items/a7943f064221b4bf0870)

## 参照資料
操作の詳細は、「Youtube」の「Amazon Web Services Japan 公式」を参照
https://www.youtube.com/watch?v=1VCIFN8B72o

## アカウント申請
AWS アカウント作成のURL
https://portal.aws.amazon.com/billing/signup?refid=em_127222&redirect_url=https%3A%2F%2Faws.amazon.com%2Fregistration-confirmation&language=ja_jp#/start

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/45830140-e5d3-8f37-1cd4-4b66cf992f81.png)

#### １. 基本情報
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/60fdc3ff-e41c-305d-f29f-6d672f2e38ca.png)

#### ２. 連絡先情報
連絡先情報は、半角英数字で入力する必要があるから、住所を英字に変換する

- Ju Dress  http://judress.tsukuenoue.com/
- 君に届け   https://kimini.jp/
- Google Map（英語） https://www.google.com/maps/@36.087542,136.321622,15z?hl=en

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/d58e416e-7859-ba76-bc3f-65b01a1d78f6.png)

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/4db7d3ef-24ac-8127-b47b-3055e89fe452.png)

#### ３. 支払情報
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/24f9d0c0-da87-969c-e28a-cbbb9bb7da36.png)

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/57e2e5a7-02d3-e2c0-f532-51c41cb9af05.png)


#### ４. 本人確認
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/2cf05685-be63-755c-3dff-6385f6232db8.png)

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/f54c9f3a-ba67-bf3a-f16b-9e9284f7d7d7.png)

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/aff98941-e972-93c0-4294-623e2721670a.png)


#### ５. サポートプランの選択
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/0f8c8bf1-35cd-2e38-cbcc-787b50045845.png)


#### ６. 案内（オプション）
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/1621e820-9d95-918e-d7a9-53fd2de6a55b.png)

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680439/f3d9b840-2406-ffa4-9421-01c0e17319a1.png)
【Swift】ラベル付きループ文の使い方

###はじめに
---
今回は、多重ループの内側から一気に抜け出す際に役立つ、ラベル付きループ文の書き方を紹介します。

### ラベル付きループ文とは？
---
多重ループを構成するwhile文やfor文などにラベルを付けて置き、break文とcontinue文を使用する際、どのループから抜け出すのか、またはどのループの実行を継続するのかを、ラベルで指定する書き方です。
Swiftではあまり使われない方法ですが、場面によってはすごく効果的な手法になります。

### 具体的な書き方
---
ラベルはwhile文やfor文の前に、識別子と「:」を置きます。
break文ではラベルの付けられたループから抜け出し、そのループの次の文の実行に移ります。
continue文はラベルの付けられたループの残りの部分の実行をスキップして、次の繰り返しが可能かどうか、条件の判定に移ります。
実際の書き方を以下に示します。

```
loop1: while 条件～～ {
    loop2: while 条件～～{
        while 条件～～ {
            break loop1
            continue loop1

            break loop2
            continue loop2
        }
    }
}
```

### ラベル付きループ文の実践例
---
実際にラベル付きループ文を使って書いてみた、うるう年判定のコード例を紹介します。

```swift:Leapyear.swift
leap: if year % 4 == 0 {
    if year % 100 == 0 {
        if year % 400 == 0 {
            print("\(year)年は400で割り切れるのでうるう年です。")
            break leap
        }
        print("\(year)年は100で割り切れるのでうるう年ではありません。")
        break leap
    }
    print("\(year)年は4で割り切れるのでうるう年です。")
}else {
    print("\(year)年は4で割り切れないのでうるう年ではありません。")
}
```

変数yearに様々な値を代入してLeapyear.swiftを実行すると、次のような出力が得られます。

```:出力
1996年は4で割り切れるのでうるう年です。   // year = 1996
2000年は400で割り切れるのでうるう年です。 // year = 2000
2017年は4で割り切れないのでうるう年ではありません。 // year = 2017
2100年は100で割り切れるのでうるう年ではありません。 // year = 2100
```

yearが2000の時、400で割り切れることがわかると、printを実行してからbreakで直ちにif文から抜け出すので、その下にあるprintは実行しません。
if文に対するbreakは必ずラベルが必要です。ラベルがなければ通常のループやswitch文からの脱出と解釈されます。また、if文もswitch文もループ文ではないので、continueでラベルを指定することはできません。

### 終わりに
---
今回はラベル付きループ文について解説しました。必要になる場面は限られますが、うまく使えれば効果を発揮するので、ぜひ頭の片隅に置いておいてください。
電子工作でiPadを操作してみる１ - タップ


# はじめに

最近は、iPadでkindle本を読むことが多くなったのですが、
ページめくりを手元でできないかと思っていました。
リレータッチボードとESP32を使って実現できましたので、
紹介させていただきます。
本記事では、タップ動作のみ扱います。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/d48df1a2-df41-3a18-7da1-268d5f7ef023.gif)


# 電子工作でiPadを操作してみる関連の記事


- 電子工作でiPadを操作してみる-1 : リレータッチボードの使い方 <=本記事
- [電子工作でiPadを操作してみる２ - Bluetooth経由で制御する](https://qiita.com/kotaproj/items/33395a1e2ba79549c9b5)
- [電子工作でiPadを操作してみる３ - スワイプをやってみる](https://qiita.com/kotaproj/items/f48f2eb37ca01cfb007a)


# 最終的にやりたいこと

![zentai_kiji1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/cfea9272-47bd-1eac-cbcb-adbd1e435775.png)

1. ユーザがスイッチを押す
1. ESP32(Periferal)がスイッチを検出し、Bluetooth経由で通知する
1. ESP32(Central)が通知を検出し、リレータッチボードをON/OFFする
1. iPadがタップを検出する



# リレータッチボード

スイッチサイエンスさんで取り扱っている製品となります。
- [リレータッチボードページ](https://www.switch-science.com/catalog/2455/)

![touch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/47e4c11e-ffb6-cb10-651c-0839a12744fe.png)


以下製品紹介を引用
```
スマートフォンなどの画面をタッチすることができるボードです。スマートフォンの画面にボードを置いた状態でリレーをONにするとボードを置いた位置を指でタッチした状態として認識されます。この製品はリレー駆動用のドライバが搭載されていますので1.6mA程の電流でリレーをONにできます。
```


# 作業環境

- ホストPC
  - windows10 64bit Home
  - VSCode - 1.47.2
  - NodeJS - 12.14.1 LTS
- ターゲットボード
  - ESP32-WROOM-32 開発ボード
    - MicroPython 1.12(esp32-idf4-20191220-v1.12.bin)

ESP32におけるMicroPythonの環境構築は、以前記載した
- [[備忘録]ESP32-VSCode-microPythonでの開発環境の構築](https://qiita.com/kotaproj/items/b53006aef9d04053a5ee)
を参考にしてください。



# 作業手順


## リレータッチボードの動作の準備

まず、リレータッチボードと接続するためにはんだ付けが必要です。以下がはんだ付けした写真です。

![IMG_8485.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/52556642-f148-1d56-9734-5f4836bcc7de.jpeg)


次に、ESP32との接続とします。
※最終的に２つ使うので、２つの接続例を載せます。

|ESP32  |リレータッチボード|備考  |
|---|---|---|
|5V  |5V   |  |
|GND |GND   |  |
|26  |EN   |  |
|27  |EN   |  |

- 接続図(ESP32 - Central)

![esp_cen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/9b81b55d-4841-f195-d486-e928bba14570.png)


## 動作確認用のプログラム

次に、動作を確認するプログラムとなります。

```
import time
from machine import Pin

PIN_RELAY_1 = 26
PIN_RELAY_2 = 27

relays = {}

relays[1] = Pin(PIN_RELAY_1, Pin.OUT)
relays[2] = Pin(PIN_RELAY_2, Pin.OUT)

def tap(no, count=1, ht=50):
    for _ in range(count):
        relays[no].value(True)
        time.sleep_ms(ht)
        relays[no].value(False)
        time.sleep_ms(ht)
    return
```

ポイントは以下となります。

- iPadがタップを認識するのは、value(False)のタイミング
- 待ち時間(ht)を小さくしすぎるとダメ
  - リレースイッチの応答性の問題と思われます
  - 20msec未満だと、失敗することが多い


## 実行方法

- 上記のプログラムをdemo.pyとして、ESP32にアップロード
- 以下を実施する(本記事のトップのgifとなります)

```
>>> import demo
>>> demo.tap(1, 1, 50)
==> 1回タップされる
>>> demo.tap(1, 100, 20)
==> 100回タップされる
```
- 動作確認には、"Vivid Counter"を使用しています



# さいごに

- 今回は、ESP32を使用していますが、ラズベリーパイでもできます
- 複数のタッチボードを使うとスワイプも実現できます
  - 精度よくスワップをやろうとすると、３つはいるようです（２つだと安定したスワップが難しい）



---

# 参考

* [ESP32 での MicroPython の始め方](https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/tutorial/intro.html)
デプロイ方式を整理する

# デプロイについて
サービス実行環境の扱いとデプロイ方式の組み合わせで整理してみます。

## サービス実行環境の扱い
mutable deploymentとimmutable deployment

### mutable deployment
サービス実行環境は同じものを使ったまま実行するアプリケーションのみを入れ替えるデプロイ方法。
アプリケーションだけを入れ替えるのでデプロイが早い。

### immutable deployment
サービス実行環境ごと新しく作成し、新旧を入れ替えるデプロイ方式。
デプロイ後、サービス実行環境は削除される。
サービス実行環境ごと新しく作成する分mutable deploymentと比べてデプロイが遅くなる。

## InPlace deploymentとBlue/Green deployment
### InPlace deployment
稼働中のサービス実行環境に対しアプリケーションのみを入れ替えるデプロイ方法。
一定台数ずつ順番にデプロイしていく方式を**RollingUpdate deployment**という。
ロールバックの際は再度デプロイを実行する必要があるのでロールバックまでの時間がBlue/Green deploymentに比べて遅くなる。

### Blue/Green deployment
稼働中のサービス実行環境に対しては何もせず、新しいアプリケーションを実行したサービス実行環境を用意してルーターで切り替えを行う方法を、**Blue/Green deployment**と言う。
ロールバックの際は元のサービス実行環境に再度切り替えを行うだけなのでロールバックまでの時間がInPlace deploymentに比べて速い。

Blue/Green deploymentの内、この場合は新旧のアプリケーションが一瞬でも共存しうるデプロイ方式をBlue/Green　deploymentと、サービス実行環境全てを一度に切り替える方法を**Red/Black deployment**と使い分ける。

**Red/Black deploymentをBlue/Green deploymentと全く同じとするか、上記の様に細分化して使い分けるかは曖昧で、人や組織によって内容が違う様です。**

## 参考
https://aws.typepad.com/sajp/2015/12/what-is-blue-green-deployment.html
Excel VBA で Windowsのユーザーセッションをロックする

#Ctrl + Alt + Del ⇒　「ロック」　の状態を VBAで作る。

昨今、Web上のプログラミングが主流で、VBAは死んだ感じが否めません。
VBAはブラウザの中ではなくWindows上で直接動いているので、Windowsの動作を制御することができます。

そんな一覧を示してみたいと思います。

```VisualBasic:sample.txt
Private Declare PtrSafe Function LockWorkStation Lib "user32" () As Long
Sub LockTest()
    LockWorkStation
End Sub
```
[メモ]ネットワーク接続トラブル時の問題切り分け方法

### 1. pingで接続できるか

```terminal
$ ping IPアドレス
$ ping ホスト名
```

pingが成功しない場合
1.同一ネットワーク上の他のマシンに接続できるか確認

```terminal
$ ping 目的のマシンと同一ネットワークに存在する他のマシンのIPアドレス
```

2.ネットワーク経路のどこで失敗しているか確認
※tracerouteのデフォルトはUDP接続なので、-IでICMP、-TでTCPもできる

```terminal
$ traceroute IPアドレス
```

### 2.ポートが開いているか
目的のマシン内で

```terminal
$ netstat -a
```

```terminal
# ss -a
```

もしくは、
クライアントから

```terminal
$ nc ホスト名 -z ポート番号
Connection to qiita.com port 443 [tcp/https] succeeded!
```


### 3.名前解決が適切に行われているか
hostsファイルを確認

```terminal
$ cat /etc/hosts
```

もしくは、

```terminal
$ nslookup ドメイン名
Server:		192.168.100.1・・DNSサーバー名
Address:	192.168.100.1#53・・DNSサーバーのアドレス

Non-authoritative answer:
Name:	qiita.com・・問い合わせたドメイン名
Address: 54.65.107.105・・結果
Name:	qiita.com
Address: 13.112.43.51
Name:	qiita.com
Address: 54.238.18.49

$ dig ドメイン名
(結果エリア)
;; ANSWER SECTION:
qiita.com.		22	IN	A	54.65.107.105
qiita.com.		22	IN	A	54.238.18.49
qiita.com.		22	IN	A	13.112.43.51
```

### その他
・怪しいコネクションを特定して、どのプロセスが使っているか確認する

```terminal
// tcpコネクションを表示
$ netstat -p tcp

// どのプロセスが使っているか特定
$ lsof -i:58193
```
・ネットワーク性能が悪い場合は以下を疑う
(「絵で見て分かるOS/ストレージ/ネットワーク[新装版]」P263〜)
1.ボトルネックによる待ち行列
　- DBサーバー、APサーバーなどで待ち行列が発生してないか確認する
2.通信回数が多い
　- 帯域を使い切ってなくてもショートパケットが何回も送られることで処理に時間がかかっていることがある
　- DBの場合データを全て受け取ってからプログラムで処理するのではなくストアドプロシージャでDB側で処理してしまう、などもできる
　- Webサイトの場合閾値を超えたらソーリーページを表示する、などで待ち行列を制限する、などもできる
3.相手の応答を待たなければならない
4.純粋なネットワークのトラブル


### 参考
・絵で見て分かるOS/ストレージ/ネットワーク[新装版]
・[Macでネットの通信が遅い時にnetstatとlsofコマンド使って調べてみた](https://polidog.jp/2016/05/24/tcp/)
Rust: MongoDB のデータを読む (Read)

こちらで作成したデータを読みます。
[Rust: MongoDB のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ce6b68bc4e23cafe5c62)

```text:Cargo.toml
[package]
name = "mongodb_read"
version = "0.1.0"
edition = "2018"


[dependencies]
mongodb = "1.0.0"
tokio = "*"
futures = "*"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	mongodb_read/src/main.rs

					Jul/25/2020
*/
// --------------------------------------------------------------------
use futures::stream::StreamExt;
use mongodb::{
	bson::{doc},
	Client,
	error::Result,
};

#[tokio::main]
async fn main()-> Result<()> {
	let client =
		Client::with_uri_str("mongodb://localhost:27017").await?;
	let database = client.database("city");
	let collection = database.collection("saitama");

	let mut cursor = collection.find(doc! {}, None).await?;

	while let Some(result) = cursor.next().await {
		println!("{:?}",result);
	}

	eprintln! ("*** 終了 ***");
	Ok(())
}

// --------------------------------------------------------------------
```

実行

```text
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s
     Running `target/debug/mongodb_read`
Ok(Document({"_id": ObjectId(ObjectId(5f1bf38b00c8509a003a3a47)), "key": String("t1161"), "name": String("さいたま"), "population": Int32(45298), "date_mod": String("1956-6-12")}))
Ok(Document({"_id": ObjectId(ObjectId(5f1bf38b0077dbf3003a3a48)), "key": String("t1162"), "name": String("所沢"), "population": Int32(21983), "date_mod": String("1956-8-24")}))
Ok(Document({"_id": ObjectId(ObjectId(5f1bf38b0054d9c9003a3a49)), "key": String("t1163"), "name": String("越谷"), "population": Int32(51287), "date_mod": String("1956-3-9")}))
*** 終了 ***
```
Rust: MongoDB のデータを作成 (Create)

```text:Cargo.toml
[package]
name = "mongodb_create"
version = "0.1.0"
edition = "2018"


[dependencies]
mongodb = "1.0.0"
tokio = "*"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	mongodb_create/src/main.rs

					Jul/25/2020
*/
// --------------------------------------------------------------------
use mongodb::{
	bson::doc,
	error::Result,
	Client
};

#[tokio::main]
async fn main() -> Result<()> {
	eprintln! ("*** 開始 ***");
	let client =
		Client::with_uri_str("mongodb://localhost:27017").await?;

	let coll = client
		.database("city")
		.collection("saitama");

	let new_cities = vec![
		doc! {"key": "t1161", "name": "さいたま","population": 45298,"date_mod": "1956-6-12"},
		doc! {"key": "t1162", "name": "所沢" ,"population": 21983,"date_mod": "1956-8-24"},
		doc! {"key": "t1163", "name": "越谷" ,"population": 51287,"date_mod": "1956-3-9"}, 
	];

	coll.insert_many(new_cities, None).await?;

	eprintln! ("*** 終了 ***");
	Ok(())
}
 
// --------------------------------------------------------------------
```

実行

```text
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.34s
     Running `target/debug/mongodb_create`
*** 開始 ***
*** 終了 ***
```

mongo cli で確認

```text
$ mongo
> use city
switched to db city
> db.saitama.find()
{ "_id" : ObjectId("5f1bf38b00c8509a003a3a47"), "key" : "t1161", "name" : "さいたま", "population" : 45298, "date_mod" : "1956-6-12" }
{ "_id" : ObjectId("5f1bf38b0077dbf3003a3a48"), "key" : "t1162", "name" : "所沢", "population" : 21983, "date_mod" : "1956-8-24" }
{ "_id" : ObjectId("5f1bf38b0054d9c9003a3a49"), "key" : "t1163", "name" : "越谷", "population" : 51287, "date_mod" : "1956-3-9" }
```
【React】基礎編 ⑶

新しく学んだことをアウトプットしています。

###React.Fragment

JSXは複数の要素を持つことができないため、
＜div＞タグで複数の要素を格納するのが一般的でした。

ですが、HTMLで描画した時に、
本来は＜div＞タグが必要ない所にまで要素が付与されてしまうので、意外と困る時がありますよね。

そんな時に、使用するのが、React.Fragmentなのです。

React.Fragmentは＜div＞タグと同じ役割を担っており、
HTMLでは要素としてカウントされないので、使い勝手が良いです。

```App.jsx
import React, { Component } from 'react';

class App extends Component {
  render() {
    return(
      // divの替り
      <React.Fragment>
        <User name={"Taro"} age={8}/>
      </React.Fragment>
    );
  }
}

export default App;
```

###関数コンポーネント

コンポーネントには、
クラスコンポーネントと関数コンポーネントの２つがあります。

Reactでは、VirtualDomというDomが存在していて、その中でどのDomが変更になったのか管理していて、その変更点のみを実際のDomに反映していく機構があります。
それぞれのDomにkeyを与えてあげて、必要最低限なDomの範囲をReactで管理しています。

```App.jsx

// クラスコンポーネント

import React, { Component } from 'react';

class App extends Component {
  
  const profiles = [
    { name: "Taro", age: 8 },
    { name: "Hanako", age: 5 },
  ]

  render() {
    return(
      <React.Fragment>
        {
          profiles.map((profile, index) => {
            return(
              // keyをindexで与えてあげる
              <User name={profile.name} age={profile.age} key={index} />
            );
          })
        }
      </React.Fragment>
    );
  }
}

//  関数コンポーネント

const User = (props) => { // 引数にpropsを持たせる
  return(
    <div>
      <p> I am {props.name} and {props.age} years old!</p>
    </div>
  )
}

export default App;
```

###defaultProps

ReactのpropsにはdefaultPropsという機構があります。
propsを受け取るComponentにdefaultPropsを設定してあげる。

以下のように設定してあげると、
Noname さんの age がデフォルトで 1 と出力されます。

```App.jsx
import React, { Component } from 'react';

class App extends Component {
  
  const profiles = [
    { name: "Taro", age: 8 },
    { name: "Hanako", age: 5 },
    { name: "Noname" }
  ]

  render() {
    return(
      <React.Fragment>
        {
          profiles.map((profile, index) => {
            return(
              <User name={profile.name} age={profile.age} key={index} />
            );
          })
        }
      </React.Fragment>
    );
  }
}

const User = (props) => { 
  return(
    <div>
      <p> I am {props.name} and {props.age} years old!</p>
    </div>
  )
}
// propsを受け取るComponentでdefaultPropsを設定
User.defaultProps = {
  age: 1
}

export default App;
```

###propTypes

先ほどのdefaultPorpsと同様に、
ReactのpropsにはpropTypesという機構があります。
propsを受け取るComponentにpropsTypesを設定してあげる。

以下のように設定してあげると、
name や age に型を設定することができ、 validation をかけることができます。 
型を設定しておくことで、 name に数値が入れられたり、age に文字列が入るのを防止してくれます。
また、 isRquired とすることで、 age が空の場合はエラーが発生するようになります。

```App.jsx
imoprt React from 'react';
// prop-Typesをimport
imoprt PropTypes from 'prop-types';
// 省略


// 
User.propTypes = {
  name: PropTypes.string,
  age: PropTypes.number.isRequired,
}

```

以上
IT業務処理統制項目

応用情報技術者令和元年秋期 午前問60


販売管理システムにおいて，起票された受注伝票が漏れなく，重複することなく入力されていることを確かめる監査手続のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3fd63483-1007-716f-c141-db66291269e2.png)

よく出題ですね。
内部統制＞IT統制＞全般統制
　　　　　　　　＞業務処理統制
　　　　＞。。。

企業会計審議会が2007年2月に発表した内部統制の「実施基準」では、IT業務処理統制として次の4項目を挙げています：
１、入力情報の完全性、正確性、正当性等を確保する統制
２、例外処理（エラー）の修正と再処理
３、マスタデータの維持管理
４、システムの利用に関する認証、操作範囲の限定などアクセスの管理

監査において「起票された受注伝票が漏れなく，重複することなく入力されていることを確かめる」には
入力データの**完全性**および**一意性**に係るコントロール項目をチェックすることになります。

上記の考え方は、難しいですね。
私の考え方は簡単で、「漏れなく、重複することなく」とすると、プルーフリストと照合であればよいとのことです。
認識としては、プルーフは原材料として、「漏れなく、重複することなく」が前提ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7f04f4e0-8b42-4066-7919-83dc2e5968ef.png)


From　https://www.ap-siken.com/kakomon/23_aki/q59.html
#IF VBA7 ってどういうときに必要なのか？

#VBA7の意味をわかって、コピペしてますでしょうか？
インターネットでExcel VBA上のWindows APIのサンプルコードを探すと、#If VBA7 を使ったものをよく見かけます。

ソースを公開している方は、どういう人がみても使えるように#If VBA7を使って、広い互換性をもたせているのですが、それをみた利用者側で無条件にコピーして使うのは、やめたほうがいいんじゃないかと思って、この記事を投稿しました。

ざっくりいうと、#If VBA7 は Excel2010以上だったら　です。
もう2020年です。自分用や仲間内で使うマクロで、自分たちがExcel2003やExcel2007を使っていないのだったら、もうVBA7は使わずにすっきりさせたほうがいいと思います。

Excel2010以上しか想定しないのなら

```VisualBasic
#If VBA7 Then
   Declare PtrSafe Function FindWindow Lib "user32" _
      Alias "FindWindowA" ( _
      ByVal lpClassName As String, _
      ByVal lpWindowName As String) As LongPtr
    
#Else
   Declare Function FindWindow Lib "user32" _
      Alias "FindWindowA" ( _
      ByVal lpClassName As String, _
      ByVal lpWindowName As String) As Long
    
#End If
```
とするのではなく

```VisualBasic

Declare PtrSafe Function FindWindow Lib "user32" _
  Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As LongPtr  
```

とすべきだと思います。
ROS2でLiDAR Inertial SLAM

# はじめに

最近、LiDAR Inertial SLAMであるLIO-SAMが発表されて、私の中でLiDAR Inertial SLAMが熱いです。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping <a href="https://t.co/ttzPbWbdGl">https://t.co/ttzPbWbdGl</a> 출처 <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a></p>&mdash; Giseop Kim (@GiseopK) <a href="https://twitter.com/GiseopK/status/1278564217960796160?ref_src=twsrc%5Etfw">July 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

下記はLIO-SAMの論文から比較を引用しました。LIO-SAMではとても綺麗に地図ができていることがわかります。
https://github.com/TixiaoShan/LIO-SAM/blob/master/config/doc/paper.pdf
![liosam_thesis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229952/1d1b4b6a-1c61-6ba0-7e80-64843f54caa6.png)


LIO-SAMのキモはIMUによる点群歪み補正とスキャンマッチングの初期位置推定なのですが、このキモとなる部分がモジュール化されていて、簡単に自作SLAMに移植できそうだったのでしてみました！
(SLAMを自作した話は「[ROS2で3D LiDARを用いたGraph SLAMによる三次元地図作成](https://qiita.com/saitosasaki/items/c1ad2e746a92b4808a10)」をご覧ください。）

Github
<a href="https://github.com/rsasaki0109/li_slam_ros2"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/rsasaki0109/li_slam_ros2.png" width="460px"></a>

作ったSLAMで出来た地図
![Peek 2020-07-20 16-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229952/a9113b06-0b49-f54b-7452-8b864d89d6b7.gif)


# LiDAR Inertial SLAMとは
LiDAR Inertial SLAMはその名の通り、IMUを複合したLidar SLAMで、高周波なIMUでSLAMを補間するものです。

LiDAR Inertial SLAMを解説している日本語記事・スライドはないのですが、複合部分に着目すれば基本Visual Inertial SLAMと同じなので、Visual Inertial SLAMの解説スライドを載せておきます。

20190307 visualslam summary
Visual Inertial SLAM
https://www.slideshare.net/takmin/20190307-visualslam-summary#64


第126回 RSJロボット工学セミナー「 Visual SLAMと深層学習を用いた３Dモデリング」（2020/5/22）
５．Visual-inertial SLAM（VI-SLAM）の概要
https://www.slideshare.net/KenSakurada/126-rsj2020522#74

# 作ったパッケージの説明
今回作ったLiDAR Inertial SLAMはndt/gicpによる逐次SLAMとグラフベースSLAMを組み合わせています。
LiDAR Inertial SLAMを作るにあたって、元のパッケージから改造したのは逐次SLAMの部分なので、逐次SLAMの実装について解説します。
以下がグラフベースSLAMを起動していない逐次SLAMだけのrosgraphです。imu_preintegrationノードでIMUによるスキャンマッチングのための初期位置推定を行い、image_projectionノードで点群歪み補正を行って、scanmatcherノードでスキャンマッチングをします。

rosgraph
![rosgraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229952/263ae2ed-76b3-ad47-ffb7-162f37ac7655.png)


# デモ

デモデータはLIO-SAMのcasual_walk.bag(ROS1のrosbagを変換しています）を使います。
このデータではVelodyne VLP-16と数百Hzで10万円程度の9軸IMUが使われています。
https://github.com/TixiaoShan/LIO-SAM

以下コマンドです。
 
```
rviz2 -d src/li_slam_ros2/scanmatcher/rviz/lio.rviz 
ros2 launch scanmatcher lio.launch.py
ros2 bag play -s rosbag_v2 casual_walk.bag 
```

出来た三次元地図が以下となります。

![スクリーンショット 2020-08-11 05-58-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229952/9e4a339c-d928-4f85-fae6-d5b1243574cd.png)
黄色のパス：ループが閉じていないパス、緑のパス：修正されたパス、赤：マップ

LIOMよりは性能が良く、LIO-SAMと比べても大丈夫そうですね！

以上、お読みいただきありがとうございました！
Excel VBAでパスワード保護されたブックか確認する

#Excel VBAでパスワード保護されたブックか確認する方法
Excel VBAでパスワード保護されたブックを開こうとするとパスワード入力画面が表示され、自動的なマクロの実行が妨害されてしまいます。
パスワード保護されたブックを除外して、自動的な処理を継続したい場合には、次のようにして、ブックがパスワード保護されているかを確認できます。

```VisualBasic:Sample.txt
Function IsPasswordProtected(ByVal FileName As String) As Boolean
    Dim wb As Workbook
    On Error Resume Next
    'パスワード入力ダイアログがでないようにダミーのパスワードを指定する。
    Set wb = Workbooks.Open(FileName, , True, , "THIS_PASSWORD_NEVER_MATCHES")
    On Error Goto 0
    If wb Is Nothing Then
        IsPasswordProtected = True
    Else
        wb.Close False
        Set wb = Nothing
    End If
End Function
```
Docker逆引きメモ

必要に迫られたDockerの逆引きメモです。

## SQL Serverコンテナでbacpacファイルがインポートできない問題
SQL Server on Linux for Docker Engineを利用し際にSSMSからbacpacのインポートでエラーが発生することがあります。
このエラーが発生した場合、下記を行うとエラーが発生せずインポートすることができます。

1. bacpacのデータベース名と同名の新規データベースを作成
1. 作成した新規データベースを削除

## Postgresコンテナでlocaleにja_JP.utf8を設定

手順としてはDockerFile作成、imageのビルドを行う。
Visual Studio CodeのDocker Pluginを使用すると楽。

### 環境
* Windows10 Pro 1909
* Docker 19.03.8

### Docker file
```dockerfile
FROM postgres:9.6.11
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.utf8
ENV LANG ja_JP.utf8
```
### Build
```posh
docker build --pull --rm -f "postgres.9.6.11_ja.dockerfile" -t postgres:9.6.11_ja "."
```

### 参考
* [ja_JP.UTF-8ロケールを指定したPostgreSQL Dockerコンテナを作る - terurouメモ](http://terurou.hateblo.jp/entry/2016/11/27/193139)
システム監査基準における監査手続の実施に際して利用する技法

応用情報技術者令和元年秋期 午前問59

システム監査基準(平成30年)における監査手続の実施に際して利用する技法に関する記述のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0cea6b7a-2d17-1e07-dafe-e605b4074e8f.png)

監査技法：
１、**インタビュー法**
インタビュー法は、監査対象の実態を確かめるために、システム監査人が、直接、関係者に口頭で問い合わせ、回答を入手する技法です。

２、**現地調査法**
現地調査法とは、システム監査人が、被監査部門等に直接赴き、対象業務の流れ等の状況を、自ら観察・調査する技法です。
実際の業務の流れを確認するには業務時間内に実施しなければなりません。

３、**コンピュータ支援監査技法**
専用のソフトウェアや表計算ソフトウェア等を利用。
それ以外、テストデータ法、監査モジュール法、ペネトレーションテスト法(情報セキュリティ監査時)などもある。

４、**チェックリスト法**
チェックリスト法とは、システム監査人が、あらかじめ監査対象に応じて調整して作成したチェックリスト（通例、チェックリスト形式の質問書）に対して、関係者から回答を求める技法です。
チェックリストは監査対象部門ではなく、システム監査人が作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6ee6da8d-af5b-f4a4-aa6b-6167d72ad861.png)


From　https://www.ap-siken.com/kakomon/01_aki/q59.html
Python勉強用　用語まとめ

# この記事の目的
調べものするたびに何だったっけ？ってなる用語の意味や参考リンクをまとめます。用語検索の効率化用。

## インタプリタ方式とコンパイル方式
[参考リンク](https://www3.cuc.ac.jp/~miyata/classes/prg1/02/2way.html)
### インタプリタ方式
命令を一つずつ実行する方式。Pythonはこっち。実行結果がすぐに出力されるのでお手軽かつわかりやすい。また、実行環境にあったインタプリタを使うことで、OSやCPUなどが異なる実行環境に対応できる。デメリットは速度。特にfor文などで繰り返しの処理を行うときに遅くなる。

### コンパイル方式
ソースプログラムから実行ファイルを生成する方式。C言語など。インタプリタ方式に比べて速い。コンパイルしないと実行できないので人手間かかることと、実行ファイルが環境に依存することがデメリットとして挙げられる。

## スクリプト言語
比較的簡単に使えるプログラミング言語のこと。Pythonもこのカテゴリに入る。他にはJavascriptやRubyが挙げられる。
その多くがインタプリタ方式の言語なので、用語として混同されることが多いが、スクリプト言語＝インタプリタ方式という定義はない。

## 静的型付けと動的型付け

### 静的型付け
変数や引数、返り値に対してどの型かを宣言しておく方式。型の整合性チェックを実行時には行わないので実行速度にメリットあり。逆に言うとプログラムを書くときに型の整合性を理解しておく必要がある。C言語やJavaなど。

### 動的型付け
実行時に自動的に型を判別する方式。Pythonはこっち。インタプリタ方式の言語に採用されている。実行ごとに型の整合性をとるので速度は遅くなる。プログラムを書くときには型をあまり意識しなくて良いので、学習コストが低く、記述量も減らせる。

## リテラル
*編集中*

## 浅いコピーと深いコピー
*編集中*

## シーケンス型
*編集中*

## イテレート
*編集中*

## リポジトリ
Gitなどでファイルやディレクトリの状態を記録する場所。
変更履歴などを管理する場所。共有のためのリモートリポジトリとローカルPCで作業するためのローカルリポジトリがある。
[参考：サルGit](https://backlog.com/ja/git-tutorial/intro/02/)
Excel VBAで 255文字超の 配列数式 FormulaArrayを設定する

# 配列数式は255文字までしか設定できません。

配列数式は FormulaArrayプロパティで設定できますが、VBAからは255文字までしか設定できません。
Ctrl + Shift + Enterで手で設定する場合は、そのような制限はないのですが、VBAから設定する場合は、そのような制限があります。
どうしようもないので、どうしても設定した場合、SendKeysを使って、手で設定したことにするという苦しい逃げ道があります。

```VisualBasic:sample.txt

Sub SetTooLongArrayFormula(ByVal rn As Range, ByVal sFormula As String)
    Dim sFormat As String
    sFormat = rn.Cells(1, 1).NumberFormat
    rn.FormulaArray = ""
    rn.Cells(1, 1).NumberFormat = "@"
    rn.Value = sFormula
    rn.Cells(1, 1).NumberFormat = sFormat
    rn.Select
    DoEvents
    SendKeys "{F2}", True 'F2で式を編集モードにします。
    DoEvents
    SendKeys "+^{ENTER}", True 'Ctrl+Shift+Enterを押します。
    
End Sub
Sub Test()
    'このマクロをVBE Editorから実行しないでください。
    'リボンの開発タブのマクロリボンから実行してください。
    Dim sFormula As String
    sFormula = "=""1"""
    For i = 1 To 250
        sFormula = sFormula & "&""1"""
    Next
    SetTooLongArrayFormula Range("A1:A2"), sFormula
End Sub
```
この投稿は、
https://akihitoyamashiro.blogspot.com/2020/07/how-to-set-formulaarray-property-to.html
に記載したものと同じ内容です。
javaで席替え

#Javaで男性12人と女性8人の席替え

##実現したいこと

・配置はランダム
・横一列のどこかに女性一人以上を配置したい
・目の悪い人が入れば前に固定
・分かりやすいコード

##結果
シャッフルされたリストから、get()で取り出す。
System〜printlnで、座席に見えるようにした

・配置はランダム
　→リストをCollections.shuffle()で毎回結果が変わる
・横一列のどこかに女性一人以上を配置したい
　→あらかじめ、女性が来るのか男性がくるのか、配置される場所を決めた
・目の悪い人の固定
　→リストから外し、”〜get()”のとこを消して固定する人の名前にする

※プログラムを実行すると一瞬で終わるのでちょっと退屈
※一度隣同士になった人を避けるなどは出来てない

##コード

```

import java.util.ArrayList;
import java.util.Collections;

public class Sekigae4 {
        public static void main(String[] args) {

                ArrayList<String> man = new ArrayList<String>();
                man.add("男性1　　");
                man.add("男性2　　");
                man.add("男性3　　");
                man.add("男性4　　");
                man.add("男性5　　");
                man.add("男性6　　");
                man.add("男性7　　");
                man.add("男性8　　");
                man.add("男性9　　");
                man.add("男性10　");
                man.add("男性11　");
                man.add("男性12　");

                ArrayList<String> woman = new ArrayList<String>();
                woman.add("女性1　");
                woman.add("女性2　");
                woman.add("女性3　");
                woman.add("女性4　");
                woman.add("女性5　");
                woman.add("女性6　");
                woman.add("女性7　");
                woman.add("女性8　");

                Collections.shuffle(man);
                Collections.shuffle(woman);

                System.out.println("--並び替え後--");
                System.out.println(woman.get(0) + " | " + man.get(0)   + " | " + man.get(1)   + " | "+ man.get(2));
                System.out.println(woman.get(1) + " | " + man.get(3)   + " | " + man.get(4)   + " | "+ woman.get(2));
                System.out.println(man.get(5)   + " | " + man.get(6)   + " | " + man.get(7)   + " | "+ woman.get(3));
                System.out.println(woman.get(4) + " | " + woman.get(5) + " | " + man.get(8)   + " | "+ man.get(9));
                System.out.println(man.get(10)  + " | " + man.get(11)  + " | " + woman.get(6) + " | "+ woman.get(7));
        }
}
```
Automation Anywhere A2019: 文字列フィールド内で"$"を文字として認識させるには

Automation Anywhere A2019のアクションの「アクションの詳細」ウィンドウの中に現れる文字列フィールド (「❞」がフィールドの先頭に来ている)では、文字列を指定できるのですが、唯一 "＄"の文字は、囲むことで変数を表すため特別扱いされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0c10a254-bfc3-54c9-a821-57a0086572f8.png)

v11では"＄"を単体で入れていても、式として解釈したときに変数でなければ自動的に文字"＄"と認識してくれたのですが、A2019では怒られてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/af0772ec-c7dd-55de-6108-bbf9158c86df.png)
では、単に文字の"＄"を指定したい場合はどうすればよいでしょうか？？


# 解決策: `$$`は"`$`"になります
文字列フィールドに`$`と入れると入力支援ウィンドウのトップに表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e37050d5-7d8e-4387-895a-d4ac3de6450f.png)

つまり、"＄"を入れたいところには"＄＄"と入れておけば、実際には"＄"と認識されるということです。

実際にやってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/150e9781-a012-822a-9561-a306d1656c81.png)

結果:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5f409fb2-3887-d25b-5a84-4490505bdeac.png)
GCPのSFTPサーバーのポート変更


前回の続き。
デフォルトポートはだめだよね。多分。絶対。

### 起こったこと
GCPにSFTPサーバーを立てた。
だがデフォルトポートのままである。

22番ポートはスキャンされまくって気持ち悪い。らしい。
というわけでSSH、SFTPのポートを変更する。

やることは多分以下

1. まずSSH,　SFTPで接続できることの確認（これは前回の内容）
2. GCPファイアウォールルールの変更
3. sshdのポート設定変更
4. 接続方法の変更


### GCPのファイアウォール設定変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/6989fe1a-a366-fba0-284f-a925129d83dc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/7e95217b-3f76-b5e5-794d-ead49c2babbb.png)

- 適当な名前
- 優先度デフォルト
- トラフィック上がり
- 一致で許可
- ネットワーク上のインスタンス
- TCPで目的のポート

って感じ。



### sshdのポート設定変更

件のサーバーにSSHでログインしよう。
まだ22番ポートのままだ。
ダッシュボードからでも良いぞ。
そしたらsshdの設定変更だ。

~~~
sudo vi /etc/ssh/sshd_config
~~~
として、
最後に

~~~
Port 51919
~~~

を足す。
そしたら下。多分デーモンを再起動しているのかな？

~~~
sudo systemctl restart sshd.service
~~~

一応ポートの空き具合を確認する。
nmapを使う。多分そのままだとインストールされていないから、

~~~
sudo apt-get install nmap
~~~
しておこうね。

で

~~~
nmap -p1-52000 localhost
~~~
してみよう。
51919について記載されているかな？



あとは、ファイアウォールの設定に戻ってデフォルトの22番のルールを無効化しておこう。
下はすでに無効化された状態だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/2549d3fa-6beb-9660-1f35-11ce3b4b5247.png)


### 接続方法変更

簡単にはこれはわいの施設の問題なのだけど、
他の施設の22番以外にsshはそのままではできなくなっているのね。

簡単にはこれを見てほしい。
http://www.iimc.kyoto-u.ac.jp/ja/faq/network/external/sshexcept22.html

というわけで、

~~~
ssh -J wainosisetudeno_id@forward_no_server -p 50810 yourname@A.B.C.D -i ./.ssh/unko
~~~
みたいな感じで繋いだ。


ちなみにWinSCPで行くなら、
トンネルの設定を下のようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/8938f865-634e-0f95-0002-6156e07a14eb.png)
レコメンドシステムに関しての情報収集

随時更新

[これから推薦システムを作る方向けの推薦システム入門](https://note.com/masa_kazama/n/n586d0e2d49d2)

[クックパッドにおける推薦システムの取り組み](https://logmi.jp/tech/articles/321731)
人事がプログラミングをかじってみる

#はじめに
こんにちは。あやなるです。
文学部卒のド文系ですが、まあまあ大きいIT企業でエンジニアの人事をしています。

今まで全くプログラミングをしたことがなかったのですが、エンジニアのみなさんが普段どんなことをやっているのか少しでも理解したく、自分でもちょっとだけいじってみることにしました。

せっかくなので、ほぼ自分用ではありますが、学んだことをQiitaにまとめていこうと思います。
超初心者目線でまとめているので、プログラミング知識ゼロの方々にとって参考になれば嬉しいです。
初心者の目線を知るという意味では、もしかしたらエンジニア先輩方の参考にもなる部分もあるかもしれません。
先輩方からもアドバイスもいただけたら、さらに嬉しいです:flushed:

まずは「初心者にわかりやすいよ」とエンジニアに勧められたPythonにチャレンジすることにしました。

よろしくおねがいします:smiley:


#Hello World!
まず初めの一歩としてよく聞くのは、"Hello World!"

```python
print('Hello World!')
```
↑この入力で↓このように表示されます。

```python
Hello World
```


#その前にMarkdownの使い方
そ、そ、そ、その前に！急に黒い枠でかっこよく表示してみたけど、それすら最初はどうやるのかわからなかった。ググりながらなんとかｗ

【参考】

- markdownとは？https://www.markdown.jp/what-is-markdown/
- 特殊記号の呼び方 https://hi-ho.jp/support/faq/ans/003575.php
    
【結果】

 1. バッククオート３つとpythonって入れて改行
 2. 表示したい部分を入力して改行
 3. バッククオート３つで改行

これで、表示したい部分に記載した内容が、↓このように表示されるそうです。汗

```python
print('Hello World!')
```

ここまでできたところで、その他の学んだこともまとめていきますね。

#最初に学んだこと
####print()で表示ができる
```python
print('文字列') 
#表示したい「文字列」をprint('') の間に入れる。
#シャープの後ろはコメント扱いになり、実行されない
```

####文字列ではなく「数値」などの場合、''で囲わない。

```python
print(5+10) #15と表示される
#5+10を数値として扱っている
print('5+10') #5+10と表示される
#5＋10を文字列として扱っている
```
```python
print(5*2) #10
#掛け算は「*」
print(5/2) #2.5
#割り算は「/」
print(19%5) #4
#割り算のあまりは「%」
#19÷5=3あまり4なので、4だけ表示される
```

#「あまり」なんていつ使うの？
％はいつ使うのかな？と思ってエンジニアに聞いてみた。

- 「もしもあまりがゼロならば」という設定をすると、奇数と偶数で条件を分けるときに使えるらしい。
- 生年月日を入力するフォームなどで、ユーザー（お客様、利用者）が入力した年を下2桁だけ表示したいとき、100で割ることで表示できるらしい。

なるほどー！！

これらはほんの一部の例にしかすぎないそうですが、ちょっとでもどうゆうときに使うのかがわかるとおもしろい。まだまだ使えるレベルにはならなくても、実際どうゆうふうに使うのかを想像しながら勉強していきたいなと思いました。

初回はここまで。コツコツ時間作って頑張っていきますので、応援よろしくおねがいしまーす。
インシデント管理及びサービス要求管理

応用情報技術者令和元年秋期 午前問57

ITサービスマネジメントの活動のうち，インシデント管理及びサービス要求管理として行うものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fc7090e2-9852-7360-1448-7ffffb89bf5c.png)


**インシデント管理**は、サービスに対する計画外の中断、サービスの品質の低下、あるいは顧客へのサービスにまだ影響していない事象が報告された時に、サービスの中断時間を最小限に抑えて速やかに回復することを目指すプロセスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/cc35572e-7677-17ff-e165-ff4f6e3562f0.png)

補足：
ITサービスマネジメントにおける，インシデント及びサービス要求管理の主な活動はどれか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/eb3a9bea-bed4-a2a7-640d-08c54522979e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3cc88e9f-0b92-1407-9cc5-11c8fc8a5952.png)


From https://www.fe-siken.com/kakomon/29_haru/q57.html
https://www.pm-siken.com/kakomon/27_haru/am2_19.html
React deploy to github static pages

#githubに静的ページをdeployする方法

install the gh-pages

```terminal 
npm i gh-pages
```

package.jsonを開き、scriptsに以下のdeployの内容を追記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/18e8f827-9f47-d5a5-e0cc-2dda8f9d9f62.png)

```json
"scripts":{ ...,
    "deploy": " gh-pages -d build",
    "predeploy": "npm run build"
}
"homepage": "https://{githubのuser-name}.github.io/{project名}"

```
※pre-がついていたら、該当するコマンドが動く先にpre-コマンドが動く、後コマンドが動く
※project名は git remote -v で検索する。
※該当するhomepageがpublishedされる先


projectをbuildするため、以下のコマンドを叩く

```terminal 
npm run build
```

build後以下のようにbuildフォルダーが作成されることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/72545989-b068-dec7-841d-f72acb57f938.png)

buildされたものを配布する（deploy)

```terminal 
npm run deploy
```

実行後以下のようにpublishedが出力されたら、OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/8b508ddf-cc5c-0ac6-ee69-5157e5fcfddf.png)


明示されたhomepageに入ったら、配布されたことが確認できる
VMware Workstation 15 Playerでvmnetcfgを使って仮想ネットワークを設定する

# VMware Workstation Playerのネットワーク接続設定
よくやり方を忘れるので備忘録。

**VMware Workstation Player**のネットワーク接続設定は、`ブリッジ`、`NAT`、`ホストオンリー`、`カスタム`、`LANセグメント`が選択できます。

ただ、ブリッジ設定を行う際、**VirtualBox**のようにブリッジ設定に紐付ける物理インタフェースを選択することができず、複数物理インタフェースが存在する場合、意図したインタフェースがブリッジインタフェースに割り当たらない場合があります。

**[VMware Workstation Pro](https://www.vmware.com/jp/products/workstation-pro.html)**であれば設定可能ですが、**VMware Workstation Player**でもブリッジインタフェース設定を行えるようにしてみます。

# VMware Workstation Proのダウンロード（Windows版のみ）
**VMware Workstation Pro**のパッケージ内に含まれる`vmnetcfg`を使うため、**VMware Workstation Pro**をダウンロードします。
※今回は以下バージョンをダウンロード。

**[VMware Workstation 15.5 Pro](https://www.vmware.com/jp/products/workstation-pro/workstation-pro-evaluation.html)**

# vmnetcfgの抽出（Windows版のみ）
※[7-Zip](https://sevenzip.osdn.jp/)がインストールされていない場合、あらかじめ入手してください。

1. ダウンロードしたパッケージ（今回は`VMware-workstation-full-15.5.6-16341506.exe`）を右クリック→「7-Zip」→「開く」を選択します。

2. `Workstation.cab`の中にある`vmnetcfg.exe`を適当な場所にコピーします。

3. **VMware Workstation Player**のインストールパス（デフォルトの場合、`C:\Program Files (x86)\VMware\VMware Player`）に`vmnetcfg.exe`を管理者権限でコピーします。

`vmnetcfg.exe`が抽出出来たら**VMware Workstation Pro**パッケージは削除して問題ありません。

# vmnetcfgの設定（Windows版）
先ほどインストールディレクトリにコピーした`vmnetcfg.exe`を開くと以下の様な`仮想ネットワークエディタ`ウィンドウが開き、インタフェースの割り当て等を設定することができます。

ブリッジ設定はデフォルトでは赤枠の通り「自動」となっているため、ブリッジ先を物理インタフェースに設定すれば、`VMnet`に固定のインタフェースを割り当てられます。

![01_vmnetcfg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/ec615b39-f3fa-83c0-5a60-05a43f96ece4.jpeg)

また、`VMnet`は0～19まで設定できるので、空いている`VMnet`に仮想ネットワークの設定を行えば、物理インタフェースを複数ブリッジさせたり、ホストオンリーネットワークをセグメントを変えて複数作成したりすることもできます。

# vmnetcfgの設定（Linux版）
Linux版の場合、**VMware Workstation Player**に`仮想ネットワークエディタ`が含まれているため、**VMware Workstation Player**インストール後、以下コマンドを実行することで`仮想ネットワークエディタ`ウィンドウが開きます。

```shell:/usr/lib/vmware/bin/vmware-netcfg
$ sudo /usr/lib/vmware/bin/vmware-netcfg
```

![02_vmnetcfg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/537eb8d1-6962-3475-7932-9b200cce69fd.png)

# 各インタフェースの使い分け（2021/03/28追記）
先ほど`仮想ネットワークエディタ`で設定した仮想インタフェースを使い分けるためには仮想マシンの**VMXファイル**を直接編集する必要があります。

仮想マシンの仮想ディスク等が格納されているディレクトリに「**xxx.vmx**」というファイルが存在するため、仮想マシンが動作していた場合は仮想マシンを停止してからファイルをエディタで開きます。

`ethernetX.connectionType`という項目が存在するかを確認して、存在する場合は書き換え、存在しない場合は追加します。

以下の様な設定をインタフェース分追加して、画面を確認すると、ネットワークの種類に「**Custom**」という項目が追加されます。

```shell:追加設定（ethernet0の場合）
ethernet0.connectionType = "custom"
ethernet0.vnet = "/dev/vmnet0"
```

![capture_28032021_160131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3a45627f-591e-eb7e-465a-d9c3a594cd77.jpeg)

ちなみに、`ethernetX.connectionType = "custom"`だけ設定しても、後からGUI画面からプルダウンで選択できるため、GUI操作で良いなら`ethernetX.vnet`の設定は無くても問題ありません。
Active Admin 管理者画面からユーザー作成できない

## 経緯
```
rails g active_admin:resource user
```
を実行し、

```
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at
      t.datetime :remember_created_at
      t.timestamps null: false
    end
    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true  
  end
end
```

usersテーブルのカラムに合わせて

```
ActiveAdmin.register User do
  permit_params :email, :reset_password_token, :reset_password_sent_at, :remember_created_at
end
```
とpermit_paramsを書いて
<img width="992" alt="ユーザーを作成する(失敗).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639096/e68a25b8-2261-3d5d-8432-65ceef2c3b07.png">
フォーム入力後にユーザー作成ボタンを押したらユーザー作成できなかった。

そこでadmin_users.rbにならってuser.rbを書き換えたところ

```
ActiveAdmin.register User do
  permit_params :email, :password, :password_confirmation

  index do
    selectable_column
    id_column
    column :email
    column :current_sign_in_at
    column :sign_in_count
    column :created_at
    actions
  end

  filter :email
  filter :current_sign_in_at
  filter :sign_in_count
  filter :created_at

  form do |f|
    f.inputs do
      f.input :email
      f.input :password
      f.input :password_confirmation
    end
    f.actions
  end
end
```

以下のように表示が変わり
<img width="990" alt="ユーザーを作成する(成功).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639096/450e3eb9-abaa-99bc-99cb-d34f0abff588.png">
ユーザー作成できました！
ITIL 2011 editionによれば， 7ステップの改善プロセス

応用情報技術者令和元年秋期 午前問56

ITIL 2011 editionによれば， 7ステップの改善プロセスにおけるa，b及びcの適切な組合せはどれか。

〔7ステップの改善プロセス〕

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4f05cc7c-754d-2c5e-7827-486f0eda03dd.png)


ITIL 2011 editionに記載されている「7ステップの改善プロセス」とは、改善を①特定、②定義、**③収集、④処理、⑤分析、⑥提示、⑦実装**するために必要な手順を定義および管理するプロセスのことです。

設問では、ステップ4の処理、ステップ5の分析、ステップ6の提示が空欄になっているので、それぞれに該当する作業を当てはめます。
④処理 → データを処理する
⑤分析 → 情報とデータを分析する
⑥提示 → 情報を提示して利用する
と対応するので、正しい組合せは「ウ」となります。

実は、私は、⑤の情報について、疑問がありますよ。
情報はどこから来ますかね。

多分、説明①特定、②定義、③収集、④処理、⑤分析、⑥提示、⑦実装としては、
④はデータの収集、⑤はデータの処理、⑥はデータの利用、⑦データの改善
の方が理解しやすいではないかと思っておりますね。

または、
④はデータと情報の収集、⑤はデータと情報の処理、⑥はデータと情報の利用、⑦データと情報の改善
でもいいですね。

よく出題されるので、覚えてしかおかないですね。


From　https://www.ap-siken.com/kakomon/01_aki/q56.html
GitHub Actions で Heroku の CI 環境を構築する

# はじめに
本記事では、`GitHub Actions` 経由で、`Heroku` にアプリケーションをデプロイする CI 環境の構築方法を紹介します。

`GitHub Actions` で CI 環境を構築する記事は既にたくさんあるのですが、

- 「Heroku + GitHub Actions」の記事が少ない
    - 日本語記事はほとんど無かった
    - 英語記事はあるが内容が古いものが多かった

ことから、備忘録がてら、記事に残そうと思いました。

# 本記事のスコープ
本記事のスコープは以下を満たす人です。

- Heroku 上で、アプリケーションを既に稼働させている
- GitHub Actions で、アプリケーション の CI 環境を構築したい

# GitHub Actions で CI 環境を構築する
## 実現したいワークフロー
1. アプリケーションのリポジトリの `master` ブランチのコミットが進んだときにワークフローが起動する
2. `GitHub Actions` 実行環境で、アプリケーションのリポジトリにチェックアウトする
3. (テストを実行する。本記事では割愛)
4. Heroku に アプリケーションをデプロイする

## Heroku の API TOKEN をGitHub Actions に登録する
1. アプリケーションの `GitHub` リポジトリを開く
2. Settings > Secrets > New secret をクリック
3. 以下の情報を入力して保存する

```
Name: HEROKU_API_TOKEN
Value: [Heroku-CLI で heroku auth:token と入力して得られる API TOKEN の値]
```

## ワークフローを作成する
リポジトリ直下に`/.github/workflows/deploy.yml`を作成して、push すれば CI 構築完了。

```/.github/workflows/deploy.yml
name: deploy

on:
  push:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
          fetch-depth: 0
    - name: Deploy to Heroku
      env:
        HEROKU_API_TOKEN: ${{ secrets.HEROKU_API_TOKEN }}
        HEROKU_APP_NAME: [Heroku上で登録しているアプリ名]
      if: github.ref == 'refs/heads/master' && job.status == 'success'
      run: |
        git push https://heroku:$HEROKU_API_TOKEN@git.heroku.com/$HEROKU_APP_NAME.git origin/master:master
```

`fetch-depth: 0` が重要で、これが無いと `actions/checkout@v2` プラグインのチェックアウトが `shallow clone` となってしまいます。**Heroku 上で独自管理している Git リポジトリに push することでデプロイを行う関係上、最新コミットしか取得しない shallow clone をして push すると、コミットログの対応が取れずエラーとなってしまします**。

元々、`actions/checkout` プラグインにこの仕様が無かったからなのか、「Heroku + GitHub Actions」の記事を探すと、`fetch-depth: 0` が無い記事ばかり見つかるので、気をつけてください。自分はこの部分で若干ハマってしまいました。

# おわりに
[ AkhileshNS/heroku-deploy ](https://github.com/marketplace/actions/deploy-to-heroku) というプラグインもあるので、より複雑な処理を簡潔に記述したいと思う人は試してみると良いと思います。自分は、不要なemailアドレス情報を登録したくなかったので、採用しませんでした。

以上で、GitHub Actions で Heroku の CI 環境を構築する方法の解説はおしまいです。
何か突っ込みポイントなどあれば、ご指摘いただければ幸いです。 

# 参考
- [GitHub Docs: ワークフローの設定と管理](https://docs.github.com/ja/actions/configuring-and-managing-workflows)
- [Checkout V2](https://github.com/actions/checkout)
- [Heroku CLI Authentication](https://devcenter.heroku.com/articles/authentication)
- [Heroku Git rejects pushes from shallow clones](https://devcenter.heroku.com/changelog-items/775)