OmniAICreator/Qiita-1.07M huggingface dataset:
【ServiceNow小ネタ】リストの並び順設定

## 概要
ServiceNowでレコード一覧画面（リスト画面）を表示した際に、初期表示の並び順を設定する方法を備忘録として記録します。
並び順設定には
・ユーザー初期設定
・モジュール設定
の2つの設定方法があり、どちらを使用するかは要件に応じて使い分ける必要があるかと思います。

### 環境
PDIで作成しています。
バージョンはVancouverです。
System Administrator（admin）で操作しています。

### ユーザー初期設定
ユーザー初期設定から設定した場合、
ユーザーが並び順を変更すると、次回そのリスト画面を開いた際に、変更した並び順で表示されるようになります。
 　

### 設定手順
#### 1.既存のUser Preferencesレコードの確認
アプリケーションメニューより
User Administration > User Preferences を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/d5c616de-ca2a-5b0e-969b-6cc3489bb099.png)

以下の条件でフィルタリングします。
・Name がリストの並び順を設定したいテーブル名から始まる
・System = true
抽出結果に
・テーブル名.db.order
・テーブル名.db.order.direction
のレコードが存在するかどうか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/5481a7b7-10fd-93b7-969f-2dfc4c5bcf5a.png)

存在していた場合はそれらのレコードを書き換えます。
存在していない場合は、「New」ボタンよりレコードを新規作成します。

今回の例では以下のように既存のレコードを書き換えることとします。
番号(number)の降順　→　開始日時(opened_at)の昇順

#### 2.テーブル名.db.orderの設定
テーブル名.db.orderのレコードを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/762c543b-15ac-2ce9-dfda-fcbfd314cc0a.png)

Valueの値をリストの並び順で使用したいフィールドの物理名（例ではnumber→opened_at）に書き換えて更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/5e7b59de-d025-c3a6-7753-86a2d3c41589.png)

#### 3.テーブル名.db.order.directionの設定
テーブル名.db.order.directionのレコードを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/0366aa6f-64fa-a4e4-82ea-dc5b63e5354d.png)

Valueの値をASCに書き換えて更新します。（降順：DESC、昇順：ASC）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/61bd7150-7269-3b8d-42ca-c709be6f4d55.png)

※設定手順1で既存のUser Preferenceレコードがなかった場合は、Valueがテーブル名.db.order、テーブル名.db.order.directionとなるレコードを新規作成します。
また作成時にはUserの値は空、Systemにチェックが入った状態で送信します。

#### 4.設定確認
他のユーザー（まだ並び順を設定したテーブルにアクセスしたことがないユーザー）で設定したテーブルのリストを開きます。
想定通りの結果となっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/cde873c0-178a-9647-d278-62e2a941cdc9.png)


### モジュール設定
モジュールで属性値を設定することで並び順を設定することも可能です。
その場合、モジュールからリストを開くたびに並び順が適用されるため、ユーザーが個別に並べ替えを行った場合でも、再度リストを開いた際にはリセットされます。

#### 1.該当のモジュールを開く
アプリケーションメニューより
System Definition > Modules を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/367c5171-fe3e-98b3-1213-2e0a47b04377.png)

該当のモジュールを開きます。（今回はIncidentのAllモジュールに対して並び順を設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/f5f8c0d2-6097-e9d6-3793-878122c6ccd3.png)

今回の例では以下のように設定します。
優先度(priority)の降順

#### 2.属性値の設定
Moduleレコードを開いたら、Link Typeタブ内のArgumentsという項目に以下のように値を設定します。
昇順場合：&sysparm_order=フィールド物理名 &sysparm_order_direction=asc
降順場合：&sysparm_order=フィールド物理名 &sysparm_order_direction=desc

設定したらModuleを更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/a242d104-f251-39f3-add2-c1070c0656e5.png)

#### 3.設定確認
他のユーザー（まだ並び順を設定したテーブルにアクセスしたことがないユーザー）で設定したテーブルのリストを開きます。
想定通りの結果となっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1984141/ff51da62-6526-2505-d8bf-34eafa26cf96.png)
EraserはMermaid + ChatGPTで実現できる

## はじめに

最近、Eraserというツールが注目を集めています。Eraserは、自然言語プロンプトを使用して図やフローチャートを生成できるAIツールです。この記事では、Eraserの概要と、MermaidとChatGPTを組み合わせてEraserの機能を実現する方法について解説します。

## Eraserについて

Eraserは、以下のような特徴を持つAIツールです：

- **自然言語プロンプト**：テキスト入力だけで図表やフローチャートを生成。
- **多様な図表**：クラウドアーキテクチャ図、データベース図、ワークフロー図などを作成可能。
- **共同編集**：チームメンバーとリアルタイムで共同編集が可能。
- **無料プラン**：基本的な機能を無料で利用可能。(無料版は利用制限はあります)

### ユースケース

Eraserは、エンジニアの要件定義や設計で使用する図を作成する際に便利かなと考えています。

- **要件定義**：プロジェクトの初期段階で、システムの全体像を視覚的に把握。
- **設計**：データベースのER図やシーケンス図を簡単に作成。

### 使用例

#### 使用プロンプト
```
    ## 要望
     画面遷移設計をしたい。
     画面遷移のフローを生成したい。
     日本語で生成してほしい。

    ## 環境
     iOSアプリ、androidアプリ

    ## アプリ内容
     メッセージングアプリ
```

#### 追加プロンプト（上記プロンプト入力後に以下プロンプトを入力しました）
```
    友達追加の機能を追加して
```

#### 生成結果
![diagram-export-2024-6-7-15_02_57-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451684/a3f858f8-8e4a-2166-28ab-4ce149e3b112.png)


### 感想
使用例に記載した内容で簡単にプロトタイプは生成できるので、生成された図にプロンプトで指示するもしくは、手で修正する事で、図の作成を効率化できると思いました。しかし、APIの使用や10回以上のプロンプトによる生成は有料となってくるので、使うなら有料前提になってくる気がしました。

## Mermaid+ChatGPTについて

Mermaidは、Markdownテキストでグラフを作成できるダイアグラムツールです。MermaidとChatGPTを組み合わせることでEraserと同じような事が出来ると考えています。

### Mermaidの記法

Mermaidの記法は非常にシンプルです。以下は、基本的なフローチャートの例です：

```
flowchart LR
    A[Start] --> B{Is it working?}
    B -->|Yes| C[Great]
    B -->|No| D[Fix it]
```

### Mermaid Live Editorの使い方

Mermaid Live Editorを使用すると、リアルタイムでMermaidの図を編集・プレビューできます。以下の手順で使用できます：

