OmniAICreator/Qiita-1.07M huggingface dataset:
activating a deployed Omniscript



画面的には似たようなエラー何ですが...


[Activated OmniScript LWC Download Error [Could Not Find The LWC component, please deploy] ](https://help.salesforce.com/s/articleView?id=000395052&type=1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/824be41a-84a8-26f5-bf22-f7fb8206e1ad.png)


これは、標準 OmniStudio ランタイムが組織で有効になっている場合に発生します。これを有効にすると、OmniScript の LWC 生成がオフになります。

この後、OmniScript の LWC を次のようにダウンロードできます。 Standard OmniStudio Runtime を無効にしたままアクティブ化すると、LWC を生成できるようになりました。

+ [Error when activating a deployed Omniscript](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aiVmLSAU)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/10718f14-a674-b3bc-954a-27febe555fcd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/58e066e2-acd5-f414-1a00-e5d64f8ca543.png)


# 関連資料

+ [LWC OmniScript のアクティブ化とデプロイ](https://help.salesforce.com/s/articleView?id=sf.os_activate_and_deploy_an_lwc_omniscript.htm&type=5)
【Flutter】「SocketException: Failed host lookup」の対処法

# はじめに

Flutterでアプリ開発を実施している際に、以下のエラーが吐かれたので、原因と解決方法を紹介します。

```
SocketException: Failed host lookup: ‘{project}’ (OS Error: No address associated with hostname, errno = 7)
```

# こんな人に読んでほしい

* Flutterでの開発を行っている方
* Flutterでの開発を検討している方
* Flutter初学者の方

# 原因

結論、Androidエミュレータからネットワークに接続して画像を表示させようとした際に、AndroidManifest.xmlで接続許可をしないといけませんでした。


# 対応

解決方法は、以下のファイルにインターネット利用許可のパーミッションを1行追加するだけでOK。

```{project}/android/app/src/main/AndroidManifest.xml```


```xml
<manifest xmlns:android="http://~~"
    package="com.{project}">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> // ここの1行を追加
    <application
        android:label="{project}"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
    ~省略~
</manifest>
```

これだけです。

# 最後に

設定の完了後、ホットリロードで設定が反映されなかった場合、エミュレータを再起動してみてください。
問題なく画像が表示されているはずです。
HTMLのselectでページ読み込み時に表示する文字列と選択時に表示する文字列を別のものにしたい

# 実行環境
- Nuxt3
- Typescript


# やりたいこと
- ページ読み込み時に表示する文字列と選択時に表示する文字列を別のものにしたい
  - `ペットの種類で絞り込み`はページ読み込み時に表示させたいが選択肢には表示させたくない
  - `絞り込みを解除`は選択肢に表示させたい

![スクリーンショット 2024-04-15 101113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691939/6918ef17-6b02-1a42-626d-a10fd7420f95.png)

# やること
```.html
<label for="pet-select">Choose a pet:</label>
<select id="pet-select">
  <option :value="null" hidden disable>ペットの種類で絞り込み</option>
  <option :value="''">絞り込みを解除</option>
  <option :value="pets.id" v-for="pet in pets">{{ pet.type }}</option>
</select>
```
```.typescript
pets = [{id: 1, type: "Dog"}, {id: 2, type: "Cat"}, {id: 3, type:" Hamster"}, {id: 4, type: "Parrot"}, {id: 5, type: "Spider"}, {id: 6, type: "Goldfish"}]
```
- 選択肢に含まない方のvalueにnullを、選択肢に含む方のvalueに''(空文字)を与える

## 説明
- `value`に値がないと選択肢に表示されないので何かしら値を与える必要がある
- `value`に同じ値が入ると先に定義された方が優先される
    - 上記の場合で`絞り込みを解除`をnullにすると`絞り込みを解除`を選択しても`ペットの種類で絞り込み`に表示が切り替わる
- nullと''(空文字)ではnullが優先して表示されるのでページ読み込み時表示させたい方にnullを与える
- アンチパターン
    - 選択肢に含まない方のvalueにnullを、選択肢に含む方のvalueに0を与える
        - value=0でもページ読み込み時の表示は期待したものになる
        - ただしページ遷移時等どこかしらで悪さをするので避けた方が無難


## 補足
- そもそもページ読み込み時に表示する文字列と選択肢に表示する文字列を分ける意義は薄い
#AWS S3にアップロードされたZIPファイル自動解凍

# S3にアップロードされたZIPファイル自動解凍について：
Cloudfrontに繋いでいるS3へのファイルアップロードを簡素化するため、Zipファイル格納用S3に新しいZipファイルのアップロードが検知されたら、対象Lambdaが有効化され、Zipファイル格納用S3からZipファイルをダウンロードして解凍し、Cloudfront用S3にアップロードします。

本記事はそれを実現するlambdaを紹介いたします。

# 処理フロー:
1. Zip格納用S3にZipファイルのアップロードが検知された
↓
2. 自動解凍＆アップロードLambdaを呼び出す
↓
3. (Lambda) Zip格納用S3から対象Zipファイルをダウンロードする
↓
4. (Lambda) 対象Zipファイルを解凍する
↓
5. (Lambda) 解凍した資材一式をCloudfront用S3にアップロードする
↓
終了

# Lambda作成：
以下の手順を踏んで作成します

1. AWSコンソール画面の上部にある検索欄から「Lambda」を入力し、検索する
2. Lambda詳細画面の左メニューの「関数」をクリックする
3. 右上の「関数の作成」をクリックする
4. 「一から作成」を選択する
5. 「関数名」には任意の文字を入力する
6. 「ランタイム」は「Python 3.8」を選択する
7. 「関数の作成」をクリックする
8. Lambda初期生成完了まで待つ
9. 「設定」タブをクリックし、「一般設定」を編集する
10. 「タイムアウト」項目を3分に修正する
11. 「環境変数」項目にアップロード先のS3　URLを入力する 
12. 「保存」を押す
13. 「アクセス権限」をクリックし、ロール名をクリックする
14. ロール設定画面に遷移され、許可ポリシーに必要な権限を付与する
15. S3画面に遷移し、画面上部に「プロパティ」を選択する
16. 「イベント通知」項目まで遷移する
17. 「イベント通知を作成」をクリックする
18. 「イベント名」を入力する
19. 「イベントタイプ」に「すべてのオブジェクト作成イベントs3:ObjectCreated:*」を選択する
20. 「送信先」は先ほど作成したlambdaを指定する

完了

# ZIPファイル自動解凍再アップロードLambdaサンプルコード：
```s3_eport.py
import os
import zipfile
import boto3
from tempfile import TemporaryDirectory

def lambda_handler(event, context):
    # 転送先S3のイベントトリガーから情報を取得
    
    destination_bucket = os.environ.get('DESTINATION_BUCKET')
    
    source_bucket = event['Records'][0]['s3']['bucket']['name']
    print("(1/7 対象S3読み取り："+source_bucket+")")
    
    source_key = event['Records'][0]['s3']['object']['key']
    print("(2/7 対象Zipファイル読み取り："+source_key+")")
    
    # 転送先S3クライアントを作成
    s3 = boto3.client('s3')
    print("(3/7 Lambda用S3 Client)")

    # 対象Cloudfront用Zipファイルをダウンロードおよび展開
    with TemporaryDirectory() as temp_dir:
        print("(4/7 S3 Clientに対象Zipファイルをダウンロードし展開)")
        download_path = os.path.join(temp_dir, source_key)
        s3.download_file(source_bucket, source_key, download_path)
        
        print("(5/7 "+destination_bucket+" にアップロード開始)")
        with zipfile.ZipFile(download_path, 'r') as zip_ref:
            for file_info in zip_ref.infolist():
                file_content = zip_ref.read(file_info.filename)
                file_name = file_info.filename.encode('cp437').decode('cp932')
                print("(6/7 エンコード完了："+file_name+")")
                destination_key = file_name

                s3.put_object(Body=file_content, Bucket=destination_bucket, Key=destination_key)
    print("(7/7 "+destination_bucket+" アップロード完了)")
    return {
        'statusCode': 200,
        'body': 'Files extracted and uploaded to destination bucket.'
    }

```

# 最後に：
Cloudfrontを運用するとき、ファイルの差し替えなどが面倒で、ファイル解凍とアップロードがLambdaで自動で行うと色々便利になると思います。
本記事を参考いただき、お役に立っていれば幸いです。
【Flutter】 image_editor_plus触ってみた

## はじめに
この記事では、実務で初めて image_editor_plus パッケージを用いて画像編集機能をFlutterアプリケーションに実装した経験を共有します。このパッケージに関する情報が少なかったため、実際の使用例として役立てばと思います。間違いなどがありましたら、優しくご指摘ください。皆様からのフィードバックをお待ちしております。

パッケージの導入
まずは、image_editor_plus パッケージをプロジェクトに追加します。下記は記事執筆時点の最新バージョンですが、使用する際には最新の情報を確認してください。

### パッケージを入れる
```yaml
dependencies:
  image_editor_plus: ^1.0.5
```
パッケージの詳細は公式のドキュメントhttps://pub.dev/packages/image_editor_plus を参照してください。

### 実装の詳細
以下のコードスニペットは、基本的な画像編集機能を実装する方法を示しています。ボトムバーのボタンテキストの日本語化も行っております。

```dart
ImageEditor.i18n({
  'Crop': 'トリミング',
  'Brush': 'ペン',
  'Text': 'テキスト',
  'Flip': '反転',
  'Rotate left': '左回転',
  'Rotate right': '右回転',
  'Blur': 'ぼかし',
  'Filter': 'フィルター',
  'Emoji': 'スタンプ',
});

final editedImage = await Navigator.push(
    context,
    MaterialPageRoute(
        builder: (context) => ImageEditor(
            image: data, // 編集したい画像を指定
        ),
    ),
);

```

不要な編集機能を非表示にする方法も簡単です。以下のように特定の機能を無効化することが可能です。
```Dart
ImageEditor(
    image: data,
    cropOption: null, // トリミング機能を非表示にする
);
```

### 編集機能の一覧
ImageEditor ウィジェットは、さまざまなカスタマイズオプションを提供しています。利用可能なオプションは以下の通りです。
```dart
final o.ImagePickerOption imagePickerOption;
final o.CropOption? cropOption;
final o.BlurOption? blurOption;
final o.BrushOption? brushOption;
final o.EmojiOption? emojiOption;
final o.FiltersOption? filtersOption;
final o.FlipOption? flipOption;
final o.RotateOption? rotateOption;
final o.TextOption? textOption;
```

実際の画面です
<img width="33%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630032/48b7a28d-84d9-f21f-73b2-644a7619fa10.png">

### つまづいた箇所
Containerウィジェットをタップした際に画像を選択し、その後で編集できるように設定されているものの、編集された画像がContainerに表示されないという問題が発生しているようですね。このような問題に直面した場合、path_provider パッケージを利用して問題を解決する方法が有効でした。

具体的には、path_provider を使用してアプリケーションのローカルファイルシステムにアクセスし、編集した画像のファイルパスを保存し管理することができます。画像を編集した後、その画像の保存パスを更新し、Containerで表示する際にはその保存された画像のパスから画像を読み込むようにすることで、正しく表示されるようになります。
https://pub.dev/packages/path_provider

以下にそのプロセスの簡単なコードスニペットを示します。

path_provider パッケージをインポートし、ローカルディレクトリのパスを取得します。
画像を編集し、ローカルのディレクトリに保存します。
保存した画像のパスを更新して、Containerで正しく表示されるようにします。

```Dart
import 'package:path_provider/path_provider.dart';
import 'dart:io';

Future<void> saveImage(File imageFile) async {
  // ローカルディレクトリのパスを取得
  final directory = await getApplicationDocumentsDirectory();
  final imagePath = '${directory.path}/editedImage.png';

  // 画像ファイルを保存
  final File newImage = await imageFile.copy(imagePath);

  // 保存した画像のパスを使用してUIを更新
  setState(() {
    _imagePath = newImage.path;
  });
}
```

## 最後に
短いですが以上で終わりです！
少しでも誰かの役に立てると嬉しいです🫡
ピックアップキャラを引くために必要なガチャ回数が知りたい！

# 概要

「ピックアップ中のキャラを引くには大体どのくらい課金すればいいんだ？」

令和の今を生きる現代人によくある悩みだと思います。
調べれば出てくるとは思うのですが、「この回数引いたら、80%程度で1枚は引けるよね」みたいな確率(以降、保証確率)を算出するものが作りたかったので考えてみました。

**次の項を読むだけで数学が苦手な人もエクセルで簡単に実装できる**ので、数学が苦手な人はそこだけでも読んでもらえると幸いです。

補足：Notionでも実装して公開してみました。

https://neighborly-bedbug-51d.notion.site/5a35f472d9dd4392b4575131af4f857a?pvs=4

# エクセルで実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/697935fb-4e3b-0670-9ab1-65380cb178e1.png)

上図は「発生確率3%の事象を80%の保証確率で1回以上起こすために必要な回数」を計算したものです。
今回の条件では53回の試行が必要という結果が出力されています。

結論から言うと、これを算出するための式は以下です。(詳しい説明は次項)

```math
n = \log_{1-p}(1-X)
```

よって、エクセルで表現する場合に必要な式は以下のようになります。

A1:発生確率を示したセル
B1:保証確率を示したセル

```math
 =ROUNDUP(LOG(1-B1,1-A1),0) 
```

# 確率の導出

前述した式がどのように導出されたかの説明をします。
まず、以下のように定義します
`p`:発生確率
`n`:試行回数
`P(n)`:発生確率`p`の事象を`n`回試行した場合に、1回以上事象が起こる確率(保証確率)

### フェーズ1：愚直に実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/b033ebd4-15e4-afab-6c6a-3c0ecc613499.png)

「発生確率`p`の事象が`n`回の試行回数で1回以上発生する事象」は
「発生確率`p`の事象が`n`回の試行回数で1回も発生しない事象の余事象」であるため、
求めたい確率`P(n)`は以下の式で求められます。

```math
P(n)=1 - (1-p)^{n}
```

よって、エクセルで上の数式を作り各回数ごとの発生確率を表に出力すれば`n`回行った時の最低1回以上発生する確率が求められます。

### フェーズ2：数学的に実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916360/43aebd56-45e1-b9ac-da74-08d9d86165a7.png)

パターン1でも十分に使えるものではあるのですが、発生確率が低かったりすると回数が膨大に必要になることも考えられてその場合は見づらいです。

自分が最初に欲しいと思ったものは「8割程度の確率でレアを当てるためには、何回ガチャを回す必要があるのか」を出すものだったので、数学的に考えて出力をスマートにしてみました。

パターン1で示したように、`P(n)`は以下のようになります。

```math
P(n)=1 - (1-p)^{n}
```

ここで今回は`P(n)`が80%、つまり`P(n)=0.8`になるような`n`が求めたいので以下のように代入して、`n`について変形することで必要回数`n`が求まります。

```math
0.8 = 1-(1-p)^n
```

今回0.8と置いた確率を`保証確率:X`と定義して、`n`について変形すると以下の式のようになります。

```math
X=1 - (1-p)^{n}
```

```math
(1-p)^n = 1-X
```

```math
log((1-p)^n) = log(1-X)
```

```math
nlog(1-p) = log(1-X)
```

```math
n = \frac{log(1-X)}{log(1-p)}
```

```math
n = \log_{1-p}(1-X)
```

例として、3%でレアが出るガチャを80%の保証確率で引きたいときに必要な確率を求めるとすると`p^ = 0.97, X = 0.8`なので

```math
n = \log_{1-0.03}(1-0.8)≒ 52.84
```

となるので、53回引けば80%少しの保証確率でレアを引けることが分かります。

# 感想

「試行回数n回の時の確率の計算って、愚直に計算するとO(n)になって時間かかりそう」って思っていたのですが、O(1)で計算できるとは思いませんでした。
また、計算式がlogを使うだけの簡潔な式になったので、複雑な計算ができないNotionでも実装ができたのは嬉しい誤算でした。

まさか人生でlogの変換公式を役立てる日が来るとは...

追記：
記事を書き終えた後に「二項分布で考えたほうが楽なのでは？」という疑念が

https://bellcurve.jp/statistics/course/6979.html
サーバーからgithubへssh接続

# はじめに
社内サーバーにアクセスする場合は、github Actions→サーバーへはアクセスできません。
サーバー→github Actionsへsshで接続させる必要があります。

# 前提
- sshのフォルダは作成済みとする
- github actionsが使える状態になっていること


## 手順
### 公開鍵と秘密鍵を作成する

`ssh-keygen -t ed25519`で鍵を生成。

:::note info
- ファイルの名前は混同しないように変えておくと便利
- passphraseは空(Enter押すだけ)でもいい
:::

```bash
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): file_name
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

` ls -al ~/.ssh`でちゃんと~/.ssh配下にあることを確認する。
```bash
-rw------- 1 user user  411 May 12 15:09 file_name
-rw-r--r-- 1 user user   96 May 12 15:09 file_name.pub
```


### githubに公開鍵を登録する

:::note warn
別リポジトリと同じデプロイキーは「Key is already in use」となり使えません。
:::

登録したいリポジトリの Settings > Deploy keys > Add deploy key から
公開鍵`file_name.pub`を登録する

![スクリーンショット 2024-04-12 15.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/8b2da0b8-32f6-b81e-ae2c-298d9c250a0c.png)

### secretsに秘密鍵を登録する
Settings > Secrets and variables > Actions > New repository secretから
秘密鍵`file_name`を登録する

:::note info
秘密鍵について、以下の部分も含めてペーストする
```
-----BEGIN

        PRIVATE KEY-----
```
:::

![スクリーンショット 2024-04-12 15.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/86422b33-0fda-330f-8433-390d7852efcb.png)



### github Actionsで接続できるか確認する

リポジトリ直下に、`hello.sh`を作成する

```bash
#!/bin/bash

echo "Hello"
pwd
uname -a
```

`.github/workflow`配下に、下記の内容でyamlファイルを作成する

```yaml
name: Hello Selfhosted Runner
on:
  push:
    branches:
      - develop

jobs:
  hello:
    name: Hello
    runs-on: self-hosted
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ssh-key: ${{ secrets.SSH_DEPLOY_KEY }}
          
      - name: Hello
        run: bash hello.sh


```



# 参考文献

https://qiita.com/tamorieeeen/items/c24f8285448b607b12dd

https://zenn.dev/hironobuu/articles/e85418948e896f

https://zenn.dev/kou_pg_0131/articles/gh-actions-checkout-private-repo
JavaGoldを未経験から3ヶ月で合格した時を振り返る 

前回、Java Silverの取得した過去を振り返りましたが、今回は、続けて受験したJava SE 8 Goldを取得した時の勉強方法を振り返えろうと思います。

# 当時のスペック
- progateを少し触ったことがある程度
- 前職時代の時
- JavaSilverをとって間もない状態

なので、JavaSilverの勉強で得た知見はある程度です。

# 勉強期間

- 開始日：2019年10月

- 試験日：2020年2月1日

約4ヶ月で、全くの実務経験ない状態から合格することができました。

# 参考書

- 徹底攻略　Java SE 8 Gold 問題集
    - 黒本とよく言われるものです。（Goldはぶっちゃけ、これだけでは厳しいです。）
    - 現時点の最新だと、[徹底攻略Java SE 11 Gold問題集[1Z0-816]対応](https://hb.afl.rakuten.co.jp/ichiba/1d5aa798.217b1dd2.1d5aa799.01b58bc8/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16852069%2F&link_type=hybrid_url&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJoeWJyaWRfdXJsIiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9)ですね。


- JavaプログラマGold SE 8
    - 紫本とよく言われるものです。（Goldはこれがすごく役立ちます。）
    - 現時点の最新だと、[JavaプログラマGold SE11 試験番号1Z0-816
](https://hb.afl.rakuten.co.jp/ichiba/1de2ff43.1a3f3f05.1de2ff44.170db7e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fguruguru-ds%2F9784798162027%2F&link_type=hybrid_url&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJoeWJyaWRfdXJsIiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9)ですね。

# 勉強時間

- 平日：出勤前に30分、帰宅後1時間半

- 休日：土曜日、日曜日に4時間ずつ

章末問題は、解く時間に2時間半〜3時間程かかりますので、休みの日に行うことをおすすめします。

Silverの時よりも、難易度が大幅に上がりますので、時間がかかってしまいます。

でも、継続して勉強すれば合格できます！

合計で、280時間〜300時間です。


# 勉強方法

Goldの場合は黒本を繰り返し行うのみで、合格できるほどものではありません。

紫本もしっかりと行うことが必要です。

僕の体感ですが、難易度的には、黒本＜本試験＜紫本

なので、紫本を完璧にすれば、合格できます。

初め、問題集を開けた時に明らかに難易度が上がりすぎてビビってしまいますが、時間かけて行うと理解できます。

## 1ヶ月目

紫本を2周、繰り返しましょう。

初めの1周目は本当に分からないと思うので、分からないところで、ずっと立ち止らず、読み進めてください。黒本と違って、各章ごとに解説があり、練習問題が記載されています。

練習問題は初めわからないと思うので、回答の解説みながら行ってください。

黒本でわからない単元の見直しをしたりする時に少しずつ理解できます。

## 2ヶ月目（第1週〜第2週）

黒本を一度、一通り解き進めていきましょう。

ここで、ほとんど正解しなくてもいいです。僕も、初めの週末問題は2割ないぐらいとかでした。

しかし、間違ったところは、しっかりと解説を読み込んでください。この時に紫本も使いながら、間違った単元の解説を読んでください。

この時に、Silverの勉強方法と同様、他の選択肢がなぜ違うかもしっかりと読んでおくことが大切です。

答えを覚えるのではなく、消去法ができる理由をしっかりと理解することが大切です。

## 2ヶ月目（第3週〜第4週）

2週間で、黒本を1周を終わらすペースで、解いては解説を見て、分からないところは、紫本で理解することをひたすら繰り返しです。

この間で、間違った問題にはチェックを入れて、繰り返し行いましょう。

あっている問題は次の週に飛ばして、問題を解く回転数をあげましょう。

## 3ヶ月目（第１週〜第4週）

1週間目紫本、二週間目黒本と交互に問題を解いていきましょう。

1週間で、紫本の単元ごとの練習問題を1周終わらすペースで、紫本をひたすら解き進めましょう。

間違ったところは、しっかりと解説を読み込んでください。

黒本も同様です。

章末問題を時間がかかりますが、頑張りましょう。特に紫本の章末問題は本番でも似た問題がいくつか出ていたので、確実に間違った問題は潰していきましょう。

間違ったら、解説を読んで、理解を進めてください。

## 4ヶ月目（第1週〜第2週）

黒本、紫本の間違った問題にはチェックを入れていたと思うので、あっている問題は次の週に飛ばして、間違った問題を中心に解き、回転数をあげましょう。

## 4ヶ月目（第3週〜第4週）

最後、黒本と紫本を一通り、解き進めましょう。

この時に間違った問題は確実に解説をみて理解してください。

# 結果

得点率77%で合格しました。

ボーダーライン65%なので、少し余裕があっての合格でした。



# 受けてみて

Silverよりも難しかったので、かなり気合い入れました。

ただ、Goldの知識を全て使わなくとも実務では、やっていけるなとは思いました。

ただ、外資系エンジニアの転職では、Goldを持っていることを評価されたことも聞いたことがあるので、頑張ってみる価値はあると思います。
Modeler FlowでModelerスクリプトを実行する

Watson StudioのModeler FlowでもModelerスクリプトは実行可能です。

メニューアイコンから「スクリプト」のアイコンを選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7ee38c29-b58b-8000-a57b-93d27e20465b.png)

スクリプトの入力画面がでてくるので、スクリプトを入力します。
ここでは
```python
print("hello")
```
を入力しました。「スクリプトを実行」ボタンで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1a428e8e-f432-658e-c7ed-edb316e6abbb.png)

「コンソール」タブが開いて標準出力への出力があれば表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f9132982-0c10-5204-ffa1-ebd57b8817a3.png)

* テスト環境
    * CP4DaaS (2024/4/15)

#### 参考：フローのスクリプト

https://dataplatform.cloud.ibm.com/docs/content/wsd/flow_scripting.html?locale=ja&audience=wdp&context=cpdaas
Databricks にて replaceWhere による選択的上書き時におけるソースデータフレームが空の場合の動作検証

## 概要
Databricks にて replaceWhere による選択的上書き時におけるソースデータフレームが空の場合に、DELETE のみが実行されるかを検証しました。検証結果としては、DELETE のみが実行されました。DELETE のみを実行したくない場合には、レコードが存在しない場合には書き込み処理をスキップすることで対応できます。本記事では、検証コードとその結果を共有します。

```python
## 対応方法
if df.limit(1).count() > 0:
    (
        df.write
            .mode("overwrite")
            .option("replaceWhere", 'datasource in ("bbb.txt","ccc.txt")')
            .saveAsTable("replace_test.tbl_01"
        )
    )
else:
    print("ソースデータがないためスキップ")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f5a7a969-5647-abb1-412b-91b200f9c4b7.png)

