OmniAICreator/Qiita-1.07M huggingface dataset:
[SQLServer]ストアドプロシージャの作成_1

# 1. サンプルテーブルの作成
```sql:CREATE_TABLE_Customers.sql
--顧客テーブル
CREATE TABLE Customers (
    CustomerID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(50),
    LastName NVARCHAR(50),
    Email NVARCHAR(100),
    Phone NVARCHAR(20),
    CreatedDate DATETIME DEFAULT GETDATE(),
    ModifiedDate DATETIME DEFAULT GETDATE()
);
```

# 2. ストアドプロシージャの作成
```sql:CREATE_PROCEDURE_usp_AddOrUpdateCustomer.sql
CREATE PROCEDURE usp_AddOrUpdateCustomer
    @CustomerID INT = NULL,
    @FirstName NVARCHAR(50),
    @LastName NVARCHAR(50),
    @Email NVARCHAR(100),
    @Phone NVARCHAR(20)
AS
BEGIN
    SET NOCOUNT ON;

    IF @CustomerID IS NULL
    BEGIN
        -- 新しい顧客を追加
        INSERT INTO Customers (FirstName, LastName, Email, Phone)
        VALUES (@FirstName, @LastName, @Email, @Phone);

        PRINT 'New customer added successfully.';
    END
    ELSE
    BEGIN
        -- 既存の顧客情報を更新
        UPDATE Customers
        SET FirstName = @FirstName,
            LastName = @LastName,
            Email = @Email,
            Phone = @Phone,
            ModifiedDate = GETDATE()
        WHERE CustomerID = @CustomerID;

        IF @@ROWCOUNT = 0
        BEGIN
            PRINT 'Customer not found.';
        END
        ELSE
        BEGIN
            PRINT 'Customer updated successfully.';
        END
    END
END;
```

# 3. ストアドプロシージャの使用例

```sql:EXEC_usp_AddOrUpdateCustomer_C.sql
--新しい顧客を追加する
EXEC usp_AddOrUpdateCustomer
    @FirstName = 'John',
    @LastName = 'Doe',
    @Email = 'john.doe@example.com',
    @Phone = '123-456-7890';
```

```sql:EXEC_usp_AddOrUpdateCustomer_U.sql
--既存の顧客情報を更新する
EXEC usp_AddOrUpdateCustomer
    @CustomerID = 1,  -- 更新したい顧客のID
    @FirstName = 'Jane',
    @LastName = 'Doe',
    @Email = 'jane.doe@example.com',
    @Phone = '098-765-4321';
```

# 4. Appendix（代表的なシステム変数）

|システム変数|内容|
|:-|:-|
|@&#xFFF0;@&#xFFF0;ROWCOUNT  |直前のステートメントで影響を受けた行数。|
|@&#xFFF0;@&#xFFF0;ERROR     |直前のステートメントのエラーナンバー。正常終了の場合は0。|
|@&#xFFF0;@&#xFFF0;IDENTITY  |同じセッション内で最後のINSERTによって生成されたID値。|
|@&#xFFF0;@&#xFFF0;TRANCOUNT |現在のセッションのトランザクションのネストレベル。|
RubyXLで利用できる罫線の種類を調べる

## 環境
Ubuntu 20.4
Ruby 2.6
Rails 5.2

## はじめに

Excelファイルに対し、読み取りと書き込みの両方ができる、RubyXLというgemがあります。このgemのchange_borderメソッドを利用して、Excelのセルに罫線を引くことができます。このメソッドで使うことができる、パラメータと罫線の種類について調べてみました。

## change_borderの使い方

change_borderの使い方は公式サイトを見れば載っています。

公式サイト
https://github.com/weshatheleopard/rubyXL?tab=readme-ov-file#changing-borders-

```
# Possible weights: hairline, thin, medium, thick
# Possible "directions": top, bottom, left, right, diagonal
worksheet.sheet_data[0][0].change_border(:top, 'thin')  # Sets A1 to have a top, thin border
```

サンプルにある通り、罫線の種類は、change_borderの第２引数に設定します。

サンプルでは、hairline, thin, medium, thickの４種類のパラメータが渡せるといった記述があります。４種類もあれば十分かも分かりませんが、実際には、もっと沢山の種類のパラメータが用意されています。

GitHubにあるRubyXLのソースを検索すると、実際には、これだけのパラメータが用意されていることが確認することができます。全部で１３種類です。

```simple_types.rb
ST_BorderStyle = %w{ none thin medium dashed dotted thick double hair
                     mediumDashed dashDot mediumDashDot dashDotDot slantDashDot }
```

## サンプルを出力する

すべての罫線を出力してみます。

```rubyxl_sample.rb
    require 'rubyXL'
    require 'rubyXL/convenience_methods'

    workbook = RubyXL::Workbook.new
    worksheet = workbook[0]

    sT_BorderStyle = %w{ none thin medium dashed dotted thick double hair mediumDashed dashDot mediumDashDot dashDotDot slantDashDot }
    sT_BorderStyle.each_with_index do |val, idx|
         worksheet.add_cell(idx, 0, val).change_border(:bottom, val)
    end
    workbook.write('./Ruby/sample_1.xlsx')
```

出力されたExcelファイルです。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/e1c322ff-9149-b75f-543b-f73cf42a083c.png)

## ChatGPTに聞いてみる

Copilot（ChatGPT-4）に聞いてみました。プロンプトには次のように入力します。

>RubyにRubyXLというgemがあります。このgemを使って、Excelシートに罫線を引きたいと思っています。指定できる罫線の種類を一覧で表示してください。

教えてくれた、パラメータ値は、「medium、thin、double、dotted」の４種類でした。

公式サイトのサンプルコードで紹介されているパラメータ値は、「hairline, thin, medium, thick」の４種類です。

ChatGPTは、どうやら、こちらの記事を参考にしたようです。
https://www.tairaengineer-note.com/ruby-rubyxl-usage-list/

公式サイトの情報を一番の参考にしてくれないところが、現状のChatGPT-4の限界なのだろう。GitHubのソースコードは一切見ていないと思われる。確信犯です。
Wordpress.com付随のTitanのメールが設定不可

【困りごと】
Wordpress.comを契約し、付随のサービスのTitanのメールを利用しています。
Outlookでも送受信できるように設定をしているのですが、「サーバにログインできませんでした。メールアドレスとPWを確認してください。」と出て設定ができません。

【やったこと】
▼Outlookのアカウント追加から通常通り設定いたしました。他にも２つメールアドレスを設定していますがそれは問題なく送受信できています（メールサーバはTitanとは異なります）
設定内容やメールアドレスやPWは間違っていないかと思います。（TaitanアプやWebメールは利用できております。）

受信サーバー:imap.titan.email
暗号化: SSL/TLS（ポート: 993）
送信サーバー:smtp.titan.email
暗号化: SSL/TLS（ポート: 465）

【懸念点情報】
Titan側の設定で「サードパーティ型のメールを利用する」という項目を押すとOutlook等でも利用できるようなのですが、項目を押しても何も反応が無いので、有効になっているかわかりません。
２段階認証はしていません。
契約は「Pro Trial」の期間です。

サポートが英語なので翻訳して見てはいますが解決に至らずです。
もし詳しい方いらっしゃいましたら、ご教授願います。
何卒宜しくお願い致します。
Rails Admin が重い  - N+1クエリに対策する設定

# 設定例

たとえば user 対 books  が関連している場合、
`rails_admin.rb` に以下のように設定

```rb
RailsAdmin.config do |config|
  ...

  config.model 'User' do
    configure :books do
      eager_load true
    end
  end
```

# ページ閲覧で発行されるSQLクエリの例

RailsAdminの設定は eager load という名前だが、 Railsの eager load ではなく preaload 的なクエリが発行されていた

```sql
SELECT `users`.* FROM `users` ORDER BY users.id desc LIMIT 20 OFFSET 0

SELECT `books`.* FROM `books` WHERE `books`.`user_id` IN (65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 146)
```

Rails の eager load だとデータ量によっては逆に負荷が高まってしまうと思ったが、preload してくれるなら安心かもしれない

場合によってRails の eager load クエリになるかどうかの検証はしていない

# 公式

https://github.com/railsadminteam/rails_admin/wiki/Associations-basics#eager-load


>Eager load
>
>Associations can be configured to be eager-loaded to prevent N+1 queries. belongs_to associations are eager-loaded by default, but you can configure additional eager-loads like:


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Pythonの仮想環境の構築

