OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】多重継承【プログラミング言語】


## Python多重継承

Pythonクラスは**多重継承**に対応しています。
多重継承とは、複数のクラスを組み合わせて新しいクラスを定義することができます。

Pythonでは数値や文字列といった組み込み型のを継承して、新しいクラスを作ることができます。
組み込み型の持つ豊富な機能をそのまま引き継いで、新しい機能を持つ独自のクラスを作ることができます。

### サンプルプログラム

```python

# Description: 多重継承
class math(object):
    """足し算クラス
    :param object: objectクラス
    """
    def __init__( self , val1 =1 , val2 = 1):
        """初期化
        :param val1: 数値1
        :param val2: 数値2
        """
        self.val1 = val1
        self.val2 = val2
        print( "足し算  val1:" + str(self.val1) + "val2:" + str(self.val2) )

    def calc( self ):
        """計算
        :return: 足し算結果
        """
        return self.val1 + self.val2

class sub(object):
    """引き算クラス
    :param object: objectクラス
    """
    def __init__( self , val1 =1 , val2 = 1):
        """初期化
        :param val1: 数値1
        :param val2: 数値2
        """
        self.val1 = val1
        self.val2 = val2
        print( "引き算  val1:" + str(self.val1) + "val2:" + str(self.val2) )

    def calc( self ):
        """計算
        :return: 引き算結果
        """
        return self.val1 - self.val2

class calcuration( math , sub ):
    """多重継承
    :param math: mathクラス
    :param sub: subクラス   
    """
    
    def __init__( self , val1 =2 , val2 = 2):
        """初期化
        :param val1: 数値1
        :param val2: 数値2
        """
        self.val1 = val1
        self.val2 = val2
        print( "計算  val1:" + str(self.val1) + "val2:" + str(self.val2) )

# 計算
calc = calcuration()
print( calc.calc())

```

このプログラムを単体で動かすと

self.val1=2とself.val2=2がcalcration()を呼び出し、newをかかずとも、そのまま初期化され
match()のcalc()が呼び出されて4が出力されます。

### 実行結果

> 計算  val1:2val2:2
4
breeze api rate limit

## 特定のエンドポイントすべてへのアクセス回数の設定
`app/Providers/RouteServiceProvider.php`ファイル
bootメソッド
初期値では１分間で60回が設定されています。
idまたはipに紐づいています。
```
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
```

## loginに対するレートリミット
### ログイン試行回数
`app/Http/Requests/Auth/LoginRequest.php`ファイル
`ensureIsNotRateLimited`メソッド
初期値では5回が設定されており５回ログインを失敗するとロックされる。
初期状態ではmailまたはipに紐づいています。
```
        if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
            return;
        }
```

### ログインロックの時間
`app/Http/Requests/Auth/LoginRequest.php`ファイル
`authenticate`メソッド
初期値では60秒になっています。
web上ではロックになって初めてエラーとしてここで設定されている時間が確認できますが、最初にログイン試行した際にカウントダウンが始まっており実際に表示される時にはここで設定されている時間からロックされるまでに試行した時間が引かれた数値が表示されているはずです。
```
RateLimiter::hit($this->throttleKey());
```
「AtCoder Beginner Contest 192A - Star」メモ

## 問題
AtCoder Beginner Contest 192

https://atcoder.jp/contests/abc192/tasks/abc192_a

## 考察
もし`x`が100で割り切れるなら`100`を出力し、それ以外なら100から`x`を100で割ったあまりを引けばいい。
## ACコード
```py
x=int(input())

if x%100 == 0:
    print(100)
else:
    print(100-(x%100))
```
Webで透過動画をCanvasで重ねる

# 概要
Premire Proなどの動画編集で、クロマキー合成処理をした動画ファイルを、Web上で再生するためのメモ。

# 前提： クロマキー合成された動画の作成

こちらを参考に、背景透過を実施した。movファイルを、Webで使いやすいように、

- webm フォーマット
- アルファマップ

の仕様で変換します。

https://moviction.com/premiere-pro/chroma-key/

# movファイルを、webmファイルに変換

以下のコマンドで、アルファマップを保持したままwebmへの変換がk

```bash
ffmpeg -i input.mov \
  -c:v libvpx-vp9 \
  -crf 20 -b:v 0 \
  -pix_fmt yuva420p \ 
  -auto-alt-ref 0 \
  output.webm

```
SwiftUi 画像 をドラッグして自由に動す方法

SwiftUi 画像 をドラッグして自由に動す方法です

# 完成イメージ
![Videotogif (14).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/c91fea92-dbe2-4836-b87f-56d8f082327d.gif)




# 実装コード
```.swift
import SwiftUI

struct DraggableImageView: View {
    @State private var position: CGSize = .zero  // 画像の位置を管理する変数
    
    var body: some View {
        Image(systemName: "star.fill")
            .resizable()
            .frame(width: 50, height: 50)
            .position(x: UIScreen.main.bounds.width / 2 + position.width,
                      y: UIScreen.main.bounds.height / 2 + position.height)
            .gesture(
                DragGesture()
                    .onChanged { gesture in
                        position = gesture.translation
                    }
                    .onEnded { _ in
                        position = .zero
                    }
            )
    }
}
```

gestureを設定するとドラッグを取得することができます。
今回は中央に表示しているので`UIScreen.main.bounds.width / 2`　と　`UIScreen.main.bounds.height / 2 `で画面中央を取得してます。
中央からどの程度動かすか`position`を`DragGesture().onChanged`から取得して表示位置をドラッグに合わせて変更してます。
`onEnded`で指を離したら中央に戻ります。

リファレンス

https://developer.apple.com/documentation/swiftui/draggesture
log_iを使用してもログ表示ができなかった。問題は設定だ。

現在LoRa通信を使用してカメラの映像を遠隔地へ送信するプログラムを開発しているのだが
その中で***.cppで使用されている log_iを使用してもシリアルモニターに表示されない
問題が起きていた。

「ArduinoIDEの開発ではなくて現在VSCodeを使用しているから起きているのか？」
と思っていたがシンプルに私の設定が間違っていただけだった。汗

ボード設定のCore Debug Levelを「Info」に設定するだけだった。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/ee5e1f33-6aaa-4c1d-8be3-76f83a733d87.png)
Material-UI：React開発者のための究極デザインシステム

Material-UI（現MUI）は2014年に誕生したReact UIライブラリで、Googleの**マテリアルデザインガイドライン**をReactコンポーネントとして実装した先駆者です。初期バージョンではクラスコンポーネント中心でしたが、v5（2021年リリース）で完全な関数コンポーネント移行を達成。2022年にはブランド名を「MUI」に統一し、**デザインシステムツール群**としての進化を加速させています。

現在GitHubでは**8万以上のスター**を獲得（2023年12月時点）、週間ダウンロード数は**3,000万回超**という圧倒的なシェアを誇ります。この成功の背景には、開発チームが掲げる「**Design meets development**」という哲学が反映されています。

---

## Ⅱ. コア機能の深掘り（約600字）

### 1. コンポーネントエコシステム
80以上の最適化コンポーネントを提供：
- **基本部品**：`<Button>` `<Icon>` `<TextField>`
- **レイアウト**：`<Grid>`（Flexboxベースのレスポンシブシステム）
- **データ表示**：`<DataGrid>`（ソート/フィルタリング機能付き）
- **ナビゲーション**：`<Breadcrumbs>` `<Drawer>`
- **フィードバック**：`<Snackbar>` `<Dialog>`

**実装例**：
```jsx
import { Slider, styled } from '@mui/material';

const CustomSlider = styled(Slider)({
  color: '#1976d2',
  height: 8,
  '& .MuiSlider-thumb': {
    width: 24,
    height: 24,
  }
});
```

### 2. テーマエンジン
createTheme()
による動的スタイリング：

```jsx
const theme = createTheme({
  palette: {
    mode: 'dark', // ダークモード切替
    primary: { main: '#90caf9' },
  },
  typography: {
    fontFamily: 'Noto Sans JP, sans-serif',
  },
  spacing: 8, 
});
```

特徴：
CSS-in-JS（Emotion/styled-components統合）
グローバルスタイルオーバーライド
コンポーネントレベルのスタイルカスタマイズ

### 3. レスポンシブデザイン
ブレークポイントシステム：

```javascript
breakpoints.values = {
  xs: 0,  
  sm: 600,
  md: 900,
  lg: 1200,
  xl: 1536
};
```

実装パターン：
```jsx
<Grid container spacing={2}>
  <Grid item xs={12} md={6}>
    {/* スマホ時100%、PC時50% */}
  </Grid>
</Grid>
```

### 4. パフォーマンス最適化
ツリーシェイキング：未使用コンポーネントを自動削除
遅延ロード：
```<DynamicForm>```
などのコード分割対応
メモ化：
```React.memo```
による再レンダリング抑制

## Ⅲ. 実践活用ガイド
1. プロジェクトセットアップ
```npm install @mui/material @emotion/react @emotion/styled```

必須依存関係：

React 17以上
Emotion/styled-components（スタイリングエンジン）
@mui/icons-material（アイコンセット）

### 2. デザインシステム構築
テーマプロバイダーの設定
カスタムコンポーネントの作成
StorybookによるUIカタログ化
テスト（Jest + Testing Library）

### 3. よくある課題と解決策
課題① スタイル競合
→StyledEngineProvider
でCSS優先度制御

課題② 複雑なフォーム
→react-hook-form
との統合パターン採用

課題③ アクセシビリティ
→eslint-plugin-jsx-a11y
によるARIA属性チェック

