OmniAICreator/Qiita-1.07M huggingface dataset:
ls -l コマンドを実行した時の先頭のアルファベットの種類について

## はじめに
Linux コマンドである `ls` について、オプションとして "-l" をつけた時に表示されるファイルタイプについて、検索してみてもすぐに見つからなかったので、簡単にまとめてみました。

## `ls -l` コマンドで表示されるファイルタイプ一覧

* **-**：通常のファイルを示します
* **d**：ディレクトリを示します
* **l**：シンボリックリンクを示します
* **c**：キャラクタデバイスを示します
* **b**：ブロックデバイスを示します
* **s**：ソケットを示します
* **p**：FIFO（名前付きパイプ）を示します

```console:ファイルタイプ一覧
[root@localhost work]# ls -l
total 4
srw-rw-rw- 1 root root      0 Mar 28 16:51 bar
prw------- 1 root root      0 Jun 22  2018 baz
brw-rw---- 1 root disk   7, 0 Jun 22  2018 foo
drwxr-xr-x 2 root root   4096 Mar 28 18:06 fuga
-rw-r--r-- 1 root root      0 Mar 28 18:21 hoge
lrwxrwxrwx 1 root root      4 Mar 28 18:08 hogehoge -> hoge
crw------- 1 root root 244, 0 Mar 28 17:10 piyo
```

各々のファイルについての説明は、以下記事で詳しく説明されているのでそちらを参照して下さい。

https://qiita.com/angel_p_57/items/1faafa275525469788b4

## 最後に
検索して上記のサイトがすぐに見つかればいいのですが、私の検索ワードが拙くてすぐに見つからなかったので、誘導的な意味も込めて記事にしてみました。
RubyでAtCoder ABC285(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC285のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Edge Checker 2
https://atcoder.jp/contests/abc285/tasks/abc285_a
```ruby:a-285.rb
a, b = gets.split.map(&:to_i)
puts b == a * 2 || b == a * 2 + 1 ? "Yes" : "No"
```
## 解説
問題文にある図を見てわかるように、ある数字の点（aとする）とつながる点は2aまたは2a+1となります。

# B - Longest Uncommon Prefix
https://atcoder.jp/contests/abc285/tasks/abc285_b
```ruby:b-285.rb
n = gets.to_i
s = gets.chomp.chars
for i in 1..n - 1
    j = 0
    while j + i < n
        break if s[j] == s[j + i]
        j += 1
    end
    puts j
end
```
<追記>
コメントで教えていただきました。findメソッドを使って、コンパクトに書くこともできるようです。
```ruby:別解
n = gets.to_i
s = gets.chomp.chars
for i in 1..n - 1
   puts (0..n - i).find{ |j| s[j] == s[j + i]} || n - i 
end
```
## 解説
問題文の通りに実装していけば解くことができます。ただ、与えられた文字列を配列にしないとTLEしてしまうので注意してください。

# C - abc285_brutmhyhiizp
https://atcoder.jp/contests/abc285/tasks/abc285_c
```ruby:c-285.rb
s =gets.chomp
n = s.size
result = (1..n - 1).sum{ |i| 26 ** i }

array = *"A".."Z"
puts result + (0..n - 1).sum{ |i| array.index(s[i]) * (26 ** (n - i - 1))} + 1
```
<追記>
コメントでいただいた別解になります。
```ruby:別解
s = gets.chomp.bytes.reverse
puts s.each_with_index.sum { |c, i| (c - 64) * 26 ** i }
```
## 解説
（公式解説を参考にしました）

まず、k-1番目以下の文字それぞれについて26^(k-1)通りあるので`result=(1..n-1).sum{|i|26**i}`と初期化します。そして、Aからk番目の文字それぞれについて（`array`をアルファベットの配列としたときに）`array.index(s[i]) * (26 ** (n - i - 1)`通りあるのでこれらの合計をresultに足せば答えが求まります。

# D - Change Usernames
https://atcoder.jp/contests/abc285/tasks/abc285_d
```ruby:d-285.rb
# 修正前

n = gets.to_i
s_array = []
t_array = []

# 行き先
to = {}

n.times do
    s, t = gets.split(" ")
    s_array << s
    t_array << t
    to[s] = t
end

visited = {}
s_array.each do|s|
    ns = s
    while !visited[ns]
        visited[ns] = true
        break unless to[ns]
        ns = to[ns]
        if ns == s
            puts "No"
            exit
        end
    end
end
puts "Yes"
```
```ruby:285.rb
# 修正後

n = gets.to_i
to = n.times.to_h{ gets.split }
# to = Array.new(n){ gets.split }.to_h

visited = {}
to.keys.each do|s|
    ns = s
    while !visited[ns]
        visited[ns] = true
        break unless to[ns]
        ns = to[ns]
        if ns == s
            puts "No"
            exit
        end
    end
end
puts "Yes"
```
## 解説
（公式解説を参考にしました）

<方針>
パスグラフになるか、サイクルになるかを調べます。すると、答えは前者ならYes、後者ならNoとなります。

まず、連想配列toに行き先を記録しておきます。また、時間短縮のためにすでに探索したものを記録するための連想配列visitedを用意しておきます。

そして、それぞれのユーザーの現在のユーザー名s[i]に対して、始点をs[i]として行けるところまで更新していきます。このとき、更新していく操作の最中に始点に戻ってしまった場合はサイクルであることを意味するのでNoを出力して終了します。最後まで、探索できればYesを出力します。

# 終わりに
なかなか解法がパッと思い浮かびませんね...。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
Next.jsをVercelにデプロイ→エラー（Error: `'` can be escaped with `&apos;`, `&lsquo;`, `&#39;`, `&rsquo;`.  react/no-unescaped-entities）

# Next.jsをVercelにデプロイ→エラー（Error: `'` can be escaped with `&apos;`, `&lsquo;`, `&#39;`, `&rsquo;`.  react/no-unescaped-entities）

### エラーの解説
Next.jsのページのコンテンツ部分にシングルクォーテーション`'`があるとVercelにデプロイの際、「Error: `'` can be escaped with `&apos;`, `&lsquo;`, `&#39;`, `&rsquo;`.  react/no-unescaped-entities」というようなビルドエラーをVercelが吐いてデプロイできない。

ページコード例：
```javascript
const Index = () => {
    return (
     <h1>I'm Atom</h1>
     <p>Lorem Ipsum has been the industry's standard dummy text</p>
    )
}
export default Index
```

上記のコード例だと、`<h1>`タグの中身I<font color="red">**'**</font>m Atomと`<p>`タグの中身…the industry<font color="red">**'**</font>s standard…という文章にシングルクォーテーションが使われている（赤文字）。
Vercelがこれはイカン！とおっしゃる。


### 解決方法

それぞれの文章を波カッコとバックチックで囲った。

```javascript
const Index = () => {
    return (
     <h1>{`I'm Atom`}</h1>
     <p>{`Lorem Ipsum has been the industry's standard dummy text`}</p>
    )
}
export default Index
```

これでデプロイ成功した。しかし日本語コンテンツであればほとんど遭遇しなさそうなエラーだが、アルファベット圏の方々は皆このようにしているのだろうか？？？
仕様レベルのインシデントかと思われるが…

### 参考
[19:259 Error: `'` can be escaped with `&apos;`, `&lsquo;`, `&#39;`, `&rsquo;`. react/no-unescaped-entities](https://stackoverflow.com/questions/73271987/19259-error-can-be-escaped-with-apos-lsquo-39-rsquo-r)
【Tips】パラメータに応じて、書式設定を変更する

## はじめに
現在参画中の案件にて、「ユーザーが入力した項目に該当する箇所を塗りつぶししたい」という要望をいただきました。

▼完成イメージ①（パラメータで「朝」が選ばれたら、下図の朝部分を塗りつぶし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/72b72bee-c04b-398c-e175-fce341434a1d.png)

▼完成イメージ②（パラメータで「終日」が選ばれたら、下図全てを塗りつぶし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/73d27eb7-1426-bf0e-9936-bad0489443bd.png)


実現方法について、（予め選択項目を決めておいた上で）、「パラメータ機能」を用いて、ユーザーが選択した項目に応じて書式を変えればいいのではと考えました。

ただ、パラメータ機能には課題があり、、、
- パラメータに応じて変化させられるのは、「ディメンジョン」や「メジャー」
- それらに応じて書式設定は連動させられない。

ということで、何らかの工夫が必要になりました。

そこで、パラメータの選択肢のメジャーは「数値」を返すようにして、その数値に応じて色変化する方法を実装したので、共有したいと思います。

## 実装方法
### ① パラメータを定義する。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/a7f5ffa1-c145-81d8-d685-cc580e685673.png)

### ② パラメータで使用するメジャーを定義する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/638c3f09-5d0a-df04-c432-5d56bea23630.png)
- ポイントは、塗りつぶしたい「時間帯」フィールドとパラメータの選択肢が合致したとき、何でもいいので数値を返すようにすること。
- 選択肢の数だけ、メジャーを複製しておく。

