OmniAICreator/Qiita-1.07M huggingface dataset:
npsp__RD_RecurringDonations_BATCHでのエラー

[NPSP エラーに戻る](https://qiita.com/Keiji_otsubo/items/9765a3f1078b99d8223f)

# Message: "First error: [LIMIT_EXCEEDED] limit exceeded" Context: npsp__RD_RecurringDonations_BATCH

+ [Batch Apex Error npsp__RD_RecurringDonations_BATCH](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077mOje)

:::note
Could be a batch size issue, but is this with Customizable Rollups enabled? 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BtsJNSAZ
:::

# Message: "First error: Invalid field Raisely_Form__c for Opportunity"

+ [None of my recurring donations have populated!](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X6mok)

:::note
NPSP has a feature for mapping fields from Recurring Donations to Opportunities when they're created, and it sounds like your mapping is incorrect.

Go to NPSP Settings > Recurring Donations > Recurring Donation Custom Field Mappings - do you have a mapping listed there?
:::
Stakeholder Management in Nonprofit Cloud


[Stakeholder Management in Nonprofit Cloud](https://trailhead.salesforce.com/content/learn/modules/stakeholder-management-in-nonprofit-cloud?trailmix_creator_id=danas5&trailmix_slug=new-npc-trailhead-badges)

# Manage Households

+ [Missing Contact 'Role' field on new Party Relationship Group](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007W5kHv)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fd407c43-e221-00f8-4f1f-dc7b511e6443.png)

:::note
正しいフィールドは「Role」ではなく「Roles」ですが、これはバッジのタイプミスのようです。このバッジにその他の小さな変更をいくつか加えて今日修正し、明日リリースされる予定です。

[役割] フィールドは、パーティ関係グループ オブジェクトには表示されません。これは、個人取引先を世帯を表すビジネス取引先に接続する取引先担当者関係レコードを作成するために使用されます (添付のスクリーンショットを参照)。取引先担当者関係レコードの [役割] フィールドは、アクション可能リレーションシップ センター (ARC) やその他の表示で使用され、グループ内での個人の役割を表示できます。また、今日の小規模アップデートのバッジにこれを説明する行を追加します。
:::
Next.jsでページネーションを実装する

## はじめに
Next.jsでWebアプリを開発している中でページネーションの実装が必要になったので、まとめました。

## Next.jsでページネーションを実装
ページネーションのコンポーネントが受け取る変数は以下を指定します。
currentPage: 現在表示するページ番号
limit: 一件あたりに表示する件数
count: 全件数
path: ページネーションを呼び出すページパス

全件数から一件あたりに表示する件数を割って表示するトータルのページを算出します。ページネーションのページ番号は最大5つまで表示するようにしています。
ちなみに以下の例はデザインをあてていないので、よしなにCSSを適用する必要があります。前・次のリンクは現在表示しているページによって非活性にしているので、その部分はTailwind CSSを使ってます。

```js
import React from "react";

type Props = {
  currentPage: number;
  limit: number;
  count: number;
  path: string;
};

export default function Pagination({currentPage, limit, count, path}: Props) {
  const totalPages = Math.ceil(count / limit);
  let startPage = Math.max(1, currentPage - 2);
  let endPage = Math.min(totalPages, currentPage + 2);

  if (currentPage <= 3) {
    endPage = Math.min(5, totalPages);
  } else if (currentPage >= totalPages - 2) {
    startPage = totalPages - 4;
  }

  const pageNumbers = [];
  for (let i = startPage; i <= endPage; i++) {
    pageNumbers.push(i);
  }

  return (
    <div>
      <a href={`${path}?p=${currentPage - 1}`} aria-label="Previous Page">
        <button
          className={`${
            currentPage === 1 || count < limit ? "cursor-not-allowed" : ""
          }`}
          disabled={currentPage === 1}
        >
          ＜         
        </button>
      </a>
      {pageNumbers.map((number) => (
        <a key={number} href={`${path}?p=${number}`}>
          <button
            className={`${
              currentPage === number ? "bg-indigo-500 text-white" : ""
            }`}
          >
            {number}
          </button>
        </a>
      ))}
      <a href={`${path}?p=${currentPage + 1}`} aria-label="Next Page">
        <button
          className={`${
            currentPage === totalPages || count < limit ? "cursor-not-allowed" : ""
          }`}
          disabled={currentPage === totalPages}
        >
          ＞
        </button>
      </a>
    </div>
  );
};
```

ページネーションコンポーネントの呼び出しは、それぞれ必要なPropsを指定してあげます。
```js
<Pagination
  currentPage={currentPage}
  limit={limit}
  count={count}
  path="/articles"
/>
```

## おわりに
次はSSG用に/articles/page/2のような静的化できるページネーションを実装したいです。
エクセル設定メモ


```
------クイックツールバーの表示
メニューのファイルの上にあります
クイックツールバーに追加なら、ここに表示する、非常に便利です。
オブジェクト選択の場合、↑のマークです。
追加は
ファイル＞オプション＞クイックアクセスツールバー

------描画ツールの表示
複数画像を選択すると、自動的に一番真ん中上に表示します。
クリックと右の配置のところ、整列可能です。

------複数画像グループ化ショットカット
shift F10 G

------一行追加、削除ショットカット
cstr +  一行追加
cstr -  一行削除

------リボン表示切替ショットカット
リボン表示切替 cstr F1

------トリミングをクリックバーに追加
ファイル上の
クイックアクセスツールバー＞▼＞その他のコマンド＞
コマンドの選択＞図ツールタブ＞トリミング

------書式外四角ショットカット
shift cstr &
LWCのエラー画像から検索する



# refused to connect

+ [Has anyone seen this error when trying to run a merge action from a LWC Button?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LTp2f)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7995ea21-9a44-91ef-e226-1fb5fef29be7.png)

:::note
refer

https://knowledge-mc.aprika.com/s/article/How-to-fix-visualforce-component-error-refused-to-connect

https://support.leveleleven.com/s/article/Refused-to-Connect-Error
:::


# Demo lwc

+ [Unfortunately, there was a problem. Please try again. If the problem continues, get in touch with your administrator with the error ID shown here and any other related details.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UqI0m)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/92989040-ae65-a07f-f43c-7e78ce96b021.png)

:::note
Please check this article. 

https://salesforce.stackexchange.com/questions/357400/error-lwc-error-that-use-the-lwcdom-manual-adding-columns-to-datatabl
:::
724. Find Pivot Index -LeetCode　解答メモ

##  Find Pivot Index
### 問題文
整数 num の配列を指定して、この配列のピボット インデックスを計算します。

ピボット インデックスは、インデックスの厳密に左側にあるすべての数値の合計が、インデックスの厳密に右側にあるすべての数値の合計と等しいインデックスです。

インデックスが配列の左端にある場合、左側には要素がないため、左側の合計は 0 になります。これは配列の右端にも当てはまります。

一番左のピボットインデックスを返します。そのようなインデックスが存在しない場合は、-1 を返します。

### コード
```java
class Solution {
    public int pivotIndex(int[] nums) {
        //①
        int leftSum =0, rightSum=0;
        for (int n : nums){
            rightSum += n;
        }
        //②
        int i=-1;
        //③
        for (int n : nums){
            i++;
            rightSum-=nums[i];
            if(leftSum==rightSum) return i;
            leftSum+=nums[i];
        }
        return-1;
    }
}
```
### 解答手順
①配列の左端から右端まで足した合計値を求める。
この①で得た合計値は、右側の合計値を求める際に使用する。
②配列の場所を指定するための変数を用意する。-1を設定する理由は、配列の0番目から要素を指定できるようにするため。
③左側の合計値と右側の合計値を求める
まず、①で求めた合計値から配列のi番目を引く。ここで得られた値は、右側の合計値になる。
rightSumがleftSumより1回多く計算された合計値が、leftSumの合計値と一致するため、leftSumの前で条件分岐を設定する。
その後、leftSumにi番目の要素を足した数を設定する。
一致しない場合は-1で返す。
Caseオブジェクトとナレッジ



+ [Lightning Knowledge Case Suggestions](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000FYUQE)

件名を入力すると、ナレッジ記事が提案されます。説明フィールドに入力しても、そうではありません。この記事は、説明が常に検索されることを意味します。

https://trailblazer.salesforce.com/issues_view?id=a1p3A000000eax6QAA

https://trailhead.salesforce.com/content/learn/modules/knowledge_search_basics/knowledge_search_basics_setup

https://help.salesforce.com/s/articleView?id=sf.knowledge_custom_field_types.htm&type=5

+ [「記事を電子メールに挿入」オプションがユーザーに表示されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A98CC)

管理者以外のユーザーは、ケースフィードからメールを送信するときにナレッジコンポーネントから「メールに記事を挿入」オプションが表示されません
 

https://help.salesforce.com/articleView?id=000322779&type=1&mode=1 

+ [ケースへのknowledgeの添付について](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEIAvSAP)

:::note
ケースへのナレッジ記事の添付というのは、「CaseArticleというケースとナレッジ間の連結オブジェクトのレコードを作成する」ということによって記録されているようです。

ケースからナレッジを作成しているのであれば、ナレッジを作成しようとしているケースIDと作成したナレッジIDが取れるはずなので、これらの情報を使ってCaseArticleの作成を行えばフローで実装可能かと思われます。
:::

+ [既存の記事を更新して公開すると、古いケースの提案記事として表示されません](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HC1g5)


# この機能し自体がよく分からない

+ [Case Page Layout - Feed View - Enable attaching Articles inline](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clrvQ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6a262b5b-a40b-ebe0-a473-0229e348bbdc.png)
Rails の `render`の注意【Turbo】

# はじめに
「何をすればいいのか」はわかるけど、「なぜなのか」まではわかりませんでした・・・悔しい。

# 問題
ログイン処理のコードです。
```rb
class UserSessionsController < ApplicationController
  def new; end

  def create
    @user = login(params[:email], params[:password])
    if @user
      redirect_back_or_to(root_path, notice: I18n.t('flash.user_sessions.new'))
    else
      flash.now[:alert] = I18n.t('flash.user_sessions.new_failed')
      render :new, status: :unprocessable_entity
    end
  end

  def destroy
    logout
    redirect_to(root_path, notice: I18n.t('flash.user_sessions.logged_out'))
  end
end
```

問題は以下の部分
```rb
flash.now[:alert] = I18n.t('flash.user_sessions.new_failed')
render :new, status: :unprocessable_entity
```
`status: :unprocessable_entity`というのは、HTTPステータスコード422のことなのですが、
これを消すと
```rb
flash.now[:alert] = I18n.t('flash.user_sessions.new_failed')
render :new
```
flashの表示・ページのレンダーがされない、という問題が起きました。

`render`はデフォルトで200 OKを返します。
つまり、「200 OK だとページがレンダされない」「422だとされる」ということです。なぜ？
# 解決方法

[Turbo](https://railsguides.jp/working_with_javascript_in_rails.html#turbo-streams)の仕業でした。
> Turboでは、renderで適切なステータスコードを選択しなかった場合、ページの再描画が行われない

だそうです。

**renderなら422を指定しろ、それかredirectを使え**

# 終わりに
めちゃくちゃ手こずりました。GPTも「ステータスコードは関係ないです」の一点張りだったし。
結局なんでかわからなかった。
なんでなんだろう・・・悔しい・・・
Unable to map response for output parameter 2XX of invocable action



+ [【未解決】Unable to map response for output parameter - HTTP callout error.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIU3O)

```json
"tablename": {
"incident": "sample string"
}.
```

If the result response has some value then its working fine. incase if the response is like

```Json
"tablename": {
"incident": ""
}
```


# 類似のエラーメッセージ

+ [Flow error using External Services でのエラー](https://qiita.com/Keiji_otsubo/items/89160a699c0bdecee429)
+ [POST record, get new record GUID, insert into SF record that triggered flow.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007QcapWSAR)

:::note
Salesforce サポートがそれを解決するのに役立ちました。整数フィールドに戻り値があり、Salesforce には文字数が多すぎました。この問題を回避するには、コールアウト マッピングのフィールド タイプを整数から倍精度に変更する必要がありました。

Salesforce Support helped me figure it out. There was a returned value in integer fields that were too many characters for salesforce. I needed to workaround the issue by changing field types in the callout mapping from integer to double.
:::
(サーボ)(夜の)「理系フリマ」でGET(ゲットだぜ!!(2月4日))した。SG90で遊ぶ。(STM32C011J4M6)


「理系フリマ」でゲット!!

![o_cop926.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a4ce3f5f-5def-6bac-d7b5-ebff4fa4bd0e.jpeg)


x 電子工作社殿の画像を資料の為に引用いたします。

![o_cop927.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/37a42017-ab35-7015-740e-5de2a5b373ae.jpeg)


x 逆起電圧がわかる人、限定　数百ボルトが発生します。
x 起動電流がわかる人、限定　起動電流は、論理値無限代です。
x 安全対策を適切にしないと一発でパソコンを壊します。
x 動かす時は、最低でもモバイルバッテリに繋いで動かしてね!!
x サーボの電源は、共通アースすで別電源の単三電池3本定格4.5Vがおすすめ5,6アンペア流せるのでモーターが起動できます。
x SG90には、1チップの専用アナログ、アプリケーションICが使われているらしい。よって、適当なアナログ機器です。

目的
SG90でセッターだしをする。
買ってきたサーボは、オイルが固いので
手で十分ほぐすこと。
上下に優しく「ぐりぐり」する事
2、3分、ゆっくり丁寧に続けてください。
ちゃんと、「ほぐさないと」ショートして
故障の原因になります。
サーボがおこります「ぷんぷん」


参考




https://qiita.com/caa45040/items/4b1f24d24dafd74070d2


https://qiita.com/caa45040/items/17e50864f1052d00bedd



結果


![o_cop928.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0bacc47f-20a8-3636-209f-524307d14ac9.jpeg)



プログラム


```c++



//PWM_servo_test22_C011_1


//インクルド
#include <Arduino.h>


//定義
//1000の割り算 だいたい正しい。
#define DIV1000(n) ((n+((n*25)>>10))>>10)

//data SG90
// 2400us 2.4ms
#define s_max  2400
// 500us 0.5ms
#define s_min  500
#define s_r    (2400-500)
#define s_c    (65536/20000)*1000

//#define SN(n6)  (n6*((65536/20000)*1000))
//↓式変形と要約↓6万を2万で割ると3ぐらい、3を1000倍するとだいたい3000
#define SN(n6)    (n6*3277)

#define DD PA8    // potentiometer connected to analog pin x


//初期化
void setup() {

  pinMode(DD, OUTPUT);   // sets the LED pin as output
  analogWriteFrequency(50);   //周波数
  analogWriteResolution(16);  //分解能

}//setup


//メインループ
void loop() {

  int ii; //ループカウンター

  //for (ii = 500; ii < 2400; ii=ii+100) {

  ii = 1450;
  analogWrite(DD, DIV1000(SN(ii))  );   // analogRead values go from 0
  // to 4095, pwmWrite values
  // from 0 to 65535, so scale rough
  delay(1000); //1000mS

  //}//for

}//loop



```
imap-login: Error: Failed to initialize SSL server context

# imap-login: Error: Failed to initialize SSL server context

/var/log/maillogに以下のようなログが記録されていました。
```
Feb  4 00:01:03 sub0000529529 dovecot[2533359]: imap-login: Error: Failed to initialize SSL server context: Can't load DH parameters (ssl_dh setting): error:1408518A:SSLroutines:ssl3_ctx_ctrl:dh key too small: user=<>, rip=***.***.***.***, lip=***.***.***.***, session=<LApYf3sQVOCnXpIz>
```
意図しないログ出力でしたので対処いたしました。

## 環境
AlmaLinux release 8.9

## 対処
使用していないdovecotサービスが起動されていたので、サービスを停止しました。
```
# systemctl stop dovecot.service
# systemctl disable dovecot.service
```
dovecotサービスは使用しないので停止しているつもりでしたが、起動していました。

## 詳細
下記ログからIMAPが動いていると思われました。
```
Feb  4 00:01:03 sub0000529529 dovecot[2533359]: imap-login: Error: Failed to initialize SSL server context: Can't load DH parameters (ssl_dh setting): error:1408518A:SSLroutines:ssl3_ctx_ctrl:dh key too small: user=<>, rip=***.***.***.***, lip=***.***.***.***, session=<LApYf3sQVOCnXpIz>
```
IMAPを動かしているつもりはなかったので、IMAPが待ち受けているポートを確認しました。
```
$ netstat -nap | grep LISTEN
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
(中略)    
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      -      
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      -      
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      -              
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      -              
(以下略)
```
メールサーバーで使用されるポートが開いています。

```systemctl list-units --type=service```で起動しているメールサーバーのサービス名を調べようとしましたが
名前に見当がつきませんでした。※自分はメールサーバーを運用した経験がありません。
netstatコマンドを使用し993番ポートで待ち受けているサービスを確認します。

```
$ sudo netstat -tulnp | grep :993
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      2533355/dovecot 
tcp6       0      0 :::993                  :::*                    LISTEN      2533355/dovecot 
```
dovecotというサービスだと分かりましたので、dovecotを停止します。
```
# systemctl stop dovecot.service
# systemctl disable dovecot.service
```
## なぜdovecotを停止していなかったのか？の推測
サーバー構築時にdovecotをdisableにしていなかったと思われます。
dovecotという名前がまさかメールサーバーだとは思わなかったのでしょう。
おそらくサーバー動作に必要なサービスだと思って停止しなかったのだと思います。
次にサーバーを構築する場合はサービスを確認するようにせねばならないと思いましたが、```systemctl list-units --type=service```の出力が多いので、大変…
```netstat -tulnp```で余計なポートが開いていないかを確認するのでもいいかな…と思いました。

## 疑問
このサーバーは必要なポートしか開放していません。
しかし、dovecotに接続できてしまっていました。
dovecotを再度起動し、外部からポート993に接続できないことを確認しました。
```
$ nmap -sT -p993 ***.***.***.***
(中略)
PORT    STATE    SERVICE
993/tcp filtered imaps
```

結局、なぜ外部からIMAPに接続できたのか分かりませんでした。
ChatGPT4に尋ねたのですがやはり見当がつきませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455288/58733aed-262e-129a-e165-4e82519bda83.png)

たとえサービスを誤って起動していてもnftableで必要なポートしか開放していないのでOK、と思っていたのですが、その前提が崩れて、他になんの設定が誤っているのだ…と悩んでいます。
ログからシステムの変更状況を簡単把握！

稼働しているシステムで問題が発生した時、確認する項目の1つとして「前後に何か変更を行なっていないか」を確認すると思います。
様々なメトリクスを確認すると思いますが、「ログ」も確認するものの1つだと思います。
ログを見た時にいつどのタイミングで変更があったのか、その前後の状況はどうなのか、一目でわかったら嬉しいですよね？

なんとNew Relic の新規機能でそれが実現できるようになりました！！
実現するための手順をご紹介したいと思います

:::note info
このアップデートの詳細はこちら。
[New Relic アップデート(2023年10月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202310)
[New Relic アップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート")
:::

## 設定方法
機能としてはChange TrackingがLogにも反映されるように機能拡張された形になります。
Change Trackingについてや設定方法に関しては[こちら](https://qiita.com/khara-nrkk/items/7eb11759bf0e17a11bdc)をご参照ください。

[GitHub Actions](https://docs.newrelic.com/jp/docs/change-tracking/ci-cd/change-tracking-github-actions/)や[Jenkins](https://docs.newrelic.com/jp/docs/change-tracking/ci-cd/change-tracking-jenkins/)と連携し、簡単にDeployフローに組み込むことも可能です。

New RelicのUI上からChange Trackingを追加する方法も提供されていますので、手軽に始めることが可能です。

![スクリーンショット 2024-02-04 19.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/dee380ba-f473-f78f-54e6-e24af20d7e4c.png)

## できること
Change Trackingを連携しているシステムのLogにマーカーが出るようになったので、前後のログを比較してみることが可能です。

![スクリーンショット 2024-02-04 18.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/d01faa14-bf60-9611-6273-52fa865bda43.png)

マーカーをクリックするとDeployの詳細比較画面に遷移することが可能なので、エラー状況や各メトリクスの変化の比較もしやすくなっています。

![スクリーンショット 2024-02-04 18.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/a0d9d456-34c6-3baf-1b95-9dbdb7f95dc2.png)

連携しているシステムのログにも「Related Changes」としてマーカーが表示されるので、連携システム側のログからも確認することが可能です。

![changetracking-log03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/40578687-88b9-08e0-097d-6137d87a4f17.png)

NRQLで作成したチャートにも追加されるので、運用に合わせたログ分析の幅も広がります。

![スクリーンショット 2024-02-04 19.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313446/92eab169-1495-7a24-ae56-63da694b2f23.png)



## まとめ
ログは、構成するシステムに何が起こっているかを確認するための貴重な情報源となります。
New Relicでは、すでに収集されているパフォーマンスデータだけでなく、デプロイメント、アラート、および追跡しているその他の運用イベントと合わせてログを確認できるようになります。

一目でログを運用イベントと関連付けて詳細を提供できるため、問題のある展開のトラブルシューティングを行ったり、インシデントの原因を迅速に解明することを可能にできる機能ですので、是非ご活用ください！



:::note info
このアップデートの詳細はこちら。[New Relic アップデート(2023年10月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-2023１０)
:::
:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
you don't have permission to take that action on this record or related records. For help, contact your Salesforce admin


+ [【未解決】Error when updating owner of the record](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X8tGq)

+ [取引先へのフルアクセス権を持っているユーザーが顧客またはパートナーの取引先の所有権を譲渡しようとすると、権限エラーが発生する](https://help.salesforce.com/s/articleView?id=000392654&type=1)

これは、実行中のユーザーがプロファイルまたは権限セットレベルで「ロールの管理」権限を持っていないことを示します。アカウントには、ロールを持つアクティブな外部ユーザーが接続されているため、親ロールの変更を考慮して外部ロールを変更する必要があります。これを行うには、所有権の変更を開始するユーザーがロールを管理できる必要があります。

この問題を解決するには、プロファイルレベルでユーザーに権限を割り当てるか、権限セットを使用してアクセス権を付与します。それが不可能な場合、所有権の変更は、すでに「ロールの管理」権限を有効にしているユーザーによって実行される必要があります。  

アカウントの現在の所有者と新しい所有者が同じロールを共有している場合、エラーは発生せず、所有者の変更は成功します。
PHPのシングルクオーテーション(')とダブルクオーテーション(")の違い

# 初めに
PHPでは、文字列を表すためにシングルクオーテーション（'）とダブルクオーテーション（"）の両方が使用できますが、これらの間にはいくつかの重要な違いが存在します。
これらの違いを理解し、適切な場面で使い分けることが、より効率的で読みやすいコードを書く鍵となります。

# 文字列の解釈

1\.シングルクオーテーション
文字列がそのままの形で解釈されます。変数は展開されず、エスケープシーケンス（例えば\nや\t）も解釈されません。ただし、シングルクオート自体をエスケープするための\'とバックスラッシュ\\は例外です。

```php
$name = 'World';
echo 'Hello, $name!'; // 出力: Hello, $name!
```

2.ダブルクオーテーション
文字列内の変数はその値に置き換えられ、エスケープシーケンスも解釈されます。これにより、変数の値を文字列内に直接挿入することが可能になります。

```php
$name = "World";
echo "Hello, $name!"; // 出力: Hello, World!
```

# パフォーマンス

+ **シングルクオーテーション**は、PHPによって文字列がそのまま解釈されるため、ダブルクオーテーションを使用する場合に比べて若干高速です。この違いは非常に小さいため、大規模なアプリケーションではほとんど影響がありませんが、文字列処理が多用されるスクリプトでは考慮する価値があります。
+ **ダブルクオーテーション**の場合、PHPは変数の解釈やエスケープシーケンスの処理を行う必要があるため、処理にわずかに時間がかかります。

# 使い分けのヒント
静的な文字列や変数展開が不要な場合はシングルクオーテーションを使用します。
変数を文字列内に埋め込む必要がある場合やエスケープシーケンスを使用する場合はダブルクオーテーションを使用します。


# まとめ
シングルクオーテーションとダブルクオーテーションは、PHPにおいて異なる目的で使用されます。シングルクオーテーションは、シンプルな文字列やパフォーマンスが重視される場面での使用が推奨されます。一方、ダブルクオーテーションは、変数の展開や特殊文字の扱いが必要な場合に便利です。適切な使い分けにより、PHPコードの読みやすさとパフォーマンスを最適化することができます。
令和の名著「世界一流のエンジニアの思考法」を読んだ！！！！！

こんにちは、アーキテクトのやまぱんです。
今回は読書感想文を書きたいと思います。

いつまこう言う読書メモは個人のブログに書いているんですが、本の性質上こっちでも書いた方がいいかなと思いましたのでこちらで記す。

感想文と言っても思ったことを箇条書きなメモにしてみます。
ただこれを書くということは他の人にも読んでほしいなと言う思いがあります。
結構モチベーションあがると思うし、**SWE(ソフトウェアエンジニア) でなくても、IT関連の仕事をしてる人以外でも気づきが得られる**と思います。

ビジネス書(および周辺ジャンルの本)も結構すきで就活生時代から以前よく読んでて、その中でもお気に入りの**マイフェイバリット ビジネス書**があるんですが、今回マイフェイバリット ビジネス書にこの一冊が加わりました。
> マイフェイバリット ビジネス書
(amazonリンク)
> + [ロジカルシンキング](https://amzn.to/3SILjTG)
> + [イシューから始めよ](https://amzn.to/49mYVcM)
> + [仮説思考](https://amzn.to/49mZCCY)
> + [転職の思考法](https://amzn.to/3HKFIpp)
> + [転職と副業の掛け算](https://amzn.to/3Ou1VvT)
> + [僕は君たちに武器を配りたい](https://amzn.to/3SIeZAi)
> + **[世界一流のエンジニアの思考法](https://amzn.to/42szfZZ)　<font color="red">New！</font>**

[![](https://yamapan.tokyo/wp-content/uploads/2024/02/51sz6zk7yWL._SY445_SX342_.jpg)](https://amzn.to/42szfZZ)

## 著者の紹介
米 Microsoft で Azure (Azure Functions) の開発エンジニアをしてる牛尾さんが書いた本です。
日本 Microsoftに何とかしがみついている 私からすれば Azure のSWE(ソフトウェアエンジニア)なんて<font color="red">超スーパー IT エリート！！神！！</font>っていうイメージです。

+ Qiita

https://qiita.com/TsuyoshiUshio@github

+ note

https://note.com/simplearchitect/

+ Twitter
 
https://twitter.com/sandayuu/

## 特に印象深かった章
+ 1 ：世界一流のエンジニアは何が違うのだろう
+ 2 ：アメリカで見つけたマインドセット
+ 4 ：コミュニケーションの極意
+ 5 ：生産性を高めるチームビルディング

## 印象深かったこと (箇条書
ここではざっくりメモしていきます。
+ 超エリートでも基本を大事にして、日々自己研鑽をしてる、なんならちゃんと反復学習している
+ 超エリート集団でもわからないことはわからない
わからないことはわかってる人に聞く、たとえどんな基本的な事でも聞く。
そして聞かれた側は 快く教える。
+ 意見が異なることを受け入れる
+ フィードバックの大切さ
製品に対するフィードバックでも、個人の仕事に対するフィードバックでもとても大切、積極にフィーバックをして、またフィードバックを求めていきたい
+ 一番はあくまでもプライベート
+ やみくもに手を動かすのではなくて仮説を立てる
これは”[仮説思考](https://amzn.to/49mZCCY)”とも共通した考え方がある
+ 少ない時間で成果を出す具体的なマインド（割く時間を固定するとか）
+ 米国でテック企業の SWE として働く方法
 コラム的に書かれていた
+ 人に伝えることを意識してメモを取る
+ 相手を否定しない、失敗をとがめないマインド・カルチャー
それが MS、アメリカ ビッグテックの強さ
+ リモートワーク Quick Call をよく使う
これは自分もよく実践している。話した方が早いし前提認識のずれなどを防げる
+ プレゼンにおいて情報量をへらす
これはしばしば目にすることではあるが、本当に伝えたい要点に絞ってスライドをつくることが重要
+ 日本の責任追及文化への批判
+ コロナアプリ cocoa で見る批判文化への風刺
そもそもシステムにバグはつきもの、フィードバックしてよくしていくカルチャーが必要。

+ 納期を守らない(厳守しない)
むしろその時点で出来てる機能でもってリリースする、つまり最初から完璧を求めない。
最低限必要な機能でまずはリリースしてニーズに応じてエンハンスする。
+ 仕事を楽しもう
+ 仕事を楽しまないとパフォーマンスはでない
+ サーバントリーダーシップとコマンドアンドコントロール
これは**すべてのマネージャー・中間管理職に読んでほしい。**
サーバントリーダーシップのマネージャーは基本的にメンバーを信頼して任せる、仕事をやりやすいように、楽しめるように尽くす。
+ チームメンバー間の上下関係をなくす、助け合いのマインド
+ 情報をシェアすることの大切さ
+ ナッツを食べよう
私もナッツが好き、特にカシューナッツとくるみ。
+ AI 時代を生き残ろう


## どんな人に読んでほしいか
学生から社会人すべて！！

## その他
一通り読んだ中で誤字がほとんどなかった！すごい！（小並感
ググるって書かれてるところがあったけど、私はBingでググってます(ビンぐる)ともいう。
カルチャー的なところでは日本の会社でもこういう会社が増えて、特に大手企業に波及して欲しいなとおもいました。（一部の会社ではそういうところもあるように聞きますが、まだまだ少ないと思います)
HTMLで覚えてほしい事

今はスマホでHP観る事が殆どなので、殆どのページがフレームワークやライブラリーを使って作成されています
基本的なHTMLとCSSの仕組みを覚えた上でライブラリーの動作を理解して欲しいので出来る限り簡単に説明します

HTMLとCSSだけで作ったページがどんな物かというとこういうページです
[阿部寛のホームページ](http://abehiroshi.la.coocan.jp/)
`<h1>`はタイトル`<p>`は段落という文章の意味をタグを使って表すのがHTMLです

タイトルの文字は大きすぎるしテーブルは２重線という今はあまり見ないデザインですが、何も装飾しなければこのような表示です

タイトルの文字をもう少し小さくしたいとか表示を変えたい場合にはCSSを使います
90年代のHPでは
`<h1 style="font-size:12px">タイトル</h1>`
のようにタグの中に直接CSSを記載していましたが、現在は
`<h1 id="top" class="title">タイトル</h1>`
の様にidかclassを付けてCSS側で
`#top:{font-size:12px;}`
`.title:{font-size:12px;}`
の様に指定します
何故今は使わない方も説明したかというと、ライブラリー等でjsで追加された内容はstyleタグに追加される事が多いので、直接書く事は無くても要素を調べた場合には頻繁に目にします
上記でidにtopという名前を指定しましたが、ページ内で同じid名を別のタグに付ける事は出来ません
逆にtitleという名前のclassは幾つ作っても良いので12pxの文字を何ヶ所も同時に指定出来るし、全部13pxにしたい時も１箇所変えれば良いので簡単です
極端な話CSSの指定については殆どclassで良いです
ただCSSについては優先順位が有って
`#top:{font-size:12px;}`
`.title:{font-size:13px;}`
と記載した場合はidの方が優先されて12pxで表示されます
タグ内のstyle要素に記載されている場合はCSS記載より優先されるので
style記載>id要素>class要素
となります
簡潔に説明しましたが、慣れてからで良いので優先度についてはこちらで確認してください
[mdn詳細度](https://developer.mozilla.org/ja/docs/Web/CSS/Specificity)

プログラムを組むにあたってHTML,CSS,JSに関しては他のサイトで簡単に説明していても情報が古い又は間違っている場合が有るので必ずmdnで確認してください
表現は専門的で分かりにくいかもしれませんが、現段階ではmdnに添った記述を心がけて貰いたいです
どこかの解説ページに記載されていたとしても[marquee](https://developer.mozilla.org/ja/docs/Web/HTML/Element/marquee)の様にmdnで非推奨と記載されているタグは使用してはいけません
Mozilla Developer Networkなので一般的にモジラと呼ばれています
「箇条書き」をやめてみる

ドキュメントを書くときの工夫として「箇条書き」があります。

整理されている感じがあり、書き手・読み手のどちらにもメリットがありそうです。

しかし箇条書きを乱用すると、うまく情報が伝わないケースも出てきます。

もし「箇条書きにはしてるんだけど、"わかりづらい"と言われたことがある」という方がいれば、ぜひ読んでみてください。

## 「プロセス」としての箇条書きは「成果」ではない

書き手にとって、箇条書きは普通に文章を書くよりもスラスラ書けるはずです。

これは箇条書きが「思いついたことをどんどん書けるフォーマット」であり、言い換えれば「**明確な論理構造を持たなくてよいフォーマット**」だからです。

ゆえに、

* Qiitaで箇条書きに関する記事を書くぞ
  * どんな内容にしようか？
    * まず箇条書きのデメリットを挙げてみるか
      * 思いついたことは書けるけど論理はないかも
        * 「論理構造」ってどう説明すればいいんだろう。ちゃんと調べたりする？
          * まあ省いてもいいか!  

と、無限につなげることが可能です。「関連性」を表現するにはとても良いフォーマットです。

しかしこの関連の集積は「成果」とは呼べません。これはあくまで「プロセス」だと考えるのが良い、というのが持論です。

逆に言えば、プロセスとしての箇条書きはとても効果的です。いきなり本文を書く前にまず書きたいことをなんとなく出してみる。というステップを挟む人は多いはずです。[^1]

## 人は「箇条書き」では論理を理解できない

ChatGPT向けに指示をするのであれば、箇条書きでもよいかもしれません。

しかし他人になにかしらの情報共有や提案、相談をする場合、箇条書きでは伝わらないケースがあります。

それは箇条書きが個別の情報を提示しているだけで、**読み手がそれらの情報を「ひとつなぎ」にして理解できない**ときに起こります。

言い換えれば「**人は順を追って、（ある程度）論理的に説明されないと理解しづらい**」と表現できるでしょうか。

## 情報を伝えるためには「ひとつなぎの文章」を書く

つまり（箇条書きを書いたうえで）最終的には「ひとつなぎの文章」に整形するのがよい、というのが本記事の主張です。

ためしに箇条書きされた内容をまとまった文章として表現してみようとすると、結構つまづくことがわかります。

たとえば「この情報は要る？」とか「先にこっちの話をしておいたほうがいいな」とか「これは重要だから、最後に繰り返そう」とか、そういったことを考えるはずです。この工夫が情報をつなぎます。

アラカルトをまとめて相手にぶつけるのではなくコース料理を出すような気持ちで、どの順番で情報を咀嚼してもらうか。読み終わったあとにどのような理解をしてほしいか。

この編集作業はとても大変ですが、読み手側にとっては格段に理解しやすい情報になるはずです。

## 「ひとつなぎの文章」には接続詞が出てくる

上述の編集作業をしていると、次のような「接続詞」がかならず出てきます。

- 〜を行った。**しかし**...というエラーが見つかり、その調査を続けている
- A,Bのタスクが完了した。**よって**、Cのタスクを開始できる状態になった

こういう文章が書けていれば、かなり良い感じです。箇条書きでは暗黙的にしか示されていなかった論理的な構造が見えるからです。

## 箇条書きを使うべき箇所

ここまで、箇条書きを回避する主張を行ってきましたが、最後に使うべき箇所も明示しようと思います。

もっとも良いのは、リストアップのような「同じテーマのもの」を並べる場合でしょう。

買い物リストなどはその典型です。あるタスクを完了するまでのステップや、ある機能でできることの一覧なども該当するはずです。

## さいごに

全部読んでいただいたうえで、この記事の主張を言い直してみると、

「**同じテーマでないものが箇条書きされている場合、それはプロセスつまりメモだから、誰かに読んでほしいなら文章に編集しなおすとよい**」

ということになります。

箇条書きだろうかそうでなかろうが「文章」であることには変わりありません。そのため箇条書きをした時点で満足して、あとは読み手に任せる。まあ一般的なことだとも思います。

しかしもし読み手にきちんと情報を与えたかったり説得したかったりする場合は、一度「ひとつなぎの文章」をつくってみることをオススメします。

## 参照

- [箇条書きの特徴「利点・欠点」 | 有限会社テオリア　思考と行動を図解で可視化する](https://zukai.info/2020/03/16/%E7%AE%87%E6%9D%A1%E6%9B%B8%E3%81%8D%E3%81%AE%E7%89%B9%E5%BE%B4%E3%80%8C%E5%88%A9%E7%82%B9%E3%83%BB%E6%AC%A0%E7%82%B9%E3%80%8D/)

[^1]: この記事もそうです。

[^2]: 日報のようなアウトプットは、それが「明日の自分のため」なのか「上のレイヤーのため」なのかによっても変わってきます。後者であれば、やはり箇条書きではなく「ひとつなぎの文章」のほうが理解はされやすいだろう、というのが私の考えです。
ソフトウェアテスト技法　同値テストと境界値テスト編

# 同値テスト
同値とはテスト的に同じ意味になること。以下の例をご覧ください。
```
if (a == 1) {}
elif (a == 10) {}
else {}
```
こちらの例では``a=3``と``a=5``はどちらもelseの中で処理されるため、テストの観点から見ると同じになるので、同値クラスという。同じ意味になるため、同値クラスに付き一つのテストケースを用意したら良い。

# 境界値テスト
境界値テストとは、同値クラスの境界と、その前後を調べるテストのことを言います。
境界値にはバグが潜みやすく、それを見逃さないためにも境界値周辺を入念に調べる必要があります。

# 最後に
テストを行う上で重要なのは**欠陥の検出は一つずつ**行うことです。以下の例を見てみましょう。

```
if test >= 9 {正しい処理}
if test > 9 {間違っている処理}
```
下の条件の場合、``test=9``の処理を行うとif文の条件が間違っていることには気が付きますが、if文のブロック内の処理が間違っていることには気が付きません。このように**欠陥は別の欠陥を隠してしまう恐れがある**ため、欠陥の検出は一つずつ行う必要があります。
[AWS]CodeBuild エージェント&dindを利用した場合のVolumeの扱い

# 目的
AWSを利用した開発をする場合、localstackの利用するケースが多いと思います。
UnitTestもそのままlocalstackを利用できれば、より本番環境に近いテストができます。
ということで、やりたかったことは以下のようなもの。

![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2210604/ce9b5181-402b-3730-fd2c-2bc74d90273b.png)

そして、実際の業務の開発では、実環境で動作する前にローカルで確認したいことも多いとおもいます。
この構成をローカルで実行する場合は、一癖あるから注意してね、というのが本記事の趣旨とします。

# 前提
AWS CodeBuildをローカルで実行する環境は公式から公開されており、この手順でローカル実行を行っています。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/use-codebuild-agent.html

# 実環境との差異
以下のようなdocker-compose.ymlを使ったとします。
```docker-compose.yml
version: '3.8'
services:
  app:
    container_name: unittest
    build:
      context: .
      dockerfile: Dockerfile
    working_dir: /workspace
    volumes:
      - ./:/workspace
    depends_on:
      - "aws"    
    network_mode: service:aws
    command: >
      sh -c "
      cd /workspace/local-template &&
      sh deploy.sh &&
      cd /workspace &&
      chmod +x gradlew &&
      ./gradlew test      
      "

  aws:
    container_name: localstack
    image: public.ecr.aws/localstack/localstack:latest
    ports:
      - "4566:4566"
```
```buildspec.yml
version: 0.2

phases:
  pre_build:
    commands:
      - docker-compose build

  build:
    commands:
      - docker-compose run app

  post_build:
    commands:
      - docker-compose down
```

これらは実際のCodeBuild上では問題なく動作します。
しかし、ローカル環境では動きません。問題となるは以下。

```docker-compose.yml
    volumes:
      - ./:/workspace
```

docker-compose.ymlが存在するフォルダを/worksspaceへmountしたいだけなので、通常であれば間違った記述ではありません。

これで動作しない理由は、以下のIssueで議論されてるとおり、CodeBuildエージェント環境の場合、volumeがホスト側で解決されるためです。

https://github.com/aws/aws-codebuild-docker-images/issues/76

# 解決方法
上記のIssueにもある通り、ホスト上のパスを指定することで動作するようになります。
```docker-compose.yml
    volumes:
      - /home/senioris/app_folder:/workspace
```
Microsoft Entra ID 周りの言葉って複雑すぎない？

この記事では、Microsoft Entra ID 周りの言葉を整理していく。

そもそも、Microsoft Entra ID の役割とは、「従業員が外部リソース（Microsoft 365, Azure Portal, etc...）を利用するための認証認可(入口)を管理する」ことである。

これだけなのに、Azure Active DirectoryやAzure Role、Active Dicrectory、Microsoft Entra Connect、Microsoft Entra Domain Servicesなど、似たような名前、似たような役割が多すぎて混乱する。

# 結論
![スクリーンショット 2024-02-05 8.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255565/ca0a5e7a-c445-0101-a0cf-56d41a8500e5.png)



# Azure Active Directory と Microsoft Entra ID

この二つの違いは、単純である。名前が変わっただけである。
元々「Azure Active Directory」という名前だったものが、「Microsoft Entra ID」に2023年10月へ変更された。
名前変更の弊害の高さを知った。

# Azure Role と Microsoft Entra ID

どちらも、Azureのユーザの利用制限をする機能として用いられる。
しかし、これは制限するターゲットが異なる。

私の認識だと、Microsoft Entra IDの方は範囲が広く、Azure Roleがそれに含まれる。

Azure Entra ID: 外部リソース全般の認証認可を担当する。
Azure Role: Azure内のリソースへの認証認可を担当する。(Microsoft 365などは対象外)

# Active Directory と Microsoft Entra ID

この二つに直接的なつながりはないが、「Microsoft Entra Connect」の機能によって、連携される。
Active Directoryとは、オンプレ(ローカル環境)におけるディレクトリ・サービスである。
ディレクトリデータベースにPCやユーザー、グループなどのアカウントを登録することにより、ユーザーやコンピュータの権利と権限の集中管理を可能とする。


# Microsoft Entra Domain Services と　Microsoft Entra ID

「Microsoft Entra Domain Services」は「Microsoft Entra ID」の中の機能の一つである。
「Active Directory」のクラウド版であり、クラウド上のディレクトリ・サービスである。

# Microsoft Entra Connect と Microsoft Entra ID

Microsoft Entra ID は Microsoftのサービスを対象とする前提があった。
しかし、ユーザには、オンプレや他のクラウドもAzureで一括に監視したいニーズがあった。
それを、可能とするのが「Microsoft Entra Connect」である。
つまり、「Microsoft Entra Connect」は「Microsoft Entra ID」の範囲をさらに拡張する用途で用いられる。


他にも、Azure PolicyやAzure RBACなど様々なリソースの範囲制限をするものが存在する。
この辺の違い、説明はまた後日。

それにしても複雑すぎるだろ。。。
Fastly NGWAF の Edge Deploy で処理対象外を設定する

# はじめに

Fastly の NGWAF はクラウドやオンプレを問わず様々な環境に導入することが可能ですが、もちろん Fastly の CDN 上で動作させる事も出来ます。

通常 WAF を適用する場合はすべてのリクエストに対して処理が行われますが、Fastly の CDN 上に実装（Edge Deploy）した場合、VCL を利用する事で NGWAF を適用する対象を自由に選択することが出来ます。

この記事では設定手順について説明します。

# NGWAF の処理対象外とする方法

Fastly の NGWAF が有効化されているサービス（配信設定）では、 vcl_miss と vcl_pass、つまりオリジンにコンテンツを取得しに行く際に NGWAF の処理を実行する `call edge_security` が実行されます。

この関数が call される前に、`x-sigsci-no-inspection` というヘッダーをリクエストに付与しておくことで、NGWAF の処理の対象外となります。ヘッダーの値はなんでも構いません。

**※ セキュリティー上の観点から NGWAF の処理対象外になるのは VCL 内部でこのヘッダーを付与した場合に限ります。ブラウザなどからこのヘッダーを付与してリクエストを送っても NGWAF の処理対象外にはなりません。**



# 設定手順
それでは具体的な設定手順を説明します。

`x-sigsci-no-inspection` は vcl_miss と vcl_pass で `call edge_security;` される直前に付与されるのが望ましいです。

設定の追加には Snippet を利用します。条件を変更する際に一箇所の変更で済むように2つのサブルーチンでそれぞれ設定するよりも vcl_init 内に共通のファンクションを作成し、2つのサブルーチンからそれぞれ呼び出す形で設定をします。

つまり以下のように合計3つの Snippet を追加することになります。

**vcl_init**
NGWAF の処理対象外を設定する条件
```vcl
sub waf_bypass_check {
  # Bypass Edge WAF for specified conditions
  if (req.url.ext ~ "(?i)^(gif|png|jpe?g|webp)$" ) {
    set bereq.http.x-sigsci-no-inspection = "bypasswaf_extension";
  }else if (req.url ~ "^/no_ngwaf") {
    set bereq.http.x-sigsci-no-inspection = "bypasswaf_path";
  }
}
```


**vcl_miss**
上記ファンクションの呼び出し
```vcl
call waf_bypass_check;
```

**vcl_pass**
上記ファンクションの呼び出し
```vcl
call waf_bypass_check;
```

`x-sigsci-no-inspection` に設定する値はなんでも構いませんが、後々にどういう条件で NGWAF がバイパスされたのかを判断できるような内容を入れておくと便利だと思います。

上記のコードの例だと 拡張子がマッチしたものは bypasswaf_extension, パスがマッチしたものは bypasswaf_path としています。

この値を Fastly から送信されるログに含めることも可能です。

あとはこのバイパスの条件を要件にあうように自由にカスタマイズして下さい。


設定を行うサンプルを Fastly Fiddle で作成しましたのでこちらを Clone して挙動をテストすることも出来ます。
https://fiddle.fastly.dev/fiddle/552ea0a0

※ あくまで上記ヘッダを付与するコードサンプルでこの Fiddle では NGWAF は動作していません。

また、Fiddle でテスト後に実際のサービスに適用した際は、生成された vcl から処理が正しく `call edge_security;` の前に設定されていることの確認をするようにしましょう。


# まとめ

Fastly の NGWAF の Edge Deploy では VCL を利用して NGWAF の適用範囲を自由に制御することが出来ます。適切な設定を適用してアプリケーションを攻撃から防御しましょう。
LPIC201対策 - システムのリカバリ

# この記事について

Linux Level 2 取得を目標としている筆者です。
先日 Level 1 を取得しましたが、短期詰め込みの暗記がしんどかったので、Level2はじっくり時間をかけていいから、ちゃんと理解してやっていきたい。

一方で、暗記も暗記で重要。

ということで、理解を深めるためにと、暗記しやすいように、両方の目的で、覚えたことを Qiita に整理してまとめながら受験対策することにしました。

# この分野で覚えること

## GRUB Legacy

### 設定ファイルとその中身

`/boot/grub/menu.lst`、ディストリビューションによっては `/boot/grub/grub.conf` が設定ファイルとなる。

```shell
default=0
timeout=5

title ubuntu(x.x.xx)
     root (hd0,0)
     kernel /vmlinuz-x.x.x... ro
     initrid /initrd-x.x.x...img
```

- root
    - カーネルイメージしゃ初期RAMディスクの含まれている**パーティション**を指定
    - kernel や initrd に記述したパスは、この配下のパスとみなされる
- kernel
    - カーネルイメージファイルを指定する
    - パスに続けて引数を指定できる
- initrd
    - 初期RAMディスクを指定する
    - パスに続けて引数を指定できる

## GRUB2関連

GRUBメニュー表示中にEキーを押すことで、起動時に起動オプションを設定できる。

### 設定ファイルとその中身

- BIOS利用の場合
    - `/boot/grub/grub.cfg` … 標準
    - `/boot/grub2/grub.cfg` … CentOS7
- UEFI利用の場合
    - `/boot/efi/EFI/ディストリビューション名/grub.cfg`

**GRUB Legacy では `kernel` というタイトルだった項目は、GRUB2の `linux` に相当。**
(BIOS, UEFI共通)

## systemctlコマンド

システム全体や特定のサービス・ユニットの起動・停止を実施したり、自動起動の設定・解除を行ったりする。

### システム全体に関わる systemctl コマンド

`systemctl サブコマンド` で指定する。

| サブコマンド | 意味 |
|:-|:-|
|poweroff|電源オフ|
|emergency|緊急モードに移行|
|rescue|レスキューモードに移行|
|default|標準のモードに移行|
|reboot|再起動|

緊急モードとレスキューモードの違いについては、シングルユーザーモードであるレスキューモードよりも、さらに最小限なのが緊急モードという程度の理解。

詳細は⏬

https://ja.linux-console.net/?p=11726

### 特定のユニット・サービスに関する systemctl コマンド

`systemctl サブコマンド [ユニット名|定義ファイル名]` で指定する。

特定のユニットや定義ファイルに関する起動・停止や、自動起動の設定・解除等を行う。

| サブコマンド | 意味 |
|:-|:-|
|start|サービスを開始（即時）|
|stop|サービスを停止（即時）|
|isolate|他のユニットを停止して対象のユニットを起動|
|enable|自動起動を設定|
|disable|自動起動を解除|
|get-default|デフォルトターゲットの名前を表示|
|set-default|デフォルトターゲットを設定|
|status|サービス等の状態を表示|
|list-units|ユニットの一覧を表示する<br>`--type=service` サービスユニットを表示<br>`--type=target` ターゲットユニットを表示|

## その他の暗記事項

| 暗記事項 | 意味 |
|:-|:-|
|UEFI|BIOSの代替となる、OSとファームウェアの間のインターフェース仕様|
|MBR|BIOSを使ったシステムで、第1段階のブートローダが通常格納される場所|
|UEFI shell|OSを起動せずにハードウエア周りの設定を行うことができ、デバイスドライバや、TCP/IPスタックも利用できるシェル|
|efibootmgr|OS上からUEFIの起動エントリを表示、設定できるコマンド|
|ESP|EFI System Partitionの略で、UEFIシステムパーティションにおいて、物理的なマシンを起動しファームウェアが読み込まれた後の起動シーケンスで最初にアクセスされるシステム領域|
|FAT16, FAT32|ESPに使用できるファイルシステムフォーマット|
|device.map|GRUBが認識した(hd0)と/dev/sdaのマッチング情報を記録するファイル|
|/init|initramfsから最初に実行されるプログラム|
|rdev|カーネルイメージにルートファイルシステムの位置を書き込むコマンド|
|/proc/cmdline|システムを起動する際にブートローダで指定した起動オプションを格納しているファイル|
|grub-install|GRUB Legacy または GRUB2 を MBR にインストールするコマンド|
|systemd-delta|systemdにおいて、同じファイル名のユニット、ターゲットの定義ファイルが複数あり、デフォルトの定義ファイルを上書きしている場合に、どのファイルがどのように影響を受けているか確認するコマンド|

# 以上！

勉強が進んだら適宜追記・修正などしていきます。
城のパーツの作り方

この記事では城の以下のパーツを作り方を説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/c96bc7ce-5980-d2f5-4e1a-5f14f90d0eb2.png)

Addonから"Add Mesh: Extra Objects"をチェックして追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/decc07d6-7382-d9ea-6521-5a00caf1532c.png)

Mesh→Extra→Wall Factoryで部品を出力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/08de50f1-fbe4-9e3c-8b22-600fa9f97a60.png)

Add ModifierからSimple Deformを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/3011b30e-d792-4859-826b-93c80c68eb2b.png)
TwistからBendに
Angleを360°に
AxisをZにすることで円柱にできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/7d51ec85-ad6e-0abb-2fe3-c3d3f78520fb.png)

