OmniAICreator/Qiita-1.07M huggingface dataset:
ゲームで良く使われる2進数,16進数について

こんにちは！
株式会社OGIX クライアントエンジニアのT.Iです！（弊社については最後に紹介があるのでぜひ見てください）

最近久しぶりにC++に触れる機会があり、ポインタでアドレス指定とかC#では殆どしないよな～と思いました。
その時に番地とかに使われる進数表記について纏めてみるか～といった気分になったので纏めていけたらなと思います。

## そもそも進数とは？
進数とは…

>あらかじめ定められたN 種類の記号（数字）を列べることによって数を表す方法。
（Wikipediaより抜粋）

との事です。

例えば
私たちが日常使用している10進数の場合だと、1つの位の値は0 ~ 9までを使用しますよね？
9に1を足す場合は位が1つ上の値を+1して元の位の値は0にします。（10になる）

これは0 ~ 9の10種類の記号（数字）を列ねることで数を表しています。

## 2進数とは
コンピューターの世界では、すべてのデータを2進数で表しています。
2進数というのは、1桁で0か1を使って表しています。

2進数の1桁では0か1なので 2通りになります。
このコンピューターのデータ最小単位を 1ビットといいます。

2は10、3は11、そしてまた桁上りします。
3桁なら3ビット、4桁なら4ビットとなっていきます。

## コンピューターが2進数を使用する理由
コンピューターが2進数を使用する理由はIC（Integrated Circuit＝集積回路）と呼ばれる電子部品から構成されていることが関係しています。
ICの各々のピンに電気で情報が与えられることによりコンピューターは動作しています。
そしてそれぞれのピンは0Vと5Vの電気のみを扱えるような仕組みになっています。
この0Vと5Vが2進数の0と1に該当するというわけですね。

IC
<img width="200" alt="integratedCircuit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565804/3ca4372f-9bda-6a86-c2ad-56936d06efe4.png">

:::note warn
他の電圧のペアが使用される場合もあります
:::

つまり、ICは複数のピンを使用することにより複数桁の2進数表記で表しているということです。

なお、2進数で数値を表す場合に0101のように上位の桁が0の場合でも0を明示している場合がありますが、その2進数を表すのにICのピンを何本使用しているのかの明示している為だと考えてください。
つまり、もし8本のピンで1を表す場合
00000001という8桁の2進数となります。

## 16進数とは
>16倍ごとに1桁繰り上がる計数法。2進数の4bit（1ニブル）で、16進数の1桁を表す。

ICでは2進数を使用して数値などを表現していますが人間にとっては分かりづらいため、一般的に2進数を4bit毎に区切って16進数として数値を表記します。

16進数は2進数を4bit毎に纏めたもので、8bit,16bit,32bit等の長い2進数も、16進数表記であれば短く表現できます。
| 2進数 | 10進数 | 16進数 |
|---:|---:|---:|
|0001|1|1|
|0010|2|2|
|0001 0000|16|10|
|0110 0100|100|64|
|1 0000 0000 0000 0000|65536|10000|


# 2,10,16進数表
| 10進数 | 2進数 | 16進数 |
|---:|-----:|--:|
| 0  | 0    | 0 |
| 1  | 1    | 1 |
| 2  | 10   | 2 |
| 3  | 11   | 3 |
| 4  | 100  | 4 |
| 5  | 101  | 5 |
| 6  | 110  | 6 |
| 7  | 111  | 7 |
| 8  | 1000 | 8 |
| 9  | 1001 | 9 |
| 10 | 1010 | a or A |
| 11 | 1011 | b or B |
| 12 | 1100 | c or C |
| 13 | 1101 | d or D |
| 14 | 1110 | e or E |
| 15 | 1111 | f or F |

## まとめ
・2進数が使われる理由
IC（Integrated Circuit＝集積回路）のピンに電気で情報を与えるため、0か1で情報をやり取りする仕組みになっている。

・16進数が使われる理由
2進数で大きな数値を表現しようとするととても長くなるため、人間にとって少しでも読みやすくするため。

今回はこちらを理解されていれば問題ないかと思います。

## 一緒に働く仲間を募集しています！
株式会社OGIXでは一緒に働いてくれる仲間を募集しています！
エンタメ制作集団としてゲームのみならず、未来を見据えたエンタメコンテンツの開発を行っています。

事業拡大に伴い、エンジニアさんを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/company_6473754/about
▼代表インタビュー
https://www.wantedly.com/companies/company_6473754/post_articles/443064
▼東京オフィスの応募はこちら
https://www.wantedly.com/projects/1468324
▼新潟オフィスの応募はこちら
https://www.wantedly.com/projects/1468155
【BizRobo!・DS】正規表現を用いてファイル存在有無を確認する方法

## はじめに
BizRobo!でロボット作成をしている時、**フォルダ内に「特定の拡張子(.xlsxや.pdf等)」や、「名前」を持つファイルだけを処理したい**シーンが多くあると思います。

筆者も実際に、「どんな感じでロボットを作成すればいい？」「Test Stepで特定の拡張子だけを処理するように設定すれば良いのか…？」などと迷走しておりました。

今回は、そのような場合に使えるロボットの作り方を取り上げます。

## 実際の作り方
今回のような場合は、DSで**正規表現**を使用して、特定のファイルだけをすくい上げるようなイメージで処理を作成したいと筆者は思っていました。
（他に楽な方法などあればご教授ください…。）

そんな時に見つけた方法が下記ナレッジの方法でした。

正規表現を使った方法としてシンプルめで良い方法だなと思い、普段から活用させてもらってます。

https://knowledge.bizrobo.com/hc/ja/articles/360050293131-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%AD%98%E5%9C%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B-%E4%B8%80%E9%83%A8%E3%81%8C%E5%8F%AF%E5%A4%89%E3%81%AE%E5%A0%B4%E5%90%88

## おわりに
今回は正規表現を使用したファイル存在有無チェックの方法を取り上げました。

Test Step１つで上記動作を実現しようとしていましたが、仕様的に不可能でした…。

そんな時は１つのステップに固執せず、複数ステップを組み合わせて柔軟にロボットを作成していきましょう。
DBに関するブランチは別で作成しろ

複数人でDBのスキーマファイルを書いていたが、DB専用のブランチを作らずに作っていたため、他ブランチでスキーマファイルをA君がエラー修正のために更新しても、B君は以前のメインブランチにあファイルから編集しているので、マージしたときはA君のエラー修正が反映されていない状態だった。

DBはDBでブランチを分けて作ろう。
「巻き上げ」の誤解 ~TypeScript編~【JS TS】

# はじめに

先日、JavaScriptにおける「巻き上げ」について調べました。

https://qiita.com/kohki_takatama/items/0aeb419bda555f8c240e

https://qiita.com/kohki_takatama/items/eef7c8202628f2d90745

この「巻き上げ」について、TypeScriptでは挙動が違うようです。

# 「変数」の巻き上げ

まず、変数の巻き上げです。
## 【JavaScriptの場合】
- `var`で宣言し、宣言前に呼び出すと`undefined`を返す
- `const`で宣言し、宣言前に呼び出すと`ReferenceError`を発生させる
```js
console.log(str_var) //undefined
console.log(str_const) //ReferenceError

var str_var = 'var'
const str_const = 'const'
```
## 【TypeScriptの場合】
- `var`で宣言し、宣言前に呼び出すと<font color="LimeGreen">コンパイラが指摘してくれる</font>
- `const`で宣言し、宣言前に呼び出すと<font color="LimeGreen">コンパイラが指摘してくれる</font>
![スクリーンショット 2024-04-15 8.07.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/e817dbc0-54ce-e153-fcbd-b3dea5f845f3.png)

![スクリーンショット 2024-04-15 8.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/afe8536e-7857-3809-fe35-7e878d58e5ea.png)

`var`の場合でもちゃんと指摘してくれるんですね！偉い！~~`var`を使うことはないけど・・・~~
`const`に対しても、「宣言前・初期化前（割当前）に呼び出してますよ！」って教えてくれてますね。ここはJavaScriptからの正当進化という感じ。

# 「関数」の巻き上げ

JavaScript / TypeScriptにおいて、関数の定義方法は主に2種類あります。
**関数宣言**と**関数式**です。

```js
// 関数宣言
function hello() {
  console.log('hello!')
}

// 関数式
const hello = function() {
  console.log('hello!')
}

// 関数式（アロー関数）
const hello = () => {
  console.log('hello')
}
```

## 【JavaScriptの場合】
- 関数宣言の場合、定義前に呼び出すと「問題なく実行される」
- 関数式の場合、定義前に呼び出すと`ReferenceError`を返す
```js
hello_dec(); // 出力：hello dec!
hello_ex(); // ReferenceError

function hello_dec() {
  console.log('hello dec!')
}

const hello_ex = function() {
  console.log('hello ex!')
} 

// "dec"は"declaration(宣言)"・"ex"は"expression(式)"を表す
```
## 【TypeScriptの場合】
- 関数宣言の場合、定義前に呼び出すと「問題なく実行される」
- 関数式の場合、定義前に呼び出すと<font color="LimeGreen">コンパイラが指摘してくれる</font>
![スクリーンショット 2024-04-15 8.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/1623b7a5-aabf-fff9-7800-f40f0efbc0c5.png)

