OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでクレしんチャレンジしてみた

# クレしんチャレンジとは
クレヨンしんちゃんのタイトルコール画面を、プログラミングで再現するというもの。
[こちらの記事](https://qiita.com/narita1980/items/03d9a24b7ac1fdf81b18)出他の方の作品もみることができますが、Pythonでチャレンジされている方がおられなかったのでやってみました。

# 使用ライブラリ
OpenCVを使う予定でしたが、日本語が使えないということで断念しPillowを使用しました。

# プログラム
## importと定義
ライブラリのインポートと、画像サイズや各カラー。
ピンクと黄色はタイトルコールのあのグラデーション、紫は文字です。
DIFFは、グラデーションを作るために使用します。グラデーションについて、詳しくは後述。

```py
from PIL import Image, ImageDraw, ImageFont

SIZE = 100
PINK = (230, 143, 150, 0)
YEL = (255, 255, 0, 0)
DIFF = tuple(map(lambda x, y: (x - y) / SIZE / 3, YEL, PINK))
PUR = (192, 48, 192, 0)
```

## イメージ作成
3:4の画面を作成しました。

```py
pic = Image.new("RGB", (SIZE*4, SIZE*3), PINK)
draw = ImageDraw.Draw(pic)
```

この時の画像はこちら。

![pink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925706/2469e1da-ddd5-8e19-c4e4-f90fb78b0feb.png)

## グラデーション作成
上三分の一をピンク色にし、そこからグラデーションを開始しました。
grad変数はグラデーションの途中経過を入れるものです。最初はピンクですが、ループごとにDIFFを足していくことで徐々に黄色に近づけます。
なぜわざわざgradをarrに入れているかというと、毎回gradをintにしていたら色が変わらないからです。

```py
grad = PINK
for i in range(SIZE, pic.size[1]):
    grad = tuple(map(lambda x, y: x + y, grad, DIFF))
    arr = tuple(map(lambda x: int(x), grad))
    for j in range(pic.size[0]):
        pic.putpixel((j, i), arr)
```

この時の画像はこちら。

![grad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925706/0bba83e4-2f26-b6c1-edb3-583211169f84.png)

だいぶ雑なプログラムでしたが、もうそれっぽいですね。

## 文字入れ
まず、以下の関数を定義しました。

```py
def putText(text, x, y, size):
    global draw, PUR
    draw.text(\
        (x, y),
        text,
        PUR,
        font=ImageFont.truetype(
            "フォントパスが入るゾ",
            size
        )
    )
```

次に、以下の三行で文字を追加しました。

```py
putText("ライブラリのアップグレード", 20, 120, 25)
putText("いつの間にか溜まってるゾ", 45, 160, 25)
putText("ま　　　　　   た", 128, 150, 10)
```

本当は文字位置を自動調整したり、ルビを自動でふったりしたかったですが、さすがに難しすぎるのでここでは断念します。

ここまで実行すると、下の画像が出来上がります。

![title_call.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925706/bc5cecf6-687f-e8f3-70a0-23693334cc57.png)

これで完成です！

# フルバージョン
最後に、フルバージョンを乗せておきます。

```py
from PIL import Image, ImageDraw, ImageFont

def putText(text, x, y, size):
    global draw, PUR
    draw.text(\
        (x, y),
        text,
        PUR,
        font=ImageFont.truetype(
            "フォントパスが入るゾ",
            size
        )
    )

SIZE = 100
PINK = (230, 143, 150, 0)
YEL = (255, 255, 0, 0)
DIFF = tuple(map(lambda x, y: (x - y) / SIZE / 3, YEL, PINK))
PUR = (192, 48, 192, 0)

pic = Image.new("RGB", (SIZE*4, SIZE*3), PINK)
draw = ImageDraw.Draw(pic)

pic.save("pink.png")

grad = PINK
for i in range(SIZE, pic.size[1]):
    grad = tuple(map(lambda x, y: x + y, grad, DIFF))
    arr = tuple(map(lambda x: int(x), grad))
    for j in range(pic.size[0]):
        pic.putpixel((j, i), arr)
        
pic.save("grad.png")
        
putText("ライブラリのアップグレード", 20, 120, 25)
putText("いつの間にか溜まってるゾ", 45, 160, 25)
putText("ま　　　　　   た", 128, 150, 10)

pic.save("title_call.png")
```

# 最後に
たまたま見かけたのでやってみましたが、楽しかったです。
もしPythonで挑戦される方いましたら、私の断念した文字位置自動調節と自動ルビふり機能挑戦してみてほしいです。
【G検定対策】サポートベクターマシン (SVM / Support Vector Machine) 

# サポートベクターマシン (SVM)とは
機械学習(**教師あり学習**)の手法の1つ．分布しているデータの適切な境界線を求めるアルゴリズム．
一般的には2クラスに**分類**する手法として使われることが多いが，回帰手法にも使用されることがある．多クラス分類問題は，決定木やニューラルネットワークを用いることが多い．

**マージン最大化**
異なるクラスの各データ点の距離が，最大化すること．

**スラック変数**
誤分類やマージンをはみ出た場合の誤差を測る変数のこと．

**ハイパーパラメータ**
誤分類をどの程度許容するかを学習の前段階で決める変数(パラメータ)のこと．
**参照**：ハイパーパラメータの最適な探索
⇢ ゼロから作るディープラーニング(Pythonで学ぶディープラーニングの理論と実装)のp.197〜

**カーネル関数**
データをあえて高次元に写像(**カーネルトリック**)することで，線形分離不可能な問題を線形分離可能な問題へ変換する．

- **線形カーネル**：任意の２つの観測間の内積として使用．
- **多項式カーネル**：湾曲した入力データ空間と，非線形の入力データ空間を区別．
- **動径基底関数（RBF）カーネル**：主にSVM分類で使用されるRBFカーネルは、入力データ空間を不定次元空間にマッピングします．

# 見るべき解説動画
https://www.youtube.com/watch?v=Fx-oG_z9HSk

https://www.youtube.com/watch?v=v5Ed_DJenNQ

# 数式を交えた解説動画
https://www.youtube.com/watch?v=05VABNfa1ds

https://www.youtube.com/watch?v=_PwhiWxHK8o

# ハンズオンによる説明
https://www.youtube.com/watch?v=BRXxvoQUMbI

https://isolution.pro/t/machine-learning-with-python/classification-algorithms-support-vector-machine/sapo-tobekuta-mashin-svm
DataMagic Ver.3.1.9の新機能をご紹介

# はじめに
2022年3月3日「DataMagic Ver.3.1.9」がリリースされました。
「Ver.3.1.9」に於いても、新たな機能が追加されましたので、ご紹介してみたいと思います。

[DataMagic 製品概要 | セゾン情報システムズ](https://www.hulft.com/software/datamagic)

# Ver.3.1.9の追加機能
以下の共通コンポーネントを新規で追加しました。

　**・SAISON_FORMAT_DATE_OR_NULL**
　**・SAISON_REPLACE_HEX**
　**・SAISON_PACK2NUMSTR**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0921a722-7141-fa34-ada5-54f530f66e33.png)

### SAISON_FORMAT_DATE_OR_NULL の新規追加
指定された日付フォーマットにしたがって、対象文字列を変換します。対象文字列が空文字または空白文字（タブおよび改行を含む）のみの場合、空文字を返却します。
入力された対象文字列が空白文字または空文字の場合、FORMAT_DATEではデータ加工の開始実行日時、SAISON_FORMAT_DATE_OR_NULLでは空文字に変換されるため、要件によって使い分けることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e2fdc413-1627-8286-3e11-f80b3643df61.png)
### SAISON_REPLACE_HEX の新規追加
REPLACE_REG 関数や共通コンポーネントSAISON_REPLACE_REGでは置き換え前にUTF-8 変換を行うため、正しい変換処理が出来ないケースがありました。
SAISON_REPLACE_HEXでは置換前のUTF-8 変換を実施しないため、すべての文字コードの組み合わせで変換が可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/53b531bd-a59b-fe22-3715-b451159e00a0.png)

### SAISON_PACK2NUMSTR の新規追加
サイン付内部10進数を数字文字列に変換します。数値部もしくは符号部が不正な値の場合、空文字を返却します。
入力ファイルフォーマットの項目タイプがP(サイン付内部10 進数)で、入力データの符号部または数値部が不正な場合でも変換処理を継続したい場合にご利用ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/db6bbdcc-029d-9290-187a-a2792912fdb7.png)

# 最後に
追加された共通コンポーネントでは、不正なデータが入力された際の処理が強化されております。そのため、活用して頂くことでより柔軟な変換処理の設計が可能となります。
今後のシステム構築のご参考にして頂ければ幸いです。
Excel 重複行削除

Sub doRemoveDuplicates()
    Range("A1").CurrentRegion.RemoveDuplicates _
                Columns:=Array(1, 2), Header:=xlYes
End Sub

指定したセル範囲から重複データを含む行を削除します。
重複しているデータが含まれる行の中で先頭行は残ります。

columns  重複する値を含む列のインデックス値、またはその配列を指定します。
kaggle内でnotebookを作る

どうも、AIRS-LabでKaggleをやっています。

