OmniAICreator/Qiita-1.07M huggingface dataset:
元ヤフーエンジニア社長が考える、未経験エンジニアの最適な勉強時間

### 対象者
・未経験からエンジニアを目指したい！と考えている方
・エンジニアになったけどなかなか成長できてないな・・と感じている方
に読んでいただけると嬉しいです！

### 自己紹介
株式会社PRUMという会社の代表をしています。岩本です。
https://prum.jp/

SES企業でエンジニアとして就業したのち、ヤフーでもエンジニアとして働いておりました。
2019年、PRUMを創業し組織を５期目の途中で70名の組織まで成長させました。

エンジニアの成長について、誰よりも考え抜いてきた自信があります。

### エンジニアって、どれくらい勉強した方がいいの？
ずばり、はじめの2年間は、空いている時間は全て勉強しましょう。
そう考えるほうが楽です。圧倒的に楽です。

理由は後で書きます。

### そもそも、エンジニアという仕事について
エンジニアという職業は、とっても魅力的な仕事です。
人手不足のため給与水準もこれからどんどん上がっていくし、IT業界ってイケてる会社が多いし、自分の価値が上げやすいし、スキルの習得がわかりやすいし。
とても魅力的です。みんなエンジニアになればいいじゃんと思います。

ただその代わり、「最初の壁」が非常に分厚い仕事です。
一人前になるまでのハードルが高い。その間に挫折する人も多いです。

習得しなくてはいけないスキルや知識がとても幅広く、そして一つ一つが奥深いからです。

プログラミング言語も、フロントエンド、バックエンド、それぞれに複数の言語があり、それだけでなくインフラ、ネットワーク、セキュリティ、データベース、DockerやGitなどの周辺知識・・・などなど多岐にわたります。
少なくともはじめの数ヶ月は、何がなんなんだかよくわかりません。そういうもんです。今優秀ぶってる人もみんな「わけわかんねー」から始まっています。

### わけわかんねーから、「チョットわかった」になるために
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668950/ac616413-e27e-4bd3-4592-aec381b019b7.png)
成長曲線というものがあります。
こんな感じの図です。

人間は、やったらやっただけ直線で成長していくわけではありません。
成長するにも前提となる「知識」「読解力」が備わっていないと、一度覚えたことを忘れてしまったり、本を読んでもそもそも理解できなかったり、ということが普通に起きます。安心してください、全然普通です。

そんな時期を乗り越えて「あれ、プログラミングってもんがチョットわかってきたぞ」「これ実装して、と言われてなんとなくできるようになってきたぞ」となるまでに、僕なりの統計では、<b>最低1年〜2年くらいかかります。</b>

そこまでは、あまり達成感も得られないかもしれないですが、とにかく頑張る必要があります。
エンジニアを志すにあたって、その覚悟は持っておきましょう。

### 必要な勉強時間は？
以前、英語の学習をしていた時代に、誰かから聞いた話があります。

「穴空いたバケツに水入れてるようなもんだ」
「ちょろちょろ水入れても、全部こぼれ落ちちゃって意味ない」
「それでも水を貯めるには、とにかく大量に入れ続けるしかない」

つまり、忘れちゃったりこぼれ落ちちゃったり、効率悪く進んでいくしかない前提で、とにかく大量の時間を使って勉強しなさいというメッセージです。

これはエンジニアの初期学習においても全く同じことが言えると思います。
1日10分でも、もちろんやらないよりはやった方がいいですが、そのくらいのペースではいつまで経っても一人前のエンジニアにはなれません。

最低でも1日2時間、いや3時間。
週に15時間、いや20時間。

<b>最低でも</b> そのくらいは必要です。

### おすすめの考え方
「どれくらい勉強しなきゃいけないんだろ・・・。」
とか考えている時点で、ナンセンスです。

下積み期間なんて、短ければ短いほどいいに決まっています。
人間は弱い生き物です。
きついことをいつまでも続けてはいられません。

<b>いち早く「楽しいな」という感情になるまで、上達することが大事です。</b>

僕は32歳になった今もバスケを定期的にやるのですが、それは<b>できるから楽しいんです！</b>
毎回1本もシュートが入らないくらい下手くそだったら、とっくに辞めてます。つまんないもん。

できるから楽しいんです。できるようになるまでは辛いに決まっている。
そして辛い時期をいつまでも耐えられるほど人間は強くありません。２回目ですが。

早めに「できるから楽しい」という状態にするためには、<b>空いているすべての時間は、PCを開く。勉強をする。</b>という状態にするのが一番楽です。

テレビ見る、Tiktok見る、Youtube見る、友達と遊びに行く、寝る。
それらの誘惑を毎回振り払って机に向かえるほど人間は強くありません。

<b>それらの選択肢をなくしましょう。</b>
電車に乗る時も、昼休みも、帰ってからも、風呂入った後も、朝起きてすぐも。<b>まず、PCを開く。勉強をする。</b>

これに慣れると、めちゃめちゃ楽です。
1日に何度も接することで、記憶の定着の仕方が違います。

もちろんたまには遊びに行くことも大事なので、予定が入ったらそれはそれで全力で楽しむ。
でも予定が終わったら電車の帰り道からもう勉強モード。

やる気スイッチを入れることが一番コストかかって大変なので、<b>常時スイッチオン状態</b>にすることを意識してみましょう。

この1~2年を乗り越えたら、素敵な未来が待っています。
頑張りましょう！！

---
PRUMのエンジニアの95%以上は、未経験からの採用です。
ぜひ、求人を見てみてください！

▼ Wantedly求人
https://www.wantedly.com/projects/626662

▼ コーポレートサイト
https://prum.jp/

VISION 『日本で一番エンジニアが成長する会社を創る』

ご応募お待ちしておりますー！
[macOS] インストールしたのに "command not found" になった場合のパスの通し方

# はじめに
Homebrewでパッケージをインストールしたのにパスが通ってなくて、解決までに時間がかかったので、その解決法を簡単にまとめました。

# 問題
HomebrewでPythonをインストールしたのに「zsh: command not found: python３」と表示されてしまう。

# 解決方法
Homebrewでインストールしたパッケージの実行ファイルは「/usr/local/bin」に格納されています。ここで、「.zshrc」ファイルを開いて、以下の内容を一番下に追記して保存します。
```zsh
export PATH=$PATH:"/usr/local/bin/"
```
次に、以下のコマンドを実行し、バージョンが表示されたら成功です。

```zsh
python3 --version
```
もしダメだったら、以下のコマンドを実行して「.zshrc」ファイルを再読み込みしてみてください。

```zsh
source ~/.zshrc
```

# おわりに
この記事が少しでも誰かの役に立てば嬉しいです。


# 参考
https://qiita.com/yutoo89/items/1cc17482da7fe8ab496f
【データベース設計】VSCode上でDrow.ioを使いER図を作成する

# 手順

