OmniAICreator/Qiita-1.07M huggingface dataset:
アプリ作成

## アプリのアイディア出し
今回はチームで話し合い、日報投稿を簡単にするためのアプリ「簡単日報」を作ることにしました。


![スクリーンショット 2024-04-09 15.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1838981/593100d9-b25d-6ae7-167e-91e0edfde293.png)

## 今回使用した技術やツール
コード管理：Github
フロントエンド言語：HTML,CSS
バックエンド言語：Ruby,Rails
データベース：MySQL
## 遭遇した課題や問題、それをどのように解決したか
**課題と問題点**
①チームメンバーが二人と他のチームに比べ少なかった。
　
②DiscordのAPIを使いアプリケーションと連携する部分の実装が終わらなかった。
　
**どのように解決したのか**
①作成する機能を絞り、二人で作れる範囲の規模感のプロダクトに切り替えた。
もともと作りたい機能は多数あったのですが、作業量的に厳しいと感じたため作成するアプリの規模感を縮小しました。

②この機能に関しては途中から実装をやめ、他の機能に集中して実装するように切り替えました。

## プロジェクトを通じて学んだことや個人的な成長。
**チームとしての経験から得られた教訓**
- チームメンバーに対してもっと意見をはっきりと言う。
遠慮をして何も言わないでいると後々問題になるので、何かに気づいたらその場ですぐに言う。
- 相手の意見を全て肯定するだけでなく、「ここをこうしたらいいんじゃない？」というような提案をする。

## 完成したアプリケーションの機能や特徴。
**機能や特徴**
　　　　新規登録/ログイン機能
  日報投稿機能
  アワード一覧機能
  マイページ機能
  
新規登録/ログイン機能
![スクリーンショット 2024-04-09 16.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1838981/bd845420-f2b8-688f-c1c1-3f87b6728c2a.png)

 日報投稿機能
 ![スクリーンショット 2024-04-09 16.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1838981/0371832e-b801-a0e3-06bf-f464a02fc179.png)

アワード一覧機能
![スクリーンショット 2024-04-09 16.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1838981/c4f8d12c-0263-d239-ba8c-c27666f30843.png)

マイページ機能
![スクリーンショット 2024-04-09 16.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1838981/e6eed543-829a-0651-7173-4873d37834a3.png)
Playwrightを利用し、お問い合わせフォームへのテストを自動化する

# はじめに
業務でContact Form7を利用した問い合わせフォームの作成・内容の変更をすることがあり、内容の変更に伴う動作の検証を行うにあたって、テストフレームワークとしてPlaywrightを使用してみたところ、使いやすかったのでPlaywrightによるテスト作成の簡単な手順を書きます。

今回はフォームは何でも良いので、Google Formで作成したものを利用します。

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Playwrightとは
Microsoftによって開発され、2020年1月にリリースされたWebアプリケーション用のテストフレームワークです。
有名なテストフレームワークとしては他にも、SeleniumやPuppeterなどがあるようです。

# Playwrightのインストール方法
Node.jsのパッケージ管理をするツールでPlaywrightをインストールします。
ここではbunを利用しますが、npmやyarnでも大丈夫です。
```
$ bun create playwright
✔ Do you want to use TypeScript or JavaScript? · TypeScript
✔ Where to put your end-to-end tests? · tests
✔ Add a GitHub Actions workflow? (y/N) · false
✔ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n) · true
```
色々聞かれますが、全部Enterを押して問題ないです。
作成後にちゃんと作られているか確認してみます。

```
$ ls
node_modules		package.json		tests
package-lock.json	playwright.config.ts	tests-examples
```

testsディレクトリの中に入っている、example.spec.tsを変更することでテストを作成できます。

# お問い合わせフォームの用意

本題ではないので省略します。
Google Formで作成した例で進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472147/9ddc39cf-2fce-2327-fb81-caf3bdd8f0a2.png)

# example.spec.tsの編集

まずは簡単な、タイトルをチェックするだけのテストを書いてみます。
```typescript:example.spec.ts
import { test, expect } from '@playwright/test';

test('check title', async ({ page }) => {
  await page.goto('https://forms.gle/xxxxxxxxxxxx');

  await expect(page).toHaveTitle('自己紹介');
});
```

Playwrightの文法は調べて書くこともできますが、codegenを利用して書いてもらうこともできます。
コンソールで、`npx playwright codegen`を実行すると、ウインドウが2つ開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472147/1ace6c40-abdf-4abf-9fc7-da029c7fa5b7.png)

左のウインドウでテストしたい操作を行うと、自動で右ウインドウにコードが生成されます。

自動でコードが生成されるので、必要そうな行をexample.spec.tsに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472147/4d20096b-ac26-acd2-71dd-8f7ae97e85de.png)

完成したコードはこちらになります。

```typescript:example.spec.ts
import { test, expect } from '@playwright/test';

test('check title', async ({ page }) => {
  await page.goto('https://forms.gle/zWiKjVh9eJCc83gG7');

  await expect(page).toHaveTitle('自己紹介');
});

test('お問い合わせフォーム送信', async ({ page }) => {
  await page.goto('https://forms.gle/zWiKjVh9eJCc83gG7');
  await page.getByLabel('名前は何ですか').click();
  await page.getByLabel('名前は何ですか').fill('wkani');
  await page.getByLabel('東京').click();
  await page.getByRole('button', { name: '送信' }).click();
});
```

# テストの実行
テストの実行は、`npx playwright test --ui`で実行できます。
`--ui`はなくても実行できますが、つけるとGUIツールとして操作できるので、最初はこちらの方が実際の画面遷移などがわかりやすいので良いと思いました。

緑の三角マークを押すとテストが実行され、エラーが起きないと緑のチェックマークが付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472147/5f516e4e-4668-b895-ca96-5b77d181667c.png)

以上の手順で、サーバやWordPressの設定変更などを行ったりした際、問い合わせフォームがちゃんと動いているかのテストを簡単に行うことができます。
ジョブ管理システム…？

## はじめに
現在、参画しているプロジェクトでジョブ管理システムを現行のTivoliからJP1に更改するという追加対応がユーザー側から急に降って湧いてきた。ちぼり？じぇーぴーわん？そんなものは見たことも聞いたこともないので、調べてわかったことを残していく。

## ジョブ管理システムってなんぞや
>ジョブ管理システム（ジョブかんりシステム）とは、コンピュータ上での複数のジョブ（プログラム、バッチ処理）の起動や終了を制御したり、ジョブの実行・終了状態の監視・報告などを行うソフトウェアで>ある。「ジョブスケジューラ」、「タスクスケジューラ」とも呼ばれる。 ([Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%96%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)より)

ジョブ管理はコンピュータ上のプログラムや、予約したプログラムを実行するバッチの処理などのジョブを制御・監視すること。コンピュータ上のジョブは大量にあり、営業日変更時や夜間に流すジョブなど煩雑になるので、ジョブ管理システムで管理を自動化している。
人間にやらせるとコストや時間も大変だし、ミスも出るからシステム化しようねってことらしい（今更感）


主な機能は3つ
+ ジョブの実行設定
    実行順序などの設定ができる。
+ ジョブのスケジューリング
    日時指定などを実行条件として事前に登録することができる。
+ ジョブの監視／ログ保存
    ジョブの実行状態の監視をし、ログを残すことができる。ジョブ実行において異常があった場合、管理者にリアルタイム通知が発砲される。

## 主なジョブ管理システム

### JP1
日立が提供するジョブ管理システム。当初のメインフレームでの運用管理にはじまり、Windows、Linux、UNIXといった各種プラットフォームをはじめ、クラスタや仮想化プラットフォーム、クラウドサービスなど、幅広い環境に対応している。国内シェアNo.1


### Tivoli
IBMが提供するジョブ管理システム。JP1と基本的な機能の違いはあまりない。
ただただ無名。

<br>
JP1はQiitaで調べると記事が数多く出てくるが、Tivoliに関してはほぼ出てこない。
使い分けに関しては委託しているベンダーによって変わってくると思われる。
Excelカスタム関数BB.MAJORITY()の紹介: AIの多数決によるテキストの分類

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70223/0fc0ccdd-2252-d868-861f-1a319290f4ae.png)

