OmniAICreator/Qiita-1.07M huggingface dataset:
ラグランジュ双対問題の強双対性について2/2

# はじめに
前回、ラグランジュ双対問題の強双対性について1/2では、分離定理と弱双対性を説明しました。本記事では、ラグランジュ双対問題の強双対性について説明します。


https://qiita.com/momo10/items/b296eda7146b15f68310



# 強双対性
>**定義(Slater条件)**
>相対的内点があるとする。つまり、$\tilde{x}\in\text{relint}\mathcal{D}$があるとする、
> ```math
>h_i(\tilde{x})<0 \ \ (1\leq i \leq l)
>```
> ```math
>r_j(\tilde{x})=a_j^T\tilde{x}+b_j=0 \ \ (1\leq j \leq m)
>```

> **定理3**
>主問題が凸最適化問題であり、Slater条件を満たすとする。
>このとき、ある$\lambda^\ast\geq0$と$\nu^\ast\in\mathbb{R}^m$があり、
> ```math
> g(\lambda^\ast,\nu^\ast)=d^\ast=p^\ast
> ```
>が成り立つ。

**証明**

$\mathbb{R}^l\times\mathbb{R}^m\times\mathbb{R}$の部分集合$\mathcal{A}$を導入する。

```math
\mathcal{A}
=\lbrace (u,v,t)\in\mathbb{R}^l\times\mathbb{R}^m\times\mathbb{R}|
x\in\mathcal{D}, \ 
u_i\geq h_i(x), \ 
v_j=r_j(x), \ 
t\geq f(x)\rbrace
```

主問題の最適値は、
```math
p^\ast = \inf\lbrace t \in\mathbb{R}|(0,0,t)\in\mathcal{A}\rbrace
```

を満たす。

Slater条件より$p^\ast<\infty$である。
$p^\ast=-\infty$のとき、弱双対性より$p^\ast=d^\ast=-\infty$であるので、$p^\ast$が有限値の場合を考える。

$\mathbb{R}^l\times\mathbb{R}^m\times\mathbb{R}$の凸集合$\mathcal{B}$を導入する。

```math
\mathcal{B} = \lbrace(0,0,s)\in\mathbb{R}^l\times\mathbb{R}^m\times\mathbb{R}| s<p^\ast\rbrace
```

$\mathcal{A}\cap \mathcal{B}=\phi$であるので、分離定理が適用できる。

```math
\begin{eqnarray}
(u,v,t)&\in \mathcal{A} \implies \lambda^Tu + \nu^Tv+\mu t\geq \alpha\\
(u,v,t)&\in \mathcal{B} \implies \lambda^Tu + \nu^Tv+\mu t\leq \alpha
\end{eqnarray}
```

$\mathcal{A}$の$u$と$t$は、いくらでも大きくできるが、下から$\alpha$で抑えているので、$\lambda\geq 0$と$\mu\geq 0$という条件が必要である。

$(u,v,t)\in \mathcal{B}$とすると、$t<p^\ast$である。
$\mu\geq 0$より、$\mu p^\ast>\mu t$である。

```math
\begin{eqnarray}
&\lambda^Tu + \nu^Tv+\mu t\leq \alpha\\
&\mu t\leq \alpha  \ \ (\because 簡略化)\\
&\mu p^\ast\leq \alpha \ \ (\because t\rightarrow p^\ast)
\end{eqnarray}
```

よって、
```math
\sum_{i=1}^{l}\lambda_{i}h_{i}(x)+\sum_{j=1}^{m}\nu_{j}r_{j}(x)+\mu f(x)\geq
 \mu p^\ast
 ```

---

 $\mu\neq 0$のとき、
```math
\sum_{i=1}^{l}\dfrac{\lambda_{i}}{\mu}h_{i}(x)+\sum_{j=1}^{m}\dfrac{\nu_{j}}{\mu}r_{j}(x)+ f(x)\geq
 p^\ast
 ```

弱双対性より、

```math
p^\ast
\geq
g(\lambda^\ast,\nu^\ast)
=
\sum_{i=1}^{l}\dfrac{\lambda_{i}}{\mu}h_{i}(x)+\sum_{j=1}^{m}\dfrac{\nu_{j}}{\mu}r_{j}(x)+ f(x)\geq
 p^\ast
 ```

 よって、強双対性をえる。

```math
 g(\lambda^\ast,\nu^\ast)=d^\ast=p^\ast
 ```

---

$\mu= 0$のとき、

```math
\sum_{i=1}^{l}\lambda_{i}h_{i}(x)+\sum_{j=1}^{m}\nu_{j}r_{j}(x)\geq
0
\tag{2}
 ```

Slater条件の$r_j(x) = 0$から
 ```math
\sum_{i=1}^{l}\lambda_{i}h_{i}(x)\geq
0
 ```
Slater条件の$h_i(x)<0$と、$\lambda_i\geq0$であるので、$\lambda_i=0$となる。

よって、式(2)は、

 ```math
 \sum_{j=1}^{m}\nu_{j}r_{j}(x)=\nu^T(Ax+b)\geq0
 ```

Slater条件の$r_j(\tilde{x}) = 0$から、
 
 ```math
 \sum_{j=1}^{m}\nu_{j}r_{j}(\tilde{x})=\nu^T(A\tilde{x}+b)=0
 ```
 
もし、$\nu^TA\neq 0$であるならば、$x^\prime\in B(\tilde{x},\varepsilon)$において、$\nu^T(Ax^\prime+b)$が正負をとりうるため、Slater条件を満たさなくなる。

よって、$\nu^TA= 0$でなければならない。さらに、$A$は逆行列をとれるため、$\nu = 0$をえる。

しかし、分離定理より、$(\lambda,\nu,\mu)\neq0$であるので矛盾する。

よって、$\mu\neq 0$である。

# 参考文献
- カーネル法入門、福水健次、朝倉書店
- 凸解析と最適化理論、田中謙輔、牧野書店
- 非線形最適化の基礎、福島雅夫、朝倉書店
- Convex Optimization、S. Boyd、L. Vandenberghe、CAMBRIDGE UNIVERSITY PRRESS
Python インストール、環境構築

## Python インストール、仮想環境構築
本記事ではPythonのインストールと環境構築手順について記載する。

以下目次の通り
1. Pythonとは
1. Pythonインストール手順
1. Python仮想環境構築

また、今回は「Windows」環境で実行している。

#### Pythonとは
Pythonはオランダ人のグイド・ヴァンロッサム氏によって開発された言語
近年では、AIやIoTの発展により注目を集めている。

###### 特徴
- コードの記述が短くシンプル
- 初心者でも比較的容易に利用可能
- ライブラリなど機能が豊富
- データの収集やデータ分析などにも強い

#### Pythonインストール手順
Pythonのインストール手順について記載する。
##### 1. [Python公式HP](https://www.python.org/downloads/)に接続する
##### 2. ダウンロードページに遷移する
メニュー欄の「Downloads」から使用しているOSを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761023/fead81ff-540d-c598-9f7b-5479a91fd305.png)

##### 3. ダウンロードしたいバージョンをダウンロードする
Pythonパッケージの種類については用途別でダウンロードすると良い
- installer：オーソドックスなインストーラ
- embeddable package：ソフトウェアの開発・提供者などが自身のソフトウェアにPythonのプログラムを含めて2次配布をする際などに使われるファイル
- executable installer：ネット環境が無くてもインストールが可能
- web-based installer：ネットワーク経由でインストールする形式

##### 4. ダウンロードしたインストーラを実行
赤丸の二つにチェックを入れて「Customize installation」を選択する
下の「Add Python3.6 to Path」はPythonへのPathを自動で設定してくれるもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761023/45b90470-9a9d-5dd1-57ba-b6eb76ca3b33.png)

##### 5. すべてにチェックがついてることを確認して「Next」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761023/00e1cb59-ab5a-78e2-765a-82c8c4be8868.png)

##### 6. 「Install for all users」にチェックをつけて「Install」を選択
すべてのユーザーで使用できるようにするため、チェックをつける。
※必要なければそのまま「Install」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761023/4583052d-de23-c046-6dc3-373cc675622d.png)