データ分析コンペというとJupyter Notebookを使っている人も多いと思います。
![スクリーンショット 2022-03-04 10.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/d578497f-0fda-aea5-ce2d-11a550d609ae.png)

Jupyter Notebookを使っていて、うまくファイルを読み込めない時ありませんか？（やり方知らないだけですが・・w）
ドラッグアンドドロップで同じパスに入れられたらいいのに。。。と思い、Google Colaboratoryに変更しました。

2ヶ月ほどGoogle Colabで快適ライフを送っていたのですが、先日ある問題に直面してしまいました。。。！
![スクリーンショット 2022-03-04 10.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/9e14878f-2dce-cb79-27c0-ecc15268170d.png)
（Google Colabの利点としては、フォルダにドラッグ&ドロップしたら同じパスにあるものとして使える。）

なんと、train.csvのデータを全て読み込んでくれないではありませんか！！！（本当は80万行以上あるのに・・・）

データが大きすぎると一部しか読み取ることができなくなるようなので、Kaggle内で分析できるよう調べたので、その方法を記録しておきます。


まずは、KaggleのページにGo

![スクリーンショット 2022-03-04 9.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/9de88a87-9bda-b080-1057-36f3f60106d2.png)

左上のcreateのボタンを押すと、こんな感じで初期のコードが記述されています。
デフォルトでnumpyとpandasのライブラリがインポートできるようになっています。

![スクリーンショット 2022-03-04 13.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/12009473-4108-17f7-7029-236eb0ad3d7f.png)

この段階では、まだtrain.csvもtest.csvもインポートされていません。

右側のAdd dataを押すと以下のような画面になるので、Competition Dataのタブにして検索で「tabular playground series」と検索すると該当のコンペが表示されるので、addを押します。

![スクリーンショット 2022-03-04 13.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/b839b556-c50a-2792-d328-5b835fe5cc1c.png)

すると右側のinputのところにデータセットが入っていることがわかります。

![スクリーンショット 2022-03-04 13.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/1e625811-e399-e4aa-c509-9394f13ce3b8.png)

パスの書き方に少し注意が必要ですが、こんな感じできちんと848,835個のデータが入っていることがわかりました。
![スクリーンショット 2022-03-04 13.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/063b3bb5-dc41-3149-05bc-b5b1056395de.png)

データ分析頑張っていきましょう！
【メモ】local環境でWebRTCを用いて映像を撮影した時のデータ保存について

### 該当箇所のコード
```index.js
function startRecorder() {
 navigator.mediaDevices.getUserMedia(constrains)
 .then(function (stream) {
   recorder = new MediaRecorder(stream)
   recorder.ondataavailable = function (e) {
     console.log(e);
     // id testを操作できるよう取得
     var testvideo = document.getElementById('test')
 
     // id testに属性を追加する
     // https://developer.mozilla.org/ja/docs/Web/API/Element/setAttribute
     testvideo.setAttribute('controls', '')
     testvideo.setAttribute('width', width)
     testvideo.setAttribute('height', height)
 
     var outputdata = window.URL.createObjectURL(e.data)
 
     record_data.push(e.data)
     testvideo.src = outputdata
   }
 })
}
```

### 個別箇所の挙動
```js
recorder = new MediaRecorder(stream)
```
- MediaStream(今回はカメラとマイク)を使用して得られた情報を記録するMediaStreamオブジェクトを作成する
- 引数のstreamとは、navigator.mediaDevices.getUserMedia() を使用して作成したストリームである
- 参考
    - https://developer.mozilla.org/ja/docs/Web/API/MediaRecorder/MediaRecorder

```js
recorder.ondataavailable = function (e) {
```
- Blob データが使用可能になったことに応じてコードを実行する
    - ＝録画の終了ボタンを押下したタイミング
- 引数で渡されているeにBlob形式で映像データが入る
- 参考
    - https://developer.mozilla.org/ja/docs/Web/API/MediaRecorder/ondataavailable

```js
var outputdata = window.URL.createObjectURL(e.data)
```
- メモリ上に存在しているBlobに結びつくオブジェクトURLを生成し、outputdataに代入している
    - この場合のメモリ上とはユーザの使用している端末のメモリのことなので、このURLを他者に共有してもアクセスできない(他者の使用している端末のメモリにはファイルがないから)
- わからないこと
    - windowの有無で表面上の挙動は変わらないが、生成されるオブジェクトURLが異なる
- 参考
    - https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL
    - https://developer.mozilla.org/ja/docs/Web/API/URL
    - https://qiita.com/azu369yu/items/8998e1e1536a5acfb7b3

### Blobとは
- typeを持つバイナリデータ
- 巨大な画像、音声ファイル、動画ファイルなどを扱うことができる

### URLとしてのBlob
- typeがあることによりblobをダウンロード/アップロード可能
- URL.createObjectURLを使用して端末のメモリに保存されたblobにアクセスが可能な一意のURLを生成できる
- メモリに存在するblobへのアクセスマッピングを行っている
- 生成したURLはブラウザを閉じるまで有効
    - 逆に言えばブラウザを閉じるまではメモリに常駐し続けるのでURL.revokeObjectURLを使って明示的にメモリ解放する必要がある
- 参考
    - https://ja.javascript.info/blob
    - https://qiita.com/azu369yu/items/8998e1e1536a5acfb7b3
    - https://e-words.jp/w/BLOB.html
FlutterでCloud Firestoreを使う（Android）

### FlutterでCloud Firestoreを使う

スケルトンで作成されるカウンターアプリをFirebaseのCloud Firestoreを使用するカウンターアプリに変更したいと思います。

### 条件

* Flutter 2.10.3
* Cloud Firestoreのテスト開発

### 事前準備

* google-services.json

Firebaseで取得したgoogle-services.jsonをapp配下にコピーします。

* AndroidManifest.xml

"android.permission.INTERNET"を追加する

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sample">

    <uses-permission android:name="android.permission.INTERNET" />
```

* google-servicesを追加する

```gradle:build.gradle
    dependencies {
        classpath 'com.google.gms:google-services:4.3.10'
    }
```

```gradle:/app/build.gradle
apply plugin: 'com.google.gms.google-services'
```

注意として、compileSdkVersion/minSdkVersion/targetSdkVersionは、適切な値に変更しましょう。

* Flutterにプラグラインを追加

```yaml:pubspec.yaml
dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2

  # この2つを追加
  firebase_core: ^1.13.1
  cloud_firestore: ^3.1.10
```

### Cloud Firestoreの準備

![スクリーンショット 2022-03-04 13.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148871/9885f9b2-2ad9-818d-e3a4-ef887ab2c2db.png)

### カウンターアプリを変更

* Firebaseを初期化

```dart:main.dart
import 'package:firebase_core/firebase_core.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}
```

* Firebaseのインスタンスを作成

```dart:main.dart
  CollectionReference sample = FirebaseFirestore.instance.collection('sample');
```

* _incrementCounter()メソッドを修正

countをインクリメントして、DBを更新します。

```dart:main.dart
  void _incrementCounter() async {
    _counter++;
    await sample.doc("doc").update({
      'count': _counter
    });
  }
```

* Firebaseの取得

bodyの中身を修正します。
DocumentSnapshotを使用して、sample - doc - countを取得します。

```dart:main.dart
      body: StreamBuilder<DocumentSnapshot>(
          stream: sample.doc("doc").snapshots(),
          builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Center(child: CircularProgressIndicator());
            }

            if (snapshot.hasData) {
              _counter = snapshot.data!['count'];
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    const Text(
                      'You have pushed the button this many times:',
                    ),
                    Text(
                      '$_counter',
                      style: Theme.of(context).textTheme.headline4,
                    ),
                  ],
                ),
              );
            } else {
              return Container();
            }
          }
      ),
```

以上です。

---

以外に簡単なことですが、最新の情報がなかったり、一番簡単に操作するサンプルがなかったので自分で作成してみました。
【Mac Docker】Error response from daemon: Mounts deniedのエラー対応方法

MacでNuxt.jsの環境をDockerで構築時に以下のエラーが発生したので、その時の対応方法をメモ。

```
docker compose up -d
```

上記コマンドでイメージを起動しようと思ったら、以下のエラーが発生。

```
Error response from daemon: Mounts denied: 
The path /htdocs/site/yalms/api is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/docker-for-mac for more info.
```

エラー内容を見ると、上記ディレクトリをDockerのFile sharingで共有パス設定する必要がありそう。

DockerアプリのPreferences > Resources > File sharing でプロジェクトのディレクトリを追加する 
![スクリーンショット 2022-03-04 10.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55699/28226c10-2a0e-df66-fce9-8ec2cf875a4e.png)
もう一度起動する

```
docker compose up -d
```

コンテナが起動しているか確認

```
docker-compose ps
```
【Flutter】Flutter HooksでdidChangeAppLifecycleStateのタイミングで通知する


# はじめに
HookWidgetを利用していて、画面が復帰したときに再描画したい場合があり、CustomHooksを書いて見ました。
※https://pub.dev/packages/flutter_hooks/changelog#0181
にてすでに実装されていましたが、今回はCustom Fookを作って見たくて、実装して見ました。

## 動作環境
flutterSdkVersion": "2.5.3"
flutter_hooks: ^0.17.0
 
## コード
```dart
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

