OmniAICreator/Qiita-1.07M huggingface dataset:
Xilinx Platform Cableを通してFPGAボードがVivadoから認識できない時の対処法

## 詰まったところ
Driverインストールのため、Installation guideよりドライバーのファイルをダウンロード。
シェルスクリプト実行中にエラーが発生。
https://docs.amd.com/v/u/en-US/ds593

## 解決作

Vivadoのインストールフォルダに移動
以下のシェルスクリプトを実行

``` shell
hoge@foo:/tools/Xilinx/Vivado/2024.1/data/xicom/cable_drivers/lin64/install_script/install_drivers
sudo ./install_drivers
sudo ./setup_pcusb
```

これでドライバーのインストールができ、Vivadoからauto connectでFPGAと接続できるようになる。

## 参考
https://docs.amd.com/v/u/en-US/ds593
https://docs.amd.com/v/u/en-US/ug344
https://support.xilinx.com/s/question/0D52E00006sB6ClSAK/error-extracting-linux-driver-for-xilinx-platform-cable-usbdlc9g?language=en_US
https://askubuntu.com/questions/838260/install-xilinx-platform-usb-in-ubuntu-16-04-x64
AWS基本

# AWSを学ぶ

## 基礎知識

リージョン：AWSの各サービスが提供されている地域
地域によってサービスが違う
最新はアメリカ
日本に設置をお勧め。国内だから応答速い

 アベイラビリティゾーン：独立したデータセンター
 世界各国にある複数のデータセンターを束ねたもの
 リージョンのなかにアベイラビリティゾーン

 VPC（Virtual Private Cloud）:AWS上に仮想ネットワークを作成できるサービス
 リージョンを選択して作成

 サブネット：ネットワークの区切り
 アベイラビリティゾーンのなかにサブネットを作成する
AWS Transit Gatewayメモ

AWS Transit Gatewayは、AWSクラウド内でのネットワーク接続を効率的に管理するためのサービスです。このサービスを使用することで、複数のVPC（Virtual Private Cloud）やオンプレミスネットワークをシンプルに接続し、スケーラブルなネットワークアーキテクチャを構築できます。

### 主な機能と特徴

1. **中央集約型の接続**:
   - 複数のVPCやVPN接続を1つのTransit Gatewayを介して統合し、接続を一元管理します。

2. **スケーラビリティ**:
   - トラフィックの増加に応じて、スケーラブルな接続を提供し、ネットワークの拡張が容易です。

3. **ルーティング管理**:
   - 各VPCやオンプレミスネットワーク間のルーティングを集中管理でき、トラフィックの流れを効率的に制御します。

4. **セキュリティ**:
   - AWSのセキュリティ機能を活用し、トラフィックの保護やアクセス制御が可能です。

5. **コスト効率**:
   - 直接VPC間で接続する場合に比べ、接続コストを削減し、運用の効率化を図ります。

### 利用シナリオ

- **多くのVPCを持つ企業**: 企業が複数のVPCを運用する際に、簡単に接続を管理し、セキュアな環境を保ちます。
- **ハイブリッド環境**: オンプレミスとAWSのリソースを効率的に接続し、データの移動を容易にします。
- **グローバルなネットワーク**: 複数の地域にまたがるVPCを接続することで、広範なネットワークアーキテクチャを構築します。

AWS Transit Gatewayを使用することで、複雑なネットワークを簡素化し、管理の負担を軽減することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/8aafe67b-2c39-ad46-65a7-9506984f52a4.png)
https://aws.amazon.com/jp/transit-gateway/
プログラマー畑から見たPower Automate for Desktop基礎

# はじめに
IT未経験者に PAD (Power Automate for Desktop)を教えるにあたって、システム開発と同じノリでやったら引っかかった点をまとめてみました。

# ノーコード開発とRPAは違う
ほぼここに集約されます。Power AutomateはあくまでもRPAです。システム開発ではなく、システムの自動化です。条件分岐でやら繰り返し処理やらが最小限出てきて、ちょいちょいプログラミング言語の気配を出してきますので勘違いしないようにしましょう。
できる限りPowerAutomateでは、"順番にシステムを起動させる" & "最小限操作でのデータ移動"だけにしましょう。

# 変数の宣言がない
設定はあっても宣言はないです。変数の設定はただの代入です。
宣言しなくてもいきなり使えます。宣言の為に1アクション使うのは無駄です。

# 変数の型が変幻自在
数値型にテキスト型を入れたらそれ以降テキスト型になります。テキストを数値に変換してもとの変数に戻せます。気持ち悪いですけど、型の維持より意味の維持に注力して、変数の絶対数を減らした方がフローはわかりやすいと思います。

# グローバル変数しかない
スコープ範囲という概念がないので、フロー内なら、メインサブ含めてどこからでも変数にアクセスできます。COBOL等で地獄を見た経験者も多いのではないのでしょうか。
一つのフローで色んなことをさせると読み取るのが地獄です。
複雑なことをやる場合、スクリプトの実行も組み込めるのでPythonやJavaScriptでやりましょう。

# フロー間のインスタンスの受け渡しができない
グローバル変数しかないので、フローをまたぐと完全に別のシステムです。クラスではありません。オブジェクト指向のノリで、フローを簡潔にしたいがためにブラウザでのログイン処理を別のフローでやらせると、取り扱うブラウザのインスタンスを渡せません。メインフローに入れたくなければサブフローでやりましょう。
複雑なデータはJSONで渡しましょう。

# 一見型を自動変換してくれているような挙動をする
条件式で、数字(ただしテキスト型)同士でも大小比較してくれます。

同じ文字数なら。

文字数が違うと文字数での比較になります。
ここ罠です。実際には、数値型に自動変換⇒大小比較ではなく、ただの文字数順⇒文字コード順です。
変換してるわけではありません。

# CASEが等値判定だけではない
Switchはただの左辺固定if else ifです。大小判定もできます。

# 和訳をあきらめてるところがちょいちょいある
エンジニアにとっては常識は一般の人にとっては非常識です。オペランドって多分ぱっと聞いてわからんよね。

# JavaScriptがちょっと古い
2024年9/20時点だとletが使えません。ちなみにPAD側の変数への出力はWScript.Echo()を使います。Pythonはprint()でいけます。

# 結論
APIが超簡単に使えるのは便利です。画像から文字をOCRでとってきてAIで校正してExcel等へ放り込むフローくらいなら5分あれば非エンジニアであってもゼロから作れます。便利！
[Kotlin]Hardcoded String ~~ should @use Stringについて考える[初心者]

<h2>はじめに</h2>
こんにちは、mAgmAです。

今回はAndroid Studioで黄色エラー表示である「Hardcoded string ~~, should @use resource」について考えていこうと思います。

<h2>どんなエラー？</h2>

今回のエラーは以下の通りです。
```ruby:qiita.rb
Hardcoded string "時間を入力してください。例)45", should use `@string` resource
Hardcoded string "運動時間", should use `@string` resource
Hardcoded string "休憩時間", should use `@string` resource
Hardcoded string "時間を入力してください", should use `@string` resource
Hardcoded string "スタート", should use `@string` resource
```
上記を見てみると、全て日本語を入力していることが分かります。
2バイトにしていることが原因かもしれません。

<h2>解決法</h2>

このエラーの意味は、
　「プログラム上に直接入力しているから、変数を使おう」
 ということを言っています。

 具体的に言うと、
 このエラーには
 <ol>
 <li>Hardcoded</li>
 <li>@string</li>
 </ol>
 これら２つのキーワードがあります。

 <h3>Hardcoded</h3>
 これは、「直接書いているモノ」です。「マジックコード」とも呼ばれます。<br>
 上記で言うと、["時間を入力してください。例)45"]です。

 これが何故エラーと出るかというと、
 とても長いプログラムを書いたときにこれが何を表しているか分からなくなるからです。

 なにか特定のモノを書きたいときは、変数に入れようということらしいです。


 <h3>@string</h3>
これは、「@stringにある変数を使おう」ということです。<br>
 私もこのエラーが出て調べるまで知らなかったのですが、Android Studioには変数を格納しておくファイルがあったんですよね。<br>
 
 それが、string.xmlです！
 場所はこちらです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655335/3d60ffd9-347e-b75b-7eaa-566333ab6f5e.png">

ここに使いたい文言を変数として格納しておくことで、他のファイルでこのファイルにある変数を使用することができます。
ちなみに、使用方法は
```kotlin:activity_main.xml
android:text="@string/{name属性}"
```
です！

これでエラーの解決が出来ました！

<h2>まとめ</h2>

今回は、黄色のエラー「Hardcoded String ~~ should @use String」について考えました。
実際のプログラム実行には直接関係のないエラーですが、コードを変更するときに混乱しないようにしっかりと変数の定義をしていきましょう！

では！
AWS Control Towerメモ

AWS Control Towerは、AWS Organizationsを基盤に、複数のAWSアカウントのセットアップと管理を簡素化するためのサービスです。特に、セキュリティとコンプライアンスを考慮しつつ、組織のガバナンスを強化するための機能が提供されています。

