OmniAICreator/Qiita-1.07M huggingface dataset:
Next.js のルーティング

### Page Routerをつかう方法
- pagesディレクトリ以下のファイルは自動的に使える
- index.jsがディレクトリのルート
    - /pages/index.js は'/'によってアクセスできる
### App Routerを使う方法
- page.jsxファイルをNext.jsアプリケーションの/app配下で作成すると、page.jsxファイルの存在する該当ルートが使えるようになる
- /app/page.tsxは'/'に該当
- ルートごとのレイアウトをlayout.jsxによって決定できる
    - 以下のような形式なので、a/bというディレクトリ構成で、a, bそれぞれにlayout.jsxを作成すると、レイアウトが二重にかかることになる
```
export default function Layout({ children }: { children: React.ReactNode }) {
    return (
      <div className="bg-red-300">{children}</div>
    );
  }
```
 ### 参考
- https://nextjs-ja-translation-docs.vercel.app/docs/routing/introduction
- https://nextjs.org/learn/dashboard-app/creating-layouts-and-pages
OSI基本参照モデルの実際のイメージ

今回はOSI基本参照モデルについて、イメージを作成してみました。基本情報技術者試験とかにも出てきますが、なかなかイメージできませんよね。

Webページを閲覧するシンプルなプロセスを通して、OSI基本参照モデルの各層がどのように機能するかをステップバイステップで追ってみます。

# 実際のイメージ
想像してみてください：あなたは自分のPCでWebブラウザを開き、お気に入りのニュースサイトにアクセスしたいと思っています。

### ステップ1: アプリケーション層（第7層）
あなたはブラウザのアドレスバーにニュースサイトのURLを入力します。この時点で、アプリケーション層が動作し、HTTPリクエストを生成しています。
### ステップ2: プレゼンテーション層（第6層）
生成されたHTTPリクエストは、適切なフォーマットに変換（例えば、暗号化）されます。これがプレゼンテーション層の役割です。
### ステップ3: セッション層（第5層）
通信セッションが確立され、HTTPリクエストを送信する準備が整います。この層はセッションの開始と終了を管理します。
### ステップ4: トランスポート層（第4層）
HTTPリクエストはTCPによってセグメントに分割され、送信のための準備が整います。ここで、正しい宛先ポートにデータが送られるようになります。
### ステップ5: ネットワーク層（第3層）
セグメントにIPアドレスが付与され、パケットとして送信されます。この層では、パケットが最終目的地へ向かうためのルーティングが行われます。
### ステップ6: データリンク層（第2層）
パケットはフレームに変換され、物理的なアドレス（MACアドレス）が付与されます。これにより、ローカルエリアネットワーク内での正確なデバイスへの配送が可能になります。
### ステップ7: 物理層（第1層）
最終的に、フレームは電気信号（有線の場合）や電波（無線の場合）に変換され、物理的な媒体を通じて送信されます。


## まとめ
これらのステップを通じて、あなたのリクエストはインターネット上を旅して、目的のWebサーバーに到達します。サーバーでは、これらのプロセスが逆の順序で実行され、最終的にあなたのPCのブラウザにWebページの内容が表示されます。

各層は独立して機能し、下の層から提供されるサービスを利用して、上の層へとデータを渡していきます。これにより、複雑なネットワーク通信が可能になり、エンドツーエンドでデータがやりとりされます。
Get-Date の -Format パラメーターで指定できるオプションを調べてみる (1 文字パターン編)

PowerShell で実行できる Get-Date の -Format パラメーターには様々なオプションが指定できますが、おなじみの yyyy/MM/dd のような指定以外の方法についてドキュメントにまとまっているものが見つからなかったので、ざっくりと調べてみました。

といってもやることは簡単で、こんなコードを実行するだけです。

```PowerShell
$Date = Get-Date
$Str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
$Str.ToCharArray() | foreach {
    try {
        $Result = $Date | Get-Date -Format $_
        # $Result = $Date.ToString([string]$_) でもよいのだけど Char 型から String 型へキャストしないといけなかった
    } catch {
        $Result = $null
    } finally {
        "Get-Date -Format $_ ... $Result"
    }
}
```

出力結果はこんな感じです。

```
Get-Date -Format a ...
Get-Date -Format b ...
Get-Date -Format c ...
Get-Date -Format d ... 2024/03/21
Get-Date -Format e ...
Get-Date -Format f ... 2024年3月21日 18:27
Get-Date -Format g ... 2024/03/21 18:27
Get-Date -Format h ...
Get-Date -Format i ...
Get-Date -Format j ...
Get-Date -Format k ...
Get-Date -Format l ...
Get-Date -Format m ... 3月21日
Get-Date -Format n ...
Get-Date -Format o ... 2024-03-21T18:27:17.3238661+09:00
Get-Date -Format p ...
Get-Date -Format q ...
Get-Date -Format r ... Thu, 21 Mar 2024 18:27:17 GMT
Get-Date -Format s ... 2024-03-21T18:27:17
Get-Date -Format t ... 18:27
Get-Date -Format u ... 2024-03-21 18:27:17Z
Get-Date -Format v ...
Get-Date -Format w ...
Get-Date -Format x ...
Get-Date -Format y ... 2024年3月
Get-Date -Format z ...
Get-Date -Format A ...
Get-Date -Format B ...
Get-Date -Format C ...
Get-Date -Format D ... 2024年3月21日
Get-Date -Format E ...
Get-Date -Format F ... 2024年3月21日 18:27:17
Get-Date -Format G ... 2024/03/21 18:27:17
Get-Date -Format H ...
Get-Date -Format I ...
Get-Date -Format J ...
Get-Date -Format K ...
Get-Date -Format L ...
Get-Date -Format M ... 3月21日
Get-Date -Format N ...
Get-Date -Format O ... 2024-03-21T18:27:17.3238661+09:00
Get-Date -Format P ...
Get-Date -Format Q ...
Get-Date -Format R ... Thu, 21 Mar 2024 18:27:17 GMT
Get-Date -Format S ...
Get-Date -Format T ... 18:27:17
Get-Date -Format U ... 2024年3月21日 9:27:17
Get-Date -Format V ...
Get-Date -Format W ...
Get-Date -Format X ...
Get-Date -Format Y ... 2024年3月
Get-Date -Format Z ...
```

おなじみのいつもの書き方 

```PowerShell
Get-Date -Format "yyyy/MM/dd HH:mm:ss" 
```

を利用するのも汎用性があって簡単でいいものですが、こういう便利なショートカット的オプションもあるんだよ、ということえ覚えておくと役に立つかもしれません。
ちなみに私は s オプションをよく使います。
Powershell でバイナリファイルを分割・復号

# はじめに
メイルを用いてファイルを共有する必要があった
しかしファイルサイズが大きくて送信できなかった
そんなこんなで分割と復号のPowershellスクリプト作ったので共有

# 分割
```powershell:split.ps1
$src = join-path $(get-location) "source.zip"
$raw = [System.Io.File]::ReadAllBytes($src)
$b64 = [Convert]::ToBase64String($raw)
$size = 5MB
$num = 0
for ($i = 0; $i -lt $b64.Length; $i += $size){
	$chunk = $b64.Substring($i, [Math]::Min($size, $b64.Length - $i))
	$dst = $src + "-" + $num.ToString("D3") + ".txt"
	$chunk | Out-File -FilePath $dst
	$num++
}
```

# 結合
```powershell:join.ps1
$prefix = "destination.zip"
$suffix = ".txt"

$b64 = ""
for ($i = 0; $i -lt 999; $i++) {
	$src = join-path $(get-location) ($prefix + '-' + $i.ToString("D3") + $suffix)
	if ($false -eq $(test-path $src)) {
		break
	}
	$b64 += get-content $src -raw
}
$raw = [Convert]::FromBase64String($b64)
$dst = join-path $(get-location) $prefix
set-content -path $dst -value $raw -encoding byte
```

# おまけ
Powershellのスクリプトはたいていセキュリティで引っかかるので次のように実行すると吉
```powershell -executionpolicy remotesigned .\split.ps1```
Laravelのpluckは便利ですよって話

### はじめに

Laravelで開発していると必ずと言っていいほど出てくるpluckですが、Collection型配列を整頓するだけではない魅力も感じたので記事に起こそうと思いました。

状況に次第ではありますが実はEloquentで使用するとselect関数が必要なくなるんです

### 基本機能

Readoubleからそのまま引用してしまいますが、基本的な機能としては、

指定したキーのコレクション値を取得します

第1引数にvalueを、第2引数にはkeyを入れます

第1引数のみであれば、valueだけを

```php
$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

$plucked = $collection->pluck('name');

$plucked->all();

// ['Desk', 'Chair']
```

さらに、コレクションのキー項目も指定し、指定したキーの値だけを取得することもできます

```php
$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

$plucked = $collection->pluck('name');

$plucked->all();

// ['Desk', 'Chair']
```

Readoubleでは続きが書かれていますが、本記事ではここまでにしておきます。続きは参考文献からご覧ください。

### Eloquentで取得したデータに対してキーを絞る

例えば下記のようなテーブルがあり、usersテーブルとして、

- id (ユーザーのID)
- name (ユーザーの名前)
- email (ユーザーのメールアドレス)
- created_at（ユーザーの作成日時）
- updated_at (ユーザーの更新日時)

このテーブルに対して、Eloquentを使用して特定のカラムデータを取得するpluckの使用例をいくつか出してみます

