OmniAICreator/Qiita-1.07M huggingface dataset:
terraformとはなんなのか？

最近terraformを使う機会があったのでメモがてら残しておこうと思います。
# 対象者
* terraformに興味はあるが実際に触ったことがない人
* IaCを触ってみたい人
* 大雑把にterraformの概念だけ知っておきたい人

# terraformとは？
terraformはIacと呼ばれるツールの一種で、インフラの構成をソースコードとして管理できる機能です。
注意点として、あくまで管理できるのはインフラ構成であって、サーバー内のユーザー設定やライブラリのインストールなどはできません。
もし、サーバー内も管理したい場合は、imageでデプロイするか、ansibleなどを併用して管理していく必要が出てきます。

# terraformの実行順序
実際にファイルを書く前に、terraformが実際に動く順序だけ軽く記載します。terraformのCLIが入っている前提です。

* terraformファイルを書く
* terraform init で初期化する
    * 対象cloudへの認証処理が走る
    * 依存ファイルを取得してくる
    * リソースなどメタ情報が詰まったファイル(state ファイル)が生成される
* 実行結果を確認しながらファイルを修正
* 実際に実行してインフラなどを立ち上げる

明示的にインストールコマンドを叩かないなどの違いはありますが、感覚的には、npmやgoのget moduleなどに近いです。

# terraformの特性
terraformはjsonなどのような汎用的なファイル形式で管理するのではなく、独自の拡張子のtfファイルとプログラミング言語で処理を記述します。以下は公式で記載されているサンプルです。

```terraform
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }

  required_version = ">= 0.14.9"
}

provider "aws" {
  profile = "default"
  region  = "us-west-2"
}

resource "aws_instance" "app_server" {
  ami           = "ami-830c94e3"
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleAppServerInstance"
  }
}

```

## terraform 
一番最初に書かれている `terraform` と言うブロックはterraform自体の設定をするところです。依存するライブラリのバージョンを指定したり、 メタ情報が詰まったstateファイルを置く場所を指定できます。

## provider 
`provider` はAWSなどのcloudと通信するための情報の指定です。
リージョンや認証情報などがそうですね。
今回はAWSのprofileを指定して認証情報を読みとって指定し、リージョンは明示的に指定しています。

他のproviderを見たい場合は以下から参照してください。
https://registry.terraform.io/browse/providers

## resource
`resource` はDBやサーバーなどの実際に構築するインフラの指定です。
resource の後ろの文字列はそれぞれ、リソース名,変数名を指定します。
リソース名でAWSのlamdaやdynamoなどのインフラを指定して、設定内容をresourceブロックの中に書いていきます。

変数名はresouceで指定したインフラの中身を参照したい時に使います。以下のような感じですね。

```terraform
resource "aws_instance" "app_server" {
  ami           = "ami-830c94e3"
  instance_type = "t2.micro"
  name ="test"


  tags = {
    Name = "ExampleAppServerInstance"
  }
}

resource "aws_db" "db" {
    # app_serverの情報を参照
    name = app_server.name
}

```

実際のawsのresourceなどは以下に書いてあるので、確認してみてください。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs

# 初期化と確認と実行

## 初期化

さてファイルが書けたら、terraformコマンドの
`terraform init`を実行しましょう。これで初期化と認証が走ります。無事providerで指定したプラットフォームにアクセスし、依存ファイルを取得できたら初期化完了です。成功すると、ファイルが置いてあるディレクトリに
`.terraform`
`.terraform.lock.hcl`
が生成されます。

## 確認
`terraform plan`を実行すると、以下のことをチェックしてくれます。

* 使用しているアカウントの権限のチェック
    * AWSでEC2インスタンを立ち上げる権限を持っているかなど
* 文法のチェック
* 最終的に生成されるリソースのチェック
    * DBのアカウントなど

## 実行
`terraform apply`を実行すると、実際にリソースを生成してくれます。
正常終了した場合は、実際にプラットーフォームのコンソールで、指定したリソースが生成されているかを確認してみましょう。

# 最後に
インフラは秘伝のタレになりがちなので、コードで管理できれば色々嬉しいですね。
それでは良いterraform ライフを

# 引用
https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started
PHP 変数から変数名を取得する（PHP 変数名から変数を取得する）

どうしてこんな簡単な事に今まで気づかなかったのだろう...
変数から変数名を取得しようとする場合、変数名はすでにわかっているものなので、逆に、
変数名から変数を取得してもいいのです。

## 動機
PHP デバッグ時、「変数名・値」の対応表を出力したいことがあります。

変数が少ない時は、

```php
echo '$変数名1 = '.$変数名1;
echo '$変数名2 = '.$変数名2;
```

で十分なのですが、

「多くの変数を、いろんな場所で、どのように変化しているかチェックしたい」
「時々、変数のリストを変更したい（増やしたい）」
「チェックのための行が長すぎるのは嫌！」

そうなってくると、たくさんの場所で、
「変数の配列をユーザー関数で処理したい」
というニーズが出てきます。

ところが、ユーザー関数の内部では「スコープが異なる」ため、ユーザー関数の外部の変数を内部で直接扱う事はできません。「ユーザー関数に（引数として）変数を引き渡す」という作業が必要になります。

しかし、
「**変数**から**変数名**を取得する」のはなかなか大変なようです。そこで発想を転換し、
「**変数名**から**変数**を取得する」ことにしました。これなら get_defined_vars() を使って、割と簡単にできます。

## get_defined_vars() 
get_defined_vars() は、それが呼ばれた時点のスコープの全変数を格納した配列を返します。仮に、その配列を`$gdv`とすると、変数名→値（`$gdv[変数名]`）への変換が可能になります。
 この関数と変数名をユーザー関数の引数として渡せば、ユーザー関数のスコープの中でも外部の
(訂正前)~~変数を扱えるようになります。（ユーザー関数に、変数名と変数を同時に渡す事に成功）~~
(訂正後)変数の値を取得できるようになります。（ユーザー関数に、変数名とその値を同時に渡す事に成功）

変数をチェックしたい場合、変数名は初めからわかっているはずなので、
チェックしたい変数名を、初めからリスト（配列）化しておくことができます。
もし仮に、変数名をプログラムで組み立てている場合は、組み立てられた変数名が何かの変数に格納されているはずなので、それをリストに加えるようにします。


そのリスト（配列）を下記のユーザー関数に渡すと、変数名と値の対応表(HTMLの table 要素)が返されます。

なお、変数名のリスト（配列）はスクリプトの最初の方で変数（リスト変数）に定義しておき、各変数をチェックしたいそれぞれの場所では、ユーザー関数にリスト変数を引き渡すようにします。そうすると、全ての変数名リストを（1か所で）簡単に更新することができるようになります。

## 使用例

```php
/*
 * get_value_table()
 * 変数名の配列を、「変数名 | 値」の表に変換する
 * $table = get_value_table($name_array, get_defined_vars());
 * 第1引数には、チェックしたい変数名の配列を指定する
 * 第2引数には、必ず get_defined_vars() を指定する
 * 第3引数に false を指定すれば、「未定義（undefined）」を非表示にする
 * 第4引数には、table 要素の属性を指定する
 * 第5引数には、td 要素の属性を指定する
 */
function get_value_table($name_array, $gdv, $show_undefined = true, $table_attr = 'border=1', $td_attr = 'style="padding:0.3em"') {
	$name_value_table = [];
	foreach ($name_array as $name) :
		if (!array_key_exists($name, $gdv)) :
			if ($show_undefined===true) :
				$value = '未定義（undefined）';
			else :
				continue;
			endif;
		elseif (is_bool($gdv[$name])) :
			$value = $gdv[$name]? 'true' : 'false';
		elseif (is_numeric($gdv[$name]) || is_string($gdv[$name])) :
			$value = $gdv[$name];
		elseif (is_array($gdv[$name])) :
			$value = '<pre>'.print_r($gdv[$name],true).'</pre>';
		else :
			$value = (PHP_VERSION_ID >= 80000)? get_debug_type($gdv[$name]) : get_type($gdv[$name]);
		endif;
		$name_value_table[] = '<tr><td '.$td_attr.'>$'.$name.'<td '.$td_attr.'>'.$value;
	endforeach;
	return '<table '.$table_attr.'>'.implode("\n", $name_value_table).'</table>';
} // (f) get_value_table()
# 例
# 変数の定義
$_1 = 'some value';
$_2 = 'next value';
$_3 = [1,2,3];
class MyClass{}
$_4 = new MyClass();
$_5 = false;
$_6 = null;
$name_array = ["_1", "_2", "_3", "_4", "_5", "_6", "_7"]; // 変数名の配列（リスト変数）
echo get_value_table($name_array, get_defined_vars()); // 「変数名・値」の表を表示
```