![スクリーンショット 2024-04-15 8.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/395a3819-de4a-a0b1-48b2-13e1e1fb9596.png)

JavaScriptとほぼ変わらないですね！実行前にわかるかどうか。
関数宣言の場合はTypeScriptでも弾かないんですね。
# おわりに
JavaScriptでもTypeScriptでも「関数宣言は巻き上げられる（定義前の呼び出しが可能）」なので、宣言前の呼び出し許さないマンの方は、関数宣言ではなく関数式`const = fucntion() {}`を使用しましょう。
<br>

しかし、実際のところ関数の巻き上げを制限する理由ってあるんでしょうか・・・
バグの温床！というのはわからんでもないけど、実務経験がなく実感はないんですよね。

`var`に比べれば好みの問題に収まってる話のような気はしてます。
（個人的には、アローが好きなので関数式派閥です。）

さて、次は何を書こうかしら・・・
npmからpnpmに移行するときビルドが通らない

場当たり的に解決できたのでメモ。
詳細が分かる方は編集リクエストかコメントください。🙇

## TL;DR
```sh:pnpm install
pnpm install --shamefully-hoist
```

## 環境
**OS**: Windows 11 Home 23H2
**Laravel**: 8.83.27
**Node.js**: v12.19.0
**pnpm**: 5.18.10

## 雑な説明

パッケージのインストール時、シンボリックリンクに対応するオプションを指定すると`node_modules/`以下が`npm install`のファイルパスとほぼ同じになる。
StampS3のSPIで遊ぶ。


目的
オリジナルの74HC164を使ったハードで遊ぶ


![o_coq039.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a996c3aa-72d6-2e56-d401-ad7742b7055e.jpeg)



```c++


//SPI_test1_M5S3


//インクルド
#include <SPI.h>


//定義
#define DW    digitalWrite

//#define s60() for(ii=0;ii<60;ii++)delay(1000);
#define s60() delay(1000);


//初期化
void setup() {
  
  int ii; //ループカウンター
  
  // SPIの初期化
  //SPI.begin(); // CLK-18 MOSI-23
  //SPI.begin(sck,miso,mosi,ss);
  //SPI.begin(39, 40, 41, -1);
  //SPI.begin(7, -1, 9, -1);
  SPI.begin(9, -1, 7, -1);


  //DW(SS, LOW); // 
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // 2Mhz
    
} //setup


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

  //0
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //1
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0x55);//DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //2
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0xaa);//DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //3
  SPI.transfer(0x00);//DW(SS,HIGH);DW(SS,LOW);
  SPI.transfer(0xff);//DW(SS,HIGH);DW(SS,LOW);
  s60();

} //loop



```
オフショアを活用した内製開発チームを発足してみた

# はじめに
我々ポーラオルビスホールディングスでは2023年より内製開発に挑戦しております:muscle:
今回は開発を推進している体制についてご紹介させていただきます:smile::mega:

# 開発体制図
業務委託の方を含む社内エンジニアとラボ(オフショア)エンジニアが協働しながら開発を行うアジャイル・スクラムチームを組成しています:rugby_football::rugby_football::rugby_football:
社員のみで組成されているわけではないのですが、社内に開発チームを組成して推進するという意味で内製開発と呼んでいます:star2:

![開発体制キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739961/c1567b77-d5d9-7774-fb98-3a8093e8c165.png)


# 社内エンジニアとラボエンジニアの業務分担
スクラムスタイルのため明確な業務の分離はしていませんが、ざっくり下記のような分担になっています。

:computer:社内:computer: 設計、開発、テスト、オフショア受入対応
:computer:ラボ:computer: 開発、テスト、(設計)

昨年までは社内エンジニアが2名しかおらず、社内エンジニアの業務は設計やオフショア受入対応で工数がいっぱいになってしまい、開発を行う余裕が無くなってしまいました:cry::droplet:
そのため、社内エンジニアは設計とオフショア受入対応、ラボは開発と分業に近い形になってしまい業務分担のバランスが悪くなってしまうことが課題でした:cold_sweat::droplet::droplet:
このような経緯があり、今年から社内エンジニアを4名に増員してバランスを改善しています:sparkles:


# スクラムイベントの実施方法
社内＋ラボで一つのアジャイルスクラムチームの形をとっているので、スクラムイベントはラボも含めて全体で取り組んでいました:beach_umbrella:
ですが、言語の壁があり社内エンジニアとラボエンジニアが直接会話することは難しく、スクラムイベントを全体で行う効果があまり感じられなかったため、現在はスクラムイベントを社内エンジニア＋ブリッジSEのみで行っております:cherry_blossom:


# 社内エンジニア内の業務分担

社内エンジニアの開発業務に関しては、経験・志向性やチームの状況に合わせてバックエンド、フロントエンド領域問わず分担しています:ocean:
未経験の領域でも挑戦の機会があり、フルスタックなスキルを身に着けることができます:raised_hands_tone1::sparkles:

# さいごに
現在はこのような体制で開発を行っていますが、これから開発体制を拡張していきたいと思っておりますので開発エンジニアを募集しています:pray_tone1:
開発チームが所属しているグループデジタルソリューションセンターの採用ページはこちらです！興味がある方はぜひご覧ください:relaxed::purple_heart:

https://engineer.po-holdings.co.jp/
Windowsでvhdxファイルサイズを縮小する

## やりたいこと
WindowsのDockerやRancherDesktopで使用するvhdxファイルのサイズを小さくしたい。

コンテナイメージをたくさん作成したり、コンテナのストレージサイズを消費したりすると、vhdxファイルが大きくなる。その後にイメージを削除、ストレージを削除してもvhdxファイルは小さくならないそうな。

あちこち調べて試しても縮小できなかったが、集めた情報を組み合わせたら縮小できた。おそらく確実に縮小できる手順がこちら。

## 手順
1. （Windowsで実行）不要なイメージを削除する。  
   1. `docker rmi`で普通に削除する。  
1. （コンテナで実行）コンテナ内の不要ファイルを削除し、ストレージ使用量を小さくする。  
1. （コンテナで実行）ゼロ埋めファイルを作成して削除する。サイズはcountで指定する(下記例だと40GB）。指定するサイズはこれぐらい減らせるはず、という数字を指定する。  
   1. `sudo dd if=/dev/zero of=zero bs=1M count=40960`
   1. `sudo rm zero`
1. （Windowsで実行）コンテナおよびDockerを停止する。  
1. （Windowsで実行）PowerShellを管理者モードで開き、以下を実行する。パスはRancherDesktopの例。  
   1. `wsl --shutdown`
   1. `cd C:\Users\xxxxx\AppData\Local\rancher-desktop\distro-data`
   1. `Optimize-VHD -Path ext4.vhdx -Mode Full`

あまり縮小されない場合は、ゼロ埋めファイル作成以降を再度実行すると縮小される。私の場合は65GBから35GBに減らすことができた。コンテナが複数ある場合は、それぞれのコンテナで上記を実行すると良いかもしれない。
【docker】phpdotenvで.envが読み込めないのでディレクトリを変えた

目的
・passとか機密情報を.envファイルから読み込めるようにしたい。

環境
・Macbook air M1 2020 / sonoha 14.2.1
・Docker
・php:8

phpdotenvはcomposerでインストールするので
まずdocker hub公式からcomposerが使えるようにすべくDockerfileに下記を追記。
```Dockerfile.
COPY --from=composer /usr/bin/composer /usr/bin/composer
```

vlucas/phpdotenvをインストールするべく
```
$ composer require vlucas/phpdotenv
```

まずはphpdotenvが機能して.envの読み込みを確認する。
phpdotenvが機能して.envを読み込めるように

require __DIR__ . '/../vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');
$dotenv->load();


を追記。

```index.php
<?php

require './vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

var_dump($_ENV['DB_PASSWORD']);
```
すると
```$docker-compose exec app php index.php
>
Fatal error: Uncaught Dotenv\Exception\InvalidPathException: Unable to read any of the environment file(s) at [/var/www/html/data/../../.env]. in /var/www/html/vendor/vlucas/phpdotenv/src/Store/FileStore.php:68
```
.envファイルが読み込めないと。
階層を確認すると
```
docker
lib
src
	index.php
	phpvendor
.env
composer.lock
composer.yml
docker-compose.yml
```
となっている。
index.phpのrequireと$dotenvが示すpathを、1階層上に上がるようにいじるも結果変わらず。

ん？[/var/www/html/data/../../.env]ってなんだ？
rootディレクトリがきちんと機能していない気が。

まずはrootディレクトリを確認するべくbashへ入るために
```
$ docker-compose exec app /bin/bash
```

$ls -aしてみると
```
.  ..   index.php	vendor
```
.envが入ってない。
ってそりゃそうだ。
DockerfileではローカルデータをコンテナにCOPYする指定は ./src /var/www/html
なのでsrcディレクトリ以下のみ。