##### 7. 下図の文字が表示された場合
Pathに対する文字制限をつけるもののための設定。
必要なければ「Close」
必要であれば青文字を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761023/3f198012-dfe1-4306-bf6a-fe007480d77c.png)

##### 8. インストール完了確認
コマンドプロンプト上で以下コマンドを実行し、実行結果を確認する
`py -version`
＜実行例＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761023/20f9d5a9-e729-7bdc-04b3-9f955a7adbf4.png)

以上で、Pythonのインストールが完了となる。

#### Python仮想環境構築
続いてPythonを使用した仮想環境構築手順を記載する。

##### 1. フォルダを作成
仮想環境を構築するフォルダを作成する。
今回は「python_study」フォルダに作成する。

##### 2. 仮想環境作成
以下コマンドを実行し、仮想環境を構築する。
本記事の環境名は「test」とする。
`python -m venv test`

「test」フォルダが作成され、以下構成となっていれば成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761023/57f23ba4-cd79-584a-7e94-0192d6b5df9f.png)

##### 3. 環境接続
以下コマンドを実行し、仮想環境に接続する。
`test\Scripts\activate`

以上がPythonの環境構築手順と接続方法である。
Azure Log Analytics / Microsoft Sentinel で IP アドレスに国情報を付与する (KQL ビルトイン関数)

# 1. はじめに
以前、Azure Log Analytics / Sentinel を用いて、送信元/宛先 IP アドレスの国情報を判定させるために、Maxmind GeoLite2 Country Database にルックアップして出力するテクニックを記事にしたのですが、

https://qiita.com/hisnakad/items/a64293ca857799030a43

**2023.6 時点で、KQL 側になんと組み込まれていました!!**
``geo_info_from_ip_address`` を用いれば、常に Azure 基盤側で最新の GeoLite2 Database を参照することが出来るようになっています。

https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/geo-info-from-ip-address-function

# 2. 触ってみる
Azure Firewall IDPS シグニチャ検出の送信元 IP を ``geo_info_from_ip_address`` 関数を用いて参照します。

```sql
AZFWIdpsSignature
| extend geoinfo = geo_info_from_ip_address(SourceIp)
| extend GeoCountry = tostring(geoinfo.country)
| extend GeoCity = tostring(geoinfo.city)
| extend GeoLatitude = tostring(geoinfo.latitude)
| extend GeoLongitude = tostring(geoinfo.longitude)
```
参照された情報は JSON で ``city`` / ``country`` / ``latitude`` / ``longitude`` / ``state`` の情報が返されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/90852f22-d71b-5bae-b411-a87baab97e04.png)

参照元の GeoLite2 Country/City Database の精度に依存しますが、``city`` 情報の精度はそれほど高くないようで、``NULL`` で戻ってくるケースもあるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/4342a1dd-9a29-4a0e-440c-ea0bd2d34c7d.png)

[公式 Docs](https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/geo-info-from-ip-address-function#returns) にも掲載が有る通り、IP Location 情報は本質的に不正確なので、あまり精度を気にせず接続元の目安が分かる程度の使い方がお勧めになります。

>IP 位置情報は本質的に不正確です。場所は、多くの場合、人口の中心に近いです。 この関数によって提供される場所は、特定の住所や世帯を識別するために使用しないでください。

# 3. 可視化してみる
Azure Monitor ブックの視覚化「マップ」より、接続元を可視化してみます。
マップの可視化の詳細は以下[公式 Docs](https://learn.microsoft.com/ja-jp/azure/azure-monitor/visualize/workbooks-map-visualizations) を参照下さい。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/visualize/workbooks-map-visualizations

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/dd25dc92-7c44-94ee-62ca-af26ecff6d4a.png)

「マップの設定」より、「国または地域」を選択し、「国/地域フィールド」の欄に KQL で集計した国情報のフィールド（上記例だと ``GeoCountry``）を適用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/2a2c6e5b-96ad-446f-a09d-99f9668fe564.png)

設定を正しく完了すると以下のようなマップ情報が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/2e8b1727-f10d-dc12-bcf0-548c7119e86e.png)

``geo_info_from_ip_address`` の応答値から、緯度/経度を使ったり、国 ``country`` ではなく都市 ``city`` をマッピングも出来ますが、地図情報に当て込むと大きさからほとんど変わらないような気がします。
そもそも IP Location 情報の精度は参考値なので、あまり厳密に設定するのではなく、国情報レベルの可視化が良いのかもしれません。

https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/geo-info-from-ip-address-function#returns

# 4. まとめ
これまで Maxmind GeoLite2 Country/City DB をお客様側が用意していましたが、Azure 基盤側で提供されたことによってかなり楽になります。本記事がどなたかの参考になれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。

6.参考情報

https://azure.microsoft.com/en-us/updates/geo-ip/

https://zenn.dev/microsoft/articles/61a98d50e5218f

https://techcommunity.microsoft.com/t5/azure-observability/geolocation-query-from-ip-address/m-p/310242
[Next.js + firebaseHosting] hosting時にリロードするとNotFoundが出てしまう時の解消法

フロントエンドの知識がなく、用語がうまく検索できずに困っていた。

## 参考記事
ほぼこれ。

https://zenn.dev/tsuxxx/articles/97127869ae2c4b

## 困ってたこと
firebaseHosting上にホストしてるサイトで、Next.jsでのルーティングパスと表示されるサイトが違うことにより、ページをリロードすると404 NotFoundが出てしまっていた。

## 原因
Next.jsのビルドされて生成したファイルは`/XXX.html`であるのに対し、ホスティングされたサイトでは`/XXX`が呼ばれており、指定されたパスにファイルがなかったのことが原因だった。

以下の解決方法は`(firebase hostingのURL)/XXX`では表示されず`(firebase hostingのURL)/XXX.html`でページが表示される場合に有効である。

## 解決法
Firebaseのhostingの設定ファイルを書き換える。

https://firebase.google.com/docs/hosting/full-config?hl=ja#rewrites

```json:firebase.json
{
  "hosting": {
    "public": "out",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "trailingSlash": true,
    "rewrites": [
      {
        "source": "/search",
        "destination": "/search.html"
      },
      // [id].htmlは以下のように設定する
      {
        "destination": "/page/[id].html",
        "regex": "^/page/([^/]+?)(?:/)?$"
      },
      ...
     }
    ]
  }
}
```

上記のように設定したらリロードしてもNotFoundが出なくなった。
VS Codeアップデートしてみた！

## 最初に
今、使用しているVScodeのアップデートが正式公開されたのでアップデートしてみました！

※日本時間4月5日に、2024年3月アップデート(V1.88.0)を正式公開

## 手順
①上部タブから更新を実行
更新後だと↓のように「更新の確認」と表示されます。
バージョンが古いと、「更新して再起動」（おそらく...スクショとるの忘れました）という表示がされるのでクリック
![スクリーンショット 2024-04-08 17.57.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/88c05d42-03c6-512d-c7ca-b592f73fd600.png)

②再起動後バージョン確認
![スクリーンショット 2024-04-08 18.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/4303e06a-8fea-f8a2-8c43-440ed54cb529.png)
↓
![スクリーンショット 2024-04-08 18.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/e4c6ce46-e318-79c5-c550-3dcd4a3245ac.png)

バージョンが「1.88.0」になっていればOK:thumbsup:

## 新機能の例
ミニマップに、セクションヘッダーが大きく表示されるようになる。
【やってみた】
![スクリーンショット 2024-04-08 18.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/dfcfb055-5cdc-0ebc-ee1f-96c24c01b87e.png)
↓
↓　 #regionを追加すると
↓
![スクリーンショット 2024-04-08 18.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/5ba8024b-bc51-0431-ef73-8040f0e2d08a.png)

見えづらいですが、右のミニマップに「Sample」の文字が大きく表示されています。

## 最後に
ネット記事を見ていたら、普段使用しているVS Codeがアップデートされたのを発見。
さっそくやってみました。バージョン更新も非常に簡単なのでみなさん、ぜひ参考に！