1. [Mermaid Live Editor](https://mermaid.live)にアクセス
2. `Code`パネルにMermaid記法を入力
3. `Preview`パネルでリアルタイムに図を確認
4. `Actions`セクションからPNGやSVG形式でエクスポート可能

詳細な使い方は、[Mermaid User Guide](https://mermaid.js.org/intro/getting-started.html)を参照してください。

### ChatGPT+Mermaidを使用する手順

MermaidとChatGPTを使用してEraserと同等の機能を実現するための手順を記載します。

#### 手順
1. ChatGPTにMermaid記法で図を出力するようプロンプトを入力（使用したサンプルは以下です）
```
## 要望
画面遷移設計をしたい。
画面遷移のフローを生成したい。
日本語で生成してほしい。
Mermaid Live Editor形式で出力してほしい。

## 環境
iOSアプリ、androidアプリ

## アプリ内容
メッセージングアプリ
```
2. 1で出力されたコードをMermaid Live Editorの`Code`に貼り付け
3. 内容を確認しプロンプトを修正
4. `Actions`セクションからエクスポート

#### 生成結果
![mermaid-diagram-2024-06-10-185239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451684/4eb992e3-c7cd-41b9-a738-9289a9e3f9b9.png)


### 感想
Eraserと同等の機能は実現できたのではないかと思います。こちらはAPIがオンライン上で提供されていないので、API利用したい場合は、自サーバーで実現する必要性があります。ただ、お金がかからないメリットを加味するとこちらでも全然問題ないのではと思いました。

## まとめ

Eraserは、非常に強力な図表生成ツールとなっていますが、MermaidとChatGPTを組み合わせることで、同等の機能が実現できました。この記事で紹介した方法を活用して、効率的に図表を作成し、プロジェクトの要件定義や設計をスムーズに進めるのに役立つと考えています。もし、Eraserに注目されている方がいらっしゃれば、Mermaid + ChatGPTも視野に入れてみてはいかがでしょうか？
ベクトル化の基本を学ぶ

# ベクトル化とは何か

ベクトル化とは、文章や画像などのデータを、数字の羅列である「ベクトル」に変換する技術です。ベクトルは、向きと大きさを持ち、まるで地図上の矢印のようなものです。

例えば、「猫」という単語をベクトル化すると、以下のような数値の羅列になります。
```
[0.8, 0.2, -0.1, 0.7, ...]
```
これらの数字は、「猫」という単語が持つ様々な特徴を表しています。例えば、最初の0.8は、「猫」が動物であることを示し、0.2は「猫」が小さいことを示している可能性があります。

# なぜベクトル化を使うのか

ベクトル化を使う理由は、主に以下の3つです。

1. 情報の処理と分析を容易にする
ベクトルの形に変換することで、コンピュータが情報をより効率的に処理し、分析することができます。
2. 類似性の判断
ベクトルの間の距離を計算することで、データ間の類似性を判断することができます。例えば、「猫」と「犬」のベクトルを比較することで、2つの単語が似ているかどうかを判断することができます。
3. 機械学習への活用
ベクトル化されたデータは、機械学習モデルの学習に利用することができます。機械学習モデルは、ベクトル間の関係を学習することで、様々なタスクを実行することができます。
# ベクトル化はどう動くのか
ベクトル化には、様々な方法があります。代表的な方法を2つご紹介します。
* Bag of Words (BoW): 文章中の単語を出現頻度に基づいてベクトル化する方法です。各単語に固有のIDを割り当て、その単語が出現するごとにIDに対応する要素の値を1増やしていきます。
* Word Embedding: 単語の意味や文脈を考慮してベクトル化する方法です。代表的な手法として、Word2VecやGloVeなどが挙げられます。これらの手法は、単語間の共起関係に基づいて、各単語にベクトルを割り当てます。
Credential期限切れ対応

# iOS開発時のCredential期限切れ対応

２台のMacで開発していて、期限切れたときの対応方法を忘れるのでメモ。
キーチェーンからP12ファイルを出力出来なかった（グレーアウトで選択できなかった）が、XCODEからやると出来た。

基本の流れは他サイト参考に。
例えば
https://kingmo.jp/kumonos/ios-certificate-profile-renewal/#google_vignette

## やり方

 1. メインのMacでリクエストファイルを作成
 1. デベロッパーサイトで新しいCertificateを作成
 1. CERファイルをダウンロードしてダブルクリックして導入
 1. 【ここから】xcodeを立ち上げてXcode->setting->Accounts->ManageCertifigates...
 1. 証明書を右クリックしてExport
 1. パスワード入力して保存
 1. ２台目のMacにcerとp12をコピーして、ダブルクリックで導入

 とりあえず、これでどちらのMacでも新しいプロビジョニングプロファイルが使えるようになる。

 CERだけ入れて、P12を入れないとエラーが出る。（メッセージは忘れた）
【ChatGPT】ChatGPT-4o を使って、登壇資料・スライドを作る

## はじめに
私ごとですが、実は、ここ数ヶ月毎月1回以上登壇しており、だんだんと登壇準備のやり方が固まりつつあります。
そのため、この記事では、「ChatGPT-4o を使って、登壇資料・スライドを作る」やり方をまとめようと思います。

## 発表の準備プロセス
私の発表準備のプロセスは以下のようにしています。

1. 発表内容を考える
1. 発表原稿を作る
1. 発表練習をする ①
1. スライドを作る
1. 発表練習をする ②
1. 資料を公開する
1. 発表

このプロセスでChatGPT-4oを使っているのは、「**1. 発表内容を考える**」「**2. 発表原稿を作る**」と「**4. スライドを作る**」です。

### 発表内容を考える
発表内容を考える時に気をつけているのは以下の3点です。

+ 自分が話せる内容になっているか
+ イベントのテーマに沿った内容になっているか
+ 聞いている人が興味の出る内容になっているか

そのため、以下のようなプロンプトを書き、ChatGPT-4oと一緒に発表内容を考えます。

```html
この度、〇〇〇というイベントに登壇することになりました。
このイベントの概要は以下の通りです。

---

<!-- イベント概要（connpass等の文を丸コピする） -->

---

このイベントに登壇するにあたって、以下のテーマの中から話そうと思っています。

- テーマ１
    - タイトル ①
    - タイトル ②
<!--
自分が話せそうなテーマをテーマごとに列挙する

- 例） アクセシビリティ
    - ダークテーマとアクセシビリティの融合したカラートークンの設計
    - 小さく始めるQiitaでのアクセシビリティの取り組み
    - ...
-->

この中で、以下の観点から、これらをすこし厳しめに評価してください。
もしこの中でめぼしいテーマがなければ、聞いている人が興味みの出るようなテーマを10個提案してくだい。

- イベントのテーマに沿った内容になっているか
- 聞いている人が興味の出る内容になっているか

また、評価・提案する中で、わからないこと・知りたいことがあれば、聞いてください。
```


### 発表原稿を作る
発表内容が決まったら、次は原稿を作っていきます。

原稿を作る時に気をつけているのは、以下の2点です。

- 論理的でわかりやすい説明になっているか？
- 発表時間を有効に活用できているか？

<br>
発表原稿を作る時にChatGPT-4oは以下のタイミングで使います。

- 続きの文を提案してほしい時
- 言い回しが微妙でしっくりこない時
- 発表原稿を評価・校正してほしい時

```html
<!-- 続きの文を提案してほしい時 -->
以下の文に続く文章を口語の文で考えてください。

<!-- 考えた台本の途中 -->
```

```html
<!-- 言い回しが微妙でしっくりこない時 -->
「<!-- しっくりこない文 -->」の言い換えを考えて、1０個提案してください
```

```html
<!-- 発表原稿を評価・校正してほしい時 -->

以下の発表原稿を少し厳しめに評価し、原稿を口語の文で校正し、変更差分をわかりやすく提案してくだい。

<!-- 考えた台本 -->
```

### 発表練習をする ①

発表原稿ができたら2~3回練習し、以下の点を確認します。

- 発表が時間内に収まるのか
- 言い回しに違和感がないか

### スライドを作る
ここまできたら、ようやくスライドをFigmaで作っていきます。

まずは、発表原稿のテキストをそのままスライドにコピーする形で、必要なスライドを決めます。

イメージは以下の通りです。
![テキストだけのスライドが複数枚並んでいる。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/27d757fe-8b22-cb1f-a574-3d00b08a7d66.png)

その後、スライドをデザインしていきます。
デザインしていく中で、必要な画像や画像で表しにくい表現などをChatGPT-4oで生成してもらいます。

```html
<!-- 画像や画像で表しにくい表現を画像で表現してほしい時 -->
〇〇のイメージをシンプルなイラストで表現してください
```


### 発表練習をする ②
スライドができたら、スライドを見ながら、練習していきます。

この時は、できるだけ本番に近い状態を再現して、練習します。

### 資料を公開する
基本的に作った資料は、Speaker Deckにて公開します！

https://speakerdeck.com/degudegu2510/

### 発表
発表をします。

聞いている人の反応を見つつ、発表します。

## まとめ
この記事では、「ChatGPT-4o を使って、登壇資料・スライドを作る」やり方をまとめました。
登壇される方の参考になればと思います。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
User-AgentのMozilla/5.0の意味と歴史的背景

# User-agentのMozilla/5.0の意味と背景

ウェブ開発をしていると、アクセスログなどでUser-agent文字列に「Mozilla/5.0」という部分を見かけることが多いです。しかし、なぜこのような表記が使われているのか、疑問に思ったことはありませんか？私は初め見た時に全部「Firefox」に誤認されているのか？と思っていました。
今回は、この「Mozilla/5.0」の意味とその歴史的背景についてわかりやすく解説します。

## User-agentとは？

まず、User-agent（ユーザーエージェント）について簡単に説明します。User-agentは、ウェブブラウザや他のクライアントソフトがウェブサーバーにリクエストを送る際に、自身の情報を伝えるための文字列です。この情報には、ブラウザの種類やバージョン、対応している技術（レンダリングエンジンなど）が含まれています。

## なぜ「Mozilla」？

### MosaicとNetscapeの時代

1990年代初頭、最初の人気あるウェブブラウザとして「Mosaic」が登場しました。その後、Mosaicの開発者たちが新たに「Netscape Navigator」を開発しました。Netscapeは当時のウェブブラウザ市場を席巻し、そのUser-agent文字列は「Mozilla/1.0」から始まっていました。「Mozilla」という名前は、「Mosaic killer（Mosaicを打ち負かすもの）」という意味合いから来ています。

### ブラウザ戦争と互換性

1990年代後半になると、Netscape Navigatorに対抗する形でMicrosoftが「Internet Explorer（IE）」をリリースしました。当時のウェブサイトは、Netscape用に最適化されていることが多く、IEはその互換性を保つために自らを「Mozilla」と名乗る必要がありました。これにより、IEはNetscape用に設計されたページを正しく表示することができました。

その結果、User-agent文字列の先頭に「Mozilla」と付けることが業界標準となり、他のブラウザもこれに倣いました。

### 「Mozilla/5.0」の登場

「Mozilla/5.0」は、Netscapeのバージョン5を指しますが、実際にはNetscape 6がこのバージョン番号を使っています。これは、Netscape 5のリリースがキャンセルされ、次のバージョンとしてNetscape 6が登場したためです。このとき、User-agent文字列の一部として「Mozilla/5.0」が使われました。

その後、Mozilla Foundationによって開発されたFirefoxや他のブラウザ（例えば、Google ChromeやSafari）も、互換性のためにこの「Mozilla/5.0」をUser-agent文字列に含めるようになりました。

## User-agentの例

以下に、いくつかの代表的なブラウザのUser-agent文字列を示します：

- **Firefox**:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0

- **Google Chrome**:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36

- **Safari**:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15

## まとめ

「Mozilla/5.0」というUser-agent文字列は、ウェブブラウザの歴史と互換性の名残から来ています。Netscape Navigatorの成功と、その後のブラウザ戦争を経て、この形式が広く採用されるようになりました。現在でも、多くのブラウザが互換性を保つためにこの伝統を引き継いでいます。

この背景を理解することで、User-agent文字列の読み解き方やブラウザの互換性に関する知識を深めることができるでしょう。
【mysql8.0】ERROR 1406 (22001): Data too long for column '?' at row 1を無視したい

## はじめに

mysqlにデータを挿入or更新するとき、たまに更新しようとした値が長すぎて怒られることがある

```
SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column '?' at row 1 (Connection: mysql, SQL: update `?` set `?` = とっても長いメッセージ
```

長いデータを入れてごめん。だけど処理を中断しないでくれ。このデータの内容がすべて入っているかどうかは重要じゃないんだ。長い分を切り落として処理を続けてくれよ。をしたかった。

## 環境

mysql(8.0.37)

## 解決法

### デフォルトでONになっている`STRICT_TRANS_TABLES`をオフにする

以下手順

デフォルトでオンになっている項目を確認

```
mysql> SELECT @@GLOBAL.sql_mode;
+----------------------------------------------------------------------------------------
-------------------------------+
| @@GLOBAL.sql_mode                                                                      
                               |
+----------------------------------------------------------------------------------------
-------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_
BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------
-------------------------------+
```

私の場合は以下の設定が有効の状態(8.0のデフォルトの状態)

- ONLY_FULL_GROUP_BY
- STRICT_TRANS_TABLES
- NO_ZERO_IN_DATE
- NO_ZERO_DATE
- ERROR_FOR_DIVISION_BY_ZERO
- NO_ENGINE_SUBSTITUTION

表題の例外を投げるのはSTRICT_TRANS_TABLESなので、それをオフにする

```
mysql> SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```

一応確認

```
mysql> SELECT @@GLOBAL.sql_mode;
+---------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                 |
+---------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------------------------------------------------------------------------------------------+
```

STRICT_TRANS_TABLESだけオフになっていることを確認

## STRICT_TRANS_TABLESとは

https://dev.mysql.com/doc/refman/8.0/ja/sql-mode.html#sql-mode-strict

> **厳密な SQL モード**
> 厳密モードでは、最大キー長を超えるキーを作成しようとするとエラーが発生します。 厳密モードが有効になっていない場合、これにより警告が発生し、キーが最大キー長に切り捨てられます。

というわけで、これをオフにすれば処理を中断せずに入りきらない部分を切り捨てて入れてくれるようになる
Javaの基礎的な備忘録1

# メンバとは
クラスには属性を表す変数と、
操作を表すメソッドを定義します。
この`クラスに用意した変数やメソッドを総称してメンバと呼びます`。

メンバ変数
メンバ変数とはクラス定義の中で下記の部分です。
クラス定義をしている"{"と"}"の中に記述され、そしてメソッドの外に記述されている変数のことです。
```Java
class Television{
  /**これ*/
  int channelNo;
  String name;
  //クラスの中にあり、メソッドの外にある
  

  void setChannel(int newChannelNo){
    channelNo = newChannelNo;
  }

  void dispChannel(){
    System.out.println("現在のチャンネルは " + channelNo + " です");
  }
}
```

では、メンバ変数に直接値を格納するのを禁止し、必ずメソッド経由でしかメンバ変数の値を格納したり参照したり出来ないようにするにはどうすればいいでしょうか。そういった場合はメンバ変数の定義をする時に先頭に「private」を付けるようにします。
```Java
class Television{
  private int channelNo;
```

  2つめのclassはstaticを付けない。

thisはインスタンスを指す。this.nameだとインスタンス変数に代入する。


# 修飾子
## static装飾子
classのメンバにstaticを付けると、
`クラスをインスタンス化しなくてもアクセス出来るようになります`
このようなものを静的メンバと呼ぶ。

```Java
public class A{
     static String hoge = "静的フィールド";
     static void foo(){
        System.out.print("静的メソッド");
     }
}

public static void main(String[] args){
    System.out.println(A.hoge);
    A.hoo();
//インスタンス化しなくても、呼び出すことが可能
//new Aしなくても呼べる
}
```

注意点：
静的メソッドからはthisにはアクセスできない
静的メソッドはインスタンスではないので、
`インスタンスを示すthisには当然アクセス出来ない`


静的フィールドはインスタンスフィールドとは違い、内容を変更した場合
全てのインスタンスに影響を及ぼします。(グローバルな変数みたいなことかな)
静的フィールドの濫用や使用はクラスとの間の`依存性が強くなり`、結果可読性が悪くなります。
一般的には静的フィールドは`読み取り専門`の用途で利用することをオススメします。
読み取り専用で使いましょう！

また、むやみに変数をstaticにしてはいけません。依存性が強くなるので。
Human classでage変数を作る時、
static ageだと全員年が共通になってしまったりするので。。


参考：
https://java-code.jp/130


## 変数

```Java

//型 変数名 ;

int number;
String name;


int number = 1;
String name = "test";

//クラスで定義した型
MovieType movie = new MovieType<>();

List<MovieType> movies = new ArrayList<MovieType>();
//MovieTypeエンティティが入ったリストの作成が可能に
//movies[0]の中にはmovie.nameやmovie.numberなどで取り出せる(定義していればね)

```

## 独自のClassの作成

https://chibicat.hatenablog.jp/entry/2018/04/07/023155


# データ
## 配列
配列とlistはjavaでは別。
要素数を最初に指定して作る。後で要素数を追加は基本無理なので定数みたいなもんかな。
System.arraycopy()を使えば疑似的に増やすことは可能。
あんまり使わないみたいですね。

配列変数名は複数形が基本
```Java
//型[]配列名;
//配列名 = new 型[要素数];
String[]arrays1 = new Arrays[3];
//初期値を入れてない場合は0がデフォルト値になる感じかな。

//初期化
//型[]配列名 = {代入する値1,代入する値2};
String[]arrays1 = {"1","2"};

//指定した値で全て埋めるにはArray.fill(変数名,埋める値);
Array.fill(arrays,0)
```




## List
要素を後から追加が可能！

・要素の取得が早いが、挿入や削除が遅いArrayList
・要素の取得は遅いが、挿入や削除が早いLinkedList

```Java
//List<型> リスト名  = new ArrayList<型>();
List<String> list1 = new ArrayList<>();
//<>は左辺で型を宣言しているため、型の省略が可能

//リスト名.add(値)
//リスト名.set(書き換えたいindex,書き換える値)
//リスト名.get(取得したいindex)
list.add("1");
list.set(1,"3");
list.get(1);
```

## 配列とListの違い：
・配列
最初の時点で要素数が確定している
何度もピンポイントな要素にアクセスする場合

・List
要素の入れ替えが多い場合
後から追加する必要がある場合



## Map
インデックスに名前を付けられるMap
key,valueのやつ

・HashaMap
・LinkedMap
・TreeMap

```Java
//Map<キーの型,値の型> マップ名 = new HashMap<キーの型,値の型>();
Map<Integer,String> map1 = new HahsMap<>();

//マップの代入
//マップ名.put(キー,値)
//取得
//マップ名.get(キー)
map1.put(1,"a");
map1.get(1);
```
Mapは通常「HashMap」を使います。他には「LinkedMap」「TreeMap」があります。



https://tech-blog.rakus.co.jp/entry/20220630/java
[Rails7]submitにつけるdisable_withオプションについて

## はじめに

Rails7以前までは[[Rails]submitタグにつけておきたいdisable_withオプション](https://qiita.com/sue738/items/09f569bdc3a73d26df88)の記事にあるように、data属性に`disable_with`を付与すれば、二重送信が防止できておりました。

```slim
= form_with(model: model) do |form|
  = form.submit '登録', { data: { disable_with: '登録中・・・' }
```

ですが、Rails7移行では、`disable_with`オプションが機能しなくなっているので、どのように実現したかを残しておきます。

## どう変わったのか

[Rails 7.0 + Ruby 3.1でゼロからアプリを作ってみたときにハマったところあれこれ
](https://qiita.com/jnchito/items/5c41a7031404c313da1f#disable_with%E3%81%AE%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95%E3%81%8C%E5%A4%89%E3%82%8F%E3%81%A3%E3%81%9F)の記事にある通り、クラスで`登録`を`登録中・・・`の表示を切り替えています。

[turboのPR](https://github.com/hotwired/turbo/pull/386)を覗いて見てもあんまり親切じゃないです。

## サンプル

では、どのように二重送信を防止するかのサンプルです。

```some_form.html.slim
= form_with(model: model, data: { controller: 'form', action: 'submit->form#disableSubmitter' }) do |form|

  button.submit_button data-form-target='submitter'
    span.show-when-enabled 登録
    span.show-when-disabled 登録中・・
```

```application.tailwind.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/* 送信ボタン disabled 切り替え */
button {
  .show-when-disabled {
    @apply hidden;
  }

  .show-when-enabled {
    @apply inline;
  }
}

button:disabled {
  .show-when-disabled {
    @apply inline;
  }

  .show-when-enabled {
    @apply hidden;
  }
}
```

```form_controller.js
import { Controller } from "@hotwired/stimulus";

export default class extends Controller {
  static targets = ["submitter"];

  disableSubmitter() {
    this.submitterTarget.disabled = true;
  }
}
```

formをsubmitするときに`disableSubmitter`を呼び、`submitter`のdisabedを`true`にしています。

BE側のバリデーションのみの場合はこちらで機能します。

## フロント側でバリデーションをする場合

FE側でもバリデーションをする場合は少し工夫が必要です。

```some_form.html.slim
= form_with(model: model, data: { controller: 'form', action: 'submit->form#disableSubmitter' }) do |form|

  button.submit_button data-form-target='submitter'
    span.show-when-enabled 登録
    span.show-when-disabled 登録中・・
```

view側は同じです。

```form_controller.js
import { Controller } from "@hotwired/stimulus";

export default class extends Controller {
  static targets = ["submitter"];

  disableSubmitter() {
    this.submitterTarget.disabled = true;

    if (!this.validateForm()) {
      event.preventDefault(); // フォーム送信をキャンセル
      this.submitterTarget.disabled = false;
    }
  }

  validateForm(){
    // some validations
  }
}
```

バリデーションが`false`の場合は、フォームの送信をキャンセルし、`submitter`のdisabledを`false`にし、再度submitできるようにしています。

## まとめ

Rails7でFormの二重送信防止方法を紹介しました。
これまで通り`disable_with`で二重送信防止ができると思っていたら、実はできていなかった...。
そんなことにならないように、一役立てれば幸いです。

## 参考

https://qiita.com/sue738/items/09f569bdc3a73d26df88

https://qiita.com/jnchito/items/5c41a7031404c313da1f

https://github.com/hotwired/turbo/pull/386
Gmail の"+"や"."などのエイリアス

# Gmailのエイリアス機能を使いこなそう

Gmailでは、メールアドレスに+や.を使ってエイリアスを作成することができます。この機能を活用することで、さまざまな場面で便利に使うことができます。今回は、Gmailのエイリアス機能についてわかりやすく説明します。

## Gmailのエイリアスとは？

Gmailのエイリアス機能とは、同じメールアドレスを異なる形で表現する方法です。具体的には、以下の2つの方法があります：

1. **ドット（.）を使う**
2. **プラス（+）を使う**

## ドット（.）の活用方法

Gmailのメールアドレスには、ドット（.）をどこに挿入しても同じアドレスとして扱われます。

例えば、以下のメールアドレスはすべて同じメールボックスに届きます：

- example@gmail.com
- ex.ample@gmail.com
- e.x.a.m.p.l.e@gmail.com

この機能を活用することで、メールアドレスをわかりやすく区切ったり、異なるサービスで微妙に異なるメールアドレスを登録したりできます。

## プラス（+）の活用方法

Gmailでは、メールアドレスのユーザー名部分にプラス（+）を挿入し、その後に任意の文字列を追加することができます。例えば、`example@gmail.com`というアドレスを持っている場合、以下のようにエイリアスを作成できます：

- example+newsletter@gmail.com
- example+shopping@gmail.com
- example+work@gmail.com

この機能を利用することで、特定の目的ごとにメールアドレスを使い分けることができます。

### 利用例

1. **フィルタリング**：異なるプラスエイリアスを使用してメールを受け取り、Gmailのフィルタ機能を使って自動的にラベルを付けたりフォルダに振り分けたりすることができます。
2. **スパム対策**：特定のサービスに登録する際にプラスエイリアスを使用し、その後にスパムが増えた場合にそのエイリアスをブロックすることで、スパムを簡単に管理できます。
3. **トラッキング**：どのサービスからのメールかを簡単に識別できるため、どのエイリアスが流出したかを特定することができます。
4. **WEBサービスの複数アカウント作成**：エイリアスを使えば実質一つのメールアドレスで複数アカウントの作成が可能です。わざわざ新しいメールアドレスを作成しなくても検証などにすぐ使えます。ただし利用規約やプログラムなのでエイリアスのメールアドレスの登録が禁止されているものもありますので注意しましょう。
例: 以下のようにアカウントごとに分割可能
- example.sns+account1@gmail.com
- example.sns+account2@gmail.com

## エイリアス機能の設定方法

エイリアス機能は、特別な設定をすることなく、そのまま利用できます。ただし、フィルタリングなどの追加機能を利用する場合には、Gmailの設定からフィルタを作成する必要があります。

### フィルタの作成手順

1. Gmailの右上にある歯車アイコンをクリックし、「設定」を選択。
2. 「フィルタとブロック中のアドレス」タブを開き、「新しいフィルタを作成」をクリック。
3. フィルタを作成する条件として、プラスエイリアスを入力（例：`example+newsletter@gmail.com`）。
4. フィルタのアクションを設定（例：特定のラベルを付ける、アーカイブする、削除するなど）。

## まとめ

Gmailのエイリアス機能を活用することで、メールの管理がより簡単かつ効率的になります。ドットやプラスを使ったエイリアスを駆使して、フィルタリングやスパム対策、トラッキングなどに役立ててみてください。

## 参考URL
- https://support.google.com/mail/community-guide/257098940
- https://support.google.com/mail/answer/7436150
【Neovim】プライグインを自作しました！

## どんなのか

InsertModeでカーソルが囲い文字(`'`,`"`,`(`,`)`,`{`,`}`,`[`,`]`)の中にあるとき、`<C-CR>`で囲い文字の外に出ることができます。
また、囲い文字の中にいない時に`<C-CR>`を実行すると、次に現れる囲い文字の中に入ることができます。

リポジトリはこちら

https://github.com/ysmb-wtsg/in-and-out.nvim

## なぜ作ったか

みなさんInsertModeで囲い文字の中にいる時、どうやって囲い文字の外に出ますか？

- NormalModeに戻って`w`
- 同じ囲い文字を打つ

などなどかなと思います。
私はこれが非常に煩わしく感じていました。

というのも、まず前者についてはNormalModeを経由しないといけないのが面倒。後者については、カーソルがいる囲い文字に合わせていわば**ステートフルな入力**を求められることになります。また、JIS配列のキーボードの場合だと、囲い文字はとっ散らかっていてタイプが少々手間です。

なので
**ステートレスな入力で囲い文字の外に出たいな〜**
と思ってました。

本プラグインはそれを実現したプラグインとなっております！

## 最後に
~~今はまだとりあえず動いたものを公開してる状態なので、`setup()`が未定義の状態です。本来はそのオプションでキーマップの指定や囲い文字の指定ができるようにしたいです。
そのあたりについては今後整備していこうかなーと思っていますので、是非使ってみてやってください！~~
プラグインを使ってくれている方がPRしてくれました！他人が勝手にアプデしてくれるの最高かよ…

では、良いvimライフを！！
Salesforceカスタムレポートタイプ作成のレポートデフォルト設定

本橋孝昭です

カスタムレポートタイプで作成するレポートのデフォルト設定について調査しました

カスタムレポートタイプのデフォルトの設定をすれば

・項目の配置
・デフォルトで表示される項目
・日付絞り込みの並び順

が設定可能です。


## 設定方法

カスタムレポートタイプの「レイアウトを編集」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f76c99d0-cea4-5068-463c-73748f07dcfc.png)

こちらから
・項目の並び
・デフォルトで選択
の設定が可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/62a29ff1-9d8c-2ebe-4efc-7889c6122d6e.png)



こちらの「デフォルトで選択」をクリックして保存したらどうなるか


カスタムレポートタイプでレポートで作成する際

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0585cb3a-b403-5c9b-779c-e741a0286318.png)


最初に表示される項目が「デフォルトで選択」をクリックした状態になります
並び順は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6de867ab-660d-393e-dd7b-45296cb0ae77.png)

並び順は先ほどの並びと同じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/62a29ff1-9d8c-2ebe-4efc-7889c6122d6e.png)

