OmniAICreator/Qiita-1.07M huggingface dataset:
位置情報ルーティングと地理的近接性ルーティングの違い

# はじめに
AWS SAAの勉強をする中で、ルーティングポリシーの**位置情報ルーティング**と**地理的近接性ルーティング**の違いがよくわからなくなりました。
そこで今回は、ルーティングポリシーについて掘り下げて調べてみることにしました。

# ルーティングポリシーとは？
ルーティングポリシーは、Amazon Route 53でクエリに応答する方法を決定するものです。

# ルーティングポリシーの種類
ルーティングポリシーには以下の8種類があります。
各ルーティングポリシーの定義を簡単に説明した後、位置情報ルーティングと地理的近接性ルーティングについて掘り下げます。

#### シンプルルーティングポリシー
ドメインで特定の機能を実行する単一のリソースがある場合に使用するもの。
プライベートホストゾーンにレコードを作成するために使用できる。

#### フェイルオーバールーティングポリシー
**アクティブ/パッシブフェイルオーバー**を構成する場合に使用するもの。
プライベートホストゾーンにレコードを作成するために使用できる。

#### 位置情報ルーティングポリシー
**ユーザーの位置**に基づいてトラフィックをルーティングする場合に使用するもの。
プライベートホストゾーンにレコードを作成するために使用できる。

#### 地理的近接性ルーティングポリシー
**リソースの場所**に基づいてトラフィックをルーティングし、必要に応じてトラフィックをある場所のリソースから別の場所のリソースに移動する場合、使用するもの。
プライベートホストゾーンにレコードを作成するために使用できる。

#### レイテンシールーティングポリシー
複数のリソースがある場合、その中で **レイテンシーが最適(低レイテンシー)** なリージョンにトラフィックをルーティングする際に使用するもの。
プライベートホストゾーンにレコードを作成するために使用できる。

#### IPベースのルーティングポリシー
ユーザーの位置情報に基づいてルーティングしたい場合や、トラフィックの送信元のIPアドレスがわかっている場合に使用するもの。

#### 複数値の回答ルーティングポリシー
Route 53が持つ最大8つの正常なレコードをランダムに選択したDNSクエリに応答する場合、使用するもの。
プライベートホストゾーンにレコードを作成するために使用できる。

#### 加重ルーティングポリシー
指定した比率で複数のリソースにトラフィックをルーティングする場合に使用するもの。
プライベートホストゾーンにレコードを作成するために使用できる。


# 位置情報ルーティングとは？
**位置情報ルーティング**は**ユーザーの地理的位置**（DNSクエリの送信元の場所）に基づいて、トラフィックを処理するリソースを選択できます。

位置情報ルーティングを利用することで以下のことが可能になります。
- コンテンツのローカライズ
- コンテンツの配布範囲の制限（配布の権限がある場所に限定できる）
- エンドポイント間で負荷を分散し、ユーザーロケーションを同じエンドポイントに一貫してルーティングする

地理的位置は大陸別、国別、米国の州別の3種類で指定できます。
その際、もし地理的リージョンが重なり合っている場合は、最も小さい地理的リージョンが優先されます。

位置情報はIPアドレスのマッピングによって動作していますが、一部IPアドレスはマッピングされないものもあります。
その場合Route 53はクエリに対して「応答なし」と回答するようになっています。

# 地理的近接性ルーティングとは？
**地理的近接性ルーティング**は**ユーザーとリソースの地理的場所**に基づいてリソースのトラフィックをルーティングします。
この際ルーティングされるリソースは利用可能な最も近いリソースになっています。

地理的近接性ルーティングでは、**バイアス**という値を指定することで、特定のリソースにルーティングするトラフィックの量を変更することができます。（地理的リージョンのサイズを調整できる）

地理的近接性ルーティングを用いることで、トラフィックを地理的に最も近いリソースにルーティングするため、エンドユーザーのアプリケーションの応答性を向上させることができます。
例えば同じ米国内でも西部側のリソースの割合を増やしたい場合には、西部側にルーティングするトラフィックの量を増やすことで偏りを制御することが可能です。

# 位置情報ルーティングと地理的近接性ルーティングの違いは？
国や地域ごとの設定が必要なものについては位置情報ルーティングを、レイテンシーを向上させたい場合については地理的近接性ルーティングを使うのが違いだと思いました。

**位置情報ルーティング**はユーザーの現在地を元にローカライズなどをすることが可能なため、国別で言語を揃えて配信したり、国ごとの法律に従った配信をしたい場合の使用が推奨されると考えました。

一方**地理的近接性ルーティング**が使われるのは、それらの設定は必要なく、一番近い距離のリソースとの接続を行うことでレイテンシーの向上につなげたい場合使用が推奨されると考えました。

# おわりに
今回はルーティングポリシーについて掘り下げながら**位置情報ルーティング**と**地理的近接性ルーティング**の違いを調べていきました。
しかし、正直なところ、まだ具体的にどう使い分ければいいのかは理解しきれていないと感じました。
もし間違えて理解しているところなどがあれば、ご教示いただけますと幸いです。


# 参照
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/Welcome.html

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy.html

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy-geo.html

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy-geoproximity.html

https://aws.amazon.com/jp/about-aws/whats-new/2024/01/amazon-route-53-expands-geoproximity-routing/#:~:text=%E5%9C%B0%E7%90%86%E7%9A%84%E8%BF%91%E6%8E%A5%E6%80%A7%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AF%E3%80%81%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%92%E5%9C%B0%E7%90%86%E7%9A%84,%E6%80%A7%E3%82%92%E5%90%91%E4%B8%8A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
エンジニアのためのネタ探しTips(SEOもあるよ)

