SE(しがないエンジニア)のブログ

IT技術ネタ(クラウド・セキュリティ周り)が中心です!他雑記(お馬さん 他いろいろ)もあり。

Redmine REST API にて textarea の改行問題を解決する

先日上げた記事のつづきで・・・・。

Redmine REST API を利用した際に issue を create する記事を上げたのですが、1点上手くいかないところがありました。それが「textarea フィールドに入力された値を description で post する」という点です。何が上手くいかないかと言いますと、「改行なし」の場合はすんなり行くのですが「改行あり」だと上手く行かないといった感じです。

もし、成功すると結果的には create された issue の「説明」部分に反映されます。自社での活用事例としては Q & A システムを Web アプリの一機能として搭載して Q 発行毎に issue を create するといった事例で利用していました。下記はイメージです。(Q に飛ぶ URL と textarea の内容)
f:id:btsn:20200814005235p:plain
参考ですが前回にあげている記事はこちらです。
Redmine(+ Digest 認証環境下)で curl コマンドを利用し issue create を行う - SE(しがないエンジニア)のブログ

どう解決した?

自社の場合は Web アプリを php で開発しているのですが replace 関数でデバッグしながら辿り着いた結果が下記です。(「$post_dataArray['hoge']」に textarea の内容が入っていると思って下さいませ)

<?php
$temp_hoge = str_replace(array("\r\n", "\r", "\n"), 'hogehoge', $post_dataArray['hoge']);
$temp_hoge_rc = str_replace('hogehoge', "\\r\\n", $temp_hoge);

exec("curl --insecure --anyauth --user (username):(password) --location-trusted -X POST -H \"Content-Type: application/json\" -d '{\"issue\":{\"project_id\": \"".$project_id."\", \"subject\": \"".$post_dataArray['title']."\", \"tracker_id\": (tracker_id), \"status_id\": (status_id), \"description\": \"".$url."\\r\\n\\r\\n".$temp_hoge_rc."\", \"watcher_user_ids\": ["user_id"(, "user_id") ... ]}}' (redmine_url)/issues.json", $op);
?>

前回のサンプルは CUI 上から curl コマンドを直接実行したものでしたが、今回は php サンプルとして掲載します。

簡単な解説としては
=====
・1行目の置換で textarea の内容(改行付き)を置換(ブラウザ間の解釈を吸収)
・2行目の置換で「\\r\\n」に置換して REST API で正常に実行できるよう置換
・exec 部分は前回記事との内容は大差なしで。変数との繋ぎ込みの参考として。
=====
といった感じです。

これも、中々サンプルらしいサンプルがなかったので誰かのお役に立てましたら・・・・。

振り返り記事:2020/07

今月(というか先月ですが)より

自分自身の振り返りの意味を込めて、簡易的な記事にまとめようと思いました。何となく進捗的に厚みがない(笑)場合は翌月に肉付けするようにしようと思います!

