OmniAICreator/Qiita-1.07M huggingface dataset:
LogWatchでs-nail 経由のメールを送信する設定 忘備録

# 背景
- logwatch で毎日ログを受け取りたい
- postfix でメールを送信できるようにしたい
- postfix は SMTP として使う
- メールは ログの送信のみに使用する 

# 忘備録
- 25番ポートを開く

### 必要なソフトをインストール
```bash:Bash
dnf install s-nail postfix
```

### Hosts設定
```vim:vi /etc/aliases
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 aed.localdomain foobar.jp
# ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1   hoge.localdomain hoge
```
#### Hostsについて
##### 基本的な役割:
- ホスト名とIPアドレスのマッピングを定義
- DNSよりも優先して参照される
- ローカルでの名前解決に使用
###### 一般的な使用例:
- ローカル開発環境でのドメイン設定
- 特定のウェブサイトをブロック
- テスト環境の構築
```bash:使用例
127.0.0.1       localhost
127.0.1.1       your-computer-name
192.168.1.10    myserver.local
```
# Postfix 設定
```vim:# vim /etc/postfix/main.cf
myhostname = myhostname = foobar.jp
mydomain = jp
mydestination =  $myhostname, localhost.$mydomain, localhost , foobar.jp , foobar
mynetworks = 127.0.0.0/8
```

# ログの転送先アドレス設定
```vim:# vim /etc/aliases
root: fizz@foobar.or.jp , buzz@foobar.or.jp
```
設定の反映
```bash:Bash
newaliases
```

# 自動起動設定等
```bash:Bash
# systemctl start postfix
# systemctl enable postfix
```

# LogWatch 設定
```bash:Bash
mkdir /var/log/logwatch
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
vi /etc/logwatch/conf/logwatch.conf
```
- logwatch.conf は空ファイルのため設定をcpする
```bash:vi /etc/logwatch/conf/logwatch.conf
MailTo = root@foobar.jp
Output = mail
mailer = "/usr/local/bin/sendmail-wrapper.sh"
```
- MailTo = root@foobar.jp で、rootに来たメールは /etc/aliases　のアドレスに転送される
- mailer = "/usr/local/bin/sendmail-wrapper.sh"　は個人的な設定
- 後でなくてもよいか試す。迷惑メール行きだったため

# 参考文献
- [メールサーバのPostfixをインストール / Rocky Linux9.4 on さくらのVPS](https://aulta.co.jp/technical/server-build/rocky-linux94-sakura-vps/setup/postfix)
- [ログ監視ツール Logwatch を使ってみる (アップデート版)](https://blog.thingslabo.com/archives/logwatch.html)
atcoder練習(2024.11.15)

# キーワード

# 問題
https://atcoder.jp/contests/abs/tasks/abc083_b

1 以上 
N 以下の整数のうち、
10 進法での各桁の和が 
A 以上 
B 以下であるものの総和を求めてください。

制約
1≤N≤10 
4
 
1≤A≤B≤36
入力はすべて整数である
入力
入力は以下の形式で標準入力から与えられる。

N 
A 
B
出力
1 以上 
N 以下の整数のうち、
10 進法での各桁の和が 
A 以上 
B 以下であるものの総和を出力せよ。

入力例 1
Copy
20 2 5
出力例 1
Copy
84
20 以下の整数のうち、各桁の和が 
2 以上 
5 以下なのは 
2,3,4,5,11,12,13,14,20 です。これらの合計である 
84 を出力します。

入力例 2
Copy
10 1 2
出力例 2
Copy
13
入力例 3
Copy
100 4 16
出力例 3
Copy
4554


# 回答
```Python
N, A, B = map(int, input().split())

l = sum([int(x) for x in list(str(N))])
answer = 0

for i in range(N+1):
  l = sum([int(x) for x in list(str(i))])
  if A <= l <= B:
    answer += i

print(answer)

```

# 参考
https://dibtp.hateblo.jp/entry/2013/06/21/000629

# 備考
- 流石に連続でゴリ押しも良くないような気もするけど、動いたからよし。
- とはいっても、これ以外解放がないような気もする。
atcoder練習(2024.11.15)

# キーワード
for

# 問題
https://atcoder.jp/contests/abs/tasks/abc087_b

あなたは、
500 円玉を 
A 枚、
100 円玉を 
B 枚、
50 円玉を 
C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど 
X 円にする方法は何通りありますか。

同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

制約
0≤A,B,C≤50
A+B+C≥1
50≤X≤20,000
A,B,C は整数である
X は 
50 の倍数である
入力
入力は以下の形式で標準入力から与えられる。

A
B
C
X
出力
硬貨を選ぶ方法の個数を出力せよ。

入力例 1
Copy
2
2
2
100
出力例 1
Copy
2
条件を満たす選び方は以下の 
2 通りです。

500 円玉を 
0 枚、
100 円玉を 
1 枚、
50 円玉を 
0 枚選ぶ。
500 円玉を 
0 枚、
100 円玉を 
0 枚、
50 円玉を 
2 枚選ぶ。
入力例 2
Copy
5
1
0
150
出力例 2
Copy
0
合計金額をちょうど 
X 円にする必要があることに注意してください。

入力例 3
Copy
30
40
50
6000
出力例 3
Copy
213


# 回答
```Python
A = int(input()) #500円
B = int(input()) #100円
C = int(input()) #50円
X = int(input())

answer = 0

for c in range(C+1):
  for b in range(B+1):
    for a in range(A+1):
      if X == a*500 + b*100 + c*50:
        answer += 1

print(answer)
```

# 参考

# 備考
- ゴリ押しもゴリ押し、もう少し頭良さげに解きたい。
- まぁでも動いたのならよし！
- とりあえず書いてみるの大事
AI on インテル® Xeon® プロセッサー の利点  -コンフィデンシャル AI について-

【開発と活用を推進するインテルの AI】
インテルはクラウドからデータセンター、エッジにおいて、あらゆる場所での AI 活用を目指す、ソフトウェアやハードウェアでの AI 開発、さらには AI ソリューションへの活用を動画で解説するWebサイトを公開しています。
https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

＜AI 活用を動画で学ぶ＞
インテルのエキスパートたちが、ソフトウェアやハードウェア、AI ソリューションに関してのノウハウを動画で解説。今回ご紹介するのは、「セキュリティー」
AI を設計する上で社会に与えるリスクを低減し、メリットを最適化することを推進してきたインテルが「責任ある AI」を実現させるために実施している取り組みや、提供しているソリューションについて紹介します。

タイトル
AI on インテル® Xeon® プロセッサー の利点
コンフィデンシャル AI について

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/39946d64-bae2-2cc6-792a-92676e392e9c.png)

AI の利用拡大によって、個人のプライバシー情報や企業秘密などの機密情報の漏えいリスクに対しての懸念も広がってきています。今回の動画では、AI 利用における情報漏洩リスクに対しての一つの対策である、コンフィデンシャル AI という技術について説明します。

https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

是非この機会にAI Everywhere を実現するインテルのソリューションをご覧ください！
[php][laravel]ハイフン区切りの値と特定の値を照らし合わせ、一致するものをデータベースから抽出する方法


未経験で新卒エンジニアをしているものです！
先日案件で、以下のような処理を行うタスクに出会ったので共有いたします。

## ゴール
・特定のテーブル(例: tables)のカラム(例:column)に入っている値(例: `000 - 13579 - 0000` )のうち、ハイフン区切り3塊の数字の中央の値が$numberのいずれかの値(例:13579 )と一致している場合、そのレコードをdatabaseから取得する

例：
Itemsテーブル
|numberカラム |
|--- |
|000 - 13579 - 0000 |
|000 -  - 0000 |
|13579 - 0000 |

$numberの設定
```
$number = "13579,24680,31579,424680,513579,624680,713579,824680,913579,102468"
;
```

## 処理の流れ
①一塊の値をカンマで区切って配列に格納
    (→環境変数[^1]としてnumberを設定する場合も考慮して、一つの文字列を分解する工程を入れています)
    
②table.columnのうち、'数字-数字-数字'を満たすレコードに絞る
    (→NULLや文字が入っている例外を省く)
    
③中央の値が$numberのいずれかの数値と一致するレコードに絞る
↓↓↓



実装例
```
/**
*	$numberの値を設定
*	※$numberと値と一致しているtable.columnを抽出したい
*/
$number = "13579,24680,31579,424680,513579,624680,713579,824680,913579,102468"
;

/**	
*   ①一塊の値をカンマで区切って配列に格納
*/
$number = explode(',', $number);

/** 
*	②table.columnの中央の値が'数字-数字-数字'を満たす値に絞る
*/
$query = \DB::table('Items');
$query->whereRaw("table.column REGEXP '^[0-9]+-[0-9]+-[0-9]+$'")

/** 
*	③table.columnのうち、
*	中央の値が$numberのいずれかの数値に一致する値に絞る 
*/
      ->where(function ($query) use ($number) {
        foreach ($number as $value) {      　　
        $query->orWhereRaw("SUBSTRING_INDEX(SUBSTRING_INDEX(table.column, '-', 2), '-', -1) = ?", [$value]);
        }
      });
```

〜分解して解説〜
`REGEXP '^[0-9]+-[0-9]+-[0-9]+$'`
↓↓↓
`^`:文字開始記号
`$`:文字終了記号
`[0-9]`:0〜9の数字が入ることを示す
`-`:数字間に-が入ることを示す。カンマ区切りの場合は'^[0-9]+,[0-9]+,[0-9]+$'となる。

​​`orWhereRaw`
:WHERE へ SQL 文を直接挿入できるメソッド。ここでは、中央の値が特定の値のいずれかと一致する条件を追加。where〜or〜or〜...という条件式ができる

`SUBSTRING_INDEX(table.column, '-', 2)`
:table.columnの値において、左から2番目の-で2つのブロックに区切った左側の値を出力する(例:000 - 13579 - 0000のうち、000 - 13579)

`SUBSTRING_INDEX(SUBSTRING_INDEX(table.column, '-', 2), '-', -1)`
:SUBSTRING_INDEX(table.column, '-', 2)の値(例:000 - 13579)において、-で2つに区切ったブロックのうち右から1番目の値を出力する(例:13579)

参考:
[https://dev.mysql.com/doc/refman/8.0/ja/string-functions.html#function_substring-index](https://dev.mysql.com/doc/refman/8.0/ja/string-functions.html#function_substring-index)

環境変数*: 
https://qiita.com/s_ryota/items/26f1a05737a48ad08956

## 感想
最初は複雑な処理にビビってしまっていましたが、一つ一つ落ち着いて分解して考えると理解できました！
少しでも参考になれば嬉しいです！
copilot studioのライセンス周りのあれこれ


# Copilotのテナントライセンスの購入
M365管理センターに管理者アカウントでログインし、[サービスを購入する]からMicrosoft Copilot Studioを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/72e5a102-6efc-2278-e1eb-97527a4fb311.png)

今回は試用版を購入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/35d7b47b-0a0c-a7e6-ae10-e5120fb5afdc.png)