## 結果
下記のような表が表示されます。
| `$_1`  | some value　 　　|
| `$_2`  | next value　　　　|
| `$_3`  | Array　　　　 　　|
|　　　|　(　　　　　　　　|
|　　　|　　[0] => 1　 　　|
|　　　|　　[1] => 2　 　　|
|　　　|　　[2] => 3　 　　|
|　　　|　)　　　　　　　　|
| `$_4`  | MyClass　　　　　|
| `$_5`  | false　　　　　　　|
| `$_6`  | null　　　　　　　　|
| `$_7`  | 未定義（undefined）|
Python で半角スペース区切りの整数を受け取るときの典型的な書き方

#### Python で半角スペース区切りの整数を受け取るときの典型的な書き方

```
N, M, K = map(int, input().split())
```
・Python ではいくつかの変数を、リストを使ってまとめて初期化することができます。今回のように N, M, K = hoge と書くと、代入されるのが長さ 3 のリストであるとき、そのリストの 0, 1, 2 番目の要素がそれぞれ N, M, K に代入されます。

・N, M, K = map(int, input().split()) は Python で半角スペース区切りの整数を受け取るときの典型的な書き方のひとつです。右辺では input().split() の各要素に int関数 を適用しています。

```
N, M, K = map(int, input().split())

for i in range(N):
    a = [int(j) for j in input().split()]
    ans = 0
    for j in range(M):
        if a[j] == K:
            ans += 1
    print(ans)
```
GCP Pub/Subのメッセージに「属性」を追加してみた

# 概要

GCP Pub/Subのメッセージに「属性」を追加して Cloud Functions でそれを読み込めるかを試してみました。

# Cloud Functionsのソース

```python:
import base64

def hello_pubsub(event, context):
    pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    print("pubsub_message : ", pubsub_message)
    print(event)
    
    # 属性(test_val1)がセットされているかチェック
    if 'attributes' in event and event.get('attributes') is not None and 'test_val1' in event['attributes']:
        print("attribute.test_val1 : ", event['attributes']['test_val1'])
    else:
        print("test_val1 is not set.")

    # 属性(test_val2)がセットされているかチェック
    if 'attributes' in event and event.get('attributes') is not None and 'test_val2' in event['attributes']:
        print("attribute.test_val2 : ", event['attributes']['test_val2'])
    else:
        print("test_val2 is not set.")
```

# pub/subのメッセージのパブリッシュ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397664/9c39e238-9d3c-1f5c-abf6-aacfe189c92f.png)

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397664/88629334-f596-35f5-2959-1d8c10af3f85.png)
スタバiOSアプリのスクリーンショットでアップルウォッチで支払うショートカット

# Shortcutのlink
https://www.icloud.com/shortcuts/6967c889528146b9ac2021f8634ea65f
# 使い方
**（レジの列に並ぶ時）**
1. Starbucksアプリで、QRコードが表示される支払い画面を開いて用意する
2. Shortcut起動(e.g. サイドボタンをタップしてSiriにささやき"starbucks")
3. 文字盤を「追加」
**（watch文字盤にあるQRを提示する）**
4. Apple WatchのWatch Faceで支払い

# Shortcutの中身:
1. Open App: Starbucks
2. Take Screenshot
3. Crop Screenshot  
**（iPhone 12 Proの設定）**   
  Position: Custom  
  X: 740  
  Y: 1035  
  Width: 427  
  Height: 520
4. Share Cropped Image
【デザインパターン】JavaScriptで学ぶDecorator

#はじめに
フロントエンドのコードをもっときれいに書きたいという思いから、デザインパターンについて学んでみることにしました。
今回はDecoratorについてまとめました。

#Decorator
Decoratorは継承を使わずに既存のクラスを拡張するための、構造に関するデザインパターンの一つです。
継承と同様に、SOLIDの単一責任の原則やオープン・クローズドの原則に違反しない形で機能拡張を行えるようになります。

Decoratorのコンストラクタ引数で既存オブジェクトを読込み、メンバとして設定するような形で実現します。
継承はコンパイル時、Decoratorはプログラムの実行時が機能拡張のタイミングとなります。

https://qiita.com/suzuki0430/items/b13c7c1f637e7cd2146d

https://qiita.com/suzuki0430/items/b0e2a2c294d81ecdefba

#実装例
以下の`Circle`クラスに、Decoratorで色に関する情報(color)を加えることを考えます。

```js
class Shape {}

class Circle extends Shape
{
  constructor(radius=0)
  {
    super();
    this.radius = radius;
  }

  resize(factor)
  {
    this.radius *= factor;
  }

  toString()
  {
    return `A circle of radius ${this.radius}`;
  }
}
```

Decoratorとして`ColoredShape`クラスを用意し、コンストラクタの引数として`Color`クラスのインスタンスをラッピングします。

```js
class ColoredShape extends Shape
{
  constructor(shape, color)
  {
    super();
    this.shape = shape;
    this.color = color;
  }

  toString()
  {
    return `${this.shape.toString()} ` +
      `has the color ${this.color}`;
  }
}
```
`circle`インスタンス、`redCircle`インスタンスをそれぞれつくって`toString()`を出力すると、確かに以下のような結果となります。

```js
let circle = new Circle(2);
console.log(circle.toString());

let redCircle = new ColoredShape(circle, 'red');
console.log(redCircle.toString());
```

```
A circle of radius 2
A circle of radius 2 has the color red
```

#参考資料