とある諸事情により英語が必要になりそうなので以前購入したものの二週目。「とにかく時間がなくても継続してやりましょう」・「少しでも時間と見つけて継続できるペースで英語に触れましょう」という「無理なく英語に触れながら成長していきましょう」という感じの内容がメインです。今後、英語に触れていく機会は多くなりそうなのでこれの再読をキッカケに頑張ろうと思います!
デスマーチに追われるIT技術者が勉強せずに英語力を身につけてキャリアアップした方法 | 鈴木 信貴 |本 | 通販 | Amazon
2冊目も以前購入したものの二週目(か三週目)、データベース周りも改めて思い出したいということで再読です。MySQL のバージョンが5系のものなのでかなり内容としては古いのですが現在にでも利用できるエッセンスは多く含まれている一冊なのでオススメです。
現場で使える MySQL (DB Magazine SELECTION) | 松信 嘉範 |本 | 通販 | Amazon
3冊目はかなり前から通読していた一冊で、Windows の定番(て中身難しいですが)書です。元の値段は高い(\8,000 以上!)ですが Kindle の高いものフェアで 50% OFF だったので飛びついて購入、ひとまず無事読了しました。
インサイドWindows 第7版 上 システムアーキテクチャ、プロセス、スレッド、メモリ管理、他 (マイクロソフト公式解説書) | Pavel Yosifovich, Alex Ionescu, Mark E. Russinovich, David A. Solomon, 山内 和朗 |本 | 通販 | Amazon
ついでですが、こちらはまだ読み始めていないもののセットという流れで購入してしまいました。笑
Windows Sysinternals徹底解説 改訂新版 (マイクロソフト公式解説書) | Mark Russinovich, Aaron Margosis, 山内 和朗 |本 | 通販 | Amazon
8月もペースを落とさぬように頑張らなくては。。(´・ω・`)

セミナー(基本オンライン)

7月は下記のような感じでした。(全てが全てフルフルに参加できてないですが。。)
f:id:btsn:20200803224501p:plain
7/4(土) 副業・転職から模索するエンジニアキャリアLT会
ailab-corp.connpass.com
こちらのオンラインに参加。Twitter 界隈で有名な方々が集い、キャリアのLTが開催されました。エモい話も多く、かなり共感を得られていました。フルフルで拝聴できなかったのですが、次回があったらまた是非拝聴したいです!(中々リアルな話を聞ける機会も無いので。。)
7/6(月) AWSの基礎を学ぼう 第二回(第一回から拝聴)
awsbasics.connpass.com
6/29(月)から開催されている AWS DevRel シリーズで本日時点でもまだ継続されております。AWS の亀田様が個人的に開催されているイベントのようなのですが中身がとても濃く、かつ内容がとても分かりやすいです!Azure もハンズオンである程度学んだこともあり、AWS を知ろうとこのシリーズを拝聴中です。時間もお昼休み後の45分でサクッと聞けるところが非常に魅力的です。
7/9(木) サーバーレスアンチパターン今昔物語
serverless-newworld.connpass.com
第二夜が同月の 7/21(火) に開催されていました。初回は「なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する」という過去のブログ(≒アンチパターン)を否定するという内容でした。プラットフォームの進化(RDS Proxy の登場)で過去のアンチパターンが解消される、というキャッチーな切り口で非常に興味深かったです。視聴者数(登録者数)が 1143 人だったことも含めて非常に注目度が高かったイベントだったのかなと思います。ちなみに第三夜は今月 8/7(金) に開催予定です。
serverless-newworld.connpass.com
この他は登録はしたものの拝聴が途切れ途切れになってしまい、不完全燃焼でした・・・・今月はなるべく取りこぼしがないように!

Google Home を購入してみました(セットアップ)

巣ごもり需要?

今年の 2 or 3 月頃からコロナ禍の関係で「巣ごもり需要」という言葉をよく聞きます。仕事での在宅勤務や外出の自粛による関係で自宅で過ごす時間が(かなり?)増えているようで、この需要に関するものは特需になっているようです。例えば Netflix、今年の 4~6 月期の増収を見る限りかなり好調なようです。世界的に COVID-19 流行してしまっている関係で特にグローバル展開している企業は同様の傾向が見られます。
www.nikkei.com

そんな中で Google Home を購入

スマートスピーカーが流行りだしたのはかなり前(2~3年前?)かと思いますが、かなり遅れて我が家も Google Home を購入しました。Alexa 他、選択肢は複数あったものの Youtube 等の親和性を考えて Google Home に。Mini ではなく通常サイズのものを楽天で購入しました。特段の遅配はなく着荷、今回は開封を終えてからのセットアップ手順を簡易ですが記載します!
f:id:btsn:20200803170728p:plain
おそらく、Google Home を購入するまではスマホ側にアプリがインストールされていないと思うのでインストールします。(画面は iPhone です)
f:id:btsn:20200803170907p:plain
最初はまず Google 自アカウントとのリンクです。既に iPhone 側で設定しているものでも大丈夫ですし新規に作成してもOKです。
f:id:btsn:20200803172601p:plain
ここから先は「家の作成」で住所を設定したりします。経路探索等に利用するために位置情報の許可も行います。
f:id:btsn:20200803173647p:plain
Bluetooth をオンにしているとデバイスの検出後に近くの Google Home が検出されます。その後に音の確認やデバイスの利用場所の確認が入ります。
f:id:btsn:20200803174337p:plain
Wi-Fi に関しては可能な限り電波がスムーズに入る場所のものを選択しましょう。
f:id:btsn:20200803174450p:plain
Google アシスタントの設定に関しては基本画面に従って進行すればOKです。
f:id:btsn:20200803174553p:plain
Voice Match に関しては私自身の声のみをピックアップするのかと思ったら、セットアップ後に子供の声も認識してしまいました。笑
f:id:btsn:20200803174907p:plain
音楽に関しては「Youtube Music」を選択してます。ただ、無料の状態ではアーティスト指定や曲指定ができないのでかなり制限があります。回し者ではないですが最初1ヶ月は無料なのでとりあえず申し込もうかな。。
f:id:btsn:20200803175436p:plain
動画に関しては設定した覚えがないのですが、画面付きでない場合にコレは意味があるのかな?
f:id:btsn:20200803175553p:plain
Google Duo に関してはまだ機能を利用していない感じです。
f:id:btsn:20200803175757p:plain
ここまで来れば一段落!

実際の使い心地は?

届いて1週間弱ですが下記の用途に利用しています。
=====
・その日1日の天気および気温(朝)
・気になったタイミングでニュースを聞く(昼頃)
・気が向いたときに何でも良いので音楽を聴く(終日)
=====
音楽は前述の通り無料の場合、殆ど指定が効かないです。ので、ただなんとなく曲を聴く感じです♪

Redmine(+ Digest 認証環境下)で curl コマンドを利用し issue create を行う

Redmine REST API

自社でプロジェクト管理のために Redmine を利用しているのですが今まで REST API を利用したことがありませんでした。そもそも、Redmine で仕様として公開されている REST API ってどんなものがあるの?という情報は下記の通りで。
https://www.redmine.org/projects/redmine/wiki/rest_api
今回、とある開発の絡みで調べていたのですが、結構色んなことができるんだなぁ、と感心しました。(もっと早く活用すれば良かった。笑)

本題の Redmine (+ digest Auth) における curl issue create のはなし

前述のとある開発の絡みは php + MySQL で作成している Web アプリにて「問い合わせを1件立てると Redmine でチケット(issue)を1件発行する」といった連携を行います。ちなみに自社の場合は Digest 認証だったり何なりとちょっと複雑な環境下だったりするため、ネットで中々合致する参考資料(コマンド例)が見つかりませんでした・・・・しかし、結果として色々組み合わせていく中で 200 の status を返せました!

# curl --insecure --anyauth --user (username):(password) --location-trusted -X POST -H "Content-Type: application/json" -d '{"issue":{"project_id": (project_id), "subject": "(subject)", "tracker_id": (tracker_id), "status_id": (status_id), "watcher_user_ids": ["user_id"(, "user_id") ... ]}}' (redmine_url)/issues.json?key=(redmine_target_user_api_key)
といった感じです。これを導き出すのに結果丸一日くらい使ってしまいました。ちなみに curl コマンドの方は元々 php で組んでいたプログラムから流用し、後半の記述の仕方は下記サイトを参考にしております。
利用・活用 Redmine API - ファーエンドテクノロジー株式会社
Thank you, FAR END Technologies 様!

追記(Appendix)

2020/07/29

どうも、最後の方の「?key=」以降はなくても大丈夫なようです。失礼致しました。

DELL Optiplex 760SF を SSD で再生する

発売日は10年以上前!?

ネットで調べても正確な発売日が出ないようなのですが CPU がなんと Core 2 Duo E6550 というところからもわかるように10年以上前くらいのPCかと思います。(該当 CPU の発売日は 2007/7 頃のようなので。。)
f:id:btsn:20200719232128p:plain
ちなみに、表題機種は中古市場で 2014/2(6年以上前) 頃に \30,000 近くで購入した記憶があります。今なら同じ価格でそこそこ良いスペックのノートPCも買えそうで。笑

やっぱり遅い・・・・どうにかせな!

つい最近、所用の関係で Windows Server 2019 Evaluation を削除し Windows 7 を入れ直してました。その上で Windows 10 にアップグレードしたのですがやはり遅い。(-_-;)

こうなると、やはり再生の方法といえば「SSD 化!」ですね。購入した際のスペックは HDD 250GB だったので同容量の SSD 256GB を購入しました。価格も \4,000 前後で購入できて再生できるので安いものです。今回はその SSD 化の手順にフォーカスをあてたいと思います。クローンのための機器は下記のようなものを利用すればOKでソフトウェアは「EaseUS Todo Backup Free」を利用すればOKです。(クローンするだけであれば無償のもので十分です(要:メールアドレス登録))
www.sanwa.co.jp
jp.easeus.com
前述のセットで認識した後に「ディスクの管理」を利用して SSD をフォーマット、MBR か GPT に関してはソースディスク(HDD 側)に依存します。今回は MBR でした。ひとまずソフトウェアを起動で。
f:id:btsn:20200719234836p:plain
左袖メニューの中から「クローン」を選択し、続いてソースディスクを選択します。「次へ」を押下で進みます。
f:id:btsn:20200719234936p:plain
今後はターゲットディスクの設定です。USB 外付けで認識させている SSD を指定します。ここでそのまま「次へ」は選択せずに「高度なオプション」を押下します。
f:id:btsn:20200719235152p:plain
SSDに最適化」を選択しておきます。「セクタバイセクタクローン」に関しては今回チェックをつけておりませんが、どんなものかというのは下記を参照下さい。「OK」で戻ります。
f:id:btsn:20200719235409p:plain
セクタバイセクタクローンとは?かかる時間や特徴について | ゲーミングPCなう
確認画面が表示されますので念の為に確認した上で「実行」を押下下さい。の上で警告も出ますので「続ける」を押下します。
f:id:btsn:20200719235514p:plain
f:id:btsn:20200720000049p:plain
クローン中の画面はスクリーンショットなしですが、50GB 程の内容(ほとんど OS のみ)で1時間程度のクローンでした。シャットダウンの後に換装して起動時間を計測してみると?
・HDD ・・・ 60秒
SSD ・・・ 30秒
といった感じでした。劇的な改善ではなかったものの、ログイン後の動作等もスムーズになり非常にイイ感じです。あとは、メモリが現状 4GB なので 8GB MAX なら DDR2 安いので購入しようかな、と。そうこうしているうちにそこそこ良いスペックのデスクトップPCが買えてしまいそうな気もしますが、それは内緒で。笑

Windows 7 ライセンス認証時に 0x80072F8F が発生した際の対処

先週末は自宅環境のPC整備を

ブログメニューの「ENVIRONMENT」リンク先で自宅環境の情報を公開しているのですが、先週末諸事情で整備を行っておりました。(「ENVIRONMENT」更新済)

とあるライセンス絡みの問題が!

古めの DELL PC の所有者が変わるということで Win 10 Pro に戻したくて、当時購入した際に付属していた Win 7 Pro のメディアを利用しOSを入れ直していたところライセンス絡みの問題が!

今までは発生しなかったのですが、オンライン状態にて Win 7 Pro の際にライセンス認証すると2分後くらいのレスポンスで「0x80072F8F」のエラーが発生。これが何度繰り返しても全く同じ内容のエラーコードが発生・・・・困った。(´・ω・`)