### 例1 名前のリストを取得

```php
$names = User::pluck('name');
// ['Alice', 'Bob', 'Charlie']
```

nameカラムの値を取得し、その値のコレクションを返します。

### 例2 ユーザーIDをキーとして名前を取得

```php
$names = User::pluck('name', 'id');
// [1 => 'Alice', 2 => 'Bob', 3 => 'Charlie']
```

ここで数字はuserのID、それに続く名前はnameカラムの値に対応している

### キー（カラム）を絞るならselectでも良いのでは？

実はselectでも同じようなことができます

```php
$names = User::select('name', 'id')->get();
// [1 => 'Alice', 2 => 'Bob', 3 => 'Charlie']
```

出力結果も同じです。

じゃあなぜわざわざpluckを紹介しているんだ？と思われるかもしれませんが、よくご覧くださいpluckには `->get()` が無いんですよね。

たかだか7文字やんけと思われるかもしれませんが開発しているプロダクトが大きくなるにつれてこの7文字の負債がどんどんと大きくなってストレスになります。

なのでこの場合は極力`pluck`を使う方が運用性が高まります

### じゃあselectは要らない子？

そうとも言えません。

なぜならpluckが指定できるキーの数は2つまでと決まっているからです。

（ここにLaravelのGithubからコードを引用）

今回のUsersテーブルの3つのカラムを使いたい場合は`select`を使うことになります。

```php
$names = User::select('name', 'id', 'email')->get();
// [
// 0 => [
// 'id' => 1,
// 'name' => 'Alice',
// 'email' => 'sample@example.com'
// ],
// 1 => ...
// 2 => ...
```

idと名前くらいなら `pluck` でOKになります。

コーディングスタイルや設計に合わせて使い分けましょう！

### 終わりに
`pluck`と `select`では結果が同じなのでselectのみを使用していましたが、記述量が減ることからpluckを愛用するようになりました。
稀に知らない関数に出会ったり知っている関数でも実は知らない機能があったりして開発が楽しくなることもありますよねぇ
新しいことを知ることで人生が豊かになります（締めで急に怪しい人になっちゃった
Vercelで組織内部向けブックスタイルのドキュメント

### ドキュメント文化を組織にインストール

リーガルテック会社であるMNTSQさんでは 社内ドキュメントをGitHub管理でメンテナンスしながら作り上げていくようにしていたらしいです。そこではGitbookでブックスタイルのウェブサイト化し、検索性などの問題を解決してますっていうのを、みました。Gitbookを利用しており、検索機能や目次、SSO認証等が完備されていますが、こちらは有料なのです。GitbookがCLIアプリじゃなくなった時点でフォークし、最新のnode.js環境下でもつかえるようにしたのが、Honkitです。こちらはOSSです。


### 組織内部向けドキュメントと言えば・・

GitHubなら、無料でプライベートリポジトリ作れるので、内部向けドキュメントを保管するのに好適な場所なのですよね。

組織のルールとかそういうドキュメントが閲覧できるようにしたいです。

しかし、GitWikiって検索性がショボいです。ブラウザエクステンションを導入すれば
検索能が上がるらしいですが、組織構成員にはそれすらメンドウに思う人がいそう。GitDiscussionsも検索性がショボいです。このようにGitHub上のUIはお世辞にも閲覧に適していません。検索機能は貧弱です。組織の人の中には、Google検索のような能力をあらゆる局面で期待する人もいますので、これが課題でした。

### おこないたいこと

組織内部のひとしか見られないウェブページをHonkitでつくりたいと思いました。Basic認証というのが簡単そうだとおもいました。たとえば、GitHub EnterpriseおよびGitBook契約すれば、解決すると思いますが、なるべく無料でおこないたいです。

### そんなときにVercelを知ることに...