# はじめに
Pythonでプロジェクトを開発する際には、仮想環境を構築することで、プロジェクトごとに別々のライブラリを使えるようになります。これにより、別のプロジェクトの依存関係が交互に崩れるのを防ぎ、環境の混乱を避けることができます。

本記事では、Pythonの仮想環境の構築方法を解説します。

# 仮想環境の作成
仮想環境を作成するには、Pythonに含まれる「venv」モジュールを使用します。

```sh: 仮想環境の構築
python -m venv 仮想環境名
```

次に「.venv」という名前の仮想環境を構築する具体例を示します。

```sh: 仮想環境の構築（具体例）
python -m venv .venv
```

# 有効化
作成した仮想環境を有効にするためには、下記コマンドを実行します。

```sh
.\.venv\Scripts\activate
```

Windowsで作業する際に、PowerShellの実行ポリシーを変更する必要があります。

```sh
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
```

# 使用例

全体の工程をまとめると、次のようになります。

```sh
# 仮想環境の構築と有効化
python -m venv .venv
.\.venv\Scripts\activate

# 使用するライブラリのインストール
pip install -r .\requirements.txt
```

なお、次のコマンドを実行すると、```requirements.txt``` の内容が上書きされます。
```sh: ライブラリリストの更新
pip freeze > requirements.txt
```


# 参考
https://www.python.jp/install/windows/venv.html
Starshipの導入 / 文字化けの修正

# はじめに

Starship というツールはご存知でしょうか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/2ccba2ec-3079-1b0f-72d1-e00f26535992.png)

このように、ターミナルを見やすくしてくれます。

https://starship.rs/

導入方法は簡単です
Homebrewからインストールして、`.zshrc`を編集するだけ
※bashを使用している場合は`.bashrc`

```zsh
brew install starship
```

```.zshrc
eval "$(starship init zsh)"
```
（`.zshrc`はホームディレクトリ`~`にあると思います）

# 文字化け発生

導入は簡単なのですが、文字化けが発生してしまいました

![スクリーンショット 2024-06-24 10.24.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/a6ec4517-e7a9-2576-05ab-f9c6d2fb7c30.png)

2ステップで解決していきましょう

# 1. Nerd font のインストール

```zsh
brew install --cask font-<FONT NAME>-nerd-font
```

私は`Hack Nerd Font`をインストールしました。

```zsh
brew install --cask font-hack-nerd-font
```

:::note
フォントを選びたい方はこちら
[nerdfonts.com](https://www.nerdfonts.com/font-downloads)
:::


:::note alert
<details><summary>※現在無効な方法</summary>

```zsh
brew tap homebrew/cask-fonts
brew install <FONT NAME>-nerd-fonts
```
検索するとこの方法がよくでてきますが、この方法は現在無効です。
</details>
:::

# 2. Nerd Fontの適用

macOSの場合です。
1. ターミナルを開きます
2. 「ターミナル」メニューから「設定」を選択します
3. 「プロファイル」タブを選択し、使用中のプロファイルを選択します
4. 「フォント」の「変更」をクリックします
5. Hack Nerd Fontを選択します

| |
|:-:|
|![スクリーンショット 2024-06-24 10.37.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/33002a0b-89f2-6988-298f-587c25aa2cc1.png)|
|![スクリーンショット 2024-06-24 10.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/c8e9f0c6-c16c-cd0c-5c5a-bf4fa79073d5.png)|
|![スクリーンショット 2024-06-24 10.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/07fc3805-33ae-d383-dcab-8b4168655f06.png)|
|![スクリーンショット 2024-06-24 10.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/36b70b3d-5806-d4f2-bd98-3e4b04f142cb.png)|

# 完了！

文字化けが修正できました！

![スクリーンショット 2024-06-24 10.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/5eb1b15e-fae6-0a3c-6a09-d1e49b4dbf39.png)




# 参考記事

https://qiita.com/sl2/items/bf58dadb261c0a019571

https://zenn.dev/mayo_dev/articles/setup-terminal
手書きのイメージをChatGPTに伝えてWebページの"ガワ"だけ作ってもらった

# きっかけ
パッケージ製品を使った開発現場で主にバックエンドよりを中心に開発してきたので、一からフロントを作っていく経験に乏しく、「こんな感じのWebページ作りたいな」とイメージはあっても、それをイメージのままコードに落とし込めなかったんですが、gpt4oの登場で、「あれ？これってChatGPTに放り込めばいい感じで作ってくれるのでは？」と思い立ち試してみた記録です。

# ざっくり作りたい画面を考える
今回はチャット画面を雑に書いてみました。
![スクリーンショット 2024-06-24 100441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/517ba8cb-f5de-65b1-a72c-c1564546579d.png)

# とりあえずChatGPTに投げてみる
特に何も考えずに放り込んでみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/5c605c57-a79f-94e3-9eff-50e339791cde.png)

出力されたHTMLをまるっとコピペして表示した結果、なんかいい感じだけどめっちゃ余白あるｗ
ボタンの配置はまあ良いとしてアイコンがどっか行ったな・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/764609fa-0764-c2a7-98bc-31c8c0cac965.png)

# プロンプト添えてChatGPTに投げてみる
やっぱり最低限プロンプトは合ったほうが良いと思うので、画像の説明＋補足的に情報を追加する形でプロンプトとを添えて投げてみました。
アイコン使いたいのでアイコンのファイル名もプロンプトに入れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/cb7572bc-9477-a0db-d488-c69c1262b632.png)

結果、思ってたよりいい感じになった。（センスない自分がつくるよりはるかにマシ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/60bc9bf8-689a-c63a-01cc-a765fdd3cf9c.png)

# まとめ

1. 手書きで画面レイアウトをざっくり書く
1. ChatGPTにプロンプト添えて投げる

というやり方でちゃちゃっと"ガワ"だけ作って、そこからスタートするのはかなりアリな気がしてきた
32ビットARMのエントリーモデルQNAPでInfluxDB2とGrafanaを動かす

## やりたいこと

家庭で動かしているエントリーモデルのQNAPでGrafana+InfluxDB2による各種データの可視化を行いたい。

## 制限

### QNAPのアーキテクチャ

QNAPはLinuxベースのNASだがCPUアーキテクチャがIntel/AMD64, ARM64/32ベースのものがあり、家庭・個人向けのエントリーモデルはARM32が多い？(現行製品はエントリーレベルも64bitになっているかも？)

https://www.qnap.com/ja-jp/product?product-group=home