AppLifecycleState? useAppLifecycleState(AppLifecycleState notifyState) {
  return use(_LifeCycleState(notifyState));
}

class _LifeCycleState extends Hook<AppLifecycleState?> {
  const _LifeCycleState(this.notifyState);
  final AppLifecycleState notifyState;
  @override
  __LifeCycleState createState() => __LifeCycleState(notifyState);
}

class __LifeCycleState extends HookState<AppLifecycleState?, _LifeCycleState>
    with WidgetsBindingObserver {
  __LifeCycleState(this.notifyState);
  AppLifecycleState? _theState;
  AppLifecycleState notifyState;
  @override
  void initHook() {
    super.initHook();
    WidgetsBinding.instance!.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (notifyState == state) {
      setState(() {
        _theState = state;
      });
    }
  }

  @override
  AppLifecycleState? build(BuildContext context) {
    return _theState;
  }

  @override
  void dispose() {
    super.dispose();
    WidgetsBinding.instance!.removeObserver(this);
  }
}

```


``` dart
class HookWidget extends HookWidget {
  HookWidget({Key? key}) : super(key: key);
 
  @override
  Widget build(BuildContext context) {
     //resumeの時だけ通知する
     useAppLifecycleState(AppLifecycleState.resumed);
     return Container();
  }

```



## 最後に
以下のrepositoryにも超便利なhooksが揃っていたりするので、利用したほうが
開発効率が上がりそうですね！
https://github.com/wasabeef/flutter_use

今回は自分でCustom Hookを作ってみました
アドバイスなどありましたら、是非よろしくお願いいたします！！
Mac OSでの矩形選択について

# はじめに
１月〜プログラミングスクールで学習しています。
これから平日は毎日何かしらアウトプットのため投稿を続ける予定です。
今回はプログラミングではありませんが、DB設計等を書く際に有効に使える矩形選択について投稿します。
Windowsを使っていた時によく使っていたけど、Macでのショートカットってなに？と思い調べてみました。
# そもそも矩形（くけい）選択とは
矩形とは角が直角の四辺形のことです。
長方形を想像すると分かりやすいと思います。
つまり、「矩形選択」は文章上で「長方形の形」でのテキストを選択できる機能のことです。
テキストを扱うツールには備わっていることが多いようです。

具体的な例を挙げます。
下記画像のように本来はOptionsのみをまとめて選択したい場合があると思います。
![150d1c0c759e9ed3eb2ab3cec6cf4660.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515603/ea578019-4816-aa96-7342-37d52e30b77d.gif)
これを矩形選択を使うとこうなります。
![b4a07b277357f69325c788e232749efc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515603/e10b0c5f-ae56-ac30-7077-329c95a4a4ab.gif)
このように矩形選択を使うことで一部分を長方形に選択したい場合に使えます！
# ショートカットキー
下記ショートカットキーで矩形選択したい範囲を選択し、カーソルを移動させることで選択範囲を決めることが出来ます。
（上記画像ではVSCordのREADMEでの使用例です。）
| キー  |
|------|
|⌘＋⌥＋⇧　|
# 使用例
- インデントをまとめて消したい（増やしたい）
- まとめてコメントアウトしたい
- 選択した文字をまとめてコピペしたい（置換したい）
etc...
# 最後に
今のところVS Cord以外で使えたことがないのですが、他にもこんなところで使えるよ!
というのがあればコメントで教えていただけると幸いです。
（Qiitaに投稿する際にテーブルを挿入するのに上記キーが使えなかったので、もしわかる方いましたらご教示のほどよろしくお願いします。）
Customize a Dashboard with Tableau CRM Advanced Editor


# [Sign Up for an Tableau CRM-Enabled Developer Edition Org](https://trailhead.salesforce.com/ja/content/learn/projects/customize-a-dashboard-with-einstein-analytics-advanced-editor/sign-up-for-an-einstein-analyticsenabled-developer-edition-org)

何もしないで、検証ボタンを押した場合。

  + We didn’t find the ACEOpportunities data set. Prep the csv file and upload it as described above.
 
難しいことはなく無事に終了。

# [Create a Templated Dashboard](https://trailhead.salesforce.com/ja/content/learn/projects/customize-a-dashboard-with-einstein-analytics-advanced-editor/create-a-templated-dashboard)

何もしないで、検証ボタンを押した場合。
 
 + We could not find your dashboard. Please set up your dashboard from the template, name it Ace Opportunities, and add the widgets as described above

ここから意味が分からんようになってきます。

収益番号ウィジェットを更新します
収益の下にある数値ウィジェットをダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3405bcbf-c156-d9a8-321d-9b4468cf3681.png)


# [Set up a Salesforce Direct Query](https://trailhead.salesforce.com/pt-BR/content/learn/projects/customize-a-dashboard-with-einstein-analytics-advanced-editor/set-up-a-salesforce-direct-query)


何もしないで、検証ボタンを押した場合。
しかし、この単元を開いてそのまま検証したので、１つ前の設定ができてなかったための、エラーメッセージだと思う。

 + We could not find your dashboard. Please set up your dashboard from the template, name it Ace Opportunities, and add the widgets as described above
 
こんどは、質問主さんと同じエラーになりました。

+ We could not find your dashboard. Please set up your dashboard from the template, name it Ace Opportunities, and add the widgets as described above

[is anyone else having this issue ? can someone please help me?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FYM0XSAX)
[Drupal]Twigの小ネタ集

※随時追加予定

### ユーザーの権限をチェックする
```twig
   {% if user.hasPermission('administer nodes') %}
      ... do something
    {% endif %}
```

### ユーザーの役割をチェックする
```twig
{% if 'ROLENAME' in user.getroles(TRUE)  %}
  <p>The user has the role "ABC".</p>
{% endif %}
```

### ルートから相対パスを取得
```twig
{{ path('entity.user.canonical', {'user': user.id}) }}
```
### ルートからURLを取得
```twig

{{ url('view.frontpage.page_1') }}
```

### エンティティをそのままレンダリングする
```twig
{{ node }}
```

### 特定のフィールドをレンダリングする

```twig
{{ node.body }}
```
### 特定のフィールドをフォーマッターを通してレンダリングする
あらかじめ表示設定でフォーマッターを指定しておく

```twig
{{ node.body|view }}
```

### 日付を特定のフォーマットを通してレンダリングする
`/admin/config/regional/date-time`にあるフォーマットが使える

```twig
{{ node.created.value|format_date('long') }}
```

### 特定のフィールドの値をHTMLタグが入ったプレーンテキストの状態で表示する

```twig
{{ node.body.value }}
```

### 特定のフィールドのHTMLタグ無しの値を表示する

```twig
{{ content.body.0 }}
```

### 複数フィールドの値をレンダリングする

```twig
{% for delta, tag in node.tags[0] %}
  {{ delta }} => {{ tag }}
{% endfor %}
```

### フィールドのラベルを表示する

```twig
{{ node[field_name].fieldDefinition.label }}
```

### フィールドで参照されているエンティティのフィールドを表示する

```twig
# ノードのfield_editorで参照されているユーザーのfield_summaryをレンダリングする
{{ node.field_editor.entity.field_summary }}
```

### リンクのタイトルを表示する
```twig
{{ node.field_link.0.url }}
```

### ファイルのURIを表示する
```twig

<img src="{{ file_url(node.field_image.entity.uri.value) }}" alt="{{ node.field_image.alt }}">
```

### ファイルのURLを表示する
```twig

{{ file_url(node.field_example_image.entity.uri.value) }}
```

### リストの選択肢のラベルを取得する
```twig

{{ node.filter_list.getSetting('allowed_values')[list_value] }}
```
Amazon LinuxでMysqlクライアントをインストールしたらGPGキーのエラーが発生した件

## 経緯
AWSのプライベートサブネットにあるRDSをパブリックサブネットにあるEC2サーバを踏み台にしてアクセスしたかったので、EC2サーバにMysqlクライアントをインストールしたらGPGキーのエラーが発生してしまった。
以前までは同様のエラーが発生しないでインストールできていたので備忘録として残してみた。

## 検証環境
OS：Amazon-Linux2
DB：Mysql8.0

## 事象を発生させる
### Mysql8.0のリポジトリを追加する

```
yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

Installed:
  mysql80-community-release.noarch 0:el7-3                                      

Complete!
```

### Mysql5.7のリポジトリを無効化にして、Mysql8.0のリポジトリを有効化させる

```
yum-config-manager --disable mysql57-community
enabled = False

yum-config-manager --enable mysql80-community
enabled = True
```

### Mysqlクライアントをインストールしてエラー発生

```
yum install -y mysql-community-client

Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Importing GPG key 0x5072E1F5:
 Userid     : "MySQL Release Engineering <mysql-build@oss.oracle.com>"
 Fingerprint: a4a9 4068 76fc bd3c 4567 70c8 8c71 8d3b 5072 e1f5
 Package    : mysql80-community-release-el7-3.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql


Public key for mysql-community-client-8.0.28-1.el7.x86_64.rpm is not installed