## 検証方法と検証結果

次のようなデータをもつテーブルを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/31ef9e1e-0cc7-2161-d4fb-d88b23155cbc.png)

`datasource`列にて`bbb.txt`と`ccc.txt`の値のレコードを空のデータフラームで書き込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d24cdedd-672a-1439-b540-2b778a7010f9.png)

replaceWhere による選択的上書きを実施したところ、次のようにデータが上書きされました。`bbb.txt`と`ccc.txt`がなくなっていることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/57290f2f-d13b-c42b-4099-a252c444d7d6.png)

## 検証コード

### 1. スキーマを作成

```python
%sql
create schema if not exists replace_test;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fb40f869-7835-103a-17c7-55400a9ddc6f.png)


### 2. テーブル作成と初期データの挿入

```python
%sql
create or replace table replace_test.tbl_01
(
  str_col string,
  int_col int,
  datasource string
);
 
INSERT INTO replace_test.tbl_01
(
  str_col,
  int_col,
  datasource
)
SELECT 'a',NULL,'aaa.txt'
UNION ALL
SELECT 'b',NULL,'aaa.txt'
UNION ALL
SELECT NULL,NULL,'bbb.txt'
UNION ALL
SELECT NULL,NULL,'bbb.txt'
UNION ALL
SELECT NULL,NULL,'ccc.txt'
UNION ALL
SELECT 'd',NULL,'ddd.txt'
UNION ALL
SELECT 'e',NULL,'ddd.txt'
;
select * from replace_test.tbl_01;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2955c1af-59e2-a930-fa57-0b5ad451c7e5.png)