私が使用している[TS-231P](https://www.qnap.com/ja-jp/product/ts-231p)は`arm7l`

```text
$ cat /proc/cpuinfo | grep model
model name	: Annapurna Labs Alpine AL212 Dual-core ARM Cortex-A15 CPU @ 1.70GHz
model name	: Annapurna Labs Alpine AL212 Dual-core ARM Cortex-A15 CPU @ 1.70GHz
$ uname -m
armv7l
```

### コンテナーイメージ

Grafanaにの公式Dockerイメージ関しては[linux/amd64, linux/arm/v7, linux/arm64](https://hub.docker.com/r/grafana/grafana/tags)が用意されているので問題なし。

しかし、InfluxDB v2に関しては[32bitサポートを終了](https://www.influxdata.com/blog/influxdb-oss-and-enterprise-roadmap-update-from-influxdays-emea/#heading3)したため[linux/amd64, linux/arm64](https://hub.docker.com/_/influxdb/tags)しかイメージが用意されていない。(v1までは32bitをサポートしていた)

## 対応

### 野良イメージを使う

influxdataのフォーラムで32bit対応の質問がある。とりあえずビルドできて動かした人がいる模様。

https://community.influxdata.com/t/influxdb-2-for-arm32v7-release-date/20349

Docker Hubを探してみるとメンテナンスされてないものの [sequentialread/influxdb:2.1.1-armv7](https://hub.docker.com/r/sequentialread/influxdb) が上記フォーラムで言及されたイメージっぽい。

今日現在の最新`v2.7.6`に対して`v2.1.1`ではあるが…。

### 自分でイメージを作る？

こちらの記事の様にQNAP Conteiner Stationでも既存イメージではなくDockerfileから作れる様だが、そもそもInfluxDB2自体32bitをサポートしていないのでInfluxDB2の最新版をビルドできるかどうかも不明(Dockerイメージではなくinfluxdb自体のバイナリーの意味)。

https://qiita.com/abeshi-X1/items/11f1d04ec85fe4cbf45e

### とりあえず

動作する野良イメージを使ってとりあえずやりたいことはできた。QNAP ARM32版で動くComposeファイルを貼っておく。

```yml
version: "3"

services:
  influxdb:
    image: sequentialread/influxdb:2.1.1-armv7
    container_name: influxdb
    ports:
      - "8086:8086"
    volumes:
      - ./docker/influxdb/data:/var/lib/influxdb2
      - ./docker/influxdb/config:/etc/influxdb2

  grafana:
    image: grafana/grafana-enterprise:10.4.4
    container_name: grafana
    restart: unless-stopped
    ports:
     - "3000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
    depends_on:
      - influxdb
      - postgres
    environment:
      - GF_DATABASE_TYPE=postgres
      - GF_DATABASE_HOST=postgres
      - GF_DATABASE_NAME=grafana
      - GF_DATABASE_USER=grafana_user
      - GF_DATABASE_PASSWORD=p@ssw0rd

  postgres:
    image: postgres:12.19
    container_name: postgres
    environment:
      - POSTGRES_USER=grafana_user
      - POSTGRES_PASSWORD=p@ssw0rd
      - POSTGRES_DB=grafana

volumes:
  grafana-storage: {}
```

PostgreSQLが必要なのは次の記事の様に自分の使っているQNAPでもラズパイ同様にデフォルトのSQLite3がロックされる模様。

https://qiita.com/int512/items/9df33203d3d6dd39c486

## 感想

- とりあえずInfluxDB2は動いているがなんとかしたい
- QNAPは[バースプロキシー機能](https://www.qnap.com/ja-jp/how-to/tutorial/article/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)があるので簡単に外からもダッシュボードが見れて便利
- 色々動かしだすと結構遅くなるのでいずれはARM64版のQNAPにリプレースしたい(そうすればDocker周りは解決しやすい)
ejsの使い方

## はじめに
最近、Webサイトを作成する際にejsを使用したので、使い方をまとめようと思います。

## ejsとは
主にJavaScriptで使用されるテンプレートエンジンで、HTMLの中にjavascriptの構文を埋め込むことができます。

## インストール
### Node.jsがインストールされているか確認する。
以下のコマンドを実行し、バージョンが表示されればインストールされています。
インストールされていない場合はこちらからインストールしてください。
https://nodejs.org/en
```
node -v
```

### npmがインストールされているか確認する。
以下のコマンドを実行し、バージョンが表示されればインストールされています。
```
npm -v
```
インストールされていない場合は以下のコマンドを実行してください。
```
npm install -g npm
```

### package.jsonを作成する
```
npm init
```

### ejsをインストールする
```
npm install ejs
```
下記のようにpackage.jsonにejsが表示されたら成功です。
![package.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760632/9cdad474-cc15-328f-492f-4821df0bfa54.png)

## 記法
ejsを利用するには名前を「views」にしたフォルダを作成し、その中に拡張子を「ejs」にしたファイルを作成します。
![f6gxk546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760632/c49d6420-953c-5ad2-2e89-b76ae2cb1625.png)

### コメント用タグ <%# %>
この中にコメントを記述することができます。
HTMLには表示されません。
```ruby:test.ejs
<%# これはコメントです。 %>
```

### コード用タグ <% %>
この中に、javascriptを記述することができます。
繰り返しや条件分岐なども使用できます。
```ruby:test.ejs
<% let temp = "Hello World"; %>
```

forやwhile、for ofなども使用できます。
```ruby:繰り返し
<% for(let i = 0; i < 5; i++){ %>
//ループさせたい処理
<% } %>
```

if、switchなども使用できます。
```ruby:条件分岐
<% if(temp === ''){ %>
//処理
<% }else{ %>
//処理
<% } %>
```

### 出力用タグ（エスケープ）<%= %>
この中に、出力したいコードを記述すると、エスケープされて出力されます。
```ruby:test.ejs
<% let temp = "<p>Hello World</p>";%>
<%= temp %>
```
```ruby:出力されたHTMLファイル
&lt;p&gt;Hello World&lt;/p&gt;
```
```ruby:Chromeの開発者ツールの表示
"<p>Hello World</p>"
```
```ruby:表示
<p>Hello World</p>
```

### 出力用タグ（エスケープなし）<%- %>
この中に、出力したいコードを記述すると、エスケープされずに出力されます。
```ruby:test.ejs
<% let temp = "<p>Hello World</p>";%>
<%- temp %>
```
```ruby:出力されたHTMLファイル
<p>Hello World</p>
```
```ruby:表示
Hello World
```

## おわりに
今回、ejsの使い方を紹介させていただきました。
タグの中にコードを記述するだけなので、結構簡単に使えると感じました。
今回紹介した内容以外にもできることがあるので、機会があれば使ってみたいと思います。
最後まで、読んでいただきありがとうございました。
wslでelixir その146

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookで、動きのあるグラフを書け。

# setup

```
Mix.install([
  {:vega_lite, "~> 0.1.5"},
  {:kino_vega_lite, "~> 0.1.7"},
  {:kino, "~> 0.10.0"}
])
```

# サンプルコード

```
func = fn _, {v, x} ->
	Kino.VegaLite.push(v, %{
		x: x, 
		y: :math.sin(x)
	}, window: 100)
	{:cont, {v, x + 0.1}}
end
vega = Vl.new(width: 500, height: 400)
	|> Vl.mark(:line)
	|> Vl.encode_field(:x, "x", type: :quantitative)
	|> Vl.encode_field(:y, "y", type: :quantitative)
	|> Kino.VegaLite.new()
	|> Kino.render()
Kino.listen(500, {vega, 0}, func)

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/50ae6c51-d350-99aa-cbb3-07f348892ea6.png)


以上。
【Dockerfile】COPY でログ出力が設定された MySQL イメージをビルドする

# はじめに
この記事では、Dockerfile でクエリログ出力が設定された MySQL イメージをビルドする手順について記載します。
Dockerfile の `COPY` インストラクションへの理解促進の一環で行っています。

https://docs.docker.com/reference/dockerfile/#copy

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Docker Engine 26.1.1
- MySQL 8.4.0

# ホストマシンの MySQL サーバー設定ファイルの作成
今回は `COPY` インストラクションを利用し、ホストマシンのファイルをコンテナのレイヤ（イメージ）にコピーしたいので、まずはホストマシンで MySQL サーバー設定ファイルを作成します。

```my.cnf
[mysqld]
general_log = 1
general_log_file = /var/log/query.log
```

- `general_log = 1` : 一般クエリログの有効化
- `general_log_file = /var/log/query.log` : 一般クエリログの出力先ファイル名

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html


# ホストマシンのファイルをイメージにコピーする `COPY`
Dockerfile を作成し、イメージをビルドしていきます。

今回のベースイメージは、2024年6月時点で latest タグと同等の [`8.4.0`](https://github.com/docker-library/mysql/blob/319db566ac7fef45c22f3df15ee5e194a7c43259/8.4/Dockerfile.oracle) にします。

https://hub.docker.com/_/mysql

ホストマシンのファイルのコピーは `COPY` インストラクションで行います。

https://docs.docker.com/reference/dockerfile/#copy

```Dockerfile
FROM mysql:8.4.0

# COPY [OPTIONS] <src> ... <dest>
COPY ./my.cnf /etc/my.cnf
```

上記 Dockerfile からイメージをビルドします。

```powershell
docker image build --tag my-mysql:log .
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/4255dda1-ae61-f754-97ba-2ccee7bc80b9.png)

`my-mysql:log` がビルドされたことを確認します。

```
docker image ls my-mysql
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/8aeddffe-3706-bb99-daa8-042aed5fca7e.png)


次はビルドしたイメージからコンテナを起動します。

```powershell
docker container run               `
--name db                          `
--rm                               `
--detach                           `
--env MYSQL_ROOT_PASSWORD=password `
--publish 3306:3306                `
my-mysql:log
```

:::note
コンテナ起動時のコマンド・オプションについては、[こちら](https://qiita.com/Yasushi-Mo/items/4539c0a1e17644788e26)の記事で解説しています。
:::

MySQL へ接続し、確認のためのクエリを発行します。

```powershell
mysql --host=127.0.0.1 --port=3306 --user=root --password=password
```

```mysql
select now();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/8842d43f-38f6-ebf2-c219-bbc30b42d35f.png)


それでは、一般クエリログを確認します。
まず、`ls` でファイルの存在を確認します。

```powershell
docker container exec db ls /var/log
```

`my.cnf` で設定した `query.log` が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/ae862dbc-11a4-50ce-6e8e-81102943bb6c.png)

次に `rail -n 5` でクエリログファイルの末尾5行を確認します。

```powershell
docker container exec db tail -n 5 /var/log/query.log
```

実行したクエリが表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/a44790bd-8d44-f9ce-5dba-996582208509.png)

# 参考
- [Dockerfile reference](https://docs.docker.com/reference/dockerfile/)
- [7.1.8 Server System Variables](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html)
- [	鈴木亮「開発系エンジニアのためのDocker絵とき入門」秀和システム、2024](https://www.shuwasystem.co.jp/book/9784798071503.html)

# 関連記事

https://qiita.com/Yasushi-Mo/items/17f755b9160767947d3e

https://qiita.com/Yasushi-Mo/items/f23a9234daa1ac4f547d

https://qiita.com/Yasushi-Mo/items/fe9edaaa1e368bd593a7
Typst の表

# はじめに

Typstの表に関して、仕様をまとめる。

デフォルトは表が狭い。

```
#set table(inset: 10pt)
```

言語を設定しておく

```
#set text(lang: "ja")
```

# 表の結合

```text: 横
#table(
  columns: 2,
  
  table.cell(colspan: 2)[a],
  [b], [c]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/7df5de8f-f66a-c4a3-20e5-cc331befefa1.png)

```text: 縦
#table(
  columns: 2,
  
  table.cell(rowspan: 2)[a],
  [b], [c]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/a28ae50f-90bc-7807-9de8-2fe66af15f9d.png)

```text: 縦横
#table(
  columns: 3,
  
  table.cell(rowspan: 2, colspan: 2)[a],
  [b], [c], [d], [e], [f]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/9a0f0717-b450-b830-7269-fb86449ea9fa.png)

`stroke` で枠線の色や太さが変わる。 `none` にすると透明になる。

```text:枠線の色
#table(
  columns: 2,
  stroke: gray,
  
  [a], [b],
  [c], [d]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/446a6b52-83ce-a464-9ba1-867eb957df29.png)

# 寄せる

`align` を横方向は `left`、`center`、`right`から、縦方向は `top`、`horizon`、`bottom` から選ぶ。

```text: 中央揃え
#table(
  columns: 3,
  align: center,
  
  [a], [b], [c],
  [ddddd], [eeeee], [fffff]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/9e940d3d-8e1f-64d6-d89e-85a2ec951e78.png)

```text: 列ごとに指定
#table(
  columns: 3,
  align: (left, center, right),
  
  [a], [b], [c],
  [ddddd], [eeeee], [fffff]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/5af574c3-4581-f9c7-15ff-1e6125dc21c2.png)


