OmniAICreator/Qiita-1.07M huggingface dataset:
oracle cloud infrastructure(OCI)でブートボリュームを拡張する手順

## 目次
- [はじめに](#はじめに)
- [手順1: ボリュームのサイズ変更](#手順1-ボリュームのサイズ変更)
- [手順2: パーティションの拡張](#手順2-パーティションの拡張)
- [手順2.1: OCI-Utils追加情報](#手順21-oci-utils追加情報)
- [確認](#確認)


## はじめに
OCIで新しいインスタンスを作成した際、初期のストレージ容量では不足する場合があります。この記事では、ディスクとパーティションのサイズを拡張する手順について説明します。

## 手順1: ボリュームのサイズ変更
1. OCIコンソールにログインし、拡張したいブート/ブロックボリュームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867678/5c65ba8c-80b8-e9dd-a65a-a8687eb9ca6d.png)
2. 「編集」をクリックし、「初期ボリュームサイズ」の項目に希望する新しいサイズを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867678/0c79f05a-5e0c-a732-9ffc-404c1f68e517.png)
3. ニーズがなければ、他がディフォルトで「変更を保存」をクリックし、OS側でパーティションの拡張を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867678/26e977b7-42bb-b6b0-fbd5-e227a7367d05.png)



<details>
<summary>パーティションの拡張手順(コマンド)</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867678/089856f0-0533-c42b-543e-18c840d626d7.png)

以下のコマンドをインスタンス上で実行します：

```bash
sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
echo “1” | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d’/’ -f 2`/device/rescan
```
</details> 


## 手順2: パーティションの拡張
```bash
#lsblkコマンドを実行し、デバイス名を確認します。
lsblk

sudo /usr/libexec/oci-growfs

#すべてが正常に完了した場合、lsblkを再度実行して、パーティションが拡張されたことを確認します。
lsblk
```
### 手順2.1: OCI-Utils追加情報
しかし、この手順をうまく完了できない場合、例えばoci-growfsがない場合は、以下をご覧ください。

<details>
<summary>追加: oci-growfsがないの対処法</summary>

ここでは、行うべき追加手順を説明します：

以下のコマンドを実行してください：
```bash
git clone https://github.com/oracle/oci-utils.git
cd oci-utils
python3 ./setup.py build
sudo python3 ./setup.py install
# the following will expand your volume(s)
sudo ./libexec/oci-growfs
```
</details> 

## 確認
以下のコマンドで確認します。
```bash
lsblk
df -h
```
#015: グローバルで一意な名前が必要となるサービスのリソース名の命名規則（KeyVault編）

URLの一部となるようなリソース名にはバージョン番号を付与する方針にしたというお話。
IaCでスクラップ＆ビルドを実施する時に考慮が必要。

例えば、KeyVaultのリソース名はURLの一部になるため、グローバルで一意な名前になっている必要がある。

このような制約のあるリソースの場合、一度生成するとそのリソース名はグローバルからアクセス可能なURLの一部としてDNSに登録されるので、仮にリソースを削除してもすぐには同じ名前のリソースを再作成できないし、IaCなどで自動的にリソースをスクラップ＆ビルドすることはできない。
DNSキャッシュの影響を避けるために同名リソースを作成しようとすると数日間はエラーとなる。

これの対策として、今回はバージョン番号を明示的に設定することでこれに対応した。

# 1. 一意性を持たせるための命名規則のオプション

## 1-1. タイムスタンプ

utcNow()関数を用いて、yyyyMMddHHmmssなどのフォーマットで生成した文字列をリソース名に付与する。

Bicepテンプレートでデプロイを実行すると、毎回utcNowで実行時の日時が取得されるため、毎回異なるリソース名になる。

IaCを実行する上で、毎回スクラップ＆ビルドするのであれば問題無いが、既存リソースに対する更新を行いたい場合でも毎回異なった名前のリソースが作成されるので、これはNGとした。

## 1-2. ユニーク値

uniqueString()関数を用いて、例えばResourceGroup.idを元に生成したランダムな文字列をリソース名に付与する。

この方法も毎回異なるリソース名になり、タイムスタンプと同様、既存リソースに対する更新を行いたい場合でも毎回異なる名前のリソースが作成されるので、これもNGとした。

## 1-3. バージョン

Bicepテンプレート内に、パラメータとしてバージョン情報を指定する。たとえば、”001”など。

明示的に自分でバージョン情報を変更しない限り、同じリソース名でデプロイ処理が実行されるので、リソースが無ければ新規に作成され、既存の場合は更新処理が実行される。

これはOKなので、今後はこの方式で名前を生成する。

## 1-4. リソース名の文字数の制約

タイムスタンプやユニーク値を用いたリソース名のもう一つの留意すべきことは、リソース名が長くなるため、リソース名の文字数制約に抵触する可能性が高くなる。

リソース名に以下のような要素が複数含まれる場合は要注意

- システム名やアプリケーション名
- リージョン
- リソースタイプ
- 環境名

各リソース名に関する制約は以下に定義されている。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/resource-name-rules


以下、MSがリソース名に対するガイドを出しているが、なにも考えずに単純にこれをマルっと踏襲していると、後で文字数超過することになるので工夫が必要。

https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming

以下、リソースタイプについてのガイドがある。これは有用なので、今後はできるだけ踏襲するようにする。

https://learn.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations
Execution Roleって何？

AWSのサービスを利用する中で「ExecutionRole」を作成する機会があり、気になったので調べてみました。
ちなみに「Execution」直訳で「実行」「遂行」などになります。

### Executionロールとは？
AWSのサービスが特定のタスクを実行する際に使用するIAMロール。例えば、**AWS CloudFormation**や**AWS Control Tower**などがスタックやリソースをプロビジョニング（作成）する際に、このロールを引き受けて必要な権限を持って操作を行う際に使われる。

#### 具体的なケース
- **AWS Control Tower**: ガードレールやアカウントプロビジョニングなどの管理タスクを実行する際に使用。
  - 例えば、AWS Control Towerのランディングゾーンにアカウントを登録する際、`AWSControlTowerExecution`というIAMロールを、登録するアカウント内に作成する必要があった。
    - 詳細: [AWSControlTower ExecutionRoleの説明](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/awscontroltowerexecution.html)

また、Executionロール作成時の信頼ポリシーに含まれる`sts`についても説明します。
## STS（Security Token Service）とは？
STSはAWSサービス間の安全なアクセス管理を支援し、一時的な認証情報を提供してセキュリティを強化。一時的な認証情報により、必要な権限を最小限の期間で提供し、セキュリティリスクを低減する。

### STSの概要
#### 一時的なセキュリティ認証情報を発行
1. **一時的なセキュリティトークンの発行**  
   短期間有効なトークンを提供し、長期間有効な認証情報を回避。
2. **フェデレーテッドアクセスのサポート**  
   外部のアイデンティティプロバイダー（例：企業のActive Directory）と連携し、AWSリソースへのアクセスを実現。
3. **ロールの引き受け**  
   ユーザーやサービスが特定のIAMロールを一時的に引き受ける際に使用。

#### サービス間の呼び出しにおけるSTSの役割
AWSの各サービスが他のサービスを呼び出す際、通常はIAMロールを使用して必要な権限を付与。このプロセスでSTSが活用される。

1. **IAMロールの作成**  
   呼び出し元のサービス（サービスA）が他のサービス（サービスB）にアクセスするためのIAMロールを作成し、必要な権限を付与。
2. **信頼ポリシーの設定**  
   ロールの信頼ポリシーに、サービスAがこのロールを「引き受ける（AssumeRole）」ことを許可。
3. **ロールの引き受け**  
   サービスAがサービスBにアクセスする際、STSの**AssumeRole** APIを呼び出して一時的な認証情報（アクセスキー、シークレットキー、セッショントークン）を取得。
4. **アクセスの実行**  
   サービスAは取得した一時的な認証情報を使用して、サービスBに対する操作を実行。

## ExecutionロールとSTSの関係
Executionロールには信頼ポリシーが設定されており、特定のエンティティ（例：CloudFormationやControl Tower）がそのロールを「引き受ける（AssumeRole）」ことが許可されている。この引き受けの際にSTSが利用され、一時的なセキュリティ認証情報が発行される。これにより、サービスは必要な権限を持って安全にタスクを実行できる。

### まとめ
- **Executionロール**: AWSサービスがリソースを操作する際に使用するIAMロール。
- **STS（Security Token Service）**: 一時的な認証情報を発行し、ロールの引き受けなどを安全に行うためのサービス。
- ExecutionロールにはSTSの信頼ポリシーが設定されており、サービスがロールを引き受けて必要な権限を取得する際にSTSが活用される。
コスト配分タグ vs Cost Categories

# はじめに
UdemyでAWSプラクティショナーの対策をしているが、この2つのサービスの違いがあやふやだったので整理してみます。

## 共通点

<img width="20%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601978/cc4e34ef-59d8-9cd8-51b6-9b7a1b0b11b9.png">

どちらもコストを管理するBilling and Cost Managementの機能。

そしてCost Categoriesではコスト配分タグで付けたタグを使用することができます。

## 粒度の違い
どこがどう違うか。
下が各機能の粒度です。
|コスト配分タグ|Cost Categories|
|:--:|:--:|
|細かい|粗い|
|AWSリソース単位|プロジェクト単位、環境単位、部署単位など|

コスト配分タグは個々のリソース(EC2、S3など)にタグをつけるため、リソースごとの粒度。
それに対してCost Categoriesは高レベルな、プロジェクト単位、サービス単位、部署単位などの粒度です。
タグの方は一つ一つにタグを付けていくだけなので、イメージがつきやすいと思います。

どうやってCost Categoriesでは分類しているか？


## 分類するアプローチ
### コスト配分タグ
コスト配分タグでは、AWSリソースに一つ一つタグをつける、というアプローチ。

### Cost Categories
Cost Categoriesでは、カテゴリを作成して、そこにどうやって分類するかのルールを定義していくというアプローチです。

下のように条件を設定してルールを作成できます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601978/43d8c091-0c5d-0f38-114d-38f24c45782a.png">

条件の対象にコスト配分タグもあるのがわかります。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601978/dc5aaa43-8365-a3c6-934f-ef76428c46da.png">

Cost Categoriesではリソースに直接設定するのではなくプログラム的に分類をします。

つまりコスト配分タグとCost Categoriesでは分類するアプローチが全く異なります。
このアプローチの違いを認識すれば、両者の違いが明確になるかと思います。

## その他の特徴
### コスト配分タグは自由にリソースにタグ付けができる
例えばこんなタグ付けができます。
- 試しに使ってみて、コストが高ければ使用を中止するリソース
- リソースの目的をタグにして、目的毎にコストを算出する

### Cost Categoriesではコストがよりわかりやすくなる
コスト配分タグはあくまでも、リソース毎のコストしかわかりません。
小計は出ているが、合計までは出してくれない、という感じ。

Cost Categoriesと組み合わせることで全体的なコストの可視化ができる。

## まとめ
- コスト配分タグはリソース毎にペタペタとタグ付けをして、Cost Categoriesではプログラム的にルール設定をすることでコストを分類する
- コスト配分タグではリソースレベル、Cost Categoriesでは高レベルな分類をするのに向いている
- どちらか一方だけを使うのではなくコスト配分タグで付けたタグをCost Categoriesで使うことでより効果を発揮する

## おわりに
本当はちゃんとした環境で使い方をシミュレーションしてみたかった。
練習用の環境とかないかなあ。
014 AI屋さんの　LLMに２００万トークン全文入力と「ずんだもん」と私

AI屋さんの　LLMに２００万トークン全文入力と「ずんだもん」と私


LLMとvoicevoxとstreamlitとdockerとcloud runで
LLMに２００万トークン全文入力　追加学習ずみの専門分野特化のLLMの作り方


今回はwebアプリを　クラウドのサーバーレスで
大規模言語モデル　＋　音声合成　ずんだもん　先生とのコラボです。
インターネット上でサービスしていますので　皆様もれなく
可愛い　ずんだもん先生の　美声を満喫できます。
当然、ローカルの自宅パソコンの非公開版も作れます。


完成イメージ：

https://zunda-ghc4uieygq-an.a.run.app

![スクリーンショット 2024-10-09 21.18.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/b9af9b13-35bd-a041-285b-910c17cc2574.png)




大規模言語モデルの　コンシューマーアプリとして市場要求の高い　「可愛いいキャラとお喋りを　満喫したい」　気配を感じました。
そこで、早速音声合成の巨匠　ずんだもん先生にご協力いただきます。


https://voicevox.hiroshiba.jp



全文入力追加学習済みLLMと組み合わせて

　１、居酒屋のメニュー全部入れて、「AIオススメ　大宴会　居酒屋システム」や
　２、観光地とレストラン情報を全部入れて、「AIコンシェルジュ　デートプランナー」や
　３、百貨店の外商顧客向け、「AI黒執事　オートクチュール特別注文部」等

全てのお客様の全てのご要望に即時回答します。
ここまでくるとマネーの匂いがしてきそうな気がします。
誰でも（？）簡単に作れます。

実は今回の内容は　超簡単に　クラウドデプロイを行えます。
ずんだもん先生も、streamlitも　dockerイメージから
webのボタンをポチポチだけで　cloud run　を設定できます。

docker run -d -p 8080:8080 bono0/st

イメージを　プッシュ・プル　出来れば　勝ったも同然です。


サンプル
大規模言語モデルに資料を全文入力済みLLM
Webアプリ


お喋り　ずんだもん先生
スマホ版の図

https://
zunda-ghc4uieygq-an.a.run.app

https://zunda-ghc4uieygq-an.a.run.app

![Screenshot_20241009-214218.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/f60e5147-5a5c-5d65-362e-9bf2cdbc4aa2.jpeg)




flet
スマホのネイティブアプリ版の図

https://
flet-ghc4uieygq-an.a.run.app

https://flet-ghc4uieygq-an.a.run.app

![Screenshot_20241007-080322.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/0221e08a-5f8e-76bc-109c-e2459695acdc.jpeg)


Streamlit

https://
bono0-ghc4uieygq-an.a.run.app

https://bono0-ghc4uieygq-an.a.run.app



Gradio

https://
bono0-grd-ghc4uieygq-an.a.run.app

https://bono0-grd-ghc4uieygq-an.a.run.app



Flask

https://
www.bono0.com

https://www.bono0.com



webAPI
flask

https://
llm001-v01-ghc4uieygq-an.a.run.app

https://llm001-v01-ghc4uieygq-an.a.run.app





目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7


今回も無事に　音声合成機能付き　大規模言語モデルの
　AI屋さんの　LLMに２００万トークン全文入力と「ずんだもん」と私
デプロイ完成です。　おめでとうございます。

ー続くー
書類pdfをxmlに変換するWindowsコマンド

一般に、Office系システムや帳票システム等で作成されたPDFは
テキストや罫線の情報をそのまま保持しており
テキスト検索やコピーなどができる状態になっています。

大量のPDFを対象に何かしたい場合、XML化するとテキスト処理ができ扱いやすくなります。
様々なライブラリもございますが、
一番手軽に使えるのは、Office系の変換です。
試しにやってみるには、「ファイルを開く」でPDFを開き、「名前を付けて保存」でXML形式を選択します。

以下、Windowsでフォルダ内のPDFファイルをxml変換する方法をご紹介します。

### Microsoft Officeの場合

こちらのWordマクロを参考にしました。
拡張子を"doc"ではなく"pdf"に、処理内容を"xml形式で保存"にします。

> フォルダ内のWordファイルを処理する
https://yourpearloyster.com/windows/wordvba/700.html

表示更新は止める方がオススメです。
> Application.ScreenUpdating プロパティ - Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/api/word.application.screenupdating

マクロをコマンドライン実行する方法もあります。
> Microsoft Office 製品のコマンド ライン スイッチ
https://support.microsoft.com/ja-jp/office/microsoft-office-%E8%A3%BD%E5%93%81%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-079164cd-4ef5-4178-b235-441737deb3a6

### Libre Officeの場合

Libreには形式変換専用コマンドが用意されています。
> File Conversion Filter Names
https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html

ところがdocからpdfなど、上記に記載されている形式以外では、なかなか成功しません。
pdfからxmlにする方法として、成功したのはDrawで扱うfodg形式です。
fodg形式は描画要素をXMLで保有しています。

```
rem ------------------------------
rem Libre Drawをサイレント実行してpdfファイルをfodg形式に変換するバッチ
rem ------------------------------
rem 空のフォルダにこのバッチ（拡張子を.batで保存）と対象pdf（複数可）を入れて実行
rem Draw以外も含めたLibre全終了するまでファイルを掴むので注意
rem ------------------------------

for %%f in (*.pdf) do (
  "C:\Program\LibreOffice\sdraw.exe" --headless --convert-to fodg %%f
)
```

### その他

Google WorkspaceもGASでWordの場合と同様のマクロを書けばできそうです。
ほかプログラミング言語毎の内容やOffice系以外のツールを使用する場合など方法は無限です。

類似内容でPower ShellでPDFの文字を抽出する方法の紹介もございました。

https://qiita.com/_Sasaki_/items/9430eff42aa48e3317e9
ポケモンで学ぶデータサイエンス データクリーニング編

## 前回の続き
https://qiita.com/WeedMashroom/items/e50dd9f39ee8694702cc

前回はデータの正規化をメインに行ってきました。
今回はデータのクリーニングがメインです。

# データのクリーニング
データのクリーニング（欠損値の処理、異常値の除去など）を行います。また、必要に応じてデータの変換や標準化も行います。

どのような完璧にデータを取ることができていたのか実際に検証しましょう。

# 空欄の行の処理
空欄の行にはNULLを挿入しました。

# 取得してきたデータに誤りが存在
オドリドリ、ジガルデといった特殊なフォルムのポケモンは格納されている値の順序に誤りがありました。
それもしっかりと手直ししていきます。

自分で学習してみようという方は頑張ってみてください。

# INSERT文の作成
INSERT文は以下のように、EXCELの関数を用いて作成しました。
ほかにもEXCELファイルをそのままSQL SERVERにぶち込めるという操作もあるようですが、私は手作業で行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/967d82a2-887d-5f5c-6f8b-33a2fc634ff7.png)

# INSERTの結果???

データをSQL SERVERぶち込んだところ、日本語がうまく反映されないというエラーが発生しました。
こちらは別記事で考えてみようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/5dd5f6a5-8480-81aa-07ff-d06e0ad57f2b.png)

## 不具合の解決
文字化けを起こしてたみたいです。
INSERT文の日本語の前にNをつけると解決。
以下サイトを参照しました。


https://blog.roundrop.dev/32/


## SQLでテーブル作成・データの格納

```sql
CREATE DATABASE ポケモン COLLATE Japanese_CI_AS;

create table pokemon(
	id int primary key not null,   -- 主キー
    name nvarchar(50),
	typeId_1 int,
	typeId_2 int,
	featureId_1 int,
	featureId_2 int,
	dreamFeatureId int,
	hp int not null,
	attack int not null,
	deffence int not null,
	specialAttack int not null,
	specialDeffence int not null,
	speed int not null,
	species int not null
);



INSERT INTO pokemon (id,name,typeId_1,typeId_2,featureId_1,featureId_2,dreamFeatureId,hp,attack,defend,specialAttack,specialDeffence,speed,species) VALUES
(1,N'フシギダネ',4,8,65,NULL,34,45,49,49,65,65,45,318),
....,
(909,N'マーシャドー',7,14,101,NULL,NULL,90,125,80,90,90,125,600)

```

これでINSERT完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/744df645-b418-0bd3-f9f2-bd6e4eeeddff.png)

```sql
select * from [ポケモンSV].[dbo].[pokemon]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/2d8e469b-aa10-a88e-15e4-d2cb175d8846.png)

