✍️blog

技術系のこととか

Keycloakをリバースプロキシ環境へデプロイ

いつの時代も入り口は1つでサービスは複数という構成はあるもので、
Keycloakをリバースプロキシの後ろへ配置することがあったのでメモ。

www.keycloak.org

TL;DR

公式ドキュメントが一番w

www.keycloak.org

環境

今回はDockerでリバプロ+Keycloakを用意します。

  • Keycloak
    • イメージ:quay.io/keycloak/keycloak:20.0.3
  • nginx(リバースプロキシ)
    • イメージ:nginx:1.23.3

nginxの準備

リバースプロキシとして動作するようにnginxの設定を用意します。

events {
    worker_connections  120;
}
http {
    server {
        listen 80;

        location /keycloak {
            proxy_set_header  Host              $http_host;
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;
            proxy_set_header  X-Forwarded-port  $server_port;
            proxy_pass http://keycloak:8080/keycloak;
            proxy_redirect off;
      
        }
    }
}

/keycloakに来たリクエストをhttp://keycloak:8080/keycloakに流します。
流すと同時にX-Forwarded-*ヘッダーを付加します。
このヘッダーがあることでKeycloak側でもリバースプロキシの裏にいるんだなと認識してくれます。
大抵のリバースプロキシではこのヘッダーを付与してくれるはずw
(Forwardedヘッダの方が標準的なんでしょうけど。)

docker-compose.ymlの設定

version: "3"

services:
  keycloak:
    image: quay.io/keycloak/keycloak:20.0.3
    container_name: keycloak_app
    environment:
      KEYCLOAK_ADMIN: "admin"
      KEYCLOAK_ADMIN_PASSWORD: "password"
      KC_PROXY: "edge"
      KC_HTTP_RELATIVE_PATH: "keycloak"
    command: start-dev

  nginx:
    image: nginx:1.23.3
    container_name: keycloak_proxy
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80

nginxは先ほどの設定を読み込ませているだけです。

Keycloakの設定は実行時引数や設定ファイルでも可能ですが、今回は環境変数で設定を行っています。

ポイントは KC_PROXYKC_HTTP_RELATIVE_PATHの設定です。

KC_PROXYはKeycloakがリーバスプロキシの裏にいることを設定し、その際の動作モードを設定します。
設定値は以下のようなものがあります。

設定値 用途
none (デフォルト) リバースプロキシを使わない
edge リバースプロキシとの間の通信をHTTPで行う場合。リバースプロキシでTLSを終端してる時など。
reencrypt リバースプロキシとの間の通信をHTTPSで行う場合。
passthrough リバースプロキシがクライアントと行う通信と同じ方式で通信を行う。

私が、試した環境ではリバースプロキシ側でTLSを終端していたのでedgeを使用しています。
(上記のnginxにはHTTPSの設定は入ってないですけど...)

KC_HTTP_RELATIVE_PATHはkeycloakのコンテキストパスを指定するために使用します。

この設定で「http://localhost/keycloak」にアクセスするとkeycloakが表示されます。

www.keycloak.org


私が実際にKeycloakを載せようとしていたのは、AWS CloudFrontの後ろなんですが、
keycloakの動作確認を手軽にローカルでやれるようにコンテナでそれらしい環境を用意して試しました。
こういう時にコンテナは便利ですよね。(今更だろという話ですがw)

via GIPHY

PythonでExcelを読んでXMLを吐きたい

テスト管理を行うツールにTestLinkというものがあります。

testlink.org

このツールに関する説明は他のサイトにお任せするとして、
TestLinkにテストを登録するには、手動で1件ずつ手作業で入力していくか、 XML形式のものをインポートするかいずれかの方法を使用します。

Excel(所謂テスト仕様書)からXMLに変換するツールは探せば割と出てくるのですが、
たいていマクロ付きのExcelです。

別にいいんですが、マクロ付きのExcelってメンテナンス性微妙だと思うんですよね。。。

ということで、Pythonで変換するツールを作成する中で知った内容をまとめます。

Excelの読み込みには「openpyxl(3.0.10) 」を使用しています。

openpyxl.readthedocs.io

Excelファイルの読み込み

openpyxl.load_workbook("path/to/excel_file", data_only=True, read_only=True)

data_only: Trueにするとセル内の式の結果を読み込み。Falseだと式そのものを読み込み となります。
read_only: 読み取り専用ですね。