https://www.udemy.com/share/101Bpe3@Wapeed1JE99zGyDGeFWUwPUAL8i7H6iKQ0y-TtL-LINIEnzqVstotj7Ap-XFh22W/
python3 多重ループ(記録）

##多重ループ
Cの配列の中からｓの中で該当するものを判定する。
今回はforの中にforがあることと、inで文字列を確認することがポイント。

```
m = int(input())

#[""]文字列の配列を作成するため
c = [""]*m

for i in range(m):
    c[i] = input()  
    
n = int(input())

s = [""]*n

for l in range(n):
    s[l] = input()

for i in range(m):
    for l in range(n):
        if c[i] in s[l]:
            print("YES")
        else:
            print("NO")
```

入力例2
2
c
d
2
cat
dog

出力例2
YES
NO
NO
プログラムを高速化するにはどの書き方が適切か

組み込みでCを使うとき、どの書き方が高速なのか知りたかったので、単純なプログラムでどの書き方が高速にできるか検証してみました。
# 環境
開発環境：MPLAB X IDE v5.50
使用言語：C言語
コンパイラ：XC8 v2.32
マイコン：PIC16F73
クロック周波数：16MHz

# 基本のプログラム
PORTCのRC0をトグルするプログラムです。RC0がLOWの時はRC0をHIGHにし、RC0がHIGHの時はRC0をLOWにします。
MPLAB X IDEのシミュレータのストップウォッチ機能で測定しました。

# 結論
単純な処理はif文が速いのでif文を使ったほうが良さそうです。動作は同じでも、プログラムによって処理時間が大幅に変わることが分かりました。

| プログラム | サイクル数 | 実行時間 |
| -- | -- | -- |
| if文 | 7～8 | 1.75～2μs |
| switch文 | 16～17 | 4～4.25μs |
| NOT代入 | 12～13 | 3～3.25μs |
| 排他的論理和代入 | 12 | 3μs |
| 三項演算子 | 12～13 | 3～3.25μs |

# if文
```c:main.c
#include <xc.h>

void main(void) {
    TRISC = 0b00000000;
    PORTC = 0b00000000;
    while(1){
        if(PORTCbits.RC0 == 0){
            PORTCbits.RC0 = 1;
        }
        else{
            PORTCbits.RC0 = 0;
        }
    }
}
```
測定結果（1ループ当たり）
7～8サイクル（1.75～2μs）
# switch文
```c:main.c
#include <xc.h>

void main(void) {
    TRISC = 0b00000000;
    PORTC = 0b00000000;
    while(1){
        switch(PORTCbits.RC0){
            case 0:
                PORTCbits.RC0 = 1;
                break;
            default :
                PORTCbits.RC0 = 0;
                break;
        }
    }
}
```
測定結果（1ループ当たり）
16～17サイクル（4～4.25μs）
# NOT代入
```c:main.c
#include <xc.h>

void main(void) {
    TRISC = 0b00000000;
    PORTC = 0b00000000;
    while(1){
        PORTCbits.RC0 = ~PORTCbits.RC0;
    }
}
```
測定結果（1ループ当たり）
12～13サイクル（3～3.25μs）
# 排他的論理和代入
```c:main.c
#include <xc.h>

void main(void) {
    TRISC = 0b00000000;
    PORTC = 0b00000000;
    while(1){
        PORTCbits.RC0 ^= 1;
    }
}
```
測定結果（1ループ当たり）
12サイクル（3μs）
# 三項演算子
```c:main.c
#include <xc.h>

void main(void) {
    TRISC = 0b00000000;
    PORTC = 0b00000000;
    while(1){
        PORTCbits.RC0 = (PORTCbits.RC0 == 0) ? 1 : 0;
    }
}
```
測定結果（1ループ当たり）
12～13サイクル（3～3.25μs）
AWS Cognito にトライしてみた

# なにをしたか
* AWS Cogniteでログイン周りを作れそう？と思ったのでその調査

# 結論
* できたよ
* 最小構成は、登録（Signup）、有効化（Activation）、サインイン（SignIn）でできそう

# 本編
## 実施内容（基本的にはこの通り）
* https://www.tdi.co.jp/miso/amazon-cognito-javascript
* https://www.tdi.co.jp/miso/amazon-cognito-activation-sign-in

## アレンジ
jsのパスが３画面で違ってる部分は合わせた
### 画面遷移を追加
#### signup -> activation

```js:
	     // サインアップ成功の場合、アクティベーション画面に遷移する
			location.replace('activation.html');
```
#### activation -> signin
    
```js:
            // アクティベーション成功の場合、サインイン画面に遷移
			location.replace('signin.html');
```

## 追加機能（Resignup）が必要？
* Signupの次の日に、Activationを行おうとしたら、Expiredなエラーが出た。
    * Resigunpを作らなければいけない？と思ったが運用で回避できることがわかった。
    * 運用での回避方法：ユーザ削除してしまえばいい
* ユーザを無効化
![スクリーンショット 2021-09-04 9.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/d33a619a-66e0-af31-9d0c-b4b25c341e20.png)
* ユーザを削除（無効化後に削除できる。）
 ![スクリーンショット 2021-09-04 9.39.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74969/20b75304-e830-a459-d0a5-4cf103a1eb0a.png)

* 運用するなら必要だが、内輪で試す（Agileな車の例でいう、スケートボード）くらいならこれで十分と思われ

# 運用に向けては下記のあたりの調査は必要そう。（Agileな車の例でいう、バイクのあたりまで）
* コードがExpiredしたときの再発行 
* Password再発行
* 認証後と認証前のアクセスを分ける方法
* Cognitoのプール情報等を環境変数にする

以上。
【CSS】CSSのスタイルが効かないとき〜カスケード・詳細度・継承〜

# はじめに
CSSのスタイルが効かないときは```カスケード・詳細度・継承```が原因となることが多くあるので、まずは疑ってみるとよいです。スタイルの優先度を忘れていたりすると解決に時間がかかったりします。
今回カスケード・詳細度・継承についてまとめましたので、CSSのスタイルが効かないとき思い出してみてください。

## カスケードとは

* CSSの順序
* [MDNドキュメント　カスケード](https://developer.mozilla.org/ja/docs/Web/CSS/Cascade#%E3%82%AB%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%89%E9%A0%86)
* 基本的にはあと勝ちと考えておけば良い

下記のコードの場合、後に書いた```h1{color: blue;}```が適用される

```html:html
<h1 id="title" class="a b c d e f g h i j k">h1タグです</h1>
```
```css:css
h1 {
  color: red;
}

h1 {
  color: blue;
}
```

## 詳細度

* 詳細度のスコアリングでCSSの適用されるものが変わる
* [MDNドキュメント 詳細度のスコアリング](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#specificity_2)

```html:html
<h1 id="title" class="a b c d e f g h i j k">h1タグです</h1>
```

下記のコードの場合、詳細度のスコアが高い```.a{color: blue;}```が適用される

```css:css
h1 {
  color: red;
}

.a {
  color: blue;
}

h1 {
  color: yellow;
}
```

## カスケードの計算を無効化する```!important```

* スタイルに```!important```をつけると、カスケードの計算を無効化し、重要とする
* MDNにも書いてあるが、基本的には使わないほうが良い
* [MDNドキュメント  !important](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#!important)

```html:html
<h1 id="title" class="a b c d e f g h i j k">h1タグです</h1>
```

下記のコードの場合、```!important```を書いた```h1{color: yellow !important;}```が適用される

```css:css
h1 {
  color: red;
}

.a {
  color: blue;
}

h1 {
  color: yellow !important;
}
```


## 継承について

* 継承とは、親要素から子要素へプロパティ値を引き継ぐこと
* ```inherit```: 親要素から子要素へプロパティ値を引き継ぐ
* ```initial```: ブラウザの持っているデフォルト値をスタイルに当てる
* ```unset```: inheritがあれば、inheritが適用される。なければ、initialが適用される

```html:html
<ul>
      <li>リンク →<a href="https://www.kddi.com/">KDDI</a></li>
      <li>リンク →<a href="https://www.nttdocomo.co.jp/">DOCOMO</a></li>
      <li>リンク →<a href="https://www.softbank.jp/">ソフトバンク</a></li>
</ul>
```

```css:css
li {
  color: red;
}

li a[href*="kddi"] {
  color: inherit;
}

li a[href*="docomo"] {
  color: initial;　←　黒になる
}

li a[href*="soft"] {
  color: unset;
}

```

# すべてのプロパティの値をリセットする
* ```all: unset;```を使うとプロパティの値をリセットできる

```html:html
<div class="fix">こちらはdivタグです。</div>
```

```css:css
div {
  background-color: orange;
  border: 3px solid black;
}

.fix {
  all: unset;
}
```
Windows11にdockerをインストールすると動かなくなった

## 何が起きたか

Windows 11 (22000.176) 2021/9/4最新update済み に 
WSL2 の docker.io を入れて
Docker Desktop 4.0 (最新)をインストールし、ログアウトしたら
explorer が起動しなくなった。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/68c4d956-9404-2ad5-622e-2bb590149962.png)


## コントロールパネルを起動する方法

* タスクマネージャーを起動 (`Control - Shift - Esc`キーを同時押し)
* メニューバーの ファイル - 新しいタスクの起動 をクリック
* コントロールパネルを起動するため、 `control` を実行

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/156822e1-ade7-eb83-3ae8-0e6aca833588.png)

docker.io と Docker Desktop をアンインストールしたが解決しなかった。

## そのほか便利なコマンド

* cmd
* msedge
【Realm】relationship と insert

![realm-java 10.8.0](https://img.shields.io/badge/realm--java-10.8.0-6E60F9)

`RealmObject` 派生オブジェクトが他の `RealmObject` 派生オブジェクトの参照を持つ場合、
参照元のオブジェクトを insert （もしくは update）すると参照先のオブジェクトも insert（update）される。

例えば次のようなクラスが定義されている場合を考える。

```plantuml
class From extends RealmObject {
  @PrimaryKey id
  name
}
class To extends RealmObject {
  @PrimaryKey id
  name
}

From o- To
```

```Kotlin
import io.realm.Realm
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where

open class To(
    @PrimaryKey
    var id: Int,
    var name: String,
) : RealmObject() {
    constructor() : this(0, "")

    override fun toString(): String = name
}

open class From(
    @PrimaryKey
    var id: Int,
    var name: String,
    var to: To? = null,
) : RealmObject() {
    constructor() : this(0, "")

    override fun toString(): String = name
}
```

次のように `to1` オブジェクトを参照する `from1` オブジェクトを `insert` すると、`to1` も insert される。

```Kotlin
val realm = Realm.getDefaultInstance()

val to1 = To(1, "to1")
val from1 = From(1, "from1", to1) // to1 の参照を持つ。

realm.executeTransaction { transactionRealm ->
    // from1 だけを insert する。
    transactionRealm.insert(from1)
}

realm.where<To>().findAll().also {
    // to1 も insert されていることを確認する。
    println(it) // > [to1]
}
```

また次のように `to1_1` オブジェクトが insert 済みの状態で、主キーの値が `to1_1` と同じであるオブジェクト `to1_2` を参照する `from1` を `insertOrUpdate` すると、`to1_1` が `to1_2` に更新される。

```Kotlin
val realm = Realm.getDefaultInstance()

val to1_1 = To(1, "to1_1")
val to1_2 = To(1, "to1_2") // 主キー（id）の値が to1_1 と同じ。
val from1 = From(1, "from1", to1_2) // to1_2 の参照を持つ。

realm.executeTransaction { transactionRealm ->
    // to1_1 と from1 を insert/update する。to1_2 はしない。
    transactionRealm.insert(to1_1)
    transactionRealm.insertOrUpdate(from1)
}

realm.where<To>().findAll().also {
    // to1_1 は存在せず to1_2 だけが存在することを確認する。
    println(it) // > [to1_2]
}
```

なお次のように `from1` を **`insertOrUpdate` ではなく `insert`** すると、例外がスローされる。

```Kotlin
val realm = Realm.getDefaultInstance()

val to1_1 = To(1, "to1_1")
val to1_2 = To(1, "to1_2") // 主キー（id）の値が to1_1 と同じ。
val from1 = From(1, "from1", to1_2) // to1_2 の参照を持つ。

realm.executeTransaction { transactionRealm ->
    // to1_1 を insert する。
    transactionRealm.insert(to1_1)
    try {
        // from1 を insertOrUpdate ではなく insert する。
        transactionRealm.insert(from1)
    } catch (e: Throwable) {
        // 例外がスローされることを確認する。
        println(e) // > io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: 1
    }
}
```

／以上
自宅SCMサーバー再構成　構築編11　コンテナ間通信確認

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（11）
##11.Gitlab/Redmineのコンテナ間通信疎通確認
###11-1.local-linkの詳細確認
ホストのコンソールで
```docker network inspect local-link```

```
[
    {
        "Name": "local-link",
        "Id": "ローカルリンクのID",
        "Created": "作成日時",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "ローカルリンクのサブネット",
                    "Gateway": "ローカルリンクのゲートウェイ"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "Gitlabコンテナ": {
                "Name": "gitlab",
                "EndpointID": "GitlabコンテナのエンドポイントID",
                "MacAddress": "Gitlabコンテナのマックアドレス",
                "IPv4Address": "GitlabコンテナのIPアドレス",
                "IPv6Address": ""
            },
            "Redmineコンテナ": {
                "Name": "redmine",
                "EndpointID": "RedmineコンテナのエンドポイントID",
                "MacAddress": "Redmineコンテナのマックアドレス",
                "IPv4Address": "RedmineコンテナのIPアドレス",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
```
gitlabとredmineのコンテナがローカルリンク接続されていることが確認できます。

次の工程

https://qiita.com/YCS_Project/items/a40aed7a027b2bd34a33
自宅SCMサーバー再構成　構築編10　Github_Hook プラグインインストール

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（10）
##10.RedmineコンテナへGithub_Hook プラグインをインストール
###10-1.プラグインのインストール
redmineコンソールへ移動
```docker exec -it redmine /bin/bash```

redmineコンソールでディレクトリ移動
```cd /usr/src/redmine/plugins```

Github＿Hookプラグインのクローン
```git clone https://github.com/koppen/redmine_github_hook```

ホストへ戻る
```exit```

Redmineコンテナの再起動
```docker restart redmine```

https://www.redmine.org/plugins/redmine_github_hook

※上記を参考にしました。

###10-2.プラグインの確認
ブラウザで
```http://127.0.0.1:3000```
でRedmineを表示しログイン

```http://127.0.0.1:3000/admin/plugins ```
でプラグインがインストールされているか確認
![redminepl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/cc5288fb-e867-bcd0-1298-a4f93f79e32b.png)

次の工程

https://qiita.com/YCS_Project/items/53fff27ffd68840362cd
自宅SCMサーバー再構成　構築編9　コンテナ動作確認

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（9）
##9.各コンテナの稼働確認
###9-1.Portainer稼働確認
ブラウザで
```http://127.0.0.1：9000```
ユーザー名
パスワード
を入力しログイン
![portainer0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/eb7a0839-880f-bb2f-a764-cba5e7b209b7.png)
local
をクリックしダッシュボードを表示
![portainer1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/710c52f7-c7c0-06e9-3308-892ef8362ce1.png)

Containers
をクリックしコンテナと稼働状態を確認
![portainer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/14420407-1833-03fb-b44a-879b26a879e9.png)


###9-2.Gitlab稼働確認
ブラウザで
```http://127.0.0.1：9080```
ユーザー名
パスワード
を入力しログイン
![2021-08-31 101125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/a7fa98e1-419c-0dbb-2f58-bc24f9e6ccde.png)

###9-3.Redmine稼働確認
ブラウザで
```http://127.0.0.1：3000```
ログインID
パスワード
を入力しログイン
![2021-08-31 101630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/633b172f-e878-6f53-3a2f-4f6b585c1991.png)

次の工程

https://qiita.com/YCS_Project/items/ae1fe376296f1a4a7b93
自宅SCMサーバー再構成　構築編8　Redmineコンテナ作成

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（8）
##8.Redmineコンテナの作成
###8-1.格納ディレクトリ作成
```mkdir /usr/src/redmine```
```cd /usr/src/redmine```

###8-2.docker-compose.yml作成
```docker-compose.yml
version: '3.7'
services:
    redmine:
        container_name: redmine
        image: redmine
        restart: always
        ports:
            - 3000:3000
        volumes:
            - ./data/plugins:/usr/src/redmine/plugins
            - ./data/themes:/usr/src/redmine/public/themes
            - ../gitalign:/usr/src/redmine/gitalign
        environment:
            REDMINE_DB_MYSQL: redmine-db
            REDMINE_DB_PASSWORD: redmine
        networks:
            - default
            - local-link
    redmine-db:
        image: mysql:5.7
        container_name: redmine-db
        restart: always
        ports:
           - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: redmine
            MYSQL_DATABASE: redmine
        volumes:
            - ./data/db:/var/lib/mysql
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
networks:
    local-link:
        external: true
```

https://hub.docker.com/_/redmine

から流用しました。
※REDMINE_DB_PASSWORD、MYSQL_ROOT_PASSWORDは適宜変更してください。
###8-3.docker-compose実行
```docker-compose up -d```

###8-4.Redmine起動
ブラウザで
```http://127.0.0.1：3000```
を開く

###8-5.adminパスワード設定
右上のログインを押下し
```admin```
```admin```
で一旦ログイン後
メッセージに従って新しいパスワードを入力

次の工程

https://qiita.com/YCS_Project/items/2b7e075c59bd34c72d67
自宅SCMサーバー再構成　構築編7　Gitlab-ceコンテナ作成

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（7）
##7.Gitlab-ceコンテナの作成
###7-1.格納ディレクトリ作成
```mkdir /usr/src/gitlab```
```cd /usr/src/gitlab```

###7-2.docker-compose.yml作成
```docker-compose.yml
version: "3.7"
services: 
    gitlab: 
        container_name: gitlab
        image: gitlab/gitlab-ce:latest    
        restart: always 
        environment:
            GITLAB_OMNIBUS_CONFIG: | 
                external_url 'http://local.gitlab.com/'
                nginx['listen_port'] = 80
                nginx['listen_https'] = false
                gitlab_rails['time_zone'] = 'Asia/Tokyo'
        ports: 
            - '9022:22'
            - '9080:80'
            - '9443:443'
        volumes: 
            - ./data:/var/opt/gitlab
            - ./logs:/var/log/gitlab
            - ./config:/etc/gitlab
            - ../gitalign:/var/opt/gitalign
        networks: 
            - default
            - local-link
networks: 
    local-link: 
        external: true
```
https://gitlab-docs.creationline.com/omnibus/docker/

から流用しました。
###7-3.docker-compose実行
```docker-compose up -d```

###7-4.パスワードのリセット
gitlabコンソールへ移動
```docker exec -it gitlab /bin/bash```
gitlabコンソールで
```gitlab-rake "gitlab:password:reset"```
```root```
パスワードの入力

※初期設定の管理者パスワードが使用できなかった為下記参照しました。

https://docs.gitlab.com/ee/security/reset_user_password.html#rails-console

###7-5.Gitlab起動
ブラウザで
```http://127.0.0.1：9080```
を開く
7-4.で設定したパスワードでログイン
###7-6.日本語化
右上の
![022638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/4fe01c20-b9f7-aa1e-5d50-92156a1a8d82.png)
アイコンをクリックし
プルダウンメニューの
Preferences
を選択
LocalizationのLanguageから日本語を選択
SaveChangesボタンをクリック
ページを再読み込みし日本語表示

次の工程

https://qiita.com/YCS_Project/items/7045a8ad1d1f84c2ddd5
自宅SCMサーバー再構成　構築編6　Docker Compose/Portainerインストール

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（6）
##6.Docker Compose/Portainerのインストール
###6-1.Docker Composeダウンロード
```curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose```
###6-2.Docker Composeに実行権限を付与
```chmod +x /usr/local/bin/docker-compose```
###6-3.Portainerイメージダウンロード
```docker pull portainer/portainer```
###6-4.Portainer起動
```docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer```
###6-5.Portainerセットアップ
ブラウザで
```http://127.0.0.1:9000```
を開く

ユーザー名
パスワード
パスワード確認
を入力

ローカルを選択
connect押下

次の工程

https://qiita.com/YCS_Project/items/e84c2891eced29dd1301
自宅SCMサーバー再構成　構築編5　Dockerインストール

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（5）
##5.Dockerのインストール（20.10.7）
（3）端末上で
###5-1. 必要なパッケージのインストール
```yum install -y yum-utils device-mapper-persistent-data lvm2```
※yum updateで既にインストール済みor最新バージョンの場合は不要

###5-2.リポジトリの追加
```yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo```
###5-3.Docker CEインストール
```yum -y install docker-ce```
###5-4.Docker CEサービスの有効化
```systemctl enable docker```
※次回から自動起動
###5-5.Docker CEサービスの開始
```systemctl start docker```
###5-6.Docker ローカルネットワークの作成
```docker network create local-link```

https://docs.docker.jp/engine/reference/commandline/network_connect.html

※上記参考にしました。

次の工程

https://qiita.com/YCS_Project/items/0101693f919377232622
pythonフラグ管理　（記録）

##Python3の場合
```python
n = int(input())

flag = False

for i in range(n):
    a = int(input())
    if a == 7:
        flag = True
```
まずは flag を False にしておき、a_1, ..., a_n の中に 7 が見つかったときにはこれに True を再代入します。こうすることで、7 がひとつでもあった場合には最終的に flag の値は True となり、そうでない場合には False となります。

```
if flag:
    print("YES")
else:
    print("NO")
```

flag の値に応じて条件分岐し、flag が True のときには YES を、そうでないときには NO を出力するようにすれば OK です。なお、if文の条件文はそのブール値だけが見られるので、if flag == True: などとせずとも、 if flag: と書けば「flag が True のとき」という意味になります。
自宅SCMサーバー再構成　構築編4　リモート接続

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（4）
##4.Windowsからのリモートデスクトップ接続
（3）端末上で
###4-1.EPELインストール
```yum install -y epel-release```

###4-2.EPEL無効化
```vi /etc/yum.repos.d/epel.repo```

```epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 – $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&archsearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
```
###4-3.EPELリポジトリからxrdp tigervnc-serverインストール
```yum --enablerepo=epel install -y xrdp tigervnc-server```
###4-4.xrdpの起動
```systemctl start xrdp.service```

```systemctl enable xrdp.service```
※次回から自動起動

###4-5.EPELリポジトリから mozc ibus-mozcインストール
```yum --enablerepo=epel install mozc ibus-mozc```
```systemctl restart vncserver@:1.service```

###4-6.Teratermの設定
WindowsPC側のTeratermでSSH接続
ホスト：```サーバーアドレス```
ポート```22```
で接続

SSH転送の設定
ローカルのポート```53389```
リモート側ホスト：```サーバーアドレス```
ポート：```3389```
で設定

###4-7.リモートデスクトップで接続
WindowsPC側でリモートデスクトップを実行
コンピュータ：```サーバーアドレス：53389```
で接続

リモートデスクトップのxrdp画面で
ユーザ名
パスワード
の入力

次の工程

https://qiita.com/YCS_Project/items/09f041b75fefa8aea395
自宅SCMサーバー再構成　構築編3　Chrome/プリンタドライバインストール

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（3）
##3.Chromeのインストール/プリンタドライバインストール
右クリックメニューより端末を開く
###3-1.Chromeリポジトリ作成
```vi /etc/yum.repos.d/google-chrome.repo```

```google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```
yumアップデート
```yum update```

###3-2.Chromeインストール
```yum install -y google-chrome-stable```


###3-3.プリンタドライバダウンロード（Brother DCP-J952Nの場合）

ブラウザ上で
```https://support.brother.co.jp/j/b/downloadtop.aspx?c=jp&lang=ja&prod=dcpj952n```
を表示
　
```Linux(rpm)```
を選択し決定

```Linux 簡易インストーラー```
を選択し、使用許諾に同意してダウンロード開始
　
```ファイルを保存する```
を選択しOK

同様に
```LPR プリンタードライバー (rpm package)```
```CUPSwrapper プリンタードライバー (rpm package)```
```スキャナードライバー 64bit (rpm package)```
を保存しておく。

###3-4.プリンタドライバインストール（Brother DCP-J952Nの場合）

端末でroot権限に戻り
```cd /home/****/ダウンロード```
※****はユーザ名

linux-brjprinter-installer-2.2.1-1を解凍
```gunzip linux-brjprinter-installer-2.2.1-1.gz```

解凍後
```bash linux-brjprinter-installer-2.2.1-1 DCP-J952N```
を実行し、3-3.でダウンロードされたドライバが表示されていれば”Y”

プリンタが追加されましたの表示後、DEVICE URLを指定。

テスト印刷を実行しますか？で”Y”

上記使用許諾に同意しますか？で”Y”

次の工程

https://qiita.com/YCS_Project/items/446e690e0020ae322b38
自宅SCMサーバー再構成　構築編2　CentOS 7初期設定

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（2）

##2.CentOS 7初期設定
（1）の続き、再起動後
###2-1.rootでログイン
###2-2.言語設定
日本語を選択し次へ
日本語（かな漢字）を選択し次へ
###2-3.プライバシー設定
位置情報サービスオフ
###2-4.オンラインアカウント設定
スキップ
###2-5.準備完了
###2-6.ネットワーク設定
右上の電源ボタン押下
有線設定選択
eno1,eth1等nic選択
自動接続にチェック
IPv4選択
手動
アドレス、ネットマスク、ゲートウェイ設定
DNS自動オフ
DNS設定　```8.8.8.8```　```8.8.4.4```　を設定（google）
適用(A)押下
###2-7.デュアルディスプレイ設定
設定（ネットワーク設定のウィンドウのまま）でデバイスを選択
JoinDisplaysを選択
適用(A)押下

次の工程

https://qiita.com/YCS_Project/items/4af367ee80102624a533
自宅SCMサーバー再構成　構築編1　CentOS 7インストール

#旧式HPサーバーに CentOS7 をインストールしDockerコンテナ上でGitlabとRedmineを連携しSCM環境を再構築した際の備忘録（1）

##対象　　HP Proliant ML310e V2 Gen8
Xeon E3-1220 v3 3.1GHz Mem32GB SSD500GB
ビデオカード GEFORCE GTX 1050Ti
21インチモニタ×2（DVI,HDMI）
プリンタ Brother DCP-J952N

WindowsServer2019をインストールしましたが、チップセットとBIOSの関係でHyper-Vが
うまく動作しなかったためOSから見直しました。

VMからDockerへの移行テストも兼ねて、SCM環境を再構築することにしました。
いつでも再インストール出来るように備忘録として残します。

自宅内でのみの利用の為セキュリティ等は後日とし、作業優先としています。

※各々の方法につきましては、Quiitaに投稿されている方を含めweb上に複数存在しますが
　一貫しての構築となりますとなかなか見つかりませんでしたので、これからSCMサーバー
　構築をされる方へのご参考として、またサクッと再構築の為の自己手順書として投稿します。

　初投稿ですので、Qiitaの勝手がよくわかっておりませんのでお手柔らかにご指導の程
　お願いいたします。

　至らない点もございますが何卒ご容赦の程よろしくお願いします。

##参考
15時間でわかるCentOS集中講座 技術評論社
CentOS 7実践ガイド　インプレス
Docker実践入門――Linuxコンテナ技術の基礎から応用まで Software Design plus

https://docs.docker.jp/

https://docs.gitlab.com/

https://redmine.jp/

##1.CentOS7 インストール（CentOS Linux release 7.9.2009 (Core)）
###1-1.CentOS7を下記からダウンロード　

https://www.centos.org/download/

理研サーバから　CentOS-7-x86_64-DVD-2009.iso　を選択。

###1-2.Rufusを下記からダウンロード

https://rufus.ie/ja/

###1-3.Rufusを起動しブータブルUSBメモリを作成

<img width="300" alt="2-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226547/a721d8d1-e281-3ca0-8e40-9c3eff59dc8c.png">

###1-4.usbメモリからインストーラを起動しインストール
####1-4-1.Install CentOS7 を選択しenter
####1-4-2.日本語→日本語(日本)を選択
####1-4-3.インストール先を選択(500GB HDD)し完了
####1-4-4.ソフトウェアの選択でGNOME Desktopを選択
GNOME アプリケーション
インターネットアプリケーション
レガシーなXウィンドウシステム互換性
オフィススイートと生産性
互換性ライブラリー
開発ツール
セキュリティツール
システム管理ツール
にチェックを入れ完了

####1-4-5.ネットワークホスト名設定
####1-4-6.インストールの開始（B)を押下
####1-4-7.BOOTパスワード、ユーザーの作成を行う
####1-4-8.再起動
####1-4-9.ライセンスに同意


次の工程

https://qiita.com/YCS_Project/items/ae2e0f8713b7534cbd87
Symbol node testnet 構築でハマった

# はじめに #

Symbol、いいですよね。
XYMという表記もなんかかっこいいし、
公式のウォレットにも気合いが感じられて好印象。

テストネットを構築しようとしてハマったのでメモ。

# Symbol node 構築 #

### 必要なもの ###

公式にもちゃんとまとまってるし、（しかも日本語もある）
色んな記事で紹介されているので割愛。
AWSで立てた。ひとまず最小スペックで問題なし。
symbol-bootstrapからdocker起動、素敵。

* docker
* docker-compose
* nvm（node.js、npm）
* symbol-bootstrap（この時点では1.0.7）

### testnet 起動 ###

必要なものは揃った、いざ起動。

```
$ symbol-bootstrap start -p testnet -a dual -d
```

同期確認

```
$ curl http://localhost:3000/chain/info | python3 -m json.tool
```

# ハマった #

### 同期が進まない ###

あとは、explorer上の最新ブロックまで同期されるのを同期確認APIでひたすら眺めるだけ。
どのぐらいかかるかな〜とのんびり待っていた。

半日経過、うむ、順調。
1日経過、`"height": "130681"`、うむ、まあそんなすぐには終わらないか。
2日経過、`"height": "163081"`、うむ、放置。
3日経過、`"height": "163081"`、、、むむ？？
同期が進んでない。

スペック上げてみたり、apiノードだけで立ち上げてみたり、再起動してみても変わらず、結構お手上げ。
ログには怪しそうなerrorとwarningが大量に出てはいる。困った。

特にこれが一番怪しい。300MBより大きいブロックを取り込めていない？？

```
<warning> (disruptor::ConsumerDispatcher.cpp@182) disruptor memory is full (max = 300MB, current = 0B)
```

### 設定変更 ###

[設定値](https://docs.symbolplatform.com/ja/guides/network/configuring-node-properties.html) の`blockDisruptorMaxMemorySize`が該当しそう。

```custom-preset.yml
blockDisruptorMaxMemorySize: 1000MB
```

symbol-bootstrapの実行ディレクトリに上記ファイルを準備。

```
$ symbol-bootstrap stop
$ rm -rf target
$ vi custom-preset.yml
$ symbol-bootstrap start -p testnet -a dual -c custom-preset.yml --upgrade -d
```
こんな感じで停止してから、設定を読み込んで再起動。
（なんとなくtargetディレクトリは削除して初期化。1から同期した。）

しばらくしてから確認。

`"height": "222058"`、、、おお！！突破してる！！

```
<info> (disruptor::ConsumerDispatcher.cpp@44) completing processing of element 48 (10346 blocks (heights 130682 - 141027) [D564AA0F] from Remote_Pull with size 537MB 936KB 234B), last consumer is 0 elements behind
```

537MBとか同期しようとすると、デフォルトの`blockDisruptorMaxMemorySize: 300MB`では無理だったってことね。

止まることなく最新ブロックまで同期が進んだ。よかった！

# おまけ #

nem2.slackに突撃して#helpチャンネルで叫んだら、みなさんすぐレスポンスくれた。優しい世界。
13万ブロックあたりで負荷テストがあって大量のトランザクションが発行されたらしく、
どうやらテストネットの同期が結構シビアらしい。

似たような現象が発生した時の対応を教えてくれた。
https://forum.nem.io/t/statuscode-404-when-try-to-obtain-account-profile-info/30652/14

確かにこっちだけでも少し同期が進んだけれど、今回は設定しなかった。
同期で詰まったら見てみるべきかも。
githubのreleaseファイルから最新のものを取得するcliコマンド

# 枕
最新のバイナリとかrpmを取得するにあたっていちいちブラウザで取りに行くのはめんどい。
例えばcronとかで定期的に更新したいですねーと言う場合の話。

# どーする?

releaseのhtmlに対してcurlとgrep使えばいいね。

```
$ curl -s https://github.com/cloudflare/cloudflared/releases | grep cloudflared-linux-x86_64.rpm | grep -Po '(?<=href=")[^"]*'
/cloudflare/cloudflared/releases/download/2021.8.7/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.8.6/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.8.5/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.8.3/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.8.2/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.8.1/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.8.0/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.7.4/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.7.3/cloudflared-linux-x86_64.rpm
/cloudflare/cloudflared/releases/download/2021.7.2/cloudflared-linux-x86_64.rpm
```

一番上が必ず最新になっているので head -n 1 で先頭1行だけ取ればいい。


のだが!

```
https://github.com/cloudflare/cloudflared/releases/download/2021.8.7/cloudflared-linux-x86_64.rpm
```

これ、何も考えずにそのままwgetとかcurlすると実ファイルが落ちてこない。
つまりリダイレクトしているから。
なので、リダイレクト先URLを取得してそれをcurlすればいい。

```
TARGET_URL=`curl -I -Ls -o /dev/null -w %{url_effective} ${URL}`
```


# というのを作っておいた
https://github.com/tknr/dl_tools/blob/main/dl_github_release
【RSpec】NameError: uninitialized constant Rspecを解決した方法


#結論

* 「Rspec」ではなく「RSpec」

# エラー詳細

![Rspecのエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/8b42a95a-ae43-5865-fc70-5a6849ea2dc1.png)

####投稿者コメント

スペルあってるのにNameError???
と思って困りましたがなんとか解決できました。
大文字小文字全角半角は要確認だなと感じてます。

####My Profile
プログラミング学習歴4ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
OpenCV(python)をLambdaで動かす

すでに他の人が記事で書いているのですが、そもそもSAMについてよくわかっていなかったので自分の備忘録としてリンク集貼っておきます。

https://note.com/rooxim/n/n8631eb634167


AWSのインストール系リンク


https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html


https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html


そもそもSAM使ってDeployすることを丁寧に書いてくれている記事


http://hack-note.com/infra/aws-sam-lambda-deploy/
Python で UIAutomation を使って Slack に書き込んでみた

Slack コネクトなメンバーを含んだDMチャンネル？に自動で定期的に書き込みをしたくて作ってみました。

Slack API は権限の関係なのかSlack コネクトな情報が取れなくて断念。。

何とか自動化を。。と考えて、UIAutomation が使えそう！！ってことで以下な感じのソースが出来上がりました。


```python
import comtypes
from comtypes import CoCreateInstance

import comtypes.client
comtypes.client.GetModule('UIAutomationCore.dll')

from comtypes.gen.UIAutomationClient import *


def slack_send(message):
    try:
        #事前準備
        uia = CoCreateInstance(
            CUIAutomation._reg_clsid_, 
            interface=IUIAutomation, 
            clsctx=comtypes.CLSCTX_INPROC_SERVER|comtypes.CLSCTX_INPROC_HANDLER|comtypes.CLSCTX_LOCAL_SERVER|comtypes.CLSCTX_REMOTE_SERVER
        )
        root_element = uia.GetRootElement()
        
        # SlackWindow特定
        cndWindow = uia.CreatePropertyCondition(UIA_NamePropertyId, "Slack |＊＊＊＊＊ | ＊＊＊＊＊" )
        
        # SlackEditBox特定
        cnd1 = uia.CreatePropertyCondition(UIA_NamePropertyId, "＊＊＊＊＊にメッセージを送信する")
        cnd2 = uia.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_EditControlTypeId)
        cndEdit = uia.CreateAndCondition(cnd1, cnd2)
        Edit = root_element.FindFirst(TreeScope_Children, cndWindow).FindFirst(TreeScope_Subtree, cndEdit)
        
        # SlackEditBox へ 書き込み
        EditVal = Edit.GetCurrentPattern(UIA_ValuePatternId)
        EditVal.QueryInterface(IUIAutomationValuePattern).SetValue(message)
        
        # Slack送信ボタン特定
        cnd4 = uia.CreatePropertyCondition(UIA_NamePropertyId, "今すぐ送信する")
        cnd5 = uia.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_ButtonControlTypeId)
        cndBtn = uia.CreateAndCondition(cnd4, cnd5)
        Btn = uia.GetRootElement().FindFirst(TreeScope_Children, cndWindow).FindFirst(TreeScope_Subtree, cndBtn)
        
        # Slackメッセージ送信（送信ボタンクリック）
        BtnSend = Btn.GetCurrentPattern(UIA_InvokePatternId)
        BtnSend.QueryInterface(IUIAutomationInvokePattern).Invoke()
        
    except Exception as e:
        print(e)
        print("Slack へのメッセージ送信に失敗しました")


slack_send('test')

```

１．Slackのウィンドウ　を特定して、
２．Slackウィンドウ内の書き込み領域　を特定して
３．書き込みして
４．送信ボタン　を特定して
５．送信ボタンをクリック

するような動きになってます。
見つからなかった！等のエラー処理は入ってませんので様々なケースに柔軟に対応はできないですが、
とりあえず、開いておいた特定のDMに対する自動書き込みができたので、これでＯＫ

こいつをWindowsのタスクスケジューラに設定して、定期的に実行するようにすれば自動書き込み完成です。


ソースの中の「＊＊＊＊＊」な部分については、Inspect.exe で調べてくださいデス。
こことか：[https://github.com/blackrosezy/gui-inspect-tool](https://github.com/blackrosezy/gui-inspect-tool)
こことか：[Qiita：Inspect.exe のインストール (Windows SDK)](https://qiita.com/RPAbot/items/f1d6438c8f2500db65ae)


「UIA_EditControlTypeId」やら「IUIAutomationInvokePattern」やらが、UIAutomation 使う上でのメンドクサイとこですが、
しっかり調べてキッチリ指定してやれば、意図通りに動くハズです。
やっぱり公式サイトが一番！
https://docs.microsoft.com/ja-jp/windows/win32/winauto/uiauto-controltype-ids
https://docs.microsoft.com/ja-jp/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationinvokepattern
Designとデザインと設計

Design (英語) とデザイン (日本語) と設計を全部同じ意味で使っている人もいるし、違う意味で使っている人もいるから、気をつけようと思うという注意書き。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/a174e3df-eadd-a833-57c8-7821b407e4ed.png)

## 例えば

DDD ... Domain Driven Design / ドメイン駆動設計 https://en.wikipedia.org/wiki/Domain-driven_design
プロダクトデザイン ... 製品のデザイン で、見た目のデザイン https://ja.wikipedia.org/wiki/プロダクトデザイン
デザインパターン ... 設計ノウハウ https://ja.wikipedia.org/wiki/デザインパターン_(ソフトウェア)

https://jp.quora.com/デザインと設計の違いはなんですか

http://www.design.kyoto-u.ac.jp/smalltalk/smalltalk_02/

## Design (英語) 

https://en.wikipedia.org/wiki/Design
> 設計とは、対象物やシステムの構築、活動やプロセスの実施に関する計画や仕様、またはその計画や仕様の結果であるプロトタイプ、製品、プロセスのことである。デザインするという動詞は、デザインを開発するプロセスを表現しています。場合によっては、事前に明確な計画を立てずに対象物を直接構築すること（工芸品、一部のエンジニアリング、コーディング、グラフィックデザインなど）もデザイン活動とみなされることがある。デザインは通常、一定の目標と制約を満たす必要があり、美的、機能的、経済的、社会的、政治的な考慮がなされ、特定の環境と相互作用することが期待される。デザインの主な例としては、建築設計図、エンジニアリング図面、ビジネスプロセス、回路図、縫製パターンなどが挙げられる。

> デザインを制作する人をデザイナーと呼ぶが、これは一般的に様々なデザイン分野のいずれかで専門的に働く人を指す言葉であり、通常はどの分野を扱うかを指定する（ファッション・デザイナー、プロダクト・デザイナー、ウェブ・デザイナー、インテリア・デザイナーなど）が、建築家やエンジニアなども含まれる。デザイナーの一連の活動はデザインプロセスと呼ばれ、デザイン手法を用いることもある。デザインを生み出すプロセスは、簡単なスケッチのような短いものから、調査、交渉、考察、モデル化、相互調整、再設計などを含む長く複雑なものまである。

## デザイン (日本語)
https://ja.wikipedia.org/wiki/デザイン
> デザイン（英語: design）とは、審美性を根源にもつ計画的行為の全般を指すものである。意匠。設計。創意工夫。英語のdesignには本項の意味より幅広く、日本語ではデザインと呼ばない設計全般を含む。

> ｢設計はご存知の通り英語で Design ですが，日本語と英語ではニュアンスがちょっと違うようです。日本では設計とデザイン（景観や造形）を分けて考える，つまり使い分ける傾向がありますが，本来 Design は両方を含みます。したがって，この講座で設計はこの Designと同義語だと考えてください。実際に筆者自身，海外の方から，「あなたは Bridge Engineer ではなく Bridge Designer だ」と言われたことがあります。それは，ある橋を案内した時に設計だけでなく施工法や形，色まですべて決めると説明した時です。それから自己紹介する時は「Bridge Designer」ということにしています｣ 春日昭夫、「設計入門 ①基礎編-設計って何？－ コンクリート工学 2010年 48巻 10号 p.10_54-10_59, doi:10.3151/coj.48.10_54


## 設計
https://ja.wikipedia.org/wiki/設計
> 設計（せっけい、英: design）とは、建築物や工業製品等といったシステムの具現化のため、必要とする機能を検討するなどの準備であり、その成果物としては仕様書や設計図・設計書等、場合によっては模型などを作ることもある。
 

## 補足: Style (英語)
https://en.wikipedia.org/wiki/Style

> Style is a manner of doing or presenting things and may refer to:
> 
> Architectural style, the features that make a building or structure historically identifiable
> **Design, the process of creating something**
> Fashion, a prevailing mode of clothing styles
> Style (visual arts)
> Writing style, the manner in which a writer addresses readers


## まとめ

[デザインと設計の異同 - 早稲田大学リポジトリ](https://waseda.repo.nii.ac.jp/?action=repository_action_common_download&item_id=14551&item_no=1&attribute_id=162&file_no=1)

> 従来、日本語では、「デザイン」という語と「設計」という語を区別して用いてきた。しか
し近年、日本でも英語の design と同様に、「デザイン」と「設計」とを区別せずにデザインと
いう用語を用いることが多くなってきたと筆者には思われる。そのため、教育の現場や開発作
業の現場で議論の混乱が起こっているように見受けられる。本稿では、「デザイン」と「設計」
の共通点と異点を明確にし、「デザイン」する観点から、あるいは「設計」する観点から、「デ
ザイン」作業と「設計」作業の方法について論じる。そして、デザインは、感性デザインとい
う語で、設計は機能設計という語で呼ぶことがよいと結論づける。


とにかく色々重なるから気をつけよう、という話。
参考になればさいわいです。
昭和生まれでネットワーク出身の php 書きが、2021年後半になってようやく Nuxt.js でモダンなサーバレス開発をする話(略してメモ

※ この記事は随時更新する方向でアレしています。
※ 文系エンジニアなのでダラダラ文体です。

# 前文
## はじめに
2021年現在0x28歳となり、エンジニア(広義で)社会人生活が20年を過ぎ、そのうち15年くらいはphp書き、しかもIDCで物理サーバをラックに詰め込んではLANケーブル作ってた世代の人間が、この先どう生きていくかを考えた末に達した、少しはモダンなサムシングもキャッチアップしないとデンジャラスという直感に基づいて、どうせならサーバレスなサイトをいっちょ構築したれ、と思い立って勉強を始めたログです。

なので新しい知識が身についた時点で更新するし、間違ってたと思ったら消すけど、この記事が更新終了を迎えた暁には「インターネット老人会だけど若いもんにはまだまだ負けんで！」と言える何かを得ていることでしょう。

## サーバレスやるか
数年前から、自分の生涯年収とそれを生み出すキャリアパスについて考えていたところ、ひょんなことから人生自体を紆余曲折し始め、気がついたらエンジニア的にロートル、社会的にも適当扱いされるフリーランスでした、という状況で「いかにこの先を生きていくか」を考える中で、次の10年を生きるための勉強をいまこそがんばらねばなるまい、では学ぶ対象は何だ？と自問したところ、「汝の自サイトを使って実益を兼ねよ」という神の啓示を受けつつ、奇しくも京都の花札屋がビジュアルゲームプログラミング環境を万人向けにリリースした時期でもあり、あぁもうプロトコルとかカプセル化とかブラックボックスに内包してるからイケてるWeb系エンジニアは覚えるだけ無駄くらいのアレなのね・・・とある日気づきました。
とはいえ、じゃあ転職しましょうみたいな状況で考えると、そんなイケてるエンジニアと採用というバトルフィールドにおいて生き残りを賭けた戦いを繰り広げなきゃならないので、いつまでも手持ちの知識 & スキルにあぐらをかいてちゃダメだ！ あいつらと戦える術を身に着けねば！ 自分に足りないものは何だ？！ と考えた結果、一時期はネットワークエンジニアとして生計を立ててきた過去の自分を否定するかのような、サーバレスやんべ、という結論に至ったわけです。

## まずは大まかな設計から
サーバレスでサイト構築という方針が決まったので、どの技術を組み合わせてどう実装していくのか、インフラレベルでサービスの全体像を構想しました。
まず　DB → API → jsフレームワーク という図式のイメージがつきます。
AWS なら、RDS → Lambda → CloudFront経由でS3上のビルド済みリソース という具合。
ちなみにこの時点で Aurora or RDS は考えたけど、Aurora はI/O課金の都合上「仮にバズってPVすんごいことになったら破産しかねない」という杞憂なデメリットがあるので、AWS でいくなら MySQL 互換な RDS かなーとは思ってました。
これを仮に GCP で構築するとしたら・・・？ については、残念ながら実務経験が乏しく、作るまで想像しづらいので、進めながら調べて考えることにしました。

## フロントエンド何にするか問題
いったん AWS で進めようと決めたものの、バックエンドはもしかしたら GCP にするかもだし、まずはサイトのビジュアルからダミーデータで作っていこう、と考えたときに、じゃあフロントエンドは何で実装する？というのが次の課題でした。
サーバレスである以上、想像できたのは React とか Vue.js といった JavaScript フレームワークを使うということ。
これまであまり触ってこなかった身としては、React についてはその気になれば React Native でアプリ開発にも知見を流用可能なことが最大のメリットだとは思ったものの、じゃあ実際問題ネイティブ API をどんくらいサポートしてるん？ が知識として怪しかったので、いろいろ考えて ~~Vue.js でまずは考えよう~~ なんか楽できそうだし Nuxt.js でいこう、となりました。

# とにかく手を動かしてみる
## 開発環境の構築
Mac で ~~npm install → vue init みたいな流れ、~~
※ npx はなんかのアレで入ってたのでそのまま使った

1. npx create-nuxt-app プロジェクト名 で作成
2. cd プロジェクト名
3. npm run dev
4. http://localhost:3000 にアクセス
5. Nova で開く
6. GitHub リポジトリを登録
7. いったん push 

## とりあえず触ってみる

1. pages/inspire.vue を複製して pages/test.vue とかにリネーム
2. pages/test.vue をほげほげ編集
3. layouts/default.vue にあるメニューをコピペして追加

なるほどなるほど。
ここまで来て、 v-app や v-main などの要素、v-model や :clipped などの属性がわからんとダメなやつ、ということがわかったので、まずはドキュメントをざっくり眺める旅に出ました。

(以後更新予定　)
HaritoraX やーる

# はじめに
HaritoraX 使ってみたときのメモ

# 開発環境
- Windows 10 PC
- HaritoraX Configurator 0.3.4
- バーチャルモーションキャプチャー 0.50f1
- バーチャルモーションキャプチャー 0.50r1

 
1．HaritoraXの電源を入れ、装着する（充電約4時間半）

https://twitter.com/nyooon_VRC/status/1432508406758187012?s=20

https://twitter.com/izm/status/1432736743141249024?s=20

2．Quest2とPCをOculus Air Linkで繋ぐ
PCからOculusソフトウェアを起動、Air Linkをオンにしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/4c94102d-95b5-193a-1399-11c115bf3844.png)

Quest2の設定、Oculus Air LinkからPCとペアリング

3．SteamVRを起動し、Quest2とコントローラーの接続を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/82661ec3-2284-6bc7-8f01-f0e867a6cb57.png)

4．HaritoraX Configuratorを開き、接続の確認およびキャリブレーションを行う

はじめる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/d005b87e-0166-14f8-7242-76c42f8348f1.png)

SteamVR接続確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/69268634-9b86-d301-5f8d-8da3929d4070.png)

BluetoothでPCとペアリング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/cfa1877f-21c0-6e69-3c2e-e650d62636a6.png)


キャリブレーション、ヘッドセットしていると見えないので、SteamVRのデスクトップからPC画面を確認する
直立で10秒、膝を曲げて10秒じっとする

5．バーチャルモーションキャプチャーを起動する
https://sh-akira.booth.pm/items/999760

VRMファイル読み込み、VRoidHubからも連携して読み込める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/f103350a-2729-1141-e51a-11b18ea4bf49.png)

Tポーズしてキャリブレーションする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/949c2571-832a-f1c5-0764-edcddfe26d01.png)