### ② パラメータの分岐処理を行う計算フィールドを定義する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/06b57d8a-a6e8-b365-ac53-283c79479af1.png)
- 例）パラメータで「朝」が選ばれたとき、①の「時間帯_朝」メジャーが配置される。

### ③ ②を色マークに設置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/ade32fdd-0cbe-6fa7-81c9-327c474a2719.png)

### ④ [色]の編集にて、100以上の場合、塗りつぶすよう設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/e7bbafa1-dea7-75ee-4876-242f4b99028a.png)
- 例）②のプロセスにて、「時間帯_朝」メジャーは、塗りつぶし対象の時間帯フィールドの「朝」に100という値が格納されているので、「朝」のみ緑色で塗りつぶしされる。

## おわりに
パラメータに応じて、書式設定を変えるTipsでした。
選択肢の数だけメジャーを作っておかないといけないので、開発画面がごちゃごちゃしてしまうのが難点です。
もっと効率的な方法をご存知の方がいれば、教えてください！
こんな新人プログラマは嫌だ

## はじめに

新人プログラマの皆さん、ようこそこちら側へ！
エンジニア10年目のおじさんです。
「こんな新人は嫌だなー」と思うものを列挙します。
当てはまらないように日々頑張ってみてください！

:::note warn
ポエムです。
個人の感想です。
:::

## 話を聞かない

まず大前提として話を聞いて欲しいです。
会話・対話をして仕事は成り立っていくので、話を聞いてくれないと仕事が進みません。

## アドバイスを聞かない

「話を聞かない」と似ていますが、成長して欲しいためにアドバイスをしているのでまずは聞いて欲しいです。
おじさんはお節介で話が長いし同じ話を何回もしてしまうのは本当に申し訳ないと思いつつ、まずは1回素直に聞いて欲しいなという気持ちがあります。
聞いた上で取捨選択して受け入れるもの、捨てるものを選んでくれれば良いです。

## 困っていることを相談しない

内に溜めてしまって相談せずに潰れてしまうのがとてもかわいそうなので、早い段階で相談して欲しいです。
あと「ちょっといいですか」を気軽に話せる身近な先輩を見つけるのが大事です。
心理的安全を確保して欲しいです。

## コードを書かない

うん、分かった、まずはコード書こう。
要件/設計/保守性/リファクタ/デザインパターン/UI, etc...
うんうんうん、分かる分かる。
よし、まずはコード書こう。

## 失敗を恐れてチャレンジしない

新人は失敗するものです。
失敗ウェルカムです。
新人のうちにたくさん失敗してください。
失敗するのが仕事です。
失敗したということは何かにチャレンジしたということで、チャレンジを高く評価したいです。
失敗するのが怖くてチャレンジしない、というのは本当にもったいないし成長できないです。
たくさん失敗してたくさん成長して欲しいです。

## 楽しそうじゃない

楽しく仕事したい。

## まとめ

繰り返しになりますが個人の感想です。
当てはまったからどうとか、そういう話ではないです。
皆さんが思う「こんな新人プログラマは嫌だ」があればコメントで教えてください！
pbcopyでファイルの中身をクリップボードにコピー

# `pbcopy` コマンドとは

ファイルの中身をクリップボードにコピーしたい時に使えるコマンド
これを使えばファイルを開くことなくターミナルでコピーを完結できる

## 使い方

例えば公開鍵（ `id_rsa.pub` ）の中身をコピーしたい時はターミナルで以下のコマンドを打てばいい
コマンドを実行したらその内容はクリップボードにコピーされるので `command` + `v` でペーストできる

```
$ cat id_rsa.pub | pbcopy
```
## コマンド解説

### cat

 `cat` はファイルの中身をターミナル上で表示するコマンド
 `cat id_rsa.pub` でやると `id_rsa.pub` の中身がそのままターミナル上に表示される

### |（パイプ）
パイプ左側のコマンド結果を右側のコマンドに渡す役割を担っている
この例の場合 `id_rsa.pub` の中身を `pbcopy` へ渡している

### pbcopy
 `cat id_rsa.pub` の内容をクリップボードへコピー
The Benefits of Using US Airport Limo Service for Corporate Travel

If you're planning a corporate trip, transportation can be a crucial aspect of the journey. This is where US Airport Limo Service can come in handy. Here are some benefits of using US Airport Limo Service for corporate travel.
Reliable and On-Time Services
When it comes to corporate travel, time is of the essence, and arriving late to a meeting or event can have negative consequences. https://www.USairportLimoService.com understands this and offers reliable and on-time services. They monitor your flight schedule and traffic conditions to ensure that they arrive on time to pick you up and get you to your destination promptly.
Professional Chauffeurs
All of the chauffeurs at https://www.USairportLimoService.com are experienced professionals who understand the importance of providing excellent customer service. They are knowledgeable about the local area, and they can provide you with recommendations on local restaurants, hotels, and attractions. They are also fully licensed, insured, and trained to provide safe and efficient transportation.
Luxurious and Comfortable Vehicles
US Airport Limo Service offers a wide range of luxury vehicles, including sedans, SUVs, and limousines. All of their vehicles are well-maintained, clean, and equipped with modern amenities such as air conditioning, Wi-Fi, and comfortable seating. This can provide a comfortable and stress-free environment for corporate travelers, allowing them to relax or even work during their ride.
Privacy and Productivity
US Airport Limo Service understands that corporate travelers may need privacy or a quiet environment to conduct business or prepare for meetings. Their vehicles provide the necessary space and privacy to allow for productive work or even to relax during the ride. This can be especially useful for executives or other high-level personnel who need to prepare for important meetings or presentations.
Flexible and Customizable Services
US Airport Limo Service offers flexible and customizable services to meet the unique needs of their corporate clients. Whether you need transportation for a large group or a single passenger, they can provide the appropriate vehicle and services to fit your needs. They also offer custom billing options and can accommodate any special requests or requirements.
Conclusion
In conclusion, https://www.USairportLimoService.com can provide several benefits for corporate travelers, including reliable and on-time services, professional chauffeurs, luxurious and comfortable vehicles, privacy and productivity, and flexible and customizable services. By using their services, corporate travelers can enjoy a stress-free and comfortable travel experience, allowing them to focus on their work or prepare for important meetings or events. Book your ride with https://www.USairportLimoService.com for your next corporate trip and experience the difference for yourself.
【SpringBoot】JasperReportsの「Print When Expression」プロパティの注意事項

# はじめに
SpringBootに依存した話ではないですが、JasperReportsのデザイナ環境でよく使われる各要素の「Print When Expression」プロパティについての備忘録です。

## この記事内容の作業目的
小一時間浪費したので備忘録。「Print When Expression」プロパティに言及した日本語情報はいくつかありますが、Javaを常用しているひとには既定のお話でとくに強調はされない、Java以降のC#やTypeScriptとか使っているとつい忘れてしまいがちな点。

## この記事内容の作業環境
Windows10 21H2
VSCode(Visual Studo Code)
java 11
SpringBoot
JasperReports 6.12
jusperStudio 6.12
## この記事内容の保証
※この記事には設定的な情報が含まれます。あらゆる条件下でも書かれた内容の妥当性を保証するものではありません。

# 設定のポイント

各要素の「Print When Expression」プロパティに設定する条件式はJavaで動いている。そのため、文字列同士A,Bの比較では

 A == B や A != B では常に不成立となる。こう書いてもコンパイル時にエラーにはならず実行時に意図した動作にはならない。

A.equals(B) や !A.equals(B)　で正常判定される。

# 参考リンク

https://stackoverflow.com/questions/294989/how-to-use-printwhenexpression-in-jasperreports
Hugging FaceのInference APIをNode.jsから叩いてみるメモ

## Inference APIとは

Hugging Face で公開されているモデルを利用した推論ができる API です。
API を利用することで、JavaScript など Python 以外の言語からも簡単に推論できます。

## ドキュメント

https://huggingface.co/docs/api-inference/quicktour

## 準備

アクセストークン（READ）を発行＆コピーしておきます。

https://huggingface.co/settings/tokens

## Inference APIを叩いてみる

### コード

https://replit.com/@TakahiroMitsu/hugging-face-inference-api-trial

```javascript
import fetch from "node-fetch";
async function query(data) {
    const response = await fetch(
        "https://api-inference.huggingface.co/models/gpt2",
        {
            headers: { Authorization: `Bearer ${API_TOKEN}` },
            method: "POST",
            body: JSON.stringify(data),
        }
    );
    const result = await response.json();
    return result;
}
query("こんにちは。いい天気ですね。").then((response) => {
    console.log(JSON.stringify(response));
});
```

### 結果

レスポンスが返ってきました。

```javascript
[{"generated_text":"こんにちは。いい天気ですね。虽然、やたまるなったその因にわずってした。いようし"}]
```

## 価格

ドキュメントの Pricing にはこのような記載がありますが、具体的にいくら掛かるかはよくわかりませんでした。
（詳しい方いたら教えて下さい）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/9cb0d06e-d6f4-d98a-d556-48296a0e5c4c.png)