### 主な機能と特徴：

1. **アカウントのセットアップ**:
   - 新しいAWSアカウントを自動的に作成し、組織のポリシーや標準に基づいて構成します。

2. **ガバナンスの自動化**:
   - ベストプラクティスに基づいたガバナンスモデルを適用し、ポリシーや設定を自動的に管理します。これにより、セキュリティやコンプライアンスを維持しやすくなります。

3. **Blueprints**:
   - 組織のニーズに応じてカスタマイズ可能な「ブループリント」が用意されており、アカウントの設計や設定を迅速に実行できます。

4. **ガバナンスダッシュボード**:
   - 組織全体のガバナンス状態を視覚的に表示するダッシュボードが提供され、リアルタイムでの監視や管理が可能です。

5. **セキュリティサービスとの統合**:
   - AWS Security HubやAWS Configなど、他のAWSセキュリティサービスと統合されており、全体のセキュリティ体制を強化します。

### 利点：

- **効率化**: アカウント管理やポリシー適用のプロセスを自動化し、運用コストを削減します。
- **ベストプラクティスの適用**: AWSの推奨するガバナンスとセキュリティのベストプラクティスを簡単に適用できます。
- **可視化**: 組織全体のガバナンスやコンプライアンスの状況を把握しやすく、リスクの早期発見が可能です。

AWS Control Towerは、特に大規模な組織や複数のチームがAWSを利用する場合に、管理とガバナンスの複雑さを軽減するために非常に有効なツールです。
PurchasesHybridCommon/CommonFunctionality.swift:21: Fatal error: Purchases has not been configured. Please configure the SDK before calling this methodについて解決してみた。

今回は以下のようなエラーに対処してみました。

flutterでのrestoreができなかったんです。
しかし、色々と検索してみたら初期化する前にrestoreを呼び出していたことが原因だったということでした。


```
PurchasesHybridCommon/CommonFunctionality.swift:21: 
Fatal error: Purchases has not been configured. 
Please configure the SDK before calling this method
```

これはflutterにおいてはmain関数で事前に初期化しておくことが必須なのです

```
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:purchases_flutter/purchases_flutter.dart';

void main() async {
  // Flutterのバインディングを初期化
  WidgetsFlutterBinding.ensureInitialized();

  // Firebaseの初期化
  await Firebase.initializeApp();

  // RevenueCatの初期化
  await Purchases.setLogLevel(LogLevel.debug);
  await Purchases.configure(PurchasesConfiguration("api_key"));

  // アプリの起動
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      home: HomeScreen(),
    );
  }
}

```
AWS Organizationsメモ

AWS Organizationsは、複数のAWSアカウントを一元的に管理できるサービスです。主に以下のような機能や利点があります：

1. **アカウント管理**: 複数のAWSアカウントを組織としてまとめ、階層的に管理できます。これにより、アカウントの作成や削除、設定の変更が容易になります。

2. **ポリシーの適用**: サービスコントロールポリシー（SCP）を使用して、組織内のアカウントに対してアクセス権限を制御できます。これにより、セキュリティやコンプライアンスの要件を満たすことができます。

3. **コスト管理**: 組織全体のコストを集約して管理し、アカウントごとの請求を把握しやすくします。また、コストを最適化するためのレポート作成も可能です。

4. **簡易的な請求管理**: 複数のアカウントの請求を一元化することで、管理の手間を軽減します。

5. **部門別管理**: 組織内の部門ごとにアカウントを分け、それぞれの部門に特化したリソース管理を行えます。

AWS Organizationsを利用することで、大規模なインフラストラクチャを効率的に管理し、運用の最適化やセキュリティの強化を図ることができます。


## 親アカウント、OU、SCP、子アカウント関係

```
AWS Organizations
└── 親アカウント (マスターアカウント)
    ├── OU (組織単位)
    │   ├── 子アカウント 1
    │   ├── 子アカウント 2
    │   └── 子アカウント 3
    └── OU (別の組織単位)
        ├── 子アカウント 4
        └── 子アカウント 5
```

### 用語説明：
- **親アカウント (マスターアカウント)**: AWS Organizationsを作成したアカウント。組織全体の管理権限を持つ。
- **OU (組織単位)**: アカウントをグループ化するための単位。部門やプロジェクトごとに分けることができる。
- **子アカウント**: 各OUに属するアカウント。具体的なリソースやサービスを利用するための個別のアカウント。
- **SCP (サービスコントロールポリシー)**: 組織内のアカウントやOUに対して適用できるポリシー。アクセス権限を制御するために使用される。
オブジェクト「コンテンツドキュメントリンク」が削除された際Apexトリガーが呼び出されないという事象



+ [オブジェクト「コンテンツドキュメントリンク」が削除された際Apexトリガーが呼び出されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ercDc)

:::note
リファレンスを見ると削除トリガーはあるみたいです。

ただし、気になるのは太字の部分です。連続の削除では機能しないのかもしれません。
１件だけ削除したらトリガーされるか確かめてみてはどうでしょうか？

ContentDocumentLink オブジェクトでは、挿入、更新、削除操作の前後のトリガーがサポートされます。ContentDocumentLink トリガーは、ContentDocumentLink に追加や削除があるたびに実行されます。ファイルが削除されると、ContentDocument の削除トリガーが実行されますが、カスケードされた ContentDocumentLink の削除では ContentDocumentLink トリガーは実行されません。

https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_contentdocumentlink.htm
:::


確認したところ、１件だけ削除の場合はトリガーされる可能性があります。

現在この事象が発生しているのは、ナレッジの記事に添付したファイルを削除する際です。

添付いたしました画像のように削除の方法が2種類あり、「レコードから削除」の場合は、削除トリガーが機能します。しかし「削除」となると機能しません。

組織にファイルをアップロードし、ナレッジ記事に添付すると、コンテンツドキュメントリンクレコードは２件作成されるようです（LinkedEntityIdがファイルをアップロードしたユーザーId版とファイルが添付されているナレッジのId版）。

「レコードから削除」の際は、LinkedEntityIdがナレッジのIdであるレコードのみが削除されますが、「削除」の場合はコンテンツドキュメントリンクレコードが２件とも削除されていました。

”カスケードされた ContentDocumentLink の削除”が、「1回の操作（今回は「削除」を選択する）で2件のコンテンツドキュメントリンクが削除される」と同義ならば、削除トリガーは機能しない仕様だということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4d78ab82-3106-febb-8622-f486ce7d50a0.png)
CRP環境（Conference Room Pilot）メモ

CRP環境（Conference Room Pilot）は、特にERP（Enterprise Resource Planning）システムの導入において、導入前のテストやトライアル環境として利用されることが多いです。この環境では、企業の業務プロセスに基づいてERPシステムの機能やカスタマイズ内容を検証します。CRPの目的は、システムが現実の業務要件に適合しているかを確認することで、システムの最終的な導入に備えることです。

CRP環境の主な特徴は以下の通りです：
1. **業務プロセスのシミュレーション**: 企業が実際に行うプロセスを模擬し、システムがそれに対応できるかを確認します。
2. **カスタマイズの確認**: 業務に必要なカスタマイズがシステム内で正しく機能しているかを検証します。
3. **ユーザー評価**: 実際のユーザーがシステムを使用して、操作性や機能性を評価します。
4. **問題点の特定**: 導入前にシステムの不具合や業務要件とのギャップを発見し、修正対応を行います。

CRP環境での成功は、最終的なシステム導入のスムーズさに大きく影響します。
Amazon Cognitoでパスワードの再利用を防ぐ方法

## はじめに

「クラウドセキュリティ」って言葉はよく聞くけど、実際にはどんなものかよくわからない…そんな超初心者さんも安心してください！この記事では、AWSのサービスの一つである**Amazon Cognito**を使って、**パスワードの再利用を防ぎ、アカウントを安全に守る方法**を分かりやすく解説します。

### なぜパスワードの再利用は危険なの？

同じパスワードを複数のサービスで使っていると、一つのサービスでパスワードが漏洩した場合、他のサービスも危険にさらされてしまいます。例えば、オンラインショッピングサイトのパスワードが漏洩すると、あなたのクレジットカード情報などが盗まれてしまう可能性があります。

### Amazon Cognitoでパスワードの再利用を防ぐ

Amazon Cognitoは、ユーザー認証を簡単に行うことができるAWSのサービスです。このサービスには、パスワードの再利用を防ぐ機能も備わっています。この機能を有効にすると、ユーザーは過去に設定したパスワードを再利用できなくなります。

**具体的な設定方法**

1. **Amazon Cognito ユーザープールにアクセスします。**
2. **「高度なセキュリティ」機能を有効にします。**
3. **「サインイン エクスペリエンス」タブの「パスワード ポリシー」設定で「以前のパスワードの使用を防止する」オプションを有効にします。**

これで、ユーザーは過去に設定したパスワードを再利用できなくなります。