[VSCodeの拡張機能をインストールする](#vscodeの拡張機能をインストールする)
[.dio拡張子でファイル作成](#dio拡張子でファイル作成)
[1. その他の図形](#1その他の図形)
[2. ソフトウェア ➡ ER図](#2ソフトウェア--er図)
[3. テーブル選択](#3テーブル選択)
[4. リレーション作成(接続開始)](#4リレーション作成接続開始)
[6. スタイルタブでカスタマイズ](#6スタイルタブでカスタマイズ)
[IE表記法の足は自作する必要がある](#ie表記法の足は自作する必要がある)


## VSCodeの拡張機能をインストールする
「Draw.io Integration」
![screenshot_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/57812c98-c70b-9f36-944f-a8cedacb4a18.png)

## .dio拡張子でファイル作成

![screenshot_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/eca01916-5241-d1ad-a18a-010e4020418d.png)

### 1.　その他の図形
![screenshot_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/c487a7a1-ab87-22c5-f7bd-fbf8a89e7f80.png)

### 2.　ソフトウェア ➡ ER図
少し見づらいですが、「図形」➡「ソフトウェア」➡「ER図」を選択
![screenshot_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/61a0d01a-6866-c8b4-b753-1894a7443f1f.png)


### 3.　テーブル選択
テーブル選択して、コピペでもう一つ作成。
![screenshot_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/da84c0b7-4d0f-f5e2-dd1a-f519402aefd6.png)


### 4.　リレーション作成(接続開始)
テーブルの外枠にカーソルを乗せると緑色に変化する。
![screenshot_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/89b5f9a1-11f4-6e77-dfe5-3d04df787df6.png)

### 5.　リレーション作成(接続)
クリックしたままもう一つのテーブルの外枠に繋げる。
![screenshot_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/e3d393de-2342-f4c1-d553-ce0d2e53ffa1.png)



### 6.　スタイルタブでカスタマイズ
右側のスタイルタブで
リレーションのスタイルを変更できます。
![screenshot_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/a0281942-2b4f-70bb-2f6b-ec80dfd1104b.png)


#### IE表記法の足は自作する必要がある
例えば1対多 (1：N)の場合、デフォルトで選択できるリレーションは以下の通りです。
![screenshot_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/9f458e23-8c2e-0039-681e-b1e8274a42f7.png)

これだと基準と違うため。
以下のように右側のメニューから足を選択して自作する必要があります。
少々面倒ですが、正しい正規化を行えば、ほとんどのリレーションは1対多(1：N)で済むはずなので、コピペで使いまわすのが賢明です。
![screenshot_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/04e12b96-b197-0754-6b80-8b7937bd6028.png)
データベース設計における物理層、論理層、概念層の理解

## はじめに
データベース設計において、「物理層」「論理層」「概念層」の3つの層があります。これらの層はそれぞれ異なる視点や役割を持ち、システム全体の設計と管理を効率化します。今回は、それぞれの層について詳しく解説します。

## 1. 概念層（Conceptual Layer）

### 概念層の概要

概念層は、データベースシステムの最も抽象的なレベルであり、全体のデータ構造や関係をユーザーの視点で定義します。この層は、業務要件やビジネスルールに基づいてデータモデルを構築することを目的としています。

### 概念層の特徴

- **抽象化**: 実際のデータベースの物理的な詳細を隠し、データの意味や関係を抽象的に示します。
- **独立性**: 論理層や物理層の変更に影響されずに独立しています。
- **ユーザー視点**: データをどのように利用するかをユーザーやビジネスの視点で記述します。

### 概念層の例

例えば、顧客情報を管理するシステムの概念モデルでは、「顧客」「注文」「商品」などのエンティティと、それらの間の関係（例：顧客が注文を出す）が定義されます。

```plaintext
顧客 <--- 発注 --- 注文 --- 含む ---> 商品
```

## 2. 論理層（Logical Layer）

### 論理層の概要

論理層は、概念層をより詳細に具体化し、データベース管理システム（DBMS）で実際に使用するデータ構造を定義します。この層は、テーブルやビュー、インデックスなどの論理的なデータ構造を設計します。

### 論理層の特徴

- **データベース依存**: 実際に使用するDBMSの機能や特性に基づいて設計されます。
- **詳細な構造**: テーブル、フィールド（カラム）、データ型、制約（主キー、外部キー、一意制約など）が詳細に定義されます。
- **SQLスキーマ**: 論理層は、通常SQLスキーマとして表現され、データの保存やアクセス方法が記述されます。

### 論理層の例

顧客情報を管理するシステムの論理モデルでは、以下のようにテーブルが設計されます。

```sql
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Name VARCHAR(100),
    Email VARCHAR(100)
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATE,
    CustomerID INT,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName VARCHAR(100),
    Price DECIMAL(10, 2)
);

CREATE TABLE OrderDetails (
    OrderDetailID INT PRIMARY KEY,
    OrderID INT,
    ProductID INT,
    Quantity INT,
    FOREIGN KEY (OrderID) REFERENCES Orders(OrderID),
    FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
```

## 3. 物理層（Physical Layer）

### 物理層の概要

物理層は、データの実際の物理的な保存方法を定義します。ハードウェアやストレージデバイス上でデータがどのように格納され、アクセスされるかを具体的に設計します。

### 物理層の特徴

- **ストレージの管理**: データがハードディスクやSSDなどの物理ストレージにどのように配置されるかを定義します。
- **パフォーマンス最適化**: インデックスの配置、パーティショニング、クラスタリングなどの技術を用いて、データアクセスの効率を最適化します。
- **バックアップとリカバリ**: データのバックアップ方法やリカバリ手順も物理層で定義されます。

### 物理層の例

物理層の具体的な設計は、使用するDBMSやハードウェア構成に依存します。例えば、インデックスの配置やデータパーティショニングの方法が含まれます。

```plaintext
データベースファイル構成:
- customer_data.db: 顧客情報を格納
- order_data.db: 注文情報を格納
- product_data.db: 商品情報を格納

インデックス:
- インデックスファイル: Customers_Name_Index.idx（顧客名に対するインデックス）
- インデックスファイル: Orders_Date_Index.idx（注文日付に対するインデックス）

バックアップ:
- 毎日深夜2時に完全バックアップを実行
- 1時間ごとに増分バックアップを実行
```

## まとめ

データベースシステムの設計には、物理層、論理層、概念層の3つの層が重要な役割を果たします。これらの層を適切に設計することで、システムの効率性、保守性、拡張性が向上します。

- **概念層**: データの意味や関係を抽象的に定義します。
- **論理層**: 実際のDBMSで使用するデータ構造を具体化します。
- **物理層**: データの物理的な保存方法を定義し、パフォーマンス最適化を行います。
OCIで利用金額が設定した値になった時に通知する方法

OCIで月額利用料が設定された金額になった時にメールで通知する方法がありますので紹介します。

## 予算の設定方法

OCIコンソールの左上の3本線から「請求とコスト管理」を選択すると右側に「予算」という項目がでてくるのでそちらを選択します。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/3c364d77-770d-b92d-601c-80464bd4a6bb.jpeg)

予算の作成というボタンがあるので押下します。
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/5db78c4d-78d9-1d31-4d19-f69050e905a9.jpeg)

予算の作成ウィンドウが開くので入力していきます。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/359fc74b-9047-58ce-190a-a2948defe016.jpeg)

## 設定した閾値をオーバーしてみる

今回は動作確認をするためにすぐに予算をオーバーするように10円で設定します・・・
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/f51dc839-3393-1b80-f842-fc9745b8cde4.jpeg)

閾値を80%に設定したので10円の80％、つまり8円を超えた段階でメールが飛んできます。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/30c2cd40-1042-020f-01b0-e86a36e96732.jpeg)
※今回のデモ環境はAlways Freeの環境なので普段は課金されていません。

閾値を超えさせるために1時間で8円を以上になるくらいのリソースを作成してみました。
AMDのE4が1oCPUが1時間3.5円、メモリが1GBが1時間0.21円のようなので2oCPU、10GBのLinuxサーバーを構築してみました。
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/81db61dd-4df2-966a-c6a9-891db8153e39.jpeg)

https://www.oracle.com/jp/cloud/price-list/#pricing-compute

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/1a1581ef-270c-2865-bbad-cc1f52ac9caa.png)

ストレージは無償の範囲に入っているのでは無いかと思うので、恐らく1時間9.1円になるはずです。

設定してから5時間後ぐらいにメールが届きました・・・
![cost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/6bac79bd-726b-32d2-d6df-7e55139f217e.jpeg)
ただ、「あれ、とどかないなぁ・・・」としばらく稼働させておいたので実際はあと2時間分くらいかかっていると思います（汗）

恐らく、集計は1日1回でその時に予算を判断するのではないかと思っています。

閾値を上手く調整して適切な予算管理をできるようにお役に立てれば良いかと思います。
メールセキュリティ



|項目|S/MIME|DKIM|SPF|
|--|--|--|--|
|1. 目的:|メールの内容そのものの暗号化とデジタル署名を提供。<br>メールの内容の機密性、完全性、および送信者の認証を保証。|メールの送信ドメインの認証を提供し、スパムやフィッシングの防止を目的。<br>メールが送信ドメインの許可を得て送信されたことを受信サーバーに保証。|メール送信サーバーの認証を提供し、なりすましメールの防止を目的。
|2. 動作方法:|メールの送信者がメッセージを暗号化し、デジタル署名を付与。<br>受信者は送信者の公開鍵を使用してメールを復号し、署名を検証。|メール送信ドメインの管理者がDNSに公開鍵を公開。<br>メール送信時に、送信サーバーがメッセージの一部にデジタル署名を付与。<br>受信サーバーがDNSから公開鍵を取得し、署名を検証して送信ドメインを確認。|メール送信ドメインの管理者がDNSにSPFレコードを公開。<br>受信サーバーがSPFレコードを確認し、メール送信サーバーのIPアドレスが許可されているかを検証。|
|3. 利用方法:|ユーザーごとに公開鍵と秘密鍵のペア、およびデジタル証明書が必要。<br>メールクライアントがS/MIMEに対応している必要がある。|メールサーバーの設定によりドメイン全体で使用。<br>ユーザーごとに個別の設定は不要。|メールサーバーの設定によりドメイン全体で使用。<br>ユーザーごとに個別の設定は不要。|

|項目|S/MIME|DKIM|SPF|
|--|--|--|--|
|送信者認証|○|○|○|
|改ざん検知|○|○|×|
|メール暗号化|○|×|×|
|なりすまし|×|○|○|
【LINE WORKS】Incoming Webhook アプリを触ってみた

# はじめに

LINE WORKSにWebhook機能が追加されました。 **「Incoming Webhook」アプリ** を使えば、これまでよりも手軽にLINE WORKSのトークルームへ情報を通知させるようになります。

:book: document https://developers.worksmobile.com/jp/docs/webhook 
:pencil: blog https://line-works.com/blog/solution/incoming-webhook-app/

# 使ってみる
## 1. アプリの追加
まずは **「管理者画面 > アプリ」** からアプリを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/ef4afa88-0a19-1086-e3f9-875c6c0e8af6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/393c30f0-a858-cea3-b9c0-53ffe9fb5ff1.png)