注意点
Add a Masonry Wallで細かな設定ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/50c261a0-b724-f181-ee91-20160874c7f2.png)
ただしこの情報は保持されるため入れたチャックなどはそのまま残ることに注意する。
Could not execute the lambda function. Make sure you have given CloudWatch Logs permission to execute your functionに遭遇した

### 起こったこと

```bash
╷
│ Error: putting CloudWatch Logs Subscription Filter (subscription-filter): InvalidParameterException: Could not execute the lambda function. Make sure you have given CloudWatch Logs permission to execute your function.
│ 
│   with aws_cloudwatch_log_subscription_filter.this,
│   on main.tf line 34, in resource "aws_cloudwatch_log_subscription_filter" "this":
│   34: resource "aws_cloudwatch_log_subscription_filter" "this" {
│ 
```

CloudwatchLogsのロググループにサブスクリプションフィルターを通してLambda関数を発火させる構成をTerraformで作成していたところ、上記のエラーが発生した。

```terraform
# ロググループの作成
resource "aws_cloudwatch_log_group" "this" {
  name = "/test/log_group"
}

# Lambda関数の作成
resource "aws_lambda_function" "this" {
  function_name = "lambda-function"
  handler       = "index.handler"
  runtime       = "nodejs18.x"
  filename      = "./lambda_function.zip"
  role          = "arn:aws:iam::123456789012:role/_lambda_exection_role"
}

# サブスクリプションフィルタの設定
resource "aws_cloudwatch_log_subscription_filter" "this" {
  name            = "subscription-filter"
  log_group_name  = aws_cloudwatch_log_group.this.name
  filter_pattern  = "hoge"
  destination_arn = aws_lambda_function.this.arn
}
```