購入すると、Power Virtual Agents Viral Traialというのが10000個付与される(Trialとあり有料版は名前がことなるのかも？？)。
これをユーザーに割り当てることでそのユーザーはCopilot(最近エージェントという名前に変わった)を作成することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/756fada1-6b30-7418-7d88-69aaf74031b6.png)

# Graphコネクタの利用時の注意
グラフコネクタを利用する前提条件としてグラフコネクタのクウォータを所持している必要がある。
以下のいずれかのライセンスを持っていないと、そもそも後続の作業でM365管理センターにて[設定]-[検索とインテリジェンス] -[データソース]から設定したいグラフコネクタを選択していく手順となるが、データソースタブが出てこないので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/819f12d5-bae8-b044-2674-6a71cb5c2724.png)
https://learn.microsoft.com/ja-jp/microsoftsearch/licensing#index-quota-for-microsoft-365-enterprise-users

グラフコネクタの利用については以下を行っていく
https://learn.microsoft.com/ja-jp/microsoftsearch/configure-connector#step-1-add-a-microsoft-graph-connector-in-the-microsoft-365-admin-center

※上記設定をしないと、Copilot Studioにてグラフコネクタが非活性となっており使えない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/f34190f7-8a0d-5ee2-6597-84bfc2286760.png)
VimiumのLinkHintsを1つのキー設定で現在のタブ or 新しいタブで開く

## はじめに

こんにちは、Ctrlです。

Vimiumでちょっとした気づきがあったので備忘録として投稿しておきます。

```

Open a link in the current tab
(LinkHints.activateMode)

現在のタブにLinkHintsで指定したリンクを開く

Open a link in a new tab
(LinkHints.activateModeToOpenInNewTab)

新しいタブでLinkHintsで指定したリンクを開く

```

以上がLinkHintsで現在のタブと新しいタブでリンクを開くためのコマンドです。

```

map <c-S> LinkHints.activateMode

```

以上は Google ドキュメントで音声入力をオン・オフするための キーボード ショートカットであり、 Ctrl + Shift + s を現在のタブにLinkHintsで指定したリンクを開く設定になっています。キーボード レイアウト的には左手の人差し指と小指、両手で作業する際のための右手の人差し指に設定してある形です。

この設定のままアルファベットの大文字で入力をすると、 もしかしたらバグかもしれませんが、新しいタブにLinkHintsで指定したリンクを開くことができます。小文字のアルファベットであれば現在のタブにLinkHintsで指定したリンクを開くことが可能となり、なるべくキーボードから手を離さないままにブラウジングの閲覧や作業を続けることができるので地味ですが意外と便利です。

## 最後に

最近は仕事をしながら、リアルタイムにキーマップの変更をしていたり、テンティングに挑戦したりしています。 

何か面白いアイディアがありましたら、是非とも教えてください！ 

最後までお読みいただきありがとうございました。

その他、コンテンツマーケティング関連や執筆関連のお仕事があれば、お気軽にご相談いただけると幸いです。

https://crowdworks.jp/public/employees/1089210

https://www.lancers.jp/profile/Ctrl

## 使用しているPCB：物理キーボード