 Failing package is: mysql-community-client-8.0.28-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
```

### mysqlコマンドを実行してもコマンドは存在しない

```
mysql --version
-bash: mysql: command not found

which mysql
/usr/bin/which: no mysql in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
```

## 解決方法
原因としては、RPMやyumではパッケージの改ざんを検証するためにGPGキーを使っているのですが、そのGPGキーが有効期限が切れており、GPGキーが存在していない状態になっていました。
GPGキーを再度インストールする必要があります。

```
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
```

## 再度実行した

```
yum install -y mysql-community-client

Installed:
  mysql-community-client.x86_64 0:8.0.28-1.el7                                  

Dependency Installed:
  ncurses-compat-libs.x86_64 0:6.0-8.20170212.amzn2.1.3                         

Complete!
```

無事に成功！おめでとうございます！

## 参考
[・MySQL Yumリポジトリを使用するためのクイックガイド - MySQL公式ドキュメントから](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)
[・MySQL8.0.28での変更](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-28.html#mysqld-8-0-28-packaging)
（どうやら2022年1月18日のアップデートで変更されたみたいですね…）
初心者ブロックチェーンに挑戦する　4

# なぜ多くの資料が2019年か

# snap同期を停止する

　１年前に２時間ぐらい掛かると書かれていたsnap同期をはじめて２時間過ぎた。当然、あと１年分長くなってしかるべきなので、しかもそれは多分、幾何級数的に増えるだろうと思うので、このまま放っておくというのが常識的なところかもしれないな、などと思いながら、流れていく文字列を読んでいると、ふと、４年３ヶ月１週間、といういたってわかりやすい情報が次々と現れるのに気づいた。洗濯機を回して戻ってくると、それは４年２ヶ月３週間に変わっていた。ちょっと待て、あと４年分もあるのか。というか、これまで何年分処理したんだ。ターミナルをぐいぐい遡って、fullを止めてsnapを始めたところを探す。あった、スタートは･･･６年８ヶ月１週間！　まだ２年半しか進んでいない。

　私のストレージはまだ1.7T残っている。だから怖いもの見たさでこのまま突き進むというのも、できない判断ではない。だけど、そこから先どうするんだろう。私が参照している本は、もうどうしようもなく「古い」ということが判明している。チカチカ進んでいくDBを見ながら、本の次の章を読んでみるが、「ここさえ越えればあとは楽しそうだ」という予感はみじんもしない。

　なにかググるとき、とりあえず記事の日付を見る習慣はわりとしっかりついてきたのだが、本の奥付を見るのは怠っていた。この本だけでなく、ググって行き当たる記事も2019年が多い。きっとこの頃、イーサリアムブームがあったんだろう。そして、その後どうなったか。ブームに参加した人は二極分解したんだろう。この世界の先端を走り、素人の相手をするよりも、もっと専門家の集団内で独自のコミュニケーションを続けている人々と、脱落した人々だ。そして、長くなったチェーンは、もはや「ちょっとやってみよう」という私みたいな人間がたぐり寄せられる重さではなくなったんだろう。

　先行者利得というか、参入障壁というか、新規参入はお呼びでない、というか、でも、今またWeb3とかもてはやされて、新しく挑戦しようとする人々は出てくるはずだ。ということは、やっぱり新しい情報で、新しい挑戦をすべきなんだろうな。
　
　問題はもう一つある。最初は順調に緑色の文字が次々と走っていたターミナルに、黄色や赤の文字が現れる頻度が格段に多くなった。

WARN [03-04|11:17:50.697] Database compacting, degraded performance 
ERROR[03-04|11:17:51.908] Snapshot extension registration failed   peer=62cb56c6 err="peer connected on snap without compatible eth support"
ERROR[03-04|11:17:54.714] Timeout triggered but not reached        left="45µs"


　まあ、こんな感じ。仕方ない、ともかく同期を止めよう。

　さて、どうしよう。やっぱりおとなしく[UN/CHAIN](https://app.shiftbase.xyz)のスタートを待つのかな。今回の環境設定は使えるかな。使えるといいな。
ECSのスケーリングポリシーについて

# ECSのスケーリングポリシーについて

## スケーリングポリシーの種類
ECSにおいてスケーリングポリシーは下記２種類
１、ターゲット追跡ポリシー
定義したメトリクスとターゲットの値に基づいてスケーリングの調整を行うポリシー。
指定したターゲット値またはそれに近い状態でメトリクスを維持するために必要に応じてタスクの量を増減させる。
２、ステップスケーリングポリシー
メトリクスの値に閾値を設定し、それを超えた際のアラームに対してタスクの増減を行うポリシー。
タスクを増やすパターンと減らすパターンで２種類のアラームをcloudwatchで作成する必要がある。
Jetson Xavier NX対応の超高解像度な360度カメラが登場

https://blog.picam360.com/hqcamera_jp/

VR向けの超高解像度360度カメラが出ました。今度Xavier NXの処理性能に絡めて使い方を書いてみようと思います。（Xavier NXが全く手に入らないので在庫状況早く良くなって欲しいです）
Gitの使い方（3つの領域と操作方法）

Gitについて学んだことをアウトプットしようと思います。

# はじめに
Gitとはバージョン管理システムで、ファイルの変更履歴を残し、管理することができるツールです。複数の時点でのセーブデータをもつことができ、好きなセーブデータのところからファイルの編集が始められるようにするイメージかなと思ってます。この記事ではセーブデータを作る部分について書いていこうと思います。

# Git管理における3つの領域
ファイルをGitで管理するにあたって、ワーキングディレクトリ、ステージングエリア、リポジトリという3つの領域があります。

### 1.ワーキングディレクトリ
Gitの管理下にある、僕たちが作業をするディレクトリです。

### 2.ステージングエリア
実際にファイルの変更履歴を保存するための準備をするセーブポイントのようなものです。3つ目のリポジトリに履歴を残すためにはこの一度ステージングエリアを経由する必要があります。ステージングエリアはインデックスとも呼ぶみたいです。

### 3.リポジトリ
実際にファイルの履歴がセーブデータとして記録される領域です。リポジトリにはリモートリポジトリとローカルリポジトリがありますが、今回は個人単位で利用するローカルリポジトリの話です。

# Gitの操作（initからcommitまで）
まずは、Git管理をしたいディレクトリでこのコマンドを実行します。このコマンドで新しいリポジトリを作成します。リポジトリを作成することでGit管理できるようになります。
```
git init
```
<br>
次に、このコマンドで変更したファイルをステージングエリアに上げます。

```
#1つのファイルを指定する
git add ファイル名

#Git管理下にあるファイルをまとめて指定する
git add -A
```
<br>
最後に、ステージングエリア上のファイルをリポジトリに移動させることで変更履歴を保存します。コミットメッセージの部分には変更内容や変更した理由などを書くことが多いみたいです。

```
git commit -m "コミットメッセージ"
```

# まとめ
この記事ではGitを扱うために知っておくべき3つの領域とgitの簡単な操作方法について書きました。まだまだ未熟者ですが参考にしていただけたら幸いです。
メタバースに必要な要素と技術についてメモ

## 概要
メタバースのシステムを構築するにあたって、必要な要素は様々です。
それぞれの要素に必要な技術も付随します。
この記事では要素とそれをささえる技術について調べたメモになります。

## メタバースの定義

 > メタバース (英: Metaverse) は、コンピュータやコンピュータネットワークの中に構築された、現実世界とは異なる3次元の仮想空間やそのサービスのことを指す。
[引用元：wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E3%83%90%E3%83%BC%E3%82%B9)

## メタバースの定義にあてはまる作品（個人的な見解）
 - レディ・プレイヤー1（映画）
 - フォートナイト（ゲーム）
 - Zepeto（SNS）


## 要素

### 3D空間
一番ベーシックな要素になるかと考えられます。プレイヤーが行動するベースとなる空間です。
技術観点ではUnityのアセットを利用するのが手っ取り早そうに思えます。
ZENRINから出てるこの[都市モデルデータ](https://www.zenrin.co.jp/contents/product/service/3d/asset/index.html)はおもしろそうですね。フォーマットはFBXというファイル形式のようです。
基本的にはアプリ側にデータが格納されてるイメージでしょうか？例えばユーザーが何か物を配置した時に他ユーザーにどのように情報更新をプッシュするのか別途調べたいと思います。

### アバター
ユーザーの仮の姿です。なりたい自分になれるのが魅了ですね。
着せ替えや容姿の変更が主な機能かと思います。
モーションデータや位置データ、ステータス等のデータがクラウド上で同期させる必要がありそうです。
顔や体の動きを実際の人物のカメラからキャプチャーする場合は認識機能が必要になってきます。

### 通話
ビデオでの通話は不要ですが、音声での通話はあったほうが便利ですね。
WebRTCやPaaSを活用した実装が考えられます。匿名性が必要であればボイスチェンジャー機能も欲しいところです。
より没入感を求めるのであれば、ノイズキャンセルや空間オーディオ等の高度な技術が必要になります。

### チャット
通話が苦手な人はチャットでのコミュニケーションが多くなると思います。
履歴も残るのでチャットのほうが音声通話よりも利点がある場面もでてきます。
基本はWebSocket使ったpub/subになるかと思いますが、利用シーンでは負荷を考える必要があります。
（大量なチャットが流れてくる等）

### 仮想通貨
仮想空間上での売買に必要な通貨です。技術的には一番複雑で慎重に扱うべき要素になりそうです。
関連する技術のキーワードとしては**ブロッックチェーン**,**NFT**になります。
ブロックチェーン＝仮想通貨と勘違いしそうですが、あくまでブロックチェーンは台帳の概念なので仮想通貨とイコールにはならないと思います。
個人的な疑問としてはメタバースの通貨＝ブロックチェーンをベースにした運用＝ビットコインみたいなイメージがありますが、普通にクレジットカード等でそのシステムで定義した通貨を購入というのもありえるのでは？と悩んでしまってました。
ですが、NFTの登場でデジタルデータの「固有性」を担保する概念が発生したため、クリエータの支援という観点からもメタバース上の仮想通貨＝ブロックチェーンをベースとするというのに納得できます。


### 人工知能（AI）
仮想空間とはいえ、法令やモラルを守る必要があります。人の手によって番人をすることは現実的ではないと考えられます。
AIを用いて通話内容や、チャット内容を分析の上、違反が無い事をチェックする必要があるかと思います。
技術的には音声データからの文字起こし、文章の解析が考えられます。
Tkinterのsuper().__init__(master)について

# tkinterのsuper().\_\_init\_\_(master)ってなんだ
初めてtkinterでGUIアプリを作成しようとした時、参考にするサイトで
```python
super().__init__(master)
```
という行を見かけました。
始めは「なんだこれ！わかんねぇ！」ってなっていたけど微妙に理解したので脳内メモがてらこの記事を書きます。
厳密にはちょいちょい違うかもしれないけど大雑把に、といういうことで、、
# super()ってなんだ
`super()`っていうのは、
```python
super().親クラスのメソッド
```
って書くことで継承した親クラスのメソッドを使えるようになる、というもの。
そして`__init__()`はクラスのコンストラクタ。コンストラクタというのはクラスの生成時に実行されるメソッド。


　いらんと思いつつ一応超大雑把に説明すると、
<dl>
  <dt>クラス</dt>
    <dd>・関数群みたいな感じ</dd>
  <dt>メソッド</dt>
    <dd>・クラスの関数群のその一つ一つ</dd>
</dl>

って感じ

つまり
```python
super().__init__(master)
```
は継承した親クラスのコンストラクタに引数`master`を渡して実行しているという事。
# もう少しコードを思い出す
「よく見かけたコード」をもう少し思い出してみる。大体こんな感じ。
```python
import tkinter as tk
class Window(tk.Frame):
    def __init__(self,master):
        super().__init__(master)
        self.pack()

root = tk.Tk()
window = Window(root)
root.mainloop()        
```
参考にしたサイトによるけど大本はこんな感じなはず。多分。
# 何継承してるんだ
- `Window`クラスは`tk.Frame`を継承している。
- `tk.Frame`はtkinterのFrameというものを指している。

あれ？

ここでtkinterでFrameを使うときを思い出してみる。
```python
tk.Frame(ウインドウオブジェクト)
```
みたいなこと書かなかったっけ。しかもこれ、tkinterの`Frame`クラスのインスタンスを作ってるってことだよな？ここで`Frame`クラスのコンストラクタが呼び出されてるっぽい。
# つまりsuper().\_\_init\_\_(master)とは？
つまり、`tk.Frame`を継承したクラス内での
```python
super().__init__(master)
```
は
```python
tk.Frame(master)
```
と同じってことか！

`master`も、ウインドウオブジェクト`tk.Tk()`に名前つけただけっぽいね。
# おまけ
`Window`クラスでの`self`はFrameと思って大丈夫（っぽい）です。
上のサンプルコードの一部を
```pyton
super().__init__(master,width=500,height=500,bg="beige")
self.pack()
```
に書き換えて、色のついた部分を見ればわかると思います。
AIで成功するために必ず必要なこと

AIの取り組みを軌道に乗せるために、最も優れたアルゴリズムや機械学習技術を使用する必要はありません。完璧なユースケースを見つける必要もありません。最高にクリーンで高品質なデータセットも必要ありません（少なくとも、最初から必要なわけではありません）。AIで成功するために必要なのは、何よりもまず人なのです。
![people-learning-with-whiteboard-drawing.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/db47cf32-df72-45cf-7deb-d2b7ffc07ef7.jpeg)


## データと行動者をつなぐ
データと実行者を結びつけることができない企業、つまり、物理的な高価値機器、マーケティングキャンペーン、サプライチェーン、バックオフィス、カスタマーサポートなど、ビジネスのあらゆる部分で物事を動かすために日々働いている人々の前にデータを届けることができない企業は、生き残ることはできないでしょう。未来ではAIが組織の一部となりますが、人々を活かすことができないということは、努力がどうしても足りないということになるのです。

小さな、領域の異なるユースケースを多く集めることでは、大きなROIを得ることはできません。企業全体でAI戦略を持つこと、技術的なインテリジェンスを集約することが重要です。

適切なテクノロジーへの投資はどうでしょうか？AIプロジェクトに適切なプロセスを導入するのはどうでしょうか？確かに、成功するためには、技術、プロセス、そして人材が必要です。少なくとも、必要なものは「データ」ではないでしょうか？ 高品質のデータがあれば、尚良いのではないでしょうか？

## あなたがいなければ、それはただのデータ
もちろん、人がいれば、適切なテクノロジーとプロセスも必要になります。そしてもちろん、人が働くための（良い）データも必要です。しかし、データはあくまでもデータであり、それ自体ではなにもできないのです。

##### リスクの特定と評価
Amazonが採用ツールを廃止したのは、女性に偏っているという理由だったのを覚えていますか？あるいは、Googleの写真アプリが、肌の色が濃い人をゴリラだとラベル付けをしていたことがありませんか？AIシステムによって引き起こされたPR危機の例は、あちこちにあります。説明可能で責任あるAIのためのツールが、より洗練され一般的になりつつあるのは事実ですが（[例えばDataikuは、特徴量の重要性、部分依存グラフ(PDP: partial dependence plots)、亜集団分析、個々の予測説明のレポートを提供します](https://www.dataiku.com/product/key-capabilities/explainability/)）、[人間がループに入る必要性](https://blog.dataiku.com/automation-in-data-science)に完全に取って代わることはないでしょう。なぜなら、以下のようなことは、人間にしかできないからです。


##### 意思決定の振り返り
どんなに高度なテクノロジーであっても、組織が何を必要としているかを批判的に考え、何をしなければならないかを判断することはできないでしょう。AIは人間にとって不可欠な意思決定のパートナーになり得ますが、重要なビジネス機能に影響を与えるような決定を行うことはできませんし、そうすべきではありません（少なくとも、人間がループ内でチェックすることは必要です）。例えば、カスタマーサービス担当者が製品やサービスをレコメンドするのを支援するAIシステムを構築しても、そのレコメンドを行う最適なタイミングや、そのレコメンドがまったく意味をなさないかどうかを判断できるのは人間だけです。さらに深刻な例として、融資を実行するAIシステムを考えてみましょう。この場合でも、システムが期待通りに動作しているか、ビジネスを危険にさらしていないかを確認するために、人が必要です。

##### ストーリーを語る
結局のところ、AIシステムを設計するのは人間なのです。すべてのAIユースケース、すべてのAIサクセスストーリー（または失敗談）の背後には人間がいるのです。データを掘り下げ、それを新しい創造的な方法で利用する方法を見出すには、機械の背後にある魂が必要なのです。

例えば、Dataikuはあるトラックメーカーとあるユーズケースに取り組んでいたときのことです。彼らは、比較的古典的な（それでも難しい）ユースケース、つまりモノのインターネット（IoT）センサーを活用した[高度な予知保全](https://pages.dataiku.com/predictive-maintenance-optimize-operations-ai)について、[概念実証（POC）](https://pages.dataiku.com/data-science-poc)を行うことを希望していました。このプロジェクトに取り組むにあたり、チームは組織内のさまざまなチームから、トラックの動きなどの古典的なソースだけでなく、保証の情報などのあまり目立たないデータも含めて、これまで統合したことのないデータを集めました。

最終的に、これらの異なるデータソースを組み合わせることで、彼らはいくつかの奇妙な点を発見しました。特に、使用停止になっているはずのトラックが、代わりに移動していることがありました。つまり、保証期間内のトラックの修理のために部品を送っておきながら、実際にはその部品を保証期間外の別のトラックに使っているケースがあったのです。最終的にPOCが成功したのは、当初のビジネスニーズよりもさらに重要な問題をチームが発見したからです。そこに至るまでには、人々が頭を寄せ合い、データに潜り込むという創造性が必要だったのです。

これらはすべて本質的に人間の資質であり、どんなにテクノロジーを駆使しても、AIに投資しても、こうした重要なタスクを人間が担う必要性を取り除くことはできないのです。

<br>
<br>
<br>

*AIは、日常的なデータを、数字以上のものに変えます。AIで成功している企業のストーリーと、Dataikuがどのようにご支援しているか、[こちら](https://www.dataiku.com/without-you/)よりご覧ください。*

<br>
<br>
<br>
<br>

原文：[*The #1 Thing You Need to Succeed With AI*](https://blog.dataiku.com/succeed-with-ai)
【WSL】エラー：0x80370102 の対処法：CPU仮想化を有効にする

# はじめに
WSLのインストール手順の過程で出たエラーの対処の記録です。
BIOSは人によって違うと思いますので、そこは各自調べていただけると幸いです。
参考サイトを張っておきます。
http://intint000.blog96.fc2.com/blog-entry-2072.html

# 1. PCを再起動してBIOSを起動する
起動するときに「del」キーを押しっぱなしにして、BIOS画面を表示させます。
起動するとこのような画面になります。(使ってるマザーボードによって異なります)

![MSI_SnapShot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1604294/c1389928-cc47-c1ec-5b22-18a57bd55319.png)


# 2. Advancedの項目に切り替える

![MSI_SnapShot_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1604294/b2b7bd28-bc1c-fb4d-ebf7-9a390e952faf.png)

# 3. OCの項目を選択

![MSI_SnapShot_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1604294/407b2d74-4a98-4342-a980-cf606b75c0ea.png)

# 4. CPUの機能を選択

![MSI_SnapShot_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1604294/d6e14c1f-bd31-c06f-273a-2aa9544f679f.png)

# 5.SVM Modeを有効にする

![MSI_SnapShot_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1604294/adf37ad3-4e21-1bed-7fb0-019edceac44a.png)

![MSI_SnapShot_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1604294/ee84e51f-a637-733e-3b4c-ed8b94f1bbd6.png)

![MSI_SnapShot_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1604294/2ea2094f-6b03-629a-0609-63e693a41455.png)

# 6.BIOSを閉じて起動する
# 終わり
これでPowerShellでUbuntuと入力すると起動するはずです。
Git fetch, merge,pullの違い

# はじめに
上のGit fetch, merge,pullがそれぞれ似ていてややこしいので調べてみました。
Git操作は開発現場では必須のスキルなので僕自身がgitの使い方を勘違いしたまま
現場に入ってしまったのが上の３つのコマンドの違いです。

それぞれ3つの違いを説明して行きます。
まずがgitの前提知識からです。


# ローカルリポジトリとリモートリポジトリの違い
Git にはローカルリポジトリとリモートリポジトリという２種類のリポジトリが存在します。

両者の違いは以下の通りです。

|リポジトリ|説明|
|--|--|
|ローカルリポジトリ|開発者が作業するPCにあるリポジトリ|
|リモートリポジトリ|開発者全員が共有できるリポジトリ(サーバーなどに上がっている)|

ローカルリポジトリで開発し、リモートリポジトリにプッシュして
開発者全員が共有できるようになります。

# ローカルリポジトリの中身
ローカルリポジトリは以下の4つがあります。

|***ワーキングツリー***|作業場所でこれからコードを追加する場所|
|--|--|
|***インデックス***|コミットするファイルを登録する場所|
|***ローカルブランチ***|ローカル環境にあるブランチ|
|***リモート追跡ブランチ***|リモートリポジトリのコピー|


図にするとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/7d947bb9-911c-9690-af8d-1c5e7839e20e.png)


>引用　https://kray.jp/blog/git-pull-rebase/


ここまでが前提知識です。

# Git fetch
***リモートの最新情報のコピーをローカルに反映するコマンド***です。
取り込む場所はmasterブランチではなく、
```origin/master```ブランチに取り込みます。

#### 使い方

```
$ git fetch
```
これをやった時の画像は参考資料がわかりやすいので載せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/7fc48df8-3ae5-36dd-3d6c-e5456f8d8406.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/1d248161-7b36-678d-080b-d57bbdd17357.png)

>引用　　https://kray.jp/blog/git-pull-rebase/

他のコマンド例としては

```
$ git fetch origin master
```
これで　***リモートのmasterブランチからローカルのorigin/masterブランチへ***反映します。

#### 補足
・***masterブランチ***はリリースする時に使うブランチの中心的な役割で
ここからブランチを切って開発して行きます。

・***origin/masterブランチ***はローカルにある、リモートのmasterブランチを追跡する***リモート追跡ブランチ***です。

# Git merge
***現在いるブランチの内容を他のブランチやmasterなどに反映させるコマンド***です。
***origin/masterからmasterへ最新情報を反映***させます。

参考資料の画像を見るとわかりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/8a46f848-ee6e-7421-42e9-c1f1aec6b64e.png)


masterブランチの内容を今いるブランチにマージしたい時には下のコマンドを使うみたいです。

```
$ git merge master
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/6d4c9aaf-33b2-3351-69ef-230593696a7e.png)