## Ⅳ. エコシステム拡張
MUI X：商用グレードのデータグリッド/チャート
MUI Design Kit：Figma/Sketch用デザインテンプレート
MUI Templates：管理画面/ECサイトの雛形
MUI Core：無料オープンソース版
MUI Pro：プレミアムコンポーネントセット

## Ⅴ. ベストプラクティス（約200字）
コンポーネントの構成は「Atomic Design」原則に準拠
テーマ変数（--primary-color等）を活用した統一管理
Storybookドキュメントとテストの自動連携
Lighthouseスコア監視によるパフォーマンス維持
バージョンアップ時は
@mui/codemod
で移行支援

## Ⅵ. 将来展望
2024年ロードマップでは、Web Components統合やReact Server Components対応が進行中。さらにデザインシステム連携（Figma API連動）やAI支援開発ツール「MUI Copilot」の実験的導入が注目されています。

**Material-UIは単なるUIライブラリを超え、Reactエコシステムにおけるデザイン開発のインフラとして進化を続けています。学習コストに見合った生産性向上を実現するため、大規模プロジェクトほどその真価を発揮するでしょう。**
= と === の違い、知らないとヤバい！

プログラムはエラーも出ないのに、なぜか YES しか出力されない…。そんな不思議なバグにハマった僕。原因は 比較演算子のミス だった！
代入と比較の違い

```if (line = "paiza") { // バグる原因```

`=` は **代入** であり、比較じゃない。
正しくは `===`**（厳密比較）** を使う！

```if (line === "paiza") { // これが正解！```

知らないと、意図しないバグの 温床 に…。