他にもオプションがありましたけど、使ったのはこれぐらいですね。

すべてのシートの取得

book.worksheets

すべてのシートがリストで取得できます。

シートの属性取得

sheet = book.worksheets[0] 

print(f'シート名:{sheet.title}')
print(f'シートの最大行数:{sheet.max_row}')
print(f'シートの最大列数:{sheet.max_column}')

if sheet.sheet_state != 'visible':
    print('隠しシートだね')

シート名や最大行数、列数などが取得できます。
なお最大行数はExcelとしての最大行数ではなく、そのシートの一番端の値があるセル行番号です。
また、非表示のシートも取得できます。

セルの値の取得

row = 1
col = 10

sheet[row][col].value

これだけですw

そういえば、XMLについて書くのを忘れていました。。。

xml.etree.ElementTreeを使ったのですが、
これはPython標準なのでまぁググれば腐るほど情報は出てくるでしょうということで1つだけ情報を。

docs.python.org

xml.etree.ElementTreeでCDATAを作成したい

ElementTreeでは要素を以下のような感じで作成します。

ET.Element("tag")

そうすると以下のようなXMLになります。

<tag />

これに子要素を追加しながら組み立てていくのですが、CDATAをそのままでは作成できません。

CADATAとは以下のようなやつで、XMLで特別意味をもつ記号等をテキストとして設定したい際に
文字参照に変換せずに値を設定する方法です。

<tag><![CDATA[   「<html>」を表示したい  ]]></tag>

これは、ElementTreeでは実現できません。(たぶん)
上記のXMLをそのままElmentTreeで表現しようとすると以下のようになります。

tag = ET.Element("tag")
tag.text = "<![CDATA[   「<html>」を表示したい  ]]>"

これをXML文字列に変換すると以下のようなXMLになってしまいます。

