OmniAICreator/Qiita-1.07M huggingface dataset:
JavaでWebアプリを作成しているときにCSSが反映されずに躓いた話

## 目次
1. [はじめに](#はじめに)
2. [解決に向けた取り組み](#解決に向けた取り組み)
    1. [CSSファイルの配置確認](#1-CSSファイルの配置確認)
    2. [ログの確認](#2-ログの確認)
3. [解決方法](#解決方法)
4. [まとめ](#まとめ)
5. [あとがき](#あとがき) 

## はじめに

現在、Javaを勉強中で、サンプルのWebアプリケーションを作成しています。
その中で、Spring Securityを使用してログインページを作成しましたが、CSSが反映されない問題に遭遇しました。
本記事では、その解決方法について説明します。

## 解決に向けた取り組み

### 1. CSSファイルの配置確認

CSSファイルが正しいディレクトリに配置されていない可能性があると思い、配置を確認しましたが、`src/main/resources/static/css`に配置してありました。

### 2. ログの確認

ログを確認したところ、以下のような記述がありました。

```
o.s.security.web.FilterChainProxy : Securing GET /css/styles.css
o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext
o.s.s.w.s.HttpSessionRequestCache : Saved request http://localhost:8080/css/styles.css?continue to session
o.s.s.web.DefaultRedirectStrategy : Redirecting to http://localhost:8080/login
```

これを見ると、Spring SecurityがCSSファイルへのアクセスを保護しているため、
CSSが正しく読み込まれていないことが分かりました。

## 解決方法

`SecurityConfig`クラスで`HttpSecurity`オブジェクトを構築する際、認証設定を行っています。この設定で、`/login`と`/register`のみを許可していました。

```java
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // 関連部分だけ抜き出しました。
        http
        .authorizeHttpRequests(authorizeHttpRequests ->
            authorizeHttpRequests
                .requestMatchers("/login", "/register").permitAll()
                .anyRequest().authenticated()
        );
        return http.build();
    }
```

上記の設定にCSSファイルへのアクセス許可を追加することで、問題が解決しました。

```diff_java
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // 関連部分だけ抜き出しました。
        http
        .authorizeHttpRequests(authorizeHttpRequests ->
            authorizeHttpRequests
                .requestMatchers("/login", "/register").permitAll()
+               .requestMatchers("/css/**").permitAll()
                .anyRequest().authenticated()
        );
        return http.build();
    }
```

この変更により、`/css`ディレクトリ以下のファイルへのアクセスが許可され、CSSが正しく反映されるようになりました。

## まとめ

Spring Securityを使用する際、静的リソース（CSSやJavaScriptなど）へのアクセス許可を適切に設定することが重要です。今回の例では、`SecurityConfig`クラスに`/css/**`を追加することで、CSSファイルが正しく読み込まれるようになりました。これからもJavaの学習を進めていく中で、こうした設定の重要性を意識していきたいと思います。

## あとがき

この記事は、以前C#を学んだ際に躓いたポイントを記事にしておけばよかったという後悔から作成しました。今回は、ChatGPTに文章作成のサポートをしてもらい、この記事を書きました。誤りやアドバイスなどがありましたら、ぜひコメントでお知らせください。
【nodenv】nodenvのコマンド

久しぶりに`npm i`したら環境更新されていたのか
```
nodenv: version `18.17.0' is not installed
```
と出たのでバージョン上げようと思ったら
コマンドをするっと忘れていたのでメモ。
（次も絶対コマンド忘れているはず）

この手の記事いっぱいあるけれど自分のために書いちゃう。

## コマンド 
### ・インストール可能なバージョン一覧
```
nodenv install -l
```

#### 一覧にインストールしたいバージョンがなかったらこれ↓を試してから※
```
cd "$(nodenv root)"/plugins/node-build && git pull
```
[参照](https://github.com/nodenv/node-build?tab=readme-ov-file#basic-usage)

### ・インストール
```
nodenv install インストールしたいバージョンをここに
```

### ・リハッシュ
```
nodenv rehash
```

### ・今入れてるバージョン一覧と確認
```
nodenv versions
```
今のバージョンには`*`がついている

### ・バージョンの設定（変更）
```
nodenv local バージョンをここに
nodenv global バージョンをここに
```
基本的にローカルではなくグローバルで設定。


## ※2024-6-28
nodenv installで出した一覧に載っていなくても入れたいバージョンを入れることができるっぽい雰囲気。

`18.17.0`が更新しても一覧に出てこなかったので、試しに
`nodenv install 18.17.0`したらインストールがスタートしました。
oc comandまとめ（25/05/09追記）

# 概要
OpenShiftで利用するコマンド、ocコマンドのまとめです。
あまり日本語の記事が無いので、誰かの助けになればと思い作成しています。
随時追記します。

# ocコマンドまとめ

### リソースの内容を確認する
```bash
$ oc get <リソースの種類> <リソースの固有名>
```
- リソースの種類とは、pod(短縮形はpo), deployment(deploy), configmap(cm), images(is), service(svc)などです。
- 例) oc get po mytestpod
### configmapを作成する

```bash
$ oc create configmap <configmap名> --from-file=<confファイルのファイル名>
```

- fluentdにしか使ったことがない
 




### podのログを見る

```bash
$ oc logs <pod名> -c <container名>
```

- Podが作成されていない（CrashLoopBackoff等）状態では使えない
- -c でコンテナ名を指定できる



### imagestreamを確認する

```bash
$ oc get imagestream -n <project名>
$ oc get is -n <project名>
```
- -n でプロジェクト名を指定できる

### メモリやCPUの使用状況を確認する
```bash
$ oc get resourcequota
NAME      AGE         REQUEST           LIMIT
.....     .....       ...............　　........

$ oc get limitrange
NAME      CREATED AT
.....     .....  
```

- Podの作成ができなかったりしたら見たらいいかも（メモリやCPUが足りなくて作成できていない可能性があるので）


### Serviceを確認する
```bash
$ oc get service
$ oc get svc
```


# 参考文献
- Red Hat OpenShift on IBM Cloud アプリ用イメージのビルド
  https://cloud.ibm.com/docs/openshift?topic=openshift-images&locale=ja
- RedHat Documentation 第4章 開発者 CLI の各種操作
https://docs.redhat.com/ja/documentation/openshift_container_platform/3.9/html/cli_reference/cli-reference-basic-cli-operations#overview-3
Ubuntu password認証回数の制限

Ubuntuに対してPassword認証回数の制限する設定をいくつかのVersionで試したので備忘録的に共有です。とあるWebサイトの方法を試したところ、ログインすらできない状態になったため、Version差分は怖いなと思った今日この頃です。

## Ubuntu 20.04
Ubuntu20.04の場合、下ページの方法で設定することができました。
詳細はURLから飛んで確認してください。

[pam_tally2 locking everyone out after configuring common-auth file on Ubuntu 20.04](https://askubuntu.com/questions/1470095/pam-tally2-locking-everyone-out-after-configuring-common-auth-file-on-ubuntu-20)

"20.04.1", "20.04.4", "20.04.6"で問題なく設定・動作することを確認しています。

## Ubuntu 22.04
Ubuntu22.04の場合、下ページの方法で設定することができました。
詳細はURLから飛んで確認してください。

[I need my Ubuntu 22.04 Profiles to lock after 20 unsuccessful attempts for a duration of 15 minutes](https://askubuntu.com/questions/1467997/i-need-my-ubuntu-22-04-profiles-to-lock-after-20-unsuccessful-attempts-for-a-dur)

"22.04.4"で問題なく設定・動作することを確認しています。

## まとめ
Ubuntuのパスワード認証回数の制限設定についてでした。記載しているVersion以外では検証をしていないため、自環境に適用される際にはご注意ください。
Figmaの無料プランで外部コンポーネントを使用する

# 課題
Figmaのコンポーネント（ボタンなどの部品）を使用するときに、外部UIキットのコンポーネントを使用したい時があります。例えば、 https://www.figma.com/community/file/912837788133317724 のような外部UIキットのコンポーネントを活用して、マテリアルデザインの画面を作成することが可能です。ただし、Figmaの無料プランだと、ライブラリにコンポーネントを組み込むことができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/4b005397-fa9e-2de5-f8d8-5945ce9ffc9b.png)
その場合の代替案を解説します。
# 代替案
外部UIキットを複製して使用することで、外部コンポーネントを使用することが可能です。具体的には次の手順です。
1. 外部UIキットのURLを開いて、`Figmaで開く`を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/39a3c08d-ee67-abd5-231d-46198714c87d.png)
1. ファイルブラウザの下書きの箇所にファイルが追加されたことを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/065ee6f3-a832-0a09-5a2a-61bdb58faaa3.png)
1. アセットのローカルコンポーネントで、外部UIキットのコンポーネントを選択できることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/f43be68b-617e-605d-b021-d035ddc1240d.png)
1. ページの`+`マークを押下してページを作成します
    * 元からあるページを削除すると、ローカルコンポーネントも削除されてしまうので注意してください
    * 無料プランは最大3ページですが、下書きにあるファイルには制限がかからないようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/5395d158-0ce5-c6a8-c015-de510ee9c959.png)
1. ファイルブラウザで下書きのファイルをプロジェクトに移動します
    * 無料プランは最大3ページなので、プロジェクト移動後はページ追加ができなくなります
    * ただし、既に作成済のページは維持されるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/abc9a7a2-d3e2-2d06-0aba-b01f4adb63d9.png)
1. アセットのローカルコンポーネントで、外部UIキットのコンポーネントを使用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/7ceab352-7200-4ec7-6f56-aeff9a9070b9.png)
# まとめ
無料プランでも、外部UIキットのコンポーネントを使用することができました。ただ、この方法では複数の外部UIキットを組み合わせて使用することはできません。試してみて良さそうだったら、有料プランの検討をすると良いでしょう。
Figmaでファイルを共有する

# はじめに
Figmaでファイルを共有する手順を解説します。Figmaをまだ使ったことがない方は、 [はじめてのFigma](https://qiita.com/itou_ot/items/41d593859e871566b05e) もご参考ください。
# ファイルを共有する
画面右上の`共有`を押下すると、ファイル共有の設定ができます。設定にてファイルの共有範囲や権限（閲覧のみ、編集可）を選択することができます。閲覧のみであれば、Figmaを導入していないメンバにもファイルを共有することが可能です。その場合、下記画像の設定で`リンクをコピーする`を押下し、関係者にリンクを配布すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/e64b78dd-35ca-b29a-4ba3-ee4d138f8278.png)
# 共有されたリンクを開く
Figmaを導入していないメンバでリンクを開いてみました。プレビューなども問題なく利用できることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/746a68d8-89ae-584f-c547-3821e82d9349.png)
# おわりに
Figmaでファイルを共有する手順を解説しました。
Figmaで画面を作成して画面遷移する

# はじめに
Figmaで画面を作成して画面遷移させる手順を解説します。Figmaをまだ使ったことがない方は、 [はじめてのFigma](https://qiita.com/itou_ot/items/41d593859e871566b05e) もご参考ください。
# ファイルの階層構造
Figmaのファイルは「ファイル ＞ ページ ＞ フレーム」という階層構造になっています。ファイルの中には複数のページを作成できます。ページの中には複数のフレームを作成できます。
# ページを作成する
ページの`+`マークを押下するとページを作成できます。デフォルトで`Page 1`が作成されているので、今回はそれを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/ba8a60ab-b9fd-1b07-503e-c908ebda667c.png)
# フレームを作成する
画面を作成するための土台であるフレームを作成します。ツールバーから`#`を選択します。右側のメニューでフレームのサイズを選択できます。今回は通常のデスクトップサイズの画面を作成することとし、`デスクトップ`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/7a0e56cc-545c-bd9e-4b68-03a20070388c.png)
# コンポーネントを配置する
フレームにコンポーネント（ボタンなどの部品）を配置していきます。コンポーネントはアセットの中から探します。Figma標準で用意されている`Basic website kit by Figma`から`00 Button`というコンポーネントを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/f5b59768-afdc-6a70-66e9-186725afc33a.png)
# プレビューを表示する
右上の`▷`を押下すると、プレビューを表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/052cad45-e7dc-d7a1-b1b4-fab95dfc3b10.png)
プレビュー画面で`エディターで開く`を押下すると、編集画面に戻れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/ac38bfc9-1ae9-96c5-3798-2bfafa79d9cf.png)
# 画面遷移のさせかた
画面遷移をさせるために、もう1画面を作成してみます。先ほどと同じ手順でフレームを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/fbd868fd-adca-b50b-b550-e71639304c54.png)
`プロトタイプ`を選択して、ボタンから作成したフレームに矢印をひっぱります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/e259e5f1-ac07-aeff-5a6f-317cb19ff75b.png)
プレビュー画面でボタンを押下すると、画面遷移していることがわかるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/bcc0c635-34cf-06dc-192d-edc915dc1a06.png)
# おわりに
Figmaで画面を作成して画面遷移させる手順を解説しました。
はじめてのFigma

# はじめに
Figma（フィグマ）とは、ブラウザ上で簡単にデザインができるツールです。無料でも使えます。Figmaでデザインファイルを作成するまでの手順を解説します。
# アカウント登録
Figmaを使うにはアカウント登録が必要です。次のページの手順でアカウント登録してみましょう。
https://help.figma.com/hc/ja/articles/360039811114
料金プランの選択画面が表示された場合、まずは無料プランを選択でよいかと思います。

アカウント登録後、https://www.figma.com/ で次のようなファイルブラウザが開ければOKです。右下`？`の"言語を変更"で日本語の選択が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/20ac518e-daf9-204b-4c07-fcd92660c074.png)
# チーム/プロジェクト/ファイル
Figmaの無料プランは「チーム ＞ プロジェクト ＞ ファイル」という階層構造になっています。チームの中にプロジェクトを作成できます。、プロジェクトの中にファイルを作成できます。チームは"会社"や"部署"、プロジェクトは"案件"に相当するイメージです。チームとプロジェクトがデフォルトで作成されているかと思いますので、そのまま使用していきましょう。（新規作成しても構いません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/0fa97712-701e-1717-ab1a-b7ea698c18a2.png)
プロジェクトの中にファイルを作成します。プロジェクトを選択した状態で、右上の`＋デザインファイル`ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/2c4ec3f8-482e-8ad1-712c-3b6182c7bd76.png)
次のような画面が表示されかと思います。こちらがファイルの編集画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/7f326eab-3b35-3227-cc6f-5e67c878b376.png)
ファイルは自動保存されます。元のファイルブラウザに戻るには`ファイルに戻る`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481127/6c5ff123-4a9e-2346-95a4-0dbc04de8998.png)
# おわりに
Figmaのアカウント登録からデザインファイルを作成するまでの手順を解説しました。
資格をとって仕事に生かそう