```text: 条件付き
#table(
  columns: 3,
  align: (x, _) =>
    if x == 0
      { center }
    else
      { left },
  
  [a], [b], [c],
  [ddddd], [eeeee], [fffff]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/a180f13e-4021-d219-5108-1b806b3992ee.png)

# 幅の指定

```text:
#table(
  columns: (1fr,1fr, 200pt),
  
  [a], [b], [c],
  [ddddd], [eeeee], [fffff]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/8c71946e-7f20-1cff-c623-a5481f737cdb.png)

```text: 繰り返し指定
#table(
  columns: (2em, ) * 2,
  [a], [b],
  [c], [d]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/bddb6d96-a33e-8187-4147-01b6f3e1903e.png)

# セルの背景色

```text: 条件付き
#table(
  columns: 2,
  fill: (x, y) => 
    if x == 0 or y == 0
      { silver },
  
  [a], [b],
  [c], [d]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/ade06c44-83cd-25b5-ac07-df7ac36b2163.png)

# その他

中に `box` をいれて制御する。

```text:
#table(
  columns: 2,
  align: horizon,

  [
    #box(
      baseline: 32%,
      [
        - a
        - b
      ]
    )
    ⇒ c
  ], [d]
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/60457a38-2681-ec0e-8e56-e41927ea03a5.png)
Laravelのコレクションについて

## はじめに
Laravelのコレクションは、配列やデータベース結果をラップするためのクラスであり、チェーンメソッドを使用してデータを操作するためのツールです。
コレクションは、Laravelアプリケーションのデータ操作を簡素化してくれます。

## コレクションとは
Laravelのコレクションは、配列やデータベースクエリ結果をラップするためのオブジェクトで、豊富なメソッドを提供し、データの操作、変換、フィルタリングを簡単に行うことができます。コレクションは、Illuminate\Support\Collectionクラスによって提供されます。

### 配列をコレクション化する
```php
$collection = collect([1, 2, 3, 4, 5]);
```

### 主要なメソッド
#### all
コレクションのすべての項目を取得します。
```php
$items = $collection->all();
```

#### avg
コレクションの平均値を計算します。
```php
$average = $collection->avg();
```

#### chunk
コレクションを指定したサイズの小さなコレクションに分割します。
```php
$chunks = $collection->chunk(2);
```

#### contains
コレクションが指定した値を含むかどうかを確認します。
```php
$contains = $collection->contains(3);
```

#### each
コレクションの各項目に対してコールバックを適用します。
```php
$collection->each(function ($item, $key) {
    echo $item;
});
```

#### map
コレクションの各項目に対してコールバックを適用し、その結果を含む新しいコレクションを返します。
```
$mapped = $collection->map(function ($item) {
    return $item * 2;
});
```

## 使用例
### データベースクエリ結果の操作
データベースクエリ結果はコレクションで返ってきます。
それをコレクションメソッドを使用して、特定のデータだけを取得することができます。
```
$users = DB::table('users')->get(); // これはコレクションを返します

// アクティブなユーザーのみを取得
$activeUsers = $users->filter(function ($user) {
    return $user->active;
});

// ユーザー名のリストを取得
$userNames = $activeUsers->pluck('name');
```

## コレクションのメリット
### 1. 一貫性と可読性
コレクションを使用することで、データ操作のコードが一貫しており、可読性が向上します。複雑なループや条件分岐を避け、シンプルなメソッドチェーンで表現できます。

### 2. 豊富なメソッド
コレクションは、データのフィルタリング、変換、集計など、さまざまな操作を簡単に行うための豊富なメソッドを提供します。これにより、開発者は効率的にデータを操作できます。

### 3. オブジェクト指向
コレクションはオブジェクト指向の考え方に基づいており、データとその操作を一つのオブジェクトとして扱います。これにより、コードが直感的で保守しやすくなります。

## まとめ
Laravelのコレクションは、データ操作を簡単かつ効率的に行うためのツールです。
豊富なメソッドと直感的なAPIを活用することで、データベースクエリ結果や配列の操作をシンプルに記述できます。
.gitkeep ファイルを再帰的にセットする方法

指定したフォルダ内の全てのディレクトリに `.gitkeep` ファイルを作成する方法

# create_gitkeep.sh

```bash
#!/bin/bash

# 引数が指定されているかチェック
if [ -z "$1" ]; then
  echo "使用方法: $0 <ターゲットフォルダのパス>"
  exit 1
fi

# 引数として指定されたフォルダ
TARGET_DIR="$1"

# 再帰的にサブディレクトリに移動して .gitkeep ファイルを作成
find "$TARGET_DIR" -type d -exec sh -c 'cd "{}" && touch .gitkeep' \;