というわけで
.env
composer.lock
composer.yml
をsrcに移動させて再度ls -aで確認
```
.  ..  .env  composer.json  composer.lock index.php  vendor
```

コンテナのrootディレクトリにきちんと読み込まれた。
こちらも再度$ docker-compose exec app index.phpすると
```
string(4) "pass"
```
無事に.envを読み込めました。

エラーの真因は、ローカルからコンテナへCOPYされる仕組みの理解が不足していたこと。DockerfileでCOPYする場所を指定しているので、composerでインストールした状態を自らの開発環境に合うよう、適宜ディレクトリの移動を意識せねば。
【Python】S3の署名付きURLでファイル名を指定する方法

[ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html) にもやり方が書いていないので残しておきます。

Paramsパラメータに `'ResponseContentDisposition': f"attachment; filename = ファイル名"` を設定します。
※ ファイル名をURLエンコードするのを忘れないように注意。

```python
from urllib.parse import quote
filename = quote("サンプルファイルだよ.txt")  # ファイル名をURLエンコード

presigned_url = s3_client.generate_presigned_url(
    ClientMethod = "get_object",
    Params={
        "Bucket":get_env().output_app_bucket,
        "Key":os.path.join(job.dst_file_path, translated_file_path),
        'ResponseContentDisposition': f"attachment; filename = {filename}",
    },
    ExpiresIn="3600",
    HttpMethod="GET"
)
```
DockerfileでTerraformをバージョン指定でインストールする方法

すぐ忘れるので備忘録。

↓からTerraformの過去リリースのバイナリをダウンロードできる。

https://developer.hashicorp.com/terraform/install


```Dockerfile
# terraform インストール (version 1.5.* が必要な場合)
RUN wget https://releases.hashicorp.com/terraform/1.5.7/terraform_1.5.7_linux_amd64.zip && \
    unzip terraform_1.5.7_linux_amd64.zip && \
    mv terraform /usr/local/bin/ && \
    terraform -install-autocomplete 
```


ついでに最新バージョンをインストールしたい場合。 (Ubuntu/debian)

https://developer.hashicorp.com/terraform/install

```Dockerfile
RUN wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg && \
   echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list && \
   sudo apt update && sudo apt install terraform && \
   terraform -install-autocomplete 
```
Amazon Linux 2023でDockerをインストールする方法

普段はドキュメントを見てインストールするのですが、AL2023はドキュメントに載っておらずいつも調べているので。

https://docs.docker.com/engine/install/


```bash
# dockerのインストール
$ sudo dnf update -y
$ sudo dnf install -y docker

# サービスの有効化
$ sudo systemctl enable docker
$ sudo systemctl start docker

# グループの追加は再ログインしないと反映されないので注意
$ sudo usermod -aG docker $USER

# 再ログインしてdockerコマンドを実行できるか確認
$ exit
$ docker ps
```
【1Z0-083】【Oracle_Gold】コンテナマップの正体理解

# 本記事の目的
Oracle Database Administration (oracle Gold)の学習がメインである。
個人的に理解するのにわかりにくかったところを記事としてまとめた。

### 前提
- CDBルートのテーブルには、原則データは入っていない
→CDBルートは、PDBを動かすことが役割だから



# 目次
1. CDBで使用するContainers句とは
1. アプリケーションコンテナ限定機能 コンテナマップってナニモノ？
1. まとめ


# 1. CDBで使用するContainers句とは
図1のように、共通ユーザが各PDBに同じテーブル名・同じ定義のテーブルがあったとする。

図1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/c666338d-bfcd-8d94-d7a7-c0629ea6e8e8.png)



クライアントは、CDBルートへアクセス
→アクセス後図2で示しているように、Containers句で対象の共通ユーザのテーブルに向けてクエリを投げると。。。
図2のようにアクセスできる
``` SQL
Select * from Containers(C##test.Countries)
```
図2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/9b04d00a-f432-e18c-e369-b16c95af911d.png)


図3のように、すべてのPDBにアクセス、すべてのPDBのデータを取得することができる！
内部的には、Union Allと同様の処理を行っている。
図3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/be44cb83-efb1-2c1f-b7ba-067e32dbcbdf.png)


また、図4を見てほしい。
where句でcon_idを指定することで指定したPDBにのみアクセス
→アクセスしたPDBのデータのみを取得することができる
(con_idは、コンテナを識別するためにコンテナ作成時に、oracleが内部的に作成する値)
図4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/bc7c3c01-5b60-b736-a8a5-7588b83e51a9.png)




# 2. アプリケーションコンテナ限定機能 コンテナマップってナニモノ？

まず、アプリケーションコンテナは、どういったものかを図5に示した。
CDBにアプリケーションコンテナがぶら下がっている、その下に、各PDBがぶら下がっているイメージ。
図5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/64cbc344-6dc6-8029-3fae-4c53a367be64.png)

コンテナマップとは、、、

**Containers句の強化版
→どのPDBにどのデータが入っているかをマッピングしているテーブル**
具体的に```Create Talble```文で、マッピングテーブルを作成後、以下を実行してコンテナマップを有効化することで使用可能になる。
``` SQL
Alter Pluggable Database Set Container_MAP ='<マップ名>'
```
イメージとしては、図6に示した。


図6
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/1ae3e863-2dcb-8e73-2fb9-f29a36b3cd9a.png)


アプリケーションルート上で、
新規でPDBとデータが対応する表を作成する。
→正確には、パーティションテーブル。下記の２種類から選択して作成できる。
コンテナマップを作成すると、図7のようにアプリケーションルートに格納される。

今回は、レンジパーティションを想定した図になっている。
- ```レンジパーティション``` →対象データの値を範囲で分割するパーティション
- ```リストパーティション``` →対象データを一つ一つリスト化して実施するパーティション

図7
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/ace33bd0-7a26-b61d-9e7c-4c8f6c9cb992.png)

さて、ここで実際にSQLを実行した内部動作イメージを図8、図9を見ながらイメージしてほしい。
まずは、図8について 以下のSQLを発行する。
```SQL
select * from Countries; 
```
今回は、where句で条件を指定していないのですべてのコンテナにアクセスする。

図8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/d292637d-89d5-72f3-1e6d-bec667f0040b.png)


次に図9である。
```SQL
select * from Countries where region_id=001;  
```
まずは、条件にマッチするコンテナはどこに当たるのかをコンテナマップで確認する
→対象のコンテナにのみ、データを見に行く

図9
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/ed81cce7-44af-0cc2-bf49-fa1da1c0ce88.png)

※以下の設定を行うことで、対象の表についてContainers句を省略できる

```SQL
Alter Table <テーブル名> Enable Containers_Default;
```


# 3.まとめ

1. CDBルートにアクセスすることで```Containers```句を使用することができる
1. CDBルートへは、共通ユーザでアクセスする
1. ```Containers```句を使用することで、すべてのPDBに対して一括データアクセスが可能
1. コンテナマップは、アプリケーションコンテナ専用の機能である
1. コンテナマップを使用する際は、アプリケーションルートに共通ユーザでアクセスする必要がある
1. コンテナマップを使用することで、```where```の条件指定を```con_id```以外でできる
PPP（Point-to-Point Protocol）プロトコルについて調べてみた

#### はじめに
仕事でしばしば目にする言葉だったが、あまり理解していなかったため調べてみた。

#### 概要
* 2点間を接続して通信を行うためのプロトコル。
* RFC1661で定義されている。
* OSI参照モデルの2層(データリンク層)に該当する。

#### 構成
* 以下2つのプロトコルから構成されている。
    * LCP (Link Control Protocol) 
        * 接続の確立や認証、切断などの通信制御を行う。認証手順にはPAPやCHAPが用いられる。
    * NCP（Network Control Protocol）
        * ネットワーク層の通信環境を整える役割を持つ。ネットワーク層のプロトコルが何かによって、NCPに該当するプロトコルは異なる（NCPというプロトコルがあるわけではない）。
            1. IPv4の場合：IPCP（Internet Protocol Control Protocol）
            2. IPv6の場合：IPV6CP（IPv6 Control Protocol）

#### 認証機能について
LCPプロトコルのオプション機能を用いて認証を行う。
認証で用いるプロトコルは以下2つ。
1. PAP
    パスワードを平文のまま回線上に流す。
1. CHAP
    パスワードを直接回線には流さず、チャレンジ（乱数）とレスポンス（乱数とパスワードから得たハッシュ値）をやり取りする。

#### PPPoE（Point to Point Protocol over Ethernet）
PPPプロトコルをイーサネット（有線LAN規格）でも使用できるように拡張したもの。

#### IPoE（IP over Ethernet）
PPPoEよりも現在主流となっている方式。PPPoEがPPPをイーサネットに対応づける目的で作られた一方、IPoEはイーサネットでの使用を前提として作られた背景の違いがある。

