OmniAICreator/Qiita-1.07M huggingface dataset:
画像の拡張子まとめ


## はじめに
画像ファイルの拡張子について、いまいち理解していないまま進んでいたので、ここでおさらいとして記録を残す。

## 画像ファイル拡張子一覧

### JPEG（.jpg .jpeg）
- **意味**：Joint Photographic Experts Group
- **特徴**:
    - 非可逆圧縮（品質を損なう圧縮）
    - 写真やフルカラーの画像に適している
    - 比較的小さいファイルサイズ
    - 高い圧縮率でファイルサイズを抑えられるが、圧縮率が高いほど画質が劣化する

### PNG（.png）
- **意味**：Portable Network Graphics
- **特徴**:
    - 可逆圧縮（品質を損なわない圧縮）
    - 透過が必要な画像やウェブ画像に適している
    - JPEGよりファイルサイズが大きいことが多い
    - 透過サポート、アルファチャンネル対応

### GIF（.gif）
- **意味**：Graphics Interchange Format
- **特徴**:
    - 可逆圧縮
    - アニメーション、簡単なイラストやアイコン
    - 小さいファイルサイズ
    - アニメーションサポート、256色までのカラーパレット

### SVG（.svg）
- **意味**：Scalable Vector Graphics
- **特徴**:
    - 可逆圧縮（XMLベース）
    - ベクター画像（アイコン、ロゴ、グラフなど）
    - 小さいファイルサイズ
    - 無限に拡大縮小可能、ウェブでの使用に最適、テキストとして編集可能

### WEBP（.webp）
- **意味**：Web Picture Format
- **特徴**:
    - 可逆圧縮および非可逆圧縮の両方をサポート
    - ウェブ画像に適している
    - JPEGやPNGよりファイルサイズが小さいことが多い
    - 高い圧縮率で画質を保持、透過サポート

### ICO（.ico）
- **意味**：Icon
- **特徴**:
    - 可逆圧縮
    - ウェブサイトやアプリケーションのアイコン
    - 小さいファイルサイズ
    - 複数の解像度を含むことが可能、Windowsアイコン形式

### PDF（.pdf）
- **意味**：Portable Document Format
- **特徴**:
    - 可逆圧縮および非可逆圧縮の両方をサポート
    - ドキュメント、グラフィックデザイン、印刷
    - 可変なファイルサイズ
    - テキスト、画像、ベクターを含むことが可能、広範な互換性

### HEIF（.heif .heic）
- **意味**：High Efficiency Image Format
- **特徴**:
    - 非可逆圧縮
    - 高品質画像、Appleデバイスで広く使用
    - JPEGより小さいファイルサイズ
    - 高い圧縮率と高品質、複数の画像や動画フレームを含むことが可能

### PSD（.psd）
- **意味**：Photoshop Document
- **特徴**:
    - 可逆圧縮
    - Adobe Photoshopでの画像編集
    - 大きいファイルサイズ
    - レイヤー、マスク、ベクター、テキストなどの編集可能な要素を保持

### AI（.ai）
- **意味**：Adobe Illustrator
- **特徴**:
    - 可逆圧縮（PDFベース）
    - Adobe Illustratorでのベクター画像編集
    - 小から大のファイルサイズ
    - ベクター画像、無限に拡大縮小可能、印刷物やウェブ用グラフィックデザインに最適

### TGA（.tga）
- **意味**：Truevision Graphics Adapter
- **特徴**:
    - 可逆圧縮および非圧縮
    - ゲーム開発、3Dアプリケーション
    - 大から中のファイルサイズ
    - 透過サポート、高品質画像

### AVIF（.avif）
- **意味**：AV1 Image File Format
- **特徴**:
    - 非可逆圧縮および可逆圧縮
    - ウェブ画像、高品質写真、ストレージ効率が求められる画像
    - PEGやPNGよりも小さいファイルサイズ、WEBPと同等かそれ以下のサイズ
    - 高校率圧縮、高画質、透過サポート、HDRサポート、ライセンスフリー


## 参考資料
https://www.sungrove.co.jp/image-file/
DroidKaigi2024で気になる登壇まとめ：後半

# はじめに
先日、DroidKaigi2024の初日に開催される登壇で気になるものをピックアップしました。

https://qiita.com/YuukiYoshida/items/06e5e22166af7b5c1bd3

本日は上記の続きで、二日目の登壇で気になる内容をピックアップしたいと思います！

# アプリをリリースできる状態に保ったまま段階的にリファクタリングするための戦略と戦術

https://2024.droidkaigi.jp/timetable/690441/

こちら言わずと知れたYuki Anzaiさんの登壇ですね。
リファクタリングの際は歴史の長さに比例して、そのプロダクトの動作に影響を与えずにより良いものへ改修していくことの難しさが上がっていきますよね。
そんな状況下において、最適なリファクタリングフローをご自身の経験の中からお話いただけるということで、非常に楽しみな内容となっています。

# Google Sign-inの移行から始めるCredential Manager活用

https://2024.droidkaigi.jp/timetable/694563/

こちらはタイトルにある通り、Google Sign-inに関する実装を共有いただける登壇となっています。
今後のログイン認証処理はCredential Managerを使用する形がデフォルトとなっていくことを考え、ご自身のプロダクトでGoogleなどのログイン認証処理を行っている方にはとてもささる内容になっているかと思います。

# 2024年最新版！Android開発で役立つ生成AI徹底比較

https://2024.droidkaigi.jp/timetable/693387/

まさに先日Geminiに関して記事にしましたが、やはり日常的な業務をより効率よく対応していく為、AI事情はとても気になります。
各AIの強みやそれぞれの強みなどまとめてくださっているようで、AIを日常的に使用していない方こそぜひ視聴して欲しい登壇かと思います。

# 2Dアプリに3Dの輝きを

https://2024.droidkaigi.jp/timetable/693695/

Androidアプリ単独の開発において、3Dというワードを耳にすること自体少ないですよね。
3DというとUnityやUnreal Engineをイメージしてしまいますが、どこまで3D化できるのか気になるところですので、アニメーションが好きな方は是非視聴していただくと良いかと思います。

# 実践！難読化ガイド

https://2024.droidkaigi.jp/timetable/692870/

最近何かとトラブルの種である暗号化ですが、R8も含め暗号化を深掘りしてご説明いただけるようで、あまり普段暗号化部分を調整しない方は特に一度聞いておくと安心かと思います。

# さいごに
今回のDroidKaigiも豊作ですね、本当に学びの多い時間になりそうです！
Elixir 依存モジュールの "~>" 演算子について

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回は依存モジュールの "~>" operatorについて学んだことをまとめます。

# 目的
mix.exs内のdepsにおける "~>" の意味を理解すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/00ff878c-970c-0b21-c68c-1a35b7a3fe4d.png)


## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.16.2-otp-26
Erlang v27.0

# 前提
mix.exsのdepsは依存モジュール（ライブラリ）のこと。
ライブラリは https://hex.pm/ で探すことができます。

例えばライブラリとしてjasonを使用したいとします。

この場合は https://hex.pm/packages/jason にアクセスすることで、下記の内容が読み取れます。

- mix.exs内のdepsに`{:jason, "~> 1.4"}`を追加し、`mix deps.get`する

- jasonを使用するにはdecimalが依存モジュールとして必要（下記画像のDependencies欄）

- 補足として、jasonはecto, phoenix, postgres等を使用するために必要（下記画像のDependents）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/d94c5715-19ef-e515-ecbb-cd98c5263c4e.png)

# 結果
"~>"はバージョン指定のための演算子。
例えば`{:jason, "~> 1.4"}`は、`>= 1.4.0 and < 1.5.0`のバージョンを指定していることを示します。

それぞれの意味は以下の通りです。

|演算子  |バージョン指定範囲  |
|---|---|
|~> 2.0.0| >= 2.0.0 and < 2.1.0 |
|~> 2.1.2| >= 2.1.2 and < 2.2.0 |
|~> 2.1.3-dev| >= 2.1.3-dev and < 2.2.0|
|~> 2.0| >= 2.0.0 and < 3.0.0|
|~> 2.1| >= 2.1.0 and < 3.0.0|


https://hexdocs.pm/elixir/1.16.2/Version.html




# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian




[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！
robloxでassistant その148

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
LogServiceを使え。

# サンプルコード

```
local LogService = game:GetService("LogService")
local messageLabel = Instance.new("Message")
messageLabel.Parent = workspace
local function onMessageOut(message, messageType)
	messageLabel.Text = "The message was " .. message .. " and the type was " .. tostring(messageType)
end
LogService.MessageOut:Connect(onMessageOut)


```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e621ba4a-db2a-4f51-0aa4-ffc8d40483d7.png)


以上。
【JavaSilver】繰り返し文と繰り返し制御文