<tag>&lt;![CDATA[   &#12300;&lt;html&gt;&#12301;&#12434;&#34920;&#31034;&#12375;&#12383;&#12356;  ]]&gt;</tag>

CDATAの開始部分が <![CDATA[から&lt;![CDATA[に代わってしまっています。

これでは、ダメなのでCDATAが作成できるようにElementTreeを拡張します。(強引にw)

かなり前に私と同じ壁に当たった方がいたようです。
zlalanneさんのGistに以下のスクリプトがあります。

gist.github.com

ただし、このスクリプトは少なくともPython3.9では動かないようなので以下のように調整してあげます。

def CDATA(text=None):
    element = ET.Element('![CDATA[')
    element.text = text
    return element

ET._original_serialize_xml = ET._serialize_xml


def _serialize_xml(write, elem, qnames, namespaces, short_empty_elements, **kwargs):
    if elem.tag == '![CDATA[':
        write("<%s%s]]>" % (elem.tag, elem.text))
        return
    return ET._original_serialize_xml(write, elem, qnames, namespaces, short_empty_elements, **kwargs)

ET._serialize_xml = ET._serialize['xml'] = _serialize_xml

標準の機能を汚染しているので、プロダクションに使用する場合には注意が必要ですね。

これで、以下のようにすることでCDATAを作成することができます。

tag = ET.Element("tag")
tag.append(CDATA("   「<html>」を表示したい  "))

以下のようなXMLになります。

<tag><![CDATA[   &#12300;<html>&#12301;&#12434;&#34920;&#31034;&#12375;&#12383;&#12356;  ]]></tag>

この手の地味なスクリプトって作り始める前は簡単だろうって思うんですけど、
実際に作り始めるとハマりポイントが割とあるんですよね。
まだまだ精進が足りませんねw

この記事書いてて思ったんですが、ExcelってPandasでも読めますよね
テスト仕様書ならフォーマットにもよるけど普通に読めるんじゃ...
pandasなら楽ができたかも。。。

via GIPHY

Google Cloud Certified Professional Data Engineerを取得した

今は違うのですが、前はデータサイエンスなこともやっていたのでデータエンジニアリングな部分は
地味に重要な役回りだなと感じていたので、この認定の取得を行おうと思いました。
他のクラウドベンダーだと関連しそうな認定がなかったり、英語限定だったりしたのでこの認定にしました。

これから受験しようと思っている方々のために、受験に向けてやったことや教材について書いていきます。

cloud.google.com

勉強前のスペック

  • データサイエンス系の業務経験あり
    • 機械学習系の基礎知識ぐらいは持っているのかなと思います。
    • そういえば数年前にG検定とってました。
  • GCPの利用経験なし
    • AWSは業務でそこそこ使っている(認定とかは持っていない)
  • SparkとかHadoopみたいな分散処理はほんの少しやったことがある(遊び程度)

勉強に使用したもの

Google Cloud Skills Boost - Data Engineer Learning Path

認定の説明ページからリンクされているLearning Pathです。

www.cloudskillsboost.google

講義 + 実際にGCPの操作を行いながら体系的に勉強していくことができますがすべてをやりきるには割と時間がかかります。

私の場合は、隙間時間とかでちょこちょこ進めて2か月弱ぐらいかかりました。

GCPで演習を行う部分についてはクレジットが必要になります。

一部の演習だけ行いたい人はクレジットを都度購入した方がよいですが、すべての演習をやりたい人は月額や年額のサブスクリプションを購入した方がお得です。

私の場合は月額サブスクリプションを購入しましたが、$30でした。
$30払えば演習やり放題と考えれば、認定の勉強用という観点だと個別にクレジットを購入する理由はあまりないですね。

良かったところ

  • 動画で基礎を抑えて、演習を行うという流れになっているので理解が深まります。

  • 演習環境は都度都度、演習用アカウントが払い出されたうえで行うので変な操作で事故ってめっちゃ請求されるということはありません。
    その代わり、意図していない操作をそのアカウントで行うと演習用アカウントが取り消されます。

  • 演習結果があっているか間違っているかチェックしながら進めることができるので長い演習などでさまようことがないです。 演習にそったCloud Storageのバケットを作成できているかどうかなどチェックしてくれます。

悪かったところ(気になるところ)

  • 動画の一部は日本語訳が用意されていましたが、ほとんどが英語→日本語翻訳で視聴することになり、わかりにくい部分もありました。

  • 動画内で説明をされている方で、訛りが結構ある(インド系なのかな)方がいてあまり英語ができない私には聞き取りが難しかったです。
    日本語翻訳を諦めて英語字幕で見ようとしたら、音と字幕とのギャップで挫折しました。。。

  • チャレンジラボという課題を与えられて自分なりに解決を策を考えるという実践的な演習があるのですが、
    これの中でマシンタイプがデフォルトのままだと不正操作とみなされ演習用アカウントが取り消されます。。。 (たしかDataprocでデフォルトのマシンタイプではなく弱いマシンタイプを選ばないダメでした。3回ぐらいやり直したかな。。。)

【最短攻略】Google Cloud 認定 Professional Data Engineer 模擬問題集

udemyの問題集です。

www.udemy.com

以前はこれのほかにもudemyに教材があったようですが、現在(2023/03)はこれだけみたいですね。

50問x3セット問題があります。実際の試験が50~60問で2時間なので模擬試験3セットという感じでしょうか。

良かったところ

  • 解説がついている
    たまに、問題と解答だけという問題集もあったりするので、これはありがたい。

  • 本番の試験でも似た問題が出題される
    私の場合はこの問題集の問題と近い内容の問題が実際に出題されました。その問題に関しては楽々と回答が出来ましたねw

  • 隙間時間にやることができる
    実際の試験同様問題を解き始めると2時間のタイマーが動き出すのですが、一時停止が出来たり、PCとスマホ両方で回答できるので 私は自宅のPCで一時停止して、移動中の電車の中でスマホで続きをやるというようなことをしていました。

悪かったところ(気になるところ)

  • 解説が正解についてのみ
    誤っている選択肢についてなぜ誤っているのかについて解説がありませんでした。

  • 一部文章が変
    問題文や選択肢の文章が日本語として不自然ななもの(機械翻訳にかけたような感じ)がありました。

Data Engineer 模擬試験

認定の解説ページが行ける公式の模擬試験ですね。
とはいえ、25問ぐらいの簡単なものです。

解説もきちんとしていましたが、udemyの問題集があったのであまり利用しませんでした。
1、2回ぐらい試しにやってみた感じですね。

docs.google.com

受験前の状態

Data Engineer Learning Path についてはとりあえず1週こなしました程度でした。

学習する(動画を視聴したり演習をパスする)と該当するコースにチェックがついていくのですが、とりあえず全部チェックつけるかぐらいの感覚ですね。
あまり深追いしてやるということはしなかったですね。
演習環境も演習によっては2時間ぐらい利用できるのですが、30分でサッと終わらせることもありましたねw

でも、適当にやっていたとしても、実際に触ってこんな感じなんだと体感するという観点ではとても意味のあるものだったかもしれません。

上記が終わった後は、udemyの問題集をひたすら解いては解説を読んで関連するGCPのドキュメントを流し読みしてというのを繰り返していました。

とはいえ、以下のような感じで3週目をやるころには問題文と解答のセットを覚え始めていたので間違えても数問程度という状態になってました。
ここまでくると、問題集を解いていてもあまり意味がないので、あまり理解できていないサービスのGCPのドキュメントとかを読んだりするのがセオリーかなと思いつつ
3週目をやったのが試験前日というのもあって開き直って、もう十分でしょ?と思い何もしませんでしたw

受験と受験結果

試験環境に余計なリスクを背負いたくなかったので、リモート会場ではなくテストセンターに行って受験を行いました。
私の受験したときは、udemyの問題集に近い雰囲気の問題が6~7割ぐらいでした。
1時間ぐらいで一通り回答して、残りの1時間でもう一周して回答の見直しをした感じです。たぶん普通に勉強した状態であれば、時間的余裕は割とある試験なのかなと思います。
結果は回答提出後すぐに表示されますが、これは暫定の結果で数日後に正式結果をメールで通知するよと表示されます。
私の場合は翌日届きましたw

そして、正式結果には認定おめでとうというメッセージとともにノベルティの案内も記載されています。
受験する時期とかによってノベルティは変わるのかなと思いますが、私の場合は以下でした。
この中から1つ選ぶことができて寄付するか、フリースか、マグカップのいずれかですね。

せっかくなので、寄付ではなく、ノベルティにしようと思いマグカップを選びました。(フリースじゃなくてパーカーならよかったのに
海外からの発送みたいなので気長に待つことにします。

まとめ

GCP未経験でも意外と合格できるレベルの試験かなと思います。
データサイエンスの知識が多少あってほかのクラウドを多少使ったことがあれば。
逆にGCPを割と使ってるよなんて人は、問題集をこなすだけで合格しちゃうんじゃないですかね。わかりませんけどw

ノベルティはいつ頃届くのかな?

via GIPHY

GitBucketでプルリクのコメントデータを取得したい

仕事では顧客の環境に合わせてGitHub、Bitbucket、GitLabを使用することが多いのですが、

エンタープライズな世界ではクローズドな環境でソースを管理したいという顧客もそこそこいるわけで

そういった顧客の時にはGitBucketというオープンソースGitHubクローンをオンプレ環境に立てて使用しています。

gitbucket.github.io

コードレビューはプルリクエストの中で行うので、どれぐらいの指摘件数なのか、レビュー指摘がどんな内容だったかなどなど

分析のための情報を収集するためにはプルリクエストからコメントを抜き出す必要があります。

GitHubではAPIが用意されているのでそれを叩けばデータを取り出すことができます。

そして、GitBucketはGitHub互換のAPIを持っていますが、しかし...残念なことになっています。(v.4.38.4時点)

# プルリクの情報を取得
curl  -u root:root http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1

{
    "number": 1,
    "state": "open",
...
    "commits_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1/commits",
    "review_comments_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1/comments",
    "review_comment_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/comments/{number}",
    "comments_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/issues/1/comments",
    "statuses_url": "http://localhost:8080/api/v3/repos/Sample/gitbucket/statuses/521404025752dd9b120e5e16a292015ff731e19e"
}

review_comments_urlがコメントを取得するためのエンドポイントです。

GitBucketのWikiには記載されていませんが、レビューコメントの一覧が取得できそうと思いきや...

curl  -u root:root http://localhost:8080/api/v3/repos/Sample/gitbucket/pulls/1/comments

{"message":"Not Found"}

はい、サポートしてないみたいです。。。

1. すべてのデータをエクスポートする

GitBucketのデータベースをMySQLにして利用している場合は、そのままデータベースの中身をdumpしてしまえばよいですが

GitBucketはデフォルトでH2をデータベースとして利用しているので、GitBucketが稼働した状態でデータを取り出すことはできません。(たぶん、H2は複数のクライアントから接続できないはず)

まあそもそも、H2のまま使うのは微妙でしょという話はありますけどね。。。

GitBucketにはデータをエクスポートする仕組みが備わっています。

Admin権限のユーザーでシステム設定を開くとこんな画面が表示され、ここからエクスポートが可能です。

大量のINSERT文が並んだSQLファイルがDLできます。

DDLなしでDumpしたような感じでしょうか。

2. 適当なDBに取り込む

エクスポートしたデータのままでは集計も分析もできないので、適当なDBに入れてSQLで取り出せるようにします。

Dockerを使うなり野良のDB?を見つけて来るなりしてDBを用意します。そのDBに接続した状態のGitBucketを新しく起動させます。

こうすることでDBにテーブル定義をGitBucketに作ってもらいます。

あとは先ほどエクスポートしたSQLをDBに流し込めば完了です。

あとはSQLを駆使してコメントデータを取りだせます。。

テーブル名からあたりをつけながらJSOINしていけばそれらしいデータが取得できます。

そもそも

端からH2じゃないDBを使うべきですね。

GitBucketのセットアップが簡単すぎて甘えてしまうんですよね。。。

それにH2だとしてもエクスポートとかする前にGitBucketが動いているサーバーに入り込んで、

H2のDBファイルをコピーすればよかっただけでは...気づかなかったことにしようw

via GIPHY

PowerShellでメモリ監視

少し前にPowerShellで各プロセスのメモリ使用量を取得する方法をまとめました。

sabiz.hateblo.jp

せっかくなのでそれを使ってメモリ監視するスクリプトを書いてみました。

github.com

起動させるとこんな感じで、メモリ使用率とメモリ使用量の多いプロセストップ5が表示されます。
定期的に情報を再取得して再描画するようになっています。
PowerShellの窓さえ立ち上げておけばよいのでそこそこ軽いかなと思います。

合間でサッと作ったので作りは荒いですw

このままだとただのスクリプトの紹介でしかないので、

このスクリプトを書く上で必要だった要素を2つまとめていきます。

メモリ使用率の取得

メモリ使用率はWMIから計算可能です。

以下のコマンドでWMIを取得します。

Get-CimInstance Win32_OperatingSystem

learn.microsoft.com

取得したWMIの中の TotalVisibleMemorySize が総メモリサイズ、FreePhysicalMemoryが空きメモリサイズになります。

これらを使ってメモリ使用率は以下のように求めることができます。

 Get-CimInstance Win32_OperatingSystem | %{(($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/$_.TotalVisibleMemorySize)}

コンソールの情報取得やカーソル位置の変更

コンソールの情報は以下で取得可能です。

> $Host.UI.RawUI

ForegroundColor       : Gray
BackgroundColor       : Black
CursorPosition        : 0,44
WindowPosition        : 0,0
CursorSize            : 25
BufferSize            : 160,45
WindowSize            : 160,45
MaxWindowSize         : 160,45
MaxPhysicalWindowSize : 1904,63
KeyAvailable          : True
WindowTitle           : C:\ - PowerShell 7.3 (9896)

$hostは自動変数で、現在のコンソールの情報を保持しています。そこを辿って RawUI というプロパティに諸々の情報が格納されています。

learn.microsoft.com

今回のスクリプトではカーソル位置の変更を使いました。

以下のような感じでカーソル位置の変更が可能です。

$cursorPos = $host.UI.RawUI.CursorPosition
$cursorPos.X = 10
$cursorPos.Y = 5
$host.UI.RawUI.CursorPosition = $cursorPos

理由は不明ですが、$host.UI.RawUI.CursorPosition.X = 10 のように直接代入してもカーソル位置は変わらないです。
ReadOnlyなのかな。。


普段所謂プログラミング言語でコードを書いていると
久々にシェルスクリプトもそうですが、PowerShellに触れると構文というか考え方というか雰囲気が変わるので
一瞬、アレっ?てなりますよね。

via GIPHY

FFmpegでアニメーションWebPを作りたい

GitHubのプロフィールにアニメーション画像を載せたいなと思いFFmpegで動画を変換しました。

ブラウザで表示できるアニメーション画像だと次の3種類ぐらいかなと思います。(ほかにもありそうだけど。)

アニメーションGIF

3つの中で一番古くから使われているであろうフォーマット。
超シンプルにパラパラ漫画の要領でアニメーションさせる。

アニメーションPNG

Mozillaが頑張って普及させようとして頑張ったけど結局普及しなかったフォーマット。
PNGを拡張して作られてるとのこと。
扱ったことないからあんまり知らない。。

アニメーションWebP

JpegPNGよりもファイルサイズが小さくなるらしい画像フォーマット。
この中では一番最近出てきたフォーマットなのでこれから普及していく?のではないでしょうか。

本題

今回変換する画像はこの動画です。

https://pixabay.com/videos/id-27400/pixabay.com

「2560×1440」でダウンロードしました。

最小限コマンド

ffmpeg.exe -i wolf-27400.mp4 out.webp

-iで動画ファイルを指定して、出力先の画像ファイル名を指定しているだけです。

ffmpegは拡張子で判断してくれるので楽ですよね。

サイズ指定

さすがに「2560×1440」は大きいのでリサイズします。

ffmpeg.exe -i wolf-27400.mp4 -s 426x240  out.webp

-sで出力解像度を指定します。

結果はこんな感じです。 https://raw.githubusercontent.com/sabiz/webp-test/main/out.webp

フレームレート指定

ファイルサイズを落とすためにフレームレートを落としてみます。

ffmpeg.exe -i wolf-27400.mp4 -s 426x240  -r 15  out_frame.webp

-rでフレームレートを指定します。

https://raw.githubusercontent.com/sabiz/webp-test/main/out_frame.webp

この動画の場合 4.2MB > 2.9MB まで小さくなりました。

ループ再生

ffmpeg.exe -i wolf-27400.mp4 -s 426x240  -r 15 -loop 0  out_loop.webp

-loop 0の指定でループ再生になります。

https://raw.githubusercontent.com/sabiz/webp-test/main/out_loop.webp

まとめ

はてなってWebPのアップロードできないんですね。。。

まぁ、ブログに張り付けるのはカメラとかスマホで撮った写真(Jpeg)が一般的ですよね。

via GIPHY

PowerShellで各プロセスのメモリ使用量取得

エンジニアあるあるかもしれませんが、ブラウザのタブをめっちゃ開いていたり、いろんなツールを立ち上げっぱなしにしてたり

そんなことをしているとわりとメモリ食うんですよね。

たくさんメモリ食ってるプロセスを突き止めようとタスクマネージャーを起動させようとするんですけど、そもそもタスクマネージャーが重いという。。。

であれば、PowerShellワンライナーで取得しちゃいましょう。

0. 環境

1.プロセスの一覧取得

以下のコマンドで取得できます。

Get-Process

こんな結果になります。

learn.microsoft.com

2.プロセスごとにグルーピング

Get-Processのままでは、親プロセスと子プロセス(表現合ってるのか?)が分かれているので、 わかりやすくするためにプロセス名ごとにグルーピングします。

Get-Process | Group-Object -Property ProcessName

こんな結果になります。

learn.microsoft.com

3.グループごとにメモリ使用量の合計を計算

Get-Process | Group-Object -Property ProcessName |Select-Object "Name", @{n="Memory"; e={($_.Group | Measure-Object "WS" -Sum).Sum}}

ちょっと長いですね。

グループからNameとWS(プロセスのワーキング セットのメモリサイズ)を取り出します。

Nameはグループのキーなので集計不要で

WSは グループから取り出しWSの合計を求め
($_.Group | Measure-Object "WS" -Sum).Sum

Memoryという名前を付けています。

こんな結果になります。

learn.microsoft.com learn.microsoft.com

4.使用量が多い順にソートする

先ほどのままではバラバラなのでソートします。

Get-Process | Group-Object -Property ProcessName |Select-Object "Name", @{n="Memory"; e={($_.Group | Measure-Object "WS" -Sum).Sum}} | Sort-Object "Memory" -Descending

こんな結果になります。

learn.microsoft.com

まとめ

これで、タスクマネージャーを立ち上げなくてもメモリ使用量が多いプロセスがわかりますね。

| Select-Object -First 5 をつけてあげれば Top5 だけを表示できます。

ちなみに、メモリ使用量の単位はバイトです。エンジニアな方々であれば、これで十分読めますよね? (えっ

via GIPHY

嘘です。
必要であれば、 Select-Objetなどを使って単位変換を差し込んであげるとよいかと思います。