このエラーコードでネットで調べると一番多く引っかかる記事が「時刻のズレに起因するエラー」ということで時間を確認するものの1年前になっているわけでもなく時間にズレはなし。中古PCのよくある例ですと久々に起動したりマザーボードボタン電池が電池切れになっている場合、時刻が思わぬ時間になっていたりします。しかし、今回はそれが該当せず。
Windows7のライセンス認証で「0x80072F8F」というエラーが出て失敗したときの対処 - とりあえずの備忘録
Microsoft の公式なドキュメントを閲覧しても時間以外には起因してなさそうで。
https://support.microsoft.com/ja-jp/help/10738/windows-10-get-help-with-activation-errors
一部、ストアアプリのダウンロードですが同様のエラーコードによる問題が発生している記事を確認したのですがこちらは試行しませんでした。
Windows10でエラーコード0x80072F8Fがストアでアプリをダウンロードしようとする... - Yahoo!知恵袋

結局どうしたのか?

多少の手間はありますが、オンライン認証ではなく電話認証を利用しました。笑

結果として pass 出来て、Win 10 Pro にもアップグレードできて良かったのですが焦った週末でした。

bat ファイルでの net use コマンドに思わぬ落とし穴が。。

最近は

これといった技術的なことを残せていないので久々の Tech Post です。笑