先日「[なぜ俺たち中年はアウトプットできなくなったのか](https://qiita.com/moroi/items/e39fb42172bfe2d4d209)」という、アウトプットできないことをアウトプットする荒業で辛くもAdvent Calendarという難所を乗り切った中年、モロ([@moro_is](https://x.com/moro_is))です。

とはいえ毎度そうはいきません。クリスマスは今年もやってきます。
昨今のQiitaを見ていると、もはや**クリスマスが廃止されようともAdvent Calendarだけは開催されそうな勢い**です。

今年こそは穏やかな気持でクリスマスを迎えるべく、ネタ探しのためのTipsを書き残しておきます。

# Googleトレンドはめっちゃ使える

昨年夏のアップデートでめちゃくちゃいい感じに使いやすくなったGoogleトレンド。

https://trends.google.co.jp/trends/

![Googleトレンドトップページのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/f9390c30-540a-6730-aef4-edc0a66b79e9.png)

詳細は省きますが、SEOだけでなくネタ探しにもぴったりのツールとなっております。
以下でざっくり使い方をご紹介します。

## キーワードを入力する

UIも直感的になってもはや説明は不要かも知れません。見たままです。
キーワードを入れて「調べる」をクリックします。

![GoogleトレンドでSEOを調べた画面のスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/103f30f9-e3b0-5fcd-64db-b63e34c64ffc.png)
東京より群馬で盛んにSEOが検索されている事実だけでもう面白い。

SEO的に利用する際は**上位表示を狙いたいキーワード**を調べて、いい感じの関連キーワードとあわせてコンテンツを考えたりしますが、今回はネタ探しなので「SEO」と入力してみました。

### 比較する

「+ 比較」の部分は、例えば同義語・類義語やら表記揺れやらで悩んだ際、実際の検索実績(？)を調べるのに使えます。
「SEOって"SEO"表記より"Search Engine Optimization"表記のほうが実は検索流入あるんじゃね？」みたいに([当然そんなことはありません](https://trends.google.co.jp/trends/explore?date=today%201-m&geo=JP&q=SEO,Search%20Engine%20Optimization&hl=ja))。


## 関連キーワード

関連トピックも面白いですが、関連キーワードのほうが直接的でわかりやすいので私はこちらを見ることが多いです。
どちらも「注目」「人気」でフィルタできますが、「人気」のほうをみても「でしょうね」という感じにしかならないのでそのまま「注目」で使います。

![Googleトレンドから関連キーワードの一覧を抽出したスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76653/3c256cff-53a1-c5fe-eaf3-747a4a3cf707.png)


ここをぼーっと眺めていくと、

- Yoast SEO、TACT SEO、MOZ、キーワードプランナー、Ahrefsなどツールで悩んでる人が多そう
- ポイズニングという手法が話題らしい
- **韓国には結構Seoさんがいるらしい**

と、まさに需要そのものを覗き見ることが可能です。
求められているものがわかれば、その中から自分が解説できそうなものをアウトプットするもよし、知らない言葉があればそこから調べて同じく知らなかった人向けにアウトプットするもよし、よりどりみどりです。

そう考えると、需要に答えることとSEOを強化することはほぼ同義なんですね。

# おまけ

ところで、恥ずかしながら「SEOポイズニング」という言葉が初耳だったので調べてみたのですが、[LANSCOPEさんによる](https://www.lanscope.jp/blogs/cyber_attack_cpdi_blog/20240530_20684/)と「不正だったり違法だったりなWebサイトを何やかんや上位表示するサイバー攻撃手法」だそうです。
現象(？)自体は観測していましたが、そんな格好良い名前だったんですね。

勉強になりました。

終わり。
e.targetの中身

Reactでよく出てくるe.target.valueで入力値などを取得していたが、e.targetには何が含まれているか理解していなかったので調べた記録。

## .targetとは
JavaScriptのプロパティ。
> targetはEventインターフェイスの読み取り専用プロパティで、イベントが配信されたオブジェクトへの参照です。
> 引用:mdm web docs

JSでのイベント発火時にイベント内容を参照できる。

## 例と.targetの内容
```react
// 学習中に出てきたサンプルコードを一部改変、関係ない部分は省略しています。

const onChangeText = (e) => setText(e.target.value);

return (
  <>
    <div className="input-area">
      <input placeholder="テキストを入力" value={text} onChange={onChangeText} />
      <button>追加</button>
  </>
);
```

入力フォームにテキストが入力されるとonChangeText関数が呼ばれ、入力内容を更新関数setTextに渡してtextを更新する仕組み。
なので、このe.target.valueは入力内容を取得している。
e.targetを見てみる。
```react
// 前述のコードにconsole.logを追加

const onChangeText = (e) => {setText(e.target.value), console.log(e.target)};

return (
  <>
    <div className="input-area">
      <input placeholder="テキストを入力" value={text} onChange={onChangeText} />
      <button>追加</button>
  </>
);
```

入力フォームに"hello"を入力したときのコンソールでの表示結果が以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690542/175db1fe-e05f-74a8-85ec-85e68bc7f33a.png)

e.targetは<input>要素を、.valueで入力値の"hello"を参照していることがわかる。

## まとめ
e.target.valueは入力値を取得できる書き方として使用していたが、.targetが何をしているか理解することができた。

関係ないが、初心者が何かアプリを作成するときに一番役立つのってデバッグスキルだと思う。
CodeWars 8kyu Printing Array elements with Comma delimiters

https://www.codewars.com/kata/56e2f59fb2ed128081001328/train/python

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/c9dc23d4-5785-ac46-f663-9568c026e9ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/335eab5c-b2e8-bcab-72d1-2d72dc4510ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/f79b9ff1-74ff-0264-6435-53ea47378168.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/32f1435a-f61b-9cf7-c877-50c77cf66b83.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/3755767f-82c9-3538-53e7-ffb0034023ac.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/14c3c3f6-b25f-fb44-7ca0-cd3151b3e72d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/0c209901-c1ef-7149-6f24-6577c01bb173.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/cdcb8eae-ba02-246a-2f09-77aa9fc04b88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/dc5e2765-db85-efe2-6d9c-d7a976af9c49.png)

This is!!
https://www.quora.com/How-do-you-print-comma-separated-values-in-Python
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/1d72685c-bd16-b007-b92d-5dc02563bb6d.png)


:clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/1aa68cc4-43a1-67ab-4daf-c652a8bf0151.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/c5fdc5e1-d49e-1e43-a4e5-8e8406497a5d.png)



oter answers:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/f0b0d343-7c6d-4cf6-ad67-f029694b05f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/d4878626-7354-253a-15a3-95b6d9d97264.png)
int (32bit) を 4byte に分割して遊ぶ。(戻しも)(一番下にコメントあり)


x M5NanoC6での予定は、未定


目的
ビット操作してレジスターから取り出す

いろいろ
ESP-NOWを使った温度の電送で必要
主にADC(0から4095)まで等を想定
最上バイトには、ちゃんとマスクしをしています。
オーバーブローに関しては、規格上は、未定義　(自己責任)


オンラインコンパイラ

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    printf("\nSTART\n");
    
    //送信バッファー int(32bit)
    unsigned char ac[] = {0x00, 0x00, 0x00, 0x00};
    
    int s = 0x12345678;    //センサーの値
    
    printf("[%x]\n",s);
    
    ac[3] = s & 0xff; s = s >> 8;
    ac[2] = s & 0xff; s = s >> 8;
    ac[1] = s & 0xff; s = s >> 8;
    ac[0] = s & 0xff;
    
    printf("[%x][%x][%x][%x]\n",ac[0],ac[1],ac[2],ac[3]);
    

    s = 0;
    s =     ac[0]; s = s << 8;
    s = s | ac[1]; s = s << 8;
    s = s | ac[2]; s = s << 8;
    s = s | ac[3];
    
    printf("\n");
    printf("[%x]\n",s);
    

    
    
}



```


```

START
[12345678]
[12][34][56][78]

[12345678]


```



おまけ(負の数)
----


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    printf("\nSTART\n");
    
    //送信バッファー int(32bit)
    unsigned char ac[] = {0x00, 0x00, 0x00, 0x00};
    
    int s = -2;    //センサーの値
    
    printf("[%d]\n",s);
    
    ac[3] = s & 0xff; s = s >> 8;
    ac[2] = s & 0xff; s = s >> 8;
    ac[1] = s & 0xff; s = s >> 8;
    ac[0] = s & 0xff;
    
    printf("[%x][%x][%x][%x]\n",ac[0],ac[1],ac[2],ac[3]);
    

    s = 0;
    s =     ac[0]; s = s << 8;
    s = s | ac[1]; s = s << 8;
    s = s | ac[2]; s = s << 8;
    s = s | ac[3];
    
    printf("\n");
    printf("[%d]\n",s);
    
}


```


```

START
[-2]
[ff][ff][ff][fe]

[-2]

```


おまけ2(ポインターによるメモリー操作)
----


```c++



#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    printf("\nSTART\n");
    
    //送信バッファー int(32bit)
    unsigned char ac[] = {0x00, 0x00, 0x00, 0x00};
    
    int s = -2;    //センサーの値
    
    printf("[%d]\n",s);

    
    unsigned char *c;
    c = (unsigned char *)(&s);
    ac[0]=c[0];
    ac[1]=c[1];
    ac[2]=c[2];
    ac[3]=c[3];
    
    //ac[3] = s & 0xff; s = s >> 8;
    //ac[2] = s & 0xff; s = s >> 8;
    //ac[1] = s & 0xff; s = s >> 8;
    //ac[0] = s & 0xff;
    
    printf("[%x][%x][%x][%x]\n",ac[0],ac[1],ac[2],ac[3]);
    
 

    
    
    int *p;
    p = (int *)(ac);
    s = *p; //メモリコピー
    


    //s = 0;
    //s =     ac[0]; s = s << 8;
    //s = s | ac[1]; s = s << 8;
    //s = s | ac[2]; s = s << 8;
    //s = s | ac[3];
    
    printf("\n");
    printf("[%d]\n",s);
    
}


```


```


START
[-2]
[fe][ff][ff][ff]

[-2]


```
【個人用】AWS Solution Architect Associate対策ノート(分析編)

## 扱う内容

・Kinesis
・EMR
・Glue
・Athena
・Data Pipeline

## EMRの基礎知識

・ビッグデータの分析や処理を行うサービス

・ビッグデータ処理用のフレームワークである**Hadoop**や**Spark**を用いている

・３つのノードを持ち、分散処理を行う

・データの保存先には**HDFS**と**EMRFS**いうファイルシステムを利用する。HDFSはEMRクラスター終了時にデータが吹っ飛ぶが、EMRFSはデータが永遠に保存される


## Glueの基礎知識

・複数のデータソース(S3やDynamoDB)からデータを抽出し、変換・統合したデータをターゲット(Redshiftやオンプレミスなど)に渡すという、データ分析における**橋渡し**の役割を果たす

・**クローラー**がデータソースからデータを抽出し、まとまりである**データカタログ**を作成する

・データカタログを基に、**ETLエンジン**がデータソースからデータを抽出し、ターゲットに渡す

・データカタログは。EMRやAthenaなどの分析サービスからも参照できる

## Athenaの基礎知識

・サーバーレスである

・あらかじめCSVやJSONなどのデータを基にテーブルを作成することで、クエリを実行できるようになる

## Data Pipelineの基礎知識