無料のホスティングサービスを検索していたら、まずNetlifyにぶちあたりました。このサービスは、Honkitのドキュメンテーションが[保存](https://honkit.netlify.app/)されているので、少しだけなじみがありました。

Netlifyのばあい、Basic認証が有料枠だそうです。さらに検索をかけると、Cloudflare Workersとくみあわせて[認証をやらせる](https://www.serversus.work/topics/i707x1i9k8gufogyycpt/)というのも, しるにいたりました。それなら無料だとおもいます。さらに、Cloudflareにも無料ホスティングサービス枠があるようです。[CloudflarePages](https://www.to-r.net/media/cloudflare-pages-basic/)というそうです。これにより、Basic 認証も有効になります。これもおそらく無料です。

いろいろ検索していると、[Vercel](https://vercel.com)というホスティングサービスもやっているところが、Basic認証も無料でできるみたいな情報をえました。

たしか`Zenn.dev`の[ブログ](https://zenn.dev/awtnb/articles/6e77a44c568cf7)が認証のはりかたを教えてくれております。

### 手順

- Vercel にサインアップ 
- GitHub リポジトリに接続
- `Honkit` SSG で `html` ファイル (`docs` directory under Git repo.)を作成
- `zenn.dev` サイトから `middleware.js` をコピー
-  Vercel サイトで環境変数の設定 (`BASIC_AUTH_USER` and `BASIC_AUTH_PASSWORD`) を行いました
-  `middleware.js` を GitHub リポジトリの `docs` ディレクトリにアップロードしました。
-  deployしました！


### Refs.

`zenn.dev`サイトでBasic認証のしかたをおしえてくれた方に感謝します。ドキュメントライティングの本がさいきんに出て、未読なのですが、ぜひ読んでみたいです！

- https://zenn.dev/monicle/articles/vercel-plain-middleware-basic-auth
- https://zenn.dev/awtnb/articles/6e77a44c568cf7
- https://note.com/takahiroanno/n/ne7e510a06cb9
- https://www.amazon.co.jp/dp/B0BXSYF2N4/
- https://honkit.netlify.app/
- https://qiita.com/fehde/items/17a2bfff8f5a5767c600
- https://pages.github.com/
- https://dockteck.github.io/honkit/basis.html


### おまけ1：GitHubPagesについて復習

GitHubPagesっていうウェブサイトをつくる機能がございます。これだと、リポはプライベートだけど、サイトはパブリックとなってしまいます。リポにmdファイルをならべたてたうえで、HonKitもしくはGitBookなどで, `docs`ディレクトリのしたに、静的にサイト生成すれば、デプロイしてくれます。

たとえば、おかねをつめば、サイト側もプライベートにできます。GitHub Enterpriseをアレするおかねがありません。

### おまけ2：ウェブサイト側でIPアドレス制限を加える?

それだと、出社しているあいだしかアクセスできません。もちろんプロキシもしくはVPNをさせば、できるようになりますが、それもひとによってはメンドウかんじるので、できれば、避けたいです。

### おまけ3：mdソースだけ提供してそれ以降は各自のローカルでやってもらう？

`HonKit`のインストールや使い方をしらせることにより、各自のローカル環境で、`honkit serve`みたいにやってもらうってのが、手っ取り早いかな？`GitHub Private repo`のしたに、`SUMMARY.md`などをおいておいたうえで、`honkit serve`のやりかたをしるしておきます。そうすれば、ローカル環境でブックスタイルのUIが実現するから`http://localhost:4000`を参照するようにしてもらいます.
Stable Diffusion web UI ForgeをGoogle Colaboratoryで動かす

Qiitaに記事あるやろ！と思ったら意外となかったので書くことにしました。
Stable Diffusion web UI **Forge** をGoogle Colaboratoryで動かす方法です。(AUTOMATIC1111版ではなく)

AnythingXLも一緒にダウンロードしています。civitaiからダウンロードしているのでAPIKeyが必要です。
あとcivbrowserもインストールできるようにしました。

他は従来とそんなに変わりません。

# コード

```python
# --no-download-sd-modelを入れておくといいです
cmd_args = "--share --xformers --no-download-sd-model --theme dark"

# civitai APIkey は https://civitai.com/user/account から確認できます
civitai_api_key = "apikey" #@param {type:"string"}

# civbrowserを使う？
use_sd_webui_civbrowser = False #@param {type: "boolean"}

### -------

!echo "[ StableDiffusionをインストールします... ]"
!git clone https://github.com/lllyasviel/stable-diffusion-webui-forge.git
%cd /content/stable-diffusion-webui-forge

!echo "[ AnythingXLをダウンロードします... ]"
!wget -O /content/stable-diffusion-webui-forge/models/Stable-diffusion/anything_xl.safetensors  https://civitai.com/api/download/models/384264?token={civitai_api_key}

if use_sd_webui_civbrowser:
  !echo "[civitai blowserをダウンロードします... ]"
  !git clone https://github.com/SignalFlagZ/sd-webui-civbrowser.git /content/stable-diffusion-webui-forge/extensions/sd-webui-civbrowser

!echo "[ WebUIを実行します... ]"
!python launch.py {cmd_args}

```

# 参考
[safa-dayo/sd-webui-forge-google-colab-setup.sh](https://gist.github.com/safa-dayo/654e0f27f8b4260c974aa262c1e8f099)
Plotly-Dashを使ってトレードのバックテスト用ダッシュボードを作成してみた

# Trade Simulation Dashboard: CSVデータからトレード戦略を分析・可視化するWebアプリ

## はじめに

システムトレーダーや暗号資産トレーダー（botter）の方向けにCSVファイルからトレードデータを分析・可視化するためのダッシュボードアプリを今回作ってみました。
リポジトリはこちら：https://github.com/ammtjm/Trade_sim_DashBoard

[2024/3/27追記]pandasデータフレームを入力として扱えるようになりました！また、出力結果をエクセルファイルでテーブルとして保存できるようになりました。

本アプリは、トレード戦略の分析において、対象資産の価格、ポジションの保有・解消のタイミングとその時の数量を元に、シャープレシオ、リターン、ドローダウンなどの評価指標を計算し、これをインタラクティブかつ簡便に表示することを目的としています。

(matplotlibでリターンの折れ線グラフを描画するなどSNS上でよくみるあのグラフに物足りなさを感じていたので、よしやってみようと思っただけです。)

![イメージ画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489142/59bcbcd4-045a-7262-3afb-9e95ec4a6c54.png)
こういうの

## 作成したダッシュボード画面
今回作成したダッシュボードがこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489142/52adef20-30ba-1fe4-1ec0-6d8df532c31b.png)

ダッシュボードのイメージはGrafanaをネット検索して~~パクり~~オマージュしてみました。

## 主な機能

- インタラクティブな可視化とメトリクスの表示
- シンプルで一枚絵のダッシュボード
- トレード戦略のパフォーマンスと買い持ち戦略の比較

## 使用技術

- Python
- Dash
- Plotly
- Pandas

詳細はGithubを見ていただきたいのですが、それとは別に今回コーディングの大部分はClaude3を使って書いてみました。ちなみにGithubのREADMEも大部分を書いてもらいました。Claude3の書くアプリ説明だとなんか凄そうに見える不思議です。また、使っていてコードの正確性やユーザの意図を汲む能力などGPT4より優れていると体感しました。
## 改善の余地

今回初めてトレード用のダッシュボード作成に取り組んだこともあって、これにはまだまだ改善の余地があると認識しています。例えば、

- 取引手数料の実装
- 他の保存済み戦略との比較機能

といった具合に。

## フィードバックと貢献のお願い

上述したようなところですので、他の方々からのフィードバック、提案、批評を歓迎しています。コードベースの改善、パフォーマンスの最適化、新機能の追加などのアイデアがありましたら、ぜひご共有願えますと幸いです。

GitHubのIssue、プルリクエストをお待ちしております。
claude 3で貸借対照表PDFを表形式に変換してみた。

<h2>経緯</h2>
<a href="https://qiita.com/gentlable/items/334ca370b7f4392f519a">前回GPTsで貸借対照表PDFを表形式に変換してみた。</a>という決算書の内財務諸表PDFをAIに読み取らせ、データ化する記事を投稿した。
そこでは画像形式PDFには対応していなかったことや、一部形式が変わるとエラーで落ちる。表の形式は変わらないのに色付きになると急に精度が落ちるなどまだまだ改善が必要だった。
そこで最近噂のclaude 3で同じことをするとどうなるか試してみた。

<h2>結果</h2>
結論から言うと現時点のGPT4よりはるかに精度が良く上記問題点を解決した出力結果を得られた。
以下に解決した点とclaude3が勝っている点について記載する。
<br>
<h3>解決した点</h3>
<ul>
<li>画像形式を読み取れるようになった。</li>
GPT-4では日本語OCRができず、画像PDFは別途OCRサービスでデータ化してから構造化する予定だった。
しかしclaude 3では日本語OCRも可能になった。
正確にはPDFの画像形式は現状アップロードするとエラーになるので画像形式のPDFをPNGに変換し画像として添付したり、スクリーンショットをコピーしてctrl+Vで貼り付けしたりして読み取らせることができるようになった。
そしてそのまま必要な情報の加工、抽出を行える。
下に記載するが、テキストPDFだとPDFを丸ごとアップロードして必要なページのみ読み取ることができる。
画像形式PDFのOCR対応に期待。

<li>エラーで落ちることがなくなった。</li>
これまで50回くらい試しているが、GPTのようにPythonでエラーが起きてしまうようなことはなく、確実に出力をしてくれるようになった。
<li>精度が向上した。</li>
GPTでは読み取れなかった、もしくは読み取っても列や行がずれ込むといったことがほぼなくなった。
</ul>
<h3>改善点</h3>
<ul>
<li>プロンプトが格段に短くなった。</li>
GPTsではinstructionに情報を記載し、プロンプトも最適化したプロンプトでトークンの制限など書き方を考える必要があったが、とてもシンプルなプロンプトで期待の出力が得られるようになった
<li>テキストPDFの場合、ファイル丸ごとアップロードし、そこから目的の情報を抽出できるようになった。</li>
GPTsの場合、貸借対照表だと貸借対照表のページのみ切り取ってアップロードしないと安定性に欠けていた。
しかしclaude3では決算書PDFを丸ごとアップロードし、指定した書類を見分けて抽出を行えるようになった。
</ul>

<h2>まとめ</h2>

GPTsで1~2ヶ月ほど調整を行いながら開発をしていたが、その時間が一瞬で無に帰すレベルでAIの精度が向上していた。
GPT-5もおそらく同じレベルにまで到達するような気はするが、現状OCRの処理を行う場合は圧倒的にclaude3の方が有用であるといえる。
【WSL】Windows上のUbuntuでyt-dlpを動かす

# yt-dlpのインストール

```bash:WSL
cd /usr/local/bin

sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp

sudo chmod +x /usr/local/bin/yt-dlp

sudo chown -R username:username yt-dlp
```

```bash:動作確認
yt-dlp --version
```

# ffmpegとpycryptodomexを入れる
入れなきゃ激遅い場合があります（小声）

```bash:WSL
sudo apt update

sudo apt install ffmpeg

sudo apt install pip

pip install pycryptodomex
```


# 保存先の外付けHDD,SSDをマウントする

ディスクは/mnt/d/などで見れるようになるはず。
けど表示されなかったり、total 0と容量ゼロに見えてる場合、まだ認識されてない。

/mnt/hddなどディレクトリを作って、そこにマウント指定する事も可能だけれど……、勝手に解除されたりもする。

数時間放置してたら勝手に認識されたりもしたので、PC再起動したり、少し待てばWSL側からも外付けドライブを認識するのかも？

という雑記を書いた上で、一応マウント方法。
（参照：https://codeaid.jp/blog/wslmount/）

```bash
cd /mnt

sudo mkdir hdd

sudo mount -t drvfs d: /mnt/hdd
```


# yt-dlpの保存先を毎回指定したくないのでスクリプト化

```bash:/home/username/BASH_Scripts/yd.sh
#! /bin/bash
echo "URL : "
read URL

# Mount Problem
COMMAND="yt-dlp $URL -o /mnt/d/DATA/Movie/%\(upload_date\)s_%\(title\)s.%\(ext\)s"
# COMMAND="yt-dlp $URL -o /mnt/hdd/DATA/Movie/%\(upload_date\)s_%\(title\)s.%\(ext\)s"
echo $COMMAND

eval $COMMAND
```

ちなみにtitleで日本語名が認識されずエラーになってた気がするんですけど、2024年になっていつのまにか使えるようになってました。

`yt-dlp -U`でアップグレード出来るので、試してみて下さい。


# スクリプトの実行をコマンド登録

```bash:.bashrc
alias yd="/home/username/BASH_Scripts/yd.sh"
```

再ログインして完了です。

これで「yd」を叩くだけで動きます。

お疲れ様でした。



終わり
【KARTE】特定のcookieを保有しているユーザーにのみ接客サービスを配信する

# 前提
以下のような接客サービスを配信します。

* 訪問ユーザーがcookieAを保有している場合、接客サービスAを配信する。
* 訪問ユーザーがcookieAを保有していない場合、何も配信しない。

## １．スクリプト
```
// getCookie関数を呼び出す
// #{cookie_name}：key=value のkey
var cookie = getCookie('#{cookie_name}');

// ユーザーがcookieAを保有している場合
// #{cookieA}：key=value のvalue
if (cookie == "#{cookieA}") {
  if (typeof tracker !== 'undefined' && tracker) {
    // 保有している場合のイベント送信
    krt('send', '#{event_name}', {
      cookie_name: cookie
    });
  }

// ユーザーがcookieAを保有していない場合
}else{
  // 保有していない場合のイベント送信
  krt('send', '#{event_name}', {
    cookie_name: ""
  });
}

// cookieの保有有無を調べる関数
function getCookie(key) {
  if (!document.cookie) return null;
  var arr = document.cookie.split('; ');
  var c = arr.find(function(c) {
    return c.split('=')[0] === key;
  });
  if (!c) return null;
  return decodeURIComponent(c.split('=')[1]);
}
```
上記のスクリプトを、配信対象ページを訪れた全ユーザーに対して送信する。

## ２．本命の接客サービス
通常はセグメントに「配信対象ユーザー」を指定し、配信トリガーに「配信条件」を指定すると思います。
今回で言えば、前者が「cookieAを保有しているユーザー」で、後者が「ページXを閲覧している」となります。

しかし、今回の配信条件は単純に「ページXを閲覧している」ではなく「cookieAを持った状態でページXを閲覧している」です。

### 例
接客サービスは【配信トリガーに合致したタイミング】で【そのユーザーが該当するセグメント】によって配信判断がされます。

たとえば以下のような接客サービスがあったとします。
* 40秒以上ページに滞在したユーザーに接客サービスBを配信する。

これを次のように設定した場合、接客サービスは期待したタイミングで配信されません。
>セグメント：40秒以上ページに滞在している
>配信トリガー：対象ページを閲覧している

しかし、次のように設定を変更すると、期待したタイミングで接客サービスが配信されます。
>セグメント：対象ページを閲覧している
>配信トリガー：40秒ページに滞在している

上の場合は【対象ページを閲覧開始したタイミング】で【40秒以上ページに滞在している】必要があります。
閲覧開始＝0秒なので、ユーザーはこの条件を満たすことができません。

下にすると【40秒ページに滞在したタイミング】で【対象ページを閲覧中】であれば、40秒経過後もセグメントから外れていないので、接客サービスを配信できるようになります。

### まとめ
今回の場合は次のようになります。
>配信されない例
>セグメント：cookieAを持っている
>配信トリガー：対象ページを閲覧している
>※リロードはしない想定

>配信される例
>セグメント：対象ページを閲覧している
>配信トリガー：cookieAを持っている

このように設定することで、訪問ユーザーがcookieAを保有している場合に接客サービスAを配信することができます。

## 注意点
同一ページで以下のような接客サービスCを配信しているとします。
>セグメント：50代以上のユーザー
>配信トリガー：対象ページを閲覧している

訪問ユーザーがcookieAを保有している50代以上のユーザで、「接客サービスAの配信優先度が100」「接客サービスCの配信優先度が1」だったとします。

この場合、配信優先度を比較するとA＞Cではありますが、配信トリガーは「cookieAを持っている（というイベントが送信された）」よりも先に「対象ページを閲覧している」が発生します。
そのため、配信優先度に従ってA→Cの順に表示したい場合は、設定方法を工夫する必要があります。
Unity初心者が、TextMeshPro（TMP）とScroll Viewの利用に挑戦し挫折した話

自分の小説をスマホで読んでもらうとするとき、専用のリーダーを配布している大手サイトに登録して、その専用リーダーをダウンロードしてもらいそのアプリで読んでもらうことになる（最大手はAmazon-Kindle)。だが、それでは多くの他の人の作品に埋もれてしまう。また、専用のリーダーをわざわざダウンロードしようとする人は一部の特別な趣味を持つ人に限られる。
そこで、Unityに触り始めて１か月もたってないぼくが、Unityで自分の小説をアプリのようにスマホで配布できないか？と考え、その手始めとして、TextMeshPro（TMP）とScroll Viewの利用に挑戦したてみた。
だが、結局、挫折。それが今回の話だ。
（とはいえ、そもそも、自分の小説をアプリ化しても、多くの他のアプリに埋もれてしまうことにはかわりがないのだが）

Unityはゲーム開発に多くつかわれるためか、UIでもCanvasそのもの、あるいは自然にCanvasが作られる、Button,Toggle,Slider,Dropdown,Input Fieldの話は散見するが、Text（特に新しいTMP）やScroll Viewの話は，初心者むけのネットや本ではほとんどみかけない。
以下のぼくの話で、少しでも情報になりうるかもしれないことがあるとすれば、
① Unity 2022.3.21f1では、TMPは最初からインストールされている
②しかしあいかわらず、テキストの日本語入力のハードルは依然高い（初心者にとって）
の２点である。

やったことの、概略を以下に記していく。
（１）最初はスクロールバーなしで、TMPを使ってみる。
参照したのは、

https://vanikki.com/unity-textmeshpro/　

（現在は、この記事の頃とは違い、TMPは最初からインストールされている）

最初に、直接、「UI ⇒　TextMeshPro」を選ぶ。すると、もう、TMP Settingsファイルは、Assets/TextMeshPro/Resourcesフォルダにある。
細かいInspectorの設定は、上記サイトのとおり。

次に、日本語が表示できるようにする作業へ。
別途ダウンロードにて入手した「azuki]ttfファイルをAssetsフォルダにドラッグ＆ドロップ。
そして、「Window > TextMeshPro > Font Asset Creator」を開き、FontAsset作成(Text(TMP)内に自動的につくられる）。
最後に、最初に作成したCanvas直下の、Text(TMP)にもどり、「azukiSDF」をそのFontAssetに設定
だが、表示された日本語は、残念ながら下記のような網掛け状態に。

![TMP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/d0e15b06-bce0-71db-eb0c-4080ba630aae.jpeg)

（２）スクロールバーの中で、TMPをつかってみる
参照したのは

https://zenn.dev/kumatta_ss/articles/9d2ccdf0e432d4

直接「UI ⇒　TextMeshPro」ではなく、
１．まず「UI -> Scroll View」を押下。
　横は不要なので、「Scroll View」の「Scroll Rect -> Horizontal」のチェックを外す。「Scroll View -> Scrollbar Horizontal」を削除、等、サイトのように行う。
２．「Scroll View -> Viewport -> Content」に、
①TextMeshPro - Text (UI)
②Content Size Fitter
の二つのコンポーネントをContent上に追加
①すなわち、Contentオブジェクトを選択した状態で、Hierarchyビューで右クリックし、「UI」→「TextMeshPro - Text」を選択してTextMeshProオブジェクトを追加。
追加したTextMeshProオブジェクトを選択し、InspectorビューでTextMeshProコンポーネントのプロパティを編集。テキストの内容、フォント、サイズ、色などを設定（（１）と同じ作業）。
②Content Size Fitterについては「HierarchyビューのScrollViewのViewportの中にあるContentオブジェクトを選択⇒そのInspectorビューで下部にあるAdd Componentボタンをクリック　⇒　検索バーにContentSizeFitterと入力し、リストからContentSizeFitterを選択して追加⇒ContentSizeFitterコンポーネントの、Vertical FitをPreferred Sizeに設定し、Horizontal FitをPreferred Sizeに設定（サイトにかいてあるとおり）。
そして、次に表示できない日本語を表示させる手続きを、（１）と同じようにおこなう。

できたものは、やはり、日本語に網掛け（これは、ぼくにはお手上げ）。また、スクロールバーは、動かすと跳ね返ってきてしまった（これは、Inspectorの設定をみなおせばなんとかなりそう）。

![TMG2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676736/5208c810-14f0-acdb-de28-a4ddafe0eba7.jpeg)
　
今回は、ここまでで、一応終了とした。
アラートやメトリクスの整理をチームで継続的に行っている話

## これは何

「今の開発組織でトライしたこと・トライしていること・トライしようとしていること」の記事投稿キャンペーンに関する記事です。

https://qiita.com/official-events/06e1e6af790c81a75b7f

私達のチームでは、毎朝DatadogのDashboardを確認して、サービスに関する各種メトリクスや、アラート状態をチェックしています。

私がチームにJoinをしたときから、すでにDashboardやアラート設定は存在していたのですが、以下のような課題もありました。

1\. 定期的にアラートが発火するが、対応されていないものがある
2\. アラートが定期的に流れて来て、通知をすべて追いきるのが大変

このように、一度Dashboardやアラートを作成しても、定期的に見直していかないと活用するのが大変になってしまいます。
また、個人的には以下のような課題もありました。

3\. それぞれのメトリクスがどういう指標で表示されているか分かっていない
4\. アラートのしきい値の基準がどういう理由で決まっているかが分かっていない
5\. メトリクスが普段と違う動きをしたときに、何をすればいいのかが分からない

## チームとして取り組んでいること

このような課題に対して、(元々行っていたものもありますが) 以下のようなことを行っています。

1. Monitorの優先度(Priority)を決める
   - WarningやAlertになったものについて、どのくらいの温度感で対応するかなど
2. 通知が必要かどうかを見直す。問題がないときにはアラートが飛ばないようにする
3. 気になる動きをしたメトリクスについては、詳しく調べながら、メトリクスの見直しも行う

定期的にアラートの内容を確認し、議論をしながら、より効率的に運用できるように改善しています。
毎朝見ていても上記のような見直しをするとなると時間がかかってしまうので、毎週1回この見直しをする時間を意図的に確保するようにしました。

## 個人として取り組んでいること

個人としては、上記の「3」を特に力を入れています。
この際に特に気をつけていることとしては、「調べた内容をドキュメントに残すこと」と「アラート状態になったときの対応を検討すること」です。

### 調べた内容をドキュメントに残すこと

Dashboardの作成に関わっていないのもあり、1つ1つのメトリクスが指す定義をきちんと理解できていません。その状態だと、普段と違う動きをしたときに、どう対応すればいいのかが分からないということがよくあります。

そのため、定義を理解していないメトリクスについては、積極的に調べてドキュメントにまとめます。また、どういう手順で関連調査を行い、どういう対応をしたのかの過程も記録に残しています。これにより、次回同じアラートが起きた際にスムーズに対応できるようになります。

### アラート状態になったときの対応を検討すること

アラート設定を見直す際には、アラート状態になった際にはどのようなアクションを取るのかをセットで考える必要があると考えています。
ただしきい値だけ変更してアラートがならないようにするだけだと、アラート設定している意味がなくなってしまいます。

どう対応するかの部分については工数や優先度の兼ね合いもあり、この部分はまだやりきれいていない部分なので、次の課題だと考えています。

## まとめ

- チームとして、アラート設定について見直すタイミングを毎週意図的に作り、アラート通知に疲弊しないように改善をしている
- 各メトリクスについて理解度を深めて、どんな対応をすべきかを明確にしていくことで、アラートにスムーズに対応できるようにしている
AWS入門　IAM Identity Center

# 初めに
自分のAWSの勉強ノート。汚いです。

# 用語説明
- AWSアカウント
    - AWSのアカウントを作って最初に作成されるアカウント。rootユーザーのこと。なんでもできる。
- IAMユーザー
    - 特定の権限を与えられたユーザー。rootユーザーと比べてできることが制限されたもの。
- IAMグループ
    - IAMユーザーをグループ化したもの。
- IAMロール
    - 制限された権限。IAMユーザーや、IAMグループに付与できる。
- IAM Identity Center
    - AWSアカウントが複数ある場合に、IAMユーザー、IAMロールを管理するためのもの。

# IAM Identity Centerと各アカウント、ユーザーの関係

以下の図のようなイメージ？
アカウントにもrootアカウントと子アカウントがあり、ユーザーにもrootユーザーと子ユーザーがあるってことか。

IAM Identity Cneterを使えば、子ユーザーから子ユーザーへのスイッチが楽にできるって話ってことか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434767/3453dd7a-bd6b-64cd-e1da-8c6152b8f75c.png)

# IAM Identity Center以外の切り替え方法
- スイッチロールを使う




# 参考
- https://product.st.inc/entry/2022/12/23/102300
- https://awsjp.com/AWS/hikaku/AWSAccount-IAUser-IAMGroup-hikaku.html#google_vignette
Salesforce認定アドミニストレーター過去問+時々解説　Q41 ~ Q50

## Q41. レポート検索で使用できる項目の組み合わせはどれですか？

A 作成者とレポートのタイトル
B レポート名と説明
C レポートの種類と作成者
D レポートの種類と説明

<details><summary>解答</summary>
B
</details>

## Q42. ユーザー記録に保持され, ユーザーが変更できる情報はどれ？ 3つ選択せよ.

A デフォルトの商談チーム
B デフォルトの取引先チーム
C 保管スペース
D メールアドレス

<details><summary>解答</summary>
A, B, D
</details>

解説: 個人設定からメールアドレスの変更, デフォルトの商談チーム, デフォルトの取引先チームをユーザー自身が設定できる.

## Q43. 管理者は, 組織で行われた最近の設定変更を確認するためにどのツールを使用する必要がありあすか？

A 監査証跡の設定
B 重要な更新
C フィールド履歴追跡
D デバッグログ

<details><summary>解答</summary>
A
</details>

## Q44. ケースが削除されると, どの関連アイテムが削除されますか？ 2つ選択せよ.

A 行動
B 解決策
C 取引先
D ケースコメント

<details><summary>解答</summary>
A, D
</details>

解説: ケースコメントは, ケースに追加できるメモだから当然, ケースと共に消える. さらに, ケースに関連している行動もケースが削除されると自動的に削除される.

## Q45. リードを変換するにはどの権限が必要ですか？ 2つ選択せよ.

A リード、取引先、取引先責任者、商談の「転送」アクセス。
B リード、取引先、取引先責任者、商談の「作成」および「編集」アクセス権。
C 「リードの変換」プロファイル権限。
D 「リードのインポート」プロファイル権限。

<details><summary>解答</summary>
B, C
</details>

解説: リードの取引開始を実行すると, リードデータを取引先, 取引先責任者, 商談に変換するので, リード, 取引先, 取引先責任者, 商談の「作成」および「編集」アクセス権が必要になる. また, リードの取引を始めるためにも, 権限セットから「リードの取引の開始」権限にチェックを入れる必要がある.

## Q46. リストビューの作成時に利用できるものはどれですか？ 2つ選べ.

A リストビューはレコード所有者のプロフィールによってフィルタリングできます。
B リストビューはタグでフィルタリングできます。
C リストビューはレコード所有権によってフィルタリングできます。
D リストビューは、AND、OR、NOTフィルターを使用してフィルター処理できます。

<details><summary>解答</summary>
C, D
</details>

解説: リストビューは, テリトリーや取引先チームなどのレコード所有権によるフィルタリングと, 検索ロジックによる, AND, OR, NOT演算子を使用してフィルタリングすることができる.

## Q47. カスタムオブジェクトタブの作成について正しい説明を2つ選択してくだいさ.

A オブジェクトの選択は、既存のカスタムオブジェクトを選択するか、新規カスタムオブジェクトを作成して選択します。
B オブジェクトを表すアイコンを設定します。
C ページレイアウトの配色を設定します。
D Visualforceページを埋め込むことができます。

<details><summary>解答</summary>
A, B
</details>

解説: カスタムオブジェクトタブの作成時にタブスタイル(タブアイコン)を設定する. オブジェクトの選択は, 既存のカスタムオブジェクトを選択するか、「新規カスタムオブジェクトを作成します。」のリンクを押して新規カスタムオブジェクトを作成できる. また, Visualforceを埋め込めるのは, Visualforceタブとなる. 

## Q48. コミュニティエキスパートについて, 正しいのはどれ？

A コミュニティエキスパートは、Salesforceアイデアのために指定することができる。
B コミュニティエキスパートは、Salesforceのアイデアのカテゴリを管理できる。
C コミュニティエキスパートは、不適切なコミュニティコンテンツを削除することができる。
D コミュニティエキスパートは、アイコンによって指定されることができる。

<details><summary>解答</summary>
A, D
</details>

解説: Salesforceのアイデアを出してくれる人や, 人気のユーザーをコミュニティエキスパートとして設定できる. また, コミュニティエキスパートに選ばれたユーザーはユーザー名の横にアイコンが付与される.

-- コミュニティエキスパートの指定 --
https://help.salesforce.com/s/articleView?id=sf.ideas_community_experts.htm&type=5

## Q49. 信頼済みIP範囲について正しい説明はどれ？ 2つ選べ.

A ログインしたユーザーのIPアドレスが信頼済みIP範囲に追加されます。
B ログインユーザーのIPアドレスが範囲外の場合、ログインができなくなります。
C 開始IPアドレスと終了IPアドレスを登録します。
D 信頼済みIP範囲外からログインを行うと確認コードが求められます。

<details><summary>解答</summary>
C, D
</details>

解説: 信頼済みIP範囲外からログインを試みると, 確認コードを求める画面が表示されるので, Bのようにログインができなくなるわけではないことがわかる. また, 信頼済みIP範囲の使用は, 開始IPアドレスと終了IPアドレスを登録する必要があるので, Aのように追加されるものではない.

## Q50. 新しいケースを作成する取引先のカスタムクイックアクションがある. 管理者はSalesforceモバイルアプリでクイックアクションを利用できるようにするにはどうすれば良い？

A コンパクトケースページレイアウトを変更してアクションを含めます。
B アクションを使用してカスタムLightningアプリケーションを作成します。
C Salesforceモバイルおよび Lightning Experience アクションをページレイアウトに追加します。
D アクションをSalesforceモバイルナビゲーションメニューに含めます。

<details><summary>解答</summary>
C
</details>

解説: オブジェクトマネージャからオブジェクトを選択し, ページレイアウトの[SalesforceモバイルおよびLightning Experienceアクション]にカスタムクイックアクションを配置することで, Salesforceモバイルでクイックアクションが使えるようになる.

## Q51~Q60
https://qiita.com/taiga-shiokawa/items/f9a000b540e2104f0124
かっこいい英字のAAを生成してくれるサイト

# 概要

システム起動時のログにかっこいいAAを出力したい。
全く意味は無いけど。

# AAを生成してくれるサイト

https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20

『Test All』ボタン押すと全部のフォント見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8c6543e3-97b3-d030-2987-d999f31dcd59.png)
LombokのBuilderとValueを同時につけたらall args constructorはパッケージプライベートになる

タイトルの通り。

`@Value`付与したら`@AllArgsConstructor`も付いてくるのだが、`@Builder`も同時に付与すると、そちらで生成するパッケージプラベートなコンストラクターで上書きされてしまうらしい。


https://projectlombok.org/features/Value
```
Note that if both `@Builder` and `@Value` are on a class, 
the package private allargs constructor that `@Builder` 
wants to make 'wins' over the public one that `@Value` wants to make. 
```

---

どちらも付与した上でpublicなall args constructorが欲しい場合は、明示的に`AllArgsConstructor`をつけてやれば良い。


下記だとall args constructorはパッケージプライベートになる。

```java
@Value
@Builder
public class Dto {
```

下記はall args constructorはパブリックになる。

```java
@Value
@Builder
@AllArgsConstructor
public class OnlinePageImageDto {
```
【AtCoder】コンテストで使える数学の小テクニック(等差数列・期待値)

## はじめに

数学大好きなwhile-true-ifです。

今回はAtCoderでもたまに使うことがある数学のテクニックを紹介します。

## 対象者

- AtCoderやってる人
- 中学生
- 数学苦手な人

## 1.等差数列

### 説明

このような数列があるとします。

```
1 3 5 7 9
```

このとき、初項は1、末項は9、公差は2です。そして、項数は5です。

これは、1+3+5+7+9と計算してもいいですが、非効率です。

```math
(1 + 9) \times 5 \div 2
```

このような式で求められます。

ここで、「項数がわからねーよ」という方も多いのではないでしょうか。

ご安心ください。

そんなあなたのための公式がございます！

$n$を項数とするとき、

```math
1 + (n - 1) \times 2 = 9
```

$n$についてこの式を解いたら、5とでます。

### 一般化

初項を$a$、末項を$b$、公差を$d$、項数を$n$とするとき、

```math
a + (n - 1) \times d = b
```

が成り立ちます。

また、

```math
(a + b) \times n \div 2 = (総和)
```

も成り立ちます。

## 期待値

AtCoderの問題を解いているとき、期待値という数値はたまに見かけます。

AtCoderではサイコロがよくでます。

そのため、$1$から$d$までの目があるサイコロを振ったとき、出る目の期待値の公式を書きます。

```math
d \div 2 + 0.5 = (期待値)
```

ちなみにこのサイコロは1から$d$まで1ずつ数字が書かれているものです。

## おわりに

数学は楽しく偉大なものだと思ってます。みなさんも数学を楽しみましょう。

---

ぜひ、いいねとフォローをお願いします。

フォローされたらフォロー返しします。
HPE MSA 2062の仮想化基盤構築メモ

Last Update 2024-03-26
※この記事はあくまで筆者自身のメモ用であり、このメモを応用しもたらされた損害責任は一切負いかねます

## はじめに
ある機会でMSA 2062を触る機会があったので、その過程での気づきやノーハウを無駄にしない為に蓄積しておこうというつもりでこの記事を書いた。間違いやもっといい方法あればご教示いただけたら幸いです。

## 環境紹介

サーバー： HPE ProLiant DL380 Gen10 
ストレージ： HPE MSA 2062 (Firmware:  IN210R004)
仮想化環境： VMware vSphere 8.0(ESXi 8.0 U2 Build 22380479 + VMware vCenter Server 8.0 Update 2a)

## 実現したいこと
とある業務システムで、Linux上にDBサーバ立てており、DBの物理ファイルは別パーティションで、OSとは別ボリュームを割り当てること。

## 問題点
既知の通り、2023年9月25日にMSA 2062の新ファームウェア（IN210R004）がリリースされた（Ref. https://support.hpe.com/hpesc/public/docDisplay?docLocale=en_US&docId=dp00003424en_us )。これにより、インフラ管理者は、ボリュームのワークロードに応じて、ボリュームの「使用タイプ」を選択可能になりました。（章「Enhancements」を参照、"To better indicate the intended usage, a Usage Type field has been added to the characteristics of volumes."）

ふんわりのイメージで恐縮ですが、筆者の記憶ではMSA 2062は既に記憶装置としての仮想化を十分に強みとして生かしており、今回の「使用タイプ」の機能リリースはどういう方法で活用すればいいかピンと来なかった。その為、以下の資料を参照しました。

「2システムの概念 > ボリューム > ボリューム使用タイプ」を参照
https://support.hpe.com/hpesc/public/docDisplay?docId=a00128580ja_jp

こちらの資料を読むと、ボリュームの使用目的に応じた使用タイプの選択が可能になっています。そして選択可能な使用タイプを見ると、仮想化をはじめ、いくつかがあります。

さて、問題は、
ボリュームを作る際に、実際の用途に合わせて設定するか？それとも結局データストア経由でアクセスしているので一律的に「仮想化」をワークロードとして設定するか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188534/1ecf8947-716d-5e95-9fce-0f05ce03a946.png)