## 参考記事
[VS Codeアップデート](https://forest.watch.impress.co.jp/docs/news/1582541.html)
用語定義：閉鎖系と開放系、完全性と不完全性

組織の中で、用語を定義したがる人がしばしばいる。
用語を定義した方が、なにか生産性があがるとか、意思疎通が容易になるという信仰かもしれない。

立場が違えば、用語をいくら定義しても、意味が違うという現象を受け入れようとしない人たちかもしれない。

整合性のある用語定義は、必ずしも望ましくないのは用語定義に内在する課題である。
整合性があると、その時点で系の発展が止まってしまうかもしれない。

整合性のある用語定義を閉鎖系と呼んでみよう。
本当に整合性のある用語定義ができるのだろうか。

不完全性定理をそれほどよくわかっているわけではない。
完全な用語定義があれば、ぜひ拝見したい。

できれば、３つ以上の立場が違っても、共通で利用できる用語定義の例があると嬉しい。

プログラミング言語であれば、完全な用語定義ができるかもしれない。
プログラムを書く人と、プログラムを読む人と、プログラムを動かす人で、共通の用語定義は可能かもしれない。
プログラミング言語は閉鎖系であってもよいかもしれない。

あるいは、C言語のように、C言語の関数自体を作って拡張できるような系を開放系と読んでもよい。

自然言語の用語定義は、原則開放系で、いつでも新しい事態を表現できる能力を持っていることが好ましいかもしれない。

用語定義の抱える課題を、AUTOSAR `Glossaryに限定せずに分類してみる。



<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.


# 歴史的用語
昔からそう呼んでいて、実体がかわったのに、用語を変えていない場合。

## 対称用語の食い違い
### ROM, RAM
ROM（Read Only Memory)の対称語はRead Write Memoryだろう。
RAM(Random Access Memory)の対称後は、Sequencial Access Memoryだろう。


# 用語の衝突
まぎらわしい、間違えやすい、行き違いの多い略号worst 10(候補24)
https://qiita.com/kaizen_nagoya/items/0bff5dbb72208053489b

English 短縮名。用語の衝突(用語・用例募集中)。英語(3) 仮説(88)
https://qiita.com/kaizen_nagoya/items/6a8eb7ffaa45eeb16624

overlapped definition in AUTOSAR abbreviation *1
https://qiita.com/kaizen_nagoya/items/9a171ee6a74163d128e9

# 集合
programmerとuserは、共通部分集合があると想定できる。
programmerは、プログラムも組むUserであれば、userの部分集合になる。
progrmmerが、プログラムを組むだけで利用しなければ、userではないプログラマがいることになる。

ある組織で役割分担をして共通部分集合を空集合として定義しているかもしれない。
プログラマは使っちゃだめとか、Userはプログラムしちゃだめとか。

組織で集合関係をどう決めるかで、言葉の構造と範囲が違ってみえることになるかもしれない。

## 集合の歴史的変化
AUTOSAR Foundation分類する前のAUTOSARは、AUTOSARは、現在のClassic Platform（CP)を指していた。
それまでの文書を読むときは、AUTOSAR(CP)と文脈依存で補足しながら読むとよい。

現在でも、CPからFOへの文書分類移行、APからFOへの文書分類移行がある。
その時代によって、FO,CP, APの集合関係がかわっていることを把握しているとよいかもしれない。

別の観点では、AUTOSARという用語は、３つの分類に共通な概念だけで理解しているとよいかもしれない。
現在は、まだFOに分類していなくても、AP,CPに共通の機能を定義していれば、AUTOSARと捉えてもいい。




# AUTOSAR 55 Glossary, issue, propose and possible resolution 

Glossary Terms and Definitions , AUTOSAR 55, R23-11 FO
https://qiita.com/kaizen_nagoya/items/f800ce05e472a89fc98e

を書き始めて、迷いが生じている。

課題、提案、可能な解決策についてえ、どこに力点を置くとよいか。


＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.


# 文書履歴(document history)
ver. 0.01 初稿 　20240308
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Comprehensive RAG BenchmarkのAIコンペに参加する

AIcrowdでRAGのコンペが開催されているので、参加してみる。[AIcrowd](https://www.aicrowd.com/, "AIcrowd")はAIに特化したKaggleみたいなコンペ開催コミュニティだ。
[CRAG: Comprehensive RAG Benchmark](https://www.aicrowd.com/challenges/meta-comprehensive-rag-benchmark-kdd-cup-2024)
このコンペは、Meta社が開催するRAGを用いた言語モデルのコンペだ。

## CRAGはどんなコンペ？
５つのドメインからの質問をどう答えるかを競うコンペだ。
Taskは３種類あって、徐々に複雑になっていくようです。
* Task #1
5ページのウェブページを使って要約する。
* Task #2
5ページの要約とMock APIを使用して回答を返す。Mock APIとは質問から生成されたパラメータを受け付けて、回答形式のための関連データを取り出す機能を持っている。
* Task #3
50ページのウェブページとMock APIを使って関連する内容とノイズを含めた質問に対して回答を行う。

### どんな言語モデルを使うのか？
Meta社提供の大規模言語モデル[llama 2](https://llama.meta.com/llama2/, "llama")を使います。llamaは以前、仕事で使おうとしたがうまく実装できなかったので利用できなかった。今回は、頑張ろう。

## 実行マイルストーン
* 登録
チームを作るけど、誰か一緒にチーム組んでくれるかな。コミュニケーションコストもかかるし、大変そうだな。
* 環境構築
まずはTask #1に挑戦。[Starter Kit](https://gitlab.aicrowd.com/aicrowd/challenges/meta-comprehensive-rag-benchmark-kdd-cup-2024/meta-comphrehensive-rag-benchmark-starter-kit/)があるので、これをgit cloneして始めよう。開催コンペでクラウド環境は与えられていないみたい。だから自分のパソコンのVirtual Box環境で構築した。
* 最初の動くプログラムの実装
これができれば後は楽なんだけど。
* サブミットの確認
だいたいここらへんでこけるんだよなあ。
* チューニング
楽しいチューニングの時間
* 優勝者の発表
どこまでいけるかな？
[Google Calendar API(V3)] Javaでカレンダーのイベントを別のカレンダーに移動する

Gmail API v1（Java）を使用して、
Googleカレンダーのイベントを別のカレンダーに移動する方法
についてご紹介します。

カレンダーの主催者(作成者)のみが変わります。
イベントIDなどは変わりません。
<img width="280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/cba63b33-2027-6809-8f01-7dd25b6a9075.png">

移動できるイベントはeventTypeが「default」(定期的なイベント)のイベントのみです。
イベントのタイプは下記のタイプが存在します。
|eventType|説明|
|---|---|
|default|通常のイベント、または指定されていないイベント|
|outOfOffice|不在の予定|
|focusTime|サイレント モードの予定|
|workingLocation|勤務場所の予定|

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[別のカレンダーに移動](#1-別のカレンダーに移動)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. 別のカレンダーに移動
指定したカレンダーを別のカレンダーに移動します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
CalendarScopes.CALENDAR
CalendarScopes.CALENDAR_EVENTS
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Events events = calendar.events();
    
    Calendar.Events.Move move = events.move("カレンダーID","イベントID","移動先のカレンダーID");
    
    Event res = move.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/events/{イベントID}/move
が実行されます。

#### 1.2.2. クエリパラメータ
Calendar.Events.Moveのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setSendUpdates|String|新しいイベントの作成に関する通知<br>"all"(すべてのゲストに送信)、"externalOnly"(Googleカレンダー以外のゲストにのみ送信)、"none"(送信しない)|

#### 1.2.3. リクエストボディ
リクエストボディはありません。

### 1.3. レスポンスの内容

#### Event

[[Google Calendar API(V3)] Javaでカレンダーのイベントを取得する(1.3. レスポンスの内容)](https://qiita.com/doran/items/714407979db97afea29c#event)
と同じです。

<br>
<br>
おしまい。。
パケットをPythonで分析してみる② 通信先ホスト別のパレート図

# はじめに
Pythonを使ってネットワークのパケットを分析してみる。
今回はキャプチャーファイル（tcpdumpの結果）から作ったCSVをPythonで読み込み、通信先ホスト（Destination）別にパケットを集計してグラフ化する。管理下のサーバーの通信先の分析などを想定している。
キャプチャーファイルからCSVを作成する方法はこちらを参照。

https://qiita.com/ymiki0001/items/050911c0217881bc8d7f

# 前提
* JupyterNotebook
* 適当なtcpdumpから作ったCSVファイル（サンプルではYahooのトップページにアクセスした際のキャプチャーを使用）

# 必要なモジュールのインポート
今回使用するモジュールをインポートする。
なお、以降は全てJupyterNotebook上で実行している。
```
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
```

# CSVの読み込み
CSVをデータフレームdfに読み込む。
```
df = pd.read_csv('test003.csv', index_col=0)
```
dfの内容を表示してみる。
```
df
```
![スクリーンショット 2024-04-08 17.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662088/55fa0125-d71b-2ff6-38e0-2ce486d8ff4c.png)

# 通信先ホスト別（Destination）に集計する
データフレームのDestination列を集計してみる。
```
df.Destination.value_counts()
```
結果
```
Destination
192.168.1.58      735
182.22.25.124     243
183.79.250.251    184
183.79.249.124     93
192.168.1.1        85
54.249.167.126     46
34.149.43.113      19
116.118.230.85     15
103.43.90.21       14
113.52.156.18      11
152.195.38.76       7
192.124.249.36      5
34.120.208.123      5
192.124.249.22      4
34.107.221.82       3
34.117.237.239      2
34.107.243.93       2
34.120.115.102      2
Name: count, dtype: int64
```

これを新しいデータフレームdf2に入れる。
```
df2=pd.DataFrame(df.Destination.value_counts())
```
ここで、192.168.1.58は自分のアドレスであるため削除しておく。
```
df2.drop(index='192.168.1.58', inplace=True)
```

累積比率（Cumulative_ratio）を計算し、df2に列を追加する。
```
df2["Cumulative_ratio"]=df2['count'].cumsum() / df2["count"].sum() * 100
```
この時点でのdf2の内容を表示してみる。
```
df2
```
![スクリーンショット 2024-04-08 17.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662088/36621dbb-0c4a-fcea-661d-78d6789f486d.png)

# パレート図を作成する
df2の内容をもとにパレート図を描画してみる。
```
fig = plt.figure()
ax = fig.add_subplot(111)

data_num = len(df2)
 
ax.bar(range(data_num), df2["count"])
ax.set_xticks(range(data_num))
ax.set_xticklabels(df2.index.tolist(), rotation=90)
ax.set_xlabel("(Destination)")
ax.set_ylabel("(Packets)")
 
ax_add = ax.twinx()
ax_add.plot(range(data_num), df2["Cumulative_ratio"], color='red')
ax_add.set_ylim([0, 100])
ax_add.set_ylabel("(Percent)")
```
以下のようなパレート図が出力される。
![スクリーンショット 2024-04-08 17.24.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662088/9079e04d-f7c9-f8d1-b65b-9c0ff7b01f5c.png)



このように、キャプチャーファイル中の通信先ホストをパケット数が多い順に可視化することができた。
なお、通信元（Source）についても同様にグラフ化できる。

以上。
[Windowsユーザ向け] DockerでMySQLを扱った際のエラー集

普段はWebフロントの開発や組み込み系の開発をすることが多いのですが、サーバサイドの開発についても学び始めたところ、Windowsを原因としたDockerのエラーで躓くことが多かったため、それらについてまとめます。また、今後もエラーが起きるたびに追記していこうと思います。

また、Windowsでの具体的なDocker環境構築については、すでに多くの方が記事等を出していますので、そちらをご覧ください。私は主に以下の記事を参考に環境構築させていただきました。

https://qiita.com/takusan64/items/4d622ce1858c426719c7


# 環境
- Windows 11 Home 23H2
- Docker Desktop 4.28.0
- WSL Ubuntu


# lohalhostと127.0.0.1は別もの
`-h 127.0.0.1`と指定しても接続できない。
```
C:\Users>mysql -u docker -h 127.0.0.1 -p
Enter password: ****************
ERROR 1045 (28000): Access denied for user 'docker'@'localhost' (using password: YES)
```

`-h localhost`なら接続できる。
```
C:\Users>mysql -u docker -h localhost -p 
Enter password: ****************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

WindowsでDockerをインストールする際には、Windows OS環境ではなく、WSLのLinux OS環境にDockerをインストールすることになるため、そこにWindows OS環境から接続しようとしているのが原因か?


# ダブルクォーテーションが必要
以下docker-compose.yamlファイルを一部抜粋。
ダブルクォーテーションがないとエラーが起きる (友人のMac環境だと起こらないらしい) 。
```yaml
services:
  mysql:
    # コンテナ内で使用する環境変数
    environment:
      MYSQL_ROOT_USER: root # MySQLのルートユーザ名
      MYSQL_ROOT_PASSWORD: pass # MySQLのルートユーザのパスワード
      MYSQL_DATABASE: sampledb # MySQLに用意されている初期データベースの名前
      MYSQL_USER: docker # MySQLのユーザ名
      MYSQL_PASSWORD: docker # MySQLのユーザパスワード
      TZ: Asia/Tokyo
```

Windowsユーザはダブルクォーテーションを付ける必要がある。本来は付けるのが正確らしい...
```yaml
services:
  mysql:
    # コンテナ内で使用する環境変数
    environment:
      MYSQL_ROOT_USER: "root" # MySQLのルートユーザ名
      MYSQL_ROOT_PASSWORD: "pass" # MySQLのルートユーザのパスワード
      MYSQL_DATABASE: "sampledb" # MySQLに用意されている初期データベースの名前
      MYSQL_USER: "docker" # MySQLのユーザ名
      MYSQL_PASSWORD: "docker" # MySQLのユーザパスワード
      TZ: "Asia/Tokyo"
```
LeetCodeでコーディング試験対策#2

# 解いた問題
https://leetcode.com/problems/two-sum/description/

# 自力で解けたか

はい

# 解説・学んだところ

## 自分の解答
```
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        
        ans = []
        for i in range(len(nums)):
            for j in range(len(nums)):
                if i == j:
                    continue
                
                if nums[i] + nums[j] != target:
                    continue
                ans.append(i)
                ans.append(j)
                break
            if ans != []:
                break
        
        return ans
```

## 模範解答

```
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i + 1, len(nums)):
                if nums[j] == target - nums[i]:
                    return [i, j]
```

## 感想
- 答えが出たらそのままリターンすればよかった
inertiajs(vue3)による多重リクエスト送信防止

vueに限らずフロント側の画面制御でボタン連打によるバックエンド側の多重リクエストが送信されることを防止する。

### useFormのフラグによる制御
formのプロパティであるprocessingというフラグで判定する。

```javascript
<script setup>
const form = useForm({
  ...
});

const submit = () => {
  form.post('register');
};
</script>
<template>
<form @submit.prevent="submit">
...
<button
  type="submit"
  :class="{ 'opacity-25': form.processing }"
  :disabled="form.processing">
  Register
</button>
...
</form>
</template>
```

### axiosの場合（簡易フラグ）
一番簡単なのはフラグを用意してAPIの前後で囲む。

```javascript
<script setup>
const isProcessing = ref(false);

const onClickUpdate = async () => {
  // async/awaitではなくPromiseのthen/catch/finallyで実装するなら
  // finallyでフラグをリセット。
  isProcessing.value = true;
  const { data, status } = await axios.post('update_data');
  isProcessing.value = false;
};
</script>
<template>
<form @submit.prevent="submit">
...
<button
  type="button"
  @click="onClickUpdate"
  :class="{ 'opacity-25': form.processing }"
  :disabled="isProcessing">
  Register
</button>
...
</form>
</template>
```

### axiosのcancel機能で防止する
こちらは画面で防止するのではなくaxiosのリクエスト前処理で判定してエラーとするやり方。

参考サイト

https://toshi-toma.hatenablog.com/entry/2021/03/16/152737

上記サイトを参考に実装してみた感じ、ボタン連打による「同じ要求」は内部的に防げます。
リクエスト前処理、レスポンス受信後処理や
画面遷移での処理で同リクエスト判定用の変数の管理をする必要があり、
実装するに当たってある程度の設計スキルを要する。
factorial Factorial (階乗)

# 階乗 （nの階乗＝n!）


factorial Factorial について

 ``` recur_factorial.py

def recur_factorial(n):
   if n == 1:
       return n
   else:
       return n*recur_factorial(n-1)

num = 7

# check if the number is negative
if num < 0:
   print("Sorry, factorial does not exist for negative numbers")
elif num == 0:
   print("The factorial of 0 is 1")
else:
   print("The factorial of", num, "is", recur_factorial(num))
```


## Memo

time complexities O(n!)
Use stack Data Stracture 
recursive funnction 

| n Factorial | n (n - 1) (n - 2) ....1 | n! = n × (n - 1)! | Result |
|-------------|--------------------------|-------------------|--------|
| 1 Factorial | 1                        | 1                 | 1      |
| 2 Factorial | 2 × 1                    | = 2 × 1!          | = 2    |
| 3 Factorial | 3 × 2 × 1                | = 3 × 2!          | = 6    |
| 4 Factorial | 4 × 3 × 2 × 1            | = 4 × 3!          | = 24   |
| 5 Factorial | 5 × 4 × 3 × 2 × 1        | = 5 × 4!          | = 120  |


## Fomula 


```math
n! = n \times (n - 1) \times (n - 2) \times \ldots \times 2 \times 1

```
📣【Japan IT Week[春] ソフトウェアとアプリ開発展】出展のお知らせ


弊社Miichisoftは、2024年4月24日（水）～26日（金）の3日間、東京ビッグサイトで開催されるJapan IT Week【春】の「ソフトウェアとアプリ開発展」に出展いたします。

![434717762_917848030134730_2502050910774719883_n (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735781/5239894f-66dd-b391-1c6c-5101037bf690.jpeg)
【Japan IT Week[春] ソフトウェアとアプリ開発展】出展のお知らせ

Japan IT Weekとは

Japan IT Weekは、日本最大の情報技術展であり、世界中からの参加者が集う大規模なイベントです。特に「ソフトウェアとアプリ開発展」では、最新のIT技術やソフトウェア開発に関する製品やサービスが展示され、革新性と多様性が評価されています。
12の専門展から構成されている日本最大*のIT・DX展示会です。
デジタル領域のテーマを幅広く網羅。IT課題を抱えるビジネスユーザーにとって、欠かせない展示会です。
ブースでは課題解決に向けた相談、見積り・導入時期の打合せなどが行われます。
特に「ソフトウェアとアプリ開発展」では、最新のIT技術やソフトウェア開発に関する製品やサービスが展示され、革新性と多様性が評価されています。
Miichisoftは、この壮大なイベントに参加し、革新的なAIソリューションをご紹介いたします。

2024年のJAPAN IT WEEKにMiichisoftが提示するソリューション
 
弊社ブースでは、ビジネスのスピードアップをAIで支援する「Total AI Business Assistant」のソリューションをご紹介いたします。特に、RAG CoreやLLMの専門知識、プロンプトエンジニアリングなどのキーワードにフォーカスして、多数の開発実績とデモをご紹介させていただきます。
 
Miichisoft の製品およびサービスに興味があるかもしれません
+ 自社ソリューション
+ 生成AI (AI Analysis, dxGAIウェブ用チャットボット、dxGAI)
+ GPS ソリューション
+ AR/VR ソリューション
ITオフショアサービス
+ IT コンサルティング
+ ウェブサイト開発
+ モバイルアプリ開発
業務システム開発
+ LAAS (Labo as a service)
+ DX ソリューション
+ Cloud Computing
+ Kintone
+ Salesforce

出展情報
- 日時：2024年4月24日(水)～４月２６日(金) 10:00-18:00(最終日のみ17:00まで)
- 場所：東京ビッグサイト 東ホール　E43-6
- 参加方法：こちらより事前登録が必要です。（無料）
https://www.japan-it.jp/spring/ja-jp/register.html?code=1026781953131846-GWD&fbclid=IwAR2BV43xYjQNYIY73CkXpHb3t2QGmE5B_McUFIjlNijp-LYtAG2gGtdnE80_aem_AZwTDjU1QlOMF-1aTEl0iPcVMs3V6KZvicN0uXGy0hE_FRfQBnNRxx17mdcPfdzRLnPETXBh8KlQKkQWyaoZIleW&utm_source=hs_email&utm_medium=email&_hsenc=p2ANqtz-8URI3X_V5tKFgUlzSPpc4uvWScmHK6cnVYI2s8nr7xDUslDmdrl9LN9EEdEelH5ZtJFRXR


2024年Japan IT Week【春】でMiichisoftのブースにお立ち寄りいただき、最新のAIソリューションをご覧ください。ご来場を心よりお待ちしております。

私たちは設立以来、6年連続でSODECイベントに参加しており、今年もあなたにお会いできることを楽しみにしています！
KVM で作った仮想マシンをマルチディスプレイにする　あと SPICE 接続時にゲストの解像度が変わらないようにする

Ubuntu で KVM をインストールしたり仮想マシンを構築したりする記事は多いけれど、その先の、実際に使える設定にする情報が少なくて苦労したので備忘録として。

Ubuntu に KVM 入れて仮想マシンを立ち上げるところまでは済んでいるものとします。

ssh 等でホストにログインしたら、
```
$ virsh edit 仮想マシン名
```

で設定 XML を開いて編集していきます。
あ、編集中は仮想マシンはシャットダウンしておいてください。


## ゲストを2画面にする
```<video>～</video>```を２ブロック記述すれば２画面になる。
```
    <video>
      <model type='qxl'/>
    </video>
    <video>
      <model type='qxl'/>
    </video>
```
以上。

***

これだけだと記事としてあまりに短すぎるので、SPICE 接続が便利になる小ネタを少々。
 
## SPICE で接続できるようにする
まずは graphics ブロックを編集し、SPICE接続できるようにします。
ポート番号はお好みで。VNC とかと重複しないようにだけ注意してください。
```
<graphics type='spice' port='5900' autoport='no' listen='192.168.000.000' passwd='パスワード'>
<listen type='address' address='192.168.000.000' />
</graphics>
```

## クリップボード共有をオフにする
一般的にはあったほうが便利な機能だけど、諸般の理由で無効にしたいこともあるので。
```
<graphics type='spice' port='5900' autoport='no' listen='192.168.000.000' passwd='パスワード'>
<listen type='address' address='192.168.000.000' />
<clipboard copypaste='no'/>
</graphics>
```

## ファイルの転送をオフにする
```
<graphics type='spice' port='5900' autoport='no' listen='192.168.000.000' passwd='パスワード'>
<listen type='address' address='192.168.000.000' />
<clipboard copypaste='no'/>
<filetransfer enable='no'/>
</graphics>
```
## 画面転送を quic にする
```
<graphics type='spice' port='5900' autoport='no' listen='192.168.000.000' passwd='パスワード'>
<listen type='address' address='192.168.000.000' />
<clipboard copypaste='no'/>
<filetransfer enable='no'/>
<image compression='quic'/>
</graphics>
```



***
ここからはクライアントでの作業。
クライアントとは、サーバーでもゲストでもなく、手元にある作業用パソコンのこと。
virt-manager (Remote Viewer) はインストールしてあるものとします。
いちおうダウンロード場所→ https://www.spice-space.org/download.html


## 接続先情報をテキストに保存する
メモ帳を開いて以下を記述する。
```text:仮想マシン.vv
[virt-viewer]
type=spice
host=192.168.000.000
port=5900
password=パスワード
```
名前を付けて保存する。ファイル名の拡張子は「vv」。
パスワード丸見えなので扱いには注意してください。


## 接続用ショートカットを作る
Remote Viewer のショートカットをデスクトップ等に出す。
ショートカットアイコンを右クリックしプロパティを開いたら、「リンク先」に追記する。
```
"C:\Program Files\VirtViewer v11.0-256\bin\remote-viewer.exe" --auto-resize never "仮想マシン.vv"
```
:::note warn
警告
仮想マシン.vv はフルパスで指定してください。
:::


通常の SPICE 接続だと、
 パスワードを入力してゲストに接続する
→ 解像度が自動リサイズされる
→ auto resize のチェックを外す
→ ゲストの解像度を戻す
の手順が面倒すぎるので、接続情報ファイルとショートカットで一発接続を実現しました。


このショートカットをダブルクリックしてゲストに接続すれば、パスワード入力が不要で、仮想マシンの解像度も変わらない。
.gitignore 使ってみた

# はじめに

`.gitignore`をちゃんと触ったことがなく、
「gitによってやり取りされないためのもの」くらいのイメージしかありませんでした。

`.gitignore`に特化して使ってみたところ、勘違いしていた点があったので記事にします。

# Githubからローカルへ`clone`してみる

![スクリーンショット 2024-04-06 14.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/b3da5edf-8f6b-44d7-8b1f-d4b09ff82499.png)

このレポジトリから、`test2.txt`だけ`.gitignore`に記述し、ローカルに`clone`してみます。

予想では、`test.txt`だけがローカルに`clone`されると思いましたが・・・

![スクリーンショット 2024-04-06 15.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/944f1fb5-a46b-090e-b44f-60dc966320b8.png)

あれ？`test2.txt`が存在しますね。

`test2.txt`を編集してコミットし、リモートに`push`してみましょう。

![スクリーンショット 2024-04-06 15.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/8602e73b-3b44-571c-3869-74ea47c59366.png)

`push`も行われています。あれ？`.gitignore`が機能してない？

## すでに追跡されているファイルには無効

実は、すでに追跡されているファイルの場合、`.gitignore`は無効なようです。

> `.gitignore`ファイルはGitで無視するファイルやディレクトリを指定するために使用されますが、これが適用されるのはファイルがGitによって追跡されていない時だけです。つまり、`.gitignore`に記載されているファイルが既にリモートリポジトリに存在している場合、そのファイルは`.gitignore`の設定にかかわらずリポジトリに含まれます。


先程のように、すでに追跡されているファイルを`.gitignore`で追跡しないようにしたいときは
```bash
git rm --cached file_or_directory
```
で、gitの追跡から外す必要があるようです。

（`--cached`オプションは、ワーキングディレクトリのコピーには影響せず、ステージングエリアのみに影響を与えるオプション）

![スクリーンショット 2024-04-06 15.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/43ffc2ca-1a2c-f5b3-9f81-51d82f064aab.png)

この状態で`add` / `commit` / `push` してみましょう。

![スクリーンショット 2024-04-06 15.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/ea92909a-64d8-75ab-00d6-29983c794655.png)

おお！`test2.txt`が消えました！
なるほど、追跡をやめて`push`しましたからね。こうなるんですね。

![スクリーンショット 2024-04-06 15.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/49d219d9-8134-8932-0266-c550c158e56d.png)

commitもちゃんとされています。


# まとめ

- `.gitignore`は「すでにgitが追跡しているファイル」には効力がない
  よって、リモートにすでに存在しているファイルには無効
- すでに追跡されているファイルの場合、`git rm --cached file_or_directory`で追跡から除外する必要がある

知ったつもりでしたが、手を動かしてみると学びがありました。

さて、次は何を書こうかしら・・・
opencvとjupyterで画像を表示する

# この記事について

`Jupyter Notebook`にて、`OpenCV`を使って画像を読み込み、それを`matplotlib`で表示します。

# 環境

- Ubuntu 22.04 on WSL2
- `conda` 24.3.0
    - `opencv` 4.9.0
    - `matplotlib` 3.8.3

# やり方

## カラー画像として出力する場合

```python
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread("./fuga.jpg")

# BGR -> RGBへ変換
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.show()
```

注意点として、`cv.imread()`では**BRG**の順番で色を保持する一方、`plt.imshow()`にはRGBの順番の配列を渡さなければいけないため、`cv.cvtColor()`を使ってBRG->RGBの変換を行っています。

(参考：[imread() | OpenCV](https://docs.opencv.org/4.9.0/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56))

## 白黒画像として出力する場合

```python
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread("./fuga.jpg")

# BGR -> RGBへ変換
# imshowのカラーマップに'gray'を指定
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2GRAY), cmap='gray', vmin=0, vmax=255)
plt.show()
```

今回は、`cv.imread()`で読んだRGBをグレースケールに変換するため、`cv.COLOR_BGR2GRAY`を指定してcvtColorします。

さらに、`plt.imshow()`のカラーマップに`'gray'`を指定し、`vmin`と`vmax`も指定します。
(参考：[matplotlib公式ドキュメント](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html#matplotlib.pyplot.imshow))
PythonはRTFをWord、PDF、HTMLに変換する

RTFはリッチテキストフォーマットとしても知られ、異なるオペレーティングシステムやアプリケーション間で交換・共有できる互換性の高い文書フォーマットです。時には、我々は異なるプロジェクトの要件のために他の形式にRTFファイルを変換する必要があるかもしれません。
この記事では、簡単なPythonコードでRTFファイルをWord Doc/Docx、PDF、HTML形式に変換する方法を紹介します。

## RTFファイル変換の手順は以下の通りです：
1、まず、サードパーティのPythonライブラリである[**Spire.Doc for Python**](https://www.e-iceblue.com/Introduce/doc-for-python.html)をインストールします。
```
pip install Spire.Doc
```
2、インストール後、必要なクラスをインポートします。
```python
from spire.doc import *
from spire.doc.common import *
```

3、Documentクラスのオブジェクトを作成します。
```python
document = Document()
```
4、LoadFromFile() メソッドを使用して RTF ファイルをロードします。
```python
document.LoadFromFile("Test.rtf")
```
5、**RTFファイルをWord DocまたはDocx形式で保存。**
```python
document.SaveToFile("RTFtoWord.docx", FileFormat.Docx2019)
```

  **RTFファイルをPDF形式で保存。**
  ```python
  document.SaveToFile("RTFtoPDF.docx", FileFormat.PDF)
  ```
 **RTFファイルをHTML形式で保存。**
```python
document.SaveToFile("RTFtoHTML.docx", FileFormat.Html)
```
6、ドキュメントを閉じてメモリを解放する
```python
document.Close()
```
* * *
上記から、Spire.Doc for Pythonライブラリが **Document.SaveToFile()** メソッドを提供し、読み込まれたRTFファイルをWord、PDF、HTML、その他のドキュメントフォーマットに変換することがわかります。プロセスとコードは非常にシンプルなので、自分で試すことができます。

RTFからWordへのサンプル:
![RTFをWord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/035b7f65-dbde-0df9-9884-7de3fd319b2b.png)

Python Wordライブラリは他の文書フォーマット変換機能もサポートしています。より多くのデモはこちらのドキュメントを参照してください。

https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Spire.Doc-for-Python-Program-Guide-Content.html
CloudFormationテンプレートをコーディングせず作成する方法

## はじめに
CloudFormation、便利ですよね。
リソースを一気に作成出来るので、環境構築の効率が上がります。
ただ、普通に使おうとするとテンプレートを書く必要があります。
また、各AWSリソースによって内容が違います。

特にオプションが多いリソースでは、
AWSコンソール上ではこのチェックを入れればいいけど
テンプレートではどの項目を設定すればいいんだ…？と
CloudFormationのドキュメントとにらめっこをし、
該当する項目を引っ張ってきてテンプレートに書く必要があります。
私はよくしていました。

そんな中、コーディングしなくてもテンプレートを作成出来る機能があるので紹介していきます。

## 想定読者
楽にCloudFormationでリソースを作成したい人

## Application Composerを使う
Application Composerは、ビジュアルキャンバスを使用して
AWS サービスをドラッグアンドドロップしながらアーキテクチャを構成できるものです。
画面でサービスをポチポチするだけで、CloudFormationテンプレートが作成されます。
AWSコンソールとVSCodeで使用出来ます。
また、自動でAWSのベストプラクティスに従うよう設定してくれるので安心仕様です。
Application Composer自体にコストはかかりません。

### 1. 新規で作成する手順＆使い方
例として、Application ComposerでAPI GatewayとLambdaを構成してみます。

1. CloudFormationのスタック作成画面から、Application Composerで作成を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/718ccd8b-9563-9765-0ebb-8c632010d794.png)

1. 左メニューからAPI Gatewayをドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/dfb114c3-5028-719e-b6b3-c3091ea7b57e.png)

1. 左メニューからLambdaをドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/1868d2df-bbe4-798e-a3fa-c125064101e7.png)

1. API GatewayとLambdaを紐づける
API GatewayとLambdaを紐づけるために、丸ぽちからLambdaに線を引きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/2c502bbd-c32f-6300-97bb-0853d7a6e1ae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/4fd7d3a7-71ef-07b0-abe1-a65736221ffb.png)
これでGetメソッドのルートに対して、Lambdaを紐づけられました。
例としてAPI GatewayとLambdaを紐づけましたが、
他にもCloudFrontとS3など簡単に紐づけることが出来ます。

1. テンプレートを保存する
右上のメニューから、テンプレートをローカルに保存します。
これでテンプレートの完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/9d962931-eab1-082e-92b6-f86e289b8906.png)
途中でテンプレートの内容を確認したい場合は、
キャンバスからテンプレートに切り替えることで確認することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/3495aa71-5d53-4934-0f5d-d7b93da4dc91.png)

補足として、全てデフォルト設定で作成したテンプレートは動作しません。（多分）
適宜、LambdaのソースパスやIAMロールの修正が必要だと思うので、
キャンバス上でリソースプロパティから設定しましょう。

### 2. 既存のテンプレートに対して使う
Application Composerで作成したテンプレートを読み込んで修正することは勿論、
手で作成した既存テンプレートに対しても使用できます。
既存テンプレートのリソースを視覚化したい時や、
もう手で修正するのは面倒なのでApplication Composerで修正したいって時に使えます。

ただ、注意点が一つあって、
既存テンプレートに対してApplication Composerを使用した場合、
テンプレートが最適化・修正されます。
少なくとも自分が確認できたのは以下です。
* Fn::〇〇が短縮系の!〇〇に置き換わる
* 配列がリストになる（[a, b, c] が -a -b -cの様な感じ）
* テンプレートの可読性を上げる為のコメントや余白が削除される

全てApplication Composerで作成・修正するから
テンプレートの中身は見ないよって場合にはいいんですが、
テンプレートの内容を確認する場合やどう記述するかが決まっている場合には注意が必要です。

## おわりに
どんどんコードを書かなくて良い時代になっていきますね。
色々いい感じに設定してくれる分、今まで以上に内容を理解していないと
なんか上手く作成されているけどどういった設定がされているかは全然わからん！
ということになりかねないので、ちゃんと勉強しないといけないなと改めて思いました。
LeetCodeでコーディング対策#1

# 解いた問題
https://leetcode.com/problems/number-of-students-unable-to-eat-lunch/?envType=daily-question&envId=2024-04-08

# 自力で解けたか
いいえ
解説見て理解できた


# 解説・学んだところ

- 問題文では生徒はキューのように動いてたけど実装では学生の順番は関係なく、丸と四角それぞれほしい学生の数をカウントしてるだけだった。
- コーディングではインプットではなくクラスを用いて書くんだってところ
(QA) CVTRPGSRCコマンドでRPGⅢをILE RPGに変換した際に各行のSEU更新日付は引き継がれる？

[前の記事](https://qiita.com/gomAnomalocaris/items/a96a4840539fddaff2e5#comment-a9ef1b49ec41ebc36856) での疑問を検証してみました。

## CVTRPGSRCとは？

おさらいです。
参考URL : https://www.ibm.com/docs/ja/i/7.4?topic=ssw_ibm_i_74/cl/cvtrpgsrc.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/094986a4-722c-d6f0-8d87-0570bd35d241.png)

RPGⅢのソースを読んでILE RPGコードに変換するOSコマンドですね。

### RPGⅢソースの確認

以下のRPGⅢソースを用意しました。いくつかの行にSEUでの更新日付が記録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f4548b22-2c50-1a85-60a4-e0ff1953028e.png)

### ILE RPG に変換してみる

CVTRPGSRCコマンドを実行します。
例
```
CVTRPGSRC FROMFILE(DEMOLIB/QRPGSRC) FROMMBR(K201R) TOFILE(DEMOLIB/QRPGLESRC)
  TOMBR(K201R0408Z) LOGFILE(GOMALIB/QRNCVTLG)     
```

### ILE PRGのソースを確認する
テケテケテケテケ・・・
じゃーん、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a9adf2c6-b7eb-17ca-ccea-0c037d3bff05.png)