### 原因

CloudwatchLogsがLambda関数を起動するためのポリシーの設定が必要。Lambda関数には他のAWSリソースと同様にリソースベースのポリシーを設定可能だが、AWSマネジメントコンソールで作成するときは自動で設定されるため、うっかり忘れていた。

### エラーを回避するには

Lambda関数へCloudwatchLogs用の権限を付与するポリシーを追加する。json形式ではなく、Terraformの引数としてパラメータを記述する。

```terraform

resource "aws_lambda_permission" "this" {
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.this.function_name
  principal     = "logs.amazonaws.com"
  source_arn    = "${aws_cloudwatch_log_group.this.arn}:*"
}

```

```bash
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```

### 参考にさせていただいたもの

[意外と盲点？Lambda関数にトリガーを追加するときはリソースベースポリシーを意識しよう](https://dev.classmethod.jp/articles/lambda-resourcebase-policy/)
uiRecordApi 

たまに見かけますが、解決できないですね。

+ [Getting a HTTP Method 'GET' not allowed. Allowed are POST error response](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000LJXmi)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a33bc48a-e95a-ab89-8887-c89f18e86b60.png)

+ [Lightning Copmonents lightning/uiRecordApi err](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X9Gc4)

私がシステム管理者である場合には問題はありませんが、ゲスト ユーザー/プラットフォーム ユーザーとしてレコードを作成しようとすると、バックグラウンドで (成功メッセージなしで) レコードを作成できます。次のエラー:

+ [createRecord(recordInput)、uiRecordApi を通じてマスター詳細関係に子レコードを作成します](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBKxi)

:::note
The uiRecordApi.createRecord(recordInput) method does not directly support creating child records in a Master-Detail relationship or setting the child record's fields based on the parent record's fields.

uiRecordApi.createRecord (recordInput)メソッドは、主従関係での子レコードの作成や、親レコードのフィールドに基づいた子レコードのフィールドの設定を直接サポートしません。

:::
deptracのバージョンアップ(0.11.1 → 1.0.2)

# 概要

アーキテクチャ品質保存ツール`deptrac`のバージョンアップ(0.11.1 to 1.0.2)を行ったので、ツール概要と修正箇所をまとめる


## どんなツール?

> Deptracは、PHPのための静的コード解析ツールであり、プロジェクト内のアーキテクチャの意思決定をコミュニケートし、視覚化し、強制するのに役立ちます。クラスに対してアーキテクチャのレイヤーと、それらに適用するべきルールを自由に定義できます。
たとえば、Deptracを使用して、プロジェクト内のバンドル/モジュール/拡張がお互いに本当に独立していることを確認し、再利用しやすくすることができます。
Deptracは、CIパイプラインで使用でき、プルリクエストが定義したアーキテクチャルールを違反していないかどうかを確認できます。オプションのGraphvizフォーマッタを使用すると、レイヤー、ルール、および違反を視覚化できます。