とあるバッチプログラムで

Windows Server 2012 R2 から Windows 10 Home に対して「net use」コマンドをかけるというバッチプログラムがあったのですが、Windows 10 Home 側のユーザの ID / PASS が合っているにも関わらずなぜかエラーコード「86」で失敗するという事象が・・・・。

ちなみに厄介だった点

このコマンド行を抜き出してコマンドプロンプトで直実行するとなぜか通ってしまう罠。こういうパターン(ある方法では上手く行くけどある方法では上手く行かない)が一番イヤなんですよね。これで昨日はかれこれ2時間程迷いました。。(´・ω・`)

解決の糸口!

これだと、バッチプログラムがタスクに仕込めない、ということで色々探していたら MS TechNet でこんな投稿を見かけました。
Net use command fails in batch file but succeeds when manually typed
要約するとパスワードに「%」使うな!って、まさしく使ってました。コレって何の制約なんだろうか。結果として下記のような形でバッチプログラムからでも通るようになりました。

net use [drive letter] \\[ip address or hostname]\[path] /user:[ip address or hostname]\[username] [alphabet or numeric password]
TechNet の投稿さまさまです。m(_ _)m

3大クラウドの大規模(オンライン)イベント状況

COVID-19 の影響もあり。。

今年の2月または3月頃から各種イベントのオンライン化が進んでおり、規模の大小問わず・・・・といった感じです。例年行われている大規模系イベントもこの流れで全セッションがオンライン化されています。私自身は昨年(リアルで) AWS / GCP のイベントに参加したのですが今年はオンライン化されるようです。というただの宣伝記事ですが。。
btsn.hatenablog.com
btsn.hatenablog.com
昨年リアル側で参加した感想としては会場の熱気を感じれるというところはメリットでどれだけそのパブリッククラウドが盛り上がっているのか、というのを知ることができます。そして、今年オンライン側で参加している感想としては熱気こそ感じ取りにくいものの、各セッションの入場制限なしに好きな時間に好きなセッションをゆっくり見れる、かつ場所を問わずというのがメリットです。それぞれにメリットがあると思います。

de:code 2020

既に開催済のイベントですが、6/30(火)までの開催期間がつい先日期間延長され、7/17(金)17:00 までになったそうです。既に全セッション公開済(段階的にセッションを公開していってた)のようなのでスタートが出遅れた方も今から一通り視聴可能だと思います!
btsn.hatenablog.com

Google Cloud Next ’20

GCP は 7/15(水) より開始で毎週、トピックが増えていく形を取るそうです。終了が 9/9(水) までとかなり長い感じです。
デジタル イベント Google Cloud Next ’20: OnAir のお知らせ: 7 月 14 日~9 月 8 日に開催 | Google Cloud Blog

AWS Summit Online

AWS は 9/8(火) より開始で 9/30(水) までの開催期間のようです。その中で初日 9/8(火) と 9/15(火) にはライブ配信アリのようです。Azure / GCP / AWS 全てに共通するのですが、「無料」というのが非常に有難いです!
AWS Summit Online | 2020年 9月 8日 (火) ~ 9月 30日 (水) オンラインで開催!

ということで

自分の好きなタイミングで好きなセッションを拝聴できる、ということで中々無い機会!是非!(今後はこのような形が主流になるのかもしれませんが。。)

ネットワークの基礎ワードを掘り下げる(備忘録)

IT業界に割と長く居ながら・・・・。

ネットワークのことをあまり理解していないなぁ、、と痛感した最近。浅い理解でも仕事をできる部分もありますが、クラウド時代も含めてネットワークはやはり深く理解していかないとマズいと感じています。そんなこんなで下記の本をざっくり読了しました。
www.ohmsha.co.jp
仕事をする上で言葉だけ知っている部分が結構あると思いますが、いざ人に説明するとなると表面上だけ説明しているだけで、実は自分自身も理解していない、ということに陥ってたりします。(´。`)

