OmniAICreator/Qiita-1.07M huggingface dataset:
Flow Fees

[Previous << Service Account](https://qiita.com/flowcadence/items/c11bd0dfea9691961946)
[Next >> Staking Table](https://qiita.com/flowcadence/items/1d432b038762c7bf8063)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-developers

<h1>Flow Fees Contract</h1>

<h2>FlowFees</h2>

`FlowFees`コントラクトは、徴収されたFlowフィーがすべて集められる場所です。

Source: [FlowFees.cdc](https://github.com/onflow/flow-core-contracts/blob/master/contracts/FlowFees.cdc)

| Network | Contract Address |
|:-:|:-:|
| Emulator | `0xe5a8b7f23e8b548f` |
| Cadence Testing Framework | `0x0000000000000004` |
| Testnet | `0x912d5440f7e3769e` |
| Mainnet | `0xf919ee77447b7497` |

<h3>Events</h3>

`FlowFees`の重要なイベントは次のとおりです。

```ruby
/* Event that is emitted when tokens are deposited to the fee vault */
access(all) event TokensDeposited(amount: UFix64)

/* Event that is emitted when tokens are withdrawn from the fee vault */
access(all) event TokensWithdrawn(amount: UFix64)

/* Event that is emitted when fees are deducted */
access(all) event FeesDeducted(amount: UFix64, inclusionEffort: UFix64, executionEffort: UFix64)

/* Event that is emitted when fee parameters change */
access(all) event FeeParametersChanged(surgeFactor: UFix64, inclusionEffortCost: UFix64, executionEffortCost: UFix64)
```


<h1>FlowStorageFees</h1>

`FlowStorageFees`コントラクトは、ストレージ料金のパラメータとユーティリティメソッドを定義します。

Source: [FlowStorageFees.cdc](https://github.com/onflow/flow-core-contracts/blob/master/contracts/FlowStorageFees.cdc)

| Network | Contract Address |
|:-:|:-:|
| Emulator | `0xf8d6e0586b0a20c7` |
| Cadence Testing Framework | `0x0000000000000001` |
| Testnet | `0x8c5303eaa26202d6` |
| Mainnet | `0xe467b9dd11fa00df` |

<h3>Events</h3>

`FlowStorageFees`の重要なイベントは次のとおりです。

```ruby
/* Emitted when the amount of storage capacity an account has per reserved Flow token changes */
access(all) event StorageMegaBytesPerReservedFLOWChanged(_ storageMegaBytesPerReservedFLOW: UFix64)

/* Emitted when the minimum amount of Flow tokens that an account needs to have reserved for storage capacity changes. */
access(all) event MinimumStorageReservationChanged(_ minimumStorageReservation: UFix64)
```

*Last updated on **Dec 17, 2024** by **j pimmel***

翻訳元

https://developers.flow.com/build/core-contracts/flow-fees

***

<b>[Previous << Service Account](https://qiita.com/flowcadence/items/c11bd0dfea9691961946)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Flow Fees)

<b>[Next >> Staking Table](https://qiita.com/flowcadence/items/1d432b038762c7bf8063)</b>
os.environ.get と os.environ[] の違いはディクショナリ操作にあり！

Pythonで環境変数を扱う際によく使う os.environ は、辞書（ディクショナリ）風にアクセスできるオブジェクトです。
そのため、`os.environ.get` と `os.environ[]` は、ディクショナリ操作の違いとして理解するのがポイントです。

#### 主な違い
##### 存在しない環境変数を指定した場合の動作
 `os.environ.get("KEY")`
 存在しない場合は `None` を返します。デフォルト値を指定することも可能です。
 例:
   ```
   iam_role_arn = os.environ.get("REDSHIFT_IAM_AUTH_ROLE_ARN", "default_role_arn")
   ```

   `os.environ["KEY"]`
   存在しない場合は KeyError を発生させます。値が必須の場合に便利です。
   例:
   ```
   iam_role_arn = os.environ["REDSHIFT_IAM_AUTH_ROLE_ARN"]  # 未設定ならエラー
   ```
---

### 使い分け
`os.environ.get`
環境変数が存在しなくても柔軟に対応したい場合に使用します。
例: デフォルト値を指定してプログラムを続行。

   `os.environ[]`
必須の環境変数が設定されていない場合にエラーを発生させたい場合に使用します。
例: 設定ミスをすぐに発見したいとき。

### まとめ
安全で柔軟に動作させたいなら os.environ.get。
必須チェックを徹底したいなら os.environ[]。
これらの違いを理解し、用途に応じて使い分けてみてください！
おしゃれな画像がいっぱい

## は・じ・め
ussplashという画像提供サイトからapiで画像引っ張ってきてます

## 作ったものサービス
![Screenshot 2024-12-26 at 0.22.28 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784645/4f894225-c09b-e475-a316-c43c22b5af73.png)
アプリはこちら下矢印

https://clock-web-image.vercel.app/

github https://github.com/boyintyoko/clock-web
結構commit内容適当です

## 作ったきっかけ
うーん、知らん

## 使い方
うーん、知らん
スマホのレスポンシブ対応めんどいからやってないです

## 使用技術
### インフラ
 * Vercel
### フロントエンド
 * next

## 終わりに
こんなクソ適当なwebとブログを見ていただきありがとうございます。
まだ中2なので許してください
うーん end
エンジニアの働くフロント、バック、インフラとは

## 前置き

エンジニアを目指す人、エンジニア初心者がどこを目指すのか、大きくジャンルとして3つ挙げられる。
それぞれのジャンルについて簡単にまとめてみた。

## フロントエンド
ユーザーが直接触れるユーザーインターフェース(UI)の部分を開発する領域
一般的にWebエンジニアと言われがち
HTML、CSS、JavaScriptを用いてWebサイトの見た目や動きを実装する
Bootstrapなどのフレームワークを多用することが多くモダンな技術を取り入れることが多い！

## バックエンド
サーバサイドの処理を担当し、アプリケーションのロジックやデータベースとのやり取りする部分を開発する領域
一般的にバックエンドエンジニアだったり、サーバサイドエンジニアと言われがち
プログラミング言語は、Java、Python、Ruby、PHPなどが使われることが多い
また、Linux等のサーバ構築を行うことも多い
ユーザーからは直接見えない部分の開発を行う

## インフラ
アプリケーションを稼働させるために必要な環境を構築・運用する領域
一般的にインフラエンジニアと言われがち
サーバー、ネットワーク、データベース、ストレージなどのシステム基盤を管理
クラウドサービスの利用、パフォーマンス・可用性の向上、セキュリティ対策なども担当

## まとめ
それぞれの領域ごとに特色があるため、自分の興味のあるジャンルへ進めばよい
とはいえ、各領域ごとに、求められる技術や稼働時間など大きく変わる印象がある
ざっくり概要であるが、ここで記事を閉じる
お疲れ様でした( ^^) _U~~
AndroidStudio アクションバー 戻る

## アクションバーに戻るボタンを配置
[アクションバーが出ない時](https://qiita.com/mk-000856/items/43a96f7faf85ca743000#%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E7%A2%BA%E8%AA%8D)

この ← アイコン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/b20e91bf-c445-0be4-54d6-546fc97e974b.png)

~~~java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main2);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //戻るボタンを配置＋＋＋＋＋＋＋＋
        ActionBar actionBar = getSupportActionBar();
        if(actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
        //＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋
    }
    //戻るボタンを押した時＋＋＋＋＋＋＋＋
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == android.R.id.home){
            finish();
            return true;
        }else{
            return super.onOptionsItemSelected(item);
        }
    }
    //＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋＋
}
~~~

:::note info
解説
---
- **ActionBar actionBar = getSupportActionBar();**
アクションバーオブジェクトの取得

- **actionBar.setDisplayHomeAsUpEnabled(true);**
戻るボタンを有効にする
<br>

//戻るボタンを押した時の処理
@<foo>Override
public boolean onOptionsItemSelected(MenuItem item) {
&emsp;&emsp;if(item.getItemId() == android.R.id.home){
&emsp;&emsp;&emsp;&emsp;finish();
&emsp;&emsp;&emsp;&emsp;return true;
&emsp;&emsp;}else{
&emsp;&emsp;&emsp;&emsp;eturn super.onOptionsItemSelected(item);
&emsp;&emsp;}
}
- **android.R.id.home**
戻るボタンのid処理のfinish()で現在のページを消し、戻る
:::
AIの精度を測る！混同行列と4つの指標を理解しよう！

こんにちは！

「AI」って最近よく聞くけど、実際どんな風に活用されてるんだろう？ そして、AIの性能ってどうやって測るんだろう？ そんな疑問をお持ちのあなたへ。

今回は、AIの性能を測るための重要な手法 **「混同行列」** と、そこから導き出される **「精度」「適合率」「再現率」「F値」** という4つの指標について、わかりやすく解説していきます。 初心者の方でも理解できるように、具体的な例も交えて説明していきますね！

### 混同行列って何だろう？

混同行列は、AIの予測精度を評価するための表のことです。 特に、**「Yes」か「No」** のように、2つの選択肢から答えを予測するAIでよく使われます。

例として、迷惑メールを判別するAIを想像してみましょう。 迷惑メールを「Yes」、そうでないメールを「No」とすると、AIの予測結果は以下の4パターンに分けられます。

* **実際は迷惑メールで、AIも迷惑メールと予測（正解）**
* **実際は迷惑メールなのに、AIは迷惑メールではないと予測（間違い）**
* **実際は迷惑メールではないのに、AIは迷惑メールと予測（間違い）**
* **実際は迷惑メールではなく、AIも迷惑メールではないと予測（正解）**

これらの結果をまとめたものが混同行列です。

|  | AIが迷惑メールと予測 | AIが迷惑メールではないと予測 |
|---|---|---|
| 実際は迷惑メール | 正解 (TP) | 間違い (FN) |
| 実際は迷惑メールではない | 間違い (FP) | 正解 (TN) |


### 混同行列の見方

表の中のアルファベットは、それぞれ以下のような意味を持っています。

* **TP (True Positive)：** 本当に迷惑メールで、AIも迷惑メールと正しく予測できた数
* **FP (False Positive)：** 迷惑メールではないのに、AIが迷惑メールと間違えて予測した数
* **FN (False Negative)：** 迷惑メールなのに、AIが迷惑メールではないと間違えて予測した数
* **TN (True Negative)：** 迷惑メールではなく、AIも迷惑メールではないと正しく予測できた数

### 混同行列からわかること：4つの指標

混同行列から、AIの性能を様々な角度から評価することができます。 ここでは、特に重要な4つの指標を紹介します。

1. **精度 (Accuracy)：** 全体の予測のうち、どれくらい正解していたかを表す指標です。
    * 計算式： (TP + TN) / (TP + FP + FN + TN)
    * 例：迷惑メールフィルターで、全体のメールのうち、正しく分類できたメールの割合

2. **適合率 (Precision)：** AIが「Yes」と予測したもののうち、実際に「Yes」だったものの割合を表す指標です。
    * 計算式： TP / (TP + FP)
    * 例：迷惑メールフィルターで、迷惑メールと判断されたメールのうち、実際に迷惑メールだった割合

3. **再現率 (Recall)：** 実際に「Yes」だったもののうち、AIが「Yes」と予測できたものの割合を表す指標です。
    * 計算式： TP / (TP + FN)
    * 例：迷惑メールフィルターで、実際に迷惑メールだったもののうち、AIが迷惑メールと判断できた割合

4. **F値 (F-measure)：** 適合率と再現率のバランスを測る指標です。
    * 計算式： 2 * (適合率 * 再現率) / (適合率 + 再現率)
    * 例：迷惑メールフィルターで、迷惑メールの検出漏れと、誤判定のバランスを考慮した指標


### どんな時にどんな指標が重要？

これらの指標は、状況によって重要度が変わってきます。

* **精度が重要なケース：** 全体的な正答率を上げることが重要視される場合。例えば、顧客からの問い合わせに自動応答するAIなど。
* **適合率が重要なケース：** 「Yes」と予測することによるリスクが高い場合。例えば、病気の診断AIで、健康な人を誤って病気と診断してしまうと、不要な検査や治療につながる可能性がある。
* **再現率が重要なケース：** 「Yes」を見逃すことによるリスクが高い場合。例えば、工場の不良品検知AIで、不良品を見逃すと、重大な事故につながる可能性がある。
* **F値が重要なケース：** 適合率と再現率のバランスを取りたい場合。例えば、迷惑メールフィルターで、迷惑メールの検出漏れと、重要なメールを誤って迷惑メールと判断してしまうことの両方を避けたい。


### まとめ

混同行列と4つの指標は、AIの性能を多角的に評価するために非常に役立ちます。 AI開発者だけでなく、AIを利用する人にとっても、これらの指標を理解しておくことは、AIをより効果的に活用するために重要です。

今回の記事が、混同行列と指標を理解する上で少しでもお役に立てれば幸いです。
【ChatGPT】CoTに勝る？　新たな思考方法ーCQoT


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

　今回は、CoTに勝る？　新たな思考方法ーCQoTの紹介です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　SoraのPlus/Teamユーザーへの
　　クリスマスプレゼント🎁は
　　　現在も有効ですよ😸

　どんどん動画生成しましょうね。
***
　さっそく、【本題】です。

　今回は、
　　CoTに勝る？
　　　新たな思考方法である
　　　　CQoTを紹介します。

　CoTは
　　“思考の連鎖”でした。

　CQoTとは
　　Critical-Questions-of-Thought
　　　“思考の重要な質問”です。

　研究者は、
　　哲学者のフレームワークを
　　　LLMに応用することで
　　　　モデルの推論能力を
　　　　　向上させる研究として
　　　　　　CQoTを出してきました。

　ここでは、
　　8つの質問で
　　　自分自身の答えを
　　　　批評する哲学的手法を
　　　　　活用したLLMの
　　　　　　プロンプティング
　　　　　　　テクニックなります。

　AIDBさんのこちらのページを
　　参照しました。
　　　[AIDBさんページ](https://ai-data-base.com/archives/81166)

　今回は、論文のPDFを
　　ChatGPTに読み込ませて、
　　　Promptを作成してもらいました。

　事前に言わせてもらいますが、
　　今回のPromptを使っても
　　　得られることは
　　　　あまりありませんでした。

　おそらく、
　　Promptとしては
　　　研究者が意図した形では
　　　　なかったのでしょう。

　それを考慮しておいて
　　いただけとありがたいです。

　こちらが、
　　そのPromptになります。
　　　＊＊＊に問題を入力して
　　　　送信してください。
```Text:CQoTPrompt
**問い:**  
[＊＊＊]


あなたは論理的推論と批判的思考の専門家です。上記の問いに対して、Critical-Questions-of-Thought (CQoT) アプローチを使用して分析・解決してください。以下の手順に従ってください：


### ステップ1: 論理的推論の計画
1. 問題を分析し、論理的な推論計画を作成してください。
2. 推論を明確なステップに分割し、それぞれのステップにおいて前提（事実または仮定）と、それに基づいて導かれる結論を具体的に記述してください。
3. この時点では最終的な答えを出さないでください。


### ステップ2: 批判的質問（CQ）の適用
作成した推論計画を以下の批判的質問（CQs）を用いて評価してください。それぞれの質問に対して、「パス」または「失敗」と明確に記述し、理由を説明してください。

**批判的質問（CQs）：**
1. 推論プロセスは明確に定義された前提から始まっていますか？
2. 前提は証拠や受け入れられた事実に基づいていますか？
3. 前提と結論の間に論理的なつながりがありますか？
4. その論理的なつながりは妥当ですか？
5. 推論プロセスに誤謬や論理的なエラーはありませんか？
6. 結論は前提から論理的に導き出されていますか？
7. 推論プロセスは確立された知識や原則と一致していますか？
8. 結論は妥当で現実的ですか？

各質問について「パス」または「失敗」と評価し、その理由を説明してください。


### ステップ3: 反復的修正
もし8つの質問のうち7つ以上が「パス」ならば次のステップに進んでください。それ以外の場合は、CQsのフィードバックに基づいて推論計画を修正し、ステップ1と2を繰り返してください。このプロセスは最大10回繰り返します。それでも7つ以上の「パス」が得られない場合、最も一貫性のある推論計画を採用して次のステップに進みます。


### ステップ4: 最終回答
ステップ3で検証された推論計画を使用し、問いに対する簡潔かつ論理的に整合性のある最終回答を提供してください。回答は検証済みの推論プロセスに基づいている必要があります。

**出力形式:**
1. **推論計画:**
   - ステップ1: [前提/結論]
   - ステップ2: [前提/結論]
   - ...
2. **批判的質問の評価:**
   - CQ1: パス/失敗 - [説明]
   - CQ2: パス/失敗 - [説明]
   - ...
3. **修正された推論計画（必要に応じて）:**
   - [修正された前提/結論]
4. **最終回答:**
   - [検証済みの推論に基づく最終回答]
…
```

　また、ハルシネーションが
　　起こりやすい問題を与えると
　　　そのハルシネーションのままの
　　　　思考を継続してしまいます。

　ですから
　　このPromptを使う前に
　　　ネットから正しい情報を得てから
　　　　思考するようにすべきかも
　　　　　しれませんね。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
複数のPDFを結合するサンプル

## 呼び出し側
```php
$pdf1 = file_get_contents('path/to/pdf1.pdf');
$pdf2 = file_get_contents('path/to/pdf2.pdf');
$pdf3 = file_get_contents('path/to/pdf3.pdf');

$merger = new \App\SomeDirectory\PDFMargeSample();
$mergedPdf = $merger->mergePdf([$pdf1, $pdf2, $pdf3]);

file_put_contents('path/to/merged.pdf', $mergedPdf);

```

## マージ処理本体

```php
<?php
namespace App\SomeDirectory;

use setasign\Fpdi\Tcpdf\Fpdi;

class PDFMargeSample
{
    /**
     * 複数のPDFデータを結合
     *
     * @param array $contentsArray PDFデータの配列（バイナリ文字列）
     * @return string 結合されたPDFデータ（バイナリ文字列）
     */
    public function mergePdf(array $contentsArray): string
    {
        if (empty($contentsArray)) {
            throw new \InvalidArgumentException("PDFデータが空です。");
        }

        // FPDIのインスタンスを作成
        $pdf = new Fpdi();
        $pdf->setPrintHeader(false);

        // 各PDFデータを順番に結合
        foreach ($contentsArray as $contents) {
            if (!is_string($contents)) {
                throw new \InvalidArgumentException("PDFデータは文字列である必要があります。");
            }

            // PDFの内容を一時ファイルに格納
            $tempFile = tmpfile();
            fwrite($tempFile, $contents);
            $tempPath = stream_get_meta_data($tempFile)['uri'];

            // PDFをFPDIに追加
            $pageCount = $pdf->setSourceFile($tempPath);
            for ($i = 0; $i < $pageCount; $i++) {
                $pdf->AddPage();
                $pdf->useTemplate($pdf->importPage($i + 1));
            }

            // 一時ファイルを閉じる
            fclose($tempFile);
        }

        // 結合されたPDFを出力
        return $pdf->Output(null, 'S');
    }
}

```
日本語のCSVファイルはExcelで開くと、文字化けの対応

# 元のCSV
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/233f5a7c-a11e-b4de-b4c2-bc973dc06a89.png)

# Excelで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/83cdf3f1-f479-288b-a537-a8a6051f467a.png)

# 対応方法 BOMをチェックし、保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/cc723309-f7e9-1bab-6702-33ae185482f9.png)

# 対応後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/a0ce0ac3-0d0b-e330-7d29-e73a014eb53a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/92c28054-c388-1af8-1e84-b807e0f04206.png)
windowsでiverilog その172

# 概要　
windowsでiverilogやってみた。
練習問題、やってみた。

# 練習問題
AtCoderを解け。
文字列内の、'1' の個数をカウントする

# サンプルコード

```

module test;
	integer stdin = 'h8000_0000;
	integer a,
		b,
		c,
		ch,
		v,
		p;
	reg [7:0] pc;
	reg [7:0] str[0:9];
	initial
	begin
		pc <= 10;
		v = 0;
		p = 0;
	end
	always #1
	begin
		case(pc)
		10:
		begin
			ch = $fgetc(stdin);
			pc <= 20;
		end
		20:
		begin
			str[v] = ch;
			if (ch == 'ha)
			begin
				pc <= 30;
			end
			else
			begin
				v++;
				pc <= 10;
			end
		end
		30:
		begin
			ch = str[v];
			if (ch == 'h31)
			begin
				p++;
			end
			pc <= 40;
		end
		40:
		begin
			if (v == 0)
			begin
				pc <= 50;
			end
			else
			begin
				v--;
				pc <= 30;
			end
		end
		50:
		begin
			$write("%d", p);
			pc <= 60;
		end
		60:
		begin
			$finish(0);
		end
		endcase
	end
	initial
	begin
		//$monitor(" %d", pc);
	end
endmodule




```

# 実行結果

```
>vvp a.out
111
          3
```

以上。
Visual studio code の　GitHubCopilot　設定メモ



昨日久しぶりにVSCodeを使おうと起動したらGitHubCopilotがアカウントリンク切れてた。
アカウント名は選択できるけど、copilotのサインインして下さいって所をクリックしても
サインインの状態に移行しない。

そこで、検索して対応策を見てみたが、再インストールや資格情報マネージャーからGitHubのログイン情報を削除等では対応できなかった。
拡張機能の一覧からGitHubCopilotの設定（ギアマーク）をクリックしてアカウント設定を再設定する事で復旧できた。

私の場合であり、詳しい事はなんもわからんので誰かの助けになれればとメモを残す。
私はエンジニアではありません、何も分からないマンだ。
今現在作った実績はblenderの国土地理院アドオンを一個作っただけだ。
何も聞かないでほしい(笑)
あとキータを使ったのも初めてなのでこれが初カキコです（）
【Flutter】RiverpodのFutureProviderで直列、並列処理を行う

# 前提
下記のように、リポジトリからデータを取得するRiverpodのFutureProviderを二つ作成します。
```dart
@Riverpod(keepAlive: false)
Future<User> userData(Ref ref) {
  final repo = ref.watch(localUserRepositoryProvider);
  return repo.getUserData();
}

@Riverpod(keepAlive: false)
Future<List<Notification>> notification(Ref ref) async {
  final repo = ref.watch(notificationRepositoryProvider);
  return repo.getNotification();
}
```

# 直列
```dart
@Riverpod()
Future<String> homePageData(Ref ref) async {
  try {
    // サンプルなので、取得した値は特に使ってません
    final notifications = await ref.watch(notificationProvider.future);
    final user = await ref.watch(userDataProvider.future);
    print(notifications);
    print(user);
  }  catch (e) {
    print(e);
  }

  // サンプルなので戻り値は適当にしてます
  return 'Hello world';
}
```

# 並列
```dart
@Riverpod()
Future<String> homePageData(Ref ref) async {
  try {
    // サンプルなので、取得した値は特に使ってません
    final (notifications, user) = await (
      ref.watch(notificationProvider.future),
      ref.watch(userDataProvider.future),
    ).wait;
    print(notifications);
    print(user);
  } on ParallelWaitError catch (e) {
    print(e.errors.$1);
    print(e.errors.$2);
    print(e.values.$1);
    print(e.values.$2);
  }

  // サンプルなので戻り値は適当にしてます
  return 'Hello world';
}
```

### 疑問
ParallelWaitErrorがキャッチできず、知っている方がいればコメントください。。。

```dart
  try {
    // サンプルなので、取得した値は特に使ってません
    final (notifications, user) = await (
      ref.watch(notificationProvider.future),
      ref.watch(userDataProvider.future),
    ).wait;
    print(notifications);
    print(user);
  } catch (e) {
    print(e.runtimeType);
  }
```

 上記のコードで、`ParallelWaitError<(List<Notification>?, User?), (AsyncError?, AsyncError?)>`が出力されるのですが、以下のようにしてもキャッチできませんでした。

```dart
  try {
    final (notifications, user) = await (
      ref.watch(notificationProvider.future),
      ref.watch(userDataProvider.future),
    ).wait;
    print(notifications);
    print(user);
  } on ParallelWaitError<(List<Notification>?, User?),
      (AsyncError?, AsyncError?)> catch (e) {
    // キャッチされない
    print(e.runtimeType);
  }
```
Linux基本コマンド集

よく使うコマンドの解説と使用例を自分用の備忘録も兼ねて作成します。
発端はここ
https://twitter.com/goyangi_web/status/1871509229951164435

# Linuxのコマンド
## 1. ls
ディレクトリに存在するファイル/ディレクトリの一覧を表示するコマンド。多分一番使う。
使用例と応用、オプション
```bash
ls # だけだと自分がいる今のディレクトリの一覧を表示する。
ls /etc/ # のようにすると特定のディレクトリの一覧を表示可能
ls -l # 一覧をリスト形式で表示する。permissionも表示してくれるから便利
ls -a # .がついた隠しファイルも表示可能 (.sshみたいなやつ)
ls -la # 上二つの合わせ技
```

## 2. cd
チェンジディレクトリ、自分がいるディレクトリを変更するためのコマンド。これも一番使う。
使用例と応用
```bash
cd hogehoge/hugahuga # hogehoge/hugahuga に行きたいときに使う
cd .. # 親ディレクトリに行きたいときに使う
```

## 3. mkdir
ディレクトリを作成する際に使う
使用例
```bash
mkdir hogehoge # hogehoge ディレクトリが作成される
```

## 4. touch
ファイルを新規作成する際やタイムスタンプ更新に使う。
使用例とオプション
```bash
touch hoge.txt # 空のhoge.txtが作成される
touch -a hoge.txt # hoge.txtのアクセス日時が更新される
```
参考 : https://qiita.com/Tajima-Kazuki/items/626cbfeb4e0fb623eecb

## 5. rm
ファイルやディレクトリを削除するときに使う
使用例とオプション
```bash
rm hoge.txt # hoge.txtを削除する
rm -r hogehoge # hogehogeディレクトリの中身を再帰的に削除する
rm -f hoge.py # 削除しますか？などの質問を無視して強制的に削除する
rm -rf / --no-preserve-root　# 滅びの呪文
```

## 6. mv
ファイルやディレクトリを移動するときに使う
使用例
```bash
mv hogehoge hugahuga # hogehogeをhugahugaの中に移動する。 -rを付けなくても全部再帰的に移動する
```

## 7. cp
ファイルをコピーするときに使う
使用例
```bash
cp unti.txt unti2.txt # unti.txtをunti2.txtという名前で現在いるディレクトリにコピーする
cp unti.txt hogehoge/ # unti.txt を名前そのままでhogehogeディレクトリにコピーする
cp unti.txt unti2.txt hogehoge/ # unti.txtをunti2.txtという名前でhogehogeディレクトリにコピーする
cp * hogehoge/ # 今いるディレクトリの全てのファイルをhogehogeディレクトリにコピーする
```

## 8. chmod
ファイルのパーミッションを変更するコマンド。 permission deniedってエラーが出たらこれかsudoでだいたい解決
```bash
chmod 777 unti.txt # unti.txtを全てのユーザーから読み書き実行できる権限を付与する
chmod -R 777 unti/ #  untiディレクトリにある全てのファイルに再帰的に全てのユーザーから読み書き実行できる権限を付与する
```
権限に対するコマンドの細かいやつはこちらを参照 : https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95

## 9. chown
ファイルの所有権を変更するコマンド
```bash
chown root unti.txt # unti.txtの所有権をrootユーザーに変更
chown -R root:group1 hogehoge/ # hogehogeディレクトリの所有権を再帰的にrootユーザーとgroup1に変更 
```
参考 : https://qiita.com/3062_in_zamud/items/d93770016e7d931a5983

## 10. sudo
スーパーユーザー権限でコマンドを実行するコマンド。これでやるとPermissionを無視して強制的に実行できるが、権限が強いので注意
```bash
sudo chmod 777 unti.txt # chmodをsu権限で実行する。
sudo su - # スーパーユーザーに変身するコマンド。
```

## 11. reboot
再起動するコマンド
```bash
reboot # 再起動する
```

## 12. vi
vimを使ってファイルを編集するコマンド。存在しないファイルを指定した場合は新規でファイルが作成される。
```bash
vi unti.txt # unti.txtを編集する
```
vimに入ったあとは以下のコマンドを入力して操作する
```bash
i # insertモード、編集ができるようになる
Escape Key # コマンドモードに切り替わる
:q # ファイル編集の終了
:wq # ファイルを上書きして編集終了
/ # 文字列検索。検索したい文字列を入力してEnterを押すと検索される。検索した後nを押すと次の文字列に行く
```


## 13. cat
ファイルの中身を見るコマンド
```bash
cat unti.txt # unti.txtの中身を見れる
cat -n unti.txt # unti.txtの中身を行数の表示付きで見れる
```

## 14. grep
テキストが書かれているファイルを検索するコマンド
```bash
grep -rnw . -e "unti!!" # unti!!というテキストが書かれているファイルを今いるディレクトリから再帰的に検索し、ファイル名と何行目に書かれているかを出力する。だいたいこれを覚えておけばいい(偏見)
```

## 15. find
ファイル名で検索するコマンド。grepと組み合わせると嬉しくなれる。正規表現を覚えると幸せになれる。
```bash
find . -name unti.txt # unti.txtという名前が付いているファイルを現在いるディレクトリから再帰的に探索する
find . -name '*.txt' # .txtが付いているファイルを現在いるディレクトリから再帰的に探索する。
```

# 感想
色々コマンドありますね。
よく使うようなコマンドはだいたい書いたと思いますが、これも基本コマンドだろ！っていうコマンドがある方は使い方も一緒に乗せてコメントしてくれると嬉しいですね。
Javaのフィールドと引数の違いを理解しよう！

Javaを学び始めるとき、「フィールド」と「引数」という言葉に出会います。そして、よく似た名前で混乱することもあるかもしれません。本記事では、**フィールド**と**引数**の違いを明確にし、`this`キーワードの使い方についても解説します。これを読めば、Javaのクラス設計がスムーズになること間違いなし！

---

## **1. フィールドとは？**

フィールドは、クラス内で定義される**変数**のことで、クラスが保持するデータ（オブジェクトの状態）を表します。

- **特徴**
  - クラス全体で利用可能。
  - クラスのインスタンスが生成されている間、値が保持される。
  - アクセス修飾子（`private` や `public`）を指定して、アクセス範囲を制御できる。

### **例：フィールドの定義**

```java
public class BankAccount {
    private String accountHolder;  // フィールド
    private double balance;        // フィールド
}
```

上記のコードでは、`accountHolder`（口座名義）と`balance`（残高）がフィールドとして定義されています。

---

## **2. 引数とは？**

引数（パラメータ）は、メソッドやコンストラクタに値を渡すために使う**一時的な変数**です。メソッドやコンストラクタの中でのみ有効です。

- **特徴**
  - メソッドやコンストラクタに値を渡すために使われる。
  - 一時的なスコープを持ち、メソッドやコンストラクタの処理が終わると消える。

### **例：引数の定義**

```java
public BankAccount(String accountHolder, double initialBalance) {
    this.accountHolder = accountHolder;
    this.balance = initialBalance;
}
```

ここでは、`accountHolder`と`initialBalance`が引数です。オブジェクトを作るときに渡される値を一時的に受け取るための変数として機能します。

---

## **3. フィールドと引数の違い**

| **項目**      | **フィールド**                      | **引数**                          |
| ------------- | ----------------------------------- | ---------------------------------- |
| 定義場所       | クラス内                           | メソッドやコンストラクタの括弧内    |
| 有効範囲       | クラス全体                          | メソッドやコンストラクタ内          |
| 役割           | オブジェクトの状態を保持            | 一時的に値を受け渡す               |
| 修飾子         | `private`、`public`などで制御可能   | 修飾子を持たない（ローカル変数扱い）|

---

## **4. フィールドと引数の名前が同じ場合**

フィールドと引数の名前が同じ場合、`this`キーワードを使って区別します。

### **例：`this`キーワードの使用**

```java
public class BankAccount {
    private String accountHolder;  // フィールド
    private double balance;        // フィールド

    public BankAccount(String accountHolder, double balance) {
        this.accountHolder = accountHolder; // フィールド = 引数
        this.balance = balance;             // フィールド = 引数
    }
}
```

- **`this.accountHolder`**：クラスのフィールドを指します。
- **`accountHolder`（`this`なし）**：引数を指します。

---

## **5. 実際のコード例で理解する**

以下は、フィールドと引数の役割がわかるコード例です。

### **コード例：銀行口座クラス**

```java
public class BankAccount {
    private String accountHolder;  // フィールド
    private double balance;        // フィールド

    // コンストラクタ
    public BankAccount(String accountHolder, double initialBalance) {
        this.accountHolder = accountHolder;
        this.balance = initialBalance;
    }

    // 残高を表示するメソッド
    public void displayInfo() {
        System.out.println("Account Holder: " + this.accountHolder);
        System.out.println("Balance: " + this.balance);
    }
}

// 実行クラス
public class Main {
    public static void main(String[] args) {
        // オブジェクトを生成し、引数を渡す
        BankAccount account = new BankAccount("Alice", 1000.0);

        // 情報を表示
        account.displayInfo();
    }
}
```

### **実行結果**

```
Account Holder: Alice
Balance: 1000.0
```

---

## **6. まとめ**

- **フィールド**は、オブジェクトが保持するデータで、クラス全体で利用可能。
- **引数**は、メソッドやコンストラクタが一時的に受け取るデータ。
- 名前が同じ場合は、`this`キーワードを使ってフィールドと引数を区別する。

これらを理解することで、クラス設計がより明確になり、保守性の高いコードが書けるようになります。ぜひ実際にコードを書いて確認してみてください！

---

## **参考リンク**
- [Javaの基本公式ドキュメント](https://docs.oracle.com/javase/tutorial/)
レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス 読んだ

# レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

「レガシーコード」の概念と、それから抜け出すための実践的な方法について記載した本。

ケント・ベックのXPとのつながりが多く見られる。ウォーターフォールを抜け出してアジャイルへ。細かいサイクルを繰り返すことで完成に近づけていく。

レガシーコードはテストのないコード？

1. [第1部　レガシーコード危機](#第1部レガシーコード危機)
    1. [1章　何かが間違っている](#1章何かが間違っている)
    1. [2章 CHAOSレポート再考](#2章-chaosレポート再考)
    1. [3章 賢人による新しいアイデア](#3章-賢人による新しいアイデア)
1. [第2部　ソフトウェアの寿命を延ばし価値を高める9つのプラクティス](#第2部ソフトウェアの寿命を延ばし価値を高める9つのプラクティス)
    1. [4章 9つのプラクティス](#4章-9つのプラクティス)
        1. [5章～13章](#5章13章)
        1. [14章 レガシーコードからの学び](#14章-レガシーコードからの学び)

## 第1部　レガシーコード危機

### 1章　何かが間違っている

他の分野のマネジメント手法と、ソフトフェア分野のものとの違い。最初にガチガチに作る発想だと、ソフトウェアはうまくいかない。

そもそも、ソフトウェアをどのように開発・保守していけばいいのかをほとんどの人が知らない。

リリースをまとめて大きく行うことは非効率的。

### 2章 CHAOSレポート再考

CHAOSレポート：ソフトウェアプロジェクトの成功率を評価したレポート。

しかし、このレポートの「成功」「問題あり」「失敗」の定義自体に疑問符がつけられる。

「初期の納期・予算・機能がすべて満たされていること」を成功の定義としているが、「初期」の納期・予算・機能は予測でしかない。

この定義で「成功」とされるプロジェクトには、コードの品質が悪く、使っていくうちにひどくなっていくプロジェクトも含まれる。保守が悪夢！

注目したいのは、「なぜ失敗するのか」

失敗の要因１：コードの変更　変更できないコードが多すぎる。変更したいときには膨大な手作業のテストが必要となる。

失敗の要因２：蔓延　見つけにくいバグがコードに含まれる。

失敗の要因３：複雑性の危機　「ちょっと」でつけた機能が、全体を複雑にし、保守・修正のコストを上げる。

これらの失敗が、アメリカだけで100億ドル単位の損失につながっている。

### 3章 賢人による新しいアイデア

アジャイルにしよう！アーリーアダプターからアーリーマジョリティのあいだを超え行き渡る時期が来ている。

## 第2部　ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

### 4章 9つのプラクティス

専門家が使う技術はすべて学習できる。専門家がすることを理解し、そのとおりにすれば、同じ結果を得られる可能性が高い。高い品質を保っている人を真似よう。

理論を守るところから始める。その経験から実践につなげていく。自然とできるようになるまでに10,000時間の練習が必要！

第一原理の例としては、「単一責務の原則」「オープン・クローズドの原則」がある。ただし、「何をすべきか」であって、「どうやるか」は教えてくれない。

「どうやるか」はプラクティスの守備範囲である。プラクティスの定義は以下の３つ。

- ほとんどの場合に価値があるものである
- 学ぶのが容易である。教えるのが容易である
- 実施がシンプルである。考えなくてもやれるくらいシンプルであること

変更しやすいコードを書くことは、将来発生する要求に比較的容易に応えられることに繋がる。

原則の理解、プラクティスを使う本来の理由の理解のためには、「良い」ソフトウェアとは何かを合意しておきたい。

「良い」ソフトウェアとは　当初の機能要件を満たし将来のニーズに対応できるように変更しやすくなっているものである。

9つのプラクティスとは以下の通り。

- 1.やり方より先に目的、理由、誰のためかを伝える
- 2.小さなバッチで作る
- 3.継続的に統合する
- 4.協力しあう
- 5.「CLEAN」コードを作る
- 6.まずテストを書く
- 7.テストでふるまいを明示する
- 8.設計は最後に行う
- 9.レガシーコードをリファクタリングする

変更可能なコードを作りつつ、ソフトウェア開発プロセスを効率化する助けになる。

#### 5章～13章

9つのプラクティスについての具体的な解説。

#### 14章 レガシーコードからの学び

全体のまとめとなる章。

これらのプラクティスは、ソフトウェア開発者がソフトウェア開発者のために始めたものであり、マネジメントのためのものではない。

引用「たとえそれがウォーターフォールプロセスだとしても、組織の同期点が開発プロセスの中でうまく機能しているようであれば、アジャイルのマネジメントプラクティスをたくさん導入する必要はないのだ。」

ソフトウェア開発の手法には正解はない。いろんな方法を拾い集め、自分の抱える問題に適用できるやり方を拾い集めていこう。
初めてのUML！これはなに図？なんのため？？

### はじめに
こんにちは！今回はUmlSysmlについて学んできました！
業務で利用するほか、応用技術者試験にもでてきますし、この機会にまとめておきます！

### そもそもUMLってなに？

UMLとはソフトウェアの設計、システムの動作、構造を視覚的に表現するものになります。これにより複数人での認識合わせや個人での整理を行うことができます。

### なぜUMLが必要なのか

もし決められた決まりがなく各々が独自の図を使って、または図を使わずにプログラムを整理していたらどうでしょうか？プログラムは複数人で作るのがほとんどだと思います。いうまでもなく認識のずれ等問題が起きてしまうでしょう。


### どんな種類がある？

#### クラス図
その名の通りクラスとクラスの関係を示すものです。以下の図のようにクラス名、そのクラスが持つプロパティおよびメソッドが一箱の単位でまとめられておりそれらの箱が様々な種類の線(継承、関連、集約)で結び付けられることによりクラス同士の関係が表されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629646/a8de8f91-fa3b-9a1f-51fe-0f9ea6b0235a.png)

こちらはショップでの注文プロセスを示しているクラス図であり

①Customer(顧客)がOrder(注文)を所有している
②Order(注文)がProduct(商品)を参照している

ということを表しています。

#### シーケンス図
クラス図ではクラス同士の関連でしたが、シーケンス図はインスタンス同士の関連が表現されたものになり、どういうインスタンスがあるのかを把握することができます。ある時間軸内で視覚的に表現できます。
上から下へ時系列が進みます。上に登場人物(インスタンス)が並んでいます。登場人物の線のしたに書いてあるところから引かれる矢印がインスタンス生成、生成されたインスタンスのメソッド呼び出しを表しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629646/e073dd89-51dc-5977-773b-ccb169a9b566.png)




#### ユースケース図
ユースケース図は作成しようとしているシステムにのせる機能を洗い出すために作成するものです。
ここまでの機能はxx要素で実現する　ここからはこっちがyy要素が実現するなど決めます。
ユースケース図を用いることで開発者と顧客などの異なる立場の人たちの間で認識合わせをするのに役立ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629646/3f18b3fc-266a-a12e-2151-0f2800e47a2b.png)

上の図は自動車の利用及びそれに伴うメンテナンスを表したユースケース図となっています。ドライバーがすること、整備士がすることが一目で分かりますね！



### 業務への活用事例

実際に業務でこのように使われているのを見たことがあります。

- 新しく実装に入るメンバに対しキックオフとしてシーケンス図を使用し、今のプログラムの処理の流れを共有
- 設計の段階でどのようなクラスを用意するかクラス図を作成しながら整理する



### おわりに

今後も使いながらUMLの各図をマスターしていきます！最後まで読んでいただきありがとうございました！
ハニーポット観測：VPN機能の脆弱性(CVE-2024-24919)を狙う攻撃に関する観測内容

# はじめに
三菱電機 情報技術総合研究所では製品開発時のセキュリティ対策にフィードバックする目的で、ハニーポットを設置・運用しています。
ハニーポットとは、不正な攻撃を受けることを前提として構築し、受けた攻撃の観測を目的とする囮システムです。
弊社は複数の種類のハニーポットを運用しており、今回はクラウド環境を利用して世界の各地域に設置しているハニーポットで観測された、VPN機能を狙っていると見られる攻撃パケットについてご紹介します。

# 脆弱性の概要
本記事では特定の製品のVPN機能に存在する、情報漏えいの脆弱性(CVE-2024-24919[^1])を取り上げます。
本脆弱性は、製品のエンドポイントのURLである“/clients/MyCRL”に対して、相対パスで親フォルダを指定するパケットを送信することで、本来アクセスできないはずの非公開フォルダに置かれたファイルにアクセス可能になります(ディレクトリトラバーサルと呼ばれる攻撃に関する脆弱性です)。
脆弱性を悪用した攻撃が成功すると、攻撃者は指定したパスに存在するファイルを参照可能になります。

本脆弱性の影響を受ける製品を特定の設定で使用している場合、本脆弱性を悪用することで、認証なしでリモートから任意のファイルを読み取ることが可能になります。
脆弱性の影響する製品および脆弱性への対応などは、JPCERT/CCによってまとめられています[^2]ので、そちらをご覧ください。
本脆弱性のNVDにおける公開は2024/05/28ですが、2024/4月末頃より攻撃が観測されていたという報告があり、ゼロデイ脆弱性として悪用されていた模様です。

# 弊社における観測状況
弊社のハニーポットでは、月間1000万程度のパケットを観測しています。
観測したパケットの中から、本脆弱性を狙ったと見られる攻撃をNVDでの公開日である2024年05月28日の１週間後である2024年6月4日に観測・発見しました。
本脆弱性のPoC[^3]は2024/5/30に公開されたことを確認しており、PoCの利用により攻撃が容易になったと考えられます。
攻撃の難易度が低下したことで攻撃者が増加し、攻撃パケットを送信するIPアドレス範囲が拡大したため、弊社のハニーポットでも観測されたと推測しています。
また、7月上旬にも同様の脆弱性を狙ったと見られる攻撃を再び観測しています。

![Qiita_CVE-2024-24919_観測状況.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901808/0794818d-354f-f758-cc6f-f6aa317e6672.png)


弊社では上記グラフで示した7月以降、本脆弱性を狙ったパケットを観測していません。
しかし、本脆弱性はPoCが公開されており、攻撃者による悪用が容易な状況にあります。
そのため、この脆弱性の影響を受ける製品を使用している場合には、早急な対策が必要です。


# 観測したパケットの内容
弊社のハニーポットで観測した、CVE-2024-24919の脆弱性の悪用を試行するパケットの内容をご紹介します。
観測したパケットはHTTPのPOSTメソッドを用いて送信されており、以下に示す相対パスのURLとペイロードが記述されていました。
<table>
    <tr><th>URL(相対パス)</th><th>ペイロード</th></tr>
    <tr><td rowspan="3">/clients/MyCRL</td><td>aCSHELL/../../../../../../../etc/shadow</td></tr>
    <tr><td>aCSHELL/../../../../../../../config/db/initial</td></tr>
    <tr><td>aCSHELL/../../../../../../../sysimg/CPwrapper/SU/Products.conf</td></tr>
</table> 

観測したパケットは“/clients/MyCRL”というエンドポイントのURLを指定した上で、設定ファイルなどのパスが記述されていました。
脆弱性を悪用した攻撃が成功すると、攻撃者が指定したパスに存在するファイルを参照可能になります。
例えば/etc/shadowは、Linuxにおいてユーザーのハッシュ化したパスワードの情報などを格納するファイルです。
/etc/shadowを参照することで、ユーザーのパスワード情報を窃取する際の糸口として利用することが想定されます。

# おわりに
VPN機能に関する脆弱性は、悪用すれば社内ネットワークへの侵入による機密情報の入手ができるなど、攻撃者にとって利用価値が高いと考えられます。
例えば警察庁発行の"令和６年上半期におけるサイバー空間をめぐる脅威の情勢等について[^4]"では、ランサムウェアの被害にあった企業・団体におけるランサムウェアの感染経路は47件中22件がVPN機器経由であったとしています。

今回ご紹介したVPN機能に関する脆弱性については、PoCの公開後まもなく攻撃パケットを観測しており、VPN機能の脆弱性に対する攻撃者の関心の高さが伺えます。
これより、VPN機能といったリモート接続可能な機能に存在する脆弱性に対しては、より一層迅速な対応が必要と考えています。

弊社では今回のご紹介した事例のように、継続的にハニーポットを用いた攻撃パケットの観測/分析を実施しております。
今後もQiitaを通じて観測結果をご報告する予定です。

[^1]:https://nvd.nist.gov/vuln/detail/cve-2024-24919
[^2]:https://www.jpcert.or.jp/newsflash/2024053001.html
[^3]:Proof of Concept code：脆弱性の検証用プログラムコード
[^4]:https://www.npa.go.jp/publications/statistics/cybersecurity/data/R6kami/R06_kami_cyber_jousei.pdf
IceWallとクラウドサービスについて

# IceWallについて
IceWallとは富士通が提供しているWebシグナルサインオン（SSO）およびWebアクセス管理ソリューションの1つ。企業や組織がWebシステムを安全かつ効率的に利用するために導入されている。

## 主な機能と特徴
### 1.シグナルサインオン（SSO）
ユーザーが1度ログインするだけで複数のアプリケーションやシステムにアクセスできる機能。ユーザーの利便性を向上させるとともにパスワードの管理コストを削減する

### 2.Webアクセス管理
ユーザー認証やアクセス制限を行い、許可されたユーザーのみが特定のシステムやデータにアクセスできるようにする。不正アクセスを防ぐためのセキュリティ対策となる。

### 3.柔軟な認証方式のサポート
LDAP、ActiveDirectoryなどのディレクトリサービスと連携。多要素認証（MFA）や認証プロトコル（SAML、OAuth、OpenID、Connectなど）をサポート

### 4.高い拡張性と柔軟性
様々な規模のシステムに対応可能。カスタマイズ性が高く既存のシステムとの統合が容易

### 5.セキュリティ強化
ログイン履歴やアクセス履歴を記録し異常な動作を検知するための監視機能を提供

## メリット
- 利便性向上
ユーザーは複数のパスワードを覚える必要がなくなり操作が簡単
- コスト削減
運用管理が効率化されるためセキュリティ対策のコストが削減
- セキュリティの向上
厳密なアクセス制限と監視機能によりデータの漏洩リスクが低減

# クラウドサービスとの連携
IceWallはクラウドサービス（SaaS、IaaS）と統合してクラウド上のアプリケーションにもセキュアにアクセスできる

## メリット
- 既存のオンプレミス環境とクラウド環境を安全に統合
- 利用するクラウドサービスごとに異なる認証方法を統一化

## あえてIceWallを使う理由
クラウドサービスには認証方法を統一化できる機能が既に実装されている（SSO、MFA、認証プロトコルSAML・OAuth・OpenID・Conectなどのサポート、クラウドサービス同士やオンプレ環境との統合、Microsoft365やクラウド内リソース）その為IceWallを使わなくても多くの認証課題をクリアすることができる。

それでもIceWallが有効なケースがある。クラウドの認証機能だけでは対処しきれない問題がある場合があり、解決する必要があった時にIceWallが役立つ。

### 1.企業が様々サービスを使っている時
企業がAzure、AWS、GooleCloudPlatfrom(GCP)あるいはオンプレミスシステムを併用している場合IceWallがそれらの環境を横断的に統一する認証基盤として機能する。
また1つの認証基盤だけでは管理が難しいオンプレミスの古いシステムや独自の認証プロトコルを使用するサービスも含めて統一的に管理ができる

### 2.カスタマイズ要件が多い場合
クラウドサービスだけでは実現しにくい企業固有の要件（例えば特定の認証フローやログ管理、独自UIの認証ポータル）が必要な場合IceWallを使って柔軟に対応ができる

### 3.ハイブリット環境での認証
企業がオンプレミスとクラウドを併用している場合、IceWallを利用することで両方の環境を統一して管理ができる。クラウドサービスでもハイブリット環境をサポートしているがIceWallの方が対応可能な範囲が広くなる場合がある

### 4.別のアイデンティティプロバイダー（idP）との連携
IceWallはクラウドサービス以外のIdP（例えばOktaやPing Identity）とも簡単に統合できるため異なるIdPが混在する環境での認証統一に便利

:::note info
IdPとは
Identity Provider（アイデンティティプロバイダー）とはユーザーのアイデンティティ（認証情報や属性情報）を管理し認証サービスを提供するシステムやサービスのこと
:::

### 5.組織ごとの柔軟なアクセス制御
IceWallはクラウド認証機能に依存せず、きめ細かいアクセス制御をカスタマイズできる為セキュリティポリシーが高くカスタマイズされた企業に適している

### 6.非常に高いレベルのセキュリティが求められている場合
金融機関や医療機関などクラウド認証の標準機能だけでは足りないセキュリティ要件（例：監査対応、特定の認証方法）がある場合、IceWallを追加することで補完できる

## IceWallを最大限に使う方法
クラウド認証機能を使いつつIceWallの機能を最大限使う為には
- IceWallを使って様々なクラウドサービスやオンプレミスシステムを統一的に管理する
- クラウド認証の機能を補完し、より柔軟な認証・アクセス制御ポリシーを実現する
- 高度なログ管理や独自の監査要件にも対応する

## まとめ
とある1社のクラウドサービスだけの環境では、そのクラウドサービスの認証基盤だけで十分な場合が多いですが**複数のクラウドやオンプレミスが混在している環境**、または**柔軟なカスタマイズや高度なセキュリティ要件が必要な場合**にはIceWallが効果的である。導入する際には自社の環境や運用要件をよく検討する必要がある
c#で、なでしこ その21

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
AtCoderを解け。
文字列内の、'1' の個数をカウントする。

# サンプルコード

```

「>」と入力。
それを指示に代入。
物は指示を「1」で区切る
答は物の配列要素数
答は答-1
答を表示する。


```

# 実行結果

```
>cnako2 at2.nako
>
111
3

```

以上。
VSCodeでdatファイルをsqlとして扱う

デフォルトだとdatファイルがプレーンテキストになっているので、実際に記述する拡張子として扱う方法の備忘録

1.画面右下の言語モードの選択(プレーンテキスト)をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818484/0efe9c26-0157-e417-439b-181cc4883b76.png)

2.「.datに対するファイルの関連付けの構成...」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818484/1beab998-2287-20ff-35a1-690eccbfa449.png)

3.扱いたい拡張子(SQL)を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818484/0c74e25b-8476-f91c-bc65-1bd098f5b4ff.png)

これでsqlとして書ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818484/1a6c5098-1b34-6b00-5418-ce89245e672c.png)

ただし、ここで設定するとすべてのdatファイルをその拡張子ベースとする設定になってしまう
dat形式はいろんな拡張子で書くことがあるので、ファイル別に扱う拡張子を変更する方法が欲しい
c#で、なでしこ その20

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
AtCoderを解け。
二つの整数a,bの積の偶奇を判定する。

# サンプルコード

```

「>」と入力。
それを指示に代入。
物は指示を「 」で区切る
aは物[0]の整数変換
bは物[1]の整数変換
a = a * b % 2
もし、aが0に等しいならば
　「Even」を表示する
違えば
　「Odd」を表示する



```

# 実行結果

```
>cnako2 at1.nako
>
5 7
Odd

```

以上。
Intel OneAPI 2025.0 で本当に ifort/icc が消えた

予告されていたことですが、本当に消えました。

> Intel® Fortran Compiler Classic (ifort) is now discontinued in oneAPI 2025 release.

https://www.intel.com/content/www/us/en/developer/articles/release-notes/oneapi-fortran-compiler-release-notes.html

富士通も A64fx 向けに LLVM ベースのコンパイラを出していますので、富士通とインテルを前提にするならば、LLVM が受け付けないような書き方をするな、ということになります。
京橋駅(大阪)周辺の三次元点群データをdeck.glで表示してみる

この記事は、[FOSS4G Advent Calendar 2024](https://qiita.com/advent-calendar/2024/foss4g) シリーズ2の25日目の内容になります。(が、毎度のことながら遅れてしまって申し訳ありません...:bow::sweat_drops:)

# はじめに

deck.glや地図データ可視化については以前から興味があって、今年の7/22には以下のPLATEAUイベントに参加して、実際に何か作ってみようと思いました。

https://connpass.com/event/322272/

身近な関西エリアで、PLATEAUが整備されていて、かつ、点群データもオープンデータとして公開されている京橋駅(大阪)周辺が良さそうに思いましたので、こちらを対象エリアとし、

https://www.geospatial.jp/ckan/dataset/kyoubasiekisyuuhen_las

UI/UXなどのデザイン周りを自力で組める自信がなかったので、deck.gl、loaders.glのサンプルサイトから、見た目の良い [loaders.glの3D Tiles](https://loaders.gl/examples/3d-tiles) サンプルを元に、Vite+pnpm構成でデモアプリを作成しました。

# デモサイト

デモサイトは以下のURLからアクセスできます。

URL: https://sanak.github.io/kyobashi-osaka-3d-sandbox/

![kyobashi-osaka-3d-sandbox-deckgl-react-01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104365/ec4b232b-4a93-d9b0-4ad4-b0ded69ed93f.gif)

## 基本操作

* ページ読み込み時は京橋駅の京阪・JR連絡通路の点群データを表示します
* ドラッグ、スワイプで視点を並行移動します
* マウスホイール、ピンチイン・ピンチアウトで視点を前後移動します
* Ctrlキーを押下しながらドラッグで視点を回転します
* 右上のコントロールパネルの [3D Tiles] ドロップダウンリストから別のデータを選択すると、選択したデータ範囲に移動します

## 注意事項

* [3D Tiles] ドロップダウンリスト内の [PLATEAUデータ] / [建築物]、[道路] データセットは、現在表示できません
* Linux環境のブラウザ(Firefox、Chrome)では表示がかなりもたつくかもしれません
* 現時点では、モバイル端末上では視点の回転がタッチ操作でできません
* モバイル端末で点群データを読み込み続けると、ブラウザがクラッシュするかもしれません
* PC・モバイル端末とも、地表面に近い箇所で操作を行うと、過大に飛んでしまうようです
* 視点の回転時に、点群データと背景タイルレイヤの重畳が正しく行われずに、ずれる場合があります

いずれも、時間のある時に改善できないか、少し確認してみます...。

# ソースコード

ソースコードは以下のURLからアクセスできます。

URL: https://github.com/sanak/kyobashi-osaka-3d-sandbox

## 備考

* 今回作成したdeck.gl+React版(`apps/deckgl-react`)では、ViteでReact+TypeScriptのテンプレートから初期化し、以下のloaders.glの3D Tilesサンプルのコードを上書きしたものをベースにしています
  * https://github.com/visgl/loaders.gl/tree/master/examples/website/3d-tiles
* TypeScriptの文法エラーが多々発生していて、デプロイ用のビルド時には tsc による型チェックをスキップしています
  * 元のサンプルコードの記載もReactの古い書き方になっているようなので、React Hooksを利用した書き方に変更の予定です
* PLATEAUの3D Tilesデータの表示が上手く行かないため、建築物レイヤについては、別途GeoJSONレイヤとして表示する予定です

# 点群データから3D Tilesの変換

点群データから3D Tilesへの変換にあたっては、以下のサイトを参考にさせて頂きました。

https://qiita.com/nokonoko_1203/items/a8d58c12c31faf55a7f5

https://zenn.dev/shi_works/articles/b01b67be8b4702

変換の際に実際に使用したコマンドなどは、以下の `data/pointcloud` ディレクトリ内の `README.md` にまとめています。

https://github.com/sanak/kyobashi-osaka-3d-sandbox/blob/main/data/pointcloud/README.md

# おわりに

以上、作成したデモアプリの概要について記載しました。

注意事項、備考に記載のとおり、まだまだ課題がたくさんありますが、冬休み+来年の宿題にしたいと思います。:sweat_smile: 

それでは、良いお年を！
c#で、なでしこ その19

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
AtCoderを解け。
整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。

# サンプルコード

```


「>」と入力。
それを指示1に代入。
「>」と入力。
それを指示2に代入。
「>」と入力。
それを指示3に代入。
aは指示1の整数変換
物は指示2を「 」で区切る
bは物[0]の整数変換
cは物[1]の整数変換
a = a + b + c
aを継続表示
「 」を継続表示
指示3を表示



```

# 実行結果

```
>cnako2 at0.nako

1

2 3

test
6 test

```

以上。
Javaで「JFrameクラスを継承したクラスを定義する」の動作を確認してみた

# 概要

Javaで「JFrameクラスを継承したクラスを定義する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jframe/index5.html

# 実装

以下のファイルを作成しました。

```Sample.java
import javax.swing.JFrame;

class Sample extends JFrame{
  public static void main(String args[]){
    Sample frame = new Sample("MyTitle");
    frame.setVisible(true);
  }

  Sample(String title){
    setTitle(title);
    setBounds(100, 100, 728, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
```

以下のコマンドを実行しました。

```
$ javac Sample.java 
$ java Sample 
```

# まとめ

何かの役に立てばと。
c#で、なでしこ その18

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
コマンドが足りないので、プラグインを追加した。

# 手順

## cnako2.csprojに追加

```
    <ProjectReference Include="..\NakoPluginSystem\NakoPluginSystem.csproj">
      <Project>{1F11520A-6979-4D07-9BA0-CBB378496E93}</Project>
      <Name>NakoPluginSystem</Name>
    </ProjectReference>

```

# 実行結果
利用中プラグイン列挙の表示

```
Libnako.NakoAPI.NakoBaseSystem
Libnako.NakoAPI.NakoPluginArray
Libnako.NakoAPI.NakoPluginString
NakoPluginFile.NakoPluginFile
NakoPluginFile.NakoPluginStream
NakoPluginSystem.NakoPluginCast
NakoPluginSystem.NakoPluginCheck
NakoPluginConsole.NakoPluginConsole
```

利用中関数列挙の表示

```
GetEnumerator
MoveNext
Current
Dispose
ナデシコバージョン
OSバージョン
OS
利用中プラグイン列挙
利用中関数列挙
関数ルビ取得
表示
継続表示
足す
足
足す!
足!
引く
引
引く!
引!
掛ける
掛
掛ける!
掛!
割る
割
割る!
割!
余り
余
割った余り
割余
乗
乱数
絶対値
ABS
等しい
等
大きい
大
小さい
小
以上
以下
BEEP
整数部分
小数部分
四捨五入
切り下げ
切下
代入
終わり
終
配列追加
配列ポップ
配列要素数
配列削除
配列結合
配列逆順
配列検索
配列ハッシュキー列挙
要素数
配列一括挿入
配列キー存在?
配列コピー
文字数
文字列検索
置換
単置換
文字左部分
トリム
文字右部分
切り取る
切取
文字抜き出す
文字抜出
全角か判定
全角判定
文字削除
文字右端削除
文字挿入
文字列分解
区切る
区切
数字か判定
数字判定
追加
英数半角変換
ゼロ埋め
ゼロ埋
半角変換
小文字変換
大文字変換
何文字目
出現回数
カナローマ字変換
かな変換
範囲切り取る
範囲切取
開く
開
読む
読
保存
毎行読む
毎行読
起動
起動待機
隠し起動
隠起動
隠し起動待機
隠起動待機
コマンド実行
存在?
フォルダ存在?
母艦パス
ランタイムパス
作業フォルダ取得
作業フォルダ変更
SYSTEMパス
テンポラリフォルダ
デスクトップ
SENDTOパス
スタートアップ
スタートメニュー
マイドキュメント
マイピクチャ
マイミュージック
ユーザーホームフォルダ
個人設定フォルダ
ファイルコピー
ファイル移動
ファイル削除
フォルダ作成
フォルダ削除
ファイル列挙
フォルダ列挙
全ファイル列挙
パス抽出
相対パス展開
ファイル名抽出
拡張子抽出
ファイルサイズ
追加保存
ファイル更新日時
ドライブ種類
ファイルストリーム開く
ファイルストリーム開
ファイルストリーム閉じる
ファイルストリーム閉
ファイルストリーム一行読む
ファイルストリーム一行読
ファイルストリーム一行書く
ファイルストリーム一行書
整数変換
文字列変換
実数変換
全角か判定
全角判定
数字か判定
数字判定
表示
継続表示
入力
標準入力取得

```

以上。
JAWS-UG 金沢 実施100回を超えて

JAWS-UG 金沢は #100 を迎えました。

以下を参照してください。
- https://jawsug-kanazawa.connpass.com
- https://jawsug-kanazawa.doorkeeper.jp
- https://jaws-ug-kanazawa.github.io/jaws-ug-hokuriku-line/

その中から私、加藤が思い出深いものを少しピックアップして感想を話ししたいと思います。

# ありがとう AWS Expert Online

　いきなり特定の回ではないのですが、結局、地方で人が集まりそうなイベントといえば「初心者向け」「使ってみた系ワークショップ」ばっかりになり、ちょっと詳しくなってくると、地方から首都圏に転職してしまい、なかなかレベルの高い話をする機会が地方は難しいよねー。

　みたいな話をしていたところ「それではExpert Onlineというのをやろう。これで地方でもレベルの高い話をきく会を開催してはどうか」というのを沼口さんからお話いただき、今では定期的に開催いただけてます。

 　これ、感染症騒動の前からの話です。

　これ本当にすばらしくて、これのおかげでJAWS-UG金沢は続いているといっても過言ではありません。

　地方支部で「ネタに困ってる」という支部は是非活用してください。

 参加するには、JAWS-UGの各支部運営コアメンバー向けのslackに案内があるので、定期的に確認してみてください。

 # JAWS-UG 北陸新幹線

 [特設サイト](https://jaws-ug-kanazawa.github.io/jaws-ug-hokuriku-line/) があります。

https://jaws-ug-kanazawa.github.io/jaws-ug-hokuriku-line/


 前から「やるやる」と言ってたイベントで、2024年3月16日北陸新幹線の福井県の敦賀(つるが)延伸を記念して第1回が行われました。そこからリレー形式で沿線を回って実施しています。

　とにかく、地方同士でつながる＆ネタを提供するということで、北陸新幹線沿いにエンパワーするぞ！という目的でやってます。
　そうして地方支部を増やすことで、festaにて金沢に投票してもらう支部を増やすんだ、、、というのが裏目標なんですが、それによって JAWS-UG 富山が起動したりして、一定の成果が出せてよかったです。

　この調子で福井も再始動してもらいたいなー。あと新幹線沿いということで、次は[上越妙高で実施](https://jaws-ug-kanazawa.github.io/jaws-ug-hokuriku-line/event/niigata.html)します。もうちょっとしたらもろもろ募集しますのでぜひご参加ください！
 
 https://jaws-ug-kanazawa.github.io/jaws-ug-hokuriku-line/event/niigata.html
 
 次は、長野、群馬かな！

 # JAWS-UG金沢 x AWS Startup Community プレゼンツ『北陸でStartupをはじめよう・みつけよう』

https://jawsug-kanazawa.doorkeeper.jp/events/159890

 これは AWS Startup Community とのコラボ企画だったんですが、結構がんばって[石川県産業創出機構](https://www.isico.or.jp)さまや[独立行政法人 中小企業基盤整備機構](https://www.smrj.go.jp)さまの協力をこぎつけて、なんと石川県副知事(当時) 西垣淳子さまにも登壇いただいたり、AWSさまからもたくさん登壇していただいたりととても充実した内容となりました。

　この調子でいくぞーーーという感じだったんですが、ここから1ヶ月もしないうちに能登の震災が発生していろいろと今はそれどころじゃないみたいな形になってしまっています。

 　しかしながら、その地震は一週まわって能登復興はいろんなスタートアップのチカラが必要で、社会実験（実験といったら失礼かもしれないが）の場としては最前線になるのではないでしょうか。

  また絶対にやりたいと思います。（そういうところで公共系イベントもやるぞ）

# AWS Community Day Kanazawa

 2019年には[AWS Community Day Kanazawa](https://awscommunityday2019.jaws-ug.jp) を開催しました。

https://awscommunityday2019.jaws-ug.jp

 感染症騒動前だったのですが、これも100人以上の参加いただき、上記北陸新幹線イベントやスタートアップイベントの礎となったと思います。

# JAWS-UG金沢支部×コンテナ支部合同企画 物理コンテナ見ながらコンテナ勉強会！

コンテナ(物理)をみながらコンテナを勉強するというのはどうか？

という話ではじまったイベントですが、専門支部と地方支部のコラボがテーマです。つまるところ expert online のオンサイト版といったところ。

https://jawsug-kanazawa.connpass.com/event/325803/

30人近くも人が集まってくれて、コンテナのディープな話＆金沢の観光と食を楽しんでいただけてとってもよかったです。

この調子でまた専門支部とコラボを狙っていきます。


 # まとめとfesta会場立候補するのでよろしく

 上記イベントもあって、JAWS-UG金沢はドアキでメンバー 646人、connpassで 98人も登録者がいらっしゃいます。ありがとうございます。

 ドアキの最初のイベントはこのあたりのようです。

 - 2015-09-05 JAWS-UG re:Mote 2015 金沢会場
 - 2016-04-09 JAWS-UG金沢 第9回勉強会

なかなか歴史ある感じになってきました。これからは、加藤個人としては今後はリモートワーカー勢が増えてきたりなんだりしてきた今、「地方支部同士の交流イベントを企画して地方の横の連帯を深める」「専門支部との交流イベントを企画して技術の深さという意味で縦の連帯を深める」といったテーマで進めていきたいと考えています。

とりあえず、2025年のfesta会場に金沢は立候補するのでよろしくお願いします！
[読書感想文] 解像度を上げる

# はじめに
上司にオススメしていただいた [解像度を上げる](https://amzn.asia/d/2zTIVlv) を読みました。
結構なボリュームなので、まだ全部は読めていないです。

解像度を上げるとはどういうことなのか？の説明と、行動法が書かれています。

読んで、印象に残ったことをアウトプットして、文章を書く練習をしたいと思います。
また実際に読んでほしいので、BOOK☆WALKERで試し読みできる範囲にしています。

# 何が学べるのか？
表紙に学べることがまとめてあります。
**曖昧な思考を明確にする「深さ・広さ・構造・時間」の4視点と行動法** です。

この4つの視点がないと、曖昧な文章になってしまうということです。
で、知識だけでなく、どう行動することで解像度を上げることができるのかが書かれています。

## 解像度とはなにか？

解像度とは、画像の粗さや精細さを示す言葉です。
これがビジネスでも用いられるようになって、「解像度を高い」「解像度が低い」「解像度が足りない」といった表現が使われるようになりました。
文脈的には、**物事への理解度や、物事を表現するときの繊細さ、思考の明晰さ** を画像の解像度にたとえて用いられるようです。

### 基本的には、「深さ」が足りない

目次にありますが、4つの視点の中でも「深さ」が足りていないことが多いようです。
深さが足りていないと、物事の本質まで理解できていない可能性があり、他の3視点を進めても、根本的な解決にはならないことがおおいようです。

![kotowaza_gorimuchu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/129d8788-ba4e-9440-9899-1a1d01edc59e.png)

なので、まずは深さを鍛えることが大事だと思いました。

### 何をしたらいいのか？

深さを鍛えるためには、**「『Why（なぜ）』と『How（どのように）』を用いて問う」** が大事です。
やり方については、著者のインタビューのコラムをがあったので、そちらを参考にしていただけると幸いです。

https://studyhacker.net/takaaki-umada-interview01

https://studyhacker.net/takaaki-umada-interview03

書籍にも書いてあるのですが、５〜７の深堀りを目安にするといいそうです。

# さいごに

まだ解像度を上げる行動を始めたばかりなのです。
まずは、なぜなぜと問い続けて、深堀りしていって、深さを鍛えようと思います。
Next.js での Biome 設定メモ

## Biome では `Error` 定義がエラーになる

[error.js (Next.js)](https://nextjs.org/docs/app/api-reference/file-conventions/error) の記載の通りに実装すると、`Error` 定義が Biome でエラー表示されます。

![biome_jsonc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128300/4c6fffa7-3755-b9d0-b0f7-36c618c3930b.png)

ESLint にも同じルールが存在し、[Next.js は ESLint を利用して開発](https://github.com/vercel/next.js/blob/c422755/.eslintrc.json#L306)されています。  
問題になっていないのは、ESLint の定義が甘いための様です。

_refs:_

- [ESLint](https://github.com/eslint/eslint/blob/90c1db9/lib/rules/no-shadow-restricted-names.js#L45)
- [Biome](https://github.com/biomejs/biome/blob/383a66a/crates/biome_js_analyze/src/lint/suspicious/no_shadow_restricted_names.rs#L59)
    - [ES_BUILTIN の定義](https://github.com/biomejs/biome/blob/383a66a/crates/biome_js_analyze/src/globals/javascript/language.rs#L4-L15)

**解決策の候補**

1. Biome の設定を調整
1. `ErrorPage` に変更

### 1. Biome の設定を変更

指定としては Biome の方がベターな印象なので、特定ファイルに絞って対象ルールを解除します。

```js:biome.jsonc
{
    ...

	"overrides": [
		{
			"include": ["app/**/error.tsx"],
			"linter": {
				"rules": { "suspicious": { "noShadowRestrictedNames": "off" } }
			}
		}
	]
}
```

以下に突貫の解決策としてコメントされていましたので参考までに。

- 指定の参照元：[Discord コメント](https://discord.com/channels/1132231889290285117/1236002589678637128/1236012534125822034)

### 2. `ErrorPage` に変更

手っ取り早さを求めるでしたら簡単に、  
`Error` を `ErrorPage` に変更するだけで解消できます。  


## 考察

主観ではなるべくドキュメントに沿った実装を心がけたいため、Biome の調整がお勧めでしょうか🧐  
将来的に Next.js やドキュメントでも `Error` を、使用しない方向にハンドリングされる可能性は有りますが。

Biome は ESLint に比べてパッケージの管理が楽なので、積極的に採用したい所です。
【コンピューティング】RAMの仕組みを再現する①

こんにちは、インフラエンジニアです。

最近低レイヤー系技術の動画をよく眺めているのですが、先日以下のような動画をYouTubeで見つけました。
『コンピュータメモリー（RAM）の仕組み』
https://www.youtube.com/watch?v=SSjeGjhwBo0
※興味のある方は見てみて下さい。

この動画での解説の通り、RAMの入出力はNAND演算を用いた論理回路であるNANDゲートによって、電気的な信号を解釈し、データのbitを定義しています。
つまり、この処理が物理と論理の境界になります。

動画の中ではNANDゲートの入出力がかなり分かりやすく図解されています。

そこでふと、自身でビットを入力するような形でRAMのNANDゲートを体感できるようなものができたら面白そうだと思ったので、C言語で再現してみようと思います。

とりあえず今回はNAND演算する処理を作るとこまで。

#### 関数

定義した関数は以下の通り

##### 入力したbitを受け取る関数
入力したbitを受け取る+入力値に誤りがないかのチェック

```c
int get_bit(const char* prompt)
{
	int bit;

	while (1)
	{
		printf("%s: ", prompt);


		if (scanf_s("%d", &bit) != 1)
		{


			if (getchar() == '\n')
			{
				printf("ERROR\n");
			}
			else
			{
				while (getchar() != '\n');

			}

			continue;
		}

		if (bit == 0 || bit == 1)
		{
			return bit;
		}

		else
		{
			printf("ERROR\n");
			while (getchar() != '\n');

		}
	}
}
```



##### NAND演算を行う関数

条件処理でNAND演算を行う

```c
int get_NAND(int a, int b)
{
	if (a == 0 && b == 0)
	{
		return 1;
	}

	if (a == 1 && b == 0)
	{
		return 1;
	}

	if (a == 0 && b == 1)
	{
		return 1;
	}

	if (a == 1 && b == 1)
	{
		return 0;
	}

	else
	{
		printf("ERROR");
		return -1;
	}
}
```


※本当は↓のように書けるかなと思ったけど、何故かうまくいかなかった。

```
int get_NAND(int a, int b)
{
    return !(a && b); //こちらの方が簡潔
}
```
#### コード全様

先述のユーザー定義関数の戻り値を使って、NAND演算の結果を出力してくれます。
```c
#include<stdio.h>

int get_bit(const char* prompt)
{
	int bit;

	while (1)
	{
		printf("%s: ", prompt);


		if (scanf_s("%d", &bit) != 1)
		{


			if (getchar() == '\n')
			{
				printf("ERROR\n");
			}
			else
			{
				while (getchar() != '\n');

			}

			continue;
		}

		if (bit == 0 || bit == 1)
		{
			return bit;
		}

		else
		{
			printf("ERROR\n");
			while (getchar() != '\n');

		}
	}
}

int get_NAND(int a, int b)
{
	if (a == 0 && b == 0)
	{
		return 1;
	}

	if (a == 1 && b == 0)
	{
		return 1;
	}

	if (a == 0 && b == 1)
	{
		return 1;
	}

	if (a == 1 && b == 1)
	{
		return 0;
	}

	else
	{
		printf("ERROR");
		return -1;
	}
}
int main()
{
	int bit_00 = get_bit("ビットを入力 bit_00");
	int bit_01 = get_bit("ビットを入力 bit_01");
		printf("bit_00 = %d \n", bit_00);
		printf("bit_01 = %d \n", bit_01);

		int NAND_00 = get_NAND(bit_00, bit_01);
		printf("NAND(%d, %d) = %d\n", bit_00, bit_01, NAND_00);
		return 0;
}
```

#### 動作確認

正常に動けばこんな感じ
![スクリーンショット 2025-01-11 093559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953197/38d28ddc-7d03-a065-7d9b-04d33733a6fb.png)


入力値が正しくないとき
![スクリーンショット 2025-01-11 093717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953197/30d4b33b-5df9-dfec-9dc0-0d3bdbc83d4b.png)


今回は入力値に対して1ビット分のNAND演算の結果を出力するところまでコード化しました。
次回はこれらの処理を組み合わせて、RAMのNANDゲートで行われている処理を再現したいと思います。