## アプローチ
筆者の場合は、一旦、すべて実際の用途に応じて作成するという方向で実施したいと考えており、またその設定後の様子も見守りたいと考えています。続報あったらまた記事にしたいと思います。

続報（2024-03-26更新）

HPEの公式フォーラムに同じ質問を投下しました。すると、the usage of the datastores on the ESXi host are not needed.（ESXiホスト上にあるデータストアでの使用タイプの選択は不必要です）"との返答が来て、これで問題解決になりました。

https://community.hpe.com/t5/msa-storage/for-volumes-using-for-vmware-datastore-which-usage-type-would-be/m-p/7210267#M17282

## 結論
一旦の結論としましては、仮想化環境のデータストアとして利用するボリュームは、一律的に「仮想化」をワークロードとして設定する。
JavaScriptを使ってアイコンをドラッグ&ドロップで変更する

# はじめに
NextとかNuxtで実装すれば簡単に作成ができそうですが、

今回はHTMLとJavaScriptで作成されたサービスでの利用を想定しているため、JavaScriptで頑張って作りました。


※使用する際は自己責任でお願いします

# 作ったもの

### アイコンをドラッグ&ドロップで変更する

１．アイコンを用意

![スクリーンショット 2024-03-22 12.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877917/96a176be-e427-3320-630c-097864841086.png)