# はじめに
* 資格取得の目的やモチベーション向上、学習方法について話したいと思います
* 過去に受験したIPA情報処理技術者試験を題材にしています
# 資格取得の目的
* （会社のよっては）報奨金がもらえる
    * 具体的な使い道を考えると良い
* チームや部署移動に有利（やりたい仕事をできる可能性が高まる）
    * 客観的に能力を示せる
    * インフラをやりたいのであれば、AWS資格を取ってアピールするとか
* 仕事に生かせる
# 仕事に生かせるとのことだけど
* 資格さえ取得していればOK？
    * そうとは限らない
    * 現場では、資格の知識とは異なる対応を行うことがある
    * 例えば、データベーススペシャリスト試験では「正規化は実施すべき」という前提だが、実際の現場では「あえて正規化しない」ということもある
        * 資格の枠組みを超えた、柔軟な対応を求められる場合がある
# でも資格は大事
* 基本を知るという意味で資格は大事
    * 例えば、正規化を知っていてあえて正規化しないのと、正規化を知らずに正規化しない…では全然違う
* 資格の知識があることで、偏りがない知識をもてる
# 勉強場所
* 公共施設（図書館 / 文化センター / 青少年センター …など）
    * じっくり一人で勉強できる
    * 学生が多い
* 通勤途中
    * 効率よく時間を活用できる
* 何かの待ち時間（行列 / 病院診察 / 待ち合わせ など）
    * 効率よく時間を活用できる
* 家
    * 自身が家で勉強していると、同居人も自然に勉強するようになるという副作用もある
# 勉強方法（情報処理技術者試験の場合）
* 「過去問を解く」「間違えた個所の解説を見て理解する」の繰り返し
    * 1割くらい解けるようだったら、この方法が効率的かなとは思う
        * 1割解けないようだったら、参考書を先頭から見ていくのがよいかも
    * 9割以上解けるようになったら、他の年の過去問に移行する
* 参考書選びのポイント
    * 問題の解説を読んで、自身が理解できる
    * 1冊にしぼるのがよいかと思う
* 時間ペースを確認する為、時間を計って過去問題や模擬問題を解くのを1回はやって方がよい
# AIを先生代わりに
* ChatGPTを活用してみる https://chat.openai.com/
    * 自身がない用語について質問する
        * L2とL3について教えて
    * 回答を理解しているか確認するために、練習問題を作成してもらう
        * L2とL3に関する選択問題を1つ出して。まだ答えは言わないで
# おわりに
* 資格試験に興味がわいたら、まずは行動（試験を申し込む、参考書を読む）してみるとよいかと思います
初心者がVPSサーバーにlaravelプロジェクトをデプロイした結果…

「**セキュリティグループ**」
エンジニアもどきの僕にはこんな言葉は聞いたことが無かった。
いやサーバーについて調べていた時に見かけたことはあるが詳細を見てもなるほどわからんという感想しか出てこんかった。
まさかこれが足を引っ張ってこようとは…

サーバーはconohaVPSというもの。
OSはdebian、アプリケーションテンプレートでdockerを選んだ。
無事自分のgithubからプロジェクトをデプロイでき、コンテナのビルドなども完了した。
後はブラウザからアクセスするだけ…！

…「応答時間が長すぎます」……(-_-)