echo "再帰的に .gitkeep ファイルを作成しました。"
```

# 実行権限を付与

```bash
chmod 700 create_gitkeep.sh
```

# 実行

```bash
./create_gitkeep.sh /path/to/folder
```

これにより、指定したフォルダ内の全てのディレクトリに `.gitkeep` ファイルが作成されます。
【備忘録】C# OpenCV入門

# はじめに

C# OpenCvSharp4を使用して画像処理するときの備忘録

# 手順

Visual Studioでプロジェクトを新規作成する。(WinForms)
PictureBoxを追加し、ここに画像を表示することにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/b449c8e3-47a5-58ae-ea71-31a19f27c0f0.png)

NugetよりOpenCvSharp4.Windowsをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/f839b28a-a6f6-77ad-d70d-ce03d8663c05.png)

BitmapConverterを使用するためにOpenCvSharp4.Extensionsもインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/b8b7a79a-0a0c-f332-aa16-5e2bf60e0bc2.png)


~~~Csharp:Form1.cs
        string fileName = "Qiitan.png";

        private void Form1_Load(object sender, EventArgs e)
        {
            using(Mat mat = new Mat(fileName))
            {
                Bitmap bitmap = BitmapConverter.ToBitmap(mat);
                pictureBox1.Image = bitmap;
               
                // 画像をウィンドウに表示
                // Cv2.ImShow("sample_show", mat);
            }
        }
~~~

表示されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/5fe5b1eb-b356-4199-e471-772b5af302c6.png)

# グレースケールに変換

~~~Csharp:Form1.cs
using (Mat matGray = mat.CvtColor(ColorConversionCodes.BGR2GRAY))
{
    // 画像をウィンドウに表示
    Cv2.ImShow("grayscale_show", matGray);
}
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/a0a1cf7c-b380-ee8b-cb64-fc5ce6e276f0.png)

# 画像の保存

フルパス指定が必要なようです。`@"output.jpg"`では上手く保存されませんでした。

~~~Csharp:Form1.cs
// 画像の保存
Cv2.ImWrite(@"C:\Users\output.jpg", mat);
~~~

# 参考ページ

https://chigusa-web.com/blog/opencvsharp%E3%81%A7%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86/
【Figma Plugins】Figma Pluginsで通知を表示する

## はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/9d90cdd4-0eb9-bf6c-2901-56a8e6e500d9.png)

FigmaのPluginを開発する際、Figma Pluginsから通知を表示させたいと思ったことはありますか？
この記事では、Figma Pluginsから通知を表示させる方法を解説します。

## Figma Pluginsで通知を表示する
Figma Pluginsで通知を表示するには、`figma.notify()` を使うことで、通知を表示させることができます。

`figma.notify()` の引数には、`メッセージ`・`option` を渡すことができます。

```ts
figma.notify(message: String, options?: NotificationOptions)
```

`option` には、以下の値を渡すことで、通知をカスタマイズすることができます。

+ `timeout`：通知を表示する時間を指定することができる(ミリ秒)
    + デフォルト：3秒
    + `infinity`を指定すると、閉じられるまで無期限に表示させる
+ `error`：エラー通知の見た目に変更することができる
+ `onDequeue`：通知が非表示になった時、実行される関数
+ `button`：通知にボタンを追加する
    + `text`：ボタンのテキスト
    + `action`：ボタンを押した時に実行される関数

```ts
interface NotificationOptions {
  timeout?: number;
  error?: boolean;
  onDequeue?: (reason: NotifyDequeueReason) => void
  button?: {
    text: string
    action: () => boolean | void
  }
}
```

以下のように、通知とエラー通知で見た目が変わります。

|通知|エラー通知|
|----|----|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/f1274bef-2c79-289d-8135-70d91c612f03.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/bdd776a9-ddd8-69c5-66b8-df74c7d215c5.png)|


詳しくはこちらをご覧ください。

https://www.figma.com/plugin-docs/api/properties/figma-notify/

## 実際に使ってみる
### ⚪︎ デフォルト
```sample.ts
const setNotification = () => {
  figma.notify("The process is underway")
}
```
デフォルトの通知は、上記のように記載することで、以下のような通知を表示させることができます。

![スクリーンショット 2024-06-22 15.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/70eb2e11-bc0d-f44c-6016-8158dd0076ee.png)

### ⚪︎ オプション 全のせ
```sample.ts
const setNotification = () => {
  figma.notify(
    "The process is underway",
    {
      timeout: 10000,
      error: false,
      onDequeue: () => { /* 削除時に実行する処理 */ },
      button: {
        text: "Skip the process",
        action: () => { /* ボタンを押した時に実行する処理 */ }
      }
    }
  )
}
```

こんな感じに記載することで、シンプルですが、以下のような通知を表示させることができます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/537c9866-df04-3944-62e4-7da486dec024.png)

### ⚪︎ 通知を削除する
```ts
const notification = figma.notify(
  "The process is underway",
  {
    timeout: Infinity
  }
)

notification.cancel()
```

`cancel()` を使うことで、通知を削除することができます。

## まとめ
この記事では、Figma Pluginsから通知を表示させる方法を紹介しました。
ぜひこの記事を参考にFigma Pluginsから通知を表示させてみてください。

---

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

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

https://twitter.com/degudegu2510
Databricks生成AIクックブック - 5. 評価ドリブンの開発ワークフロー

[5\. Evaluation\-driven development workflow — Databricks Generative AI Cookbook](https://ai-cookbook.io/nbs/5-rag-development-workflow.html) [2024/6/24時点]の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

> [Databricks生成AIクックブック](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204)のコンテンツです。

# 5. 評価ドリブンの開発ワークフロー

このセクションでは、高品質なRAGアプリケーションを構築、テスト、デプロイするためにDatabricksが推奨する開発ワークフロー: **評価ドリブン開発**をウォークスルーします。このワークフローは、Mosaic研究チームの高品質RAGアプリケーションの構築、評価に関する推奨のベストプラクティスをベースとしています。あなたのビジネスにおいて品質が重要であれば、以下の評価ドリブンワークフローに従うことをお勧めします:

1. 要件の定義
1. 迅速なPOCにおけるステークホルダーフィードバックの収集
1. POCの品質の評価
1. 繰り返しの診断と品質問題の修正
1. プロダクションへのデプロイ
1. プロダクションのモニタリング

![](https://ai-cookbook.io/_images/workflow.png)

このクックブックの[実装](https://qiita.com/taka_yayoi/items/501e2a6f675b3236c6d3)セクションでは、このワークフローのサンプルコードと実装ガイドを提供します。

**評価ドリブンの開発**には2つのコアコンセプトがあります:

1. **[メトリクス:](https://qiita.com/taka_yayoi/items/05f650df667ffca3e92d)** 高品質が何を意味するのかを定義

    *毎年あなたがビジネスゴールを設定するのと同じように、あなたのユースケースにおいて高品質が何を意味するのかを定義する必要があります。Mosaic AI Agent Evaluationは、使用するN個の提案メトリクスを提供し、最も重要なものは精度と適切性です - RAGアプリケーションは正しい回答を提供していますか？*

1. **[評価セット:](https://qiita.com/taka_yayoi/items/8f4c2777a1151e1d7b6a)** メトリクスを客観的に計測

    *品質を客観的に計測するためには、質問人間によって検証された既知の回答を含む評価セットを必要とします。これは最初は恐ろしいものに見えるかもしれません。すぐに利用できる評価セットがない場合もあるでしょう。このガイドでは、開発プロセスをウォークスルーし、この評価セットを繰り返し改善します。*

メトリクスと評価セットにフォーカスすることで、以下のメリットを提供します:

1. 開発過程であなたのアプリケーションの品質を繰り返しかつ自信を持って改善することができます。変更が改善につながるのかどうかを推測する必要はありません。
1. プロダクションにおけるアプリケーションの準備状況をビジネスステークホルダーとアラインすることが、より分かりやすいものになり、自信を持って *"我々は自分たちのアプリケーションが、自身のビジネスにおいて最も重要な質問に適切に回答できることを知っています"* と宣言することができます。

- [目次](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204#%E7%9B%AE%E6%AC%A1)
- 前のセクション: [4\.3\. 計測の実現: サポートするインフラストラクチャ](https://qiita.com/taka_yayoi/items/e8c2b711a2ebe5bd1d1d)
- 次のセクション: [Databricksノートブック](https://qiita.com/taka_yayoi/items/424eb455dc2bc99f56f9)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. エラー解消法

# はじめに
dockerでdocker compose run web bundle 〜 実行時に下記の注意が出ました。
こちらの解決方法について記載します。

:::note warn
Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' instead.
:::

# 解決方法
bundlerのバージョンを上げる。

```
bundle update --bundler
```

# 補足
私の環境ではDockerfileにbundlerのアップデート文を記載してdocker compose buildをしてもbundlerのアップデートがされませんでした。
コンテナで直接コマンドを実行するとbundlerのアップデートに成功して注意が解消されました。

```
docker compose run web bundle update --bundler