PPPoEとの違いは以下
1. 網終端装置経由で回線に接続しない
    * PPPoEは網終端装置という装置経由で回線に接続しているため、ここがボトルネックになり通信に遅れがでる場合がある。
    * IPoEでは通信容量の大きいゲートウェイルーター経由で回線に接続することができ、そのような遅延が起こらない。
    ⇒通信が比較的早く安定しやすい
3. IPv6に対応する通信先にのみ接続可能
    * IPoEはIPv6にしか対応していない。そのためIPv4で通信する場合はPPPoEを使うことになる。IPv6は普及しきっていないため、まだまだIPoEも浸透していない。
    * 上記欠点を克服した「IPv4 over IPv6」という方式もある。PPPoEの技術をベースに網終端装置を迂回して回線に接続するというもの。また、IPv4をIPv6に変換するため、IPv4も使用可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767689/04c3b341-5238-a7ca-835c-5104a36bcc6c.png)
画像は<a href="https://www.nttpc.co.jp/column/network/pppoe_ipoe.html">株式会社NTTPCコミュニケーションズのコラム</a>から引用

#### 参考にしたWebサイト
1. https://milestone-of-se.nesuke.com/nw-basic/ppppppoe/ppp-summary/
2. https://xtech.nikkei.com/it/article/COLUMN/20060424/236003/
3. https://note.com/shinya_matsui/n/n2a45f98c75f2
4. https://biz.biglobe.ne.jp/column/hikari_pppoe.html#:~:text=PPPoE(%E3%83%94%E3%83%BC%E3%83%94%E3%83%BC%E3%83%94%E3%83%BC%E3%82%AA%E3%83%BC%E3%82%A4%E3%83%BC)%E3%81%A8,%E3%81%AE%E3%81%93%E3%81%A8%E3%82%92%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
5. https://www.nttpc.co.jp/column/network/pppoe_ipoe.html
Postfixに複数のportを開く

# はじめに
tcp/25はsmtp、tcp/587はsmtpsというのは常識ですね（他にもたくさんあるが）。でも実際に運用すると、どこか一箇所でなく両方のportを開けたいことがあります。
OP25Bがあるので、tcp/25はLocalからMTAへのリレーには使えないのでtcp/587を使います。でもgoogle mailはtcp/587でなくtcp/25を配信に使っています。リレーのためにtcp/587、受信のためにtcp/25を同時に開けたいのです。
Postfixが開くポートを指定するのは簡単に設定できますが、複数のポートを開く設定は探しても見つかりませんでしたので、Tipを書いておきます。
# 設定法
まず設定をバックアップします。
```sh
su
cd /etc/postfix
cp master.cf master.cf.bak
vi master.cf
```
もとはこうなっていると思います。
```
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
```
これを
```
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
587       inet  n       -       y       -       -       smtpd
```
のように複数行書きならべます。
そして忘れずに設定を反映します。
```sh
systemctl reload postfix
```
# 試験
つないでみましょう。
```
telnet localhost 25
（バナーが出るか？）
telnet localhost 587
（こっちも動いているか？）
```
# おわりに
とても簡単ですが、ChatGPTは知らなくて嘘ばかり教えてたどり着けなかったし、Googleもこれに関する少なくとも日本語情報はなかったのでメモ代わりに記しました。
マークダウンとPowerPointの利点を組み合わせた、プレゼンテーションに最適なツール

# 悩み
最近、仕事で定常的な業務があり、以下のような悩みがあったのでＡＩに聞いてみた

> 程よい情報を教えて
> マークダウンはテキストなので検索に便利、パワーポイントはプレゼン向きに便利だが、ファイル内のテキストの検索が困難。そうなるとマークダウンのようにテキストベースで検索出来て、かつパワーポイントのようにフォーマットを決めてプレゼンできるような、アプリケーションが必要になる。既存の製品でそれが可能なものを教えて、もしくはオープンソースのリポジトリでも結構です

# Gemini回答

マークダウンとPowerPointの利点を組み合わせた、プレゼンテーションに最適なツールをご紹介します！
テキスト検索の利便性とプレゼンテーション機能を兼ね備えた、革新的なツールをお探しですか？

ご安心ください。マークダウンの利便性とPowerPointのプレゼンテーション機能を融合させた、画期的なツールが続々登場しています。

## 1. オープンソースツール

* Marp: https://marp.app/

Markdownで記述したファイルをHTMLに変換し、ブラウザ上でスライドショーとして表示できます。
テーマやレイアウトをカスタマイズしたり、アニメーションを追加したりすることも可能です。
オープンソースなので、無料で利用でき、コミュニティによる活発な開発が進められています。

* Remark: https://github.com/remarkjs/remark

Markdownで記述したファイルを、HTMLスライド、PDF、およびその他の形式に変換できます。
コードブロックのハイライト、画像挿入、テーブル作成など、豊富な機能を備えています。
プレゼンテーションに特化した機能も充実しており、発表者ノートやスライド間の移行効果などを設定できます。

## 2. 商用ツール

* Slide2Markdown: https://github.com/ssine/pptx2md

PowerPointやKeynoteで作成したスライドを、Markdown形式に変換できます。
プレゼンテーションの構成や内容をそのままMarkdownで保存できるので、編集や共有が容易になります。
無料版と有料版があり、有料版ではより多くの機能を利用できます。

* Typora: https://typora.io/

マークダウンエディタとプレゼンテーションツールの機能を兼ね備えています。
Markdownで記述したファイルを、リアルタイムでプレビューしながら編集できます。
発表者ノートやスライド間の移行効果なども設定でき、プレゼンテーションに最適な環境を提供します。


## ツール選びのポイント

* 必要な機能: テーマやレイアウトのカスタマイズ、アニメーション、発表者ノート、スライド間の移行効果など、必要な機能が備わっているかどうかを確認しましょう。
* 使いやすさ: 直感的な操作性と分かりやすいインターフェースを備えているかどうかを確認しましょう。
* エクスポート形式: PowerPointやPDFなど、必要な形式でエクスポートできるかどうかを確認しましょう。
* 価格: 無料版と有料版がある場合は、それぞれ機能と価格を比較検討しましょう。

これらのツールを活用することで、効率的なプレゼンテーション資料の作成と、スムーズな情報共有を実現することができます。

# Copilot

マークダウンとパワーポイントの中間のような機能を持つツールをお探しのようですね。テキストベースで編集が可能で、検索に便利でありながら、プレゼンテーションに適したフォーマットを持つアプリケーションはいくつか存在します。以下にいくつかのオプションを紹介します。

* Microsoft OneNote:

OneNoteはテキスト、画像、リストなどを自由に配置できるノートアプリです。検索機能も強力で、手書きのノートからも検索可能です。プレゼンテーションとしては直接的ではありませんが、情報の整理と共有に適しています。

* Googleスライド:

Googleスライドはオンラインで利用可能なプレゼンテーションツールです。Googleドキュメントと同様にテキストベースで編集が可能で、スライド内のテキストも簡単に検索できます。

* reveal.js:

reveal.jsはHTMLプレゼンテーションフレームワークです。マークダウンを使用してスライドコンテンツを作成し、ウェブブラウザ上でスタイリッシュなプレゼンテーションを実行することが可能です。GitHubなどでオープンソースとして利用可能です。

* Marp:

Marpはマークダウン文書から直接スライドデッキを作成することが可能なツールです。Marp for VS CodeプラグインやMarpitフレームワークなどがあります。

* GitPitch:

GitPitchはGitHub, GitLab, Bitbucket上のマークダウン文書から直接プレゼンテーションを作成するサービスです。コードやデータの可視化もサポートしており、開発者向けのプレゼン作成に適しています。

* Deckset:

DecksetはMac用のアプリケーションで、マークダウンファイルから直接スタイリッシュなプレゼンテーションを作成することができます。簡単に使える一方でカスタマイズ性もあります。
これらのうちいくつかは無料またはオープンソースですが、一部有料製品も含まれています。ニーズや環境に応じて最適な選択肢を選んでください。

# とりあえず
いろいろあることは分かった。最近はGEMINIの方が優秀な回答をくれる。

まずは、ＭＡＲＰか、次点はＧｉｔＰｉｔｃｈ


# 参考記事

https://qiita.com/tomoasleep/items/604107787d92dec4868e

https://qiita.com/ioComk/items/438b4515a269c2f0479c

https://paiza.hatenablog.com/entry/2017/06/22/GitHub%E3%81%A0%E3%81%91%E3%81%A7%E8%B6%85%E9%AB%98%E6%A9%9F%E8%83%BD%E3%81%AA%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89%E8%B3%87%E6%96%99%E3%81%8C%E4%BD%9C%E3%82%8C%E3%82%8B%E3%80%8CGitPitch%E3%80%8D%E3%81%AE
グリッドビューを使って Excel のデータを SharePoint リストに一括で貼り付ける


# はじめに

Power Platform で業務効率化をしようとする際、既に
Excelファイルが存在するため、そちらのデータを一括でインポートしたいということあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6fbd4cd2-c145-4939-1ce3-10eedb0d08cc.png)