SEUでの更新日付は引き継がれました！

***終***
pythonのUnicodeDecodeError

# エラー
1.excelで作ったcsvファイルをvscode上で変更を加える。
2.pythonファイルでそのcsvを読み込ませる。
↓
```
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence
```
エラーが表示される（泣）

# 解決
https://qiita.com/Ryo-0131/items/27829642d2f767507db0

「実際のファイルの文字コードと読み込み時に指定した文字コードが異なっているときに表示される変換エラーです。」

どうやらcsvファイルを変更を加えた→実際のファイルの文字コードと異なる文字コードを加えてしまった。と解釈。

変更前のファイルに戻して読み込みをしたら、無事読み込みに成功！！
ubuntuのパスワードを1文字にする

/etc/pam.d/common-passwordファイルを編集

```bash
 sudo gedit /etc/pam.d/common-password 
```

requuisite pam_pwquality.so~ の行に`minlen=1`を追加する


```
# here are the per-package modules (the "Primary" block)
- password 	requisite			pam_pwquality.so retry=3 
+ password	requisite			pam_pwquality.so retry=3 minlen=1
password	[success=2 default=ignore]	pam_unix.so obscure use_authtok try_first_pass yescrypt
password	sufficient			pam_sss.so use_authtok
```

passwdコマンドでパスワードを変更
新しいパスワードを2回入力しパスワード変更

