OmniAICreator/Qiita-1.07M huggingface dataset:
GCP全冠したので記念に振り返ってみた。


皆さんこんにちは！iret株式会社Global Solution 事業部の浜田です。今回、やっとの思いで計11個のGoogle Cloud Platform の資格を取得することができたので今回の記事で振り返りたいと思います。


<h2>ランキング

まず最初になりますが下記の表は資格数を僕の肌間で難易度順に並べたものとなります。


| 順位	       |       資格名 |    理由   |
|:-----------------|------------------:|:------------------:|
| 1            |         Google Workspace Administrator|     学習リソースの圧倒的に少ないので勉強には骨が折れる海外のサイトを翻訳して勉強するのがおすすめ。       |
| 2          |         Machine Learning Engineer |       機械学習の予備知識が必要。機械学習のアルゴリズムを予め知っておくと数段楽になる。     |
| 3             |       Cloud Network Engineer |     ネットワークはどうしても難しくなりがちだがAWSと比べると設問もシンプルで分かりやすい。     |
| 4               |           Data Engineer|        Machine Learning と同様にデータの基礎的な知識が必要だが比較的頭に入りやすかった。       |
| 5             |           Cloud Security Engineer|       セキュリティはAWS, GCP同様に割と当たり前のことを聞いてくるので答えを導きやすい気がする      |
| 6         |          Cloud Database Engineer |     英語で結構きつかったがGCPのデータベースの特徴を理解していけばいける。     |
| 7         |          Cloud Developer |      これはAWSにも同様に言えることだが開発を実際にした人じゃないとイメージがしづらい。ひと通りリソースの概要を調べた上でハンズオンをしておくと分かりすいと思う。       |
| 8         |           Cloud DevOps Engineer |    これはGCPというよりSREを問う試験。英語だがSREを説明するGCP公式のYouTube 動画があるので必ず見ておこう。      |
| 9         |        Cloud Architect|     正直Cloud Engineer とあまり難易度は変わらないと思う。なのでCloud Engineer に合格したら次に受けるのが良い。      |
| 10         |           Cloud Engineer |      AWS のSAAと難易度は同じくらいだった。基本的な構成や基本リソースの特徴などをしっかり押さえておくと吉     |
| 11         |          Cloud Digital Leader |    GCPというよりクラウドは何なのかを問う問題が多い。これからクラウドエンジニアを目指す人や営業の方はおすすめ。       |

	
		









<h2>自分が取り組んだ勉強

自分が取り組んだのは以下の２つだけなので参考程度に共有します！

　<h6>練習問題</h6>
これが1番大事、自分はUdemyやA Cloud Guru, 海外webサイトの問題集をひたすら解きまくった。比較的海外のサイトの方が情報も豊富なので漁ってみよう。言語の壁はchromeのWEBプラウザ翻訳を使えば1発解決。参考書は知識を体系的に覚えられて便利だがクラウド業界は常に技術やソリューションをアップデートしているので気をつけましょう。

<h6>リソースを調べる</h6>
問題を解いていくうちに分からないリソースが出てきたらその場で調べよう。こういった当たり前のことをコツコツやるのが大切。

<h2>ハンズオン必要なのか

実際のところハンズオンが絶対に必要かといえばそうでもないというのが僕の結論です。と言うのも自分自身実際の業務でGoogle Cloud を取り扱っておらず、コンソールもろくに入ったことない状態で合格できたからです。しかし、何事も人に説明できてからが一人前なので、ハンズオンの経験は資格勉強を差し置いても絶対にしておいたほうがいいです。

<h2>今後の目標

今後はハンズオンで知見を深めていきエンジニアとして手を動かしていきたいです。こちらのブログにもどんどんGCP関連お記事を投稿していくので楽しみにしておいてください！

<h2>最後に


今回、入社約一年半でAWS, GCPを全冠することができたので記念にこの記事を書かせて頂きました。AWS, GCP,  Azureを学んでおくことでクラウド全体の知識を深めることができるので資格取得はおすすめです！みなさん是非GCP取ってみてください！
virtual box上のubuntuのディスク容量を拡張してみた

参照サイト
https://avinton.com/academy/extending-virtualbox-virtual-drive/


# VDI(仮想ハードドライブファイル)を拡張する
## プロパティを開く
ツール > メディア > プロパティ > (拡張したいVDIを選択する)
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/9b8b09f4-aa69-c1a5-7ceb-cb163112a7d7.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/7aa5616d-5c53-fd11-cb99-27c5bb480475.png)

## サイズを入力し、適用をクリックする
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/879e9d61-1983-37f2-1558-b015798758df.png)


# パーティション情報を操作する
## GPartedをインストールする
```console:console
root@ubuntu:~# apt install gparted
```

## GPartedを起動する
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/01f8c73c-2435-f5ba-5f65-275ebeba2200.png)

- コマンドだとエラーが発生するが、GUIから起動できる

## 拡張するパーティションを右クリックし、Resize/Moveをクリックする
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/5781e66f-8a25-47ae-f96e-c9c25960c132.png)

- busyエラーが発生する場合はunmountをクリックすると(unmountできないとエラーが発生するが)Resize/Moveが実行できるようになった

## 新しい容量を入力し、resizeをクリックする
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/6158a0d8-a571-bc13-5a9b-d093fce77651.png)

## applyをクリックする
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/c8108b56-6d54-1d2a-d95c-5c35ddcca9a5.png)

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/6809f45f-a003-d3ed-8178-90f51495df84.png)

# ディスク容量が拡張できた
sns.coutplot()

### sns.coutplot()の使い方
```:python
import seaborn as sns
import matplotlib.pyplot as plt

# カテゴリデータの例（仮想的なデータ）
data = ['Category A', 'Category B', 'Category A', 'Category C', 'Category B', 'Category A', 'Category A', 'Category C']

# カウントプロットを作成
sns.set(style="whitegrid")  # グリッドスタイルを設定
plt.figure(figsize=(8, 6))  # プロットのサイズを設定
sns.countplot(x=data, palette="Set3")  # カウントプロットを作成

# グラフのタイトルと軸ラベルを追加
plt.title("Category Counts")
plt.xlabel("Categories")
plt.ylabel("Count")

# グラフを表示
plt.xticks(rotation=45)  # x軸ラベルを回転して表示
plt.tight_layout()  # レイアウトを調整してグラフを表示
plt.show()
```
このコードは、仮想的なカテゴリデータを使用して sns.countplot を作成する例です。data にはカテゴリのリストが入っており、そのカテゴリごとの出現回数を棒グラフで表示します。palette はグラフの色を設定します。

sns.set でグリッドスタイルを設定し、plt.figure でプロットのサイズを調整しています。plt.title、plt.xlabel、plt.ylabel でタイトルと軸ラベルを追加し、plt.xticks でx軸ラベルの表示を調整しています。

このコード例をベースに、実際のデータや目的に合わせてカウントプロットをカスタマイズして作成することができます。
【Git】git log で変更履歴を確認する方法

git log コマンドについてこんなツイートをしました。コマンドについてはわかったけど使い方がわからないと思うので、この記事では使用方法の詳細を書いています。

普段はプログラミングについて発信しています。<a href="https://twitter.com/div_tomo?ref_src=twsrc^tfw" class="twitter-follow-button" data-lang="ja" data-show-count="false"> フォローする </a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【git log コマンドの紹介】<br><br>git log を実行すると今までの変更履歴を確認できます。<br><br>&gt; git log<br><br>▼一行で表示する<br><br>&gt; git log --oneline<br><br>▼ファイルの変更差分を表示<br><br>&gt; git log -p &lt;ファイル名&gt;<br><br>▼表示するコミット数を制限<br><br>&gt; git log -n &lt;コミット数&gt;<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; Tomoya🧑‍💻エンジニア (@div_tomo) <a href="https://twitter.com/div_tomo/status/1696735137839673389?ref_src=twsrc%5Etfw">August 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 変更履歴を確認する

`git log` を実行すると今までの変更履歴を確認できます。

> ＞_ コマンドライン
> 

```bash
> git log

//一行で表示する
> git log --oneline

//ファイルの変更差分を表示
> git log -p <ファイル名>

//表示するコミット数を制限する
> git log -n <コミット数>
```

# git log の使用方法

```mermaid
flowchart LR
A[コミット1] ===> B[コミット2] ===> C[コミット3] 

C --変更履歴--> B
B --変更履歴--> A
```

**コミット１**が一番古いコミットで

**コミット３**が一番最近のコミット

`git log` と打つと最近のコミットから順に変更履歴をたどっていきます。

つまり**コミット３**と**コミット２**の変更履歴が表示され

**コミット２**と**コミット１**の変更履歴が表示される流れになります。

## 変更した履歴を確認

> ＞_ コマンドライン
> 