もちろん、例えば、新規作成時であれば、Excel から作成する方法がありますが、既に作成しているリストに対して追加したい、何らかの理由より、リストは出来れば作り直したくないというケースもあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1000b36a-da26-3d69-0dea-647395d1a31b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/671274c3-770e-1cf8-1804-e45dca385bbd.png)

:::note
上記のように、データの型なども指定できるため、こちらの方法も非常に便利です。
:::

また、Power Automate を使って、一行ずつインポートする方法もありますが、ちょっと面倒に感じる人もいると思います。

私がただ知らなかっただけですが、SharePoint のグリッドビューで一括貼り付けが出来たので、そちらの方法を紹介します。

# 方法

まず、Excel 側でデータをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/64e6976f-24dc-4b2b-bf59-9f0c60ecfae1.png)

SharePoint リスト側で、グリッドビューで編集をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9037a3a9-1587-5bff-f432-e272bc790e2e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5cd6d82a-4a28-0b0b-493b-246e08241328.png)

そのまま貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/10044e09-aab5-b1ca-435b-a7b18fde3cfc.png)


:::note warn
以下のように、先頭行の先頭列を明示的に選んでいると、その列にコピーした情報が全て入ってしまいます。こうなってしまった時は失敗です。[グリッドビューで編集] を選択し、そのまま貼り付けるのがポイントです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/dfdf70e5-67fc-a635-de2b-d6d790c22e72.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bee29be4-3535-f217-f03c-9d803d52a3ce.png)
:::

[グリッドビューの終了] を選択します。これだけで終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ce62da2b-675e-63eb-00fb-0d979a60dcba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2964190c-16bc-2672-265f-ac9cad4abd6c.png)

全てのデータ型は試していませんが、テキストはもちろん問題なく、選択肢や日付のデータ型も問題なく貼り付けできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b20c914a-7a22-ad28-efb3-b8373ec28e6a.png)

※Excel 側のデータは日付形式にしています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1a5a7f48-a3ea-6d66-d8d9-153a13e95a79.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/13fdd0ec-d8bf-fcd5-cb8d-621e034a98d7.png)

:::note warn

どうやら、現状は 100 件が上限みたいなので、100 件以上データがある場合は、こんな感じで何回かに分けて貼り付けください。新規 (データが空の状態からの登録) の場合は 100 件以上行けるかもですが、処理が重く、進んでいるか分かりにくいため、個人的には、データが多い場合は、何回かに分けて貼り付けるのがいいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8197a251-169e-13e0-afe3-69b4dea9fd44.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7890649c-8727-7e48-d8e0-0885eb960f7c.png)
:::
https://techcommunity.microsoft.com/t5/microsoft-365-blog/update-information-at-the-speed-of-type-edit-in-grid-view/ba-p/2110489

 # まとめ

簡単ですが、今回は、SharePoint リストのグリッドビューで Excel の内容を一括で貼り付ける方法を紹介しました。出来るだけ簡単な方法で実現できるに越したことはないと思いますので、知らなかった人は今後こちらの機能も使ってみていただけたらと思います。
nRF9160 の FOTA について