[僕の失敗談と解決話](https://paizabeginner.wordpress.com/2025/02/21/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-%e3%80%80%e3%80%80%e3%80%80-%e3%81%a8-%e3%81%ae%e9%81%95%e3%81%84%e3%80%81%e7%9f%a5%e3%82%89%e3%81%aa%e3%81%84%e3%81%a8/)
Listsのカラム設定を変更しようとするとエラーになる

# 目次

- [やりたいこと](#やりたいこと)
- [経緯と起きたエラー](#経緯と起きたエラー)
- [\[解決\] 列の設定を更新する方法](#解決-列の設定を更新する方法)
  - [それでも更新できない設定](#それでも更新できない設定)

# やりたいこと

Listsを使っている中で、既存の列の設定を更新したい場合があります。
例えば、1行テキストだったカラムを複数行入力を許可するカラムに変更したりとか。

# 経緯と起きたエラー

私が使っているListsのとあるカラムは1行テキストの属性で利用していましたが、複数行のテキスト入力を許可させたくなったので、カラムの設定変更を行おうとしていました。
Listsの項目一覧画面から対象列を右クリックし、「列の設定」>「編集」から、列の設定を更新できそうな半モーダルが表示されます。

設定を変更し、いざ「保存」ボタンを押してみると、、、、以下のようなエラーが表示され、設定が更新されませんでした。

> <font color="Salmon">申し訳ございません、列を編集できませんでした。もう一度お試しください。</font>

もちろんもう一度試してみたけど、設定は更新できませんでした。

時間を空けてみたり、Lists内のアイテムを全部消したりなども試してみましたが、列の設定を更新することはできませんでした。

:::note warn
当方の環境では、**列に関するあらゆる設定変更が同様のエラーで更新できませんでした**。
:::

# [解決] 列の設定を更新する方法

Listsの項目一覧画面を表示した状態で、画面左上の歯車マーク:gear: → 「リストの設定」を押下すると、ページタイトルが「リスト名 > 設定」という画面に遷移します。

画面中段あたりに、「列」というフィールドがあり、その下に列名が列挙されています。
列名がリンクになっているので任意のものをクリックすると、その列の設定が編集できるようになります。

さっきは編集できなかった列の設定もこれで設定が更新できそうです。

## それでも更新できない設定

こちらの方法では、「選択肢」属性のカラムの「選択肢の色」は更新できませんでした。

既存の選択肢の色を変えたい等は、カラムの再作成を行うしかなさそう、、、 :fearful:
rustのバージョン切り替え手順

# 概要
- rustupでバージョンを切り替える方法

## rustupでバージョンを切り替える

### インストールされているバージョンを確認する
```
rustup toolchain list

toolchain list
stable-aarch64-unknown-linux-gnu (default)
1.85.0-aarch64-unknown-linux-gnu
1.68-aarch64-unknown-linux-gnu
1.85-aarch64-unknown-linux-gnu
```

### グローバルにバージョンを切り替える
```
rustup default 1.85.0

info: using existing install for '1.85.0-aarch64-unknown-linux-gnu'
info: default toolchain set to '1.85.0-aarch64-unknown-linux-gnu'

  1.85.0-aarch64-unknown-linux-gnu unchanged - rustc 1.85.0 (4d91de4e4 2025-02-17)
```

### ローカルにバージョンを切り替える
- 特定のプロジェクトディレクトリ配下で実行する
```
rustup override set 1.68
【備忘録】GoogleのOAuth2.0でリフレッシュトークンが返ってこない件

# 前提
GoogleOAuth2.0をある程度知っている

# 環境
フロント Next.js
バックエンド Go(gin)
OAuth2.0ライブラリ
```
	"golang.org/x/oauth2"
	googleOAuth "golang.org/x/oauth2/google"
	v2 "google.golang.org/api/oauth2/v2"
```

# 結論
フロントからGoogleの認証画面にリダイレクトする際に叩くURLのパラメータを確認する。
`access_type=offline`と`approval_prompt=force`をクエリパラメータにつける。

```text
https://accounts.google.com/o/oauth2/auth
?client_id=hogehogehoge
&redirect_uri=http://localhost:3000/login
&response_type=code
&scope=openid email profile
&access_type=offline
&approval_prompt=force
```

## どういうことか
最後の`access_type=offline`と`approval_prompt=force`がついていないと、Googleの同意画面が簡略化されたものになる。
→ 簡略化というと語弊があるが、ユーザー目線でいうと、アカウント選ぶだけ終わる。
しかし、これらのパラメータがつくと、アカウントを選んだ後にさらに同意画面が出てくる。
→ ユーザー目線では『このアプリを信用しますか？』はいorいいえ 的な選択が挟まる。

いずれの場合も完了後、自分のアプリへのリダイレクト時に`code`は発行される。
しかし、その後のフローとして自身のバックエンドで`code`を使って、認証を行った時のOAuthのレスポンスが異なる。
先述のGoogleの画面でユーザーが同意画面で同意した場合にのみ、リフレッシュトークンを得ることができる。

```go
func (g *GoogleOAuthManager) GetAccessToken(code string) (oAuthInfo *OAuthInfo, err error) {
	utils.LogMessage(utils.Debug, "GetAccessToken")
	cxt := context.Background()

	tokenInfo, _ := g.Config.Exchange(cxt, code)
	if tokenInfo == nil {
		utils.LogMessage(utils.Error, "failed get google token")
		return nil, errors.New("failed get google token")
	}
println(tokenInfo.RefreshToken) // ここが空かどうかが変わる
```

## 使い道（ただ当たり前のこと書いてます。。。）
バックエンドでユーザーのトークンの期限の管理や認証情報のリフレッシュの制御に合わせて、
細かいカスタマイズが可能。

ユーザー登録の際には同意画面を表示させ、リフレッシュトークンを発行する。
それ以降は、ログイン画面として簡略バージョンの認証画面にしておく。
毎回同意画面を表示させることなく、ボタン一発のスムーズなログインを実現することでユーザビリティに貢献できる。

基本的にアクセストークンはリフレッシュトークンやログインのたびに頻繁に更新するが、
リフレッシュトークンは頻繁に更新するようなものではない。
しかし、セキュリティ上の理由で、ユーザーのリフレッシュトークンごと更新したいケースがあるかもしれない。
バックエンド側で判定ロジックを組めば、意図的にユーザーに同意を求めることができる。

## つぶやき
久々に触ったら30分ほど溶かしたので、備忘録を残しておきました。
誰かの役に立てばと。。。
（ネットでいっぱい出てくるけど。）

`approval_prompt=force`は古いという情報があるが、私の環境だとこれで動くんだよね。。。なんだろうか。
DockerfileでImageMagick 7系をインストール！デフォルトの6系からバージョンアップ

# はじめに
Dockerfileで**apt-get install imagemagick**を実行すると、デフォルトで**ImageMagick 6.9.11-60**がインストールされます。しかし、最新の7系を使いたい場合や、特定のバージョンを指定したい場合は、追加の手順が必要です。
この記事では、私が苦戦したことを記録していきます。
初学者なのでもっと簡単な方法があると思いますが参考にしていただけると嬉しいです。

# 参考にした記事

https://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html

https://qiita.com/sigma_devsecops/items/88b29b47f31ef7ae0f64

https://imagemagick.org/


色々調べていると,`wget`を使うとURLから簡単にファイルをダウンロードできることを知りました。スクリプト内で自動的にファイルを取得できる便利なコマンドラインツールです。

結果的に、事前に`wget`をインストールしておき、**ImageMagick 7x**のバージョンを取得することができました。



```Dockerfile:Dockerfile
FROM ruby:3.3.6

RUN apt-get update -qq \
&& apt-get install -y ca-certificates curl gnupg wget \
    && wget https://imagemagick.org/download/sample-file.txt \
    && echo "ファイルのダウンロードが完了しました！"
```

```bash
% docker compose bundle 
% docker compose up -d
```

#### インストールされたか確認していきます。

```bash:Before(ImageMagick 6.9.11-60)
 docker compose exec web convert -version
 
Version: ImageMagick 6.9.11-60 Q16 aarch64 2021-01-25 https://imagemagick.org
Copyright: (C) 1999-2021 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP(4.5)
Delegates (built-in): bzlib djvu fftw fontconfig freetype heic jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png tiff webp wmf x xml zlib
```
```bash:After (ImageMagick 7.1.1-43)
docker compose exec web magick -version    

Version: ImageMagick 7.1.1-43 Q16-HDRI aarch64 22550 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(4.5)
Delegates (built-in): bzlib djvu fontconfig freetype jbig jng jp2 jpeg lcms lqr ltdl lzma openexr png tiff webp wmf x xml zlib zstd
```
ImageMagick 7系以降は、magickコマンドが推奨されているため、コマンドを変更しました。バージョンアップに成功し、convertコマンドの非推奨警告も解消されました。
```bash
WARNING: The convert command is deprecated in IMv7, use "magick" instead of "convert" or "magick convert"
```
CloudTrailのログ保存・解析方法：S3+AthenaとCloudTrail Lakeの比較

こんにちは、博報堂テクノロジーズの木村です。

AWS環境でのアクティビティ監視を行う機能としてCloudTrailがあります。CloudTrailにてログを長期保存してログ解析を実施する際には、主に以下２つの選択肢があります。

- S3に証跡を取得しAthenaにて解析を行う方法
- CloudTrail Lakeを利用して証跡の取得と解析を行う方法

今回CloudTrailによるアクティビティ監視の設定を行うにあたり、比較・検討を実施しましたので解説します。

## S3に証跡を取得しAthenaにて解析を行う方法

まず、S3に証跡を取得しAthenaにて解析を行う方法について、概要・メリット・デメリットをまとめます。

- 概要
    - 証跡をS3に保存する設定を実施
    - S3バケットに対して必要に応じてライフサイクルポリシーを設定
    - S3バケットに対してAthenaのテーブル定義を実施
    - Athenaテーブルに対して必要に応じてパーティションの設定など実施
    - Athenaにてクエリ実行して解析を実施
- メリット
    - カスタマイズ性が高い
        - S3への保存に関して、ストレージクラスの移動や削除のタイミングを細かく調整できる
        - Athenaテーブルのパーティションの設定などパフォーマンスを細かく調整できる
    - 取り込み時のコストが安価
        - 管理イベントの取り込みがS3バケット一つ目まで無料で取得できる
        - データイベントの取り込みコストがCloudTrail Lakeと比較して安価
            - 大量のアクティビティが発生した際でも、急激なコスト増加を抑えることができる
- デメリット
    - 自分でカスタマイズを実施しないと、コストやパフォーマンスに影響が出る
        - S3のライフサイクルの設定をしないと、ストレージクラスの移動や削除タイミングが設定されていないままとなり、コストやパフォーマンスに影響が出る
        - Athenaテーブルのパーティションの設定をしないと、コストやパフォーマンスに影響が出る

## CloudTrail Lakeを利用して証跡の取得と解析を行う方法

次に、CloudTrail Lake利用して証跡の取得と解析を行う方法について、概要・メリット・デメリットをまとめます。

- 概要
    - CloudTrail Lakeにてイベントストアの作成を実施し証跡を取得
    - CloudTrail Lakeのクエリ画面にて解析を実施
- メリット
    - 設定不要で使い始めることができる
        - AWS側が自動的にストレージクラスやパーティションの設定を行うため、考慮するポイントや設定手順が少ない
        - Athenaテーブルの設定を行うことなく、クエリ画面からすぐに解析が実施できる
- デメリット
    - 細かい設定ができない
        - 細かい設定ができないため、コスト・パフォーマンスのコントロールが難しい
    - 証跡の取り込み時のコストがS3に取得する場合と比較して高額
      - 管理イベントの取り込みに対してコストが発生する
      - データイベントの取り込みコストが管理イベントの取り込みコストと同額で、S3への証跡取得と比較して高額
        - 大量のアクティビティが発生した際の急激なコスト増加が懸念される

## 各方法の比較

２つの方法について比較してきましたが、今回私は以下の理由から「S3に証跡を取得しAthenaにて解析を行う方法」を選択しました。

- ストレージクラスを自分で調整して設定したい
    - CloudTrail Lakeではストレージクラスによるコスト低減ができません。対して、S3に証跡を保存した場合には、最新のデータは標準クラスで運用し、その後は低頻度アクセスやGlacierに移行する、という運用を行うことでコストを低減できることから、S3に証跡を取得する方法を選択しました
- Athenaのクエリのパーティションを自分で設定したい
    - 今回はログに対するパーティショニングしたい対象が予め決まっていました。そのため、CloudTrail Lakeによる自動でのスキャン範囲の絞り込み機能を利用するのではなく、Athenaにて手動でパーティショニングが設定できる方法を選択しました
- 証跡取り込み時点でのコスト急増のリスクを下げたい
    - 今回アクティビティ監視で検知したいことの一つとして、ユーザーからの急激なデータアクセスでコスト増加となった際のアクティビティの詳細を確認したいという目的がありました。CloudTrail Lakeではデータアクセスが多数発生した際に、証跡取得自体もコスト増加に繋がってしまうため、CloudTrail Lakeの導入は見送りました

逆に言えば、標準のCloudTrailの範囲だと保存期間が短く解析もしづらいが、パフォーマンスやコストで大きなこだわりはないので、よしなに上手くやってほしい。というケースではCloudTrail Lakeを使うのが良いと言えそうです。

## まとめ

ここまで、CloudTrailにて長期でログを保存してログ解析を実施する方法の紹介および比較を実施しました。

今回、S3に証跡を取得しAthenaにて解析を行う方法を選択しましたが、CloudTrail Lakeもすぐに証跡を取得・長期保存し解析ができる便利な機能なので、それぞれのメリット・デメリットを考慮したうえで方法を選択することで、ニーズにあったアクティビティ監視が可能になると思います。
Railsのfetch関数について

## 背景
- ストロングパラメータをいじいじする時に使う関数でfetchがあるがこの関数が第二引数ありとブロック引数ありの時の挙動が違ったのでここに記す

## 前提条件
- params = {}

## 第二引数がある時
- :hogeキーが見つからなかった時、第二引数に定義した値を返す

```
params.fetch(:hoge, []) #=> []
params.fetch(:hoge, "") #=> ""
ハッシュの時はストロングパラメータを返しているっぽい
params.fetch(:hoge, {}) #=> #<ActionController::Parameters {} permitted: false>
```

## ブロック引数がある時
- :hogeキーが見つからなくても、ブロックが実行されてしまいます
```
params.fetch(:hoge, []) {|h| h.permit(:fugo)} #=> error
```
FR-Spec: 大規模語彙を持つ言語モデルの推論を高速化する新手法

# **FR-Spec: 自然言語処理における語彙圧縮と推論高速化の新手法**

本記事では、最新の研究 **「FR-Spec: Accelerating Large-Vocabulary Language Models via Frequency-Ranked Speculative Sampling」** を紹介します。本研究は、LLM の **語彙サイズ増加が推論速度に与える影響を軽減するための新たな手法** を提案し、計算負荷を **75% 削減しながら推論速度を 1.12 倍向上** させることに成功しました。  

---

## **1. NLP における語彙サイズの増大とその課題**

### **1.1 語彙サイズ増大の背景**
近年の LLM は、多言語対応やドメイン適応のために語彙サイズを大幅に拡張しています。

| モデル名       | 語彙サイズ (トークン数) | トークナイゼーション手法 |
|--------------|--------------------|----------------|
| GPT-2       | 50k                | BPE (Byte-Pair Encoding) |
| BERT        | 30k                | WordPiece |
| Llama-2      | 32k                 | SentencePiece |
| Llama-3      | 128k                | SentencePiece |
| Qwen-2.5     | 152k                | WordPiece |
| DeepSeek-V3  | 129k                | BPE |

語彙サイズの増加は、以下のような NLP 的要因によって必要とされています。

- **多言語対応**: 英語圏のみならず、日本語や中国語など多言語対応のためには語彙サイズの拡張が不可欠。
- **ドメイン適応**: 医療・法律・科学などの専門用語をカバーするために、汎用 LLM よりも大きな語彙が求められる。

しかし、語彙サイズが増加すると、以下のような問題が発生します。

### **1.2 語彙サイズ増大による計算コストの増加**
LLM の推論時には、語彙サイズ $|V|$ に比例する計算が必要になります。

- **LMヘッドの計算コスト**:  
$$
  O(n \cdot d \cdot |V|)
$$

  ここで、n はシーケンス長、d は埋め込み次元。

- **GPU メモリ使用量の増加**:  
$$
  O(n \cdot |V| \cdot 4) \quad \text{(FP32 ベース)}
$$
  語彙サイズ 32k → 128k への増加は、**メモリ使用量を 4 倍に拡大**。

- **推論時間の増加**（Llama-3-8B, 128k 語彙）:
  - **32k 語彙モデル**: 20ms  
  - **128k 語彙モデル**: **80ms (+300%)**  

---

## **2. FR-Spec の理論的背景**

### **2.1 Zipf の法則による語彙削減の効果**
自然言語の語彙分布は Zipf の法則に従い、頻度 $P(w)$ は以下の式で近似されます。

$$
P(w) \propto \frac{1}{r(w)}
$$

ここで、$r(w)$ はトークンのランク。この分布を考慮すると、以下のような事実が導かれます。

- **上位 25% の語彙が 95% のトークン出現頻度を占める**（Llama-3-8B の統計より）。
- **低頻度語彙は推論時にほぼ影響を与えない**。

この性質を利用し、FR-Spec は **高頻度語彙のみに基づいた推論を行い、LM 検証時のみ低頻度語彙を考慮する** ことで、推論速度を向上させます。

### **2.2 FR-Spec による計算量削減**
FR-Spec の適用により、語彙サイズ $|V|$ を $|V_{high}|$ に圧縮することで、LMヘッドの計算量を以下のように削減できます。

$$
O(n \cdot d \cdot |V_{high}|)
$$

実験では、**語彙サイズを 128k → 32k に削減することで、計算負荷が 75% 減少** しました。

---

## **3. FR-Spec の NLP タスクへの適用**

### **3.1 NLP の主要タスクへの影響**
#### **(1) 機械翻訳 (MT)**
- **BLEU スコア変動なし、推論速度 1.12× 向上**  
- **低頻度語彙は翻訳時に LM により再検証** されるため、品質を維持。

#### **(2) 質問応答 (QA)**
- **推論速度 1.20× 向上、F1 スコアの低下なし**  
- 高頻度語彙のみをドラフト生成に利用し、低頻度語彙の回答を LM に依存。

#### **(3) コード生成 (Code Generation)**
- **HumanEval ベンチマークで 1.13× の速度向上**  
- Python, JavaScript などの構造化された言語では、頻出トークンの選択による影響が少なく、速度向上が顕著。

---

## **4. 実験結果と統計的評価**

### **4.1 許容長と推論速度**
| 語彙サイズ | 許容長 (Accepted Length) | 推論速度向上 |
|------|----------------|--------------|
| 128k (Full) | 3.89 (100%) | 1.00× |
| 64k | 3.80 (97.7%) | 1.12× |
| 32k | 3.63 (93.3%) | **1.27×** |
| 16k | 3.40 (87.4%) | **1.41×** |

- 統計的有意性 (p-value < 0.01) を確認。  
- 誤差範囲 (±0.05) 以内で結果が一貫。  

---

## **5. まとめ**
FR-Spec は、NLP モデルの推論速度を **最大 1.12× 向上** させ、計算負荷を **75% 削減** する技術です。特に **多言語モデルやドメイン適応モデル** に最適であり、今後の LLM 高速化に貢献する技術として期待されます。
OCIストレージサービスのレプリケーション・バックアップ・クローン機能比較

# 自分用メモです

## 1.はじめに
Oracle Cloud Infrastructure（OCI）では、ブロックストレージ、オブジェクトストレージ、ファイルストレージ、アーカイブストレージなど、複数のストレージサービスを提供しています。それぞれのストレージには、レプリケーション、バックアップ、クローン作成などのデータ保護・運用管理機能が備わっています。

本記事では、OCI公式ドキュメントや実際の運用知見をもとに、各ストレージの機能を比較し、それぞれの特性や制約、運用時の注意点について記載します

---

## 2. OCIの各ストレージサービス概要

### 🔹 **ブロックボリューム**
#### 📌 概要
OCIのブロックボリュームは、高速なブロックレベルのストレージであり、コンピュートインスタンス向けに最適化されています。デフォルトで256ビットAES暗号化を使用し、複数のアベイラビリティドメイン（AD）にまたがるレプリケーション機能を備えています。

#### 🔄 **レプリケーション機能**
- 非同期レプリケーションが可能
- ボリュームグループ単位で最大3つのADまたはクロスリージョンでの冗長化が可能
- ディザスタリカバリ（DR）や移行に活用可能

#### 📋 **クローン機能**
- 同一AD内またはクロスリージョンでのクローン作成が可能
- 最大32TB（ソースボリュームのサイズによる）
- ハイドレーション処理により、最大30分程度の影響あり

---

### 🔹 **オブジェクトストレージ**
#### 📌 概要
オブジェクトストレージは、REST API経由で大容量データを管理できるサービスです。年間耐久性99.999999999%（11ナイン）を誇り、冗長性の高い設計がされています。

#### 🔄 **レプリケーション機能**
- クロスリージョンレプリケーションが可能
- バージョニングが有効な場合、宛先バケットは読み取り専用となる

#### 📋 **クローン機能**
- オブジェクトのコピー（クローン的な操作）は全リージョンで可能
- バージョニングや保持ルールの影響を受けるため、運用には注意が必要

---

### 🔹 **ファイルストレージ**
#### 📌 概要
OCIのファイルストレージは、NFSv3プロトコルに対応した共有ストレージであり、高い可用性を提供します。フォルトドメインをまたいだ5方向のレプリケーションによる冗長性を持ちます。

#### 🔄 **レプリケーション機能**
- 同一リージョン内でフォルトドメイン間の5方向レプリケーションが可能

#### 📋 **クローン機能**
- スナップショットベースのクローン作成が可能
- 同一リージョン内のみクローン作成が可能
- クローン作成直後はIOPSが最大30%低下する可能性あり

---

### 🔹 **アーカイブストレージ**
#### 📌 概要
アーカイブストレージは、長期間保存向けの低コストなコールドストレージです。頻繁にアクセスしないデータの保存に最適ですが、復元には時間がかかります。

#### 🔄 **レプリケーション機能**
- 明示的なレプリケーション機能はなし
- 最低90日間の保持が必須

#### 📋 **クローン機能**
- 直接のクローン作成は不可
- 利用時は標準ストレージへ復元する必要がある
- 復元時間は公式SLAで最大4時間、実運用では1時間程度の場合もある

---

## 3. 各ストレージサービスの機能比較表

| ストレージ種別       | レプリケーション機能                         | クローン作成範囲                | マルチリージョン対応 | その他の注意点 |
|-----------------|--------------------------------|-------------------------|----------------|----------------|
| **ブロックボリューム**  | 最大3ADまたはクロスリージョンに対応           | 同一ADまたはクロスリージョン | 可能           | ハイドレーション中のパフォーマンス低下 |
| **オブジェクトストレージ** | クロスリージョンレプリケーションが可能        | 全リージョンへコピー可能  | 可能           | バージョニングが影響を与える |
| **ファイルストレージ**   | 同一リージョン内の5方向レプリケーション対応 | スナップショットベース     | 不可           | クローン作成直後はIOPS低下 |
| **アーカイブストレージ** | レプリケーション機能なし                     | クローン作成不可          | 復元後可能       | 復元に時間がかかる |

---

## 4. 運用時の具体的な制約と注意点

### **✅ ブロックボリュームの制約**
- レプリケーションはボリュームグループ単位で設定
- クローン作成中はパフォーマンス低下に注意

### **✅ オブジェクトストレージの制約**
- バージョニングが有効な場合、クロスリージョンレプリケーション時に宛先バケットが読み取り専用になる
- 保持ルールによるデータ削除制限がある

### **✅ ファイルストレージの制約**
- クローン作成はスナップショットベース
- クローン作成後にIOPSが低下する事例あり

### **✅ アーカイブストレージの制約**
- 直接のクローン作成は不可
- 復元に最大4時間かかる可能性がある

---

## 5. まとめ

OCIはさまざまなストレージオプションを提供し、各ストレージには最適なデータ保護機能が用意されています。それぞれの特性と制約を理解し、適切なストレージ戦略を立てることが重要です。

- **ブロックボリューム**：高速なクローン作成とクロスリージョンレプリケーションが可能
- **オブジェクトストレージ**：高耐久性を誇り、広域レプリケーションが可能
- **ファイルストレージ**：スナップショットベースのクローン作成に特化
- **アーカイブストレージ**：低コストだが復元に時間がかかる


---
NEC UNIVERGE IX2105 Web設定画面を有効にする

[NECの演習資料](https://www.express.nec.co.jp/idaten/network/ix/ix2k3k-learning-ver8.10_10.0.pdf)で、上手くいかない。
いろいろなサイトを見て、前後を書き足した感じ。
GE1側にPCをつなぐと、Web設定画面が見える。

~~~
enable
username admin01 password plain 1 admin01password administrator
http-server ip enable
http-server username admin01
default-console web
enable-config
exit
write memory
reload
~~~
gin sessionでのログイン認証で詰まりまくったところ

## 発生した問題
ログイン認証時、リロードをするとsessionのcookieが消えてしまい、ログイン状態が維持できない
※ちなみにおそらく超初歩的なことです。うp主は弱小エンジニアですのでご了承ください
## 解決策
session保存時session.Optionでpathを指定。
## 発生した問題の詳細
react ginでのwebアプリケーションでlogin機能実装時わけわからんエラーが発生した。
login認証後frontにsessionの情報が送られてきてcookieにidが保存されているが、リロードしたら消えてしまうためログイン状態が維持できないというものだった。
原因はcookieのpathが/apiになっており/などではそのcookieが使用できないためであった。
ginでは（他のフレームワークのことはわからん）下にある解決方法をやらないと勝手にエンドポイントのベースpath？でpathがついちゃうっぽい。

（これは”/”だけどここのpathが"/api"だった）
![スクリーンショット 2025-02-22 15.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507140/037a7cab-c1c9-4977-b9c0-1bcc349ae1fd.png)

## 解決方法
login処理のsession保存時にPath: "/"を指定してpathが"/api"にならんようにする
```
session.Options = &sessions.Options{
		Path: "/",
	}
```
解決〜😘
「AtCoder Beginner Contest 026 A - 掛け算の最大値」 メモ

## 問題
AtCoder Beginner Contest 026 A - 掛け算の最大値 

https://atcoder.jp/contests/abc026/tasks/abc026_a

## 考察
与えられる偶数は十分に小さいのでfor文をつかって全探索すればよい。`x`は`i`(`i`はfor文の添え字で`A`未満)といて表し、`y`は`a-i`で表せばよい。

## ACコード
```py
def max_score(a):
    ans = 0
    for i in range(a):
        y = a - i
        ans = max(ans,i*y)
    return ans

a=int(input())

print(max_score(a))
```
レトロPCのためのBASIC講座８　画面制御２テキスト画面

# 前回のおさらい
ざっくりと、N88BASICで扱う画面にはグラフィック画面とテキスト画面があり互いに影響を与えないようになっているのを確認しました。

[レトロPCのためのBASIC講座７](https://qiita.com/kawamo55/items/112182de4ec76f9537e1)

# テキスト画面のモード設定
テキスト画面のモードは、CONSOLE命令で行います。
CONSOLE スクロール開始業,スクロール行数,ファンクションキー表示スイッチ,カラー白黒切り替え
という指定になります。
例えば
CONSOLE 5,10,1,1
という指定をすると
０行目から４行目の５行は固定され
６行目から１５行目はスクロールして
ファンクションキーを表示
カラーモード
という指定になります。

#　テキスト職はCOLOR命令で変える
COLOR テキストの色
例えば、
COLOR 4
で緑色の文字で表示されます。

# テキストの表示位置
テキストの表示位置は、LOCATEで指定します。
例えば
LOCATE 10,5:INPUT "A=",A

# サンプルプログラム
``` TXSCR.BAS

100 CLS
110 CONSOLE 5,10,1,1
120 LOCATE 20,2: PRINT "LOCATE TEST"
130 FL=0
140 CLS
150 IF FL=2 THEN 240
160 LOCATE 10,5: INPUT "A=", A
170 LOCATE 10,6: INPUT "B=", B
180 LOCATE 10,7: PRINT "A+B=";
190 LOCATE 15,7: PRINT A+B
200 COLOR 4
210 FL=FL+1
220 IF FL<3 THEN INPUT "HIT ENTER KEY", A$
230 GOTO 140
240 END
```

# 今回の動画
https://youtu.be/6jBPkl3D_BE
初心者のGodotゲーム開発日記01

# はじめに
お久しぶりです。長い間投稿してなかったですね。
なぜ投稿しないかというと、ここ一年会社で携わっている仕事はほとんどバックエンド開発なんで、ネタになれるものは基本会社内ノウハウなので、投稿としては適切な気がしないのです。決して私がサボったのではなかった…です。
さて、今回の投稿はフロントエンドでもバックエンドでもなく、そもそも WEB 開発と関係ないゲーム開発の話です。ではなぜゲームを開発したいなのか？と聞かれたら、「創作」がしたいんですよ、私。もちろん WEB 開発とやらも好きなんだけど、それは「モノづくり」なんで、「創作」とは違います。

# どんなゲーム
とにかく 2D ゲームを作りたいですね。3D ゲームは開発規模が大きいので、初心者かつ少人数では無理です。
そして今回は練習として、スーパーマリオみたいなプラットフォームゲームを作ってみたいです。障害物、トラップ、敵、そしてシューティング、スキル。うむ、練習として完璧ではないか。

# なぜ Godot
下記のゲームエンジンを調べたり実際に使ってみたりしました。
1. Unreal：大規模な 3 Dゲーム（いわゆる AAA ゲーム）向けなので、2D のインディーゲームには向いてないだろう
1. Unity：パワフルそして（制限付き）無料。が、動きが重い。そして複雑。あとC#は苦手
1. love2d：軽いけど機能が少ない。プログラム以外の部分（スプライトとか）は別のツールが必要
1. pygame：love2d と似てる。そして古い。公式サイトで掲載されているオープンソースゲームは何年前のもので参考にはなれない
1. Godot：Unity みたいにパワフル、動きも早い。やや複雑だがゲームのすべてをこれ一個でできる

調べ結果、Godotを使うことにしました。今回は Godot4.3（2025/2 当時最新の安定バージョン）を使います。

# プロジェクト立ち上げ
自分のプロジェクトを作成する前に、参考用のデモをダウンロードしましょう。下記のデモがよさそうです。キャラクター、レベル、トラップがそろっています。シューティングはないけど…それはあとで何とかなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/50b073a5-168a-419c-be99-744f78af2e68.png)
次は自分のプロジェクトを新規作成し、デモのアセットを一部コピペします（主にレベル部分）。
キャラクターは自分で適当に描きます。我々の主人公かこれー
![player.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/9f65d645-7019-4a90-8b8a-309794abdb1f.png)
モンハンのリオレウスです！
（上手に描けました♪）
必要な画像をアセットフォルダーに入れて、ゲーム開発の準備が整いました。

# レベルレイアウト
シーンの中に新しい子供ノードを追加し、その下で TileMapLayer ノードを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/93a2a488-4425-4160-9056-92897434e797.png)
TileMapLayer を選んで、右側の Inspector で新しい TileSet を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/9a72e457-81bc-4cca-9cc3-69a1261eda97.png)
適切な Tile Shape と Tile Size を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/162f8367-514a-4e48-b0d6-364414e07e46.png)
そしたら下の TileSet タブが現れ、画像を入れるのは可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/e9abd568-0166-45c4-a23d-edbbfb2faaf5.png)
画像をドラッグ・ドロップで入れたら、設定だれた Tile Size で画像が切り分けられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/a282c8ce-9806-4202-a3ff-c55cea93993f.png)
TileMap タブに行って、ツールバーで Paint を選んだらタイルをシーンに描けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/9acf3bab-4fd4-4e5b-b461-9de60e164af9.png)
適当にレベルレイアウトを行って、プラットフォームっぽいものができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/7a518124-45d0-42fb-bea2-c23a64719042.png)

# おわりに
あれ？キャラクターはまだできてないのにいきなりおわりに？
いやー本当はできていたけれど、ここまで書くのに疲れたので、今回はレベルレイアウトぐらい。キャラクターとやらはまだ今度書こう。お疲れ様ですー
【Teams電話】Teams 電話とは

# はじめに

業務で Teams 電話に触れる機会が多いのですが、PSTN についての知識が乏しかったため、機能や構成について理解するのに時間がかかりました。そこで、Teams 電話について PSTN に馴染みがないと理解しづらい点を記事にまとめました。

# Teams 電話とは？

Teams 電話を利用すると、普段利用している Teams から**外線電話**の受発信を行えるようになります。

通常の Teams でも通話を行うことができますが、Teams 電話を利用すると 03-xxxx-yyyy のような電話番号を使用して、外線電話も使用することができます。

ここでは、電話番号を使用しない通話を **Teams 通話**、電話番号を使用する通話を **Teams 電話**と呼ぶことにします。

| 名前 | 説明 |
|:-:|:-:|
| Teams 通話  | Teams を利用しているユーザー間の<ins>インターネット回線</ins>による通話 |
| Teams 電話  | 電話番号を使用した<ins>公衆電話回線網 (PSTN) </ins>による通話  |

::: note
PSTN とは Public Switched Telephone Networks の略で、通信キャリアが運営する公衆電話サービスで利用されています。Teams 電話は Teams と公衆電話サービスを統合して利用できる機能です。
:::

# Teams 電話でできること

Teams 電話には様々な機能がありますが、簡単な例を挙げてみます。Teams 電話では外線電話が Teams に統合されているため、以下のようなメリットがあります。

### 複数のデバイスで同じ電話番号を使用できる

携帯電話などの場合には SIM カードに電話番号が紐づいています。そのため、その電話番号を使用できるのは SIM カードが挿入された特定のデバイスのみです。

Teams 電話の場合には、ユーザーに対して電話番号を割り当てます。そのため、Teams にサインインすれば、PC やスマホなど、どのデバイスでも同じ電話番号を使用することができます。

### Teams のプレゼンスに応じた制御ができる

例えば、Teams 会議を行っているときに外線電話から着信があった場合、着信を留守番電話（ボイスメール）に転送する、といったことができます。

外線電話が Teams に統合されていることで、外線電話の着信も Teams 上での状態（プレゼンス）に応じた制御が行えます。

### ユーザーやチームを使用して代表電話を構成できる

コールセンターの代表電話のように、着信があった際に複数の担当者へ通知して、誰かが受話するようなオペレーションはよくあるかと思います。

Teams 電話を利用すると、外線電話が着信した際に複数のユーザーへ同時に着信させるような制御が簡単に行えます。

また、チームを使用してチームメンバーを担当者とした代表電話を構成することもできます。

※ 関連記事

https://qiita.com/atsmin77/items/b165b51e5b3d1e438b89

# 利用するために必要なこと

Teams 電話を利用するためには、以下が必要です。

### ライセンスの取得

Teams を利用するためのライセンスに加えて、**Teams 電話スタンダード (Microsoft 365 電話システム) ライセンス** が必要です。このライセンスは単体でも購入できるほか、Microsoft 365 E5 などのライセンスにも含まれています。

::: note
Microsoft 365 電話システム ライセンスは開発者向けの無償ライセンスである **Microsoft 365 E5 Developer** にも含まれています。そのため [Microsoft 365 開発者プログラム](https://learn.microsoft.com/ja-jp/office/developer-program/microsoft-365-developer-program) に参加することでも利用できます。
:::

| 名前 | ID | サービスプラン |
|:-:|:-:|:-:|
| Microsoft Teams Phone Standard | MCOEV  | MICROSOFT 365 PHONE SYSTEM (4828c8ec-dc2e-4779-b502-87ac9ce28ab7)  |

(参考：ライセンス Teams 電話 - エンド ユーザー向け)
https://learn.microsoft.com/ja-jp/microsoftteams/teams-phone-licensing#licensing-teams-phone---for-end-users

(参考：ライセンスのための製品名とサービス プラン 識別子)
https://learn.microsoft.com/ja-jp/entra/identity/users/licensing-service-plan-reference

### 公衆電話回線網 (PSTN) との接続

Teams 電話を利用するためには、Teams と PSTN を接続する必要があります。NTT や KDDI などの回線事業者が Teams と PSTN を接続するサービスを販売しています。
自社で PBX や SBC といった電話交換機を運用していれば、自分で Teams と接続することもできます。

# 関連記事

Teams 電話には PSTN との接続方法によって複数の構成があります。各構成の違いについては以下に記載しています。

https://qiita.com/atsmin77/items/9afa168e9e40dab5e143

また、Teams 電話を実際の PSTN と接続することなく、Azure に疑似的な PSTN 環境を構築し検証することも可能です。詳細については以下に記載しています。

https://qiita.com/atsmin77/items/31abd44100b6841c5818
AWS Outpostsメモ

**AWS Outposts** は、AWS のインフラとサービスを **オンプレミス環境** に拡張するためのマネージドサービスです。AWS のデータセンターと同じハードウェアを自社のデータセンターやコロケーション施設に導入し、AWS のサービスをローカルで実行できます。

---

## **1. AWS Outposts の概要**
### **🖥️ どんなもの？**
- AWS が提供する **物理ラック**（オンプレミスに設置）
- AWS の **EC2, EBS, RDS, S3** などのサービスをローカルで実行可能
- **AWS マネージド**：ハードウェアの管理は AWS が実施
- AWS リージョンと連携し、**ハイブリッドクラウド** 環境を実現

### **📌 主要なユースケース**
- **レイテンシーの短縮**（AWS のデータセンターが遠い場合）
- **データのローカル処理**（規制要件でデータを国外に出せない場合）
- **エッジコンピューティング**（工場、病院、小売店など）

---

## **2. AWS Outposts の種類**
1. **AWS Outposts Rack**
   - 42U ラックサイズ（オンプレミス用のフルサイズラック）
   - AWS が配送・設置・運用を担当
   - **EC2, EBS, RDS, EKS, ECS, S3** などが利用可能

2. **AWS Outposts Servers**
   - 1U または 2U のサーバー
   - 小規模環境向け（支社・小売店など）
   - **EC2, EBS** などが利用可能

---

## **3. AWS Outposts の構成**
AWS Outposts のセットアップには、以下の主要コンポーネントが含まれます：

| コンポーネント | 説明 |
|--------------|------|
| **Outposts Rack** | 物理的なラック（ネットワーク機器、サーバー） |
| **Outposts Local Gateway (LGW)** | AWS Outposts とオンプレミスネットワークを接続 |
| **Outposts Service Link** | AWS リージョンとの通信を管理 |
| **Outposts Networking** | VPC サブネット、セキュリティグループ、ルートテーブルなど |

---

## **4. AWS Outposts の導入プロセス**
1. **AWS マネジメントコンソールで注文**
2. **AWS が Outposts を配送・設置**
3. **オンプレミスネットワークとの統合**
4. **AWS コンソールで Outposts の設定**
5. **AWS サービスをデプロイ（EC2, S3, EKS など）**

---

## **5. AWS Outposts の管理**
- **AWS マネジメントコンソール** から Outposts を管理
- **AWS CLI / SDK** を使って API で操作
- **CloudWatch** でモニタリング
- **AWS Systems Manager** でパッチ管理や運用自動化

---

## **6. 料金**
- **初期費用なし（3年 or 5年契約）**
- **月額 or 一括払い**
- **設置・運用は AWS が担当**
- **データ転送料は別途発生する可能性あり**

---

## **7. AWS Outposts と 他のエッジサービスの比較**
| サービス | 用途 |
|----------|------|
| **AWS Outposts** | オンプレミスで AWS のサービスを実行 |
| **AWS Local Zones** | AWS が提供するリージョン外データセンター |
| **AWS Wavelength** | 5G ネットワークエッジ向け |
| **AWS Snow Family** | オフラインデータ転送 & エッジコンピューティング |

---

### **📌 まとめ**
✅ AWS のインフラをオンプレミスで利用できる  
✅ ハイブリッドクラウドや低遅延アプリに最適  
✅ AWS がハードウェアを管理するため運用負担が少ない  
✅ **Outposts Rack（フルラック）** と **Outposts Servers（小型サーバー）** の2種類がある  

---
【Azure Functions・Docker】 FastAPI を Azure Functions で動作させた際の初回起動エラー出力方法

## はじめに
FastAPIをラップしたメソッドを AzureFunctionで使用している場合、
Function の初回起動時に発生するエラーが、Azure Functions の内部ログとしては記録されず、原因特定が難しいという現象があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2963171/3ed247c1-25f1-4b37-bf5c-df5d77bbdafc.png)

公式ドキュメントを確認した限りでは、明確な対応策は提示されていませんでした。。
そこで、Azure Functions側での対応ではなく、別の方法でこの問題を回避するアプローチを思いついたため、本記事で共有させていただきます。

もし誤った情報が含まれている箇所がございましたら、ご指摘いただければ幸いです！

## 回避策
FastAPIを単体で立ち上げる専用のコンテナを作成し、FastAPI アプリの起動時に発生するエラーやスタックトレースを直接コンソールに出力する。

## 実装時の注意点

### uvicorn のインストールについて
Azure Functions では、FastAPI アプリをラップするために uvicorn は必須ではありません。
そのため、FastAPI単体で動作させるには、uvicornのインストールが必要になります。

### モジュール指定の工夫
uvicorn を用いてアプリを起動する場合、FastAPI アプリのエントリポイントに正しくアクセスできるよう、モジュールの指定方法に工夫が必要です。

### おわりに
FastAPI に限らず、他の実装方法でも同様のアプローチが可能だと考えています！
少しでもお役に立てれば幸いです。
watsonx.aiをAPIで使うサンプル(シェルスクリプト版)

## 概要
ネット上にPythonを使ったサンプルコードは見かけるのですが、ちょこっと動かすのに環境準備が最も楽なのはシェルスクリプトだなってことで、サンプルコードを備忘録しておきます。

## 準備
### 1. 環境
- curl
- jq

### 2. IBM Cloud
- API keyの取得
もしなければ、[ここ](https://cloud.ibm.com/iam/apikeys)から作れる

### 3. watsonx.ai
- プロジェクトIDの取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2745658/37ef84e7-8d2c-4001-b522-5e8987d503ff.png)

## 実行
API keyとプロジェクトIDの部分を置き換えて、以下をシェルスクリプトにして実行します。
watsonx.aiのリージョン(例ではus-south=ダラス)、LLMのモデル名(例ではibm/granite-3-8b-instruct)、その他のパラメータは必要に応じて置き換えてください。

```
#!/bin/bash

#### 以下の値は各自の環境に合わせて修正 ####
APIKEY=自分のAPIkey
PROJECT_ID=自分のプロジェクトID
#### ここまで ####

echo -n "プロンプトを入力してください："
read INPUT

access_token=$(curl -s -X POST 'https://iam.cloud.ibm.com/identity/token' -H 'Content-Type: application/x-www-form-urlencoded' -d 'grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey='"$APIKEY" | jq -r '.access_token')

data="{\"model_id\": \"ibm/granite-3-8b-instruct\",
  \"project_id\": \"$PROJECT_ID\",
  \"input\": \"$INPUT\",
  \"parameters\": {
    \"decoding_method\": \"greedy\",
    \"max_new_tokens\": 200,
    \"min_new_tokens\": 0,
    \"stop_sequences\": [],
    \"repetition_penalty\": 1.1
}}"

curl -s -X POST 'https://us-south.ml.cloud.ibm.com/ml/v1/text/generation?version=2023-05-29' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H "Authorization: Bearer $access_token" \
  -d "$data" | jq -r '.results'
```

- 実行例
```
% ./watsonx_test.sh
プロンプトを入力してください：IBMはどのような会社ですか？

[
  {
    "generated_text": "\nIBMは、アメリカ合衆国の大手情報技術（IT）企業であり、1911年に設立されました。IBMは、ハードウェア、ソフトウェア、サービスを提供する多岐にわたるビジネスを持っています。これには、クラウドコンピューティング、人工知能（AI）、データ分析などが含まれます。また、IBMは世界中の企業や政府機関と協力して、イノベーションと変革を推進しています。\n\nIBMの歴史は、1911年にコンピューター・タブレット記録機（Tabulating Machine Company）、計算機（Computing-Tabulating-Recording Company, CTR）、およびインターナショナル・ビジネスマシ",
    "generated_token_count": 200,
    "input_token_count": 11,
    "stop_reason": "max_tokens"
  }
]
```
AWS認定試験で身分証明書の氏名は日本語でOK

# はじめに

AWS認定試験を受ける際、AWS認定アカウントにIDを登録するのですが、そこに登録できる氏名はアルファベットのみです。しかし日本語の身分証明書しかない私は下記の記載をみて焦りました。

>試験会場で提示する有効な**プライマリおよびセカンダリ ID の姓と名**は、登録時に **AWS 認定アカウントに入力した姓と名**と**まったく同じ**である必要があります。


出展：

https://aws.amazon.com/jp/certification/policies/during-testing/#ID_Requirements


# 氏名の変更を試みる

AWS認定アカウントの氏名を日本語に変更すべく、氏名変更の申請を出すと下記のような返信が返ってきました。

> I understand that you wish to update your name using Japanese alphabet characters. Due to system limitation, we are unable to update characters in a localized characters. Our system can only support the use of Roman (English) alphabet characters.

困りました。

# 問題ありません

ここにしっかり書いてありました。

https://aws.amazon.com/jp/certification/policies/during-testing/#ID_Requirements

>現地語の例外:
オンライン試験: **現地語の (ローマ字以外または英語以外の) ID も受理されます**。現地語の ID は OnVUE 試験 ID 要件のガイドラインを満たしている必要があります。上記の「使用できない ID」セクションを確認してください。
テストセンター試験: 身分証明書が最初に発行された国で受験する受験者には、**現地語の (ローマ字以外または英語以外の) ID を使用できます**。ID は有効期限が切れていないもので、政府発行の写真付きでなければなりません。

# 実際にできました

https://qiita.com/talomina/items/fd3483c545e44ffced45

# おわりに

安心してください。AWS認定アカウントの氏名はアルファベットでも、日本語の氏名が記載された身分証で試験は受けられます

:::note
身分証は2つ用意する必要があるのでお忘れなく！
:::

同じことで悩む人が居たら届きますように。
1. webページをデプロイするために、EC2インスタンスを起動する

※記録用の記事になります。ざっくりこんな手順でやったという記録です。

## ゴール
EC2インスタンスを立ち上げて、nginxを起動し、ブラウザから「Welcome to nginx!」を確認できるまで

## 全体のゴール
現在、render.comで3つのサーバーが稼働しているので、それを1つのEC2インスタンスにまとめて、費用削減したい。

## 関連する記事
[1. webページをデプロイするために、EC2インスタンスを起動する](https://qiita.com/shimekake-hanaka/items/1062fffe33a966002feb)
[2. Ruby on Railsの環境構築をする](https://qiita.com/shimekake-hanaka/items/fd7e6839bd2db8e8c877)
[3. pumaで起動してipアドレス指定でhttp通信ができるようにする](https://qiita.com/shimekake-hanaka/items/e3715ef81d98bb3a2b4b)
[4. https://{サブドメイン}でrailsを表示できるようにする](https://qiita.com/shimekake-hanaka/items/bf34dc0b553784b48c19)

## 手順

### 前提
- リージョン：アジアパシフィック（東京）
- 個人の環境なので、ルートユーザーを使用して作成

### VPCの作成

|項目|設定内容|
|---|---|
|作成するリソース|VPCのみ|
|名前タグ|EC2-myname-prd001|
|IPv4 CIDRブロック|10.0.0.0/16|
|IPv6 CIDRブロック|なし|
|テナンシー|デフォルト|

### サブネットの作成
※DB等には使用せず、webアプリケーションのデプロイのみの予定をしているので、パブリックのみ作成した
|項目|設定内容|
|---|---|
|VPC ID|上記で作成したVPC|
|サブネット名|EC2-myname-prd001-subnet-01-public|
|AZ|指定なし|
|IPv4 VPC CIDR ブロック|10.0.0.0/16|
|IPv4 サブネット CIDR ブロック|10.0.1.0/24|

### サブネットにルートテーブルを紐づける

#### インターネットゲートウェイを作成
|項目|設定内容|
|---|---|
|Nameタグ|EC2-myname-prd001-igw|

#### ルートテーブルの作成
|項目|設定内容|
|---|---|
|Nameタグ|EC2-myname-prd001-public-rtb|

#### ルートテーブルを関連づける
アクション→作成したルートテーブルを選択

### セキュリティグループ作成
|項目|設定内容|
|---|---|
|https|0.0.0.0/0|
|https|::0|
|http|0.0.0.0/0|
|http|::0|
|ssh|自宅WifiのIPアドレス|

### インスタンスを起動する
|項目|設定内容|
|---|---|
|Nameタグ|EC2-myname-prd001|
|Amazonマシンイメージ|Amazon Linux(Amazon Linux 2023 AMI)|
|アーキテクチャ|64ビット(Arm)|
|インスタンスタイプ|t4g.nano(ストレージ/0.5GB)(CPU2コア)|
|キーペア|作成した|
|ネットワーク|作成したVPC|
|サブネット|作成したパブリックサブネット|
|パブリックIPの自動割り当て|有効化|
|セキュリティグループ|作成したセキュリティグループを選択|

※その他の設定はそのままで作成した

### Elastic IPの割り振り
上記の設定のままだと、再起動時にIPアドレスが変わってしまうため、Elastic IPを割り振る

### nginxの起動
#### SSH接続
`~/.ssh/config`ファイルに以下を追加
```
Host 任意名
  Hostname ElasticIP
  User ec2-user
  IdentityFile ~/.ssh/作成したkeyペア.pem
```
以下でssh接続する
`ssh 任意名`

#### Nginxを起動する
- yumをアップデート　`sudo yum -y update`
- nginxインストール
- Nginx起動
- インスタンス再起動時の自動起動

### ブラウザで表示の確認
```
http://Elastic IPアドレス
```
`Welcome to nginx!`が表示されることを確認する
【2025年02月版】Ubuntu で ディスクを追加して、論理ディスクのサイズを拡張するメモ

# はじめに

Ubuntu のディスク容量が気がついたら足りなくなりそうだったので容量を拡張したい。。。

論理ディスクに、ディスクを追加して拡張するメモ

# 環境

- 今の `/dev/sda` がいっぱいになりそう
- ファイルシステムは `ext4`
- ディスクを追加したら、`/dev/sdb` として認識されている

```terminal
$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0    8G  0 disk 
├─sda1                      8:1    0    1M  0 part 
├─sda2                      8:2    0  1.8G  0 part /boot
└─sda3                      8:3    0  6.2G  0 part 
  └─ubuntu--vg-ubuntu--lv 252:0    0  6.2G  0 lvm  /
sdb                         8:16   0    8G  0 disk 
sr0                        11:0    1  2.6G  0 rom  

$ sudo pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <6.25g    0 

$ sudo vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  ubuntu-vg   1   1   0 wz--n- <6.25g    0 

$ sudo lvs
  LV        VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <6.25g            
```

# 論理ディスクの拡張手順

1. 物理ボリュームの追加
1. ボリュームグループへの物理ボリュームの追加
1. 論理ディスクを拡張
1. ファイルシステムを拡張

## 物理ボリュームの追加

```terminal
$ sudo pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <6.25g    0 

$ sudo pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

$ sudo pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <6.25g    0 
  /dev/sdb             lvm2 ---   8.00g 8.00g
```

## ボリュームグループへの物理ボリュームの追加

```terminal
$ sudo vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  ubuntu-vg   1   1   0 wz--n- <6.25g    0 

$ sudo vgextend ubuntu-vg /dev/sdb
  Volume group "ubuntu-vg" successfully extended

$ sudo vgs
  VG        #PV #LV #SN Attr   VSize  VFree 
  ubuntu-vg   2   1   0 wz--n- 14.24g <8.00g
```

## 論理ディスクを拡張

```terminal
$ sudo lvs
  LV        VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <6.25g    
  
$ sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
  Size of logical volume ubuntu-vg/ubuntu-lv changed from <6.25 GiB (1599 extents) to 14.24 GiB (3646 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.
  
$ sudo lvs
  LV        VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- 14.24g        
```

## ファイルシステムを拡張

```terminal
$ sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 3733504 (4k) blocks long.

$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
 :
 :
/dev/mapper/ubuntu--vg-ubuntu--lv   14G  4.8G  8.6G  36% /
 :
 :
```

xfsとかなら

```terminal
$ sudo xfs_growfs /
```

# さいごに

かんたんでしたね
ALFA: LLMの質問力を強化する新たなフレームワーク

# **Aligning LLMs to Ask Good Questions: A Case Study in Clinical Reasoning**

今回は、最新の研究成果である **"Aligning LLMs to Ask Good Questions: A Case Study in Clinical Reasoning"** という論文をご紹介します。本研究では、大規模言語モデル（LLM）が不確実な状況下で適切な質問を行えるようにするための新しいフレームワーク **ALFA (ALignment via Fine-grained Attributes)** を提案し、臨床診断におけるLLMの質問能力向上に取り組んでいます。

---

## **1. 論文情報**
- **タイトル**: Aligning LLMs to Ask Good Questions: A Case Study in Clinical Reasoning  
- **リンク**: [arXiv:2502.14860](http://arxiv.org/abs/2502.14860)  
- **発表日**: 2025年2月20日  
- **著者**: Shuyue Stella Li, Jimin Mun, Faeze Brahman, Jonathan S. Ilgen, Yulia Tsvetkov, Maarten Sap  
- **所属**: University of Washington, Carnegie Mellon University, Allen Institute for AI  

---

## **2. 背景と目的**

### **LLMの情報取得能力の課題**
近年のLLMは多くの領域で優れた性能を発揮しているものの、**「追加情報を取得するための質問をする能力」** には大きな課題が残っています。  
特に、医療や法律などの専門分野では、不確実な状況下で適切な質問を行うことが求められます。

| **問題点** | **影響** |
|------------|-------------|
| LLMが必要な情報の不足を正しく認識できない | 必要な情報を得られず、診断や意思決定の精度が低下する |
| 質問の質が低い | 得られる情報が不完全になり、誤診や不要な検査につながる |

例えば、医師は診察の際に適切な質問を行うことで診断の精度を向上させますが、現行のLLMはこのプロセスを十分に再現できていません。

### **ALFAの目的**
LLMが「良い質問」を生成できるようにするため、以下の3つのステップからなる **ALFAフレームワーク** を提案します。

1. **質問の属性を分解（Decomposition）**: 質問の質を6つの具体的な要素に分解  
2. **カウンターファクチュアルデータの生成（Synthesis）**: 質問のバリエーションを生成し、対比学習を行う  
3. **LLMの最適化（Alignment）**: DPO（Direct Preference Optimization）やPPO（Proximal Policy Optimization）を活用し、質問能力を向上  

---

## **3. ALFAの技術詳細**

### **(1) 質問の属性を分解**
LLMの質問能力を向上させるため、質問の品質を6つの属性に分解。

| **カテゴリ** | **属性** | **説明** |
|-------------|------------|--------------------------|
| **一般的な質問品質の属性** | 明瞭性 (Clarity) | 質問が曖昧でなく、簡潔で分かりやすいか。 |
|  | 焦点 (Focus) | 具体的な情報を求める質問になっているか。 |
|  | 回答可能性 (Answerability) | 受け手が適切に答えられる形になっているか。 |
| **臨床診断に特化した属性** | 医学的正確性 (Medical Accuracy) | 医学的に正しい内容か。 |
|  | 診断関連性 (Diagnostic Relevance) | 診断に必要な情報を引き出せる質問になっているか。 |
|  | 診断バイアス回避 (Avoiding DDX Bias) | 誘導的な質問や偏った質問になっていないか。 |

---

### **(2) LLMの最適化**
**DPO（Direct Preference Optimization）とPPO（Proximal Policy Optimization）を活用し、ペアワイズ学習を実施**。

| モデル | 診断エラー削減率 | Win-rate（LLM評価） |
|--------|---------------|--------------------|
| **Base Model** | 0% | 50.0% |
| **SFT（Fine-tuning）** | 20.3% | 58.2% |
| **ALFA-DPO** | 56.6% | 64.4% |
| **ALFA-PPO** | 54.2% | 65.1% |

- **診断エラーの削減**: **従来のSOTAモデルと比較して、診断エラーを56.6%削減**  
- **質問の品質評価（Win-rate）**: **GPT-4oによる評価で64.4%の確率でALFAモデルの質問が優れていると判断**  

---

## **4. 今後の展望**
- **医療現場での導入に向けた倫理的課題**
- **医療以外の分野（法律・金融）への応用**
- **バイアスを減らし、公平な質問を生成する手法の開発**

---

## **まとめ**
ALFAは、LLMの質問能力を向上させる画期的なフレームワークであり、診断精度の向上を実証しました。今後、さらなる応用が期待されます。

---

今後の研究では、**ALFAの改良として、質問の文脈理解能力を向上させるための追加の学習手法（例えば、マルチモーダル学習や強化学習の応用）** が検討されるべきでしょう。
【マイナポータル】病院受診履歴・金額が見れる、、

マイナポータルにログインしてすると、今まで支払った医療費が閲覧できる
処方された薬も確認できる！

`トップページ`→`健康保険証`→下の方にスクロール→`関連記録`→`医療費`/`薬`  

感動の投稿
【OCI】インスタンス作成時にcloud-initからsystemdのカスタムサービスを設定する【リソースマネージャ】

# systemdのカスタムサービス

Linuxで特定のタスクを自動的に実行するためのユーザー定義のサービスです。これにより、アプリケーションやスクリプトをシステム起動時や特定の条件下で自動的に開始・停止できます。

要するに、`systemctl start nginx`などのコマンドでNginxを操作できるのと同じように、任意のサービスを追加して利用できるということです。

# Terraformでcloud-initを設定

コンピュートインスタンスのmetadataブロックでスクリプトファイルを指定します。

```hcl:main.tf
resource "oci_core_instance" "this" {
  count               = var.env == "develop" ? 1 : 2
  availability_domain = var.availability_domain
  compartment_id      = var.compartment_id_sub
  display_name        = "${var.name}-${count.index}"
  shape               = var.shape

  shape_config {
    ocpus         = var.ocpu
    memory_in_gbs = var.memory
  }
  source_details {
    source_id   = var.source_id
    source_type = var.source_type
  }
  create_vnic_details {
    nsg_ids = [
      var.security_group
    ]
    subnet_id = var.subnet_id
  }
  metadata = {
    ssh_authorized_keys = var.ssh_keys
    user_data           = base64encode(file("${path.module}/userdata/setStartup.sh"))
  }
}
```

# カスタムサービスを作成するスクリプト

シェルスクリプトでは、カスタムサービスの設定ファイル(startup.service)と、そのカスタムサービスが実行するシェルスクリプト(startup.sh)を作成しています。

こうしておけば、インスタンスが(再)起動した際に、startup.shが自動で実行されます。

(なお、カスタムサービスの設定ファイルに関する詳細は、各自で調べてみてください。)

```bash:setStartup.sh
#!/bin/bash

echo "[Unit]
Description=Startup Script
After=network-online.target

[Service]
ExecStart=/usr/local/bin/startup.sh
Restart=always
RestartSec=5 

[Install]
WantedBy=multi-user.target" > /etc/systemd/system/startup.service

echo "#!/bin/bash

dnf update  

dnf install nginx -y 
systemctl enable nginx
systemctl start nginx

firewall-offline-cmd --add-port=80/tcp
firewall-cmd --reload" > /usr/local/bin/startup.sh

sudo chmod +x /usr/local/bin/startup.sh
sudo systemctl daemon-reload
sudo systemctl enable startup.service
sudo systemctl start startup.service
```
【2025年02月版】Zabbix Agent 2 のインストール メモ

# はじめに

Ubuntu 24.04 に Zabbix Agent 2 をインストールするメモ

# インストール方法

## リポジトリを追加

```terminal
$ sudo -s
# wget https://repo.zabbix.com/zabbix/7.2/release/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.2+ubuntu24.04_all.deb
# dpkg -i zabbix-release_latest_7.2+ubuntu24.04_all.deb
# apt update
```

## Agent のインストール

```terminal
# apt install zabbix-agent2
```

## Agent の Plugin のインストール

```terminal
# apt install zabbix-agent2-plugin-mongodb zabbix-agent2-plugin-mssql zabbix-agent2-plugin-postgresql
```

## Agent の設定

`/etc/zabbix/zabbix_agent2.conf` を編集する。

以下の内容をZabbixサーバのIPに変更する。冗長化された複数サーバであればカンマ区切りで記述する。

```
Server=127.0.0.1
```

```
ServerActive=127.0.0.1
```

## Agent のサービス化と起動

```terminal
# systemctl restart zabbix-agent2
# systemctl enable zabbix-agent2
```

# リンク

- [Zabbix - Get Zabbix](https://www.zabbix.com/download?zabbix=7.2&os_distribution=ubuntu&os_version=24.04&components=agent_2&db=&ws=)
  - 選択したプラットフォームに合わせて手順が表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/cb9548f6-0725-4cbf-84e0-1ec675ae33cd.png)

# さいごに

かんたんでしたね
windowsのvagrant、i686は32bit。64bitはAMD64。

# 要約

- i686は32bitCPUだが、64bitのwindowsにおいて、vagrantのi686バージョンは普通にインストールできてしまう
- できてしまうが、boxイメージによってはvagrant upに失敗する
- boxイメージによっては普通に動くので、間違えてしまうと気づきにくい

# 経緯（前書き）

要約だけで情報としては十分だと思いますが、同様事象を検索したときヒットしやすいように、経緯も書いておきます。

# 経緯

## 1. はまる

vagrantを最新版にすることにした
windowsの選択肢にはAMD64とi686があった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282159/f7b655f8-800b-4125-b26d-a83554ace50a.png)
当時の私は、特に意識することなくi686を選んだらしい←←←
開発環境で使っていたvagrantはubuntu20.04で、これはvagrant upできた
折角なのでubuntuを最新版（24.04）にすることにした

```
旧：config.vm.box = "ubuntu/focal64"
新：config.vm.box = "bento/ubuntu-24.04"
```
vagrant upが失敗する。

```
The box you're attempting to add doesn't support the provider you requested. Please find an alternate box or use an alternate provider.
Double-check your requested provider to verify you didn't simply misspell it.

Name: bento/ubuntu-24.04
Address: https://vagrantcloud.com/api/v2/vagrant/bento/ubuntu-24.04
Requested provider: virtualbox (i386)
```

後から見返すと、ここにi386の文字があることでおかしいと気づくべきだったかも。

## 2. 試行錯誤的な

vagrant up  --debug などするうちに、
「CPUがi386と判定されてるんじゃね？」と思い至った。

そしてぐぐっていく。

```
config.vm.box_architecture = "amd64"
```

とすることで強制的に64bitCPUと判定させることができるらしい。
これによりエラーメッセージは出なくなったが、構築中に止まったりするようになった。
これでは実用に耐えない。

## 3. こたえ

原因はvagrantのバグで最新版では直ってる。とかないかなあ。
とvagrantのダウンロードサイトを訪れた
なんやかんやで、

- i686は32bitである
- 自分がインストールしたのはi686であった

と気づいた。

確認方法は

- 私はPC単位でインストーラを保存しているので、インストーラのファイル名で気付けた。
- ほか、i686であれば32bitアプリなので、インストールフォルダがprogram filex(x86) であることでも確認できる。

AMD64版をダウンロード、インストール、windows再起動、vagrant up
同じエラーが出た。
vagrantのi686版は32bitアプリなので、これが残ったまま64bitアプリであるAMD64版をインストールすると、共存してしまっていた。
i686版をアンインストール、windows再起動、vagrant up
成功👍

# ポエム

言い訳をするなら、windows＝intel＝i386,i486・・・という古い感性に引きずられたのだと思う

# 参考資料

CPUのアーキテクチャの違いまとめ（x86/x64/x86_64/AMD64/i386/i686とはなんなのか？）
https://blog.framinal.life/entry/2020/04/22/041548