```bash
> git log
commit 3d72b8eca354f6ea108fba118c4b611f5bb1d92e (HEAD -> master)
Author: ユーザー名　メールアドレス
Date:   Sun Aug 27 17:33:36 2023 +0900

    git diff を追記しました

commit 042087617ed33340367eb02001d289c003c2f8e8
Author: ユーザー名　メールアドレス
Date:   Sun Aug 27 15:38:47 2023 +0900

    statusコマンドの確認

commit ffd18ded5097bdcb59423d9104f2dbb8de6da140
Author: ユーザー名　メールアドレス
Date:   Sun Aug 27 04:04:03 2023 +0900

    test
```

### 説明

```bash
commit 3d72b8eca354f6ea108fba118c4b611f5bb1d92e (HEAD -> master)
```

これは、コミットのハッシュ値でコミットのIDみたいな物

```bash
Author: ユーザー名　メールアドレス
```

記載通りユーザー名とメールアドレスです。

```bash
Date:   Sun Aug 27 17:33:36 2023 +0900
```

コミットした日付

```bash
git diff を追記しました
```

コミットメッセージを表示
Laravel8.xでgithub actionのChromeDriver 115+がダウンロードできなくなって対応した話

# 新しい記事を書きました

(現在2024/12/27時点)で当記事の対応では動かなくなったため、新しく記事を書きました。