### Amazon Cognitoのパスワード再利用防止機能のメリット

* **アカウントの乗っ取りを防ぐ**
* **情報漏洩のリスクを軽減する**
* **ユーザーのセキュリティ意識を高める**

### まとめ

Amazon Cognitoのパスワード再利用防止機能は、ユーザーのアカウントを守るために非常に有効な機能です。まだ設定していない方は、ぜひ設定して、あなたのアカウントをより安全にしましょう！

**この記事が、Amazon Cognitoとパスワードの再利用防止機能について理解する手助けになれば幸いです。**

### 関係資料
[Amazon Cognito Password Reuse Prevention | Amazon Web Services](https://youtu.be/UMERoBgORV4?si=DuHOhkED2SCctEhv)
WPF RitchTextBoxで特定の単語に色をつけたい

RitchTextBoxをよくわかっていなくて無駄に時間を食ってしまったので書き留めておきます

```c#
private void EmphasizePlaceholder(string targetWord)
{
    // 最初のパラグラフを取得
    var current = MessageField.Document.ContentStart;

    // パラグラフ？に分かれて収まっているのでパラグラフ毎に処理する
    while(current != null)
    {
    	// テキスト以外はスルー
        if(current.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) 
        {

            var text = current.GetTextInRun(LogicalDirection.Forward);
    
            // 今回は1単語毎？にパラグラフに分かれるから1つだけということで
            // 全角のワードとかだったら複数あることを想定したほうが良い
            var index = text.IndexOf(targetWord);
    
            if(index != -1)
            {
                var start = current.GetPositionAtOffset(index);
                var end = current.GetPositionAtOffset(index + targetWord.Length);
    
                // 色を変更する範囲を指定
                var range = new TextRange(start, end);
    
                // 色を変更
                range.ApplyPropertyValue(TextElement.ForegroundProperty, placeholderColor);
    
            }
        }

        // 次のパラグラフに
        current = current.GetNextContextPosition(LogicalDirection.Forward);
    }

}
```

※入力中随時反映したいとき`TextChanged`に書いてしまうと`ApplyPropertyValue`でテキストが変更された扱いになり無駄に何度も再帰的に呼び出すことになるからKeyUpとかの方が良さそう。

色付部分の後で日本語入力すると例外が発生してしまうので暫定的にEnterしたときのみ色付け。
ちゃんと調べたい…。
```c#
private void MessageField_KeyUp(object sender, KeyEventArgs e)
{
    if(e.Key == Key.Return)
    {
        EmphasizePlaceholder();
    }
}
```
【注意】NumPy 2.0 におけるスカラーとの演算について

## 詳しくは

https://numpy.org/doc/stable/numpy_2_0_migration_guide.html#changes-to-numpy-data-type-promotion

こちらに書いてある通りです。スカラー演算した際の出力の型が変更されたので(ex. `numpy.float32`->`numpy.float64`)、出力の型が重要になるソースコードがある場合は注意してください。  

## 変更内容

version 1.26.4の場合

```python
import numpy as np

a = np.float32(3.0) * 3.
print(a.dtype)  # float64

b = np.array([3.0], dtype=np.float32) * np.float64(3)
print(b.dtype)  # float32
```

version 2.0.0の場合

```python
import numpy as np

a = np.float32(3.0) * 3.
print(a.dtype)  # float32

b = np.array([3.0], dtype=np.float32) * np.float64(3)
print(b.dtype)  # float64
```

演算する際はより精度の高いものに合わせる。float型はnp.float32と同等とみなす。
直観的になるよう修正されました。
[AWS]WAFとS3で気になるアップデートまとめ（2024.8月末〜9月末）

## ■概要

インフラエンジニア的な観点で直近気になったアプデについて所感です。
具体的には、WAFとS3でアプデ来ていたのでまとめてざっくり書いてみようかと思います。

## ■WAFのアップデート

まずWAFですが２つ来ていました。

https://aws.amazon.com/about-aws/whats-new/2024/09/aws-waf-bot-control-managed-group-rule-bot-detection-capabilities/

→ AWS WAF ボットコントロールマネージドルールグループがボット検出機能を拡張（直訳）

https://aws.amazon.com/about-aws/whats-new/2024/08/aws-waf-rate-based-rules-lower-rate-limits/

→ AWS WAF はレートベースのルールを強化し、より低いレート制限をサポートします（直訳）



## ■それぞれ詳細を書いてみます。

:::note info
#### ・AWS WAF ボットコントロールマネージドルールグループがボット検出機能を拡張
:::

Bot Control マネージドルールグループが機能強化され、新バージョンが導入されたようです。
主な更新内容は以下の通りになります。

	•	トークン再利用の検出: ASN や地理的場所をまたいだ WAF トークンの再利用を検出。感度レベルを調整可能で、ユースケースに応じた制御が可能です。
	•	ボットカテゴリの拡張: 新たに19個のボットが追加され、AI ボットなどの管理が強化。
	•	クラウドサービスプロバイダーラベル: 特定のクラウドサービスプロバイダーからのトラフィックを選択的に許可またはブロック可能に。
	•	自動化ブラウザラベル: Selenium IDEなど、Web自動化を支援するブラウザ拡張機能の検出に対応。
	•	CloudWatch の可視性向上: WAF ラベルが発行され、ログの可視性が改善。

AIボットを含む新たなボットカテゴリの追加、特定のクラウドプロバイダーや自動化ツールに対する新しい制御ラベルが導入されています。
また、CloudWatchの可視性向上により、運用者がボット活動をより詳細に追跡できるようになっています。

AWSのマネージドルールにもなり、設定されている方は多いかなと思います。
ここで書いている最新バージョンを使用するには手動でバージョンアップしてあげる必要がありますのでお気をつけください。

:::note info
#### ・AWS WAF はレートベースのルールを強化し、より低いレート制限をサポートします
:::

こちらはよりシンプルですね。
設定可能な最低レートが「100 → 10」に変更になったとのことです。
アプリケーションやAPIに対する急激なトラフィックの増加や、悪意のあるアクティビティに対してより迅速かつ細かく対応することが可能になります。
ただ細かくし過ぎるのも事故の原因になります。適用後の経過観察は必須と思われます。


## ■S3

次にS3ですが、こちらも２つピックアップしました。



Amazon S3 はいくつかの HTTP エラーコードに対して課金しなくなりました（直訳）

https://aws.amazon.com/about-aws/whats-new/2024/08/amazon-s3-no-charges-several-http-error-codes/

ウェブ アプリケーション向けの Amazon S3 用ストレージ ブラウザの発表 (アルファ リリース)

https://aws.amazon.com/about-aws/whats-new/2024/09/storage-browser-amazon-s3-alpha-release/

:::note info
#### ・Amazon S3 はいくつかの HTTP エラーコードに対して課金しなくなりました
:::

こちらは発表当初から話題に上がっていたので今更感もありますが…
内容としては、バケット所有者が行なっていない不正なリクエストに対する課金を停止しましたという事です。
具体的には、AWSアカウントや組織外部からのリクエストで、HTTP 403 (アクセス拒否) エラー応答を返す場合、そのリクエストや帯域幅に対する料金が請求されなくなります。
特にユーザー側での変更は不要で、既に全てのS3バケットに自動的に適用されているようです。

:::note info
#### ・ウェブ アプリケーション向けの Amazon S3 用ストレージ ブラウザの発表 (アルファ リリース)
:::

これは今後に期待が出来そうな機能だなと感じたものです！

ウェブアプリケーションに組み込むことで、エンドユーザーに対し、S3に保存されたデータへの簡単なインターフェースを提供するオープンソースコンポーネントという事になります。
S3はそもそもAWSコンソールでブラウザ操作できますが、カスタマイズできる形のブラウザを用意する事も可能なようです。

こちらについては以下の記事が分かりやすかったので、UI含め詳細はこちら確認するのが分かりやすいと思います。

[開発プレビュー版] ストレージバケットの操作インターフェースを提供できる Amplify UI コンポーネント「Storage Browser for S3」がアナウンスされたので使ってみた

https://dev.classmethod.jp/articles/storage-browser-amazon-s3-alpha/

開発中のプレビューになるという事なので、今後の正式版にもとても期待できそうですね。


## ■終わりに

かなりざっくりですが、今回２つのサービスの4項目についてふれてみました！
A5:SQL Mk-2でPostgresを操作する

# 環境
Win１０
Postgres

# 初めてのデータベース設計
業務でデータベースを設計することになった。

データベース設計ってどうすれば良いんだろう。
テーブルの定義とかテーブル同士の関連とか書くんだろうな。
Excelのシートにテーブルのテーブル名と項目とかひたすら書いてくのかな？

と思ってたら上司から「A5SQLを使いなさい。」との声が。

# A5:SQL Mk-2とは
ローカル上でデータベースを操作するのに便利なソフト。
MySQL、Postgres等様々なDBへSQLが実行できる。
データベースの環境は自分でローカルに用意しておく必要がある。

# 今回はPostgresを用意
Postgresの環境構築は下記の記事を参考にした。

https://qiita.com/yorokobi_kannsya/items/f77d074e382a88dae971

A5:SQL Mk-2のダウンロードはこちら

https://a5m2.mmatsubara.com/

# A5:SQL Mk-2で何ができるか
A5SQLはMSS（マイクロソフトのDB管理ソフト）のような他のRDBMSと同じく、
直感的にDBを管理できるGUIツールです。

テーブル定義を作る時は直感的な操作でカラムを追加していきます。
テーブル定義からDDLを作成することも可能。

DMLも自動で作成してくれます。（SELECT、INSERT、UPDATE、DELETEなど）

他にも自分で書いたSQL実行はもちろん、
テーブル定義からER図も自動で作成してくれます。

# Postgresに接続する
にDBの情報を登録するだけです。

# テーブル定義を作成していく
新規でテーブル定義を作成してデータ型、桁数、NOT NULL制約などを決めていきます。
必要なカラムは画面設計書から取ってきたり
それぞれの機能の基本設計書を読みながら決定していきます。

# 外部キーを設定して関連を付けていく
テーブル同士で関連が必要なところは
テーブル同士で関連するカラムを外部キーとして設定します。
（主キー、外部キーは必ずNOT NULL制約が付くので自分で設定する必要はありません。）

# ER図を自動作成して確認
プロジェクトではER図も成果物として提出するので
A5SQLにサクっと作ってもらいます。
テーブルの配置などは自分で修正する必要はあります。
負債返済日に負債を返済できない私

今日は「プロジェクトの負債返済日」だった。溜まっていた技術的な問題ややり残しを一気に片付ける日…だったはず。

朝から、「今日はこれをやって、あれを片付けて、負債を返済するぞ！」と自分に言い聞かせて、意気揚々と取り掛かったが、まったく進まなかった。やるべきことはわかってるのに、手が止まるし、思った以上に問題が深い。結局、何も終わらないまま時間が過ぎていった。途中で何度か周りの人に相談して、いろいろ試してみたけど、どれも上手くいかず…。

一日の終わりに、チームメンバーに「どんな負債を返済したか」を報告する時間があった。もうその時には内心ドキドキ…。結局返済はできず、「ごめんなさい、今日は何もできませんでした」って正直に伝えるしかなかった。自分の無力さを痛感した一日だった。
AbortController  APIについて

### これは備忘録
こちらは私のアウトプット用の備忘録ですので、内容が正確なものである保証はできません！

### AbortController APIとは
主にfetch処理を中断したりする際に使用するWebAPIのことらしいです。
例えば、ユーザーが検索条件を変更する度にデータを取得するfetchが実行されているというのは非効率なため、fetchが実行されて完了する前に次のfetchが飛んできた場合、前回のfetchを中断することができるらしい。

### そもそもWebAPIってなんでしょうか
まずAPIとはApplication Programming Interfaceの頭文字をとったもの。APIとは、アプリケーションやプログラムなどをつなぐ接点（インターフェース）のことを指すらしい。
APIを活用することによって、外部からその機能やデータを利用できたりするのでより効率的に開発を進めることができたりするらしい。また、APIを提供する側にとっては、より広く自分たちの情報を提供や、多くのサービス利用につながるので有益らしいです。なるほど。

### 話を戻してAbortControllerはどうやって使うの？
詳しいことはMDN WEB DOCSを参照した方が良いかもしれません。
実装例です。途中まで自分で書いてみたのですが、合っているか確認したくなりChatGPTになげて確認しました。
```javascript sample.js
let isFetching = false; // フラグ
let abortController;
const url = "https://jsonplaceholder.typicode.com/todos/";

const fetchData = async () => {
    // リクエスト中のフラグを立てる
    isFetching = true;

    // AbortControllerを新しく作成
    abortController = new AbortController();
    const signal = abortController.signal;

    try {
        const response = await fetch(url, { signal });
        if (!response.ok) return; // アーリーリターン
        
        const data = await response.json();
        console.log(data);
    } catch (error) {
        console.error(error);
    } finally {
        isFetching = false; // フラグを下げる
    }
}

document.getElementById("button").addEventListener("click", () => {
    if (isFetching) {
        abortController.abort(); // リクエストをキャンセル
    }
    fetchData(); // 新たにデータを取得
});

```
flagをたてることでfetchが完了している処理にまでabortを実行することになり、特に何も起きないようですが無駄な処理になってしまうのでflagで分岐している感じです。

ちなみに毎回abortControllerをインスタンス化しているのは、一度中断を実行してしまうと再利用が不可能なようなので新たにインスタンス化を行う必要があるようです。

signalの中身はboolean型になるみたいです。abortが実行されるとsignalで紐づけたfetchの処理のみが中断され、中断されると、try-catchのcatchにAbortErrorというものが吐き出されるようです。
AWSでBasic認証をかけるには？CloudFront編　～AWS100本ノック～ 7/100

# はじめに

[前回の記事](https://qiita.com/namasa/items/4f8234dc65ee5d6ab2e3)では、AWS WAFによるBasic認証を行いました。
今回は、CloudFront + S3バケットで構成されるフロントエンドに対して、CloudFront FunctionsによってBasic認証を行いたいと思います。

その前に、CloudFront Functionsってなんだろう？:thinking:って話なんですが、`ユーザに近い場所で任意の関数(コード)を実行できる機能`って感じです。

※CloudFrontとS3バケットは既に作成済みの前提で話を進めます :bow: 

:::note
CloudFrontにBasic認証をかける方法としては、他にも以下があります。
- Lambda@Edge(CloudFront + Lambda)
- AWS WAF

Lambda@EdgeとCloudFront Functionsの違いは、[こちらの記事](https://dev.classmethod.jp/articles/amazon-cloudfront-functions-release/)がわかりやすいと思います
:::

# アクセスしてみる(Basic認証設定前)

まず、Basic認証設定前にアクセスすると、まだ何も制限してないため`Hello`と表示するだけの画面が表示されます

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/f8bdab59-4565-d83a-d182-539f1d216366.png)

# Basic認証の設定

## 関数の作成
では、CloudFront Functionsを作っていきます
左メニューの`関数`から`関数を作成`をクリックします
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/e6c6a439-054f-115a-a7bd-14959be35949.png)

- `名前`は任意の関数名にします。今回は`basic-authentication`とでもしておきます
- `Runtime`に今回は`cloudfront-js-2.0`を選択します
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/4ada6db0-9fe9-050f-fe07-41ec4c2b903e.png)