https://huggingface.co/inference-api

## 他のモデルでも試してみる

他のモデルを利用するときは、Hugging Face の

### モデル

GPT-4 を試してみたいので、こちらのモデルを利用してみます。

https://huggingface.co/chavinlo/gpt4-x-alpaca

### コード

https://replit.com/@TakahiroMitsu/hugging-face-inference-api-gpt4-x-alpaca

```javascript
const fetch = require("node-fetch");

async function query(data) {
  const response = await fetch(
    "https://api-inference.huggingface.co/models/chavinlo/gpt4-x-alpaca",
    {
      headers: { Authorization: `Bearer ${process.env.API_TOKEN}` },
      method: "POST",
      body: JSON.stringify(data),
    }
  );
  const result = await response.json();
  return result;
}

query("こんにちは。いい天気ですね。").then((response) => {
  console.log(JSON.stringify(response));
});
```

### 結果

ローディングしている様子。
（`estimated_time`は残り秒数？）

```javascript
{"error":"Model chavinlo/gpt4-x-alpaca is currently loading","estimated_time":2082.540283203125}
```
NCMBの管理画面をGoogle Chrome機能拡張で便利にする（CSVエクスポート）

NCMBでは管理画面を提供していますが、時々物足りないことがあります。この機能があったらもっと便利なのに…と思いつつ、使っている方もいることでしょう。

そこで、その足りない機能を補足するGoogle Chrome機能拡張を開発しはじめました。

## 動作について

動作は以下のようになります。機能拡張をインストールしていると、エクスポートボタンが追加表示されます。このボタンをクリックすると `JSON` と `CSV` の2つのメニューが表示されます。

JSONは従来のJSONフォーマットでのダウンロードで、CSVはJSONを分かりやすくCSVに展開したファイルになります。

![csv.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/50eb447d-2f2d-3e18-dda8-21c9033adb1b.gif)


今回のバージョンからInstallation（デバイストークン）のエクスポートにも対応しました。

## インストール