では早速

デフォルトゲートウェイ

「あぁ、あの Windows で設定するインターネットに出るためのアレでしょ?」という回答だと NG なわけでして。それ程度で今まで考えていて無知だった自分が恥ずかしいです。詳しく解説しているページはこちらです。
http://www5e.biglobe.ne.jp/~komichan/network/n1_defaultGW.html
PC やサーバが他ネットワークのホストと通信するときに最初にパケットを転送する装置(ルータや L3 スイッチを指す)です。よくあるケースとして会社内の Windows(例) クライアントに設定するデフォルトゲートウェイはこの「ルータ」を指すことが多いと思います。ちなみに、これは必ずしもこのルータからインターネットに出るとは限りません。
別用語にもなってしまいますが、「ルーティング」という言葉を聞くとついつい前述のルータ側のみにルーティングを持っているイメージをしてしまいますが実際は PC やサーバでもそのルーティングを持っていたりします。

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.122 35
127.0.0.0 255.0.0.0 リンク上 127.0.0.1 331
127.0.0.1 255.255.255.255 リンク上 127.0.0.1 331
(以下略)
具体的にでは PC やサーバでルーティング情報として登録しているのは何なのか?というと「直接接続しているネットワーク」と「デフォルトルート(0.0.0.0)」に大別されます。そして、話を戻しデフォルトゲートウェイを設定するというのがこのルーティングテーブルに後者の「デフォルトルート(0.0.0.0)」をスタティックルートとして登録する、ということに結びつきます。0.0.0.0 のネクストホップ(次に転送すべき隣接ルータ)がクライアントに設定したアドレス(例:よくある 192.168.1.1)になります。