```bash
sudo passwd user
```



# 参考

https://www.netassist.ne.jp/techblog/13403/
The Importance of Counseling: Navigating Life's Challenges

Introduction
In today's fast-paced world, where individuals are constantly bombarded with stressors, online counselling has emerged as a crucial tool for maintaining mental health and well-being. Counseling is a professional relationship that empowers individuals, families, and groups to accomplish mental health, wellness, education, and career goals. It offers a safe and confidential environment where one can explore feelings, beliefs, and behaviors, work through challenging or influential memories, identify aspects of their lives that they would like to change, better understand themselves and others, set personal goals, and work toward desired change.

The Role of Counseling
Counseling serves multiple purposes, from helping individuals cope with stress, anxiety, and depression to providing support during major life transitions such as career changes, marriage, or bereavement. It helps individuals gain a better understanding of themselves and their problems, develop coping strategies, improve communication and interpersonal skills, and increase self-esteem and self-confidence.

Types of Counseling
There are various types of counseling, each tailored to different needs:

Individual Counseling: Focuses on personal issues and is conducted one-on-one with a counselor.
Group Counseling: Involves multiple individuals who share similar issues and is conducted in a group setting.
Family Counseling: Addresses family dynamics and relationships, aiming to improve communication and resolve conflicts.
Couples Counseling: Helps couples in romantic relationships understand and resolve conflicts and improve their relationship.
Benefits of Counseling
Counseling offers numerous benefits, including:

Improved Mental Health: It helps in managing and reducing symptoms of mental health disorders such as depression and anxiety.
Enhanced Coping Skills: Individuals learn to cope with stress, trauma, and life challenges more effectively.
Better Relationships: Counseling can improve communication and relationships with family, friends, and colleagues.
Increased Self-Awareness: It provides a deeper understanding of oneself, leading to personal growth and development.
Conclusion
Counseling is a valuable resource for anyone seeking to improve their mental health and navigate life's challenges. It provides a supportive and confidential space to explore one's thoughts and feelings, develop coping strategies, and foster personal growth. If you are facing difficulties in your life, consider seeking the guidance of a professional counselor to help you on your journey toward well-being.
実機デバックとエミュレーターでのデバックはイコールだと思ってた話

## 【adb: no emulators found】の解決方法

```
/Users/{おいどん}/Library/Android/sdk/platform-tools/adb -e shell 'am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "xxxxxx://user/?admin=1"'
```
デバックアプリが起動している状態で上記スクリプトを実行すると、ユーザーに権限が付与されるってやつ

```
adb -devices
おいどん@おいどんのMacmini プロジェクト名 % adb devices
List of devices attached
BH906xxx1      device
```
ふんふん、デバイスは認識されてるな。
F5デバックでも問題なくアプリ動いてるし、スクリプトながそ〜☺️