S3からDynamoDBへのデータ取り込みなど、データの移動や変換を自動化するサービス
EC2インスタンスを移動して使うので、サーバーレスではない
【Laravel】API呼び出し時にクエリログを出力する方法

## 概要
APIが呼ばれるたびに、リクエストの内容と、発行されたクエリをログ出力させるミドルウェアを作成します。デバッグやパフォーマンス改善に活用できます。

## 前提知識
### ミドルウェアとは？
HTTPリクエストがアプリケーションに到達する前に、リクエストをフィルタリングまたは操作する層です。以下のような処理ができます。

- 認証の確認
- CORSの設定
- メンテナンスモードのチェック
- フォームデータのトリミングや変換

ミドルウェアは、Kernel.php ファイルを通じてアプリケーション全体または特定のルートに適用できます。

### Kernel.phpについて
Laravelの Kernel.php は、アプリケーションのリクエストライフサイクルを管理するファイルです。
以下2種類があります。
- HTTPリクエストを管理する`app/Http/Kernel.php`（☜ 今回使うのはこっち）
- コンソールコマンドを管理する `app/Console/Kernel.php`


## ミドルウェアの作成
LogQueries ミドルウェアを作ります。
クエリログを有効にし、リクエストの内容とクエリをログに出力する処理を実装します。


```php:/laravel/app/Http/Middleware/LogQueries.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class LogQueries
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // クエリログを有効化
        DB::enableQueryLog();

        // リクエストの処理
        $response = $next($request);

        // クエリログを取得
        $queries = DB::getQueryLog();

        // リクエストとクエリログをログに出力
        Log::info('クエリログ:', [
            'method' => $request->getMethod(),
            'url' => $request->fullUrl(),
            'input' => $request->all(),
            'queries' => $queries,
        ]);

        return $response;
    }
}

```


## ミドルウェアの登録
作成したミドルウェアを Kernel.php に登録し、APIのミドルウェアグループに追加します。

```php:/laravel/app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    // ... existing code ...

    protected $middlewareGroups = [
        'web' => [
            // ... existing middleware ...
        ],

        'api' => [
            ...
            \App\Http\Middleware\LogQueries::class, // ここに追加
        ],
    ];

    // ... existing code ...
}
```

これで完了です。
Laravelのログ設定に応じて、 APIリクエストが行われるたびに`storage/logs/laravel.log`にログが出力されます。

### 出力されるログの例
```
[2024-06-24 15:05:26] local.INFO: クエリログ {"method":"GET","url":"https://.../get","input":[],"queries":["select count(*) as aggregate from \"..."]}
```
VSCode エクスプローラー に ツリー（ファイルの一覧）が表示さなくなった

# VSCode に エクスプローラーにツリー（ファイルの一覧）が表示されなくなった

## 症状
[開いているエディター]
しか表示されなくなった


## 解決方法
1. コマンド入力を開く
Ctrl+Shift+P (Windows/Linux)
Cmd+Shift+P (Mac)

2.コマンド入力
`View: Reset View Locations`

3.表示が回復

### 再インストールが必要かと思いましたが、簡単に回復しました
ZennとQiitaの記事をGitHubリポジトリで同時に管理する


## はじめに

エンジニア向けの日本語記事共有プラットフォームといえば Qiita や Zenn などが挙げられます。