### 3. 上書きデータを保持したデータフレームを作成

```python
# 空のデータフラームを作成
src_d = []
 
src_s = """
str_col string,
int_col int,
datasource string
"""
 
df = spark.createDataFrame(src_d,src_s)
df.display()
"""
 
df = spark.createDataFrame(src_d,src_s)
df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/04f878a0-7b72-b743-b6d7-c9ac53e4925d.png)

### 4. replaceWhere による選択的上書きの実施と結果確認

```python
(
    df.write
        .mode("overwrite")
        .option("replaceWhere", 'datasource in ("bbb.txt","ccc.txt")')
        .saveAsTable("replace_test.tbl_01"
    )
)
spark.table("replace_test.tbl_01").display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/55155b92-7b2f-0ce4-c0a4-e94e6c8a06b6.png)

### 5. リソースの作成

```python
%sql
drop schema replace_test cascade
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1397f134-1ed8-521e-8268-1d027c60052c.png)
Microsoft Certified: Azure AI Fundamentals(AI-900) 合格備忘録

### ■受験の目的
AIの基礎的な知識をつけるため
Microsoft Certified: Azure AI Fundamentals(AI-900)の認定を受けるため

### ■出題範囲
シラバスはMicrosoft公式から参照します。
https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ai-900

### ■受験の前提
基礎資格なので、特に前提はありません。
統計やデータエンジニアリングの知識があれば、勉強の難易度は簡単に感じると思います。
しかしながら、筆者は生成AIを使ったことはあるのですが、バックグラウンドの内部的な知識は乏しく、大規模言語モデル（LLM）の部分は理解するのに少し苦労しました。

### ■受験のメリット
AIの基礎的な知識を身につけたい方へお勧めです。
AIを体系的に整理できるので、将来的にAIの組み込みアプリを開発をされたい方は、先ずはこちらから学習されるのが良いのではないでしょうか

### ■教材
MicrosoftLearningで学習します。このあたり無料で詳しく体系的に学べるのはありがたいです。
https://learn.microsoft.com/ja-jp/training/courses/ai-900t00
※個人のMicrosoftアカウントがあれば、PCやスマホなどで進捗を同期できるので、いつでも続きから学習できます。

AI関連の用語は、日本語だと少し理解しにくいところがあるので、余裕がある方は英語で一読されることをお勧めします。

### ■模擬試験
模擬試験はUdemyで購入
https://www.udemy.com/course/ai-900-microsoft-azure-ai-fundamentals-practice-tests-new/?couponCode=24T3FS41524
解説を"読む","覚える","再度テストする"を5周くらい繰り返しました。
正答率低いカテゴリは、リファレンスに戻って再学習します。

### ■学習期間
筆者の場合、データエンジニアリングを実務的に行っていたため、モデリングあたりは簡単に吸収することができました。
しかしながら、大規模言語モデル（LLM）の細かいところは苦戦しました。
2カ月くらい（土日の勉強）でパスできました。

### ■実際の本試験
日本語に対応した試験が発行されていましたので、そちらで受験しています。
全43問の制限時間は50分でした。問題数は毎回変わるのでご注意ください。
中級試験ではないので、ケーススタディ問題はありません。

模擬試験を事前に解いていたので、2周目の見直しを行えるくらいの時間の余裕があった感じです。
見直し精査で、"2/43問"ほど不安要素の問題がありました。（苦手な大規模言語モデル（LLM）関連でした。）
結果は9割以上のスコアで、満足のいく結果でした。
【自己紹介】ヘルプデスク飽きたからプログラマになるよ

# はじめに
<!-- 発端や概要を記載 -->
IT業界に身を置く者の嗜み（？）として、人目のある場所でアウトプットしてみたいと思い立ち、勢い100%でQiitaを始めました。 あと文章力トレーニングとして。
個人的な備忘録、過去の経験談や個人開発あれこれ、頭が良くないなりの学習方法を書いていきたいと考えています。

<!-- 各チャプター -->
# 自己紹介
- 30代前半（女）
- 調理専門学校を卒業後に飲食店に就職。人間関係と深夜労働で体調を崩し、1年でリタイア  
- 当時付き合ってた彼氏がSEで、「へー面白そう」と興味本位でSESへ転職
- 過労と人間関係でメンタル壊しながらもヘルプデスク歴7年目
- 30歳でADHD診断を受け、この先どうするべと考えた結果「プログラマになろう！」と一念発起
- 現在、職業訓練でPython勉強中　←イマココ

# 保有資格とかスキルとか

◆資格
>- 普通自動車免許（AT限定）
>- Python3エンジニア認定基礎試験
>- ITパスポート

◆スキル

【OS】
>- Windows(7/10/11)
>- ChromeOS

【言語】
>- HTML/CSS
>- ExcelVBA（載せていいものか悩む…）
>- GoogleAppsScript
>- Pytohn


【DB】
>- SQLite

【その他】
>- WordPress
>- GoogleWorkspace
>- Illustrator/Photoshop（広告バナー作れる程度）


とりあえず基本、応用情報は取っておこうと勉強中。
（求人の応募要件に書いてあるのをよく見かけるので）
基本は今年の秋までに。応用は25年春の試験で。

Pythonを習得したものの、地方には案件が無いので並行してJavaやるぞ！


# 最後に
世の中広いようで狭いので、自分と似た境遇の人と繋がりたいし届けばいいなと思っています。もちろん技術面でも！
ChatGPTs使い方の個人的まとめ

# 参考サイト
- 　[生成AI利用ガイド](https://gen-ai-docs.jp)

# Webや画像要約
- Web記事 [WebPilot](https://chat.openai.com/g/g-pNWGgUYqS-webpilot)
    - 入力
        ```
        日本語で回答。
        以下のWeb記事を日本語要約してください。
        https://hoge.com
        ```
    - 補足
        - 英語記事、PDF、画像も可能 

# 動画要約
- Youtube [Voxscript](https://chat.openai.com/g/g-g24EzkDta-voxscript)
    - 入力
        ```
        日本語で回答。
        以下の動画を全編要約して下さい。
        https://www.youtube.com/watch?v=hoge
        ```
    - 補足
        - 英語も可能

# 質問
- 論文ベース [Consensus](https://chat.openai.com/g/g-bo0FiWLY7-consensus)
    - 入力
        ```
        日本語で回答。
        質問内容を記載
        論文の引用を示して日本語で回答して下さい。
        ```

# 分析
- 分析の切り口 [XL AnalystGPT]
    - 入力
        ```
        日本語で回答。
        ファイルをアップロードするだけ
        ```
docker ubuntuでC言語実行環境を構築する

学校の授業でC言語を使う予定があったので、dockerの勉強として構築しました。

## フォルダ構成
```
.
├── Dockerfile
├── docker-compose.yml
└── src
    └── (c言語ファイル)