```
/Users/{おいどん}/Library/Android/sdk/platform-tools/adb -e shell 'am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "xxxxxx://user/?admin=1"'
adb: no emulators found
```
は？？？？

とりあえず、脳死で「adb: no emulators found　mac」とググる

Android Studioの設定がどうだとか、デバイスのusb接続の設定がどうだとか色々出てくるが
エディタはVScodeを使用していたのでAndroid Studio等の設定は関係ないなーって思った

実機のUSBデバックは当然ONにしてるしファイル転送もオンにしてる

VscodeやMac本体、実機デバイスの再起動したけど変わらなよねー
となるとやっぱスクリプトが間違ってんだろうなー
ここでエミュレーターと実機デバイスってなんか違うんじゃないと思って[-e]の部分を調べてみるとなんと！！
「-d」があるではないか！！！！！

```
/Users/{おいどん}/Library/Android/sdk/platform-tools/adb -d shell 'am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "xxxxxx://user/?admin=1"'
```
これで思った通りの処理になりましたよ。。。。

エミュレーター　≒　実機デバイスかと思ってたけど
今後はエミュレーター　≠　実機デバイスの認識でやっていこうと思う
jetsonでのディスク枯渇対策　dockerの場合

# 課題: dockerを使うと/var/lib/docker　がディスクスペースを圧迫する。
## Jetsonの場合
- Jetson AGX Orin でも64GB しかない。
- 以下の手法はLinuxであれば共通であるはずの内容。
- Jetsonの場合にはディスクスペースの枯渇を生じやすいだけ。