- 要はクリーンアーキテクチャのレイヤーや依存関係、命名規則について静的解析してくれるツール
## 実行コマンド

`vendor/bin/deptrac analyse`

デフォルトではルートディレクトリの`deptrac.yml`を設定ファイルとして読み込む。それ以外のファイルを設定ファイルとして読み込みたい場合は`--config-file`オプションを付与する

例:`vendor/bin/deptrac analyse --confifg-file=lib/deptrac.yml`

## 主要概念

- layers
	- 定義するクラスのグループ
- rulesets（ルールセット)
	- レイヤーで通信できるかを示す。つまりそのレイヤーで許可されているクラスはどれかを指定する

例えば以下のような層構造を指定したいときは下記のように記述する

- コントローラはサービスにアクセスできますが、リポジトリにはアクセスできない
- サービスはリポジトリにアクセスできますが、コントローラにはアクセスできない
- リポジトリはサービスおよびコントローラにアクセスしてはいけない

```Yaml
# deptrac.yaml
deptrac:
  paths:
    - ./examples/ControllerServiceRepository1/
  exclude_files: ~
  layers:
    -
      name: Controller
      collectors:
        -
          type: className
          value: .*MyNamespace\\.*Controller.*
    -
      name: Repository
      collectors:
        -
          type: className
          value: .*MyNamespace\\.*Repository.*
    -
      name: Service
      collectors:
        -
          type: className
          value: .*MyNamespace\\.*Service.*
  ruleset: 
    Controller:
      - Service
    Service:
      - Repository
    Repository: ~
```