[Chrome機能拡張のページからインストール](https://chrome.google.com/webstore/detail/ncmb-extension/dglkhlplcpmnbgodhbngcmdfpojkbdnc?hl=ja&authuser=0)してください。

## 制限

この機能拡張は [https://console.mbaas.nifcloud.com](https://console.mbaas.nifcloud.com/) 以下でのみ動作します。また、この機能は管理画面のAPIを使っていますので、APIコール数を消費しません。また、ACLは無視して処理されます。

JSONはREST APIのレスポンスをそのまま返却します。対してCSVは幾つかデータに修正を加えています。

- 日付型の場合は日付を文字列で返却
- null、undefinedは空文字
- 位置情報は latitude、longitudeを持ったJSON型

## ライセンス

ライセンスはMIT Licenseです。依存ライブラリとして[URL.js](https://github.com/duzun/URL.js)を使っています（こちらもMIT Licenseです）。

## まとめ

機能的にはまだ多くありませんが、徐々に機能を追加していきます。Google ChromeでmBaaSの管理画面を利用されている方はぜひお使いください。
powershellでscriptを引数として指定する方法

# 概要
poweshellでscriptをfunctionに引数として渡すやりかた

# 実際のコーディング例
```timem.ps1
set-alias -name time measure-command 
function timem($script,$num=0){
   if($num -eq 0){
        (time { invoke-command $script }).milliseconds
    }else{
        1..$num|% {(time {invoke-command $script }).milliseconds}|measure -sum -max -min -ave
   }
}
```

# プログラムの説明
これは、\\$profileに格納して. \$profileで有効にして
 timem {ls|select name}
や
 timem {ls|select name}　20
として使えば、最初の例ではミリセカンドでの応答を実測し、
2番目の例の20等の回数を指定すれば最大値、最小値、平均値を
計算してくれる。というものです。

# 注目点
functionで \\$scriptという変数を指定していますが、これは{}がある場合はその部分が引数として
渡されます。最初は文字として渡そうかと思いましたが、その場合は｜のパイプが別の意味を持って
しまうので、難しいでした。どうも、
\\$a={ls|select name}とかして、$aを見てみるとscript blockという変数になっています。
{}でくくるというのは、文法的にもスクリプトとして優先されるようですねえ。
【Android】MacでAndroidのエミュレーターでピンチインピンチアウトの操作を行う方法

Androidのエミュレーターでピンチインピンチアウトの操作方法です。

主にマップの操作をすると時などに使用したりしますね！
自分がMacで作業をしているのでMacでの操作方法となります。


操作は簡単で、```control```を押しながら画面をクリックして操作するだけです。
ぜひ必要になった時は使ってみてください！
HomebrewでVimをインストールする

## なぜ？

macOSには最初からVim入っているのですぐに使い始めることができるが最新のものでない

## 方法

```
$ brew install vim
export PATH="/usr/local/bin:$PATH" # パスが通ってなかったら実行
```
```
$ brew update
$ brew upgrade
```

たまに更新しておこう
Roblox:モデルにアニメを適用して再生する

自分用メモ

1:アニメーションを「Robloxに公開」する
2:IDをメモる
3:対象モデルにAminationを追加して、AnimationIdプロパティに2をいれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326154/f3b02b69-d4f0-b1fa-88ce-3f6689217cd9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326154/9db50430-ddd3-13cc-5332-e58c93cbb25d.png)

※アニメーションをループさせたい場合はアニメの方にループ設定をいれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326154/716105ed-d7f6-9796-6387-e57852211251.png)

4:モデルにScriptを追加して以下を記載する

```lua:script
local model = script.Parent
local humanoid = model:WaitForChild("Humanoid")

local animation = humanoid:LoadAnimation(model.Animation)
animation:Play()
```

以上
ChatGPTからの情報漏洩がそのうち始まるんじゃないか

# はじめに
ChatGPTについては、まったく疑いようもなく素晴らしく高い技術ものだと思うし、その技術がうまく活用される場面が生み出せてよかったなと思っています。またAI氷河期に入りそうだったところを盛り上げてくれてうれしい。否定は全然してないです。

ですが、今このブームに乗っかって、よく知らない人たちが悪意なく機密情報を流出させてるんじゃないか、というポエムです。

# ChatGPTに投げた質問が学習される仕組み
ChatGPTに限らずAIは、何かを学習して、それをもとに、学習したこと以外のこともできるという仕組み。ChatGPTでは、膨大ないろいろな文章やプログラミングを集めて学習して、それ以外の質問にも答えます。

ChatGPTは今でもすごいですが、開発元のOpenAIは「もっと賢くしたい。つまりもっと学習させたい。」と思っているはずです。

では追加で学習するための文章やプログラミングの情報をどこから集めよう？という今、ChatGPTの利用者がバンバン入力してくれる情報が集まります。「これを捨てるのはもったいない、学習させよう」となるのは自然です。

そういうわけで、ChatGPTに投げた質問が学習されるかもしれません。

# ChatGPTのあの画面で打ち込まなくても学ぶ
基本的にはChatGPTの黒っぽい画面でChatGPTに質問するわけですが、ChatGPTはAPIを用意していて、あの画面だけでなくいろいろな機能がたくさんの人によって作られています。例えば、ググるとともにChatGPTにも投げるとか、VSCodeのコーディング中になんかするとか。それって、APIを通じてChatGPTに質問を投げて、回答が検索画面やVSCodeに出てきてるので、結局黒っぽい画面で入力しているのと同じです。

これの怖さは、自動的に送られているので、意識せず入力していることです。仕事で客先のコーディングをしているVSCodeにこの機能を入れちゃうと、それ全部流出してますよという意味。

以前、コーディング能力検査みたいなシステムで、githubから客先のソースが流出した事件があったのを思い出しますね。外部のシステムに入力するという意味で。（それをいったら、githubをどんだけ信頼してるんだという話もありますが）

# 利用規約はどうなっているか
https://openai.com/policies/terms-of-use
学習されると書いてきましたが、2023年3月14日付（2023/4/9時点での最新）の3-(c)で、「API経由では学習しない」と書いてあります。（ほかの文章生成AIは調べてません。）
これは３つの示唆があると思っています。
1. 以前は、学ぶって書いてあったので、２月くらいまでに入力されたものは学習する可能性がある。
2. API経由でないブラウザの黒っぽい画面で入力したものは、学習する可能性がある。
3. 今後、この規約が変更される可能性はある。

そもそも学習するかしないかは、開発側の判断次第。こうやって書いているうちは学習されないけど、ここを書き換える権利は開発側が持っています。なので、OpenAIを使った機密情報を扱うシステムを作るとしたら、利用規約は毎日チェックしないといけないと思います。そして利用規約が「学習する」と変わったら、そのシステムは急に使ってはいけないシステムになる。

ちょっとわき道にそれてついで話。3-(a)
出力した情報は、出力を受けた人にすべての権利を譲渡しますって書いてありますね。これはOpenAIの結果を自由に使っていいですよ、というやさしい気持ちでもありますが、機密情報が出力されたとしても受け取った人を止められませんよとも読めます。セクション3は濃い。

# 今は流出が問題になっていない
AIの学習はとても時間がかかるので、利用者が入力された都度学習するというのは非効率です。一定量（たぶんものすごいたくさん）たまったら、一気に学習させてチューニングをして次のバージョンの賢いChatGPTができあがります。
なので、ChatGPTが話題になった2022年末から今まで入力されてきた情報は、まだ学習中とか調整中かもしれない。だからChatGPTはまだその情報を使えず、回答はしない。
ですがそのうち、学習した情報を使って回答するようになるはずです。もうリリースされてるかもしれないけど。
そのとき、機密情報とかコーディングとかが表に出てくるんじゃないかと思っています。

# 抑止する力
だけど一方で、ChatGPTの方ももう１歩賢くなって、「これは機密情報である」という判断をした場合に、「機密情報だから言いません」という、"知ってるけど言わない機能"が実装されるかもしれない。これは、留守の家への入り方とかを聞いたときにダメだって答える機能があるから、その発展版のように。
逆に言うと、その機能が実装されない場合とか、機能は発動したけど断片的に漏れ出てしまうとかで、やっぱり流出するのではないか。

そもそも、知ってるけど言わないということは、知ってはいるんだね？ということで、少なくとも開発元であるOpenAIは知ることができます。抑止する力を働かさない＝言わない機能をオフにして使えば、得られます。というか、学習元の生の情報も持っています。

# AI vs AI
ChatGPTだけでなく、ほかの会社の文章生成AIはたくさんあり、それら同士で会話させることもすでにできるでしょう。それを使って、相手が持つ機密情報を引き出す使命を持たせるとか（自分が持つ情報は言えないので）、そういうことも考えられる。GPT3.5ではまだ無理そうだけど。

AI vs AIは、本当に未知の領域なので、どうなるかわからないです。AI同士で築き上げた人間が判らない言語を使うのでは？とかSF的な話も聞いたことがあります。未知だけに、可能性はいくらでもあります。
けどまぁ書いておいてナンですが、未知すぎてここにおびえても仕方ないと、個人的には思います。

# まとめ
とにかく情報漏洩の対策は、学習する/しないに関わらず、機密情報をChatGPT（それ以外にも）へインプットしない、質問に使わない、自動的に流し込むツールをつかわないということ。けどそれは、仕組みで抑えることは難しいので、おそらくインプットしちゃうでしょう。いやもうしちゃってるでしょう。

そしてそれが、そのうち表層化するのかな、と思っていますというポエムでした。
Freenove Basic Starter Kit for ESP32を買ってみた

# 購入動機
これまで仕事上でESP32導入検討をしてきましたが、色々やっていると自宅でもちょっと遊んでみたいと思う様になったこと。
そして安価でその開発環境が整うからです。
仕事と趣味をキッチリ分けるために、電子工作は趣味にするつもりなかったんだけどなぁ(^_^;)

# 購入内容
表題の通り Freenove Basic Starter Kit for ESP32 を１セット購入しました。
興味持ったらAmazon等で検索してください😁
また、表示器については、表示器付属セットはキャラクタLCDだったので、表示器無しセットを購入し、別途0.96インチSSD1306有機ELディスプレイを購入しました。

# 開梱、内容確認
外箱から出すところ
![fotor_1680917378353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/fc20ef4a-e87f-004b-87c0-a1d9daa6151b.jpeg)
小綺麗なプラスチックケースに入ってました。ダンボール箱ではないことが嬉しい😁

プラスチックケースを開けたところ
![20230408_093436.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/d7e95980-b5db-07b5-22cb-6dbdde235db9.jpeg)
十分なジャンパーは安心できます。
開発基板はブレッドボードに取り付けられていました。
![20230408_093531.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/f475e1a0-edbc-ebe2-f845-8e1af407bc62.jpeg)
LED制限抵抗に使える220Ω抵抗、プルアップに使える10kΩや1kΩ、LED、トランジスタ、ダイオード等が同梱されています。
ESP32の2列のピン間隔は微妙にブレッドボードのそれと合わないのでこのGPIOエクステンションボードは便利ですね！
![20230409_115033.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/04e3e0dd-8597-58c8-d128-69c0e25813e2.jpeg)
小物部品は赤、青、緑、フルカラーLED、タクティカルスイッチ、CDS、温度センサらしきもの、トランジスタ（2SD331）が入ってました。その他半固定抵抗です。

ESP32ボード表
![fotor_1680917130203.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/4c4b4839-093f-9968-f729-1184a0027959.jpeg)
チップは ESP32-WROVER-E です。技適マークもちゃんと入っています。
カメラは取り付けられた状態でした。
面実装LEDは IO2,RX,TX,ONです。IO2は新規ボード導入恒例のLチカに使えます。

ESP32ボード裏
![fotor_1680917056115.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/354e1186-467d-2df8-906f-afdc05ab8a6e.jpeg)
USB-UART変換及び電源レギュレーター類は裏に付いてました。
USB-UARTドライバはCH340C用のものが必要です。自分のPCの場合、自動で認識インストールされました。

エクステンションボードからESP32ボードを外した状態
![20230408_093939.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/7c4dada8-5a18-bbca-3cfc-0e50b75fc887.jpeg)
外部入力（7～9V）から5Vと3.3Vへのレギュレーターが実装されています。

# チュートリアルのダウンロード
チュートリアルはメーカー公式サイトやGitHub(https://github.com/Freenove/Freenove_Basic_Starter_Kit_for_ESP32_S3)
からダウンロードできます。
英文ですが、内容は充実していると思います。

# SSD1306動作確認のためのライブラリ導入
SSD1306動作確認のためにGithubのライブラリを導入しました(https://github.com/Freenove/Freenove_Basic_Starter_Kit_for_ESP32_S3)
他のSSD1306ライブラリは動かなかった

カメラを含めた動作確認に関しては別記事にしたいと思います。
【Traefik】docker compose で 404 page not found が一時的に出る

> `docker compose` で[リバースプロキシ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)として [Traefik](https://traefik.io/) を通して他のコンテナにアクセスすると **"`404 page not found`" が返ってくるが、<font color="darkorange">しばらくすると表示される</font>**。

しかし、リバースプロキシに [Nginx](https://nginx.org/) を通したり、ターゲットのコンテナのポートを公開して直接アクセスすると即座に正常に表示されます。つまり**ターゲットのコンテナ自体は動いている**のです。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. `Traefik` は、ターゲットとなるコンテナが "`HEALTHCHECK`" を有効にしている場合、**<font color="darkorange">コンテナの `health` ステータスが `healthy` にならないとリクエストを転送しない</font>**
1. `docker compose ps` で `health` ステータスを確認し、`health: starting` の間は待たないといけない
1. `HEALTHCHECK` で `--interval=5m` に設定していた場合の例

    ```shell-session
    $ # 起動直後の確認 (STATUS が "health: starting" であることに注目）
    $ docker compose ps
    NAME                    IMAGE               COMMAND                  SERVICE             CREATED             STATUS                             PORTS
    hello-world-myapp       hello-world-myapp   "/usr/bin/mywebapp"      myapp               26 seconds ago      Up 25 seconds (health: starting)   80/tcp
    hello-world-traefik     traefik:latest      "/entrypoint.sh --lo…"   traefik             26 seconds ago      Up 25 seconds                      0.0.0.0:9090->80/tcp, :::9090->80/tcp
    
    $ curl localhost:9090
    404 page not found
    
    $ # 5分スリープさせてから確認 (STATUS が "healthy" であることに注目）
    $ sleep 5m; docker compose ps
    NAME                    IMAGE               COMMAND                  SERVICE             CREATED             STATUS                   PORTS
    hello-world-myapp       hello-world-myapp   "/usr/bin/mywebapp"      myapp               8 minutes ago       Up 8 minutes (healthy)   80/tcp
    hello-world-traefik     traefik:latest      "/entrypoint.sh --lo…"   traefik             8 minutes ago       Up 8 minutes             0.0.0.0:9090->80/tcp, :::9090->80/tcp
    
    $ curl localhost:9090
    Hello from host: 76c1251bd910
    ```

## 動作環境

- macOS v12.6.3 (Monterey)
    - Docker v20.10.23 (Desktop v4.17.0)
    - Docker Compose v2.15.1
- Alpine Linux v3.17.3
    - Docker v20.10.24
    - Docker Compose v2.15.1
Power Automate for desktop でセレクターを検証する (セレクター テスト機能の紹介)

# はじめに
Power Automate for desktop の Ver 3.31 からセレクターにテスト機能が追加されました。
この機能により、フロー内のセレクターが正常に利用できるか(問題が生じていないか) を検証することが可能です。
例えば、ウェブ ブラウザーの自動化において、ある日操作に問題が生じた場合に、これが操作対象の UI 要素の変更によって生じているかを検証することが可能となりました！

本記事では、機能の概要と利用方法についてまとめました。
# 実際の動作について
実際の動作を動画でまとめてみました。
例えば、Web ブラウザーの自動化において id が 18 を指定するセレクターがある場合、操作対象のページでこのセレクターが有効であれば、正常であると判断されます。
![ST001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/06d00c1f-b7af-6989-0d86-6a8bf3b17c2b.gif)

これがページ内の ID に 18 の要素が存在しない場合、検証結果はエラーとなります。
検証でエラーとなったセレクターを使用した場合、これが原因でフローがエラーになるので、セレクターの再設定 (レコーディングや UI 要素の追加) により修正を行います。
![ST002.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/1665a93a-62da-1068-334c-719c3fdf9cf4.gif)

# 操作方法について
セレクターの検証は、セレクターの画面上から行うことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/8a0d85b9-b04d-5b3d-cd07-97880f20248e.png)

検証を行う際には、対象となるアプリケーションやページが起動している必要があります。
Web ブラウザーの自動化の場合は、検証対象とするページが表示されているタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/82b22b17-cdfe-cb26-a358-321c5ab4d468.png)

# 検証結果
検証を行うと以下の結果が表示されます。

### セレクターの要素が完全一致する場合
対象の UI 要素が一意に特定できています。正常な状態です。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/b33de9c2-95b4-04ea-a221-e6b4f65b113a.png)

### セレクターの要素が複数一致する場合
UI 要素は存在しているが、複数同一のものが存在する状態です。
例えば、特定のテキストを指定するセレクターにおいて、同じテキストを持つ要素がページ上に複数存在する場合に発生します。
実際にこのセレクターを使用した場合、左上隅から見つかった要素が利用されるので、必要に応じて対象となる要素を一意に特定できるようセレクターを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/99919605-d2cb-379c-aa46-4afb8aa8ae18.png)

### セレクターの要素が一致しない場合
UI 要素が確認できない状態です。
セレクターの編集を行う必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/c1bab609-b79d-f342-efaa-8a23e0911e62.png)