## 関数コードの実装

Basic認証用に以下のコードを記載し、`変更を保存`をクリックします。
処理としては
- ユーザ名がhoge、パスワードがhugaのBasic認証をかける
- 一致しない場合は、401エラーを返す
になります

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/aed33ff6-c04b-cb89-c381-ffa1907d2845.png)

```js
function handler(event) {
  var request = event.request;
  var headers = request.headers;

  // echo -n hoge:huga | base64
  var authString = 'Basic aG9nZTpodWdh';

  if (typeof headers.authorization === 'undefined' || headers.authorization.value !== authString) {
    return {
      statusCode: 401,
      statusDescription: 'Unauthorized',
      headers: { 'www-authenticate': { value: 'Basic' } },
    };
  }

  return request;
}

```


保存しただけだと実際にデプロイされていないので、`関数を発行`をクリックします。
※これをしなかったため、保存したのに反映されない、って最初はなりました...
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/ecbafec2-d4e5-d02e-1cc1-9d85abb2566d.png)

## CloudFrontに紐づけ

関数は作りましたが、まだCloudFrontディストリビューションに紐づいていないので、`関連付けを追加`をクリックします
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/f7ec256e-1592-1412-ebc2-27e4f8fcb24c.png)

- `ディストリビューション`に関連付けるCloudFrontを設定します
- `イベントタイプ`に`Viewer request`を選択します
- `キャッシュビヘイビア`に`Default(*)`を選択します
- `関連付けを追加`をクリックして、完了です:smile:

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/e786a7c8-095b-401f-c0a2-af6121a86f05.png)


# アクセスしてみる(Basic認証設定後)

さぁ、Basic認証がちゃんとかかったかアクセスしてみましょう。
ちゃんとBasic認証のダイアログが出ましたね :smile: 
間違った情報を入力すると、401エラーが返ってくることも確認出来ました

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/0cb1cda9-addc-71fe-cbd0-a59440506c7b.png)


# おわりに
今回はCloudFrontを使ってBasic認証を行う方法について紹介しました。
フロントエンドの構成がCloudFront + S3の場合は、この方法でBasic認証を行うのが良さそうですね :smile:
これまで読んだ中で自分を形作っている書籍を紹介する

### 初めに
情報処理分野に携わって長い時間が経過しており、何度も転職し、使う言語、業界も都度変わっています。
そんななかでも確実に血肉となって自分を形作っていると感じる書籍を3つ紹介します。
どれも新しい書籍ではないけれど、IT業界を生きる上でとても基本的なことを教えてくれる名著だと思っています。