### dockerでのディスク使用量を知るには
```:command
sudo docker system df
```
もしくは
```:command
sudo df -hs /var/lib/docker 
```
このように大量にディスクを消費してしまう。

使われていない領域を削除するには、以下のコマンドを実行する。
```:command
sudo docker system prune
```

いま利用している分の設定に関するキャッシュ部分を残そうとするには、
利用しているdocker 環境を docker run  している状態にしておく。
その状態で`sudo docker system prune` をすればよい。

それでもディスクスペースが不足している場合には
`sudo docker system prune --volume --all`
がある。
この場合、docker でボリュームを含めて問答無用で削除します。
全てのキャッシュデータなどが削除されるので、次回のdocker buildがとても遅くなります。

## SEE ALSO
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/system_prune/

## 付記：
[ubuntu版Dockerを毎回sudoなしで実行したい](https://qiita.com/katoyu_try1/items/1bdaaad9f64af86bbfb7)
を参照して、sudo なしでdocker コマンドを実行できるようにしましょう。
【ポエム】テキストと画像⇒テキストを生成してみたけど

## 0.初めに

この記事は以下の記事の後続として書いていますが…ポエムになりましたｗ

[ドシロウトもGemini APIで遊んでみたかったのでロリポですぐ動くコードを作った](https://qiita.com/basictomonokai/items/279335c7970b1003e000)

この記事ではGemini APIで「マルチターンの会話の構築（チャット）」ということで、テキストで入力してテキストで回答の継続的に出来るものでした。

これが普通にできたので別のサンプルプログラムを試した結果の話になります。

## 1.試したサンプル

以下のサンプルプログラムを使いました。

> [generative-ai-js/samples/web/index.html - · google/generative-ai-js](https://github.com/google/generative-ai-js/blob/main/samples/web/index.html)

Googleさんの解説は以下

> [テキストと画像の入力からテキストを生成する（マルチモーダル）-ウェブアプリで Gemini API を使ってみる ](https://ai.google.dev/tutorials/get_started_web?hl=ja#generate-text-from-text-and-image-input)

画像とテキストを入力して、テキストでGemeniが回答するサンプルです。「マルチモーダル」というらしい。

## 2.試した結果

正しい回答を得られるとおもっていましたが…こうなりました。

![union00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35574/425a023f-b72a-0ee1-9308-709acc0d6c8b.png)

これは…さすがに…

## 3.終わりに

マルチモーダルの未来は遠い…？？
Java　命令実行の文

命令文の実行
　呼び出す命令の名(引数);

☆画面に文字を表示☆
System.out.println(引数);
改行しない場合は
System.out.print(引数);


 ☆２つの値を比較して大きいほうの数値を比較☆
 int　m = Math.max(数値①,数値②);
例）
 int a = 10;
 int b = 5;
 int num = Math(a,b);
 System.out.println(" a + "と" + b + "大きい方は" + num);

 ☆文字列を整数に変更☆
 int a = Integer.praseInt(数値);

 ☆乱数を発生☆
int a = new java.util.Random().nextInt(数値);
数値には発生させたい上限の数値を入力
例）
int num = new java.util.Random().nextInt(100);
num には　0～100までランダムな数字が代入される

☆キーボードから１行の文字列の入力を受け付ける☆
String a = new java.util.Scanner(System.in).nextLin();
例）
System.out.println("あなたの名前を入力してください");
String name = new java.util.Scanner(System.in).nextLin();

☆キーボードから１つの整数を入力を受け付ける☆
int i = new java.util.Scanner(System.in).nextInt();
例）
System.out.println("あなたの年齢を入力してください");
String age = new java.util.Scanner(System.in).nextInt();
SharePoint Onlineで承認申請ワークフローを作る２


# 承認申請ListViewの構造

|項目名     |属性             |備考|
|:----------|:----------------|:---------------|
|タイトル	|1 行テキスト	||
|申請者	|ユーザーまたはグループ	||
|申請日	|日付と時刻	||
|承認者	|ユーザーまたはグループ	||
|ステータス	|選択肢	||
|却下理由	|複数行テキスト	||
|承認申請画面のURL	|1 行テキスト	||
|RouteSelection(承認経路)	|参照	||
|ListName	|1 行テキスト|日本語のラベル|
|ListName2	|1 行テキスト	|英語の名前|
|OrgId	|数値	|元の承認申請リストのアイテムのId|
|PermissionAfterApproval|ユーザーまたはグループ|編集権限を付与する管理者用のグループ名|



# 承認申請ListViewのフロー

それぞれの承認申請が作成された時にワークフロー用の承認申請ListViewリストにアイテムが追加されます。この時にフローを開始させます。

### アイテムが作成されたらフローを起動させます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dcf53026-e68f-8633-0f35-aef6b4c6e0a7.png)

### 承認経路マスターのリストを参照します。
承認申請のリストで承認経路を選択させているので、そのIdを使って１件のアイテムを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ac8e1006-2f65-0103-6d41-b3520c2e70ec.png)


### 元の承認申請用のリストのアイテムのIdを抽出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ac186fec-8571-c890-7d49-07bc6b4a2268.png)


### このリストの編集、参照権を変えたいので一旦すべての共有権限を停止します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ebbc2384-9c77-4c3e-59f8-acac491a6a20.png)

### 申請者に編集権限を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2e3a723f-9446-069c-ef3e-ecfef72153f0.png)

### 承認者に編集権限を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/edf3bf0c-d5b4-d46b-06a4-3eff6ef4de58.png)


### 管理部門に編集権を与えたいのでグループを取得します。

名前からグループを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1909ec44-760f-93fa-1991-3bd4277e25ab.png)

### グループのidを抽出

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/54448b14-f339-3f32-bfe4-2372608c6021.png)

### この承認申請ListViewリストに編集権限をグループに付与する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4e34399c-0bb2-02a9-304e-e3fd20d65c61.png)


### メール送信で使うリンクを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/658ccfb5-e68e-4bdb-0343-527c730f98d8.png)

元の承認申請のリストのアイテムのURLです。

```
<P> <a href="@{triggerBody()?['ApprovalURL']}"> @{triggerBody()?['Title']}  </a></p>
```

### テンプレートをそのまま使っている承認申請の部分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/464bcb20-c4f7-7b0b-430a-fa67dfacc6f6.png)

### メールの本文　承認あるいは否認された時に申請者に送信されるメール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/41cd9234-25a4-ccdb-5f9d-42e226bebced.png)

### この承認申請ListViewのステータスを更新します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4db49c50-52d8-fd7e-7ecf-8b8d8de8be13.png)

### 元の承認申請のリストのステータスも更新します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/18546162-cf23-1455-034e-7505c9188661.png)