「追加する」ボタンから、「同意画面」を経て、LINE WORKS上に追加されます。

追加すると、トークルームから「Incoming Webhook」Botを使えるようになります。

## 2. Botをトークルームに招待する
通知を送りたいトークルームに「Incoming Webhook」Botを追加して利用します。

> このBotはどのメンバーでも利用ができます。管理者である必要はありません。

ここではグループトークルームにBotを追加します。

トークルームのメニューの「Bot招待」から追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/3da26b20-5b65-eac1-fe8b-7f50e3740aad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/658d5064-9d43-1c1c-7dd8-5ec82a0d7a14.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/970165ea-0cf0-0e4b-dadd-249bb977d301.png)


## 3. Webhook URLを発行する
トークルームにメッセージを送るために、**Webhook URL**を発行します。

Webhook URLの発行には、トークルームの**チャンネルID**が必要です。トークルームのメニューの「チャンネルID」からチャンネルIDを取得して、コピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/cf34e620-919c-5f38-9dd4-f43583469845.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/34679e4f-36d2-4a82-9f94-703d9c2c4d4d.png)


Bot招待時に送られてきたメッセージ、または、トークルーム下部のメニューにある「Webhookリスト」からWebhookリスト画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/1745809c-496a-313f-b4c2-78aefeff7369.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/19d6b812-ca3b-52f3-b396-a4fde28198bb.png)

右上の「追加」ボタンからWebhook URLを追加します。「Webhook名」と先ほど取得した「チャンネルID」を入力して作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/622ae13a-46ec-4979-b0c4-e9f1bc446f59.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/71ff2e18-9eb8-b2cf-ce16-6857a91d48bd.png)

追加されたWebhook URLに対してリクエストを送ることで、該当のトークルームへメッセージが送信されます。

> 注意
> -　発行できるWebhook URLの数は **5つ** までです。

## 4. Webhookリクエスト送ってみる
追加されたWebhook URLにPOSTリクエストをしてみます。

cURLコマンドでのリクエスト例です。

```sh
curl -X POST https://webhook.worksmobile.com/message/657eab7c-bb8b-4a3f-bd74-a41f1c8cf7c9 \
-H "Content-Type: application/json" \
-d '{"body": {"text": "Alert received!"}}'
```

※ URLは自身のWebhook URLに置き換えてください。

リクエストを送ると、このようにメッセージが送られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/025472ff-5aff-68b8-496d-54eaa7b52e67.png)


このように、Webhook URLにリクエストを送るだけで、トークが送られるようになります。

リクエスト形式については [ドキュメント](https://developers.worksmobile.com/jp/docs/webhook) をご覧ください。

# まとめ

これまではLINE WORKSへ何かメッセージを送るためには、Botを作成・追加し、APIを実行するためのアクセストークン発行を自前で実装する必要がありましたが、簡易的な通知であればこの「Incoming Webhook」アプリによってより簡単に実装できるようになりました。

MakeやIFTTT、Zapierといった連携ツールとの組み合わせも容易になったため、さまざまなサービスとの連携にお使いください。
複合機からPCにスキャンデータを保存できない


久しぶりに営業所からの要請もあって出動してきました。
PCを新しくしたら複合機からPCにスキャンデータを保存できないとのこと。

色々設定しましたが、うまくいかなかったので改めて対応方法を検討したいと思います。

今回の複合機は少々古いですね。
DocuCentre-V C2276

調べてみると「DocuCenter-V シリーズは、SMB２以上なのでとくに設定は必要ありませんが、DocuCenter-Vより古い機種になると、SMB1になります。」　ようです。　SMB1の設定は関係なさそう。

+ [富士ゼロックス DocuCenter-V C2275 スキャナー設定（PC保存)](https://pcsfield.com/support/archives/support8758.html)

# パスワードを入力することろがない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1d3cf5ba-018c-bc2d-a1fc-38f72cdba75d.png)

新しい機種にはあるんですがね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f190bed6-55ab-7ced-4988-0f421dfa9694.png)

この設定かな？

+ [パソコンからスキャンの宛先を登録時にパスワードの入力欄がない](https://www.fujifilm.com/fb/support/callcenter/faq/ccfaq0072)


一部機種ではパソコンからブラウザを利用してスキャナーPC保存の宛先情報を登録する場合、CentreWare Internet Services（以下CWIS）で［HTTP-SSL/TLS通信］機能を有効にする必要があります。

ブラウザの設定画面をみたら似ているしなぁ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b5778c0e-a2e9-2e14-beae-d08535abadc7.png)


設定したらパスワード欄を表示できました。パスワードを変更したらスキャンできたようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1a8ad585-17cf-7880-0e4d-7f39824dcd99.png)
JavaScriptのグローバルオブジェクト：this と Function('return this')()

# はじめに

https://qiita.com/kohki_takatama/items/5f1c6f75e6bbf6553682

https://qiita.com/kohki_takatama/items/430640e13e3fa497df2e

先日から、JavaScriptのグローバルオブジェクトについて記事を書いてきました。

記事を書くたびにコメントから学びがあり、ありがたい限りです。
今回もコメントいただいた`this`と`Function('return this')()`について

# `this` / `Function('return this')()` のメリット

最初に、今回紹介するものを使うメリットを示します。

基本的には`globalThis`で良さそうなのですが、`globalThis`は比較的新しい機能のようで、レガシー（古い）環境では対応していない可能性が考えられます。

その点、`this` / `Function('return this')()` はより古くから使用されているため、レガシーな環境を想定するならこちらを使うと良いようです。

それでは、それぞれについて見ていきましょう。

# `this`

グローバルコンテキストにおいて、`this`はグローバルオブジェクトを指します。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#global_context:~:text=from%20derived%20constructor-,Global%20context,-In%20the%20global

> ```js
> // In web browsers, the window object is also the global object:
> console.log(this === window); // true
> 
> this.b = "MDN";
> console.log(window.b); // "MDN"
> console.log(b); // "MDN"
> ```

`this === globalThis === window（ブラウザの場合）`ですね。
`this` はコンテキストを意識して使用する `globalThis` とも言えます。

# `Function('return this')()`

グローバルコンテキスト以外においては、`Function('return this')()`を使ってグローバルコンテキストを取得できるようです。

分解して理解してみましょう。

## `Function()`

よく使う関数宣言 `function()` との違いは、`f` が大文字であることです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/Function

> **`Function` コンストラクター**は、新しい `Function` **オブジェクト**を生成します。

新しい関数を生成しているようです。

> `Function` コンストラクターはグローバルスコープで実行される関数のみを生成します。

つまり、この中で`this`はグローバルオブジェクトを指すようです。

## `Function()` の使い方

構文は以下です。

> new Function([arg1 [, arg2 [, ...argN]] ,] functionBody)

例
> ```js
> const sum = new Function('a', 'b', 'return a + b');
> 
> console.log(sum(2, 6));
> // Expected output: 8
> ```

つまり、`Function('return this')`は、以下の関数を生成していたわけですね。

```js
function() {
    return this; // thisはグローバルオブジェクト
}
```

そして、関数の実行には `()` が必要です。`console.log()` , `sum()` などなど・・・
そのため、ここでも `()` を最後につけて、`Function('return this')()` となったわけですね。

# `globalThis` との併用

ここまで見てきたやり方で、レガシーな環境に配慮する場合に `this` / `Function('return this')()` を使うことができるようになりました。

しかし、`globalThis`とは違い、コンテキストを意識したコーディングが必要になり、不便・可読性が落ちる・バグの温床 という問題が生まれます。

そこで、以下のコードをグローバルに仕込み、`globalThis`を使うと良いようです。

```html
<script>
  if (!this.globalThis) this.globalThis = Function('return this')();
</script>
```

https://qiita.com/kohki_takatama/items/430640e13e3fa497df2e#comment-aa628af8eee156650742:~:text=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E4%B8%8B%E8%A8%98%E3%82%92%E4%BB%95%E8%BE%BC%E3%82%81%E3%81%B0%E3%80%81%E3%81%A9%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7%E3%82%82%20globalThis%20%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

※レガシー環境の再現方法がわからず、strict modeの場合などの挙動は確認していません。
# おわりに

以上、レガシー環境にも配慮したグローバルオブジェクトへのアクセス方法でした。

次は何を書こうかしら・・・
RubyKaigi First Effects ~私のRubyKaigi2024初体験記〜

RubyKaigi 2024にはじめて参加してきました。
実際に参加してみての感想や気になったセッション、
私のRubyKaigi Effects（RubyKaigiによって受けた影響）などを書き連ねます。
（次回参加するならこうするなの反省点もあります。）

# 事前準備
事前準備のためにやったことは下記２つです。

・気になるセッションの目星をつける
・初心者のためのRubyKaigi入門/RubyKaigi Introductionに目を通す
(下記スライドページの"そういうもん"という言葉に３日間とても救われました。)