これで今いるブランチの中に master ブランチの内容が反映されます。


>引用　https://kray.jp/blog/git-pull-rebase/


# Git pull
***git mergeと　git pullを同時に行うコマンド***です。
リモートのmasterブランチからローカルのmasterまで一気に最新情報を反映させます。

mergeまで一気にやるため、ローカルブランチとコンフリクトが起きやすいみたいです。

#### コマンドで確認してみる
Git fetchとGit mergeのコマンドで見て行きます。

⚫︎Git fetch

```
$ git fetch   //リモートの状態をリモート追跡ブランチにコピー
```

⚫︎Git merge

```
$ git merge origin/master  //リモートのコピーからマージ
```
***これらのコマンドを一括でやるのがgit pullです。***

```
$ git pull origin master
```

### 注意
先輩エンジニアから聞いたのですが、
git pullはあまり実務で多用することはないみたいです。


### 参考資料

https://qiita.com/wann/items/688bc17460a457104d7d
https://kray.jp/blog/git-pull-rebase/
完全無料本格太平洋戦争戦略級シミュレーションゲーム"Gary Grigsby's PACIFIC WAR"のプレイ方法(1)

![titileQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/8092b3aa-5639-e310-8d41-7327c02a132d.png)
### 0. ゲームの紹介
　Gary Grigsby（ゲイリー・グリグスビー、と発音するのだと思います、たぶん）'s PACIFIC WAR（以降、必要があればggpwと書きます）は、1940年代の大日本帝国と連合国の戦争を題材とする戦略級シミレーションゲームです。
#### (1) 主な特徴
①プレイヤーは大日本帝国、連合国のどちらでもプレイできます（その気になれば両陣営とも担当することもできます）。ゲームマニュアルによれば、プレイヤーは山本五十六連合艦隊司令長官、あるいはチェスター・ニミッツ太平洋艦隊司令長官のどちらかの役割を担うことになります。
②デフォルトでは相手方はコンピュータですが、メールなどを介して暗号化されたセーブファイルを交換することで、人対人の対戦ができます。
③1ターン1週間のターン制でゲームは進行します。
④艦艇は1隻、航空機は1機、兵員は1名、燃料・物資は1トンの単位で登場し、陸戦・航空作戦・艦隊戦のために部隊を編成し、指示を与えることでゲームが進行します。部隊に指揮官と作戦目標を指定して、編制・補給・移動・戦闘などをすべて自動で行わせることもできます。
#### (2) 推しの理由
①実際の太平洋戦争で日本軍が勝てる可能性はほとんどありませんでしたが、このゲームでは米軍の損害が一定に達すると停戦イベントが発生するため、日本軍勝利の結果を導くこともできます。
②指揮官が実名で登場し、特徴がパラメーター化されていて、指揮部隊の行動に影響を与えます。
③艦艇は史実通りに竣工し、航空機の開発も史実通りに行われます。航空機の生産数はユーザがコントロールできます。
④ゲームオーバーにならなければ1946年まで戦争を継続できるので、実用化に至らなかったロケット戦闘機秋水や前翼型高速機震電などの生産・配備も可能です。
⑤戦略爆撃、通商破壊に加え、鼠輸送、暗号解読、特攻や原爆投下もルール化されています。
⑥マニュアルおよびインタフェースは英語なので、世界中の人と対戦が可能です（筆者は過去に、アメリカ・チェコ・ニュージーランドの方とプレイしたことがあります）。
### 1. ゲームの入手とプレイ
#### (0) 動作確認環境
OS　Windows 10 Pro
バージョン　21H2
#### (1) 入手
　以下のサイトからZIPファイルをダウンロードします。tapatalkへのログインが必要ですが、アカウントは無料で作成できます。2022年3月4日時点での最新バージョンは3.2.16cです。
https://www.tapatalk.com/groups/pacific_war_update/pacific-war-update-version-3-2-16-t176.html
#### (2) 起動
　ダウンロードしたZIP形式ファイルを（バージョン3.2.16cの場合はPacwar3216c.zip）を解凍し、中にある0START THE GAME.batをダブルクリックすれば起動します。インストールは必要ありません。
#### (3) プレイ方法
　ZIPファイルのDocumentationフォルダにあるPcwWgaRules-100512.pdfがマニュアルです（PDFは3種類ありますが、このPDFファイルだけを見ればOKです）。
#### (4) ゲーム画面
　真珠湾攻撃から帰還中の第一航空艦隊と航空母艦赤城の艦載機の状態を示した画面です。Windowsも存在しなかった1990年代初期に製作されました。1MB容量のフロッピーディスクで起動させる前提で設計されたゲームなので、グラフィクスとUIは期待できませんが、ゲームデザインは極めて秀逸だと思います。
![afterPearlHarbor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/d30923cd-06f9-8108-27f1-668e68c7fc46.png)
![ZeroOnAkagi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/0c0a71af-5251-23f3-9f99-ecfd6f38f973.png)
　左端に南雲忠一中将の名前が見えています。飛行隊の練度(experience 88)や作戦不能機体数(damaged 2)、被弾耐性(durability 10)など、シミュレーションと言って決して過言ではないほど実に細かいパラメーターが用意されています。
　以下は作戦地域全体の地図です。
![BigPacWarMap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/74ac81ac-6b06-cce1-6cfa-eba6b056123d.png)
### 2. おわりに
　実は最初は、MS-Dos時代の古いソフトを実行するエミュレーション環境である、DOSBoxとその使用例を技術資料として残すことが目的でした。しかしながら、ggpwの最新パッケージはDOSBoxも内包されていて、全くセットアップ無しで実行できてしまうことが判明し、書くことが無くなってしまい（笑。DOSBoxの使用に関する一事例として考えてもらえればと思います。
　今後は、DOSBoxの使用方法に加えて、ggpwの具体的なプレイ方法について（こっちがメインになりそうですが ^^;）、マニュアルの日本語化も含め追々書いていきたいと思います。同好の士が増えて対戦やディスカッションができればいいなと考えています。
【PHP】クラスとは

