OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTをDiscordから呼び出す

DiscordでChatGPTと戯れるための手順。

必要なもの
- Bot用サーバ（docker-composeかdockerが必要）
- OpenAIのアカウント登録
- OpenAI APIの支払方法登録（Official API認証を使う場合）、APIトークン作成: https://qiita.com/yota-p/items/4c93641329ce5cf2b21c
- Discord Bot作成、トークン作成、サーバへ追加、ロール付与: https://qiita.com/1ntegrale9/items/cb285053f2fa5d0cccdf

Botの実装は以下を使った。
注: 非公式のOSSなのでDockerfile, srcを自分で監査してから利用判断すること。

https://github.com/Zero6992/chatGPT-discord-bot

まずはリポジトリをcloneする。

```
git clone https://github.com/Zero6992/chatGPT-discord-bot.git
```

次にGitHubのREADME.mdに沿って.envを作成し認証情報を設定する。ここでDiscord Botの認証用に先程作成したトークンが必要になる。

ChatGPTの認証方法としてはOfficial API authenticationと、Website ChatGPT authenticationが使える。
前者はリクエストトークン数に応じて若干課金が発生するが、一人で使う分には大した額ではないのでおすすめ。
後者はいずれも非公式のWeb APIを使用しており、若干グレーだと思われる。Email/Passwordもしくはブラウザから取得したセッションのACCESS tokenが利用できる。ACCESS tokenを使う場合、一定期間でExpireするので再設定が必要になるのでずっと運用するのは面倒そう。また、GPT-Web APIは25リクエスト/3時間のリミットがある（2023/5/6時点）。

バックエンドを立ち上げる。

docker-composeを使う場合
```
docker-compose up -d
```

docker-composeを使わない場合

```bash
# imageをbuild
docker build -t chatgpt-discord-bot:latest ./

# コンテナ作成
docker run -it --env-file=./.env --restart unless-stopped chatgpt-discord-bot:latest
```

あとはDiscordで/chatなどと打てばChatGPTをお話しできる。
DeepL × Google Apps Script で翻訳ツールを作る方法

<iframe width="560" height="315" src="https://www.youtube.com/embed/2lFDi_86Omo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

YouTubeで解説しています → https://youtu.be/2lFDi_86Omo


# プログラム
```javascript:コード.gs
const deepl_url = "https://api-free.deepl.com/v2/translate";
const deepl_key = "DeepL-Auth-Key *************************************"

/**
 curl -X POST 'https://api-free.deepl.com/v2/translate' \
	-H 'Authorization: DeepL-Auth-Key **********************************:fx' \
	-d 'text=Hello%2C%20world!' \
	-d 'target_lang=DE'
 */ 

// 翻訳
function deepL(msg) {
  // msg = "今日の天気は？"
  msg = "What is the weather today"
  let lang = 'EN'
  if (isEnglish(msg))
    lang = 'JA'
  let headers = {
    'Authorization' : deepl_key
  }
  let payload = {
    'text' : msg,
    'target_lang' : lang
  }
  let options = {
    'method' : 'post',
    'headers' : headers,
    'payload' : payload
  }
  const response = UrlFetchApp.fetch(deepl_url, options).getContentText()
  const json = JSON.parse(response)
  const text = json.translations[0].text
  return text
}

// 英語かどうか判定
function isEnglish(text) {
  return !text.split('').some(char => char.charCodeAt() > 255);
}
```

# 参考リンク

◆ DeepL 公式ページ
https://www.deepl.com/

◆ DeepL API 料金表
https://www.deepl.com/pro?cta=header-prices

◆ DeepL API ドキュメント
https://www.deepl.com/docs-api/translate-text/
Rancher Desktopを使ってAzure functionsをローカルで動かす(kubernetes編)

# Rancher Desktpのkubernetesでazure functionを動かしてみる
マイクロサービスで開発する際に、ローカルでデバックしたい。と思った時のために、ローカルmacのkubernetes環境でazure functionsを動かしてみました。