ブロードキャストアドレス

「あぁ、その名の通り、ネットワーク内にワーってパケット投げるためのアドレスじゃん。」という・・・・では、その「ネットワーク内」ってどれだけのエリアを指すのかというと、あくまでもそれは「同一ネットワーク内」ということになります。ルータなどの中継機器を通して他のネットワークに転送されることはありません。また、用途の一例としては「ARP」(Adress Resolution Protocol IP アドレスから MAC 情報を得る)要求でブロードキャストアドレスを使用します。

DNS(の名前解決順序)

よくある、あるあるですが「DNS がダメになって、名前解決が出来ない。IP 直打ちだと上手く行くんだけどなぁ。」というトラブル。では、その DNS ってどうやって名前解決してるのでしょうか?当たり前な話ですが、「btsn.hatenablog.com」を IP アドレスで打つとなるとそう簡単には覚えられません。いや、「btsn~~」もちょっと覚えにくいのですが。笑

c:\>nslookup btsn.hatenablog.com
サーバー: UnKnown
Address: 192.168.1.1

権限のない回答:
名前: btsn.hatenablog.com
Addresses: 13.115.18.61
13.230.115.161

この IP を元に whois してみると「ec2-13-115-18-61.ap-northeast-1.compute.amazonaws.com」と出るのですが、はてなブログAWS で動いている?とか?何はともあれ、このように DNS として名前解決をする流れはどう説明すると良いのでしょうか?JPNIC のページに歴史を含めて分かりやすい解説があったのでご紹介致します。(敢えて要約をこちらに記載する必要がないくらい詳細!)
インターネット10分講座 DNS - JPNIC
とまぁ、今回はここまで!また、気分で追記します。m(_ _)m

Office 2019 2PC の場合のインストール方法について

諸事情にて Office 2019 購入の必要があり、、

今までは Office 2013 H & B を利用していたのですが、諸事情により Office 2019 H & B を購入する運びになりました。最近、よく「2 台の~~」とか「5 台まで」みたいな記述を見かけるのですが今回の Office 2019 も「2 台の~~」ということで初体験だったのでメモ書きを残します。
f:id:btsn:20200603001054j:plain
こちらが表?です。この厚紙が \40,000 近くするなんて・・・・という話は置いておいて。
f:id:btsn:20200603003319j:plain
裏はこんな感じです。2019 からかどうかは分からないのですが下記 URL にてセットアップが可能です。
https://office.com/setup

インストールには何が必要?

こちら、「Microsoft アカウント」が必要になります。Windows のログイン用に最近は作らされたり(無理にする必要はないですが)することもあるので持っている人も多いかもしれません。作成したアカウントをベースにログインすると下記のような画像の状態になります。
f:id:btsn:20200603004839p:plain
1PC 目はそれでこのまま進めるのですが、2PC 目は?となると。こちらに関しては 1PC 目をインストールした Microsoft アカウントを利用することになります。
f:id:btsn:20200603005120p:plain
ここで赤枠の部分をクリックして別画面に遷移します。すると、その Microsoft アカウントで紐付いた「サービスとサブスクリプション」が表示されます。
f:id:btsn:20200603005328p:plain
2PC 目に関してはこちらで「インストールする」で進行すれば OK です。注意しなければいけないのが気づかずに別の Microsoft アカウントでログインした場合。その場合は「サービスと~~」の画面で Office 2019 の表示がされません。されない場合は要確認です。