## コンピュータの構成と設計 上・下

![51PeFnJW3+L._SY445_SX342_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796185/bd566bfc-a87e-9b31-a445-4a298a2e5b9f.jpeg)


言わずと知れた古典的名著。
初めて読んだのは2版だったか、4版も読み返しました。現在6版が出版されており、クラウドなどについても言及があるようです。
それまでも漠然とプログラミングを学んでいたのですが、コンピュータの基本を丁寧に解説していてとても感銘を受けた記憶があります。
プログラミングの上でだけではなく、自作PCを作るうえでの定石等、なんとなく知っていた薄い知識を補強する基盤となってくれました。
ある程度ITやハードウェアを知っている人にとっては知識と知識をつなげてくれる書籍であり、初心者にとっては盤石な知識の基盤となってくれるだろうと思います。


## マスタリングTCP/IP―入門編―

![41fQf8MI9AL._SY445_SX342_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796185/0c4a64fb-5b4a-bba0-0ff7-ac11b5ea9b7f.jpeg)

これも言わずと知れた名著。今は6版が最新。
先ほどの「コンピュータの構成と設計」が「どうやってPCは動いているのか？」であるなら、こちらの書籍は「どうやってインターネットは動いているのか？」を教えてくれる書籍です。
初めて読んだ時には「ふーん、こんなものか」という感想を抱いたのを覚えています。
実際にネットワークの設計をしたり、ネットワークのトラブルシューティングをしたり、ふとした拍子に基本的な知識として役に立っていることを実感するようなそんな書籍です。
初版の発売から長い時間がたっていますが、章立ても大幅な変更がなく、基本的なインターネットの仕組みは今もほぼ変わっていないということがよくわかります。これからITにかかわる人が読んでも、基本を支えてくれることは間違ないと思います。オススメ

## リーン・スタートアップ

![71rGjMt8CeL._SY466_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796185/70f93dea-abc2-c2f8-3efa-f5c1a387a22a.jpeg)

今や時代遅れといわれているかもしれないリーン・スタートアップです。
ウォーターフォールによる開発、システム導入、バージョンアップは年度単位で顧客予算に合わせてスコープを決定する。SIerとしてそんなシステムの提供の仕方しか知らなかった自分には十分衝撃的なものでした。ベンチャーに転身する際、必要に駆られて読んだ本ですが、全く違う世界を自分に開いてくれました。
不確実なものから価値を生み出すという点においては、今主流のアジャイル開発と共通点があると思っています。今となっては、積極的にお勧めできる書籍ではありません。しかし、ウォーターフォール・リーン・アジャイルとそれぞれいいところがあり、プロダクトやプロジェクトによって柔軟に使い分けることができれば、一つの強みになると気づけたのはとても価値があると思っています。

## 最後に
何か基礎的なことを学びたいなと漠然と思っているIT従事者にとって、「コンピュータの構成と設計」「マスタリングTCP/IP―入門編―」の2冊は間違いなくお勧めできる書籍だと思っています。（もう耳にタコができるほどお勧めされている書籍だとは思いますが。）

技術書だけでなく、ビジネス書、小説、育児書どんなものであっても自分の世界が広がる書籍に出会えることは幸せなことだと思います。実際に経験しようと思ったらとてつもない時間とお金がかかるところを、書籍はそれを手短に教えてくれます。
あなたを形作っている書籍はありますか？
Safariの新機能「気をそらす項目を非表示」の仕組みを調べた

「気をそらす項目を非表示」機能はiOS18などで新しく追加された、webページ上の広告など非表示にするための機能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140146/52937bba-1adf-f164-6a9b-43625e112ed4.png" width="250">

# 使い方
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">Safariの新機能、スゲェなｗ これはいかつい。<br>「気をそらす項目を非表示」<a href="https://twitter.com/hashtag/iOS18?src=hash&amp;ref_src=twsrc%5Etfw">#iOS18</a> <a href="https://t.co/7SUwIgnWmJ">pic.twitter.com/7SUwIgnWmJ</a></p>&mdash; ひで (@hidetoshitwitt) <a href="https://twitter.com/hidetoshitwitt/status/1835857869713141894?ref_src=twsrc%5Etfw">September 17, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
※選択を間違えた場合等は、アドレスバーに青い目がでている状態でメニューを開き「非表示の項目を表示」を選択すれば設定をクリアできます。

# どうやって実現している？
macOS SequoiaのSafariで見てみました。
`user-style`内に、非表示にした要素のセレクタが`display: none !important;`として追加されるようになっているようです。

![s1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140146/b253d337-017a-3323-178c-0f8d35063e95.png)

user-styleはユーザーやブラウザによって指定されたスタイルで、その中で`!important`を使って記載されたスタイルはサイト内のスタイルcssで上書きすることはできません。
`!important`などを付けて詳細度を上げても上書きできないので、***一致するセレクタを登録された場合、表示することは不可能***です。
また同オリジン(サイト)で使い回されるようなので他のページにも影響があります。

# どのようなセレクタが使われる？

次のようなwebページを作り、それぞれの項目を非表示にした時に作成されるセレクタを見てみました。
※黒字が要素の内容、赤字が非表示要素に選んだ時に生成されたセレクタです。
[1]の多くの要素を含むもの？や[6]などのリストは選択できませんでした。

![s2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140146/424d6eb1-4f01-d063-6660-c2817b514fee.png)

## なんとなく分かったセレクタの規則性
- idが最優先で、idがあるものはidのみとなる
- クラス名があればすべて使われる
- div以外のタグならばタグ名は使用される
- 特徴のない要素は他の特徴のある要素からの相対位置で指定される

これで少し問題がありそうなのは、[2]の`HEADER`となっているセレクタでしょうか。後でもし他の所にheader要素を追加した場合、その要素も非表示になってしまいます。最低限の特徴しか無い要素のセレクタが追加されると、巻き添えに他の要素も非表示になっていまう場合があるかもしれません。
そのあたりは問題ないように対策されているかもしれませんが少し気になりました。

# 不安定な挙動な気がした
- リロードしたり、ページをまたいだ時に、非表示になったり、ならなかったりした
- user-style内のセレクタ項目が勝手に減っていた


# 非表示にされたくない場合
```js
let time = Date.now();
let count = 0;
document.querySelectorAll('*').forEach(function(el){
	el.classList.add('time'+time+'-'+count++);
});
```
簡易的な回避策を考えてみました。上記の様なjsを実行し、全ての要素に`time83877748-6`のような連番のクラス名を付与するようにしてみる。
連番が入っているのですべての要素に違うクラス名が付与されます。
また、これは現在時刻を含んでいるのでページの読み込み毎にクラス名は変わります。
#### 結果
実際にjsを実行したページで「気をそらす項目」として選択した所
```css
#test1 { display: none !important; }
#test2 { display: none !important; }
DIV.box.time1726750302438-22 { display: none !important; }
UL.box.list.time1726750302438-16 { display: none !important; }
```
このように一時的なクラス名が追加された。しかしidを持つ要素には追加されなかった。
リロードした所、id以外の要素は隠される事なく表示されました。

***下記のような問題もあるので通常使うつもりはありませんが挙動は少し理解できました***
・パフォーマンスが良くない
・idのある要素には使えない
・これを利用する前に、すでに「気をそらす項目」に登録されている場合に効果がない
・（このコードでは）実行後に追加された要素には対応してない

# 最後に
この様な機能をAppleが標準機能として搭載してきた影響は大きいかなと思います。
使用に手間もかからず気軽に使えるので、HTMLやセレクタをよく理解していない人が消して、他の場所の必要な要素も消えるケースが有るのか、またこの機能が多く使用されるのか気になりますね。


# 紹介
Xの人気ポストまとめが見られるサイトや

https://service.webgoto.net/iitwi/

Youtubeのお気に入りチャンネルをまとめて見られるサイトを作っています。

https://service.webgoto.net/channely/
AWSのCLFのOUTPUT

# 問題:アプリケーションへのトラフィックレベルは週を通して変化するが、アプリケーションの信頼性を常に向上させる方法とは？
## 復旧手順をテストする
普及手順をテストすることは、障害発生時の影響を最小限に抑えるための重要なプラクティス
### 具体的には？
障害が発生した際にアプリケーションがどのようにふるまい、どのように修復すべきかを事前に理解することが可能となる。
## ソフトウェアの障害を自動的に処理する
アプリケーションの信頼性を向上させることができる
### 具体的には？
ソフトウェアの障害を自動的に処理するシステムを導入すると、アプリケーションのダウンタイムを最小限に抑えることができる。
例えば、AWS Auto Scaling、AWS Elastic Load Balancerのようなサービスを利用すると、トラフィックの変動に応じて自動的にリソースを調整し、また負荷が高くなった時にはトラフィックを分散することができる。
Mindのオープンソース互換OpenMindを作った


https://github.com/KajizukaTaichi/openmind/

# なんで？
本家Mindにちょっと不満があったからです。

- オープンソースではない 
- 環境構築が大変