# 繰り返し文と繰り返し制御文		
		
* for(final var val : array) {}	
varに対してfinal修飾子を付与してループ内の再代入を禁止しているが、問題ない。
		
* do-while文で中カッコを省略した場合はdoの後ろには1つしか文を記述できない。	

### for文
for(初期化文; 条件文; 更新分) {}

* for(int i = 0; i < 3; i++) {}
・初期化文で複数の変数を宣言する場合、変数は同じ型でないとダメ。
・for文内で宣言した変数は、for文の外では使えない。
・複数記述できるのは、初期化文と更新文の2つ。
* for 文で使用する初期化式、条件式、変化式は不要であればそれぞれ省略することができます。

```java:初期化式省略
int i = 0;
for (; i < 2; i++) {
    System.out.println("i=" + i);
}
```
```java:条件式省略
int sum = 0;
for (int i = 1; ; i++){
  sum += i;
  if (sum > 5){
    break;
  }
}
System.out.println(sum);
```
```java:変化式省略
int i = 1;
for (; i < 100;){
  System.out.println(i);
  i *= 3;
}
System.out.println(i);
```
```java:全部省略
int i = 1;
for (;;){
  System.out.println(i);
  i *= 3;
  if (i > 100){
    break;
  }
}
System.out.println(i);
```

### 拡張for文	
for(型 変数名 : 配列またはコレクション) {}

* continue文を配置できるのは繰り返し文内だけ。(if文には使用できない)	
		
* Stirng valid = “true”;	
if(valid) {
条件式の判定はboolean型の値(true/false)で行う。
validはString型のため、コンパイルエラーが発生。
Digispark(ATTiny85) Arduino開発環境にてLチカ [2024年版]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89145/8feb0849-bfde-a357-605b-5a1b3b7ffbbb.png)

このマイコンについて現状、ウェブに出回ってる知見が古いので最新版を投稿します。