- paths→検証ディレクトリのパス
- exclude_files→対象外のファイル
- layers→それぞれの層を指定する
	- collectors配下の条件を満たすものに関して、nameで指定した値を一つの層として定義する
	- 例：src/Client 以下のディレクトリに関して「Client」層と定義する
```yaml
  layers:
    - name: Client
      collectors:
        - type: directory
          regex: src/Client/
```

- ruleset→layersで定義した層の通信の許可を確認する
	- 上記の例では、Conroller→Service→Repositoryの通信の依存の構造を示す
### アップグレードの影響

- `0.11.1 to 1.0.2`にアップデートするにあたり、以下のようにYAMLファイルを修正
	- `paths`、`exclude_files`、`layers`、`ruleset`を`deptrac:`配下に移動する
	- `--config-file`オプションの付与
    	- デフォルトではルートディレクトリの`./deptrac.yml`を設定ファイルとして読み込むようになった。デフォルトのファイル名を設定ファイルとしては指定していないので、`--config-file`オプションでファイルパスを指定するようにした
- 参考：[アップグレードガイド](https://qossmic.github.io/deptrac/upgrade/)

## 参考資料

- [Github](https://qossmic.github.io/deptrac/)
- [deptrac Github Pages](https://qossmic.github.io/deptrac/)
STM32C011で有機ELで遊ぶ。(SSD1306)(I2C)(STM32C011J4M7)


------------------------------------------
SSD1306


https://akizukidenshi.com/catalog/default.aspx


https://akizukidenshi.com/catalog/g/g112031/


![o_cop925.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ba56c9fb-699b-0813-2d4c-ea034b8aa198.jpeg)

------------------------------------------



https://qiita.com/caa45040/items/3c57c159be0fd0f7a718


https://qiita.com/caa45040/items/f7698f087967381f91af


https://qiita.com/caa45040/items/a92670598d49e6e547aa





------------------------------------------



x 基本、過去ログを見よ。
x 特に「ssd1306」を参照


目的
秋月で買ったSSD1306(白)のテスト

接続

1 PB7 未接続
2 VDD (3.3V) (SSD1306 VDD)
3 GND        (SSD1306 GND)
4 PA0 未接続

8 PA14 SWDCLK (ST-LINK)
7 PA13 SWDIO  (ST-LINK)
6 PA10 I2C_SDA (SSD1306 SDA)
5 PA9  I2C_SCL (SSD1306 SCL)


結果

![o_cop924.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ba3abf37-cb89-6c0c-b7a2-cc2d1764b296.jpeg)


プログラム

```c++



//I2C_SSD1306_CHAR_C011_1


//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//初期化
void setup() {

  //I2Cのポートの変更
  Wire.setSDA(19); //PA10
  Wire.setSCL(18); //PA9

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);


  // 1行目にC011を表示
  display.println("C011");

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop



```
VSCode で radian を使うときには Bracketed Paste にチェックをつける

タイトルのとおり、VSCode で radian を使うときには Bracketed Paste にチェックをつけましょう。

そうしないと、一行で記述すると長くなるコードを、見やすくするために複数行に改行したものを、`Ctrl+Enter`で実行するとエラーになります。

例えば、
```r
p1 <- ggplot(mtcars) +
  geom_bar(aes(y = factor(gear), fill = factor(gear))) +
  scale_y_discrete(
    "",
    labels = c("3 gears are often enough",
               "But, you know, 4 is a nice number",
               "I would def go with 5 gears in a modern car")
  )
```
を`Ctrl+Enter`で実行したとき、
```r
p1 <- ggplot(mtcars) +
  geom_bar(aes(y = factor(gear), fill = factor(gear))) +
  scale_y_discrete(
```
```r
    "",
```
```r
    labels = c("3 gears are often enough",
```
```r
               "But, you know, 4 is a nice number",
```
```r
               "I would def go with 5 gears in a modern car")
```
```r
  )
```
のように分解実行されエラーとなります。

R の拡張機能にも次のように書かれていました。
> Bracketed Paste
> □ Use braketed paste mode when sending code to terminal. Enable for radian console.

コンソールとしてradianを利用するときに有効にする必要があったのを見落としていました。
論理演算

# 論理演算

・ a AND b
　aとbの両方が1(true)であれば1、そうでなければ0(false)
　例）数学と英語の両方が80点以上であれば合格

・ a OR b
　aとbの少なくとも片方が1であれば1、そうでなければ0
　例）数学もしくは英語が80点以上であれば合格
 
・a XOR b
　aとbのうち一方だけが1であれば1、そうでなければ0 ※aとbの両方が1は0
　例）数学もしくは英語のどちらかが80点以上であれば合格とするが、両方とも80点未満は補修、両方とも80点以上は追加試験


# 論理演算の演算記号

・AND（論理積演算）
　「・」
　「⋏」：かつ、アンド

・OR（論理和演算）
　「+」
　「⋁」：または、オア

・NOT(否定演算）
　「-」(変数の頭に付与）
  「¬」：ひてい、ノット

・XOR(排他的論理和）
　「+[○]」※○の中に+がある。


# 演算則

・べき等則
　同じ操作を何度繰り返しても、同じ結果が得られる。
　例）A・A・A = A・A = A

・交換の法則
　足し算と掛け算同様に、右左を入れ替えても成り立つ。
　例）A・B = B・A

・結合の法則
　計算する順序が異なっても、同じ結果が得られる。
　例）(A + B) + C = A + (B + C)

・分配の法則
　以下の例を参照
　例）(A・B) + (A・C) = A・(B + C)
　BとCにかかっているAは、BとCを計算した結果とAを計算しても同じ結果を得られる。

・吸収の法則
　例）A + (A・B) = A

図：吸収の法則の説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663746/d17fa19e-ca5d-7317-6c5e-7c6098c0f426.png)

　2つの図で重なっている部分はAの範囲そのものであるため、A + (A・B) = Aとすることができる。

　
　例）A・(A + B) = A

図：吸収の法則の説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3663746/ffddfc29-d592-79b8-bab8-3e5c1ca440a7.png)

　強引に聞こえるかもしれないが、A・(A + B) は、Aであれば範囲内に収まっているため、Bを見る必要がなく、A・(A + B) = Aとすることができる。

　
・ド・モルガンの法則
　例）¬（A・B） = ¬A + ¬B
プロファイル操作に関連する


# トレイルヘッドの手順が古いのか拡張インターフェースだと理解できない場合

[Facing an issue with the Edit button for all my profiles.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X97lI)

:::note
Extended profile settings are currently enabled.
Try disabling this setting and returning to the traditional UI.

 Goto setup --> User Management Settings 

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c103b70a-26cd-98eb-cd15-5bff7c45ae60.png)
:::
結合時のカンマを除く数式



+ [Row Level Formulas](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X9Fnz)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a63308a1-4cf3-b447-2a72-1f83e8f47185.png)


```
Opportunity.Renewal_Checks_Missing_Baseline__c& 
IF(ISBLANK(Opportunity.Renewal_Checks_Missing_Baseline__c),"",",") &
Opportunity.Renewal_Checks_Missing_Next_Steps__c&
IF(ISBLANK(Opportunity.Renewal_Checks_Missing_Next_Steps__c),"",",") &
Opportunity.Renewal_Checks_Missing_sub_type__c&
IF(ISBLANK(Opportunity.Renewal_Checks_Missing_sub_type__c),"",",") &
Opportunity.Renewal_Checks_Neg_ARR__c&
IF(ISBLANK(Opportunity.Renewal_Checks_Neg_ARR__c),"",",") &
Opportunity.Renewal_Checks_Stage_check__c
```

+ [Concatenate unique values in formula field](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aisbASAQ)

```
SUBSTITUTE( 
IF(ISBLANK(OTalks_Role_Last_Year__c), NULL, 
OTalks_Role_Last_Year__c + ', ') + 
IF(ISBLANK(OTalks_Role_2_Yrs_Ago__c ), NULL, 
OTalks_Role_2_Yrs_Ago__c  + ', ') + 
IF(ISBLANK(OTalks_Role_3_Yrs_Ago__c ), NULL, 
OTalks_Role_3_Yrs_Ago__c  + ', ') + 
IF(ISBLANK(OTalks_Role_4_Yrs_Ago__c ), NULL, 
OTalks_Role_4_Yrs_Ago__c  + ', ') + 
IF(ISBLANK(OTalks_Role_5_Yrs_Ago__c ), NULL, 
OTalks_Role_5_Yrs_Ago__c  + ', ')  
+ '.', ', .', NULL) 
```
gas、コードの切り出しにて

最初渡された時に、一つの画面で全部コード書いてたんだけど、そのまま作業してるとだんだんごちゃごちゃしてきて、もっとシンプルにすっきりさせたいと思い、グローバル変数や主要な機能を別ファイル（config.gs)に切り出すことにしました。

 そしたら、呼び出しのときに頭にconfig.とつけなくてもグローバル関数がそのままつかえました。

 ？！

 驚いて、デバッグで値確認しても、やっぱりグローバル関数入力されています。

 ？！？！なんで？！

 ネットで調べたら、どうやらGAS の場合は別ファイルの import などは不要なため、別のファイルから呼び出しても、正常に認識されるようでした。