# ※クラスをなぜ使うか？

共通で使いたい処理をまとめていつでも呼び出せるようにしたいから

```PHP 
<?php

class Food
{
    public $cat = "キャットフード";
    public $dog = "ドッグフード";
    public $bird = "パフ・ザ・フルーツ";
    
    public function cry($animal) {
        if($animal === 'cat') return $this->cat;
        if($animal === 'dog') return $this->dog;
        if($animal === 'bird') return $this->bird;
    }
}

$food = new Food();

echo "猫の餌：".$food->cry('cat');
echo PHP_EOL;
echo "犬の餌：".$food->cry('dog');
echo PHP_EOL;
echo "鳥の餌：".$food->cry('bird');

```

# 結果
```
猫の餌：キャットフード
犬の餌：ドッグフード
鳥の餌：パフ・ザ・フルーツ
```
JavaScriptにおける無名関数とアロー関数の「this」のスコープの違いについて

# 前置き

これについて学ぶ発端となったのは、以下のコードを書いているときでした。
リクエストを並列に走らせたく、Promise.allを使う必要がありました。
Promise.allの引数には、配列でPromiseオブジェクトを渡す必要があるので、下のputs（）というPromiseオブジェクトを返す関数も作成しました。

以下ではエラーが出るのですが、どこが間違いか気づきますか？