## 感想
やっぱり実践してみるといろいろな問題に直面しますね。。。
データのクリーニングに関しては、欠損している値は、ほかのWEBページから参照しました。
私自身がポケモンに対して一定の知識を得ていたため、正確な値を補完することができましたが、一切知識のない現場での仕事を考えると。。。

また、INSERTに関してはそもそもデータを新たに格納するのはSSMSだけでなく、C#でやっていたため、これには苦戦させられました。

次回はやっとデータを使っていじることができそうです。

続く。
JavaScriptでよく見る「... 変数」とは

JavaScript（およびTypeScript）で↓のようなコードを見ることが多いと思います。
```JavaScript
const user = { id: 1, name: 'Taro', age: 25, genfer: 'male' };
const _user = { ...user }; // ←この「...」の部分
```
この文法を知っていないと見ただけでは分からないと思うので、まとめていきます。

結論、2つのパターンがあります。

### パターン1. スプレッド構文
オブジェクトや配列を展開するために使います。多くの場合、オブジェクトや配列の参照元から切り離し、コピーを作成する目的で使われます。オブジェクト、配列の参照がコピーされる挙動について詳しく説明しだすと長くなるのでここでは割愛しますが、簡単に言うと以下のようなことが起こってしまいます。
```JavaScript
const user = { id: 1, name: 'Taro', age: 25, genfer: 'male' };
const person = user; // userオブジェクトの参照ごとperson変数に入れてしまっている
user.name = 'Jiro'; // ここでuserオブジェクトのnameを変更
console.log(person); // 元となるオブジェクトの変更が適応され、「name : 'Jiro'」と出てしまう
```
ここで使用するのがスプレッド構文です。「**... オブジェクト**」と表記することで、**そのオブジェクトを展開し、参照元から切り離して別のオブジェクトとしてコピーできます**。
```JavaScript
const user = { id: 1, name: 'Taro', age: 25, genfer: 'male' };
const person = { ...user }; // userオブジェクトを展開し、オブジェクトのコピーを作り、personに代入
user.name = 'Jiro'; // ここでuserオブジェクトのnameを変更
console.log(person); // 元のオブジェクトからは独立しているので「name : 'Taro'」と出る

```
※ ↓ちなみに、配列でも同様の挙動を取ります。
```JavaScript
const numbers = [1, 2, 3, 4, 5];
const a = numbers;
const b = [...numbers];
numbers[0] = 100;
console.log(a); // [100, 2, 3, 4, 5] ← 0番目が100になっている
console.log(b); // [1, 2, 3, 4, 5]
```