それでも、Mindは素晴らしい日本語プログラミング言語です。
無いならオープンソース版を自分で作ってやろう！と思い、開発しました。

# 開発

開発しているうちに、「こうした方が簡単なんじゃないか」とかアイデアが出て、独自仕様になっちゃいました。
なので完全な互換性はありませんが、ちょっとした手直しで動くと思います。

# 仕様

処理系はRust製インタプリタです。アーキテクチャは本家Mind同様スタックベースです。

日本語処理に正規表現を使っているので、ちょっと遅いかもしれません。識別子や命令は全て漢字です。アルファベットや仮名文字などは区切り文字として扱われます。

ブロックに値するのは鉤括弧`「」`で区切られた文字列で、それを制御構造の命令に引数として渡しています。また、`定義`命令を使ってユーザが命令を定義して再利用性を高めることもできます。

# サンプルコード
お馴染みのFizzBuzzです。

```openmind:sample.om
「
    もし３でわった余りが０と等しいなら「「Fizz」」にする
    そうでなければ「無」にする条件分岐する。
」
このコードを附図として定義する。

「
    もし５でわった余りが０と等しいなら「「Buzz」」にする
    そうでなければ「無」にする条件分岐する。
」
このコードを芭図として定義する。

「
    うけとったデータを「値」に代入する。
    値で附図して値で芭図して結合して「結果」に代入する。
    もし結果が無しと等しかったら「値」に、
    そうでなければ「其れ」にする条件分岐する。
」
このコードを判定として定義する。

０を数に代入し、無を出力に代入する。

「数が百より小さい」あいだ
「
    数と１を足したのを「数」に代入する。
    出力と其れを判定したのを結合して、
        さらに改行と結合して「出力」に代入する。
」
を反復して、出力を表示する。
```

出典：https://github.com/KajizukaTaichi/openmind/blob/main/sample.om

# 最後に

本家Mindの開発者である @killy 様
きっかけを与えて頂きありがとうございました！
Go言語のSNMPパッケージgosnmpのサンプルプログラムを試す方法

# はじめに

SNMPに関連したプログラムは、ほとんどの場合NET-SNMPを利用して開発していると思います。C言語の他に、PerlやPyhtonからも利用できますが、Go言語からは簡単に利用できません。

そこで、今回はピュアGoで書かれたSNMPクライアントライブラリgosnmp

https://github.com/gosnmp/gosnmp

を紹介します。基本のサンプルプログラムを試す方法の説明です。

# 準備


```shell
mkdir snnmp_get
cd snmp_get
go mod init snmp_get
go get github.com/gosnmp/gosnmp
```

で準備完了


#  サンプルログラム

GitHubのサイトにあるサンプルプログラムは、

```go

package main

import (
	"fmt"
	"log"

	g "github.com/gosnmp/gosnmp"
)

func main() {
	// Default is a pointer to a GoSNMP struct that contains sensible defaults
	// eg port 161, community public, etc
	g.Default.Target = "192.168.1.210"
    // g.Default.Community = "public"
	// g.Default.Port = 161
	err := g.Default.Connect()
	if err != nil {
		log.Fatalf("Connect() err: %v", err)
	}
	defer g.Default.Conn.Close()

	oids := []string{"1.3.6.1.2.1.1.4.0", "1.3.6.1.2.1.1.7.0"}
	result, err2 := g.Default.Get(oids) // Get() accepts up to g.MAX_OIDS
	if err2 != nil {
		log.Fatalf("Get() err: %v", err2)
	}

	for i, variable := range result.Variables {
		fmt.Printf("%d: oid: %s ", i, variable.Name)

		// the Value of each variable returned by Get() implements
		// interface{}. You could do a type switch...
		switch variable.Type {
		case g.OctetString:
			bytes := variable.Value.([]byte)
			fmt.Printf("string: %s\n", string(bytes))
		default:
			// ... or often you're just interested in numeric values.
			// ToBigInt() will return the Value as a BigInt, for plugging
			// into your calculations.
			fmt.Printf("number: %d\n", g.ToBigInt(variable.Value))
		}
	}
}
```

です。

### SNMPエージェントのアドレス

```go
g.Default.Target = "192.168.1.210"
```
の部分です。ご自身の環境に合わせて変更してください。

### Communityとポート番号

デフォルトは、"public"と161です。

```go
    // g.Default.Community = "public"
	// g.Default.Port = 161

```
のコメントを外して、ご自身の環境の合わせて変更してください。

### 取得するMIBのOID

取得するMIBは、文字列のOIDで指定します。
```go
oids := []string{"1.3.6.1.2.1.1.4.0", "1.3.6.1.2.1.1.7.0"}
```

### 結果の表示
エラーがなければ、
result.Variablesに結果のスライスが入っています。
MIBのOIDは、variable.Nameに文字列型で入っています。
取得した値は、variable.Valueですが、interface{}型なので、variable.Typeで種類を判断して、値を変換して表示します。



# 実行結果

サンプルプログラムを実行すると

```
$go run main.go
0: oid: .1.3.6.1.2.1.1.4.0 string: twsnmp@gmail.com
1: oid: .1.3.6.1.2.1.1.7.0 number: 72
```

のように表示されます。メールアドレスなどの値は対象のSNMPエージェント毎に違います。


# 余談

このgosnmpパッケージを使って、TWSNMPの後継ソフト

https://note.com/twsnmp/n/na5c62f59833d

を開発しています。このパッケージは実用に耐えるものだと思います。
C#で文字列が数値かどうか判断する

# 概要
文字列が数値かどうかを判断するメソッド

実はchar[]をchar[]のまま数値かどうかを判断する必要が生まれたため作成した。
そのため文字列の数値チェックは副産物

## コード

```NumericCheck.cs
    public static bool IsNumeric(string value)
    {
        if (string.IsNullOrWhiteSpace(value)) return false;

        return IsNumeric(value.ToCharArray());
    }
    public static bool IsNumeric(char[] chars)
    {
        char c;
        int idx = 0;

        // 先頭が符号の場合は飛ばす
        c = chars[idx];
        if (c == '+' || c == '-') // *1修正
        {
            if (chars.Length == 1) return false;
            idx++;
        }

        // １文字目の数字チェック
        c = chars[idx]; idx++;
        if (IsDecimal(c) == false) return false;

        // ２文字目以降の数字チェック
        while (idx < chars.Length)
        {
            c = chars[idx]; idx++;
            // 小数点がある場合はループを抜ける
            if (c == '.') break;
            if (IsDecimal(c) == false) return false;
        }
        // 小数点以降の数字チェック（小数点がない場合は通らない）
        while (idx < chars.Length)
        {
            c = chars[idx]; idx++;
            if (IsDecimal(c) == false) return false;
        }

        return true;
    }

    public static bool IsDecimal(char c)
    {
        if (c < '0' || '9' < c) return false; 
        return true;
    }
```
<details><summary>*1　2024/09/22修正</summary>

```diff_c_sharp
        c = chars[idx];
-        if (c == '+' || c == '-') idx++;
+        if (c == '+' || c == '-') 
+        {
+            if (chars.Length == 1) return false;
+            idx++;
+        }
```
</details>

## 応用
少し応用すれば、整数かどうかをチェックするコードが作れる。
```NumericCheck.cs
    public static bool IsDecimal(string value)
    {
        if (string.IsNullOrWhiteSpace(value)) return false;

        return IsDecimal(value.ToCharArray());
    }
    public static bool IsDecimal(char[] chars)
    {
        char c;
        int idx = 0;

        c = chars[idx];
        if (c == '+' || c == '-') idx++;

        c = chars[idx]; idx++;
        if (IsDecimal(c) == false) return false;

        while (idx < chars.Length)
        {
            c = chars[idx]; idx++;
            // 小数点がある場合はループを抜ける
            if (c == '.') break;
            if (IsDecimal(c) == false) return false;
        }
        // 小数点以降の数字チェック（小数点がない場合は通らない）
        while (idx < chars.Length)
        {
            c = chars[idx]; idx++;
            // 小数点以下に0以外があったら抜ける
            if (c != '0') return false;
        }

        return true;
    }
```
Ollamaを使ったLlama3.1、Llama3.1の使用感(GPU：RTX 3060程度)

## はじめに

本記事では、Ollamaを使用してLlama3.1モデルを実行し、RTX 3060程度のGPUでの使用感を紹介します。

## インストール方法（Linux環境）

Ollamaは以下のコマンドで簡単にインストールできます：

```bash
curl -fsSL https://ollama.com/install.sh | sh
```