```

## Dockerfileを書く
```Dockerfile.
FROM ubuntu:latest

RUN apt-get update && apt-get install -y \
    build-essential \
    mingw-w64

RUN mkdir /workspace
WORKDIR /workspace
```

## docker-compose.ymlを書く
```docker-compose.yml
services:
  c-runner:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - type: bind
        source: ./src
        target: /workspace
    tty: true
    command: /bin/bash
```

## 実行手順
①プロジェクト直下のディレクトリでdocker-compose up -dでコマンドを実行。
②docker container lsでコンテナが無事立ち上がっているか確認する。
③cd srcでsrcフォルダに移動する
④c言語のファイルを作成
```test.c
#include <stdio.h>

int main() {
    printf("Hello, world!!\n");
    return 0;
}
```
⑤ gcc -o test test.c | ./testでコマンドを実行しHello, world!!と表示されれば成功。
電子メールメッセージの送信時に連絡先レコードフィールドを更新するにはどうすればよいですか (Lightning)?


+ [電子メールメッセージの送信時に連絡先レコードフィールドを更新するにはどうすればよいですか (Lightning)?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aia3k)

Q:連絡先の「アクティビティ」関連リスト (および「アクティビティ タイムライン」) にタスクと電子メール メッセージが表示されますが、プロセス ビルダーは、送信された電子メール メッセージに対してこのフィールドを期待どおりに更新しません (作成されたタスクに対してのみ機能します)。 。

A:「プロセス ビルダーは、送信された電子メール メッセージに対して希望どおりにこのフィールドを更新していません」 - これは、必要な電子メールの送信であるため、フローをトリガーする必要があるのは依然として電子メール メッセージであることを示唆しています。


活動タイムランに表示されるメールのところだろうなぁ。

+ [活動タイムラインのカスタマイズに関する考慮事項](https://help.salesforce.com/s/articleView?id=sf.activity_timeline_customization_considerations_lex.htm&type=5)


張メールが有効になっていない場合、メールは ToDo として保存されず、活動タイムラインに表示されません。

+ [リードレコードアクティビティから送信されたメールへの返信をリードアクティビティタイムラインに記録しようとしています。特定のメールアドレスに対してメール、メール-to-ケースを設定し、受信メールメッセージをキャプチャして終了スレッドかどうかを確認し、関連するリードレコードにタスク（サブタイプ：メール）を作成するフローを設定しました。タスクの説明としての EmailMessage のテキスト本文。ただし、メールが Lead アクティビティの emailmessage として記録されることを希望します (送信メールが記録されるのと同じです)。EmailMessageId = $Record Id で電子メール メッセージ関係オブジェクトを作成し、リード ID を RelationId として割り当てようとしましたが、何も機能しないようです。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UtdEoSAJ)

:::note
重要な部分の 1 つは、メール-to-ケース経由で生成された親ケースを削除することでした。これにより子の EmailMessage も削除されるので、最初にコピーしました。これにより、EmailMessage を必要な Lead オブジェクトに関連付けることができました。
:::

+ [フロー経由で送信された電子メールをアクティビティ タイムラインに記録しますか?どのような選択肢があるでしょうか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FQy6USAT)

:::note
素晴らしいニュース！あなたの言ってる事がわかります。連絡先も電子メール メッセージ オブジェクトに関連付けたいとします。フローでもそれを行う方法があります。これは多対多の関係であるため、リード、取引先担当者、および電子メール メッセージを持つユーザーの間のこの関係は、EmailMessageRelation と呼ばれる別のオブジェクトに保持されます。

電子メール メッセージを作成した後、ID をテキスト変数に割り当てる必要があります。次に、EmailMessageId と RelationId を指定して電子メール メッセージの関係オブジェクトを作成する必要があります。

EmailMessageId はテキスト変数に保存した ID にする必要があり、 RelationId は Contact.Id にする必要があります。
:::

上記２つから考えるとEmailMessageにフローが必要な気がします。

+ [電子メールメッセージオブジェクトにSalesforceフローを構築する必要があります](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4SZ1SAN)

できそうな感じです。

# 実際にレコードを作って調べてみました。

以下を実行するとActivityIdに00Tで始まるタクスオブジェクトのIdがセットされています。

```
select Id , ActivityId,ToIds from EmailMessage
```

また、このタスクを検索するとWhoIdに003で始まる取引先責任者のIdセットされます。

```
select Id , whoId from Task
```

よって、EmailMessageのActivityIdを使ってタスクを検索して、Whoidを求めることで003から始まれば取引先責任者と判断できるので、目的の取引先責任者を更新できると思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7f565aff-ca69-ed65-4fec-ace4d104e28d.png)


isTask

```
AND(
NOT(ISBLANK({!$Record.ActivityId})),
BEGINS({!$Record.ActivityId}, "00T")
)
```

isContact

```
AND(
NOT(ISBLANK({!Get_Task.WhoId})),
BEGINS({!Get_Task.WhoId}, "003")
)
```
【AWS】Terraformを簡単に動かしてみる

前回はTerraformを動かす事前の環境構築を実施しました。
今回は実際にTerraformを動かし、AWSにEC2インスタンスを作成してみます。

# 目次
1.概要
2.tfファイル作成
3.Terraform実行
4.AWSリソースの削除

# 1.概要
・Terraformを利用し、AWS環境にEC2インスタンスを作成します。
・事前の環境構築は完了済みとします。
・参考：https://developer.hashicorp.com/terraform/tutorials/aws-get-started/aws-build

# 2.tfファイル作成
### 【前提】
・tfファイルはHCLと呼ばれる、HashiCorp社開発の独自記法となる。
・基本的な構文は以下となります。
```ruby
resource "リソースの種類" "リソース名" {
    設定項目1  =  値1
    設定項目2  =  値2
    設定項目3  =  値3
}
```
・リソースの種類、設定項目はTerraformで定義されている名前にする必要あり。（任意の名前ではNG）
・リソース名は任意の名前でOK

### 【手順】
・Terraform設定用のディレクトリを作成します。
※Terraformの設定は必ずワーキング・ディレクトリ内に作成される。
今回は公式ドキュメントに従って” learn-terraform-aws-instance”という名前のディレクトリを作成します。
```ruby
mkdir learn-terraform-aws-instance
```

・作成したディレクトリにてtfファイルを作成
```ruby
touch main.tf
```

・`main.tf`ファイルを作成したら、ファイルに以下の内容を記載します。
リージョンは`東京`を指定し、AMIIDは東京リージョンのUbuntu（`ami-0595d6e81396a9efb`）を指定しています。

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

  required_version = ">= 1.2.0"
}

provider "aws" {
  region  = "ap-northeast-1"
}

resource "aws_instance" "app_server" {
  ami           = "ami-0595d6e81396a9efb"
  instance_type = "t2.micro"

  tags = {
    Name = "Terraform-create"
  }
}
```
・terraform {}ブロック
　- Terraformの設定が入る
　- 対象のプロバイダー（Aws.Azure等）を指定
　- Teraformのバージョン指定