これまで私は読む側でしか使ってこなかったのですが、最近 [個人ブログ](https://nokotaro.hatenablog.com) で１日１記事を書く習慣をつけるように頑張っています。続けていく中で「技術記事についてはエンジニアが読んでくれるプラットフォームで公開したい」と思うようになりました。

そこで Qiita を使うか Zenn を使うか悩んだ末、結論として「QiitaもZennも使いたい！」という、なんともよくばりな考えにたどり着きました。

## 両方使おうと思ったきっかけ

過去に「[Zenn / Qiitaに投稿する同じ記事を一元管理するGitHubリポジトリを作りました](https://zenn.dev/ot07/articles/zenn-qiita-article-centralized)」という記事を読んだことがあり、その際は「ふーん」くらいにしか思ってなかったのですが、今回どのプラットフォームを使うか迷っていた際にこの記事の存在を思い出し、せっかくなので試してみることにしました。

<https://zenn.dev/ot07/articles/zenn-qiita-article-centralized>

ちなみに今回は先述の記事で紹介されている方法をもとに [C-naokiさん](https://c-naoki.vercel.app) が改良した [zenn-archive](https://github.com/C-Naoki/zenn-archive) を使って Qiita と Zenn の記事の一元管理化を試してみます。

こちらのツールついては、C-naokiさんご本人が書かれた [Zenn vs Qiitaを終わらせに来た](https://zenn.dev/naoki0103/articles/zenn-qiita-sync-workflow) の記事に、事前準備や使い方などの手順が詳細に書かれているのでそちらを参考にしてみてください。

<https://zenn.dev/naoki0103/articles/zenn-qiita-sync-workflow>

## 同時投稿ツールはほかにもある

この記事では省略しますが、

- [zenn-archive](https://github.com/C-Naoki/zenn-archive) - [(C-naokiさん)](https://c-naoki.vercel.app)
- [blog-project](https://github.com/SolitudeRA/blog-project) - [(SolitudeRAさん)](https://www.solitudera.com)
- [O.A.S.I.S](https://github.com/Sunwood-ai-labs/OASIS) - [(Makiさん)](https://hamaruki.com)

など類似ツールはいくつかありましたが、今回は [zenn-archive](https://github.com/C-Naoki/zenn-archive) を採用しました。

どのツールも大まかな流れとしては

- Zenn CLI で記事を管理するための markdownファイル を用意する
- 上記の markdownファイル を GitHub Actions で Qiita CLI用 に変換する

ということをやっています。

採用に至った基準や、実際に使用してみた感想、そのほか詰まったところなどは、個人ブログの[「ZennとQiitaの記事をGitHubリポジトリで一括管理する」](https://nokotaro.hatenablog.com/entry/2025/01/07/160253)の記事に書いてありますので、よければこちらも読んでくださると嬉しいです。

<https://nokotaro.hatenablog.com/entry/2025/01/07/160253>

## 実際に投稿された記事

実際にツールを使用し、Zenn と Qiita の両方に記事が投稿されるか確認しましたが、どちらも問題なく投稿されたことが確認できたので、今後はこちらのツールを活用し技術記事を公開していきたいなと思います。下にテスト用の記事を貼っておきます。

<https://zenn.dev/nokotaro/articles/zenn-qiita-sync-test>

<https://qiita.com/takenoko_0714/items/4c90a6f04c1bceb7c7ff>

もちろん、今あなたが読んでいるこの記事も、[zenn-archive](https://github.com/C-Naoki/zenn-archive) を使って同時投稿しています。画像添付や注釈表記などにも対応しているのですが、それはまた別の記事で試してみたいと思います。

というわけで、Zenn と Qiita の記事を、GitHubリポジトリで一元管理する方法の紹介でした。
突然Gitのリモートリポジトリにアクセスできなくなった

GitHubのリモートリポジトリに、突然アクセスできなくなった。  
`git push origin`も`git fetch origin`などすると、以下のエラーが出る。

```
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

2時間ほど前には問題なくアクセスできていたのに。
その時と同じマシンを使っている、しかもシャットダウンもしてないのに。（一時スリープ状態にはなっていた）

## 原因はSSHエージェント
ChatGPTに聞いていろいろ試したところ、「SSHエージェントの起動」で解決した。
```
eval "$(ssh-agent -s)"
```

SSHエージェントが勝手に死んでいるというのは、スリープ復帰時などに発生することがあるらしい。

ChatGPTは、SSHエージェントを自動起動させる方法など、この問題に遭遇しないような対策も提示してくれたのだけど、
通常は発生しないようなことに対処するスクリプトをわざわざ書いておくというのは間違っている気がしたので、
問題が発生したときに都度対処することにした。（コマンド一行実行するだけだし）

次に問題が発生したときに、思い出せるようにここに書き留めておく。
【Linux】Linux上でUSキーボードに切り替える方法

# はじめに
こんにちは！アメリカで独学でソフトウェアエンジニアを目指している者です。
現在、Linuxの復習として「ゼロからはじめるLinuxサーバー構築・運用ガイド第二版」を使用しています。
VirtualBox上でRocky Linux 9を使用しているのですが、使用しているUSキーボードが日本のJIS配列キーボードとして認識されてしまいました。

このままでは非常に使いにくかったため、CLI（コマンドラインインターフェイス）を使ってUSキーボードに対応させる方法を設定しました。今回はその手順を記事にまとめたいと思います。

開発環境
ホストOS: Windows 11
仮想化ソフトウェア: VirtualBox 7.1.0
ゲストOS: Rocky Linux 9
SSHクライアント: Tera Term 5.0

# 方法
以下の手順でキーボードレイアウトを変更できます。
1. 現在のキーボードレイアウトを確認
まず、以下のコマンドを実行して、現在のキーボードレイアウトを確認します。
```bash
$ localectl status

# 出力結果
System Locale: LANG=en_US.UTF-8
VC Keymap: jp
X11 Layout: jp
  ```
2. キーボードレイアウトをUSに変更
次に、以下のコマンドを実行してキーボードレイアウトをUSに変更します。
```bash
$ sudo localectl set-keymap us
```
3. 設定変更を確認
再度以下のコマンドを実行して、変更が適用されていることを確認します。
```bash
$ localectl status
# 出力結果
System Locale: LANG=C.UTF-8
VC Keymap: us
X11 Layout: us
X11 Model: px105+inet
X11 Options: terminate:ctrl_alt_bksp
```
* `VC Keymap: us`:  仮想コンソール（VC: Virtual Console）のキーボードレイアウトがUSキーボードに設定されています。
* `X11 Layout: us`: X11（GUI環境）で使用されるキーボードレイアウトがUSキーボードに設定されています。

この結果から、問題なくUSキーボードに切り替えられていることが確認できます。
# まとめ
今回は、Linux環境でUSキーボードを使用しているにもかかわらず、日本のJIS配列キーボードとして認識されてしまった際の対処法について解説しました。
同様の問題で困っている方の参考になれば幸いです！
chrome内蔵のAI翻訳API「Translator API」を使ってみた

## 背景
chrome内蔵のAI翻訳API「Translator API」の存在を知ったので、試しに使ってみた。
多くの翻訳ツールは外部サービスのサーバと通信が必要だが、本APIはクライアント側のみで完結するので処理が簡単で早くて良き。

※試験運用中の機能なので、flag変更が必要
※今回はローカル利用のみ。オリジントライアルに登録すれば実サイトでのテストも可能

## 環境
Google Chrome（131.0.6778.265）

## 準備
### Translator APIのflagをEnabledにする

```
chrome://flags/#translation-api
```
にアクセスし「`Enabled without language pack limit`」を選択  
※Enabledでも可。テスト用なので無制限の方にしてます。

## 動作確認  
#### サンプルスクリプト
```javascript:sample.js
async function translateAPITest() {
  // 翻訳APIが使えるかチェック
  if ('translation' in self && 'createTranslator' in self.translation) {
    // 翻訳オプションを設定
    // ここでは日本語→英語の翻訳
    const translateOption = {
      sourceLanguage: 'ja',
      targetLanguage: 'en',
    }

    // 設定した翻訳オプションの言語が使えるかチェック
    const canTranslateFlg = await translation.canTranslate(translateOption);
    if (canTranslateFlg) {
      // Translatorを作成
      const translator = await self.translation.createTranslator(translateOption);

      // 指定のテキストを翻訳
      const translateResultText = await translator.translate("吾輩は猫である。");
      console.log(translateResultText)
    }
  }
}
```

#### 結果（chromeコンソール）
```
I am a cat.
```
</details>

## 試作  
chrome拡張機能の試作  
（テキスト選択 →「Option + T」を押下 → ウィンドウ下部に翻訳を表示）  
  
![translate_2_d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367886/f975a6e1-c8c5-817a-9521-609815cba4f0.gif)

## 所感  
- 翻訳に使われるモデルがクライアント動作用の軽量モデルのため、翻訳精度は他のサービスには及ばないが、一般的な文章の翻訳やざっくり概要を知りたい場合などには十分な印象
- ニュースやブログ記事レベルなら問題ないが、専門用語や規約系テキストなど業務レベルでは厳しそう
- 処理速度について肌感では、1段落程度なら全くストレスなく翻訳できるが、ページ全体などまとまった文章の翻訳は1-2秒かかる場合もあり、他のサービスの方が早いかも

例：「an animal of their own that dons a dashing white winter coat」
| 利用ツール | 翻訳結果 |
|:-:|:-:|
| Translator API（chrome）  | 白い威勢のいい冬のコートを着ている自分の動物 |
| Google翻訳 | さわやかな白い冬毛を着た独自の動物 |
| DeepL | 颯爽とした白い冬毛をまとった動物がいる。 |

## 参考  
- chrome公式のTranslator API解説  
https://developer.chrome.com/docs/ai/translator-api?hl=ja
応用情報2024秋 午前問題振り返り

2024年秋の応用情報技術者試験を受験しました。
結果としては、午前合格、午後不合格となりました。

今回、午前試験を受けて、まったく初見の用語が何問か出てきました。（不勉強なだけなところもありますが・・・）

今回は勘で解答し何問か正解したのですが、次回以降で出題された際に再度勘で解答するのは嫌なので、再出題時に備えて1度振り返ってみます。

#### 交差検証
データセットを複数の部分集合に分割し、それぞれの部分集合を交互にテストデータとして使用しながら、残りの部分集合でモデルを学習させる。
の過程を繰り返すことで、モデルの性能を複数回評価し、その平均値を最終的な性能指標として用いる。
【[交差検証とは何か](https://www.netattest.com/cross-validation-2024_mkt_tst)】

#### 量子超越性（Quantum Supremacy）
スパコンを始めとする現在の計算機ではとても長い時間かかる何らかの計算を、量子コンピューターが圧倒的に高速に実行できることを指す。
【[Googleの「量子超越性」実証とは何なのか？](https://www.tsukuba-sci.com/?column01=google%E3%81%AE%E3%80%8C%E9%87%8F%E5%AD%90%E8%B6%85%E8%B6%8A%E6%80%A7%E3%80%8D%E5%AE%9F%E8%A8%BC%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%AA%E3%81%AE%E3%81%8B%EF%BC%9F)】

#### コ・クリエーション戦略
顧客や企業ネットワークの力を活用して、顧客の経験（Customer Experience）の価値を高める新たな商品やサービスをつくり出す差別化戦略。
【[コ・クリエーション戦略とは](https://www.nri.com/jp/knowledge/glossary/co_creation.html)】

#### 魔の川・死の谷・ダーウィンの海
技術の社会実装の過程における以下の3つの難所を指す。また、技術の社会実装の過程は、
1. 研究～
1. 製品開発～
1. 事業化～
1. 市場・産業化

と大きく分けることが可能。

##### 魔の川
　1. 研究～ 2. 製品開発～における難所のこと。

基礎的な研究から始まり、市場ニーズが認められれば、具体的な製品開発に進むことが可能となる。
ただし、実際には研究結果が製品開発に結びつかないことも多いため、その状態を指して魔の川と表現される。

##### 死の谷
　2. 製品開発～ 3. 事業化における難所のこと。

製品開発が行われ、これを事業として収益が得られるようになるには、時間が必要となる。
事業化には、調達、生産、流通の体制構築が必要となり、相当な資金調達が必要。
リスクが大きく、経営判断の難しさから失敗するケースも多いため、その状態を指して死の谷と表現される。

##### ダーウィンの海
　3. 事業化～ 4. 市場・産業化における難所のこと。

事業化された製品を市場に定着させるためには、競合製品との競争に勝ち、顧客から受け入れられる必要がある。
また、新しい技術の場合、既存の技術と置き換えることの意義やメリットを、市場に認知されなければならなず、こうした製品や企業の生存競争を、ダーウィンの進化論になぞらえて、ダーウィンの海と表現される。
【[魔の川・死の谷・ダーウィンの海](https://www.murc.jp/library/terms/ma/devil-river-valley-of-death-darwinian-sea/)】

#### ファインチューニング
事前にトレーニングされたモデルを特定のタスクやユースケースに合わせて調整するプロセスのことを指す。
機械学習モデルの実際の応用において重要な役割を果たし、洗練されたモデルへのアクセスとカスタマイズの民主化に役立つ。
【[ファイン・チューニングとは](https://www.ibm.com/jp-ja/topics/fine-tuning)】

#### ベイズ統計
ベイズの定理をもとにした統計的な考え方の一種。標本を必ずしも必要とせず、確率を導き出す。
主観確率を扱い、機械学習や迷惑メールに活用されている。
【[ベイズ統計](https://www.nri.com/jp/knowledge/glossary/bayesian_statistics.html)】

#### SBOM
製品に含むソフトウェアを構成するコンポーネントや互いの依存関係、ライセンスデータなどをリスト化した一覧表のこと。
【[SBOM（Software Bill of Materials）](https://www.nri-secure.co.jp/glossary/sbom)】

#### インセプションデッキ
プロダクトづくりに関わるメンバーが各々の意見を持ち寄って共通認識をつくり出すための大事な質問、もしくは対話の場を指す。
インセプションデッキの内容は10個の手ごわい質問（タフクエッション）で構成される。
【[インセプションデッキ](https://www.agile-studio.jp/post/apm-inception-deck)】


以上です。
The following error originated from your application code, not from Cypress.

# 概要
RemixのプロジェクトをLocalhostで起動しているforntコンテナに対して、cypress/includedのコンテナからテストするときにタイトルのエラーに苦戦したためメモしておきます。
下記がGithubです。
https://github.com/dbd-fish/react_sample


# 困ったこと
Cypressによるテストを実行したとき`The following error originated from your application code, not from Cypress.`が発生してテストが全てエラーになりました。

# 解決策
下記のように設定して特定のエラーを無視するように設定しました。
``` cypress.config.js
const { defineConfig } = require('cypress');

module.exports = defineConfig({
  e2e: {
    baseUrl: 'https://frontend:5173', // テスト対象のURL
    specPattern: [
       'e2e/cypress/**/*.cy.js', //ローカル環境におけるE2Eテスト
      'front_st/**/*.cy.js',  //画面単位のテスト
    ], 
    // ここでサポートファイルを定義
    supportFile: 'cypress/support/errorHandling.js', 
  },
});

```

``` errorHandling.js
Cypress.on('uncaught:exception', (err) => {
  if (err.message.includes('The following error originated from your application code, not from Cypress.')) {
    return false; // テストの失敗を回避
  }
  return true; // 他のエラーは通常通り失敗として扱う
});
```

# 余談
本エラーについて、Cypress公式のIssuesでいろいろ議論されています。
Hydration errorsが発生していますが、エラーを無視するときのメッセージ指定が[ここ](https://github.com/cypress-io/cypress/issues/27204#issuecomment-1927093633)とは異なったいるため記事にしました。
人によって解決法が違うため本記事を作成しました。
https://github.com/cypress-io/cypress/issues/27204#issuecomment-1927093633
Google Cloudアップデート (1/2-1/8/2025)

### Dataflow: [Jan 6, 2025](https://cloud.google.com/dataflow/docs/release-notes#January_06_2025)
- クライアントライブラリ更新

### Google Cloud Observability: [Jan 6, 2025](https://cloud.google.com/stackdriver/docs/release-notes#January_06_2025)
- Cloud Logging:
  - v2:
    - クライアントライブラリ更新

### Cloud Tasks: [Jan 6, 2025](https://cloud.google.com/tasks/docs/release-notes#January_06_2025)
- v2, v2beta3:
  - CMEK関連のorg policyが使えるようになったよ!

### Media CDN: [Jan 6, 2025](https://cloud.google.com/media-cdn/docs/release-notes#January_06_2025)
- Brotliとgzipを利用した動的なコンテンツの圧縮がサポートされるようになったよ!

### Gen AI on Vertex AI: [Dec 20, 2025](https://cloud.google.com/vertex-ai/generative-ai/docs/release-notes#December_20_2024)
- RAGを簡単に構築できるようにしてくれる[RAG Engine](https://cloud.google.com/vertex-ai/generative-ai/docs/rag-overview)がGAになったよ！
  - 現状us-central1とeurope-west3(preview)だけ
  - Gemini,のほか、Model Garden, Google Embedding/E5 embedding, Model as a Serviceが使える

### Secret Manager: [Jan 6, 2025](https://cloud.google.com/secret-manager/docs/release-notes#January_06_2025)
- クライアントライブラリ更新

### Google Distributed Cloud: [Jan 7, 2025](https://cloud.google.com/kubernetes-engine/distributed-cloud/bare-metal/docs/release-notes#January_07_2025)
- 1.29.900-gke.180リリース
  - 改善、バグフィクス、CVE対応
- 1.31.0-gke.889のリリースノートの修正:
  - GKE Identity ServiceがTLS 1.2, 1.3を使って1.1は:
    - GKE Identity ServiceがTLS 1.2, 1.3を使って、TLE1.1はデフォルトで無効化されてるよ

### GKE: [Jan 7, 2025](https://cloud.google.com/kubernetes-engine/docs/release-notes#January_07_2025)
- 2025-R01バージョンアップのお知らせ

### Batch: [Jan 7, 2025](https://cloud.google.com/batch/docs/release-notes#January_07_2025)
- [GPUを使うジョブをコンソールから作れる](https://cloud.google.com/batch/docs/create-run-job-gpus)用になったよ!

### Google SecOps: [Jan 7, 2025](https://cloud.google.com/chronicle/docs/release-notes#January_07_2025)
- パーサのドキュメント追加



### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートは追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Windowsでログイン、ログオフの時間を自動的に抽出する

1. 以下のコード部分をコピー
1. メモ帳で新規ファイルを作成して、ペースト
1. 名前をつけて保存する（loginLogoff.bat） *.bat拡張子は必須
1. 保存したファイルを開くと、日付ごとにログイン、ログオフ時間が表示される
1. 黒い画面を閉じる


```
@echo off
setlocal enabledelayedexpansion

set "prevDate="
set "firstEvent="
set "lastEvent="

for /f "tokens=1-3 delims=: " %%a in ('wevtutil qe System /q:"*[System[(EventID=6005 or EventID=6006)]]" /rd:true /f:text /c:20 ^| findstr /C:"Date:" /C:"Event ID:"') do (
    if "%%a"=="Date" (
        for /f "tokens=1-2 delims=T" %%x in ("%%b%%c") do (
            set "currentDate=%%x"
            set "currentTime=%%y"
        )
    )else if "%%a%%b"=="EventID" (
        set "eventID=%%c"
        if not "!currentDate!"=="!prevDate!" (
            if defined firstEvent (
                echo !firstEvent!
                if defined lastEvent (
                    if not "!firstEvent!"=="!lastEvent!" echo !lastEvent!
                )
                echo.
            )
            set "firstEvent=Date: !currentDate! !currentTime! - Event ID: !eventID!"
            set "lastEvent="
        ) else (
            set "lastEvent=Date: !currentDate! !currentTime! - Event ID: !eventID!"
        )
        set "prevDate=!currentDate!"
    )
)

if defined firstEvent (
    echo !firstEvent!
    if defined lastEvent (
        if not "!firstEvent!"=="!lastEvent!" echo !lastEvent!
    )
)

pause
```

イベントビューアーから見つけ出すのがめんどくさいので、スクリプトで実行できるようにしました。
役に立てたなら幸いです。
windowsでiverilog その180

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

# 練習問題
Dフリップフロップを書け。

# サンプルコード

```

module dff(input D, clk, output reg Q);
	always@(posedge clk)
		Q = D;
endmodule

module test;
	reg d;
	reg clk;
	wire q;
	task check(input di);
		begin
			d <= di;
			clk <= 'b1;
		#1
			clk <= 'b0;
		end
	endtask
	dff u(.D(d), .clk(clk), .Q(q));
	initial
	begin
		$monitor("d=%d clk=%d q=%d", d, clk, q);
		check('b1);
		check('b1);
		check('b0);
		$finish();
	end
endmodule



```

# 実行結果

```
>vvp a.out
d=1 clk=1 q=1
d=1 clk=1 q=1
d=0 clk=1 q=0
dff4.v:28: $finish called at 3 (1s)
d=0 clk=0 q=0

```

以上。
Pythonで任意フォルダ内の全ての.pyファイルを.txtとしてコピーする

# 任意のフォルダ内の.pyファイルを全て同じ名前の.txtとしてコピーしたい．
![スクリーンショット 2024-11-07 8.48.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/3cb84ba6-175d-f4a1-1f36-0ae59ae3ba28.jpeg)
```copy_py_txt.py
# -*- coding: utf-8 -*-
import os
import shutil

def copy_py_to_txt(folder_path):
    # フォルダ内の全ファイルをリストアップ
    for filename in os.listdir(folder_path):
        # .pyファイルを探す
        if filename.endswith('.py'):
            # 元のファイルのフルパス
            source_path = os.path.join(folder_path, filename)
            
            # 新しいファイル名（拡張子を.txtに変更）
            new_filename = os.path.splitext(filename)[0] + '.txt'
            
            # 新しいファイルのフルパス
            destination_path = os.path.join(folder_path, new_filename)
            
            # ファイルをコピー
            shutil.copy2(source_path, destination_path)
            print(f"Copied: {filename} -> {new_filename}")

# 使用例
folder_path = r'/Desktop/名称未設定フォルダ'  # ここにフォルダのパスを入力してください
copy_py_to_txt(folder_path)
```
**同じファイル名で，拡張子がtxtのファイルがコピーされる．**

![スクリーンショット 2024-11-07 8.50.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/8e574bcb-3044-d156-deeb-7d38bb8feca7.jpeg)
C#の列挙型についてのアウトプット

:::note info
C#の列挙型について学んだことをアウトプットします。
:::
:::note info
確認は .NET9 で行っています。
:::

列挙型はクラスなどの定義と同じように宣言します。
```cs
enum Name
{
    Shion,
    Marine,
    Lamy,
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Name.Shion);
        Console.WriteLine(Name.Marine);
        Console.WriteLine(Name.Lamy);
    }
}

// Shion
// Marine
// Lamy
```

C#の列挙型は内部的にint型の数値を持っているようで、
自動的に`0, 1, 2`と割り振られていくようです。

また、列挙型は数値であれば別の型を内部の型として定義可能です。
string型など数値以外は定義できないようです。

この内部数値を使用して比較処理などを行う場合は明示的にキャストする必要があります。

```cs
enum Name2: short
{
    Shion,
    Marine,
    Lamy,
}

class Program
{
    static void Main()
    {
        for (short i = 0; i < 3; i++)
        { 
            switch(i)
            {
                case (short)Name.Shion:
                    Console.WriteLine("紫咲シオン");
                    break;
                case (short)Name.Marine:
                    Console.WriteLine("宝鐘マリン");
                    break;
                case (short)Name.Lamy:
                    Console.WriteLine("雪花ラミィ");
                    break;
            }
        }
    }
}

// 紫咲シオン
// 宝鐘マリン
// 雪花ラミィ
```

数値であればプログラマー側で任意の値を設定することが可能です。
```cs
enum Name3
{
    Shion = 3,
    Marine = 10,
    Lamy = 55,
}

class Program
{
    static void Main()
    {
        if ((int)Name3.Shion == 3)
        {
            Console.WriteLine("Name3.Shionに割りられた数値は３です。");
        }
        if ((int)Name.Shion != 3)
        {
            Console.WriteLine("そのため、３以外の数値は一致しません。");
        }

        Console.WriteLine();
    }
}

// Name3.Shionに割りられた数値は３です。
// そのため、３以外の数値は一致しません。
```
paizaラーニングレベルアップ問題集の「1つの文字列を出力」をやってみた。

paizaラーニングレベルアップ問題集の[1つの文字列を出力](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__stdout_1)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__stdout_1
- - -
###### C
```c
#include <stdio.h>

int main() {
	puts("paiza");
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	cout << "paiza" << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		Console.WriteLine("paiza");
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	fmt.Println("paiza")
}
```
- - -
###### Java
```java
public class Main {
	public static void main(String[] args) {
		System.out.println("paiza");
	}
}
```
- - -
###### JavaScript
```js
console.log("paiza");
```
- - -
###### Kotlin
```kotlin
fun main() {
	println("paiza")
}
```
- - -
###### PHP
```php
<?php
	echo "paiza" . PHP_EOL;
?>
```
- - -
###### Perl
```pl
print "paiza$/";
```
- - -
###### Python3
```py
print("paiza")
```
- - -
###### Ruby
```rb
puts "paiza"
```
- - -
###### Scala
```scala
object Main extends App{
	println("paiza")
}
```
- - -
###### Swift
```swift
print("paiza")
```
［ServiceNow］Field Labels（sys_documentation）について-物理名と論理名の変換-

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

Field Labels（物理名：sys_documentation）テーブルには、論理名通り、テーブルの列（フィールド）の論理名が記載されています。

# sys_documentationの使用目的
- 〇〇テーブルについて列の論理名（日本語名、英語名）を知りたいとき

# Field Labels(sys_documentation)テーブルの確認方法

- Filter navigatorに、「sys_documentation.list」と入力して、Enterを押します
- sys_documentationのlist画面が表示されます
- 各レコードが、１つテーブルの列について記載されています
![FieldLabels.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/c5a62861-9f8c-96b0-3911-b34796aa66b4.png)
- これですべてのテーブルの列の論理名についてアクセス可能です

# sys_documentationのフィールドについて
sys_db_objectのフィールドについて紹介します
※歯車マークからフィールド値が確認できます

- Table：列を使用しているテーブルの物理名
- Element：列の物理名
- Language：日本語または英語の論理名
- Label：列の論理名（日本語と英語がある）
- plural(プルーラル)：ふくすうｋ

# 参照
https://www.servicenow.com/docs/ja-JP/bundle/xanadu-platform-administration/page/administer/localization/reference/r_FieldLabelTable.html
Javaで「ラベルに表示される文字列の水平及び垂直位置を設定する」の動作を確認してみた。

# 概要

Javaで「ラベルに表示される文字列の水平及び垂直位置を設定する」の動作を確認してみました。
以下のページを参考にしました。

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

# 実装

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

```Sample.java
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Dimension;

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

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

    JLabel label1 = new JLabel("Hello!");
    label1.setOpaque(true);
    label1.setBackground(Color.YELLOW);
    label1.setPreferredSize(new Dimension(100, 100));
    label1.setHorizontalAlignment(JLabel.LEFT);

    JLabel label2 = new JLabel("Good!");
    label2.setOpaque(true);
    label2.setBackground(Color.GREEN);
    label2.setPreferredSize(new Dimension(100, 100));
    label2.setHorizontalAlignment(JLabel.CENTER);

    JLabel label3 = new JLabel("Bye!");
    label3.setOpaque(true);
    label3.setBackground(Color.RED);
    label3.setPreferredSize(new Dimension(100, 100));
    label3.setHorizontalAlignment(JLabel.RIGHT);

    JPanel p = new JPanel();
    p.add(label1);
    p.add(label2);
    p.add(label3);

    add(p, BorderLayout.CENTER);
  }
}
```

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

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

実行結果は以下の通りです。

![Screenshot from 2025-01-14 07-25-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/996cae67-352c-6488-bda0-2d4cca7ed487.png)

# まとめ

何かの役に立てばと。
［ServiceNow］Dictionary Entries（sys_dictionary）について

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

ServiceNowは、業務管理サービスで、業務で使用するデータから、ServiceNowに元から存在する機能まですべてテーブルで管理されています。

存在するすべてのテーブルの定義について、まとめられたテーブルがTablesテーブル（sys_db_object）になります。

また、各テーブルのすべての列の定義が含まれているテーブルが、Dictionary Entries(sys_dictionary)テーブルになります。

今回は、Field Labels(sys_dictionary)テーブルについて説明します。

# sys_dictionaryの使用目的
- 〇〇テーブルについて列の定義を知りたいとき

# Field Labels(sys_dictionary)テーブルの確認方法

- Filter navigatorに、「sys_dictionary.list」と入力して、Enterを押します
- sys_dictionaryのlist画面が表示されます
- 各レコードが、１つテーブルの列について記載されています
![Dictionary Entries.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/e52e2c72-6daa-0f7c-8e36-71029fd758ba.png)

- これですべてのテーブルの列の定義についてアクセス可能です

# sys_dictionaryのフィールドについて
sys_dictionaryのフィールドについて紹介します
※歯車マークからフィールド値が確認できます

- Table：列を使用しているテーブルの物理名
- Column name：列の物理名
- Column label：列の論理名
- Type：列の型
- Reference：参照について
- Reference qual condition：参照する際に条件を指定する
- Defalut value：初期値

# sys_dictionaryのフォーム画面について
- sys_dictionary.listの画面から、任意のレコードを押下して、フォーム画面に遷移します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/53170e2e-cc05-c754-1593-15ec759e160f.png)
- Reference Specificationから参照する条件の詳細を確認できます

- フォーム画面の関連リスト
    - Labelsタブからテーブルの日本語名を確認できます
販売管理システムの商品マスタ　単価について SQL

# 概要

試した忘備録として記録に残します。
内容は以下３点になります。
・単価について説明
・DDLでサンプルデータを定義
・DMLで想定される処理を再現


# 用語

## 販売単価
商品の定価。
得意先ごとに販売単価が変化する場合がある。
例えば大口のお客様に対しては販売価格が安くなるなど
別称は「標準販売価格」、「上代」とも


## 仕入単価
仕入先から商品を仕入れる際の標準的な単価。
別称は「標準仕入れ価格」、「下代」とも



# 例

## 実現したいこと
商品名「牛ヒレ」に対して、３種類の得意先の販売単価を取得したい。

販売単価は1500

得意先コード|得意先名|顧客別販売単価
----------|--------|------------
00001|初見|1700
00002|常連|1000
00003|グループ会社|900



※顧客別単価表方式は「得意先×商品」を採用。
他の顧客別単価表方式に
「得意先グループ×商品」
「得意先グループ×商品グループ」
などが挙げられる。


## 動作環境

名称|version|説明
---|--------|---
SQLite|-|軽量型RDBMS
Docker|-|コンテナ型仮想化技術
Github Codespaces|-|クラウドIDE


## DDLとInsert文

```sql
-- docker-compose exec -it webserver bash
-- sqlite3 03_hanbai/ch3-4_master/test.sqlite3  < 03_hanbai/ch3-4_master/product/m_products.sql

create table m_products(
    code char(3) PRIMARY KEY,
    official_name varchar(50),
    kana varchar(50),
    serial_number varchar(20),
    purchase_price int,
    sale_price int,
    tax_classification char(1),
    classification_code char(9) not null,
    updated_at timestamp not null,
    updated_by varchar(10) not null,
    remark varchar(100)
);

insert into m_products values
-- 販売単価と仕入単価
('001','牛ひれ','ギュウヒレ','1129',1000,1500,'1','010101','2020-01-01 00:00:00','SYSTEM',"");

drop table if exists sales_price_by_customer;

create table sales_price_by_customer(
    product_code char(3) not null,
    customer_code char(5) not null,
    sale_price int not null,
    primary key(product_code,customer_code)
);

insert into sales_price_by_customer values
('00001','00001',1700),
('00001','00002',1000),
('00001','00003',900);
```




## SQL文

```sql
-- docker-compose exec -it webserver bash
-- sqlite3 03_hanbai/ch3-4_master/test.sqlite3 < 03_hanbai/ch3-4_master/product/getSalePriceByCustomer.sql
select  a.code,
        CASE b.customer_code
            WHEN '00001' THEN '初見'
            WHEN '00002' THEN '常連'
            WHEN '00003' THEN 'グループ会社'
        END,
        b.sale_price
from m_products as A,sales_price_by_customer as B
where A.official_name = '牛ひれ'
and A.code = B.product_code
;
```


## 結果


A.code|B.customer_code|B.sale_price
------|---------------|----------
001|初見|1700
001|常連|1000
001|グループ会社|900

# 最後に

「得意先グループ×商品」
「得意先グループ×商品グループ」
のパターンも時間があったら確認しときたいですね。

# 参考

グラス片手にデータベース設計　販売管理システム編　著者：梅田弘之 p53

github　履歴

https://github.com/RYA234/routine_tool/commit/6baea6ca69cb4931c5bc2d83dc794452b9e7b763
DBeaverのセットアップ

## 1.DBeaverをダウンロード
[DBeaver](https://dbeaver.io/download/)

上記の URL から使用しているOS に合わせてダウンロード。
ダウンロードできたら、DBeaver を開く。

※DBeaver で MySQL を使用するための設定を行なっていくが、その前に MySQL を起動する必要がある。
ターミナルでコマンドを実行して、MySQL を起動しておき、起動が成功したら、DBeaver を開いて設定する。

## 2.DBeaverのセットアップ

DBeaver を開いて画像のような画面が出てきたら、
左上の青色コンセントマーク(+付)をクリック。
（赤丸部分）
![スクリーンショット 2025-01-14 6.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965519/7c03f0d1-7b80-66b3-c2ef-01fb31f35830.png)

ここから、どの DBMS を使ってどのユーザーでログインするのかを指定することができる。
まだ root ユーザーしか作成していないので、
ここでは MySQLのrootユーザーでログイン。

以下のようなウィンドウが表示されたら、MySQLを選択して、次に進む。

![スクリーンショット 2025-01-14 6.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965519/be53a81f-9264-5f3e-1f9c-cbfd3ed13af8.png)


Server Host : localhost
Port : 3306
ユーザー名 : root
が入っていることを確認。
パスワードは、MySQL のセットアップ時に設定した場合(Windows)は各自入力。
※Macの場合は空白で良い

![スクリーンショット 2025-01-14 6.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965519/405834e0-5f75-6a30-f371-d80cea5e9048.png)

入力が完了したら、左下にある「テスト接続」をクリックして接続を試す。
接続が成功していれば終了をクリック。
もし、接続に失敗した場合は以下を確認。

①MySQL が起動されていない。
②Server Host, Port, ユーザー名, パスワードのいずれかが間違っている。
［ServiceNow］Tables（sys_db_object）について

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

ServiceNowは、業務管理サービスで、業務で使用するデータから、ServiceNowに元から存在する機能まですべてテーブルで管理されています。

存在するすべてのテーブルの定義について、まとめられたテーブルがTablesテーブル（論理名）であり、その物理名がsys_db_objectになります。

# sys_db_objectの使用目的
- 〇〇テーブルについて情報が知りたい場合

# Tablesテーブル［sys_db_object］の確認方法

- Filter navigatorに、「sys_db_object.list」と入力して、Enterを押します
- sys_db_objectのlist画面が表示されます
- 各レコードが、１つのテーブルになっています
![sys_db_object.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/6c3a953f-7d71-14d2-cc34-20f335ad100d.png)
- これですべてのテーブルの定義についてアクセス可能です

# sys_db_objectのフィールドについて
sys_db_objectのフィールドについて紹介します
※歯車マークからフィールド値が確認できます

- Label：テーブルの論理名
- Name：テーブルの物理名

# sys_db_objectのフォーム画面について
- sys_db_object.listの画面から、任意のレコードを押下して、フォーム画面に遷移します
![form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/d2ca0c12-5503-7240-2c8d-2f34b097bdd7.png)
- Columnsというタブには、そのテーブルで使用される項目？が記載されております
    - こちらはsys_dictionaryテーブルから、開いたテーブルのデータを参照しています
        - そのためExcelに落とすためにはsys_dictionary.listに移動してそちらからテーブルの物理名などで絞って落とします
    - こちらの歯車マークでフィールド値を絞ると、様々な情報が取得できます
        - Column label：カラムの論理名
        - Column name：カラムの物理名
        - Type：カラムの型
        - Max length：入力項目の最大値
        - Defalut value：初期値を設定

- フォーム画面の関連リスト
 ![関連リスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/45268ec5-dd8b-9d62-ebcd-d62ccb2c12f4.png)
    - Labelsタブからテーブルの日本語名を確認できます
MySQL のインストール(Mac)

**1. MySQL のインストール**

MySQL のインストールは以下 2 つの手順で行う。

①Homebrew のインストール
②MySQL のインストール

・①Homebrew のインストールの確認
ターミナルに
```
brew -v
```
を入力する。

バージョンが表示されれば、PC には既に Homebrew がインストールされているため、②「MySQL のインストール」へ進む。

Homebrew がインストールされていない場合は、ターミナルに
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
を入力。

Enter の入力を促されたら、Enter を押下。
PC のパスワードを求められたらパスワードを入力。
brew -v を入力して、バージョンが表示されれば、Homebrew のインストールは完了。

②MySQL のインストール

Homebrew を使って、MySQL をインストールしていく。
```
brew install mysql
```
を入力。
Mac を使った MySQL のインストールはこれで終了。

**2. MySQL がインストールされたかどうかの確認**

再度、
```
mysql --version
```
をターミナルに打ち込む。
バージョンが表示されればインストール完了。

**3. MySQL の起動**

MySQL の起動は以下 2 つの手順で行う。

①MySQL の起動
②MySQL にログイン

```
brew info mysql
```
で、インストールした MySQL の内容を確認。

①MySQL の起動

ターミナルに
```
brew services restart mysql
```
と入力。

```
Successfully started mysql (label: homebrew.mxcl.mysql)
```
というメッセージが表示されれば、起動が成功している。

②MySQL にログイン
MySQL を起動したら今度はログインする。
ターミナルに
```
mysql -uroot
```
と入力。

ログインに成功すると以下のように入力画面が変わる。
![スクリーンショット 2025-01-14 5.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965519/028f31f2-dbc0-5eba-fb6d-24b9a9e5b975.png)

これで、SQL を使用する準備完了。


**※MySQL からログアウトするには**
```
exit;
```
を入力。
ターミナルに戻れる。


**※MySQL を停止するには**
```
brew services stop mysql
```
を入力。

```
Successfully stopped mysql (label: homebrew.mxcl.mysql)
```
というメッセージが表示されれば、MySQL の停止は完了。
【React × Spring Boot】音楽ライブ専用SNSアプリ

![small.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/a4b317f9-2625-e27f-f62a-9c6bfac8ed03.jpeg)



## 初めに
この記事の筆者はWebエンジニアとして実務経験が2年で現在就職活動中の人間です。
仕事探しのきっかけかつ趣味として本アプリを開発しました。


本アプリは音楽好きの人に向けたSNSアプリです。一言で説明するとXとnoteとLiveFans(ライブ情報共有サービス)を足して3で割ったアプリ（になれば嬉しい）です。私はロックバンドが好きでライブの感想や新曲の感想などを発信して好きな人同士でワイワイと語りたいという思っています。現在そのような需要はXが担っていると思うのですがより平和的で音楽に特化したSNSがあればいいなと考え本アプリを開発しました。

冷やかしでもいいので見ていってくださると嬉しいです。

[LikeLive](https://likelive.xyz "LikeLive")



## 機能について
#### ブログ作成機能
リッチテキストエディタはTiptapで実装。
![スクリーンショット 2025-01-13 15.30.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/808230f6-f257-7a9d-79e5-f7c29423a414.png)

ブログとアーティストの紐付けやセットリストの追加が可能。
![スクリーンショット 2025-01-13 15.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/5571d3d2-54de-9a69-974a-ba595e679925.png)

#### ブログ検索機能
単一のキーワードで関連記事の検索が可能。ブログの投稿日といいね数でソートができる。
ページネーションではなく無限スクロールで実装。

![スクリーンショット 2025-01-13 16.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/98e3e521-4602-8678-9e99-0bc57d0204e1.png)


#### ユーザ機能
![スクリーンショット 2025-01-13 16.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/960b5db8-be38-5216-d916-c5b879485c2a.png)

アーティスト情報はSpotifyAPIで検索し好きなアーティストとして登録できる
![スクリーンショット 2025-01-13 16.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/d2dd937e-2318-1361-6502-46656fe7c59f.png)

共通のアーティストを登録しているユーザはレコメンドされる
![スクリーンショット 2025-01-13 16.19.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/1a5ce826-12c6-e0dc-03df-ed5fccab48eb.png)

## 使用技術
React (バージョン:18.3.1)
Spring Boot (バージョン:3.2.5)
MySQL (バージョン:8.3.0)
OAuth(Google)
AWS

### ER図
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950920/af576a89-342a-54d4-7f05-4d3bcdd335af.png)


## 今後の課題
・検索機能の改善
現在はDBでキーワード検索をしているのでコンテンツが増加に応じてパフォーマンス懸念がある
→ElasticSearchの導入（高速な全文検索エンジン）
・アーティストの最新情報の取得
お気に入りに登録しているアーティストの最新情報（ライブ情報や新曲情報など）を取得してユーザに表示する機能の追加
→利用可能なAPIなどを調査（X APIが有力だったが高額すぎて断念）

## 最後に
ここまで読んでいただいてありがとうございます。ご指摘ご意見ガンガンお願いします。
Windowsのパッケージマネージャ「Scoop」のインストール方法

# 初めに
本記事では、Windowsのパッケージマネージャ **「Scoop」** のインストール方法について解説します。
下記は、**「Scoop」** の公式サイトです。

https://scoop.sh/

---

# インストール方法について

インストール方法について解説します。解説と言っても公式サイトに記載されているの通り、 **「PowerShell」** を起動して下記のコマンドを実行するだけです。

```powershell:インストールコマンド
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
```

**【公式サイトのQuickstart】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/c4799d9e-01d6-2cf7-ead4-d21f69182036.png)

**【PowerShellの実行結果】**
実行後以下のように表示されたら成功です。

```powershell:実行結果
PS C:\Users\ht-03> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\Users\ht-03> Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
Initializing...
Downloading...
Extracting...
Creating shim...
Adding ~\scoop\shims to your path.
Scoop was installed successfully!
Type 'scoop help' for instructions.
PS C:\Users\ht-03>

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/b2ef8750-fcf8-160b-9525-29ba89dcd336.png)

---

# Scoopが正常にインストールされたか確認
**「Scoop」** が正常にインストールされたか確認するために、下記のコマンドを実行してください。

```powershell:「Scoop」のバージョン確認コマンド
scoop --version
```

**【PowerShellの実行結果】**
実行後以下のように表示されたら成功です。
```powershell:実行結果
PS C:\Users\ht-03> scoop --version
Current Scoop version:
v0.5.2 - Released at 2024-07-26

PS C:\Users\ht-03>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/3f404a8f-1a23-d7b4-285e-137773006540.png)
2025/1/14主にITとかセキュリティの記事

Microsoft Azure OpenAI Service：ハッキンググループによる安全対策突破で大規模不正利用が発覚(1/12)
https://innovatopia.jp/cyber-security/cyber-security-news/46428/

OpenAIのクローラーボットが3Dスキャンデータ販売サイトをほぼDDoS攻撃な徹底スクレイピングでダウンさせていた(1/11)
https://gigazine.net/news/20250111-openai-bot-crushed-e-commerce-site/

専門家がAIを搭載した高度なフィッシングから安全に保つためのヒントを共有する(1/12)
https://voi.id/ja/teknologi/450436

SORM：ロシア製通信監視システムが中南米・中央アジアに拡大、西側企業のセキュリティリスク増大(1/11)
https://innovatopia.jp/cyber-security/cyber-security-news/46395/

すごいログ分析ツール TWSLAの紹介(1/12)
https://qiita.com/twsnmp/items/82bc6e0e987ee269d26f

カスペルスキーがフィッシング詐欺を微調整するAIの危険性を明らかに(1/12)
https://voi.id/ja/teknologi/450378

AndroidでYouTube・ブラウザの広告をブロックする方法まとめ(1/12)
https://www.lifehacker.jp/article/2501-ad-blocker-android/

AWS CDK のカスタムリソースを使って単一のアカウントで Inspector を有効化してみた(1/12)
https://dev.classmethod.jp/articles/aws-cdk-custom-resource-inspector-enabler/

AI導入に伴うリスクとその対策とは？カスタマークラウドの取り組み
https://news.3rd-in.co.jp/article/a230f7e0-d065-11ef-8833-9ca3ba083d71#gsc.tab=0

CFPB新規制案：バイデン政権末期のステーブルコイン規制強化、トランプ新政権で規制緩和の可能性も(1/11)
https://innovatopia.jp/blockchain/blockchain-news/46398/

ドイツ BSI AIの説明可能性に関するホワイトペーパー(1/12)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-9427e1.html

人間のID数の45倍「マシンID」、AI普及でサイバー脅威に(1/12)
https://www.nikkei.com/article/DGXZQOUE011LA0R00C25A1000000/

「DDoS攻撃」年末以降 国内の航空会社など46の組織が標的に(1/12)
https://www3.nhk.or.jp/news/html/20250112/k10014691191000.html

AWS S3に関連する用語とその活用法(1/10)
https://qiita.com/kenogi/items/2e52c437a50625d71b11

〈社説〉サイバー防御　厳格な歯止めが不可欠だ(1/12)
https://www.shinmai.co.jp/news/article/CNTS2025011200013

相次ぐ海底ケーブル損傷 ロシアの「ハイブリッド攻撃」か(1/12)
https://www3.nhk.or.jp/news/html/20250112/k10014691431000.html

パソコンが欲しいなと思っていたところ、折り込み広告で「譲渡会」が開かれるのを見つけました。こういった所であれば安く手に入るのでしょうか？(1/12)
https://financial-field.com/living/entry-362709

Webアプリ受託界隈の品質有象無象問題を何とかしたい(1/11)
https://zenn.dev/ad5/articles/f31d88d8dc9a7f

ベトナムはデジタル時代に繁栄: コア技術を優先(1/11)
https://www.vietnam.vn/ja/viet-nam-vuon-minh-trong-ky-nguyen-so-uu-tien-cong-nghe-loi/

中国 2023年8月から2024年12月末までに届出があった生成的AIサービスは302件、API利用したサービス105件(1/12)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-269277.html
【備忘録】 mod_remoteip でX-Forwarded-For(apache)

## やり方
```
sudo apt update
sudo a2enmod remoteip
sudo systemctl restart apache2
```

で有効化

そしてapacheの設定ファイル`/etc/apache2/apache2.conf`(僕の場合)の一番下に書き込む

```/etc/apache2/apache2.conf
RemoteIPHeader X-Forwarded-For
```
 ~終~