また、項目選択画面も並び順と同じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ac5d715e-8935-d2e9-0b74-a4fceb6aa11d.png)


デフォルトのレポート絞り込み条件の日付項目の並び順も先ほどのカスタムレポートタイプの並び順と同じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/69bbfb80-0eb0-bb9f-c342-45cb7377b913.png)


レポートでよく使う項目が決まっている場合、
カスタムレポートタイプを編集して項目の並び順を変えることをお勧めします
静的アドレス

~~~~
AWSTemplateFormatVersion: '2010-09-09'
Description: SSMエンドポイント設定と静的IPアドレスの振り方

Resources:
  MyVPCEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties: 
      VpcId: vpc-xxxxxxxx  # VPCのIDを指定
      ServiceName: com.amazonaws.region.ssm  # リージョンを指定 (例: us-west-2)
      VpcEndpointType: Interface
      SubnetIds: 
        - subnet-xxxxxxxx  # SubnetのIDを指定
        - subnet-yyyyyyyy
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - sg-xxxxxxxx  # セキュリティグループIDを指定
      IpAddressType: ipv4  # IPアドレスの種類を指定

  MyNetworkInterface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId: subnet-xxxxxxxx  # SubnetのIDを指定
      PrivateIpAddress: 10.0.0.100  # 静的IPアドレスを指定
      Description: 'Network Interface for SSM Endpoint'
      GroupSet:
        - sg-xxxxxxxx  # セキュリティグループIDを指定

  MyVPCEndpointNetworkInterface:
    Type: AWS::EC2::VPCEndpointNetworkInterfaceAttachment
    Properties:
      NetworkInterfaceId: !Ref MyNetworkInterface
      VpceId: !Ref MyVPCEndpoint

