OmniAICreator/Qiita-1.07M huggingface dataset:
ノーフレームワークのChrome拡張機能にCssModulesを導入する

:::note
Chrome拡張機能向けの内容です。
ビルドツールはviteを使用しています。
:::

# 1. 背景
個人開発でChrome拡張機能を開発しています。
ノーフレームワークのプロジェクトでcssファイルを以下のようなtsファイルで管理していました。
```css.ts
export const css = `<style>
.className {
    margin-top: 1rem;
    float: left;
}
</style>`
```
これだと以下の問題があります
- cssの記法が誤っている場合にエディタで気づきづらい
- トランスパイルの対象となり、型チェック、バンドルの時間が余分にかかる
- CSSのグローバルスコープ問題

css-modulesを勉強していたら、ノーフレームワークでも使えることを知り検証してみました

https://github.com/css-modules/css-modules?tab=readme-ov-file#css-modules

```ts
import styles from './style.css';

element.innerHTML = '<div class="' + styles.className + '">';
```

# 2. 手順
## 2.1. CssModulesの型定義を補完
以下で紹介する方法のいずれかをご使用ください
### 2.1.1. [@types/css-modules](https://www.npmjs.com/package/@types/css-modules)
```terminal
npm i @types/css-modules
```
### 2.1.2. vite-env.d.tsを作成

https://ja.vitejs.dev/guide/features#client-types

Vite はデフォルトでは Node.js の API を提供しているとのことです。
ですのでクライアント用のコードを使用するには型定義ファイルを作成する必要があります。

```vite-env.d.ts
/// <reference types="vite/client" />
```