２．アイコンをドラッグ

![スクリーンショット 2024-03-22 12.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877917/27a9aa70-4ad4-6cb2-eed0-28226b981f73.png)

３．アイコンをドロップ

![スクリーンショット 2024-03-22 12.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877917/133e9f41-6ff0-6073-3f7a-d6c16f6da64c.png)


### アイコンをクリックして変更する

１．アイコンを用意

![スクリーンショット 2024-03-22 12.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877917/96a176be-e427-3320-630c-097864841086.png)

２．アイコンをクリックする

![スクリーンショット 2024-03-22 12.27.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877917/be9e5b5f-35da-2776-fffb-2c6785ccb802.png)

３．アイコンを選択する

![スクリーンショット 2024-03-22 12.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877917/b47e88f9-524b-08e2-43f5-cfd2a7effd4d.png)

４．アイコンが切り替わる

![スクリーンショット 2024-03-22 12.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877917/5b65c164-eca7-58d9-4a03-5f012cf87b02.png)



# サンプル

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="eYovMrd" data-user="aizunoinu" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/aizunoinu/pen/eYovMrd">
  Untitled</a> by Junya Sato (<a href="https://codepen.io/aizunoinu">@aizunoinu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# まとめ

Webサイトでよく見るあのアイコンを変更する動き。

JavaScriptでもなんとか再現できました。

アイコン上に画像をドラッグ&ドロップしてもアイコンが切り替わるし、

アイコンをクリックしても画像を選択できます
ボトムナビゲーションを保持したら全画面表示したいときに方法がわからなかった

## 自分メモ

### X（旧Twitter）やInstagramみたいにページ遷移後もボトムナビを表示した
[こちら](https://qiita.com/0maru/items/8e81ed5f0ddd5bae9658)を参考にアプリを作っていた。

### ボトムナビを非表示にするときは？
下記でいけた。

```dart
Navigator.of(context, rootNavigator: true).push(
    MaterialPageRoute<void>(
      builder: (context) => const HogeView(),
    ),
);
```

Navigator周りちゃんと理解できていないなぁと気づき。
【BizRobo!】Kappletで実行したロボットの実行ログ確認方法

## はじめに
RPAツール「BizRobo!」には、作成したロボットを運用・管理するツールである **Management Console(MC)** というものが存在します。

MCでロボット実行をする際に、 ユーザー側から**Kapplets**でロボットを実行してもらう方法を採る事もあるかと思います。

今回はKappletsでロボットを実行した際に、MCではどのようにログを確認するのか、という事について記載します。

## 確認方法
１．MCを開く
２．「ログ」をクリック
![MC画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976872/953cbd88-52f5-616a-f0bb-ffaf5a3b0651.png)

３．「ロボット実行」をクリック
![MC画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976872/e51c17fc-b7e6-3224-392d-92de4e5c20af.png)

上記手順で、Kappletsから実行されたロボットの実行結果も確認する事が出来ます。
LT会 3/21

先日、セキュリティ委員会のセキュリティクイズイベントに参加してきました。
そこで得た知見や感想を共有します。

## イベントの内容
- 情報セキュリティに関連する知識を問う問題
- 実際の不審メールのどこが怪しいかをチームで話し合って回答する問題
#### 1. 感染したパソコンのデータをロックし、元に戻すことと引き換えに「身代金」を要求するようなウイルスを何というか？

　A. トロイの木馬
　B. ランサムウェア
　C. サプライチェーン攻撃
　D. スパイウェア


#### 2. 日本で最も使用されているパスワード(6桁以上)は次のうちどれか？

　A. password
　B. sakura
　C. 123456
　D. doraemon

#### 3. 以下の不審メールの怪しい箇所を3つ以上見つけよ

> 送信者：xxxx-info@securebanking.com
> 件名:【重要】クレジットカード不正取引に関するお知らせ 
> 本文：
> 尊敬するお客様へ
> 
> ○○銀行からの重要なお知らせです。
> 
> 当行のシステムにより、お客様のクレジットカードにおいて不審な取引が確認されました。これはお客様のセキュリティを考慮し、速やかに対処する必要があります。
> 
> 不正取引の可能性があるため、以下の手順に従って、お客様のアカウント情報を再確認していただきますようお願い申し上げます。
> 
> 【手順】
> 1. 以下のリンクをクリックして、アカウント情報の再確認を行ってください。
> [リンクを記載]
> 
> 2. リンク先ページにて、お客様の名前、アカウント番号、セキュリティコードを入力してください。
> 
> 3. 入力が完了しましたら、送信してください。当行のセキュリティチームが情報を確認いたします。
> 
> 4. 確認が完了しましたら、改めてお客様にご連絡差し上げます。
> 
> お客様のご協力に感謝いたします。セキュリティに関するご質問がございましたら、お気軽にお問い合わせください。
> 
> ○○銀行


## 現在主流のサイバー犯罪の手口
#### 1. 偽サイトによるフィッシング詐欺（個人）
ECサイト、銀行・カード会社、携帯電話のキャリアを装い、緊急性の高い内容をURLとともに電子メールやSMSに送信し、偽サイトへ誘導。
リンク先も本来のWebサイトと全く同じ外観で、そのままログインしてしまうとユーザ情報、個人情報、カード情報が不正に抜き取られる。

#### 2. ランサムウェアによる身代金要求（組織）
感染経路は主にリモート環境の脆弱性、メールの添付ファイルなどがあげられる。
たとえ身代金を払ったとしても、データやシステムへのアクセスが回復するかはわからない。

## 日々巧妙化、高度化するサイバー犯罪
数年前までは不審メールが届いても、違和感のある日本語やURLのドメインなどから簡単に見分けがついた。

昨今ではAIの文章生成も巧みに利用され、文章の違和感による判別もむずかしくなっており、HTML形式の電子メールの普及によって、URLを意識させないようにもなってきている。

組織の場合、1人のPCがウィルスに感染することで、組織全体への被害につながる。
自社PCの感染によって、被害がお客様へと拡大する可能性もあるということに注意する
一人ひとりのセキュリティ意識を高める必要がある。


## 問題の答え
#### 1. 答え：B
A. トロイの木馬
> 無害なプログラムを装ってパソコンに侵入し、さまざまな攻撃をするマルウェアの一種
> 配信元が不明なフリーソフトなどに多く見られる

B. ランサムウェア
> ファイルを暗号化することで利用不可能な状態にした上で、そのファイルを元に戻すことと引き換えに金銭（身代金）を要求するマルウェア

C. サプライチェーン攻撃
> 標的となる企業の関連会社や取引先企業などのセキュリティが脆弱な組織を初めに攻撃し、それを足掛かりに標的企業を攻撃する方法
> または、IT/IoT機器やソフトウェアなどの製造過程において悪意のあるプログラムなどを混入させる方法

D. スパイウェア
> コンピューターに不正に侵入し、ユーザーの個人情報や行動を監視し、ユーザーに気づかれないうちに外部に情報を送信するプログラム

#### 2. 答え：C
A. password  第2位(世界では第1位)
B. sakura  第8位
C. 123456  第1位
D. 1qaz2wsx  第4位

※2022年2月時点

#### 3. 答え
- 緊急性が高く、不安をあおる内容
- 調べても出てこない送信元メールアドレス
- 本文にユーザーを識別する記載がない
- アカウント情報の入力へ誘導
など
※掲載した不審メールはChatGPTに作ってもらいました
電子工作メモ - ADコンバータ

# ADコンバータ

- ポテンショメータ: 半固定抵抗
- ADC(analog digital converter)
  計測したアナログ信号をデジタル信号に変換する
  2つのキーポイント
  - 分解能(resolution)
  - チャンネル(channel)

- RaspberyPi の分解能
  - 12ビット($2^{12} = 4096 $)の分解能がある
    ex) 3.3Vの範囲の電圧の場合、3.3 / 4096 = 0.8mV 単位で分割される
  - しかし、MicroPythonの内部的なプロセスが16ビット($ 2^{16} = 65536 $)の分解能のため、0 - 65535 に分割される
    ex) 3.3Vの範囲の電圧の場合、3.3 / 65536 = 0.05mV 単位で分割される

    $ADCの値 = \frac{V}{3.3} \cdot 65536 $