例として、この記事（[Digispark製AtTiny85のセットアップ #Arduino - Qiita](https://qiita.com/komajo/items/f8bae06add3c494988d1)）ですが、`http://digistump.com/package_digistump_index.json`を入力しても必要なファイルがダウンロード出来ません。

[このフォーラム](https://forum.arduino.cc/t/digistump-digispark-no-longer-available/1234095/6)によると、以下の内容が書かれています。

> Hi @TenoTrash. Unfortunately the manufacturers of the original DigiSpark board abandoned the users years ago. Since then the support software they provided has gradually decomposed due to bit rot, as you noticed.
> 
> Fortunately the amazing Arduino community picked up the slack by providing well maintained unofficial support software. The current recommendation is to use the excellent ATTinyCore boards platform, which has DigiSpark support.
> 
> You can learn how to install ATTinyCore from this documentation page:
> 
> https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md 477
> 
> Give it a try and let us know if you have any problems or questions.

Digispark基板のメーカーが数年前にユーザーへのサポートを停止して、サポートのためのソフトウェアも劣化しつつあるそうです。

ですが、Arduinoのコミュニティでオフィシャルではないサポートのためのソフトウェアが開発されました。現在おすすめされているのは、ATTinyCoreボードのプラットフォームだそうです。

詳しくは[このGitHubリポ](https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md)に書かれているそうですが、方法を述べます。

1. Arduino IDEを開く
1. WindowsではFile->Preferences, MacではArduino->Preferences を選択し、 `http://drazzy.com/package_drazzy.com_index.json`　のURLを "Additional Boards Manager URLs"に追加する
2. Tools -> Boards -> Boards Manager...
3. "ATTinyCore by Spence Konde" を選択し、"Install" をクリック。
4. Attiny85を使っている場合は、これで、Tools -> Boards -> ATTinyCore -> ATtiny 85 (Micronucleaous/Digispark)を選択することでボードを選択できる。

Lチカのコードは以下です。

```c
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(0, OUTPUT); //LED on Model B
  pinMode(1, OUTPUT); //LED on Model A   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(0, HIGH);    // turn the LED off by making the voltage HIGH
  digitalWrite(1, HIGH); 
  delay(500);               // wait for a second

  digitalWrite(0, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(1, LOW); 
  delay(500);               // wait for a second
}
```

書き込み時に一点注意です。

> Please plug in the device (will time out in 60 seconds) ...

と表示されたら、デバイスをUSBポートに差し込んで下さい。既に差し込まれている場合は、一旦抜いてまた差し込んで下さい。こうしないと上手くいかないようです。
robloxでassistant その147

#  概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
CollectionServiceを使え。

# サンプルコード

```
print(game["Run Service"]:IsClient(), script:GetFullName())
local CS = game.CollectionService
CS:GetInstanceAddedSignal("test"):Connect(function(a)
	print("added", a)
end)
CS:GetInstanceRemovedSignal("test"):Connect(function(a)
	print("removed", a)
end)
print("a")
wait(1)
print("b")
Instance.new("Part", workspace):AddTag("test")
wait(1)
game.Workspace.Part:Destroy();

```

# 実行結果

```
  10:11:12.027  Hello world!  -  サーバー
  10:11:12.896  true ReplicatedFirst.LocalScript  -  クライアント - LocalScript:4
  10:11:12.897  a  -  クライアント - LocalScript:12
  10:11:13.375  Hello world!  -  クライアント
  10:11:14.083  b  -  クライアント - LocalScript:14
  10:11:14.084  added Part  -  クライアント - LocalScript:7
  10:11:15.087  removed Part  -  クライアント - LocalScript:10
```

以上。
【Laravel】Illuminateにある主要メソッド Mail編

### 言語
- Laravel8

## Illuminateとは
- Laravelが提供する様々なサービスやコンポーネントを構成するための基盤を提供している。
- サービスやコンポーネントは``Illuminate``名前空間内に整理されている

### どこにあるか？
**``プロジェクトディレクトリ\vendor\laravel\Framework\src\Illuminate\~``**

## Illuminate\Mail
- メール送信機能を提供するクラスがある。

### ``to($users)``
- メールの送信先アドレスを設定
    ```Laravel
     Mail::to('example@example.com')->send(new ExampleMail());
     ```

### ``cc($users)``
- メールのCC（カーボンコピー）祖往診先アドレスを設定
    ```Laravel
     Mail::to('example@example.com')->cc('cc@example.com')->send(new ExampleMail());
     ```

### ``bcc($users)``
- メールのBCC（ブラインドカーボンコピー）送信先アドレスを設定
    ```Laravel
     Mail::to('example@example.com')->bcc('bcc@example.com')->send(new WelcomeMail());
     ```

### ``send($view, array $data = [], $callback = null)``
- メールを送信
    ```Laravel
     Mail::send('emails.test', ['name' => 'qiita'], function ($message) {
         $message->to('example@example.com')->subject('Hello');
     });
     ```

### ``queue($view, array $data = [], $callback = null)``
- メールをキューに追加して非同期で送信
    ```Laravel
     Mail::queue('emails.welcome', ['name' => 'qiita'], function ($message) {
        $message->to('example@example.com')->subject('Hello');
    });

     ```

### ``later($delay, $view, array $data = [], $callback = null)``
- 指定した遅延時間後にメールをキューに追加して送信
    ```Laravel
     Mail::later(now()->addMinutes(10), 'emails.test', ['name' => 'qiita'], function ($message) {
        $message->to('example@example.com')->subject('Hello');
    });

     ```

### ``raw($text, $callback)``
- プレーンテキストのメールを送信
    ```Laravel
     Mail::raw('This is a plain text email', function ($message) {
        $message->to('example@example.com')->subject('Plain Text Email');
    });

     ```

### ``html($html, $callback)``
- HTML形式のメールを送信
    ```Laravel
     Mail::html('<h1>HTML Email</h1>', function ($message) {
        $message->to('example@example.com')->subject('HTML Email');
    });
    ```

## 使用例

```laravel:コントローラー
use Illuminate\Support\Facades\Mail;
use App\Models\User;
use App\Mail\WelcomeMail;

class UserController extends Controller
{
    public function sendWelcomeEmail()
    {
        $user = User::find(1);
        Mail::to($user->email)->send(new WelcomeMail($user));
    }
}
```

```laravel:app\Mail\WelcomeMail.php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class WelcomeMail extends Mailable
{
    use Queueable, SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->view('emails.welcome')->with(['user' => $this->user]);
    }
}
```

```laravel:resource\views\emails\welcome.blade.php
<body>
    <h1>Hello</h1>
    <p>Welcome to our platform!</p>
</body>
```

## 私のIlluminate関連記事

https://qiita.com/Jisu/items/47361c5c1a80ad71655c

https://qiita.com/Jisu/items/c92501a4595da0e6e2c3

https://qiita.com/Jisu/items/a3eb5dbb60e77431afa9

https://qiita.com/Jisu/items/2e642698c3ce9b141c2f

https://qiita.com/Jisu/items/133c47cd2aea42a1dec7
CloudFlareにデプロイするためのRemixプロジェクト ESlintを導入してみる

## 概要

今までさんざんいじってきたRemixのCloudflareテンプレートのRemixプロジェクトでESlintが動くようにしてみる。

## 前提

Cloudflareテンプレートを指定してRemixのアプリケーションが作成されていること。

説明に使うコードの時系列は下記の後になる。

https://qiita.com/miriwo/items/bde7f5ec4c7f1e9f34b1

ちなみにESlintはPHPLaravelでいうところのLaraStan（PHPStan）的な立ち位置の静的解析ツールらしい。

## 方法

1. 実はデフォルトでESlint関連パッケージはインストールされている、package.jsonの`devDependencies`にESlint系のパッケージが存在していることを確認

    ```package.json
    "devDependencies": {
      "@typescript-eslint/eslint-plugin": "^6.7.4",
      "@typescript-eslint/parser": "^6.7.4",
      "eslint": "^8.38.0",
      "eslint-import-resolver-typescript": "^3.6.1",
      "eslint-plugin-import": "^2.28.1",
      "eslint-plugin-jsx-a11y": "^6.7.1",
      "eslint-plugin-react": "^7.33.2",
      "eslint-plugin-react-hooks": "^4.6.0",
    },
    ```

1. 念の為下記を実行してパッケージをインストール

    ```sh
    npm install
    ```

1. `.eslintrc.cjs`というファイルがプロジェクトルートディレクトリに存在することを確認
1. プロジェクトルートディレクトリで下記を実行してESlintを実行し、まずはコマンドが問題なく通ることを確認

    ```sh
    npm run lint
    ```

1. ちゃんとエラーが検出されるか確認するため`app/root.tsx`を下記のように修正（使用していない定数`hoge`を定義）

    ```app/root.tsx
    import {
      Links,
      Meta,
      Outlet,
      Scripts,
      ScrollRestoration,
    } from "@remix-run/react";
    
    export function Layout({ children }: { children: React.ReactNode }) {
      const hoge = "hoge";
      return (
        <html lang="en">
          <head>
            <meta charSet="utf-8" />
            <meta name="viewport" content="width=device-width, initial-scale=1" />
            <Meta />
            <Links />
          </head>
          <body>
            {children}
            <ScrollRestoration />
            <Scripts />
          </body>
        </html>
      );
    }
    
    export default function App() {
      return <Outlet />;
    }
    ```

1. `$ npm run lint`を実行して下記の様にエラー検出されれば完了（TypeScriptのバージョン起因の警告が出ているが警告レベルなので一旦無視している）

    ```
    $ npm run lint
    
    > lint
    > eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .
    
    =============
    
    WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree.
    
    You may find that it works just fine, or you may not.
    
    SUPPORTED TYPESCRIPT VERSIONS: >=4.3.5 <5.4.0
    
    YOUR TYPESCRIPT VERSION: 5.4.5
    
    Please only submit bug reports when using the officially supported version.
    
    =============
    
    /Users/shun/workspace/02_study/remix/todo-cloudflare-d1/app/root.tsx
      10:9  error  'hoge' is assigned a value but never used  @typescript-eslint/no-unused-vars
    
    ✖ 1 problem (1 error, 0 warnings)
    ```

※確認が終わったらroot.tsxの`const hoge = "hoge";`の記載は削除して元に戻しておくこと。

## 参考文献

https://zenn.dev/kyrice2525/articles/article_tech_006
Alertの扱い方

Ankoに用意されているアラートダイアログの使い方をメモする。

ダイアログの表示はこれだけで可能。
```kotlin
alert(
    "テキストテキスト",
    "タイトル"
) {
    okButton { }
}.show()
```

ボタンを押したときの処理はこのように記述することで可能。
```kotlin
alert(
    "テキストテキスト",
    "タイトル"
    ) {
    okButton { toast("OK clicked") }
    cancelButton {}
}.show()
```
以下のように書いても同じ表示が可能。`neutralPressed`は3つ目のボタンを用意できる。
```kotlin
alert {
    title = "Title"
    message = "テキストテキスト"
    yesButton { }
    noButton { }
    neutralPressed("ボタン3つ目") { toast("Third") }
}.show()
```
`customView`を使用すれば`EditText`も設置できるみたい。

#### 参考

https://qiita.com/rkowase/items/fee13d02beed92de4767
The Goal of the AUTOSAR Adaptive Platform.

This article should be posted to arXiv, IEEE or JSAE.
Este artículo debe publicarse en arXiv, IEEE o JSAE.
https://www.jsae.or.jp

This article is just a table of contents. More will be added in due course.
Este artículo es una tabla de contenidos. Los agregaré secuencialmente.

This article is not completed. I will add some words in order.
# Before AUTOSAR

## ECU

## C language

## UNIX, Linux

## CAN

### CAN FD

### CAN XL

## OSEK

### OIL

### NM

### COM

## Diagnostics

### XCP

# Autosar Classic Platform

## SW-C

## Runnable

## Task table

## Memory Protection

## Timing Protection

## Multi core

### Heterogenius
# Adaptive Platform
## Before Adaptive platform
### Genevi:::note alert

## Automotive Ethernet

# Foundation

## Abstract Platform

In the vector products, PREEVISION and CANdelastudio can be made autosar CP and AP input definitions. These are made somoe source codes.

# References.

Understanding OSEK from the Figures.
https://qiita.com/kaizen_nagoya/items/f87a7ff5aeb63803a022

Classic Platform Release Overview, AUTOSAR No.0 ,R23-11, CP
https://qiita.com/kaizen_nagoya/items/8468435185e109189ead

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Adaptive Platform Release Overview, AUTOSAR(75) 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7


This article is an individual impression based on my individual experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.01 初稿 　20240720
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
DatadogでSSLサーバー証明書の残り日数をモニタリング

## 背景
サーバーの運用で忘れてはいけないのがSSLサーバー証明書の年間更新。
無料の Let’s Encrypt (DV認証) なら自動更新を設定しておけば安心。
OV認証の場合は、年間更新費用の支払いと証明書の差し替えがあるので時間に余裕をもって作業したい。

## 私の失敗
この度、Let’s Encrypt の自動更新が失敗していたので、Datadogでモニタリングできるとさらに安心です。ちなみにLet’s Encryptは証明書が失効する30日前のリマインドメールが届くのでありがたい。 
今回、自動更新が失敗したのは、検証用に立ち上げたDockerコンテナのWEBと対象のWEBポート番号が重複してApacheがエラーになっていたようです。そしてサーバーが動いていないと利用者からクレーム。

## Datadogで出来ること
Datadogの Synthetics モニタリングはSSLサーバー証明書の有効期限を表示してくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/953b663d-660b-a4a6-3d6c-489f251fdd59.png)

## 設定手順
Datadog > Digital Experience > New TEST > API Test

Syntheticsパラメータ設定

1. リクエストタイプは [SSL] を選びます。
2. 対象サイトとポート番号を入力したら、SSLサーバー証明書の情報を取得できるかテストします[Test Certificate]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/4a66c7bd-de76-1697-1bb8-963efd5706ba.png)

3. テスト結果から自動的にモニタリングの閾値が設定されます。
私は失効期間を[10]から[30]日に変更し、TLSバージョンは検査せず[ゴミ箱]、DNS応答時間は[3000]m秒としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/9b109dd2-a0e6-5971-82bb-0e2165c743a0.png)

4. ツール料金を削減するため検査ロケーションと検査間隔を変更しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/9ec4cee3-3aae-b3f8-1905-beaf4adaf541.png)

5. アラート通知するメールの件名と内容を記載したら作成[Create]を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/ed3ec20a-80dd-f27d-1bee-9faf76b4e09a.png)

## モニタリングの結果
私のNode-REDサイトのSSLサーバー証明書をモニタリングして有効期限まで残り18日であることがダッシュボードに表示されました。これで更新忘れによるサーバーが使えないというクレームが無くなるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/f6f03d6d-55ea-8dc6-7343-e182b7ff3b27.png)

以上、SSLサーバー証明書のモニタリング設定手順でした。
複数のテーブルをExcelで扱うときはVSTACK関数を使うべき理由

# Excel VStack の利点、ユースケース、およびベストプラクティス

## はじめに

Microsoft Excel は、データ分析や管理のための強力なツールとして広く使用されています。その中でも、VStack（垂直スタック）機能は、データの整理や分析において非常に有用な機能の一つです。本記事では、Excel VStack の利点、具体的なユースケース、そして効果的な使用方法について詳しく解説します。

## VStack とは