### パターン2. レスト構文
こちらはスプレッド構文とは少し異なり、値を凝縮するイメージです。
分割代入の際、任意のプロパティのキー名を抽出した後、残り全部を一気に代入することができます。
```JavaScript
const user = { id: 1, name: 'Taro', age: 30, gender: 'male' };
const { id, ...rest } = user; // ここで「...rest」という形でid以外のすべてをオブジェクトで取得している
console.log(id); // 1 ←「id」だけが取り出されている
console.log(rest); // {name: 'Taro', age: 30, gender: 'male'} ← id以外の残り（= rest）が取得されている
```
あまり意味はないですが、↓のようにするとすべて取得されます。
```JavaScript
const user = { id: 1, name: 'Taro', age: 30, gender: 'male' };
const { ...person } = user;
console.log(person); // { id: 1, name: 'Taro', age: 30, gender: 'male' }
```
また、↓すべてプロパティを抽出し切ってから残りを取得しようとすると空オブジェクトが取得されます。
```JavaScript
const user = { id: 1, name: 'Taro', age: 30, gender: 'male' };
const { id, name, age, gender, ...person } = user;
console.log(person); // {}
```

※なお、↓配列でも同様の挙動となります。
```JavaScript
const letters = ['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ'];
const [a, b, c, ...rest] = letters;
console.log(a); // あ
console.log(b); // い
console.log(c); // う
console.log(rest); // ["え", "お", "か", "き", "く", "け", "こ"]
```

以上、...の意味でした。
【ServiceNow】お気に入り登録をして、業務の効率化をしよう

はじめに
---

ServiceNowは様々な機能がありますが、似たような機能を使用する機会が沢山あります。
毎回、フィルターナビゲータにて検索していると手間がかかるので、お気に入り登録をしておくと便利です。

簡単なやり方なので、ぜひ使用してください。
***
[前回の記事]

https://qiita.com/masa3150/items/ec380a2ccab58919b6fa

***

よく使う機能をお気に入り登録しよう
---

フィルターナビゲータにて検索をします（今回はビジネスルール）
すると対象のモジュールが表示されますが、モジュールの右側にカーソルを合わせると星マークが表示されます。
![スクリーンショット 2024-10-09 20.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/adb14814-25b2-c83b-787e-8dd34843e0cc.png)

星マークをクリックすると、以下のようにモジュールに星マークが付くようになります。
![スクリーンショット 2024-10-09 20.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/d4f9371b-7691-1636-2c21-f9dd01cb70ca.png)

星マークがついたモジュールは、お気に入り一覧に追加されます。
![スクリーンショット 2024-10-09 20.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/6a8ac893-d718-8f49-bfbd-0dc0b5d3d1ca.png)

また、さらに自分なりに分かりやすくするために、名前、アイコン、アイコンのカラーも変更することができます。
![スクリーンショット 2024-10-09 21.02.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/e530887d-1a44-38dd-17ce-ca7017de274f.png)

編集後、右上の「Done」ボタンを押下しましょう
![スクリーンショット 2024-10-09 21.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/75546063-1200-ef54-e787-ceca19b08bde.png)

お気に入り登録したビジネスルールがオリジナル名前で登録されることが確認できます
![スクリーンショット 2024-10-09 21.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/06040d3c-9e92-e08e-b598-9328c86e8e79.png)

以上でお気に入り登録は完了です。

終わりに
---
ServiceNowでは開発や、障害対応の調査を行う際に様々な機能を利用します。その際に自分なりにお気に入り一覧に整理しておけば、作業効率も上がりますのでぜひ使用してみてください。
SocketDebuggerの受信データをファイル保存するスクリプト

## やりたいこと

SocketDebuggerがデータを受信すると、自動的にファイルに保存して欲しい。

> ※わざわざ記事にする程でもないですが、
> 　SocketDebuggerとLuaをはじめて使って動いたので、

## スクリプト

- データを受信すると`OnReceive()`関数が呼び出される
    - 引数`recv`は受信データ（テーブル）
- `FileWrite()`関数はファイル書き込み
    - 引数`recv`はテーブル
    - `filename`は、ファイルのフルパスを指定する
    - ファイルはバイナリ形式で保存される
    - 戻り値は、なし

``` lua
---------------------------------------------
-- 受信通知
---------------------------------------------
function OnReceive(recv)
    date = os.date("%Y%m%d")
    time = os.date("%H%M%S")
    filename = "C:\\SocketDebugger\\受信データ\\Receive_" .. date .. "_" .. time .. ".dat"

    FileWrite(recv, filename)
    
    return 0
end
```

## 参考

- [SocketDebugger](<https://www.udom.co.jp/sdg/index.html>)
    - 高機能通信試験支援ツール
- [Lua 5.1 リファレンスマニュアル](<http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html>)
    - SocketDebuggerの取扱説明書（Ver. 2.00）によると、Luaのリファレンスは5.1を参照するらしい
事実と意見（解釈、認識）を混ぜない（備忘録）

:::note
事実を把握した上で認識ズレを減らす方法
- 相手の発言等、聞いた見たそのままの情報についてまずメモを取ります
- その後、そのメモを見て解釈し、その認識が合っているか確認します
- メモが取れていれば解釈し直すことで認識の擦り合わせができますし、何を言ったかについて再度確認する手間もなくなります
:::

# 背景🖼️
業務で私の認識がずれることが度々あるので戒めを込めて書きます

# 事実をそのままメモできてなかったり、頭に入れられてない🙅‍♂️
会議などで一致した決定事項、相手の発言を事実としてそのままメモできていませんでした。
自分の解釈でメモしていたことが根本の原因です。

# どうするべきか💡
- 相手の発言等、聞いた見たそのままの情報についてまずメモを取ります
- その後、そのメモを見て解釈し、その認識が合っているか確認します
- メモが取れていれば解釈し直すことで認識の擦り合わせができますし、何を言ったかについて再度確認する手間もなくなります

# 最後に
頭の中でできたら良いのですが、まだできそうにないので暫くはメモをして訓練します

こんな対策もあるとか紹介して下さると大変嬉しいです！
クラスメソッドとクラス変数

Pythonのオブジェクト指向プログラミング第二弾として**クラスメソッド**と**クラス変数**についてまとめていきます

## クラスメソッドとは
クラスメソッドとは、インスタンスを生成せずに呼び出すことのできるメソッドのこと

たとえば、三角形を表すTriangleクラスにクラスメソッドとしてareaを定義してみようと思います

```python
class Triangle:
    @classmethod
    def area(cls, base, height):
        return (base * height) / 2
    
if __name__ == '__main__':
    print(Triangle.area(5, 10)) # 結果：２５
```
クラスメソッドを定義する際に次の２点を行いましょう
1. デコレーターである　@classmethod　を付与する
2. クラスメソッドの第一引数には 「cls」を渡す

第一引数である「cls」は、クラスそのものを表しているイメージです
今回では、clsがTriangleクラスを表している感じです

したがって、最終行のように、クラス名. の形式でインスタンスを生成しなくても直接呼び出すことができます

## クラス変数とは
クラス変数とは、クラスから直接アクセスすることのできる変数のこと

先ほど使用した、Triangleクラスに対して、２という定数を表すクラス変数　CONST を追加します

```python
class Triangle:
    CONST = 2
    
    @classmethod
    def area(cls, base, height):
        return (base * height) / cls.CONST
    
if __name__ == '__main__':
    print(Triangle.CONST) # 結果：2
    print(Triangle.area(5, 10)) # 結果：２５
```

クラス変数を使用する際は、「変数名　＝　値」の形式で書くだけです

クラス変数はインスタンスう変数とは異なり、「self.」のような修飾を持たないため、クラスメソッドやクラスの外部からでもアクセスすることができます

クラス変数を使用する際の注意点としては、**原則として定数のみ**に使用します。なぜなら、クラス変数を変更してしまうと、コード全体に影響してしまうからです。
Windows11のPowerShell各種設定

Windows11になってPowerShellの見た目が変わりましたが、設定ができることに気が付いたのでメモです。

1. 設定への行き方
1. 設定項目


# 1. 設定への行き方
①PowerShellのコンソール開いたらタブの右側に出る"V"みたいなマークをクリックして「設定」を選択。("Ctrl + ,"でも行けます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/366c17d0-fa0a-53f8-19f1-5c1b8d200ae3.png)

②設定画面左のカラムで"Windows PowerShell"を選択し右側のメニューから"外観"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/88dbcacc-4330-8c1f-fa1c-02d93fa0a201.png)