https://speakerdeck.com/a_matsuda/rubykaigi-introduction?slide=22

:::note info
反省
スポンサーさんが開催されている事前勉強会やもう少し内容を深ぼって、単語単位でどういうものなのか少し調べておくとRubyKaigiをより楽しめるようになると思います。
:::

# 印象に残ったセッション
### Writing Weird Code
RubyKaigiDay1最初のキーノートで、度肝を抜かれました。
実行したコードとその結果出力されたコードが同じであるQuineという概念×コードで絵やアニメーションを作るクリエイティブコーディングが掛け合わさった作品をたくさん見ることができて、このようなRubyの楽しみ方もあるのだと新たな発見でした。
RubyKaigi後、実際に簡単なQuineを試したのですが、スピーカー石田さんの凄さが改めて実感できました。
とにかくすごいので、selftrick2024見てみてください！！

https://drive.google.com/file/d/1Dkx15u_5UAGoFqJHCeAuj2FXS-z_U7EE/view

https://github.com/tompng/selftrick2024

### Unlocking Potential of Property Based Testing with Ractor
テスト設計や手法に関して興味があったこともあり、聞きにいったセッションでした。
テスト手法と考えると、いつものテスト手法（Example based testingというそう）、入力されると値と出力される値を予測しプログラミングを組み立て、コンピューター実行するものを思い浮かべます。
しかし今回のセッションは、対比関係にあるテスト手法として、Property based testing(以下、PBTと略します)というテスト手法に関してデータをランダムに生成して、失敗するケースを洗い出す手法が紹介されました。
さらに、PBTがRactorという並行処理を使えば、テストの実行時間が短縮され、良いユースケースとなる仮説をもとに検証されている内容を話されていました。ある課題に対して解説できる手段がないか、仮説検証している姿を目にしてとても勉強になりました。

https://ohbarye.hatenablog.jp/entry/2024/05/25/rubykaigi-2024

https://developers.techouse.com/entry/RubyKaigi-2024-ohbarye-day1


### Namespace, What and Why
名前空間というものを Rubyに取り入れることで、 バージョンは違うけど同じ名前の定義であるライブラリ間の衝突を避けることができるというお話でした。
次に紹介するMatzさんのKeynoteでNamespaseが入ったら、Rubyをメジャーバージョンにあげてもいいという話があり、
呆然として先輩にどういうことかと聞いたら、
「好きなバンドの好きな曲の自作MVを作って投稿していたら、そのバンドから「公式に使わせてほしい、次のアルバムに収録したい」と言われるような…名誉かつエモい話だよ」と言われたので、その凄さを理解できました。凄すぎる。

https://tagomoris.hatenablog.com/entry/2024/05/20/184311

https://speakerdeck.com/tagomoris/namespace-what-and-why

### Matz Keynote
過去のRubyKaigiではMatzさんは初日の最初にKeynoteをやられるということで、最後のセッションは貴重だということを後で知り、今まで話を聞いてきた内容の点がつながり、Connecting Dotsされていきました。
Rubyコミュニティの今までとこれからを知ることができ、
Rubyに対する愛と情熱、開発者としての葛藤などが、はじめて参加した私でも垣間見ることができ感動した瞬間でした。

https://rubykaigi.org/2024/presentations/yukihiro_matz.html#day3

## Ruby Kaigi First Effects
### 1. 社内でRuby Kaigiに関してLTしました
自分自身が興味持っていたり、動いていることに対して発信することの重要さを知った（speakerさんに影響受けました。）

### 2. わからないことをそのままにしない
調べたり、本読んでみることで、実際に試してみることで、ちょっとずつ解像度が上がる。その繰り返しが大切。
はじめて参加して、全然わからないという状態に悔しさを感じたので、少しずつで良いから理解していくアクションを取ろうと思い、記事を書く過程やLT会で言語化して人に伝えることで、少しずつモヤモヤを解消していく過程を楽しむことができました。

### 3. たくさんのRubyfriendsに出会えて、世界が広がった
最終日帰り道にタクシーの運転手さんに教えてもらった言葉があります。
運：「なんくるないさ〜の前にある言葉がつくんだけどわかる？」
私：何ですか？？
運：本当はね、「まくとぅそーけーなんくるんさいさー」っていうんだよ。
「挫けずに正しい道を歩むべく努力すれば、いつか良い日が来る」という意味でね。
沖縄の歴史に紐づいている意味深い言葉なんだよ。
私：(深いい〜〜〜)

## まとめ 
### 挫けずに正しい道を歩み、Rubyのコミュニティを作り上げている人が集まる場所＝RubyKaigi
だと思いました。

３日間大変たくさんのことを感じ取り、刺激になりました。
RubyKaigiオーガナイザー、スピーカー、スポンサー、ヘルパー、参加者の皆様ありがとうございました。Youtube公開されたら再度更新します。
NestJSでユーティリティ処理を実装する

NestJSの処理は基本的にモジュール単位（Modules,Controllers,Providers(サービス)のセット構成単位）で実装されるようですが、モジュールにするほどでもないユーティリティ的な共通処理をどうやって実装していいのか、調べてもよくわからなかったので我流で実装します。
※セオリーとかテンプレート的なものがあったらぜひ教えて頂きたいです。

ここでは例としてファイルのMD5ハッシュ値を算出するユーティリティ処理を実装します。

## ユーティリティ処理用のフォルダを作る
```{ワークスペースフォルダ}/src/```の下に```utils```というフォルダを作りました。
この中に雑多な共通処理を配置していこうと思います。
## ユーティリティクラスの実装
例として、ファイルのMD5ハッシュを算出する共通処理を実装します。
ファイル名は```md5-util.model.ts```とします。（ファイル名規則もよくわからないですが処理分類的にはモデルかなと思い…）
- クラス: ```Md5Util```
- メソッド: ```getHash(filePath: string) : string```
- 説明: ファイルパスを引数に与えるとMD5のハッシュ値の文字列を返します
```md5-util.model.ts
import * as crypto from 'crypto';
import * as fs from 'fs';

export class Md5Util {
    getHash(filePath: string) : string {
        const target = fs.readFileSync(filePath);
        const hash = crypto.createHash('md5');
        hash.update(target);
        return hash.digest("hex");
    }
}
```

## ユーティリティ処理の呼び出し
FTP-GETしてきたファイルのMD5を求めてみます。

FTPの処理はこちらを参考に。

https://qiita.com/att-unno/items/01554ea00ddd0f47dcd2

```app.service.ts
import { Injectable } from '@nestjs/common';
import { FileInfo } from 'basic-ftp';
import { FtpService } from 'nestjs-ftp';
import { Md5Util } from './utils/md5-util.model'; //Md5Utilをインポート

@Injectable()
export class AppService {
  private _md5Util = new Md5Util; //Md5Utilのインスタンス
  constructor(
    private readonly _ftpService: FtpService,
  ){}

  async downloadFile(name: string): Promise<string> {
    const filePath = `/home/hoge/${name}`;
    try {
      await this._ftpService.downloadTo(filePath, name);
    } catch (error) {
      return "FTP-GET Failed.";
    }
    //MD5ハッシュ値取得
    const hash = this._md5Util.getHash(filePath);
    return `FTP-GET Completed. MD5=${hash}`;
  }
}
```

## まとめ
結局普通にユーティリティ処理クラスを実装してそれをimportするだけで使えました。

でもまだよくわかっていないのがクラスのインスタンス化。
```new```を使っていいのかどうか。
```AppService``` の ```constructor()``` に ```_ftpService``` と同じように書いたら ```Md5Util``` の依存関係が解決できないというエラーが出たのでこうしたのですが。
あとわざわざオブジェクト生成しないでMd5Util.getHash()みたいに、C言語系のスタティック的な使い方ができたらいいのになと思ったり。
さらにいえばクラスにもせず関数(function)単位で呼び出せたらいいのに。

## 追記：関数のみのexport/import
クラスではなく関数のみのやり方がわかったので追記します。
下のように書き、直接関数名でimportして使う。
```
export const 関数名 = (引数: 型): 戻り値の型 => {
    処理
}

```

```md5-util.model.ts
import * as crypto from 'crypto';
import * as fs from 'fs';

export const getMd5Hash = (filePath: string): string => {
    const target = fs.readFileSync(filePath);
    const hash = crypto.createHash('md5');
    hash.update(target);
    return hash.digest("hex");
}
```
```app.service.ts
import { Injectable } from '@nestjs/common';
import { FileInfo } from 'basic-ftp';
import { FtpService } from 'nestjs-ftp';
import { getMd5Hash } from './utils/md5-util.model'; //getMd5Hashをインポート

@Injectable()
export class AppService {
  constructor(
    private readonly _ftpService: FtpService,
  ){}

  async downloadFile(name: string): Promise<string> {
    const filePath = `/home/hoge/${name}`;
    try {
      await this._ftpService.downloadTo(filePath, name);
    } catch (error) {
      return "FTP-GET Failed.";
    }
    //MD5ハッシュ値取得
    const hash = getMd5Hash(filePath);
    return `FTP-GET Completed. MD5=${hash}`;
  }
}
```
【ChatGPT】生成AIを利用して課題を進める学生の増加...文部科学省の行動は？