VStack は、複数のデータ範囲を垂直方向に結合する機能です。これにより、異なるワークシートや範囲からのデータを一つの連続したデータセットにまとめることができます。

## VStack の主な利点

### 1. データの統合と整理

VStack を使用することで、複数のソースからのデータを簡単に一つのデータセットにまとめることができます。これにより、データの全体像を把握しやすくなり、分析の効率が大幅に向上します。

### 2. 時間の節約

手動でデータをコピーペーストする代わりに、VStack を使用することで、データの結合プロセスを自動化し、時間を大幅に節約することができます。

### 3. エラーの削減

手動でのデータ操作は人為的ミスを引き起こしやすいですが、VStack を使用することで、そのようなエラーのリスクを最小限に抑えることができます。

### 4. 大量データの処理

VStack は大量のデータセットを効率的に処理することができるため、ビッグデータの分析や処理に特に有用です。

### 5. データの一貫性の維持

VStack を使用することで、異なるソースからのデータを統一された形式で結合できるため、データの一貫性を維持しやすくなります。

## VStack の具体的なユースケース

### 1. 月次レポートの統合

毎月生成される個別のレポートを、年間のまとめレポートとして一つのシートに統合する際に VStack が活用できます。

### 2. 複数店舗のデータ分析

各店舗から個別に報告されるセールスデータを、一つの包括的なデータセットにまとめる際に VStack が役立ちます。

### 3. 財務データの統合

異なる部門や子会社から提出される財務データを、全社的な財務分析のために統合する際に VStack が効果的です。

### 4. 顧客データの統合

複数のソースから収集された顧客データを、一元化された顧客データベースに統合する際に VStack が使用できます。

### 5. 時系列データの分析

異なる期間のデータを一つの連続したデータセットにまとめ、時系列分析を行う際に VStack が有用です。

## VStack 使用のベストプラクティス

### 1. データの準備

VStack を使用する前に、結合するデータセットの構造が一致していることを確認します。列の順序、データ型、フォーマットが統一されていることが重要です。

### 2. 重複データの処理

VStack 後にデータの重複が発生する可能性があるため、重複を識別し除去するプロセスを組み込むことを検討します。

### 3. データの検証

VStack 後のデータセットを慎重に確認し、すべてのデータが正しく結合されていることを確認します。

### 4. 元データの保持

VStack を使用してデータを結合する際は、元のデータセットのコピーを保持しておくことをお勧めします。これにより、必要に応じて元のデータに戻ることができます。

### 5. 自動化の活用

定期的に VStack を使用する場合は、マクロやPower Query を使用してプロセスを自動化することを検討します。

### 6. 大規模データセットの考慮

非常に大きなデータセットを扱う場合は、VStack の代わりに Power Query や SQL などのより強力なツールの使用を検討することも重要です。

## まとめ

Excel の VStack 機能は、データ分析や管理のプロセスを大幅に効率化し、より正確で包括的な分析を可能にする強力なツールです。適切に使用することで、時間を節約し、エラーを減らし、より深い洞察を得ることができます。

しかし、VStack を効果的に使用するためには、データの準備、重複の処理、結果の検証など、いくつかの重要な点に注意を払う必要があります。また、大規模なデータセットを扱う場合は、より高度なツールの使用を検討することも重要です。

Excel VStack の機能を理解し、適切に活用することで、データ分析のスキルを向上させ、より効果的な意思決定を行うことができるでしょう。データ駆動型の意思決定がますます重要になる現代のビジネス環境において、VStack は非常に価値のあるツールとなります。
LLM Observabilityについて



## LLMの一般的なユースケースについて
- チャットボット、構造化データ抽出、要約、チャットツーパーチェスなどが一般的
- 複雑なユースケースでは、LLMだけでなく、従来の機械学習システムや非機械学習ソフトウェアツールを組み合わせて使用することがある

## LLMを使用する際の課題について
- 幻覚、不正確または不適切な応答、コールの増殖、コスト、データセキュリティの問題、差別化の難しさなどがある
- プロプライエタリデータを使用する場合、LLMの応答に誤ってプロプライエタリ情報が含まれてしまう可能性がある
- LLMへのアクセスはサードパーティプロバイダー経由で行われることが多いため、APIの変更や新しいモデルの追加、新しいセーフガードの導入などにより、モデルの動作が変わる可能性がある

## LLM Observabilityとは
- アプリケーション、プロンプト、レスポンスのすべてのレイヤーに完全な可視性を提供すること

## LLM ObservabilityとML Observabilityの違い
- LLMの展開モデルは従来のMLとは大きく異なり、サードパーティプロバイダーを使用するため、モデルの内部についての可視性が低い
- ランキングではなく生成を評価するため、評価方法が根本的に異なる
- ベクターストアを使用する場合、最適な検索を妨げるユニークな課題がある
- LlamaIndexやLangChainなどのエージェントワークフローやオーケストレーションフレームワークには、異なるObservabilityアプローチが必要

## LLM Observabilityの5つの柱
1. LLM評価
   - 応答がプロンプトにどの程度よく答えているかを測定する
2. トレースとスパン
   - 複雑なワークフローにおいて、問題の原因となっているスパンやトレースを特定する
3. プロンプトエンジニアリング
   - アプリケーションのパフォーマンスを向上させる最も安価で高速かつ高レバレッジな方法
4. RAG（検索補強生成とも呼ばれる）
   - より関連性の高い情報を取り込むことでパフォーマンスを向上させる方法
5. ファインチューニング
   - 正確な使用条件により適合した新しいモデルを生成する

## アプリケーションをObservability用にセットアップする方法
- ユーザーフィードバックを収集できる場合は、フィードバックと応答を将来の分析のために保存する
- 複数のプロンプトテンプレートがある場合は、それらの間で比較する
- 検索補強生成(RAG)を使用する場合は、ナレッジベースにギャップがないか評価する
- チェーンとエージェントについては、アプリケーションが中断する場所を特定するためにスパンとトレースをログに記録する
- ファインチューニングを行う場合は、ファインチューニングに使用できるサンプルデータを見つけてエクスポートする

## まとめ
- 大規模言語モデルは、ユースケースと関心の両方で爆発的な増加を見せている
- 抽象化のために実装は比較的簡単だが、システムの複雑さのために、システムのすべての要素がどのように機能しているかを理解することが不可欠である
- 信頼性の高いLLMアプリケーションを実行するには、LLM Observabilityが必要である
Visual Studio Code の Emmet機能を使ってコードを楽に書こう

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
約1分程度で読めるので最後まで読んでもらえると幸いです。

# はじめに

コードを書くのに慣れてくると、いちいちコードを書くのが煩わしくなりませんか？
そんな時 **Visual Studio Code（以下、VSCode） の Emmet機能** を使えば、HTML等、特にWEB関連のコードを書くときに補完をしてくれるため、作業効率が格段にUPします。
騙されたと思ってぜひ一度お試しくださいませ！

https://code.visualstudio.com/docs/editor/emmet

:::note info
VSCodeのインストール手順は割愛させていただきます。
:::


# 設定方法

#### 1. VSCodeを開き、画面左下の「⚙️」 > 「設定」をクリック

![スクリーンショット 2024-07-27 20.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/b68f0f19-1713-71d6-54b6-c1a3f8354a72.png)

#### 2. 「emmet」と検索し、画面中段にある「Emmet: Trigger Expansion On Tab」にチェック

![スクリーンショット 2024-07-27 20.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/81644bae-b951-3398-2c61-3944f5497239.png)

以上になります。

# どんな事をしてくれるのか？

あるコマンドを入力後、「Tab」を押す事で良しなに補完をしてくれます。

例えば添付の様に

![20240727.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/a9c97634-3420-3d64-134e-63040cec5c34.gif)

「.」を入力して「Tab」を押すだけでdivを補完してくれたり

![20240727.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/48a21dd4-64ba-b724-33d3-6294db39d8b9.gif)

必要なリスト数を入力して「Tab」を押すとリスト関連の補完をしてくれます。
めっちゃ便利です。

# Emmet機能を使いこなしたい方向けに

https://docs.emmet.io/cheat-sheet/

チートシートも準備されています。
個人的には画面下部にある「HTML」を覚えていけば、Emmetの良さを実感いただけると考えます。

# さいごに

いかがだったでしょうか？
コードを一から書いて疲れ果てていた方の一助になれば幸いです！

# おまけ

唐突ですが弊社のご紹介もさせてください。

▼ コーポレートサイト

https://prum.jp/

▼ Wantedly求人

https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください！
ご応募お待ちしておりますー！
5行で作る画像認識AI - Google Colab × TensorFlowで簡単実装

## はじめに 
こんにちは！今回は、わずか5行のコードで画像認識AIを作る方法をご紹介します。Google ColabとTensorFlowを使用するので、環境構築の手間もなく、誰でも簡単に試すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/985fefd1-0157-ff6f-9530-84ce4f268a79.png)