# 機能の補足

**テキスト ベースのセレクターの検証について**
検証は、テキストのセレクターでも利用できます。
これは HTML のテーブル内 4 行目 2 つ目の要素に対するセレクターの検証しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/868d14a2-55c6-3d3b-88dc-aeaab6952bfe.png)

**変数を使用したセレクターの検証について**
変数を使用したセレクターについても、検証が可能です。
セレクター内に変数を設定している場合は、一時的に値を設定した検証が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/ee95af0e-6a6e-6e85-2a04-f93816a839bc.png)


# まとめ
この検証機能は個人的に大きなアップデートだと思います。

この検証が加わったことにより、「なんかフローが動かない」から、「UI 要素が原因で動かない」などの原因の深堀がしやすくなったため、簡単に正確なトラブルシューティングを行うことが可能となりました。

新しいアクションの機能の追加も嬉しいですが、このような安定的なフローの作成につながるアップデートにも注目していきたいです。
StreamDeckっぽいものを作る_5

python-twitterをインストールしておく。
APIキー等は各自用意したものに合わせる

```
import twitter

#   定数関係
from const import *

#   ツイッター操作クラス
class TwitterUtil:

    #   取得したキーとアクセストークンを設定する
    #   https://apps.twitter.com/ から Create an appで登録してプロジェクト作っていろいろなキーを取得する
    #   User authenticationとかTwitter API v2とか有効にしとく(もしかしたらなくてもいいかも) 2023/01/08現在
    auth = twitter.OAuth(consumer_key=TWITTERAPIKEY,  #   api key
                        consumer_secret=TWITTERAPIKEYSECRET,    #   API secret,
                        token=TWITTERACCESSTOKEN,   #   Access token
                        token_secret=TWITTERACCESSTOKENSECRET)    #  Access token secret 

    #   ツイート
    def post(self, dicPostParams):
        tw = twitter.Twitter(auth=self.auth)
        tw.statuses.update(status=dicPostParams[TWITTERPOST_TEXT])  #   twitterへメッセージを投稿する
```
Rustで配列を『安全に』初期化する方法

# はじめに
みなさん、Rustしてますか? Rustの配列って使い勝手が悪いですよね。
例えばStringの配列を作ろうとして、コンパイルが通らない経験とかあると思います。
そんな、配列の初期化方法について踏み込んだ記事が見つからなかったので、まとめてみました。
配列の使いにくさに関する解説記事も書けたら書きたいな…。

# 配列の代わりにVecを使う
前提を覆すようですが、**『Rustで配列を使え』は全て詐欺です**。Vecを使いましょう。
Vecは配列の上位互換です。配列で出来ることはVecでも出来ますし、オーバヘッドが問題となることも普通は無いはずです。**Vecを使いましょう。**
Vecの初期化方法について、例を3つだけ示しておきます。ここで語る内容でもない気がする…。

```rust
    // マクロで初期化
    let a = vec!["a".to_string(); 10];
    // pushで初期化
    let mut b = Vec::with_capacity(10);
    b.push(1);
    b.push(2);
    b.push(3);
    // イテレータで初期化
    let c: Vec<i32> = (0..100).collect();
```


# やむを得ず配列を使用する場合
のっぴきならない事情によって配列を使いたいこともあるでしょう。何事にも例外は付き物ですから。
そんなときにオススメなのは、Vecからの変換です。これ一つだけ覚えておけば大抵は対応できます。

```rust
    use std::convert::TryInto;
    // 1.48.0 以降
    // Vecの大きさがNでない場合は、unwrapで落ちる。
    let output: [T; N] = input.try_into().unwrap();
```