```JavaScript
method(A, B) {
  // 処理
}

puts(A, B): Promise<void> {
    return new Promise(function(resolve) => {
      this.$api
        .get('/tech-talk')
        .then(response => {
           this.method(A, B)
        })
        .then(() => resolve())
    })
 }

funcA(): Promise<void> {
    const promises = [
      this.puts(1, 1),
      this.puts(1, 2),
      this.puts(2, 1),
      this.puts(2, 2)
    ]
    Promise.all(promises).then(function() {
      this.funcB()
    })
}
```

間違いは以下になります。

``` JavaScript
puts(A, B): Promise<void> {
    return new Promise(function(resolve) => {
      // 'this' implicitly has type 'any' because it does not have a type annotation
      this.$api
        .get('/tech-talk')
        .then(response => {
           // 'this' implicitly has type 'any' because it does not have a type annotation
           this.method(A, B)
        })
        .then(() => resolve())
    })
 }

functionA(): Promise<void> {
    const promises = [
      this.puts(1, 1),
      this.puts(1, 2),
      this.puts(2, 1),
      this.puts(2, 2)
    ]
    Promise.all(promises).then(function() {
      // 'this' implicitly has type 'any' because it does not have a type annotation
      this.functionB()
    })
}
```
 **エラーメッセージが出ているのは、全て「this」を扱っている箇所です。** 
最初なぜなのか分かりませんでした。

正解パターンは以下です。

``` JavaScript
puts(A, B): Promise<void> {
    return new Promise(resolve => {
      this.$api
        .get('/tech-talk')
        .then(response => {
           this.method(A, B)
        })
        .then(() => resolve())
    })
 }

functionA(): Promise<void> {
    const promises = [
      this.puts(1, 1),
      this.puts(1, 2),
      this.puts(2, 1),
      this.puts(2, 2)
    ]
    Promise.all(promises).then(() => this.functionB())
}
```


 **Promiseのコールバック関数を無名関数からアロー関数に変更しただけです。** 

# 無名関数とアロー関数のthisの取り扱い方の違い

|  関数  |  thisの扱い方  |
| ---- | ---- |
|  無名関数  | それが何を指し示すかは文脈によって変化する。 <br> そのメソッドにアクセスしたオブジェクトが、thisとなる。  |
|  アロー関数  |  文脈に依存せず、宣言された時点でthisを確定する。<br> 呼び出された場所をthisとする  |

上に掲載したコードを例にすると、コールバック関数が無名関数の場合、thisはPromiseオブジェクト自身にあたるので、外のdataやmethodを参照できない。

逆にアロー関数の場合、呼び出し元からthisのスコープが引き継がれるので、外のdataやmethodも参照ができる。

 **補足** 
function が基準スコープになるのが JavaScript の大きな特徴 (var のスコープもこれに準ずる)。
そのため、function を入れ子にした途端 this の指すものが変わってきてしまうので注意が必要。
それに対して、アロー関数を利用すると関数をどんなに入れ子にしてもthisの指すものは変わらず固定化される。

# その他無名関数とアロー関数の違い