Outputs:
  VPCEndpointId:
    Description: VPC Endpoint ID
    Value: !Ref MyVPCEndpoint
  NetworkInterfaceId:
    Description: Network Interface ID
    Value: !Ref MyNetworkInterface
    ~~~~
静的ip

AWSTemplateFormatVersion: '2010-09-09'
Description: SSMエンドポイント設定と静的IPアドレスの振り方

Resources:
  MyVPCEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties: 
      VpcId: vpc-xxxxxxxx  # VPCのIDを指定
      ServiceName: com.amazonaws.region.ssm  # リージョンを指定 (例: us-west-2)
      VpcEndpointType: Interface
      SubnetIds: 
        - subnet-xxxxxxxx  # SubnetのIDを指定
        - subnet-yyyyyyyy
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - sg-xxxxxxxx  # セキュリティグループIDを指定
      IpAddressType: ipv4  # IPアドレスの種類を指定

  MyNetworkInterface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId: subnet-xxxxxxxx  # SubnetのIDを指定
      PrivateIpAddress: 10.0.0.100  # 静的IPアドレスを指定
      Description: 'Network Interface for SSM Endpoint'
      GroupSet:
        - sg-xxxxxxxx  # セキュリティグループIDを指定

  MyVPCEndpointNetworkInterface:
    Type: AWS::EC2::VPCEndpointNetworkInterfaceAttachment
    Properties:
      NetworkInterfaceId: !Ref MyNetworkInterface
      VpceId: !Ref MyVPCEndpoint