# まとめ
+ 『Rustで配列を使え』は全て詐欺。代わりにVecを使う。
+ 配列はVecを変換して生成する。
+ 『Rustで配列を使え』は(ry

# おまけ
記事の内容が物足りなかった人の為に、配列の初期化方法をいくつか紹介します。

## ヒープ領域に生成
直接Boxで包んで生成することで、スタック領域を介さずに初期化出来ます。

```rust
    use std::convert::TryInto;
    // 1.43.0 以降
    let output: Box<[T; N]> = input.into_boxed_slice().try_into().unwrap();
```

## イテレータから生成する
イテレータ→Vec→配列のように、一旦Vecに変換します。特に新しいことはありません。

```rust
    use std::convert::TryInto;
    let tmp: Vec<T> = input.take(N).collect();
    // 1.48.0 以降
    let output: [T; N] = tmp.try_into().unwrap();
```

ヒープ領域の場合

```rust
    use std::convert::TryInto;
    let tmp: Box<[T]> = input.take(N).collect();
    // 1.43.0 以降
    let output: Box<[T; N]> = tmp.try_into().unwrap();
```


## コンパイル時定数から生成する
1.38でうっかり有効化され、1.50で事後承認された曰く付きの機能だそうです。

```rust
    // 1.50 以降?
    const INIT_VEC: Vec<T> = Vec::new();
    let data_bin = [INIT_VEC; N];
    // 1.50 以降?
    const INIT_VAL: Option<T> = None;
    let lazy_array = [INIT_VAL; N];
    // 1.50 以降?
    let str_array = {
        const INIT_VAL: String = String::new();
        [INIT_VAL; N]
    };
```

https://tech-blog.optim.co.jp/entry/2021/02/12/080000#%E8%A8%80%E8%AA%9E

## 窓として参照を生成する
配列の実体が本当に必要でしたか? 参照だけで良い場合、長い配列やVecの一部を窓のように切り取ってアクセスすることが出来ます。

```rust
    use std::convert::TryInto;
    let tmp: &mut [T] = &mut input[0..N];
    // 1.34.0 以降
    let output: &mut [T; N] = tmp.try_into().unwrap_or_else(|_| unreachable!());

```
VPCの共有方法

[AWS Shared VPC を前提としたネットワークとセキュリティの設計](https://www.youtube.com/watch?v=uwH67XsWg00)の自分用メモ

---

# 前提
- マルチVPC戦略が求められている

### インフラ、アプリそれぞれの責任とコストは明確に分離したい
- 現状、オンプレのような使い方で分離させていることが多い
    - 大きな1つのVPCを用意して、インフラが集中管理
    - SGとルーティングでセキュリティを担保
    - タグを使ったリソース管理
- AWSではアカウントを分ければ容易
    - リソースも互いに不可分になるため、共有する必要がある

### ベストプラクティスとして標準化されたVPCを小さく使いたい
- 1サービス1VPCとしてセキュリティやコストを明確に分離する
- セキュリティに対するシンプルな解
- VPC同士をつなげてサービスが連携して１つのシステムとなる

# VPCの設計
- シングルリージョン、1VPCなら **Shared VPC**
- サービスがアプリなら **PrivateLink**
- サービスがアプリ以外もあるなら **TGW**

## Shared VPC
- 大きなVPCの中にサブネット作成、RAMを使って開発アカウントに対して共有
- サブネット間の通信はサブネットのNACLで制御する
- 既存環境がシングルリージョン、1VPCであれば検討しやすい

#### メリット
- インフラとアプリの責任（アカウント管理やコスト）を分離できる
- Organizationsが必須
- スケールしないため、複数リージョンや複数VPCの場合は使いづらい

#### 費用
- 共有するための費用は不要

## Private Link
- アプリケーションの共有
- 1対Nの関係

#### メリット
- IPアドレス重複OK

#### 費用
- NLBとエンドポイント費用

## TGW
- ネットワークの共有
- 1対Nの関係

#### メリット
- だいたいなんでもできる（インフラ念ジニア向け）

#### 費用
- AZごとのエンドポイント費用

# Tips
## 共有する際の注意点
- アカウント、VPC、インスタンスはお互いに信用できるか
- セキュリティとネットワークの責任はチームごとなのか、中央集権なのか
- アカウント、VPC、インスタンス単位でコンプライアンスやガバナンス要件はあるか

## 責任範囲の分け方
- 開発側はリソースに対する権限とSGを管理
- インフラ側はルートテーブルやNACLを管理
- 責任範囲を明確に分離しているとTGWでつないだときも特に問題ない



# 感想
- マルチVPC戦略をとるなかでどう責任を分離しつつ、VPCをつなげていくのかが分かった
Cloud Firestoreのデータ更新でCloud functionsをトリガする

# 目的
* firestoreのデータ更新をきっかけにcloudfunctionsを実行する
* ドキュメントパスの設定値がわからず混乱したためメモまでに記録

# 環境 
cloud functions: 1st gen	
ランタイム: Python 3.9


# 手順
## Firebase cloud firestore 
* コレクション名
funcData

* funcData、をInsertした時に、関数実行を行う

```
addDoc(collection(db, "funcData"), { id: "zzz", data: "created" }).then(result => {
      console.log(result)
      console.log("====== ドキュメントパスの確認 ======")
      console.log(result.path)　//← ドキュメントパス
    })
```


## cloud functions側の設定
* 関数の作成を行う
* トリガーのタイプを Cloud Firestoreにする
* Event Tyeを今回は作成なのでcreateとする
* ドキュメントパスは、 `コレクション名/ドキュメント名`　で指定する
　*　 しかし、createだと、ドキュメント名は毎回作られるため取れない。そのため、次のようにdocument名は可変値にすることができる `funcData/{document}`
![スクリーンショット 2023-04-09 11.21.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57455/0ce8cc67-8418-b141-c01c-7ecd7fc162ec.png)

function側のソースをデプロイする。

以上。funcDataに新規レコードを作成すると関数が実行される
Windows: 読み方がわからない文字を入力したい


###### 実施環境

Windows 11 Home Version 21H2

###### やりたいこと

例えば、以下の漢字を読み方がわからない状態で入力したいとします。

![WS000066.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e8618c16-4194-f787-4fb5-83c95706fc3c.jpeg "漢字")

コンピュータ上のテキストファイルでしたらそのままコピーすればよいですが、画像データなどコピーが難しい場合や、そもそも紙などコンピュータ上にない場合はそうはいきません。
ではそのような場合は、どうすればよいでしょうか。

###### 方法

読み方がわからない文字を入力したい場合は、 IME パッドを使用すると入力できます。

まず、右下の IME を右クリックしてオプションを開き、「 IME パッド」を選択します。

![WS000067.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7ad086f5-2fef-d749-a320-5052a32ad3e9.jpeg "IME")

すると、以下のように IME パッドが開きます。

![WS000068.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1f61ec7b-99db-54c2-9221-cd21b6e1ffc0.jpeg "IMEパッド")

マウスのドラッグ&ドロップで左の欄に文字を書けば、右に入力する文字の候補が表示されます。
ここから、入力したい文字を探してクリックします。

![WS000069.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/dc0eb371-fdca-b9e5-44f1-8e40adb9dafc.jpeg "手書き")

クリックすると、直前まで使用していたウィンドウにクリックした文字が入力されます。

![WS000072.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f5784adf-bce0-9a3a-be69-78c78bcd548c.jpeg "入力")

ちなみに、カーソルを当てれば読み方もわかります。

![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f2f83e69-d0eb-c4f4-65bd-368c88090664.png "読み方")

また、上記では漢字を例にとりましたが、漢字以外の文字や記号などでも入力は可能です。

![WS000073.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/470ed17f-acf3-57d9-d237-d1ea51533c0d.jpeg "記号")
Re:EarthでPLATEAUの配信データを表示

![スクリーンショット 2023-04-09 10.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/a58220e0-700f-5f04-a244-6588535081cd.png)

PlateauのデータはGithubで試験配信されています。  
それとRe:Earthを利用することによってノーコードで簡単にPlateauデータを載せることが可能です。

https://reearth.io

Re:Earthとはノーコードで三次元にデータをマッピング可能なウェブアプリケーションです。  
国土交通省のPlateauや地理院地図globeで何かと話題のCesiumが使用されています。   
Re:Earthを利用することによって簡単に三次元データ閲覧のプラットフォームが構築できます。  
クラウド版もしくはDockerコンテナで利用することができます。

https://github.com/Project-PLATEAU/plateau-streaming-tutorial

Plateauデータで試験配信されているのは  
* 建築物モデル等の3DTilesデータ  
* 地形モデルのTerraindbデータ
* 航空写真オルソ画像タイルデータ

これら配信URLをRe:Earthに入力することですぐに表示させることができ、  
三次元データのためのベースプラットフォームを素早く構築することが可能です。  

クラウド版であれば登録するだけですぐに使い始められますので、  
今回はクラウド版で作業を進めます。

# 建築物モデルデータを表示する
https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/3d-tiles/plateau-3dtiles-streaming.md

![スクリーンショット 2023-04-08 23.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/0ee282c4-0ae9-b4ed-ec7f-bf70da9ca555.png)

こちらの建物モデル配信ページから対象地域のURLを探します。  
テクスチャは今回は無しを選択。

![スクリーンショット 2023-04-08 23.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/79ce4abc-22f4-56a3-1cbd-befb87ea9ccd.png)  

Re:Earthに戻って上のアイコンの右から2番目を画面内にドラッグ、3Dタイルを表示させることができます。  
種類はURLとしタイルセットURLに先ほど調べたURLをコピペします。  

![スクリーンショット 2023-04-09 10.36.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/eb81916e-058c-0512-750e-3597a30c2ab8.png)

建物モデルが無事に表示されましたが、明らかに地面に埋没している建物があります。  
これはPlateauの地形データとRe:Earth(Cesium)の地形データが異なるためです。  
次に地形データにPlateauのデータを設定しこの問題を解消していきます。  

# 地形モデルを設定


https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/terrain/plateau-terrain-streaming.md


配信ページをスクロールしていくとアセットIDとアクセストークンが記載されています。

![スクリーンショット 2023-04-09 10.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/6c64ca2b-ef91-96fa-1e20-ae9f7d69aa52.png)

サイドバーのシーンから、地形をCesium IonにしてIDとアクセストークンを入力します。  
地形の下を非表示に今回はチェックを入れました。  
このチェックを外すと例えばgeojsonデータやkmlデータを地形より下に表示した場合や高低差のある地区で山の向こう側に表示されている場合でも地形を貫通して表示されるようになります。

![スクリーンショット 2023-04-09 10.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/34a712f9-c747-4e91-1309-4cba49bc6d3c.png)

これがPlateauの地形データで、

![スクリーンショット 2023-04-09 10.34.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/c47cd4cd-2900-0546-ac21-0c5c45ae46cc.png)  

こちらがCesiumの地形データです、高低差がより明確になりました。  
地図タイルは特に変更せずデフォルトのものを使用しています。
DBのAutoincrementがとても遅い？事を知った

DBのID用に用いるAutoincrementがとても遅い？事を知った。
もし、間違いのご指摘はwelcomeです。

当然といえば当然ですよね、AutoIncrementするためには、既存の最後の番号、重複しない番号を算出しないといけないので、その手間がかかりますよね。

とはいえ、こんなに時間要するとは知りませんでした。

AutoIncrement使用のテーブル構造
```sql
id: Integer, AutoIncrement,PrimaryKey
id2: ShortInt, Unique=True
json: BOB
```
AutoIncrement非使用のテーブル構造
```sql
id2: ShortInt,PrimaryKey -- 上記のid列を除去してもid2だけでUnique.
json: BOB
```

Tableを生成し、約5000件の初期値レコードをコミットしたのにかかる時間は次の通りでした。

AutoIncrement未使用: 生成/初期化に要した時間:1.41sec
AutoIncrement使用: 生成/初期化に要した時間:44.18sec

【環境】
- クライアント: MacStudio(初期)　+PycharmPro2023.1
- サーバ: MacMini2012(Ubuntu20) + MySQL8
- Python3.11+SqlAlchemy2.?

レコードの増減がなければLoad時刻はほぼ一緒でしたので考慮不要そうですが、**レコードの増減が激しいTableは要検討**した方がよさそう。

今まで教科書どおりにid列を設けてましたが、今後は配慮します。
ファイルから特定の文字を含んだ文字を抜き出す方法

# はじめに
特定のファイルから特定の文字だけ抽出できればなあと考えていたので、調べてみました。
今回はwhere-object コマンドを使ってファイルから特定の文字を抜き出そうと思います。

# Where-Objectコマンドを使って特定の文字を抜き出す
そこで「Todouhuken.txt」というファイルを用意しました。
中部地方の一部の県名を記載しております。

```todouhuken.txt
shizuoka
yamanashi
nagano
aichi
```
では、抜き出しましょう。文字「o」を含む文字列を抜き出します。


# パイプラインを使用してファイルの中身を確認した後、抜き出すようにする
```
cat フォルダパス/todouhuken.txt | Where-Object {$_ -like "*o*"}
```

コマンドは上記の通りです。
まずはファイルの中身をcatコマンドで確認します。パイプラインを使用して、次にWhere-Objectコマンドを使用します。

like を使ってワイルドカード検索をします。「o」という文字を含んだ文字列を検索しています。
実行結果は以下の通りです。

```
shizuoka
nagano
```

この通り「o」を含んだ「shizuoka」「nagano」が抜き出しました。

パイプラインとワイルドカードは便利ですね。
Alembicで接続先URI(IP)が変わるエラーの対処方法

AlembicはSQLAlchemyの開発者が開発した、DBマイグレーションツール。RDBSのテーブルクラスの変更に合わせて、実テーブルの構造を更新(migration)してくれる。

## 遭遇したトラブル
私が遭遇したのは、接続先URI(driver+protocol:user password@destionation(IP):Portほげほげ)が指定したIPではないIPに変更されてしまう事例。

どうやら、localPCで、かつ、同じIPセグメントで割り当てられる。いや、おそらく人によって症状はかわるかもしれない。
- 例1: 192.168.99.99(サーバ) → 192.168.99.10(LocalPC) 

## 原因
パスフレーズに%ら制御記号が含まれていた事。%らはPythonではシングルコーテーション('')でくくっていても他の言語(PHP?)と異なり、フレーズ内を解析/処理してしまう。

## 対処方法(Troubleshooting)
こうなったのもMySQL8はパスワードポリシーとしてパスフレーズに記号を含む事を要求する。pwgenで生成したうち%を含むパスフレーズをパスワードに選んでしまった事が原因。%や{}らを含まないパスフレーズを選ぶ事が解決策でしょう。言語によってこのあたりの事情は異なるので要注意だろう。
pi picoでmicropython その41

# 概要
picoでmicropythonやってみた。
練習問題やってみた。

# 練習問題
windows 11で、Raspberry Pi Picoの俺言語学習が、小学生でも、出来るように説明せよ。

# 手順

# 準備するもの
- windows 11が動くノートPC
- Raspberry Pi Pico
- USBケーブル

# picoをUSBケーブルに繋いで、micropythonを焼く。

# 下のページのサンプルコードをコピーする。

https://qiita.com/ohisama@github/items/5408c453996039558b86

# メモ帳を開いて、デスクトップにpico8.csでセーブする。

# コマンドプロンプトを開く。
- コマンドプロンプトは、windowsツールの中にある。
# 次の、手順でコンパイルする。

```
>cd Desktop

>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc pico8.cs

```

# pico8.exeを起動する。

```
>pico8

```

# startをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7780dd85-cb68-50a3-2916-681d4ec44888.png)


# このコードをコピペする。enterをクリックする。

```
10 ?="0:gu 1:choki 2:pa 3:end "
20 a=?
30 b=$
40 ?=b
50 #=a=3*300
60 #=a=b*100
70 #=a<b*120
80 ?="-> you no kati "
90 #=10
100 ?="-> aiko "
110 #=10
120 ?="-> you no make "
130 #=10
```

# 実行する。つぎを入力して、enterをクリックする。

```
#=1
```

以上。
DLL のベースアドレスを確認したい

メモ

### 処理内容
```c++
#include <tlhelp32.h>

    do {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(GetCurrentProcess()));
        if (hSnapshot == INVALID_HANDLE_VALUE)
            break;

        MODULEENTRY32 me;
        me.dwSize = sizeof(me);
        if (Module32First(hSnapshot, &me))
        {
            do
            {
                if (me.dwSize < ((uint32_t)&(((MODULEENTRY32 *)0)->szModule))) continue;
                if (me.dwSize < ((uint32_t)&(((MODULEENTRY32 *)0)->modBaseAddr))) continue;
                if (me.dwSize < ((uint32_t)&(((MODULEENTRY32 *)0)->modBaseSize))) continue;

                RETAILMSG(1, (L"%08p-%08p: %s\n", me.modBaseAddr, me.modBaseAddr + me.modBaseSize, me.szModule));
            } while ((me.dwSize = sizeof(me)), Module32Next(hSnapshot, &me));
        }
        CloseToolhelp32Snapshot(hSnapshot);
    } while(0);
```

### プロジェクト設定
 Linker＞Input に toolhelp.lib を追加

### FIXME
Module32Next の際に me.dwSize の値が変更されるという記述はない。Module32First の時だけしか意味がないのかも？
その場合ループする必要もなくなる。

3つのメンバーのどれが最小オフセットか調べるのが面倒だったから３回比較してるけど、本当は１回で良い。
PowerShellからSlackにpostする場合の文字化けと改行問題の対策

# 課題
PowerShellからSlackにpostする場合に日本語が文字化けして、正しく改行ができない場合の対策です。
Slackにコードを含む内容を投稿する場合に利用します。

# 現象
PowerShellからSlackにpostすると次の2つの問題があります。
1. 日本語文字が「?」になします。
2. 改行コードに「\n」を入れても「\」が自動でエスケープされて「\\n」がslackに送られるためにslackでは「\n」と表示されます。

# 対策
1. GetEncoding('ISO-8859-1')を使い文字エンコーディングを使います
1. 「\n」の代わりに次のように改行コード0x0Aを直接送ります。(0x0A -as [char])

# サンプルコード
次はPowerShellからSlackにコードを含むメッセージをpostするスクリプトの例です。slack本文にはtitleとmessageが表示されます。
```
$uriSlack = 'https://hooks.slack.com/services/<webhook url>'

function Post_To_Slack([String]$title="test", [String]$message="test message") {
    $encode = [System.Text.Encoding]::GetEncoding('ISO-8859-1') # UTF-8
    $utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($title)

    $body = ConvertTo-Json @{
        pretext = $title
        text = $encode.GetString($utf8Bytes) + (0x0A -as [char]) + $message # titleとmessageの間に改行する。改行は(0x0A -a [char])で行う
    }
    try {
        Invoke-RestMethod -uri $uriSlack -Method Post -body $body -ContentType 'application/json' | Out-Null
    } catch {
        Write-Error (Get-Date) ": Error posting to Slack."
    }
}
    $title = "Windowsアップデートされていないインスタンス一覧"
    $message = '```' + $rec_list.Trim() + '```'
    Post_To_Slack $title $message
```


# 参考したリンク
[PowerShell から Slack へメッセージを投稿する方法](https://nasunoblog.blogspot.com/2016/07/post-message-from-powershell-to-slack.html)

以上
動画ファイルからテキスト抽出がWhisperを使えば数十分で実装できた話


https://qiita.com/ShinyaNakayama/items/1e43bbdb8150c0d8f88c

こちらでAWSサービスを使って動画ファイル→音声ファイル→テキストファイルという処理を実装したのですが、
今流行りのOpenAIのWhisperというサービスを使うことで一瞬でそして無料で実装できたので紹介します。
（今までの苦労とお金はなんだったんだ。。。）

# 利用サービス
### Whisper

https://openai.com/research/whisper

今流行りのOpenAIの文字起こしサービスとなります。
オープンソースなので誰でも簡単に使うことができます。

### moviepy

https://pypi.org/project/moviepy/

Whisperだけと言いましたが動画を音声に変換するためにこちらのpythonライブラリーも使っています。


# 実装方法

https://github.com/openai/whisper

詳しくは上記を参照してください。
python 3.10.2にて実装しました。

まず下記コマンドにてwhisperをインストール

~~~
pip install git+https://github.com/openai/whisper.git 
~~~

moviepyもインストールしていない場合はインストールしましょう。
~~~
pip install moviepy
~~~

次にWhisperのモデルを選びます。
サイズが大きくなればパラメーターが増えて処理に時間がかかりますが文字起こしの精度が高まります。
<table>
  <caption>利用可能なモデル</caption>
  <thead>
    <tr>
      <th>Size</th><th>Parameters</th><th>Model</th><th>Required VRAM</th><th>Relative speed</th>
    </tr>
  </thead>
  <tr>
    <td>tiny</td><td>39 M</td><td>tiny</td><td>~1 GB</td><td>~32x</td>
  </tr>
  <tr>
    <td>base</td><td>74 M</td><td>base</td><td>~1 GB</td><td>~16x</td>
  </tr>
  <tr>
    <td>small</td><td>244 M</td><td>small</td><td>~2 GB</td><td>~6x</td>
  </tr>
  <tr>
    <td>medium</td><td>769 M</td><td>medium</td><td>~5 GB</td><td>~2x</td>
  </tr>
  <tr>
    <td>large</td><td>1550 M</td><td>large</td><td>~10 GB</td><td>1x</td>
  </tr>
</table>

自分の環境(Mac：M1、メモリ：8GB)では約15MBの音声ファイル(長さは15分)の処理にsmallで約3分、mediumで約10分かかりました。
文字起こしの正確さでいうと、small < Amazon Transcribe < mediumという印象を持ちました（完全主観です）。

# コード
下記のコードにて実装しました。
最初はモデルのインストールがあるため時間がかかります。
文字起こしされたテキストをprintで表示しています。
文字起こしした文章や音声ファイルを保存したい場合はコードを修正してください。
~~~python:python3.10.2
import os
from moviepy.editor import VideoFileClip
import whisper


# Set the paths
video_folder = "動画ファイルのフォルダ"
video_filename = "動画ファイルの名前を入れてください"  # Replace with your actual video file name
video_path = os.path.join(video_folder, video_filename)

audio_folder = "音声ファイルのフォルダ"
output_audio_path = os.path.join(audio_folder, "temp_audio.mp3")

# Extract audio from the video
video = VideoFileClip(video_path)
video.audio.write_audiofile(output_audio_path)

# Load the Whisper ASR model
model = whisper.load_model("small")

# Transcribe the extracted audio
result = model.transcribe(output_audio_path)
print(result["text"])

# Remove the temporary audio file
os.remove(output_audio_path)

~~~

# 感想
たったのこれだけのコードで実装できることに素直に驚いてしまいました。
動画ファイルから音声ファイルの変換は15分ほどの動画であれば1分もかからずに終わります。
3種類の形式の動画ファイル(mp4, avi, mov)を試しましたが全て問題なく音声ファイルに変換することができました。
これをさらにChatGPTに渡すことで要約も可能ですね。

最後までご覧いただきありがとうございました。
音声入力で快適に！ Chrome 拡張機能 『Voice In』 を使用したテキスト入力方法


# 初めに
今回の『Chrome 拡張機能』に関する記事を書くきっかけとして、
私自身、以前は技術的な質問をチャットGPTにする際に、手入力でチャットGPTに質問をしていましたが、長時間の作業でかなり時間がとられてしまうことが多かったです。しかし、今回の Chrome 拡張機能を使うことで、手間をかけずに音声入力でチャットGPTに質問することができ、コーディングライフが相当向上しました。

また、相当精度が高いのも、作業効率が格段に上がったポイントとなっていて現状めちゃくちゃ気に入っています。

# 今回の対象者
* チャットGPT を頻繁に使う方
* PCでの作業効率を上げたい方
* PC上で文章をよく打ち込む方

上記に当てはまる方は、ぜひ一度試してみてはいかがでしょうか。

# Chrome 拡張機能「Voicein」とは？
参考文献にも載せている、下記の記事からの引用になります
- [Chrome上でGoogle音声入力を使える拡張機能「VoiceIn」](https://www.teradas.net/archives/35715/)



>ブラウザ「Google Chrome」上で、好きな場所に音声入力できる拡張機能「Voicein」を紹介します。

>「Voicein」は Google 音声認識エンジンを利用した Chrome 拡張機能で、スマホ版「Google 音声入力」並みの高い認識精度のため、PC上で実用レベルの音声入力が使えるようになる優れものです。


#### 1. 拡張機能をダウンロード

https://chrome.google.com/webstore/detail/voice-in-speech-to-text-d/pjnefijmagpdjfhhkpljicbbpicelgko/related?hl=ja

#### 2. 終わり(使用するだけ)

早くないですか？めちゃくちゃセットアップが楽で助かりました。

# 使用方法
まず右上に『マイク』ボタンが表示するように『パズルのピース』みたいな部分から『ピン』マークを押して『マイク』ボタンを表示させます。(公式サイトにより詳しく書いてあります。)

公式サイト-Document

https://dictanote.co/voicein/getting-started/


![スクリーンショット 2023-04-09 9.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/5199a35f-ea8d-e105-a7fc-511485cad836.png)

![スクリーンショット 2023-04-09 9.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/98ccc4ef-e4c3-425b-fe99-6c3ff1573a9f.png)


使用方法は右上に『マイク』ボタンを押して任意の場所にカーソル合わせて話すだけです。(ホントに)


#### 実際の動作(動画)

https://twitter.com/Masa36940064/status/1644867989496541184

今回は以上です。

# 参考文献

https://www.teradas.net/archives/35715/
NCMBの管理画面をGoogle Chrome機能拡張で便利にする（データストアのデータ削除）

NCMBでは管理画面を提供していますが、時々物足りないことがあります。この機能があったらもっと便利なのに…と思いつつ、使っている方もいることでしょう。

そこで、その足りない機能を補足するGoogle Chrome機能拡張を開発しはじめました。

## 動作について

動作は以下のようになります。機能拡張をインストールしていると、データストアで任意のフィールドにフォーカスしている状態でDeleteキー（macOSはFn + delete）を押すと、データに `null` が適用されます。削除後、データのリロードが行われてしまうのは外部からデータ操作を行っているためです。

本来オブジェクト型にして `null` と入力すれば良いのですが、意外と知られていないので機能拡張で対応できるようにしました。

![delete.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6aa61e5e-cfaf-27d8-84e8-6ec6632c8912.gif)


## インストール

[Chrome機能拡張のページからインストール](https://chrome.google.com/webstore/detail/ncmb-extension/dglkhlplcpmnbgodhbngcmdfpojkbdnc?hl=ja&authuser=0)してください。


## 制限

この機能拡張は [https://console.mbaas.nifcloud.com](https://console.mbaas.nifcloud.com/) 以下でのみ動作します。また、この機能は管理画面のAPIを使っていますので、APIコール数を消費しません。また、ACLは無視して処理されます。

前述の通り、削除実行後にリロードが行われます。

## ライセンス

ライセンスはMIT Licenseです。依存ライブラリとして[URL.js](https://github.com/duzun/URL.js)を使っています（こちらもMIT Licenseです）。

## まとめ

機能的にはまだ多くありませんが、徐々に機能を追加していきます。Google ChromeでmBaaSの管理画面を利用されている方はぜひお使いください。
Ansible playbookで日付を扱う

ansible-playbookで日付毎に新しいファイルパスを作成する場合はansible_date_time.dateを利用します。
但し、ansible_date_timeを利用する場合はgather_factをtrueにします。ただ日付を使うためにgather_factをtrueにするよりもgather_subsetを利用して日付だけを取得するようにします。

例：
```
- name: gather date and time only
  setup:
    gather_subset:
      - "date_time"
  when: ansible_date_time is not defined

```

```
- name: save result to local directory
  copy:
    content: "{{ result.stdout[1] | replace('show ip interface brief', '') | replace('\\n', '\n') }}"
    dest: "/home/ozawa/outputs/show_ip_interface_brief/{{ ansible_date_time.date }}/{{ inventory_hostname }}.txt"
```

以上
リモートディスクトップからPCのWiFiパスワードを変更する

# 背景
在宅勤務から社内WiFiのパスワードを変更した場合に接続テストを行うスクリプトです。

WiFiのパスワードはリモートから変更することは可能ですが、正しく動作しているか確認する場合は現地確認が必要になります。正しく動作していない場合は多くの人に影響するために設定を変更した後に自分で確認をします。

# 事前準備：
1. 会社に有線でリモートディスクトップができ、WiFi接続も可能なWindowsPCを用意する
2. そのPCに管理者権限で実行できる次のスクリプトを作成して置く

ファイル名：update_whi_wifi_password.ps1
```
netsh wlan set profileparameter name="wifi1" keyMaterial="<new_password>" # wifiのパスワードを変更
disable-netadapter -name "イーサネット" -Confirm:$false # 有線接続を無効にする
netsh wlan connect name="wifi1" # wifi接続を有効にする
start-sleep -Seconds 60 # 1分待つ
enable-netadapter -name "イーサネット" -Confirm:$false # 有線接続を行う。Wifi接続ができない場合は再びリモートディスクトップできるようにして置く
```

# Wifi接続の確認
1. 在宅から会社に置いてあるPCにリモートディスクトップ接続する
2. コマンドプロンプトを開き、次を実行する
```
set-executionpolicy remotesigned
& "C:\wifi\script\update_whi_wifi_password.ps1"
```

# その他
WiFiのパスワードを変更する場合は次のコマンドも便利です。
* Wifiプロフィール一覧の表示
```
netsh wlan show profiles
```
* SSIDパスワードの表示
```
netsh wlan show profile name="wifi1" key="clear"
```
* ネットワークアダプタ一覧の表示
```
get-netadapter
```

以上