## 準備

1. [Google Colab](https://colab.research.google.com/)にアクセスし、新しいノートブックを作成します。
2. 負荷状況によっては、ランタイムのタイプをGPUなどに変更してください（編集 > ノートブックの設定 > ハードウェアアクセラレータ）。

## コード

以下の5行のコードをノートブックに貼り付けて実行するだけです！

```python
import tensorflow as tf
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input, decode_predictions
model = InceptionV3(weights='imagenet')
img = tf.keras.preprocessing.image.load_img('画像のパス', target_size=(299, 299))
print(decode_predictions(model.predict(preprocess_input(tf.keras.preprocessing.image.img_to_array(img)[None, ...])), top=3))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/06181dfd-254f-ac44-b4b0-2864b216af8c.png)
犬の画像を指定したところ、Pomeranian(ポメラニアン)と認識できた

## 解説

1行目：TensorFlowをインポートします。
2行目：InceptionV3モデルと関連する関数をインポートします。
3行目：事前学習済みのInceptionV3モデルを読み込みます。
4行目：画像を読み込み、モデルの入力サイズに合わせてリサイズします。
5行目：画像を前処理し、モデルで予測を行い、結果を表示します。

## 使い方

4行目の `'画像のパス'` の部分を、実際に分類したい画像のパスに置き換えてください。例えば：

```python
img = tf.keras.preprocessing.image.load_img('/content/cat.jpg', target_size=(299, 299))
```

## 認識できる画像の例

InceptionV3モデルは多様な画像を認識できます。以下に、認識可能な画像の例をいくつか挙げます：

1. 動物：犬、猫、象、キリン、鳥など
2. 乗り物：車、自転車、飛行機、船など
3. 食べ物：ピザ、ハンバーガー、寿司、フルーツなど
4. スポーツ用品：サッカーボール、テニスラケット、スキー板など
5. 電子機器：スマートフォン、ノートパソコン、テレビなど
6. 自然風景：山、海、森、砂漠など
7. 建築物：家、高層ビル、橋、神社など
8. 日用品：椅子、テーブル、ベッド、時計など

これらは一例で、実際にはImageNetデータセットに含まれる1000種類以上のカテゴリを認識できます。

## 注意点

- インターネット接続が必要です。
- 初回実行時は、モデルのダウンロードに時間がかかる場合があります。
- 画像は、アップロードしてそのパスを指定してください。サイズを調整してください。
- モデルの認識精度は画像の品質や角度、照明条件などに影響されます。

## まとめ

たった5行のコードで、最先端の画像認識AIを使用することができました。この手法を応用すれば、さまざまな画像分類タスクに活用できるでしょう。ぜひ、自分で撮影した画像や興味のある画像で試してみてください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7515609a-18b6-9ba4-9ffa-5d9b6333934d.png)

## 参考情報

1. TensorFlow公式ドキュメント: [https://www.tensorflow.org/](https://www.tensorflow.org/)
   - TensorFlowの基本的な使い方や機能について詳しく解説されています。

2. Keras Applications: [https://keras.io/api/applications/](https://keras.io/api/applications/)
   - InceptionV3を含む、様々な事前学習済みモデルについての情報が得られます。

3. ImageNet: [https://www.image-net.org/](https://www.image-net.org/)
   - InceptionV3モデルの学習に使用されたデータセットについて知ることができます。

4. Google Colab公式サイト: [https://colab.research.google.com/](https://colab.research.google.com/)
   - Google Colabの使い方や機能について詳しく解説されています。

5. 「Convolutional Neural Networks for Visual Recognition」Stanford CS231n: [http://cs231n.stanford.edu/](http://cs231n.stanford.edu/)
   - 畳み込みニューラルネットワークと画像認識について深く学びたい方におすすめです。

これらのリソースを参考にすることで、画像認識AIについてさらに理解を深めることができます。技術の進歩は日々目覚ましいので、最新の情報もチェックしてみてください。Happy coding!
半年間で学んだ事

### 学習内容

### 職業訓練での経験

職業訓練で半年間、主にWebの技術を勉強しました。勉強した内容は以下の通りです：

- **ツール**: Photoshop, Illustrator, Figma
- **言語**: HTML, CSS, JavaScript, Java, PHP
- **CMS**: WordPress
- **データベース**: MySQL

### 前半の3ヶ月

職業訓練の前半では、HTML, CSS, JavaScriptを用いた静的な自己紹介サイトを作成しました。フロントエンドコーディングが中心でしたが、CSSのレスポンシブデザインの設計が難しく感じました。javascriptで自作でハンバーガーメニューやKVスライドなどを実装したのが勉強になったと感じてます。

### 後半の3ヶ月

後半の卒業制作では、「あわあわ温泉ぶらり」https://awa-onsen.com
というサイトをWordPressを用いて作成しました。私はバックエンド班に配属され、主にHTML, CSSでコーディングされたものをPHPのテンプレートファイルに置き換える作業を担当しました。WordPressの仕様やGitHubを用いたソースコード管理に苦労しましたが、なんとか公開まで持っていくことができました。また、16人での初めてのチーム開発でしたが、難しいことも多かったものの、チームで何かを作る楽しさが勝っていたと感じました。

### Webアプリケーションへの興味

特にWebアプリケーションに興味を持ったのは、PHPの授業の最後に図書管理アプリを作成したときです。CRUD操作を用いてデータベース操作をする動的なコンテンツを作成した際に非常に面白いと感じ、Webアプリ業界に進みたいと思いました。

### 卒業後の勉強内容

職業訓練で習った言語を元にアプリを作る場合、PHPのLaravelもしくはJavaScriptのReact, Node.jsが適していると考えました。職場見学でHIROKA様の技術スタックを見せていただいた際、MERN（MongoDB, Express, React, Node.js）でアプリが作成されていたので、自分もこの技術を使いたいと思いました。

職業訓練ではフレームワークについて学ばなかったため、まずは「プロになるためのWeb技術入門」という本を購入しました。授業でHTTP通信やGET, POST, SESSION、COOKIEなどについて座学で学びましたが、あまり理解できていなかった部分がありました。この本を読んだことでWebの仕組みが理解でき、今まで勉強してきたことの意味を改めて理解することができました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834304/969cc7d7-32c3-13ab-785d-e22014fef904.jpeg" alt="代替テキスト" width="250px" height="250px">

### フレームワークの勉強

フロントエンドのReactから勉強を始めました。「モダンJavaScriptの基本から始める React実践の教科書」という本を購入し、JavaScriptの基礎を固めつつReactを学びました。それと同時にNode.jsも勉強しましたが、書籍が少なかったため、YouTubeでハンズオン形式の動画を見ながら学びました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834304/dea643cb-4354-aba8-c69c-0a8c4ccd643a.jpeg" alt="代替テキスト" width="250px" height="250px">


### 効果的な学習法

ハンズオン形式が非常に学習効率が高いと感じたため、UdemyでNotionクローンやTrelloクローンなどの教材を購入し、フルスタックプロジェクトを体験しました。まだ経験が浅く、すべてを自力で作り上げる実力はありませんが、Webアプリのフロントエンドとバックエンドを自分で書き上げることで全体の流れを学べたことが非常に勉強になりました。

現在の勉強が今までで一番難しく、エラーなどに頭を悩ませる日々ですが、有名なWebアプリケーションの一部機能を実装しただけでも大きな感動を覚えました。
(Arduino UNO 8bit)超音波距離センサーHC-SR04Pで遊ぶ　　(ふたたび)(情報系大学以上むけ)(いちお、だれでもよんでね)


参考


https://qiita.com/caa45040/items/01bead0e8b7695366545


x 過去ログを見よ!!

結果

![o_coq275.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/aa159554-a0a4-c929-06df-ea6c42217b3d.jpeg)

![o_coq276.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/389599ef-a1eb-6963-e95c-f2d68ee65c7c.jpeg)



プログラム


```c++


//UltraSonic_wave_s1_UNO_1

//定義
#define trigPin  2
#define echoPin  3

//初期化
void setup() {

  //シリアルポートの初期化
  Serial.begin(9600);

  //ピンモードの初期化
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ピンの状態の初期化
  digitalWrite(trigPin, LOW);
  delayMicroseconds(1);

}//setup

//メインループ
void loop() {

  //開始信号の入力
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  //反響の時間の測定
  long duration;
  duration = (long)pulseIn(echoPin, HIGH, 10000); //強制キャスト
  //duration = 10000; //170cm debug
  //duration = 2000;  // 34cm debug
  //duration = duration * 340 / 2 / 1000;
  
  duration = (duration << 4) + duration; // x17  (340/2 /10)
  //duration = (duration << 3) + (duration << 1); // x10 //mm

  //duration = duration / 1000;  
  duration = ((duration * 25)>>10) + duration; //n * 1.02441
  duration = duration >> 10; //n / 1024 

  //距離の表示
  Serial.print("距離は");
  Serial.print((int)duration);
  Serial.println(" cmです");
  delay(2000); //2秒待つ　音速約300m/秒だと約600m

}//main

```






●おまけ　ミリメートル


結果


![o_coq274.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5f2c75d8-18a3-e1c7-3ce5-fff8be3e746c.jpeg)



プログラム


```c++


//UltraSonic_wave_s1_UNO_1

//定義
#define trigPin  2
#define echoPin  3

//初期化
void setup() {

  //シリアルポートの初期化
  Serial.begin(9600);

  //ピンモードの初期化
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ピンの状態の初期化
  digitalWrite(trigPin, LOW);
  delayMicroseconds(1);

}//setup

//メインループ
void loop() {

  //開始信号の入力
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  //反響の時間の測定
  long duration;
  duration = (long)pulseIn(echoPin, HIGH, 10000); //強制キャスト
  //duration = 10000; //170cm debug
  //duration = 2000;  // 34cm debug
  //duration = duration * 340 / 2 / 1000;
  
  duration = (duration << 4) + duration; // x17  (340/2 /10)
  duration = (duration << 3) + (duration << 1); // x10 //mm

  //duration = duration / 1000;  
  duration = ((duration * 25)>>10) + duration; //n * 1.02441
  duration = duration >> 10; //n / 1024 

  //距離の表示
  Serial.print("距離は");
  Serial.print((int)duration);
  Serial.println(" mmです");
  delay(2000); //2秒待つ　音速約300m/秒だと約600m

}//main


```
NVIDIAのGeForce ExperienceでGeForce Game Readyのドライバーダウンロードが失敗した時の対応

# 状況

ダウンロードしたいGeForce Game Readyのバージョンは560.70。
OSは Microsoft Windows [Version 10.0.22631.3880] 。


GeForce Experienceの下記からダウンロードするも、毎回失敗してしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/68b9ae9f-0fc2-546b-73fa-4d67480127ce.png)

下記をやったのですが状況変わらず。

* セキュリティーソフトを一時的に止める。
* OSを一度シャットダウンするのをかませる。
* 未適用のWindowsUpdatが無いようにする。

# ドライバーを直接ダウンロードして解決

下記サイトからダウンロードしました。

https://www.nvidia.com/ja-jp/drivers/details/230162/

以下、作業した時のスクショ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/98914326-01e3-209c-b741-02f7ae90700f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b4be3de6-967f-05c6-71f7-803e68823c6f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ebab7083-cd1d-4088-e8ee-eb0503490497.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/adfb0447-d275-c5e5-c7e7-acd0cc7b54d1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2242b335-faed-b5c6-ce03-9ff276431cc7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3edb361f-d88b-e6fd-0994-bb03125d4a31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7020dbb2-791f-c9af-f0e4-0d0b4f86fb86.png)

# 蛇足

ドライバーのダウンロードが失敗した時はいろいろ試すのもいいけど、本家サイトにダウロードしに行った方が解決早いかも。

どのバージョンに限らずグラボのドライバーは、アップデート直後にゲーム画面がかくつくこと多いです。
アップデート適用したらちょっと面倒でも再起動もしくはシャットダウンをかませた方がいいです。

# 参考サイトさん

https://unsolublesugar.com/20230124/211408/
(Arduino UNO 8bit)超音波距離センサーHC-SR04Pで遊ぶ　　(ふたたび)(小規模回路マイコン用)


x 過去ログを見てね!!!

目的
単精度浮動小数点から倍整数型にしゅる

結果

![o_coq272.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e4da8df5-9ce1-d53e-48ea-1c7014ccce18.jpeg)

![o_coq273.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/db261e8d-536d-880a-896c-c130f04ed7d4.jpeg)


プログラム


```c++


//UltraSonic_wave_h1_UNO_1

//定義
#define trigPin  2
#define echoPin  3

//初期化
void setup() {

  //シリアルポートの初期化
  Serial.begin(9600);

  //ピンモードの初期化
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ピンの状態の初期化
  digitalWrite(trigPin, LOW);
  delayMicroseconds(1);

}//setup

//メインループ
void loop() {

  //開始信号の入力
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  //反響の時間の測定
  long duration;
  duration = (long)pulseIn(echoPin, HIGH, 10000); //強制キャスト
  //duration = 10000; //170cm debug
  //duration = 2000;  // 34cm debug
  duration = duration * 340 / 2 / 1000;
  duration = duration / 10; //cm

  //距離の表示
  Serial.print("距離は");
  Serial.print((int)duration);
  Serial.println(" cmです");
  delay(2000); //2秒待つ　音速約300m/秒だと約600m

}//main


```



●おまけ　ミリメートル


結果


![o_coq271.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b97facfa-c05a-a6bc-99b8-fc54cc406d12.jpeg)




プログラム


```c++


//UltraSonic_wave_h1_UNO_1

//定義
#define trigPin  2
#define echoPin  3

//初期化
void setup() {

  //シリアルポートの初期化
  Serial.begin(9600);

  //ピンモードの初期化
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ピンの状態の初期化
  digitalWrite(trigPin, LOW);
  delayMicroseconds(1);

}//setup

//メインループ
void loop() {

  //開始信号の入力
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  //反響の時間の測定
  long duration;
  duration = (long)pulseIn(echoPin, HIGH, 10000); //強制キャスト
  //duration = 10000; //170cm debug
  //duration = 2000;  // 34cm debug
  duration = duration * 340 / 2 / 1000;
  //duration = duration / 10; //cm

  //距離の表示
  Serial.print("距離は");
  Serial.print((int)duration);
  Serial.println(" mmです");
  delay(2000); //2秒待つ　音速約300m/秒だと約600m

}//main


```
QNAP Webサーバーでアクセスログを出力する

# やりたいこと

自宅に設置しているNAS(QNAP)のWebサーバーを利用して、特定のグループ内（やや不特定多数）にファイルを公開する事になり、アクセスログを収集するための設定変更を行った時のメモです。

* QNAP Webサーバーからアクセスログを取得したい
* HTTPだけでなく、HTTPSのログも取得したい
* 取得したログファイルは共有フォルダに出力して手軽に参照したい


# 環境前提

* NAS は QNAP TS-431P
2018年購入でとても古い（記事を書いた時点で6年前、まだ現役！）
* QTS のバージョンは 4.5.4.2627
最新の 5.xx にはあげていません
* ログ出力フォルダは /share/Log/Web
Web管理画面から作成し、administrators(httpd)のみ書込可、他は参照権限のみ

# 結論

Web管理画面からは設定変更できないため、ターミナルでログインしてApacheのconfファイルを直接編集する必要がありました。また、Webサーバーを起動時にconfファイルが自動更新されてしまうため、編集内容が消去されないよう小細工が必要でした。

## HTTPログ

apache.confにCustomLogディレクティブを記載しても、なぜかWebサーバー起動時に削除されてしまう。Includeディレクティブは削除されないため、外部ファイルに定義して読み込ませる。

apache-log.confファイルを作成し、出力したいログを適当（適切）に定義する。
```shell-session
[~] # vi /etc/config/apache/extra/apache-log.conf
```
```conf:apache-log.conf
LogFormat "%{%Y/%m/%d %H:%M:%S}t %a %{User-agent}i %>s %m %U" accesslog
CustomLog "|/usr/local/apache/bin/rotatelogs -l /share/Log/Web/accesslog_%Y-%m-%d_http.log 86400" accesslog
```

apache.confに作成したファイルを読み込ませる。
末尾に外部ファイルをIncludeする箇所があるため、作成したファイルを追加で指定する。
```shell-session
[~] # vi /etc/config/apache/apache.conf
```
```conf:apache.conf
# （中略）
<IfModule ssl_module>
        SSLRandomSeed startup builtin
        SSLRandomSeed connect builtin
</IfModule>
<IfModule reqtimeout_module>
        RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
Include /etc/config/apache/extra/apache-ssl.conf
Include /etc/config/apache/extra/apache-fastcgi.conf
Include /etc/config/apache/extra/apache-musicstation.conf
Include /etc/config/apache/extra/apache-photo.conf
Include /etc/config/apache/extra/apache-video.conf
Include /etc/config/apache/extra/apache-common.conf
Include /etc/config/apache/extra/apache-http-compress.conf
# 追加
Include /etc/config/apache/extra/apache-log.conf
# 追加（ここまで）
```

## HTTPSログ

apache-ssl.confもサーバー起動時に置換されてしまうため、元ネタとなるファイルを編集する。
VirtualHostディレクティブ内に出力したいログを適当（適切）に定義する。

```shell-session
[~] # vi /etc/default_config/apache-ssl.conf
```
```conf:apache-ssl.conf
# （中略）
<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/apache/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
# 追加
LogFormat "%{%Y/%m/%d %H:%M:%S}t %a %{User-agent}i %>s %m %U" accesslog
CustomLog "|/usr/local/apache/bin/rotatelogs -l /share/Log/Web/accesslog_%Y-%m-%d_https.log 86400" accesslog
# 追加（ここまで）
</VirtualHost>
```

## 再起動

設定をすべて保存したら、Webサーバーを再起動します。
```shell-session
[~] # /etc/init.d/Qthttpd.sh restart
```

# 編集後記

サーバー起動ごとに設定が自動更新されてしまう点を回避するのが難儀しました。
アクセスログくらいWeb管理画面から設定できても良いのではと思いますが、最近のNASは高機能なものが多く、一般家庭向けの製品は必要最低限の機能にしか手が回っていないのかもしれません。
今後に期待してます、QNAPさん。
Qiita Markdown Latex CheatSheet（自分用）

# はじめに
私がQiitaなどで記事を投稿する際に困ったことを簡単にメモして記載します。
随時更新します。
# Markdown
# Latex
## 文章内に数式を入力したい
#### \\$と\\$で文字を囲む
例：
```
    $f_j(x)$
```
出力
    $f_j(x)$
## 数式の開始位置を揃えたい
#### alignを使う
開始位置を揃えたい場所に「&」、改行を「\\\\\」で入力し、align で囲う
例：　
```
    \begin{align}
    x &= 4
    x^2  &= 16
    \end{align}
```
出力：
```math
    \begin{align}
    x &= 4 \\
    x^2  &= 16
    \end{align}
```
# 全般
### 脚注を入れたい
#### 入れたい箇所に\[^1\], 下部に \[^1\]:説明　を記載する
例：
```
    hogehoge [^1]
    ....
    [^1]: 脚注の使い方の説明
```
出力：
hogehoge[^1]
[^1]: 脚注の使い方の説明
### 折りたたみたい
#### \/details と入力する
###
# 参考
#### align

https://mathlandscape.com/latex-eq/#toc3

#### 脚注

https://blog.qiita.com/105484781374-2/

#### 折りたたみ

https://qiita.com/matagawa/items/31e26e9cd53c3e61ae07
PUT PATCH POSTの使い分け

Qiita初めての投稿です。
知識のアウトプットのためにこれから記事を書いていくのでよろしくお願いします！
間違っているところは指摘していただけると幸いです。
## はじめに
put,patch,postについて曖昧な部分があり、実際に書いていて迷ったのでまとめていきます。
以下の記事と本を参考にさせていただきました。
Webを支える技術
https://qiita.com/suin/items/d17bdfc8dba086d36115
https://zenn.dev/doaradev/scraps/e648ff06754f44
## POST
・あるリソースに対して新しくリソースを作成する場合
リスポンスで201 createdと返ってくる、POSTと言われたら自分が一番に思いつく方法
・リソースへのデータの追加
・他のメソッドでは対応が難しい処理
例えば、urlに欲しい情報について細かく書きたくても、内容が長すぎてしまう場合。
この場合は、細かい情報をボディに書くためpostを使う。
## PUT
・リソースの上書き
・新しいリソースの作成
新しく作成するリソースのurlをクライアント側で指定しなければならない。
## POSTとPUTの違い
POSTで新しくリソースを作成する場合はクライアントがリソースのurlを指定することはできず、サーバー側でurlが作られるが、PUTで新しくリソースを作成する場合はクライアントがリソースのurlを指定することができる。
## PATCH
・リソースの一部更新
## 最後に
最後までお読みいただきありがとうございます。これからも記事をどんどん書いていくつもりなのでよろしくお願いします。
PythonでAtCoder（ABC364D問題）解いてみた

# はじめに
問題は[こちら](https://atcoder.jp/contests/abc364/tasks)
初心者（灰色〜茶色）向けです。
[D問題の公式解説](https://atcoder.jp/contests/abc364/editorial/10549)を咀嚼してPythonで実装したものについて説明します。
# D - K-th Nearest
https://atcoder.jp/contests/abc364/tasks/abc364_d
## 考え方
### 大枠の方針
二分探索を用います。$k$番目に大きい/小さい値を求める際に有効な手段です。
今回、次の単調増加な関数$f_j$を用いると、各$x$について、$f_j(x)$たちはソート済の列と見なすことができ、その中で$k_j$番目に小さいものを探せばよいということになります。[^1]

### 詳細
$x\geq0$ について、
```math
f_j(x) := B_j\spaceを中心とした長さxの区間に含まれる点\space A_1, A_2, \ldots, A_N \spaceの数
```
と定めます。[^2]
このとき、 $f_j(x)$ は$x$に関して（広義）単調増加です。[^3]
$x$の値を変化させていって、$f_j(x)\geq k_j$となる$x$の最小値を求めれば良いです。[^4]
なお、$f_j(x)$の値が変わるのは、区間が各$A_i$の点を跨ぐとき、つまり、$x=|b_j-a_i|$のときです。<br>
また、$f_j$は単調なので、二分探索により、出力する$x$の値を広い範囲から狭めて求めることが可能です。
問題の制約上、今回の最小値は$0$、最大値は$2*10^8$ですから、二分探索による計算量は$ \log(2 * 10^8)$程度です。

あとは、$f_j(x)$を実際に構成できればよいということになりますが、$a_n$をソートしておくと、二分探索を用いて下記のように構成できます。
#### f_j(x) の構成の仕方
<details><summary>$f_j(x)$の実装</summary>

```python
def f(x) :
    indexL = bisect.bisect_left(a_n,b-x)
    indexR = bisect.bisect_right(a_n,b+x)
    return indexR-indexL
```
</details>

$f_j(x)$　は下記のように言い換えられます。
```math
\begin{align}
f_j(x) &= 区間[b_j-x,b_j+x]に含まれる A_n たちの数 \\
       &= (b_j+x含めそれより左側のA_nたちの数)-(b_j-xより左側のA_nたちの数)
\end{align}
```
ここで、
```math
\begin{align}
(b_j+x含めそれより左側のA_nたちの数) &= b_j+xを a_nで二分探索した右側の挿入位置　\\
(b_j-xより左側のA_nたちの数) &= b_j-xを a_nで二分探索した左側の挿入位置
\end{align}
```
ですから、bisectモジュールで計算可能です。計算量は $ \log(n)$です。


## 解答例
```Python3:私の解答
import bisect
def f(x) :
    indexL = bisect.bisect_left(a_n,b-x)
    indexR = bisect.bisect_right(a_n,b+x)
    return indexR-indexL

n,q = map(int,input().split())
a_n = sorted(list(map(int,input().split())))
for _ in range(q) :
    b,k = map(int,input().split())
    boundL = -1
    boundR = 2*(10**8)
    cnt = 0
    mid = 0
    while boundR-boundL >1:
        mid = (boundL+boundR)//2
        if f(mid) >= k :
            boundR = mid
        else :
            boundL = mid
        cnt+=1
    print(boundR)
```

# 感想
単調な関数を用意すれば、k番目に大きい値は2分探索を用いて算出できるということを学びました。
配列でなくてもよい、アルゴリズムを自分で書くケースがあるのだと知ることができました。

しばらく投稿をサボっていましたが、復活します。できなかった問題、面白いと思ったものだけピックアップして記載します。
文章を書くのは難しいですね。
# 参考
二分探索
https://qiita.com/Pro_ktmr/items/8946723fe08ba29a977c

[^1]: 「$k_j$番目に小さいもの」は厳密ではありません。 $f_j(x) \geq k_j$を満たす$x$の最小値です。
[^2]: $B_j$を中心とした長さ$x$の区間 とは、 $[b_j-x,b_j+x]$ のことです。
[^3]: 単調増加の理由は、$x$が小さくなるほど区間が狭くなり、区間に含まれる点の数が小さくなるためです。また、$f_j(x)$は$x=0$の時最小になり、$x$を十分に大きくすれば、最大値の$n$になります。
[^4]: $f_j(x)= k_j$　でなく $f_j(x)\geq k_j$ なのは、$A_i$たちには重複があり得るので、ちょうど$k_j$になる$x$が存在するとは限らないからです。
【Python】Excel結合と中央揃え

Excelでセルの結合をしつつ、中央揃えにする。
例)D1:F1からD14:F15を結合し、中央揃え

============================================================
import openpyxl as px
from openpyxl.styles import Alignment 　←　中央揃えのためインポート

'Book2.xlsxをwb2に置き換えられるように、変数処理している
wb2 = px.load_workbook('Book2.xlsx')

#Book2.xlsxのSheet1をws2に置き換えられるように、変数処理している
ws2 = wb2['Sheet1']

＃whileを使用し、14回まで数値を追加しつつループさせる。
i = 1
while i < 15:

　　#[D+i:F+i]セルを結合する
　　ws2.merge_cells('D'+ str(i) + ':F' + str(i))
  
　　# D+iのセルに［中央揃え］を設定
　　ws2['D' + str(i)].alignment = Alignment(horizontal='center')

　　i += 1

#ブックを保存する
wb2.save(filename = 'Book2.xlsx')
ターミナルからフォルダ名・ファイル名にアクセスする

ターミナルにコマンドを打ち込むことによって、PC内のフォルダやファイルにアクセスする方法を最近勉強したのでまとめました。

# 今回の記事の知識を利用してできること

複数のディレクトリの中から特定のファイルのみを抜き出し、別のディレクトリにまとめる。

# (1)特定のファイルのみを探してくる

いくつかやり方はあるようです。具体的には

- osモジュール
- globモジュール
- pathlibモジュール

などが挙げられます。

どうやらpathlibモジュールはPython3.4から追加された新しいモジュールのようです。
本記事ではpathlibモジュールを用いる方法を中心に取り上げます。

# pathlibモジュールを使ってディレクトリ内の特定のファイルを検索する

pathlibを使うのに追加インストールは不要ですが `import` は必要です。

```python
import pathlib
```

例えば以下のようなディレクトリ・ファイルがあるとします。

```
fruits/
     ├─ apple.csv
     ├─ banana.txt
     └─ cherry.csv
```

fruitsディレクトリ内にあるCSVファイルを検索する時は以下のようにpathlibモジュールのglobメソッド(≠globモジュール)を使用します。

```python
p = pathlib.Path('./fruits') # この行でどこのディレクトリを検索するか指定する
# これを「Pathオブジェクトを生成する」と呼ぶ

for name in p.glob('*.csv'):
  print(name)
# * は正規表現で「どんな文字列が入っても良い」という意味

>> ./fruits/apple.csv
>> ./fruits/cherry.csv
```

# (2)探してきたファイルを新しく作ったディレクトリに移動する。

現在、以下のようなファイル・ディレクトリの構造になっているとします。

```
food
└──fruits/
   ├─ apple.csv
   ├─ banana.txt
   └─ cherry.csv
```
ディレクトリの作成にはosモジュールを使用します。

```python
import os 

os.makedirs('food/dessert', exist_ok=True)
```
すると以下のようなファイル・ディレクトリの構造になります。

```
food
├── fruits/
│   ├─ apple.csv
│   ├─ banana.txt
│   └─ cherry.csv
└── dessert/
```

ファイルの移動にはshutilモジュールを用います。
`shutil.move()` の第一引数に移動させたいファイルやディレクトリのパスを、第二引数に移動先のディレクトリのパスを指定します。

移動させたいファイルが一つだけの場合は以下のようなコードを書くとファイルを移動させることができます。

```python
import shutil

new_path = shutil.move('food/fruits/apple.csv', 'food/dessert/')
print(new_path)

>> food/dessert/apple.csv
```

複数のファイルを移動させたい場合は以下のようなコードを書くと良いです。

```python
p = pathlib.Path('./fruits') 
for name in p.glob('*'.csv):
    new_path = shutil.move 
```

# 参考文献

"[Python] ファイル名やフォルダ名の一覧を取得する". Hbk project. 2019/07/13. https://hibiki-press.tech/python/os-listdir-glob-glob-os-wal/1323#toc7, (2022/12/17).

"Pythonにおけるpathlibモジュールの利用方法を現役エンジニアが解説【初心者向け】". TechAcademy. 2018/02/05. https://magazine.techacademy.jp/magazine/29056, (2022/12/29).

nkmk. "Python, pathlibでファイル一覧を取得（glob, iterdir）". note.nkmk.me. 2018/10/01. https://note.nkmk.me/python-pathlib-iterdir-glob/, (2022/12/17). 

TATSUO IKURA. "条件に一致するファイルやディレクトリの一覧を取得する(pathlibモジュール)". Java Drive. https://www.javadrive.jp/python/file/index15.html, (2022/12/17).

nkmk. "Pythonでファイル・ディレクトリを移動するshutil.move". note.nkmk.me. 2018/09/26. https://note.nkmk.me/python-shutil-move/, (2022/12/17).
sql 導入覚書

# sqlをインストールする

macの場合は以下のサイトを参考にする[1]。
https://prog-8.com/docs/mysql-env

Windowsの場合は以下のサイトを参考にする[2]。
https://prog-8.com/docs/mysql-env-win

ターミナルに
`` mysql> ``
なる表示がされていればOK

``show databases;``
で確認すると作りたいデータベースがまだないことがわかる。

なお、上記サイトにはsqlにログインしている状況までの手順が記されている。

# データベースの作成

データが読み込まれた後に
`` create database db_name; ``
とすると、db_nameという名前のデータベースが作成される。

データベースが本当にできたか確認する場合は
`` show databases; ``
を入力すればよい。

その後、使用したいデータベース名を指定し
`` use db_name; ``
とすれば、作成したデータベースが使えるようになる[３]。

# データをsqlにいれる

mysqlにログインした状態で以下のコマンドを実行する[４]。
`` /* 読み込みたいファイルのパスを指定 */``
``mysql> source /Users/user_name/hoge/example.sql`` 

その後に
`` show tables; ``
とするといくつかのデータがデータベース内に格納された状態になる。

ここまでくれば、selectやwhereなどの構文でデータを操作することが可能となる。

# 参考文献

[1] ”MySQLの開発環境を用意しよう（macOS）".Progate.
https://prog-8.com/docs/mysql-env,(2024/07/28).

[2] "MySQLの開発環境を用意しよう（windows）".Progate.
https://prog-8.com/docs/mysql-env-win,(2024/07/28).

[３]"MySQLでデータベースを作成しよう".Progate.
https://prog-8.com/docs/mysql-database-setup,(2024/07/28).

[４] @chimayu. "パスやファイル名を指定して、コマンドライン上からデータベースにdumpファイルをインポートする".Qiita.2020/04/15.
https://qiita.com/chimayu/items/90c9421067d76696a050,(2024/07/28).
Gauzilla: RUST製のGaussian Splattingレンダラー

Gauzillaは、Rust言語で実装されたGaussian Splattingレンダラーです。Gaussian Splattingは、3D空間を表現する革新的な手法として注目を集めており、NeRF（Neural Radiance Fields）の次ぐ技術として期待されます。

## Gaussian Splattingとは

Gaussian Splattingは、3D空間内の点をガウス分布で表現し、それらを2D平面に投影することで画像を生成する技術です。この手法は、写実的な3Dモデリングや新規視点の合成に革命をもたらす可能性があります。Gaussian Splattingは光沢のある反射物体や細長い詳細を効果的にレンダリングでき、小さなディチールを犠牲にすることなく大規模な空間を捉えることができるとされています。

Gaussian Splattingは従来のRadiance Field手法と比較して、高品質な可視化をより迅速に実現できることが示されています。特に、トレーニングと描画の速度が大幅に向上しており、リアルタイムレンダリングが可能になっています。

## Gauzillaの特徴

1. **Rust言語での実装**: 高速で安全なRust言語を使用しているため、パフォーマンスが優れています。

2. **CPU基盤のレンダリング**: ほとんどGPUを必要とせず、主にCPUのみで動作するため、幅広いプラットフォームで利用可能です。

3. **高速なレンダリング**: 最適化されたアルゴリズムにより、大規模なGaussian Splatモデルでもリアルタイムレンダリングが可能です。

4. **クロスプラットフォーム**: macOS、Windows、Linuxなど、様々なOSで動作します。

## 技術的な詳細

Gauzillaは、以下のような手順でレンダリングを行います：

1. .plyもしくは.splatファイルからガウシアンデータを読み込む
2. カメラモデルを初期化
3. カメラからの深度でガウシアンをソート
4. 3Dガウシアンを2D平面に投影し、楕円（2Dガウシアン）のパラメータを計算
5. 各ガウシアンに対して2Dガウシアンパラメータとバウンディングボックスを生成
6. ピクセルごとにガウシアンをサンプリングし、不透明度（アルファ値）と色を計算
7. 最終的な出力画像に各ガウシアンの寄与を加算

この手法は、従来のポリゴンベースのレンダリングとは異なり、3D空間を点群として表現し、それぞれの点をガウス分布として扱います。これにより、複雑な形状や材質を効率的に表現することが可能になります。

## 今後の展望

Gaussian Splattingは急速に発展している分野であり、Gauzillaは、この技術の普及と応用範囲の拡大に大きく貢献するのではないでしょうか。

## 参考文献
3. [Gauzilla GitHub Repository](https://github.com/thomasantony/splat/)