# bundlerのバージョンを確認する
docker compose run web bundle -v
```

# 参考文献

https://github.com/rubygems/rubygems/issues/5234

https://qiita.com/vaza__ta/items/1e7a780499b5effbfd65
rosbagに含まれているtopic一覧を他で使い回せる形式で吐き出したい



rosbag filterやrosbag recordで使えるようにrosbag infoの結果からtopic一覧を抜き出す

```bash
for i in $(rosbag info -y  -k topics 2024-06-20-07-44-17.bag | grep topic: | cut -d " " -f3 | grep -v camera) ; do echo '$i' ; done
```

一撃でいける
良く使うVS Codeショートカット集


# ctrl + N
新規ファイルを開く

# ctrl + P
ファイル名で検索

# ctrl + shift + F
プロジェクト内で該当コードを検索

# ctrl + alt + ↓
カーソルを上下に拡張(Escで抜ける)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/5b1db167-00c9-5d42-5113-394f73121d7c.png)


# ctrl + alt + ↓ + home/end
カーソルを行頭/行末に移動


# ctrl + shift + ↑↓
行の入れ替え

# shift + 矢印
範囲選択

# ctrl + alt + ↓
行複製



# おわりに
どのショートカットも多用しています！
erbからslimに変換する際の`File.exists?` メソッド使用についての解決方法

# はじめに

erbからslimに変換しようとしてエラーで詰まって調べてあまり有用な記事がなかったため
作成することにします（自分見直し用でもあります！）

# 起きたこと

dockerコンテナ内で

```bash
erb2slim app/views/users/ app/views/users/ -d
```
をしてapp/views/users/内のerbファイルを一括でslimファイルに変換しようとしたところ
```
NoMethodError: undefined method `exists?' for File:Class
  Use --trace for backtrace.
```
とエラーが出て、できなかったので
```bash
erb2slim app/views/users/ app/views/users/ -d --trace
```
--traceオプションをつけてエラーが起きているファイルを特定したところ
```
/usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/converter.rb:17:in initialize': undefined method exists?' for File:Class (NoMethodError)
      erb = File.exists?(file) ? open(file).read : file
                ^^^^^^^^
Did you mean?  exist?
        from /usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim.rb:9:in new'
        from /usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim.rb:9:in convert!'
        from /usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/command.rb:98:in _process'
        from /usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/command.rb:66:in block in process!'
        from /usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/command.rb:66:in each'
        from /usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/command.rb:66:in process!'
        from /usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/command.rb:15:in run'
        from /usr/local/bundle/gems/html2slim-0.2.0/bin/erb2slim:7:in <top (required)>'
        from /usr/local/bundle/bin/erb2slim:25:in load'
        from /usr/local/bundle/bin/erb2slim:25:in <main>'
```
エラーで出ている該当のファイルがわかりました。
# 解決方法
上記のエラーメッセージから、問題は `html2slim` gem の中にあることがわかります。
`/usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/converter.rb` ファイルの
17行目で `File.exists?` メソッドが使用されています。

この問題を解決するには、以下の手順で：

### 1. gem のソースコードを編集する:

   ```bash
   cd /usr/local/bundle/gems/html2slim-0.2.0
   ```

### 2. `lib/html2slim/converter.rb` ファイルを編集します:

   ```bash
   vim lib/html2slim/converter.rb
   ```

   または他のテキストエディタを使用してください。

### 3. 17行目を以下のように変更します:

   変更前:
   ```ruby
   erb = File.exists?(file) ? open(file).read : file
   ```

   変更後:
   ```ruby
   erb = File.exist?(file) ? open(file).read : file
   ```

### 4. ファイルを保存して閉じます。

# 終わりに
ruby3.0より上のバージョンだとexists?は使用できないため、エラーが起きているようなので
同じ問題で引っかかった方はぜひ試してみてください！
Summer'24でConnectedCallbackが複数回呼ばれるようになってしまったので、対処

## はじめに
そもそも`ConnectedCallback`が複数回呼ばれるということ自体がおかしいので、想定する必要があるかわかりませんが・・。  
Summer'24に伴い発生してしまったため、不具合対応しました。

## コード
```javascript:example.js
import ModalComponent from 'c/modalComponent';

export default class Example extends LightningElement {
    isLoading = true;

    connectedCallback() {
        if (this.isLoading) {
            ModalComponent.open({
                size: 'small'
            });
        }

        this.isLoading = false;
    }
}
```

初回の読み込み時のみモーダルを開く、というシンプルなコードです。  
一度モーダルを開いた後は`isLoading`が`false`になるため、万が一`ConnectedCallback`が二回呼ばれても大丈夫・・かと思いきや。


なぜかConnectedCallbackが複数回呼ばれる + プロパティがその都度初期化されているため、モーダルがいっぱい開いちゃいました。  
なんでだ。

## 対応方法
`isLoading`の定義を`class`の外にします。
```javascript:example.js
import ModalComponent from 'c/modalComponent';

let isLoading = true;
export default class Example extends LightningElement) {
    // isLoading = true;

    connectedCallback() {
        if (isLoading) {
            ModalComponent.open({
                size: 'small'
            });
        }

        isLoading = false;
    }
}
```

理屈は全くわかりませんが、どうやらclassの再定義が複数回行われているのが原因だったっぽいので、画面自体のスコープで変数定義することで事なきを得ました。

## おわりに
Summer'24、なかなかに不具合が多くて不安です。  
大丈夫かこれ。
【個人開発】「情報処理技術者試験ドットコム」ITパスポート試験の資格取得の意義や実務に役に立つか考えてみる

# 情報処理技術者試験ドットコムの紹介
はじめまして、5月に還暦を迎え、定年退職したプログラマ 泓原敏夫@toshio_fukeharaと申します。