どのログを見ても何も異常は無い。pingやらtracertやら色々と手を尽くしたがよくわからぬまま2日が経過した。
当然その間chatGPTやらさまざまなAI君に聞いたが通り一遍の回答だった。

conohaVPS側の設定なのか…？

ふと思いおもむろにセキュリティグループというところを見てみるとそこには「IPv4v6-Web」というセキュリティグループというのが存在するらしい。これ…なのか…？
追加してみるとなんとアクセスできた。

たったこれだけで…たったこれだけのせいで…！！(-"-)

よくよく調べてみるとAzureなどのクラウドコンピューティング環境ではこういったセキュリティグループという設定が存在し、サーバー内のセキュリティ設定とは別に仮想的なファイアウォールを設定できるらしいのだ。。。
知らなかった……

何はともあれこうして僕のwebアプリ第一号ができた。
素直に嬉しい。

みんなもクラウドコンピューティング環境ではこの設定に気を付けよう😭
リモートデスクトップの画面サイズを固定するためのメモ

リモートデスクトップで開く画面サイズをある程度のサイズに固定したいときのメモです。
・全画面は大きすぎる
・むしろ確認用なので800x600くらいでも良い
・ルーチンワーク的に常に同じサイズで開きたい
などの細かいことを言う人（私）の作業用メモです。
rdpファイルをエディタで開いて編集してください。

<h3>１．主目的：リモートデスクトップの画面サイズを固定する</h3>
変更するパラメタはdesktopwidthとdesktopheightです

```
desktopwidth:i:1280
desktopheight:i:1024
```
それぞれ幅と高さのピクセル数です。

併せて画面モードのパラメタも変更します。
```
screen mode id:i:1
```
全画面/サイズ指定のパラメタです。
サイズ指定は1、全画面は2

<h3>２．リモートデスクトップの表示位置</h3>
リモートデスクトップを表示する位置はwinposstrで設定します。

```
winposstr:s:0,1,620,2,1917,1065
```
パラメータの数値はそれぞれ左から
X始点，Y始点，X終点，Y終点

終点はリモートデスクトップの枠のサイズの分、画面サイズよりも広くなります。
それぞれ、終点の座標をXは+17、Yは+39を目安に調整して下さい。

<h3>３．windowsキーのフック</h3>

```
keyboardhook:i:1
```
Windowsキーのフック　する：1  しない：0

<h3>４．壁紙を表示する</h3>

```
disable wallpaper:i:0
```
壁紙を表示　　する：0   しない:1

<h3>５．プリンタのリダイレクト</h3>

```
redirectprinters:i:0
```
プリンタのリダイレクト　する：1   しない：0

<h3>最後に</h3>
何らかの助けになれば幸いです。
PythonでWordを画像に変換（JPG、PNG、SVGなど）

Word文書を画像としてエクスポートすることで、情報の共有が容易になり、不正な編集からデータを保護することもできます。この記事では、[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/doc-for-python.html)ライブラリを使用して、PythonでWordから画像へのバッチ変換を実装する方法を探ります。

* [Python - WordをJPG/ JPEG/ PNG/ BMP画像に変換する](#python---wordをjpg-jpeg-png-bmp画像に変換する)
* [Python - WordをSVG形式に変換する](#python---wordをsvg形式に変換する)

## Wordから画像への変換のためのPython API
[**Spire.Doc for Python**](https://www.e-iceblue.com/Introduce/doc-for-python.html)ライブラリは、プロフェッショナルなWord文書処理ライブラリとして、Word文書をJPG、PNG、SVG、その他の画像形式を含む様々なファイル形式に変換することができます。Python Wordライブラリは以下のpipからインストールできます：
`pip install Spire.Doc`



> :arrow_down_small: 以下は2つのコード・サンプルです：

## Python - WordをJPG/ JPEG/ PNG/ BMP画像に変換する
```python
from spire.doc import *
from spire.doc.common import *
 
# Word文書を読み込む
document = Document()
document.LoadFromFile("input.docx")
 
# すべてのページをループする 
for i in range(document.GetPageCount()):
    # 指定されたページを画像ストリームに変換する。
    imageStream = document.SaveImageToStreams(i, ImageType.Bitmap)
    # 画像ストリームを.png画像として保存する（.jpgまたは.bmp画像としても保存可能）
    with open("ToImages\\Img-{0}.png".format(i),'wb') as imageFile:
        imageFile.write(imageStream.ToArray())
        
# ドキュメントを閉じる
document.Close()
```

上記のコードは、**`Document.SaveImageToStreams()`** メソッドでWord文書を画像ストリームに変換し、指定されたフォーマット/サフィックスを持つ画像ファイルとして画像ストリームを保存します。
WordをPNG画像に変換した出力は以下のようになります：

![WordToImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/7ff3b1af-74d7-bc79-5912-ebbcdbd61c93.png)


## Python - WordをSVG形式に変換する
SVG画像はXMLベースのベクターグラフィックフォーマットであり、スケーラブルで編集可能なグラフィックを作成することができます。Spire.Doc for Pythonを使用すると、**`Document.SaveToFile(fileName, FileFormat.SVG)`** メソッドを使用してWordを直接SVGに変換できます。
```python
from spire.doc import *
from spire.doc.common import *
 
# Word文書を読み込む
document = Document()
document.LoadFromFile("input.docx")
 
# 转换为SVG文件
document.SaveToFile("ToSVG\\SVG.svg", FileFormat.SVG)
document.Close()
```

出力結果:
![WordToSVG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/b2d778c5-ddd9-6880-bde8-bd95bf064b2d.png)


Python Wordライブラリを完全に評価するには、トライアルライセンスのリクエストをクリックしてください：

https://www.e-iceblue.com/TemLicense.html
Oracleテーブルスペースの拡張

# はじめに
やや性能が低いサーバにOracle DBをデスクトップクラスでインストールした後、データを大量投入したところ、容量不足となり、以下のようなエラーが出力されてしまった。
- ORA-01653: (表領域USERS)で拡張できません
- ORA-01658: 表領域USERSにセグメント用のINITIALエクステントを作成できません
- ORA-01652: 一時セグメントを拡張できません

このインストールオプションでは、テーブルスペースは、データファイルというファイルで管理されており、この限界に達してしまった。これに対してはデータファイルを拡張することで、対応できたので、それをまとめておく。

# 対応手順
## データファイルの確認
データファイルの対応はコマンドで行う。
コマンドを実行するため、SQLPLUSで対応するDBにSYSDBAで接続する。

:::note info
sqlplus ユーザID/パスワード@接続先アドレス:ポート番号/DB名 as sysdba
:::
```:DBへの接続 例
sqlplus admin/password@localhost:1521/hogedb as sysdba
```
次にデータファイルの所在(フルパス)を確認する。
(これから対応するコマンドで指定することが多い)
```:DBファイルの確認
select tablespace_name, file_name,bytes/1024/1024 "SIZE(MB)", autoextensible,increment_by from dba_data_files;
```
応答は、各テーブルスペースを構成するデータファイルのファイル名(フルパス)、自動拡張、増分が返ってくる。

各ファイル名を見ると、対応するテーブルスペースが判る文字列(USERS, SYSTEM, UNDOTBS1, SYSAUX)が含まれている。
容量不足になったテーブルスペースに対し、データファイルの増加、追加等で対応を行うことで対応する。

## DBファイルを自動拡張可能に変更
前のステップで、テーブルファイルが自動拡張になっていない場合は、自動拡張に設定変更する。

:::note info
ALTER DATABASE DATAFILE 'ファイル名(フルパス)' AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;
:::
例えば、データファイル「C:\WORK\ORCL\ORADATA\ORCL\DBSAMPLE\USERS01.DBF」を自動拡張、最大サイズを指定しないに変更する場合は以下のようなコマンドを打鍵する。								
```
alter database datafile 'C:\WORK\ORCL\ORADATA\ORCL\DBSAMPLE\USERS01.DBF' AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;
```

## データファイルのサイズ変更
データファイルのサイズを変更するには以下のコマンドを実行する。

:::note info
alter database datafile 'データファイル(フルパス指定)' resize 変更後のサイズ;
:::
具体的には以下のようなコマンドで実施する。
```
alter database datafile 'C:\APP\ADMINISTRATOR\ORADATA\DBSAMPLE\DATAFILE\O1_MF_USERS_LYWYPO7X_.DBF' resize 32767M;
```

## データファイルの追加
1つのデータファイルのサイズには限界(最大32767M)があり、これを超えた場合、各テーブルスペースに対し、データファイル自体を追加する必要がある。
以下は、USERSへのデータベースファイルの追加例。
(自動拡張ありで、初期サイズ1024M、不足した場合は10Mずつ増加し、最大サイズの指定はしていない)
```:USERSへのデータベースファイルの追加
set timing on;
ALTER TABLESPACE USERS ADD DATAFILE SIZE 1024M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
set timing off;
```
コマンド実行後は、サイズを確認しておく。
```:テーブルスペースファイルの確認
select tablespace_name, ROUND(BYTES / 1024 / 1024,1), file_name from dba_temp_files;
```

## 一時テーブルスペースのサイズ変更
一時データベースが不足している場合のエラー「ORA-01652: 一時セグメントを拡張できません」等が出力されている場合、コマンドが異なる。
```: 一時テーブルスペースの確認
select tablespace_name, ROUND(BYTES / 1024 / 1024,1), file_name from dba_temp_files;
```
上記で表示されたファイルに対し、コマンドを打鍵する。
```: 一時テーブルスペースの変更
ALTER DATABASE TEMPFILE 'C:\WORK\ORCL\ORADATA\ORCL\DBSAMPLE\TEMP012023-12-29_14-10-42-670-PM.DBF' RESIZE 2048M;
```

# おわりに
ここでの対応は、検証環境での対応につき、同じような立場の方の参考になれば幸いです。
電話番に時間を消費するな！アプリで時間を節約してその時間で業務効率化

## はじめに
※以下の文は大半をChatGPTで生成しています。
  ~~偉そうな文章になってしまいましたが~~さすがChatGPTですね。
  
皆さん、会社で電話番をしている時に、知らない番号からの着信対応に貴重な時間を費やしていませんか？
今回ご紹介するアプリを使えば、その時間を大幅に削減し、本来の業務に集中できます。

https://play.google.com/store/apps/details?id=com.company.phonenumberOCR

## このアプリで実現する時間節約と業務効率化

### 1. カメラ認識で電話番号チェックを瞬時に

「番号検索」機能を使えば、電話番号をカメラで瞬時に認識。
わずか数秒で不審な番号かどうかを判断できます。

<img width="300" alt="1.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755555/4f6786c6-2736-4547-0af9-b0f9f00e8a83.png>

### 2. 着信からノンストップでWeb検索

認識した番号は自動でGoogle検索。コピー＆ペーストする手間が省けます。

<img width="300" alt="1.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755555/828df164-cd04-dddd-f4b4-2923d7e82294.png>

### 3. 迷惑電話リストで着信対応を効率化

迷惑電話として登録すれば、次回からの対応が迅速に。
不要な着信応対時間を大幅カット！

<img width="300" alt="1.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755555/63cc1215-978d-af9b-5a1e-e1be99592184.png>

## このアプリの時間節約効果(当社調べ)

このアプリを活用すれば、不審な電話番号の確認や迷惑電話対応にかかる時間を大幅に削減できます。
その結果、本来の業務により多くの時間を割くことが可能になります。

例えば、1日あたりの着信件数が10件として1回の対応時間を5分とします。
(弊社は小さい会社なので1日10件ほどですが、大きい会社だともっと多いですよね)
1日50分の時間節約ができれば、1週間で250分、1ヶ月で約15時間以上の時間を生み出せます。
時給2000円とすると34,000円分に値します。
仮にこのアプリで着信の半分を出ないようにできたら結構大きくないでしょうか？
~~このアプリの開発に500時間かかっていますが~~

https://qiita.com/ararrararararaarrrr/items/5e28201b9e453150fd5b

ビジネスの成功は、時間の有効活用から始まります。
このアプリで時間を賢く管理し、業務効率を大幅にアップさせましょう！

ちなみに、弊社ではスマホスタンドで固定して常時監視しています。
<img width="300" alt="1.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755555/5249c6d5-8a3b-bbb4-910e-e2f280758e85.jpeg>

## おわりに
いかがでしたでしょうか？
ビジネスの世界では、集中力と時間管理が成功の鍵となります。
仕事に没頭しているときに突然の着信で中断を余儀なくされ、それが迷惑電話だったときのフラストレーションは計り知れません。
さらに、仕事モードに戻るまでの時間のロスも無視できません。
このアプリは、そんな問題を解決し、皆さんの貴重な集中力を守るための強力なツールとなります。
単なる時間節約だけでなく、業務の質を向上させ、ストレスを軽減する手段としても非常に有効です。
ビジネスパーソンの皆さん、自身の生産性と心の平穏を守るために、このアプリを活用してみませんか？
少しの工夫で、大きな変化が生まれるかもしれません。
興味を持たれた方は、ぜひお試しください。
きっと新たな業務効率化の扉が開かれることでしょう。

https://play.google.com/store/apps/details?id=com.company.phonenumberOCR
VSCodeやCursorで突然音が鳴り出した時の対処法

# VSCodeで突然音が鳴り出した時の対処法

VSCodeを使用中、突然音が鳴り出して困まりました。。。
この問題の解決方法を紹介します。

## 問題

VSCodeでタイピング中に予期せず音が鳴り始める。

## 一般的な解決策

多くの情報源では、Audio Cuesの設定を変更することで解決すると言われています。しかし、2024年6月現在、この設定が見つからない場合があります。

## 解決策（2024年6月時点）

Accessibility Supportの設定をOFFにすることで、この問題を解決できます。

手順：
1. VSCodeの設定を開く
2. 「Accessibility Support」を検索
3. 「Accessibility Support」の設定をOFFにする

![VSCode Accessibility Support設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110085/36d453e6-8f3a-5210-cb3e-0b8ba3cb442b.png)

この設定変更により、不要な音を停止させることができます。

VSCodeの更新により設定項目が変更される可能性があるため、常に最新の情報を確認することをおすすめします。
Java3


## アノテーション

@ を付けて追加情報を書き込む機能。
アノテーションを付けて、付加情報(メタデータ)を付けると、
コード検査、コード生成、特別な処理を実行することが出来ます。

コードを見通しをよくし、保守性や拡張性を高める役割を持っています。

```Java
@Autowired //@がついてるやつ
private SampleService sampleService

```

FWであるSpringではアノテーションを使って効率化を図ったりしています。

https://qiita.com/yuto-hatano/items/69d01343f710117e4243


https://bizroad-svc.com/blog/java-annotation/#:~:text=Java%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89,%E5%87%A6%E7%90%86%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82


## インターフェース
インターフェースとは。

メソッドの定義や変数の定義のみのファイルのこと。

Javaで使われるインターフェースとは、クラスに含まれるメソッドの具体的な処理内容を記述せず、**変数とメソッドの型のみを定義**したものです。
中身のロジックは書かずに、関数だけ書いてしまう感じかな。
以下のようにインターフェースを宣言および実装を行います。

```Java

【インターフェースの宣言】
interface インターフェース名{}


【インターフェースの実装】
class クラス名 implements インターフェース名{}

//SpringだとService classをinterfaceとしている所がありますね
@Service
public class SampleService{

}

```

## Enumの使い方

```genreConsts.java
//enumファイル

public class GenreConsts{
    public enum Genre implements DbConsts{
    //定数
    ANIME(1,"アニメ"),
    DRAMA(2."ドラマ")
    }

    //変数名
    public Integer id;
    public String name;

    //インスタンスデータ
    private Genre(Integer id,String name){
        this.id = id;
        this.name = name;
    }

    public static Genre getEnum(Integer value){
        for(Genre genre:Genre.value){
            if(genre.id.equals(value){
                return genre;
            }
        }
    }

    public static String getName(String value){
        for(Genre genre:Genre.values()){
            if(genre.name.equals(value)){
                return genre.name;
            }
        }
        return null;
    }
    


    public static String getId(String value){
        for(Genre genre:genre.values()){
            if(genre.name.equals(value)){
                return genre.id;
            }
        }
        return null;
    }
}

```

### 使い方

```Java

//sample.genreはintの1が入ってます

sample.genreName = Genre.getName(sample.genre);
//結果-> 「アニメ」が出力
```

EnumであるGenreクラスは、インスタンスを生成する意味合いが無いので、
メソッドは**static**で宣言し、インスタンス無しで何処でも呼び出すことができるので
シンプルに書くことができますね。
【vscodeの正規表現】を学ぶ：HTMLコーディングを楽にする方法　〜その１〜

## 主な想定読者
最近VSCodeを使い始めたWEBコーダー初心者

## 概要 
vscodeの正規表現機能を活用することで、HTMLのコーディング作業を効率化する方法を解説します。

VSCodeでは
　cmd (Ctrl) + F　を押して検索ウィンドを表示
　>ボタンを押して置換に設定
  ![スクリーンショット 2024-06-28 14.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820319/3a5dff7b-b1f8-6e06-a895-812e67ee45f6.png)
　.*　ボタンで正規表現を扱うことができます。
![スクリーンショット 2024-06-28 14.45.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820319/b18cb0c4-403b-ba63-3374-5ddd2e3d1e19.png)


正規表現を利用した検索、より高度な検索・置換が可能となります。
以下に、よく使う正規表現のパターンを示します。


## よく使う正規表現のパターン

| パターン | 意味 | 例 |
|----------|------|----|
| `[ ]` | 正規表現における`[ ]`（角括弧）は、内に囲まれた文字がマッチします | `[a-z]`はaからzの文字がマッチする。 |
| `\d` | 数字のみマッチする | `\d[a-z\d]` |
| `{n, m}` | 直前の文字がn回、多くてもm回出現するものにマッチする | `/\d{10,11}/` |
| `{n}` | 直前の文字がn回出現するものにマッチする | `/\d{10}/` |
| `.` | 改行以外のどの文字にもマッチする | `(?=.*?\d)` |
| `+` | 直前の文字の1回以上の繰り返しにマッチする | `[a-z\d]+\z` |
| `\A` | 直後の文字が先頭にある文字列にマッチする | `\A[ぁ-んァ-ヶー]` |
| `\z` | 直前の文字が末尾にある文字列にマッチする | `[ぁ-んァ-ヶー]+\z` 

## グループ化と参照
正規表現を括弧()で囲むことで、マッチした部分をグループ化することができます。これにより、後で参照することが可能です。

### 例
グループ化の検索
```html
<body id="(.*)">
```

グループ化の置換
```html
<body id="$1">
```


## 置き換え例


```html:元テキスト
<p id="hogehoge1"></p>
<p id="hogehoge2"></p>
<p id="hogehoge3"></p>
```


```html:検索
<p id="hogehoge(\d)">
```


```html:置き換え
<p id="hugahuga$1">
```


```html:結果
<p id="hugahuga1"></p>
<p id="hugahuga2"></p>
<p id="hugahuga3"></p>
```


## まとめ
VSCodeで正規表現を使うと、複雑な検索や置換を簡単に行うことができます。正規表現の基本的な使い方を理解し、実際のコーディングで活用することで、効率よく作業を進めることが可能です。是非、日常のコーディングに取り入れてみてください。
プログラム学習サイトの紹介

## 初めに
こんにちは。大野です。
今回は私が学生時代に使っていたプログラム勉強サイトのpaizaラーニングを紹介します。

## 特徴
paizaラーニングの特徴は3つあります。

1つ目が1回の講座が3分の動画で構成されており、動画を見ながら右側のツールでプログラムを作成実行できることです。![paiza.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/42f711b3-3faa-9f63-8130-23de93fc5483.png)



2つ目が系列のpaiza転職、paiza新卒で転職・就職のサポートまで行ってくれるところです。

3つ目が動画の声は有名声優さんがやっています。※動画によって声優は違います。

## 有料と無料の違い
有料と無料の違いは以下の通りになります。
無料プランは81本ですが、有料プランは1496本以上の動画が視聴できます。講座の演習問題数も無料は166問、有料プランは2,018問です。

## 受講方法
受講方法は月額プランへの入会が必要です。
1ヶ月プラン　1,078円、6ヶ月プラン　4,488円、12ヶ月プラン　7,200円

## 最後に
入門講座の多くは無料で公開しているので気になった方は無料の講座から覗いてみてください！
以上、大野でした。
Ubuntu をインストールしたらすぐに旧 Emacs 配列に変更する



「ctrl + alt + T」でコマンドプロンプトを立ち上げて，以下のコマンドを実行し，キーボード変更をするアプリをインストールする

```batch
sudo apt-get update
sudo apt-get upgrade
sudo apt install git python3-setuptools gettext
git clone https://github.com/sezanzeb/input-remapper.git
cd input-remapper && ./scripts/build.sh
sudo apt install -f ./dist/input-remapper-2.0.1.deb
```
Next.jsでSupabase AuthのgetUsserでユーザーが取れない

# はじめに

Supabase Authでセッションからログイン認可をしようとしたところなぜかできくなくなったのでまとめておきます

# 問題

以下のコードで認証するページをつくったところ何故か認証されませんでした

```ts
import Link from "next/link";
import { createClient } from "@/utils/supabase/client";

export default async function Page() {
  const { data, error } = await createClient().auth.getUser();
  if (error || !data?.user) {
    console.error("認証セッションが不正です");
    return { redirectToLogin: true };
  }
  return (
    <>
      <h1>Admin Page</h1>
      <Link href={"/admin/curriculum"}>カリキュラム</Link>
    </>
  );
}
```

他のページは認可できているので何かがおかしい

# 解決方法

`createClient`がクライアント用を利用していました

```ts
import { createClient } from "@/utils/supabase/client";
```

クライアント用ではセッションなどを取る処理が入っていないのでそれは認証認可できっこありません

```ts:client.ts
export function createClient() {
  return createBrowserClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
  );
}
```

ということで以下に変更したことで治りました

```ts
import { createClient } from "@/utils/supabase/server";
```

ちゃんとこちらは認証の処理があるのでうまくいきます

```ts:server.ts
import { createServerClient, type CookieOptions } from "@supabase/ssr";
import { cookies } from "next/headers";

export function createClient() {
  const cookieStore = cookies();

  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        get(name: string) {
          return cookieStore.get(name)?.value;
        },
        set(name: string, value: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value, ...options });
          } catch (error) {
            // The `set` method was called from a Server Component.
            // This can be ignored if you have middleware refreshing
            // user sessions.
          }
        },
        remove(name: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value: "", ...options });
          } catch (error) {
            // The `delete` method was called from a Server Component.
            // This can be ignored if you have middleware refreshing
            // user sessions.
          }
        },
      },
    }
  );
}
```

# おわりに

思ったよりも検証に時間がかかりましたが解決できてよかったです
前にも別の問題で認証につまづいたので少し難しいと思いました

# 参考

https://supabase.com/docs/guides/auth/server-side
Java2

# List

配列とは違うものとして扱うらしい。
変数定義の時はintでいいが、classの型を指定する時にはInteger。
<クラス型>とよばれることがあるIntegerであるが、
int型をメソッドとして使用できるラッパークラスと呼ばれることもあります。

```Java
// List
List<String> list1 = new ArrayList<>.(Arrays.asList("a","b","c","a");

//回す
for(String s:list1){
//処理内容
}

//sort 
Collections.sort(list1.Collections.reverseOrder());
for(String s:list1){
//処理内容
}
```

独自のList
```Java
List<Staff> staffList = new ArrayList<>();
// ArrayListの<>は型を書いてもいい。書かなくても省略形として<Staff>がはいることになる？？

//Staffはこんな感じ
public class Staff {
	int id;
	String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
}
```


# Set
重複がないリストみたいなもん。勝手に重複排除してくれる。

```Java
HashSet<Integer> hash = new HashSet<INteger>(Arrays.asList(1,2,3,3));

//回す
for(int i :hash){
//処理内容
}

//ラムダ式 4があれば削除する
hash.removeIf(h ->h == 4);


//sort
Set<Integer>revHash = new hash.stream().sorted(Comparator.reverseOrder())
.collect(Collectors.toCollection(LinkedHashSet::new));

```

## Map
key valueがあるデータ。連想配列みたいなもん。

```Java
Map<Integer,String> mapper = new HashMap<Integer,String>();
//Map<キーの型,値の型> オブジェクト名 = new HahsMap<>();

//設定
mapper.put(1,"a");
mapper.put(2,"b");

//get データの取得 引数にキーを設定することにより、バリューが取得できる
map.get(1);

//k,v一緒に回す
for(Map.Entry<Integer,String> entry : mapper.entrySet()){
    System.out.print(entry.getKey); //キー取得
    System.out.print(entry.getValue); //値取得
}
```
mapの使い方

https://qiita.com/mzmz__02/items/0c3c0a0576fd15d3049a

https://qiita.com/kaneko_tomo/items/b9bd6775a78cb95d2a1b

## データ変換


### List -> Set
```Java

List list = new ArrayList();
list.add(1);
list.add(2);
list.add(1);

//変換
Set set = new HashSet(list);

for(Integer s:set){
    System.out.print(s);
}
//出力 1 2
```



### Set -> List

```Java
Set set = new HashSet();
set.add(1);
set.add(2);
set.add(3);

//変換
List list = new ArrayList(set);

for(Integer value : list){
    System.out.println(value);
}

//出力 1 2 3
```

https://www.sejuku.net/blog/20127#index_id1


## ListのSort

```Java
//sort
Collections.sort(al);
//逆順
Collections.sort(al, Collections.reverseOrder());

```
https://qiita.com/aja_min/items/044b9ad2b33968e1e50a



## collectionsかstreamか
https://tech-blog.rakus.co.jp/entry/20220928/sort#Stream-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%8D%98%E7%B4%94%E3%81%AA%E3%82%BD%E3%83%BC%E3%83%88

Stream APIはJava8からの機能で、モダンな書き方で書くことができる。
速度も速く、可読性も高いためStreamが良さそう。

## その他

https://kanda-it-school-kensyu.com/java-basic-contents/jb_ch03/jb_0303/
[Godot 4.2] AnimationMixer.animation_finished は中止時に発火しない



# 検証用コード

```gdscript
extends AnimationPlayer


func _ready():
	play("new_animation")


func _on_animation_finished(anim_name):
	print_debug("finished: %s" % anim_name)


func _on_timer_timeout():
	stop()
	print_debug("stop!")
```

`AnimationMixer.animation_finished` を `_on_animation_finished()` に接続しています。
また、 [Timer](https://docs.godotengine.org/en/4.2/classes/class_timer.html) にアニメーションの再生時間より短い時間を設定しておき、 `timeout` シグナルを `_on_timer_timeout()`に接続しています。

# 出力
```
stop!
   At: res://my_animation_player.gd:14:_on_timer_timeout()
--- Debugging process stopped ---
```

確かにまあ、 "finish" ってやり遂げる的な意味合いが含まれてるらしいですからね……。

# 参考文献
[AnimationMixer — Godot Engine (4.2) documentation in English](https://docs.godotengine.org/en/4.2/classes/class_animationmixer.html#class-animationmixer)
[AnimationPlayer — Godot Engine (4.2) documentation in English](https://docs.godotengine.org/en/4.2/classes/class_animationplayer.html)
未経験から2ヶ月でAssociate Cloud Engineerに合格した話

![associate cloud engineer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763001/026e479e-8032-c05d-3c63-ec87498a01cd.png)


# プロフィール
- 理系大学4年(機械系専攻)
- Google Cloudに関する知識ゼロからスタート

# やったこと
### 徹底攻略 Google Cloud認定資格 Associate Cloud Engineer教科書
最初はこの教材から始めました．知識ゼロからでもよく理解できます．スキマ時間に読み込んでいました．

https://book.impress.co.jp/books/1122101107

### Udemy 【2024年版】Google Cloud 認定資格 Associate Cloud Engineer 模擬問題集
知識が定着しているか確認するため，模擬問題に取り組みました．この問題集は本番に限りなく近いと思います．

https://www.udemy.com/course/2023google-cloud-associate-cloud-engineer/?couponCode=KEEPLEARNING

### 公式模擬試験
無料で何度でも受けられます．

https://docs.google.com/forms/d/e/1FAIpQLSc7bkUHpDbFShBI5xE4u8OO2vl99DrP0htnswa-la9DQynToA/viewform?hl=ja

# おわりに
**やったこと**を周回すれば，十分に合格できるレベルに達すると思います！
みなさんのお役に立てれば幸いです！

弊社は**Google Cloud for Startups**のAIスタートアップに認定されているAI企業です!
お困りごとがございましたら、ぜひ[株式会社 Panta Rhei](https://www.pantarhei.co.jp/)にご相談ください！
Serverless Framework V.4 有料化調査メモ

Serverless FrameworkがVersion4から有料になりました。

Serverlessのサポートに問い合わせて調査したメモを共有します。


公式情報
https://www.serverless.com/framework/docs-guides-upgrading-v4

# 有料化の対象

有料化の対象は年間売上200万ドル以上の組織です。
それ未満の組織や非営利団体は無料です。

## 中小企業割引制度
下記条件をすべて満たしている場合は、中小企業割引が受けられます。
- 年間売上500万ドル未満
- 従業員数が30人未満
- 資本金が500万ドル未満

# ライセンス購入方法

ライセンスはapp.serverless.comにクレジットカードを登録して購入する方法と、AWS MarketPlaceから購入する方法の２種類があります。

ライセンスはオプトイン形式のため、フリーティアの２クレジットを超えても利用は可能(紳士協定との解釈)。

## AWS MarketPlaceから購入する場合の仕様

AWSのOrganizationを利用しているアカウントでAWSマーケットプレイスから購入する際は、どのAWSアカウントで購入しても問題ありません。
AWS MarketPlaceから購入後に、app.serverless.comとリンクします(AWSからリンク情報が送られてきます)。
app.serverless.comの「Settings-Integrations」で紐づけられるAWSのアカウントIDは、購入やクレジットと関係ありません。
つよつよパスワードをPythonに作らせる

# ■背景

都知事選、安野たかひろ候補陣営のテックチームがすごい。
選挙戦においてテックblogがリリースされたのは日本史上初ではないかと思う。

https://note.com/jujunjun110/n/n0362b324831f?sub_rt=share_b

非エンジニアの一般市民だが「私もDXやりた〜い❤️‍🔥」とひとりでテンションが上がっている。

ひとまず、私個人の課題として、現代人として仕方ないけれども定期的にPWを考えるのが面倒。面倒なことは全てPythonにやらせたい。

# ■やりたいこと

強度あるPWを人間の脳を使わずに生成し放題なPythonコードを書く。


# ■実装
## 思想
①　使用する文字セットを定義する
②　文字数を指定する
③　randamモジュールで①から良い感じに抽出させる
④　②の回数分③を続けさせる

## コード
```python
import random
import string

# 使用する文字セットを定義
# 紛らわしいのでIl1Oo0-_を除外

allowed_chars = (
    string.ascii_uppercase.replace('I', '').replace('O', '') +
    string.ascii_lowercase.replace('l', '').replace('o', '') +
    string.digits.replace('1', '').replace('0', '') +
    "!#$%&=/@"
)

# print(allowed_chars) 
# したら
# ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789!#$%&=/@
# と出てくるようにした

# 文字数を指定させる
n = int(input("希望の文字数: "))

# ランダムな文字列を生成
random_string = ''.join(random.choice(allowed_chars) for _ in range(n))

# 結果を出力
print("生成されたPW:", random_string)
```

# 実行例
```python
生成されたPW: gxQcT/%TAa

生成されたPW: EcPdXUH5PAKxNfj

生成されたPW: fm%!

生成されたPW: M$SxdA3p
```
つよそう。

# ■感想

なんとなくAtCoderのA問題っぽい。
randomモジュールをいい感じに活用できてうれしい。
上記コードが正しく動くことは確認済みですので、自由に活用頂いて構いません。

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

## IR active Stereo という選択肢
### Intel RealSenseの比較表

![Screenshot from 2024-06-28 14-09-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/f1349dec-ed0d-48a5-0c86-59d4ff8369d7.png)
https://www.intelrealsense.com/compare-depth-cameras/

## ヒューマノイドほしい3Dカメラの条件
### 要件 近接距離が頭部から20cm程度からはdepthを返してほしい。
Depth範囲で見たRealSenseの分類
##### 0.3 ~ 3m の品番:
D435/D435i,
D435f/D435if

##### 0.6 ~ 6m の品番:
D457/D456
D455/D455f

##### 7cm ~ 50cmの品番:
D405
これは使うとすれば、ロボットのwrist camera にいいだろう。
「42 mm × 42 mm × 23 mm」という寸法がどれだけ、ロボットの設計の中で許されるかだろう。
### 要件：RGB画像とdepth画像の対応点はついてほしい。
- 下記の記事にあるように対応をつけることはできるようだ。（しかし、精度は不明）
[RealSence D435をPythonで使う【画角を合わせる編】（Windows10）](https://qiita.com/tom_eng_ltd/items/635414ff0b43e1c506f6)

```:.py
# Alignオブジェクト生成
align_to = rs.stream.color
align = rs.align(align_to)

aligned_frames = align.process(frames)
color_frame = aligned_frames.get_color_frame()
depth_frame = aligned_frames.get_depth_frame()
```
上記の記事からの引用


### 要件：　IMUから姿勢情報を取得したい
- D435/D435i との違いはIMU(Inertial Measurement Unit) の有無です。
- qiita [RealSenseからIMUの情報を取得する方法](https://qiita.com/kakuteki/items/3cdf59dad3ff39b6ff35)
- community [D435i real world coordinates](https://support.intelrealsense.com/hc/en-us/community/posts/360052359633-D435i-real-world-coordinates)
- camera座標系を絶対座標系に変換するためには、そのカメラの姿勢情報がcamera画像と同期してとれることが大事です。
- 後付けするとき発生する困難：
    - まず、カメラに連結して安定に機構的に付ける方法がない。
    - カメラのサンプリングと同期した信号を別のIMUに入れてサンプリングする手法がない。

### 要件：なるべくなら防水であってほしい
IP65を満たす品番：
D457/D456
他は、非対応

### 要件：30fpsよりも高いフレームレートでサンプルしたいときもある。

- Depth Frame Rate: Up to 90 fps



### 要件（人による）：カメラとボードまでの距離を十分に長くしたい。
- GMSL FAKRA のインタフェースを持つのは、D457だけである。

The Intel® RealSense™ Depth Camera D457 is our first GMSL/FAKRA high bandwidth stereo camera. The D457 has an IP65 grade enclosure protecting it from dust ingress and projected water.

https://www.intelrealsense.com/depth-camera-d457/

### 
Depth Filterの
	All-Pass	IR-Pass
って何がどう違ってくるんだろう。

--------------------------------------

https://github.com/IntelRealSense/librealsense

https://github.com/IntelRealSense/realsense-ros

[NVIDIA Jetson installation](https://dev.intelrealsense.com/docs/nvidia-jetson-tx2-installation)

[Isaac ROS RealSense Setup](https://nvidia-isaac-ros.github.io/getting_started/hardware_setup/sensors/realsense_setup.html)

[Getting Started with RealSense™ SDK2.0 for Matlab](https://github.com/IntelRealSense/librealsense/blob/master/wrappers/matlab/readme.md)

----
~~Intel　さんへのお願い
RealSenseモジュールの外形データをください！
どうやって、ロボットに固定するかを考えなきゃいけないんです。~~

https://dev.intelrealsense.com/docs/stereo-depth-camera-d400#cad-files


dandelion　さんありがとう！。

-----------------------------------
## 関連記事
- [【RealSense】RGB画像でクリックした位置の取得](https://qiita.com/hoshianaaa/items/b0caef7b4738b00d6d7d)

## Intel [Building an AI-powered robotic arm assistant using D435 June 12, 2024](https://www.intelrealsense.com/building-an-ai-powered-robotic-arm-assistant-using-d435/)

![](https://www.intelrealsense.com/wp-content/uploads/2024/06/architecture_diagram_Pv7KY70aKv.png.webp)

RealSense に関する記事は、qiitaでも多数書かれています。
ぜひ、それらを検索してください。

------
80日目 CloudFormationを触り始めた社畜L

## 🔍まえおき
開発環境からテスト環境、ステージング環境へ簡単に移行できるようにしたい。
そう考えた私は、CloudFormation(以後:CFn)について勉強を始めたので話していくよ。
- - -
## 🔍概要
CFnはJSONやYAMLで書かれたテンプレート文をもとにAWS環境を構築するサービスです。
以下に簡単な動作手順を説明するよ。
- - -
#### 動作手順
1. CFnコンソール上ではテンプレート文をもとにスタックを作成する。
2. 作製したスタックに必要なパラメータ(テンプレートで要求するようにしていれば)
を入力し実行
3. [CREATE_COMPLETE]と表示されていれば環境構築は完了。
-- 環境構築に失敗した場合は自動でロールバックを行う
- - -

## 🔍テンプレート文の書き方
環境構築を手動でやる代わりに文字で残したって言うのは説明しましたが、
実際テンプレートなんて何を書けばいいのか分からないと思うので解説していくよ。(yaml)
- - -
### 🔎必須
#### 1. バージョン
どのバージョンを利用してCFnを利用するか指定
※ 現状バージョンはこれしかないので、このまま貼ってね。
```yaml
AWSTemplateFormatVersion: "2010-09-09"
```
#### 2. パラメータ
作成したいリソースの名前とか、CIDRとかその他場合によって変わるものは、
ここで宣言しておくと汎用性が高いものが書けるよ。
※ 一応なくても動作はします
```yaml
Parameters:
```
#### 3. リソース
ここで実際どのAWSリソースをどの設定で起動するか書いていくよ。
※ 基本的に上から順に実行されるので、**書く順番**には注意！！
```yaml
Resources:
```
- - -
### 🔎パラメータの書き方
#### 1. 標準入力型
どんな文字でも入れられるようにできるよ。
ただしCIDRやAMI等で無効なものを入力するとエラーになるので注意
```yaml
  ResourceName:
    Type: String
    Default: (最初から入力される文字)
    Description: (入力の説明)
```
#### 2. 選択型
開発段階やtrue,falseでの指定など入力値を指定のものから選ばせたい場合に利用されるよ
```yaml
  Environment:
    Type: String
    AllowedValues:
      - development
      - staging
      - production
```
#### 3. AWS固有パラメータ
[[AWS固有パラメータ]](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)というものを使ってキーペアやサブネットなど既存の選択可能なものを
プルダウン形式として選択できるよ。
※ 一部パラメータはプルダウン不可
```yaml
  KeyName:
    Type: "AWS::EC2::KeyPair::KeyName"
    Description: (入力の説明)
```
- - -
### 🔎リソースの設定
利用するAWSリソースを[Type]で宣言し、次の[Properties]で利用するリソース毎の設定を入力するよ。
※今回はEC2起動の設定
```yaml
  PrivateEC2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref AMIId
      KeyName: !Ref KeyName
      InstanceType: !Ref InstanceType
      NetworkInterfaces: 
        - AssociatePublicIpAddress: false
          DeviceIndex: 0
          SubnetId: !Ref SubnetId
      Tags:
        - Key: Name
          Value: !Ref EC2Name
```
- - -
### 🔎パラメータを利用しての設定方法
上記の例にも書いているように[!Ref]に続けてパラメータで作成したリソース名を宣言することで
そこで設定したリソース名をパラメータで利用できるよ。
```yaml
!Ref EC2Name
```
- - - 
## 👓真実はいつも１つ！（結論）
今回はCFnについて基本的なことを説明しました。インポート、エクスポートを混ぜていくことで
よりよくなっていくと思います。
raspberry pi zeroにseleniumをインストール(chromiumをバージョンダウン)する

古いRaspberry Pi Zeroでseleniumがエラーを吐く:fearful:

### 経緯
Raspberry Pi Zeroにchromiumとseleniumをインストール
```bash
sudo apt-get install chromium
sudo apt-get install chromium-chromedriver
pip install selenium
```
スクリプトを作成
```python
#!/usr/bin/env python

from selenium import webdriver
from selenium.webdriver.chrome import service as fs

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
chrome_service = fs.Service(executable_path="/usr/bin/chromedriver")

driver = webdriver.Chrome(service=chrome_service, options=options)

driver.get('https://qiita.com/')
```
で、実行
```bash
Traceback (most recent call last):
  File "/home/Workspace/test_selenium.py", line 12, in <module>
    driver = webdriver.Chrome(service=chrome_service, options=options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/local_python/lib/python3.11/site-packages/selenium/webdriver/chrome/webdriver.py", line 45, in __init__
    super().__init__(
  File "/home/local_python/lib/python3.11/site-packages/selenium/webdriver/chromium/webdriver.py", line 55, in __init__
    self.service.start()
  File "/home/local_python/lib/python3.11/site-packages/selenium/webdriver/common/service.py", line 102, in start
    self.assert_process_still_running()
  File "/home/local_python/lib/python3.11/site-packages/selenium/webdriver/common/service.py", line 115, in assert_process_still_running
    raise WebDriverException(f"Service {self._path} unexpectedly exited. Status code was: {return_code}")
selenium.common.exceptions.WebDriverException: Message: Service /usr/bin/chromedriver unexpectedly exited. Status code was: -4
```
すると、エラー
どうにもならなかったので、Raspberry Pi OSを再インストール
状況変わらず・・・:scream:
chromedriverのバージョンをいろいろ変えてもダメ・・・:confounded:

### やったこと
- OSの再インストール
legacy,31-bit版を入れました。
(liteはpipコマンドが入っていない模様)
- とりあえず、chromiumをインストール(やらなくてもいいかも)
```bash
sudo apt-get install chromium
sudo apt-get install chromium-chromedriver
```
- seleniumをインストール
```bash
pip install selenium
```
- chromiumのバージョンダウン
http://archive.raspberrypi.org/debian/pool/main/c/chromium-browser/
このサイトから、以下のパッケージをダウンロード
```
chromium-browser_95.0.4638.78-rpt6_armhf.deb
chromium-browser-l10n_95.0.4638.78-rpt6_all.deb
chromium-chromedriver_95.0.4638.78-rpt6_armhf.deb
chromium-codecs-ffmpeg-extra_95.0.4638.78-rpt6_armhf.deb
```
ダウンロードしたファイルをインストール
```bash
sudo dpkg -i chromium-browser_95.0.4638.78-rpt6_armhf.deb
sudo dpkg -i chromium-browser-l10n_95.0.4638.78-rpt6_all.deb
sudo dpkg -i chromium-chromedriver_95.0.4638.78-rpt6_armhf.deb
sudo dpkg -i chromium-codecs-ffmpeg-extra_95.0.4638.78-rpt6_armhf.deb
```
で動作するようになりました。

### 参考
chromiumのバージョンは、以下で動作したという記事を元にしています。
(もう少し新しいものでも動くかもしれません。)
[ラズパイでSelenium](https://wiki.chobits.com/?%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%A7Selenium)

※自己責任でお願いします。
未経験者がこれからのエンジニアライフプランについて考えてみる

## ★はじめに★
現在「唯一無二の素敵なエンジニア」になることを目標に日々奮闘しているわーちゃんと申します。
エンジニアを目指す理由は人それぞれ。なんの職業選ぶにしても、人それぞれなのは変わりませんよね。
今回は[『自分が考える最高のエンジニアライフプランについて紹介しよう』](https://qiita.com/official-events/23e94ba994880fab50be)というテーマへの投稿になります。
エンジニア業界なんて今まで見向きもしてなかった…ライフプランなんて…というような私と似た境遇の方の参考になれば幸いです。

## ★そもそもライフプランってなんだっけ★
まずはざっとライフプランの解説から。
検索をかけた時上位にヒットしたサイトがこちらになります
- [ライフプランとは？ライフプランを作る目的やメリットを紹介！](https://www.mizuhobank.co.jp/academy/20230908/index.html)
この中の一部を記載しておきます
> ライフプランとは、人生における大きなイベントに際して必要になるお金を予想して計画を立てることや、自分の価値観に沿った人生を送るために具体的に何をする必要があるかを考えることです。

## ★現状から考える事★
### 私について
- 現在会社員
- 実家暮らし(いつもありがとうございます)
- 建設業界、体力の厳しさを強く感じている
- 今の経済・年金・政策ほか大きな不安がぬぐえない

### 大きなライフイベントを考えてみる
- 旅行
- 結婚
- 住宅購入
- リフォーム
- 出産育児
- 車など

検索すればするほど出てきます💦
うーん、記事の趣旨が変わってしまいそうなので、最優先事項**エンジニアになる**で**エンジニアになるまでのライフプラン**を掘り下げてみます。

## ★エンジニアになるまでの行動目標をたてよう★
#### 1\. 技術力を磨く
- 学習したことを見せられる形で記録に残すようにする
- 日々継続することをやめない
- GPT頼みにならないようにする
- なぜ？どうして？可能な限り、横＆縦に視野を広げる
- 公式ドキュメントを読むようにする

#### 2\.経歴に関してあらいだす
- 仕事の中でほめられたこと=強みになる
- 困難なことにどう対処=対応力
- 普段の仕事の取り組み方=仕事への熱量？
- できたこと、できている事、を強く認める

もっとあらいだしてみて、それをどう活かしていけるのか、活かすことができそうか、言語化できるようにする

#### 3\. カルチャーマッチを考える
- 自分のいままでの価値観を考える
- 価値観に対してどう行動していたのか
- Web業界の知識をリサーチする。
- エンジニア向け転職サイトの未経験談等参考にしてみる

#### 4.希望の光、明るい事を考える
- ~~少なからず闇はどの業界にもあるのか~~
- できている人ばかりみて落ち込まない。あの人も最初からわたしのように完璧であったはずがない。相当努力し続けている人なんだ！
- メンターとなるような人がいればいいけど、いない場合は本やSNSで代用
- 成功談から学ぶ、失敗などない、今がいい状態、これからもっと良くなるだけ

## ★行動目標からまずはエンジニアになる★
未経験の私にとって、最高のエンジニアライフプランを考えるのはいささか尚早なわけです。
まずは行動目標の内容を愚直に取り組むことがベスト。
いわば、急がば回れ。近道をしてつかんだとしても後から何かがやってくる…

キャリア系の記事はもっと掲載していけるように頑張ります。
同じような境遇の人とつながりたいですし
まずはここまで、ありがとうございました。
Hololensの画面をミラーリング【miracast編】2024年7月Windows11 home

# はじめに
Hololens装着者が見ている画面をPCにストリーミングする方法について記載します．
元々はHololens公式アプリを使って画面をストリーミングしていたのですが，画質が荒く，遅延も大きかったため，miracastを使う方法に変更してみました．

# 環境
- Windows11 home
- Hololens2

# PC側の操作

### キャストの追加
Windows11の場合，デフォルトでミラーリングができないようですので，キャストを追加します．
![スクリーンショット 2024-06-26 164908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776719/9a548b4f-472f-fc65-45c6-8922dfae2b60.png)
画面右下のスピーカーマークをクリックし，Wi-Fiなどを設定するタブを表示します．

ここにあるワイヤードディスプレイがデフォルトでは入っていないため，鉛筆マークをクリックし「キャスト」を追加します．

### ワイヤレスディスプレイを追加
「オプション機能を追加する」から，ワイヤレスディスプレイを選択し，インストロールします．
![スクリーンショット 2024-06-26 164731.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776719/50534108-7c72-3e0c-cdfb-c7639b75598c.png)

### 「このPCへのプロジェクション」を変更
PCが外部からの映像を受信するために必要な設定を行います．
「システム」→「このPCへのプロジェクション」から，設定を変更します．
スクリーンショットの内容は私が個人的に良いと思った設定です．
![スクリーンショット 2024-06-28 13.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776719/c43a9d8c-4709-3032-4b5d-9891ca12ca60.png)

これで、PC側の準備は整いました．

# Holens側での操作
Hololens2では，元々miracastが利用できます．
ホーム画面を開き，右下のMiracastマークを選択します．

接続したいPC側の準備ができていれば，デバイスが表示されますので，選択します．
Hololens側で選択すると，PCに青い以下の画面が自動的に立ち上がります．
![スクリーンショット 2024-06-26 170331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776719/52849bcb-54e0-55a8-ef0e-c9448f77a2bc.png)
PIN設定をしている方は，PCに表示されている番号をHololensに入力します．

入力が終わり次第，以下のポップアップが表示されるため，「OK」を選択します．
![スクリーンショット 2024-06-28 13.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776719/6a1f3096-74ad-369c-e440-ac2319377489.png)


そうしましたら，Hololensの画面がPCにミラーリングされていると思います．
![スクリーンショット 2024-06-28 13.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776719/48bbc6f5-54dd-97e9-af00-93b0b103dd2f.png)



私の環境では，接続してから1分程度はラグが酷く，使い物にならないレベルでしたが，少し経つと画質も綺麗で遅延も少なくミラーリングされました！
そのため，少し時間をおいて安定してから利用することをお勧めします．

# おわりに
本記事では，Windows11環境でのhololens2の画面をミラーリングする方法，miracast編について記載しました．
最後までお読み頂きありがとうございます．
Mrsmajor 3.0に関して

:::note alert
※警告※
本レポートはマルウェアの解析を教育目的で行ったものです。マルウェアの実際の作成や配布は違法であり、決して行ってはいけません。本レポートの内容を不正な目的で利用することは固く禁じられています。本レポートに記載されたコード断片は説明のためのサンプルであり、実行可能なマルウェアではありません。
:::

こんばんは！初投稿なので小さなミスは見逃して！
あとC#についての記事ですがマジで触った事ないのでミスってたら許してください！
自分なりに調べた結果なので間違ったら指摘してください！

<a>ホラー系のウイルスなので怖いの苦手な人は見ない方がいいかも！

# Mrsmajor 3.0とは?
簡単に言うとめちゃ危険なコンピューターウイルスです
バージョン:　3.0が最新らしい(4.0の動画が出回っているが作者が違う)
制作者:　　　不明(ロシア語使える人らしい)
制作日:　　　2020年初期頃

# 内容について
<a>バージョン3.0</a>から、アプリを起動するのに二つの要素が追加されました

<b>1:実機だと起動できない事</b>
![スクリーンショット 2024-05-02 13.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782857/b397f90a-fcd4-42a5-e5f4-8134795bbcfb.png)
実機で起動しようとする場合「VM check error 102」が出ます。
簡単に言うと<a>仮想環境かどうかを判定している</a>感じです<br>

処理内容(多分こんな感じ？)
2種類あったんで記載します

①:　<b>WMI</b>(windowsの様々な情報や機能にアクセスするための強力なインターフェイス)　
を使ってコンピュータシステムのメーカー情報を取得し、
"<a>仮想環境の名前①</a>"や"<a>想環境の名前②</a>"という文字列が含まれているかのチェックをして仮想環境かどうかを判定する。

```c#:VMcheck①.c#
string manufacturer = item.GetPropertyValue("Manufacturer")?.ToString() ?? string.Empty;
if (manufacturer.ToLowerInvariant().Contains("仮想環境の名前①") || manufacturer.Contains("仮想環境の名前②"))
```

②: VmCallという外部DLLを呼び出してVMCALL命令を実行し、例外が発生すればVMと判断します的な?(AIが提示したコードマジ理解できなかった、下手に書いたら捕まりそうだから書かないでおく...)
これ以外にも方法があるみたいです...  良かったら調べてみてね！
これを見るに作者は実機で動作させないようにしているあたり優しい

<b>2:起動するのにパスワードを要する事</b>
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782857/ed81b0ab-5c82-a477-9bb7-bd7b183ef5bf.jpeg)
2.0の時はチェックボックス式だったのに対して3.0から制作者にメールしないとパスワードが分からないようになっています(<a>もし分かっても公表することは禁止されてます</a>)
<hr>
余談が長引いてしまいました　ごめんちゃい<br>
ここから本編の内容になります。<br>

:::note warn
※この下からホラー描写な画像が表示されます<br>
:::


<br>
今回はこのサイトを参考にしてマルウェアを紐解いていこうと思います

https://github.com/Gork3m/MrsMajor-3.0/tree/master

内部構造はこんな感じです<br>(ネットに上がっているだけなので一部ファイルが足りないかもしれないです)
![スクリーンショット 2024-05-02 16.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782857/70588b92-a82d-536e-2719-d3054402a563.png)

めちゃくちゃ多いっすね.........
上から順番に調べていきます☺️

まず一番上のファイルの中身(Properties)なのですが

簡単に言うと会社名、製品名、著作権情報などが記載されたアセンブリ言語でした。


他のファイルは実行画面から紐づけていきます！
<hr>
実行画面はこんな感じです

![スクリーンショット 2024-05-05 14.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782857/17ae72af-943f-3c98-85d0-0678acd0dabe.png)
![スクリーンショット 2024-05-05 14.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782857/4fcb8fdf-ecd6-60ca-90f1-606ca63cefff.png)
    ![スクリーンショット 2024-05-05 14.51.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782857/d0e2ff24-7614-16c7-0a62-6f872cdc352c.png)

おおまかな仕組みとしては赤いバーがタイマーになっており、時間切れになったらパソコンが動かなくなる仕組みです。

 <h2>大まかな流れについて説明すると　</h2>

①可視化できないウィンドウをつかって　コマンドプロンプトで権限の変更などを行う

②起動に必要なファイルの書き換えを行う(login.exeとか)

③再起動時に起動ファイルが書き換えられてるため開かない

Mrsmajor2.0のときは、起動時に必要なファイルを上書きして(login.exeとか)権限とかを直したら終わったのですが、

Mrsmajor3.0の場合一筋縄では行かないみたいです。

<h1>復旧のやり方に関しては後日記載します...</h1>