みなさん、こんにちは。Qiitaへの初の投稿では、弊社のExcelアドイン[「生成AIツール for Excel」](https://appsource.microsoft.com/en-us/product/office/wa200006231?tab=overview)の画期的な新機能であるBB.MAJORITY関数を紹介します。この関数は、AIの多数決により、大量のテキストデータをExcel内で直接分類できます。以下では、この革新的な手法の可能性と課題を述べます。

# BB.MAJORITYの可能性
BB.MAJORITY関数を使うと、人間には分類や検証が不可能な量のテキストを扱えるようになり、分類の妥当性を説明可能になります。カスタマーサポート履歴やアンケートの回答が数千あろうが数万あろうが、Excelシート内の数秒から数分の作業で分類できます。しかもAIによる多数決により、ひとつのAIに回答させることの恣意性を排除できます。

たとえば、BB.MAJORITYを使って「バナナは食事ですか？それともおやつですか？」という我が国の長年の議論に決着を付けましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70223/3d8a7e4e-26fd-ab65-b047-f92ff2e0abc3.png)
[『先生！バナナはおやつに含まれますか？』](https://amzn.asia/d/3fUMxBJ) -- この問題は法律入門書のテーマにすらなっている

従順な国民の育成を目的にした我が国の学校教育では、山や公園への遠足にもルールがあります。手作り弁当の他に、500円以内のおやつを持参できるとして、生徒が食事の一部としてバナナを持参した場合、さらに500円のおやつを持参できるかが問題になるのです。子どもたちにとっては重大な問題です。教師がバナナはおやつではないと宣言した場合、生徒はバナナと500円のおやつの両方を持って行けるからです。

この問題は、

```
=BB.MAJORITY({"gpt-3.5-turbo","You are a liberal elementary school teacher.";"gemini-1.0-pro","You are a centrist elementary school teacher.";"claude-2.1","You are a conservative elementary school teacher."},"バナナ",{"食事","おやつ"},2)
```
というExcel式で解決できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70223/fbc57006-3c9b-be66-dc85-dfad460a077a.png)
この例では、AIの多数決により「バナナはおやつである」と分類された

上記の例では、BB.MAJORITY関数は、ChatGPT、Gemini、ClaudeのAPIにリクエストを送信します。関数の最後の引数「2」は、2/3以上のAIが同じ判定を返した場合に、その分類を関数の出力とせよ、の意味です。

このようにBB.MAJORITY関数は多数決によって分類を決定するため、たとえ各AIの判断が偏っていても「客観的な分類」に近づきます。テキストを分類できれば、感情分析やその他の手法と組み合わせて、フリーテキストを定量的に分析できます。

# BB.MAJORITYの挑戦
ただし、AIによる多数決には、潜在的な問題が4つあります。

1. 過半数に達しないこともある
2. 過半数のAIが間違えることもある
3. すべてのAIから応答があるとは限らない
4. 決定過程が不透明

まず、AIによる分類はそれぞれのAIのクセが反映されます。AIが多数意見を形成できない場合、BB.MAJORITY関数は失敗となり、#N/Aエラー（AIなのにExcelぽい:smiley:）を返します。この場合は人間が判断することになります。

また、現在のAIは非常に人間に近い判断をしますが、「分類」とは本質的に恣意的であり、必ずしも期待どおりに分類されるとは限りません。数十件なら人間がAIによる分類を検証できますが、数百以上になるとまず検証できません。議会制民主主義と同様、AIに多数決させたからといって、一貫して合理的な結果が保証されるわけではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70223/b5009c20-c321-2bc8-d786-5f4dc910f588.png)
英語圏では「バナナはおやつか？」に相当するのは「トマトは野菜か？」問題である

さらに、各社のAIのAPIには、異なるポリシーが適用されます。文章によっては回答が拒否されることもある。また、AIシステムが過負荷になると、出席人数が足りずに、過半数に達しないこともある。現在の実装では、応答を返したAIが75%未満の場合、エラーを返す。

最後に、AIがなぜそう判断したのかは明らかにされません。人間社会の民主主義では、議論を通じて結論が正当化されますが、AIの意思決定はブラックボックスです。

# 結論
BB.MAJORITY関数は、人間には不可能なスケールでテキストを迅速に分類できる革新的なExcel関数です。課題はあるものの、AI多数決は、主観的な分類の決定をより客観的にする新しい方法として、非常に有望だと考えています。