・provider {}ブロック
　- 特定のプロバイダーを指定し、今回は`aws`でリージョンは東京を選択

・resource {}ブロック
　- インフラの構成要素を定義
　- aws_instance”はEC2インスタンスを指す
　- ”ami”作成するEC2インスタンスのAMIを指定
　- ”instance_type”作成するEC2インスタンスタイプを指定
※Terraformでは各リソースに名前を付けることができ、その名前を使用してリソースを参照したり、他のリソースに渡したりすることができる。コード内の参照ポイントとして利用。

# 3.Terraform実行
### 【概要】
・流れとしては、以下になります。
　①initでワークスペース初期化
　②planで実行計画を作成
　③applyでリソースを作成
　④作成後確認


 ### 【手順】
 ・initでワークスペース初期化
terraform initはTerraformを実行する前の準備作業として必要となり、ここで必要なプラグインやモジュールをインストールし、バックエンドを初期化することで、Terraformが正しく実行できる状態を整えます。

```ruby
terraform init
```

・出力結果例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763418/0920bb41-5734-9cad-2f4e-3039c7fe976e.png)


・構文チェック
terraform validateを実行するとtfファイルの構文をチェックをしてくれます。
```ruby
terraform validate
```

・出力結果例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763418/46daa007-2794-9b5b-d03a-2b17bff21c99.png)

・planで実行計画を作成
クラウド上に実際に構築されるリソースを模擬することができ、Terraform実行前にこのコマンドを実行して想定通りの変更なのか確認する。
```ruby
terraform plan
```

・出力結果例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763418/03de695c-20d9-333d-86b4-6e80756356d8.png)
※[+]が追加されるリソースを表し、(known after apply)は現時点ではその値を特定できず、Terafformの実行計画において、実際の値が不明な場合に表示される。


・applyでリソースを作成
terraform applyを実行し、実際にAWSにリソース（EC2インスタンス）を作成します。
Enter a value:が表示されたあとに`yes`を入力してEnterキーを押下すると、リソースの作成が開始されます。

```ruby
terraform apply
```
Apply complete! Resources:が出力されれば作成完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763418/187e3935-7c39-6378-d127-f314c0567656.png)


・作成後確認
applyが完了したら、実際にEc2インスタンスが作成されているかAWSコンソールで見てます。
`Terraform-create`という名前のEC2インスタンスが東京リージョンに作成されていたら完了です。


# まとめ
今回はTerraformで簡単にEc2インスタンスを作成してみました。
次はVPCやIGWなど簡単な構成をTerrraformで作成してみたいと思います。
【WYSIWYGエディタ】Summernoteのエディタの高さ設定

以前、Summernoteのツールバーのカスタマイズ記事を投稿した際に、ついでにSummernoteのエディタエリアの高さ設定をメモしましたが、ついでにその他の高さ設定をメモ。

以前の記事はこちら

https://qiita.com/chika_pon/items/27bc6b47ccf967ce573b#2-wysiwyg%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E8%A1%A8%E7%A4%BA%E3%81%AE%E9%AB%98%E3%81%95%E8%A8%AD%E5%AE%9A%E3%81%A4%E3%81%84%E3%81%A7%E3%81%ABw

以前の記事で
```javascript
$('#hoge').summernote({
	lang: 'ja-JP',
    height: 400
});
```
このようにheight: 400と記述することで初期表示が400pxの高さで表示されることを説明しました。
この場合はエディタの記入が長くなっても高さ400pxから自動では変わらず、スクロールするかエディタ下部のつまみをドラッグしてエディタの高さを広げたりするかしかできません。

例えば、初期表示はある程度の高さで表示して、記入がエディタエリアを超えると自動的にエディタの高さが広がっていくようにすることもできます。
その場合は
```javascript
$('#hoge').summernote({
	lang: 'ja-JP',
    minHeight: 400
});
```
とすることで、初期表示は高さ400px、記入が長くなり400pxを超えると自動でエディタエリアが広がっていきます。