## はじめに
　個人的に気になったことについてまとめます。
 
　**生成AIを利用して、課題を取り組むことについての文部科学省はどのように考えているのでしょうか？**
 
　学生的な観点からみると、勉強の過程で生成AIを利用することは非常に有用であると思います。検索や計算などの過程を飛ばし、いち早く答えに導いてくれる生成AIは、部活や日常生活を過ごす学生にとってこれ以上ないほど頼もしい存在であると思います。しかしその反面、なんでも生成AIに頼りきりとなってしまいそうで、小さな不安も残ります。

 そんな生成AIについて...2023年5月7日、文部科学省は大学や高等専門学校（以下「大学・高専」）における「声明」を発表しました。ChatGPTなどの高度な生成AIの利用が急増する中、教育活動への影響とその対策について言及していいます。

## 文部科学省からの声明
以下、引用。

>昨今、ChatGPT等に代表される高度な生成AIの利用者が急増しており、大学・高等専門学校（以下「大学・高専」という。）についても、教育活動における活用可能性やリスクなど正負両面の影響も指摘されているところです。これに対し、多くの大学・高専では、既に生成AIの教学面の取扱いに関する指針や考え方等の策定も進められています。
大学・高専における生成AIの教学面の取扱いについては、それぞれの教育の実態等に応じ、今後の状況変化を踏まえて指針等の内容を見直すことを含め、主体的に対応いただくことが重要と考えています。文部科学省においては、大学・高専の対応の参考となるよう、既に各大学において策定されている指針等の内容や有識者の見解等を踏まえ、生成AIに関して利活用が想定される場面例や留意すべき観点等についてとりまとめ、各大学・高専に周知しましたので、お知らせします。


　ざっくりとまとめると、声明の内容は以下の通りです。

**・教育活動への影響：**
　生成AIの利用が教育活動に与えるプラスとマイナスの影響について言及。
　利用の増加に伴う利点（例：教育の効率化、革新）とリスク（例：学術的な誠実性の懸念、依存の危険）を認識。

**・各大学・高専の対応：**
　各教育機関がそれぞれの実態に応じて、主体的に対応することの重要性。

**・指針の策定と見直し：**
　既に策定されている指針を基に、今後も見直しや新たな指針の策定が必要。

**・参考資料の提供：**
　文部科学省は各大学・高専の参考となるよう、生成AIの利活用場面例や留意すべき観点をとりまとめ、周知。

## 最後に
　声明が発表されたのは一年前です。
　これらを踏まえて、今後どのように教育周りのAI事情が動いていくか...とても気になります。

引用：「文部科学省ホームページ：大学・高専における生成AIの教学面の取扱いについて」
https://www.mext.go.jp/b_menu/houdou/2023/mext_01260.html
msiのプロパティをPowerShellから編集する

# 結論（完成したコード）
```powershell:code.ps1
function ModifyProperty {
    # Execute SELECT
    $view = $database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $database, "SELECT * FROM Property WHERE Property = '$propName'")
    $view.GetType().InvokeMember("Execute", "InvokeMethod", $null, $view, $null)

    # Fetch and View Close
    $row = $view.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $view, $null)
    $view.GetType().InvokeMember("Close", "InvokeMethod", $null, $view, $null)

    # Prepare SQL
    if ($row -eq $null) {
        $query = "INSERT INTO Property (Property, Value) VALUES ('$propName', '$value')"
    } else {
        $query = "UPDATE Property SET Value = '$value' WHERE Property = '$propName'"
    }

    # Execute SQL
    $view = $database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $database, ($query))
    $view.GetType().InvokeMember("Execute", "InvokeMethod", $null, $view, $null)

    # View Close
    $view.GetType().InvokeMember("Close", "InvokeMethod", $null, $view, $null)
}

# Create ComObject
$installer = New-Object -ComObject WindowsInstaller.Installer

# Open Database in msi
$msipath = Read-Host "input msi path"
$database = $installer.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $installer, @($msipath, 1))

# ModifyProperty
$propName = Read-Host "input PropertyName"
$value = Read-Host "input NewValue"
ModifyProperty

# DB Commit
$database.GetType().InvokeMember("Commit", "InvokeMethod", $null, $database, $null)
```

# 雑記
* VBScriptのコードはすぐ見つかったがもうすぐ(2027年？)使えなくなるらしい
* PowerShellのコードは読み込みはいっぱいあったが編集は見つからなかった
* ChatGPTに聞いたら上記のコードがほぼ出力されたが実行できないラインもあった
* ChatGPTのコードを元に試行錯誤して完成
* Orcaで結果を確認しながら作業したが、対象msiを開いたまま実行するとエラーになる（地味にハマった）

# あとがき
PowerShellってなんとなくカッコいい響きで好きだけど使うことはほぼないしなんとなくとっつきづらい
OCIのバースト可能インスタンスの紹介

## バースト可能インスタンスとは

OCIのコンピュートにはバースト可能の設定をする機能があります。
これは何かというと、普段はCPU使用率が低く、たまに高くなる場合に有効な機能でコストを抑える事ができます。

具体的にはインスタンス作成時に50%か12.5％のベースラインを選択して頂き、一定期間CPUの使用率がベースラインを下回っている場合に負荷がかかった場合100%まで使えるようになるというものです。

利用料金はOCPUとメモリの金額がそれぞれベースラインを乗じた価格になります。

例えば、E4を2OCPU、16GBメモリのサーバーの場合、1時間あたり10.36円かかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/e549c015-b93b-e9e8-4998-45e40704131a.png)


これを例えばバースト可能インスタンスにし、ベースラインを12.5%で設定した場合、10.36円ｘ12.5%なので1時間あたり1.295円で利用できます。

この金額は例えバーストしてCPU利用率が100％になってもこの金額のままです。
Windows利用時はWindowsライセンスの価格もベースラインを乗じた価格になります。

## バースト可能インスタンスの構築方法
インスタンス構築時、Change Shapeでシェイプを選択しますがその中で設定します。
![20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/01b96ff5-ff45-e136-722e-3295141a0062.jpeg)

一番下の方に「バースト可能」というスイッチがあります。
これをONにするとベースラインの設定欄が出てきます。
![21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/b368213b-a098-20ae-4723-94331ade07e6.jpeg)

プリダウンから12.5％または50％のどちらかを選択します。
![22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/0b256c88-eda6-6ac4-976a-d36824ee3371.jpeg)

## 注意点
●必ずしもバーストするわけではありません
●平均値がベースラインを下回っていないとバーストしません
●CPU、メモリ、Windowsライセンス以外は安くなりません
　→ストレージとかは100%の時と金額はかわりません。
●バーストを保証するわけではないので本番環境で利用される場合は慎重に検討される事をお勧めします。

 以上、用途さえ合えば安く使う事ができるバースト可能インスタンスの紹介でした。
AWS学習でして良かったこと EC2自動停止設定

## 前段
学習でAWSを利用していると、メールでAWS Budgetsの予算通知アラートがきていました。AWSマネジメントコンソールにアクセスしたところ、EC2を停止し忘れていたことが発覚...
そこで、EC2の停止忘れ防止にEC2自動停止設定を行いました。

## 方法
EventBridge用IAMロールの作成とEventBridge停止用ルールの作成を行いました。
以下の記事を参考に設定していますので、詳しくはそちらを参照ください。
https://techblog.techfirm.co.jp/entry/aws-ec2-automation
https://blog.jbs.co.jp/entry/2023/06/20/083000

・毎日18時に停止
![AmazonEventBridgeEC2Stop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618548/d507323a-b8ce-a648-2ab1-2c24654aad78.png)


・停止したいEC2インスタンスのIDを指定
![AmazonEventBridgeEC2instance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618548/498f1b5b-22ca-639b-310a-c341f1283cae.png)


## 失敗談
EC2自動停止設定を行い、安心していたのですが、別の日に再びメールでAWS Budgetsの予算通知アラートが...
AWSマネジメントコンソールにアクセスし確認すると、EC2が停止していない？！

AWS CloudTrailで確認してみるとどうやら複数のEC2の指定で、存在しないEC2のインスタンスIDを指定していた為、エラーになり、Amazon EventBridge スケジューラが動かなかった模様。

Amazon EventBridge スケジューラを設定して以降、EC2インスタンスを１つ削除していたのが原因でした。

存在しないEC2のIDを指定してしまうと、スケジューラーが上手く実行されず、起動中のEC2を停止できないことがわかりました。

## 問題発覚の流れ
1. 作成していた全てのEC2の自動停止のスケジューラーを作成
2. EC2を複数学習用に作成していて、その中の1つを使用しなくなった為、削除した
3. スケジューラーの設定は変更しなかった
4. EC2をうっかり起動したままにしてしまった
5. AWS Budgetsの予算通知アラートがメールできていた
6. マネジメントコンソールにログインし、EC2インスタンスが起動中を確認