Outputs:
  VPCEndpointId:
    Description: VPC Endpoint ID
    Value: !Ref MyVPCEndpoint
  NetworkInterfaceId:
    Description: Network Interface ID
    Value: !Ref MyNetworkInterface
tree  commandについてまとめてみた。



## はじめに
tree commandに関しての備忘録。

## 🦁<INS>**結論**</INS>🦁
ディレクトリ構造を誰かに伝えたかったり、自身で把握したい時に使う。

## <INS>**treeとはこんなやつ。**</INS>
```py
.
├── .env
├── .gitignore
├── archive
├── installer
│   ├── bin
│   └── src
├── test
│   └── test.process.py
```

よく見たことあったが素晴らしいツールだと思った。

:::note info
押さえておくべき点
* オプションによって特定のディレクトリを表示できる
* 隠しフォルダもオプションによって表示できる
* オプションによって階層を制限できる
* オプションによって特定のファイルなどを非表示できる
* 結果をテキストに出力できる
:::  
***

:::note warn
利用シーン
* ディレクトリ構造を誰かに教える時
* ディレクトリ構造を見やすくしてわかりやすくしたい時
:::  
***

:::note alert
注意点
*  Macの場合は「brew」からinstall
* Linuxの場合は「sudo」からinstall
:::  

## <INS>**使用方法一覧**</INS>




## <INS>**基本**</INS>
これで表示できるディレクトリ全て表示。
```py
tree
```
※システムなども全て表示されてしまうだけに時間がかかったり、わかりにくくなる。

## <INS>**隠しフォルダを表示**</INS>

```py
tree -a
```


## <INS>**階層を厳選する**</INS>
階層2つまで表示
```py
tree -L 2
```


## <INS>**特定のファイルを除外**</INS>
```py
# .pycファイルを除外
tree -I "*.pyc"
```


## <INS>**ディレクトリのみ表示**</INS>

```py
tree -d
```


## <INS>**テキストに出力**</INS>

```py
tree -o tree_output.txt
```


## <INS>**複数のオプションを使う**</INS>

```py
# 隠しファイルを含め、2階層まで表示し、結果をファイルに出力
tree -a -L 2 -o tree_output.txt

# フルパス表示、特定のパターンを除外して表示
tree -f -I "*.pyc"
```


## <INS>**特定ののディレクトリを表示**</INS>

```py
tree /path/to/directory
```

## まとめ✍️
EC2を使うことでディレクトリ構造を確認するには必須のツールだと思う。
他にもいいツールはあるのだろうか？
【PostgreSQL】メタコマンド〜\s〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