詳細は[OllamaのGitHub](https://github.com/ollama/ollama)をご覧ください。

## 基本的な使用方法

インストール後、以下のコマンドでモデルを実行します：

```bash
ollama run モデル名
```

初回実行時、モデルが自動的にダウンロードされます。

## 利用可能なモデルとサイズ比較

1. llama3.1 8b: 4.8GB
2. llama3.1:8b-instruct-fp16: 16GB

## トラブルシューティング

エラー(Could not connect to ollama app, is it runnning?)が発生した場合は、以下の手順を試してください：
![モデルサイズ比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694964/49131ac8-dfa6-d1ef-b2a3-e9987fd857ec.png)
1. 新しいターミナルで`ollama serve`を実行
2. 別のタブでモデル実行コマンドを入力

## パフォーマンス比較（RTX 3060使用時）

- llama3.1 8b: 即時応答
- llama3.1:8b-instruct-fp16: 応答開始まで約10秒

RTX 3060クラスのGPUでは、処理速度の観点からllama3.1 8bの使用がいいと思います。

## 高速なInstructモデルを使いたい場合

```bash
ollama run llama3.1:8b-instruct-q3_K_S
```

このモデルは3.7GBで、即時応答が可能でした。

## まとめ

- RTX 3060程度のGPUでは、llama3.1 8bが適切でした。
- Instructモデルが必要な場合は、量子化版（q3_K_S）の使用をおすすめします。
個人的なツールの作成にPythonをよく使う2つの理由(+不満1つ)

自分は個人的に使うツールを作成する際にPythonをよく使います。
用途としては日常的な作業の自動化や、遊びで作成するアプリケーションなどです。

主に、数日で完成させた後はあまり更新しないような小さなプロジェクトを想定しています。
しっかり作り込んで公開するようなサービスはまた考え方が違ってきますが、小さいツールの作成に自分がPythonをよく使う理由を2つ挙げてみます。

## 理由1. 何でもできる

Pythonはなにかやりたいと思ったときに、そのためのライブラリがすでに存在していることが多いです。
以下に、個人で使ったことのあるPythonのライブラリの例を挙げてみます。

**自然言語処理**
- 以前Twitterボットを作成した際に、形態素解析エンジンであるMeCabを利用しました。
- 他にもGensimを使ってトピック分析を試したこともあります。
- Pythonで使える自然言語処理系のライブラリは多く存在します。

**機械学習**
- 機械学習系のライブラリはやはりPythonが最も充実しているのではないでしょうか。
- 自分は個人でディープラーニング系のモデルを学習させることはほぼ無いですが、scikit-learnやXGBoostでモデルを作って使うことがあります。

**画像処理**
- 個人的な写真の管理でスクリプトを書くことがあります。
- PIL(Python Imaging Library)やPillow等を使ってExif情報を取得したり、画像をリサイズしたりします。

**スクレイピング**
- 定期的に特定サイトの情報をチェックするツールを作成することもあります。
- 素朴にRequestsを使ってもいいですし、Scrapyを使うとより簡単にスクレイピングができます。

**仮想通貨取引**
- 仮想通貨取引所のAPIを使いたいと思ったことがあります。
- ccxtという100以上の取引所のAPIを同じインターフェースで使えるライブラリのおかげで、やりたいことが実現できました。
- 各取引所のAPIの仕様を調べる必要がなく、統一的なインターフェースで取引ができるのは助かりました。

**Webアプリケーション**
- 上記のような機能をGUIから操作したいことがあります。
- その場合、自分はDjangoを使いWebアプリケーションとして動かすことが多いです。
- Djangoは管理画面がデフォルトで用意されている点が特に気に入っていて、設定の管理やデータの確認がしやすいです。

## 理由2. クラウドで安く動かせる

個人的なツールは利用頻度も少ないため、サーバーで動かすときもコストを抑えたいです。
Pythonは以前から無料で動かせるクラウドがあり、それも個人的なツール作成に選ぶ理由の一つでした。

**Google App Engine (GAE)**
- GAEはスタンダード環境であれば、無料枠があります。
- 2008年のリリース時からPythonをサポートしているため、以前から個人的なツールを動かすのによく使っていました。
- 管理画面からcronを設定して定期実行もできるのが地味に便利です。

**AWS Lambda**
- AWS Lambdaは2014年にリリースされていて、Pythonは2015年10月からサポートされています。
- こちらも無料枠があるため、最近ではこちらで動かすこともあります。
- Serverless Frameworkを使うと、ローカルでの開発からデプロイまでの体験が良いです。

(とはいえ用途に応じてEC2やHerokuで動かすこともあります)

## Pythonで開発する際の不満

Pythonを使っていて、いまいちだと感じるところもあります。
特に仮想環境とパッケージの管理手法が安定しないことです。
しばらく経ってから調べてみると新しい方法が出ていたり、古い方法が非推奨になっていたりします。
これまで以下のようなツールを触っていますが、それぞれの使い分けがよくわかっていないとだいぶ混乱します。
(現時点でのベストプラクティスはよくわかっていません)

- vertualenv
- venv
- pipenv
- pip-tools
- poetry

## まとめ

個人的なツールの作成にPythonをよく使う理由を2つと、ついでに不満点も1つ挙げてみました。
なにかの参考になれば幸いです。

最近以下のポッドキャストを聞いて、そういえば自分はなんでPython使うことが多いんだろうと考えたのが記事を書くきっかけでした。
- [#105 言語の世界を垣間見る！！ 〜Python編〜｜ひまじんプログラマーの週末エンジニアリングレッスン](https://podcasters.spotify.com/pod/show/6ns146spct/episodes/105--Python-e1sq67a)
(調査中)PowerMockito を  Eclipse に設定するための手順

## 手順 1: Eclipse のセットアップ
Eclipse IDE をインストール
Java 17 に対応している Eclipse IDE をインストールします。

Java SDK の設定
Window > Preferences > Java > Installed JREs から、対象のJavaの SDK を Eclipse に追加して選択します。

## 手順 2: プロジェクトの作成
Java プロジェクトを作成
File > New > Java Project を選択し、新しいプロジェクトを作成します。

JUnit と Mockito の依存関係を追加
PowerMockito は JUnit および Mockito を前提としています。JUnit5 または JUnit4 を使用できますが、互換性の観点から、JUnit4 の方がより多くの機能がサポートされているため推奨されます。

## 手順 3: Maven もしくは手動でライブラリの追加
1. Maven を使用する場合:
pom.xml に以下の依存関係を追加します。
```xml
<dependencies>
    <!-- JUnit 4 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

    <!-- Mockito -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>3.12.4</version>
        <scope>test</scope>
    </dependency>

    <!-- PowerMock for Mockito -->
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
</dependencies>
```
. Maven を使用しない場合:
必要な JAR ファイルを手動でダウンロードし、プロジェクトに追加します。必要な JAR ファイルは以下の通りです。

JUnit
Mockito Core
PowerMock API for Mockito
PowerMock JUnit モジュール
これらの JAR を libs フォルダに配置し、ビルドパスに追加します。

手順 4: PowerMockito の使用例
```java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticClass.class)
public class PowerMockSampleTest {

    @Test
    public void testStaticMethod() {
        // Static メソッドのモック
        PowerMockito.mockStatic(StaticClass.class);

        // モックの動作を定義
        Mockito.when(StaticClass.staticMethod()).thenReturn("Mocked Result");

        // テスト対象メソッドを呼び出し
        String result = StaticClass.staticMethod();

        // 結果を検証
        Mockito.verify(StaticClass.class);
        assertEquals("Mocked Result", result);
    }
}
```
##### 2024/11/25追記

実行でエラーになる。
原因調査中。mockito-inlineでテストコード書くことを推奨します

```java
try (MockedStatic mocked=mockStatic(StaticClass.class)) {
	  mocked.when(StaticClass::staticMethod).thenReturn("Mocked Resul");
	  assertEquals("Mocked Resul",StaticClass.staticMethod());
	  mocked.verify(StaticClass::staticMethod);
}
```
jestでNumber of calls: 0となり、関数が実行されない

# はじめに
jestでtestを行っている際に、関数が実行されず、テストが失敗しました。
解決まで、時間をとられたので解決策をまとめようと思います。

# 事象
新規登録ページを作成し、そのテストを行いました。
すると以下のエラーが発生しました。
```jsx
expect(jest.fn()).toHaveBeenCalledWith(...expected)

Expected: "山田太郎", "1"

Number of calls: 0
```
期待する引数と、受け取った引数があっていないというエラーです。

# 該当コード
コード一部抜粋
```react
<form onSubmit={handleSubmit(onSubmit)}>
  <FormControl mb={4} isInvalid={!!errors.description}>
    <FormLabel>名前 <span style={{ color: 'red' }}>*</span></FormLabel>
    <Textarea
      placeholder="山田太郎"
      {...register("name", {
        required: "必須項目です"
      })} />
    <FormErrorMessage>{errors.description?.message}</FormErrorMessage>
  </FormControl>
  <FormControl mb={4} isInvalid={!!errors.select}>
    <FormLabel>セレクトボックス <span style={{ color: 'red' }}>*</span></FormLabel>
      <Select
        placeholder='選択してください'
        {...register("select", {
          required: "必須項目です"
        })} >
        {selects?.map((select) => (
          <option key={select.id} value={select.id}>{select.name}</option>
        ))}
      </Select>
    <FormErrorMessage>{errors.select?.message}</FormErrorMessage>
  </FormControl>
  <Button isLoading={loading} type="submit" colorScheme='teal' data-testid="submit" mx={4} mb={4}>登録</Button>
</form>
```
このテストを実行しました。
`fireEvent.change`で値を入力、`fireEvent.click`でsubmitボタンをクリック。
```react
it("登録できること", async () => {
  render(
    <CardRegister />
  );

  fireEvent.change(screen.getByLabelText('名前', { exact: false }), { target: { value: '山田太郎' } });
  fireEvent.change(screen.getByLabelText('セレクトボックス', { exact: false }), { target: { value: '1' } });

  fireEvent.click(screen.getByTestId('submit'));

  await waitFor(() => {
    expect(addUser).toHaveBeenCalledWith(
      '山田太郎',
      '1',
    );
});
```

# 原因
原因は簡単で、入力がうまくできておらず、バリデーションエラーで引っかかっていました。
セレクトボックスをsupabaseというDBから、非同期でデータを取得しているのですが、データ取得前に`fireEvent.change`を入力してしまっていました。
`value: '1'`はその段階では存在しないので、選択されず、バリデーションエラーが発生しました。

<font color="red">フォーム項目を非同期で取得していることを失念していました、、</font>

# 解決策
セレクトボックスのフォームにdata-testidを追加
```react
<FormLabel>セレクトボックス <span style={{ color: 'red' }}>*</span></FormLabel>
  <Select
    placeholder='選択してください'
    data-testid="select" // 追加
    {...register("select", {
      required: "必須項目です"
    })} >
    {selects?.map((select) => (
      <option key={select.id} value={select.id}>{select.name}</option>
    ))}
  </Select>
<FormErrorMessage>{errors.select?.message}</FormErrorMessage>
```
入力を非同期に変更
`findByTestId`で非同期取得にして、awaitをつけてあげます。
```react
it("登録できること", async () => {
  render(
    <CardRegister />
  );

  fireEvent.change(screen.getByLabelText('名前', { exact: false }), { target: { value: '山田太郎' } });
      fireEvent.change(await screen.findByTestId('select'), { target: { value: "1" } });

  fireEvent.click(screen.getByTestId('submit'));

  await waitFor(() => {
    expect(addUser).toHaveBeenCalledWith(
      '山田太郎',
      '1',
    );
});
```

# まとめ
`toHaveBeenCalledWith`でエラーが起きたら、モックができていないか、非同期部分でバリデーションエラーにひっかかってないか疑うのが良いでしょう。
(調査中)PowerMockitoでJavaのJarFileのテストコード書く

PowerMockitoを使用すれば、JarFileのテストをMockitoよりも書きやすくできる場面があります。特に、静的メソッドのモック化やコンストラクタのモック化が必要な場合にPowerMockitoは便利です。JarFileのコンストラクタを直接モックすることができるため、JARファイルのインスタンス作成の部分もモック化して制御しやすくなります。

## PowerMockitoを使うとテストが楽になるケース
#### 1. JarFileのコンストラクタをモックしたい場合
通常のMockitoではクラスのコンストラクタをモックすることができませんが、PowerMockitoならコンストラクタのモックが可能です。

#### 2.JarFileの静的メソッドをモックしたい場合
PowerMockitoでは静的メソッドもモック可能なので、これにより、ファイルシステムに依存しないテストが書きやすくなります。

## PowerMockitoを使ったテスト例
次に、PowerMockitoを使ってJarFileのコンストラクタをモックし、openConnectionメソッドをテストする例を示します。

```java
import static org.mockito.Mockito.*;
import static org.powermock.api.mockito.PowerMockito.*;

import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.jar.JarFile;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit.jupiter.PowerMockExtension;

@ExtendWith(PowerMockExtension.class)
@PrepareForTest({ JarFile.class })
public class JarFileTest {

    @Test
    public void testOpenConnectionWithPowerMockito() throws Exception {
        // Step 1: JarFileのコンストラクタをモックする
        JarFile mockJarFile = mock(JarFile.class);
        // PowerMockitoでJarFileのコンストラクタをモック
        whenNew(JarFile.class).withAnyArguments().thenReturn(mockJarFile);
        
        // Step 2: JarURLConnectionをモックする
        JarURLConnection mockConnection = mock(JarURLConnection.class);
        when(mockConnection.getJarFile()).thenReturn(mockJarFile);

        // モックされたURLとURLコネクションの設定
        URL mockUrl = new URL("jar:file:/some-jar-file.jar!/");
        URLConnection connection = mockUrl.openConnection();
        when(mockUrl.openConnection()).thenReturn(mockConnection);

        // Step 3: テストロジック
        JarFile jarFile = ((JarURLConnection) connection).getJarFile();
        
        // アサーションや追加テストロジックをここに書く
    }
}
```

## PowerMockitoを使うメリット
#### 1. コンストラクタのモック化: 
直接new JarFile()でインスタンスを生成する部分をモック化できます。これにより、実際のファイルシステムを使わずにテストを実行でき、外部環境に依存しないテストが可能になります。

#### 2. 静的メソッドのモック: 
JarFileや他のクラスの静的メソッドもPowerMockitoを使えばモック化可能です。例えば、静的ファクトリーメソッドなどをモックする際に便利です。

## 制限やデメリット
#### ・テストの複雑化: 
PowerMockitoを使うと非常に強力ですが、モックの設定が複雑になることがあります。モック化できる範囲が広がる反面、コードの追跡が難しくなる場合があります。

#### ・実行速度: 
PowerMockitoは通常のMockitoよりもテストの実行速度が遅くなることがあるため、大規模なプロジェクトでは注意が必要です。

結論として、JarFileのようなクラスをテストする際に、コンストラクタや静的メソッドのモックが必要なら、PowerMockitoを使うことでテストが楽になりますが、必要ない場合は通常のMockitoでも十分です。テストの対象や複雑さに応じて使い分けるのが良いでしょう。
サーバーと同じドメインのメールアドレスへのメール送信に失敗する場合の対応

# 状況

Webサーバー`yukihirog.jp`に設置したPHPからsendmailを経由して`mail@yukihirog.jp`にメール送信すると失敗してしまう。

しかし、`mail@anotherdomain.com`など、**他のドメインのメールアドレスへのメール送信は成功**する。

そのため、**サーバーと同じドメインへのメール送信のみが失敗**していると考えられる。

また、`/var/log/maillog`に`User unknown`が記録されていた。

（以降、`yukihirog.jp`の部分は自分のドメインに読み替えてください）

# 原因

メール送信時、設置サーバーと同じドメインの場合は外部を経由せずに自サーバー内で解決されるらしい。

**実際のメールサーバーをGメールなどで運用している場合**、自サーバー内を探しても配信先が見つからずに失敗、あるいは見つかってもユーザーが利用しているアプリなどに**届かない**ことになる。

# postfixの場合


## インストール状況の確認

```shell:postfixが入っているかの確認
which postfix
# /usr/sbin/postfix などが出力される
```

```shell:postfixが起動しているかの確認
service postfix status
# 起動していれば情報がいろいろ表示される
# Active: active (running) などが書いてあれば起動中
```

## 対応

サーバーと同じドメインであっても外部を経由するように設定する。

```shell:postfixの設定を編集
sudo vi /etc/postfix/main.cf
```

`mydestination`の設定箇所を確認する。

```shell:before
mydestination = $myhostname, localhost.$mydomain, localhost
```

元の設定をコメントアウトし、空の指定を行う。
（必要に応じてlocalhostなどの設定をしても良い）

```shell:after
#mydestination = $myhostname, localhost.$mydomain, localhost
mydestination =
```

```shell:postfixを再起動
sudo service postfix restart
```

# sendmailの場合

## インストール状況の確認

```shell:sendmailが入っているかの確認
which sendmail
# /usr/sbin/sendmail などが出力される
```

```shell:sendmailが起動しているかの確認
service sendmail status
# 起動していれば情報がいろいろ表示される
# Active: active (running) などが書いてあれば起動中
```

## 対応

サーバーと同じドメインであっても外部を経由するように設定する。
以下のどちらの方法でも対応できた。

### 方法A：`local-host-names`にドメインを追記する

```shell:sendmailの設定を編集
sudo vi /etc/mail/local-host-names
```

```txt:local-host-namesにドメインを追記
# local-host-names - include all aliases for your machine here.
yukihirog.jp
```

```shell:sendmailを再起動
sudo service sendmail restart
```

### 方法B：`sendmail.mc`にドメインを追記する

```shell:sendmailの設定を編集
sudo vi /etc/mail/sendmail.mc
```

```txt:以下を追記して保存
define(`MAIL_HUB', `yukihirog.jp.')dnl
define(`LOCAL_RELAY', `yukihirog.jp.')dnl
```

```shell:sendmailを再起動
sudo service sendmail restart
```

# その他の対応方法

サーバーによってはログインして管理画面から設定できるところもあるようだが、自分のサーバーとドメインの契約は該当しなかったので確認できなかった。