## ピン

- ポテンショメータ
  - 1: 3V3
  - 2: GND
  - 3: GP26 

    ```python:09.1_AnalogRead
    from machine import ADC, Pin
    import time

    adc = ADC(26)
    try:
        while True:
            adcValue = adc.read_u16()
            voltage = adcValue / 65535.0 * 3.3
            print(f"ADC Value: {adcValue} Voltage: {voltage}V")
            time.sleep(0.1)
    except:
        pass
    ```

# ポテンショメータとLED

## ピン

- ポテンショメータ
  - 1: 3V3
  - 2: GND
  - 3: GP26

- LED
  - アノード: 220Ω + GP15
  - カソード: GND

    ```python:10.1_Soft_LED
    from machine import ADC, Pin, PWM
    import time

    adc = ADC(26)
    pwm = PWM(Pin(15))
    pwm.freq(1000)

    try:
        while True:
            adcValue = adc.read_u16()
            pwm.duty_16(adcValue)
            time.sleep(0.1)
    except:
        pwm.deinit()
    ```

# Soft Colorful Light

## ピン

- ポテンショメータ１
  - 1: 3V3
  - 2: GND
  - 3: GP26
- ポテンショメータ２
  - 1: 3V3
  - 2: GND
  - 3: GP27
- ポテンショメータ３
  - 1: 3V3
  - 2: GND
  - 3: GP28