逆に高さの制限を設けて、指定サイズを超えないようにしたい場合は
```javascript
$('#hoge').summernote({
	lang: 'ja-JP',
    minHeight: 400,
    maxHeight: 800
});
```
とすることで400pxを超えると自動でエディタエリアが広がり、800pxに達するとそれ以上エディタエリアが広がらなくなります。

念のためのメモでした。

https://qiita.com/chika_pon/items/2f46411ba383fe345759
標準ユーザーライセンス



[標準ユーザーライセンス](https://help.salesforce.com/s/articleView?id=sf.users_license_types_available.htm&type=5)

+ [旧バージョンライセンスから新バージョンライセンスに買い替えた場合の影響確認](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ainDISAY)

|Force.com - App Subscription	|Salesforce Platform|
|:-------------------------------|:-------------------------------------|
|Lightning Platform Light アプリケーションまたは Lightning Platform Enterprise アプリケーションへのアクセス権をユーザーに付与します。CRM 機能は含まれていません。|標準的な CRM 機能ではなく、カスタムアプリケーションへのアクセスを必要とするユーザー向けです。このユーザーライセンスを所有するユーザーは、自分の組織で開発されたカスタムアプリケーション、または AppExchange からインストールしたカスタムアプリケーションを使用できます。|
|Lightning Platform Light アプリケーションには、最大で 10 個のカスタムオブジェクトと 10 個のカスタムタブおよび取引先と取引先責任者への「参照のみ」アクセス権が用意されています。また、オブジェクトレベルおよび項目レベルのセキュリティがサポートされています。Lightning Platform Light アプリケーションでは、Bulk API またはストリーミング API は使用できません。|また、取引先、取引先責任者、レポート、ダッシュボード、ドキュメント、カスタムタブなど、中核的なプラットフォーム機能も使用できます。売上予測、リード、キャンペーン、商談などの標準タブやオブジェクトを含む一部のユーザー権限と標準アプリケーションは使用できません。このライセンスを持つユーザーは、Connect Offline も使用できます。|
|Lightning Platform Enterprise アプリケーションには、最大で 10 個のカスタムオブジェクトと 10 個のカスタムタブが用意されています。Lightning Platform Light アプリケーションの権限に加えて、レコードレベルの共有がサポートされており、Bulk API およびストリーミング API を使用できます。また、取引先および取引先責任者への「参照・更新」アクセス権があります。|ここはエディションの違いでカスタムオブジェクトの最大数が変わります（大坪記入）|
|このライセンスを持つユーザーには、10 個以下のカスタムオブジェクトと 10 個以下のカスタムタブにアクセスできるプロファイルまたは権限セットを割り当てます。|Salesforce Platform ユーザーライセンスを所有するユーザーは、組織内のすべてのカスタムアプリケーションにアクセスできます。|
|このライセンスを持つユーザーは、実行中のユーザーに同じライセンスがある場合、ダッシュボードの表示のみを行えます。|編集権限も付与できます（大坪記入）|
|ライセンスごとに、Enterprise Edition の場合はユーザーあたり 20 MB のデータストレージ、Unlimited Edition および Performance Edition の場合はユーザーあたり 120 MB のデータストレージと、エディションに関係なく 2 GB のファイルストレージが追加提供されます。|Enterprise Edition、Unlimited Edition、および Performance Edition のユーザーには、ライセンスごとに追加ストレージを提供します。|
|記事を表示するには、ユーザーのプロファイルに「ナレッジの参照を許可」権限が必要です。ただし、この権限はデフォルトプロファイルでオフになっています。ユーザーのプロファイルに「ナレッジの参照を許可」権限を付与するには、コピーしたプロファイルでこの権限を有効にして、このコピーしたプロファイルをユーザーに割り当てます。|
|記事を表示するには、ユーザーのプロファイルに「ナレッジの参照を許可」権限が必要です。ただし、この権限はデフォルトプロファイルでオフになっています。ユーザーのプロファイルに「ナレッジの参照を許可」権限を付与するには、コピーしたプロファイルでこの権限を有効にして、このコピーしたプロファイルをユーザーに割り当てます。|
新しいTeamsのチャネルのコネクタ設定方法

# はじめに
Microsoft Teamsには、サードパーティのサービスからTeamsチャネルにコンテンツとサービスのプログラムを使えられる「**コネクタ**」という機能があります。
この機能をよく使いましたが、新しいTeamsにアップデートした後、コネクタを設定するところが従来のTeamsと異なってしまったため、困ったときがありました。
このような混乱を二度と経験しないように、従来のTeamsと新しいTeamsのそれぞれに対してコネクタを設定する部分について説明したいと思います。

# コネクタ設定方法
## 従来のTeams
従来のTeamsは、すぐコネクタの設定を見つけられます。

1. チャネルを選択し、「**･･･**」をクリックし、「**コネクタ**」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/382cad54-b5e0-b0fe-9195-69326b01fd62.png)

2. チャネルのコネクタの設定画面が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/02fd2d93-a1d0-faba-5698-f34daa81455d.png)

## 新しいTeams
新しいTeamsでのコネクタの設定は、従来のTeamsとは異なり、チャネルの管理画面から探す必要があります。

:::note warn
従来のTeamsで「コネクタ」があったところは、「ワークフロー」に変わりました。
:::


1. チャネルの選択後、**Teamsの右上**にある「**チャネルの詳細を開く**」ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/04b99402-6741-a15d-37b1-1e5295533916.png)

2. チャネルの詳細から、「**チャネルを管理**」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/36a6a599-57fd-09fe-ea98-86d683329838.png)

3. チャネル管理画面で、「**コネクタ**」で「**編集**」ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/5c947857-355e-a97f-01ff-37c5537e20a6.png)

4. チャネルのコネクタの設定画面が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/8e2a03de-c284-c659-016d-568cacf3de65.png)
Azure Data StudioからDockerで起動したMySQLに接続する

C# + SQLServer のWinodws開発者は、SSMS（SQL Server Management Studio）をGUIツールとして使用されているケースも多いかと思います。

Azure Data Stduioは、MacOSでもSSMSのように使えるGUIツールです。

また、VSCodeと同様のショートカットや拡張機能によるカスタマイズが可能なおすすめのツールでもあります。

## インストール
[コチラ](https://learn.microsoft.com/ja-jp/azure-data-studio/download-azure-data-studio?tabs=win-install%2Cwin-user-install%2Credhat-install%2Cwindows-uninstall%2Credhat-uninstall)のサイトから、Azure Data Studio をインストールします。

Azure Data Studio を起動したら、VSCodeと同様に必要な拡張機能をインストールします。

### MySQL
Azure Data Studioは、初期状態で選択できる接続の種類はSQLServerのみとなっています。<br/>
SQLServer以外のデータベースは、拡張機能をインストールする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/70d95648-a7a2-5f6c-cfcc-de37c904d1b8.png)

### Japanese Language Pack for Azure Data Studio
日本語化パック　※お好みでインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/7bb710da-82f4-760a-3145-023fca754bb7.png)

## 接続
MySQLの拡張をインストール後、左ペインの(+)ボタンをクリックして新しい接続を開きます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/5287f921-dca5-a0de-50c9-687e0fe4b92f.png)

今回は、[コチラの記事](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)を参考に`Docker`で`MySQL`を起動した状態で接続をテストします。

```bash
$ docker compose ps

NAME                           IMAGE                        COMMAND                   SERVICE   CREATED          STATUS                             PORTS
docker-laravel-handson-app-1   docker-laravel-handson-app   "docker-php-entrypoi…"   app       19 seconds ago   Up 15 seconds                      9000/tcp
docker-laravel-handson-db-1    docker-laravel-handson-db    "/entrypoint.sh mysq…"   db        19 seconds ago   Up 14 seconds (health: starting)   33060-33061/tcp, 0.0.0.0:33060->3306/tcp
docker-laravel-handson-web-1   nginx:1.25.4-alpine          "/docker-entrypoint.…"   web       19 seconds ago   Up 15 seconds                      0.0.0.0:8080->80/tcp
```

接続設定を以下のように入力します。
- 接続の種類：MySQL
- サーバー名：localhost
- パスワード：secret
- ユーザー名：phper

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/0358d0d7-6cc9-b136-ccb0-a32a6e228f81.png)

[詳細設定]をクリックして、ローカルマシンに割り当てたポート番号を指定します。
- ポート：33060

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/7fe814f7-78b9-b21c-1626-d1bcd8694a66.png)

接続が成功すると、画像のようにMySQLの情報が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/d09c4bc0-b6b1-407b-afcd-5cc666dc979d.png)

`php artisan migrate`後に実行した結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/aa33da50-ff1d-fced-b6f4-e27055c4bc1b.png)