→削除したインスタンスはスケジューラーで設定しているIDを削除する必要がある


## 良い点
個人の学習でEC2インスタンスを作成して、しばらく使うならスケジューラーを設定するのはいいかもしれません。


## 懸念点
この設定はインスタンスの数が多かったりすると、インスタンスIDの指定が大変ですし、頻繁に作成・削除を繰り返すなら、メンテナンスが必要で向いていなさそうに感じました。


## 最後に
AWS Budgetsの設定をしておくことが一番いいのかもしれませんね...
今度はインスタンスIDを指定せず、起動中のインスタンスを自動で停止する方法を調べてみたいと思います！
【Unity】Androidビルド自体には成功するがデバイスへのインストールに失敗する

# はじめに
以下のエラーについて対処方法を調査しました。
> CommandInvokationFailure: Unable to install APK to device. Please make sure the Android SDK is installed and is properly configured in the Editor. See the Console for more details.

# 対策
デバイス内に同じ名前のapkがインストールをされている場合、このエラーが発生することがあるようです。
インストール対象のデバイスから同じapkをアンインストールを削除すると正常にインストールされるようになります。
Windows11の操作性カスタマイズ備忘録

今更ですが、Windows10からWindows11にアップグレードした感想として、

1\.右クリックメニュー（コンテキストメニュー）が簡略化された
2\.Windows標準のメモ帳が重い

2点が気になりました。私なりの対処法を備忘録がてら記載します。

## 右クリックメニューが簡略化された
:::note info
右クリックしたときに出るメニューを「コンテキストメニュー」と呼ばれ、右クリックする場所によって異なります。
何がメニュー表示されるかはアプリケーションが決定します。
:::
以下はデスクトップ画面で右クリックをした場合の画像ですが、メニュー項目が減ってますね。

![Win11_簡略されたコンテキストメニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804239/daee0bbe-ea36-f13a-b841-c2497877bb36.png)

正直使いにくいので、旧仕様に戻します。
コマンドプロンプトで以下のコマンドを入力してください。

```
reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InProcServer32" /f /ve
```

実行したらそのままサインアウトして、再度サインイン後右クリックすると旧仕様になっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804239/1aca901a-e4b9-ab18-33bc-4ff25c5c1179.png)

好みはあるかと思いますが、大半の人は旧仕様の方がいいのでは？と感じます。特にbatファイル等を編集するとき「右クリック＞編集」で私はエディタを開くので。
尚、元に戻したいときは追加したレジストリをそのまま削除してください。以下でも問題ありません。

```
reg delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InProcServer32" /f
```

## Windows標準のメモ帳が重い
:::note warn
本作業を行うと、コンテキストメニューの新規作成からテキストドキュメントを作成を表示されなくなるという副作用があります。
:::

ある端末はすぐ開くが、ある端末は開くのに１分以上かかるなんてこともありました。いずれにしても旧メモ帳よりは動作が遅いようです。
そもそもあまりWindows標準のメモ帳を使うことが無いのですが、上記のように「右クリック＞編集」で開いた場合はメモ帳で開くと思います。

旧仕様で特に問題が無いので、アプリをアンインストールしてしまえば解決です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804239/516b0e8e-bb9c-4949-1ba0-dd66d69ea721.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804239/392020ba-5cac-7cb5-b980-5ddc7ac269af.png)

「設定（Windowsキー＋I）＞アプリ＞インストールされているアプリ」からアンインストールしてください。
尚、再度インストールする場合は、<a href='https://www.microsoft.com/store/productId/9MSMLRH6LZF3?ocid=pdpshare'>Microsoft Store</a>からインストールできます。

# 最後に
コンテキストメニューが簡易化された意図はわかりませんが、個人的には使いにくかったです。こちらはレジストリ設定をして旧来に戻しても良いのではないかと思います。

メモ帳については、重いという症状が出ていないのであればアンインストールする必要はないかと思います。
最終的にはメモ帳も新バージョンへ移行していくものだと思うので、旧バージョンを使うメリットは徐々に減りつつあるかとおもいます。
余程の症状が出ない限り様子見をして、今後高速化と不具合対応に期待しましょう。
新しい開発ツール・CIの感想 – Cursor  / Copilot / Code Rabbit / Renovate / CleanShotX など

# 開発環境のツール類

Good

- VSCodeベースのエディター( Cursor )のCopilot++ -> すごく役立ってる、もうこれなしではやっていけない
- CleanShot X (スクショを撮ってお絵かきできるMacアプリ) -> 役立ってる

普通

- エディター(CURSOR)のAIコード自動生成 -> ごく稀に使う
- エディタ(CURSOR)でのAIへの質問 -> まったく使わない
- OrbStack ( Docker for Mac の代替 ) -> 大きなインパクトはないがトラブルもないので使い続けてる

NG


- WARP -> iTerm2の方が良いのが分かってやめた
- ChatGPT -> まあ使わない

# 開発サポートのCI

Good

- Renovate -> 非常にありがたい、どんなライブラリも常に最新にバージョンアップ

NG

- Code Rabbit -> ノイジーなのでやめた

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
WindowsにインストールしたChromeのバージョンアップ（自動更新）を止める

# 概要

* WEBアプリケーション
* Seleniumを使ったブラウザー処理自動化

にはChromeのバージョンアップ（自動更新）の問題がつきまといます。

特にSeleniumの場合、chromedriverは自動更新されないため、
**『Chromeのバージョンが上がったが、chromedriverが古いままだったので自動処理が止まってしまった』**
というトラブルが起きたりします。

そういったことを防ぐために、Chromeのバージョンアップ（自動更新）を止めます。

:::note warn
自動更新を止めるということは、セキュリティパッチもあたらないことになります。
『自動更新を止めたままほったらかし』はしないように注意。
:::

# やり方

## ポリシー設定用ファイルダウンロード

下記サイトの…

https://support.google.com/chrome/a/answer/6350036?sjid=16680800924246771531-AP

下記でダウンロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6e4d8f91-695d-1449-3376-f67ca48dd7d4.png)

ダウンロードしたzip内にはadmxファイルとadmlファイルの2種類があります。

## admxファイル追加

```:admxファイルを追加するフォルダー
C:\Windows\PolicyDefinitions
```

ファイルを追加するには管理者権限が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8a38fa9d-a17a-416d-da08-4d7300f2ad05.png)

この2ファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cb3f1d7a-d02f-d38a-42c1-cb08d315f299.png)

## admlファイル追加

```:admlファイルを追加するフォルダー
C:\Windows\PolicyDefinitions\en-US
```

ファイルを追加するには管理者権限が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5a78e6f0-6b92-00c9-8f95-171618897a67.png)

この2ファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e0676723-4b00-0e98-ba2d-1bc0a5883f60.png)

## ローカルグループポリシー設定

管理者権限を持っていないユーザーでログインしている場合は、エディターは下記のように起動すると楽です。

1. まずはコマンドプロンプトを管理者として起動。
1. その後 ```gpedit``` 。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4270d85b-9a8a-79cf-d064-9edb18c13505.png)

 ↓ 『コンピューターの構成』
 ↓ 『管理用テンプレート』
 ↓ 『Google』
 ↓ 『Google Update』
 ↓ 『Applications』
 ↓ 『Google Chrome』
 ⇒ 『Update policy override』
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/63d189a8-521d-1133-d26e-b07fcdc74ac8.png)

『有効』
『Update disabled』
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c55f041a-8acb-db48-1390-9d1909b30960.png)

## 自動更新が止まっていることの確認

Chromeの『ヘルプ』 ⇒ 『Google Chromeについて』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e77c89d7-1481-6ac6-3778-8daa32ea169a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/56606699-bfab-3911-3a1a-7337eee26f77.png)

# バージョン

Microsoft Windows [Version 10.0.22631.3672]
Google Chrome 125.0.6422.113 （64ビット）
【ITのおしごと！】ソリューションアーキテクト・テクニカルサポートのお仕事って？

# 記事を書くに至った経緯
先日、自分が所属している「しごとスキルアップ夜会」というイベントで、企画・実行役として、テクニカルサポートとソリューションアーキテクトの方にインタビューをするという会を催しました。
以下はそのイベントの文字起こしになります。
テクサポもソリューションアーキテクトも、日本語ではまだまだ仕事内容の全貌を明らかにしている記事などが見つからないので、
今後これらの職種を志す方の一助になれば嬉しく思います。

# 文字起こし

（以下、ソリューションアーキテクトをSA、テクニカルサポートをテクサポと表記する）

#### Q.仕事の流れと働き方を教えてください。（1日の流れや、業務全体の流れについてなど）

SA：日中はミーティングが多い。定例のものだったり、単発であったり。定例ミーティングの例として、自社製品を使ったプロジェクトが進んでいる期間に出た課題（製品の使い方や流行の導入方法についてなど）について話すことがある。