## 環境
mac book,Rancher Desktop(kubernetes),azure function,pythonの環境で動かしてみます。
azure functtionのDocker imageまでは、[別の投稿](https://qiita.com/tak7/items/5963d7c5ba6f5f2c7f21)を参照してください。azure functionsのDocker imageが作成できている前提で、kubernetesにdeployするまでを備忘として残します。。。

##準備
azure functionsのweb apiイメージ(azurefunctionsimage:v1.0.0 )を作成する。[こちら参照](https://qiita.com/tak7/items/5963d7c5ba6f5f2c7f21)

Rancher Desktopを起動して、kubernetesクラスタをローカルで利用できる状態にしておきます。[こちら参照](https://qiita.com/tak7/items/455eea5cf9570dab1f87)

# ローカルのkubernetesクラスタに、KEDA をデプロイする
kubernetesクラスタでAzure funtionsをデプロイするために、KEDAを利用します。詳細は[こちら](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-kubernetes-keda#managing-keda-and-functions-in-kubernetes)を参照ください。

## kedaのインストール
以下のコマンドでnamespace kedaを作って、インストールします。
[詳細はこちら](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-core-tools-reference?tabs=v2#func-kubernetes-install)

```
$ kubectl create namespace keda
$ func kubernetes install --namespace keda
```

## azure functionsのweb apiコンテナをdeployする
上でも記載した以前作成した[コンテナazurefunctionsimage:v1.0.0](https://qiita.com/tak7/items/5963d7c5ba6f5f2c7f21)を`azfunction`という名前でdeployします。deployコマンドの詳細は[こちら](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-core-tools-reference?tabs=v2#func-kubernetes-deploy)を参考にしてください。
```
 func kubernetes deploy --name azfunction --image-name=azurefunctionsimage:v1.0.0
```
Rancher Desktopのアプリで、`azfunction-http` serviceが表示されるので、Local Portを初期値通りに`57885`で設定します。
![スクリーンショット 2023-05-06 16.47.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3349326/5cbcf2ec-3623-2d86-ac25-14d54c5de312.png)

port forardingで設定したlocalhostの57885portにブラウザからアクセスします。`http://localhost:57885/api/HttpExample?name=Functions`にアクセスすると、`Hello, Functions. This HTTP triggered function executed successfully.`と表示されてdeployされていることが確認できました。


# 後片付け

https://learn.microsoft.com/en-us/azure/azure-functions/functions-kubernetes-keda#removing-a-function-app-from-kubernetes

や

https://learn.microsoft.com/en-us/azure/azure-functions/functions-kubernetes-keda#uninstalling-keda-from-kubernetes

を参考に、functionとkedaを削除しておきます。
Rails7 Hotwireを使用してフラッシュメッセージを機能させる！Turbo Rails Tutorial をやってみた（7章）

本記事は、🔽「Turbo Rails Tutorial」の学習を進めていく際の個人メモです！

https://www.hotrails.dev/turbo-rails

🔽 前章の記事はこちら

https://qiita.com/yuppymam/items/35645d52b9880dcc205c

# 7章 [Flash messages with Hotwire](https://www.hotrails.dev/turbo-rails/flash-messages-hotwire)

この章では6章までにHotwireを使用して作成した「見積もり」作成アプリに「フラッシュメッセージ」をつける方法を学びました。Hotwireを使用しない通常の方法より設定することは多いですが、それでも実現していることの複雑さから考えれば実装は簡単だと思いました。

## やりたいこと
現状機能していないフラッシュメッセージを表示させたい。

## やったこと
`app/controllers/quotes_controller.rb`内の`create`、`update`、`destroy`メソッド内で`format.turbo_stream`の部分に`flash.now`を設定する。（Turbo Streamのレスポンスではリダイレクトが発生しないため、`flash.now`にします。）
```rb
respond_to do |format|
  format.html { redirect_to quotes_path, notice: "見積もりを作成しました" }
  format.turbo_stream { flash.now[:notice] = "見積もりを作成しました" }
end
```

それぞれのアクションで呼び出されるTurbo Stream用のビューに、フラッシュを追加する。

```erb: app/views/quotes/create.turbo_stream.erb
<%= turbo_stream.prepend "quotes", @quote %>
<%= turbo_stream.update Quote.new, "" %>
<%= turbo_stream.prepend "flash", partial: "layouts/flash" %>
```

```erb: app/views/quotes/update.turbo_stream.erb
<%= turbo_stream.replace @quote %>
<%= turbo_stream.prepend "flash", partial: "layouts/flash" %>
```

```erb: app/views/quotes/destroy.turbo_stream.erb 
<%= turbo_stream.remove @quote %>
<%= turbo_stream.prepend "flash", partial: "layouts/flash" %>
```

## その他やったこと
- 上記で重複しているコードをHelper化してリファクタリング
- フラッシュメッセージは一定時間で消えるようアニメーションを追加
- フラッシュメッセージは消えてもDOMが残ってしまいカーソルを当てると変化してしまうので、アニメーション終了時にDOM自体が消えるJavaScriptを追加（Stimulus Controllerを作成）

## できたもの

![output5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293962/48cd2ca4-faac-a33a-1afa-d206df88b5c2.gif)

## まとめ
この章ではHotwireを使ったフラッシュメッセージの実装以外にも、`Stimulus Controller`を使ったJavaScriptの追加方法についても学ぶことができました。今後、Hotwireを使って何か実装するとき、何度も見直すことになりそうな章でした！

次の章ではHotwireで空の状態を処理する方法について学びます。

https://www.hotrails.dev/turbo-rails/empty-states
Arm 版 Windows 動作確認 メモ

`Windows 開発キット 2023`での動作確認メモです。

## Windows 開発キット 2023の概要
CPU:Snapdragon Compute Platform 3.00 GHz
RAM:32.0 GB
OS:Windows 11 Pro

## 動作確認

◎：大丈夫そう 〇：細かい問題あり △：問題あり ×：動作不可

### ハードウェア

| 名称 | 動作 | インターフェース | 備考 | 確認日 |
|:-----------|:------------:|:------------:|:------------|:------------:|
| EIZO FlexScan EV2457 | 〇 | DisplayPort | ディスプレイのスピーカーでノイズ音が発生、ディスプレイ・ケーブルが故障している可能性もあり原因不明 | 2023-05-06 |
| Google Titan | ◎ | USBC Type-C | ブラウザで使用可能 | 2023-05-06 |
| Google Pixel Buds Pro | ◎ | Bluetooth |  | 2023-05-07 |
| Logicool ERGO M575 | ◎ | Bluetooth | Logi Options+ 1.36 のインストール | 2023-05-06 |
| PFU HHKB Pro HYBRID | ◎ | Bluetooth | |2023-05-06 |
| Yubico Yubikey 5 NFC | ◎ | USB | Windows 11 ProへAzureADのアカウントでログイン可能 | 2023-05-06 |
| Yubico Yubikey 5c NFC | ◎ | USB Type-C | Windows 11 ProへAzureADのアカウントでログイン可能 | 2023-05-06 |
| Razer Nommo V2 | ◎ | Bluetooth |  Razer Synapse 3 (x32) のインストール | 2024-06-10 |

### ソフトウェア

| 名称 | 動作 | バージョン | 備考 | 確認日 |
|:-----------|:------------:|:------------:|:------------|:------------:|
| 1Password | ◎ | 8.10.5 | x64 | 2023-05-07 |
| Docker Desktop | 〇 | 4.31.0 | インストール、アプリケーションが起動出来ることを確認 | 2024-06-10 |
| Google日本語入力 | △ | 2.30.5620.0 | 2.28.4650.0まではインストール可能でx86のアプリケーションへ日本語入力する事が出来るがarm64のアプリケーションへは不可<br>2.29.5330.0以降は開発版も含めインストール不可<br>2.30.5620.0にて再度インストール可能で有ることを確認、x86のアプリケーションへ日本語入力する事が出来るがarm64のアプリケーションへは不可 | 2024-11-30 |
| JetBrains Rider | ◎ | 2023.1.1.0 | ARM64 |2023-05-07 |
| Node.js | ◎ | 20.1.0 | ARM64 |2023-05-07 |
| PowerToys | ◎ | 0.69.1 | ARM64 | 2023-05-07 |
| draw.io | ◎ | 24.7.17 | ARM64<br>~no-installer.exeはx86で起動してその後draw.io.exeをARM64で起動する | 2024-11-30 |
| [RLogin](https://kmiya-culti.github.io/RLogin/) | ◎ | 2.30.0 | x64 | 2024-11-30 |

### その他

#### AZIK
現状Google日本語入力は動作しないのでローマ字テーブルを気軽に変更できない、苦肉の策として古いMicrosoft IMEを有効にしてレジストリに設定を追加する形でARM向けのソフトウェアでもAZIKの使用が可能
新しいMicrosoft IMEはローマ字テーブルの変更ができない
PowerShell経由でクリップボードからHTML形式で取得する方法

### サンプル(PowerShell5系）

```powershell
Get-Clipboard -Format Text -TextFormatType Html
```
### 解説

- 画像かテキストかでいえばテキスト
- テキストもプレーンテキストとして取り出す方法もあるけど、HTML形式で取り出す方法もある
- HTML形式で取り出すとゴリゴリのインラインCSSがたっぷり入ったHTMLが帰ってくる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/93f141c8-7c68-cb58-15fc-efabc280bab9.png)


### PowerShell7系は使い物にならないのでやめておけ

2023-05-06時点でのPowerShell7系では`-TextFormatType`のパラメータが消えてるのでこの手法が使えるのは、PowerShell5系のみ。このレベルで互換性がなくなってるのでPowerShell7は別物と認識した方が良さそう。.netフレームワークを直で呼び出す方法も互換性がなくなってるのでたちが悪い。

実行ファイルは私の手元のWindows11上では以下のように共存できている。

PowerShell5系

```powershell
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
```

PowerShell7系
```powershell
"C:\Program Files\PowerShell\7\pwsh.exe" -WorkingDirectory ~
```

実行ファイル名から違うので、仮に両方にパスが通っていても共存はできる。

ただ、こんなにも別モノで互換性のないものにバージョン番号つけちゃってどうするんだろうという心配。

### 別解としてのpythonは無理でした

pythonにも`win32clipboard` というモジュールがあるのでそれでクリップボードにアクセスできそうにも見えたが、テキストフォーマットのサブフォーマットとしてのHTMLは選択できなかった。

### 残課題ーEncode

上記のサンプルの画像のように日本語部分が文字化けしている。UTF8の文字列をSJIS扱いで表示している状態の文字化け。Get-Clipbord時点での文字化けなのか、標準出力時の文字化けなのかの切り分けがまだできてないので、この課題は宿題。

### 別解- ブラウザを使う

PowerShellがとても扱いづらいので、ワンアクション必要だけどブラウザ上のリッチエディタ上にペーストさせれば、InnerHTMLでHTMLテキストは取得できる。こっちの方がマルチOSでいい。エンコードも気にしないでもいい。
計算量の見積もりについての学びをまとめる(2)

# はじめに
&emsp;今回は前回までの続きになる。今回は**二分探索**と$O$記法についての学びをメモ程度にまとめていきたい。

# 目次
[1. 前回の補足](#1-前回の補足)
[2. 二分探索](#2-二分探索)
[3. ランダウのO記法](#3-ランダウのO記法)
[4. まとめ](#4-まとめ)
# 1. 前回の補足
&emsp;[前回の記事](https://qiita.com/yuyatuta/items/31f19b0d2731fd4ef4e3 "前回の記事")では$O(N)$のように計算量としては示したが、実行時間はどう計算すんねんと。
今読んでいる**アルゴリズム×数学が基礎からしっかり身につく本**曰く、一般家庭にあるコンピュータの計算速度は $1s$あたりに$10^9$回程度であるらしいので、その前提で行くと以下のように計算できる。
(使用しているPCのCPU**スペックなどにもよって変わる**)

- $O(N)$の場合
$N=10^7$の時、$\frac{10^7}{10^9}=10^{-2}[s]$

- $O(N^2)$の場合
$N=10^6$の時、$\frac{10^6*10^6}{10^9}=10^3[s]$

他にも$O(logN)$(二分探索で扱うよ)とかもあるので興味ある人は計算してみると良いかも。
# 2. 二分探索
&emsp;二つの枝に分かれた木のようなイメージ。
これに関しては本の例が一番わかりやすかったのでそれを参考に書く。

```
(例)
あなたの友人に1~8までの整数を思い浮かべてもらいその数字をいくつか質問をして求める
というゲームをしたと仮定する。
```
例えば普通に1から昇順に「あなたが思い浮かべてるのは1ですか？」のように質問していくと相手が8を思い浮かべているときは最後まで質問しなければならず、$O(N)$の**線形探索**となる。
二分探索は上記の例で行くとまず半分に割ってしまおう。
「4以下ですか？」
こうすることで**YES**であろうと**NO**であろうと数字を半分に絞れる！
後は繰り返すだけですね！
これを数式として追っていくと以下のようになる。
$2^{B-0}, 2^{B-1}, 2^{B-2},2^{B-3} = 8, 4, 2, 1$
$B$は質問の残り回数とでも思ってください。
今回のケースだと**最大3回**質問すれば絞れるので上記のように**3回目で1**となっています。
このように**半分に絞れていく**ことから質問回数Bは(オーダー)は以下のようになる。
$N=2^B$より両辺対数をとって$B=\log_2N$となる。
今回だと$N=8$あるので代入すると$B=3$となる。
![qiita_binary_search.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2925753/f5fed714-798e-8d8c-a314-db16bb358895.png)


&emsp;対数なんで$N$が小さければあまり変わりはないもしくは線形探索のほうが若干速いかも。
### しかし！！！
前回も体感した通り、**データ数**が**多い**と**全探索なんてやってらんねぇ！**
そこで対数を扱う関数にです！
上記の例だと、たとえ$N=1000000$であろうと質問回数は**20回**で済みます！
速いって正義ですね。
# 3. ランダウのO記法
&emsp;実際には上記のようにプログラムが簡単な関数で表せればいいのですが実際はより複雑な式になると思います。
### でも大丈夫！
だって支配的な項だけ残してやればいいんだもん。(とか言いつつ、すべてがすべてそうであると私は言えませんが^_^;)
以下の例で上記について説明できればと思う。

- (例)
$T(N)=N^2+2N$
という関数を考えたとき、$N=1000$とすると$N^2=1000000$、$2N=2000$となりボトルネックなのは明らかに$N^2$となるので$N^2$が支配的な関数といえます。
なので$2N$を消して簡略化してやる。すると
$T(N)=N^2$となる。
あら、きれい。

他にも以下のようにしてきれいにできる。

- (例2)
$T(N)=2N^2+5N+7$
二次関数ですね。
でも上記通りでいくと支配的なのは$2N^2$ですね。
ほか、消しちゃいましょう。
$T(N)=2N^2$
2の係数も倍になったところで指数の変化量に比べれば微々たるもの。
消してしまえ！ (はいぃぃぃ！！！)
$T(N)=N^2$
うむ、きれいである。よろしい。

と、計算量を見積もるときは関数の支配的にとなっている部分の項を残すようにして簡略化して考えようということ。

# 4. まとめ
&emsp;結論、速いは正義！
&emsp;まじめな話、私自身あまり処理時間やその見積もり、$O$記法について知識がなかったのでとても勉強になりました。ただ、データ数が少なければ直感的で実装が簡単な線形、全探索あたりでもいいとは思うので塩梅大事ですね。
そのために今日学んだ知識を生かして私もこれから見積もりを立てて実装していきたいですね。
DOMとは

DOM (Document Object Model) とは、ブラウザが提供してくれるものであり、このDOMという概念があることによってjavascriptからHTMLの要素を操作することができる。

具体的に言うと、DOM APIという仕組みをを利用して、Webページを動的に変更している。getelementbyid や onclick などはそのAPIのひとつである。
( Web ページ上のテキストデータを読み込んだり、新しい要素を追加したり、 Web ページ上に表示されたボタンがクリックされた時にあらかじめ設定した処理を行うことができる)

また、DOMはツリー構造(階層構造)で表されて、その各要素をノードという。
ノードはさらに種類に応じて「要素ノード」「テキストノード」「属性ノード」などに分類される。
Python初学者が独学で勉強するための道のり：私の経歴と学び方

# はじめに
　Pythonを独学で学びたいけれど、どこから始めたら良いのか分からない。そんな皆さんのために、私がPythonを独学で学んだ経験をシェアしたいと思います。本記事では、私の経歴を通して、Python学習の進め方、学び方を紹介します。また、一緒に学んだAIや機械学習についても触れます。

# 私の経歴と学習過程
## 配属1年目：Pythonの基礎と自動化への挑戦
　大学では機械工学を学び、大学卒業後、設備製造会社に入社しました。開発部門に配属され、開発中の製品の社外実験のデータ分析を担当しました。ところが、データの取得から分析までの工程が非常に時間を取るため、これを**自動化できる手段**を探し始めました。

　自動化する手段としてPythonがあることを知りました。ここから私のPython学習が始まりました。
　
　まず、udemyの[「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」](https://www.udemy.com/course/python-beginner/?utm_source=adwords&utm_medium=udemyads&utm_campaign=Python_v.PROF_la.JA_cc.JP_ti.7380&utm_content=deal4584&utm_term=_._ag_89848448767_._ad_439843892596_._kw__._de_c_._dm__._pl__._ti_dsa-848363794551_._li_1009474_._pd__._&matchtype=&gclid=Cj0KCQjw9deiBhC1ARIsAHLjR2ARDMxHf3W2B4D0wF5K_KCQxoRdP17C2zomgKko6SKzOksrT8AHkRAaAu1KEALw_wcB)を受講し、**Pythonの基礎**を学びました。

　次に、[「100 Days of Code - The Complete Python Pro Bootcamp」](https://www.udemy.com/course/100-days-of-code/)を通じて、**Pythonで「モノ」の構築方法**を学びました。

　そして、独学で培った知識をもとに、クラウドから自動でデータを取得し、自動でグラフを作成する**自動グラフ化ツール**を開発しました。これにより、業務の効率化を実現しました。

## 配属2年目：アルゴリズム開発とAI学習の始まり
　1年目の成果が認められ、**自社製品のアルゴリズム開発**を担当することになりました。また、社内実験用のデモ製品がクラウドを経由していないため、リアルタイムでのデータ可視化が難しかった問題に対して、ローカルのデータをリアルタイムにグラフで視覚化できる**GUIアプリケーション**を作成しました。これにより、社内実験の効率を大幅に向上させました。

　さらに、試行錯誤を経て、自社製品に私の考えた**アルゴリズムを搭載した製品をリリース**することができました。この時期から、自社製品にAIアルゴリズムを実装したいという目標を持ち、**AIの学習**を始めました。

## 配属3年目：AIの研究と実装
　3年目になると、私はある大学の**AIの研究室**に通い、実践を交えながら**AIの座学と実装方法**を学びました。そして、試行錯誤の結果、**AIアルゴリズムを搭載した自社製品のバージョンアップ版をリリース**することができました。その他にも、**機械学習システム構築**、**データ分析プロジェクト**、**データ可視化・BI構築**などの業務をこなしていきました。

　現在では、通常業務の他にも、社内でAIの活用を推進する**AIプロジェクト**の初期メンバーとして活動し、社内**教育活動**にも従事しています。毎日新たな挑戦を続け、技術の進化とともに自己成長も実現しています。

# 私が大事にしていること
　私がPythonやAIを学ぶ過程で大事にしてきたことは、**「Pythonを学ぶことは『目的』ではなく『手段』であること」** と、**「作りたいものを決めて、それを作る過程でスキルを身につけること」** です。Pythonの学習は目的ではなく、何かを実現するための手段として使用し、実際に何かを作りながらスキルを身につけていくことが重要だと考えています。

# まとめ
　この記事では、私がPythonを独学で学び、その後AIまで学び、実際に業務で活用してきた経験を共有しました。また、学習における心構えや考え方についても触れました。具体的には、**「機械学習システム構築」、「データ分析プロジェクト」、「データ可視化・BI構築」** などのスキルとその学び方について詳しく説明したリンクを用意しています。
* **[機械学習とデータ活用：技術的なスキルとその応用](https://qiita.com/yutut/items/143cfd496a8eef299699)**

# 最後に
　Pythonを学びたいと思う皆さん、始めることが一番の第一歩です。まずは何か作りたいものを見つけ、その過程でスキルを身につけてみてください。そして、PythonやAIの学習は目的ではなく、手段であるということを忘れずに。それでは、皆さんの学習が充実したものになることを願っています。
新しい量子素因数分解アルゴリズムの解説 (Part 4: SQIF の詳細)

本記事は, Yan 等の中国の研究者が 2022 年 12 月に発表した "[Factoring integers with sublinear resources on a superconducting quantum processor](https://arxiv.org/abs/2212.12372)" というプレプリントを解説した一連の記事の Part 4 です. この論文は QAOA という量子計算を使った新しい素因数分解アルゴリズムを提案しており, その名称を SQIF (Sublinear Quantum Integer Factorization) と呼んでいます. 本記事では SQIF の詳細な処理内容を説明します.

[Part 1: 論文の概要](https://qiita.com/izutetsuya/items/f40854aeb63d623410b8)
[Part 2: 平方差法](https://qiita.com/izutetsuya/items/0179d2609d666d95b392) 
[Part 3: Schnorr の素因数分解法](https://qiita.com/izutetsuya/items/a82aa95f11cf0de6ee6b)
Part 4: SQIF の詳細 (この記事)
Part 5: SQIF の実験結果の分析
Part 6: まとめ

https://arxiv.org/abs/2212.12372

# アイディア

Schnorr による素因数分解法は格子の最近ベクトル問題 (CVP: Closest Vector Problem) の近似解から拡張関係式を収集しますが,  格子の次数が大きくなると近似解の近似精度が指数的に悪くなるため, 拡張関係式を求めにくくなるという課題がありました.

そこで SQIF は, CVP の求解問題をさらに最適化問題に変換し, QAOA (Quantum Approximate Optimization Algorithm) という量子計算を適用することによって近似精度の良い近似解を求めることを目指します. [QAOA](https://en.wikipedia.org/wiki/Quantum_optimization_algorithms) は量子計算の一つで, 与えられた多変数多項式の最小値とそれを実現する変数値を出力します. QAOA は量子ビットに対する耐性があることから, NISQ のような現在開発・運用されている量子計算機でも処理可能です. 

ただし, SQIF は 

:::note info
仮定
Babai アルゴリズムによって求まる近似解の近傍に最適解(CVPの真の解)が存在する
:::

という仮定を利用している点に注意が必要です. Babai アルゴリズムは与えられた基底ベクトルに LLL アルゴリズムを適用し, その後, 基底ベクトルごとに整数係数を定め、最終結果を CVP の近似解として出力します. 整数係数を定める際には実数値に対する丸め(四捨五入)関数 $\lceil x \rfloor$ を用いるのですが, SQIF は $x$ に最も近い整数 $\lceil x \rfloor$ だけでなく2番目に近い整数も候補として残し, QAOA による量子計算を適用することでより良い近似解を求めようとします. 

# SQIF の処理内容

それでは SQIF の具体的な処理内容を説明します. SQIF の流れは以下のようになります. (2) の CVP の求解法以外は Schnorr の素因数分解法と同じになっています.
(1) 格子の生成
(2) 拡張関係式の収集 (CVP の求解)
(3) 行列計算
(4) $N$ の因数分解

## (1) 格子の生成

素因数分解したい合成数 $N$ と適当な方法で定義された素数の集合 $P= \\{ p_1, \dots, p_s \\}$ に対し, $s$ 個の基底ベクトル
```math
  \mathbb{b}_1 = \begin{pmatrix} f(1) \\ 0 \\ \vdots \\ 0 \\ N^c \log{p_1} \end{pmatrix},~
  \mathbb{b}_2 = \begin{pmatrix} 0 \\ f(2) \\ \vdots \\ 0 \\ N^c \log{p_2} \end{pmatrix},~
  \dots,
  \mathbb{b}_s = \begin{pmatrix} 0 \\ 0 \\ \vdots \\ f(s) \\ N^c \log{p_s} \end{pmatrix}
```
から生成される格子を考える. ここで関数 $f$ は $\\{1,2,\dots,s\\}$ 上のランダムな置換である. また実数の定数 $c$ は CVP を適切に解けるようにするためのウェイトであり, 具体的な値は別途定められる.

## (2) 拡張関係式の収集 (CVP の求解)

(1) で定義された格子において, ターゲットベクトル
```math
  \mathbb{t} = \begin{pmatrix} 0 \\ 0 \\ \vdots \\ 0 \\ N^c \log{N} \end{pmatrix}
```
に対する CVP を解きます. 具体的には
(2-1) 基底ベクトルに対して LLL アルゴリズムを適用する
(2-2) (2-1) で得られた基底ベクトルに対して Babai アルゴリズムを適用し, CVP の近似解 $\mathbb{b}=\sum e_i \mathbb{b}_i$ を求める.
(2-3) ハミルトニアン $H = || \mathbb{t} - \sum x_i \mathbb{b}_i - \mathbb{b} ||^2$ を求める.
(2-4) ハミルトニアン $H$ に対して QAOA を適用し, 最適化問題の解を得る. 
(2-5) (2-4) で得られた近似解 $\sum x_i \mathbb{b}_i$ に対して $u = \prod_{x_i>0} p_i^{x_i}$, $v = \prod_{x_i<0} p_i^{-x_i}$ と定め, さらに $u-vN$ の素因数分解 $\pm q_1^{f_1} \times \dots \times q_t^{f_t}$ を求める. このとき拡張関係式
```math
  \prod_{x_i>0} p_i^{x_i} \equiv \pm q_1^{f_1} \times \dots \times q_t^{f_t} \pmod{N}
```
を得る.

(3) 行列の計算

得られた拡張関係式から生成されるベクトルを行ベクトルとする行列を生成し, 掃き出し法を適用する. 

(4) 素因数分解

(3) で得られた関係式から $N$ の因数を得る.

# まとめ

本記事では SQIF の具体的な処理内容を紹介しました. ポイントは CVP の近似解を得るために Babai アルゴリズムの出力からハミルトニアンを生成し, それに QAOA を適用する点です. 数値例は次の記事で紹介します.
さくらのモノプラットフォームを使用したアプリケーション開発　番外編

## はじめに
　本記事は、さくらインターネット株式会社（以下、さくらインターネットとする）により開発環境が用意されているモノプラットフォームを使用する記事です。IoT向けのサービスを開発したい人、扱いたい人を対象としています。M5stackを利用してさくらインターネットのモノプラットフォーム及び、さくらインターネットのモノプラットフォーム開発基板を使用した開発について全４回にわたって説明していく予定です。

この連続記事は
１回目　システムと全体の構成の説明
２回目　ハードウェアの組み立て
３回目　モノプラットフォームの設定
４回目　クラウドアプリケーションの作成
のような順番で進めていきます。

第一回目の記事と事前準備編の記事はこちらになります。
[さくらのモノプラットフォームを使用したアプリケーション開発　第1回](https://qiita.com/shinfrom/items/715c2255b173bd2dabdc?fbclid=IwAR2mGoi8nUVspfzrQNRO1eqIiWQoghYVJqY2pQafkSDCHH8JbRDZp0ZORfY)
[さくらのモノプラットフォームを使用したアプリケーション開発　第1.5回（事前準備編）](https://qiita.com/shinfrom/items/d195c30ea8da26de56a6)

今回は番外編として、現在の進捗と活動状況について報告します。

## この記事の対象者
- さくらインターネットのモノプラットフォームを体験してみたい人
- IoTを体験してみたい人
- 開発基板を取得したがその後どうして良いかわからない人
- webエンジニア、ソフトウェアエンジニア
を対象としています。

## 現在の進捗
　現在、通信モジュールを操作するためのプログラムを作成し、プログラムの検証と記事の作成を急いでいます。HWについても動作を把握するための検証を進めていっています。現在は特に問題無く動作しているようですので、予定通りに記事の公開が出来そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/6f41d6e3-c661-0178-c18e-eb64269296f0.png)

## 活動状況
　2023年5月2日に広島で行なわれたM5 Japan Tour 2023 Springに参加してきました。
弊社も「M5stackを製品に組み込む方法」というタイトルで発表を行いました。
そこで、さくらのものプラットフォームを使用したデモの展示を行いました。
![DSC_0028.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/2db44e08-aa35-e37b-10c8-c6ec6f33ed68.jpeg)

## 応用例
　弊社では、アスパラガス栽培用自動潅水システムに取り組んでいます。システムの中の自動潅水コントローラの通信の一つとして、さくらのモノプラットフォームを選択して、現地での実証実験の準備を行っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/3c37eb62-659e-06dd-77d2-c5d3935552ed.png)

　連続記事の中で説明する内容を応用することにより、このようなアプリケーションを作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/b8ff49b1-f4f7-c365-150c-2cd185d3fdad.png)


## これからの流れ
　予定通りに、ハードウェアの組み立て、モノプラットフォームの設定、アプリケーションの作成の順番で公開していきます。記事については鋭意製作中ですので、ご期待ください。
## 関連記事
[さくらのモノプラットフォームを使用したアプリケーション開発　第1回](https://qiita.com/shinfrom/items/715c2255b173bd2dabdc)
[さくらのモノプラットフォームを使用したアプリケーション開発　第1.5回（事前準備編）](https://qiita.com/shinfrom/items/d195c30ea8da26de56a6)
[さくらのモノプラットフォームを使用したアプリケーション開発　第2回](https://qiita.com/shinfrom/items/0b813d01c8522356c3c4)

## appendix
参考動画
[M5 Japan Tour 2023 Spring 広島](https://www.youtube.com/watch?v=6N24bdnoU38)
【RSpec】個別だとパスするけど、全体を通すとエラーになる

## はじめに
タイトルにもある通り、単体でそのテストだけを検証するとパスするのに、すべてのテストを通しで検証すると通らなくなる...ということが発生しました。
単体でパスしているのだから間違ってるわけではない...なぜ？と結構頭を悩ませながら最終的に無事解決したので共有したいと思います。

## 環境
MacOS ventura 13.3.1
ruby 3.2.1
rails 6.1.3.7
mysql 5.7
rspec-rails-6.0.1
rspec-core-3.12.1
factory_bot_rails-6.2.0

## 原因
結論、FactoryBotでシーケンスを使用したモデルを、同じテストファイル内で何回も呼び出したことによってシーケンス番号が共有されていたから。
ファイル内で、シーケンス番号は共有されます。つまり、最初の`it`のなかで`create_list(:model, 3)`としたら、次の`it`で`create_list(:model, 3)`とした時にシーケンス番号は'4'から始まります。
そのため、個別にテストしたときはシーケンス番号が1から始まるため成功し、全体を通すとシーケンス番号が共有されるため失敗するということです。

## 解消法
出来るならリファクタリングしてファイル内で同じFactoryを共有するのがいいですが、できない場合はシーケンス番号をテストごとにリセットする方法があります。
```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.before(:each) do
    FactoryBot.rewind_sequences
  end
end
```
この記述により、他のテストのシーケンス番号の影響を受けなくなります。
create-next-appを用いたNextjsアプリ構築方法

# 0. 初めに
emonです。
本記事では、Reactアプリを構築する上で人気の高いNextjsを用いた環境構築を[公式サイト](https://nextjs.org/docs/getting-started/installation#automatic-installation)で推奨されている`create-next-app`を使用して行います。`create-next-app`することで、簡易的に構築することができ依存ライブラリの設定なども行なってくれます。

■ 本記事での目標
誰でもNextjsの環境を構築し、動作確認ができる
# 1. セットアップ
```
# npx
npx create-next-app@latest
# yarn
yarn create next-app
```
作成したいディレクトリに移動し上記のコマンドをどちらかを実行させます。
オプションを使用して一度に全ての設定をすることができますが、今回は対話型で進めていきます。
```
Need to install the following packages:
  create-next-app@13.4.1
Ok to proceed? (y) y
```
こちらは導入するバージョンを確認します。
今回は、`13.4.1`を使用します。NextjsやReactなどのライブラリは最新のものが使用されます。`create-next-app`を使用する場合は、バージョン指定は出来なさそうです。。。([GitHubのissue](https://github.com/vercel/next.js/discussions/35794))
もしバージョンを指定したい場合は、`create-next-app`を使用しないかセットアップ完了後指定のバージョンをインストールし直すことで解決できます。

```
? What is your project named? › sample
```
ここでプロジェクトの名前を設定します。今回は、`sample`という名前にします。
```
? Would you like to use TypeScript with this project? › No / Yes
```
TypeScriptを使用するかを設定します。
```
? Would you like to use ESLint with this project? › No / Yes
```
ESLintを使用するかを設定します。
ESLintはJavaScript,TypeScriptで静的解析を行うライブラリ（[公式サイト](https://eslint.org/docs/latest/use/core-concepts)）でコード規則を設定することができます。

```
✔ Would you like to use Tailwind CSS with this project? … No / Yes
```
Tailwindを使用するかを設定します。
Tailwindは、cssフレームワークでutilityClassを設定し、デザインを行なっていきます。

##### ■使用例
```jsx:
export default function Home() {
  return (
    <h1 className="text-3xl font-bold underline">
      Hello world!
    </h1>
  )
}
```
https://tailwindcss.com/docs/guides/nextjs

```
✔ Would you like to use `src/` directory with this project? … No / Yes
```
srcディレクトリを追加するかを選択できます。
`Yes`を選択した場合、設定ファイルや静的ファイルなど以外はsrc配下に生成されます。
```
✔ Use App Router (recommended)? … No / Yes
```
こちらは、Nextjsのバージョン13より導入されたAppディレクトリの機能を使用するかです。APPディレクトリを使用することでサイト構成とフォルダ構成を統一することができるだけでなく、品質の向上にも繋がります。

https://nextjs.org/docs/app/building-your-application/routing#the-app-directory

```
✔ Would you like to customize the default import alias? … No / Yes
? What import alias would you like configured? › @/*
```
こちらを有効することで、外部ファイルを指定する際にプロジェクトディレクトリをルートディレクトリとして扱いファイルパスを指定することができます。今回は、ファイルパスの先頭に`@/`と指定するとプロジェクトディレクトリとなるようにします。
##### ■使用例
```javascript:
// before
import { Button } from '../../../components/button';
 
// after
import { Button } from '@/components/button';
```

# 2. 動作確認
```
# npxでセットアップした場合
npm run dev
# yarnでセットアップした場合
yarn dev
```
上記のコマンド実行後、初期画面が表示でされます。
![スクリーンショット 2023-05-06 15.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819209/48878f8c-8a33-8fac-27d1-e485ef0d575d.png)

# 3. 最後に
次回は、ページの編集やAPIの作成などを記載しようと思います。
最後まで読んで頂いてありがとうございました。
Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その８- 選択範囲を読上げる

[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その１](https://qiita.com/tom-sobue/items/aac051de117a45f9fecf)
`Windowsに標準で組み込まれている読上げの声で、Harukaの声以外を使って読上げる方法 `
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その２](https://qiita.com/tom-sobue/items/319c1943df9dd30c081a)
`読上げ内容を音声ファイルに保存する方法`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その３](https://qiita.com/tom-sobue/items/3e02e7569cfbe8a90f12)
`スピード、ピッチ（声の音程）、更には、強調の指示方法`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その４](https://qiita.com/tom-sobue/items/e51cbdec59af545b232a)
`実際のシートに書いた内容で読上げする事例`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その５](https://qiita.com/tom-sobue/items/60573cd3c0e786d82e69)
`シートに書いた内容を録音（音声ファイルに保存する）事例`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その６](https://qiita.com/tom-sobue/items/fd35a4259bfb7291dc1c)
`読上げる内容を調整し易くする事例`
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その７](https://qiita.com/tom-sobue/items/3f55ad3e3a0da3342504)
`XMLタグについて追加説明`
について、紹介しました。

今回は、[**その６**](https://qiita.com/tom-sobue/items/fd35a4259bfb7291dc1c)で紹介しました入力した１行の読上げだけでは部分的な確認が足りないので、選択したセルの範囲を読上げる事例説明をします。

前回、[**その７**](https://qiita.com/tom-sobue/items/3f55ad3e3a0da3342504)で、
読上げ内容の中にXMLタグを書き込んだら、その内容が有効になる。
しかし、次の行に記述すれば、同じこと。と、しました。

１行読上げでは、確認できないことになります。
そこで、選択した範囲を読上げるSubの紹介です。

~~~~
Sub 範囲読上げ()
    '選択した範囲の行を入れる変数
    Dim cRw()
    '選択範囲の行数と実際の行を入れる変数
    Dim cnt, Rcnt As Integer
    '選択範囲の行数
    cnt = Selection.Rows.Count
    '選択の行を入れる必要数に変数の再宣言
    ReDim cRw(cnt)
    '変数番号の初期化
    Rcnt = 1
    '選択した範囲の各行を選んで
    For Each ix In Selection.Rows
        'その行番号を収納
        cRw(Rcnt) = ix.Row
        '使った変数番号を+1繰り上げ
        Rcnt = Rcnt + 1
    Next
    
    '話し手の設定
    Call voi
    
    '音声合成エンジン設定
    Set spi = CreateObject("SAPI.SpVoice")
    '割り込み許可
    Application.EnableCancelKey = xlInterrupt
    Application.ScreenUpdating = False
    
    '現状のシート
    Set sht = ActiveSheet
    
    For ix = 1 To Rcnt - 1
    
        '対象の行を設定
        rw = cRw(ix)
        '読上げ実行
        Call 読上げsub
    Next
        
    Application.ScreenUpdating = True
    'SAPIを解放
    Set spi = Nothing
    
End Sub
~~~~

セルの範囲を選択すると、「Selection」というオブジェクトで参照できます。
この中の「Rows」という各行の属性を確認することができます。
その行数は、「Selection.Rows.Count」で参照できます。
各行の行番号は、「Selection.Rows(1～).Row」で参照できます。
行番号が参照できれば、得られた行の読上げを実行させることで、選択範囲の読上げが可能です。

**ただし、3～5行目と7行目を選択した場合、最初の3～5行目だけになります。*
*この場合には、「Areas」属性を参照して、次のエリアも取得する必要があります。*
*ここでは、省略します。*

Excelシート事例
|   |A  |B   |C|D|E|
|:-:|:-:|:-:|:-:|:--:|:--:|
|1  |スピード|強調|ピッチ|話し手|内容|
|2  |2||-3|一郎|いつもお世話になっています。早急なご対応をお願いします。|
|3  |-1||4|あゆみ|ありがとうございます。|
|4  |2||-2|はるか|お願いします。|
|5  |2|Y|-2|はるか|たとえ|
|6  |2||-2|はるか|問題が発生しても、期限は守ってください。|
|7  |2||-2|はるか|お願いします。\<emph>たとえ\</emph>問題が発生しても、期限は守ってください。|

この事例で、４～６行目の範囲を選択して読上げするのと、７行目を読上げするのは同じこと・・・
のはずなのですが、実際に試してみると強調部分が違います。
行ごとの読上げでは、毎回 SAPIを解放しているので、初期化の段階で影響が出ているのでしょう。
同じ話し手ならば、XMLタグを含めて１つの文章にした方が安定するかもしれません。

ただし、１行読上げの機能は使えなくなります。

[**その８**](https://qiita.com/tom-sobue/items/9c68275b925627c378ed)へ続く
【React学習 #3】React + TypeScriptで環境構築

# はじめに
この記事はReact初心者の筆者が学習のために書いている記事です。
間違っていたら温かくご指摘いただけるとありがたいです。

HomebrewやNode.jsのインストールについては[こちらの記事](https://qiita.com/pero/items/62a28fad1ec72fac77d8)で掲載しています。

# 動作環境
* PC：Macbook
* CPU：Intel
* OS：MacOS Ventura 13.3.1

# React + TypeScriptのプロジェクトを作成
React + TypeScriptのプロジェクトを作成するには以下のコマンドを実行します。

```
cd [プロジェクトを作成する場所]
npx create-react-app [プロジェクト名] --template typescript
```

完了したら、[プロジェクト名]で指定したフォルダが作成され、その直下に様々なファイル等が格納されます。
また、srcフォルダ配下にはtsxファイルが作成されていることを確認できます。

# React + TypeScriptのアプリケーションを実行する。
以下のコマンドを実行して、Reactのアプリケーションを実行します。

```
cd [プロジェクトの場所]
npm start
```

このコマンドを実行すると、Webブラウザが開かれ、「 http://localhost:3000/ 」にアクセスします。
動作を確認できたら、ターミナル上で「Ctrl+C」を押して終了します。
国内の情報セキュリティに関連する組織・情報源について

# はじめに
国内の情報セキュリティに関連する組織・情報源をまとめてみました。
組織内でセキュリティ情報を展開するときは、権威があって日本のサイトだと伝わりやすい気がします。

## 国民のための情報セキュリティサイト
総務省が運営しています。ITの基礎知識から一般利用者・組織向けのセキュリティ情報が掲載されています。
まさに国民のためという感じがします。

https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/index.html

## NISC 内閣サイバーセキュリティーセンター
内閣官房が運営しています。様々なセキュリティ情報があります。
SNS関連アカウントもあり情報にアクセスしやすそうです。

https://www.nisc.go.jp/

## サイバー警察局
警察庁が運営しています。セキュリティ事案への注意喚起などが行われています。

https://www.npa.go.jp/bureau/cyber/index.html

## 国家公安委員会
「重大サイバー事案に係る警察活動への苦情申出」などを受け付けているようです。

https://www.npsc.go.jp/

## 防衛省 サイバーセキュリティ
注意喚起や活動内容が掲載されています。

https://www.mod.go.jp/j/approach/defense/cyber/index.html

## 外務省 サイバーセキュリティ 日本のサイバー分野での外交
サイバーセキュリティ戦略やスピーチの内容が掲載されています。

https://www.mofa.go.jp/mofaj/annai/page5_000250.html

## デジタル庁
できたばかりのせいか、まだあまり情報は無いようです。

https://www.digital.go.jp/policies/security/

## 金融庁 金融分野におけるサイバーセキュリティ対策について
金融分野におけるサイバーセキュリティ対策が公開されています。

https://www.fsa.go.jp/policy/cybersecurity/index.html

## 国土交通省 情報セキュリティ
重要インフラにおけるセキュリティ対策のガイドラインやチェックリストが公開されています。

https://www.mlit.go.jp/sogoseisaku/jouhouka/sosei_jouhouka9999.html

## 厚生労働省 医療分野のサイバーセキュリティ対策について
医療機関などがサイバー攻撃を受けた場合の連絡先などがあります。
最近、医療分野は狙われやすい印象があります。

https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/johoka/cyber-security.html

## 厚生労働省 セキュリティ教育支援ポータルサイト
サイバーセキュリティに関する研修情報を収集または受講申し込みなどができるサイトとのことですが、インシデント発生時の通報窓口があり、初動対応の支援をしてくれるそうです。

https://mhlw-training.saj.or.jp/

## 経済産業省 サイバーセキュリティ施策
様々なセキュリティ施策が公開されています。

https://www.meti.go.jp/policy/netsecurity/index.html

## IPA 情報処理推進機構
独立行政法人で経済産業省が所管しており、様々なセキュリティ情報を公開しています。情報処理技術者試験などもIPAが運営しています。

https://www.ipa.go.jp/

## IPA ここからセキュリティ 情報セキュリティ・ポータルサイト
IPAのセキュリティポータルサイトです。一般・企業向けなど様々な情報が公開されています。
新着情報などが頻繁に更新されており、使い勝手が良いと思いました。

https://www.ipa.go.jp/security/kokokara/

## JPCERT コーディネーションセンター
一般社団法人、セキュリティに関する情報提供やインシデント対応支援の支援活動を行っているようです。

https://www.jpcert.or.jp/

## JVN (Japan Vulnerability Notes)
脆弱性情報のポータルサイトです。
JPCERTとIPAが共同で運営しているようです。

https://jvn.jp/

## フィッシング対策協議会
流行っているフィッシングメール情報について、その内容とともに注意喚起を行っているようです。
事務局情報よりJPCERT関連の組織のようです。

https://www.antiphishing.jp/

## JNSA 日本ネットワークセキュリティ協会
特定非営利活動法人 情報セキュリティに関する様々な情報が公開されています。

https://www.jnsa.org/

## ISOG-J 日本セキュリティオペレーション事業者協議会
JNSA関連の団体のようです。活動ごとにWGがあり様々な成果物を公開しています。

https://isog-j.org/

## 日本コンピュータセキュリティインシデント対応チーム協議会
一般社団法人、シーサートにおける課題解決に貢献するための組織とのことで、各社のCSIRTが会員として加盟しているようです。

https://www.nca.gr.jp/

## JC3 日本サイバー犯罪対策センター
一般財団法人、サイバー空間全体を俯瞰し、サイバー犯罪等のサイバー空間の脅威の大本を特定・軽減・無効化することを目指す非営利団体とのことです。
会員一覧を見ると名だたる企業から警察庁まで並んでおり、とても凄そうです。

https://www.jc3.or.jp/

## 日本ハッカー協会
一般社団法人、「日本のハッカーがもっと活躍できる社会をつくる」ことを目的とした組織とのこと。

https://www.hacker.or.jp/

## 東京都産業労働局 中小企業向けサーバーセキュリティ対策の極意 ポータルサイト
中小企業向けのセキュリティ学習サイトです。情報セキュリティの脅威にはどのようなものがあるのか楽しく学べそうです。東京都内の中小企業限定のようですが、サイバーセキュリティの相談窓口もありました。
アメコミ調のイラストと独自の世界観でついつい読み進めてしまいます。

https://www.cybersecurity.metro.tokyo.lg.jp/

## 鳥取県サイバーセキュリティ対策ネットワーク
「鳥取県の安全安心なサイバー空間の構築を目指す」産・学・官が連携し、セキュリティ脅威の低減を図ることを目的とした団体のようです。
セキュリティ資料やマスコットキャラ、Youtubeなど活動が盛んに見えました。他の県にもあったりするのでしょうか。

https://www.itct-net.com/

# まとめ
各省庁サイバーセキュリティ対策に取り組んでいるようです。
まずは自組織の活動に近い情報から確認するのが良いと思いました。
Minecraftサーバー(bedrock edition/統合版)を自宅サーバーで立てる

# はじめに
自宅サーバー初心者が統合版マインクラフトを友達とマルチプレイできるようになるまでの話です。

サーバーのOSはalmalinux 8を使用しています。

# ひとりでマルチプレイする

[このサイト](https://pcvogel.sarakura.net/2022/05/14/35345)を見ながら立てました。
常時動かすサーバーにするつもりはなかったので、自動起動設定はしていません。

## 専用のユーザーを作る
マインクラフトサーバーを動かしたり、作業したりするためのユーザーを作っておきます。
~~~
sudo adduser [ユーザー名]
sudo passwd [パスワード]
~~~
ユーザーを作ったら、そのユーザーになっておきましょう。

~~~
sudo su minecraftserver
~~~

## インストールをする
先にパッケージのインストールが必要みたいです。

~~~
sudo yum install libnsl
~~~

次にインストール用のディレクトリを作って、そこにサーバーソフトウェアをダウンロードします。ここではディレクトリ名を`bedrock_server`としていますが、バージョン名を付けたり作成日時を付けたりすると後で便利かもしれません。

~~~
mkdir -p /home/minecraftserver/bedrock_server
cd /home/minecraftserver/bedrock_server
~~~

### 最新版のバージョンがわからない
私はコマンドからダウンロードしようとしたので、
~~~
wget https://minecraft.azureedge.net/bin-linux/bedrock-server-x.xx.xx.xx.zip
~~~
としようとしたものの、バージョンがわかりませんでした。
仕方がないので、windows版のダウンロードを押してzipファイルの名前を見て確認しました。

最後に、サーバーソフトウェアを展開します。
~~~
unzip bedrock-server-x.xx.xx.xx.zip
~~~
これで起動できる状態になるはずです。

## 起動するときのコマンド
ユーザーを`minecraftserver`として、ディレクトリを上記のようにすると、

~~~
su minecraftserver
cd /home/minecraftserver/bedrock_server
LD_LIBRARY_PATH=. ./bedrock_server
~~~
これで起動することになります。
3行目のコマンドはサーバーソフトウェアのダウンロードサイトに記載されているものなのですが、なんのことだかさっぱりなんですよね…

## クライアントから接続確認
Bedrock edition/統合版マインクラフトを立ち上げます。
「遊ぶ」→「サーバー」→「サーバーを追加」（最下部にあります）→「続行」
* サーバー名　任意のわかりやすい文字列
* サーバーアドレス　サーバーのローカルIPアドレス
* ポート　設定したポート（通常19132番）
設定を保存してサーバーに接続します。

# アップデートする
サーバーを使い始めて一か月が経ったころ、統合版のアップデートがかかりました。
なので時系列としては他の項目より後に行っています。しかし一人でマルチサーバーで遊んでいても行う必要があることなので先に書いておきます。
今回は、1.19.70.02から1.19.81.01にアップデートしました。

::: note info
「世界に接続できませんでした」と表示された場合は、まずはサーバーとクライアントのバージョンが同じかどうかを確認した方がよさそうです。
:::

データが消えないか怯えながら、[このサイト](https://compass-note.hatenablog.com/entry/minecrafe-be-update)を見てアップロードしました。
結局やったことは

~~~
wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.19.81.01.zip
unzip bedrock-server-1.19.81.01.zip
~~~

上書きされるかどうか聞かれるので`A`(ALL)で上書きしました。
特に設定ファイルは変更していなかったので、バックアップから戻すこともせず。
その後起動して確認しましたが、データは消えていませんでした。
色々怖がっていたのですが2行で終わってしまったので、あっけなく感じてしまいました…

# みんなでマルチプレイする
色々あって固定のグローバルIPの入手はできました。

:::note info 
ルーターはYamahaのものを使用しています。
:::

## ポートフォワーディングする
「詳細設定と情報」→「基本接続の詳細な設定」→「プロバイダの設定(or登録)」→「静的IPマスカレード関連」
で、「追加」を押して、
* プロトコル　UDP
* ポート　マインクラフト用に割り当てているポート
* 使用ホストIPアドレス　サーバーのローカルIPアドレス
で設定します。

# いつでもどこでもみんなでマルチプレイする
VPNで接続して、サーバーにマジックパケットを送りサーバーを起動し、遠隔操作してマインクラフトサーバーソフトウェアを立ち上げます。
## VPN設定をする
「詳細設定と情報」→「VPN接続の設定一覧」→「追加」
* 接続のタイプ
* ユーザー設定の登録
## VPN接続をする
今回はL2TP/IPsecを使用したので、[このサイト](https://www.seil.jp/doc/index.html#fn/pppac/use/pppac-client/win10_l2tp.html)を参考にしました。
##ルーターに接続してマジックパケットを送る
起動するときはTeraTermでルータ接続しています。"ad"と入力して管理者権限になってから、
~~~
wol send lan1 "macアドレス"
~~~
と入力しています。
コマンドは[このサイト](http://www.rtpro.yamaha.co.jp/RT/docs/wol/wol.html)を参照しました。

後はひとりでマルチプレイをするときと同じ手順です。

# 終わりに
Java版のサーバー立てについての記事はたくさんありましたが、統合版はあまり数がなく苦労しました。Linux版についてはさらに少なく感じました。参考にさせていただいたサイトの方々には感謝しています。

## 今後やりたいこと
* シェルスクリプトで起動する
* 定期的にバックアップを取る
* 権限管理をする

ここまで読んでいただき、ありがとうございました。
Windows10 の wsl で X Window System が使えないと思ったら

# 結論：Windows11にしましょう。

Windows10 の環境で wsl のバージョンを上げ、例えばターミナルで以下のようなバージョンが表示されるとします。
```
PS C:\Users\pcuser\Desktop> wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.2846
```

WSLg が来てるじゃないですかやったー、と思って Ubuntu-20.04 を呼び出して ``xeyes`` とか実行しようと思うわけですよ。
```
demouser@demopc:/mnt/c/Users/pcuser/Desktop$ xeyes
Error: Can't open display:
demouser@demopc:/mnt/c/Users/pcuser/Desktop$ xset -q
xset:  unable to open display ""
```
なんでー？？

# WSLgに対応している Windows のビルドバージョンをよく読む
詳細は https://github.com/microsoft/wslg/wiki/Diagnosing-%22cannot-open-display%22-type-issues-with-WSLg に書かれている通りなのですが、Windows のビルドバージョンは **21364 以上** を求められます。で、Windows 10 の主なビルドバージョンは以下の通りです。(2023年5月時点)

* Windows 10 (22H2) 一般提供(GAC) 19045.xxxx
* Windows 10 (21H2) 長期サービス(LTSC) 19044.xxxx

https://learn.microsoft.com/en-us/windows/release-health/release-information

* Windows 10 Inside Preview Build 21390

https://learn.microsoft.com/en-us/windows-insider/active-dev-branch

ところがもう Inside Preview Program はとっくに Windows11 になっていますので、今からこれを適用するのはお勧め出来ません。（というか2023年5月時点で出来るんでしょうか？）

というわけで普通の Windows10 では WSLg が動かないので諦めて Windows11 にするか、あるいは既に他の記事などで紹介されている、VcXsrvなどといった Xサーバプログラムを Windows10 で動かすやり方がおすすめ、ということになるようです。
2021年10月以降の情報も使用する「WebChatGPT」について

ChatGPTは2021年9月までの情報しか取り入れていませんが、その対策となるWebChatGPTについて紹介します。

<h2>WebChatGPTの特徴</h2>
<p>・Chrome拡張機能</p>
<p>・2021年10月以降の情報もchatgptに取り入れる</p>
<p>・「継続した会話ができない」「プログラム作成に使えない」「ブレインストーミングや対話型の相談には使えない」などのデメリットがある</p>
<br>
<br>
デメリットがでかいですね。ちょっとした調べごとに使うのが良さそうです。
<h2>WebChatGPTのはじめかた</h2>
<p>1.<a href= "https://chrome.google.com/webstore/detail/webchatgpt-chatgpt-with-i/lpfemeioodjbpieminkklglpmhlngfcn" >https://chrome.google.com/webstore/detail/webchatgpt-chatgpt-with-i/lpfemeioodjbpieminkklglpmhlngfcn</a>に飛びます。</p>
<p>2.「Chromeに追加」を押します。chatgptの下の方に「Web access」の項目が出てればok</p>
<h2>「Web access」の項目について</h2>
<p>「Web access」→　WebChatGPTのオン・オフ</p>
<p>「3 results」→　検索するページ数。「3 results」だったら検索した上から3ページを読み込む　ということ。でもこの数を増やしすぎるとバグが起きたりする。</p>
<p>「Any Time」→　検索期間</p>
<p>「Any region」→　検索地域</p>
<p>「Default prompt」→　chatgptに返信するプロンプト（カスタマイズ可）</p>
<h2>参考文献</h2>
<a href= "https://tipstour.net/chat-gpt-extension-webchatgpt#WebChatGPT-4">【ChatGPT】ネット上の最新情報を読み込める拡張機能「WebChatGPT」
【Swift】Localizable.stringsを使った文字列のハードコーディング対策

# はじめに
文字列のハードコーディング対策として、`extension`を使っていた。
しかし、一般的に`Localizable.strings`を利用するようなので、比較したものを記録しておく。
# ハードコーディング対策の比較
## extension
``` swift:String+.swift
import Foundation

extension String {
    static var articleTitle: String { "記事タイトル" }
    static var articleAuthor: String { "kasiwa" }
    static var articleBody: String { "記事本文記事本文記事本文記事本文記事本文記事本文記事本文" }
    static var articleCreatedAt: String { "2023/05/06" }
}
```

``` swift:ViewController.swift
import UIKit

final class ViewController: UIViewController {
    @IBOutlet private var articleTitle: UILabel!
    @IBOutlet private var articleCreatedAt: UILabel!
    @IBOutlet private var articleBody: UILabel!
    @IBOutlet private var articleAuthor: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        articleTitle.text = String.articleTitle
        articleCreatedAt.text = String.articleCreatedAt
        articleBody.text = String.articleBody
        articleAuthor.text = String.articleAuthor
    }
}

```

## Localizable.strings
``` swift:Localizable.strings
"ArticleTitle" = "記事タイトル";
"ArticleAuthor" = "kasiwa";
"ArticleBody" = "記事本文記事本文記事本文記事本文記事本文記事本文記事本文";
"ArticleCreatedAt" = "2023/05/06";
```

``` swift:ViewController.swift
import UIKit

final class ViewController: UIViewController {
    @IBOutlet private var articleTitle: UILabel!
    @IBOutlet private var articleCreatedAt: UILabel!
    @IBOutlet private var articleBody: UILabel!
    @IBOutlet private var articleAuthor: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        articleTitle.text = NSLocalizedString("ArticleTitle", comment: "")
        articleCreatedAt.text = NSLocalizedString("ArticleCreatedAt", comment: "")
        articleBody.text = NSLocalizedString("ArticleBody", comment: "")
        articleAuthor.text = NSLocalizedString("ArticleAuthor", comment: "")
    }
}

```

# プレビュー
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802393/79647cfe-9fee-911f-2393-9abd2b70178e.png">

# おわりに
個人的には、`extension`でハードコーティング対策を行う方が書きやすい。

`Localizable.strings`は国ごとにファイルが分かれており、ローカライズ対応がしやすいというのはメリットかもしれない。

また、`Localizable.strings`に対して、`R.Swift`を使うと、コード内での取り回しが良くなるらしい。
後日、これも検証したい。

# 参考リンク
[[iOS] ゼロから始める！簡単！多言語対応！](https://qiita.com/simorgh3196/items/c9b04377dfa1425085c3)
[SwiftUIで多言語化に対応してプレビューで確認する](https://dev.classmethod.jp/articles/swiftui-localization/)
[[iPhone] 多言語対応、Localizationの設定](https://i-app-tec.com/ios/localization.html)
RubyでAtCoder ABC266(A, B, C)を解いてみた

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

# A - Middle Letter
https://atcoder.jp/contests/abc266/tasks/abc266_a
```ruby:a-266.rb
s = gets.chomp
puts s[(s.size - 1) / 2]
```

# B - Modulo Number
https://atcoder.jp/contests/abc266/tasks/abc266_b
```ruby:b-266.rb
puts gets.to_i % 998244353
```
## 解説
`N-x=k*998244353(kは整数)`より、`x=N%998244353`となります。

# C - Convex Quadrilateral
https://atcoder.jp/contests/abc266/tasks/abc266_c
```ruby:c-266.rb
# 修正前
def cross(x, y, z)
  return (z[0] - y[0]) * (x[1] - y[1]) - (z[1] - y[1]) * (x[0] - y[0])
end

a, b, c, d = Array.new(4){ gets.split.map(&:to_i) }

[[a, b, c], [b, c, d], [c, d, a], [d, a, b]].each do |array|
  if cross(array[0], array[1], array[2]) <= 0
    puts "No"
    exit
  end
end
puts "Yes"
```
```ruby:c-266.rb
# 修正後
require "matrix"

module CycleEachConsToArray
  refine Array do
    def cycle_each_cons(n)
      return Enumerator.new{ cycle_each_cons(n, &_1) } unless block_given?

      cycle.each_cons(n).take(length).each{ yield _1 }
    end
  end
end

using CycleEachConsToArray

a, b, c, d = Array.new(4){ gets.split.map(&:to_i) }
def coss(a, b, c, d)
  edges = [a, b, c, d].cycle_each_cons(2).map do |p1, p2|
    [p2[0] - p1[0], p2[1] - p1[1]]
  end
  return edges
end

coss(a, b, c, d).cycle_each_cons(2).each do |edge1, edge2|
  if Matrix[edge1, edge2].det <= 0
    puts "No"
    exit
  end
end
puts "Yes"
```
## 解説
（公式解説を参考にしました）
外積の値が0または負となるものは180度以上となります。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166

## 参考
https://qiita.com/scivola/items/7ca5bf95f91f58589cfd#_reference-f27f28a7d4c5ce2d6347
シェルスクリプトで引数に変数を渡すときの挙動に翻弄された


## はじめに

シェルスクリプトの学習をはじめてしばらくは、変数展開の挙動がよくわからないなと思っていました。　　
原因は、代入するときと引数に渡すときの挙動に違いがあることをわかっていなかったからでした。

## よくわからなかった挙動　　

展開や置換時に`"`で囲むと、一つの固まりとして展開できるということは漠然と知っていました。　　
なので、次のような挙動には納得感がありました。

```text:input.txt
a,b,c
d,e,f
g,h,i
```

```shell:echo.sh
echo $(cat ./input.txt)
# => a,b,c d,e,f g,h,i

echo "$(cat ./input.txt)"
# => a,b,c
# => d,e,f
# => g,h,i
```

このように、`"`で囲ったら`$(cat ./input.txt)`は元の状態を維持して、囲わなかったら一列に変形されてしまうんだなと思いました。　　

しかし…  

```shell:echo1.sh
input1=$(cat ./input.txt)

echo $input1
# => a,b,c d,e,f g,h,i

echo "$input1"
# => a,b,c
# => d,e,f
# => g,h,i
```

`echo $input1`の結果は予想通りですが、`echo "$input1"`は予想と違います。　
`"`で囲っていない`$(cat ./input.txt)`を代入しているのだから、`input`には一列になってしまった文字列が入っているはず。echoがいい感じにしてくれているのだろうか、などと思っていました。　　
　
当然次のように`"`で囲った代入の場合でも、予想と異なった出力になりました。

```shell:echo2.sh
input2="$(cat ./input.txt)"

echo $input2
# => a,b,c d,e,f g,h,i

echo "$input2"
# => a,b,c
# => d,e,f
# => g,h,i
```

## 原因　　

コマンドの引数として渡す時、
* `"$input"`は、`input`という変数を参照した値を**1つの**引数として渡される。　　
* `$input`は、参照した値を**区切り文字で分割して**引数として渡される。

という挙動を知らなかったからでした。
bashの区切り文字の初期設定にスペースや改行が含まれるため[^1]、改行を含んだ`$input`は`"`で囲んでいるか否かで結果が変わったのでした。
一方で代入時にはそのような変換は行われないため、改行は改行、スペースはスペースとして素直に代入されます。そのため今回の例では、右辺の`"`の有無で`input`の内容に差がつかったことになります。

## 確かめてみる　

```text:input.txt
a,b,c
d,e,f
g,h,i
```
```shell:func.sh
func ()
{
    echo "\$1 : $1"
    echo "\$2 : $2"
    echo "\$3 : $3"
}

input=$(cat ./input.txt)

func $input
# => $1 : a,b,c
# => $2 : d,e,f
# => $3 : g,h,i

func "$input"
# => $1 : a,b,c
# => d,e,f
# => g,h,i
# => $2 : 
# => $3 : 
```
引数を`$input`とすると3つの引数として渡され、`"$input"`とすると1つの引数として渡されています。後者は改行も維持されていますね。　　
ちなみに`input`への代入時に`"$(cat ./input.txt)"`としても出力は同じになりました。　　

## おわりに

今回のものがシェルスクリプト特有の挙動であるのかはわかりませんが、言語ごとに特有の仕様があるのは当然なので、誤った認識のまま学習を進めないように気をつけようと思いました。


[^1]: https://www.server-memo.net/shellscript/ifs.html
Docker で PostgreSQL を動かす

イメージのダウンロード

```bash
docker pull postgres:latest
```

## 確認

```text
$ docker images
REPOSITORY             TAG           IMAGE ID       CREATED        SIZE

postgres               latest        bf700010ce28   2 days ago     379MB
```

## 起動

```bash
docker run -d --name=postgres -p 5432:5432 -e POSTGRES_PASSWORD=tiger123 postgres
```

bash で接続

```bash
docker exec -it postgres bash
```

```text
$ docker exec -it postgres bash
root@4ba8607d4e37:/# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@4ba8607d4e37:/#
```

## DB に接続

```bash
psql -U postgres -h 127.0.0.1
```

```text
$ psql -U postgres -h 127.0.0.1
Password for user postgres: 
psql (15.2 (Ubuntu 15.2-1))
Type "help" for help.

postgres=# 
```

ユーザー と　データベースを作成

```text
postgres=# create user scott with password 'tiger123';
CREATE ROLE
postgres=# create database city;
CREATE DATABASE
postgres=# alter database city owner to scott;
ALTER DATABASE
postgres=#
```

## 作成したユーザーで、作成したデータベースに接続

```bash
psql -U scott city -h 127.0.0.1
```

```text
$ psql -U scott city -h 127.0.0.1
Password for user scott: 
psql (15.2 (Ubuntu 15.2-1))
Type "help" for help.

city=> 
```
addEventListenerの構文と(e)について

# 対象者

* javascript初学者


# addEventListener構文

まず役割2つあります。

①イベント発生時に関数を呼び出す.  
②イベントオブジェクト（e）を生成する。

①について.  
構文
```
○○.addEventListener(A,B)
○○がAされたらBを実行する。
A=イベント
B＝関数
```
例　
```
button.addEventListener(“click”,output )
function output{console.log(“ボタンが押されました”)}
```
意味
ボタンがクリックされたらoutputという関数を実行する.  
output = コンソールにボタンが表示されましたと表示する


②に関して.   
イベントオブジェクト（e）＝addEventListenerの第一引数（click）の情報がたくさん詰まっている.
例えば
イベントを発生させた要素やクリック位置に関するものなど。
![スクリーンショット 2023-05-05 23.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602256/9acb24b1-51dd-36cf-7025-2df809d2798a.png)




 # 参考情報

https://fuuno.net/nani/nani04/nani04.html
エクセルのVBAで複数シートを一括印刷

# 概要

エクセルで Ctrl + P すると『現在選択しているシートのみ』の印刷プレビューとなる。
なので、複数シートを全て印刷したい場合、『シート選択してCtrl + P』を繰り返す必要がある。
これだと手間だし、印刷漏れ（シート選択漏れ）の可能性もある。

VBAで複数シートを一括印刷したい。

# やり方（基本）

まず、下記のように3シートがある前提。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6da511f0-76b8-fbaf-109c-de0fa0764174.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/32cfda9e-f12c-73a2-da6b-224241f04e67.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7534f804-a607-b335-7b37-07bc30ae7f5e.png)
改ページなどの印刷レイアウトの調整がしやすいよう、『印刷ボタンを置くシート』『印刷対象のシート』を分けています。


```vb:印刷対象シート一覧が固定の場合のサンプル
Option Explicit


'『btn_1』という名前のボタンをクリックした時の動作
Private Sub btn_1_Click()

    Dim sheet_list_(1) As String
    sheet_list_(0) = "s1"
    sheet_list_(1) = "s2"
    
    '印刷用のボタンを置いているシートは印刷対象外。
    
    'シート名の配列を渡してあげることで、複数シートの一括印刷が可能。
    'Preview:=Trueでプレビュー画面を挟むことも可。
    Sheets(sheet_list_).PrintOut Preview:=True

End Sub
```

ボタンを押すと下記のように2シート分ひとまとめになった印刷プレビュー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cd80ee4f-3b7f-1681-fc19-021438cd76d1.png)
左上の印刷ボタンを押すと **『通常使うプリンター』** で即印刷。
（どのプリンターで印刷するかの選択肢的なものは出ない）

# やり方（応用）

```vb:一番左のシートだけ除外して、他シートは全て印刷するサンプル
'『btn_1』という名前のボタンをクリックした時の動作
Private Sub btn_1_Click()

    
    '下記をやろうとすると『定数式が必要です』というコンパイルエラーになる。
    'Dim sheet_list_(Sheets.Count - 2) As String
    'なので一旦要素数無しで変数宣言してReDimで初期化が必要。
    
    '一番左の『印刷ボタンがあるシート』は除外する。
    'また、配列の初期化は『要素数』ではなく、『最大インデックス』なのでSheets.Countから-2。
    
    Dim sheet_list_() As String
    ReDim sheet_list_(Sheets.Count - 2)
    
    Dim i_ As Long
    '左から2番目シートから一番右端シートまでループ。
    For i_ = 2 To Sheets.Count
        '配列のインデックスは0スタートだが、Sheets()は1スタート。
        'またループが2からスタートしているので、配列のインデックスは-2する。
        sheet_list_(i_ - 2) = Sheets(i_).Name
    Next

    Sheets(sheet_list_).PrintOut Preview:=True


End Sub
```

# 非表示シートを印刷プレビューすると例外になるので注意

下記のような例外になる。

>実行時エラー1004
>SheetsクラスのPrintOutメソッドが失敗しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/756c385e-b928-08e9-eb5f-970236d0ff11.png)

**『エクセルファイル内に非表示シートがあると例外』**
ではなく
**『非表示シートを印刷プレビューすると例外』**
です。

非表示シートが存在しても、それを印刷対象にしなければ例外にはならない。


# 参考サイトさん

https://qiita.com/waokitsune/items/3e703c2f18a79e34587c

https://sugoikaizen.com/excel_list/vba-macro-03/

https://daitaideit.com/vba-printout/

# バージョン

Windows 10 Pro 22H2 19045.2913
Microsoft Excel for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
printf()の指数表示で指数部が3桁になる

Windows で C のプログラムを書いている際、printf()の浮動小数点数の出力において指数表示を指定すると、指数部が3桁で表示されることがあるのですが、これは導入した C コンパイラが古い MSVC のライブラリをリンクすると起きるようです。

```
#ifdef _TWO_DIGIT_EXPONENT
unsigned int oldexpform = _set_output_format(_TWO_DIGIT_EXPONENT);
#endif 
```

などと`main()`冒頭あたりに書いておけば多分解決。

本当は何故そのようなリンクが起きるのかを書くべきなんですが、ちょっとそこまで追究せずに環境を作り直しちゃったので、すいませんがメモ止まりということで。

参考：https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/set-output-format?view=msvc-170
ストワで始めるLua第七回追尾レーダーのコード

動画はこちら

https://www.nicovideo.jp/watch/sm42182058

https://www.nicovideo.jp/watch/sm42182080

コメントで動画との修正点が入れてあります
修正した場合、PIDの調節は必要です、Pを4あたりすると良いかも。
日本語はStormworksのLua内で使えないので必ず削除して下さい。

```lua:tracking radar

pi=math.pi
pi2=pi*2

function onTick()
	local fov,Azimuth,Elevation,rotAzimuth,rotElevation

	data={}

	--camera fov
	fov=input.getNumber(4)
	fovRadian= -2.175*fov+2.2

	--dcs angle
    --動画ではpi2わすれてる1
	Azimuth=input.getNumber(8)*pi2
	Elevation=input.getNumber(12)*pi2
	isLock=input.getBool(10)

	for i=0,7 do
		if input.getBool(i+1) then
			local d,x,y
			d=input.getNumber(i*4+1)
			x=input.getNumber(i*4+2)*pi2
			y=input.getNumber(i*4+3)*pi2
			table.insert(data,{d=d,x=x,y=y})
		end
	end

	if isLock and #data>=1 then
		local bufferI
		for i=1,#data do
        --ここなんか微妙だったのでなおした
			if i==1 then
				bufferI=1
			elseif data[bufferI].x^2+data[bufferI].y^2 > data[i].x^2+data[i].y^2 then
				bufferI=i
			end
		end
		rotAzimuth=Azimuth+data[bufferI].x
		rotElevation=Elevation+data[bufferI].y
	else
		rotAzimuth=Azimuth
		rotElevation=Elevation
	end

    --動画ではpi2わすれてる2
	output.setNumber(1,rotAzimuth/pi2)
	output.setNumber(2,rotElevation/pi2)
end

function onDraw()
	local cw,ch,echoX,echoY,rad2pixel
	w=screen.getWidth()
	h=screen.getHeight()
	
    --center
	cw=w/2
	ch=h/2

    --draw radar echo
	screen.setColor(0, 255, 0, 200)
	rad2pixel=w/fovRadian
	for i=1,#data do
		echoX=cw+data[i].x*rad2pixel
		echoY=ch-data[i].y*rad2pixel
		screen.drawCircle(echoX,echoY,5)
	end

	--crosshair
	screen.setColor(0, 255, 0, 100)
	screen.drawLine(cw,0,cw,ch-5)
	screen.drawLine(cw,ch+5,cw,h)
	screen.drawLine(0,ch,cw-5,ch)
	screen.drawLine(cw+5,ch,w,ch)

	--display 
	if isLock then
		screen.setColor(255, 0, 0)
		screen.drawText(0,0,"Lock")
	end

end

```