## Reference
- [Azure Data Studio のダウンロードとインストール](https://learn.microsoft.com/ja-jp/azure-data-studio/download-azure-data-studio?tabs=win-install%2Cwin-user-install%2Credhat-install%2Cwindows-uninstall%2Credhat-uninstall)
- [【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)
iPhoneのsafariでQiitaを「ホーム画面に追加」するとアドレスバーが表示しない

## はじめに

こんにちは！[@nyakako13](https://qiita.com/nyakako13 "Qiita ページ") です。

QiitaをiPhoneで閲覧する時に困って調べたので共有します。

## 問題
iPhoneのsafariで[Qiita](https://qiita.com/)を「ホーム画面に追加」するとアドレスバーが表示せずに画面遷移が不便すぎる。前のページに戻る操作などができない。（スワイプでも不可）

## 解決方法
機内モード（通信できない状態）で「ホーム画面に追加」の操作を行う。




普通に「ホーム画面に追加」するとアドレスバーがありません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/49350a8d-db1c-e811-40bf-f13be52be4a4.png" width="350">


機内モードで「ホーム画面に追加」した後、通信を戻すと今度はちゃんとアドレスバーが表示します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/bbe9b3aa-de45-6531-e110-7a4b462b42f2.png" width="350">



## 原因
htmlのhead内に

```html
<meta name="apple-mobile-web-app-capable" content="yes">
```

が記されているとアプリ風の表示になるみたい。


## おわりに
apple-mobile-web-app-capable はページ・コンテンツが多いサイトには向いてないような気がします。（せめてスワイプで操作できれば・・・）


よかったら[X(@nyakako13)](https://twitter.com/nyakako13 "Xプロフィール")もフォローしてもらえると嬉しいです。

[Qiita100投稿](https://qiita.com/nyakako13/items/03ad61cfb82a1582b5d1)まで残り97！

未経験や浅経験、厳しいと言われている年代でエンジニアへの転職活動されている方、負けずにがんばりましょう！！

## 参考
https://oops0011.blog.fc2.com/blog-entry-578.html
arxxusleadassig.LeadAssignmentTrigger 何かの管理パッケージ？



+ [CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY エラー](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahSEY)

:::note alert
The flow tried to update these records: [record ID]. This error occurred: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY: arxxusleadassig.LeadAssignmentTrigger: System.LimitException: arxxusleadassig:Too many SOQL queries: 101. You can look up ExceptionCode values in the SOAP API Developer Guide.
:::


:::note
Seems like changing the entry conditions for the flow did the trick!

フローのエントリ条件を変更することでうまくいったようです。
:::
顧客データプラットフォーム（CDP）の概要


+ [顧客データプラットフォーム（CDP）の概要](https://www.salesforce.com/jp/resources/guides/getting-started-with-a-customer-data-platform/)


+ [Commerce Cloud CDP Connector in B2C Commerce ](https://help.salesforce.com/s/articleView?id=cc.b2c_commerce_cloud_cdp_connector.htm&type=5)

Commerce Connector を使用して、B2C Commerce Cloud のインスタンスから Salesforce CDP へのデータの取り込みをセットアップすることができます。B2C Commerce Cloud を Salesforce CDP に接続する際には、クロスクラウドデータをセグメント化して、統一された買い物客のプロフィールを作成できます。Business Manager で、このプロフィールを使用して顧客グループを作成し、登録済みの買い物客に目的に沿ったインテリジェントなコマース体験を提供できます。


# エラー

+ [Hi Developers..! I am facing this error while trying to configure Oauth in salesforce Data Connector[CDP].Anyone know how to overcome this?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLFdA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ec63d3c3-0d9f-8394-9d1b-168067de9b7e.png)

:::note
To overcome errors while configuring OAuth in Salesforce Data Connector (CDP), follow these steps:

1. **Check Error Message**: Carefully read the error message you're receiving. It should provide clues about what went wrong during the OAuth configuration process.

2. **Review Documentation**: Consult the documentation provided by Salesforce Data Connector (CDP) for guidance on how to configure OAuth properly. Make sure you're following all the required steps and configurations accurately.

3. **Verify OAuth Settings in Salesforce**: Double-check the OAuth settings in your Salesforce org. Ensure that you've created a connected app, configured the OAuth scopes and callback URL correctly, and that the OAuth settings align with the requirements of Salesforce Data Connector.

4. **Check Network Configuration**: Ensure that your network settings allow the necessary communication between Salesforce Data Connector and Salesforce. Check for any firewall rules, proxy configurations, or network restrictions that may be interfering with the OAuth process.

5. **Debugging Tools**: Use debugging tools provided by Salesforce Data Connector (CDP) to troubleshoot the OAuth configuration process. This may include log files, error messages, or debugging consoles that can help identify the root cause of the issue.

6. **Consult Support**: If you're unable to resolve the issue on your own, reach out to the support team or community forums for Salesforce Data Connector (CDP). They may be able to provide additional assistance, troubleshoot the problem with you, or offer guidance based on similar issues encountered by other users.

7. **Update Software**: Ensure that you're using the latest version of Salesforce Data Connector (CDP) and that all related software components are up to date. Sometimes, issues can be resolved by installing updates that include bug fixes or improvements to OAuth functionality.

By following these steps and thoroughly investigating the error message, documentation, and network configurations, you should be able to overcome the OAuth configuration error in Salesforce Data Connector (CDP). If you continue to encounter difficulties, don't hesitate to seek assistance from the support team or community resources.
:::
【Ruby】<< をそのままメソッドの戻り値にするより、[*array, element] を使おう

## はじめに： `<<`をそのままメソッドの戻り値にする？
コードレビューをしていると、ときどき以下のようなコードを見かけます。

```ruby
def do_something
  foo = []
  # 処理があれこれ続く
  # ...
  # ...
  foo << 123
end

bar = do_something
puts bar
```

注目してほしいのは `foo << 123` の行です。
ここは配列 `foo` に123を追加し、なおかつそのときの戻り値をこのメソッド(`do_something`メソッド)の戻り値にしています。

```ruby
def do_something
  foo = []
  # 以下の1行は2つの意味を持つ
  # - fooに123を追加する
  # - 123を追加したfooをこのメソッドの戻り値とする
  foo << 123
end
```

たしかに配列に要素を追加する `<<` は戻り値としてその配列自身を返しますが、ふだん `<<` を使うときはあくまで要素を追加するだけで、`<<` の戻り値を利用することは少ないです（少なくとも僕の周りでは）。

```ruby
arr = []
# << は要素を追加するだけで、その戻り値は利用しない（ことが多い）
arr << 1
arr << 2

arr.each do |el|
  # ...
```

そのため、メソッドの最後に登場する`foo << 123`は見方によっては「要素を追加してるだけ？」と見えてしまいます。

```ruby
def do_something
  foo = []
  # ...
  # ...
  # ...
  foo << 123 # 要素を追加しておしまい？
end
```

また、1行で「要素の追加」と「メソッドの戻り値を返す」という2つの仕事をしている点もややこしいです。

## おすすめ： `<<` の代わりに `[*array, element]` を使う
こういった場合は `[*array, element]` に置き換えると意図が明確になります。

```ruby
def do_something
  foo = []
  # ...
  # ...
  # ...
  [*foo, 123]
end
```

`<<` を使ったときとは異なり、こちらの方が `[*foo, 123]` という配列をメソッドの戻り値にしていることが伝わりやすくなるはずです。

なお、`[*foo, 123]` が何をやっているのかはこの下で説明します。

### `*` って何のために付けてるの？

`*` は配列を展開する演算子です。
`*` を付けなかったときと、付けたときの挙動の違いは以下のコードをご覧ください。

```ruby 
a = [1, 2, 3]

# *なしだと配列がネストしてしまう
[a, 4]
#=> [[1, 2, 3], 4] 

# *を付けると配列aが展開されてフラットな配列になる
[*a, 4]
#=> [1, 2, 3, 4]
```

つまり `[*array, element]` と書けば、既存の配列 `array` に `element` という要素を追加した配列を作成したことになります。

なので結果として `array << element` と（ほぼ）同じことをやっていることになります。

## では `<<` の戻り値はどういうときに使うのか

`<<`の戻り値は以下のように連続して`<<`を呼び出したいときに使います。
（つまり、メソッドチェーンの一種。ですが、ふだんこういうコードを書く機会もあまりないですね……）

```ruby
# https://docs.ruby-lang.org/ja/latest/method/Array/i/=3c=3c.html
ary = [1]
ary << 2 << 3 << 4
p ary   #=> [1, 2, 3, 4]
```

でも、configなどで設定値を複数件追加したいときとかはちょっと便利かな？

```ruby
Rails.application.configure do
  # foo.example.com と bar.example.com を許可hostに追加する
  config.hosts << "foo.example.com" << "bar.example.com"
end
```

## 注意： `<<` と `[*array, element]` はまったく同じではない
厳密にいうと、 `<<` と `[*array, element]` はまったく同じ、ではありません。
`<<` は元の配列に要素を追加するのに対し、 `[*array, element]` は元の配列を利用して新しい配列のインスタンスを作成します。

以下のコードを見て `object_id` の値に注目してください。

```ruby 
a = [1]
a.object_id        #=> 20800
(a << 2).object_id #=> 20800

a = [1]
a.object_id        #=> 33620
[*a, 2].object_id  #=> 39980
```

`<<` を使った場合は `object_id` がどちらも20800なので、同一のインスタンスであることを示しています。

一方、 `[*array, element]` は33620と39980で値が変わっています。
これは `a` と `[*a, 2]` でインスタンスが異なることを示しています。

とはいえ、`a`がローカル変数で、なおかつ `[*a, 2]` （または `a << 2`）の結果をメソッドの戻り値とする場合はこの違いが問題になることはほぼないでしょう。
（`a`がメソッドの仮引数だったり、インスタンス変数だったり、 `[*a, 2]` や `a << 2` のあとにも処理が続いたりする場合は少し話が変わってきますが、話題が広がりすぎるのでここでは割愛します）

## まとめ
というわけで、この記事では配列に要素を追加して、なおかつその配列をメソッドの戻り値として返したいときの記法について説明してみました。

```ruby
def do_something
  foo = []
  # ...
  # ...
  # ...
  foo << 123
end
```

みたいな書き方が絶対にダメというわけではないですし、人によっては「全然アリ」と考えるかもしれませんが、個人的には `foo << 123` よりも、

```ruby
def do_something
  foo = []
  # ...
  # ...
  # ...
  [*foo, 123]
end
```

の方が「これがメソッドの戻り値ですよ！」という意図がより明確になるので、ベターなんじゃないかなーと思っています。

コードを書いたり、コードレビューをしたりするときにもし同じようなユースケースに遭遇したら、本記事を参考にしてみてください。
Communicate Using the Action Elemen



https://trailhead.salesforce.com/content/learn/modules/data-and-actions-in-flows/communicate-with-users-flow


+ [ There is no option to select Account Change email template in the  Lookup window in the Email Template field. ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R9XX3)


:::note
Guys, you need to create a new Action type "Update Records"/ Set Account object. name it as "Update Matching Account". Connect this action in the flow between Start and Action "Chatter Post to Account Owner". I worked for me!

新しいアクションタイプ「レコードの更新」/アカウントの設定オブジェクトを作成する必要があります。 「一致するアカウントの更新」という名前を付けます。このアクションを、開始とアクション「アカウント所有者への Chatter 投稿」の間のフローに接続します。私のために働きました！
:::


:::note
I was unable to select Send Matching Account to Lead Routing until I enabled Folder and Enhanced Sharing. Setup --> Lightning Email Templates --> Folders and Enhanced Sharing. 

After enabling this, I was able to select the email template.

フォルダーと拡張共有を有効にするまで、[一致するアカウントをリード ルーティングに送信] を選択できませんでした。 [設定] --> [Lightning メールテンプレート] --> [フォルダと拡張共有]。

これを有効にすると、メールテンプレートを選択できるようになりました。
:::
偏差値40の私がどうしても年収1000万円を達成したくてやったこと

普段は金融系のスタートアップでエンジニアをしていて、この業界は10年ちょっとになります。
それ以外に副業でシステム開発のお手伝いをしてます。

妻と小学生の子供を持つ会社員 兼 副業フリーランスです。

タイトルにある通り、後発でも**選択と行動**しだいで、学歴関係なく年収1000万に到達するということを知ってもらいたくて、この記事を書きました。

## なぜ【どうしても】年収1000万円を達成したいのか
私は地方出身で裕福とは程遠い家庭で育ち、生活するのがギリギリのレベルで育ってきました。
生活するのがギリギリということもあって、両親の揉め事も少なくなく、子供ながらに「お金の余裕は心の余裕」ということを身に沁みて感じてきました。

また、私は中学２年生までほとんど勉強をしていなく、部活だけをしてきたこともあり、中学では下から数えた方が早い成績で、中学3年生の夏から猛烈に勉強をしてようやく偏差値40の高校に入れるレベルでした。
大学も自分の学歴と家庭の金銭事情を考慮してIT系の専門学校に入り、就職も卒業年の10月にどうにか1社だけ内定をもらえるレベルです。

「このままだと将来自分に子供ができた時に同じ思いをさせてしまう」
「それだけは、絶対にさせたくない」
「人生を好転させなきゃ」

そう思いたって **どうしても** 年収1000万円を達成したいと思い行動をしました。

## どんな行動と選択をしてきたのか
新卒でこの業界に入ってから、試行錯誤して遠回りしながらも様々な行動と選択をしてきました。
全部書くとキリがないので、特に注力した5つを紹介します。
ちなみに、私の年収はこんな感じで推移して年収1000万円に到達しました。

![年収推移.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905787/7cad48e6-c1f8-845e-b9bb-7887742e2b32.png)

### 1. とことん真似る
エンジニアに限った話ではないと思いますが、何かを習得する時には「守破離」が大切だと思っています。
特に私は学歴があるわけではないので、最初の3年目くらいまでは「この人すごいな」って人を見つけて、とことん真似ました。
どのように物事を理解しているのか、どのような言い回しで話しているか、どの時間にどんな作業をしているのか、普段はどんな事を勉強しているのかなど、学歴のない頭で考えるよりも学歴のある仕事ができる人の思考を盗んだ方が圧倒的に成長できると思います。

### 2. 知識を固める
「1. とことん真似る」で仕事のできる人が勉強していることを盗んで、自分が進みたい方向とフィットしていると思ったら、次はその内容を自分の中に落とし込みます。
基礎が固まってない上に知識を塗り足しても、いつかは知識がないことがバレます。
私も過去に20代前半でマネジメントを任せられたことがありました。
他のチームのマネジメントレイヤーの人と話す際に、私は知識が固まってないが為に、的外れなことを言ったことがあり、自分の能力不足を痛感したことがあります。

### 3. とりあえずやってみる精神
「2. 知識を固める」でしっかりと知識を固めた後は、それを実践します。
知識は習得したが実践経験はないので、最初は不安に感じることが多いと思います。
ただ、なんでもチャレンジしないと経験値はアップしません。
また、これは会社員の最大の強みだと思うのですが、会社員は失敗しただけでクビになることはありません。
なので、とことんチャレンジしましょう！
エンジニアであれば、同じ作業や経験がある作業をするよりも、やったことないことをする方が圧倒的に楽しいです。

### 4. 転職して年収アップ
「3. とりあえずやってみる精神」で様々な経験を積んで自分の能力値と会社からもらっている給与に乖離があるなと感じたら、転職しましょう。
社会人に出たら、**自分株式会社**という意識を持つと良いと思ってます。
自分の能力を1商品と見たときに、自分の能力を安売りしていたら一生年収1000万円は達成できません。
また転職をすることで環境が変わり、様々な人に会い、経験したことないアーキテクトや言語に触れることができるので、1 〜 3のサイクルを繰り返すことができます。

### 5. 面接をハックする
1 〜 3で能力や経験値を高めて、4で転職という形で行動をしたら、後は面接を突破するだけです。
正直面接はある程度ハックすることが出来ると思っています。
私の場合は面接の前に必ず面談をして、その企業をリサーチを徹底してやります。
そうすると、この募集のポジションはここの役割を埋める為だから、こんなことを聞かれるんじゃないかというのがある程度見えてくるので、いざ面接の時にあらかじめ準備ができます。
また、今の時代オンラインでの面接が増えてきたので、準備したものを見ながら面接することも出来ます。
さらに、私の場合は必ず複数社の選考を並行して行って、面接中でさりげなく他の選考も進んでいることをお伝えします。
そうすることで、企業側がどうしても欲しい人材だと思ってもらえたら、ある程度年収の交渉がしやすくなります。
この年収の交渉をすることで、私は転職のタイミングで年収を大きく引き上げることが出来ました。

## まとめ
私は年収1000万を達成するのにだいぶ遠回りしたと思います。
学がある訳じゃなかったので、試行錯誤する時間がすごく長かったです。
早く目標を達成するためには、書籍であれ、人であれ、自分の進もうとしてる道のちょっと先にいる人を真似るのがいいと思います。

また、お金が全てではないと思いますが、年収が高いということは、それだけ企業や社会に価値を提供できてるということだと思うので、エンジニアで年収1000万を達成する人がより増えればいいなと思います。（一部例外はあると思いますがw）
Elementorをステージング環境から本番環境へ移行する手順

# データ移行
All in One WP Migration等でマイグレーションした後に、
以下の2つを実施する。

## 1.URLを変更
Elementor ＞ ツール ＞ 一般 ＞ Regenerate CSS & Data ＞ 「URLを変更」 でElementorコンテンツのURLを更新する。

:::note info
DBの文字列置換作業なので、別途実施していれば必須ではないと思います。ドメイン名の変更もこちらで行います。
:::

## 2.CSSの再生成
Elementor ＞ ツール ＞ 「Regenerate Files」でCSSを強制的に再生成する。

:::note info
Elementor公式動画
ステージング環境から本番環境へ移行する手順
<iframe width="800" height="480" src="https://www.youtube.com/embed/mKOlgCWnrRg" title="Push Changes From Staging Site to Live Site - Monday Masterclass" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
:::