使用している物理キーボードは[@takashicompany](https://twitter.com/takashicompany)さんのWorm Eatenです。

https://github.com/takashicompany/worm_eaten/tree/master

![IMG_20241115_123736169 (1) (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608727/764649e4-aba2-9e06-5e3f-afbd5b1148d7.jpeg)
仮想マシンを立てる時のパスワード作成ツール🔑

ウェブから仮想マシンを立てるときにユーザアカウントの強固なパスワードを作成できるお役立ちツール。

```python
import random
from enum import Enum
random.seed(1)

class Regulation(str, Enum):
    SYMBOL: str = "@!_()[]@"


def run(inputstr: str):

    rngd = [random.randint(1, 100) for _ in range(10)]
    
    rn = "".join(map(str, rngd))
    base = inputstr + rn + Regulation.SYMBOL
    _tmp = list(base)
    random.shuffle(_tmp)
    password = "".join(map(str, _tmp))
    print(password)
    

if __name__ == "__main__":
    run(input())
```
ActiveRecordTips①~関連データの数による検索（n個以上、n個以下）

## はじめに
レコードを抽出する際に関連データの数で絞り込みたいことがありますが毎回「大体こんな感じだったけどあってたっけ？」てなるのでまとめておく。
ActiveRecordのTipsは今後も出していきたいので「こんな抽出はどうやるの？」的なものがあればコメントください！

## 関連データの数による検索
1対Nの関連付けのテーブル構造で子の数によっての検索
nとかmとかは数字に置き換えてください。
### 子レコードがない親レコードの抽出
```ruby
Parent.left_outer_joins(:children)
      .where(children: { id: nil })
```

### 子レコードがn個以上
```ruby
Parent.joins(:children)
      .group('parents.id')
      .having('COUNT(children.id) >= ?', n)
      .select('parents.*, COUNT(children.id) as children_count')
```

### 子レコードがn個以下
```ruby
Parent.joins(:children)
      .group('parents.id')
      .having('COUNT(children.id) <= ?', n)
      .select('parents.*, COUNT(children.id) as children_count')
```

### 子レコードがm個以上n個以下
```ruby
Parent.left_joins(:children)
      .group('parents.id')
      .having('COUNT(children.id) BETWEEN ? AND ?', m, n)
```

### 子レコードが一番多いレコードの取得
```ruby
Parent.joins(:children)
      .select('parents.*, COUNT(children.id) AS children_count')
      .group('parents.id')
      .order('children_count DESC')
      .first
```

## 最後に
間違っている箇所があればコメントください🙇‍♂️
またrailsでできるお仕事くらはい🙏
（メモ）標本化 量子化 符号化

A/D変換について 忘れるので記載

### 標本化
一次的な自然情報を機器により採取（ **サンプリング** ）する
= アナログ信号

### 量子化
生のアナログ信号だとデータが大きすぎるため、**データ丸め、数値化する**
ex. 3.4 -> 3.0
アナログ信号の数値化 = デジタル信号

### 符号化
デジタル信号を **2進符号（バイナリ）** に変換し、コンピュータで処理しやすくする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/50854966-1e3b-1230-f55a-f1ad05ded022.png)
（引用：https://joho-taisaku.com/encoding/ )


## 参考
みたらとりあえず記載
https://joho-taisaku.com/encoding/
curlを使ってscp経由でファイルをアップロード

:::note warn
Windowsに標準で入っているcurl.exeではscpプロトコルは使用できません！
:::

### Windows

Protocolsにscpが含まれていない

```bash
curl.exe -V
curl 8.9.1 (Windows) libcurl/8.9.1 Schannel zlib/1.3 WinIDN
Release-Date: 2024-07-31
Protocols: dict file ftp ftps http https imap imaps ipfs ipns mqtt pop3 pop3s smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets
```

```bash
curl.exe -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt
curl: (1) Protocol "scp" not supported
```

ただし、Git Bash入れてるならscpできます

```bash
curl -V
curl 8.7.1 (x86_64-w64-mingw32) libcurl/8.7.1 Schannel zlib/1.3.1 brotli/1.1.0 zstd/1.5.6 libidn2/2.3.7 libpsl/0.21.5 libssh2/1.11.0
Release-Date: 2024-03-27
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL SSPI threadsafe UnixSockets zstd
```

### Linux (GitHub Codespaces)

Protocolsにscpが含まれている

```bash
curl -V
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3
Release-Date: 2020-01-08
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
```

アップロード

```
curl -u username: --key ~/.ssh/id_rsa -T hello.txt -k scp://example.com:10022/~/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     6    0     0    0     6      0      2 --:--:--  0:00:02 --:--:--     2
```

https://curl.se/docs/tutorial.html

TODO: scpとftpでのアップロード速度を検証したい

```bash
curl.exe -T hello.txt ftp://name%40example.com:passwd@ftp.server.example/
```
paizaラーニング問題集「移動が可能かの判定・複数回の移動」を解いてみた

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_mapmove_step3

▼考え方

この問題を解くために私が考えた内容1～3を以下に示します。

1. 現在向いている方角を示すneswと移動の向きdを関数caldistanceに渡して、y,x座標の移動距離を計算します。

2. 現在の座標(y,x)と1の戻り値(y,x座標の移動距離)を関数nextpositioncheckに渡して、移動が可能かどうかを判定します。題意の条件に合致した場合は"Stop"を出力します。

3. 移動後の向いている方角と移動後の座標を求めます。

▼コード
```py
H,W,sy,sx,N = map(int,input().split())

S = [list(input()) for _ in range(H)]
d = [input() for _ in range(N)]

# nesw: 現在向いている方角を示す変数 0:北,1:東,2:南,3:西
nesw = 0

# y: 現在のy座標を示す変数
y = sy

# x: 現在のx座標を示す変数
x = sx

# caldistance: y,x座標の移動距離を計算を計算する関数
def caldistance(nesw,d_i):

    # dy: y座標の移動距離を示す変数
    dy = 0

    # dx: x座標の移動距離を示す変数
    dx = 0

    if d_i == "L":
    
        if nesw == 0:
            dx -= 1
        elif nesw == 1:
            dy -= 1
        elif nesw == 2:
            dx += 1
        else:
            dy += 1

    else:
    
        if nesw == 0:
            dx += 1
        elif nesw == 1:
            dy += 1
        elif nesw == 2:
            dx -= 1
        else:
            dy -= 1

    return [dy,dx]

# nextpositioncheck: 移動が可能かどうかを判定する関数
def nextpositioncheck(y,x,dyx):
    
    if (y+dyx[0] <= -1 or y+dyx[0] >= H) or (x+dyx[1] <= -1  or x+dyx[1] >= W):
        print("Stop")
        exit()

    if S[y+dyx[0]][x+dyx[1]] == "#":
        print("Stop")
        exit()

for i in range(N):

    # 考え方1.
    # dyx: y,x座標の移動距離に関する情報を格納するリスト
    dyx = caldistance(nesw,d[i])
    
    # 考え方2.
    nextpositioncheck(y,x,dyx)

    # 考え方3.
    if d[i] == "L":
        nesw -= 1
    else:
        nesw += 1
    
    if nesw > 3:
        nesw = 0
    elif nesw < 0:
        nesw = 3
    
    y += dyx[0]
    x += dyx[1]
    print(y,x)
    
```
フルサービスリゾルバーメモ

フルサービスリゾルバー（Full-Service Resolver）は、DNS（Domain Name System）において、ユーザーからのドメイン名の問い合わせを受け、その名前に対応するIPアドレスを見つけて返す役割を持つリゾルバーです。  

フルサービスリゾルバーは次のように動作します：

1. **問い合わせの受信**: ユーザーがWebブラウザなどでドメインにアクセスすると、最初にフルサービスリゾルバーがその問い合わせを受け取ります。
  
2. **再帰的検索**: リゾルバーは、ルートDNSサーバーやTLD（トップレベルドメイン）サーバー、権威DNSサーバーに問い合わせを行い、ドメイン名に対応するIPアドレスを順に探しに行きます。この過程は「再帰的検索」とも呼ばれます。
  
3. **結果のキャッシュ**: リゾルバーは取得したIPアドレス情報を一定期間キャッシュとして保存し、次回以降同じドメイン名が問い合わせられた際に素早く返答できるようにします。

フルサービスリゾルバーは、DNS問い合わせを迅速に処理し、Webアクセスのスピードや効率性を向上させる重要な役割を担っています。
Python のデータ重複削除処理あれこれメモ

# ユースケース1. 純粋な配列で重複した値を一つにまとめる

`Set` が使える言語ならこれでおｋ。

```python
data = [1, 2, 3, 3, 5, 7, 13, 13]
list(set(data)) # => [1, 2, 3, 5, 7, 13]
```

# ユースケース2. エンティティのプロパティをキーにした重複削除

後勝ちする方法と先勝ちする方法がある。

```python
from dataclasses import dataclass

@dataclass
class Person:
    id: int
    name: str
```

というクラスがある前提で

```python
persons = [Person(id=1, name="foo"), Person(id=1, name="bar")]

# 後勝ちするには
last_merge = {p.id: p for p in persons}
last_merge.values() #=> Person(id=1, name='bar')

# 先勝ちするには
first_come = dict[int, Person]()
for p in persons:
    first_come.setdefault(p.id, p)
first_come.values() #=> Person(id=1, name='foo')
```

他にもあれば都度追記予定。
フローで取得したレコード数を数える


今までは数値変数に「次の数と一致する」でコレクション変数を割り当てる必要がありました

+ [フローで取得したレコード数を数える](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBnGS)

:::note

以下に解説があります。

【手順３】「割り当て」要素を配置し、コレクション数を取得します。
・左辺に 【手順１】で作成した変数を設定
・演算子には「次の数と一致する」を選択
・右辺に 【手順２】で取得したコレクションを設定

https://note.com/crefil/n/na27d5fcc6f54
:::

Winter25 からはデータの返還要素が使えるようです。カウントだけでなくて、合計も取得できるみたい。

+ [Winter'25　フロー 「データの変換」要素でコレクション件数（レコード件数）をカウントする](https://sf.forum.circlace.com/articles/1043599459374940160)
AWS Amazon RDS for MySQLのパラメータ変更方法

Amazon RDS for MySQLでデータベースパラメータを変更する方法を紹介します。

## 1. カスタムパラメータグループの作成

1. AWSマネジメントコンソールにログインし、RDSダッシュボードを開きます。

2. 左側のナビゲーションペインから「パラメータグループ」を選択します。

3. 「パラメータグループの作成」をクリックします。

4. 以下の情報を入力します:
   - パラメータグループファミリー: 使用しているMySQLバージョンに合わせて選択（例: mysql8.0）
   - グループ名: わかりやすい名前を付ける（例: custom-mysql80）
   - 説明: グループの説明を入力

5. 「作成」をクリックします。

## 2. パラメータの編集

1. 作成したカスタムパラメータグループを選択します。

2. 「パラメータグループアクション」から「編集」を選択します。

3. 変更したいパラメータを検索し、値を編集します。

4. 「変更の保存」をクリックします。

## 3. DBインスタンスへの適用

1. RDSダッシュボードの「データベース」から対象のインスタンスを選択します。

2. 「変更」をクリックします。

3. 「追加の設定」セクションで、「DBパラメータグループ」を作成したカスタムパラメータグループに変更します。

4. 「続行」をクリックし、変更の概要を確認します。

5. 「すぐに適用」または「次のメンテナンスウィンドウ中に適用」を選択します。

6. 「DBインスタンスの変更」をクリックして適用します。

## 注意点

- 静的パラメータの変更はインスタンスの再起動が必要です。
- 動的パラメータは再起動なしで適用されますが、新しい接続から有効になります。
- デフォルトパラメータグループは編集できないため、必ずカスタムパラメータグループを作成してください。

## 確認方法

パラメータが正しく適用されたか確認するには、MySQLに接続して以下のコマンドを実行します:

```sql
SHOW VARIABLES LIKE 'パラメータ名';
```

以上の手順でAmazon RDS for MySQLのパラメータを変更できます。重要なパラメータを変更する際は、事前にテスト環境で影響を確認することをおすすめします。
Configure an Agentforce Service Agentの考察

[【Winter 25】Quick Start: Build Your First Agent with Agentforce > Configure an Agentforce Service Agentに戻る](https://qiita.com/Keiji_otsubo/items/a3e2fcb55d837fe219a9)
-------------

かなり以前に私はこのチャレンジを終わっていたのですが、何も問題は無かったと記憶しています（というより印象にに残っていないので、簡単にできたと思います。）

最近ではかなりの人が苦戦中。何故かSalesforceの中の人の質問が多いので、もしかしたら業務上必須になっているのかもしれませんね（なんとなくうわさで聞いたような...）

https://trailhead.salesforce.com/content/learn/projects/quick-start-build-your-first-agent-with-agentforce/configure-an-agentforce-service-agent

ということで、新しいプレイグランドを作って確かめてみましょう。

# Publish the Experience Cloud Site　（Experience Cloud の公開でエラー）

1. Search for Digital Experiences in the Setup Quick Find and select All Sites.
2. Click Builder next to the coral-cloud site.

+ [I'm unable to proceed "Configure an Agentforce Service Agent" training.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nDw10AE)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dc223c36-34cb-52bd-efca-45749460a896.png)


# Add the Get Experience Details Action to the Agent の Step 5 Get Experience Detailsがない

1. Click the Experience Management topic.
2. Click the This Topic’s Actions subtab.
3. Click New and select Add Action.
4. Select Flow as the Reference Action Type.
5. Select **Get Experience Details**.
6. Leave the other options as is, and click Next.
7. For experienceName, check Require Input.
8. For experienceRecord, check Show in conversation.

+ [While creating an agent, there is no drop down called "Get experience details" in this Topic's Actions](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nDxc)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a41ae005-22ca-1fe9-0955-6a09a8e2755a.png)

私の新しいプレイグランドにはありますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b47b46bf-c702-7248-c5f9-81d6aa8cc31d.png)

これはフローの中にありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/07822c18-0659-b7e3-c961-77d25d47b3a4.png)


有効化してないとどうなる？
出てきませんね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5968d777-2da4-f4b1-399f-4cebb3c0330c.png)

ここがOffでも出ないらしい

Is Einstein Copilot for Salesforce turned on?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0ad4c6ff-4308-64a5-47f9-782ccae0dbcc.png)


[Can't add a new topic to step 5 of the Configure an Agentforce Service Agent module](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mEOj)


# 独自の機能を追加した場合

+ [How to modify Configure Agentforce for Service challenge to show more than one experience](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KDPCf0AP)

# 未解決

+ [Experience Management Topic requiring email verification code](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkI3G0AV)

最後のステップで、予約を進める前にメールアドレスに送信された確認コードの入力を求められます。どうすればこのステップを無効にできますか？何度も最初から最後までやり直しましたが、予約を完了する前に確認コードの入力を求められます。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5ea605c2-7672-4e44-a907-5e514f1ef7fe.png)
RockyLinux9で一般ユーザーを削除する方法

# システムからユーザーを削除する
```bash:Bash
# userdel -r username
```
- -r でホームディレクトリも削除

# 参考資料
- [初期設定 : 一般ユーザーを新規追加する](https://www.server-world.info/query?os=Rocky_Linux_8&p=initial_conf&f=1)
【SQLインジェクション攻撃】でよく使われる文字列やキーワード

SQLインジェクション攻撃でよく使われる文字列やキーワードには、以下のようなものがあります。これらは、悪意のあるユーザーが意図的に入力することでSQLクエリを改ざんし、データベースに不正な操作を実行させることを目的としています。

### 1. 基本的な文字列
- `--`（ダブルハイフン）：以降の文字列をコメントアウトし、SQL文の一部を無効にします。
- `'; --`、`'; DROP TABLE users; --`：閉じシングルクォートとコメントアウトを組み合わせて意図しないSQL文を追加する。
- `'; DELETE FROM table; --`：テーブルの内容を削除する攻撃。
- `OR '1'='1'`：無条件で「真」にする条件を追加して、フィルタリングを無効化する。
- `OR 1=1`：上記と同様に条件を「真」にするために使用される。
- `UNION SELECT`：SQLの`UNION`を使用して、別のクエリを結合してデータを引き出す。
  
### 2. 特殊な構文と関数
- `CAST`、`CONVERT`：データ型を変換する関数で、意図的に異なるデータ型を挿入する。
- `SLEEP()`：特にMySQLで使用され、サーバーを停止させる時間遅延攻撃。
- `WAITFOR DELAY`：SQL Serverで使われる遅延関数。
- `EXEC xp_cmdshell`：SQL Serverで、システムコマンドを実行させる意図を含む。
  
### 3. スクリプト系の注入
- `<script>alert('XSS');</script>`：SQLだけでなく、クロスサイトスクリプティング（XSS）も狙ったコード。
- `'; EXEC('command') --`：サブクエリやOSコマンドを実行するSQLを挿入。
  
### 4. 特定の条件と論理演算子
- `AND 'a'='a'`、`OR 'a'='b'`：条件式を通過させるために使用。
- `' OR '' = '`：真または偽の評価を意図的に設定。
  
### 5. 特殊文字の例
- シングルクォート `'` とダブルクォート `"`
- セミコロン `;` とコメントアウト用の `--` や `#`
- バックスラッシュ `\` やスラッシュ `/`
  
### 対策
これらの攻撃を防ぐには、SQL文を組み立てる際にパラメータ化クエリを使用し、入力値のバリデーションやサニタイズ（特定の特殊文字を無効化）を徹底することが重要です。また、必要に応じてデータベースアクセスの権限を制限することで、攻撃の影響を最小限に抑えることも有効です。
非IT企業で働いているITエンジニアによくありがちな葛藤（二重の螺旋）

非ＩＴ企業でＩＴエンジニアをしていると、ときどき孤独感にさいなまれることがある。これは極論を言うと、エンジニアの宿命ではあるのであるが、それが時に相手の思惑に反して、知らない間に別の思考が働き、ついつい本題とは違うところで妙なモチベーションが上がって、ついつい余計なことをしてしまう。
この記事では、その経験と葛藤について書いてみたい。
## 保守とAI開発の狭間で

私はITエンジニアとして、あるシステムの保守を任されている。

システム保守を依頼されると、私は自然と効率化を考えてしまう。「保守マニュアルをAIに学習させて、保守計画書を自動生成できないだろうか」と考え始める。気がつくと、肝心の保守作業を差し置いて、保守AI開発に没頭している自分がいる。

しかし、保守を進めるには保守計画書が必要で、その作成には難解なコードと仕様の解読が必要不可欠だ。一方、保守を依頼した管理者（システム部門だがエンジニアではない）にとって、関心があるのは保守の完了だけ。私が作ろうとしている保守AIの開発は「余計な作業」としか映らず、保守が進まないことへの不満が募っているのを感じる。

```mermaid
flowchart TD
    subgraph エンジニアの視点
        A[保守依頼受領] --> B[コード・仕様の解読]
        B --> C[保守計画書作成]
        C --> D[保守作業実施]
        D --> B
        
        B --> E[保守作業の非効率を認識]
        E --> F[AI自動化を検討]
        F --> G[AI開発に時間投資]
        G --> B
    end
    
    subgraph 管理者の視点
        H[保守依頼] --> I[進捗確認]
        I --> J{進捗あり?}
        J -->|Yes| K[完了]
        J -->|No| L[不満/焦り]
        L --> I
    end
    
    style エンジニアの視点 fill:#f5f5f5
    style 管理者の視点 fill:#e6e6e6
```
## ノーコード開発での迷走

別のプロジェクトでは、あるシステムをノーコードツールで開発した。本来であれば、ツールの使い心地をユーザーに聞いて、その機能を拡充させるべきだった。

しかし気がつけば、私は自動テストやデリバリー部分、設計ドキュメントの自動生成など、ツールとは直接関係のない開発環境の構築に集中していた。結果として作られたものは、ユーザーが望む内容がツールに反映されていないどころか、保守の引き継ぎ時には開発環境という別ツールも保守対象として引き継がなければならなくなってしまった。

開発環境の整備は、ユーザーにとって見えない、理解もされない、ただのエンジニアの自己満足な成果物としか映っていない。

```mermaid
flowchart TD
    subgraph エンジニアの視点
        A[ノーコード開発開始] --> B[機能実装検討]
        B --> C[機能実装]
        C --> D[実装完了]
        D --> B
        
        B --> E[開発効率課題認識]
        E --> F[開発環境整備検討]
        F --> G[CI/CD・自動テスト開発]
        G --> B
    end
    
    subgraph ユーザーの視点
        H[機能要望] --> I[機能確認]
        I --> J{使いやすい?}
        J -->|Yes| K[満足]
        J -->|No| L[不満/要望蓄積]
        L --> I
    end
    
    style エンジニアの視点 fill:#f5f5f5
    style ユーザーの視点 fill:#e6e6e6
```
## 理解されない成果物

二つの例を示したが、やはり最も辛く感じるのは、非ＩＴエンジニアには二次成果物には何の価値も見出されず、単なる自己満足の余計なものとして映ってしまう（そもそも、その使い方でさえ必要性がないのであるから、なおさら当然ではあるが）

### 非エンジニアの視点
- 二次成果物は「余計なもの」として映る
- 本来の目的（保守や機能開発）から外れた無駄な作業
- 進捗の遅れの原因としか見えない

### エンジニアの視点
- 二次成果物は将来の開発効率を上げる重要な資産
- 他システムでも再利用可能な価値ある技術資産
- チーム全体の生産性向上につながる投資

## エンジニアの孤独
この理解されない価値観の違いが、深い孤独を生む。
- 技術的な成果を共有できる相手の不在
- 価値ある成果が理解されない虚しさ
- 「一人で勝手に作り込んでいる」という誤解
- 喜びを分かち合える仲間の不在

## 変化への道筋

この状況を少しずつ改善するため、私は以下のアプローチを試み始めている：

1. 小さな成功を積み重ねる
   - まず本来の業務で信頼を獲得
   - 効率化による具体的な成果を示す
   - 段階的に技術的な改善を導入

2. 「翻訳者」になる
   - 技術的な価値を業務的な価値に翻訳
   - 具体的な数字で効果を示す
   - ユーザー目線での説明を心がける

3. 仲間を作る
   - 社内の技術に興味がある人を見つける
   - 知識共有の機会を作る
   - 少しずつ理解者を増やす

## 結びに：希望の光
確かに、非IT企業のエンジニアとして働くことには深い孤独が伴う。しかし、この葛藤の中にこそ、私たち独自の価値がある気がしている。
技術への情熱を持ちながら、業務への理解も深められる私たち。実は、この二面性にこそ価値があるのかもしれない。技術と業務の橋渡しができる。実務に即した技術選択ができる。そして何より、両者の視点を理解できるからこそ、段階的な改善を実現できる。
完璧なバランスを見つけることは難しい。しかし、一歩一歩、理解者を増やしながら、技術と業務の架け橋となっていく。それが、非IT企業のエンジニアとしての私の役割なのかもしれない。
Android Studioの過去のバージョンをダウンロードする方法

# 手順

## 1. Android Studioのアーカイブページにアクセス
   - Android Studioのダウンロードアーカイブにアクセスします。
https://developer.android.com/studio/archive

## 2. 言語設定を英語に変更
   - ページが日本語で表示される場合は、右上の言語設定やSwitch to Englishで「English」に変更します。
   - 日本語の場合、UI崩れが起きてページが表示されない事象が起きました。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542499/49c52739-769a-4617-4819-b9c6d4aa7918.png)

## 3. 利用規約に同意
   - 利用規約を確認し、「I agree to the terms」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542499/344231cb-2977-6bdb-c30d-98e76e3d8b94.png)

## 4. 過去のバージョンを選択
   - 表示された過去のバージョン一覧から、インストールしたいバージョンを選択してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542499/7fd593da-fe61-d57d-f51c-0abcf156e5c4.png)
s-nail: Cannot start '/usr/sbin/sendmail -oi -t': executable not found (adjust *mta* variable) の解決方法

# 背景
十数年前のシステムを新サーバーに移行する中で、
logwatch で mailx を使いたかったが、
なかったのでs-nail を使うことにした。

# 原因
mta 変数に渡すコマンドとして /usr/sbin/sendmail -oi -t を指定すると、s-nail がこれを単一の実行可能ファイルとして解釈しようとするためエラーが発生する
# ポート開放
さくらのVPSでパケットフィルターを使用している場合、 25番ポートを開ける必要がある。
# 解決策
sendmail コマンドに必要なオプションを含めたラッパースクリプトを作成し、mta 変数をそのスクリプトに指すように設定
### ラッパースクリプトの作成
```bash:Bash
sudo vim /usr/local/bin/sendmail-wrapper.sh
```

```bash:sendmail-wrapper.sh
#!/bin/bash
/usr/sbin/sendmail -oi -t "$@"
```
```bash:Bash
sudo chmod +x /usr/local/bin/sendmail-wrapper.sh
```
### ~/.mailrc の設定変更
```bash:Bash
set mta="/usr/local/bin/sendmail-wrapper.sh"
set from="root@hogehoge.jp"
```
### テストメールの送信
```bash:Bash
s-nail -s "テストメール" hoge@gmai.com
```

## Postfix のログ
```bash:Bash
sudo tail -f /var/log/maillog
```
何が3Dスキャンできないか？

### 何が3Dスキャンできないか？

3Dスキャン技術の普及により、多くの物体が簡単にデジタル化できるようになりましたが、すべての物体がスキャンに適しているわけではありません。以下は、3Dスキャンがうまくいかない代表的な物体タイプです。

#### 1. 透明な物体

ガラスや水などの透明な物体は、スキャン時にレーザーや光が物体を通過してしまい、正確な表面データを取得できません。透明物体をスキャンするためには、表面に光沢のあるスプレーを塗布して、スキャン効果を高める必要があります。
![25079af0a97f859f74c3b8b31c96ae43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/f5239973-c386-a0ce-860d-436713c7822d.png)


#### 2. 高反射表面

金属や鏡面仕上げなど、高反射性の物体は、スキャン中にレーザーや光源を反射し、データが失われたり誤った情報が取得されたりします。このような物体は、スキャン角度を調整したり、特殊な技術を使用したりして反射を回避する必要があります。
![9b1b650dd2886346e5c96fd49c3b52a7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/ee7020fb-c562-a9bd-2257-8bdaee5526a6.png)


#### 3. 動的な物体

人や動物など、速く動いている物体は、正確にスキャンすることが難しいです。スキャンには物体が静止している必要があり、動いている物体ではデータを正確に取得できません。複数回の露光で動きを“凍結”させる技術もありますが、これらの技術はまだ広く普及していません。

#### 4. 固体でない物体

気体や液体などの非固体物体は、3Dスキャンできません。これらの物体は形状が常に変化しているため、静止している物体に比べてスキャンが不可能です。

#### 5. 光滑でテクスチャがない表面

非常に滑らかで目立つテクスチャがない物体、例えば一部のプラスチック製品などは、スキャン時に十分な参照点を提供しません。テクスチャが不足していると、スキャンの精度が低下します。
![375117c4004ae79d61620814f4e060cb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/b3c9fd84-e772-89f5-dc9e-2f0d86094f22.png)


#### 6. 複雑な多材質物体

金属、プラスチック、布など、異なる材質が組み合わさった物体は、スキャン時に材質ごとの光の反射特性が異なり、正確なデータを取得するのが難しい場合があります。このため、複数の材質を持つ物体をスキャンする際には注意が必要です。

### まとめ

3Dスキャン技術は非常に進化していますが、透明物体や高反射表面、動的物体、無テクスチャの物体、複数材質の物体など、特定の条件ではスキャンが困難です。これらの制約を理解することで、スキャンする物体を適切に選択でき、技術の進化を促すことができます。

3D スキャナーの推奨事項: 

https://www.revopoint3d.jp/collections/3d-scanners
スキーマビルダーでオブジェクトに項目作成方法

左にある「要素」から項目を追加したい右側のオブジェクトにドラッグ&ドロップしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b2c8926d-c4ad-7061-6020-4ee27dfc4a48.png)


項目を設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/be7d6ea5-cc8c-2062-57ba-7466d7078c7e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ec6c2a27-f15d-82b2-b58a-b6b66b53319e.png)

項目が作成されます

![uploading...0]()
Qiita、はじめまして & HTMLの基本について

## はじめに
Qiita、はじめまして。
これから開発系エンジニアになるため勉強していくからアウトプットの練習を兼ねてここにのせるね。
わからないことだらけだけど、よろしくね。

## WEBページとは
#### 基礎知識
webページはこの２つで作成される。
<dl>
    <dt>HTML（Hyper Text Markup Language）</dt>
    <dd>･･･Webページを記述する言語</dd>
    <dt>ブラウザ</dt>
    <dd>･･･HTMLで記述された「Webページ」を表示する機能</dd>
</dl>

## まとめ
・Webページは、HTML言語でつくらたコードを、ブラウザが「Webページ」として表示している
YouTube IFrame APIでのエラーコード取得方法

YouTube IFrame APIが提供するエラーコードを取得し，エラーの種類によってエラーメッセージを出力する例を紹介します．

## 1. YouTube IFrame APIでのエラーコードの取得方法
YouTube IFrame APIでは，エラーが発生すると`onError`イベントが呼び出され，`event.data`としてエラーコードが取得できます．
<br>（その値によりエラーの種類が判別できます）

### エラーコード一覧
- `2`: リクエストが無効
- `5`: HTML5プレーヤーのエラー
- `100`: 動画が見つからない
- `101`: 埋め込み再生が許可されていない
- `150`: 埋め込み再生が許可されていない（`101`と同じ意味）

## 2. 実装例

### 2.1. コード全体

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>YouTube IFrame API Example</title>
    <script src="https://www.youtube.com/iframe_api"></script>
</head>
<body>
    <div id="player"></div>
    <script>
        function onYouTubeIframeAPIReady() {
            player = new YT.Player('player', {
                height: '360',
                width: '640',
                videoId: '動画IDをここに挿入',
                events: {
                    'onError': onPlayerError
                }
            });
        }
        function onPlayerError(event) {
            console.error('Player error code:', event.data);
            let errorMessage = '';
            switch (event.data) {
                case 2:
                    errorMessage = '無効なパラメータです';
                    break;
                case 5:
                    errorMessage = 'HTML5プレーヤーのエラーです';
                    break;
                case 100:
                    errorMessage = '動画が見つかりません';
                    break;
                case 101:
                case 150:
                    errorMessage = 'この動画は埋め込み再生が許可されていません';
                    break;
                default:
                    errorMessage = '不明なエラーが発生しました';
            }
            console.error('Error message:', errorMessage);
        }
    </script>
</body>
</html>
```

### 2.2. onYouTubeIframeAPIReady()関数
1. `onYouTubeIframeAPIReady()`：YouTube APIが読み込まれると呼ばれる

2. `new YT.Player`：YouTubeプレーヤーを作成するためのオブジェクト
   
3. `videoId`：埋め込む動画のIDを任意で記入
   

### 2.3. onPlayerError(event)関数
1. `onPlayerError`：エラー発生時に`event`オブジェクトを受け取る
2. `event.data`：エラーの種類を判別
3. `switch`：エラーの種類によってメッセージをコンソールに出力


## 3. まとめ
CodePenなどで上記のコードを貼り付けてみてください．
Consoleに，エラーに応じたメッセージが表示されていると思います．

最後まで読んでいただきありがとうございまいた．
作ったパッケージを公開してみた

# 主旨
OpenCV使いのみなさんも、作っているライブラリの中で、公開することが許されるものがあったら、テストして、リファクタリングして、パッケージにまとめて、PyPIに登録しませんか。

## 開発しているとほしいものがでてくるよね
- まず探してみよう。
- なかったら、作るしかない。
- 役に立つ実装と利用例を作ってみる。
- 複数のプロジェクトで、使ってみる。
- 使えるものなったか。

## pythonモジュール化する。
- モジュール名を決める。
- モジュールフォルダに`__init__.py` ファイルをおく。
- pyproject.toml を書く。
    - [dependencies] に依存パッケージとバージョンを記入する。
- `python3 -m pip install .` をできるようにする。 

## testを書く
- mkdir test
- 動作検証するpythonスクリプトの中にassert を書く。
- 意味のまとまりを def test_関数名(): など関数に抽出する。
- pytest test_*.pyでテストが実行できるようにする。
- Makefile に make testを書く。

## リファクタリングする
- black などのフォーマッタを使って書式をそろえる。
- モジュールの中の関数で公開する必要ないものは"_" アンダースコアで始まる名前にする。
- 変数名・関数名などを読めばわかる名前に直す。
- typehintをする。
- 関数には副作用を持たないように設計する。
- 副作用を持つときは、そのことがわかるようにdoc comment に書く。
- `import モジュール名` だけで動作するように、`__init__.py` に必要な加筆をする。
例
｀from .somefile import 識別子` みたいなものを書き加えます。

## 利用側のスクリプトでの動作確認
- `python3 -m pip install .` でパッケージをインストールしたあとに、利用側のスクリプトでの動作を確認する。

- 使い勝手は意図したものになっているか。

## コードを公開する範囲は社内、社外
Githubのそのリポジトリはprivate, public
社内：Packagecloud
社外：PyPI

ライセンスを確認する。
公開先の範囲に応じて、コメントのコードの日本語コメントの扱いを再考する。
わかりやすい日本語ならば、機械翻訳して得られた英語の品質もそれなりになってきている。

## パッケージを作り公開する。
- pyproject.toml の設定にもとづいて、whlパッケージを作ります。
- 作ったものを別PCなどで使えるか確認します。
- [PyPiのテスト環境へのアップロードするまでの作業の備忘録](https://qiita.com/nonbiri15/items/a6e4e5e43a3230566a32)
- [PyPIに登録した内容を検証する　pip install ${自作パッケージ} の確認](https://qiita.com/nonbiri15/items/5352f65e8f99a72ecab9)

## まとめ
手順をふんでいくと、意外と簡単です。
みなさんも、作ったライブラリのうち、再利用性のあるものを公開して、楽しいOpenCVライフをしていきましょう。


#### つっこみ：OpenCVに限った話じゃないじゃないか
そうです。OpenCVなどを利用しているアルゴリズム系のエンジニアの場合、システム系の作業が弱いことが多いので、私の場合ながらく、パッケージを公開することがありませんでした。でも、あなたの作ったアルゴリズムをぜひ、共有できるぶんを共有してほしいので、OpenCVのAdvent Calendar に書きました。
【Bizrobo!】Excelの行削除をループさせる方法

## はじめに

今回は、 **「Excelの行削除をループさせる方法」** をご紹介します！

例として、下記のExcelのB列の値が「1」の行をすべて削除する処理を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/f475b7b2-ca7c-440e-529c-b1425bef93c3.png)

あくまで一例ですので、参考程度にご覧ください！

:::note warn
記事内のロボットは v10.4.0.4 で作成しています。
:::

## 設定方法

行削除をループ処理したい場合、「LoopRows(Excel内ループ)」が使用できないため、「Repeat(繰り返し)」を使用する必要があります。

■処理フロー：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/1de4c8a5-e2b1-5295-0e35-6d6062633f69.png)

■使用変数：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/2fc1a4b5-71b3-6956-23ad-10add91c4eef.png" width=50%>
・Excel処理対象(integer)
→行削除や値取得のファインダーに使用します。初期値には処理開始行を設定。
・削除行数(integer)
→削除した行数をカウント。初期値には[0]を設定。


■Assign Excel処理対象行
行削除することでループの対象行がずれていくため下記のように設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/1f76c333-8dff-e12e-95f4-cad6e5bde9f1.png)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/65293f14-b642-18e8-f8ac-cbde5de82e06.png" width=50%>

■行削除、値取得のファインダー
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/675ed2c0-ecce-a109-0013-2ea9e3c47c41.png" width=50%>
・画像の[A列=ブランク→最終行終了],[B列取得 Extract Flag]）
「>>[シート名]![列]<< + Excel処理対象行」

・画像の[空白行削除 Remove Rows]
「>>[シート名]!<< + Excel処理対象行」


以上で、Excelから空白行を削除する処理ができると思います！

## さいごに
ご覧いただきありがとうございました！
ぜひ参考にしていただければ幸いです。
LeetCodeを1日1題解いてみる (day16)

16日目に取り組んだ問題はこちら！

# 94. Binary Tree Inorder Traversal

https://leetcode.com/problems/binary-tree-inorder-traversal/description/

## 問題文
Given the root of a binary tree, return the inorder traversal of its nodes' values.

## 僕の回答
難しくて何もわからなかったのでGPTにコードを書いてもらい、解説をしてもらいながら実装しました。
```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        stack = []. # 待ちノード
        result = []
        curr = root

        while stack or curr:

            while curr:  # 右の最深部までいく
                stack.append(curr)
                curr = curr.left
            
            curr = stack.pop()  # 末尾から取り出す
            result.append(curr.val)
            
            curr = curr.right  # 左に進む
        
        return result
```

## より効率の良い回答例

特にありませんでした。

### コメント
木の操作は理解が浅いと実感した。授業で木構造のアルゴリズムは習っていたのでしっかり理解したい。

### 次の問題はこちら!
https://qiita.com/h_y_s_d/items/4b67cc17d94f48f551be
【Go】スライスに要素を追加する処理時間の比較


## 概要


スライスに要素を追加する**append**と**インデックスを直接指定する方法**のパフォーマンスが気になったので、処理時間を比較してみた。


## 環境

- MacBook Air M1 メモリ16GB、go 1.23.0

## 計測方法

- `[]int`型のスライスに10,000,000回要素を追加する処理を100回繰り返し、インデックスを直接指定する方法がappendの何倍速いかを計測。
- バラつきがあるかもしれないので↑を10回計測する。

## サンプルコード


```go
package main

import (
	"fmt"
	"time"
)

func main() {
	for i := 0; i < 10; i++ {
		fmt.Printf("-----%v回目-----\n", i+1)
		PerformanceHnadler()
	}
}

func PerformanceDemo(size int) (appendElapsed, indexElapsed time.Duration) {
	var slice []int

	// appendのパフォーマンス測定
	start := time.Now()
	for i := 0; i < size; i++ {
		slice = append(slice, i)
	}
	appendElapsed = time.Since(start)

	// スライスをリセット
	slice = make([]int, size)

	// インデックスを指定して直接要素を追加のパフォーマンス測定
	start = time.Now()
	for i := 0; i < size; i++ {
		slice[i] = i
	}
	indexElapsed = time.Since(start)

	return appendElapsed, indexElapsed
}

func PerformanceHnadler() {
	const size = 10000000
	count := 100
	var appendElapsed, indexElapsed time.Duration
	for i := 0; i < count; i++ {
		ae, ie := PerformanceDemo(size)
		appendElapsed += ae
		indexElapsed += ie
	}
	fmt.Printf("スライスに %v 個の要素を追加。 %v 回繰り返す\n", size, count)
	fmt.Printf("append: %v\n", appendElapsed)
	fmt.Printf("インデックスを指定して直接要素を追加: %v\n", indexElapsed)

	// appendElapsed が 0 でないことを確認して比率を計算
	if appendElapsed <= 0 {
		fmt.Println("appendElapsedが0のため、比率を計算できません")
	}
	speedRatio := float64(appendElapsed) / float64(indexElapsed)
	fmt.Printf("インデックス指定の方が append より %.2f 倍速い\n", speedRatio)
}
```


## 計測結果


```bash
-----1回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.495103789s
インデックスを指定して直接要素を追加: 353.483706ms
インデックス指定の方が append より 7.06 倍速い
-----2回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.401919877s
インデックスを指定して直接要素を追加: 332.053092ms
インデックス指定の方が append より 7.23 倍速い
-----3回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.410335913s
インデックスを指定して直接要素を追加: 332.230956ms
インデックス指定の方が append より 7.26 倍速い
-----4回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.441136288s
インデックスを指定して直接要素を追加: 333.297583ms
インデックス指定の方が append より 7.32 倍速い
-----5回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.469971122s
インデックスを指定して直接要素を追加: 334.017664ms
インデックス指定の方が append より 7.39 倍速い
-----6回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.526165877s
インデックスを指定して直接要素を追加: 334.303588ms
インデックス指定の方が append より 7.56 倍速い
-----7回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.515495208s
インデックスを指定して直接要素を追加: 333.801793ms
インデックス指定の方が append より 7.54 倍速い
-----8回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.524867495s
インデックスを指定して直接要素を追加: 333.606957ms
インデックス指定の方が append より 7.57 倍速い
-----9回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.522722656s
インデックスを指定して直接要素を追加: 333.727789ms
インデックス指定の方が append より 7.56 倍速い
-----10回目-----
スライスに 10000000 個の要素を追加。 100 回繰り返す
append: 2.535952582s
インデックスを指定して直接要素を追加: 332.531624ms
インデックス指定の方が append より 7.63 倍速い
```


## 結論

- 今回の計測方法ではインデックス指定の方が append より **約7倍速かった**
- データ量が少ないときはそこまで影響はないかもしれないが、スライスに要素を追加する際にあらかじめサイズが分かっている場合は、インデックスを指定する方法を使用するようにしたい
- ベンチマークテストも行ってみたい
rspec でディレクトリベースで実行可否を選択したかった

# やりたいこと

- rspec で特定のディレクトリ毎にテストを実行するしないを切り替えたりしたい

## いかにも

- `--tag` で，できそう

## 手で書くのは面倒

- rspec-rails には，`infer_spec_type_from_file_location!` がある

## とりあえず

コピーしたら，うまくいってそう

```spec/spec_helper.rb
RSpec.configure do |config|
  %w(
    sub_dir1
  ).each do |type|
    dir_parts = ['spec', type]
    escaped_path = Regexp.compile(dir_parts.join('[\\\/]') + '[\\\/]')
    config.define_derived_metadata(file_path: escaped_path) do |metadata|
      metadata[:type] ||= type
    end
  end
(snip)
```

```
$ rspec --tag type:sub_dir1
$ rspec --tag ~type:sub_dir1
```

## というのを書いて

普通にディレクトリ指定すればいいことに気付いた

```
$ rspec spec/sub_dir1
```

## オチ

ハンマーと釘ということで

## Refs

https://qiita.com/jnchito/items/d367fda8ce9bdd191c17

https://qiita.com/tabakazu/items/8d160b28d9aeafe8846e

https://rspec.info/features/3-13/rspec-core/command-line/tag/

https://rubydoc.info/gems/rspec-core/RSpec%2FCore%2FConfiguration:define_derived_metadata

https://github.com/rspec/rspec-rails/blob/609bb83a76c11c67076ff2619fd5f47edd6325ce/lib/rspec/rails/configuration.rb#L151-L158
Powershellでマルチドメイン自己証明書を作成する



参考１：
https://kb.eway-crm.com/en/faq-1/server/how-to-create-self-signed-certificate-on-local-ip-address
参考２：
```powershell
$params = @{
    Subject = 'localhost'
    TextExtension = @('2.5.29.17={text}DNS=localhost&IPAddress=127.0.0.1&IPAddress=::1')
}
New-SelfSignedCertificate @params
```
参考３：Java クライアントで指定方法
https://docs.redhat.com/ja/documentation/red_hat_enterprise_mrg/3/html/messaging_installation_and_configuration_guide/enable_ssl_in_java_clients
```
-Djavax.net.ssl.trustStore=/home/bob/ssl_test/certstore.jks
-Djavax.net.ssl.trustStorePassword=password
```
```
-Djavax.net.ssl.keyStore=/home/bob/ssl_test/keystore.jks
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=/home/bob/ssl_test/certstore.jks
-Djavax.net.ssl.trustStorePassword=password
```
参考４：SSLContextを使ってSSLの有効期限を取得する
https://tech.kurojica.com/archives/4718/
結合メソッドとその発行SQL

## ActiveRecordのPreloadメソッドを使用した際の発行クエリ

(User 1:N Post)
```ruby
User.preload(:posts)
```
```sql
SELECT `users`.* FROM `users`
SELECT `posts`.* FROM `posts` WHERE `posts`.`user_id` IN [ usersのidすべて ]
```

(Company.preload 1:N User, Company.preload 1:N Department)
```ruby
Company.preload(:users, :departments)
```

```sql
SELECT `companies`.* FROM `companies`
SELECT `users`.* FROM `users` WHERE `users`.`company_id` IN ※※※
SELECT `departments`.* FROM `departments` WHERE `departments`.`company_id` IN ※※※

(Department 1:N DepartmentUserMaps, User 1:N DepartmentUserMaps)
Department.preload(:users)
SELECT `departments`.* FROM `departments`
SELECT `department_user_maps`.* FROM `department_user_maps` WHERE `department_user_maps`.`department_id` IN [ departmentsのidすべて ]
SELECT `users`.* FROM `users` WHERE `users`.`id` IN [ department_user_mapsのuser_idの全て ]
```


(Post N:1 User)
```ruby
Post.eager_load(:user)
```
```sql
SELECT
"posts"."id" AS t0_r0,
"posts"."name" AS t0_r1,
"posts"."user_id" AS t0_r2,
"posts"."created_at" AS t0_r3,
"posts"."updated_at" AS t0_r4,
"users"."id" AS t1_r0,
"users"."name" AS t1_r1,
"users"."created_at" AS t1_r2,
"users"."updated_at" AS t1_r3
FROM "posts" LEFT OUTER JOIN "users" ON "users"."id" = "posts"."user_id"
```


```ruby
User.left_joins(:photos, :movies).preload(:posts, :photos, :movies).merge(Photo.where(id: 2).or(Movie.where(id: 3)))
```
```sql
SELECT
"users"."id" AS t1_r0,
"users"."name" AS t1_r1,
"users"."created_at" AS t1_r2,
"users"."updated_at" AS t1_r3,
"photos"."id" AS t0_r0,
"photos"."name" AS t0_r1,
"photos"."user_id" AS t0_r2,
"photos"."created_at" AS t0_r3,
"photos"."updated_at" AS t0_r4,
"movies"."id" AS t1_r0,
"movies"."name" AS t1_r1,
"movies"."user_id" AS t0_r2,
"movies"."created_at" AS t1_r2,
"movies"."updated_at" AS t1_r3
FROM “users” 
LEFT OUTER JOIN "photos" ON "users"."id" = "photos"."user_id"
LEFT OUTER JOIN "movies" ON "users"."id" = "movies"."user_id"
WHERE "photos"."id" = 2
AND WHERE "movies"."id" = 3

SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = [ 上記で取得したusersのidの全て ]
SELECT "photos".* FROM "photos" WHERE "photos"."user_id" =  [ 上記で取得したusersのidの全て ]
SELECT "movies".* FROM "movies" WHERE "movies"."user_id" =  [ 上記で取得したusersのidの全て ]
```


```ruby
User.left_joins(:photos, :movies).preload(:posts, :photos, :movies).merge(Photo.where(id: 2).or(Movie.where(id: 3)))
```
SELECT "users".*
FROM "users"
LEFT OUTER JOIN "photos" ON "photos"."user_id" = "users"."id"
LEFT OUTER JOIN "movies" ON "movies"."user_id" = "users"."id"
WHERE ("photos"."id" = 2 OR "movies"."id" = 3)

SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (2, 3)
SELECT "photos".* FROM "photos" WHERE "photos"."user_id" IN (2, 3)
SELECT "movies".* FROM "movies" WHERE "movies"."user_id" IN (2, 3)




WHERE users.id = 2 の条件が適用された場合、結合されるのは users テーブルに id = 2 のレコードが存在する posts のみになります。LEFT OUTER JOIN の「関連がない場合でもデータを返す」という特徴が意味をなさなくなり、実質的には INNER JOIN と同じ動作になるため、最初から INNER JOIN を使う方が 意図に沿った結果 になります。
【Rails】フロントエンド開発に必要なツールとその役割


## Node.js  
RailsでJavaScriptを処理・ビルドするために必要。

``` powershell
# 確認
node -v
# インストール方法
# Node.js は コマンドでなく、サイトからインストールする
# 公式サイト (https://nodejs.org/) 
```

## yarn  
JavaScriptのパッケージマネージャー。  
Webpackや他のライブラリをインストール・管理するために使用。

``` powershell
# 確認
yarn -v
# インストール方法
yarn install
```

## npm（Node Package Manager）  
Node.js標準のパッケージマネージャーで、yarnと同じようにパッケージのインストール・管理を行う。  
`yarn`は一部機能が高速であるため、`yarn`が推奨されることが多い。

``` powershell
# 確認
npm -v
# インストール方法
npm install <パッケージ名>
```

## webpack  
JavaScriptの「モジュールバンドラー」。  
複数のJavaScriptファイル・CSS・画像のリソースをまとめたり、最適な形でファイル分けして、読み込みを高速にする。  
WebpackはYarn経由でインストールされ、`yarn install`実行時に`package.json`に記述された依存関係に基づいてWebpackが自動的にインストールされる。

```powershell
# 確認
# npx は Node Package Executor の略
# Node.jsパッケージの実行を簡単にするツール 
npx webpack -v
# インストール方法
yarn install #実行時にwebpackも自動でインストールされる
# 下記でwebpackだけインストール
npx webpack -v
```

##

### ビルドとは  
開発環境で書かれたコードやリソースを、最適な形に変換・まとめて、実際に動作する環境に備える。  
コンパイル ⇒ バンドル（まとめてブラウザが効率よく読み込めるようにする） ⇒ 圧縮・最適化 ⇒ モジュールの管理（依存関係の解決・最適な順序での読み込み）。

### バンドラーとは  
複数のリソース（JavaScript、CSS、画像など）をまとめるツール。  
Webpackなどは「バンドル」という概念で、効率的にファイルをまとめて読み込みを高速化する。

### アセットとは  
Webページの見た目や動きを構成するファイル（JavaScript、CSS、画像など）。  
フロントエンドアセットを管理・ビルドすることがアセット管理。
名前解決とSCANのPCデータ保存

６月の半ばから約２週間設定に苦しめられました。

FUJIFILM　ApeosC2360
設定はHP　ProBookシリーズ

### １）複合機パネルからユーザー登録
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/1fe8e02e-698c-8fc7-4caf-731022db883a.png)

**登録内容**
・表示名（パネル表示のための）
・共有フォルダ
・フルコンピューター名
・PC保存のためのWindowsログインパスワード

:::note info
※注意事項１（ActiveDirectory設定があるのでフルコンピューター名にドメインが付きます）
:::
:::note info
※注意事項２　PC側の保存フォルダは複合機から見えるように共有設定が必要です。
:::

### ２）保存フォルダを作成し共有設定
![タイトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/73904b66-e17e-8c76-ed75-9ab0c34e402e.jpeg)

プロパティ＞共有タブ＞共有するをチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/6807caac-5b21-1d76-87f1-35ab1a763bef.png)

プロパティ＞共有タブ＞詳細な共有＞変更にチェック

これで保存フォルダの共有設定は終わり

### ３）PC側の設定

#### networkとintyernet共有設定

![タイトルmikann.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/92623cab-b98a-ab44-ba05-74aac617ae8b.jpeg)

#### 受信の規則
コントロールパネル＞システムとセキュリティ＞Windows Defenderファイアウォール＞詳細設定

![タイトルkudamono.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/2766fd10-b4ba-d9cc-2d7c-ddaf743e3b10.jpeg)
左のメニューバーの一番上

![タイトルrinngo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/7e7061fd-99c0-d3c0-8b97-bbf31645478a.jpeg)
ファイルとプリンターの共有（エコー要求ICMPv4受信）を有効化する


ここまでやっていただけるとたいていのSCAN設定は通ると思います。

**参考**
複合機側から見えるパスは
![スクリーンショット 2024-07-03 105349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/253fc28f-64fd-d850-768c-7f01eaf89049.png)
保存フォルダのプロパティ＞共有タブ＞フォルダ７画像の下
\\TCHW21012\scan
が複合機側から見えているパスです。

ここから問題を特定するのに４日
修正しておただくのに２日ほどかかりました。

問題特定１日目　→　今設定できているPCの設定をすべてコピーしてSCANできるか探った。
問題特定２日目　→　FujiFilmサポートチェット利用して、設定確認。あと不具合報告。
問題特定３日目　→　過去のPCへのSCANデータ送信不可事例を確認して、弊社サポートサイトへ
問題特定４日目　→　Yahoo知恵袋で投稿　３日目。専門家が細かい質問をしてもらってそ
れに答えて問題特定できました。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11300165196

ここから交渉に入るのですが
システム部がなかなか理解してくれずに、FujiFilmに問い合わせてみてくださいだの、
お手伝いできるのはここまでですだのいろいろいいわけはしていましたが、早く質問を切り上げてほかに行きたい気持ちが満載でした。

ここは感情的にならず、協力を仰ぐのが一番だと思います。
粘り強さがいります。

システム部を動かすに至ったのは以下のコマンドです。

```bat

nslookup
```

これはパソコン名を入れるとそれに対応したipを返してきてくれるのですが、ある一台のPCが現在設定されているIPアドレスとはまったく違うIPで、そのIPに向けてpingを打ってもタイムアウトしてしまいました。

パソコン情報と確認できたイメージを送って　やっと対応してくれる運びとなりました。