* [Laravel8.x Laravel9.xでgithub actionのChromeDriver関連のエラーがでて対応した話 #GitHubActions - Qiita](https://qiita.com/akagane99/items/a1da4b45228f52868f66)

# 結論

Chrome browser を v114にダウングレード＋ChromeDriverもv114にして対応しました。

```yml
      - name: Downgrade Chrome browser to v114
        uses: browser-actions/setup-chrome@latest
        with:
          chrome-version: 1134343 # Last commit number for Chrome v114

      - name: Chrome bin-path Override
        run: sudo ln -nfs `which chrome` /usr/bin/google-chrome

      - name: Downgrade Chrome driver to v114
        run: php artisan dusk:chrome-driver 114
```

# 詳細

ChromeDriver 115+になってChromeDriverのダウンロードURLが変更になり、ChromeDriver 115以降でダウンロードできなくなりました。

* https://stackoverflow.com/questions/76980975/chrome-driver-failing-in-laravel-dusk-failed-to-open-stream-http-request-fai
* https://voicetechno-jp.secure-web.jp/ChromeDriverV115orNewer.html

## 参考：github actionエラー内容

```
  php artisan dusk:chrome-driver `/opt/google/chrome/chrome --version | cut -d " " -f3 | cut -d "." -f1`

   ErrorException 

  file_get_contents(https://chromedriver.storage.googleapis.com/LATEST_RELEASE_116): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
```

---

Laravel8.xはDusk v6.x系ですが、既にbugfixのサポート期間を過ぎていたため、修正されませんでした。

* https://github.com/laravel/dusk/issues/1055

Dusk v7.x系は https://github.com/laravel/dusk/releases/tag/v7.9.0 で修正されました。
しかし、Dusk v7.x系はphp8.xで実行（https://github.com/laravel/dusk/blob/7.x/composer.json#L13 ）のため、Laravel8.x系では使えませんでした。
SerializeReference + SubclassSelectorのついているフィールドをInspectorで設定してもPlayすると外れてしまう

# バグの再現方法

version: `2021.3.21f1`

https://github.com/mackysoft/Unity-SerializeReferenceExtensions

上のパッケージをインストールして，適当なInterfaceをFieldにもつクラスを生やして，Inspectorで設定する
（自分の場合はScriptableObjectだったがMonoBehaviourでも再現すると思う）

```cs
namespace Hoge
{
    public class Fuga : ScriptableObject
    {
        [SerializeReference, SubclassSelector]
        public Interface i;
    }

    public interface Interface { }
    public class ImplA : Interface { }
    public class ImplB : Interface { }
}
```

namespaceを変更する

```cs
namespace HogeHoge
{
    public class Fuga : ScriptableObject
    {
        [SerializeReference, SubclassSelector]
        public Interface i;
    }

    public interface Interface { }
    public class ImplA : Interface { }
    public class ImplB : Interface { }
}
```

参照が変わるため，アタッチが外れnullになるので，再度Inspectorで設定

Playするとなぜか`i`がnullになる（何度繰り返しても）

# 解決策

一回，Attribute(`[SerializeReference, SubclassSelector]`)を消して読み込み直す
その後，Attributeを付け直す
電子工作メモ - 74HC4511

# 74HC4511

- 7セグLED用デコーダIC
- ドットの端子はないので別に制御する必要あり
- ピン
  左下から反時計回りに、1-16

|Pin|端子名|用途|
|:--|:--|:--|
| 1|D2|入力2桁|
| 2|D3|入力3桁|
| 3|$ \overline{LT} $|ランプテスト。Lowにすると全点灯|
| 4|$ \overline{BI} $|ブランク入力。Lowにすると全消灯|
| 5|LE|ランプイネーブル（表示保持）。 <br>Highにすると入力値を反映しないで保持した状態を表示|
| 6|D4|入力4桁|
| 7|D1|入力1桁|
| 8|G |グランド|
| 9|Qe|7LED のE|
|10|Qd|7LED のD|
|11|Qc|7LED のC|
|12|Qb|7LED のB|
|13|Qa|7LED のA|
|14|Qg|7LED のG|
|15|Qf|7LED のF|
|16|Vcc|電源5V|

- D1-D4 と表示のマッピング
  数字を表示するには、以下の通り
  - LT: High
  - BI: High
  - LE: Low
  - D1-D4: 4bitの0-9で表す

|LE|BI|LT|D4|D3|D2|D1|-|Qa|Qb|Qc|Qd|Qe|Qf|Qg|-|表示|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|L|x|x|x|x| |H|H|H|H|H|H|H| |全ランプ点灯 = 8|
|x|L|H|x|x|x|x| |L|L|L|L|L|L|L| |全ランプ消灯|
|L|H|H|L|L|L|L| |H|H|H|H|H|H|L| |0|
|L|H|H|L|L|L|H| |L|H|H|L|L|L|L| |1|
|L|H|H|L|L|H|L| |H|H|L|H|H|L|H| |2|
|L|H|H|L|L|H|H| |H|H|H|H|L|L|H| |3|
|L|H|H|L|H|L|L| |L|H|H|L|L|H|H| |4|
|L|H|H|L|H|L|H| |H|L|H|H|L|H|H| |5|
|L|H|H|L|H|H|L| |L|L|H|H|H|H|H| |6|
|L|H|H|L|H|H|H| |H|H|L|L|L|L|L| |7|
|L|H|H|H|L|L|L| |H|H|H|H|H|H|H| |8|
|L|H|H|H|L|L|H| |H|H|H|L|L|H|H| |9|
|L|H|H|H|L|H|L| |L|L|L|L|L|L|L| |全ランプ消灯|
|L|H|H|H|L|H|H| |L|L|L|L|L|L|L| |全ランプ消灯|
|L|H|H|H|H|L|L| |L|L|L|L|L|L|L| |全ランプ消灯|
|L|H|H|H|H|L|H| |L|L|L|L|L|L|L| |全ランプ消灯|
|L|H|H|H|H|H|L| |L|L|L|L|L|L|L| |全ランプ消灯|
|L|H|H|H|H|H|H| |L|L|L|L|L|L|L| |全ランプ消灯|
ChatGPT File Uploader Extensionを使用してドキュメントを ChatGPT にアップロードする。

# 1\. インストール手順
[ChatGPT File Uploader Extended](https://chrome.google.com/webstore/detail/chatgpt-file-uploader-ext/becfinhbfclcgokjlobojlnldbfillpf/related)を Chrome に追加します。
![Screenshot 2023-08-29 at 13.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495932/e8e67a46-fc97-e6fd-59f7-c2d3e1c5f578.png)

# 2\. ファイルのアップロード
Chromeを開きます。
ChatGPT のプロンプトボックスの横にアップロードアイコンが表示されます。
![Screenshot 2023-08-29 at 13.51.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495932/58c951f6-15ba-73e6-35ea-ba097377023d.png)

Kaggle の Titanic トレーニングデータの CSV ファイルをアップロードしてみました。
![Screenshot 2023-08-29 at 14.17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495932/b54d905f-fa84-309e-9173-4a6718b1bdeb.png)
![Screenshot 2023-08-29 at 14.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495932/9d3bf378-fd08-a36a-b2e6-e788dae06764.png)

# 3\. ファイルに関連するチャット
その後、ChatGPT はファイルに関連する質問に回答できるようになります。
![Screenshot 2023-08-29 at 14.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495932/714481b4-6011-ee61-2ccd-ce8c21f1d692.png)
![Screenshot 2023-08-29 at 14.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495932/a49b17a2-1305-038a-8d7e-7852225a7620.png)
vagrant up時にStderr: VBoxManage.EXE: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter #〇'が出た時の解決法

## 背景

vagrant upをしたら以下のエラーが起きた

```
Stderr: VBoxManage.EXE: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter #2' (VERR_INTNET_FLT_IF_NOT_FOUND).
VBoxManage.EXE: error: Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND)
VBoxManage.EXE: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
```

調べてみると、windowsでアダプターの設定の変更が必要らしい。

## 解決方法(アダプターの設定変更)

#### ネットワークと共有センターを開く

![001キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327773/3309b67b-0178-0734-e026-dd00f2cd77e9.png)

アダプターの設定の変更をクリック。
ネットワーク接続設定ページに飛びます。


エラーログに記載の番号のものを選択。

今回はログには

```
Stderr: VBoxManage.EXE: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter #2' (VERR_INTNET_FLT_IF_NOT_FOUND).
```

とあったので、#2を選択し右クリックでプロパティを開いてください。

![002キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327773/362e34f5-a519-0613-87bd-b4cad3c1e514.png)


#### プロパティの設定変更

* VirtualBox NDIS6 Bridged Networking Driver にチェックを入れる(私の場合はすでに外れてました)
* インターネットプロトコル バージョン6(TCP/IPv6) のチェックを外す

この2つでOKです。

![003キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327773/7898681d-ceea-8d7c-7d30-b71157cbd92b.png)


#### 設定の反映

#2のネットワーク設定を右クリックで「無効」にしてください。
その後、再度「有効」にしてください。

![004キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327773/6519ffd4-dfa8-0af4-3635-b48fd3deafbc.png)


これで`vagrant up`が正常に進むはずです！
RailsにBootstrapを導入

#### Bootstrapをgemでインストール

RailsでBootstrapを使う場合は、gemを使ってインストールする

```
Gemfile

gem 'bootstrap', '~> 4.3.1'
gem 'jquery-rails'
```

```
$ bundle install
```

#### SCSSファイルを作成

application.cssをapplication.scssというファイル名に変更する。

ファイル名を変更したら、実際にファイルを開いて、*= require_tree .と*= require_selfを削除し、@import "bootstrap";を追記

```
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .    ＜（削除）
 *= require_self      ＜（削除）
 */
@import "bootstrap";  ＜（追加）
```

#### JSファイルを修正

- Bootstrapで使われる「JavaScript」や「jQuery」などの関連ファイルを読み込む設定する。

app/assets/javascripts/application.jsを開き、以下を参考に元々あったコードの上に追記

```
# 以下の３つを追記
//= require jquery3
//= require popper
//= require bootstrap

# 元々あったコード
//= require rails-ujs
//= require activestorage
//= require turbolinks
```

- 最後に、Rails（Puma）を再起動する
【ChatGPT】Enterprises登場。裏側で「高度なデータ分析」。お遊びなし。

:::note info
本記事は、ChatGPTのニュースです。
お遊びなしなので、あしからず。
:::

　どうも、カーブミラーです。

　まずは、
　　ChatGPT Enterprisesが
　　　提供開始されましたね。
　　　　お値段については、
　　　　　OpenAIの営業と
　　　　　　要相談だそうです。

　詳細については、
　　ググるか、下記You Tube動画を
　　　見るか、してください。
　　　　リモートワーク研究所の
　　　　　いけともさんの動画です。
[ChatGPTエンタープライズ登場！](https://youtube.com/watch?v=UebsXYTyMU0&si=QoLo1IBOWQAxKPAi)
***
　それから、
　　“Code Interpreter”の名称が、
　　　“Advanced Data Analysis”に
　　　　変わったそうです。

　「高度なデータ分析」と
　　　翻訳されました。

　redditに
　　問い合わせした人の記事が
　　　載ってます。英語ですw
[ChatGPT appears to have renamed the 'code interpreter' beta feature to 'advanced data analysis'](https://www.reddit.com/r/ChatGPT/comments/163uu1l/chatgpt_appears_to_have_renamed_the_code/?rdt=64084)

　注意点は以下のとおり。
　（翻訳して引用します）
***
「高度なデータ分析」機能は、基本的に「コード インタープリター」機能の基盤の上に構築されています。Python コードを実行する機能などのコア機能は残りますが、より複雑なデータ分析タスクを処理する機能が追加されました。

ただし、注意すべき点がいくつかあります。

インターネット アクセス: この環境にはインターネット アクセスがないため、外部 Web リクエストまたは API 呼び出しを必要とする機能は機能しません。
実行時間制限: コードの実行には時間制限があるため、長時間実行されるコード スニペットは切り捨てられるか、タイムアウトになる可能性があります。
永続ストレージ: 「/mnt/data」のドライブはユーザー ファイルの保存と永続化に使用できますが、セッション中は一時的なものです。
これらの考慮事項とは別に、強化された環境の主な目的は、データ分析におけるより多くのツールと柔軟性を提供することです。興味のある特定の機能や実行したいタスクがある場合は、お気軽にお問い合わせください。
***
　ここから、自分の言葉です。

　ChatGPT3.5Turboが、
　　fine-tuningできるように
　　　なったばかりなのに。

　同じくらいの能力になった、
　　とよろこんでいたら、
　　　GPT4が高速になって、
　　　　引き離されてしまったと。

　でも、
　　Enterprisesを使えるのは、
　　　企業さんでしょうし、
　　　　私は無料版に
　　　　　固執している人間なので
　　　　　　関係ありませんけどねw

　制限撤廃は、
　　かなりのアドバンテージを
　　　得ることになるでしょうね。

　こうなると、
　　ChatGPT利用の開発が
　　　加速するんでしょうか。

　世の中が、
　　快適になりますように。

以上。
【Flutter】TextFieldの枠線の色を変える方法。

# やり方
```dart
TextField(
  decoration: InputDecoration(
    enabledBorder: OutlineInputBorder(
      borderSide: BorderSide(
          color: Colors.red,
      ),
    ),
  ),
),
```
# まとめ
枠線の色はenabledBorderとfocusBorderを使って設定します。
Micro Hardening 体験記

# きっかけ
北海道地域情報セキュリティ連絡会(HAISL)の会長(!? 知らなかった)の授業を大学院で履修していたところ，`Micro Hardening for Youth 2023`の宣伝があったため参加．手を動かしてセキュリティを学びたいと思っていたところだったのでちょうどよかった．

::: note info
主催の川口さん(株式会社 川口設計)によると攻撃内容のネタバレは禁止だが，それ以外ならブログ等に載せていいそう．
:::

# 前提
- 僕は北海道に住む修士1年生
- 情報セキュリティに興味があるが手を動かす学習はしていない
- 2023年8月6日に札幌で行われたMicro Hardeningに参加したのが初めてのMicro Hardening

# Micro Hardeningとは
衛る技術の価値を最大化することを目指すHardening Projectから生まれたサブプロジェクトで，「ゲーム感覚で」サイバー攻撃に対処する能力を参加者が磨くことを目指している．45分間で提供されたECサイトに対する様々なサイバー攻撃を観測し，対処法を試す．これを1チーム4人で複数セット繰り返すことで最初は分からなくても段々何をするべきか分かるようになっていき，高校生や公務員など非エンジニアでも楽しめる勉強会となっている．実際僕も最初は何をすればいいか全く分からずにチームメンバーに聞きながらMicro Hardeningの一歩を踏み出した．

# 感想
事前に配布される資料の量を見て，初心者でもこれを読んで理解してから参加すれば少なくともMicro Hardeningでは置いていかれないんだなと安心した．チームメンバーには警察の方と放送局の方がいた．Micro Hardeningの45分が始まる前に作業時間があるのだが，僕はWebサーバに入った後に何をするべきかさえ分からなかったので最初はチームメンバーに指示を仰ぎながら作業をした．

::: note info
このときメモをとることで次のセットからの作業をスムーズにすることができるので大変重要．
:::

```
passwd -l test
```
でユーザtestをロックできることを初めて知った．

とあるセキュリティ会社のインターン選考でWeb診断も複雑で面白いという話が出ていたこともあり体験するにはいい機会だと思って参加した．これまでWeb診断には全く興味がないというか食わず嫌いしていた節があったがスペシャリストを目指すためにはそうは言っていられないと感じた．DB然り……

もっとできることを増やしたいと思ったし，実際に他のチームの2年目の人はかなり成長を感じていて早いうちからこういった環境に触れられることを羨ましく思った．

# 反省点
チーム全員がデータベースを扱ったことがなかったため放送局の人に任せてしまった．今回のMicro Hardening後にセキュリティ会社でのインターンシップでCTFをやったが，そのときもMySQLが出てきた．チームメンバーに経験者がいたためなんとかなったが，いなかったら詰んでいただろう．その人が見えないはずのデータを表示させていてかっこいいと思ったためちょっとデータベースの勉強をしたくなった．

# 当日の昼ごはん
警察の方と放送局の方と一緒に食べに行った蕎麦屋　ごまそばあずみ
<img src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191770/16c13c27-df81-ce8d-099c-f0aec0def748.jpeg width=60%>



# 参考文献
この記事は以下の情報を参考にして執筆しました。
- [セキュリティをゲーム感覚で学べる競技 Micro Hardening for Youth 2023](https://sc4y.connpass.com/event/290224/)
プロンプトテスト（エクセルファイルの当日データ行を新規ファイルへコピー保存）

## プロンプト

あなたは、プロのコーダーです。
以下のControlとInputから、プログラムを出力してください。
なおInputはない場合は、Noneとします。

###Control
プログラムはpython3でお願いいたします。
※コメント：Python公式に準拠など一文あったほうがベター

Excelファイルを読み込みます。
なおパスは ./{現在の年}/{当月(2ケタ).xlsx}となります。
 （ex. 2023年8月であれば、./2023/08.xlsxを参照）

その中の{当月}{"月"}(例. 8月なら8月、12月なら12月)シートのC列が当日のものと一致する行を
新規ファイルのcopyというシートを作成し、その中にコピーしてください。

一致するためのロジックは
エクセルの入力形式が、{月}/{日}となっています。（例. 8/1, 12/31）
したがって、当日の日付を取得し、その日付と一致する行を全て抽出してください。

ペーストは値として処理してください。（元の関数はコピーしないでください。例. vlookup -> 参照された値をいれる、例えば3など）
※これはNG。

なおプログラムの可用性やメンテ性などを考慮したわかりやすいコードでコメントも追記しながら記述してください。


→追記
NGだったため、以下を追加質問

vlookupなどの関数がそのままペーストされています。
これを実際にvlookで抽出した値（例えば3など）としてコピーしてほしいです。
※これはxlwingsでないと実現不可でした。。


###Input

```copy_excel.py

import os
import openpyxl
from datetime import datetime

def main():
    try:
        # 現在の年と月を取得
        current_year = datetime.now().year
        current_month = datetime.now().month
        
        # Excelファイルのパスを作成
        excel_path = f"./{current_year}/{current_month:02}.xlsx"
        
        # ファイルが存在するかチェック
        if os.path.exists(excel_path):
            # Excelファイルを開く
            wb = openpyxl.load_workbook(excel_path)
            
            # 当月のシート名を取得
            sheet_name = f"{current_month}月"
            
            # シートが存在するかチェック
            if sheet_name in wb.sheetnames:
                sheet = wb[sheet_name]
                
                # 当日の日付を取得
                current_day = datetime.now().day
                
                # 新しいワークブックを作成
                new_wb = openpyxl.Workbook()
                new_sheet = new_wb.active
                new_sheet.title = "copy"
                
                # ロジック: 当日の日付と一致する行をコピー
                for row in sheet.iter_rows(min_row=2, values_only=True):
                    date_str = row[2]
                    if date_matches_current_day(date_str, current_day):
                        new_sheet.append(row)
                
                # 新しいファイルを保存
                new_file_path = f"./copy_{current_year}_{current_month:02}.xlsx"
                new_wb.save(new_file_path)
                
                print("コピーが完了しました。")
            else:
                print(f"{sheet_name}シートが存在しません。")
        else:
            print(f"{excel_path}が存在しません。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# ロジック: 日付が当日と一致するかどうかを判定
def date_matches_current_day(date_str, current_day):
    try:
        month, day = map(int, date_str.split('/'))
        return month == datetime.now().month and day == current_day
    except:
        return False

if __name__ == "__main__":
    main()
table plus dumpのCSVファイルをimportする

# 概要

- table plusにてdumpのCSVファイルをimportする方法を簡単にまとめる。

# 方法

1. table plusを開く
1. バーの「File」をクリックする。

    ![Menubar_と_tempo_smart_local___temposmart_next_-_MySQL_8_0_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/90bfbbc0-76a0-e757-6a1b-15594c1867ad.png)

1. 「Import」をクリックし「From SQL Dump...」をクリックする。

    ![スクリーンショット_2023-08-30_11_28_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ad46ff77-5d23-4fba-08fe-b737e35ba5bf.png)

1. dumpのCSVファイルを選択し「開く」をクリックする。
1. importが行われる。

# 参考文献

https://docs.tableplus.com/gui-tools/import-and-export
【Laravel】デバッグで変数の値を確認する方法(Logファサード)

LaravelはVSCodeでデバッグモードが起動できなかったため、
エラーが発生した時に変数の中身を確認することができなかった。
デバッグログを出力する方法で変数の中身を確認できるというサイトがあったが、
ログを出力するまでに苦戦したのでメモ。

## ログの保存設定
①config/app.php に以下を追加する。
```app.php
/*
	|--------------------------------------------------------------------------
	| Logging Configuration
	|--------------------------------------------------------------------------
	|
	| Here you may configure the log settings for your application. Out of
	| the box, Laravel uses the Monolog PHP logging library. This gives
	| you a variety of powerful log handlers / formatters to utilize.
	|
	| Available Settings: "single", "daily", "syslog", "errorlog"
	|
	*/
	
	'log' => env('APP_LOG', 'daily'),
```
daily：
・ログをファイル出力する時に日別で出力する。
・dailyの記述は、config/logging.php に書かれている。
・ログは、 storage/log/laravel-YYYY-MM-DD.log に出力する。


②.envファイルに以下を記述する。
```.env
#LOG_CHANNEL=stack    //これをコメントアウトする。
LOG_CHANNEL=daily
```
※`LOG_CHANNEL=daily`を記述しないと、ログが日別でファイル出力されない。


## ログを出力する
①○○.phpにログを出力するコードを書く。
```○○.php
use Log;
Log::debug($request);
Log::debug('文字を出力することも可能');
```

②`storage/log/laravel-YYYY-MM-DD.log` を確認する。
![todo_debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/3de9edc9-20cc-1546-0fbe-7a98e0ef17be.png)


## 参考サイト
Laravelでのデバッグのやり方について（Logファサード編）
https://laraweb.net/practice/2561/

【Laravel】ログを日別に作成する　※ローテーション
https://e-seventh.com/laravel-log-daily/
PowerAutomateのメール送信は5分以内に5通までしか送れない(ものがある)

## この記事で伝えたいこと
::: note warn
Gmail等を使った方法等、その他のメール送信については調べていないので触れていません...。すみません...。
:::
::: note info
PowerAutomateで「メール通知を送信する (V3)」を使うときは制限に気をつけよう！
具体的には1日で100件までに加えて5分で5通までしか送れないよ
PowerAutomateの実行間隔はライセンスによって、違うよ
:::

## 本題
さて、毎回この始まり方な気がしますが皆さんPowerAutomateでメール送信に**やたら時間がかかって**悩んだこと、ありませんか？
~~毎度のことながら~~もちろん僕はあります。

毎回5分程度かかるフローがあってそれの原因が「**繰り返し**」というアクションで
メールを一度に**実行中のフローを含めて5分以内に5件以上**送信しようとしていたことで処理に遅延がかっていました。
この**実行中のフローを含めて**、というのが肝です。

これについてはMSの公式ページにちゃんと制限が書いてありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/1f077311-c027-2e21-aa40-42e0fd62973d.png)

実際の動きとしてはメールを5件まで送信したところで一旦停止し、
5分後に再度**Automate側で勝手に続きからやってくれる**のです。便利ですね。
ただ、これについては**注意点**がありますので下記に述べます。

## 注意点
続きから送信したものの再度制限に引っかかり続きから送れなかった場合**2回**までで**429エラー**が返ってきてしまいます。

::: note warn
実体験からなので正確に2回ではないかもしれませんが、何回か再実行しようとすると引っかかることは確実です。
:::

そんな続きからすらも制限にかかって送れないことってあるの？と思うかもしれません。
それが、気をつけないと割と起こり得るのです。

具体的に言うと、そもそもAutomateというのは**ライセンスによって**実行間隔が違います。
下記サイト様が詳しく書いてくださっているので具体的には省きますが・・・

https://begin-prog.site/power-automate-how-to-investigate-trigger-interval

この実行間隔と噛み合うと、条件によっては5分にかなりの量のメールを送信しようとしてしまいます。

## 例えば
メールを一度に5通送信するAutomateの実行条件がSharePointが更新/追加された場合とした時に15分以内にSharePointの列を5個ほど更新したとしましょう。

そこで仮にライセンスが「PowerAutomate Free」だった場合、**15分に一度**しかフローが走らないので5個分**一度**にフローが走ることになります。
ということは**5*5の25通**メールを送信しようとします。

5分に5通までしか送れないので5通送ったところで残り20通は更に**5分後**ということになります。
言うまでも有りませんが、更に5通送ると残りの15通は更に**5分後**・・・といった具合に**どんどん遅延**していきます。

最悪なパターンなのが、その遅延している5分以内に更にSharePointで更新等をかけてしまうとその分**どんどん上乗せ**されていきます。~~地獄かな？~~

メールの送信順も不明瞭で、1つ目のフローは2件、2つ目のフローは3件送って両方止まってる、なんてこともあります。

## 解決策
~~そういうことを聞いてるんじゃない、感がありますが~~そもそも5通もメールを送るんだったら可能ならば基本的にはグループアドレスか何かにメールを送信するようにしましょう。

また、メールの送信(V3)ではなく、メールの送信(V2)を使うと5分に5通までの制限は回避できるようです。

もしくは、ライセンスをより良いものにしましょう。これ自体については結局5分で5通の制限には引っかかるので微妙な感じが正直しますが実行間隔が短くなるのでたまりすぎるまでに処理が走るようになるので多少はマシになるでしょう

・・・なんだかまともな解決方法が有りませんね、すみません。
自分はGoogleのグループアドレスを使うようにしたことで回避したのですが・・・他に解決策とか、ないものでしょうか。

## 余談
ちなみに、1日に100件までしか送れない制限もあります。
これに引っかかると引っかかった段階でメール送信のアクションが止まり続けます。
やっかいなのが**エラーにならず**に止まり続けます。
しかも、**次の日になっても止まり続ける**ので手動で再実行するしかありません。

制限リセットのタイミングも不明瞭で夜に引っかかったのに朝出勤する頃には解除されてる、なんて感じだったので止まったタイミングから24時間というわけではないようです。

## 終わりに
いかがでしたでしょうか。
中途半端にメールが送信されたりと、微妙に厄介な仕様ですよね。
特に承認システム等を扱っているとPowerAppsとかSharePointでは更新されてるのにフローが走り出さないから想定通りに動かない、なんてこともあります。
皆様、気をつけましょう...。

間違い等、ありましたらご指摘お願い致します。

## 参考
https://learn.microsoft.com/ja-jp/connectors/sendmail/

https://begin-prog.site/power-automate-how-to-investigate-trigger-interval
Dataverse の 添付ファイルってどこにあるの？

Power Apps や Power Automate に非常に有用なデータ格納領域として名高い、Microsoft Dataverse。
Dataverse には、ファイルを直接格納できるというユニークな特徴があります。

ファイルを格納する方法としては以下の３つ。

* 画像列
* ファイル列
* 添付ファイル

今回はそのうち「添付ファイル」は、実際にどこにあるのかについて探っていきましょう。

# 添付ファイルの有効化

添付ファイルは、既存のテーブルの設定を編集する際に表示される、「添付ファイルを有効とする（メモとファイルを含む）」にチェックを入れると有効化されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/eac56fa0-125d-46d0-da2b-db5c39cdc0be.png)

**テーブルを作る際に、「高度なプロパティを設定する」を選ぶ際にも表示されますが、チェック入れて作成をしても反映されないので注意。**

## 列として追加されるわけではない。

チェックを入れたとしても、列一覧に表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/271d624c-6728-d694-4564-b9c61a6cbfd9.png)

また、既存列の一覧にも存在しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/5e50ed65-54c8-7347-9db7-1a539eaa5c04.png)

# キャンバスアプリ

フォームなどのデータソースを操作するコントロールだと、Attachment というフィールドが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/2cb72275-0117-dadb-97e0-c6ef0b03bbaa.png)

実際に、ファイル添付のコントロールも追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/1fae46dc-303b-6fe6-0cca-c1ab48a275d1.png)

## 実際に動かしてみる

フォーム入力すると添付ファイルも、ほかのファイル列などと別枠として保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/66fe84b2-3b26-714f-1feb-0576db986f52.png)

## 監視で見てみると・・・

ファイル列ですと、createFile という操作によって、作成したテーブルのファイル列にPatch操作が行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/186a72f7-224e-4f1a-a61c-319ee7143a4b.png)

ですが、添付ファイルの場合は、createAttachment という操作が行われ、作成したテーブルではなく、annotations テーブルに格納されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/9451dcf3-7956-dc8b-cf38-513c15552bc2.png)

annotations テーブルは、日本語は「メモ」というテーブルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/f9ac79a3-5a0a-da0a-17c2-8e96658a38c7.png)



# モデル駆動型

モデル駆動型の場合は、フォームと列をまず定義することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/a4dfe3af-538c-e72e-36ec-ea6b957629b0.png)


## フォーム

フォームの中で、添付ファイルという列はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/17cdfee7-e35c-0d27-92b6-14c6f7841efe.png)

では、添付はどこか・・・

これは、コンポーネントのタイムラインになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/322bd52e-523b-ccd0-08a0-521a1004d427.png)

なぜならば、タイムラインが参照しているテーブルが「メモ」テーブルだからですね😃

## ビュー

ビューの場合も、添付ファイルという列がないので、一覧画面で添付ファイルがあるかどうかを表示させることは、標準機能ではできないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/7ac352b1-6acf-aca6-bbfe-61aca63eb5f3.png)


## 実際のデータ

モデル駆動型アプリを開くと、添付ファイルはタイムラインに表示されていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/46a4eb9a-845d-8533-c5f9-3e9b201a7724.png)

# まとめ

というわけで、Dataverse の添付ファイルは、annotations テーブル。
日本語は「メモ」というテーブルに格納されています。
必要な場合はぜひこちらを活用するようにしましょう😃
Jest.useFakeTimersとPrisma.findUniqueを組み合わせるとテストが止まる問題の解決

# 概要
Jestを使ったテストで`Jest.useFakeTimers`でタイマーモックを設定した上で`Prisma.findUnique`を使うと、何も返って来ずテストが進まないという現象が発生した。
何故解決するのか完全に理解はしていないが、その解決方法の備忘メモ。

# 環境
* typescript: 4.2.x
* jest: 29.1.x
* prisma: 3.15.x

# 結論
`jest.useFakeTimers`のConfigで`nextTick`をモック対象外に指定することで解決。

```typescript: 解決前の設定
jest.useFakeTimers({
  now: new Date('2023-01-01 00:00:00'),
});
```

```typescript:解決後の設定
jest.useFakeTimers({
+  doNotFake: ['nextTick'],
  now: new Date('2023-01-01 00:00:00'),
});
```

# 備考
`Prisma.findUnique`ではなく`Prisma.findFirst`であれば、`nextTick`をモック対象外に指定せずともテストが問題なく走った。


# 参考URL
https://github.com/prisma/prisma/issues/7424
せんせー、バイオベースポリマーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バイオベースポリマーってなに？

# バイオベースポリマーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## バイオベースポリマーって何？

みんな、プラスチックを知ってるよね？おもちゃや容器、いろんなものがプラスチックでできています。
でも、普通のプラスチックは環境によくないこともあります。
そこで、植物や動物から作る特別なプラスチックがあるんです。それが「バイオベースポリマー」です。

## どういうこと？

「バイオベース」は「生物から来る」という意味です。
そして、「ポリマー」は長い鎖のようにつながったものを指す言葉です。
バイオベースポリマーは、とうもろこしやさとうきびなどの植物から作られることが多いんです。

## どうしてそれがすごいの？

このバイオベースポリマーは、環境にやさしいんです。
普通のプラスチックが自然に戻るのにとても長い時間がかかるけど、バイオベースのものは比較的早く分解されることがあります。だから、地球をきれいに保つために役立っているんです。

## だから、バイオベースポリマーってなに？

バイオベースポリマーは、植物や動物から作られる特別で環境にやさしいプラスチックのことなんです。

# まとめ

このように、バイオベースポリマーは、地球にやさしい新しいタイプのプラスチックで、未来の環境を守るための一つの方法なんです。
NPSPの重要な変更


以下で議論されていたのですが、いまひとつ理解できてなかったですね。

+ [Who knew about the change to the way NPSP trials are provisioned with p10 licences?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007DwIUn)

I have been told that any work done in the NPSP trial will be GONE when the p10 licences are provisioned.
p10 ライセンスがプロビジョニングされると、NPSP トライアルで行われた作業はすべて失われると言われました。


we have been communicating this change (which happened in the spring) for months at partner office hours and with posts here in the nonprofit community group
私たちは何ヶ月もの間、パートナーのオフィスアワーや非営利コミュニティ グループの投稿を通じて、この変更 (春に起こりました) を伝えてきました。

+ [Which Non-Profit Cloud to Choose?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007GFYnJ)

1.) 非営利クラウド - エンタープライズ版
2.) 非営利サクセスパック (NPSP)

どちらの方法でもEnterprise Editionを入手できます。表現が不十分です。 

Nonprofit Cloud is the new nonprofit product that is built on Industry Cloud core. It is a very different product than Nonprofit Success Pack (NPSP), which is a series of managed packages installed on the regular, non-Industry Cloud Sales version of Salesforce. Either one may work just fine for your nonprofit and both are designed for nonprofits.  

The current version of NPSP has been around for about a decade while Nonprofit Cloud came out this year. Can you say more about the functionality you are looking to do and size of your nonprofit in terms of Salesforce users? Do you do programs, case management, fundraising, a mix of those, something else, etc?

If you go with NPSP, note that the above advice from Keiji is outdated - trial orgs no longer convert to your production instance as of April this year. You can definitely try them both out for 30 days for free but that trial org no longer ends up being your production one when you finish your sign up.

Nonprofit Cloud は、Industry Cloud コア上に構築された新しい非営利製品です。これは、Salesforce の通常の非 Industry Cloud Sales バージョンにインストールされる一連の管理パッケージである Nonprofit Success Pack (NPSP) とは大きく異なる製品です。どちらも非営利団体にとって問題なく機能する可能性があり、両方とも非営利団体向けに設計されています。  

NPSP の現行バージョンは約 10 年前から存在しており、Nonprofit Cloud は今年リリースされました。実現しようとしている機能と、Salesforce ユーザーの観点から見た非営利団体の規模について詳しく教えていただけますか? プログラム、ケース管理、募金活動、それらの組み合わせなどを行っていますか?

NPSP を使用する場合は、Keiji からの上記のアドバイスは古いことに注意してください。今年 4 月以降、トライアル組織は本番インスタンスに変換されなくなりました。どちらも 30 日間無料で試すことができますが、サインアップが完了すると、その試用組織は本番組織ではなくなります。
【自分メモ】GitlabCI/CD用環境変数の設定

## デプロイに使用するAzureアカウントのIDやPWなどCI/CD用の環境変数を設定したい際の手順

１．Gitlabプロジェクトの「設定」→「CI/CD」

２．「変数」を展開し、「変数の追加」よりKeyValueを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/9be0e675-9b46-a1a8-1895-2af118e8e859.png)

### yamlなどで環境変数を使用する場合は
```
echo $USER_NAME
```

参考：GitLab CI/CDの環境変数 | GitLab (creationline.com)
【Salesforce】Visualforceからxlsx形式のEXCELファイルを出力したい

# 問題

Visualforceのcontenttypeにて拡張子を「xls」にしてファイルを出力。
※中身はXMLのWorkbook タブを使用

拡張子を「xlsx」にしても出力は可能だが、ファイルは開けない。

# 解決策

そもそもVisualforceで Excel 形式のファイルに出力する場合、
＜apex:pageBlockTable＞ タグなどを用いてデータのテーブルを作成することのみ対象。

- カスタム ContentType の使用

https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_styling_content_type.htm

※データのテーブルの作成方法

- ページでのデータのテーブルの作成

https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_quick_start_iteration_components.htm

＜Workbook＞ タグはSalesforceサポート対象外。

＜Workbook＞ タグがサポート対象外のため複数のワークシートを設定することは不可。

出力されるファイルの実体は HTML ファイル。
複数ワークシートなどはExcel 固有の内容なのでSalesforce対象外。

- Visualforce ページを Excel 形式でダウンロードする際の注意点

https://help.salesforce.com/s/articleView?id=000384814&type=1
せんせー、リアルタイム量子暗号ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、リアルタイム量子暗号ってなに？

# リアルタイム量子暗号とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## リアルタイム量子暗号って何？

みんな、秘密の手紙を書いたことがありますか。
それを誰にも読まれたくないとき、特別な方法で書くと思いますよね。
リアルタイム量子暗号は、とても特別な方法で情報を守る技術です。
そして、それはすごく速く、リアルタイム（本当の時間）で行われます。

## どういうこと？

量子っていうのは、すごく小さい粒子のことです。
これを使って、情報を送ったり受け取ったりする方法を量子暗号というんです。
そして、これをすぐに、リアルタイムでやるのがリアルタイム量子暗号です。

## どうしてそれがすごいの？

この技術を使うと、とても安全に情報を送ることができるんです。
だって、誰かがこっそりと情報を見ようとしたら、それがすぐにわかっちゃうからです。
だから、大切な情報をとても安全に守ることができます。

## だから、リアルタイム量子暗号ってなに？

リアルタイム量子暗号は、すごく小さい粒子を使って、情報をすぐに、そしてとても安全に送る方法なんです。

# まとめ

このように、リアルタイム量子暗号は、大切な情報を守るための、とても特別で安全な技術なんです。
現在の状況

久しぶりの投稿です
最近はHTMLから抜け出してRubyの勉強をしています。
DMMWEBCAMPの課題をこなしつつ、少しづつRubyの基礎的な部分が理解
出来始めました。
GitHubも作成し、定期的にプッシュしています。
これからも頑張っていき、ここに出してもよい物を作ることが目標です。
フローでのエラーのデバック: An unhandled fault has occurred in this flow



+ [Flow Error "An unhandled fault has occurred in this flow"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007FSbMo)

[Flow Error - An unhandled fault has occurred in this flow](https://appfrontier.my.site.com/kb/s/article/Take-Payment-Flow-An-unhandled-fault-has-occured-in-this-flow#:~:text=If%20you%20receive%20the%20error,meet%20a%20Validation%20Rule%20requirement.)


When a process or flow interview fails, a detailed email is sent to the admin who last modified the process or flow. However, sometimes the admin isn’t the best person to act on the details of what was executed and what went wrong. In that case, you can send error emails to the Apex exception email recipients.

プロセスまたはフローのインタビューが失敗すると、プロセスまたはフローを最後に変更した管理者に詳細な電子メールが送信されます。ただし、管理者は、実行された内容や問題の詳細に対処するのに最適な人物ではない場合があります。その場合、Apex 例外メール受信者にエラーメールを送信できます。

ということで、例外メールの受信者の設定を確認。

+ [Select Flow and Process Error Email Recipients](https://help.salesforce.com/s/articleView?id=sf.flow_troubleshoot_error_email.htm&type=5)

今回のエラーは承認プロセスみたいです。

:::note alert
Error Occurred: No applicable approval process was found.

Transaction Rolled Back

Because an error occurred, any records that the flow was ready to create, update, or delete weren’t committed to the database.
:::

以下をチェックするみたいです。

check the following reasons-

1. correct entry criteria
2. initial submitters
3. permissions

in my case, it was the initial submitters causing the problem
https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7vPzSAJ

I solved this by removing the Entry Criteria. It said that a criteria won't required, but it actually fails if one is present.

https://developer.salesforce.com/forums/?id=9060G000000Xa4jQAC

結果は

 it was issue with Initial Submitters.
【JSTQB FL】入社1年目の学習！「1.テストの基礎」の要点をまとめてみた

# はじめに

こんにちは！
入社1年目の私が、【JSTQB FL】（日本ソフトウェアテスト技術者資格基準）の勉強を通じて、
「**1.テストの基礎**」について重要だと思ったポイントを要約してお伝えしていきたいと思います！

# 目次
[1-1.テストとは何か?](https://qiita.com/itsuki_slj/private/e5fa14b3433b1ed49390#1-1%E3%83%86%E3%82%B9%E3%83%88%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B)
[1-2.テストの必要性](https://qiita.com/itsuki_slj/private/e5fa14b3433b1ed49390#1-2%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7)
[1-3.テストの７原則](https://qiita.com/itsuki_slj/private/e5fa14b3433b1ed49390#1-3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE7%E5%8E%9F%E5%89%87)


# 1-1.テストとは何か?
#### テストとは
テストとは、ソフトウェアの品質を評価し、運用環境でソフトウェアの**故障が発生するリスクを低減する1つの手段**のこと

ここでいう防ぎたいリスクとは？
・経済的な損失
・時間の浪費
・信頼の失墜
・傷害や死亡事故

#### テストに共通する目的
すべてのプロジェクトで、テストの目的は以下の通りとなっています。

・**作業成果物**の評価
　※「読みやすいか」「間違いはないか」をチェック

・お客様の**要求**を満たしていることの検証

・品質が**所定のレベル**にあることを確証

・欠陥や故障を発見し**低品質**になることを防ぐ

・ステークホルダー（利害関係者）へ品質レベルについての**情報を提供**

・テスト対象が法律上、契約上、規制上の要件や標準に遵守および、準拠しているかどうかを**検証**
　⇒法律を含めたさまざまなルールが守られているかどうかを検証

#### テストとデバッグ
テストとは、ソフトウェアの動作を確認し、想定外の動きや不具合を「**見つける**」作業
デバッグとは、テストで見つかったバグを特定し「**修正する**」作業

テストとデバッグの違いは、「**修正する**」**作業を含むか含まないか**が大きな違いになります。
また、その他の違いとしては担当者に違いがあります。
テストを行うのは主に**テスト担当者**、それに対してデバッグを行うのは主に**開発者**という違いがあります。

# 1-2.テストの必要性
#### テストはなぜ必要なのか
運用環境で問題が発生するリスクを低減させるためにテストを行います。

「1-1.テストとは何か?」より
>`テストとは、ソフトウェアの品質を評価し、運用環境でソフトウェアの故障が発生するリスクを低減する1つの手段`

また、コンポーネントやシステムの**品質向上**の効果や、契約や法律上の要件、および各業界の標準に**合致していることを証明**するためにテストが必要となります。

#### 品質保証とテスト

品質保証とテストは、関連性はありますが同じではありません。
さらに大きな範囲を表す品質マネジメントという概念が両者を結び付けています。

**品質マネジメント**とは、プロジェクト自体やプロジェクトで作る物の品質を管理するためのすべての活動のこと
**※品質保証と品質コントロールの両方を含む**

**品質保証**（**QA**）とは、品質が適切なレベルか確認し、安心や満足を保証するための活動のこと
品質保証は、**お客様視点**での活動になります。

**品質コントロール**とは、テスト活動を含め、適切なレベルの品質を達成するための活動のこと
こちらは、**作り手視点**での活動となります。


#### エラー、欠陥、故障
エラーとは、間違った結果を生み出す**人間の行為**のこと
エラーと同じ意味で「**誤り**」とも言われます。

エラーは以下のような様々な原因によって発生します。

・納期の**プレッシャー**
・人間の誤りを**犯しやすい性質**
・プロジェクト参加者の**経験不足**または**技術不足**
・プロジェクト参加者間の**誤ったコミュニケーション**
・コード、設計、アーキテクチャー、解決すべき根本的な問題、使用する技術の**複雑さ**
・システム内またはシステム間のインターフェースに関する**誤解**
・新しく**不慣れな技術**


欠陥とは、作業成果物に存在する、要件または使用を満たさない**不備・欠点**のこと
欠陥は**エラーによって引き起こされる事象**になります。
欠陥と同じ意味として「**バグ**」、「**フォールト**」などがあります。


故障とは、テストによりプログラムを動かしたときの、**不正なプログラムの実行結果**のこと
**※テストのミス実行による結果などは、故障とは別物になります。**
**欠陥があることによる不正な結果**が故障です。

# 1-3.テストの7原則
テストの7原則は以下の通りとなっています。

1.テストは欠陥があることは示せるが、欠陥がないことは示せない
→テストにより、ソフトウェアに残る未検出の欠陥数は減らせるが、欠陥が見つからないとしても、**正しさの証明とはならない**

2.全数テストは不可能
→すべてをテストすることは、ごく単純なソフトウェア以外では**非現実的**

3.早期テストで時間とコストを節約
→テスト設計を**作りこみの段階で実施**することによって、それぞれの工程とその成果物の質を見直し向上させることができる

4.欠陥の偏在
→リリース前のテストで見つかる欠陥や運用時の故障の大部分は、**特定の少数モジュール**に集中する

5.殺虫剤のパラドックスにご用心
→同じテストを何度も繰り返すと、最終的にはそのテストでは**新しい欠陥を見つけられなくなる**

6.テストは状況次第
→**状況が異なれば**、テストの方法も変わる

7.「バグゼロ」の落とし穴
→欠陥を修正したから、必ずしもソフトウェアの**品質を向上させるとは限らない**

# 終わり
今回は、【JSTQB FL】テストの基礎の「1-3.テストの7原則」までまとめてみました！
ここまで読んでいただきありがとうございました！
ぜひ参考にしてみてください！
【Rails】マイグレーション履歴を正しくしてみた

# はじめに
前任者が構築したRails周りを確認していたら、マイグレーション履歴がおかしいことを発見しました。

①マイグレーションファイルは存在しており、マイグレーションファイル内容もDBに反映されているが、マイグレーションファイルのステータスがdownになっている。
②マイグレーションテーブル（schema_migrations）に実行履歴がない。

何故この様な状態になったのか、どの様に運用していたのか、経緯は前任者がいなくなったので確認できませんでした。
とりあえず正しい状態にするためにやったことを備忘として残しておきます。

# 現状確認
１．マイグレーション履歴を確認
「Status」は全てdownになっていた。
以下はサンプルであり、実際の「Migration ID」や「Migration Name」から変えています。
```
$ rails db:migrate:status

database: DB名

 Status   Migration ID    Migration Name
--------------------------------------------------
 down     20200101010101  Create XXX
 down     20200202020202  Add column XXX
 down     20200303030303  Add column XXX
 down     20200404040404  Modify column XXX
  ・
  ・
  ・
```
２．マイグレーションファイルを確認
マイグレーションファイルは存在した。
```
$ cd db/migrate/
$ ls -l
-rw-r--r-- 1 root root  820 Apr 1 11:11 20200101010101_create_xxx.rb
-rw-r--r-- 1 root root  751 Apr 1 11:11 20200202020202_add_column_xxx.rb
-rw-r--r-- 1 root root  775 Apr 1 11:11 20200303030303_add_column_xxx.rb
-rw-r--r-- 1 root root  836 Apr 1 11:11 20200404040404_modify_column_xxx.rb
  ・
  ・
  ・
```
３．マイグレーション実行管理テーブルを確認
schema_migrationsテーブルにレコードがなかった。
```
mysql> SELECT * FROM schema_migrations;
Empty set (0.00 sec)
```


# 対応内容
マイグレーション履歴をupにするにはいくつか方法がありますが、schema_migrationsテーブルにレコードを追加してしまうのが一番手っ取り早いという結論に至りました。
この方法でよいかどうかは、システム運用次第であるので、ベストプラクティスではありません。
```
mysql> INSERT INTO schema_migrations (version) VALUES 
     ('20200101010101'),
     ('20200202020202'),
     ('20200303030303'),
     ('20200404040404'),
             ・
             ・
             ・
;
```

# 対応後確認
１．マイグレーション履歴を確認
「Status」は全てupに変わった。
```
$ rails db:migrate:status

database: DB名

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200101010101  Create XXX
   up     20200202020202  Add column XXX
   up     20200303030303  Add column XXX
   up     20200404040404  Modify column XXX
  ・
  ・
  ・
```
２．マイグレーションファイルを確認
マイグレーションファイルに影響はない。（対応前後で変化なし）
```
$ cd db/migrate/
$ cd ls -l
-rw-r--r-- 1 root root  820 Apr 1 11:11 20200101010101_create_xxx.rb
-rw-r--r-- 1 root root  751 Apr 1 11:11 20200202020202_add_column_xxx.rb
-rw-r--r-- 1 root root  775 Apr 1 11:11 20200303030303_add_column_xxx.rb
-rw-r--r-- 1 root root  836 Apr 1 11:11 20200404040404_modify_column_xxx.rb
  ・
  ・
  ・
```
３．マイグレーション実行管理テーブルを確認
schema_migrationsテーブルに実行履歴レコードが存在する。
```
mysql> SELECT * FROM schema_migrations;
+----------------+
| version        |
+----------------+
| 20200101010101 |
| 20200202020202 |
| 20200303030303 |
| 20200404040404 |
  ・
  ・
  ・
+----------------+
XXX rows in set (0.00 sec)
```

# おわりに
前任者から引き継ぎを受けると、何でこんな状態になっているの？ということが往々にしてあると思いますが、自分が引き継ぐときは出来るだけ後任者に迷惑が掛からないように引き継ぎたいものである。
「立つ鳥跡を濁さず」である。

以上
Xのロゴの公式ダウンロードページ

なんかSNSのヘッダーから右クリックでダウンロードしろみたいな記事を見かけましたが、公式サイトで配布してます。

https://about.x.com/en/who-we-are/brand-toolkit

2023年8月30日時点では、日本語版のページ（URLのパスの先頭が`/ja/`のページ）で配布されている素材はTwitterのままです。
英語版のページならXの素材をダウンロードできます。

以上。
【Salesforce】PageReference メソッド / getContent()は非同期では使えない？

# 問題

PageReference メソッド/getContent()

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_System_PageReference_getContent.htm

getContent()は非同期処理では使用不可？

@futureメソッドにてgetContent()メソッドを使用した場合、「 @future call currently not allowed 」エラーが表示。

# 解決策

「 @future call currently not allowed 」のエラーは、Visualforce ページのコンストラクタにおいて @future の非同期処理を開始しようとした際に発生するエラー。

- カスタムコントローラおよびコントローラ拡張の作成に関する考慮事項

https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_controller_considerations.htm

コントローラ、またはコントローラのコンストラクタでは、「getxxx」または「setxxx」メソッドに @future アノテーションを使用することはできません。

回避策
コンストラクタでの処理ではなく、apex:page の action 属性にて @future の処理を実行することが候補。

- apex:page | Visualforce 開発者ガイド

https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_page.htm

なお、getContent() をご利用いただく際には他にも留意事項あり。
getContent() のメソッドはコールアウトの処理。

- getContent() | Apex 開発者ガイド

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_System_PageReference_getContent.htm

API バージョン 34.0 以降では、getContent はコールアウトとして扱われます。

コールアウトには制限事項があり、insert 等の DML ステートメントの後には実行不可。

- コールアウトの制限事項 | Apex 開発者ガイド

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_callouts_timeouts.htm

同じトランザクション内に待機中の操作が存在する場合はコールアウトを実行できません。操作が待機中となるものには、DML ステートメント、非同期 Apex (future メソッドや Apex 一括処理ジョブなど)、スケジュール済み Apex、メールの送信があります。このような操作を行う前に、コールアウトを実行するようにします。
\graphicspathでエラーが出た

LaTeX2e 美文章作成入門 8版

を読んで試していて、つまづいたところ。

画像ファイルをLaTeXで読み込むとき\includegraphicsで読み込むけど、画像ファイルを.texではなくてディレクトリにまとめておいて、そこを\includegraphicsで読みに行くとき


プリアンブルに\graphicspath{}で画像がまとめてあるディレクトリを指定しておかないといけない。


書籍にはその例として

\graphicspath{{sub1}{sub2}}

と書いてあった。自分は画像をまとめている場所が1つなので、

\graphicspath{sub1}と書いて実行したが、エラーが出てしまう。


原因がわからず色々試していたが、画像をファイルに入れるのではなく、.texファイルと同じ場所に入れたらうまいこと動いた。


結局、sub1を挟むカッコが2つでないといけないことが原因だった。

本の例文では参照しに行くフォルダが2つだから、{{フォルダ1}{フォルダ2}}のように分けるためにカッコがついているのかと思ったが、一つだけでも２つのカッコで挟む必要があった。

エラーが
LaTeX Error: Cannot determine size of graphic in ⚪︎⚪︎ (no BoundingBox).
などと出ていたので、気づくのが難しかった。
ChatGPT課金してみたメモ2: Blue PrismでChatGPT APIを使ってみる #BluePrism #ChatGPT

# 課金ライフ快適です
ChatGPTに課金してから、技術Q&Aからお弁当レシピまで、某ちゃんねるのキャッチフレーズを彷彿とさせる勢いでお話し倒しています。
会話の履歴も残るので、あとからふと思い出してまえの会話の続きをしたりもします。
すごくつきあいのいい従僕……というような感じ。

遊んでみた感想や、うまく使うコツはまえの記事に書きました。
[課金したメモ1](https://qiita.com/Sumire_Neko/private/ce1a23e2938685f524e3)

# いろんなことを楽にうまく会話したい
会話をもっとうまくする工夫として
- プロンプトの文章の工夫
うまくできたプロンプトや、普段よく使うプロンプトは雛型にしておく
- 健忘対策
まえの会話を次のプロンプトに含めることで、会話の流れが矛盾したり発散したりしにくくする
- 仕事の分割
超長い文書の要約解説のときは、章ごとに分割して渡して、最後に章ごとの要約をまとめて渡して全体の要約をしてもらう
込み入ったことをしてもらうときには、手順を分割して、手順を1個ずつChatGPTに渡して順にやってもらう
- 他の道具を使う
他のツールやサービスでうまく出したものをChatGPTに渡す、もしくはその逆

みたいなことをしています。
で、こういうことを差配してくれる幹事のようなものがいたら便利です。
たとえばLangChainが最近有名ですが、UiPath、Blue Prismとかでもそんなようなことはできます。
というかRPAはそもそも「いろんなサービスやツールの橋渡し」が得意分野。
むしろRPAはGUIなので、LangChainよりとっつきやすいのでは。

私はBlue Prismをちょっと使うので、じゃあBlue Prismにやらせてみようかなと。

# Blue Prismに幹事になってもらう
## コツ
- ChatGPTには自然言語処理とか提案とかの創る系を担当してもらう
- 正確な作業は従来ツール（社内サービス、Google検索、Excelなど）が担当
- 幹事はデータを各サービスが処理しやすい形に直して渡してあげる

## 準備
ChatGPTのAPIの契約をして（ChatGPT Plusとは別契約になります）
APIKeyをもらって、エンドポイントとAPI KeyをBlue Prismに設定してVBOを……
というところは公式noteが記事にしてくれているのでそちらをご参照ください。
[ChatGPT Blue Prism Connectorを試してみた(BP社公式note)](https://note.com/blueprism/n/n568c9cb57608)




## Blue Prismを幹事にする例
### Q&A用のチャットボット
- 質問が飛んで来たら、社内サービスなり検索なりで関連の記載を探して、それをネタにしてChatGPTに回答とサジェストを作らせる
- やった会話のログはDBに蓄積して次回以降の会話のネタにする

という偽AmazonConnectみたいなものをBlue Prismで作れちゃいます。

### スケジュール管理
- ざっくりした予定を自然言語で投げる
- ChatGPTにスケジュールにしてもらう
- スケジュール管理（BacklogでもGoogleカレンダーでも）に登録

というプロセスをBlue Prismで作れば、秘書の役もやってくれます。

### 在庫管理
- 「この商品ってどう？」と人間がざっくり聞く
- 具体的なキーワード（商品名とか商品カテゴリとか）はChatGPTに抽出させる
- 在庫確認は従来システムがあるだろうからそれにやらせる
- 仕入条件と最近の在庫変動状況や売上状況をChatGPTに渡して、どのくらい発注したらいいかを判断させる
- 発注書を作らせる（ChatGPTにやらせてもいいし従来システムに指示してもいい）

コンビニの発注業務くらいだったらこれで充分いけるのでは。

# 終わりです
一昔前は「RPAは単純作業を繰り返しやるツール」的なイメージがありましたが、これからはこういう幹事業務でガンガン使っていけばいいのでは？

Blue PrismでAPIを叩くのがすごく楽。
API Keyもちゃんと安全に持っておいてくれるし設定もGUIでわかりやすい。
これもっとみんな使い倒していくべき……。
【Salesforce】レスポンスサイズが組織の制限 15 MB を超えました。を回避したい

# 問題

Apexの処理にてVisualforceをxls形式で出力。
「レスポンスサイズが組織の制限 15 MB を超えました。」と表示され処理が中断。
※xls形式のファイルに大量のレコード（行）を作成したため、ファイルの容量が15MBを超過した

①下記リンクの「Visualforce ページの最大応答サイズ 15 MB 未満」が妥当？

https://developer.salesforce.com/docs/atlas.ja-jp.206.0.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_vf.htm

②また「Visualforce ページの最大応答サイズ」とは？

③また①の制限は緩和することは可能？

# 解決策

①認識の通り。制限に抵触した際に発生するエラー。

②回答
Visualforce の仕組みとして、誰かがページにアクセスすると、そのページで要求されたデータ処理がサーバで実行され、その実行結果がレスポンスとしてブラウザに返されることで表示されます。
このレスポンスのサイズが大きいほどサーバにかかる負荷が大きくなってしまうため、規定のレスポンスサイズを超える場合はエラーを発生させることで負荷を回避する仕組みとなっております。
このように、負荷を回避するため予めプラットフォームにて設定されているレスポンスサイズの上限が「Visualforce ページの最大応答サイズ」でございます。
例として、Visualforce ページに大量のレコードや文字・画像データなどが含まれている場合にレスポンスサイズが大きくなり、上記エラーに抵触する可能性が高くなります。

③制限緩和は不可。
【Salesforce】Apex heap size too large: XXXXXXXXのエラーを回避したい

# 問題

Apexにてレコードを取得後、Visualforceの「xls」ファイルを出力していたが件名のように「Apex heap size too large: XXXXXXXXのエラー」と表示された。

こちらの回避方法はあるか？

# 解決策

Visualforce ページに表示されるレコードは Apex クラスによって取得された後にメモリに格納。

利用可能なメモリのサイズは下記ドキュメントに記載されている「ヒープの合計サイズ」が適用され、
今回のように同期処理の場合は 6MB。

ヒープの合計サイズ
同期 Apex の制限 : 6MB
非同期 Apex の制限 : 12MB

メモリ上に格納されるデータが多すぎる場合は今回のエラーが発生する。

一回で Visualforce ページに表示するレコードの件数を減らす。
または表示する項目や文字数を減らすのが回避策。

# 参考リンク

[【Apex ガバナ制限】](https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm)
MVVMのViewModel橋渡しの何が問題なのか？

ViewModelは橋渡しのみを行いロジックを入れないという考えの
問題点を検討してみる。


例）ボタン2度押し防止処理

Modelにボタンイネーブルプロパティを持ちModelが制御する。

問題点
　ボタンはUI固有のものなので、ModelがUI変更の影響を受ける。
　ボタンがないUIもありうる。

ボタン2度押し防止処理はボタンというUIがある事で成り立つ。
UIのための処理である。
UIの処理をModelが持つことはModelがUIに依存していることになる。
UIの変更にModelが影響を受けてしまう。