FOTA は、
　・APP(アプリケーション更新）
　・DELTA(モデム差分更新
　・FMFU(モデム全体更新）
の3種がある。
（厳密には APP は SMP と MCUBOOT に分かれるがおそらく SMP は使わないと思われる）
 
各種 FOTA については、サンプルプログラムのソースがわかりやすい。

サンプルコードは、NCS のバージョンによって実装方法が微妙に異なる。
NCS v2.5系までは APP と DELTA がまとまっていて FMFU だけ別実装だった。
NCS v2.6.0 のサンプルコード SLM (Serial Lte Momem)では、FMFUも統合された。

私は、2024年4現在、NCS 2.5.2を使用しているが、NCS 2.6.0 のソースコードを利用して、ヘッダサイズの大きい HTTP ダウンロードから UDP ダウンロードに作り替えて移植してみたので、備忘録を残しておく。


# 基本構造

基本構造は皆同じで、HTTP （もしくは COAP ） にて、レンジアクセス機能を使い、ファイルイメージを範囲指定してデータを部分要求し、少しずつ、内部のフラッシュメモリ（FMFUはサイズが大きいので外部のSPI-NORフラッシュメモリ）に直接保存している。

ダウンロードが完了したら更新を適用するといった流れだ。

リブート後に更新状況を引き継ぐ必要があるので、NVM を利用して必要な情報を引き継いで、
再起動後に必要な処理を行う。


# 関連ファイル
SLM source
・slm_fota.h
・slm_fota.c
・slm_settings.h
・slm_settings.c
・main.c

Zephyr source
・fota_download.h
・fota_download.c
・fota_download_client.h
・fota_download_client.c
・fota_download_util.h
・fota_download_util.c
・fota_download_full_modem.h
・fota_download_full_modem.c

# ファイル概要

・slm_settings.c

にて、NVM への読み書きを行なっている。

・main.c
 では。再起動後の処理や初期化などが実装されている


・fota_download_client.c

 FOTA のダウンロードの中心となる ダウンロードスレッドが記述されている。
 通信処理を改造するのであれば、このファイルを変更する必要がある。


# FMFU (Full Modem Firmware Update)

 NCS v2.6.0 の SLMサンプルコードでは、FMFU が統合されただけでなく、
 NVS で引き継ぐ情報は、FMFU を行なったか否かだけになった。
 APP と DELTA　は、ダウンロード終了後、リブートして更新が適用されるだけになっている。

 FMFUは、SPI-NOR に保存してリブートしてから NVM に保存したフラグをみて、更新を適用する。
 （NCS 2.5系までは、ダウンロードして更新を適用してからリブートしていた）

# フラッシュメモリへの保存

・fota_download.c

受信したデータのフラグメントは、上記のファイルにてフラッシュメモリに保存される。


フラッシュメモリへの書き込みには

・dfu_target.c

の関数を利用している。

具体的には dfu_target_write関数だ。

# 更新処理

ダウンロードが完了すると、

・fota_download.c

にて、dfu_target_done関数、dfu_target_schedule_updateが呼ばれる。

あとは再起動すれば、ダウンロードファイルが適用される。

前述したが、FMFU だけは再起動後にアプリの初期化処理にて、更新処理が実行される。



# 以上
2024/4/16主にITとかセキュリティの記事

パロアルトネットワークス製品に脆弱性、4月14日に緊急パッチ公開を予告(4/14)
https://japan.zdnet.com/article/35217746/

Chromeの最新アップデートで、セキュリティが向上！ パスワード管理もずっと簡単に(4/14)
https://www.lifehacker.jp/article/2404google-safe-browsing-just-got-safer/

日本の100以上のホテルがBooking.comフィッシング詐欺の被害に遭う(4/14)
https://kenmin-souko.jp/%E6%97%A5%E6%9C%AC%E3%81%AE100%E4%BB%A5%E4%B8%8A%E3%81%AE%E3%83%9B%E3%83%86%E3%83%AB%E3%81%8Cbooking-com%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0%E8%A9%90%E6%AC%BA%E3%81%AE%E8%A2%AB/

国内１１８宿泊施設に被害　「ブッキング」に不正アクセス(4)
https://www.sanyonews.jp/sp/article/1539896/

国内１１８宿泊施設に被害　「ブッキング」に不正アクセス(4/13)
https://www.kobe-np.co.jp/news/zenkoku/compact/202404/0017539176.shtml
https://www.shimotsuke.co.jp/articles/-/881279
https://www.sanin-chuo.co.jp/articles/-/559192
https://www.saitama-np.co.jp/articles/75788
https://news.goo.ne.jp/picture/nation/kyodo_nor-2024041301000903.html
https://www.okinawatimes.co.jp/articles/-/1342304
https://www.nippon.com/ja/news/kd1151783026005803905/

ブッキング・ドットコム不正アクセス　国内118宿泊施設被害　沖縄でも、カード情報狙い(4/14)
https://ryukyushimpo.jp/news/national/entry-2983412.html#google_vignette

宿泊施設装い予約客のカード情報狙う　松本の１カ所含む国内118施設が被害　ブッキング・ドットコムの提供システム巡り(4/14)
https://www.47news.jp/10788374.html

Google GeminiとBardの眼科知識アセスメントにおける有効性の探求(4/13)
https://elblog.pl/ja/2024/04/13/google-gemini%E3%81%A8bard%E3%81%AE%E7%9C%BC%E7%A7%91%E7%9F%A5%E8%AD%98%E3%82%A2%E3%82%BB%E3%82%B9%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%9C%89%E5%8A%B9%E6%80%A7%E3%81%AE/

TikTokは米国で配信禁止になってしまうのか？米国公聴会で問題にされた3つのこと(4/14)
https://tamakino.hatenablog.com/entry/2024/04/14/080000

HOYA、レンズ受注再開
システム障害、混乱解消へ(4/14)
https://www.nikkei.com/article/DGKKZO80012520T10C24A4EA5000/

生成AIを社内に導入する時によくある課題とは？その対策も解説(4/13)
https://weel.co.jp/media/gen-ai-introduction-problem

【GPTs（GPT Builder）】ノーコードで自分専用のChatGPTを開発できる！使い方や活用事例を紹介(4/13)
https://weel.co.jp/media/innovator/gpts/

G7、交通網へのサイバー攻撃「技術悪用を阻止」
交通相会合(4/14)
https://www.nikkei.com/article/DGKKZO80016120U4A410C2EA3000/

GMOコインの評判は？実際の口コミやメリット・デメリットを紹介(4/14)
https://www.fukuishimbun.co.jp/articles/-/2015627

子どもの写真SNSアップ、オランダでも問題に？(4/13)
https://www.portfolio.nl/news/post7624/

アップル・グーグル念頭にスマホ競争促進法案、違反の課徴金は売上高の２０％(4/14)
https://www.yomiuri.co.jp/economy/20240413-OYT1T50205/#google_vignette

【生成AI活用検討】Bedrockで設計書のレビューをしてもらう(4/13)
https://qiita.com/yuki_ink/items/96b34af3c181570e60bf

中国テック事情：市場心理を手玉に取る、中国政府のしたたかさ(4/14)
https://ascii.jp/elem/000/004/194/4194033/?rss

OSINT（Open Source Intelligence）(4/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/040900166/

ServiceNowが事業領域を拡大、受注管理や中小企業向け市場に進出(4/15)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/09166/

JTB・双日・三井化学…、ユーザー企業で相次ぎ誕生する「日本IBM出身」CIO／CDO(4/15)
https://xtech.nikkei.com/atcl/nxt/column/18/02803/041000001/

戸籍広域交付の開始初日から不具合　市区町村の現場運用を想定しきれず
法務省(4/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/040900153/

「小さいLLM」に懸ける　国内IT大手の勝算(4/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/041000174/

「基幹系刷新はIT部門の都合」　利用部門が背を向ける理由とは(4/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/040900163/
Pythonで「ファイルやディレクトリの存在を確認する」の動作を確認してみた

# 概要

Pythonで「ファイルやディレクトリの存在を確認する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index7.html

# 実装

以下のファイルを作成しました。
```sample.py
import os
import pathlib

path1 = './test/address.txt'
if os.path.exists(path1) :
  print(path1 + 'は存在します')
else :
  print(path1 + 'は存在しません')

path2 = './test/user.txt'
if os.path.exists(path2) :
  print(path2 + 'は存在します')
else :
  print(path2 + 'は存在しません')

path3 = './test/img'
if os.path.exists(path3) :
  print(path3 + 'は存在します')
else :
  print(path3 + 'は存在しません')
```

以下のコマンドを実行しました。
```
$ mkdir test
$ touch test/address.txt
$ touch test/name.txt
$ mkdir test/doc
$ mkdir test/img
$ python3 sample.py 
./test/address.txtは存在します
./test/user.txtは存在しません
./test/imgは存在します
```

# まとめ

何かの役に立てばと。
ラズパイ5+Pythonで2つのカメラによる同時撮影をする[RaspberryPi5][Python][OpenCV][picamera2]

# この記事でわかること
ラズパイ5へカメラモジュールを2つ差し，Python+OpenCVで同時に画像撮影を行う方法．
ステレオカメラやデュアルカメラとして使いたい場合に使用できます．
（検索で出てくるタイトルを変えたかったので，再投稿しました．）
# 環境
#### Python 
Python 3.11.2
opencv-python 4.9.0.80
picamera2 0.3.17

#### Raspberry Pi 
Raspberry Pi 5 Model B Rev 1.0 
Distributor ID:	Debian
Description:	Debian GNU/Linux 12 (bookworm)
Release:	12
Codename:	bookworm


# 1秒ずつ撮影をするコード
RaspberryPi上で以下のコードを実行すると，Ctrl+Cが入力されるまで1秒ごとに2つのカメラで同時に撮影を行います．

```Python:DualCamera.py
import cv2
from picamera2 import Picamera2
import time

def capture_image(camera0, camera1, image_index):
    # カメラ0から画像を取得
    image0 = camera0.capture_array()
    imgpath0 = f"test{image_index}_0.jpg"
    cv2.imwrite(imgpath0, image0)

    # カメラ1から画像を取得
    image1 = camera1.capture_array()
    imgpath1 = f"test{image_index}_1.jpg"
    cv2.imwrite(imgpath1, image1)

    print(imgpath0, "and", imgpath1, "saved!")

camera0 = Picamera2(0)
camera1 = Picamera2(1)

# それぞれのカメラに対して設定を行い、起動
config0 = camera0.create_preview_configuration(main={"size": (1640, 1232)})
camera0.configure(config0)
camera0.start()

config1 = camera1.create_preview_configuration(main={"size": (1640, 1232)})
camera1.configure(config1)
camera1.start()

# 1秒ごとに画像を撮影
try:
    image_index = 0
    while True:
        capture_image(camera0, camera1, image_index)
        time.sleep(1)
        image_index += 1
except KeyboardInterrupt:
    print("Stopping cameras...")
finally:
    camera0.stop()
    camera1.stop()
    print("Cameras stopped.")
```

# コードの説明
カメラのインスタンスを生成します．Picamera2()の引数にカメラの番号を入れましょう．番号はカメラモジュールを差したラズパイの端子を見れば書いてあります．
```Python
camera0 = Picamera2(0)
camera1 = Picamera2(1)
```
<br>
次にカメラの設定と起動を行います．今回は撮影する画像を1640×1232で指定しましたが，ここは調整をしてください．これはcamera0の設定ですが，camera1も同様です．

```Python
config0 = camera0.create_preview_configuration(main={"size": (1640, 1232)})
camera0.configure(config0)
camera0.start()
```
<br>
カメラの準備ができたら撮影をします．今回はcapture_array()を使いましたが，他の撮影方法もあるようなので，気になる方は以下のリンクを参照してください．

[Picamera2ライブラリについて](https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf)

```Python
image0 = camera0.capture_array()
```



# カメラインスタンスの生成に失敗した人向け

カメラインスタンスを用意するときに，以下のようにするとエラーが出ます．ChatGPTに「ラズパイ5でデュアルカメラを使いたい！Pythonでコードを書いて！」と頼むと以下のように出力された人もいるのではないでしょうか（私がそうでした）．
```Python:修正前
camera0 = Picamera2()
canera1 = Picamera2()
```
```error:エラー文
ERROR Camera camera.cpp:675 Camera in Acquired state trying acquire() requiring state Available
Camera __init__ sequence did not complete.
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/picamera2/picamera2.py", line 254, in __init__
    self._open_camera()
  File "/usr/lib/python3/dist-packages/picamera2/picamera2.py", line 465, in _open_camera
    self.camera.acquire()
RuntimeError: Failed to acquire camera: Device or resource busy
```

アクセスしようとしているカメラが使用済みであるという旨のエラーが出るので，カメラインスタンスを作る時は以下のようにしてアクセスするカメラを分けましょう．
```Python:修正後
camera0 = Picamera2(0)
camera1 = Picamera2(1)
```

参考記事：
[How To Use Dual Cameras on the Raspberry Pi 5](https://www.tomshardware.com/raspberry-pi/how-to-use-dual-cameras-on-the-raspberry-pi-5)
#11 カスタムコントローラークラスとviewDidLoadを利用してアプリの画面をカスタマイズ

このプロジェクトのインスピレーションは、最近の桜の季節から来ています。そのため、関連する画面を作成したいと思います。

結果は以下の通りです：

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/e7133798-a150-88f8-39e1-6e13870bee31.gif)


###### 音楽付き：
https://youtube.com/shorts/5FO-MzeC30s?feature=share&source=post_page-----6ac58fa178fe--------------------------------

```
class ViewController: UIViewController {
    
    func sakutaEmitterCell() {
        let sakutaEmitterCell = CAEmitterCell()
        sakutaEmitterCell.contents = UIImage(named: "sakura_fubuki")?.cgImage
        sakutaEmitterCell.birthRate = 3
        sakutaEmitterCell.lifetime = 20
        sakutaEmitterCell.velocity = 100
        sakutaEmitterCell.scale = 0.5
        sakutaEmitterCell.scaleRange = 0.3
        sakutaEmitterCell.yAcceleration = 70
        sakutaEmitterCell.emissionRange = CGFloat.pi

        let sakuraEmitterLayer = CAEmitterLayer()
        sakuraEmitterLayer.emitterCells = [sakutaEmitterCell]
        sakuraEmitterLayer.emitterPosition = CGPoint(x: view.bounds.width / 2, y: -50)
        sakuraEmitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 0)
        sakuraEmitterLayer.emitterShape = .cuboid
        view.layer.addSublayer(sakuraEmitterLayer)
    }
    
    let player = AVPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // ビューの追加設定
        view.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha:0.4)
        sakutaEmitterCell()
        
        let SakuraSongUrl = Bundle.main.url(forResource: "Spring – Sakura Girl (No Copyright Music)", withExtension: "mp3")!
        let playerItem = AVPlayerItem(url: SakuraSongUrl)
        player.replaceCurrentItem(with: playerItem)
        player.volume = 1
        player.play()
    }
}
```

## 機能概要

桜の花びらのアニメーション：CAEmitterLayerとCAEmitterCellを使用して、リアルな桜の花びらの落ちるエフェクトを作成します。
###### 背景音楽の再生：
AVFoundationのAVPlayerを使用して背景音楽を再生し、春の雰囲気を追加します。

######    インターフェースデザイン：
Storyboardを使用して桜を持つ女の子の画像を追加し、視覚効果を向上させます。

###### 桜の花びらのエフェクト

まず、CAEmitterCellを定義して桜の花びらの外見と挙動を指定します。例えば、発生率、寿命、速度、サイズ、加速度、放射範囲などです。次に、CAEmitterLayerで発射器の位置、サイズ、形状、含まれる発射ユニットを指定します。

https://github.com/liyoway/hanami?source=post_page-----6ac58fa178fe--------------------------------
instanceof

# instanceof とは
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/instanceof

>instanceof 演算子は、あるコンストラクターの prototype プロパティが、あるオブジェクトのプロトタイプチェーンの中のどこかに現れるかどうかを検査します。返値は論理値です。

インスタンスとリテラルで違いを見てみると、、、
```javascript
const obj = {
    name: 'John',
    age: 30,
    city: 'New York'
}
console.log(obj instanceof Object) // true

const arr = [1, 2, 3, 4, 5]
console.log(arr instanceof Array) // true

const str = 'Hello'
console.log(str instanceof String) // false

const num = 10
console.log(num instanceof Number) // false

const strInstance = new String('Hello')
console.log(strInstance instanceof String) // true
console.log(strInstance instanceof Object) // true
console.log(typeof strInstance) // true
```
配列やオブジェクトはtrueを返すが、文字列と数値はfalseを返す


## なぜstrとnumはfalseなのか？
・インスタンスではなく単なるリテラルであるから。
・リテラルで記述した値はオブジェクトだと思ってしまうが、オブジェクトでなくメソッドを持たないプリミティブな値である。
↑　オブジェクトのように振る舞えるのはラッパーオブジェクトが自動的に変換してくれているから。


## リテラルのobjとarrはなぜtrueなのか？
・配列リテラル、オブジェクトリテラルはプリミティブ型と違ってインスタンスを生成するため。


### リテラルについて
https://developer.mozilla.org/ja/docs/Glossary/Literal

>プログラム上で数値や文字列など、データ型の値を直接記述できるように構文として定義されたもの

https://jsprimer.net/basic/data-type/#literal


# まとめ
プリミティブ型とオブジェクト型のリテラルではインスタンスを生成するかどうかが異なることが分かった。
Flask-RESTX でエラーハンドリングを扱う

# 概要
Flask-RESTX のエラーハンドリングは、（バグも含めて）かなり複雑な仕様となっている。
本記事では、Flask-RESTX を使って適切にエラーハンドリングをする方法を紹介する。

# 基本的な実装
基本的な Flask-RESTX でのエラーハンドリングの実装方法を以下に示す。
```python:app.py
from flask import Flask
from flask_restx import Resource, Api, abort
from werkzeug.exceptions import HTTPException

app = Flask(__name__)
# Enable custom error handler for 404 and 406.
api = Api(catch_all_404s=True)
api.init_app(app)


@api.route("/error")
class TrivialError(Resource):
    def get(self):
        abort(500, "Trivial Error")
        return {"hello": "world"}


@api.errorhandler(HTTPException)
def httpexception(error):
    # Workaround for #33 issue.
    # ref. https://github.com/python-restx/flask-restx/issues/33#issuecomment-585329009
    message = error.name
    if hasattr(error, "data"):
        message = getattr(error.data, "message", error.name)
    raise error.__class__(message)


@app.errorhandler(HTTPException)
def httpexception(error):
    return {"message": "HTTPException: " + error.description}, error.code


@api.errorhandler(Exception)
def exception(error):
    return {"message": "Internal Server Error"}, 500


if __name__ == "__main__":
    app.run(debug=False)

```

# 注意点
実装にあたって、いくつのか注意点が存在する。

## `catch_all_404s` を有効にする
`catch_all_404s` がデフォルトでは無効になっており、そのままでは 404 Not Found や 406 Not Acceptable エラーが Flask 側で処理されてしまう。カスタムエラーハンドラを使いたい場合は、この設定を有効にする必要がある。

## HTTPException エラーハンドラを２重に定義する
`@api.errorhandler(HTTPException)` がある一方で `@app.errorhandler(HTTPException)` が存在しているのは、レスポンスがカスタムエラーハンドラで生成したものではなく、abort 関数の第２引数で指定したメッセージが直接入ったもので上書きされてしまうからである。

abort 関数で指定したメッセージをそのまま返却するのではなく、カスタムエラーハンドラで加工したものを返却したい場合は、例のように２重で定義する必要がある。
net::ERR_SSL_PROTOCOL_ERROR の原因

# はじめに
私は2023年10月より、内定直結型エンジニア学習プログラム「アプレンティス」に2期生として参加しています。

https://apprentice.jp/lp

現在、アプレンティスの課題としてオリジナルプロダクトの開発を行っています。
その中で、AWS の S3 にアップロードした画像を、CloudFront を経由してブラウザで表示していたのですが、何度も表題のエラーが発生しました。

![スクリーンショット 2024-04-15 23.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/6ec691e5-4623-15c0-0175-36a55defae62.png)
今回は、そのエラーの原因が判明したので、まとめようと思います。

参考までに、インフラ構成は以下の通りです。
![VegEvery.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/77562f2d-9943-6719-c3b7-5f771f95dd0d.png)

# 目次
[1.使用環境](#1-使用環境)
[2.エラー発生状況](#2-エラー発生状況)
[3.試したこと](#3-試したこと)
[4.結論](#4-結論)
[5.最後に](#5-最後に)

# 1. 使用環境
今回のエラーとはあまり関係がないのですが、一応載せておきます。

- MacBook Air : M2 チップ / 16 GB
- PHP 8.3.4
- Laravel Framework 10.46.0
- Docker 26.0.0
- docker-compose 1.29.2
- Next.js : 14.0.4

### AWS 周り
VPC リージョン
- アジアパシフィック（東京）

アベイラビリティゾーン
- ap-northeast-1a
- ap-northeast-1c

パブリックサブネット ×2
※ ALB（アプリケーション・ロードバランサー）利用のため、２つ作成

プライベートサブネット ×1

EC2 インスタンス AMI イメージ
- Ubuntu Server 22.04 LTS(HVM),SSD Volume Type

S3 バケット
- アジアパシフィック (東京) ap-northeast-1

CloudFront
- SSL 証明書をアタッチ
- セキュリティポリシー：TLSv1.2_2021
- ビューワープロトコルポリシー：HTTP を HTTPS にリダイレクト	

# 2. エラー発生状況
開発をしている中で、度々この画像が表示されないエラーが発生し、気づいたらエラーが解消することを繰り返していました。
すべての画像が表示されないわけでもなく、一部の画像のみエラーが発生している状況で、原因も解決策もしばらく分かりませんでした。

何度かやっているうちに、おそらく Next.js のビルドがきっかけではないかということが分かってきました。

# 3. 試したこと
- 別ブラウザでの表示確認
➞ スマホでは問題なく表示されている。

ということはブラウザのキャッシュの問題？と思い、
- ブラウザのスーパーリロード
➞ 改善せず。
  
公式のサイトを参照し、
- セキュリティポリシーを確認。

https://repost.aws/ja/knowledge-center/cloudfront-ssl-connection-errors

https://repost.aws/ja/knowledge-center/cloudfront-security-protocols-ciphers

➞ TLSv1.2_2021 だったので問題なし。

色々調べている間に時間が経つ。

- 改めてリロード
➞ 表示された！！

# 3. 結論
「ビルドしてすぐには画像が表示できないことってあるの？」と Copilot に聞いてみたところ、以下教えてくれました。
> ウェブサイトのビルドやデプロイメントが完了した直後は、すぐにすべてのリソースが正しく読み込まれるとは限りません。これは、以下のような理由で起こることがあります：
> 
> キャッシュ: ブラウザやCDN（Content Delivery Network）などが古いリソースをキャッシュしている場合、新しいリソースがすぐには反映されないことがあります。キャッシュがクリアされると、新しいリソースが表示されます。
プロパゲーション遅延: DNSの変更や新しいリソースの配信など、ネットワーク上での変更が全てのサーバーに伝播するまでには時間がかかることがあります。
ビルドやデプロイメントの遅延: 大規模なウェブサイトでは、ビルドやデプロイメントに時間がかかることがあります。その結果、一部のリソースが他のリソースよりも遅れて更新されることがあります。
これらの要因により、ビルドやデプロイメント直後に一時的な問題が発生することがあります。しかし、これらの問題は通常、時間が経つと自然に解決します。

上記により、今回の件では、CloudFront = CDN のキャッシュにより新しいリソースが表示されていなかったということが原因だと理解しました。

そもそも、CloudFront はキャッシュを利用することで高速なコンテンツ配信を実現しているサービスなので、なるほど納得です。

ちなみに、すぐに反映させたい場合は、CloudFrontのキャッシュを削除することも一つの方法のようです。
AWS のマネジメントコンソールに「キャッシュ削除」の項目があります。
![スクリーンショット 2024-04-16 1.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/8b5ed06f-f0d4-189f-e547-4ae2570b74f4.png)

ですが公式サイトに、「ファイルを無効にすると、料金が発生する可能性があります。」とあるので、削除する際はお気をつけください。

https://repost.aws/ja/knowledge-center/cloudfront-clear-cache

# 5. 最後に
エラーが発生すると毎回悩みに悩んで、数日解決しないと泣きたくもなってきますが、解決するたびに学びとなって成長している実感があります。
この記事が同じエラーで困っている方の助けになれば幸いです。
画像処理とは？

## はじめに
私の研究テーマは **画像処理** です。
画像処理の世界についてつらつらと書き連ねていきます。
ここでは上辺のお話が多めですので、具体的な実装のお話はそれぞれのリンク先をご参照ください。

### 画像処理

画像処理とは、読んで字のごとく画像をいじるという作業です。画像処理にもいろいろとありますが、代表的なものとして **分類** と **変形** が挙げられるかと思います。

### 分類
分類とは、機械学習の一つの目標であるといえます。画像処理における分類は、**画像に何が写っているか** を検出することを目標にしています。

<img width=300 alt="apple_image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566695/64047952-07f5-c643-9f03-2c170360ca74.png">

例えば、こんな画像をコンピュータに渡して、**リンゴ** と答えさせるようなことをします。

## 教師あり学習
画像の **分類** タスクには、**教師あり学習** の方法がよく用いられます。
教師あり学習とは、学習用データとして大量の入出力ペアのデータを用意し、入力と出力の傾向をコンピュータに覚えさせるという方法です。学習用データの出力部分をとくに、**教師** とよびます。
学習の際によく用いられるのが、**ニューラルネットワーク** や **線形モデル** です。

#### ニューラルネットワーク
![多層パーセプトロン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566695/9495aa69-d898-8025-8d7b-ff2ed2030cad.png)

ニューラルネットワークの形はこのようなものです。（実際はもっと矢印と丸が多い）
一番左が入力層、一番右が出力層とよばれます。真ん中の層は隠れ層とよばれます。
ここでは、入力が3次元データ、出力が2次元データとなっています。
次元とは、データの何種類あるかというイメージで問題ないと思います。

入力の3次元データ（チョコの量、チョコの甘さ、色）に対して、2次元の出力（きのこ or たけのこ）を求めるようなものです。

詳しくはここにまとめています。

https://qiita.com/pippi_alola/items/5925f2d72621f0315e1e

https://qiita.com/pippi_alola/items/2a4e6ef56332848106c3

### 変形
大雑把にいうと画像をいじる、ということです。画像の欠損した部分を修正したり、ノイズを除去することが目標です。

<img width=250 alt="apple_logo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566695/315d2788-5b96-84c8-c4b7-1d6567a5f7cc.png">

見ての通り、リンゴに欠けている部分がありますね。
これを

<img width=300 alt="apple_logo_fixed.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566695/96bf6c36-96c2-6132-e271-4494f6f01912.png">

こうするのが **変形** です。

※変形という言い方は正確でないかもしれませんが、このような作業をコンピュータにさせると想像していただければありがたいです。




## 教師なし学習
画像の **変形** タスクには、**教師なし学習** の方法が用いられます。

教師あり学習の方法は、学習用データして入力と出力（ **教師** ）のペアデータを用いて学習します。
対して教師なし学習は、学習用データとして入力データのみで学習を行います。

私の研究は主にこの分野です。

### オートエンコーダ
オートエンコーダとは、ニューラルネットワークをつかってデータの特徴を抽出する方法です。

オートエンコーダは、**エンコーダ** と **デコーダ** からなります。

**エンコーダ** とは、データの特徴を抽出して次元を削減します。特徴の抽出という意味では、分類の処理と似ています。（ 例：画像⇒何が写っているか ）

**デコーダ** とは、抽出されたデータの特徴をもとに、データを復元します。（ 例：何が写っているか⇒画像 ）

このような処理を行うことで、ノイズ除去などの画像修復ができます。

https://qiita.com/pippi_alola/items/89c168b7775e845e67b0

## 研究内容
ここからは少しだけ研究内容のお話をします。

現在はノイズ除去を発展させるために、**ボルツマンマシン** の研究を行っています。
やっていることとしては、機械学習 + 統計学 のようなものです。

ボルツマンマシンといってもそれほど内容は変わりません。
ニューラルネットワークは、 入力⇒出力 のように一方通行でしたが、ボルツマンマシンはそのような向きがなくなります。その程度の違いです。

https://qiita.com/pippi_alola/private/b0039c6f1d0145557cc5

このような形で数式を羅列していますが、実装には至っていません。
当面の目標はボルツマンマシンの実装です。
【GCP】VM に Ops Agent をインストールして、Cloud Monitoring に Apache の関連メトリクスを監視してみました

## Ops Agentについて
VMにOps Agentをインストールすると、Cloud Monitoringに詳細の監視メトリクスを閲覧することとなります。
さらにはCloud MonitoringにはApacheなどの関連メトリクスも監視できることはみなさんご存知でしょうか？
本記事がDebian 10を使ってApache関連のメトリクスをOps Agent経由で取得してみました。

## 1. VMインスタンスを事前に準備すること
添付図のように、事前にVMインスタンスを立ててください。
![スクリーンショット 2024-04-15 23.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/3af93081-320b-1f9c-141b-bcf18c3f16d7.png)

またApacheも事前にインストールしてください。
なお、Apacheのインストール手順はここで割愛します。

## 2. 事前確認
`Cloud Monitoring` --> `Dashboards`　-->　`VM INSTANCES` を確認すると、Agent状態は`Not Detected`のため、現在のインスタンスにはCloud Monitoring Agentはインストールされていません。
![スクリーンショット 2024-04-15 23.58.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/0b51303b-14ff-b1ff-6670-2929c2d22a06.png)

現状確認すると、メモリ使用率は取得できていない状況で、それは想定通りの事象となります。今後Agentをインストール完了後に表示されることとなります。
![スクリーンショット 2024-04-16 0.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/1a347055-3fb8-71ea-a145-cd2eba3654de.png)


## 3. Ops Agentをインストール
[こちらの手順](https://cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/installation?hl=ja)に沿ってOps Agentをインストールしてください。基本以下の２行でいけます。
```
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
sudo bash add-google-cloud-ops-agent-repo.sh --also-install
```

もしくはGUIからも行けるので、今回私はGUIからインストールしました。Cloud Monitoringに`INSTALL`というボタンがあるので、それをクリックします。

![スクリーンショット 2024-04-16 0.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/3f6467e4-2b48-4808-8099-faabf2cb375a.png)

クリック完了後にOps Agentがインストール成功であることを確認しました。
![スクリーンショット 2024-04-16 0.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/b8c3f42f-0c97-af28-3bf3-bde6c3bff11b.png)

しばらく経つと、メモリのメトリクスも監視できるようになりました。
![スクリーンショット 2024-04-16 0.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6a935c81-819f-d5ca-6d1d-6732af47a3b8.png)

## 4. Ops AgentにApacheの監視設定
基本は[こちらの手順](https://cloud.google.com/logging/docs/agent/ops-agent/third-party/apache?hl=ja)に従って設定すればOKです。

今回は[構成の例](https://cloud.google.com/logging/docs/agent/ops-agent/third-party/apache?hl=ja#example-config)に書かれた例の設定ファイルを設定したことで、Apacheのメトリクスなどの情報を監視できるようになりました。

![スクリーンショット 2024-04-16 0.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/52d577e8-4635-b75c-7d04-674dd6e699ee.png)

クリックすると、オープン接続数や受信リクエストなど、トラフィック関連の指標が収集されていますね。
![スクリーンショット 2024-04-16 0.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/eedd90fd-469a-eca2-27db-c137a87a7472.png)

## 参考リンク
- Ops Agent インストールについて

https://cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/installation?hl=ja

- Apache ウェブサーバー（httpd）

https://cloud.google.com/logging/docs/agent/ops-agent/third-party/apache?hl=ja
【Zabbix5.0】Slack通知の実装で罠にハマりかけた

# 環境
* 監視サーバー
    * CentOS7
    * zabbix-server 5.0

# 設定
* ほぼほぼこれに従えば良い
https://devlog.arksystems.co.jp/2021/07/27/13746/

* 【罠】ユーザーの権限上、当該ホストを監視できないとslack通知できない
    * 【回避策】めんどくさいときは一旦これでもよい

![スクリーンショット 2024-04-16 0.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628851/72762c5a-e316-8f01-db38-684e6b346a33.png)