[JavaScript: 通常の関数とアロー関数の違いは「書き方だけ」ではない。異なる性質が10個ほどある。](https://qiita.com/suin/items/a44825d253d023e31e4d)

# 参考記事
[【Vue.js】Promiseのcallback処理にComponentで定義したmethodの使用](https://qiita.com/someone7140/items/710a757031f26bf79ac0)
[JavaScript の this を理解する多分一番分かりやすい説明](https://qiita.com/takkyun/items/c6e2f2cf25327299cf03#%E8%A3%9C%E8%B6%B3%E3%82%A2%E3%83%AD%E3%83%BC%E9%96%A2%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
Indesignで数式をインラインオブジェクトとして入れるときに、前後の間隔を開ける方法

数式が入った文章をインラインで組んでいくときに、数式は

http://hooktail.maxwell.jp/cgi-bin/mathimg.cgi

で画像で作成する。

それを本文にインラインオブジェクトとして入れるが、そのままだと、横の文字と近すぎて読みにくい

なので、数式を入れたとき必ず、前後に開きを設定したい。


方法を調べると、
https://www.dtp-transit.jp/adobe/indesign/post_1955.html

インライングラフィックは、いうなれば、1文字のような扱いになっているので、文字スタイルが適用できます。
［文字前のアキ量］、［文字後のアキ量］のほか、ベースラインシフトなどの調整を行うときにも重宝します。

となっていた。

選択ツールで数式を指定し、文字スタイルでアキ量を設定してもうまくいかなかったのでメモ

選択ツールで画像をクリックするのではなく、カーソルで選択するとうまくいった。
Einstein Searchの検索結果の表示項目を変える



セカンダリ項目は、検索レイアウトで最初の対象項目です。すべての項目をセカンダリ項目に設定できるわけではありません。。システム管理者が、検索レイアウトに表示するレコード項目とその項目の順序を選択すると、その選択によってセカンダリ項目が決定されます。


[Einstein Searchの検索結果について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FTJl7)
Bell icon color の色を変えるCSS


これで大丈夫らしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0248884d-0ab2-e692-da09-a63bb8fbe468.png)



```
.themeHeader .slds-icon-utility-notification svg {
    fill:#000 !important;
}
```

[Bell icon color](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FSihe)
Ajaxコードとjsonデータのストレージモード

Ajaxコードはformフォームに代わってリクエストを送ります。
安全目的のために、ドメイン間を越える問題が発生する。

<strong>HTMLのエラーコード以下：</strong>

```rb
  Access-Control-Allow-Origin
```

IPアドレス、ポート、一つが間違っている限り、クロスドメインが現れます。

<strong> Mavenプロジェクトを作成するための条件 </strong>
![Qiita](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524339/958706c8-6f68-c84b-8780-51a0061a515e.png "Qiita")
Bean：Java類とmysql表に対応します。
controller：リクエストを受け取る。（servlet）
Dao:データベースを操作します。
service：操作業務の論理。
utils：ツールバッグ。
vo—MtResult：Javaがページに転送したデータ。

<strong>jsonデータのストレージモード</strong>
keyに応じてvalueを取得
```rb
var json = {
    "key1":"value1"
    "key2":"value2"
    "key3":{
        "key1":"value1"
        "key2":[
             {}
             {}
         ]
      }
 }
```
エクセルでマウスを使わずに数式バーに移動する方法

F2 　→ 　Home 　→　 =  　→ 　CTRL+A  → 　BackSpace


Office365の場合
F2　　→ 　CTRL+A  → 　BackSpace

Office365で既に入力がある場合
F2　　→ 　CTRL+A　　→ 　CTRL+X　　→ 　CTRL+A  → 　BackSpace　　→ 　CTRL+V


※　=　は本当にイコールを入力です
※　CTRL+A は　数式パレットを表示　です。
　　本来　例としてセルに　=SUM　まで入力して
　　CTRL+A を押すと　数式パレット　が表示されます。
[AWS]ReactアプリケーションをS3にデプロイするときにyarn buildができない

# 初めに
今回はReactアプリケーションを初めてS3にデプロイしようとしたときに直面したエラーについて綴っていこうと思います。
かなり初歩的なミスなのですが、自分への戒めとして残していきます。


ディレクトリ構成は以下の通り
(dockerにて環境を作っております。)

```
front
├ app
┃  ├ node_modules
┃  ├ public
┃  ├ src
┃  ├ types
┃  ├ package.json　・・・①
┃  ├ README.md
┃  ├ tsconfig.json
┃  └  yarn.lock
├ node_modules
├ Dockerfile
├ package.json ・・・②
└ yarn.lock 

```

frontディレクトリにてyarn buildを実行。

``` ターミナル
$ cd xxx/front

$ yarn build
```

すると、下記のエラー発生。

```
error Command "build" not found.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

yarnにbuildコマンドがないということ、、、
とりあえず、上記ディレクトリのpackage.json②をみてみることに。


```package.json②
{
  "dependencies": {
    .
    .
    .
  },
  "devDependencies": {
    .
    .
    .
  }
}


```
buildが確かにない、、、
ここでpackage.jsonがもうひとつあることに気づき、中身を確認。

```package.json①
{
  "name": "app",
    .
    .
    .
  "scripts": {
    "start": "NODE_ENV=production react-scripts start",
    "build": "NODE_ENV=production react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
    .
    .
    .
}
```

buildがありました。

#### 解決策

もともとfrontディレクトリ内で yarn build を行なっていたのですが、実際に行うべきだったのはappディレクトリ内でした。
dockerで環境を構築している分、通常の環境よりもディレクトリ構成が複雑になっていたので、間違えないように気をつけます。

```
$ cd /app

$ yarn build

```

成功しました。
背景色をグラデーションする方法

# CSSを使って背景濁をグラデーションにする方法

## background: linear-gradient(-135deg, #FF00FF, #9941D8);プロパティーを使用します。


### 具体的なコードに書き方
```
form input[type="submit"] {
  background: linear-gradient(-135deg, #FF00FF, #9941D8);
}
```

### 結論
1.deg値
　角度を表す値で、右回りですと３６０度、左回りですとー３６０度と記述します。
上記の-１３５は時計の7時から８時の方向にグラデーションしていきます。
2.#FF00FF, #9941D8値
　カラーを表す値で、何色から何色にグラデーションしていくか決めることができます。
Cognitoが現在抱えるサインアップに関するバグ(2022/03/04現在)

## 同じ電話番号のユーザが複数同時に作られてしまう

Usernameに電話番号を指定して、SignUpAPIを一度しか叩いていないのに、
ユーザープールのコンソールでその電話番号を検索するとなぜか複数のアカウントが出現！
という事象に遭遇しました。

これを**AWSのサポートに問い合わせたところ、現在かかえるバグ**なのだそうです。
ちなみに、そのユーザープールはサインアップ前のトリガーでLambdaをつかってゴニョゴニョしていたため、
トリガーの設定によるものかと尋ねたところ、それは関係なく確認されているそうです。

(明確にサポート側からバグだと明言されたのは私には初めての体験でした！）

## 知っておこう

こういう事象が発生するということを認識していないと、電話番号が一意であるという前提でシステムを組んでいる場合に問題が発生します。
この挙動を知っていれば一意にするために何か別の処理を加えることで対応はできますね。

## 具体例

私が最初に遭遇したのは以下のような設定のユーザープールでした。

![スクリーンショット 2022-03-04 9.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632997/52145c46-694c-a028-b38e-3949820f6e65.png)

- 電話番号でログイン
- 電話番号の検証プロセスを別で用意
- トリガー(Lambda)内でユーザの電話番号を検証済みにする

この状態で 

```
aws cognito-idp sign-up --client-id ************** --username "+81**********" --password "************" 
```

これを打つと、稀に同じ電話番号のユーザが複数できているのでした。

## 挙動

同じ電話番号のアカウントが複数存在する場合の挙動を以下に記します。

- ログイン(InitiateAuth)をすると、一番初めに登録されたアカウントの情報が返される
- 電話番号を指定してDeleteUserを行うと、一番初めに登録されたアカウントが削除される
- アカウント1つを削除後にログイン(InitiateAuth)しても、エラーになりユーザ情報は返されない
  - 削除についても同様
- アカウント1つを削除後に、**同じ電話番号でサインアップ(新規登録)すると登録できる**

通常、上記の設定だとAという電話番号のアカウントが存在する場合に、 SignUpAPIでその電話番号で新たにアカウントを作ることができません。
しかし、これらの挙動を見るに、複数アカウントが作成された場合の**電話番号による**ログイン、削除、サインアップについては、**他のアカウントは存在しないかのように扱われる**ようです。



## その他参考になる記事

https://qiita.com/aki/items/e35e1bea8c27cfab5e9e
初心者ブロックチェーンに挑戦する　3

# だから素人は失敗する

# 朝起き抜けに知る恐ろしい事態

　実は[UN/CHAIN](https://app.shiftbase.xyz)というWeb3のコミュニティーに申し込みをしているのだけれど、希望者殺到とかで開始が遅れていて、そのせいもあって、積ん読だった本に手をつけて作業を始めたのだけれど、３年前の情報は次々と初心者の足下を掬うのであります。

　まず本に書いてあったのは

- 同期には３種類ある　light, full, archiveである。
- 今回はfull同期をする。
- ８時間ぐらい掛かるので、夜中につなぎっぱにするのがよい。
- コマンドは$ geth --syncmode fast --cache=1024

　で、コマンドを打つと、エラーが出る。

- fastというコマンドはない
- light, snap, fullから選べ

　考え方は二つあったと、今ならわかるけれど、full同期、と何度も言われていたので、fullが焼き付くのは素人としては致し方なかったと思う。full同期といいつつ、fastというコマンドが書かれていて、それがないとなったら、「あら、誤植かな」と思うのが文系の発想だ。だから私は

## $ geth --syncmode full --cache=1024　と打って眠る。

　朝起きて、まだ営々と動いているターミナルを見て、最初に思ったことはこうだ。

「そうか、三年もたつと、人気も出て、チェーンも長くなっているだろうし、容量が増えているんだろうな」

　まあそれは、あながち間違いではない。本には月30GBのペースで成長していて、2017年（５年も前だ！）で350GBとと書いてある。当然今はすごいことになっているはずだ。ちょっとググルと、650GBとか書いてあるものもある。2Tあるから大丈夫と考えるか、半分持っていかれるぞ、と考えるか、その辺をうろうろしながら、チカチカと走り続けるターミナルを眺める。

- light, full, archive
- light, snap, full

　突然、気がついた。この並び。リスト。私が選んだfullは、旧archiveではないのか？　なんて紛らわしい変更をしてくれるんだ。ググり方を変える。ともかく、できるだけ、一日でも新しい情報。ビンゴ。

## 私はproのマイナーになりたいわけじゃない

　通信速度が600あったって、追いつくわけがない。というか、これは追いつくものではなく、つなぎっぱでずっとつきあっていく類いの同期だった。さあ、止めないと。どうやったら止まるんだ。

- gethの終了は[Ctrl]+[c]

　10時間近く取得し続けたデータはどうすればいいんだ。

- geth removedb

　そして改めて、snap同期を開始。ちょうど１年前の記事で、２時間ぐらい、と書いてある。さあ、どうなるでしょう。そしてその記事で恐ろしい事実も判明。なんと旧full換算だと、2021年現在15TB!!!

## だからテキストはできるだけ新しいものを読みましょう　


　

https://techmedia-think.hatenablog.com/entry/2021/03/21/165151


https://block-chain.jp/ethereum/ethereum-geth-synchronisation-failed/
Flowに変換する時に発生するエラーについて　Unsupported Formula error


Flowで使えない関数があると変換できないようです。

Unsupported Formula error

使えない関数

+ ISPICKVAL
+ ISCHANGED
+ PRIORVALUE
+ CONTAINS (カンマがあると使えない)
+ [CONTAINS operator in Process or Flow do not work for comma separated values](https://help.salesforce.com/s/articleView?id=000334380&type=1)

ISPICKVALの代わりにTextに置き換える
ISPICKVAL(StageName, "Closed Won")
TEXT(StageName) = "Closed Won"



# 関連する質問を以下にまとめます

+ [Unsupported Formula error](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FTYA6SAP)
+ [Migrate to Flow Unsupported Functions](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FT4DbSAL)
ルーティングの指定方法について

ルーティングにおいて

collectionとmenberの違い。
idを特定することができるのがmember
書き方としては下記のようになる。

    collection do
      post :confirm
    end
    member do
      patch :confirm
    end

もしくは
　
　　post:confirm, on:collection
 　　patch :confirm, on:member

と書くこともできる。