型ディレクティブ```/// <reference types= ~/>```とは型のimportのようなものです。
以前[こちら](https://qiita.com/yamatai12/items/eb271421a6c3ba367624#%E5%9E%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96)でまとめましたので良ければご覧ください！


上のvite-env.d.tsファイルを作成すると、以下のCssModulesの型定義が使用可能になります。
```ts
type CSSModuleClasses = { readonly [key: string]: string }
```

cssのファイル名の拡張子は`.module.css`にする必要があります。

[client.d.ts](https://github.com/vitejs/vite/blob/main/packages/vite/client.d.ts#L6)で以下のように宣言しているからです。
```ts
// CSS modules
type CSSModuleClasses = { readonly [key: string]: string }

declare module '*.module.css' {
  const classes: CSSModuleClasses
  export default classes
}
```

### 2.1.3. [typed-css-modules](https://www.npmjs.com/package/typed-css-modules)
```terminal
npm i typed-css-modules
```
cssファイル作成後に
```terminal
tcm src
```
このコマンドを実行すると、src配下にcssファイル名.css.d.tsが作成されます。

### 上で紹介した型定義ライブラリのユースケース
- CssModulesでアクセスするclass属性がcssファイルにあるかエディタでチェックしたい場合
    - [typed-css-modules](https://www.npmjs.com/package/typed-css-modules)
    - ただし、毎回cssファイルが作成されるごとに型定義ファイルを作成する手間がある
- CssModulesの型定義までできたら十分な場合
    - vite-env.d.ts([@types/css-modules](https://www.npmjs.com/package/@types/css-modules)は管理する手間があるなと感じました)

## 2.2. cssファイルを記述
```styles.module.css
.className {
    color: green;
  }
```

## 2.3. 呼び出し元で使用
```ts
import styles from '@/styles.module.css';
document.body.innerHTML = `<span class=${styles.className}>green</span>`;
```

## 2.4. viteのrollupOptions.output.assetFileNamesのファイル名を固定
```vite.config.ts
rollupOptions: {
    output: {
        ~~~~~~,
        assetFileNames: "override.css"
    },
}
```

## 2.5. cssをサイトに注入
```manifest.json
"content_scripts": [
        {"css": ["override.css"]}
]
```

# 3. 最後に
- CssModulesによりCssを管理しやすくなりました
- CssModulesについてもっと知りたいと思いました

# 4. 参考
- [CSS Modulesを型安全にする仕組み](https://zenn.dev/cybozu_frontend/articles/2528ad2935be9f)
- [アンビエント宣言(declare)について理解する](https://qiita.com/yamatai12/items/eb271421a6c3ba367624#%E5%9E%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96)

本記事を読んで頂き、ありがとうございました。
いいねいただけると記事執筆の励みになりますので、参考になったと思われた方は是非よろしくお願い致します🙏
GAS: 速度計測

GASのスプレッドシートがどのくらいまで実用的かを知るため、スピードテストをしてみたら、結果が面白かったのでメモ。

値自体は、環境やタイミングによって全然変わってくると思うので参考程度です。

# 準備

## シート

下のシートを用意しました。1万行、108列(CZ列まで)、約100万セル。
自分の環境では、このくらいのデータサイズになると、落ちたり、フリーズしたりと、ブラウザでの処理にはややストレスを感じます。
Googleスプレッドシートの[上限は1000万セル](https://support.google.com/drive/answer/37603)だそうです（2024年3月現在）。

![スクリーンショット 2024-03-24 13.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135911/1a5ea74a-4cb8-7c41-05ac-ab96c500891c.png)

## コード

下のコードを実行しました。
```javascript:test.gs
function myFunction() {

  console.time('Hello');
  console.log('Hello World');
  console.timeEnd('Hello');

  console.time('GetSheet');
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getActiveSheet();
  console.timeEnd('GetSheet');

  console.time('GetSheet2');
  const sh2 = SpreadsheetApp.getActiveSheet();
  console.timeEnd('GetSheet2');

  let str;

  console.time('GetSheetName');
  str = sh.getName();
  console.timeEnd('GetSheetName');

  console.time('GetCellValue');
  str = sh.getRange('A1').getValue();
  console.timeEnd('GetCellValue');

  let values;

  console.time('GetCellValues_10k');
  values = sh.getRange('A1:CZ100').getValues();
  console.timeEnd('GetCellValues_10k');

  console.time('GetCellValues_100k');
  values = sh.getRange('A1:CZ1000').getValues();
  console.timeEnd('GetCellValues_100k');

  console.time('GetCellValues_1m');
  values = sh.getRange('A1:CZ10000').getValues();
  console.timeEnd('GetCellValues_1m');
}
```

# 手順
3回テストしました。1回目・2回目はそのまま。3回目は[A1]セルの値だけ100に変更。
![スクリーンショット 2024-03-24 13.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135911/95c2b89c-0360-533f-bb91-4860b5909339.png)

# 結果

| Label              | 1回目    | 2回目(無編集)   | 3回目(編集後)    |
| ------------------ | ------ | ----- | ------ |
| Hello              | 3ms    | 3ms   | 4ms    |
| GetSheet           | 11ms   | 10ms  | 8ms    |
| GetSheet2          | 2ms    | 2ms   | 2ms    |
| GetSheetName       | 287ms  | 314ms | 307ms  |
| GetCellValue       | 168ms  | 106ms | 189ms  |
| GetCellValues_10k  | 165ms  | 122ms | 179ms  |
| GetCellValues_100k | 930ms  | 165ms | 840ms  |
| GetCellValues_1m   | 8522ms | 571ms | 9013ms |

# 考察

## セルの値の取得について

* セルの値の取得には時間がかかる
* 1セル取得するのも、1万セル取得するのも、たいして変わらない
* 1万→10万になるとセル数に応じて時間がかかるようになる
* 10万→100万はほぼセル数に比例する形で時間がかかる
* 全く編集せずに同じセルの値を取得すると明らかに速い
* 少しでも編集をするともとに戻る

## それ以外

* スプレッドシートを取得してからシートを取得するのと、シートを直接取得するのとで所要時間が異なる（GetSheetとGetSheet2の差）。ここは計測可能なレベルの差があるとは思っていなかった
* シート名の取得は遅い。VBA同様、プロパティを扱う処理は遅いと思われるが、セルの値の取得に比べて極端に遅いのかどうかは追加検証が必要
Dart Sass for Railsのビルドオプションの設定方法

Dart Sass for Railsのビルドオプションの設定方法ですが

[公式ドキュメント](https://github.com/rails/dartsass-rails)には以下のように記載されています。

> ## Configuring build options
> By default, sass is invoked with ["--style=compressed", "--no-source-map"]. You can adjust these options by overwriting Rails.application.config.dartsass.build_options.
> ```ruby:config/initializers/dartsass.rb
> # config/initializers/dartsass.rb
> Rails.application.config.dartsass.build_options << "--no-charset" << "--quiet-deps"
> ```

ところが以下のようにエラーが出ます
```console
$ bundle exec rails dartsass:build
Could not find an option named "no-source-map--no-source-map--no-error-css".
```

コードを観た感じ配列ではなく文字列を想定しているようです。
```ruby:dartsass-rails-0.5.0/lib/tasks/build.rake
# :
def dartsass_build_options
  puts "dartsass_build_options: #{Rails.application.config.dartsass.build_options}"
  Rails.application.config.dartsass.build_options
end
# :
def dartsass_compile_command
   "#{EXEC_PATH} #{dartsass_build_options} #{dartsass_load_paths} #{dartsass_build_mapping}"
end
# :
namespace :dartsass do
  desc "Build your Dart Sass CSS"
  task build: :environment do
    system dartsass_compile_command, exception: true
  end
  # :
end
# :
```

## 正解

```ruby:config/initializers/dartsass.rb
# config/initializers/dartsass.rb
Rails.application.config.dartsass.build_options = "--no-source-map --no-error-css"
```
Savings Plans の種類についてまとめてみた

初めまして、メグです。

4月からAWSの仕事に携わるために、AWSの資格を取得するため日々勉強をしています。

今年の1月末に SAAを取得し、現在は3月末の SOAの試験に向けて勉強中です。

今回は、「Savings Plans」の種類について備忘目的に 公式FAQをもとにまとめていきます。

https://aws.amazon.com/jp/savingsplans/faq/

## サービス概要：「Savings Plans」 とは
>Savings Plans は、1 年または 3 年の期間で特定の使用量 (USD/時間で測定) を契約するかわりに、オンデマンド料金と比較して低料金を実現する柔軟な料金モデルです。

## 各種類
### Compute Savings Plans
> 最も優れた柔軟性を提供し、コストを最大 66% 削減するために役立ちます。これらのプランは、インスタンスファミリー、サイズ、アベイラビリティーゾーン、リージョン、OS、またはテナンシーに関わらず EC2 インスタンスの使用に自動で適用されます。

### EC2 Instance Savings Plans
> 料金が最も低く、リージョン内の個々のインスタンスファミリーの契約 (例: バージニア北部で M5 の使用量) と引き換えに、最大 72% の節約を提供します。これは、アベイラビリティーゾーン、サイズ、OS、またはテナンシーに関わらず、そのリージョン内で選択されたインスタンスファミリーのコストを自動的に削減します。

### Amazon SageMaker Savings Plans
> 1 年または 3 年の期間で一貫したコンピューティング使用量 (USD/時間で測定) を契約する代わりに、Amazon SageMaker に柔軟な料金モデルをご利用いただけます。

## Compute Savings Plans と EC2 Instance Savings Plans の違い
リージョンを縛るかどうかによって、使い分けを行う必要があります。


# 自己紹介
初めまして、メグです。(@megggguguuuuuuu)

高専を卒業後、新卒で今の会社に入社をしました。
今年の4月で、3年目突入になります。

現在は、SESにてとあるサービスの運用・保守をしています。
4月以降はAWS関連のメインの業務に参画する予定なため、AWSの勉強を行っております。

AWS資格を現在 CLF,SAA を取得しており、現在 SOA の資格取得に向けて勉強中。
DVA は6月までに取得するつもります。

AWS資格 12冠することが目標です。
同じくAWS 資格を目指す方は、お互いに刺激しあいながら資格取得に向けて頑張りましょう！

# 宣伝
毎週の土日に、僕が入社している会社のオフィス(池袋)にて「もくもく会」をしています。
ぜひご興味がある方がいましたらご参加ください！！！

https://mokumoku-teikoku.connpass.com/
LeetCode 238. Product of Array Except Self の解き方メモ

https://leetcode.com/problems/product-of-array-except-self/description/

LeetCode 238. Product of Array Except Self の解き方メモです。それほど難易度は高くない問題ですが、回答にてこずったので、考え方を残しておきたいと思います。

「配列numsが与えられるので、同じ長さの配列answerを返す。answer[i]にはnums[i]を除くnumsの総積を設定する」という問題になります。まず思いつくのは、numsの総積を事前に計算しておいて、answer[i]=その総積÷nums[i]とするもの。ただ、この問題には割り算禁止という制約があり、この解き方はできません。別の方法を考える必要があります。

結論から言うと、Prefix Productを格納した配列A、Suffix Productを格納した配列Bを事前計算しておくと、A[i]×B[i]がanswer[i]となります。たとえば、配列numsが長さ5の場合、配列Aと配列Bは以下のようになります。

|i  |A                                 |B                                 |
|:-:|:---------------------------------|:---------------------------------|
|0  |-                                 |nums[1]×nums[2]×nums[3]×nums[4]|
|1  |nums[0]                           |nums[2]×nums[3]×nums[4]         |
|2  |nums[0]×nums[1]                  |nums[3]×nums[4]                  |
|3  |nums[0]×nums[1]×nums[2]         |nums[4]                           |
|4  |nums[0]×nums[1]×nums[2]×nums[3]|                                  |

この表を見ればanswer[i]=A[i]×B[i]であることは一目瞭然です。配列Aと配列Bの構築はO(N)のため、計算量的にも問題ありません。

回答コードは以下のようになります。

```rust
impl Solution {
    pub fn product_except_self(nums: Vec<i32>) -> Vec<i32> {
        let n = nums.len();
        let mut a = vec![1; n];
        let mut b = vec![1; n];
        for i in 0..n-1 {
            a[i+1] = a[i] * nums[i];
        }
        for i in (1..n).rev() {
            b[i-1] = b[i] * nums[i];
        }
    
        (0..n).map(|i| a[i]*b[i]).collect::<Vec<_>>()
    }
}
```
C#でN次関数のフィッティング

　C#で3次関数のフィッティングが欲しかったので、簡単な関数を作ってみた。N次関数に対してフィッティングできるはず。1次関数や3次関数で試して明らかにおかしな値は出ていないはずだが、間違いなく正常に動くかどうかは確認していない。
　行列やベクトルの計算にはMath.Netを使用した

```C#
static MathNet.Numerics.LinearAlgebra.Vector<double> Fitting(ReadOnlySpan<(double x, double y)> list, int degree)
{
    var N = degree + 1;
    var mat = new double[N, N];
    var vec = new double[N];

    foreach (var (x, y) in list)
    {
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                mat[i, j] += double.Pow(x, N * 2 - 2 - j - i);
            }
            vec[i] += double.Pow(x, N - 1 - i) * y;
        }
    }

    return
        MathNet.Numerics.LinearAlgebra.Double.DenseMatrix.OfArray(mat).Inverse() *
        MathNet.Numerics.LinearAlgebra.Double.DenseVector.OfArray(vec);
}
```

　1次関数のフィッティングの場合は

```C#
(double, double)[] a = [
    (0.0, 1.0),
    (0.2, 1.9),
    (0.4, 3.2),
    (0.6, 4.3),
    (0.8, 4.8),
    (1.0, 6.1),
    (1.2, 7.2),
];
Console.WriteLine(Fitting(a, 1));
```

　のようにすれば

```
DenseVector 2-Double
5.10714
1.00714
```

　のような出力が得られる。

***

参考にしたページ

[【最小二乗法】二次関数／三次関数でフィッティング | ばたぱら](https://batapara.com/archives/least-squares-method-2.html/)
AWS CloudFormationを使用してセキュアなSSH接続を設定する方法

# はじめに
今回は、AWS CloudFormationを使用して、特定のIPアドレスからAWSリソースに対するSSH接続を安全に設定する方法について、ネットワークアクセスコントロールリスト（Network ACL、NACL）を設定し、特定のIPアドレスからのSSH接続のみを許可する方法を解説します。

# CloudFormationテンプレートの概要
以下のCloudFormationテンプレートは、特定のVPC内でネットワークACLを作成し、特定のIPアドレスからのSSH接続を許可する設定を行います。

```yaml
Resources:
  MyNetworkAcl:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: MyNetworkAcl
```
## MyNetworkAclリソース↑
**Type**: このリソースはAWS::EC2::NetworkAclタイプで、VPC内に新しいネットワークACLを作成します。
**(Properties)**:
VpcId: このネットワークACLが関連付けられるVPCのIDです。!Ref MyVPCは、このテンプレート内の他の部分で定義されたVPCリソースを参照します。
Tags: リソースにメタデータ（タグ）を付加します。ここでは、ネットワークACLにNameタグを追加し、その値をMyNetworkAclとしています。
```yaml
  InboundSshRule:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref MyNetworkAcl
      RuleNumber: 100
      Protocol: 6 # TCPプロトコル
      RuleAction: allow
      Egress: false
      CidrBlock: 172.28.10.1/32
      PortRange:
        From: 22
        To: 22
```
## InboundSshRuleリソース↑
**Type**: AWS::EC2::NetworkAclEntryタイプは、ネットワークACLにルールを追加します。
**(Properties)**:
**NetworkAclId**: このエントリが適用されるネットワークACLのID。
**RuleNumber**: ルールの優先順位を示す数値。低い数値ほど優先度が高いです。
**Protocol**: 通信プロトコルを示す数値。6はTCPプロトコルを意味します。
**RuleAction**: ルールのアクション（allowまたはdeny）。ここでは、許可する設定になっています。
**Egress**: このルールが出口（送信）トラフィックに適用されるかどうか。falseは入口（受信）トラフィックに適用されることを意味します。
**CidrBlock**: このルールが適用されるIPアドレス範囲。172.28.10.1/32は単一のIPアドレスを指定します。
**PortRange**: このルールが適用されるポート範囲。SSHのデフォルトポートである22を指定しています。

```yaml
  OutboundResponseRule:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref MyNetworkAcl
      RuleNumber: 100
      Protocol: 6 # TCPプロトコル
      RuleAction: allow
      Egress: true
       CidrBlock: 0.0.0.0/0 # すべての宛先を許可
      PortRange:
        From: 1024
        To: 65535 # 一般的に応答パケットは1024以上のポートを使用
```
## OutboundResponseRuleリソース↑
このリソースは、ネットワークからのアウトバウンド（送信）トラフィックに適用されるルールを定義します。SSH接続の応答として送り返されるデータパケットを許可するために使用されます。

**Egress**: trueに設定されており、このルールがアウトバウンドトラフィックに適用されることを意味します。
**CidrBlock**: 0.0.0.0/0は全ての宛先IPアドレスを指します。これにより、SSH接続応答を任意の宛先へ送信できるようになります。
**PortRange**: From: 1024とTo: 65535で、応答トラフィックが使用するポート範囲を指定しています。この範囲は、多くのシステムで動的に割り当てられるポート範囲に対応しています。
# まとめ
このCloudFormationテンプレートは、特定のIPアドレスからのSSH接続を許可しながら、不要なトラフィックはブロックするためのネットワークACLを設定します。ネットワークACLはステートレスであるため、インバウンドとアウトバウンドの両方でルールを定義する必要があります。このように設定することで、セキュリティを強化しつつ、必要な通信だけを許可する効果的なネットワーク環境を構築できます。
PythonでDynamoDBからのクエリ結果を処理する場合の便利集（内包表記、無名関数によるソート）

# はじめに
DynamoDBに入ったデータをboto3のqueryすると、こんな感じでItemsにプロパティが格納されます。

```
[
  {
    "id": "id_01",
    "val": 10,
    "test": "test_72095"
  },
  {
    "id": "id_02",
    "val": 20,
    "test": "test_64051"
  },
  {
    "id": "id_03",
    "val": 30,
    "test": "test_84762"
  }
]
```

いわゆる**辞書のリスト**と呼ばれる形式ですが、以下の場合は割と処理が面倒になります。
個人的には```pytest```などの試験時に処理したいケースが多いです。

* 辞書のリストから特定の条件に当てはまる辞書（オブジェクト）を取り出したい
    * 例：タイムスタンプに対して期限を超えたオブジェクトだけを取り出す
* 辞書のリストを特定のキーごとに並べ替える
    * 例：オブジェクトの特定のキーで並び替え、```pytest```で```assert```したい場合
* オブジェクト内の特定のキーを一括削除したい
    * 例：IDなど特定のプロパティがUUID4などで決定しており、```pytest```で除外して```assert```したい場合

上記のようなケースに対して、内包表記やLambda式（無名関数）などを使って処理する方法をまとめます。


# 検索：特定の条件に当てはまるオブジェクトを取り出したい
forを使って回すこともできますが、内包表記を使ってワンライナーで記載します。

ここでは```val```が10より大きい場合のアイテムだけを抽出します。
（DynamoDBからクエリしたItemsは、変数```items```に格納しています）

```
abstracted_items = [d for d in items if d['val'] > 10]

print(abstracted_items)
# [{'id': 'id_02', 'val': 20, 'test': 'test_64051'}, {'id': 'id_03', 'val': 30, 'test': 'test_84762'}]
```


# ソート：オブジェクトの特定のキーで並び替えたい
次に辞書のリストをソートするケースです。
辞書はオブジェクトの大小比較がサポートされていないため、辞書のリストに対してそのまま```sorted```を使うとエラーとなります。

```
sorted_items = sorted(items)

> TypeError: '<' not supported between instances of 'dict' and 'dict'
```

そこで、辞書のリストに対して特定のキーで並び替えたい場合は、```sort```メソッドや```sorted```関数に```key```を指定します。
注意点としては、```key```には関数を指定する必要があります。

https://docs.python.org/ja/3/howto/sorting.html
> list.sort() と sorted() には key パラメータがあります。 これは比較を行う前にリストの各要素に対して呼び出される関数 (または呼び出し可能オブジェクト) を指定するパラメータです。

そのため、辞書内のキーの値を取り出す関数を作成する必要がありますが、このような場合はLambda式（無名関数）を使うと簡単に書けます。

以下は、```test```のキー値でソートしています。
```
sorted_items = sorted(items, key=lambda x:x['test'])

print(sorted_items)
# [{'id': 'id_02', 'val': 20, 'test': 'test_64051'}, {'id': 'id_01', 'val': 10, 'test': 'test_72095'}, {'id': 'id_03', 'val': 30, 'test': 'test_84762'}]
```


# 削除：オブジェクトの特定のキーを一括削除したい
最後に、辞書の特定のキーを削除したい場合を考えます。

リストの内包表記の中に辞書の内包表記を書くことで、対応しました。
今回は```test```キーを削除しています。

```
deleted_items = [{k: v for k, v in d.items() if not k == 'test'} for d in items]

print(deleted_items)
# [{'id': 'id_01', 'val': 10}, {'id': 'id_02', 'val': 20}, {'id': 'id_03', 'val': 30}]
```

一応ワンライナーでは書けますが、分かりづらいかもしれません。
ワンライナーでの拘りがなければ、forや関数化した方が可読性は上がると思います。


# まとめ
DynamoDBをPythonで処理する場合、辞書のリストを扱うケースが多いため、チーム内で記載方法は統一しておくと便利かもしれません。

他にも良い記載方法があれば、コメントで教えていただけるとありがたいです。
GUS at Work


# パッケージをインストールできない

+ [Gus at Work - Create Work Items](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007VIqgMSAT)
+ [GUS at Work - Create Work Items](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T6PZi)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/55467cbe-e8fb-adba-cfad-02beee45a944.png)

+ [Installed AppX Dashboard packageのインストールエラー](https://qiita.com/Keiji_otsubo/items/a310b7dc0e458e94f8c1)


# DUPLICATE_VALUE, duplicate value found: agf__External_Name__c duplicates value on record with id: a0pIT00000K6tdLYAR: []"

+ [duplicate value found: agf__External_Name__c duplicates value on record with id: a0p8b00000J0MGBAA3](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIad9SAD)

:::note
This is because the team named "Sample" is already there in the org and not required to be created again. You can just use the team from the lookup.

これは、「Sample」という名前のチームが組織内にすでに存在しており、再度作成する必要がないためです。ルックアップからチームを使用するだけです。
::: 



+ [Stuck at Trailhead: Work with GUS at Salesforce -> GUS at Work -> Create Work Items](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahBXe)

:::note
I have managed to fix it. There was indeed a Sample team already which I couldnt see due to the list view type. 

なんとか修正できました。確かにサンプル チームがすでに存在していましたが、リスト ビュー タイプのため表示できませんでした。 
:::
AWS Systems Manager Parameter Storeの個人的な活用法

# はじめに
Parameter StoreはAWSのサービス間でパラメータの受け渡しを行う際に、非常に便利なサービスです。
似たようなサービスとしてAWS Secrets Managerも存在しており、よく使い分けについての記事も書かれたりしていますが、今回は私がParameter Storeを利用する上で便利だと感じていること、こうしたほうがいいと思っていることをまとめたいと思います。

# 1. パラメータ名について
パラメータ名は自由に作成できますが、私がパラメータ名として登録する場合は以下のような階層構造にすることが多いです。(場合によってはサービス名の上位概念として会社名を入れることもあります。)
```
/{ServiceName}/{EnvName}/{AWSServiceName or OtherServiceName}/id
```
昔関わったサービスで `hogehoge-id` のようなパラメータ名で登録しているケースを見たりもしました。
1つのサービスしかなかったり、環境毎にAWSアカウントをきっちりと分けている場合はそれでも問題ないですが、スタートアップのサービス立ち上げ当初などはAWSアカウント1つで管理されている場合も多く、パラメータ名を共通にしておくと事故が発生しやすいです。(その後、環境毎にアカウントを分離する際にも、パラメータ名にサービス名と環境名を含むと分離しやすいです。)

## 階層構造にする場合のメリット
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-paramstore-hierarchies.html)にも記載がありますが、以下2点メリットがあります。
- 階層内のパラメータを一括で取得できる
- IAMポリシーで階層に対してのアクセス許可が可能になる

これらを活用することで、先の1アカウントで複数環境を運用する場合でも、適切な権限管理がしやすくなります。

# 2. ラベルについて
各パラメータは履歴管理されており、履歴に対して自由にラベルを付与できることはご存じでしょうか。
以下はあるパラメータの履歴タブのスクリーンショットです。
パラメータの値を更新するたびにバージョンが振られ、そのバージョンごとに重複のないようにラベルをつけることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237951/811c8cf7-cc4a-39ed-dfd5-b81463673980.png)

ラベルをつけると何が便利になるか。
例えば、上記ではDockerイメージのtagを管理していますが、本番環境に最新で適用しているtagに `Current` ラベル、1回前に適用していたtagに `Fallback` ラベルを付与しています。
もし本番環境で問題が発生した時、環境を適用前の状態に戻すため利用しています。
コンテナ化する前はAMIを作成してEC2インスタンスを起動するような構成にしていましたが、その場合でもAMI IDを管理して同じようなことを実現していました。
ちょっと古い記事にはなりますが、[こちらの記事](https://aws.amazon.com/jp/blogs/mt/use-parameter-labels-for-easy-configuration-update-across-environments/)を参考にしています。

## EventBridgeとの連携
EventBridgeのルールを利用し、該当パラメータの更新イベントをトリガーに、サービスをデプロイするためのCodeBuildなどをターゲットとすることで、パラメータをハブとしてCI/CDのパイプラインを作成することができます。
以下は実際に利用しているフローの一部を抜粋したものになりますが、CodePipelineでフローを組むよりも取り回しがしやすいと感じています。
![parameter-store.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237951/5b22f1db-a365-cfea-3711-076278610a47.png)

※注意点として、Parameter StoreをイベントソースとしてEventBridgeを利用する場合、Systems Managerの[試行タイプがベストエフォート](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-service-event-list.html)となっているため、イベントが発火しない場合があります。
例えばslackに通知するなどして、発火しなかったことに気付けるような設計にするなどの工夫は必要になります。

# さいごに
個人的な見解も含んでいますが、Parameter Storeはとても便利なサービスだと思っています。
今年2月のアップデートで[クロスアカウント共有](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-service-event-list.html)もサポートされ、ますます便利になりそうです。(Advancedのみなので、お金かかります)
【ChatGPT有＋DALL-E3】で指示する言葉に詰まったら。


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

　今回は、指示する言葉に詰まったら、の話です。昨日の続きですね。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　ニュース。

　俳優・寺田農（みのり）さんが
　　肺がんのため死去　81歳。

　寺田農さんは
　　俳優・声優でした。

　最近では
　　『ウルトラマン　ブレイザー』に
　　　出演されていました。
　　　　このときに闘病中
　　　　　だったそうです。

　声優として
　　有名なのは
　　　『天空の城ラピュタ』の
　　　　悪役ムスカの声を
　　　　　担当されていました。

　昔からテレビで見ていた顔が
　　またひとり、天に召されました。
　　　ご冥福をお祈りいたします。
***
　さて、
　　本題です。

　昨日（2024/03/23）は
　　Image to Textの話を
　　　書きました。

　自分の中のイメージを
　　言葉にして、ChatGPTに伝え、
　　　DALL-E3に描画してもらう。

　当然ながら
　　イメージを言葉にする
　　　能力が必要となります。

　単なるキャラクターでも
　　詳細を指示にしておかねば、
　　　リトライするたびに
　　　　変わっていってしまいます。

　でも
　　詳細に、と言われても
　　　言葉に詰まってしまいます。
***
　そこで
　　イメージによく似た
　　　キャラクターやシーンの画像を
　　　　ChatGPTにアップして
　　　　　解析してもらって
　　　　　　詳細情報を追加して
　　　　　　　いきましょう。

　解析のプロンプトは
　　**“画像の[✘✘✘]詳細を解析してください。”**
　　　で、ある程度は
　　　　いけるはずです。

　✘✘✘には
　　調べたい対象物を
　　　入れてください。

　例えば、
　　アニメキャラならば、
　　　対象物を“アニメキャラ”で
　　　　大丈夫でしょう。

　服装もできますが
　　おおまかな特徴を
　　　捉えているだけに
　　　　なりますので、
　　　　　そこはご注意を。

　つまり、
　　再現率は
　　　それほど高くはありません。
***
　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ライトニングアプリケーションビルダ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [lightning record page の問題](https://qiita.com/Keiji_otsubo/items/8bd51fd8ae0babf49917)
+ [レコードページの編集でデフォルト組織を選択できない](https://qiita.com/Keiji_otsubo/items/91171e134f78b901031b)

# ライトニングアプリケーションビルダーを利用しながらレコードタイプを２つに分けることは可能なのでしょうか？

+ [ライトニングアプリケーションビルダーのレイアウトについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahL4K)

:::note
有効化する時にレコードタイプに割り当てができるので、それぞれ別のレコードページを作ってそれぞれのレコードタイプに割り当ててみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/577a16da-604f-85a3-2429-96fbfffb8dd9.png)

:::


#  LeadオブジェクトでChatterを使用できるようにしようとしています。

+ [Chatter on Leads](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwH82)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/772fed8e-19ca-8d84-9f0a-be50908b820c.png)


:::note
I figured out the answer. In the Object Manager page layout, I had not included "question, poll, post" in the lightning and mobile actions options. I just dragged and dropped those and all was well!

答えが分かりました。オブジェクト マネージャーのページ レイアウトで、ライトニング アクションとモバイル アクションのオプションに「質問、投票、投稿」を含めていませんでした。これらをドラッグアンドドロップするだけですべてうまくいきました。
:::

# Lightning アプリケーションビルダーでフィールドセクションラベルを削除するにはどうすればよいですか?

+ [Lightning アプリケーションビルダーでフィールドセクションラベルを削除するにはどうすればよいですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igHz0)

:::note
Salesforce の標準的な動作であるため、ラベルを完全に削除することはできませんが、代替手段があります。以下のスクリーンショットに示すように、ゼロ幅のスペース文字を使用してカスタム ラベルを作成し、Flexi ページのフィールド セクションでこのカスタム ラベルを参照することができます。ゼロ幅のスペース文字はここからコピーできます。
 

またはこのリンクから:
https://unicode-explorer.com/c/200B

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2b5848f0-3e2f-11ac-bb44-c79a14400d7b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e63235b9-aa2a-1f21-58ac-40712c8217d9.png)

:::
Linuxのルーティング

## 通信
![截屏2024-03-23 20.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/bed8d996-ef5a-d19e-9334-e4f69276ee96.png)
### 過程
ホストからデータパケットが送信されるとき、<br>
- まずファイアウォールを通過します。
- 次にルーターを経由して外部ネットワークへ転送されるプロセスを示します。
- ルーターはルーティングテーブルを使用して、データパケットを正しい宛先へ転送します。
### 要素
#### ホスト1、ホスト2、...、ホストN： 
これらはネットワーク内の個々のコンピューターやデバイスを表しています。これらのホストはデータパケットを送受信します。

#### データパケット：
ネットワークを介して送信される情報の単位です。この図では、データパケットがネットワーク内でどのように移動するかを示しています。

#### ファイアウォール：
 不正アクセスからネットワークを保護するセキュリティシステムです。データパケットがネットワークに入る前にチェックされます。

#### ルーター：
 異なるネットワーク間でデータパケットを転送するデバイスです。この図では、ルーターが外部ネットワークへのゲートウェイとして機能しています。

#### 外部ネットワーク：
 この図の右側にある、企業や家庭のネットワーク外部にあるネットワークです。

#### ルーティングテーブル：
  ルーターがデータパケットを適切な宛先に転送するため、使用する情報のリストです。<br>
<br>
そして、ルーティングに関して、詳しく紹介させていただきます：

## ルーティング
ルーティングは、複数のネットワークの間で、データが正しく届くように、データパケットの通過する経路（ルート）を制御することです。<br>
それらの情報を格納しているのは、ルーティングテーブルです。あるネットワークから別のネットワークに送信する際、ルーティングテーブルを見て、宛先までの経路を判断します。<br>
### ルーティングテーブルの表示
```
route
```
または
```
netstat -r
```
結果：

```
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
192.168.100.0 192.168.1.201 255.255.255.0 UGH 100 0 0 wlan0 
```

| 項目 | 説明 | 
|:-------|:--------:|
| Destination  | パケットが送信される目的地のネットワークまたはホスト   | 
| Gateway  | パケットが目的地に到達するために通過する中継点    | 
| Genmask  | 宛先アドレスをネットワークアドレスとホストアドレスに分割するために使用されるサブネットマスク    | 
| Flags  | ルートの属性を示すフラグ<br>U：ルートが使用中であること<br>G：ゲートウェイを経由する必要があること<br>H：宛先が単一のホストであることを意味します    | 
| Metric  | ルートの優先度。複数のルートが存在する場合、メトリックが低いルートが優先されます    | 
| Ref  | このルートがどれだけの数のアクティブな接続によって使用されているかを示すカウント値    | 
| Use  | ルートを通過したパケットの数    | 
| Iface  | このルートが使用するネットワークインターフェイス    |

### ルーティングテーブルの操作
routeコマンドとip routeコマンドはルーティングテーブルを操作するために使用されます。
#### ルート追加
格式<br>
route
```
sudo route add -net/host 目的地ネットワーク netmask サブネットマスク gw ゲートウェイ
```
ip route
```
sudo ip route add 目的地ネットワーク via ゲートウェイ
```
以下の二つのコマンドの効果が一緒：
```
sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1 
```

```
sudo ip route add 192.168.2.0/24 via 192.168.1.1 
```
**192.168.2.0/24へのパケット送信に192.168.1.1を経由するルートを指定します。**
![截屏2024-03-24 11.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/55e7b717-5ea4-20da-79ed-6d9c207855dd.png)

#### ルート削除
格式
route
```
sudo route del -net 目的地ネットワーク netmask サブネットマスク gw ゲートウェイ 
```
ip route
```
sudo ip route del 目的地ネットワーク via ゲートウェイ 
```
以下の二つのコマンドの効果が一緒：
```
sudo ip route add 192.168.2.0/24 via 192.168.1.1 
```
```
sudo ip route del 192.168.2.0/24 via 192.168.1.1 

```
特定のサブネットへのルートを削除します。
C#でTimerのコールバック処理を順次処理にしたい

# 1. はじめに
* C#のTimerのコールバック処理に時間がかかる時に処理が並行しないようにしたい

# 2. 開発環境
* C#
* .NET 6
* Visual Studio 2022

# 3. 変更前のソース
```Csharp:
public class Sample : IExecutable
{
  public void Execute()
  {
    var timer = new System.Threading.Timer(TimerCallback);
    timer.Change(0, 1000);
    
    Thread.Sleep(10000);
  }
    
  void TimerCallback(object state)
  {
    // 時間がかかるコールバック処理
    Thread.Sleep(9000);
  }
}
```

# 4. 変更後のソース
```Csharp:
public class Sample : IExecutable
{
  public void Execute()
  {
    var timer = new System.Threading.Timer(TimerCallback);

    // 呼び出し間隔をセットしない
    timer.Change(0, Timeout.Infinite);
    
    Thread.Sleep(10000);
  }
    
  void TimerCallback(object state)
  {
    // 時間がかかるコールバック処理
    Thread.Sleep(9000);

    // コールバック処理後に再度呼び出し間隔をセットする
    var timer = state as System.Threading.Timer;
    timer.Change(1000, Timeout.Infinite);
  }
}
```

# 5. 参考文献

https://devlights.hatenablog.com/entry/20120507/p1
SpringBootでH2DBへの接続方法について簡単にまとめてみる

## はじめに
自己学習でH2DBを実際に使用してみたので、SpringBootでH2データベースに接続した方法について簡単にまとめています。

## 動作環境等
macOS：13.0
Java：17
SpringBoot：3.2.4
IDE：IntelliJ(2023.3.4)
ビルドツール：Gradle
データベース：H2

## 手順
1.　build.gradleに設定を記述する
2.　application.propertiesにH2DBの設定を記述する
3.　SpringBoot起動時に作成するテーブルを準備する
4.　H2コンソールでテーブルを確認する

### 1.Build.gradleに設定を記述する
```build.gradle
dependencies {
    runtimeOnly 'com.h2database:h2' // #1
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' // #2
}
```
:::note
#1: H2DBを使用するために必要な設定
#2: SpringBootでデータベース操作に必要な設定（JDBC）
:::


### 2.application.propertiesに設定を記述する
```application.properties
spring.datasource.data-source-class-name=org.h2.Driver  // #1
spring.datasource.url=jdbc:h2:mem:testdb  // #2
spring.datasource.username=sa  // #3
spring.datasource.password=  // #4
spring.h2.console.enabled=true  // #5
```

:::note
#1: JDBC Driverのクラス名を指定。
#2: データベースのURLを指定。メモリ上にtestdbテーブルを作成する。
#3: H2DBにアクセスするユーザー名を指定
#4: H2DBにアクセスするパスワードを指定（空欄でも可）
#5: H2コンソールを有効に設定。
:::

:::note warn
**H2DBのデータの保存先について**
今回はインメモリデータベースとして使用しています。インメモリデータベースはSpringBoot起動中に使用できるデータベースとなっており、停止と共にメモリが破棄されてしまいます。

データの保存先としてインメモリの他にファイルベースでの保存も可能なため、データを保存する必要性に応じてインメモリ、ファイルベースを使い分けます。
:::


### 3.SpringBoot起動時に作成するテーブルを準備する
「src/main/resources」配下に下記ファイルを作成します。
SpringBoot起動時に下記ファイル内のSQLが実行され、schema.sqlにはDDL（CREATE/ALTER/DROPなど）、data.sqlにはDML(INSERT/UPDATE/SELECT/DELETE)を記述します。
・ **schema.sql（DDL）**
・ **data.sql（DML）**

```schema.sql
CREATE TABLE TESTDB (
    ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    NAME varchar(256) NOT NULL
);
```

```data.sql
INSERT INTO TESTDB (NAME) VALUES('TEST');
```

### 4.H2コンソールでテーブルを確認する
SpringBootを起動し、H2コンソール上で準備したテーブルの中身を確認します。起動後に任意のブラウザから下記のURLにアクセスして確認しましょう。

```
http://localhost:8080/h2-console
```

ブラウザに以下の画面が表示されたらコンソールのアクセスについては成功です。続けて「Connect」ボタンを押下しテーブルの確認をします。
<img width=450 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448772/b023fb86-7e16-ae43-c1f6-0abad9730c43.png">

:::note warn
Driver Class以降の項目についてはapplication.propertiesで指定した内容と合わせる必要があります。今回はデフォルト値で設定していますが必要に応じて編集がしてください。
:::


以下の画面が表示されればH2DBへの接続は成功です。画面の左側にschema.sqlで定義したTESTDBがあるので問題なくテーブルも作成されていますね。

<img width=750 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448772/273987d9-c1d3-e4c3-0488-564b42d748a0.png">


最後にコンソール上でSELECT文を使ってテーブルの中身も問題ないか確認してみましょう。テキストボックス内にSQL文を記述し「Run」を押下します（cmmand+Enterでも可）。
<img width=550 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448772/28b615c3-1dd5-4315-375b-c5a7f122c28b.png">

data.sqlで定義したデータが表示されていれば成功です。

## おわりに
以上、H2DBの接続方法について簡単なまとめでした。
Einstein Copilot のトレイルヘッド


特別版の環境があるようです。

[5-day trial org with Einstein Generative AI.](https://trailhead.salesforce.com/content/learn/projects/quick-start-einstein-copilot/connect-your-flows-to-einstein-copilot?trailmix_creator_id=strailhead&trailmix_slug=take-flight-with-einstein#:~:text=5%2Dday%20trial%20org%20with%20Einstein%20Generative%20AI.)

https://trailhead.salesforce.com/content/learn/projects/quick-start-einstein-copilot/connect-your-flows-to-einstein-copilot?trailmix_creator_id=strailhead&trailmix_slug=take-flight-with-einstein

# It looks like you have not selected an Einstein generative AI-enabled org to validate. Be sure to sign up for an org, connect it to Trailhead, and choose it before validating.

+ [【未解決】Help Prompt Builder and Connect Flows - Gen AI](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ywdsy)
odomフレームなしでNav2を動かす

# はじめに

Nav2 ドキュメントの[セットアップガイド](https://navigation.ros.org/setup_guides/transformation/setup_transforms.html)によると TFツリーを[REP 105](https://www.ros.org/reps/rep-0105.html)に従って図1のように `/map` → `/odom` → `/base_link`　の変換を公開する必要がある　とあるが、図2のように `/odom` フレームなしで  `/map` → `/base_link` の構成で動かすことができる。

この記事では`/odom` フレームなしでNav2を動かす手順についてTurtleBot3とGazebo Classic環境を用いて説明する。

なおこの記事では/odomフレームの存在理由については解説しないものとする。



```mermaid
graph LR
    map --> odom
    odom --> base_link
    base_link --> sensor_link
```

　　　　　　　　　　　　　図1


```mermaid
graph LR
    map --> base_link
    base_link --> sensor_link
```
　　　　　　　　　　　　　図2

# 環境

OS : ubuntu22.04LTS
ROS : ROS2 Iron (Humbleでも可)


ドキュメント通りNav2がインストールされており以下のサンプルが実行できる環境であること

```bash
 ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False
```

https://navigation.ros.org/getting_started/index.html



# 手順

### おおまかな手順

1. Gazebo のdiff driveから出るodometryのframe_idをmapに変更する。
2. nav2 parameter ファイルの`global_frame`のodomの部分をすべてmapに変更する。
3. 通常通り起動する 

### 必要なパッケージのインストール

```bash
sudo apt install ros-$ROS_DISTRO-navigation2
sudo apt install ros-$ROS_DISTRO-nav2-bringup
sudo apt install ros-$ROS_DISTRO-turtlebot3-gazebo
```

```bash
source /opt/ros/$ROS_DISTRO/setup.bash
export TURTLEBOT3_MODEL=waffle
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/$ROS_DISTRO/share/turtlebot3_gazebo/models
```

### turtlebot3のsdfファイル編集

odometry_frameのodomをmapに変更する。
(直接編集するのがいやな場合はコピーして別の場所にうつす)

```sdf:/opt/ros/iron/share/nav2_bringup/worlds/waffle.model
<         <odometry_frame>map</odometry_frame>
---
>         <odometry_frame>odom</odometry_frame>
```

### nav2 parameterのyamlファイル編集

Local costmapなどframeがodomになっている箇所をすべてmapに変更。

```yaml:/opt/ros/iron/share/nav2_bringup/params/nav2_params.yaml
190c190
<       global_frame: map
---
>       global_frame: odom
312c312
<     local_frame: map
---
>     local_frame: odom
```




### 実行

sdf, yamlファイルをコピーして編集した場合、引数でファイルの絶対パスを指定。
(amclも起動しているがあってもなくても変わらないので無視)

```bash
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False robot_sdf:='/home/user/waffle.model' params_file:='/home/user/nav2_params.yaml'
```

https://twitter.com/porizou1/status/1771471879720636832

TF 構成　（/odomがない）

![frames.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/d7ff18bc-9ef7-a4d5-4480-66d5b027f0dc.png)


# おわりに

`odom` フレームなしで`map` →　`base_link`の構成でNav2を動かす方法について解説した。
応用事例としてはAutowareのTF構成が`map` →　`base_link`となっているので、AutowareのLocalizationモジュールで自己位置推定した結果を直接入力してNav2を動かしたりできる。


そもそもodomフレームとは何か？何故odomフレームが必要なのか？については以下の記事を読んで下さい。


https://qiita.com/NaokiAkai/items/08deb338956c8da83aa9



# 参考


https://navigation.ros.org/setup_guides/transformation/setup_transforms.html

https://www.ros.org/reps/rep-0105.html
問題一覧作成

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <title>Quiz</title>
</head>
<body>
        <h1>Quiz</h1>
        <h2>問題一覧</h2>
        <ul>
            <li><a href="question1.html">問題１</a></li>
            <li><a href="question2.html">問題２</a></li>
            <li><a href="question3.html">問題３</a></li>
            <li><a href="question4.html">問題４</a></li>
        </ul>
</body>
</html>
ルート権限でのヒアドキュメント ファイル出力

# 課題
ルート権限が必要なファイルにヒアドキュメントでファイル出力しようとするとエラーになります。
- **hostsファイルに追記する場合の例**
```bash:ファイル権限確認
[user01@localhost ~]$ ls -l /etc/hosts
-rw-r--r--. 1 root root 158  3月 24 09:59 /etc/hosts
```
```bash:ファイルの中身確認
[user01@localhost ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```
```bash:ヒアドキュメントで追記（エラーになる）
[user01@localhost ~]$ cat <<EOT >> /etc/hosts
> 127.0.0.2   test2
> 127.0.0.3   test3
> EOT
-bash: /etc/hosts: 許可がありません
```
- **sudoを付けても同じ**
```bash:sudoを付けて実行（エラーになる）
[user01@localhost ~]$ sudo cat <<EOT >> /etc/hosts
> 127.0.0.2   test2
> 127.0.0.3   test3
> EOT
-bash: /etc/hosts: 許可がありません
```

# 解決策
- **ルート権限でteeを実行してファイル出力**
```bash:teeでファイル出力
[user01@localhost ~]$ cat <<EOT | sudo tee -a /etc/hosts > /dev/null
> 127.0.0.2   test2
> 127.0.0.3   test3
> EOT
[sudo] user01 のパスワード:
```
```bash:ファイルの中身確認
[user01@localhost ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.2   test2
127.0.0.3   test3
```
**※tee -aで追記モードにしないと元の内容が消えてしまうので注意**
# 別解
※下記でも良い
```bash:teeでファイル出力
[user01@localhost ~]$ sudo tee -a /etc/hosts << EOT > /dev/null
127.0.0.4   test4
EOT
```
```bash:ファイルの中身確認
[user01@localhost ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.2   test2
127.0.0.3   test3
127.0.0.4   test4
```
Railsのおすすめボイラープレート


こんにちは！学びと成長しくみデザイン研究所の斉藤です。
みなさんはRails環境での技術検証をしたいとき、手っ取り早く試せるRails環境を作りたいと考えたことはありませんか？
例えば、「gemの動作検証をしたい」や「古いRailsの挙動を調査したい」など。
`rails new` で一から環境構築するのは少し手間だし、どうしようかと思っていたところ、素晴らしいOSSを見つけたのでご紹介します。

## オススメ1

https://github.com/yasslab/sample_apps

Railsチュートリアルのサンプルコード集です。ボイラープレートとしても活用できます。

- おすすめポイント
    - Railsの古いバージョンから新しいものまで幅広くカバーしている
    - 癖のあるgemが導入されておらず、素のRailsに近い構成
- 補足
    - DBがSQLiteなので、本番環境のDBと合わせたい場合は以下の記事を参考にどうぞ
        - https://qiita.com/SaitoJP/items/d0df0ff431ee184b895b

## オススメ2

https://github.com/mattbrictson/nextgen

`rails new` よりも多機能な環境構築ツールです。
DBやJSビルドツールなど様々な構成を自動的に設定してくれます。

- おすすめポイント
    - 最新のRailsバージョンに対応している
    - 豊富な構成オプションがある
- 補足
    - READMEに記載されている `Requirements` を見落とさないこと（特にYarnが必要な点）


# まとめ

今回ご紹介したボイラープレートやツールを使うことで、開発環境のセットアップ時間を削減でき、様々な技術検証を容易に実施できます。
ぜひこの機会に活用し、より快適な開発環境を実現してみてください。
Salesforceで特定の条件で特定の項目を表示させる方法【アクション編】～

こんにちは。本橋孝昭です

今回はSalesforceの設定で特定の条件で特定の項目を表示させる方法についてご説明します

この設定を使えば例えば取引先が▼項目が「〇」の時のみ項目を表示させたい　ということが可能です


なお、現在は一部標準オブジェクトとカスタムオブジェクトでは「動的フォーム」という設定が可能です
動的フォームを使えば項目ごとにレコードの条件で「項目を出す」「項目を出さない」の設定が可能です
https://help.salesforce.com/s/articleView?id=sf.dynamic_forms_migrate.htm&language=ja&type=5


しかしながら動的フォームでは
・特定の標準オブジェクトには対応していない（キャンペーン、商品、ToDo ）
・動的フォームを有効にするとページレイアウトの設定がレコードページに反映されないので設定が複雑
という問題も起こりえます
（詳細はこちらの考慮事項を確認ください）
https://help.salesforce.com/s/articleView?id=sf.dynamic_forms_limitations.htm&type=5

よって、そのような制約がないように今回は
・アクション
による
対応を行います

## 対応例　取引先の電話項目が入力されている場合のみ、カスタム項目「test」を表示させるようにアクションで設定をする



### ステップ1 取引先にアクション作成

まずは取引先にアクションを作成しましょう
アクション種別は「レコードを更新」で保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/035c6886-0366-f00e-c87e-2c0127515b95.png)


デフォルトの画面はこのようになってますので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3211637b-81f1-7ae2-9334-60e7258759a8.png)


これを今回表示したい項目（今回ならtest項目）のみ表示させて保存しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/968d51b0-adfa-724c-dccf-7c899986ee51.png)

ちなみにこのような警告が出ますがいったん気にしなくて大丈夫です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c691a611-658e-68ef-d8e3-774f1d693d25.png)



これでアクション作成は完成です


次にLightningページを編集して先ほど作成したアクションを表示させましょう


### ステップ2 Lightningレコードページを編集しよう

次にLightningページを編集します
コンポーネント「関連レコード」をドラッグアンドドロップし、先ほど作成したアクションを表示させます

![関連レコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f8c6d216-ff04-86d0-146f-b6cd61b5fff1.png)


もしもこのアクションに表示された項目をレコード条件により出しわけしたいのであれば検索条件を作りましょう

今回は「電話項目の値が記載があればアクション表示。電話項目の値の記載が無ければアクションは非表示」という例を作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/be16cd53-4941-d081-fd47-e93a289e32bf.png)


コンポーネント配置、検索条件の設定が決まれば後はLightningページを保存、有効化をお忘れなく
こちらで設定は完了です

電話番号が空欄ならばアクションは出ないので項目は非表示です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4c48758b-2b60-d48f-f519-c2d6bc091418.png)


電話番号が記載があればアクションは表示されるので項目の閲覧や編集は可能になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/490b4836-6ef9-6a23-45ed-bfad6ced9871.png)
Pythonで「複数の文字列のいずれかにマッチするパターンを記述する」の動作を確認してみた

# 概要

Pythonで「複数の文字列のいずれかにマッチするパターンを記述する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index14.html

# 実装

以下のファイルを作成しました。
```sample.py
import re
pattern = re.compile(r'Sunday|Sun|sunday')
print(bool(pattern.search('Today is Sunday')))
print(bool(pattern.search('Sunflowers are in bloom')))
print(bool(pattern.search('SUNDAY MORNING')))

import re
pattern = re.compile(r'\b(Red|red)\b')
print(bool(pattern.search('Red Rose')))
print(bool(pattern.search('reduce the workload')))
print(bool(pattern.search('Border color is red')))
print(bool(pattern.search('predict a result')))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
True
True
False
True
False
True
False
```

# まとめ

何かの役に立てばと。
初学者向け、Next.jsとReactとは

# はじめに
今回は、近年人気な<font color="red">**Next.js**</font>とはなにか、<font color="blue">**React**</font>とはどういった関係なのかという、学び始めの頃には理解しづらい概念を出来るだけわかりやすくまとめたいと思います。

間違いなどもあるかもしれませんので、もしお気づきの点がありましたらご指摘頂ければ幸いです。

## Next.jsとは
Next.jsは、Reactアプリケーション開発のためのオープンソースの**JavaScriptフレームワーク**です。

サーバーサイドレンダリング（SSR）、静的サイト生成（SSG）、クライアントサイドレンダリング(CSR)など、さまざまなレンダリング手法をサポートしています。

**Next.jsを使用することで、Reactの機能を活かしつつ、アプリケーションのパフォーマンスを向上**させ、SEO（検索エンジン最適化）にも有利なウェブサイトやアプリケーションを簡単に構築できます。
## Reactとは
Reactは、Facebook（現Meta）によって開発されたオープンソースの**JavaScriptライブラリ**です。ユーザーインターフェイスを構築するために使用されます。

**再利用可能なコンポーネントから構築**されており、特にシングルページアプリケーション（SPA）の開発に適しています。
## Next.jsとReactの関係
Next.jsとReactの関係性を理解するには、まず**ライブラリ**と**フレームワーク**の違いを把握することが重要です。

これらの概念を明確にすることで、Next.jsがReactにどのように関連しているか、そしてどのように相互に補完し合っているかが理解しやすくなります。

### ライブラリとは
ライブラリは、**特定の機能やタスクを実行するために再利用可能なコードの集合**です。

開発者は自分のプロジェクトで必要な機能をライブラリから選び、それを使って作業を効率化できます。

具体例を挙げると*json(JavaScript Object Notation）* や　*DOM（Document Object Model）操作*　 　や　*Hooks*　 などがライブラリの機能の一つです。

**ライブラリは「使う」ものであり、開発者がコンポーネントを組み合わせてUIを構築するのを助けるツールを提供します**が、アプリケーション全体の構造や動作を強制しません。

### フレームワークとは
フレームワークは、 **アプリケーションの骨組みや設計パターンを提供するもの**です。

一定の規則や構造に従ったアプリケーションの骨組みを提供してくれるので、開発者はそれぞれのシステムに必要な部分を書き込むだけで効率的に開発を進めることができます。

これにより、開発の一貫性が保たれ、より大規模なアプリケーションや複雑なアプリケーションの開発が容易になります。

## まとめ
Next.jsとReactの関係は、
**フレームワーク（Next.js）が提供する骨組みや規則に沿い、
ライブラリ（React）を使用してアプリケーションを構築する**というものです。

Next.jsはReactのコンポーネントモデルを利用して、開発者がより効率的にウェブアプリケーションやウェブサイトを構築できるように様々な機能を提供します。

**Reactの柔軟性**と**Next.jsの構造的な利点**を組み合わせることで、開発者はパフォーマンスが高く、優れたウェブアプリケーションをより簡単に構築できるようになります。



## ※余談　プログラミング言語とライブラリの関係　
ReactとNext.jsの関係に類似している物として**PHP**と**Laravel(フレームワーク)** などがありますが、**ReactがJavaScriptライブラリ**なのに対して、**PHPはプログラミング言語**です。

ではプログラミング言語とライブラリの関係性はどういったものなのでしょうか？

* プログラミング言語とは、コンピューターに命令を与えるための形式言語です。
プログラミング言語は非常に汎用的であり、様々なタイプのプログラムやアプリケーションを作成することが可能です。


* ライブラリとは、**特定の機能やタスクを実行するために再利用可能なコードの集合**です。
React自体はJavaScriptの一部ではありませんが、JavaScriptという言語の上に構築されており、**JavaScriptの構文と機能を利用して動作**します。


**JavaScriptの能力を特定の方向（特にUI開発）に向けて拡張し、より効率的にするためのツールセット**を提供しているのがReactだと言えます。

まとめると、プログラミング言語という土台の上にプログラミング言語を使用して作成したライブラリが存在する。(しかしプログラミング言語とは異なる)

私が初めてプログラミングを学んだときには、ライブラリというと関数のイメージが強かったのですが、ライブラリは、関数の集まりを提供するだけでなく、**ソフトウェア開発におけるさまざまな側面をサポートし、効率化するための多様な機能とリソースを提供する**ということを理解すれば、ReactとNext.jsの関係も理解しやすくなると思います。
Microsoft CopilotとOpenAIのChatGPTのプランの違い

みなさんこんにちは。
WindowsにCopilot機能が統合されているな～というのは認識していたのですが、ChatGPTを有料課金している自分としては、そういえばどんな違いがあるんだっけ？というのが気になりまして、調べてみた結果を簡単にまとめてみました。

# 記事の概要
Microsoft CopilotとChatGPTの有料版／無料版のそれぞれの違いについてまとめてみた。

## 背景
そもそも気になった背景的な部分として、ChatGPTの場合は会話の内容をAIの追加学習用コンテンツとして使用していることから、OSに標準搭載されているMicrosoft Copilotってどうなんだっけ？というのが気になったというのが背景です。

## それぞれのプランの違い

Microsoft Copilotのプランの違いやCopilot間の違いを表にまとめてみます。

### Microsoft Copliotのプランの違い
| プラン | 機能 | 利用方法 | 料金 |
| --- |--- |--- |--- |
| 個人向け Copilot | - チャット機能<br />- ブラウジング機能<br />- ドキュメントやWebページの要約機能<br />- 画像認識機能<br />- 画像生成機能<br />- 音声会話機能 | - Microsoft Edgeや他のブラウザ、スマートフォン、Windows OSで利用可<br />- 無料 | 無料 |
| 個人向け Copilot Pro | 同上 | - Microsoft 365アプリで利用可<br />- 月額サブスクリプション（1ユーザーあたり3,200円） | 月額3,200円 |
| 企業向け Copilot for Microsoft 365 | 同上 | - Microsoft 365アプリで利用可<br />- EnterpriseやOrganization単位でライセンス管理 | 企業向け価格　※１ |

※１．下記サイトに記載されている価格は、ユーザー月額 ¥3,750 ですが、企業向けの場合はボリュームディスカウントなどがある可能性もあるため、表記上は企業向け価格としました。
https://www.microsoft.com/ja-jp/microsoft-365/business/copilot-for-microsoft-365?rtc=1


### それぞれのCopilotの違い

|項目|Copilot Pro (有料版)|Copilot (無料版)|ChatGPT Plus (有料版)|	ChatGPT (無料版)|
| --- | --- | --- | --- | --- |
|価格|月額3,200円|無料|月額20ドル|無料|
|利用できる機能|- GPT-4.0 / GPT-4 Turbo<br>- 画像生成AI<br>- プラグイン<br>- Microsoft 365 アプリで文書の下書き、メールの要約、プレゼンテーションの作成|- GPT-4.0 / GPT-4 Turbo<br>- 画像生成AI<br>- プラグイン|- GPT-4.0 / GPT-4 Turbo<br>- 画像生成AI<br>- プラグイン|- GPT-3.5と1つ前のモデルのみ使用可能|
|アクセス|ピーク時でもGPT-4およびGPT-4 Turboへ優先的にアクセスして、パフォーマンスを高速化し、作業をより迅速に完了する|サーバーへのアクセス制限や待ち時間が発生することがある|ピーク時でもGPT-4およびGPT-4 Turboへ優先的にアクセスして、パフォーマンスを高速化し、作業をより迅速に完了する|サーバーへのアクセス制限や待ち時間が発生することがある|
|セキュリティ<br />※会話をAIの学習に使用するか|しない ※１|しない ※１|自分で設定する　※２|自分で設定する　※３|
|制限|Designerで100 ブーストまで|- Designerで15 ブーストまで<br />- ピーク時はGPT3.5になる|GPT4やDall-E3が40回/3時間|GPT4が使えない|

※１．Microsoft Copilot for Microsoft 365 のデータ、プライバシー、セキュリティについては下記サイトを参照のこと
https://learn.microsoft.com/ja-jp/microsoft-365-copilot/microsoft-365-copilot-privacy
※２．GPT選択画面より、一時的なチャットを有効化にする
※３．アカウント＞Setting＞Data control＞Chat history & trainingから設定

## 総括
ちょっと調べものをする程度ならChatGPT Plusを契約しなくても無料版のMicrosoft Copilotで事足りそうですが、DALL-EやGPT4を多く使用したい場合はMicrosoft Copilotの有料版でも高負荷時は1日100回までの制限となるため、常時3時間40回制限の有料版ChatGPTに軍配があがりそうです。
Splunk CLI備忘録　part1

# 【前書き】
splunkを最近仕事で使用するようになり、ターミナル上での操作もそろそろしっかり覚えなければならないという意識の下、自分用にコマンドの備忘録を残します。
（本当に基本的なレベルのコマンドです）

2024年3月現在、日本語の文献等も少なく、英語のマニュアルを毎回熟読しなければならず、なかなか情報収集にてんやわんやの毎日です。。。

また、運用保守の多様性を考慮して、LinuxとWindowsどちらも併記しております。


# 【基本的なCLIコマンド】
基本的にsplunkのCLIコマンドは、公式docにも記載があるように以下のよう入力します。
```
./splunk <命令したいこと> <パラメータなど>
```
https://docs.splunk.com/Documentation/Splunk/9.2.0/Admin/CLIadmincommands

ただLinuxだと **./splunk** なのに対し、Windowsでは単純に **splunk** となります。

## 【splunkdの実行】

Linux
```
./splunk start
```
Windows
```
splunk start
```

## 【splunkdの停止】

Linux
```
./splunk stop
```
Windows
```
splunk stop
```

## 【splunkdの再起動】

Linux
```
./splunk restart
```
Windows
```
splunk restart
```


## 【SPLUNK_HOME/binへの移動 & ステータスチェック】
(splunkdの稼働状態をとプロセスIDが表示される)

Linux
```
cd /opt/splunk/bin
./splunk status
```
Windows
```
cd C:\Program Files\Splunk\bin
splunk status
```

## 【diagファイルの作成】
*diagファイルとは
→splunkの内部環境情報を取得したもの。エラー調査時の他、splunkサポートへの起票などの際に、diagファイルが必要となる。

参考ドキュメント：https://docs.splunk.com/Documentation/Splunk/9.2.0/Troubleshooting/Generateadiag

Linux
```
cd /opt/splunk/bin
./splunk diag
```
Windows
```
cd C:\Program Files\Splunk\bin
splunk diag
```
ABC346回答メモ

# 0.はじめに
　なかなかバラエティに富んだ問題がそろってました。
 BにてこずったりDに絶望しつつ、Eがなんとか解けたため
 レートはなんとかプラス+15と増えました。


# 1.A - Adjacent Product
　小手調べ的な問題。
 回答用のリストBを用意し、リストA内の隣接した数字を掛けたものを
 Bに格納して表示するだけでACでした。

　https://atcoder.jp/contests/abc346/submissions/51545214


# 2.B - Piano
　めちゃくちゃてこずり、後回しにした上に考察が甘く
 WAを3連発して時間を食われました。
 【考え方】
 　1.配列WL（鍵盤の白部分を1とした列[1,0,1,0,1,1,0,1,0,1,0,1]の繰返し）を用意
 　2.配列BL（鍵盤の黒部分を1とした列[0,1,0,1,0,0,1,0,1,0,1,0]の繰返し）を用意
 　3.変数WSを用意しWLを先頭から足していく、その際、BLも同じ位置分BSに足していく
 　4.WSが入力Wと同じときのBSの値がBと同じなら、Yesを出力して終了
 　5.Bと違う場合、先頭から1ずらして3～4を繰り返し
 　6.12回繰り返してもBSの値がBと一致しない場合Noを出力して終了

  1回目は、配列WLとBLが、W=100をみたすだけの長さが無かったためREに。
  2～3回目は”WSが入力Wと同じとき”が、WL[i]=1の時と、その次が0の時の
  2種類あることが考慮されていなかったためにWAとなりました。

　自分的にはB史上一番難しくない？と思う問題でした。

　https://atcoder.jp/contests/abc346/submissions/51581060


# 3.C - Σ
　普通にやったらTLEだろうなーという思いと普通にやる方法も結構複雑だなーと
 いう感じでした。
　まぁ、典型的な問題なので、すぐ解法は思いつきました。
 【考え方】
 　1.1～Kまでの累積和KS((K*(K+1))//2)を計算
 　2.リストA内のK以下かつ重複しない値を集計したASをKSからマイナスし出力
 　～ASの算出法～
  　1.リストAに存在する数の辞書Dを用意
  　2.リストAを先頭から見ていき、Dにある場合はスキップ
   　 Dにない場合、辞書Dに登録かつ、K以下ならASに加算

 　といった感じですんなり解けました。  　

　https://atcoder.jp/contests/abc346/submissions/51565374


# 4.Gomamayo Sequence
　DPだなーと思いつつどんな集積にすればよいかがおもいつかずスルーしました。
 後で解説見ながら解きたいと思います。


# 5.E - Paint
　典型的な問題だったので、セオリー通り最後の操作優先で
 算出する方法を検討。
 のんびり考えてたら意外と時間が足りなくなりましたが
 縦横の捉え違いとかもなく、テスト～提出まですんなりいけて間に合いました。

　【考え方】
 　1.行列毎に塗られた順番と色を保持する辞書(WD,HD)を用意
  　M回分インプットして、辞書を更新（既存行は上書き）
 　2.WD,HDの値をリストLに(塗順,縦横,色)を格納し、降順に並べ替え
 　3.縦加算数＝Hと横加算数＝W、SortedDict(Key_色:値_枚数)CDを用意する
 　4.リストLを先頭から参照
  　縦の場合、辞書CD_KEY色の値に縦加算数を加算、横加算数を1マイナス(0まで)
  　横の場合、辞書CD_KEY色の値に横加算数を加算、縦加算数を1マイナス(0まで)
  　縦加算数と横加算数が共に0になったらリスト参照終了
 　5.CD内に0がある場合（0で塗られていた場合）CD[0]にWC*HCを加算
  　　ない場合且つ、WC*HCが0でない場合（塗られていないマスがある場合）
    　CD[0]にWC*HCをセット
 　6.CDのキー・値を順に出力して終了

　https://atcoder.jp/contests/abc346/submissions/51604645


以上