# 2. 設定項目
下記参照。結構色々できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/1423e571-819c-3113-37bc-206933571f31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/86b789d9-274a-73a4-db6f-59b8a25020c5.png)

フォントをHG創英角ポップ体にしてかわいい感じにする、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/356f733b-3097-4b18-6e02-8a8f9f872fc3.png)

レトロターミナル効果をONにする(見にくい)、など色々。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/42e995f5-67e7-85c0-a46f-dc3a6453ed26.png)

自分はひとまずPowerShellといえばくすんだ青というイメージなのでそれ変えました。
黒いとコマンドプロンプトっぽいんですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/29adcb58-e2e5-a296-8d96-601589b7e964.png)


以上でした。
また何かあれば投稿しようと思います。
AWS Glue Jobで_$folder$ファイルが作成されるのを回避する方法

# はじめに
Glue JobでデータをS3に作成して、それをBigquery omniで実行しようとしたときにエラーが発生しました。
原因としてはS3に「_\\$folder\\$」という空のファイルが作成されていたことが原因でした。
_\\$folder\\$についての詳細は[こちら](https://repost.aws/ja/knowledge-center/emr-s3-empty-files)をご覧ください。

# 回避方法
データを書き込むときにs3://ではなくs3a://というプロトコルを使うと回避できました。

```python
datasink = glueContext.write_dynamic_frame.from_options(
    frame = your_dynamic_frame,
    connection_type = "s3",
    connection_options = {"path": "s3a://bucket-name/prefix"}, // ここがs3aになっています
    format = "parquet"
)
```

# おわりに
調べてみると大規模なファイルの処理をするときはs3aの方がI/O効率が良いらしく推奨されているみたいです。
そこまで推奨しているならGlue関連の記事でもっとs3aについて触れてくれたらいいのにと思った出来事でした。
まだまだ知らないことが多い技術なのでこれからも少しずつ勉強していけたらなと思います。
Google Fontsで日本語をタグ付けしています！


Google Fontsで日本語をタグ付けしています！必要なタグやウェブサイトの改善点を教えてください。

URL
[https://fontsensei.com/ja](https://fontsensei.com/ja)

Github
[https://github.com/mrbirddev/fontsensei](https://github.com/mrbirddev/fontsensei)
v-tooltip内にあるclickイベントが発火しない

## やりたいこと

v-tooltipで、
- マウスオーバーで表示/非表示
- v-tooltipの中に文字列＋ボタンを置いて、ボタンを押下すると処理が走るようする

以下のイメージです。

```vue
<v-tooltip
  top
  close-delay="500ms"
>
  <template #activator="{ on, attrs }">
    <img
      :src="url"
      :alt="description"
      v-on="on"
      v-bind="attrs"
    >
  </template>
  <div>
    <span>
      タイトル<br>
    </span>
    <v-btn @click="$emit('run', id)">
      処理実行！
    </v-btn>
  </div>
</v-tooltip>
```

`close-delay`は、マウスオーバー外れた後に消える時間を伸ばしてボタンを押せるようにしています。

ここで問題なのが、v-tooltipの中に置いた**クリックイベントが発火しない**ということ。
じゃあ、aタグは？とやってみるも、リンクになっているのに押せず・・・。

## 原因

`v-tooltip__content`に、`cursor-event: none;`がついていました。
このせいで、クリックイベントもaタグのリンクも効かなくなっていました。

## 解決策

原因になっているcssを上書きしてあげればOKでした。

```css
.v-tooltip__content {
  pointer-events: initial;
}
```

このせいで数時間はまりました・・・。
処理や応答が返ってこない（ブロッキング？）ときに確認すること


しょうもないことで時間を使いたくないのです。

ローカル内の話とします。またプロセスを調べたり Wreshark を使ったりといったガチな話はしません。

# Verbose
本当にブロッキングしているかどうかをまずは見てください。たとえばログなどの表示レベルを上げてみると、同じ処理がぐるぐる回っていたりすることがあります（無限ループ）。

# ビジー
CPU やメモリを使いすぎると重くなります。

# 空き容量不足
ディスク不足でも重くなります。

# プロンプト
たとえば yum install をすると `[y/N]` を聞かれますが、IaC やスクリプトでこれを組み込んじゃうと永遠に終わりません。

他にもプロンプトを出す処理が入っている場合、そこでブロッキングします。

# タイムアウトとリトライ
応急処置的ですが、これらを短くすればトライアンドエラーしやすくなります。これらの設定が効かない場合も多いので、あまり鵜呑みにしないようにします。

リトライについては、自動リトライが無駄に賢く働いて永遠に試していることがあります。

# プロキシ
プロキシ設定をミスると通信が途中で届かず、（出来が良くない場合は）ブロッキングしがちです。

プロキシ設定がどこから読み込まれるかが違うのでハマりがちです。

- 環境変数 https_proxy
- 別の環境変数（何とかOPTなど）
- .dotfile 的な設定ファイル
    - カレントディレクトリにある分？
    - ホームディレクトリに保存されてる分？
    - もっとシステム寄りの場所？
- コマンドラインオプション
- etc

また、これらの読み込みが多段になっていることもあります。どこの設定が読み込まれているかを特定してください。

# ファイアウォール
どんな設定したかなんて覚えてないことが多いので、一度は確認しておいた方が無難です。

# セキュリティソフト
基本的にお使いのセキュリティソフトが何をしているかは、すべて把握した方が良いです。

# 処理対象がでかすぎるか指数関数的
100 MB で 20 秒かかる処理も、10 GB だと 2000 秒(=33分)かかります。

アルゴリズムなどの事情で指数的なオーダーの場合は、非現実的な時間になっている可能性があります。

# デッドロック
見かけないようで、意外とあります。AがBを待っていて、BがAを待っているという膠着状態です。
UbuntuとWindowsを安全にデュアルブートする

# 本記事の目的
- より安全な方法でのデュアルブート
# はじめに
　``Ubuntu``と``Windows``のデュアルブートは，危険が伴います．
同じドライブに複数のOSがされており，``GRUB``などのブートローダーを使って起動するOSをどちらか選ぶような場合，OSのアップデートで片方のOSが吹っ飛ぶことも．

私も以前``Windows 11``と``Ubuntu 22.04 LTS``を同じドライブに入れてデュアルブートしていたことがありましたが，ある日の``Ubuntu``アップデートを境に``GRUB（ブートローダ）``が``Windows``を認識しなくなり，OSが起動しなくなってしまったことがあります．

できれば1PCにつき1OSで運用したいところですが，``Windows``が圧倒的なシェアということもあり，**必要なソフトが``Windows``でしか動かない**，ということも多いんじゃないでしょうか．しかし，開発環境は``Linux``でないと駄目，という場面も多々あると思います．

　今回は，OSを物理的に別ドライブにインストールし，比較的安全な方法でデュアルブートを行いたいます．

:::note warn
本記事で紹介した手法で，損害が発生しても筆者はいかなる責任も負いません．
デュアルブートを試される方は自己責任でお願いいたします．
:::

# 準備するもの
- 物理ドライブ
- インストールメディア

本記事で紹介する方法では，インストールするOSの数だけ物理ドライブが必要になります．

また，当たり前ですが追加インストールするOSのインストールメディアが必要になります．事前に用意してください．

# 仕組み
## ブートローダとは
そもそもブートローダーとは，OSを起動するソフトウェアのことです．
よくパソコンの起動の流れを説明される際には，
```mermaid
 graph LR

 BIOS -- 起動指令 --> OS
````
というように，BIOSがOSに起動指令を送り，OSが起動するといった流れで説明がされるかと思います．がしかし実際には，

```mermaid
graph LR

BIOS -- 起動指令 --> ブートローダ --> OS
```
というように，BIOSが起動指令を送るのはブートローダで，ブートローダがOSを起動させるというのが正しい流れになります．


このブートローダはOS毎に異なるブートローダが採用されており，Windowsでは，``Windows Boot Manager``，Ubuntuでは，``GRUB``というものが採用されています．

## デュアルブート時のブートローダの挙動
 　このブートローダですが，単一のドライブに複数のOSが存在するときは以下のようになります．

 ```mermaid
 graph LR

 BIOS -- 起動命令 --> BootLoader1(ブートローダ１起動)
 BootLoader1 --> if{起動したいのは\nブートローダ１に付属するOS？}
 if --> |Yes| Yes[ブートローダ１に付随するOSを起動]
 if --> |No| No[ブートローダ2　起動]
 No --> ブートローダ2に付随するOSを起動
 ```

 まずはじめに片方のOSのブートローダが起動し，もしそのブートローダで起動可能なOSであれば起動処理を行い，もしそうでなければ対応する別のブートローダを呼び出し，それからOSを起動する，という流れになります．

 このため，図のブートローダ1がなんらかの原因で壊れてしまった場合，別のOSのブートローダを読み出すことができなくなり，片方のOSだけでなく両方のOSが共倒れしてしまう，といった状況が発生してしまいます．

また別の理由として，``Linux``と``Windows``では利用するディスクのフォーマットが異なるため，パーティションごとにファイルフォーマットが異なるディスクは好ましいとはいえません．


　本記事で紹介する手法では，それぞれのOSを各ドライブに分け，それぞれ各自のブートローダーだけで起動できるようにします．
 こうすることで，始めに起動するブートローダーが破壊されてしてしまったとしても，もう片方の壊れていないOSは，問題なく起動することができるようになります．
 
# 方法
 - Windows 11が既にインストール済み
 - 後からUbuntu 22.04をインストール

という前提で進めます．
OSをインストールする順番ですが，特に関係ないと思います．

:::note info
まだ，1つ目のOSをインストールしていない方は，通常の方法でOSをインストールしてください．
:::
## 1. 既存のOSが入ったドライブの接続を解除する
　まず，既存のOSが入ったドライブの接続を解除する必要があります．
これは，ただソフトウェア的に接続を解除するのではなく，**物理的にSATAケーブル等を取り外して，接続を解除する必要**があります．
![接続解除](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/95206c7e-e6fd-d67e-4c99-9438d524da05.png)

## 2. 新規インストールOS用の物理ドライブを取り付ける
　既存のドライブの接続解除が行えたら，今度は新規インストールOS（新OS）用のドライブを取り付けます．
今の時点で，PCの構成図はこのようになっているはずです．
![デュアルブート前.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/5174b75e-3e13-cb79-097f-9701b14ef4b5.png)
## 3. OSのインストール
　シングルブートでOSをインストールするときと同じように，インストールメディアをPCに接続し，OSのインストールを行います．
  ``Ubuntu 22.04 LTS``では，以下のようにインストールするドライブを設定する画面で新規インストールします．このとき，シングルブートでインストールする場合と同様の手順で行うようにしてください．

OSのインストールが一通り済んだら，一度PCの電源を切ってください．

## 4. 既存OSドライブの取り付け
手順1で接続を解除した，ドライブを再接続します．
このとき，新OS用のドライブは接続を解除することなく，そのままにしておいて大丈夫です．

ここまでの手順を正しく踏んでいたら，以下のようなPC構成図になっているはずです．
![手順４までの様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/c68a783b-e4b6-4390-a569-954b7818fc62.png)


## 5. 起動確認
BIOS画面でブートの優先順位を変更し，起動したいOSがもう一方のOSより上に来るようにします．

正しく起動が確認できたら完了です．お疲れ様でした．
nodewatchもどきを作成する

```bash
mkdir like-nodewatch
cd like-nodewatch
npm init #全部適当
npm install express axios
touch app.js
```

```app.js
const express = require('express');
const axios = require('axios');

const app = express();
const port = 3030;
const apiNode = 'http://localhost:3000'

app.get('/api/symbol/height', async (req, res) => {
    try {
        const response = await axios.get(`${apiNode}/chain/info`);
        const data = response.data;
        const height = parseInt(data.height, 10);
        const finalizedHeight = parseInt(data.latestFinalizedBlock.height, 10);

        res.json({
            finalizedHeight,
            height
        });
    } catch (error) {
        console.error('Error fetching chain info:', error);
        res.status(500).send('Error fetching chain info');
    }
});

app.get('/api/symbol/nodes/peer', async (req, res) => {
    try {
        const chRes = await axios.get(`${apiNode}/chain/info`);
        const chData = chRes.data;
        const height = parseInt(chData.height, 10);
        const finalizedHeight = parseInt(chData.latestFinalizedBlock.height, 10);

        const niRes = await axios.get(`${apiNode}/node/info`);
        const niData = niRes.data;
        const mainPublicKey = niData.publicKey;
        const nodePublicKey = niData.nodePublicKey;
        const name = niData.friendlyName;
        const roles = niData.roles;
        const endpoint = `http://${niData.host}:3000`;

        const npRes = await axios.get(`${apiNode}/network/properties`);
        const npData = npRes.data;
        const currencyMosaicId = npData.chain.currencyMosaicId
            .replace(/'/g, '')
            .replace(/^0x/, ''); 

        const aiRes = await axios.get(`${apiNode}/accounts/${mainPublicKey}`);
        const aiData = aiRes.data;
        const mosaic = aiData.account.mosaics.find(m => m.id === currencyMosaicId);

        let balance = 0;
        if (mosaic) {
            const amountAsBigInt = BigInt(mosaic.amount);
            balance = Number(amountAsBigInt) / 1000000;
        }

        res.json([{
            balance,
            endpoint,
            finalizedHeight,
            height,
            mainPublicKey,
            name,
            nodePublicKey,
            roles
        }]);
    } catch (error) {
        console.error('Error fetching chain info:', error);
        res.status(500).send('Error fetching chain info');
    }
});

app.get('/api/symbol/nodes/api', async (req, res) => {
    try {
        res.json([])
    }
    catch (error) {
        console.error('Error fetching chain info:', error);
        res.status(500).send('Error fetching chain info');
    }
})

app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});
```

```bash
nohup node app.js &
```

最後にshoestringのconfigファイル
```mainnet.ini
[services]
nodewatch = http://localhost:3030
```

これでいけるような気がするけど環境がないので一切試してない！
【Vue3】名前付きスロットの使い方

# コード
```vue: App.vue
<template>
  <CardTemplate>
    <template #body>
      <!-- 表示させたいパーツを書く -->
      <span>中身</span>
    </template>
    <template #footer>
      <span>フッター</span>
    </template>
  </CardTemplate>
</template>

<script setup>
import CardTemplate from 'CardTemplate.vue'
</script>
```

```vue: CardTemplate.vue
<template>
  <v-card>
    <v-card-title>タイトル</v-card-title>
    <v-card-text>
      <slot name="body"></slot>
    </v-card-text>
    <v-card-actions>
      <slot name="footer"></slot>
    </v-card-actions>
  </v-card>
</template>
```
スロット名は任意。今回は`body`と`footer`にした。

# 参考
https://ja.vuejs.org/guide/components/slots#named-slots
【バッチ】読み取り専用以外のファイルを対象に処理したい（再帰あり）

## やりたいこと

フォルダ内の全ファイルを再帰的に処理したいが、読み取り専用は避けて（読み取り専用以外を）処理したい。
`/A`オプションを変更すれば、隠しファイル以外を処理することも出来そうです。

## 方法：FORコマンドを使用する

``` sh
FOR /F "delims=" %i IN ('DIR /A:-D-R /B /S *.*') DO ECHO "%i"
```

- `FOR`コマンド
    - `/F`オプション：テキストファイルやコマンドのトークンを処理対象とする
    - `delims`：トークンの区切り文字。`"deloms="`は区切り文字なしの意味で、半角スペースを含んだパスでも動作するように指定している
- `DIR`コマンド
    - `/A`オプション：指定した属性のファイルのみ表示
        - `:D`：ディレクトリ（`:-D`はディレクトリではないの意味）
        - `:R`：読取り専用ファイル（`:-R`は読み取り専用ではないの意味）
    - `/B`オプション：ファイル名のみ出力
    - `/S`オプション：再帰的に処理

> - **補足**
>     - 本コマンドをバッチファイルとして実行する場合、変数名の`%`を1つ増やして、`%%i`にする必要があります

## 使用例

``` sh
@ECHO OFF

FOR /F "delims=" %%i IN ('DIR /A:-D-R /B /S *.py') DO Black "%%i"

PAUSE
```

PythonのフォーマッターBlackを呼び出しています。
バッチファイルとして実行するため、変数を`%%i`に変更しています。

## 引用元

- [Windowsコマンド虎の巻](<https://windows.command-ref.com/>)
docker上のselenium serverで自分のサイトにアクセスできなかった件

## TL;DR
DNSから送られてくるIPアドレスは外部ホストから参照する用のもの
同一コンピュータ上のコンテナどうしでアクセスする際は、コンテナネットワークで割り当てられたIPアドレスを使用する必要がある

## 現象
同一のコンピュータのdockerで起動しているseleniumサーバとWebサーバがある
seleniumサーバからWebサーバに、ドメインを利用してアクセスしようとすると接続に失敗する
例）下記のコマンドが失敗する
```bash
curl mywebsite.com
```

## 原因
DNSから返されるIPアドレスは、WANからアクセスするためのもの。
同一コンピュータのdockerは同じローカルネットワーク上に存在しているため、これらで通信するためにはLAN上で割り当てられたIPアドレスを使用する必要がある。

## 解決法
```mywebsite.com```をLAN用のIPアドレスで解決できるよう、```/etc/hosts```に追記を行う。
```bash:コンテナのIPアドレスを確認
docker inspect your_network_name
```
```docker:docker-compose.yml
~~前略
  your-container-name:
    extra_hosts:
      - "mywebsite.com:x.x.x.x" #←に繋げたいコンテナのLAN上のIPアドレスを記入
```
OpsRamp - デプロイしたOpsRamp GatewayからSynthetic監視する方法

本記事では、デプロイしたOpsRamp GatewayからSynthetic監視する方法について説明します。

# 概要
OpsRampでは、デプロイしたOpsRamp GatewayをSyntheticの監視ロケーションとして設定することができます。これにより、内部ネットワークに対してもSynthetic監視することができます。

# 設定方法
Setup > AccountのCollector ProfilesからOpsRamp Gatewayプロファイル一覧に移動します。
![gateway-synthetic-agent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/eb76ba5d-afb8-e009-02f0-49eca4dee3ce.png)
対象OpsRamp Gatewayの一番右項目Synthetics Agentを有効化します。
![gateway-synthetic-agent2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/e015c2ac-bd95-fccc-f7c0-2fb957628ab4.png)
Synthetic Agentを有効化するとSyntheticモニタ設定画面のLocationsのOn-premisesにOpsRamp Gatewayが表示されます。
![synthetic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/0078b9da-e013-23a3-1148-9cf250d24c76.png)



---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
PowerApps Component Frameworkでイベント実装

# はじめに
PowerApps Component Frameworkでコードコンポーネントを実装するときにイベントの実装方法に困っていました。なんとか出来たので、その方法の備忘です。

# 前提条件
今回の実装には、いまだプレビューですが「React」テンプレートを利用しています。

# イベント定義
イベントの定義は次のように、マニフェストファイル：「ControlManifest.Input.xml」で行いますが、ビルドしても型定義ファイルが作成されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2507810/767627ab-f6ff-9870-65bc-389049eac552.png)

ということで、自分で型定義を拡張する必要があるようです。
次のように「ContextExtended.ts」でparameter として渡ってくる型にイベントを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2507810/3baa040d-ba81-08fa-4829-5361643f6382.png)

# イベント実装
まず、コンポーネント部の記述する「xxxx.tsx」に、拡張した型定義をインポートします。
インターフェイス部分のイベントハンドラ用のプロパティを追加後、コンポーネント（以下の例では、CompoundButton)のクリックイベントハンドラにイベントハンドラ用プロパティを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2507810/8a16a494-6d20-f4fb-522f-b7c49eea42ec.png)

さらに、呼び出し部分の「index.ts」にコンポーネント側で実装したイベントハンドラ用プロパティに実装したイベントを設定します。実装イベント内で、マニフェストファイルで定義したコードコンポーネントのイベントへボタンクリックを通知し、あわせて変更状態の通知も行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2507810/d1de1360-89fd-d082-6342-79578f75080e.png)

# 動作確認
動作確認の為、環境へアップし次のようにキャンバスアプリ上でコンポーネントを追加します。
イベントが追加され、マニフェストファイルで追加した初期値も正しく設定されているのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2507810/cdd3aa43-b174-8631-2370-2b88437d4af1.png)

イベント動作確認のため、初期値で設定したPowerFXの式`UpdateContext({varPCFButtonClick:"PCFボタンがっクリックされました"})`の変数をテキストラベルに参照します。

クリックすると、ただしくテキストラベルに文字列が表示されました。
![pcf-events.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2507810/1606c511-86d0-0da1-30bf-87a6b189bc90.gif)

# さいごに
今回はPCFを使って、コードコンポーネント上でイベント実装する方法を解説しました。プロパティだと、マニフェストファイルに書くと型定義が作られるますが、イベントは違うようなので注意が必要です。
npm本体のバージョンアップデート方法


## npmのバージョンアップデート方法

npmのバージョンを最新に更新するには、Terminalで以下の手順を実施します。

### 1. 現在のnpmバージョンを確認する

```sh
npm --version
```

### 2. npmを最新バージョンに更新する

```sh
npm install -g npm@latest
```

### 3. 更新後、再度バージョンを確認して正しくアップデートされたか確認する

```sh
npm --version
```

## 注意点

- グローバルインストールには管理者権限が必要な場合があります。その場合は、コマンドの前に`sudo`を付けて実行してください。

- Node.jsのバージョンによっては、特定のnpmバージョンが推奨される場合があります。Node.jsをアップデートすることで、推奨されるnpmバージョンも自動的に更新されることがあります。

- npmの更新後、他のパッケージやプロジェクトに影響が出る可能性があるため、更新前にプロジェクトのバックアップを取ることをお勧めします。
react-hook-formのuseFieldArrayのidは勝手に上書きされる件

# はじめに
みなさん、こんにちは **torihazi**です

花粉症です。鼻がぴえんです。

# 結論
useForm定義時にapiを通じてbackendから取得してきた配列(itemsとする)を元にuseFieldArrayを使用し、その戻り値であるfieldsの各idと元々のitemsの各idは一致しない。
useFieldArrayはidを勝手に上書きする。
> useFieldArray automatically generates a unique identifier named id which is used for key prop. For more information why this is required: https://react.dev/learn/rendering-lists
https://react-hook-form.com/docs/usefieldarray

例えば
```
fields.map((field,index)=> <Hoge id={field.id} key={field.id} />)
```

みたいにして描画した際に対応するindexのitemsのidとfieldsのidは一致しない。

そのため、各フォームが独立していてそのフォーム内で元々のidを使用したい場合、
```
form.getValues(`配列の名前.${index}.id`)
```
としなきゃダメ。

useFormのhandleSubmitを通せばその問題は気にしなくて良くなる
```
form.handleSubmit(
    // onValid
    (data) => {
      update({
        ...data.items?.[index],
        title: 値
      };
    },
)();
```

# 終わりに
追加可能フォームを作成し、各フォームが独立してsubmit可能であるようなものを作ってました。
update等もできるようにしたところ、そのidを指定してupdateできるようなものです。
最初はこれを知らずにいくらリクエストしても"Record Not Found"であり、そんなバカなと思ってbackendの全テーブルを検索したにも関わらず存在しないidと言われて萎えてました。

こういうことだったんですね。納得です。
OMC228B

https://onlinemathcontest.com/contests/omc228/tasks/8411

$\Sigma_{n=1}^N(n^3-1110n)=\Sigma_{n=1}^Nn^3-1110\Sigma_{n=1}^Nn$なので、
$\Sigma_{n=1}^Nn^3$と$\Sigma_{n=1}^Nn$を知りたい。

$\Sigma_{n=1}^Nn=\frac{N (N+1)}{2}$なのはわかる。
$\Sigma_{n=1}^Nn^3$をなんとか求めたい。

$n^3=b_n-b_{n-1}$と置くと、
$\Sigma_{n=1}^Na_n=\Sigma_{n=1}^N(b_n-b_{n-1})=b_N-b_0$となるので、$b_n$を求めたい。

まず、$f(n)-f(n-1)$から$n^3+\alpha$の形を作りたい。
$f(n)=n^4$と置くと、
$f(n)-f(n-1)=n^4-(n-1)^4=4n^3-6n^2+4n-1$
$f'(n)=\frac{1}{4}f(n)$と置くと、
$f'(n)-f'(n-1)=n^3-\frac{3}{2}n^2+n-\frac{1}{4}$

端数を消したいので、$\frac{3}{2}n^2+\beta$を作りたい。
$g(n)=n^3$と置くと、
$g(n)-g(n-1)=n^3-(n-1)^3=3n^2-3n+1$
$g'(n)=\frac{1}{2}g(n)$と置くと、
$g'(n)-g'(n-1)=\frac{3}{2}n^2-\frac{3}{2}n+\frac{1}{2}$

$(f'(n)+g'(n))-(f'(n-1)+g'(n-1))=n^3-\frac{1}{2}n+\frac{1}{4}$

端数を消したいので、$\frac{1}{2}n+\gamma$の形を作りたい。
$h(n)=n^2$と置くと、
$h(n)-h(n-1)=n^2-(n-1)^2=2n-1$
$h'(n)=\frac{1}{4}h(n)$と置くと、
$h'(n)-h'(n-1)=\frac{1}{2}n-\frac{1}{4}$

$(f'(n)+g'(n)+h'(n))-(f'(n-1)+g'(n-1)+h'(n-1))=n^3$

したがって、
$b_n=\frac{n^4}{4}+\frac{n^3}{2}+\frac{n^2}{4}=\frac{1}{4}n^2(n+1)^2$

$\Sigma_{n=1}^Nn^3=\Sigma_{n=1}^N(b_{n}-b_{n-1})=\frac{1}{4}N^2(N+1)^2$

$\Sigma a_n=\frac{1}{4}N^2(N+1)^2-555N (N+1)=\frac{1}{4}N (N+1)(N (N+1)-2220)$
$4×15×555^2=18481500$

$N=100$の場合、$10100×(10100-2220)=79790000$
$N=50$の場合、$2550×(2550-2220)=841500$
$N=75$の場合、$5700×(5700-2220)=19836000$
$N=70$の場合、$4970×(4970-2220)=13667500$
$N=74$の場合、$5550×(5550-2220)=18481500$

したがって、$N=74$。
【電通大生向け】VS codeのremote-sshでcedにアクセスする

## はじめに
電通大のCEDの計算機を使うにはsshで接続するか実際にCEDまで赴くかのどちらかです。sshを使う場合、VScodeの拡張機能「Remote-SSH」が推奨されていますが、実際に必要な設定などはあまり紹介されていません。

この記事ではCEDへの接続の流れを紹介します。

ssh、サーバーなどについて知識があるわけではないので詳しいことはまだ書けないです。ご容赦ください。

## 1\. VS codeのインストール
下のURLからVScodeをインストールしましょう。
[https://code.visualstudio.com/download](https://code.visualstudio.com/download)

## 2\. 拡張機能のインストール
![スクリーンショット 2024-10-09 16.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688892/9b9c5e45-2355-55e6-ffbd-c6d5c5268e2e.png)
印のアイコンを押して、検索欄の場所に「Remote-SSH」と入力し、該当する拡張機能をインストールしてください。Microsoftが公開している拡張機能がそれです。

## 3\. 鍵ペアの生成と登録
下のサイトに従って公開鍵と秘密鍵のペアを作成してください。特にこだわりがなければ鍵は自動生成でいいと思います。

:::note alert
注意
ダウンロードした秘密鍵は他の人に見られないようにしてください。
:::

[ITCユーザーズガイド_SSH](https://www.cc.uec.ac.jp/ug/ja/remote/ssh/#remote-ssh-keypair)

## 4\. 鍵の配置
1\. 自分のPCの.sshディレクトリにダウンロードした**秘密鍵のファイル**を配置する。(CUI操作だと結構楽)
<br>
2\. 一度CEDに接続し、接続先の.sshディレクトリに「authorized_keys」という名前のファイルを作成する。

:::note warn
注意
authorized_keysファイルの拡張子は何もつけないでください。
:::

<br>

3\. 作成したauthorized_keysファイルに**公開鍵**をコピペして保存する。

<br>

## 5\. 実際に接続してみる
1\. sshコマンドの入力

VS codeの左のタブの「リモート エクスプローラー」から、「SSH TARGETS」をクリックし、sshでログインするコマンドを書き込む。

これでsshの接続先を追加できます。

<br>

2\. 追加した接続先を選択して接続する。
![スクリーンショット 2024-10-09 18.10.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688892/299f2ca5-e201-f791-641e-609d10a26721.png)

矢印のアイコンを押すと現在のウィンドウで接続し、ウィンドウのようなアイコンを押すと新しくウィンドウを作ってそこで接続します。
<br>

3\. configの選択
![スクリーンショット 2024-10-09 17.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688892/51733f5e-d79e-4e00-c132-2b49b4072422.png)

こんな感じのものが出てきたら一番上の ~/.ssh/config を選択する。
<br>

4\. パスワードを入力する。
<br>
これでCEDにログインができます。

## 追記
* 初めて接続する場合は接続するまで時間がかかります
* うまく接続できなかった場合はもう一度接続し直すとうまくいきました。パスワードを間違えたりしても「接続が確立できませんでした」と表示されるのでもう一度試してみてください
* 「フィンガープリントは～です。」と表示されることがありますが続行して問題ありません
* 接続先のOSを聞かれることがありますが、間違えないよう気を付けてください

## おわりに
.sshディレクトリで操作をするときなど、コマンドを使うと便利なので、簡単に紹介しておきます。

```
cd [移動したいディレクトリ] 
mv [ファイル名] [移動先のディレクトリ名]
touch [ファイル名]
```

* cd：ディレクトリの移動。「cd」だけを打ち込むとホームディレクトリに戻る。
* mv：ファイルの移動。名前の変更などもできる。
* touch：拡張子込みで指定した名前のファイルを作成する。

<br>

ちなみに、cedだけでなく他の演習室にもsshコマンドを変えれば接続できそうなので、ぜひ試してみてください。

## 参考文献
* @nlog2n2 (Toshihiro Sekiguchi). "Visual Studio CodeでRemote SSHする。". Qiita. 2020-3-2 ,[https://qiita.com/nlog2n2/items/1d1358f6913249f3e186](), (参照 2024-10-9)

https://qiita.com/nlog2n2/items/1d1358f6913249f3e186
Power Apps のテキストラベルの中で改行する方法

# やりたいコト
ごきげんよう、百合宮桜です。
突然ですが、こういうギャラリーとかで複数のテキストラベルを

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/3467db19-b685-a1fe-b0a8-3946b3b24fe5.png)

こんな感じで1つにまとめたいなーって思ったりしません？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/9ffdfc43-7970-b041-6f3a-fa006c285068.png)



だって仕様変更した時に、複数のテキストラベルを同じ仕様に直すの面倒だし、1個にできたらメンテナンスもラクになるわー！ 

でもテキストラベルって Fx 欄で式を改行したからといって、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c4c949fd-bec9-2d76-da7c-ca7a5ac1433e.png)

テキストラベルの表示に改行を反映してくれる訳ではない💦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/95ba311b-071a-2724-d166-580edc0f36b6.png)

これを改行を反映した表示↓にする Tips です(*'▽')
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/9ffdfc43-7970-b041-6f3a-fa006c285068.png)

# 実装方法

方法はめっちゃ簡単で、改行したい部分に Char 関数を入れ込むだけ！
今回は名前と観劇日の間に改行を入れたいので、真ん中に Char 関数を入れています。

```
ThisItem.タイトル&Char(10)&ThisItem.観劇日
```

# Char 関数って？
ASCII 文字の文字コードを文字列に変換する為の関数です。
改行の文字コードは「10」なので、今回は「10」を指定しています。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-char

空白を入れたい場合は「32」を指定すれば、空白が入ります。
ASCII 文字の文字コードはこちらのサイト↓にまとまっていますので、自分が入れたいモノの番号を確認してみてください！

https://www.curict.com/reference/ascii/#:~:text=ASCII%20Code

それではごきげんよう！
【初投稿】カバレッジホールてなーに

みなさん、はじめまして。これが初投稿です。

私は現在、某データセンターに勤務している21歳のしがない派遣社員です。
**DEAN(ディーン)** とでも呼んでください。~~ディーンフジオカではないです。~~
来年の2025年3月までに、ネットワークエンジニアの登竜門的資格である**CCNA**を取得すべく、資格勉強に明け暮れる毎日を過ごしています。
私の勉強法はただ一つ。それは、みんな大好き[Ping-T](https://mondai.ping-t.com/)でとにかく問題を解きまくることです。~~とにかく解きまくって、問題と解答丸暗記してしまおう！！~~

(俗にいう)[白本](https://amzn.asia/d/din18Mh)などの参考書を用いてイチからインプットして、それからアウトプットとしてPing-Tなどで問題演習に取り組んでみてもいいんじゃないかとは思ったのですが、いかんせん時間がかかり過ぎてしまうのであまり効率的ではないかなと思ったわけです。それに、私は既に**ITパスポート**と**情報セキュリティマネジメント**を取得しており、CCNAを勉強する上で最低限のネットワーク知識はあるだろうと自負しています。なので、問題形式に少しでも早く慣れるべく問題演習を中心に取り組んでおります。~~あと、単純に900ページ弱ある、あのクッソ分厚い本を読みたくないってのもあります。~~ 白本はやはり、辞書代わりに使うのがベストですね。
# 自己紹介
初投稿なんで、ちょっとした自己紹介をさせてください。

東京都出身
2002年生まれ・21歳(男性)
高校卒業後、経済的事情により大学へ進学せず就職。
現在、なんだかんだで社会人4年目やらせてもらってます。
これまでに取得した資格としては以下の通り

・P検定3級(2019年3月合格)
・ITパスポート(2020年9月合格)
・情報セキュリティマネジメント(2024年3月合格)
※P検とIパスは高校生の時に取りました。

現在は先述の通り、CCNA取得を目標に学習を進めています。

Ping-T にて、とにかく過去問を毎日解きまくっているんですがただ解いているだけだとなんか物足りないなと、なんか面白くないなと(？)思ってしまったわけです。そこで、私はふとこんなことを思いつきました。

**Ping-T でつまずいたところ、Qiitaにまとめてみたら面白いんじゃね？**

Qiitaといえば、エンジニアが集う最高のコミュニティじゃないですか。
**まさに「エンジニアの、エンジニアによる、エンジニアのためのコミュニティ」**
ということで、私もネットワークエンジニアを夢見る冒険者(？)として、ここにいろいろ書き込んでみてぇ～なっていうそんな不純な動機でQiitaを始めてみることにしました。~~まあ、流行りに乗りたいミーハってやつです。知らんけど。~~
私が勤務しているデータセンターではシフト制を採用していて(ってか、データセンターやカスタマーサポートってそういうとこばっかだよな)休みが不定期なのですが、主に仕事がお休みの日にQiitaへ遊びに来て、ブログを書いていこうと思います。
書く内容としては、当分はCCNAの試験範囲であるネットワーク技術や知識にまつわることで個人的に気になったワードとか、仕組みをピックアップしていけたらなと思っています。

# 本題：カバレッジホールてなーに
だいぶ前置きが長くなってしまいましたが、記念すべき初回のテーマはコチラ。

**カバレッジホールってなんぞや？**

**無線LANで複数のAPを配置するにあたり、ベストプラクティスとされるのはどれか**というPing-T の問題で、正解は以下の二つになります。

・オーバーラップしないようにチャネルの割り当てを行う
・カバレッジホールが無いように配置する

**オーバーラップしないようにチャネルの割り当てを行う**はなんとなく「あ～チャネルが重複しないように割り当て行うって意味だろうからこれだよな」と選択できたのですが、カバレッジホールというワードを知らず、以下の選択肢を選択してしまいました。

**×電波干渉しないようにAP間は大きく離して配置する**
よくよく考えたら、いくら干渉回避対策だとしてもAP間を大きく離しちゃったら、通信が途切れ途切れになっちゃって使い物にならんよなって今更気づきました(笑) それに、解説には他にも「**電波が途切れるとローミングができないなどの不都合が出てくる**」と記載がありました。なるほど、、、
※ローミング・・・**契約している通信事業者の提供範囲外で、他の事業者の設備を利用して音声通話やインターネットなどのデータ通信を行う仕組み**

カバレッジホールについては、初めて聞いた言葉だったのでちょっと調べてみました。

カバレッジホールとは・・・
    **アクセスポイントからの電波が到達せず、無線LANでの通信ができない範囲のこと。** 逆に、電波や無線通信の送受信が可能なエリアの割合を**エリアカバレッジ**と呼ぶ。
なるほど、確かに[**coverage**](https://ejje.weblio.jp/content/coverage)と英和辞典で引いてみると↓
「対象、補償、範囲や受信地域などのこと」と記載があります。
※ちなみに、単語のレベル自体は英検準1級レベル以上(TOEICだと730以上)だそうです。

表現的には、セキュリティホールと少し似ている感じがします。
セキュリティホールは簡単に言えば**セキュリティの穴**、いわゆる脆弱性ともいわれたりしますが、カバレッジホールもセキュリティホール同様、**通信範囲の穴**=通信が届かないエリアと考えることもできます。
今回の問題は「coverage」この単語の意味が分かれば解けたのではないでしょうか。やはり英語は大切ですね・・・

またひとつ、新しい英単語を覚えることが出来ました。
ほんの少し、賢くなった気がします。~~(たぶん、気のせい)~~

# 終わりに
とまあ、こんな感じでまずは備忘録みたいな感じで、Qiitaにどんどん発信していこうかなって思っています。正直、こういうブログを使って何かをアウトプットすることって今までやったことがなかったので、果たしてこれが正解かは分かりませんが、同じようにCCNAの取得目指して頑張っている方や、新米ネットワークエンジニアの方、はたまたバリバリやってますよっていうベテランエンジニアの方々など・・いろんな方と、このQiitaを通してコミュニケーションを図り、エンジニアライフをより良いものにしていきたいと思っていますので、これからどうぞよろしくお願い致します！！

本日はここまでです。
最後まで読んでくださって、ありがとうございました。

#1
C#について概要をまとめる

## 概要
マイクロソフトが開発した、汎用のマルチパラダイムプログラミング言語である。
C#は、Javaに似た構文を持ち、C++に比べて扱いやすく、プログラムの記述量も少なくて済む。
また、C#は、Windowsの.NET Framework上で動作することを前提として開発された言語であるが、2023年現在はクロスプラットフォームな.NETランタイム上で動作する。

デスクトップ・モバイルを含むアプリケーション開発や、ASP.NETをはじめとするWebサービスの開発フレームワーク、ゲームエンジンのUnityでの採用事例などもある。

マルチパラダイムをサポートする汎用高レベルプログラミング言語で、静的型付け、タイプセーフ、スコープ、命令型、宣言型、関数型、汎用型、オブジェクト指向（クラスベース）、コンポーネント指向のプログラミング分野を含んでいる。

C#の言語仕様は標準化団体Ecma Internationalを通じて公開・標準化されており、第三者がマイクロソフトとは無関係にコンパイラや実行環境を実装することができる。

登場時期：2000年 (24年前)

## コンパイル
Visual Stadioを使ったコンパイルを前提としているが、使わない方法では.NET Frameworkが必要になってくる。
※そもそもC#は実行環境に.NET Frameworkのインストール必要になる。

コンパイルをするcsc.exeの後ろにコンパイルするソースコードファイル名を指定する。
```
C:WindowsMicrosoft.NETFrameworkv3.5csc.exe C:test.cs
```

## 参考
https://ja.wikipedia.org/wiki/C_Sharp

https://www.sejuku.net/blog/104421
eclipseでクラス図を描く方法


<!--

## 技術記事のタイトル

最も伝えたいこと。
簡潔かつ分かりやすく過不足ないタイトルを考えましょう。

### 【 】(墨付き括弧)

- 【言語やサービス】
    - 例1.【Python】すぐにpytestで単体テストを実行するまでの手順
- 【言いたいこと】
    - 例1.【必見】Objectはどこに消えた？
- 【前提】
    - 例1.【個人開発】○○を○○できるサービスをリリースしました
    - 例2.【初心者向け】Reactとはそもそも何なのか説明します
- 【続き物の番号】
    - 例1.【2024年版】新入社員向け研修資料を公開します
    - 例2.【環境構築編】Windows11でPythonを実行するまで

【前提】詳しいタイトル【言語やサービス】のように、複数を併用するパターンもあります。

-->

## eclipseでクラス図を描く方法
<!--
何についての記事なのか、誰に向けた記事なのかを簡単に説明しましょう。
-->



### この記事でわかる・できること
<!--
読んだら何がわかるようになるのか、何ができるようになるのかを書きましょう。
-->

eclipseのクラス図の自動生成のやり方が、
分からなかったのでまとめてみます。


### この記事の対象者
<!--
誰に向けた記事なのかを明確にすることで読者に選んでもらいましょう。
-->

そう、わたしだ。

### 動作環境・使用するツールや言語
<!--
誰に向けた記事なのかを明確にすることで読者に選んでもらいましょう。
環境を書くと分かりやすいです。
- OS バージョン
    - 例 Windows11 23H2
- ツール
    - 例 VSCode 1.86.2
- 言語
    - 例 Python 3.12.2
- フレームワーク
    - 例 flask 3.0.2
-->

- OS windows
- ツール eclipse
- 言語 Java


## eclipse.iniにコードを追加
<!--
章全体の要約や、何について書くのかをここに書きます。
記事が長い時や資料として作るときは番号を振ることをおすすめします。
章を増やすときは章から項までをコピーしてください。
-->

・eclipse.iniの場所:　C:\pleiades\yyyy-MM\eclipse

・メモ帳で開いて下記コードを追加し保存
```    python:Java
--add-opens=java.desktop/java.beans=ALL-UNNAMED
```

・いったんeclipseを再起動

## クラス図のファイルを追加

今回、クラスファイル（Bicycle.java、Car.javaなど）が入った
フォルダを対象とするので、practice02で右クリック>新規>その他


![スクリーンショット 2024-10-09 161511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868421/13487321-f11b-0700-7cae-a7df817709cc.png)

画像のクラス図を選択

![スクリーンショット 2024-10-09 161951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868421/e68e00e8-1f29-90b5-ec37-0184c994830f.png)

cldファイルが生成

![スクリーンショット 2024-10-09 162226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868421/7b70870a-6d09-6fe1-e36c-42b60ac94086.png)

cldファイルを開くと画像のような画面となります。

![スクリーンショット 2024-10-09 162854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868421/74f2a23f-ba70-0e16-39f1-853da47e19b7.png)

あとは左のクラスファイルを右側のスペースにドラッグ＆ドロップすれば・・・

![スクリーンショット 2024-10-09 163034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868421/1599ab53-7621-53f6-8291-c8d19c7ae1a2.png)


![スクリーンショット 2024-10-09 163051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868421/4e2bf685-b10d-78c8-bd92-4538f343f657.png)

完成！
継承関係とかすごくわかりやすい！






<!--
記事の主要な部分です。ここに思い思いの内容を書いていってください。

画像やGIFがあると分かりやすいです。
画像があるとUIが変わったとしても読者がアタリをつけて対応しやすくなります。

コードを記載する場合は必ずコードブロックを使いましょう。
バッククオート3つで囲んでください。
```python:表示名

    print('Hello World')
    
```
-->





<!--
より詳細な内容を書いたり、事例を挙げたりするときに使います。
- 節の内容の列挙
- 節の補足事項
- 例外
-->




## 参考資料


https://digital-literacy88.com/eclipse/

https://qiita.com/Misaku/questions/5d0e860cc67920160c07



## おわりに・まとめ
<!--
どちらかを書きます。あってもなくても良いです。
-->

改めて、エンジニアの方ってアウトプットの量がすごいんだなぁ
っておもいました。自分は頻繁に記事を書く気力がない、
けど頑張りたい。
三項演算子がわからない

# はじめに
 三項演算子（条件演算子）が苦手なので、覚書として書いておこうと思います。

 # 三項演算子#とは

 条件分岐を簡潔に表現するための演算子のこと。「条件演算子」と呼ばれることもある。名前の由来は、この演算子が3つの「項」（オペランド）を取ることから来ている（らしい）。
 簡単なif文と置換することができる。
```javascript:if文の場合
if (条件式){
  真の場合の値
}else {
  偽の場合の値
}
```
```javascript:三項演算子の場合
条件式 
? 真の場合の値
: 偽の場合の値
```

# 具体例
```javascript:三項演算子の例
let result = age >= 18 ? "成人" : "未成年";  
```
```javascript:同等のif文
let result;  
if (age >= 18) {  
    result = "成人";  
} else {  
    result = "未成年";  
}  
```
# 三項演算子の利点
　ChatGPTに聞いてみました。

　1. 簡潔性：単純な条件分岐を1行で表現できます。
　2. 式としての使用：三項演算子は式なので、変数への代入や関数の引数として直接使用できます。
　3. 可読性：適切に使用すれば、コードの可読性を向上させることができます。

# 個人的な感想
　ソースを読んでるときに出てきて、そういえばこんなのあったなと思いました。正直変数がごちゃごちゃしてる中に出てきたら思考停止してしまいます......。ソースコードの短縮になるんだろうなとは思いますが、自分で書くときに頭が回るかは微妙なところです。精進します。

 # 参考
 とてもわかりやすかったです。ありがとうございました。こちらの記事を見ると定数への代入をする時に三項演算子は有効だとよくわかります。
 
https://qiita.com/smicle/items/7d3b9881834dc0142fb7

https://qiita.com/chokuryu@github/items/8b9cff5ea92be245b026