テクサポ：（前提知識…テクサポの働き方は、お客様から「チケット」の形で問い合わせが発行されるので、それを解決するという形）
当日の仕事の流れとしては、前日自分たちが回答したチケットに返信が来ているかを確認し、その後自分に新規問い合わせがアサインされるのでそれを対応する。1日の最後にはミーティングを行い、残ったチケットがあれば他の（APAC以外の時間帯の）チームに引き継いだりする。
それぞれのチケットに緊急度が割り振られているので、急に緊急度の高いチケットが発行された場合は自分の手持ちのチケットをいったん置いておいて、そちらを対応することもある。

#### Q.仕事の良いところと悪いところを教えてください。

SA：
（良いところ）
１．A社はこのような課題を抱えている、B社はこのような課題があるなど、複数のお客様とやり取りをするので、仕事中頭の切り替えのスピードが速くなった。
２．様々なお客様とやり取りをするので、幅広い業務知識を得られる。
３．ミーティングの量やお客様の数が多いので、「この時間でこれを終わらせよう」など自分の作業量を見積もる力が付いた。

（悪いところ）
あまりないが、あえて言うなら、SAはポストセールスのポジションなので、プリセールスの視点（売上をあげる）が足りなくなっていることを感じる。

テクサポ：
（良いところ）
以前はプリセールス（という職種）だったのだが、プリセールスをしていると要求レベルの高いお客様に時間をとられたりしたが、今はそれぞれのメンバーに均等にチケットが割り振られるため余力が生まれた。
加えて要点をまとめて話す技術、優先順位をつける能力などが身に付いた。

（悪いところ）
急に緊急度の高いチケットが来ることがあるため、一つのチケットを集中して取り組むことができない。

#### Q.評価はどのようにされる？

SA：定量的と定性的の両方。定量的の場合、お客さんへの貢献を月に何時間したか。定性的の場合、新しい製品についてどれだけ積極的に学ぼうとしたか。

テクサポ：こちらも定量的と定性的の両方。定量的の場合、チケットをこなした数やお客様からのアンケートによって評価される。定性的の場合、チーム全体に技術的なセッション（勉強会など）をどのくらい行ったか。

#### Q.（SAの方のみ）客先常駐で働くことはある？

SA：過去にはあったしありえることはあるが、昨今の状況を見てリモートのことが多い。オンラインの方が時間短縮になるし、KPI（人事評価）にも影響があるから。

#### Q.（SAの方のみ）SIerやITコンサルタントとは違う？開発はする？

SA：ITコンサルと似ているところはある。しかし大きく違うのは、ベンダーのSAは自分の会社の製品を使ってもらうようにすることが仕事。コンサルはいろんな製品組み合わせてパッケージつくって、提案するといったことが仕事。
コンサルは問題解決をする人。例えば、M&Aする前に、この企業をいくらで買った方がいいかの相談を受けたり、業務改革、新規事業を考えたりなど。
幅広いことをしたいならコンサル、専門的になりたいならSAだと個人的に思う。
Ubuntuでnvidiaのエラーが出たときのなおしかた

Ubuntuを使っていると突然つぎのようなエラーが表示されてGUIが動作しなくなります。

```
UBSAN: array-index-out-of-bounds
index 0 is out of range for type 'uvm_gpu_chunk_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_pmm_gpu.c:2364:28

UBSAN: array-index-out-of-bounds
index 0 is out of range for type 'uvm_gpu_chunk_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_pmm_gpu.c:2038:44

UBSAN: array-index-out-of-bounds
index 0 is out of range for type 'uvm_gpu_chunk_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_pmm_gpu.c:746:68

UBSAN: array-index-out-of-bounds
index 1 is out of range for type 'uvm_gpu_chunk_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_pmm_gpu.c:2644:63

UBSAN: array-index-out-of-bounds
index 1 is out of range for type 'uvm_page_directory_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_mmu.c:569:17

UBSAN: array-index-out-of-bounds
index 16 is out of range for type 'uvm_page_directory_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_mmu.c:555:51

UBSAN: array-index-out-of-bounds
index 0 is out of range for type 'uvm_page_directory_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_pmm_gpu.c:2614:71

UBSAN: array-index-out-of-bounds
index 0 is out of range for type 'uvm_gpu_chunk_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_pmm_gpu.c:829:45

UBSAN: array-index-out-of-bounds
index 0 is out of range for type 'uvm_gpu_chunk_t *[x]'
in build/nvidia/535.171.04/build/nvidia-uvm/uvm_pmm_gpu.c:857:39
```

このエラーはnvidiaのプロプライエタリなドライバが影響しているようです。

いったん次のコマンドでドライバをすべて削除します。


```
sudo apt-get remove --purge '^nvidia-.*'
```

このコマンドを実行するとGNOMEといったウィンドウマネージャも削除されてしまうため、入れ直します。

```
sudo apt install ubuntu-desktop
```

再起動してnvidiaのドライバを再インストールして再起動したらなおります。CLIでプロプライエタリなドライバをインストールするには次のようにします。

```
sudo ubuntu-drivers install
```
LXD：btrfsのストレージプールの容量を増やす

# はじめに

LXDのストレージプールでは、ブロックデバイス（`/dev/sdb1`のようなLinux上で認識可能なストレージデバイスあるいはパーティション）の他に、ボリュームのイメージファイル（ループバック・デバイス）でストレージを管理することが出来ます。（LXDのデフォルトはイメージファイルでのストレージ管理となっています）

ボリュームのイメージファイルは、予め指定した容量を確保し、確保された容量の範囲でLXD(LXC)コンテナ上のストレージとして利用することが可能です。しかし、LXDの活用が進むと容量が不足してくるケースも出てくるかと思います。

ストレージプールの容量が不足する場合は、イメージファイルの容量を増やすことで対応が可能です。ストレージドライバにbtrfsを指定して作成されたストレージプールは、以下の手順で簡単に容量を増やすことができます。

# 手順

## １．ストレージの設定（編集）を開く

`lxc storage edit default` コマンドを実行し、テキストエディタ上で設定を編集します。

※ `default` はストレージプールに合わせて変更する

上記コマンドを実行すると、次のような設定が表示され、編集することができます。

```yaml
### This is a YAML representation of a storage pool.
### Any line starting with a '#' will be ignored.
###
### A storage pool consists of a set of configuration items.
###
### An example would look like:
### name: default
### driver: zfs
### used_by: []
### config:
###   size: "61203283968"
###   source: /home/chb/mnt/lxd_test/default.img
###   zfs.pool_name: default

name: default
description: ""
driver: btrfs
status: Created
config:
  size: 30GiB
  source: /var/snap/lxd/common/lxd/disks/default.img
used_by:
- /1.0/images/7aadc272ba5913c8c334fdc9ee457e6dd7d4562a777816f2cdaf48314461b0d4
- /1.0/images/dd50a97865f3a71ea5bd3028c0a900473e80d1c3adcb7510584812339b871e6f
- /1.0/instances/hoge
- /1.0/instances/fuga
- /1.0/instances/piyo
- /1.0/profiles/default
locations:
- none
```

## ２．sizeの変更

１で開いた設定より、

```yaml
config:
  size: 30GiB
```
を
```yaml
config:
  size: 40GiB
```
のようにsizeを変更し（増やし）、保存します。

## ３．変更結果の確認

設定完了後、コンテナに入りボリュームの容量が増えていることを確認します。

## 変更前
```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0       30G  8.8G   20G  31% /
```

## 変更後
```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0       40G  8.8G   30G  23% /
```

# 参考

https://discuss.linuxcontainers.org/t/resize-lxd-btrfs-storage-space/5214
[IBMCloud] Container Registryに必要な操作権限(IAM)