フリーテキストは定量的に分析しにくいとされてきましたが、分類できれば、分析の可能性が大きく広がります。BB.MAJORITYを含む[「生成AIツール for Excel」](https://appsource.microsoft.com/en-us/product/office/wa200006231?tab=overview)アドインは無料で利用できます。ぜひ試してみて、大量のテキストの分類と分析を試してみることをお勧めします。

AI多数決はまだ進化中のテクノロジーです。しかし、改良を続けることで、より信頼性の高い分類を実現できるはずです。AIの意思決定の透明性を向上させることは重要な課題であり、皆様からのフィードバックをもとに、テクノロジーの可能性を最大限に突き詰めて参ります。ご期待ください。

※この投稿は[Mediumの記事](https://medium.com/@kappei/introducing-bb-majority-242cb15d2fec)の翻訳です
Java　多次元の配列

多次元とは、１つ以上の次元をもつ配列
## 一次元配列と多次元配列の違い
一元配列
・要素は線形に並んでる。
・要素へアクセスは1つの添え字で行う。

多次元配列
・一つ以上の次元を持つ配列。
・要素をを表形式やより複雑なデータ構造で表現できる
・要素へのアクセスは二次元配列場合は2つ、三次元以上の場合はそれ以上の添え字が必要になる
```
例）
int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
matrix[0][0]
matrix[1][2]
```

#### 二次元配列の例
```
public class MainExample {
    public static void main(String[] args) {
        // 学生のテストの点数を表す二次元配列
        int[][] scores = {
            {80, 75, 90},
            {85, 70, 85},
            {90, 80, 95}
        };

        // 二次元配列をそのまま出力する
        for (int[] studentScores : scores) {
            for (int score : studentScores) {
                System.out.print(score + "\t");
            }
            System.out.println();
        }
    }
}
```
ApexでJSのfindIndex的なメソッドを実装してみた

## 背景
特定の値が一致したら`Map<String, String>`のキーを探したいというメソッドを作るためです。
そこでJS好きの僕はfindIndexを思い出しました。

## ロジック
ApexでJavaScriptのような`Map<String, String>`の`findIndex`機能を実装するには、マップのエントリを反復処理し、各エントリを条件と照合する必要があります。Apexのマップは配列やリストのように順序付けられたインデックスを維持しないため、特定のキー値ペアの「インデックス」を条件に基づいて見つける必要がある場合、通常はリストを使用してこの機能をシミュレートします。

## 実装
```apex
public class MapUtils {
    /**
     * 指定された条件を満たすMap<String, String>の最初のエントリのインデックスを見つけます。
     * 
     * @param map 検索するマップ。
     * @param condition 各エントリに対して評価する条件。
     * @return 条件を満たす最初のマップエントリのインデックス、見つからない場合は-1。
     */
    public static Integer findIndex(Map<String, String> map, MapCondition condition) {
        // インデックスベースの順序を持つために、マップキーをリストに変換する
        List<String> keys = new List<String>(map.keySet());

        // 条件を満たす最初のキーを見つけるためにキーのリストを反復処理する
        for (Integer i = 0; i < keys.size(); i++) {
            String key = keys[i];
            String value = map.get(key);

            // 現在のエントリが条件を満たしているかどうかをチェック
            if (condition.evaluate(key, value)) {
                return i; // 条件が満たされた場合はインデックスを返す
            }
        }

        return -1; // 条件を満たすエントリがない場合は-1を返す
    }

    /**
     * マップエントリに対して評価する条件を定義するインターフェース。
     */
    public interface MapCondition {
        Boolean evaluate(String key, String value);
    }
}

```

### 使う場面
次に、上記のユーティリティクラスを使用して、カスタム条件に基づいてマップエントリのインデックスを見つけることができます。例えば：
```apex
// 使用例
Map<String, String> myMap = new Map<String, String>{
    'a' => 'apple',
    'b' => 'banana',
    'c' => 'cherry'
};

// 値が'b'で始まるかどうかをチェックする条件を定義
MapUtils.MapCondition condition = new MapUtils.MapCondition() {
    public Boolean evaluate(String key, String value) {
        return value.startsWith('b');
    }
};

// 条件を満たす最初のエントリのインデックスを見つける
Integer index = MapUtils.findIndex(myMap, condition);
System.debug('Index: ' + index); // マップが挿入順序を保持していると仮定すると、1を出力するはずです
```
## 注意点
Apexにおけるマップキーのイテレーション順序は通常、挿入された順に従いますが、この挙動が公式文書で明確に保証されている訳ではありません。そのため、順序が特定の使用ケースにとって重要である場合、Listを活用するか、または順序の整合性を確実にするためにキーの別のリストを保持することを推奨します。これにより、予期せぬ挙動を防ぎ、アプリケーションが正確に要件を満たすことができるようになります。
WindowsのGit bashでファイルの中身を1行ずつ読み込む際の注意点

# はじめに
テキストファイルの中身を1行ずつ読み込んで処理するシェルスクリプトを書いたときに、意図しない動作になり解決に至ったので記事にします。
(めちゃくちゃ初歩的な内容です)

# 結論
:::note
　／＼／＼／＼／＼／＼／＼／＼／＼／＼／＼／＼／＼
＜　　　　　　　　　　　　　　　　　　　　　　　　＞
＜　 読み込むファイルの改行コードを`LF`にしよう！ 　＞
＜　　　　　　　　　　　　　　　　　　　　　　　　＞
　＼／＼／＼／＼／＼／＼／＼／＼／＼／＼／＼／＼／
:::

# 環境
Windows11
Git bash
VS Code(ファイルの作成、改行コードの確認、変更に使用)

# 再現
## 読み込んだ内容をそのまま表示
```bash
for id in $(cat ids.txt); do echo $id; done
```

```plaintext:ids.txt(CRLF)
1234
2345
3456
```

```plaintext:結果
1234
2345
3456
```

ここまでは問題ない

## 読み込んだ内容を文字列内に埋め込んで表示

```bash
for id in $(cat ids.txt); do echo "\"$id\""; done
```

```plaintext:ids.txt(CRLF)
1234
2345
3456
```

```plaintext:結果
"1234
"2345
"3456"
```
出力結果がおかしくなる

## `while read`に変えてみる
```bash
while read id; do echo "\"$id\""; done < ids.txt
```

```plaintext:ids.txt(CRLF)
1234
2345
3456
```

```plaintext:結果
"1234
"2345
"3456"
```
これでも変わらない

## 原因
特に調べたりしたわけではなく何となく思いついただけなのですが、原因は`ids.txt`の改行コードが`CRLF`だったからでした。
```bash
for id in $(cat ids.txt); do echo "\"$id\""; done
```

```plaintext:ids.txt(LF)
1234
2345
3456
```

```plaintext:結果
"1234"
"2345"
"3456"
```
改行コードを`LF`になおすと`for`でも`while`でもうまくいきました。
Yard の開発者体験向上の取り組み

# はじめに
現在、私は、[Yard](https://yard.tips/)というサービスを開発しています。

Yard は、テック人材（エンジニア、デザイナー、マーケター、PdMなど）の情報共有コミュニティWebサービスです。
テック人材の知見を「記事」として公開し、読者が30分単位で記事の内容について「相談」できます。「スキマバイト」のような手軽さでテック領域の専門性を売買できる未来を目指しています！

# 開発者体験の向上

さて、Yardの技術スタックは[こちら](https://yard.tips/toitech/articles/clsobaxlr0001s60gxk6e9gnk)に紹介されています。
しかしながら、まだβ版ということもあり、細かい部分は未整備な状況です。
今後、近いうちにこれはやるというToDoをまとめてみたいと思います。


### Prettierの導入

next.jsで書かれているYardですがフォーマッタをCIに組み込めていません。
[Prettier](https://prettier.io/)をローカルで実行して、コミットする感じです。
CI/CDをCloud Buildで実行しているので、PR作成時に綺麗にする処理を追加したいなと思っています。


### バッチ処理の実行の自動化

検索のインデックス登録処理など、現状、手動でやっていますが、記事の更新が頻繁に起こるようになったら、自動化する必要があります。
YardがGCPで運用されているため、Cloud Run Jobs + Cloud Schedulerで定期実行処理を作る予定です。


### 管理画面の開発

データをいじる際、現状、CLIからpostgresqlにアクセスし、データを書き換えています。
しかし、部分的には、管理画面を作り、オペレーションを簡略化させたいと考えています。

### エラー通知

cloud loggingのエラー通知も現状、最小限のものですが、今後は充実させていきたいと考えています。


# さいごに

テストユーザーを募集しています。以下のXの投稿からメンションいただくか、本記事にコメントいただいても構いませんので、お気軽にどうぞ！

https://twitter.com/toitech/status/1776571857749385726
cscの作法 その484

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
comboboxの、ValueMemberを検索して、SelectedIndexを設定せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/fb55809a-5844-0f52-3051-30bc42db2d9b.png)


# サンプルコード

```



using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Data;

namespace App
{
	public partial class Form1: Form {
		ComboBox comboBox1;
		Button button1;
		DataTable dt;
		public Form1() {
			Text = "ComboBox";
			ClientSize = new Size(200, 200);
			Label label = new Label();
			label.Location = new Point(10, 50);
			label.Text = "フルーツ";
			Controls.Add(label);
			dt = new DataTable();
			dt.Columns.AddRange(new DataColumn[] {
				new DataColumn("id", typeof(int)),
				new DataColumn("name", typeof(string))
			});
			dt.Rows.Add(0, "");
			dt.Rows.Add(1, "バナナ");
			dt.Rows.Add(2, "マンゴー");
			dt.Rows.Add(3, "パパイア");
			dt.Rows.Add(4, "キウイ");
			comboBox1 = new ComboBox();
			comboBox1.Location = new Point(30, 100);
			comboBox1.DataSource = dt;
			comboBox1.DisplayMember = "name";
			comboBox1.ValueMember = "id";
			comboBox1.SelectedIndex = -1;
			comboBox1.SelectedValueChanged += comboBox1_TextChanged;
			Controls.Add(comboBox1);
			button1 = new Button();
			button1.Text = "set";
			button1.AutoSize = true;
			button1.Dock = DockStyle.Bottom;
			button1.BackColor = Color.Aqua;
			button1.Click += new EventHandler(button1_Click);
			this.Controls.Add(button1);
		}
		private void comboBox1_TextChanged(object sender, EventArgs e) {
			int n = comboBox1.SelectedIndex;
			string str = comboBox1.Text;
			string str1 = comboBox1.SelectedValue.ToString();
			MessageBox.Show("selected: " + n + " (" + str + ": " + str1 + ")");
		}
		private void button1_Click(object sender, EventArgs e) {
			for (int i = 0; i < dt.Rows.Count; i++)
			{
				DataRow row = dt.Rows[i];
				if (Convert.ToInt32(row["id"]) == 2)
					comboBox1.SelectedIndex = i;
			}
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}






```


以上。
WSUS や SUP で扱える更新プログラムの「分類」の意味

# 正解となる設定

Windows 10/11 を管理する場合は以下を選択する。

- Upgrades (FU)
- セキュリティ問題の修正プログラム (QU、.NET 更新)
- 更新 (.NET 更新、Edge)
- 修正プログラム集 (悪意あるソフトウェアの削除ツール)
- 定義更新プログラム (Defender 定義)

# 分類の詳細
## Feature Packs

選択しない。
サポートが切れた古い OS 用の新しい機能が利用できる。

例:
- Microsoft Silverlight
- Windows 7 用 Microsoft .NET Framework

## Service Packs

選択しない。
サポートが切れた古い OS やアプリの新しい Service Pack や累積的な更新プログラムが利用できる。

例:
- Windows 7 Service Pack
- Microsoft Office 2013 Service Pack
- Microsoft SQL Server 2012 Service Pack

## Upgrades

必要に応じて選択する。
Windows 10/Windows Server 2016 以降の機能更新プログラムが対象。

## セキュリティ問題の修正プログラム

必ず選択する。
様々な製品のセキュリティ関連の更新プログラムが対象。

- Windows 10/11 の月次品質更新プログラム
- Microsoft .NET Framework の累積的な更新プログラムのうちセキュリティに関連するもの
- 各種製品のセキュリティ更新プログラム

## ツール

選択してはいけない。
「タスクまたはタスクの実行を支援するユーティリティや機能」というものが対象になる。
おそらくサポートが切れた古い OS やアプリが対象。
その機能が何なのかわからないため、選択したとして何が起こるかわからない。

例:
- ネットワークの診断ツール (KB914440)

## ドライバ

選択してはいけない。
WSUS で配布できるドライバーやファームウェアが利用できる。
最新のドライバがダウンロードできるわけではなく、各ベンダーが個別に申請してきたものが掲示されるだけのもの。そのため、おそらくドライバを最新化するという目的は果たせない。
相当規模のドライバが存在しており、WSUS のリソースを消費するためメリットよりも圧倒的にデメリットが大きい。

## ドライバーセット

選択してはいけない。
「特定のハードウェア モデルをサポートするソフトウェア モジュールのパッケージ」というものが対象になる。
特定のハードウェア モデルが何なのかわからないため、選択したとして何が起こるかわからない。

## 更新

選択してもよい。
様々な製品の更新プログラムが対象。

例:
- Microsoft .NET Framework の累積的な更新プログラムのうちセキュリティに関連しないもの
- Microsoft Edge
- Windows Server 2012 R2 用更新プログラム

## 修正プログラム集

選択してもよい。
悪意のあるソフトウェアの削除ツールが対象。

## 重要な更新

選択しない。
セキュリティに関連しない、重大な不具合や特定の問題に対する更新プログラムが利用できる。
Windows 10 1903 以降利用されていない。

例:
- Windows 8.1 用更新プログラム

## 定義更新プログラム

ウイルスなどの定義ファイルのパッケージが利用できる。

例:
- Microsoft Endpoint Protection の定義ファイル
- Windows Defender の定義ファイル

# 参考

https://learn.microsoft.com/en-us/windows-server/administration/windows-server-update-services/manage/viewing-and-managing-updates?source=recommendations#update-products-and-classifications

https://jpmem.github.io/blog/wsus/2018-06-19_01/

https://t-dilemma.info/classifications-wsus-w2k22/

https://infra-memorandum.com/classification-and-products-of-wsusserver/
AtCoder Beginner Contest 348参戦記録(A～C問題)


RubyでAtCoderに参戦した記録です。
今回はABC3完でした。

## [ABC348 A Penalty Kick](https://atcoder.jp/contests/abc348/tasks/abc348_a)
N回のペナルティキックの結果を「o」と「x」で記述します。３の倍数回目の時のみキックに失敗するそうです。

```Ruby
n= gets.to_i
for i in (1..n) do 
  if i % 3 ==0
    print "x"
  else
    print "o"
  end
end
```
特に難しいわけでもないのですが、最初n.timesで書こうとして「あれ？」となりました。
```Ruby
# 誤答です
n.times do
  if (n+1)%3 == 0
    print "x"
  else
    print "o"
  end
end
```
.timesでは0~nまでが順番に渡されるという記憶があったのですが、それは下記のようにパラメータを設定した時ですね。
```Ruby
n.times do |i|
  if (i+1)%3 == 0
    print "x"
  else
    print "o"
  end
end
```


## [ABC348 B Farthest Point](https://atcoder.jp/contests/abc348/tasks/abc348_b)
座標上に与えられたN個の点について、それぞれの点から距離が最大の点の番号を出力します。距離が最大の点が複数個ある場合は、それらの点のうち番号が最も小さいものを出力します。

距離を求めるのにルートの計算が必要ですが、小数を扱うと誤差が生まれるためなるべく整数で計算できる方法を考えよう、と下記の本にあったのを思い出し、ルートの計算はしない状態で大小比較をしています。
https://www.amazon.co.jp/dp/B09C3TPQYV

各点同士の距離を記録するのに、二次元配列dを用意しました。
各点の距離の２乗を計算し、配列に代入していきます。
この時d[i][j]とd[j][i]は、点iと点jの距離ということで同じ数値が入ります。

例）点が4個でそれぞれの座標が(0,0),(2,4),(5,0),(3,4)だったとき、配列dは[[0, 20, 25, 25], [20, 0, 25, 1], [25, 25, 0, 20], [25, 1, 20, 0]]となります。表にするとこんな感じです。
|  | 0 | 1 | 2 | 3 |
| --- | --- | --- | --- | --- |
| 0 | 0 | 20 | 25 | 25 |
| 1 | 20 | 0 | 25 | 1 |
| 2 | 25 | 25 | 0 | 20 |
| 3 | 25 | 1 | 20 | 0 |

最後に、各行についてその行の最大値を持つ最小のインデックスを割り出します。Array#indexは、引数と==で等しい要素を持つ最初のインデックスを返すので、これを利用しました。点の番号は1から始まるので、+1をして出力します。

```Ruby
n= gets.to_i
array = []
n.times do
	array << gets.split(" ").map(&:to_i)
end

d = Array.new(n) { Array.new(n) }
for i in (0..n-1)
  for j in (0..n-1)
    distance = (array[i][0]-array[j][0])**2 + (array[i][1]-array[j][1])**2
    d[i][j] = distance
    d[j][i] = distance
  end
end

d.each do |p|
  puts p.index(p.max) + 1
end
```
二次元配列の初期化の方法が間違っていることに気づかず、だいぶ時間をロスしてしまいました。悲しみ…


## [ABC348 C Colorful Beans](https://atcoder.jp/contests/abc348/tasks/abc348_c)
N種類のビーンズが1粒ずつあり、それぞれおいしさA、色Cの情報が与えられます。色でしか見分けがつかない中でどれか1粒を選ぶとき、おいしさの最小値の最大値を出力します。

この問題はA、Cなどの値の制約が10の9乗以下とかなり大きいので、工夫しないとTLEになることが予想されます。
過去のコンテストから、ハッシュを使って値を管理するとよさそうだなと推測し実装しました。
具体的には、h = {ビーンズの色 => その色のビーンズの美味しさの最小値}となるように、各ビーンズの情報を1つずつ調べ値を更新していきます。
最後に、ハッシュの全値のうちの最大値を求めることで、おいしさの最小値の最大値が求まります。

```Ruby
n= gets.to_i
array = []
n.times do
	array << gets.split(" ").map(&:to_i)
end

h = {}
array.each do |a|
  if h[a[1]].nil? || h[a[1]] > a[0]
    h[a[1]] = a[0]
  end
end
puts h.values.max
```
この問題はサクッと解けたので、B問題より先にやっておけばよかった…と少し後悔。。



## おわりに
配点が250点の時はC問題も解けることが多いようです。300点問題も解けるようになるぞ！

## 参考リンク
https://docs.ruby-lang.org/ja/3.2/library/_builtin.html
[AIX]dbxでcoreから環境変数を表示する方法

### dbxでcoreから環境変数を表示する方法
/usr/include/unistd.hに下記の変数があります。
```
extern char **environ;
```
このファイルをincludeしてアドレスを確認すると0x2ff22ff4であることが確認できます。(公開情報は見つかりませんでしたが、定数のようです。)
```
例)
printf("%08x\n", &environ);
```
**environのため、2回アドレスから値を表示します。
```
(dbx) 0x2ff22ff4/X
0x2ff22ff4:  30071538
(dbx) 0x30071538/X
0x30071538:  2ff22dc8
```
環境変数の個数は分からないため、30sや100sで多めに出力し、文字列の領域を確認します。
```
(dbx) 0x2ff22dc8/30s
0x2ff22dc8: "_=/opt/rsct/bin/rmcd"
0x2ff22ddd: "LANG=Ja_JP"
0x2ff22de8: "LOGIN=root"
0x2ff22df3: "CLCMD_PASSTHRU=1"
0x2ff22e04: "PATH=/opt/rsct/install/bin:/opt/rsct/bin:/usr/bin:/usr/sbin:/bin:/sbin"
0x2ff22e4b: "CORE_NAMING=1"
0x2ff22e59: "LC__FASTMSG=true"
0x2ff22e6a: "LOGNAME=root"
0x2ff22e77: "LOCPATH=/usr/lib/nls/loc"
0x2ff22e90: "USER=root"
0x2ff22e9a: "AUTHSTATE=compat"
0x2ff22eab: "SHELL=/usr/bin/ksh"
0x2ff22ebe: "ODMDIR=/etc/objrepos"
0x2ff22ed3: "HOME=/"
0x2ff22eda: "TERM=dumb"
0x2ff22ee4: "PWD=/"
0x2ff22eea: "TZ=JST-9"
0x2ff22ef3: "NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/%l.%c/%N:/usr/lib/nls/msg/%l.%c/%N.cat"
0x2ff22f65: ".%c"   <== ここから先は環境変数ではない。
0x2ff22f69: ""
0x2ff22f6a: ""
```
64bitの場合は定数値が0x0fffffffffffffd8になり、/Xの代わりに/llxで表示します。
```
(dbx) 0x0fffffffffffffd8/llx
0x0fffffffffffffd8:  ffffffffffffc80
(dbx) 0xffffffffffffc80/llx
0x0ffffffffffffc80:  ffffffffffffd1b

(dbx) 0xffffffffffffd1b/30s
0x0ffffffffffffd1b: "TERM=dumb"
0x0ffffffffffffd25: "AUTHSTATE=compat"
0x0ffffffffffffd36: "SHELL=/usr/bin/ksh"
0x0ffffffffffffd49: "HOME=/"
0x0ffffffffffffd50: "USER=root"
0x0ffffffffffffd5a: "PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java8_64/jre/bin:/usr/java8_64/bin:/ptools/bin"
0x0ffffffffffffdc7: "TZ=JST-9"
0x0ffffffffffffdd0: "LANG=Ja_JP"
0x0ffffffffffffddb: "LOCPATH=/usr/lib/nls/loc"
0x0ffffffffffffdf4: "LC__FASTMSG=true"
0x0ffffffffffffe05: "ODMDIR=/etc/objrepos"
0x0ffffffffffffe1a: "CLCMD_PASSTHRU=1"
0x0ffffffffffffe2b: "CORE_NAMING=1"
0x0ffffffffffffe39: "LOGNAME=root"
0x0ffffffffffffe46: "LOGIN=root"
0x0ffffffffffffe51: "NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/%l.%c/%N:/usr/lib/nls/msg/%l.%c/%N.cat"
0x0ffffffffffffec3: "/usr/"
```

余談ですが、argvは環境変数の上にあるため、下記のように少し上から表示することで確認できます。
kshがcoreを吐いた場合にスクリプト名を確認できる場合があります。
```
(dbx) 0x2ff22dc8-0x80/30s
(略)
0x2ff22d98: "/opt/rsct/bin/rmcd"
0x2ff22dab: "-a"
0x2ff22dae: "IBM.LPCommands"
0x2ff22dbd: "-r"
0x2ff22dc0: "-S"
0x2ff22dc3: "1500"
0x2ff22dc8: "_=/opt/rsct/bin/rmcd"
(略)
```
Using eye tracking to test for individual differences in attention to attractive faces(2015) 

### Using eye tracking to test for individual differences in
attention to attractive faces(Cristian, 2015) 

Eye-Trackingを用いて人間の顔に関する魅力を測定を試みた論文

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4313586/


#### Q:この論文の概要を教えてください
#### A:
この研究は、魅力的な顔に対する視覚的注意の個人差を調査することを目的としています。研究では、魅力的な顔が注意を引きやすいかどうかを調査し、性別や目の色などの個人の特性が注意に与える影響を検討しました。実験では、サッカディックリアクションタイム（SRTs）を使用して、参加者が魅力的な顔にどれだけ速く注意を向けるかを評価しました。研究結果は、魅力的な顔が注意をより効果的に捉えることを示し、性別による注意の捉え方の違いや目の色によるバイアスについても調査しました。これらの知見は、視覚的注意と魅力の関係についての理解を深める上で貢献しています。


#### Q:この論文の主な貢献を3つ挙げてください
#### A:
この研究の主な貢献は以下の3つです：

魅力的な顔が注意を引きやすいことの実証： この研究により、魅力的な顔が注意をより効果的に捉えることが実証されました。従来の研究では、魅力的な顔に対する注目の違いが議論されてきましたが、本研究はSRTsを使用して、魅力的な顔が注意を引きつける能力がより高いことを示しました。これは、視覚的注意が顔の魅力に影響を受けることを示す重要な発見です。

性別による注意の捉え方の違いの明確化： 研究結果から、男性と女性が異性の魅力的な顔に対して異なる注意の捉え方を示すことが明らかになりました。男性は異性の魅力的な顔により強いバイアスを持つ傾向があり、これは性別による注意の違いが存在することを示唆しています。この結果は、個人の性別が視覚的注意に与える影響を理解する上で重要な示唆を提供しています。

個人の特性による注意のバイアスの検証： 研究では、青い目の男性が青い目の女性に対してより強いバイアスを持つという仮説を検証しましたが、この仮説は支持されませんでした。これは、個人の特性（目の色など）が注意に与える影響が一概には言えないことを示しています。個人の特性が注意のバイアスにどのように影響するかを明らかにすることで、視覚的注意と個人の特性の関係についての理解を深める上で重要な貢献を果たしました。

これらの貢献により、本研究は視覚的注意と魅力の関係についての理解を深め、個人の特性が注意に与える影響を探求する上で重要な示唆を提供しています。


#### Q:この研究の限界と今後の課題はなんですか
#### A:
この研究の限界と今後の課題は以下のように考えられます：

刺激の制御： 本研究では、顔の魅力に焦点を当てていましたが、他の要因（例：表情、年齢、文化的背景など）が注意に与える影響を考慮していませんでした。今後の研究では、これらの要因をより詳細に検討することが重要です。

サンプルの一般化： 本研究では、特定のサンプルを用いて実験を行っていますが、異なる文化や年齢層の参加者を含めることで結果の一般性を確認する必要があります。さらに、サンプルの大きさや多様性を考慮することも重要です。

統計的手法の検討： 本研究では、線形混合効果モデルを使用してデータを分析していますが、他の統計的手法やアプローチを組み合わせることでより深い理解が得られる可能性があります。将来の研究では、さまざまな統計的手法を検討し、結果の信頼性を高めることが求められます。

長期的影響の検討： 本研究では、短期的な注意の捉え方に焦点を当てていますが、魅力的な顔に対する注意の長期的な影響やその社会的・心理的な意義についての研究が必要です。将来の研究では、魅力の概念や注意のメカニズムについてより広範囲にわたる視点から検討することが重要です。

これらの限界と課題を克服するために、今後の研究ではより包括的なアプローチや多角的な視点を取り入れることが重要です。新たな研究がこれらの課題に取り組むことで、視覚的注意と魅力の関係についての理解を深めることが期待されます。



#### Q:研究者たちは、魅力的な顔に対する注意の個人差をどのように測定しましたか
#### A:
研究者らは、サッカード反応時間（SRT）を用いて、魅力的な顔に対する注意の個人差を測定した。サッケードは、注意の働きかけと密接に関連する急速な眼球運動である。SRTを分析することで、研究者らは、参加者が魅力的でない顔と比較して、魅力的な顔にどれだけ早く注意を移したかを評価することができた。この方法により、さまざまな魅力的な顔に対する注意の離脱や捕捉といった注意のプロセスを調べることができた。

#### Q:この論文で行った実験方法について詳しく説明してください
#### A:
この論文では、魅力的な顔が視覚的注意に与える影響と個人の特性（性別や目の色）が注意に及ぼす影響を調査するために2つの実験が行われました。

実験1では、注意の解除（disengagement of attention）を測定するためにギャップサッケードタスクが使用されました。被験者は中央に固定された刺激から視覚的周辺に現れる別の刺激にサッケードを行うよう指示されました。中央の刺激が消える（ギャップ）か残る（オーバーラップ）かによって、サッケードの反応時間（SRTs）が異なることが知られています。この実験では、魅力的な顔が注意の解除に与える影響を調査しました。

実験2では、視覚的注意の捉え方を調査するためにドットプローブタスクが使用されました。被験者は中央の注視点から左右に配置された顔の間に表示される色付きの四角形にサッケードを行うよう指示されました。目標の四角形の色を識別する課題であり、魅力的な顔が注意を引きつける能力を評価しました。

両実験では、被験者の性別や目の色などの個人の特性が注意に与える影響を検討しました。また、線形混合効果モデルを使用してデータを分析し、個人差や刺激による分散を考慮して結果を解釈しました。

これらの実験により、魅力的な顔が注意を引きつける能力や個人の特性が注意に及ぼす影響について新たな理解が得られました。今後の研究では、より広範囲な要因を考慮し、さらに詳細な分析を行うことで、視覚的注意と個人の特性の関係についての理解を深めることが期待されます。



### 所感
割と当たり前の結果ではあるが、研究として確認できている。一方で、”魅力的な顔”をそのように定義しているのか？
[AIX] Wrapper function(dlopen/dlsym/LDR_PRELOAD使用)

[AIX] Wrapper function(dlopen/dlsym/LDR_PRELOAD使用)

libc等で提供される関数と同名の関数を定義し、その中でlibcの関数をdlsymで呼び出すことで本来の関数実行の前にデバッグ出力等を行うことが可能です。
LDR_PRELOADで自作の共有オブジェクトを指定することで、モジュール内では自作の関数が優先的に呼び出されます。

1. Wrapperとなるソースコード作成(gethostbynameの例)
```
# cat gethostbyname_wrapper.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

struct hostent *gethostbyname (char* Name){
    void *handle = NULL;
    struct hostent* (*real_gethostbyname)(char* Name) = NULL;

    /* print debug output */
    printf("output from wrapper function: gethostbyname is called with [%s]\n",
Name);

    handle = dlopen("libc.a(shr.o)", RTLD_GLOBAL|RTLD_NOW|RTLD_MEMBER);
    if( handle == NULL){
        printf("dlopen failed\n");
        return(NULL);
    }

    real_gethostbyname = dlsym(handle, "gethostbyname");
    if(real_gethostbyname == NULL){
        printf("real_gethostbyname not found\n");
        return(NULL);
    }

    return(real_gethostbyname(Name));
}
```

2. コンパイルと実行
```
# ibm-clang -shared -Wl,-G gethostbyname_wrapper.c -o gethostbyname_wrapper.shr.o
# LDR_PRELOAD=./gethostbyname_wrapper.shr.o ping localhost
output from wrapper function: gethostbyname is called with [localhost]
PING loopback: (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0 ms
```
参考:プリロードされた共用ライブラリー
https://www.ibm.com/docs/ja/aix/7.2?topic=techniques-preloaded-shared-libraries
DatabricksからKey Vaultに接続失敗したのでアクセスポリシーを使えるようにする

# 困ったこと

Azure DatabricksからAzure Key Vault Backed Scopeを利用してAzure Key Vaultからシークレットを取得しようとRBACで `Key Vault Administrator` と `Key Vault Secrets User` をそれぞれRBACに割り当てたがDatabricksからシークレットを取得しようとしても権限がない旨のエラーが返却される。  

# 解決策

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/df9fc883-5585-c3d0-34a3-dcc539d574e1.png)

「アクセス構成」タブのアクセス許可モデルが、デフォルトで「Azure ロールベースのアクセス制御」になっているので、「コンテナーのアクセスポリシー」に変更し、「アクセスポリシー」で `Azure Databricks` にシークレットの権限を付与する。

最近Key Vaultを新規作成すると「Azure ロールベースのアクセス制御」がデフォルト選択されるようになっていて、おそらくこれが推奨設定だとは思いますが、Databricksからのシークレット取得のために仕方なく「コンテナーのアクセスポリシー」を選択しました。

# 備考

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/66581727-d789-e387-18e4-ee5b3c7e4fbd.png)

「Azure ロールベースのアクセス制御」のままでも `dbmanagedidentity` にRBACを割り当てればシークレット取得できたという記事も調べていると見つけましたが、自分が触っている環境ではダメでした。
【Java】例外処理

# ０．はじめに
Javaを大学で学んでおります。
概念や特徴を以下の文類に分けてまとめました。

##### 関連学習
[【Java】用語](https://qiita.com/AkihideKato/items/13ba72a0c61eabc540c3)
[【Java】メソッド・型](https://qiita.com/AkihideKato/items/753ad55b10b29f184b0f)
[【Java】オブジェクト指向](https://qiita.com/AkihideKato/items/3eb988a962774a409f52)	
[【Java】インスタンス・コンストラクタ](https://qiita.com/AkihideKato/items/78fc47812f4eccad03cf)
[【Java】例外処理](https://qiita.com/AkihideKato/items/b0840610fc553c57cf1d)
[【Java】注意点・ルール](https://qiita.com/AkihideKato/items/63402744493932e9f87b)
[【Java】コードの記述向上にむけて（個人用memo）](https://qiita.com/AkihideKato/items/33fd1400be6be2e25f5a)

# １．例外													
``Java``において**プログラム時に予期しないエラーのこと**												
例外発生時には以下の選択肢に分かれる												
- １．あらかじめ準備されたエラーメッセージが表示しプログラムが終了される
- ２．プログラム記述者が定める処理を実行する（例外処理を記述する）																							
### 例外処理												
``try ~ catch文``を使用し例外処理を行うことができる					
```java
    try {				
		例外が発生する可能性がある文			
	} catch (例外名 引数 ) {				
		例外が発生した場合の処理			
	}												
```
### catchは複数の記述が可能												
仮に複数のエラーが発生する可能性がある場合はそれぞれ条件ごとに処理の記述が可能						
```java
try {						
	//不正な演算処理(ArithmeticExceptionの発生と入力値が整数ではないNumberFormatExceptionの可能性がある					
	int c = a / b;　					
} catch (ArithmeticException e) {						
	System.out.println("0で割っている演算である");					
} catch (NumberFormatException e) {						
	System.out.println("入力値は整数値ではない");													
 ```
 
### 例外・例外のクラス													
例外は**クラスとして宣言される**												
#### ArrayIndexOutOfBoudsExceptionクラス
コンパイル時にチェックがされないクラス
例外処理を記述しなくてもコンパイル・実行が可能

#### RuntimeExceptionクラス
例外処理を記述しないとコンパイル時にエラーが発生するクラス

#### ArithmeticException
不正な算術演算を行った際に発生する例外
整数値の``int型``を``0``で割った場合などに起こる不正演算で発生する

#### InputMismatchException
``Scannerクラス``により読み込んだ値が適切でない場合に発生する例外
#### NumberFormatException
文字列から数値への変換が正しくされない時に発生する例外


### クラスは階層ごとになっている												
``RuntimeExceptionクラス``は
- NumberFormatException
- ArthmeticException

この2つのスーパークラスである
そのため``RuntimeExceptionクラス``は``NumberFormatException・ArthmeticException``をキャッチすることができる
        
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581998/a67ef222-6cf8-4c91-8658-1fdf3d7e2bd1.png)
												
																							
# ２．例外処理例													
エラー文
```java
int [] a = new int[10];
a[10] = 100;　//配列は9までしかないため[10]の記述によりエラーが発生、強制終了となる
```
``a[10]=100;``を``try内``の例外が発生する可能性がある文とし記述を行う
以下のように``catch~``の分で例外をキャッチする

例外処理文
```java
int [] a = new int[10];			
try {			
	a[10] = 100;　		
} catch ( ArrayIndexOutOfBoundsException a) {			
	System.out.println(e);		
}			
```					
---
##### 参考文献
[スッキリわかるJava入門 第3版](https://book.impress.co.jp/books/1119101083) 
著者：中山清喬 と国本大悟　発行所：株式会社インプレス
Java　拡張for文

## 拡張for文
ループ変数や添え字を書かなくスッキリしたコードが書ける。

##### 拡張for文を使用
```
public class MainExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};

        System.out.println("配列の全要素を出力します:");
        for (int number : numbers) {
            System.out.println(number);
        }

        // 各要素に2をかけて出力します
        System.out.println("\n各要素に2をかけて出力します:");
        for (int number : numbers) {
            int doubled = number * 2;
            System.out.println(doubled);
        }
    }
}
```

##### 拡張for文を使用しない
```
public class MainExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};

        System.out.println("配列の全要素を出力します:");
        for (int i = 0; i < numbers.length; i++) {
            System.out.println(numbers[i]);
        }

        // 各要素に2をかけて出力します
        System.out.println("\n各要素に2をかけて出力します:");
        for (int i = 0; i < numbers.length; i++) {
            int doubled = numbers[i] * 2;
            System.out.println(doubled);
        }
    }
}
```

見比べると拡張for文を使用したほうがスッキリ！
ループ変数や配列の添え字を記述する必要がない分バグも減りそう:relaxed:
dokcer image buildでエラー吐いたのでubuntuを更新した。




docker-imageを作成するべく
作業ディレクトリのサブにapacheディレクトリを作成し
その中にDockerfileを作成。

```Dockerfile
FROM ubuntsu:21.10

RUN apt update \
	&& apt install -y apache2

CMD ["apachectl", "-D", "FOREGROUND"]
```

以上を$ dokcer image build -t practice/apachest:latest

すると

```
2.933 Err:5 http://ports.ubuntu.com/ubuntu-ports impish Release
2.933   404  Not Found 
3.233 Err:6 http://ports.ubuntu.com/ubuntu-ports impish-updates Release
3.233   404  Not Found 
3.547 Err:7 http://ports.ubuntu.com/ubuntu-ports impish-backports Release
3.547   404  Not Found 
3.856 Err:8 http://ports.ubuntu.com/ubuntu-ports impish-security Release
3.856   404  Not Found 
3.867 Reading package lists...
3.903 E: The repository 'http://ports.ubuntu.com/ubuntu-ports impish Release' does not have a Release file.
3.903 E: The repository 'http://ports.ubuntu.com/ubuntu-ports impish-updates Release' does not have a Release file.
3.903 E: The repository 'http://ports.ubuntu.com/ubuntu-ports impish-backports Release' does not have a Release file.
3.903 E: The repository 'http://ports.ubuntu.com/ubuntu-ports impish-security Release' does not have a Release file.
------
Dockerfile:3
--------------------
   2 |     
   3 | >>> RUN apt update \
   4 | >>>   && apt install -y apache2
   5 |     
--------------------
ERROR: failed to solve: process "/bin/sh -c apt update   && apt install -y apache2" did not complete successfully: exit code: 100
```

Err:5 http://ports.ubuntu.com/ubuntu-ports impish
超意訳すると"そんなリリースねーよ"と。

調べるとubuntuがバージョン21.10のサポートを2022年7月で終了していた。

なのでubuntuのページを訪問し、22.04（Jammy Jellyfish）が2027年4月までサポートしているそうなので、バージョンを書き換えて再実行。

https://jp.ubuntu.com/download

※docker使うならdocker hubからも、使用できるubuntuを調べられますね。https://hub.docker.com/_/ubuntu

```
[+] Building 47.6s (6/6) FINISHED                                   docker:desktop-linux
```
$docker image ls
で確認すると

```
REPOSITORY           TAG       IMAGE ID       CREATED          SIZE
practice/apache      latest    5d3172bcbcdc   40 minutes ago   221MB
```


docker imageが無事に出来ていました。

参考：
Ubuntu 20.10でapt-get updateしたらエラーが出た
https://blog.denet.co.jp/i-got-an-error-when-i-did-apt-get-update-on-ubuntu-20-10/
java 配列

## 配列の活用　3つ！
①　ループによる全要素の活用
②　ループによる集計
③　添え字に対応した情報の利用

for文で配列を回す（順に利用）
```
for (int = 1; i < 配列変数名.length; i++) 
   配列変数名[i]を使った処理
  } 
```
## ①ループによる全要素の活用
 
```  
public class MainExample {
    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50};

        System.out.println("配列の全要素を出力します:");
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("要素 " + i + ": " + numbers[i]);
        }

        System.out.println("\n全要素を2倍にして出力します:");
        for (int i = 0; i < numbers.length; i++) {
            int doubled = numbers[i] * 2;
            System.out.println("要素 " + i + ": " + doubled);
        }
    }
}
```


## ②ループによる集計

```public class MainExample {
    public static void main(String[] args) {
        int[] scores = {80, 65, 70, 90, 85, 75};
        int total = 0;
        int average;
        int aboveAverageCount = 0;

        // 全要素の合計を計算する
        for (int score : scores) {
            total += score;
        }

        // 平均を計算する
        average = total / scores.length;

        // 平均より高いスコアの数を数える
        for (int score : scores) {
            if (score > average) {
                aboveAverageCount++;
            }
        }

        // 結果を出力する
        System.out.println("合計点: " + total);
        System.out.println("平均点: " + average);
        System.out.println("平均点より高いスコアの数: " + aboveAverageCount);
    }
}

```
scores配列の要素を使用して、合計点、平均点、および平均点より高いスコアの数を集計。
## ③　添え字に対応した情報の利用
```
public class MainExample {
    public static void main(String[] args) {
        String[] students = {"Alice", "Bob", "Charlie", "David", "Eve"};
        int[] scores = {80, 65, 70, 90, 85};

        // 各学生の名前と点数を出力する
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i] + " の点数: " + scores[i]);
        }

        // 最高得点を見つける
        int maxScore = scores[0];
        String topStudent = students[0];
        for (int i = 1; i < scores.length; i++) {
            if (scores[i] > maxScore) {
                maxScore = scores[i];
                topStudent = students[i];
            }
        }
        System.out.println("最高得点: " + maxScore + " (" + topStudent + ")");
    }
}
```
各学生の名前が"students"
各学生の点数が"scores"
forループを使用して、名前と点数の対応関係を出力し、また別のforループを使用して最高得点を見つけ、その学生の名前と得点を表示
【Java】インスタンス・コンストラクタ

# ０．はじめに
Javaを大学で学んでおります。
概念や特徴を以下の文類に分けてまとめました。

##### 関連学習
[【Java】用語](https://qiita.com/AkihideKato/items/13ba72a0c61eabc540c3)
[【Java】メソッド・型](https://qiita.com/AkihideKato/items/753ad55b10b29f184b0f)
[【Java】オブジェクト指向](https://qiita.com/AkihideKato/items/3eb988a962774a409f52)	
[【Java】インスタンス・コンストラクタ](https://qiita.com/AkihideKato/items/78fc47812f4eccad03cf)
[【Java】例外処理](https://qiita.com/AkihideKato/items/b0840610fc553c57cf1d)
[【Java】注意点・ルール](https://qiita.com/AkihideKato/items/63402744493932e9f87b)
[【Java】コードの記述向上にむけて（個人用memo）](https://qiita.com/AkihideKato/items/33fd1400be6be2e25f5a)

# １．インスタンス
**車で言う``車体``部分、実体であり生成できるもの**
**クラスを元に生成したオブジェクトの実体**
クラス内でフィールドの宣言を行ったものの、実体を使用することができない
そのため実体を生成する必要がある
その生成したものをインスタンスと言う

### 例
``Body``クラス内から``name``や``weight``を利用したいため``man``という実体を生成したい
```java
//クラスの宣言：クラス名 変数名
Body man

//実体（インスタンス）の生成：変数名 = new クラス名
man = new Body

//Bodyというクラスからmanという実体を生成したい場合は続けて記述すると以下になる
Body man = new Body();
```

### イメージ
``student``という変数が``name,height,weight``というフィールドを参照し
実体を生成している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581998/33a55448-e405-6b7a-5125-0cf3fdf14c23.png)

### インスタンスメソッド
**クラスに属するメソッド**
インスタンスメソッドとして定義する場合は``static``の記述がない
```java
public class Method{		
	public viod myMethod{	
		//メソッド名
	}	
}		
```
staticが記述されていない場合は**クラスのインスタンスに対して呼び出される必要がある**
staticが記述されている場合はクラスレベルのメソッドとなり**クラスのインスタンス化なしで呼び出しが可能**

# ２，コンストラクタ
**インスタンスの初期化のこと、初期設定**
**コンストラクタ名はクラス名で記述される**、クラスの名前で``public　クラス名``と記述されている箇所はコンストラクタされていると認識すること

``RPG``を題材にした場合のクラスにおいて、
都度設定をせず事前に``HP``などのフィールドを決定しておく場合もある

```java
public class Room{					
	//以下にフィールドを記述				
	String name;				
	String age;				
					
	//以下がコンストラクタ				
	public Room( String n , String a){				
	name = n;				
	age = a;				
	}				
}					
```
ここでインスタンスを生成	
先述した引数へ渡し``Roomクラス``のインスタンスを生成する	
``n``と``a``が受取り``Roomクラス``の各フィールドに代入がされる	
```java
public static void main(String[] args){	
	Room str1 = new Room("sato","200");
	System.out.println(str1.name); //出力：sato
}	
```
								
---
##### 参考文献
[スッキリわかるJava入門 第3版](https://book.impress.co.jp/books/1119101083) 
著者：中山清喬 と国本大悟　発行所：株式会社インプレス
[AIX] wrapper scriptの例

1. Wrapperスクリプトを作成
こちらの例では、コマンドの呼び出し元を調べるものです。

```
# cat /work/wrapper.sh
#! /bin/sh

OUTFILE=/tmp/wrapper.out

echo "### Message from Wrrapper Script ###" > $OUTFILE
echo "##### proctree #####" >> $OUTFILE
proctree $$ >> $OUTFILE
echo "##### ps #####" >> $OUTFILE
ps -ef >> $OUTFILE

echo "##### exec orig $0 $@ #####" >> $OUTFILE
"$0".copy $@

```

2. 調査対象コマンドのコピーを作成
```
# cp -p /usr/bin/kill /usr/bin/kill.copy
```
※上記スクリプトに合わせて.copyファイルを作成

3. Wrapperスクリプトをmount
```
# mount /work/wrapper.sh /usr/bin/kill
```
※後処理を忘れてもリブートで解除されるようにcpでの上書きではなくmountを使用

4. コマンドを実行
```
# /usr/bin/kill -9 [PID]
```
※テスト目的のためBuildinコマンドが使用されないようにフルパスで実行

5. 出力ファイルを確認
```
# cat /tmp/wrapper.out
```
ファイル内にproctreeとps -efなどの出力があることを確認

6. wrapperスクリプトをumountして終了
```
# umount /usr/bin/kill
```

7. コピーファイルを削除
```
# rm /usr/bin/kill.copy
```
Drupal開発するならやっておきたい3つのこと

この記事ではDrupalを使って開発作業をするならやっておくと良いことを紹介します。

# キャッシュの無効化
***キャッシュとはユーザーがアクセスしてページに表示された情報を一定期間覚えておくことでページの表示時間を早くする機能です。***

Drupalではさまざまなキャッシュが効いているためテーマやモジュールを開発中に有効化していると、
「ソースコードを修正したのに反映されない」「設定を変更したのに反映されない」といったことが発生することがあります。

そのため開発中はキャッシュを無効化することで開発作業を効率よくおこなうことができます。

## 設定手順
管理者権限を持つユーザーでログインし、
上部の管理者メニューの環境設定 > 開発 > 開発設定にアクセスします。
※<ドメイン>/admin/config/development/settings

下図のような画面が表示されますので、
以下全てのチェック項目にチェックを入れて保存します。

- Twig開発モード
- Twig debug mode
- Twigキャッシュを無効にする
- マークアップをキャッシュしない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/a4a6c9e3-1453-c864-d70d-11ea7626959c.png)

:::note warn
注意書きもされているように、
これらの設定は本番環境では実施しないようにしてください。
本番環境ではキャッシュを有効にしてユーザーの利便性を高めることが推奨されます。
:::

# テンプレートサジェッションを使おう
***テンプレートサジェッションとは
カスタムテンプレートを作成するときの命名ヒントをページのHTMLにコメントとして出力してくれる機能です。***

前述の開発設定を有効化すると以下のようにページのHTMLに
どのようなテンプレート名であれば使用できるかをDrupalが出力してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/761ce3cc-2063-4852-192d-3664c564e36e.png)

上図の場合、html.html.twigをカスタマイズしたい時は
以下のいずれかのファイル名であればテンプレートが使用できることが表示されています。

- html–front.html.twig
- html–node.html.twig
- html.html.twig

::: note info
ファイル名は上から順番に優先されます。
:::

# 開発者向けモジュールをインストール
## Admin Toolbar
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/99c457dc-4165-5a8e-3f72-bc8f87b44b86.png)
***Admin Toolbarモジュールは管理者メニューをドロップダウンで表示するモジュールです。***

サイト構築や環境設定は下層ページが多いためリンクを辿るのが大変ですが、
Admin Toolbarモジュールであればホバーするだけで下層ページへのリンクを表示してくれます。

そのため下層ページへも効率的にアクセスできるようになります。

## Devel Kint Extras
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/d790985e-7f62-1236-177a-3a07040c43c1.png)

Devel Kint ExtrasはKintと呼ばれるPHPのデバッグツールを使用できるモジュールです。

フックファイルに以下のようにコードを記載すると変数の値が確認できます。
```php
$test = "This is a the test."
kint($test);
```

## Examples for Developers
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/3e63dae0-e63b-5cea-00af-2ab0b9bda93a.png)
Examples for Developersはカスタムモジュールのサンプルコードを提供してくれるモジュールです。

ソースコードだけでなくどのようなアウトプットが出来上がるのかも確認できます。

このモジュールはAcquiaでも紹介されているのでオススメです。

https://www.acquia.com/jp/blog/introduction-to-examples-for-developers-module


# さいごに
開発者としてDrupalを使った案件に携わってきた筆者が、
「これやっておくと捗るな〜」と思ったことをまとめました。

::: note info
- キャッシュの無効化
- テンプレートサジェッションを使う
- 開発者向けモジュールを使う
:::

これからDrupalを使った開発をやろうとしている方や
もっと開発を効率よくおこないたい方は参考にしていただけると嬉しいです。
#320 2024-03-31 駄菓子 議事録

## [Retaining beyond ViewModels](https://chrisbanes.me/posts/retaining-beyond-viewmodels/)

- Circuitというライブラリ
    - Slackが出している
    - いわゆるMVIみたいなやつ？React Hooksみたいな感じ？
    - ViewModelという概念を使わない
    - CircuitInjectアノテーションを使っていい感じにするとStateをComposableとして扱うことができる
    - イベント更新する時はforegroundじゃないとダメなのでrepeatOnLifecycleを使わないとダメ
    - けどめんどくさいけどcircuitを使えばその周辺の問題（ライフサイクルとか）を考慮しないで済む
    - rememberRetainedでプレゼンターのライフサイクルを超えてstateを保持できるよ
    - マーシャル？？：rememberSavableを用意しないといけない時にSaverとかいうrememberSavableに即したinterfaceを自分で実装しないといけない。多分そのこと？？？
    - なんかリバーポットみてーだな
    - 入力値（ephemeral State）
    - アプリ全体で扱う値（App State）と画面ごとに使う値（ephemeral State）というものがある
        - おすすめの映画・ログイン情報・カートに入れた商品（app State）
    - リテインドステートでメモリ上に保存するのでどこの画面からでもステートが取れるとUXがいい。App Stateっぽい概念に思える
    - チュートリアルやってみます！！

## [Version 2.8.0-alpha03](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.0-alpha03) 
- ViewModelがKMPでも使えるようになったあぜ
- viewModelまで共通化できる
- 今までもViewModelは共通化できはしたけどJetpackの便利なViewModelちゃんが使うことはできなかったのでめんどくさかった！！
- ViewModelScopeがどこでも使える
- 従来はCoroutineScopeを自作する必要があった

## [Jetpack Composeでコールバック関数を渡すのをやめよう](https://engineering.teknasyon.com/stop-passing-event-ui-action-callbacks-in-jetpack-compose-a4143621c365)
- Composeでコールバックすんのやめよう
- 全画面のUIイベントをonActionとしてsealed classにまとめよう
- メリット：末端のComposableでも同じ引数（onAction）を呼び出し解けばいいので再利用性とかを考慮する必要は無くなるかも
- デメリット：EventBus時代に後戻りなのでは？
- スパゲティコードにもなって可読性が低くなっちゃうよん
Nước hoa nam mini Yupi Perfume 

![nuoc-hoa-mini-nam-yupi-perfume.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766554/c5450e70-caa1-6d96-49d9-2a74888db9b1.jpeg)


Mua nước hoa mini nam chính hãng ⭐ /m/0p833 dạng chấm, dạng xịt ⭐ Phiên bản nhỏ gọn cao cấp ⭐ Phong cách lịch lãm đẳng cấp chuẩn đàn ông đích thực.

#yupiperfume #yupivn #nuochoamininamchinhhang #nuochoamininam #nuochoanamminisize

Thông tin liên hệ Yupi Perfume:

Địa chỉ:  102 Lê Tuấn Mậu, Phường 13, Quận 6, TPHCM

Hotline: 0911.17.03.96

Email: yupiperfume@gmail.com

Website: https://yupi.vn/collections/nuoc-hoa-mini-nam

https://vi.wikipedia.org/wiki/N%C6%B0%E1%BB%9Bc_hoa

Kết nối mạng xã hội với @yupiperfume:

https://www.mixcloud.com/nuochoanamminiyupi/

https://www.openstreetmap.org/user/nuochoanamminiyupi

https://public.tableau.com/app/profile/n.c.hoa.nam.mini.yupi.perfume/vizzes

https://www.producthunt.com/@nuochoanamminiyupi

https://www.instapaper.com/p/14131143

Nước hoa mini nam luôn là phân khúc thị trường được nhiều cánh mày râu, đặc biệt là các bạn trẻ ưa chuộng và lựa chọn. Bởi lẽ, dòng nước hoa mini này sẽ mang đến cho người dùng nhiều cơ hội để được trải nghiệm nhiều mùi hương khác nhau cùng lúc mà không “ngốn” quá nhiều tiền. Nội dung bài viết sau, Yupi Perfume sẽ chia sẻ các ưu điểm nổi bật và top các thương hiệu mini đáng mua dành cho phái mạnh.
TypeScriptでのkeyofとtypeof演算子による強力な型操作

## keyof
keyof 演算子は対象のオブジェクトタイプ(Type)からキーを抽出し、文字列または数字のリテラルタイプ(Literal Type)で構成された新しいユニオン(Uniton Type)タイプを生成します。

```ts
type User = { name: string; age: number; 0: number; "1": string };
type UserKey = keyof User;
```

上のコードでは、UserKey型は"name" | "age" | 0 | "1"ユニオン型と同等です。これにより、Userオブジェクトのキーを安全に使用できます。

```ts
const userKey1: UserKey = "name"; // 正しい
const userKey2: UserKey = "age"; // 正しい
const userKey3: UserKey = 0; // 正しい
const userKey4: UserKey = "1"; // 正しい

// エラー: "gender"は'keyof User'型に割り当てることができません。
const userKey5: UserKey = "gender";
```

## typeof
typeof 演算子は対象の変数(variable) またはプロパティ(property)に割り当てられた値と同じタイプを生成します。

```ts
let typeScript = "TypeScript";
type TypeScript = typeof typeScript;
```

上記のコードでは、TypeScript型はtypeScript変数に割り当てられた値の型、つまり文字列リテラル型"TypeScript"と同じです。typeofを使用すると、変数やオブジェクトの特定のプロパティの型を抽出して再利用できます。

```ts
const user = { name: "Aaron", age: 19 };
const age1: typeof user.age = 19; // 正しい
const age2: typeof user.age = "19"; // エラー: 文字列を数値型に割り当てることはできません。
```

## 結論
keyofとtypeof演算子は、TypeScriptの型システムを効率的に利用できる強力なツールです。これらを利用することで、開発者はより柔軟で再利用可能な型を定義でき、コードの安全性を高めつつ重複を減らすことができます。

## 参考
- https://www.typescriptlang.org/docs/handbook/2/keyof-types.html
- https://www.typescriptlang.org/docs/handbook/2/typeof-types.html
PowerAutomateフローのエラー監視をなるべく網羅的＆効率的にする

PowerAutomateでワークフローを運用しているとしばしば問題となるエラー対応問題。
とくに組織的にワークフローを運用する場合、「いつのまにかエラーが起きていた」「エラー検知はしたが対応を失念してしまった」「エラー通知の実装がフローによりまちまちで一元管理できない」「エラー対応の担当を交代したいのだが個別フローの修正が必要」というもろもろの問題が生じます。
今日はその問題への対処の一例のご紹介です。

# Problem

PowerAutomateには一応エラー通知の仕組みはあるし、個別ワークフローにエラー処理の仕組みを実装することもできる。しかし、いずれも信頼性や生産性の観点で満足できない：

* 通知メール （例えばの件名： `6 of your flow(s) have failed`）は通知タイミングがまちまち、重大性を判断しにくく、リマインドも期待できない（埋もれる・流れる）し、通知はあくまでもフロー全体が「失敗」となったときのもの。
* 個別フローに通知の仕組みをいれるのも、「何で送るのか」「どんな情報を送るのか」そもそも「誰宛て送るのか、それはいつも同じか」と一々自由度高く考えるのはとても手間。一元管理も難しい。

求められる（私が求めた）要件：

* エラーが起きたら数分以内に通知がほしい
* 一定期間のエラー発生をフロー表示名で集約したりせず、どのフローでいつエラーが起きたかを明らかにしてほしい
* エラー対応の期限を設定しリマインドもしてほしい
* フロー全体「失敗」でなくフローの一部「失敗」でも通知してほしい
* 個別フローに極力「何も考えず」通知を実装したい
* エラー対応担当者は必要に応じてワークフローを運用するチーム内で適宜交代できるようにしたい（フロー修正なしに）

# Solution

要件に基づいて検討しまとめた仕様：

* ワークフロー運用のためにM365ユーザーを作成
* エラー検知したい対象のフローには __固定内容の__ Plannerタスク追加アクションを挿入（コピペで追加）
* 当該タスクの担当者として前述のM365ユーザーを設定
* 当該ユーザーで「自身がタスクの担当に割り当てられた」時に起動するワークフローを作成
* 当該ワークフローでエラー対応担当者をタスクの担当として割り当て
* エラー対応担当者の情報は __ExcelテーブルやSharePointリストなど外部データソースから__ 取得する

図にするとこんな感じ：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/1ed9410a-dfe3-f569-4df6-462a65d4b69e.png)

エラー検知したい対象フローに追加したPlannerタスク追加アクション：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/6c734ca5-3c47-d509-f1be-10aa0c6fba45.png)

エラー対応担当割り当てフロー：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/15b5ecb9-fd7e-50b1-a505-61e0958d70b8.png)

:::note info
ここでは「タスクが自分に割り当てられるとき」でキャッチされたタスクをそっくりそのまま別の担当者に割り当ててしまっています。言うまでもないことですが、割り当てられたタスク内容に即して担当割り当て先を変えたり、割り当てそのものをスキップしたりと、柔軟なロジックを組むことも可能です。
:::