# バーチャルモーションキャプチャー 0.50 先行リリース
https://akira.fanbox.cc/posts/2541823

OSCで送信できるようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/87ac41d6-c7e2-0ded-1922-04eae2c9d8df.png)

https://keiki002.com/vr/vmc-emote/#i-3
Unityで受信し、アニメーションとして記録

TouchDesignerのOSC Inでも受信できた 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/3cb03655-35c3-c1e3-8333-f6529f564e7e.png)
ページ番号決め打ちで目次を作成する

すべてreportlabで組版した場合の目次生成方法は[公式サンプル](https://www.reportlab.com/snippets/8/)がありますが、手元のpdfファイルをベースに(ページ番号決め打ちで)目次を生成するサンプルは見つけられなかった。TableOfContentsのソースを読んだ限りでは以下のようなやり方でできるらしい。table_of_contents.beforeBuild()とかいう明らかに内部向けっぽい関数を呼ぶのがポイントです。

```py
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.platypus.tableofcontents import TableOfContents
from reportlab.lib.pagesizes import A4

doc = SimpleDocTemplate('toc.pdf', pagesize=A4)
fontname_g = 'HeiseiMin-W3'
pdfmetrics.registerFont(UnicodeCIDFont(fontname_g))
elements = []

style=ParagraphStyle(
	name='Normal',
	fontName=fontname_g,
	fontSize=10,
)
elements.append(Paragraph("header", style))
elements.append(Spacer(10,10))

table_of_contents = TableOfContents()
table_of_contents.dotsMinLevel = 0
table_of_contents.levelStyles = [style]
# 
table_of_contents.addEntry(0, 'chapter1', 1, key=None)
table_of_contents.addEntry(0, 'chapter2', 11, key=None)
table_of_contents.beforeBuild()
elements.append(table_of_contents)

doc.build(elements)
```

勿論、「手元のpdf」にページ番号を振らないと本末転倒なのでご注意を…。https://qiita.com/achiwa912/items/9d82484183e3b6c9da3c のようなやり方でできます。