- RGBLED
  - R: 220Ω + GP15
  - G: 220Ω + GP14
  - B: 220Ω + GP13
  - アノードコモン: 3V3

  ```python:10.2_Soft_Colorful_Light
  from machine import ADC, Pin, PWM
  import time

  adc_list = [ADC(26), ADC(27), ADC(28)]

  pwm_list = [PWM(Pin(gpno)) for gpno in [13, 14, 15]]
  [pwm.freq(1000) for pwm in pwm_list]
      
  try:
      while True:
          for adc, pwm in zip(adc_list, pwm_list):
              pwm.duty_u16(65535 - adc.read_u16())
          time.sleep(0.1)
  except:
      for pwm in pwm_list:
          pwm.deinit()
  ```

# Sofr Rainbow Light

## ピン

- ポテンショメータ
  - 1: 3V3
  - 2: GND
  - 3: GP26

- NeoPixel
  - VCC: 3V3
  - GND: GND
  - IN : GP15
  - OUT: N/A

    ```python:10.3_Soft_Rainbow_Light
    from machine import Pin, ADC
    from neopixel import myNeopixel
    import time

    red   = 0
    green = 0
    belu  = 0
    np = myNeopixel(8, 15)
    adc0 = ADC(26)

    # 255を2色で分ける
    def wheel(pos):
        global red, green, blue
        WheelPos = pos % 255

        # 3分割しているので1/3の値を求める
        one_third = (WheelPos % 85)
        big   = one_third * 3
        small = 255 - big

        # 赤<=>緑
        if WheelPos < 85:
            red   = small
            green = big
            blue  = 0
        # 緑<=>青
        elif 85 <= WheelPos < 170:
            red   = 0
            green = small
            blue  = big
        # 青<=>赤
        else :
            red   = big
            green = 0
            blue  = small

    np.brightness(20)
    while True:
        adcValue = adc0.read_u16() // 257
        for j in range(0, 8):
            wheel(adcValue + j*255 // 8)
            np.set_pixel(j, red, green, blue)
            np.show()
        time.sleep_ms(100)
    ```
エッセンシャルコンタクトで重要なお知らせの通知先をカスタマイズしよう

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki)です。

Google Cloud から「価格改定」「プロダクトの更新情報」「セキュリティ」などの重要なお知らせが通知されるケースがありますが、この通知の連絡先はどのように管理できるかご存じでしょうか？

Google Cloud では**エッセンシャルコンタクト**を使用してこの通知を受け取るユーザーをカスタマイズできます。

:::note warn
本記事は2024年3月ごろに作成しております。引用している内容は執筆時点での最新となります。
:::

## エッセンシャルコンタクトとは

先にふれたとおり、エッセンシャルコンタクトは Google Cloud からの通知をカスタマイズできる仕組みです。日本語のドキュメントでは「重要な連絡先」と表記されている場合があります。

各カテゴリごとに通知先となる連絡先（メールアドレス）を設定できます。

メニュー的には [IAM と管理] の下にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/429d4eab-8a73-2fc6-f314-267510f9da61.png)

### 連絡先が設定されていない場合、IAM ロールに基づきフォールバックの連絡先に通知される

エッセンシャルコンタクトで連絡先が設定されていない場合、通知はカテゴリごとの IAM ロールに基づいて通知されます。

> カテゴリに連絡先を追加しない場合、そのカテゴリの通知はメンバーの IAM ロールに基づいて選択されるフォールバックの連絡先に送信されます。

（公式ドキュメントから引用）

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/03145122-8440-e154-5780-21e81a21c213.png)

（公式ドキュメントより抜粋）

たとえば「プロダクトの更新情報」に該当する通知では、連絡先が設定されていない場合`プロジェクト所有者（roles/owner）`に送信されます。

https://cloud.google.com/resource-manager/docs/managing-notification-contacts?hl=ja#notification-categories

### 通知のカテゴリごとに連絡先を設定できる

エッセンシャルコンタクトを使用すると IAM ロールと切り離して通知を受け取ることができます。

Google Cloud では基本ロールは使わずに事前定義ロールやカスタムロールの使用が推奨されています。
この場合、`プロジェクト所有者（roles/owner）`は管理者に相当する方にだけ割り当てられているケースが多そうです。

IAM ロールと通知が紐づいていると便利な面はあるものの、所定のロールを付与しないと通知を受け取れません。

エッセンシャルコンタクトを使用すると IAM ロールに依存せずカテゴリごとに連絡先を設定できます。

**設定イメージ**
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/d35038ea-796d-acbc-bad9-d9eebb96f166.png)

### 連絡先は継承される

IAM と同様に連絡先にも継承の概念があります。
組織やフォルダレベルで設定した連絡先は下位のフォルダ / プロジェクトに継承されます。
下位のプロジェクトで発生した通知は継承された連絡先に通知されます。

### 継承された連絡先がある場合、フォールバックの連絡先に通知されない

個人的に一番のポイントです。

前のセクションで連絡先が設定されていない場合フォールバックの連絡先に通知されると説明しました。これは継承された連絡先も含め設定されていない場合にのみ、フォールバックの連絡先に通知されます。

言い換えると**継承した連絡先がある場合、フォールバックの連絡先は使用されません**。
（2024/3/1 サポート確認時点）