## 権限の割り当て方法
アクセス権限の基本的な割り当て方法は、下記のドキュメントに記載されている
[アクセス権限の割り当て方法](https://cloud.ibm.com/docs/account?topic=account-assign-access-resources&interface=ui#access-resources-console)

**管理** -> **アクセス(IAM)** -> **ユーザー**を選択
![Pasted_Image_2024_05_31__10_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a6a3b739-ff74-78e7-7a3a-65fe1ece1acc.png)

検索で変更したいユーザを検索し、ユーザーを選択
![Pasted_Image_2024_05_31__10_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c71af7a2-2b47-4749-1350-7087582a8f12.png)

アクセスポリシーで個別に権限を割り当てるか、もしくはグループに割り当てを行う
今回はContainer Registryに関する権限の操作は、次の項目で実施する
![Pasted_Image_2024_05_31__10_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/79370d24-68bc-0d5d-cea3-c60686d8c69c.png)


:::note info
リソースが含まれるリソース・グループに対する役割を持っていないユーザーは、リソースを表示することはできますが、アカウントの「リソース・リスト」ページからリソースにアクセスして作業を開始することはできません。 ユーザーがリソースにアクセスできるように、リソース・グループ自体にビューアー役割以上を割り当てます。
:::

リソースグループへのアクセス権限がない場合は、事前にアクセス先のリソースグループへのアクセス権限を付与する

各権限で何ができるかは、下記のドキュメントに記載がある
[リソース・グループ内のリソースへのアクセス権限の付与](https://cloud.ibm.com/docs/account?topic=account-rgs_manage_access&interface=ui)

## 権限の付与
今回はContainer Registryの権限を付与するため、メニューからContainer Registryを選択し設定する

どの権限を付与すると何ができるかについては、下記のドキュメントに記載がある
[サービス・アクセス役割(Container Registry)](https://cloud.ibm.com/docs/Registry?topic=Registry-iam&interface=ui#service_access_roles)

今回は名前空間(NameSpace)の作成を実施する前提で記載する
上記ドキュメントより、サービス・アクセス・ロールの<font color=red>**マネージャー**</font>権限が必要

検索メニューより、**Container Registry**を入力し、選択後、次へをクリック
![Pasted_Image_2024_05_31__10_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e1dc69c2-e20b-36bc-380e-9b51999b5fd5.png)

どのリソースのContainer Registry権限を付与するか決める
今回は、**すべて**とする
![Pasted_Image_2024_05_31__10_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/0da59c37-f11b-180d-df53-cb9a313b06bd.png)

マネージャーロール(管理者）が必要なため、チェック入れ**次へ**を選択
![Pasted_Image_2024_05_31__10_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/4dbd6291-d508-1f47-4144-5dd3f97ba35b.png)

条件(オプション)はなしのため、**![Pasted_Image_2024_05_31__10_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3468539a-c444-f707-e443-685ebfcb4ca9.png)

**割り当て**を選択
![Pasted_Image_2024_05_31__10_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/5a4abf52-7b76-a20d-64f3-f0722ab9122a.png)

以上で権限の割り当てと、NameSpaceの作成が可能となる
外れ値があるか確認したいので箱ひげ図を使います。

# この記事について
データの分布を視覚的に把握したい時に、ヒストグラムもいいですが箱ひげ図をつかって外れ値を効果的に把握することができます。

簡単な説明とmatplotlibでの実装をまとめます。

僕が高校生の時と違って、今の高校生は数学で習うんですね。

# 箱ひげ図って何？
箱ひげ図はデータのばらつき具合を視覚的に把握したい時に活用できます。

特徴的なのは四分位数の表示です。

四分位数はデータを小さい順に並べて、小さいものから順位を付けた時に、

- 25％（全体の1/4の部分）＝25パーセンタイル
- 50％（全体の2/4＝1/2の部分）＝50パーセンタイル
- 75％（全体の3/4の部分）＝75パーセンタイル

となります。
ちなみに念のため言うと50%の部分は中央値です。

### 箱ひげ図の見方
今回matplotlibでの実装を載せつ都合で、下の図はmatplotlibで作成したものです。
ひげの表す値もデフォルトのものに合わせています。
それぞれの区間は同数のデータが入るので、下の例では第二四分位数から第三四分位数の間のデータは他に比べて密集していることがわかります。

![箱ひげ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775726/33faa7bd-9a62-ecc0-e09f-28f708e4ab31.png)

記事の一番下の参考文献を見てもらうとわかるのですが、上下のひげの表す値については最小値最大値の場合もありますし、図のようにIQR * 1.5の長さを調整した位置の場合もあります。(IQRは第三四分位数から第一四分位数の区間の長さを指してます。)

ひげが最小値、最大値を表すと思っていると外れ値があるデータの時に「最大値の上にさらにデータがあるぞ」となるので気をつけましょう。

外れ値がある場合、ドットでプロットされます。

# matplotlibでの実装
```python
import matplotlib.pyplot as plt

# キャンバスサイズ
plt.figure(figsize=(5, 5))
plt.boxplot(sampleDataSeries)
plt.title('sample for Qiita')

# 目盛りは今回適当なデータなので非表示
plt.xticks([])

plt.tight_layout()
plt.show()
```

![スクリーンショット 2024-05-29 14.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775726/0336e5e0-4268-494c-d7e8-dd1d69d782a6.png)

vert=Falseにすることで横向きに表示することもできます。(import文は略)
```python
plt.figure(figsize=(5, 5))
plt.boxplot(sampleDataSeries,vert=False, autorange=True, meanline=True)
plt.title('sample for Qiita')

plt.yticks([])

plt.tight_layout()
plt.show()
```
![スクリーンショット 2024-05-29 14.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775726/dac02012-e0a6-3be0-5f7b-0dcea3ef63ec.png)

# まとめ
図がいちいちでかいので、今度からは直します。
調べたらいろいろパラメータをいじれることを知ったので、そのうちまとめて更新予定。

# 参考文献

[総務省統計局　なるほど統計学園箱ひげ図](https://www.stat.go.jp/naruhodo/4_graph/shokyu/hakohige.html#:~:text=%E7%AE%B1%E3%81%B2%E3%81%92%E5%9B%B3%E3%81%AF%E3%83%87%E3%83%BC%E3%82%BF,%E7%AD%89%E5%88%86%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82)

[matplotlib.pyplot.boxplot](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.boxplot.html)
robloxでassistant その94

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
テーブルから落ちない、パーツを作れ。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。

```
local part = Instance.new("Part", workspace)
part.Position = Vector3.new(0, 1, 0)
local s = 0
while true do
	local rayOrigin = part.Position + Vector3.new(math.cos(math.rad(s)) * -2, 0, math.sin(math.rad(s)) * 2)
	local rayDirection = part.Position + Vector3.new(math.cos(math.rad(s)) * -2, -10, math.sin(math.rad(s)) * 2)
	local raycastResult = workspace:Raycast(rayOrigin, rayDirection)
	if raycastResult then
		if raycastResult.Instance.Name == "SpawnLocation" then
			part.Velocity = Vector3.new(math.cos(math.rad(s)) * -3, 0, math.sin(math.rad(s)) * 3)
		else
			part.Velocity = Vector3.new(math.cos(math.rad(s)) * 3, 0, math.sin(math.rad(s)) * -3)
			s += 40
			part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(40), 0)
			print(s)
		end
	end
	wait(0.1)
end
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5782064a-cea3-f3a2-7dda-2de46212302c.png)


以上。
WSLで作成したLinuxのディスクをマウントして内容を見る方法

まずWindows側にあるWSLの仮想ディスクを見つけます。仮想ディスクはvhdxという形式です。

このファイルは次のようなパスにあります。

`%LocalAppData%\Packages\CanonicalGroupLimited.Ubuntu_{id}\LocalState\ext4.vhdx`

Canonicalなんちゃらの部分は導入しているWSLのディストリビューションによって異なります。

このext4.vhdxを何らかの方法でLinux側に移動します。

ここからの作業はubuntuを想定して書きます。

まず必要なパッケージをインストールします。

```
sudo apt-get install libguestfs-tools
```

次にマウントを実行します。

```
sudo guestmount --add ext4.vhdx -i --rw /mnt
```

これで完了です。


## refs

- https://askubuntu.com/questions/1088411/mount-vdhx-image-on-ubuntu-data-recovery
- https://christopherkibble.com/posts/wsl-vhdx-recovery/
【非エンジニア向け】AWSの学習方法

否定するわけではありませんが、他の初学者向けの記事を見ると
>AWS初学者から資格を取った方法
（→正確にはAWSは触ったことないインフラエンジニアだった）

というパターンが多くあり、文系＆非エンジニアの私に合った学習方法を見つけるのが大変でした。そのような経験をもとに「いや、私以外にも絶対同じような人いるだろう」と思い投稿しました。

## ①非ITエンジニア向けの動画で全体を把握
**ポイント**
　分からない単語が出てきたら動画を止めて意味を調べよう
**次に進むタイミング**
　ITの素養や基本知識がある方は1周でOK、完全未経験者は2周。


いきなりテキスト形式で学習すると抵抗があるかもしれないので、まずは分かりやすく言葉で説明してくれる公式動画を見ることをオススメします。このAWS公式動画は「日本人講師」が「日本人向け」に「日本語」で説明しているものです。IT未経験の私でも理解できるような容易な言葉や例えを用いて勉強できるので、IT未経験やAWS未経験の方の入口としては最適です。
説明している講師はAWSの生出（おいで）先生で、とても説明が上手く、動画を見終えたころには先生のことが好きになっているはずです笑
動画数：約30分の動画が7本

https://resources.awscloud.com/cloud-practitioner-essentials-on-demand-training

## ②超初心者向けの書籍で少し深ぼる

AWS1年生 クラウドのしくみ 図解でわかる！会話でまなべる！
　※ポイント
 聞いたことがない単語が出てきたら「Anki」アプリにメモ

https://www.shoeisha.co.jp/book/detail/9784798180205

## ③テキスト学習

https://www.sbcr.jp/product/4815625382/

前提：暗記しない
・書いてあることが理解できたら進める
・意味不明な単語が出てきたら検索する、教科書に追記する
・追記したあとの文章が理解できたら進める
・意味不明な単語が出てきたら検索する、教科書に追記する
・
・
・
以上の繰り返しです