転職後の[九州国際情報ビジネス専門学校](https://cosmet.ac.jp/ "九州国際情報ビジネス専門学校")での講師業務のために「[情報処理技術者試験ドットコム](https://ipa-siken.com "ipa-siken.com")」というサービスを個人開発して立ち上げました。

https://qiita.com/toshio_fukehara/items/85dee36029f741ded024

学生にはもちろん、ITパスポート試験の取得に向けて一所懸命に教えています。そこで、これまでの経験もふまえ、資格取得の意義や実務にどう役に立つか考えてみたいと思います。

# これまで取得してきた資格
約33年間、システム開発に携わってきました。その中で、**技術不足を感じた際**には、関係する情報処理技術者試験の資格を積極的に取得してきました。**ベンダー系は受験料が高くて**、一時金の手当では赤字になるため、ほとんど挑戦してません。今どき(?)の競技プログラミングもやってません。
|取得年|資格|
|---|---|
|1992年|第二種情報処理技術者(現 基本情報技術者) 取得|
|2005年|ネットワークスペシャリスト 取得|
|2008年|データベーススペシャリスト 取得|
|2011年|IT ストラテジスト 取得|
|2012年|情報セキュリティスペシャリスト 取得|
|2018年|応用情報技術者 取得|

上記以外にもハングル検定4級とか危険物取扱者丙種とかの変わり種も取得しました。

# 資格取得の意義、実務に役に立つか
|レベル|資格|
|---|---|
|Level 1|[ITパスポート試験](#itパスポート試験)|

[本家のIPA 試験区分一覧](https://www.ipa.go.jp/shiken/kubun/list.html)

資格＝実力とはなりませんが、資格試験の内容は先人の智慧の塊です。実務には一生使わない知識も出てきますが、**体系的に整理**されています。実務の中でのみ学習してきた人は、系統的に学べておらず**抜けがある**と思います。

## ITパスポート試験
第一種(現 応用情報)・第二種(現 基本情報)の時代にIT業界へ入ったので、資格自体が存在してませんでした。が、教えるために市販のテキストやシラバス、過去問サイトをあたり、用語の整理や解説を書いたりして、どんな資格かはわかっているつもりです。 

### 資格の概要
情報処理技術者試験の中でも最も初級の試験です。**職業人として**、情報機器及びシステムの把握や、担当業務の遂行及びシステム化を推進するための基礎知識・活用・活動が問われます。
* CBTによる試験であり、結果はすぐにわかる
* 疑似言語による出題は、100問中2問程度と**プログラムの問題は少ない**
* 受験者は**77%が非IT関連**とIT業界以外が多い。[IPA 令和5年度統計情報](https://www.ipa.go.jp/shiken/reports/ip-oubo2023.html)
* 合格率は50%ほど。社会人の合格率が60% 学生は40% と、**社会人の方が合格率は高い**

### 実務にどう役に立つ？
情報処理関連の前職では「新規事業の評価をするならば、ITパスポート試験レベルの知識もない人に評価されたくない。実際に受験するかどうかは別として、**点数クリアしないと評価者から除外すべき**」と言ってました。それぐらい、役員や管理職も含めて職業人として基本の知識だと思ってます。
* テクニカル面だけでなく、経営に関する知識やプロジェクトマネジメントなどについても学べます。例えば、損益計算書の見方とか、情報セキュリティ上でのリスクや注意すべき行動など、**社会人として知っておいた方が良い知識**を学べます
* 就職の際に有利に働きます
  * 専門学校卒の求人で**ITパスポート試験合格が条件**の会社があります
  * SIer[^1]系の企業に上記の条件が多い印象です
* 資格手当がもらえます
  * 一時金だと10,000円からが相場。前職では20,000円でした
  * 大昔は基本情報以上になりますが、毎月5,000円～の手当が付いてました。現在でも毎月手当の会社もごく稀に存在します
* 開発の実務に活かせるか
  * 資格を持っているからとバリバリ開発できるわけでは、もちろんありません。が、ベースにはなります。IT系に転職したい場合など、まずはITパスポート試験にトライして感触をつかみ、その後に[専門学校](https://cosmet.ac.jp/)で本格的に学ぶとか、個人開発してスキルを磨くなどのルートはありだと思います。  
* 前職で、パートナー会社の要員に多数協力頂いてきましたが、ポンコツな人も結構いました。SQL組めなかったり、トランザクションもわかってなかったり… ITパスポート試験を持っていれば、大丈夫とはなりませんが、**基本的な知識はある程度持っている証明**になります

[^1]:システム インテグレーター。システム開発や運用などを請け負います。多重下請け構造になっている業界です。

試しに[情報処理技術者試験ドットコム](https://www.ipa-siken.com/exam/list?examCd=ip202401)で問題を解いてみてください。

# 終わりに
最後まで読んで頂いてありがとうございます！
無料でも結構使えます。情報処理技術者試験にトライされる際はぜひ使ってみてください。
副業で開発を請け負ってますので、ご依頼などありましたらご連絡ください。
[情報処理技術者試験ドットコム お問い合わせ](https://ipa-siken.com/contact "ipa-siken.com")
【2024/06/24】LaTeXのPDFプレビューに日本語が表示されない不具合の解決策

# はじめに
2024/06/24 の午前中に LaTeX で卒論を書いていると PDF プレビューにて日本語が表示されない不具合に遭遇しました。

<img width="330" alt="日本語が表示されない不具合" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923849/1ec00821-d2a5-0437-ba52-5b605244c2b4.png">

昨日は正常だったのに...。その解決策を共有する記事になります。

# 解決策
原因は LaTeX Workshop（VSCode の拡張機能）を最新版（9.21.0）にしたことでした。
9.21.0 から 9.20.1 にダウングレードすると日本語が表示されるようになりました。

<img width="500" alt="VSCodeの拡張機能:LaTeX Workshop" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923849/4bae898b-408d-47fa-814e-b149a9bf242f.png">

<img width="500" alt="LaTeX Workshopのversion" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923849/464eaa37-8298-5383-77a3-c1d93a9a770a.png">

この方法によって不具合が解消されたことを以下の PC にて検証済です。
- Windows11
- MacBook Pro M2 Max

9.21.0 の次のバージョンがリリースされるまでは 9.20.1 を使っておくと良いですね。

# 追記
10.0.0 がリリースされ、こちらのバージョンでは問題なく日本語が表示されるようになりました。もし今後、再発したときはダウングレードを検討してみるのも良いかもしれません。

<img width="500" alt="LaTeX Workshopのversion" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923849/9e6eda09-cad9-c3eb-abe5-8dd106f50548.png">
SSHの仕組み

## SSHの仕組み

SSH（Secure Shell）は、ネットワーク上で安全に通信を行うためのプロトコルです。リモートマシンに安全にログインし、コマンドの実行やファイル転送を行う際に利用されます。SSHの基本的な仕組みと流れについて説明します。

### SSHの基本構造

SSHは、クライアントとサーバの間でセキュアな通信を確立するために、以下の手順で動作します

1. **接続開始**
   - クライアントは、SSHサーバに接続を要求します。
   - サーバは接続を受け入れ、セッションを開始します。

2. **鍵交換**
   - クライアントとサーバは、安全なセッション鍵を生成するために鍵交換を行います。この鍵は、セッション中のデータを暗号化するために使用されます。

3. **ユーザ認証**
   - クライアントは、パスワードや公開鍵認証などの方法でユーザ認証を行います。
   - 公開鍵認証の場合、クライアントは自分の秘密鍵でサーバが送信したデータを署名し、サーバはクライアントの公開鍵で署名を検証します。

4. **セッション確立**
   - 認証が成功すると、セキュアな通信チャネルが確立されます。
   - クライアントはこのチャネルを通じてリモートコマンドの実行やファイル転送を行います。

### 詳細な説明

#### 鍵交換

鍵交換は、クライアントとサーバが共有するセッション鍵を生成するプロセスです。公開鍵暗号方式を用いることで、セッション鍵はネットワークを通じて安全に交換されます。

#### ユーザ認証

ユーザ認証には主に以下の方法が使用されます

- **パスワード認証**
クライアントがパスワードをサーバに送信し、サーバがそれを検証します。
- **公開鍵認証**
クライアントは自分の秘密鍵でサーバのメッセージに署名し、サーバはクライアントの公開鍵で署名を検証します。公開鍵認証はパスワード認証よりも安全です。

### まとめ

- **SSHの基本構造**
接続開始、鍵交換、ユーザ認証、セッション確立の手順で構成されています。
- **鍵交換**
安全なセッション鍵を生成し、通信を暗号化します。
- **ユーザ認証**
パスワード認証や公開鍵認証などの方法があります。

SSHは、これらの手順を通じて、リモートマシンとの安全な通信を実現します。
ネットワーク疎通確認のために覚えておきたいコマンド

# この記事は

ネットワークの疎通確認を行いたい時に知っていると得するコマンドを記します。

紹介するコマンドの実行結果は原因の切り分けに役立ちますし、基盤構築を行うなら知っていて損しないはず！

実行環境に「`ping`や`curl`も無いのですが！」という場合もありますので、事前に`which 〇〇〇`などを使ってコマンドが使える状態であることのご確認をお願いします。

# 実行環境

- Linux環境

# こういう場合に

- Webサーバーにブラウザで接続できない
- RDS(DB)のGUIクライアントやコマンドで接続できない
- SSHクライアントやリモートデスクトップ接続できない
- プロキシサーバーを経由して外部のネットワークに接続できない
- コンテナイメージを取得しようとしても外部ネットワークに出られない

# これをしてみる

## `ping [IPアドレスまたはホスト名]`

まずはこれ、と教えられるやつです。
「今までは応答が返って来ていたけれど、今は返って来ない」といった場合は接続先サーバーに何かが起きたか接続経路に問題が起きている可能性が有ります。

ファイアウォールやセキュリティーグループの設定でICMPが許可されていないと`connection timed out`になってしまいます。

そもそも接続先サーバーが起動していない...なんてこともあり得ます。
これだけでは原因特定に至らないので別のコマンドと併せて使うことをおすすめします。

## `curl -v [IPアドレスまたはホスト名]:[接続ポート番号]`

nginxやIISなどWebサーバーにHTTPリクエスト送信します。
返ってくるHTTPステータスコードが200なら接続できているので、ブラウザの設定に問題を抱えている可能性が有ります。HTTPステータスコードが500系なら接続できているけれど、接続先サーバーの設定が正しくないか何かしら別の問題が発生しています。
次のページで各ステータスコードの意味が確認できるので参考にしてみてください。
[mdn web docs](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)

HTTPヘッダーを付与したい場合は、`-H "Host: [FQDN]"`のように -Hオプションを付けて指定することもできます。

## `echo "" | /dev/tcp/[IPアドレスまたはホスト名]/[接続ポート番号]`

自分の中で使うことの多いコマンドです。
応答がない場合はファイアウォールやセキュリティグループで対象ポートへの接続が許可されていない可能性が有りますし、サービスがダウンしている可能性も考えられるので、別のコマンドと併用して細かく切り分けをする時に用いています。

また、`echo "" | /dev/udp/[IPアドレスまたはホスト名]/接続先ポート番号`にするとUDPで疎通確認を行えます。

もう少し解説すると、接続先ポートに到達できていればコマンドの返り値が`0`。到達できていなければ`0以外`が返ってきます。

誰かに実行してもらう場合には次の形式にすると良いかもです。
`echo "" | /dev/tcp/[IPアドレス]/[接続ポート番号] && echo "OK" || echo "NG"`
こうすることで接続先ポートに到達できた場合は標準出力に「OK」が、到達できない場合は「NG」が表示されます。

あとは、サービスを提供しているデフォルトのポート番号を覚えておくと楽ができます。


## `traceroute [IPアドレスまたはホスト名]`

pingの次に教えてもらうモノですね。
コマンド実行元から接続先サーバーまでに経由するロードバランサーやサーバーから応答が返ってくるので、「どこまで届いていて、どこで止まっているのか」を確認できます。
ただし、pingと同様にICMPに分類されるためセキュリティグループで許可されていない場合はタイムアウトします。

接続先サーバーまでの道中でタイムアウトするならば、タイムアウトが発生する手前のネットワークから向こう側のネットワークへのルーティング設定に問題があったり、そもそも向こう側のネットワークでアクセスを拒否されている可能性が有ります。

## `nslookup [IPアドレス]`

ホスト名で接続できないよ！って時に使います。
DNSサーバーに接続できないのか、接続先サーバーの名前がDNSレコードとして存在しないのかを切り分けられます。

## 接続元サーバーの設定確認

必ずしも自分以外の設定がおかしいとは限りません。
例えばyumを使ってパッケージをインストールしようにも接続失敗する！という時はyumとして持つプロキシ設定が有効になっていないなど、接続の前提となる設定が欠けている事もあります。
シェルの環境変数に`HTTP_PROXY`や`NO_PROXY`が無かっただけでした...お騒がせしました...、なーんてこともあります。

各コマンドがどの設定を元に動作するかを一度確認するのも有りです。

# おわりに

疎通確認に使用できるコマンドとして覚えておくと得をすることが多いコマンドを紹介しました。
AWSなどクラウド環境を前提に書いてしまいましたが、オンプレミス環境でも使える良いコマンドたちです。

頻繁にトラブルシューティングを行う機会があるなら、上記コマンドに加えて`nc`や`redis-cli`、`psql`、`sqlplus`、`tcpdump`などを詰め込んだコンテナイメージをdockerhubや会社のプライベートリポジトリにpushしておくと作業が捗ります。

最後に、ネットワークが不通の時こそ落ち着いて一つずつ被疑箇所を潰していきましょう。
どこからどこまで何の通信が通って、何が通らないのかを整理して自分のできる範囲で無理せずやっていきましょう。

以上です。ありがとうございました。
TypeScriptに入門する記事を書いてたらシリーズになってしまったのでまとめる

# はじめに

本記事では、過去に書いたTypeScriptに関する初心者向けに解説した記事を紹介します。これらの記事は（学問的あるいは体系的な知識を獲得することではなく）少しづつ成功体験を積み上げることを通して、楽しみながら抵抗感を克服し慣れ親しむことを意図しています。

# 目的・動機

プライベートでTypeScriptやGitを教える機会があり、その際に書いた記事が溜まってきたので、順序よくまとめた記事を作成しました。

# 動作環境・開発環境

- **OS**: 主に、Windows、Mac、Linuxなど、一般的なパソコンのOS
- **Node.js**: バージョン：18.20.1など
- **npm**: バージョン：10.8.1など

# 内容

これらの内容を一緒に勉強しました。

## 第1回

Node.js環境構築をして、簡単なTypeScriptの動作を確認します。

https://qiita.com/every-month/items/8f20dc7fde2b25be386f

## 第2回

実践的な`fetch`の使い方を学びます。インターネットから情報を得ます。例としてZaifのAPIからSymbolの価格を取得します。

https://qiita.com/every-month/items/8b26eaf17d4fd9ed43b1

## 第3回

Next.jsを使って実践的なWebアプリケーションを作る基礎を学びます。このシリーズでは簡単のため、特に記載がない限り、AppRouterの場合のみを取り扱うこととします。PagesRouterは特に意識しません。

https://qiita.com/every-month/items/1da2de989732fe721055

## 第4回

[第3回](#第3回)で作成したWebアプリケーションは装飾に乏しいものでした。今回はTailwindCSSを使ってその装飾に入門します。

https://qiita.com/every-month/items/983587bbdeec91b438c9

## 第5回

[第4回](#第4回)まで作成してきたWebアプリケーションに画像を掲載する方法を学びます。このことを通していくつかのTypeScriptやTSXの記法を学びます。

https://qiita.com/every-month/items/9a3d7f1e53d8572525a2

## 第6回

Gitをインストールして、GitHubで公開されているNext.jsのWebアプリケーションを動作させることを学びます。

https://qiita.com/every-month/items/7345c2d8e23b2fb720fe

## 第7回

新しいページを作成して、リンクを貼ることを学びます。

https://qiita.com/every-month/items/84a5dc110fc06850fd3c

## 第8回

[第6回](#第6回)の方法でダウンロードしたフォルダは常に最新のものでした。今回はそのフォルダからより過去の状態にさかのぼる方法を学びます。

https://qiita.com/every-month/items/35ab34925536877a4e96

## 第9回

これまでは使うだけだったコンポーネントという概念について、実際に簡単なコンポーネントを作りながら学びます。

https://qiita.com/every-month/private/ad529ee12a91f016bfd7

# まとめ

これらの内容を通じて、TypeScriptの基本から実践的なアプリケーション開発までのステップを学んでまいりました。また一緒に学ぶ機会がありましたら、ぜひ記事を追加していきたいと考えています。
IBM i Services Directory : QSYS2.QCMDEXCプロシージャー と IBM i 実行時ユーザーIDの確認法

## 概要
■プロシージャー名：QSYS2.QCMDEXC
■カテゴリ：アプリケーションサービス
■サポート：IBM i 7.2以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-user-info-view

IBM i ユーザー・プロファイルの設定値やログイン失敗回数などのステータスを取得・表示します。

## 使用例

```
CALL QSYS2.QCMDEXC('ADDLIBLE PRODLIB2');
```

ADDLIBLEが実行するCLコマンド例です。

## ACSのSQLスクリプト実行画面からQCMDEXC実行と、その結果の確認例

***手順①***
基本のキですが、ACSのSQLスクリプト実行からIBM i に接続すると、メッセージ欄にIBM i 側のジョブ名が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e38f9e6d-e1a3-f5b7-b0ee-547b62827fe2.png)

上記の例だと、ジョブ名は ***244530/QUSER/QZDASOINIT***ですね。
(あえて）5250 WRKACTJOBで確認してみると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e359b1e9-30cd-33ac-9920-245718a80559.png)

一番下のQZDASOINITがそれっぽいです、詳細を 5 で表示すると、同じジョブ番号だと分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3f299c37-0aa6-56d8-1b9b-41d4256bc086.png)

このジョブのライブラリー・リストを 13 で確認すると、下記が表示されました。ライブラリーが7つリストされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ab8427d5-787f-5080-f703-b93c0d5300db.png)

***手順②　SQLスクリプト実行からADDLIBLEコマンドを実行してみる***

上の方のCLコマンドサンプルを実行します。*LASTに追加してみます。下記のようにPOSITIONパラメーターを追加します。

```
CALL QSYS2.QCMDEXC('ADDLIBLE LIB(GOMALIB) POSITION(*LAST) ');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d90ef58a-8bcf-caee-7b04-dfae8ea7e481.png)

正常に実行された、とメッセージがでます。

***手順③ 5250で再度ライブラリー・リストを調べてみる***

SQLスクリプト実行画面のIBM i OS側ジョブ、***244530/QUSER/QZDASOINIT***　のライブラリー・リストを上記①の手順で改めて確認すると下記になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8564b192-68e4-4c1d-4001-5ade8874f9c8.png)

***最下部（*LAST）にライブラリー GOMALIB が追加されました。


## おまけ：QZDASOINITのユーザーIDについて

SQLスクリプト実行や、WINDOWSほかからのODBCジョブ、JAVAからのJDBCジョブはすべてQZDASOINITサーバージョブが受け口になります。***QZDASOINITジョブはサブシステムQUSRWRKが起動する際、サブシステムの事前開始ジョブ項目（Pre-Start job項目）を参照して（そこに登録されているので）、起動します。***

※WRKSBSDコマンド　→　QUSRWRKのオプション10 事前開始ジョブ項目から確認できます。

この時、QZDASOINITジョブはすべてQUSER ユーザー・プロファイルで起動されます。
このままですと、実行権限が不足する、個々の接続ユーザーIDに応じたセキュリティ権限を参照できないなど問題が出ますので、今回の例ではACSでSQLスクリプト実行画面にログインした際のユーザー（例では GOMA）のユーザー・プロファイルの権限を引き継いで実行することになります。

それが、下記のWRKACTJOB画面で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/22eaa334-373e-9c37-159e-6c26672df1d1.png)

最上部のユーザー：QUSER　：　ジョブQZDASOINITが事前開始ジョブから開始された際のユーザー・プロファイル
現行ユーザー・プロファイル、ジョブ・ユーザー識別：GOMA　：　SQLスクリプト実行画面でサインオンしたユーザー・プロファイル

です。
したがって、***ジョブ 244530/QUSER/QZDASOINIT はユーザー・プロファイル GOMA の権限を参照して実行される*** ことになります。