ですので組織や上位のフォルダレベルでのみカテゴリの連絡先を追加すると、プロジェクトの担当者視点では通知を受け取れなくなるケース（継承された連絡先にプロジェクトの担当者を含んでいない場合など）が起こりえます。
この点は注意が必要です。

**イメージ**
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/af581fff-52f9-9a2e-3ca2-c71adce14c28.png)

## まとめ

エッセンシャルコンタクトを使用すると Google Cloud からの通知先を IAM ロールと切り離してカスタマイズできるのがメリットです。
推奨にしたがって事前定義ロールやカスタムロールで運用している方はエッセンシャルコンタクトを利用してみてはいかがでしょうか。

個人的にはメンテナンス通知もエッセンシャルコンタクトに統合されるといいなーと思っています。

## 補足

一部の通知はエッセンシャルコンタクトを使用せず、特定の IAM ロールに通知されます。
現状ではすべての通知がカバーされているわけではない点にはご留意ください。

![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/982e2661-e35d-c013-ec36-f4b29e9d3951.png)
[PowerShell]PowerShellの実行ポリシーまとめ

# PowerShellの実行ポリシーについて

PowerShellの実行ポリシーは、スクリプトの実行を管理するための重要な機能です！
実行ポリシーを設定することで、システムやユーザーがどのようなスクリプトを実行できるかを制御できます。
以下では、実行ポリシーの種類、現在のポリシーの確認方法、そしてポリシーを変更する方法について解説していきます！

## 実行ポリシーの種類

PowerShellには、次のような実行ポリシーの種類があります。

1. **Restricted（制限）**: スクリプトの実行が許可されません。デフォルトの設定では、このポリシーが適用されています
2. **AllSigned（全て署名済み）**: スクリプトは、信頼された発行元によって署名されている必要があります。そうでない場合、スクリプトの実行はブロックされます。
3. **RemoteSigned（リモート署名済み）**: ローカルで作成されたスクリプトは制限されますが、インターネットなどのリモートからダウンロードしたスクリプトは署名済みであれば実行できます。
4. **Unrestricted（制限なし）**: このポリシーでは、スクリプトの実行に関するすべての制限が解除されます。安全ではないため、注意が必要です！

## 現在のポリシーの確認方法

現在のPowerShell実行ポリシーを確認するには、次のコマンドを使用します。

```powershell
Get-ExecutionPolicy
```

このコマンドを実行すると、現在の実行ポリシーが表示されます！

## ポリシー変更方法

PowerShellの実行ポリシーを変更するには、管理者権限でPowerShellを開き、次のコマンドを使用します！
```powershell
Set-ExecutionPolicy <ポリシー名>
```

## まとめ

今回は、実行ポリシーの種類、現在のポリシーの確認方法、そしてポリシーを変更する方法について紹介しました！
今回の記事を参考に、ポリシーを変更する際には、セキュリティに注意して、適切なポリシーを選択するようにしてください！
Javaアプリケーションのバージョン間移行の診断（Migration Toolkit for Application Binaries）

## はじめに
現場でIBM社のWebSphere Application Server（以下WASと略する）とJavaで作られたアプリケーションのバージョン間移行を行う。
バージョンアップによる影響を診断するためのツールを導入し、影響調査に利用した。

## Migration Toolkit for Application Binariesとは
WASやJavaのバージョン間移行やマイグレーションを診断するツール。
jarファイルをコマンドで実行し利用する。
診断対象としてJavaアプリケーションのwarまたはearファイルが必要。

warファイルの作成方法は以下参照。Eclipseでのビルドを想定。
[warファイル作成（ビルド）](https://rainbow-engine.com/war-howto-create/)

Migration Toolkit for Application Binariesは以下のリンクからダウンロードできる。
[ツールのダウンロード](https://www.ibm.com/support/pages/node/6250961#asset/tools-Migration_Toolkit_for_Application_Binaries)



## インストール
binaryAppScannerInstaller.jarをダウンロードする。
jarファイルを配置したディレクトリに移動し、以下のコマンドを実行しインストールする。
```:コマンド
> java -jar binaryAppScannerInstaller.jar
```

インストールが完了するとwamtフォルダが作成され、ツール本体であるbinaryAppScanner.jarが配置される。

## 診断
wamtフォルダに移動し以下のコマンドでJavaアプリケーションを診断する。
[Javaアプリケーション.war] の部分は診断対象のwarまたはearに読み替える。
```:コマンド
> java -jar binaryAppScanner.jar [Javaアプリケーション.war] 
```

binaryAppScanner.jar実行時に様々なオプションを設定できる。
オプションの詳細は以下のコマンドで確認できる。
```:コマンド
> java -jar binaryAppScanner.jar --help --all
```

以下のように、バージョンアップ前後のバージョンを指定し、診断することが可能。
```:コマンド
> java -jar binaryAppScanner.jar [Javaアプリケーション.war]  --sourceJava=ibm6 --sourceAppServer=was855 --targetJava=ibm8 --targetAppServer=was90
```


診断結果をテキストまたはブラウザで閲覧できる。

## 診断結果
[IBM公式](https://www.ibm.com/docs/ja/wamt?topic=migration-toolkit-application-binaries)
各種言語でWindows APIを使ってみた

# PowerShell

```msgbox.ps1
# powershell -ExecutionPolicy RemoteSigned ./msgbox.ps1

$Signature = @"
[DllImport("user32")]
public static extern int MessageBox(
	IntPtr hWnd, string lpText, string lpCaption, uint uType);
"@

$addTypeSplat = @{
	MemberDefinition = $Signature
	Name = "hoge"
	PassThru = $true
}
$user32 = Add-Type @addTypeSplat

[void]$user32::MessageBox(0, "hello, world", "PowerShell", 0)
```

```msgbox2.ps1
# powershell -ExecutionPolicy RemoteSigned .\msgbox2.ps1

$Signature = @'
[DllImport("user32")]
public static extern int MessageBox(
	IntPtr hWnd, string lpText, string lpCaption, uint uType);
'@
Add-Type -MemberDefinition $Signature -Name bar -Namespace foo

[void][foo.bar]::MessageBox(0, "hello, world", "PowerShell", 0)
```

# .NET Framework

```dev.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
prompt $e[33m$p$g$e[m
cmd
```

## C#

```msgbox.cs
// csc msgbox.cs
using System;
using System.Runtime.InteropServices;

class Program {
	[DllImport("user32")]
	static extern int MessageBox(
		IntPtr hWnd,
		string lpText,
		string lpCaption,
		uint uType);
  
	static void Main() {
		MessageBox(IntPtr.Zero, "hello, world", "C#", 0);
	}
}
```

## Visual Basic

```msgbox.vb
' vbc msgbox.vb

Module Program
	Declare Auto Function MessageBox Lib "user32" (
		ByVal hWnd As Integer,
		ByVal lpText As String,
		ByVal lpCaption As String,
		ByVal uType As Integer) As Integer

	Sub Main
		MessageBox(0, "hello, world", "VB.NET", 0)
	End Sub
End Module
```

# Visual Studio
## C++

```msgbox.c
// cl /MD /W4 msgbox.c
#pragma comment(lib, "user32")

#include <windows.h>

int main(void)
{
	MessageBoxW(NULL, L"hello, world", L"VC++", MB_OK);
}
```

## MASM

```dev64a.bat
@echo off
set vcdir=C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519
path %path%;%vcdir%\bin\Hostx64\x64
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64
prompt $e[33m$p$g$e[m
cmd
```

```msbbox.asm
comment *
ml64 /c /Fl msgbox.asm
link /subsystem:console /entry:start msgbox
*
includelib kernel32
includelib user32

extrn	ExitProcess:proc
extrn	MessageBoxA:proc

.const
$capt	db	'MASM (x64)', 0
$text	db	'hello, world', 0

.code
start proc
	sub	rsp, 40
	xor	r9d, r9d
	lea	r8, offset $capt
	lea	rdx, offset $text
	xor	ecx, ecx
	call	MessageBoxA
	mov	ecx, 42
	call	ExitProcess
;	add	rsp, 40
start endp
end
```

# LibreOffice Basic
LibreOffice 7.6 (x86_64)ではハンドルやアドレスは使えない模様。

```
Declare PtrSafe Function Beep Lib "kernel32" ( _
	ByVal dwFreq As Integer, _
	ByVal dwDuration As Integer) As Integer

Sub Main
	Beep 440, 800
End Sub
```

# Python

LibreOfficeをインストールすると付属するPythonを使用。

```dev.bat
@echo off
path C:\Program Files\LibreOffice\program;%path%
prompt $e[33m$p$g$e[m
cmd
```

```msgbox.py
# python msgbox.py
import ctypes

user32 = ctypes.windll.user32
user32.MessageBoxW(None, "hello, world", "Python", 0)
```
ピポットテーブルの小計を非表示にする方法

```vb
Sub PivotTableRemoveSubtotals()
    Dim pt As PivotTable
    Dim pf As PivotField

    'ピボットテーブルの設定
    Set pt = ThisWorkbook.Sheets("シート名").PivotTables("ピボットテーブル名")
    
    '小計を非表示にしたいフィールドの設定
    Set pf = pt.PivotFields("フィールド名")
    
    '小計を非表示にする
    pf.Subtotals(1) = False
    
    'すべての小計オプションを非表示にする場合、次のように設定
    Dim i As Integer
    For i = 1 To 12
        pf.Subtotals(i) = False
    Next i
End Sub
```