[【PostgreSQL】メタコマンドを纏めていく](https://qiita.com/dai_chi/items/04f5339d54130f070671)

## \sとは

> psqlのコマンドラインの履歴を`*filename*`に出力します。 `*filename*`が省略された場合、履歴は標準出力に書き出されます(適切であればページャを使います)。 このコマンドは、psqlがReadlineサポートなしの状態でビルドされた場合は利用できません。
> 

[\sについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%82%AF%E3%83%AA%E3%82%A2%EF%BC%89%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%5Cs%20%5B%20filename%20%5D,-psql%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)

## 試してみた

過去の履歴も残っていることを確認できた

各ユーザー毎に.psql_historyが作られていてそのファイルに履歴は記録されているっぽい

```sql
# \s
~~~~ 省略 ~~~~

\s
```

ファイルに出力することもできる

```sql
# \s history.txt
```

## まとめ

実務の中で作業履歴を控えておくのですが、その際にずっとコピペをしてましたがたまに履歴を控えるのを忘れてしまうことがあったのでこれは知ることできてよかった。
日本への含有化学物質持ち込みアレコレ

# 製品を製造・販売、輸入される方へ

## 自分たちはメーカじゃないから関係ないと思っていませんか？
- 右から左へ流して一発屋ですか？
- 川上・川中・川下と自分の立ち位置を理解してやるべきことをやりましょう。

## 各国持ち込みできない化学物質がありますよ
- 政治的（紛争鉱物とか）
- 環境的（化審法、RoHS,REACH,POPS条約・・・などなど）
- 規格的（PSE、電波法など）
- 安全的（STマーク、GSマーク）

:::note info
インフォメーション
- すべての法令・指令が化学物質伝達のスキームがこっそり仕込まれている
- ただ、その目的は違ったりしますが
- 電波とか電気は物質じゃないんですけど、ご容赦を
:::

## 国際標準・規格・規制から自主規格までありますが、守れば安心

**主な法令・規則と化学物質比較表**

| 化学物質 | 化審法 (日本) | ROHS2 (EU) | REACH (EU) |
|:-:|:-:|:-:|:-:|
| フタル酸ビス(2-エチルヘキシル) (DEHP)  | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  |
| フタル酸ブチルベンジル (BBP)  |  0.1 wt% 以下 (製品中) | 0.1 wt% 以下 (製品中)  |  0.1 wt% 以下 (製品中) |
| フタル酸ジブチル (DBP)  | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  |
|  フタル酸ジイソブチル (DIBP) | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  |  0.1 wt% 以下 (製品中) |
| 鉛  | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  |
| 水銀  |  0.1 wt% 以下 (製品中) | 0.1 wt% 以下 (製品中)  |  0.1 wt% 以下 (製品中) |
| カドミウム  |  0.01 wt% 以下 (製品中) |  0.01 wt% 以下 (製品中) | 0.01 wt% 以下 (製品中)  |
|  六価クロム |  0.1 wt% 以下 (製品中) | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  |
|  ポリ臭化ビフェニル (PBB) | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  |  0.1 wt% 以下 (製品中) |
|  ポリ臭化ジフェニルエーテル (PBDE) | 0.1 wt% 以下 (製品中)  | 0.1 wt% 以下 (製品中)  |  0.1 wt% 以下 (製品中) |
|  PCBs（ポリ塩化ビフェニル） |  完全に禁止方向 | 規制対象外 |  使用制限 |
| ノニルフェノール  |  厳格な制限 | 規制対象外 | 使用制限  |
|  有機スズ化合物 | 製造・輸入原則禁止  |  規制対象外 |  使用制限   |
| PFOS（パーフルオロオクタンスルホン酸）  | 製造・輸入原則禁止  | 規制対象外  | 使用制限  |

:::note warn
警告
あくまで代表的な物質一覧で詳しくは各法令・指令参照のこと
:::

:::note alert
化審法
思ったより、罰則が厳しくなる物質がありますので、輸入しているだけとか侮らないこと
:::
 
# chemSHERPA

:::note info
インフォメーション
日本の経済産業省が主導して開発した化学物質管理ツールです。このツールは、サプライチェーン全体で化学物質情報を一元管理し、効率的に共有するために設計されています

:::

- chemSHERPAを日本の法令と勘違いする人多し
- 主要国の規制・指令の含有化学物質、法令の遵守を調査できるツール
- 扱っている化学物質伝達のフォーマットは正解標準（出てくるファイルは独自だけど・・・）


## ツールはどこで手に入るの？

https://chemsherpa.net/

# 設計を日本で行って海外製造・輸入している場合
- 問題が発生した場合は1法令の影響では済まされないことも
- 過去の公害問題などがいい例です。
- この点ではソフトウェア制作も物を置き換えれば通用するかと思います。

:::note info
インフォメーション
- 近々にGithubに輸入事業者向け案内資料をアップします。
- 本業がこれなのでコンサル的な事大歓迎！？

:::



# 執筆の参考にした記事

https://qiita.com/hkusu/items/847718366af992439b3f
組織のメールアドレス Organization Wide Email




+ [メールアラートの「差出人メールアドレス」を組織のメールアドレスに変更したが差出人が適用されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PelVO)
+ [Email Alert and Organization Wide Email](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epk2VSAQ)

:::note
[Organization-Wide Addresses do not immediately show up in Lightning User Interface](https://help.salesforce.com/s/articleView?id=000380464&type=1)

説明
When a new organization wide email address is created in Lightning Experience or Salesforce Classic it may not be immediately available to Users in Lightning but will be immediately available in Classic.

解決策
This is the expected behavior, the Classic user interface caches organization-wide addresses more often than  the Lightning Experience user interface.

The delay depends on how much data is stored in the organization and may range from 30 minutes to a several days. 

Classicで変更する
:::


+ [ 自動化プロセスユーザのメールアドレスが無効であるため、このフローでアクションまたはエラーのメールを送信できません。[設定] の [プロセスの自動化設定] ページの [自動化プロセスユーザのメールアドレス] でシステム管理者プロファイルの組織のメールアドレスを指定する必要があります。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBv99)

:::note
過去の回答では　組織のメールアドレスに変更したいメールアドレスを追加し再度お試しください　とありますね。

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


# リストメールの送信元に組織のメールアドレスを利用したい

テクサポ 日本 11月24日 18:20

■ 説明
Winter’23 から、リストメールを送信する時の送信元に組織のメールアドレスを利用することが可能になりました。
つまり、会社の代表メールアドレスなどを利用してリストメールを Salesforce から送り、より多くのお客様とつながることが可能です。
Winter’23 以前のバージョンでは Salesforce からリストメールを送信するユーザのメールアドレスのみ、送信元として利用が可能でした。

■ 注意事項
組織のメールアドレスとユーザ個人のメールアドレスの値が同一の場合、メールの送信元を選択するためのドロップダウンメニューが表示されません。
この機能をご利用いただくには、ユーザが組織全体のメールアドレスを使用できるか、Inbox または Einstein 活動キャプチャを通じて複数の接続済みアカウントを持っている必要があります。

# 権限セット

+ [権限セットで組織のメールアドレスを許可するには？](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MaduS)

:::note
「組織のアドレス」に「ユーザー選択およびデフォルトの No-Reply 用途の組織のメールアドレス」が存在しないと権限セットのみは機能しないことがわかりました。 

※ 「 デフォルトの No-Reply アドレス 」 とは別


「ユーザー選択およびデフォルトの No-Reply 用途の組織のメールアドレス」 の「組織のアドレス」を一つ追加してから、 
権限セット用の「組織のアドレス」をそれぞれ追加すると解決できると考えます。 
:::
【CakePHP5】CodeSnifferを使用する

# はじめに

こんにちは、エンジニアのkeitaMaxです。

前回PHPStanを使用してGitHubにPushしてテストを実行させるところを作成しました。

https://qiita.com/keitaMax/items/6e354b9a0b7c54344fa1

今回はCodeSnifferを使用できるようにしたいと思います。

# インストール

すでにインストールされているので、新しくなにかをインストールしなくても大丈夫です。

# 実行

以下のコマンドで実行します。

```
composer cs-check
```

以下のように実行されます。

```
root@4ab649b0155e:/app# composer cs-check
> phpcs --colors -p
.......... 10 / 10 (100%)


Time: 137ms; Memory: 14MB

root@4ab649b0155e:/app# 
```
# 失敗させて自動修正してみる

`AppController`の`initialize(): void`この記述を`initialize():void`このように半角スペースを消して実行してみます。

以下のようにエラーが出ます。
```
root@4ab649b0155e:/app# composer cs-check
> phpcs --colors -p
..E....... 10 / 10 (100%)



FILE: /app/src/Controller/AppController.php
-------------------------------------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
-------------------------------------------------------------------------------------------------------
 40 | ERROR | [x] There must be a single space between the colon and type in a return type declaration
 40 | ERROR | [x] There must be exactly one space between return type hint colon and return type hint.
-------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
-------------------------------------------------------------------------------------------------------

Time: 148ms; Memory: 14MB

Script phpcs --colors -p handling the cs-check event returned with error code 2
root@4ab649b0155e:/app# 
```

今度は以下のコマンドで自動修正をしてみます。

```
composer cs-fix
```

以下のように実行されます。

```
root@4ab649b0155e:/app# composer cs-fix  
> phpcbf --colors -p
..F....... 10 / 10 (100%)



PHPCBF RESULT SUMMARY
----------------------------------------------------------------------
FILE                                                  FIXED  REMAINING
----------------------------------------------------------------------
/app/src/Controller/AppController.php                 2      0
----------------------------------------------------------------------
A TOTAL OF 2 ERRORS WERE FIXED IN 1 FILE
----------------------------------------------------------------------

Time: 141ms; Memory: 14MB


Script phpcbf --colors -p handling the cs-fix event returned with error code 1
```

これで自動で修正されました。この状態で再度CodeSnifferで解析してみます。

```
root@4ab649b0155e:/app# composer cs-check
> phpcs --colors -p
.......... 10 / 10 (100%)


Time: 145ms; Memory: 14MB

root@4ab649b0155e:/app# 
```

エラーがなくなっていて、自動修正が動いているのが確認できました。

# 設定ファイル

設定ファイルは、'composer.json'と同じ階層にあるphpcs.xmlです。

以下のように設定してあります。

```xml:phpcs.xml
<?xml version="1.0"?>
<ruleset name="App">
    <config name="installed_paths" value="../../cakephp/cakephp-codesniffer"/>

    <rule ref="CakePHP"/>
    <rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint">
        <exclude-pattern>*/src/Controller/*</exclude-pattern>
    </rule>

    <file>src/</file>
    <file>tests/</file>
</ruleset>
```


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 次の記事

https://qiita.com/keitaMax/items/5feef83f0f6bfa1b501c
UbuntuでどのユーザーがどのくらいGPUを使用しているか調べる方法

このコマンドでできると思います

```bash:コマンド
paste \
<(ps --no-header up $(nvidia-smi --query-compute-apps=pid --format=csv,noheader | sed 's/,//g') \
| awk '{print $1 ": " $2 ","}') \
<(nvidia-smi --query-compute-apps=pid,used_memory --format=csv,noheader \
| sort \
| awk '!colname[$1]++{print $2 $3}')
```

```bash:結果
user_hoge: 11436,      1606MiB
user_fuga: 30874,      4142MiB
```
左からユーザー名、PID、メモリ使用量です。
現段階では工夫が足りないのでヘッダがなかったり、同じPIDで複数のGPUを使用している場合に両方の利用量を表示できなかったりします
【git】Github上のファイルのみを削除する

# はじめに

ミニアプリをデプロイしたのですが、
共有すべきでないファイルがGithubに上げられていました。

ローカルのファイルを削除することなく、GIthubにあるファイルのみを削除する方法の備忘録です。

# ファイルの場合

今回は`.DS_Store`を削除します。
`.DS_Store`はmacOSが使用するファイルであり、共有されるべきではありません。

## `.gitignore`

（作成していない場合）
`.gitignore`を作成します。

```zsh
% touch .gitignore
```

`.DS_Store`を追跡しないよう、設定します。

```.gitignore
.DS_Store
```

## Indexから削除

先程の設定は「新しく追跡しない」設定です。
「すでに追跡されたファイル」はそのままのため、ファイルの追跡を解除します。

以下のコマンドにより、gitの追跡が解除されます。
`--cached`オプションにより、ファイル自体は削除されません。

```zsh
% git rm --cached .DS_Store
```

その後は、通常通り`add` `commit` `push`でOKです。

```zsh
% git add .
% git commit -m ".DS_Storeを削除"
% git push origin main
```

# フォルダの場合

続いて`node_modules`を削除します。
`node_modules`はサイズが大きく、
依存関係や開発環境・本番環境ごとの使い分けもあります。
都度インストールすべきで、`package.json` `package-lock.json`があれば十分です。

## `.gitignore`

（作成していない場合）
`.gitignore`を作成します。

```zsh
% touch .gitignore
```

`node_modules`を追跡しないよう、設定します。

```.gitignore
node_modules/
```

## Indexから削除

先程の設定は「新しく追跡しない」設定です。
「すでに追跡されたファイル」はそのままのため、ファイルの追跡を解除します。

以下のコマンドにより、gitの追跡が解除されます。
`--cached`オプションにより、ファイル自体は削除されません。

<font color="red">フォルダの場合は、`-r`オプションで、再帰的に内部のファイル・フォルダも対象にします。</font>

```zsh
% git rm -r --cached node_modules
```

その後は、通常通り`add` `commit` `push`でOKです。

```zsh
% git add .
% git commit -m ".DS_Storeを削除"
% git push origin main
```
ValueSemantics だと 何が嬉しいの

https://qiita.com/kk__777/items/ae9fc96bfcb691a33b8a

続き


### 参照型で起こる副作用を 値型で防止する

- 意図しない変更
- 整合性の破壊

Swiftは 上記に対する 対処を値型で行う。

```swift
struct Person {
    var name: String
}

var person1 = Person(name: "Alice")
var person2 = person1
person2.name = "Bob"

print(person1.name) // Alice
```

Kotlinは 防御的コピー + イミュータブルクラス 

```kotlin
data class Person(val name: String)
val person1 = Person(name = "Alice")
val person2 = person1.copy(name = "Bob")

println(person1.name) // Alice
```

防御的コピーと比べると 、いちいち全部作り直す手間がない分パフォーマンスが良い

さらに、Swiftの値型は、「複数の参照が同じデータを共有する場合、データはコピーされずにそのまま使用する。しかし、いずれかの参照がデータを変更しようとすると、その時点でコピーが作成され、変更はコピーに対して行われる。」　といった Copy on Write と呼ばれる仕組みがあって、配列のような大きくなりうるデータ に対する操作も パフォーマンスをよくしている。

```swift
var array1 = [1, 2, 3]
var array2 = array1 // 共有される
array2.append(4)    // この時点でコピーが作成される
print(array1)       // [1, 2, 3]
print(array2)       // [1, 2, 3, 4]
```

### 値型の変更を 参照型っぽくやる

inout 引数 を使うと もとの値型を変更することができる。が、Value Semanticsは壊れる可能性がある。

```swift
func modifyArray(_ array: inout [Int]) {
    array.append(4)
}

var array1 = [1, 2, 3]
modifyArray(&array1)
print(array1) // [1, 2, 3, 4]

```

メソッドの場合は mutating で inout と同じことができる

```swift
struct Person {
    var name: String
    
    mutating func changeName(to newName: String) {
        name = newName
    }
}

var person = Person(name: "Alice")
person.changeName(to: "Bob")
print(person.name) // Bob
```
Promote Your Project in Search Engines

[ Easily create backlinks](http://cremountdigital.com) - Help promote your indie hacker project by building backlinks to increase your project's visitbility in search engines.

Search engine traffic is the highest quality traffic available because the users intent is on actively searchign for your product or service.

The heaviest off-page ranking factor is link amount and velocity by a long shot, but spamming your website with too many links can hurt, thats why its best to build them slowly and focus on quality over quantity!!
Javaで「配列をコピーする(シャローコピーとディープコピー)」の動作を確認してみた

# 概要

Javaで「配列をコピーする(シャローコピーとディープコピー)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/array/index10.html

# 実装

以下のファイルを作成しました。
```JSample10_1.java
class JSample10_1{
  public static void main(String[] args){

    MyTest[] src = {new MyTest(28), new MyTest(12)};
    MyTest[] dst = new MyTest[2];

    for (int i = 0; i < src.length; i++){
      dst[i] = new MyTest(src[i].num);
    }

    System.out.println("src[0] = " + src[0].num);  // 28
    System.out.println("dst[0] = " + dst[0].num);  // 28

    src[0].num = 41;

    System.out.println("src[0] = " + src[0].num);  // 41
    System.out.println("dst[0] = " + dst[0].num);  // 16
  }
}

class MyTest{
  public int num;

  public MyTest(int n){
    num = n;
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample10_1.java 
$ java JSample10_1 
src[0] = 28
dst[0] = 28
src[0] = 41
dst[0] = 28
```

# まとめ

何かの役に立てばと。
BTCPayServerのセットアップ手順

# 趣旨
Bitcoinをもっと実生活で使う方法はないかとリサーチしている時にBTCPayServerがおもしろそうだと思ったので実験的にローカルサーバーに導入してみました。

以下は、Raspberry PiでBitcoin CoreとBTCPayServerをセットアップし、複数の店舗にビットコインによる支払いサービスを提供するための手順と使用したコマンドの概要です。ただし適宜自分の状況に合わせて設定を一部変える必要があると思います。

補足：
- Tor利用
- Blockchainの全データをダウンロードしたくないのでprune=5500をセット
- LightningはセットせずOnchainBTCのみセット

# 事前準備

Raspberry Piを最新の状態にする

```
sudo apt update
sudo apt upgrade
```

## DockerとDocker Composeのインストール

Dockerのインストール

```
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
```
Docker Composeのインストール
```
sudo apt install -y python3-pip
sudo pip3 install docker-compose
```

## Bitcoin Coreのインストールと設定
```
wget https://bitcoincore.org/bin/bitcoin-core-27.0/bitcoin-27.0-aarch64-linux-gnu.tar.gz
tar -xzf bitcoin-27.0-aarch64-linux-gnu.tar.gz
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-27.0/bin/*
```

Bitcoin Coreの設定ファイル作成
```
mkdir ~/.bitcoin
nano ~/.bitcoin/bitcoin.conf
```
設定ファイルに以下の内容を追加:

```
prune=5500
proxy=127.0.0.1:9050
bind=127.0.0.1
listenonion=1
server=1
rpcuser=your_rpc_username
rpcpassword=your_rpc_password
```

Torのインストールと設定
```
sudo apt install tor
sudo nano /etc/tor/torrc
```

torrcファイルに以下の行を追加:

```
ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1
```

Torサービスの再起動
```
sudo systemctl restart tor
sudo systemctl status tor
```
Bitcoin Coreの起動
```
bitcoind -daemon
```

# BTCPayServerのセットアップ
BTCPayサーバーDockerリポジトリのクローン作成
```
git clone https://github.com/btcpayserver/btcpayserver-docker
cd btcpayserver-docker
```

環境変数の設定
```
export BTCPAY_HOST="http://$IP"
export NBITCOIN_NETWORK="mainnet"
export BTCPAYGEN_CRYPTO1="btc"
export BTCPAYGEN_REVERSEPROXY="none"
```

Gitの安全なディレクトリとしてマークする
```
sudo su -
git config --global --add safe.directory /home/daniel/bitcoin/btcpayserver-docker
```

## セットアップスクリプトの実行
BTCPayサーバーDockerディレクトリに移動し、セットアップスクリプトを実行:

```
cd /home/daniel/bitcoin/btcpayserver-docker
source btcpay-setup.sh -i
```

## ポート競合のトラブルシューティング
ポート80を使用しているDockerコンテナを特定して停止:
```
sudo docker ps
sudo docker stop tradingview-alert-connector-webserver-1
```
BTCPayサーバーの再起動

```
sudo btcpay-restart.sh
```
# Adminページ
ローカルネットで`http://$IP`にアクセスするとBTCPayServerのAdminページになります。

![Screenshot 2024-06-18 at 21.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/0f2a3cad-955e-baad-2199-77f066321980.png)
文系エンジニア、束論を学ぶ #2 pythonライブラリ

# はじめに

# ▶️はじめに
計算機科学において、順序集合関連の理論は、データ構造、アルゴリズム、プログラム分析、型システムなど、多くの領域で重要な役割を果たしています。

これらを自分の「🧑‍💻力」に組み入れていきたい。そのために、束論についての勉強をはじめました。
その勉強過程のノートになります。

#1

https://qiita.com/ymgc3/items/67269adf350a55578bfe


# python ライブラリ

圏論と束論を扱うpythonのライブラリをまとめます。

## 圏論ライブラリ

| ライブラリ名                                                           | 特徴                                       | インストール方法                  |
|----------------------------------------------------------------------|-------------------------------------------|----------------------------------|
| [sympy.categories](https://www.sympy.org/en/index.html)              | SymPy数学ライブラリの一部。圏論の基本的な概念をサポート。 | `pip install sympy`            |
| [category-theory](https://docs.sympy.org/latest/modules/categories.html)         | 圏論のための独立したライブラリ。より専門的な概念をサポート。 | `pip install category-theory` |
| [catpy](https://pypi.org/project/catpy/)                             | 圏論の概念と計算をサポートするライブラリ。  | `pip install catpy`            |
| [discopy](https://pypi.org/project/discopy/)                         | 図式計算や量子計算に適用可能な圏論的ツール。 | `pip install discopy`         |

## 束論ライブラリ

| ライブラリ名                                                | 特徴                                        |              |
|-----------------------------------------------------------|--------------------------------------------|------------------------------|
| [galois](https://pypi.org/project/galois/)                | 有限体や多項式の計算をサポートし、束の構造も扱える。  | `pip install galois`       |
| [lattice](https://pypi.org/project/lattice/)              | 抽象代数学における束の概念をサポート。             | `pip install lattice`     |
| [concepts](https://pypi.org/project/concepts/)            | 形式概念解析(FCA)に基づき、束の操作をサポート。     | `pip install concepts`    |
| [lattices](https://pypi.org/project/lattices/)            | 数理論理学と抽象代数学における様々な種類の束を扱う。 | `pip install lattices`    |
アジャイル開発におけるドキュメント

# はじめに

- アジャイル開発におけるドキュメントの関係をまとめます
- 「うちはこうしている」の一例であり、いろんなやり方があるかと思います

# PRD →エピック→ユーザーストーリー→実装

- PRD（Product Requirements Document）、エピック、ユーザーストーリー、実装というプロセスは、ソフトウェア開発の異なるドキュメント段階を表しています。
- このプロセス全体は、高レベルの要件から始まり、段階的により具体的で詳細な作業に落とし込まれていきます。
- PRDは方向性を示し、エピックとユーザーストーリーはその方向性を実現するための計画と構造を提供し、実装はその計画を実現します。

```mermaid

graph LR
    Z["要求"] -->|要件を定義| A
    A["PRD"] -->|管理単位に分解| B[エピック]
    B -->|ユーザーストーリー単位に詳細化| C[ユーザーストーリー]
    C -->|実現| D[実装]

```

# 各ドキュメント要素

## PRD (Product Requirements Document)

- 目的: 製品やプロジェクトの目標、機能、制約条件などを定義します。
- 役割: PRDは全体的なビジョンと製品の範囲を示し、開発の基盤となる文書です。

## エピック

- 目的: PRDで定義された要件を、より管理しやすい大きな作業単位に分割します。
- 役割: エピックはPRDの要件を大まかな機能やテーマに分割し、プロジェクトの主要な目標を表します。
    
    💡 エピックは、通常、単一のユーザーストーリーやタスクよりも広範囲で、プロジェクトの重要な部分を形成する大きな目標や機能を示します。
    
## ユーザーストーリー

- 目的: エピックをさらに小さな単位に分解し、具体的な機能やタスクに落とし込みます。
- 役割: ユーザーストーリーは、実際のユーザーの視点から具体的なニーズや問題を表し、開発チームがどのように対応すべきかを明確にします。


# PRD、エピック、ユーザーストーリー、実装の先行後続関係

``` mermaid

graph LR
    subgraph PRD [PRD]
        A[ビジョンと目的]
        B[機能要件]
        C[非機能要件]
        D[ターゲットユーザー]
        E[ビジネスケース]
        F[制約条件]
        G[リスク評価]
        H[スケジュールとマイルストーン]
    end

    subgraph Epic [エピック]
        I[概要記述]
        J[主要な機能]
        K[優先順位]
        L[関連するユーザーストーリー]
        M[予想される成果]
    end

    subgraph UserStory [ユーザーストーリー]
        N[ユーザーの視点]
        O[受け入れ基準]
        P[タスクの詳細]
        Q[依存関係]
        R[見積もり]
    end

    subgraph Implementation [実装]
        S[コード実装]
        T[単体テスト]
        U[統合テスト]
        V[ドキュメント]
    end

    subgraph AcceptanceTest [受け入れテスト]
        W[テスト計画と実施]
        X[クオリティ評価]
        Y[フィードバックと改善]
    end

    A --> I
    B --> J
    C --> J
    D --> N
    E --> M
    F --> Q
    G --> R
    H --> K
    I --> L
    J --> N
    K --> O
    L --> P
    M --> Y
    N --> S
    O --> W
    P --> U
    Q --> V
    R --> X
    S --> T
    T --> U
    U --> V
    V --> W
    W --> X
    X --> Y

```


# PRD、エピック、ユーザーストーリー、実装が含む内容

各要素（PRD、エピック、ユーザーストーリー、実装）が含むべき具体的な内容をブレイクダウンします。

## 1. PRD (Product Requirements Document)
    - **ビジョンと目的**: 製品の目的と、達成したいビジョン
    - **機能要件**: 製品が満たすべき具体的な機能
    - **非機能要件**: パフォーマンス、セキュリティ、可用性などの要件
    - **ターゲットユーザー**: 製品の主なユーザーグループ
    - **ビジネスケース**: 製品によってもたらされるビジネス上の価値
    - **制約条件**: 技術的、法的、時間的な制約
    - **リスク評価**: プロジェクトに関連する潜在的なリスク
    - **スケジュールとマイルストーン**: 製品開発のタイムライン

## 2. エピック
    - **概要記述**: エピックの目的と概要。
    - **主要な機能**: エピックによってカバーされる主要な機能群。
    - **優先順位**: プロジェクト内でのエピックの優先度
    - **関連するユーザーストーリー**: エピックに関連する具体的なユーザーストーリー
    - **予想される成果**: エピック完了時の期待される成果

## 3. ユーザーストーリー
    - **ユーザーの視点**: 「As a [user], I want [feature], so that [reason]」の形式
    - **受け入れ基準**: ストーリーが完了とみなされる条件
    - **タスクの詳細**: ストーリーを実現するための具体的なタスク
    - **依存関係**: 他のユーザーストーリーや機能との依存関係
    - **見積もり**: 作業の所要時間や労力の見積もり

## 4. 実装
    - **コード実装**: ユーザーストーリーに基づくプログラムコード
    - **単体テスト**: 各機能の動作を確認するテスト
    - **統合テスト**: 複数のコンポーネントやシステム全体のテスト
    - **ドキュメント**: コード、API、使用方法のドキュメント
    - **デプロイメント**: 製品のデプロイやリリースプロセス